1 parent 3d379a9 commit 7ebd420Copy full SHA for 7ebd420
2 files changed
pre_commit_hooks/requirements_txt_fixer.py
@@ -1,4 +1,5 @@
1
import argparse
2
+import re
3
from typing import IO
4
from typing import List
5
from typing import Optional
@@ -10,18 +11,30 @@
10
11
12
13
class Requirement:
14
+ UNTIL_COMPARISON = re.compile(b'={2,3}|!=|~=|>=?|<=?')
15
+ UNTIL_SEP = re.compile(rb'[^;\s]+')
16
+
17
def __init__(self) -> None:
18
self.value: Optional[bytes] = None
19
self.comments: List[bytes] = []
20
21
@property
22
def name(self) -> bytes:
23
assert self.value is not None, self.value
24
+ name = self.value.lower()
25
for egg in (b'#egg=', b'&egg='):
26
if egg in self.value:
- return self.value.lower().partition(egg)[-1]
27
+ return name.partition(egg)[-1]
28
29
+ m = self.UNTIL_SEP.match(name)
30
+ assert m is not None
31
32
+ name = m.group()
33
+ m = self.UNTIL_COMPARISON.search(name)
34
+ if not m:
35
+ return name
36
- return self.value.lower().partition(b'==')[0]
37
+ return name[:m.start()]
38
39
def __lt__(self, requirement: 'Requirement') -> int:
40
# \n means top of file comment, so always return True,
tests/requirements_txt_fixer_test.py
@@ -33,9 +33,28 @@
(b'\nfoo\nbar\n', FAIL, b'bar\n\nfoo\n'),
(b'\nbar\nfoo\n', PASS, b'\nbar\nfoo\n'),
(
- b'pyramid==1\npyramid-foo==2\n',
- PASS,
+ b'pyramid-foo==1\npyramid>=2\n',
+ FAIL,
+ b'pyramid>=2\npyramid-foo==1\n',
+ ),
+ (
41
+ b'a==1\n'
42
+ b'c>=1\n'
43
+ b'bbbb!=1\n'
44
+ b'c-a>=1;python_version>="3.6"\n'
45
+ b'e>=2\n'
46
+ b'd>2\n'
47
+ b'g<2\n'
48
+ b'f<=2\n',
49
50
51
52
53
54
55
56
+ b'f<=2\n'
57
+ b'g<2\n',
58
),
59
(b'ocflib\nDjango\nPyMySQL\n', FAIL, b'Django\nocflib\nPyMySQL\n'),
60
0 commit comments