diff --git a/src/_packagedcode/pypi.py b/src/_packagedcode/pypi.py index 2eb78ce8..7d26be3e 100644 --- a/src/_packagedcode/pypi.py +++ b/src/_packagedcode/pypi.py @@ -828,8 +828,14 @@ def get_requirements_txt_dependencies(location, include_nested=False): # for now we ignore errors extra_data = {} for opt in req_file.options: - extra_data.update(opt.options) - + for name, value in opt.options.items(): + if name not in extra_data: + extra_data[name] = value + else: + if isinstance(value, list): + extra_data[name].extend(value) + else: + extra_data[name] = value dependent_packages = [] for req in req_file.requirements: diff --git a/src/python_inspector/dependencies.py b/src/python_inspector/dependencies.py index e11b8801..afa0816f 100644 --- a/src/python_inspector/dependencies.py +++ b/src/python_inspector/dependencies.py @@ -38,6 +38,15 @@ def get_dependencies_from_requirements(requirements_file="requirements.txt", *ar yield dependent_package +def get_extra_data_from_requirements(requirements_file="requirements.txt", *args, **kwargs): + """ + Yield extra_data for each requirement in a `requirement` + file. + """ + for package_data in PipRequirementsFileHandler.parse(location=requirements_file): + yield package_data.extra_data + + def get_dependency(specifier, *args, **kwargs): """ Return a DependentPackage given a requirement ``specifier`` string. diff --git a/src/python_inspector/resolve_cli.py b/src/python_inspector/resolve_cli.py index bf6dd7eb..a838c0ef 100644 --- a/src/python_inspector/resolve_cli.py +++ b/src/python_inspector/resolve_cli.py @@ -146,6 +146,8 @@ def resolve_dependencies( for req_file in requirement_files: deps = dependencies.get_dependencies_from_requirements(requirements_file=req_file) + for extra_data in dependencies.get_extra_data_from_requirements(requirements_file=req_file): + index_urls = (*index_urls, *tuple(extra_data.get("extra_index_urls") or [])) direct_dependencies.extend(deps) for specifier in specifiers: diff --git a/tests/data/requirements-test.txt b/tests/data/requirements-test.txt new file mode 100644 index 00000000..0158655f --- /dev/null +++ b/tests/data/requirements-test.txt @@ -0,0 +1,4 @@ +attrs +--extra-index-url https://pypi.python.org/simple/ +--extra-index-url https://testpypi.python.org/simple/ +--extra-index-url https://pypi1.python.org/simple/ \ No newline at end of file diff --git a/tests/test_requirement_parsing.py b/tests/test_requirement_parsing.py new file mode 100644 index 00000000..b5b7cb51 --- /dev/null +++ b/tests/test_requirement_parsing.py @@ -0,0 +1,20 @@ +import os + +from python_inspector.dependencies import get_extra_data_from_requirements + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +REQ_FILE = os.path.join(BASE_DIR, "data", "requirements-test.txt") + + +def test_get_extra_data_from_requirements(): + expected = [ + { + "extra_index_urls": [ + "https://pypi.python.org/simple/", + "https://testpypi.python.org/simple/", + "https://pypi1.python.org/simple/", + ] + } + ] + result = list(get_extra_data_from_requirements(REQ_FILE)) + assert expected == result