@@ -60,9 +60,9 @@ def _augment_requirement(ln: str, comment_char: str = "#", unfreeze: str = "all"
6060 Returns:
6161 adjusted requirement
6262
63- >>> _augment_requirement("arrow<=1.2.2,>=1.2.0 # anything", unfreeze="")
63+ >>> _augment_requirement("arrow<=1.2.2,>=1.2.0 # anything", unfreeze="none ")
6464 'arrow<=1.2.2,>=1.2.0'
65- >>> _augment_requirement("arrow<=1.2.2,>=1.2.0 # strict", unfreeze="")
65+ >>> _augment_requirement("arrow<=1.2.2,>=1.2.0 # strict", unfreeze="none ")
6666 'arrow<=1.2.2,>=1.2.0 # strict'
6767 >>> _augment_requirement("arrow<=1.2.2,>=1.2.0 # my name", unfreeze="all")
6868 'arrow>=1.2.0'
@@ -79,6 +79,7 @@ def _augment_requirement(ln: str, comment_char: str = "#", unfreeze: str = "all"
7979 >>> _augment_requirement("arrow", unfreeze="major")
8080 'arrow'
8181 """
82+ assert unfreeze in {"none" , "major" , "all" }
8283 # filer all comments
8384 if comment_char in ln :
8485 comment = ln [ln .index (comment_char ) :]
@@ -88,7 +89,7 @@ def _augment_requirement(ln: str, comment_char: str = "#", unfreeze: str = "all"
8889 is_strict = False
8990 req = ln .strip ()
9091 # skip directly installed dependencies
91- if not req or req . startswith ( "http" ) or "@" in req :
92+ if not req or any ( c in req for c in [ "http:" , "https:" , "@" ]) :
9293 return ""
9394 # extract the major version from all listed versions
9495 if unfreeze == "major" :
@@ -99,7 +100,7 @@ def _augment_requirement(ln: str, comment_char: str = "#", unfreeze: str = "all"
99100 ver_major = None
100101
101102 # remove version restrictions unless they are strict
102- if unfreeze and "<" in req and not is_strict :
103+ if unfreeze != "none" and "<" in req and not is_strict :
103104 req = re .sub (r",? *<=? *[\d\.\*]+,? *" , "" , req ).strip ()
104105 if ver_major is not None and not is_strict :
105106 # add , only if there are already some versions
@@ -121,6 +122,7 @@ def load_requirements(
121122 >>> load_requirements(path_req, "docs.txt", unfreeze="major") # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE
122123 ['sphinx>=4.0, <6.0 # strict', ...]
123124 """
125+ assert unfreeze in {"none" , "major" , "all" }
124126 with open (os .path .join (path_dir , file_name )) as file :
125127 lines = [ln .strip () for ln in file .readlines ()]
126128 reqs = [_augment_requirement (ln , comment_char = comment_char , unfreeze = unfreeze ) for ln in lines ]
@@ -206,17 +208,21 @@ def _download_frontend(pkg_path: str):
206208
207209
208210def _load_aggregate_requirements (req_dir : str = "requirements" , freeze_requirements : bool = False ) -> None :
209- """Load all base requirements from all particular packages and prune duplicates."""
211+ """Load all base requirements from all particular packages and prune duplicates.
212+
213+ >>> _load_aggregate_requirements(os.path.join(_PROJECT_ROOT, "requirements"))
214+ """
210215 requires = [
211- load_requirements (d , file_name = "base.txt" , unfreeze = not freeze_requirements )
216+ # TODO: consider passing unfreeze as string instead
217+ load_requirements (d , file_name = "base.txt" , unfreeze = "none" if freeze_requirements else "major" )
212218 for d in glob .glob (os .path .join (req_dir , "*" ))
213219 # skip empty folder as git artefacts, and resolving Will's special issue
214220 if os .path .isdir (d ) and len (glob .glob (os .path .join (d , "*" ))) > 0 and "__pycache__" not in d
215221 ]
216222 if not requires :
217223 return None
218224 # TODO: add some smarter version aggregation per each package
219- requires = list ( chain (* requires ))
225+ requires = sorted ( set ( chain (* requires ) ))
220226 with open (os .path .join (req_dir , "base.txt" ), "w" ) as fp :
221227 fp .writelines ([ln + os .linesep for ln in requires ] + [os .linesep ])
222228
0 commit comments