Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion pip_api/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,8 @@
from pip_api._installed_distributions import installed_distributions

# Import these whenever, doesn't matter
from pip_api._parse_requirements import parse_requirements
from pip_api._parse_requirements import (
parse_requirements,
ParsedRequirement,
UnparsedRequirement,
)
15 changes: 11 additions & 4 deletions pip_api/_parse_requirements.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
parser.add_argument("-i", "--index-url")
parser.add_argument("--extra-index-url")
parser.add_argument("-f", "--find-links")
parser.add_argument("--hash")

operators = specifiers.Specifier._operators.keys()

Expand Down Expand Up @@ -172,6 +173,12 @@ def _url_to_path(url):
return path


class ParsedRequirement(requirements.Requirement):
def __init__(self, requirement_str: str, hash: Optional[str]):
super().__init__(requirement_str)
self.hash = hash


class UnparsedRequirement(object):
def __init__(self, name, msg, filename, lineno):
self.name = name
Expand Down Expand Up @@ -446,7 +453,7 @@ def _parse_requirement_url(req_str):

def parse_requirements(
filename: os.PathLike, options: Optional[Any] = None, include_invalid: bool = False
) -> Dict[str, Union[requirements.Requirement, UnparsedRequirement]]:
) -> Dict[str, Union[ParsedRequirement, UnparsedRequirement]]:
to_parse = {filename}
parsed = set()
name_to_req = {}
Expand All @@ -463,7 +470,7 @@ def parse_requirements(
lines_enum = _skip_regex(lines_enum, options)

for lineno, line in lines_enum:
req: Optional[Union[requirements.Requirement, UnparsedRequirement]] = None
req: Optional[Union[ParsedRequirement, UnparsedRequirement]] = None
known, _ = parser.parse_known_args(line.strip().split())
if known.req:
req_str = str().join(known.req)
Expand All @@ -477,7 +484,7 @@ def parse_requirements(

try: # Try to parse this as a requirement specification
if req is None:
req = requirements.Requirement(parsed_req_str)
req = ParsedRequirement(parsed_req_str, known.hash)
except requirements.InvalidRequirement:
try:
_check_invalid_requirement(req_str)
Expand All @@ -493,7 +500,7 @@ def parse_requirements(
to_parse.add(full_path)
elif known.editable:
name, url = _parse_editable(known.editable)
req = requirements.Requirement("%s @ %s" % (name, url))
req = ParsedRequirement("%s @ %s" % (name, url), known.hash)
else:
pass # This is an invalid requirement

Expand Down