diff options
author | Jason R. Coombs <jaraco@jaraco.com> | 2021-05-31 16:19:42 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-31 16:19:42 (GMT) |
commit | c34ed08d975fb7daa7b329f7c631647782290393 (patch) | |
tree | 6f6456952acac2ba522a559fae2570e769c322b4 /Lib/importlib/metadata | |
parent | 410b70d39d9d77384f8b8597560f6731530149ca (diff) | |
download | cpython-c34ed08d975fb7daa7b329f7c631647782290393.zip cpython-c34ed08d975fb7daa7b329f7c631647782290393.tar.gz cpython-c34ed08d975fb7daa7b329f7c631647782290393.tar.bz2 |
bpo-44246: Restore compatibility in entry_points (GH-26468)
* bpo-44246: Entry points performance improvements.
From importlib_metadata 4.3.1.
* bpo-44246: Sync with importlib_metadata 4.4
Diffstat (limited to 'Lib/importlib/metadata')
-rw-r--r-- | Lib/importlib/metadata/__init__.py | 103 |
1 files changed, 102 insertions, 1 deletions
diff --git a/Lib/importlib/metadata/__init__.py b/Lib/importlib/metadata/__init__.py index 2e3403e..d2116cf 100644 --- a/Lib/importlib/metadata/__init__.py +++ b/Lib/importlib/metadata/__init__.py @@ -204,7 +204,100 @@ class EntryPoint( return all(map(operator.eq, params.values(), attrs)) -class EntryPoints(tuple): +class DeprecatedList(list): + """ + Allow an otherwise immutable object to implement mutability + for compatibility. + + >>> recwarn = getfixture('recwarn') + >>> dl = DeprecatedList(range(3)) + >>> dl[0] = 1 + >>> dl.append(3) + >>> del dl[3] + >>> dl.reverse() + >>> dl.sort() + >>> dl.extend([4]) + >>> dl.pop(-1) + 4 + >>> dl.remove(1) + >>> dl += [5] + >>> dl + [6] + [1, 2, 5, 6] + >>> dl + (6,) + [1, 2, 5, 6] + >>> dl.insert(0, 0) + >>> dl + [0, 1, 2, 5] + >>> dl == [0, 1, 2, 5] + True + >>> dl == (0, 1, 2, 5) + True + >>> len(recwarn) + 1 + """ + + _warn = functools.partial( + warnings.warn, + "EntryPoints list interface is deprecated. Cast to list if needed.", + DeprecationWarning, + stacklevel=2, + ) + + def __setitem__(self, *args, **kwargs): + self._warn() + return super().__setitem__(*args, **kwargs) + + def __delitem__(self, *args, **kwargs): + self._warn() + return super().__delitem__(*args, **kwargs) + + def append(self, *args, **kwargs): + self._warn() + return super().append(*args, **kwargs) + + def reverse(self, *args, **kwargs): + self._warn() + return super().reverse(*args, **kwargs) + + def extend(self, *args, **kwargs): + self._warn() + return super().extend(*args, **kwargs) + + def pop(self, *args, **kwargs): + self._warn() + return super().pop(*args, **kwargs) + + def remove(self, *args, **kwargs): + self._warn() + return super().remove(*args, **kwargs) + + def __iadd__(self, *args, **kwargs): + self._warn() + return super().__iadd__(*args, **kwargs) + + def __add__(self, other): + if not isinstance(other, tuple): + self._warn() + other = tuple(other) + return self.__class__(tuple(self) + other) + + def insert(self, *args, **kwargs): + self._warn() + return super().insert(*args, **kwargs) + + def sort(self, *args, **kwargs): + self._warn() + return super().sort(*args, **kwargs) + + def __eq__(self, other): + if not isinstance(other, tuple): + self._warn() + other = tuple(other) + + return tuple(self).__eq__(other) + + +class EntryPoints(DeprecatedList): """ An immutable collection of selectable EntryPoint objects. """ @@ -215,6 +308,14 @@ class EntryPoints(tuple): """ Get the EntryPoint in self matching name. """ + if isinstance(name, int): + warnings.warn( + "Accessing entry points by index is deprecated. " + "Cast to tuple if needed.", + DeprecationWarning, + stacklevel=2, + ) + return super().__getitem__(name) try: return next(iter(self.select(name=name))) except StopIteration: |