Merge "Fix parsing on egg names with dashes from git URLs"
This commit is contained in:
commit
f3b9a8919f
|
@ -22,6 +22,16 @@ from __future__ import unicode_literals
|
|||
|
||||
from distutils.command import install as du_install
|
||||
from distutils import log
|
||||
|
||||
# (hberaud) do not use six here to import urlparse
|
||||
# to keep this module free from external dependencies
|
||||
# to avoid cross dependencies errors on minimal system
|
||||
# free from dependencies.
|
||||
try:
|
||||
from urllib.parse import urlparse
|
||||
except ImportError:
|
||||
from urlparse import urlparse
|
||||
|
||||
import email
|
||||
import email.errors
|
||||
import os
|
||||
|
@ -98,19 +108,31 @@ def get_reqs_from_files(requirements_files):
|
|||
return []
|
||||
|
||||
|
||||
def egg_fragment(match):
|
||||
return re.sub(r'(?P<PackageName>[\w.-]+)-'
|
||||
'(?P<GlobalVersion>'
|
||||
'(?P<VersionTripple>'
|
||||
'(?P<Major>0|[1-9][0-9]*)\.'
|
||||
'(?P<Minor>0|[1-9][0-9]*)\.'
|
||||
'(?P<Patch>0|[1-9][0-9]*)){1}'
|
||||
'(?P<Tags>(?:\-'
|
||||
'(?P<Prerelease>(?:(?=[0]{1}[0-9A-Za-z-]{0})(?:[0]{1})|'
|
||||
'(?=[1-9]{1}[0-9]*[A-Za-z]{0})(?:[0-9]+)|'
|
||||
'(?=[0-9]*[A-Za-z-]+[0-9A-Za-z-]*)(?:[0-9A-Za-z-]+)){1}'
|
||||
'(?:\.(?=[0]{1}[0-9A-Za-z-]{0})(?:[0]{1})|'
|
||||
'\.(?=[1-9]{1}[0-9]*[A-Za-z]{0})(?:[0-9]+)|'
|
||||
'\.(?=[0-9]*[A-Za-z-]+[0-9A-Za-z-]*)'
|
||||
'(?:[0-9A-Za-z-]+))*){1}){0,1}(?:\+'
|
||||
'(?P<Meta>(?:[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))){0,1}))',
|
||||
r'\g<PackageName>>=\g<GlobalVersion>',
|
||||
match.groups()[-1])
|
||||
|
||||
|
||||
def parse_requirements(requirements_files=None, strip_markers=False):
|
||||
|
||||
if requirements_files is None:
|
||||
requirements_files = get_requirements_files()
|
||||
|
||||
def egg_fragment(match):
|
||||
# take a versioned egg fragment and return a
|
||||
# versioned package requirement e.g.
|
||||
# nova-1.2.3 becomes nova>=1.2.3
|
||||
return re.sub(r'([\w.]+)-([\w.-]+)',
|
||||
r'\1>=\2',
|
||||
match.groups()[-1])
|
||||
|
||||
requirements = []
|
||||
for line in get_reqs_from_files(requirements_files):
|
||||
# Ignore comments
|
||||
|
@ -141,16 +163,19 @@ def parse_requirements(requirements_files=None, strip_markers=False):
|
|||
# -e git://github.com/openstack/nova/master#egg=nova
|
||||
# -e git://github.com/openstack/nova/master#egg=nova-1.2.3
|
||||
# -e git+https://foo.com/zipball#egg=bar&subdirectory=baz
|
||||
if re.match(r'\s*-e\s+', line):
|
||||
line = re.sub(r'\s*-e\s+.*#egg=([^&]+).*$', egg_fragment, line)
|
||||
# such as:
|
||||
# http://github.com/openstack/nova/zipball/master#egg=nova
|
||||
# http://github.com/openstack/nova/zipball/master#egg=nova-1.2.3
|
||||
# git+https://foo.com/zipball#egg=bar&subdirectory=baz
|
||||
elif re.match(r'\s*(https?|git(\+(https|ssh))?):', line):
|
||||
line = re.sub(r'\s*(https?|git(\+(https|ssh))?):.*#egg=([^&]+).*$',
|
||||
egg_fragment, line)
|
||||
# git+[ssh]://github.com/openstack/nova/zipball/master#egg=nova-1.2.3
|
||||
# hg+[ssh]://github.com/openstack/nova/zipball/master#egg=nova-1.2.3
|
||||
# svn+[proto]://github.com/openstack/nova/zipball/master#egg=nova-1.2.3
|
||||
# -f lines are for index locations, and don't get used here
|
||||
if re.match(r'\s*-e\s+', line):
|
||||
extract = re.match(r'\s*-e\s+(.*)$', line)
|
||||
line = extract.group(1)
|
||||
egg = urlparse(line)
|
||||
if egg.scheme:
|
||||
line = re.sub(r'egg=([^&]+).*$', egg_fragment, egg.fragment)
|
||||
elif re.match(r'\s*-f\s+', line):
|
||||
line = None
|
||||
reason = 'Index Location'
|
||||
|
@ -184,7 +209,7 @@ def parse_dependency_links(requirements_files=None):
|
|||
if re.match(r'\s*-[ef]\s+', line):
|
||||
dependency_links.append(re.sub(r'\s*-[ef]\s+', '', line))
|
||||
# lines that are only urls can go in unmolested
|
||||
elif re.match(r'\s*(https?|git(\+(https|ssh))?):', line):
|
||||
elif re.match(r'^\s*(https?|git(\+(https|ssh))?|svn|hg)\S*:', line):
|
||||
dependency_links.append(line)
|
||||
return dependency_links
|
||||
|
||||
|
|
|
@ -918,6 +918,179 @@ class TestRequirementParsing(base.BaseTestCase):
|
|||
self.assertEqual(exp_parsed, gen_parsed)
|
||||
|
||||
|
||||
class TestRepositoryURLDependencies(base.BaseTestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(TestRepositoryURLDependencies, self).setUp()
|
||||
self.requirements = os.path.join(tempfile.mkdtemp(),
|
||||
'requirements.txt')
|
||||
with open(self.requirements, 'w') as f:
|
||||
f.write('\n'.join([
|
||||
'-e git+git://git.pro-ject.org/oslo.messaging#egg=oslo.messaging-1.0.0-rc', # noqa
|
||||
'-e git+git://git.pro-ject.org/django-thumborize#egg=django-thumborize', # noqa
|
||||
'-e git+git://git.pro-ject.org/django-thumborize#egg=django-thumborize-beta', # noqa
|
||||
'-e git+git://git.pro-ject.org/django-thumborize#egg=django-thumborize2-beta', # noqa
|
||||
'-e git+git://git.pro-ject.org/django-thumborize#egg=django-thumborize2-beta-4.0.1', # noqa
|
||||
'-e git+git://git.pro-ject.org/django-thumborize#egg=django-thumborize2-beta-1.0.0-alpha.beta.1', # noqa
|
||||
'-e git+git://git.pro-ject.org/django-thumborize#egg=django-thumborize2-beta-1.0.0-alpha-a.b-c-somethinglong+build.1-aef.1-its-okay', # noqa
|
||||
'-e git+git://git.pro-ject.org/django-thumborize#egg=django-thumborize2-beta-2.0.0-rc.1+build.123', # noqa
|
||||
'-e git+git://git.project.org/Proj#egg=Proj1',
|
||||
'git+https://git.project.org/Proj#egg=Proj2-0.0.1',
|
||||
'-e git+ssh://git.project.org/Proj#egg=Proj3',
|
||||
'svn+svn://svn.project.org/svn/Proj#egg=Proj4-0.0.2',
|
||||
'-e svn+http://svn.project.org/svn/Proj/trunk@2019#egg=Proj5',
|
||||
'hg+http://hg.project.org/Proj@da39a3ee5e6b#egg=Proj-0.0.3',
|
||||
'-e hg+http://hg.project.org/Proj@2019#egg=Proj',
|
||||
'hg+http://hg.project.org/Proj@v1.0#egg=Proj-0.0.4',
|
||||
'-e hg+http://hg.project.org/Proj@special_feature#egg=Proj',
|
||||
'git://foo.com/zipball#egg=foo-bar-1.2.4',
|
||||
'pypi-proj1', 'pypi-proj2']))
|
||||
|
||||
def test_egg_fragment(self):
|
||||
expected = [
|
||||
'django-thumborize',
|
||||
'django-thumborize-beta',
|
||||
'django-thumborize2-beta',
|
||||
'django-thumborize2-beta>=4.0.1',
|
||||
'django-thumborize2-beta>=1.0.0-alpha.beta.1',
|
||||
'django-thumborize2-beta>=1.0.0-alpha-a.b-c-long+build.1-aef.1-its-okay', # noqa
|
||||
'django-thumborize2-beta>=2.0.0-rc.1+build.123',
|
||||
'django-thumborize-beta>=0.0.4',
|
||||
'django-thumborize-beta>=1.2.3',
|
||||
'django-thumborize-beta>=10.20.30',
|
||||
'django-thumborize-beta>=1.1.2-prerelease+meta',
|
||||
'django-thumborize-beta>=1.1.2+meta',
|
||||
'django-thumborize-beta>=1.1.2+meta-valid',
|
||||
'django-thumborize-beta>=1.0.0-alpha',
|
||||
'django-thumborize-beta>=1.0.0-beta',
|
||||
'django-thumborize-beta>=1.0.0-alpha.beta',
|
||||
'django-thumborize-beta>=1.0.0-alpha.beta.1',
|
||||
'django-thumborize-beta>=1.0.0-alpha.1',
|
||||
'django-thumborize-beta>=1.0.0-alpha0.valid',
|
||||
'django-thumborize-beta>=1.0.0-alpha.0valid',
|
||||
'django-thumborize-beta>=1.0.0-alpha-a.b-c-somethinglong+build.1-aef.1-its-okay', # noqa
|
||||
'django-thumborize-beta>=1.0.0-rc.1+build.1',
|
||||
'django-thumborize-beta>=2.0.0-rc.1+build.123',
|
||||
'django-thumborize-beta>=1.2.3-beta',
|
||||
'django-thumborize-beta>=10.2.3-DEV-SNAPSHOT',
|
||||
'django-thumborize-beta>=1.2.3-SNAPSHOT-123',
|
||||
'django-thumborize-beta>=1.0.0',
|
||||
'django-thumborize-beta>=2.0.0',
|
||||
'django-thumborize-beta>=1.1.7',
|
||||
'django-thumborize-beta>=2.0.0+build.1848',
|
||||
'django-thumborize-beta>=2.0.1-alpha.1227',
|
||||
'django-thumborize-beta>=1.0.0-alpha+beta',
|
||||
'django-thumborize-beta>=1.2.3----RC-SNAPSHOT.12.9.1--.12+788',
|
||||
'django-thumborize-beta>=1.2.3----R-S.12.9.1--.12+meta',
|
||||
'django-thumborize-beta>=1.2.3----RC-SNAPSHOT.12.9.1--.12',
|
||||
'django-thumborize-beta>=1.0.0+0.build.1-rc.10000aaa-kk-0.1',
|
||||
'django-thumborize-beta>=999999999999999999.99999999999999.9999999999999', # noqa
|
||||
'Proj1',
|
||||
'Proj2>=0.0.1',
|
||||
'Proj3',
|
||||
'Proj4>=0.0.2',
|
||||
'Proj5',
|
||||
'Proj>=0.0.3',
|
||||
'Proj',
|
||||
'Proj>=0.0.4',
|
||||
'Proj',
|
||||
'foo-bar>=1.2.4',
|
||||
]
|
||||
tests = [
|
||||
'egg=django-thumborize',
|
||||
'egg=django-thumborize-beta',
|
||||
'egg=django-thumborize2-beta',
|
||||
'egg=django-thumborize2-beta-4.0.1',
|
||||
'egg=django-thumborize2-beta-1.0.0-alpha.beta.1',
|
||||
'egg=django-thumborize2-beta-1.0.0-alpha-a.b-c-long+build.1-aef.1-its-okay', # noqa
|
||||
'egg=django-thumborize2-beta-2.0.0-rc.1+build.123',
|
||||
'egg=django-thumborize-beta-0.0.4',
|
||||
'egg=django-thumborize-beta-1.2.3',
|
||||
'egg=django-thumborize-beta-10.20.30',
|
||||
'egg=django-thumborize-beta-1.1.2-prerelease+meta',
|
||||
'egg=django-thumborize-beta-1.1.2+meta',
|
||||
'egg=django-thumborize-beta-1.1.2+meta-valid',
|
||||
'egg=django-thumborize-beta-1.0.0-alpha',
|
||||
'egg=django-thumborize-beta-1.0.0-beta',
|
||||
'egg=django-thumborize-beta-1.0.0-alpha.beta',
|
||||
'egg=django-thumborize-beta-1.0.0-alpha.beta.1',
|
||||
'egg=django-thumborize-beta-1.0.0-alpha.1',
|
||||
'egg=django-thumborize-beta-1.0.0-alpha0.valid',
|
||||
'egg=django-thumborize-beta-1.0.0-alpha.0valid',
|
||||
'egg=django-thumborize-beta-1.0.0-alpha-a.b-c-somethinglong+build.1-aef.1-its-okay', # noqa
|
||||
'egg=django-thumborize-beta-1.0.0-rc.1+build.1',
|
||||
'egg=django-thumborize-beta-2.0.0-rc.1+build.123',
|
||||
'egg=django-thumborize-beta-1.2.3-beta',
|
||||
'egg=django-thumborize-beta-10.2.3-DEV-SNAPSHOT',
|
||||
'egg=django-thumborize-beta-1.2.3-SNAPSHOT-123',
|
||||
'egg=django-thumborize-beta-1.0.0',
|
||||
'egg=django-thumborize-beta-2.0.0',
|
||||
'egg=django-thumborize-beta-1.1.7',
|
||||
'egg=django-thumborize-beta-2.0.0+build.1848',
|
||||
'egg=django-thumborize-beta-2.0.1-alpha.1227',
|
||||
'egg=django-thumborize-beta-1.0.0-alpha+beta',
|
||||
'egg=django-thumborize-beta-1.2.3----RC-SNAPSHOT.12.9.1--.12+788', # noqa
|
||||
'egg=django-thumborize-beta-1.2.3----R-S.12.9.1--.12+meta',
|
||||
'egg=django-thumborize-beta-1.2.3----RC-SNAPSHOT.12.9.1--.12',
|
||||
'egg=django-thumborize-beta-1.0.0+0.build.1-rc.10000aaa-kk-0.1', # noqa
|
||||
'egg=django-thumborize-beta-999999999999999999.99999999999999.9999999999999', # noqa
|
||||
'egg=Proj1',
|
||||
'egg=Proj2-0.0.1',
|
||||
'egg=Proj3',
|
||||
'egg=Proj4-0.0.2',
|
||||
'egg=Proj5',
|
||||
'egg=Proj-0.0.3',
|
||||
'egg=Proj',
|
||||
'egg=Proj-0.0.4',
|
||||
'egg=Proj',
|
||||
'egg=foo-bar-1.2.4',
|
||||
]
|
||||
for index, test in enumerate(tests):
|
||||
self.assertEqual(expected[index],
|
||||
re.sub(r'egg=([^&]+).*$',
|
||||
packaging.egg_fragment,
|
||||
test))
|
||||
|
||||
def test_parse_repo_url_requirements(self):
|
||||
result = packaging.parse_requirements([self.requirements])
|
||||
self.assertEqual(['oslo.messaging>=1.0.0-rc',
|
||||
'django-thumborize',
|
||||
'django-thumborize-beta',
|
||||
'django-thumborize2-beta',
|
||||
'django-thumborize2-beta>=4.0.1',
|
||||
'django-thumborize2-beta>=1.0.0-alpha.beta.1',
|
||||
'django-thumborize2-beta>=1.0.0-alpha-a.b-c-somethinglong+build.1-aef.1-its-okay', # noqa
|
||||
'django-thumborize2-beta>=2.0.0-rc.1+build.123',
|
||||
'Proj1', 'Proj2>=0.0.1', 'Proj3',
|
||||
'Proj4>=0.0.2', 'Proj5', 'Proj>=0.0.3',
|
||||
'Proj', 'Proj>=0.0.4', 'Proj',
|
||||
'foo-bar>=1.2.4', 'pypi-proj1',
|
||||
'pypi-proj2'], result)
|
||||
|
||||
def test_parse_repo_url_dependency_links(self):
|
||||
result = packaging.parse_dependency_links([self.requirements])
|
||||
self.assertEqual(
|
||||
[
|
||||
'git+git://git.pro-ject.org/oslo.messaging#egg=oslo.messaging-1.0.0-rc', # noqa
|
||||
'git+git://git.pro-ject.org/django-thumborize#egg=django-thumborize', # noqa
|
||||
'git+git://git.pro-ject.org/django-thumborize#egg=django-thumborize-beta', # noqa
|
||||
'git+git://git.pro-ject.org/django-thumborize#egg=django-thumborize2-beta', # noqa
|
||||
'git+git://git.pro-ject.org/django-thumborize#egg=django-thumborize2-beta-4.0.1', # noqa
|
||||
'git+git://git.pro-ject.org/django-thumborize#egg=django-thumborize2-beta-1.0.0-alpha.beta.1', # noqa
|
||||
'git+git://git.pro-ject.org/django-thumborize#egg=django-thumborize2-beta-1.0.0-alpha-a.b-c-somethinglong+build.1-aef.1-its-okay', # noqa
|
||||
'git+git://git.pro-ject.org/django-thumborize#egg=django-thumborize2-beta-2.0.0-rc.1+build.123', # noqa
|
||||
'git+git://git.project.org/Proj#egg=Proj1',
|
||||
'git+https://git.project.org/Proj#egg=Proj2-0.0.1',
|
||||
'git+ssh://git.project.org/Proj#egg=Proj3',
|
||||
'svn+svn://svn.project.org/svn/Proj#egg=Proj4-0.0.2',
|
||||
'svn+http://svn.project.org/svn/Proj/trunk@2019#egg=Proj5',
|
||||
'hg+http://hg.project.org/Proj@da39a3ee5e6b#egg=Proj-0.0.3',
|
||||
'hg+http://hg.project.org/Proj@2019#egg=Proj',
|
||||
'hg+http://hg.project.org/Proj@v1.0#egg=Proj-0.0.4',
|
||||
'hg+http://hg.project.org/Proj@special_feature#egg=Proj',
|
||||
'git://foo.com/zipball#egg=foo-bar-1.2.4'], result)
|
||||
|
||||
|
||||
def get_soabi():
|
||||
soabi = None
|
||||
try:
|
||||
|
|
Loading…
Reference in New Issue