Support git://, git+ssh://, git+https:// without -e flag.
Closes-Bug: 1467683 Change-Id: I09163c8072ecbee5c1a24951511c75009511b6f8
This commit is contained in:
parent
ae184c0742
commit
31a0e97cbf
|
@ -93,7 +93,7 @@ def parse_requirements(requirements_files=None, strip_markers=False):
|
|||
# nova-1.2.3 becomes nova>=1.2.3
|
||||
return re.sub(r'([\w.]+)-([\w.-]+)',
|
||||
r'\1>=\2',
|
||||
match.group(1))
|
||||
match.groups()[-1])
|
||||
|
||||
requirements = []
|
||||
for line in get_reqs_from_files(requirements_files):
|
||||
|
@ -124,8 +124,9 @@ def parse_requirements(requirements_files=None, strip_markers=False):
|
|||
# such as:
|
||||
# http://github.com/openstack/nova/zipball/master#egg=nova
|
||||
# http://github.com/openstack/nova/zipball/master#egg=nova-1.2.3
|
||||
elif re.match(r'\s*https?:', line):
|
||||
line = re.sub(r'\s*https?:.*#egg=(.*)$', egg_fragment, line)
|
||||
elif re.match(r'\s*(https?|git(\+(https|ssh))?):', line):
|
||||
line = re.sub(r'\s*(https?|git(\+(https|ssh))?):.*#egg=(.*)$',
|
||||
egg_fragment, line)
|
||||
# -f lines are for index locations, and don't get used here
|
||||
elif re.match(r'\s*-f\s+', line):
|
||||
line = None
|
||||
|
@ -160,7 +161,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?:', line):
|
||||
elif re.match(r'\s*(https?|git(\+(https|ssh))?):', line):
|
||||
dependency_links.append(line)
|
||||
return dependency_links
|
||||
|
||||
|
|
|
@ -19,6 +19,7 @@ from __future__ import print_function
|
|||
import os
|
||||
import sys
|
||||
import tempfile
|
||||
import testscenarios
|
||||
|
||||
try:
|
||||
import cStringIO as io
|
||||
|
@ -316,6 +317,50 @@ class BuildSphinxTest(base.BaseTestCase):
|
|||
self.assertEqual(["builder1", "builder2"], build_doc.builders)
|
||||
|
||||
|
||||
class ParseRequirementsTestScenarios(base.BaseTestCase):
|
||||
|
||||
versioned_scenarios = [
|
||||
('non-versioned', {'versioned': False, 'expected': ['bar']}),
|
||||
('versioned', {'versioned': True, 'expected': ['bar>=1.2.3']})
|
||||
]
|
||||
|
||||
scenarios = [
|
||||
('normal', {'url': "foo\nbar", 'expected': ['foo', 'bar']}),
|
||||
('normal_with_comments', {
|
||||
'url': "# this is a comment\nfoo\n# and another one\nbar",
|
||||
'expected': ['foo', 'bar']}),
|
||||
('removes_index_lines', {'url': '-f foobar', 'expected': []}),
|
||||
]
|
||||
|
||||
scenarios = scenarios + testscenarios.multiply_scenarios([
|
||||
('ssh_egg_url', {'url': 'git+ssh://foo.com/zipball#egg=bar'}),
|
||||
('git_https_egg_url', {'url': 'git+https://foo.com/zipball#egg=bar'}),
|
||||
('http_egg_url', {'url': 'https://foo.com/zipball#egg=bar'}),
|
||||
], versioned_scenarios)
|
||||
|
||||
scenarios = scenarios + testscenarios.multiply_scenarios(
|
||||
[
|
||||
('git_egg_url',
|
||||
{'url': 'git://foo.com/zipball#egg=bar', 'name': 'bar'})
|
||||
], [
|
||||
('non-editable', {'editable': False}),
|
||||
('editable', {'editable': True}),
|
||||
],
|
||||
versioned_scenarios)
|
||||
|
||||
def test_parse_requirements(self):
|
||||
tmp_file = tempfile.NamedTemporaryFile()
|
||||
req_string = self.url
|
||||
if hasattr(self, 'editable') and self.editable:
|
||||
req_string = ("-e %s" % req_string)
|
||||
if hasattr(self, 'versioned') and self.versioned:
|
||||
req_string = ("%s-1.2.3" % req_string)
|
||||
with open(tmp_file.name, 'w') as fh:
|
||||
fh.write(req_string)
|
||||
self.assertEqual(self.expected,
|
||||
packaging.parse_requirements([tmp_file.name]))
|
||||
|
||||
|
||||
class ParseRequirementsTest(base.BaseTestCase):
|
||||
|
||||
def setUp(self):
|
||||
|
@ -323,41 +368,6 @@ class ParseRequirementsTest(base.BaseTestCase):
|
|||
(fd, self.tmp_file) = tempfile.mkstemp(prefix='openstack',
|
||||
suffix='.setup')
|
||||
|
||||
def test_parse_requirements_normal(self):
|
||||
with open(self.tmp_file, 'w') as fh:
|
||||
fh.write("foo\nbar")
|
||||
self.assertEqual(['foo', 'bar'],
|
||||
packaging.parse_requirements([self.tmp_file]))
|
||||
|
||||
def test_parse_requirements_with_git_egg_url(self):
|
||||
with open(self.tmp_file, 'w') as fh:
|
||||
fh.write("-e git://foo.com/zipball#egg=bar")
|
||||
self.assertEqual(['bar'],
|
||||
packaging.parse_requirements([self.tmp_file]))
|
||||
|
||||
def test_parse_requirements_with_versioned_git_egg_url(self):
|
||||
with open(self.tmp_file, 'w') as fh:
|
||||
fh.write("-e git://foo.com/zipball#egg=bar-1.2.4")
|
||||
self.assertEqual(['bar>=1.2.4'],
|
||||
packaging.parse_requirements([self.tmp_file]))
|
||||
|
||||
def test_parse_requirements_with_http_egg_url(self):
|
||||
with open(self.tmp_file, 'w') as fh:
|
||||
fh.write("https://foo.com/zipball#egg=bar")
|
||||
self.assertEqual(['bar'],
|
||||
packaging.parse_requirements([self.tmp_file]))
|
||||
|
||||
def test_parse_requirements_with_versioned_http_egg_url(self):
|
||||
with open(self.tmp_file, 'w') as fh:
|
||||
fh.write("https://foo.com/zipball#egg=bar-4.2.1")
|
||||
self.assertEqual(['bar>=4.2.1'],
|
||||
packaging.parse_requirements([self.tmp_file]))
|
||||
|
||||
def test_parse_requirements_removes_index_lines(self):
|
||||
with open(self.tmp_file, 'w') as fh:
|
||||
fh.write("-f foobar")
|
||||
self.assertEqual([], packaging.parse_requirements([self.tmp_file]))
|
||||
|
||||
def test_parse_requirements_override_with_env(self):
|
||||
with open(self.tmp_file, 'w') as fh:
|
||||
fh.write("foo\nbar")
|
||||
|
@ -380,12 +390,6 @@ class ParseRequirementsTest(base.BaseTestCase):
|
|||
actual = packaging.get_reqs_from_files([])
|
||||
self.assertEqual([], actual)
|
||||
|
||||
def test_parse_requirements_with_comments(self):
|
||||
with open(self.tmp_file, 'w') as fh:
|
||||
fh.write("# this is a comment\nfoobar\n# and another one\nfoobaz")
|
||||
self.assertEqual(['foobar', 'foobaz'],
|
||||
packaging.parse_requirements([self.tmp_file]))
|
||||
|
||||
def test_parse_requirements_python_version(self):
|
||||
with open("requirements-py%d.txt" % sys.version_info[0],
|
||||
"w") as fh:
|
||||
|
|
Loading…
Reference in New Issue