summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason R. Coombs <jaraco@jaraco.com>2017-07-31 19:17:29 -0400
committerGitHub <noreply@github.com>2017-07-31 19:17:29 -0400
commite7ff68af15593b3dff7a6555a35fc060f96f4f8c (patch)
treea7a988aa3b3f04652918c408cf55dfbcfe0d4aa9
parent49df713e676436e062bacde706b5084b958f0322 (diff)
parente265e4560965878531fea7856fb165a182908b8d (diff)
downloadpython-setuptools-git-36.2.6.tar.gz
Merge pull request #1116 from leorochael/fix-462v36.2.6
Better detect unpacked eggs
-rw-r--r--.gitignore1
-rw-r--r--CHANGES.rst6
-rw-r--r--pkg_resources/__init__.py18
-rw-r--r--pkg_resources/tests/test_find_distributions.py65
-rwxr-xr-xsetup.py2
-rw-r--r--tests/requirements.txt1
6 files changed, 88 insertions, 5 deletions
diff --git a/.gitignore b/.gitignore
index b23ade08..2e2f71b8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,6 +7,7 @@ lib
distribute.egg-info
setuptools.egg-info
.coverage
+.eggs
.tox
*.egg
*.py[cod]
diff --git a/CHANGES.rst b/CHANGES.rst
index 75f39d48..7baca656 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -1,3 +1,9 @@
+v36.2.6
+-------
+
+* #462: Don't assume a directory is an egg by the ``.egg``
+ extension alone.
+
v36.2.5
-------
diff --git a/pkg_resources/__init__.py b/pkg_resources/__init__.py
index f6666968..f13a69b3 100644
--- a/pkg_resources/__init__.py
+++ b/pkg_resources/__init__.py
@@ -1553,7 +1553,7 @@ class EggProvider(NullProvider):
path = self.module_path
old = None
while path != old:
- if _is_unpacked_egg(path):
+ if _is_egg_path(path):
self.egg_name = os.path.basename(path)
self.egg_info = os.path.join(path, 'EGG-INFO')
self.egg_root = path
@@ -1956,7 +1956,7 @@ def find_eggs_in_zip(importer, path_item, only=False):
# don't yield nested distros
return
for subitem in metadata.resource_listdir('/'):
- if _is_unpacked_egg(subitem):
+ if _is_egg_path(subitem):
subpath = os.path.join(path_item, subitem)
for dist in find_eggs_in_zip(zipimport.zipimporter(subpath), subpath):
yield dist
@@ -2033,7 +2033,7 @@ def find_on_path(importer, path_item, only=False):
yield Distribution.from_location(
path_item, entry, metadata, precedence=DEVELOP_DIST
)
- elif not only and _is_unpacked_egg(entry):
+ elif not only and _is_egg_path(entry):
dists = find_distributions(os.path.join(path_item, entry))
for dist in dists:
yield dist
@@ -2221,12 +2221,22 @@ def _normalize_cached(filename, _cache={}):
return result
+def _is_egg_path(path):
+ """
+ Determine if given path appears to be an egg.
+ """
+ return (
+ path.lower().endswith('.egg')
+ )
+
+
def _is_unpacked_egg(path):
"""
Determine if given path appears to be an unpacked egg.
"""
return (
- path.lower().endswith('.egg')
+ _is_egg_path(path) and
+ os.path.isfile(os.path.join(path, 'EGG-INFO', 'PKG-INFO'))
)
diff --git a/pkg_resources/tests/test_find_distributions.py b/pkg_resources/tests/test_find_distributions.py
new file mode 100644
index 00000000..97999b33
--- /dev/null
+++ b/pkg_resources/tests/test_find_distributions.py
@@ -0,0 +1,65 @@
+import subprocess
+import sys
+
+import pytest
+import pkg_resources
+
+SETUP_TEMPLATE = """
+import setuptools
+setuptools.setup(
+ name="my-test-package",
+ version="1.0",
+ zip_safe=True,
+)
+""".lstrip()
+
+class TestFindDistributions:
+
+ @pytest.fixture
+ def target_dir(self, tmpdir):
+ target_dir = tmpdir.mkdir('target')
+ # place a .egg named directory in the target that is not an egg:
+ target_dir.mkdir('not.an.egg')
+ return str(target_dir)
+
+ @pytest.fixture
+ def project_dir(self, tmpdir):
+ project_dir = tmpdir.mkdir('my-test-package')
+ (project_dir / "setup.py").write(SETUP_TEMPLATE)
+ return str(project_dir)
+
+ def test_non_egg_dir_named_egg(self, target_dir):
+ dists = pkg_resources.find_distributions(target_dir)
+ assert not list(dists)
+
+ def test_standalone_egg_directory(self, project_dir, target_dir):
+ # install this distro as an unpacked egg:
+ args = [
+ sys.executable,
+ '-c', 'from setuptools.command.easy_install import main; main()',
+ '-mNx',
+ '-d', target_dir,
+ '--always-unzip',
+ project_dir,
+ ]
+ subprocess.check_call(args)
+ dists = pkg_resources.find_distributions(target_dir)
+ assert [dist.project_name for dist in dists] == ['my-test-package']
+ dists = pkg_resources.find_distributions(target_dir, only=True)
+ assert not list(dists)
+
+ def test_zipped_egg(self, project_dir, target_dir):
+ # install this distro as an unpacked egg:
+ args = [
+ sys.executable,
+ '-c', 'from setuptools.command.easy_install import main; main()',
+ '-mNx',
+ '-d', target_dir,
+ '--zip-ok',
+ project_dir,
+ ]
+ subprocess.check_call(args)
+ dists = pkg_resources.find_distributions(target_dir)
+ assert [dist.project_name for dist in dists] == ['my-test-package']
+ dists = pkg_resources.find_distributions(target_dir, only=True)
+ assert not list(dists)
diff --git a/setup.py b/setup.py
index 9571cfa9..7b29c53e 100755
--- a/setup.py
+++ b/setup.py
@@ -89,7 +89,7 @@ def pypi_link(pkg_filename):
setup_params = dict(
name="setuptools",
- version="36.2.5",
+ version="36.2.6",
description="Easily download, build, install, upgrade, and uninstall "
"Python packages",
author="Python Packaging Authority",
diff --git a/tests/requirements.txt b/tests/requirements.txt
index c9413b86..4761505f 100644
--- a/tests/requirements.txt
+++ b/tests/requirements.txt
@@ -1,5 +1,6 @@
importlib; python_version<"2.7"
mock
pytest-flake8; python_version>="2.7"
+virtualenv>=13.0.0
pytest-virtualenv>=1.2.7
pytest>=3.0.2