Skip to content

Commit

Permalink
Merge pull request #1014 from vhoulbreque-withings/960-fix-requiremen…
Browse files Browse the repository at this point in the history
…ts-txt-fixer-duplicated-elements

Remove duplicated packages
  • Loading branch information
asottile committed Feb 25, 2024
2 parents 454ade9 + 0d6d0a7 commit aae27b8
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 1 deletion.
11 changes: 10 additions & 1 deletion pre_commit_hooks/requirements_txt_fixer.py
Expand Up @@ -45,6 +45,11 @@ def __lt__(self, requirement: Requirement) -> bool:
elif requirement.value == b'\n':
return False
else:
# if 2 requirements have the same name, the one with comments
# needs to go first (so that when removing duplicates, the one
# with comments is kept)
if self.name == requirement.name:
return bool(self.comments) > bool(requirement.comments)
return self.name < requirement.name

def is_complete(self) -> bool:
Expand Down Expand Up @@ -113,10 +118,14 @@ def fix_requirements(f: IO[bytes]) -> int:
if req.value != b'pkg-resources==0.0.0\n'
]

# sort the requirements and remove duplicates
prev = None
for requirement in sorted(requirements):
after.extend(requirement.comments)
assert requirement.value, requirement.value
after.append(requirement.value)
if prev is None or requirement.value != prev.value:
after.append(requirement.value)
prev = requirement
after.extend(rest)

after_string = b''.join(after)
Expand Down
6 changes: 6 additions & 0 deletions tests/requirements_txt_fixer_test.py
Expand Up @@ -68,6 +68,12 @@
b'f<=2\n'
b'g<2\n',
),
(b'a==1\nb==1\na==1\n', FAIL, b'a==1\nb==1\n'),
(
b'a==1\nb==1\n#comment about a\na==1\n',
FAIL,
b'#comment about a\na==1\nb==1\n',
),
(b'ocflib\nDjango\nPyMySQL\n', FAIL, b'Django\nocflib\nPyMySQL\n'),
(
b'-e git+ssh://git_url@tag#egg=ocflib\nDjango\nPyMySQL\n',
Expand Down

0 comments on commit aae27b8

Please sign in to comment.