diff --git a/src/rez/backport/__init__.py b/src/rez/backport/__init__.py deleted file mode 100644 index 8b1378917..000000000 --- a/src/rez/backport/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/rez/backport/importlib.py b/src/rez/backport/importlib.py deleted file mode 100644 index df4abfe54..000000000 --- a/src/rez/backport/importlib.py +++ /dev/null @@ -1,37 +0,0 @@ -"""Backport of importlib.import_module from 3.x.""" -import sys - - -def _resolve_name(name, package, level): - """Return the absolute name of the module to be imported.""" - if not hasattr(package, 'rindex'): - raise ValueError("'package' not set to a string") - dot = len(package) - for x in xrange(level, 1, -1): - try: - dot = package.rindex('.', 0, dot) - except ValueError: - raise ValueError("attempted relative import beyond top-level " - "package") - return "%s.%s" % (package[:dot], name) - - -def import_module(name, package=None): - """Import a module. - - The 'package' argument is required when performing a relative import. It - specifies the package to use as the anchor point from which to resolve the - relative import to an absolute import. - - """ - if name.startswith('.'): - if not package: - raise TypeError("relative imports require the 'package' argument") - level = 0 - for character in name: - if character != '.': - break - level += 1 - name = _resolve_name(name[level:], package, level) - __import__(name) - return sys.modules[name] diff --git a/src/rez/backport/lru_cache.py b/src/rez/backport/lru_cache.py deleted file mode 100644 index 11028f638..000000000 --- a/src/rez/backport/lru_cache.py +++ /dev/null @@ -1,136 +0,0 @@ -""" -This lru cache implementation is based on the backport of the pure python lru -cache in Python 3 and found on the ActiveState website: - -http://code.activestate.com/recipes/578078-py26-and-py30-backport-of-python-33s-lru-cache/ - -It has been modified to remove the cache info (data on cache hits and misses) -and implementt a simplified _make_key method. Both of these give modest -improvements in performance, reducing the time spent in the wrapper function by -~30-40%. Both of theses changes are based on discussions in the Python bug -tracker: - -http://bugs.python.org/issue16389 -http://bugs.python.org/issue14373 -""" - - -from functools import update_wrapper -from threading import RLock - - -def _make_key(args, kwds): - return (args, frozenset(kwds.items())) - - -def lru_cache(maxsize=100): - """Least-recently-used cache decorator. - - If *maxsize* is set to None, the LRU features are disabled and the cache - can grow without bound. - - Arguments to the cached function must be hashable. - - View the cache statistics named tuple (hits, misses, maxsize, currsize) with - f.cache_info(). Clear the cache and statistics with f.cache_clear(). - Access the underlying function with f.__wrapped__. - - See: http://en.wikipedia.org/wiki/Cache_algorithms#Least_Recently_Used - - """ - - # Users should only access the lru_cache through its public API: - # cache_info, cache_clear, and f.__wrapped__ - # The internals of the lru_cache are encapsulated for thread safety and - # to allow the implementation to change (including a possible C version). - - def decorating_function(user_function): - - cache = dict() - make_key = _make_key - cache_get = cache.get # bound method to lookup key or return None - _len = len # localize the global len() function - lock = RLock() # because linkedlist updates aren't threadsafe - root = [] # root of the circular doubly linked list - root[:] = [root, root, None, None] # initialize by pointing to self - nonlocal_root = [root] # make updateable non-locally - PREV, NEXT, KEY, RESULT = 0, 1, 2, 3 # names for the link fields - - if maxsize == 0: - - def wrapper(*args, **kwds): - # no caching, just do a statistics update after a successful call - result = user_function(*args, **kwds) - return result - - elif maxsize is None: - - def wrapper(*args, **kwds): - # simple caching without ordering or size limit - key = make_key(args, kwds) - result = cache_get(key, root) # root used here as a unique not-found sentinel - if result is not root: - return result - result = user_function(*args, **kwds) - cache[key] = result - return result - - else: - - def wrapper(*args, **kwds): - # size limited caching that tracks accesses by recency - key = make_key(args, kwds) - with lock: - link = cache_get(key) - if link is not None: - # record recent use of the key by moving it to the front of the list - root, = nonlocal_root - link_prev, link_next, key, result = link - link_prev[NEXT] = link_next - link_next[PREV] = link_prev - last = root[PREV] - last[NEXT] = root[PREV] = link - link[PREV] = last - link[NEXT] = root - return result - result = user_function(*args, **kwds) - with lock: - root, = nonlocal_root - if key in cache: - # getting here means that this same key was added to the - # cache while the lock was released. since the link - # update is already done, we need only return the - # computed result and update the count of misses. - pass - elif _len(cache) >= maxsize: - # use the old root to store the new key and result - oldroot = root - oldroot[KEY] = key - oldroot[RESULT] = result - # empty the oldest link and make it the new root - root = nonlocal_root[0] = oldroot[NEXT] - oldkey = root[KEY] - oldvalue = root[RESULT] - root[KEY] = root[RESULT] = None - # now update the cache dictionary for the new links - del cache[oldkey] - cache[key] = oldroot - else: - # put result in a new link at the front of the list - last = root[PREV] - link = [last, root, key, result] - last[NEXT] = root[PREV] = cache[key] = link - return result - - def cache_clear(): - """Clear the cache and cache statistics""" - with lock: - cache.clear() - root = nonlocal_root[0] - root[:] = [root, root, None, None] - - wrapper.__wrapped__ = user_function - wrapper.cache_clear = cache_clear - return update_wrapper(wrapper, user_function) - - return decorating_function diff --git a/src/rez/backport/ordereddict.py b/src/rez/backport/ordereddict.py deleted file mode 100644 index b7613b042..000000000 --- a/src/rez/backport/ordereddict.py +++ /dev/null @@ -1 +0,0 @@ -from collections import OrderedDict diff --git a/src/rez/backport/zipfile.py b/src/rez/backport/zipfile.py deleted file mode 100644 index 09624f902..000000000 --- a/src/rez/backport/zipfile.py +++ /dev/null @@ -1 +0,0 @@ -from zipfile import * diff --git a/src/rez/cli/complete.py b/src/rez/cli/complete.py index 7553866fa..8a10d4b15 100644 --- a/src/rez/cli/complete.py +++ b/src/rez/cli/complete.py @@ -81,7 +81,7 @@ def _pop_arg(l, p): comp_point += len(s) # create parser for subcommand - from rez.backport.importlib import import_module + from importlib import import_module data = subcommands[subcommand] module_name = data.get("module_name", "rez.cli.%s" % subcommand) mod = import_module(module_name) diff --git a/src/rez/cli/forward.py b/src/rez/cli/forward.py index 54c1e9160..be725b153 100644 --- a/src/rez/cli/forward.py +++ b/src/rez/cli/forward.py @@ -53,7 +53,7 @@ def command(opts, parser, extra_arg_groups=None): if isinstance(doc["module"], str): # refers to a rez module - from rez.backport.importlib import import_module + from importlib import import_module namespace = "rez.%s" % doc["module"] module = import_module(namespace) else: diff --git a/src/rez/config.py b/src/rez/config.py index fe5fb2c89..4e870cc22 100644 --- a/src/rez/config.py +++ b/src/rez/config.py @@ -15,9 +15,9 @@ from rez.vendor.schema.schema import Schema, SchemaError, And, Or, Use from rez.vendor import yaml from rez.vendor.yaml.error import YAMLError -from rez.backport.lru_cache import lru_cache import rez.deprecations from contextlib import contextmanager +from functools import lru_cache from inspect import ismodule import os import re diff --git a/src/rez/plugin_managers.py b/src/rez/plugin_managers.py index 8d647f0a6..64b1d8f09 100644 --- a/src/rez/plugin_managers.py +++ b/src/rez/plugin_managers.py @@ -110,7 +110,7 @@ def register_plugin(self, plugin_name, plugin_class, plugin_module): def load_plugins(self): import pkgutil - from rez.backport.importlib import import_module + from importlib import import_module type_module_name = 'rezplugins.' + self.type_name package = import_module(type_module_name) diff --git a/src/rez/utils/resources.py b/src/rez/utils/resources.py index 5d70d720d..372d1455f 100644 --- a/src/rez/utils/resources.py +++ b/src/rez/utils/resources.py @@ -33,11 +33,12 @@ See the 'pets' unit test in tests/test_resources.py for a complete example. """ +from functools import lru_cache + from rez.utils.data_utils import cached_property, AttributeForwardMeta, \ LazyAttributeMeta from rez.config import config from rez.exceptions import ResourceError -from rez.backport.lru_cache import lru_cache from rez.utils.logging_ import print_debug diff --git a/src/rezplugins/package_repository/filesystem.py b/src/rezplugins/package_repository/filesystem.py index 324570184..5dae0d24a 100644 --- a/src/rezplugins/package_repository/filesystem.py +++ b/src/rezplugins/package_repository/filesystem.py @@ -6,6 +6,7 @@ Filesystem-based package repository """ from contextlib import contextmanager +from functools import lru_cache import os.path import os import stat @@ -32,7 +33,6 @@ from rez.utils.platform_ import platform_ from rez.utils.yaml import load_yaml from rez.config import config -from rez.backport.lru_cache import lru_cache from rez.vendor.schema.schema import Schema, Optional, And, Use, Or from rez.version import Version, VersionRange