-
Notifications
You must be signed in to change notification settings - Fork 112
Expand file tree
/
Copy pathrequirements_txt.py
More file actions
48 lines (42 loc) · 1.64 KB
/
requirements_txt.py
File metadata and controls
48 lines (42 loc) · 1.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
"""
Parses pip requirements from a requirements file
"""
from packaging._parser import parse_requirement
from pip._internal.network.session import PipSession
from pip._internal.req.req_file import parse_requirements
from conda_lock.models.lock_spec import VersionedDependency, VCSDependency, URLDependency, Dependency
from conda_lock.src_parser.pyproject_toml import unpack_git_url
def parse_requirements_txt(file_path, category=None) -> Dependency:
session = PipSession()
for req in filter(None, parse_requirements(file_path, session)):
yield parse_one_requirement(req.requirement, category=category)
def parse_one_requirement(req_string: str, category=None) -> Dependency:
parsed_req = parse_requirement(req_string)
if parsed_req.url and parsed_req.url.startswith("git+"):
url, rev = unpack_git_url(parsed_req.url)
return VCSDependency(
name=parsed_req.name,
source=url,
manager='pip',
vcs="git",
rev=rev,
)
elif parsed_req.url: # type: ignore[attr-defined]
assert parsed_req.specifier in {"", "*", None}
url, frag = urldefrag(parsed_req.url) # type: ignore[attr-defined]
return URLDependency(
name=parsed_req.name,
manager='pip',
category=category,
extras=parsed_req.extras,
url=url,
hashes=[frag.replace("=", ":")],
)
else:
return VersionedDependency(
name=parsed_req.name,
version=parsed_req.specifier or "*",
manager='pip',
category=category,
extras=parsed_req.extras,
)