diff options
author | Jason R. Coombs <jaraco@jaraco.com> | 2018-05-18 14:09:07 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-05-18 14:09:07 -0400 |
commit | 811c4feac09125d6946c6a159557c4e610fa58de (patch) | |
tree | d3e91d0e96220621e5bc6f39a650530eb02d9b80 | |
parent | 5749b9cfb5ac231aa25d9b8b6a1a49994858aca4 (diff) | |
parent | 58ad1e140703a9214b63e120113a17d48142dc8a (diff) | |
download | python-setuptools-git-811c4feac09125d6946c6a159557c4e610fa58de.tar.gz |
Merge pull request #1364 from seawolf42/feature/issue-1330
Feature/issue 1330
-rw-r--r-- | changelog.d/1364.rst | 1 | ||||
-rw-r--r-- | pkg_resources/__init__.py | 13 | ||||
-rw-r--r-- | pkg_resources/tests/test_resources.py | 29 |
3 files changed, 43 insertions, 0 deletions
diff --git a/changelog.d/1364.rst b/changelog.d/1364.rst new file mode 100644 index 00000000..f7b4c012 --- /dev/null +++ b/changelog.d/1364.rst @@ -0,0 +1 @@ +Add `__dir__()` implementation to `pkg_resources.Distribution()` that includes the attributes in the `_provider` instance variable.
\ No newline at end of file diff --git a/pkg_resources/__init__.py b/pkg_resources/__init__.py index dbdc9b04..4e4409b3 100644 --- a/pkg_resources/__init__.py +++ b/pkg_resources/__init__.py @@ -2663,6 +2663,19 @@ class Distribution(object): raise AttributeError(attr) return getattr(self._provider, attr) + def __dir__(self): + return list( + set(super(Distribution, self).__dir__()) + | set( + attr for attr in self._provider.__dir__() + if not attr.startswith('_') + ) + ) + + if not hasattr(object, '__dir__'): + # python 2.7 not supported + del __dir__ + @classmethod def from_filename(cls, filename, metadata=None, **kw): return cls.from_location( diff --git a/pkg_resources/tests/test_resources.py b/pkg_resources/tests/test_resources.py index 05f35ade..04d02c1f 100644 --- a/pkg_resources/tests/test_resources.py +++ b/pkg_resources/tests/test_resources.py @@ -145,6 +145,35 @@ class TestDistro: for v in "Twisted>=1.5", "Twisted>=1.5\nZConfig>=2.0": self.checkRequires(self.distRequires(v), v) + needs_object_dir = pytest.mark.skipif( + not hasattr(object, '__dir__'), + reason='object.__dir__ necessary for self.__dir__ implementation', + ) + + def test_distribution_dir(self): + d = pkg_resources.Distribution() + dir(d) + + @needs_object_dir + def test_distribution_dir_includes_provider_dir(self): + d = pkg_resources.Distribution() + before = d.__dir__() + assert 'test_attr' not in before + d._provider.test_attr = None + after = d.__dir__() + assert len(after) == len(before) + 1 + assert 'test_attr' in after + + @needs_object_dir + def test_distribution_dir_ignores_provider_dir_leading_underscore(self): + d = pkg_resources.Distribution() + before = d.__dir__() + assert '_test_attr' not in before + d._provider._test_attr = None + after = d.__dir__() + assert len(after) == len(before) + assert '_test_attr' not in after + def testResolve(self): ad = pkg_resources.Environment([]) ws = WorkingSet([]) |