summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason R. Coombs <jaraco@jaraco.com>2017-02-12 21:30:46 -0500
committerGitHub <noreply@github.com>2017-02-12 21:30:46 -0500
commit8ed00a708e1b258bf6647db2ba95de357d3ae9a2 (patch)
tree0cd781091bba984d0e1d5ea1de1e10d8da17a029
parent5470fb8fdf3a65cd18541980bf38e4984b5b1775 (diff)
parentf33cfac393676065088bf7b704207bdcda0fdd4f (diff)
downloadpython-setuptools-git-8ed00a708e1b258bf6647db2ba95de357d3ae9a2.tar.gz
Merge pull request #968 from moriyoshi/moriyoshi/local-version-label-in-egg-fragment
A local version label starts with a '+' sign
-rw-r--r--CHANGES.rst4
-rwxr-xr-xsetuptools/package_index.py2
-rw-r--r--setuptools/tests/test_packageindex.py42
3 files changed, 47 insertions, 1 deletions
diff --git a/CHANGES.rst b/CHANGES.rst
index 8db3c688..16fcbcc7 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -4,6 +4,10 @@ v34.2.0
* #966: Add support for reading dist-info metadata and
thus locating Distributions from zip files.
+* #968: Allow '+' and '!' in egg fragments
+ so that it can take package names that contain
+ PEP 440 conforming version specifiers.
+
v34.1.1
-------
diff --git a/setuptools/package_index.py b/setuptools/package_index.py
index 42361058..3544dd54 100755
--- a/setuptools/package_index.py
+++ b/setuptools/package_index.py
@@ -30,7 +30,7 @@ from fnmatch import translate
from setuptools.py26compat import strip_fragment
from setuptools.py27compat import get_all_headers
-EGG_FRAGMENT = re.compile(r'^egg=([-A-Za-z0-9_.]+)$')
+EGG_FRAGMENT = re.compile(r'^egg=([-A-Za-z0-9_.+!]+)$')
HREF = re.compile("""href\\s*=\\s*['"]?([^'"> ]+)""", re.I)
# this is here to fix emacs' cruddy broken syntax highlighting
PYPI_MD5 = re.compile(
diff --git a/setuptools/tests/test_packageindex.py b/setuptools/tests/test_packageindex.py
index d68867c2..1a66394f 100644
--- a/setuptools/tests/test_packageindex.py
+++ b/setuptools/tests/test_packageindex.py
@@ -181,6 +181,48 @@ class TestPackageIndex:
res = setuptools.package_index.local_open(url)
assert 'content' in res.read()
+ def test_egg_fragment(self):
+ """
+ EGG fragments must comply to PEP 440
+ """
+ epoch = [
+ '',
+ '1!',
+ ]
+ releases = [
+ '0',
+ '0.0',
+ '0.0.0',
+ ]
+ pre = [
+ 'a0',
+ 'b0',
+ 'rc0',
+ ]
+ post = [
+ '.post0'
+ ]
+ dev = [
+ '.dev0',
+ ]
+ local = [
+ ('', ''),
+ ('+ubuntu.0', '+ubuntu.0'),
+ ('+ubuntu-0', '+ubuntu.0'),
+ ('+ubuntu_0', '+ubuntu.0'),
+ ]
+ versions = [
+ [''.join([e, r, p, l]) for l in ll]
+ for e in epoch
+ for r in releases
+ for p in sum([pre, post, dev], [''])
+ for ll in local]
+ for v, vc in versions:
+ dists = list(setuptools.package_index.distros_for_url(
+ 'http://example.com/example.zip#egg=example-' + v))
+ assert dists[0].version == ''
+ assert dists[1].version == vc
+
class TestContentCheckers:
def test_md5(self):