summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason R. Coombs <jaraco@jaraco.com>2018-05-18 14:09:07 -0400
committerGitHub <noreply@github.com>2018-05-18 14:09:07 -0400
commit811c4feac09125d6946c6a159557c4e610fa58de (patch)
treed3e91d0e96220621e5bc6f39a650530eb02d9b80
parent5749b9cfb5ac231aa25d9b8b6a1a49994858aca4 (diff)
parent58ad1e140703a9214b63e120113a17d48142dc8a (diff)
downloadpython-setuptools-git-811c4feac09125d6946c6a159557c4e610fa58de.tar.gz
Merge pull request #1364 from seawolf42/feature/issue-1330
Feature/issue 1330
-rw-r--r--changelog.d/1364.rst1
-rw-r--r--pkg_resources/__init__.py13
-rw-r--r--pkg_resources/tests/test_resources.py29
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([])