Adds a special case for index urls similar to how comments are captured. This should avoid breaking ordering when --index-url (-i) and/or --extra-index-url are used. Also adds a relevant test to cover this case. Closes #612.

This commit is contained in:
Ryan Miguel 2022-10-18 16:03:57 -07:00
parent 4dcb74a498
commit 87001a2778
2 changed files with 33 additions and 0 deletions

View file

@ -17,6 +17,7 @@ class Requirement:
def __init__(self) -> None:
self.value: bytes | None = None
self.comments: list[bytes] = []
self.index_urls: list[bytes] = []
@property
def name(self) -> bytes:
@ -64,6 +65,8 @@ def fix_requirements(f: IO[bytes]) -> int:
requirements: list[Requirement] = []
before = list(f)
after: list[bytes] = []
index_options: list[bytes] = []
extra_index_options: list[bytes] = []
before_string = b''.join(before)
@ -97,6 +100,13 @@ def fix_requirements(f: IO[bytes]) -> int:
requirement.comments.append(line)
elif line.lstrip().startswith(b'#') or line.strip() == b'':
requirement.comments.append(line)
elif (
line.lstrip().startswith(b'-i ') or
line.lstrip().startswith(b'--index-url')
):
index_options.append(line)
elif line.lstrip().startswith(b'--extra-index-url'):
extra_index_options.append(line)
else:
requirement.append_value(line)
@ -113,6 +123,8 @@ def fix_requirements(f: IO[bytes]) -> int:
if req.value != b'pkg-resources==0.0.0\n'
]
after.extend(index_options)
after.extend(extra_index_options)
for requirement in sorted(requirements):
after.extend(requirement.comments)
assert requirement.value, requirement.value

View file

@ -99,6 +99,27 @@ from pre_commit_hooks.requirements_txt_fixer import Requirement
PASS,
b'a=2.0.0 \\\n --hash=sha256:abcd\nb==1.0.0\n',
),
(
b'# Bar\n'
b'--extra-index-url http://dist.repoze.org/zope2/2.10/simple\n'
b'zopelib2\n'
b'# Foo\n'
b'-i http://dist.repoze.org/zope2/2.10/simple\n'
b'zopelib1\n'
b'# Baz\n'
b'--index-url http://dist.repoze.org/zope2/2.10/simple\n'
b'zopelib3',
FAIL,
b'-i http://dist.repoze.org/zope2/2.10/simple\n'
b'--index-url http://dist.repoze.org/zope2/2.10/simple\n'
b'--extra-index-url http://dist.repoze.org/zope2/2.10/simple\n'
b'# Foo\n'
b'zopelib1\n'
b'# Bar\n'
b'zopelib2\n'
b'# Baz\n'
b'zopelib3\n',
),
),
)
def test_integration(input_s, expected_retval, output, tmpdir):