Add location to requirement.Requirement

This will provide space to store the result of parsing requirements
like -e file:///opt/stack/new/oslo.THING, which we need to do for
edit-constraint to work in devstack when more than one library is
being installed from git. This is a separate patch to make reviewing
the actual new functionality easier - it is entirely mechanical,
adding the field and dealing with test fallout.

Change-Id: Ied4e92717b0dab871dac42ae639d1f2a6c236414
This commit is contained in:
Robert Collins 2015-07-03 12:20:23 +12:00
parent 5f4b005ba4
commit b838ab1e43
7 changed files with 43 additions and 32 deletions

View File

@ -24,7 +24,8 @@ def edit(reqs, name, replacement):
if not replacement:
reqs.pop(name, None)
else:
reqs[name] = [(requirement.Requirement('', '', '', replacement), '')]
reqs[name] = [
(requirement.Requirement('', '', '', '', replacement), '')]
result = []
for entries in reqs.values():
for entry, _ in entries:

View File

@ -111,7 +111,7 @@ def _sync_requirements_file(
elif req is None:
# Unparsable lines.
output_requirements.append(
requirement.Requirement('', '', '', req_line))
requirement.Requirement('', '', '', '', req_line))
continue
elif not req.package:
# Comment-only lines

View File

@ -31,7 +31,7 @@ _REQS_HEADER = [
Requirement = collections.namedtuple(
'Requirement', ['package', 'specifiers', 'markers', 'comment'])
'Requirement', ['package', 'location', 'specifiers', 'markers', 'comment'])
Requirements = collections.namedtuple('Requirements', ['reqs'])
@ -77,7 +77,7 @@ def parse_line(req_line):
else:
name = ''
specifier = ''
return Requirement(name, specifier, markers, comment)
return Requirement(name, '', specifier, markers, comment)
def to_content(reqs, marker_sep=';', line_prefix='', prefix=True):

View File

@ -45,7 +45,7 @@ class TestEdit(testtools.TestCase):
reqs = {}
res = edit.edit(reqs, 'foo', 'foo==1.2')
self.assertEqual(requirement.Requirements(
[requirement.Requirement('', '', '', 'foo==1.2')]), res)
[requirement.Requirement('', '', '', '', 'foo==1.2')]), res)
def test_delete(self):
reqs = requirement.parse('foo==1.2\n')
@ -56,10 +56,10 @@ class TestEdit(testtools.TestCase):
reqs = requirement.parse('foo==1.2\n')
res = edit.edit(reqs, 'foo', 'foo==1.3')
self.assertEqual(requirement.Requirements(
[requirement.Requirement('', '', '', 'foo==1.3')]), res)
[requirement.Requirement('', '', '', '', 'foo==1.3')]), res)
def test_replace_many(self):
reqs = requirement.parse('foo==1.2;p\nfoo==1.3;q')
res = edit.edit(reqs, 'foo', 'foo==1.3')
self.assertEqual(requirement.Requirements(
[requirement.Requirement('', '', '', 'foo==1.3')]), res)
[requirement.Requirement('', '', '', '', 'foo==1.3')]), res)

View File

@ -200,9 +200,10 @@ class TestMergeSetupCfg(testtools.TestCase):
console_scripts =
foo = bar:quux
""")
blank = requirement.Requirement('', '', '', '')
r1 = requirement.Requirement('b', '>=1', "python_version=='2.7'", '')
r2 = requirement.Requirement('d', '', '', '# BSD')
blank = requirement.Requirement('', '', '', '', '')
r1 = requirement.Requirement(
'b', '', '>=1', "python_version=='2.7'", '')
r2 = requirement.Requirement('d', '', '', '', '# BSD')
reqs = {
'a': requirement.Requirements([blank, r1]),
'c': requirement.Requirements([blank, r2])}

View File

@ -25,32 +25,33 @@ class TestParseRequirement(testtools.TestCase):
scenarios = [
('package', dict(
line='swift',
req=requirement.Requirement('swift', '', '', ''))),
req=requirement.Requirement('swift', '', '', '', ''))),
('specifier', dict(
line='alembic>=0.4.1',
req=requirement.Requirement('alembic', '>=0.4.1', '', ''))),
req=requirement.Requirement('alembic', '', '>=0.4.1', '', ''))),
('specifiers', dict(
line='alembic>=0.4.1,!=1.1.8',
req=requirement.Requirement('alembic', '!=1.1.8,>=0.4.1', '', ''))),
req=requirement.Requirement('alembic', '', '!=1.1.8,>=0.4.1', '',
''))),
('comment-only', dict(
line='# foo',
req=requirement.Requirement('', '', '', '# foo'))),
req=requirement.Requirement('', '', '', '', '# foo'))),
('comment', dict(
line='Pint>=0.5 # BSD',
req=requirement.Requirement('Pint', '>=0.5', '', '# BSD'))),
req=requirement.Requirement('Pint', '', '>=0.5', '', '# BSD'))),
('comment-with-semicolon', dict(
line='Pint>=0.5 # BSD;fred',
req=requirement.Requirement('Pint', '>=0.5', '', '# BSD;fred'))),
req=requirement.Requirement('Pint', '', '>=0.5', '', '# BSD;fred'))),
('case', dict(
line='Babel>=1.3',
req=requirement.Requirement('Babel', '>=1.3', '', ''))),
req=requirement.Requirement('Babel', '', '>=1.3', '', ''))),
('markers', dict(
line="pywin32;sys_platform=='win32'",
req=requirement.Requirement('pywin32', '', "sys_platform=='win32'",
''))),
req=requirement.Requirement('pywin32', '', '',
"sys_platform=='win32'", ''))),
('markers-with-comment', dict(
line="Sphinx<=1.2; python_version=='2.7'# Sadface",
req=requirement.Requirement('Sphinx', '<=1.2',
req=requirement.Requirement('Sphinx', '', '<=1.2',
"python_version=='2.7'", '# Sadface')))]
def test_parse(self):
@ -76,7 +77,7 @@ class TestToContent(testtools.TestCase):
def test_smoke(self):
reqs = requirement.to_content(requirement.Requirements(
[requirement.Requirement(
'foo', '<=1', "python_version=='2.7'", '# BSD')]),
'foo', '', '<=1', "python_version=='2.7'", '# BSD')]),
marker_sep='!')
self.assertEqual(
''.join(requirement._REQS_HEADER

View File

@ -257,9 +257,10 @@ class TestSyncRequirementsFile(testtools.TestCase):
actions, reqs = update._sync_requirements_file(
global_reqs, project_reqs, 'f', False, False, False)
self.assertEqual(requirement.Requirements([
requirement.Requirement('foo', '<2', "python_version=='2.7'", ''),
requirement.Requirement(
'foo', '>1', "python_version!='2.7'", '')]),
'foo', '', '<2', "python_version=='2.7'", ''),
requirement.Requirement(
'foo', '', '>1', "python_version!='2.7'", '')]),
reqs)
self.assertEqual(project.StdOut(
" foo "
@ -284,9 +285,12 @@ class TestSyncRequirementsFile(testtools.TestCase):
actions, reqs = update._sync_requirements_file(
global_reqs, project_reqs, 'f', False, False, False)
self.assertEqual(requirement.Requirements([
requirement.Requirement('foo', '<2', "python_version=='2.7'", ''),
requirement.Requirement('foo', '>1', "python_version!='2.7'", ''),
requirement.Requirement('', '', '', "# mumbo gumbo")]),
requirement.Requirement(
'foo', '', '<2', "python_version=='2.7'", ''),
requirement.Requirement(
'foo', '', '>1', "python_version!='2.7'", ''),
requirement.Requirement(
'', '', '', '', "# mumbo gumbo")]),
reqs)
self.assertThat(actions, matchers.HasLength(0))
@ -305,9 +309,12 @@ class TestSyncRequirementsFile(testtools.TestCase):
actions, reqs = update._sync_requirements_file(
global_reqs, project_reqs, 'f', False, False, False)
self.assertEqual(requirement.Requirements([
requirement.Requirement('foo', '<2', "python_version=='2.7'", ''),
requirement.Requirement('foo', '>1', "python_version!='2.7'", ''),
requirement.Requirement('', '', '', "# mumbo gumbo")]),
requirement.Requirement(
'foo', '', '<2', "python_version=='2.7'", ''),
requirement.Requirement(
'foo', '', '>1', "python_version!='2.7'", ''),
requirement.Requirement(
'', '', '', '', "# mumbo gumbo")]),
reqs)
self.assertEqual(project.StdOut(
" foo<1.8;python_version=='2.7' -> "
@ -331,9 +338,10 @@ class TestSyncRequirementsFile(testtools.TestCase):
actions, reqs = update._sync_requirements_file(
global_reqs, project_reqs, 'f', False, False, False)
self.assertEqual(requirement.Requirements([
requirement.Requirement('foo', '<2', "python_version=='2.7'", ''),
requirement.Requirement(
'foo', '>1', "python_version!='2.7'", '')]),
'foo', '', '<2', "python_version=='2.7'", ''),
requirement.Requirement(
'foo', '', '>1', "python_version!='2.7'", '')]),
reqs)
self.assertThat(actions, matchers.HasLength(0))
@ -350,7 +358,7 @@ class TestSyncRequirementsFile(testtools.TestCase):
actions, reqs = update._sync_requirements_file(
global_reqs, project_reqs, 'f', False, False, False)
self.assertEqual(requirement.Requirements([
requirement.Requirement('foo', '>1', "", '')]),
requirement.Requirement('foo', '', '>1', "", '')]),
reqs)
self.assertEqual(project.StdOut(
" foo<2;python_version=='2.7' -> foo>1\n"), actions[2])