Source code for warg.packages.pip_parsing
from pathlib import Path
import logging
from typing import Union
from urllib.parse import urlparse
_logger = logging.getLogger(__name__)
from warg.functions import sink
__all__ = ["get_requirements_from_file"]
try:
# from packaging.requirements import Requirement
# noinspection PyProtectedMember
from pip._internal.network.session import PipSession
# noinspection PyProtectedMember
from pip._internal.req import parse_requirements
# noinspection PyProtectedMember
from pip._internal.req.req_file import ParsedRequirement
# noinspection PyProtectedMember
from pip._internal.utils.packaging import get_requirement
def get_reqed(
req,
#: ParsedRequirement
): # -> Requirement:
"""
https://packaging.python.org/en/latest/specifications/direct-url/#example-pip-commands-and-their-effect-on-direct-url-json
:param req:
:type req: ParsedRequirement
:return:
:rtype: Requirement
"""
req_ = req.requirement
if req.is_editable: # parse out egg=... fragment from VCS URL
parsed = urlparse(req_)
egg_name = parsed.fragment.partition("egg=")[-1]
if not egg_name:
egg_name = parsed.path.split("/")[-1]
without_fragment = parsed._replace(fragment="").geturl()
req_parsed = f"{egg_name} @ {without_fragment}"
else:
req_parsed = req_
try:
return get_requirement(req_parsed)
except:
return None
[docs]
def get_requirements_from_file(
file_path: Union[str, Path], session: Union[str, PipSession] = "test"
): # -> List[Requirement]
"""Turn requirements.txt into a list"""
if isinstance(file_path, Path):
file_path = str(file_path)
parsed_reqs = [get_reqed(ir) for ir in parse_requirements(file_path, session=session)]
return [p for p in parsed_reqs if p]
except Exception as e: # (ModuleNotFoundError, ImportError) as e: #KeyError occurred
_logger.error(e)
get_requirements_from_file = sink
# logger.info('You version of python is to old!')
if __name__ == "__main__":
_logger.info(get_requirements_from_file(Path(__file__).parent.parent.parent / "requirements.txt"))