From e222a1c246fa533e9665659fa342df2c016f4b73 Mon Sep 17 00:00:00 2001 From: Tushar Goel Date: Mon, 18 Jul 2022 18:50:32 +0530 Subject: [PATCH 1/3] Add support for download URLs Signed-off-by: Tushar Goel --- src/python_inspector/resolution.py | 37 +++- src/python_inspector/utils_pypi.py | 93 ++++++---- tests/data/default-url-expected.json | 4 +- .../pinned-requirements.txt-expected.json | 174 +++++++++++++++--- .../single-url-except-simple-expected.json | 48 ++++- tests/data/single-url-expected.json | 6 +- tests/data/tilde_req-expected.json | 6 +- 7 files changed, 294 insertions(+), 74 deletions(-) diff --git a/src/python_inspector/resolution.py b/src/python_inspector/resolution.py index acbf3986..db5e3173 100644 --- a/src/python_inspector/resolution.py +++ b/src/python_inspector/resolution.py @@ -384,6 +384,27 @@ def get_dependencies(self, candidate): return list(self._iter_dependencies(candidate)) +def get_wheel_download_urls(purl, repos, environment, python_version): + """ + Return a list of download urls for the given purl. + """ + for repo in repos: + for wheel in utils_pypi.get_supported_and_valid_wheels( + repo, purl.name, purl.version, environment, python_version + ): + yield wheel.download_url + + +def get_sdist_download_url(purl, repos, python_version): + """ + Return a list of download urls for the given purl. + """ + for repo in repos: + sdist = utils_pypi.get_valid_sdist(repo, purl.name, purl.version, python_version) + if sdist: + return sdist.download_url + + def get_all_srcs(mapping, graph): """ Return a list of all sources in the graph. @@ -412,7 +433,7 @@ def dfs(mapping, graph, src): ) -def format_resolution(results, as_tree=False): +def format_resolution(results, environment, repos, as_tree=False): """ Return a formatted resolution either as a tree or parent/children. """ @@ -437,7 +458,17 @@ def format_resolution(results, as_tree=False): ) dependencies.append(str(dep_purl)) dependencies.sort() - parent_children = dict(package=str(parent_purl), dependencies=dependencies) + python_version = get_python_version_from_env_tag(environment.python_version) + wheel_urls = list( + get_wheel_download_urls(parent_purl, repos, environment, python_version) + ) + sdist_url = get_sdist_download_url(parent_purl, repos, python_version) + parent_children = dict( + package=str(parent_purl), + dependencies=dependencies, + wheel_urls=list(dict.fromkeys(wheel_urls)), + sdist_url=sdist_url, + ) as_parent_children.append(parent_children) as_parent_children.sort(key=lambda d: d["package"]) return as_parent_children @@ -477,5 +508,5 @@ def get_resolved_dependencies( reporter=BaseReporter(), ) results = resolver.resolve(requirements=requirements, max_rounds=max_rounds) - results = format_resolution(results, as_tree=as_tree) + results = format_resolution(results, as_tree=as_tree, environment=environment, repos=repos) return results diff --git a/src/python_inspector/utils_pypi.py b/src/python_inspector/utils_pypi.py index 9f4b10e1..c8e5fad6 100644 --- a/src/python_inspector/utils_pypi.py +++ b/src/python_inspector/utils_pypi.py @@ -219,28 +219,17 @@ def download_wheel( repos = DEFAULT_PYPI_REPOS fetched_wheel_filenames = [] - for repo in repos: - package = repo.get_package_version(name=name, version=version) - if not package: - if TRACE_DEEP: - print(f" download_wheel: No package in {repo.index_url} for {name}=={version}") - continue - supported_wheels = list(package.get_supported_wheels(environment=environment)) - if not supported_wheels: + supported_and_valid_wheels = get_supported_and_valid_wheels( + repo, name, version, environment, python_version + ) + if not supported_and_valid_wheels: if TRACE_DEEP: print( - f" download_wheel: No supported wheel for {name}=={version}: {environment} " + f" download_wheel: No supported and valid wheel for {name}=={version}: {environment} " ) continue - - for wheel in supported_wheels: - if not valid_distribution(wheel, python_version): - continue - if TRACE_DEEP: - print( - f" download_wheel: Getting wheel from index (or cache): {wheel.download_url}" - ) + for wheel in supported_and_valid_wheels: fetched_wheel_filename = wheel.download( dest_dir=dest_dir, verbose=verbose, @@ -251,10 +240,62 @@ def download_wheel( if fetched_wheel_filenames: # do not futher fetch from other repos if we find in first, typically PyPI break - return fetched_wheel_filenames +def get_valid_sdist(repo, name, version, python_version=DEFAULT_PYTHON_VERSION): + package = repo.get_package_version(name=name, version=version) + if not package: + if TRACE_DEEP: + print( + print(f" get_valid_sdist: No package in {repo.index_url} for {name}=={version}") + ) + return + sdist = package.sdist + if not sdist: + if TRACE_DEEP: + print(f" get_valid_sdist: No sdist for {name}=={version}") + return + if not valid_distribution(sdist, python_version): + return + if TRACE_DEEP: + print(f" get_valid_sdist: Getting sdist from index (or cache): {sdist.download_url}") + return sdist + + +def get_supported_and_valid_wheels( + repo, name, version, environment, python_version=DEFAULT_PYTHON_VERSION +) -> List: + """ + Return a list of wheels matching the ``environment`` Environment constraints. + """ + package = repo.get_package_version(name=name, version=version) + if not package: + if TRACE_DEEP: + print( + f" get_supported_and_valid_wheels: No package in {repo.index_url} for {name}=={version}" + ) + return [] + supported_wheels = list(package.get_supported_wheels(environment=environment)) + if not supported_wheels: + if TRACE_DEEP: + print( + f" get_supported_and_valid_wheels: No supported wheel for {name}=={version}: {environment}" + ) + return [] + wheels = [] + for wheel in supported_wheels: + if not valid_distribution(wheel, python_version): + continue + if TRACE_DEEP: + print( + f""" get_supported_and_valid_wheels: Getting wheel from index (or cache): + {wheel.download_url}""" + ) + wheels.append(wheel) + return wheels + + def valid_distribution(distribution, python_version): """ Return True if distribution is a valid distribution for the given Python version. @@ -289,22 +330,12 @@ def download_sdist( fetched_sdist_filename = None for repo in repos: - package = repo.get_package_version(name=name, version=version) - - if not package: - if TRACE_DEEP: - print(f" download_sdist: No package in {repo.index_url} for {name}=={version}") - continue - sdist = package.sdist + sdist = get_valid_sdist(repo, name, version, python_version=DEFAULT_PYTHON_VERSION) if not sdist: if TRACE_DEEP: - print(f" download_sdist: No sdist for {name}=={version}") + print(f" download_sdist: No valid sdist for {name}=={version}") continue - if not valid_distribution(sdist, python_version): - continue - if TRACE_DEEP: - print(f" download_sdist: Getting sdist from index (or cache): {sdist.download_url}") - fetched_sdist_filename = package.sdist.download( + fetched_sdist_filename = sdist.download( dest_dir=dest_dir, verbose=verbose, echo_func=echo_func, diff --git a/tests/data/default-url-expected.json b/tests/data/default-url-expected.json index aff991a1..9aa07274 100644 --- a/tests/data/default-url-expected.json +++ b/tests/data/default-url-expected.json @@ -28,7 +28,9 @@ "resolved_dependencies": [ { "package": "pkg:pypi/zipp@3.8.0", - "dependencies": [] + "dependencies": [], + "wheel_urls": [], + "sdist_url": null } ] } \ No newline at end of file diff --git a/tests/data/pinned-requirements.txt-expected.json b/tests/data/pinned-requirements.txt-expected.json index 529c962f..9e67935e 100644 --- a/tests/data/pinned-requirements.txt-expected.json +++ b/tests/data/pinned-requirements.txt-expected.json @@ -261,33 +261,61 @@ "resolved_dependencies": [ { "package": "pkg:pypi/attrs@21.4.0", - "dependencies": [] + "dependencies": [], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/be/be/7abce643bfdf8ca01c48afa2ddf8308c2308b0c3b239a44e57d020afa0ef/attrs-21.4.0-py2.py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/d7/77/ebb15fc26d0f815839ecd897b919ed6d85c050feeb83e100e020df9153d2/attrs-21.4.0.tar.gz" }, { "package": "pkg:pypi/beautifulsoup4@4.11.1", "dependencies": [ "pkg:pypi/soupsieve@2.3.2.post1" - ] + ], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/9c/d8/909c4089dbe4ade9f9705f143c9f13f065049a9d5e7d34c828aefdd0a97c/beautifulsoup4-4.11.1-py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/e8/b0/cd2b968000577ec5ce6c741a54d846dfa402372369b8b6861720aa9ecea7/beautifulsoup4-4.11.1.tar.gz" }, { "package": "pkg:pypi/certifi@2022.5.18.1", - "dependencies": [] + "dependencies": [], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/11/dd/e015f3780f42dd9af62cf0107b44ea1298926627ecd70c17b0e484e95bcd/certifi-2022.5.18.1-py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/07/10/75277f313d13a2b74fc56e29239d5c840c2bf09f17bf25c02b35558812c6/certifi-2022.5.18.1.tar.gz" }, { "package": "pkg:pypi/chardet@4.0.0", - "dependencies": [] + "dependencies": [], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/19/c7/fa589626997dd07bd87d9269342ccb74b1720384a4d739a1872bd84fbe68/chardet-4.0.0-py2.py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/ee/2d/9cdc2b527e127b4c9db64b86647d567985940ac3698eeabc7ffaccb4ea61/chardet-4.0.0.tar.gz" }, { "package": "pkg:pypi/charset-normalizer@2.0.12", - "dependencies": [] + "dependencies": [], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/06/b3/24afc8868eba069a7f03650ac750a778862dc34941a4bebeb58706715726/charset_normalizer-2.0.12-py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/56/31/7bcaf657fafb3c6db8c787a865434290b726653c912085fbd371e9b92e1c/charset-normalizer-2.0.12.tar.gz" }, { "package": "pkg:pypi/click@8.0.4", - "dependencies": [] + "dependencies": [], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/4a/a8/0b2ced25639fb20cc1c9784de90a8c25f9504a7f18cd8b5397bd61696d7d/click-8.0.4-py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/dd/cf/706c1ad49ab26abed0b77a2f867984c1341ed7387b8030a6aa914e2942a0/click-8.0.4.tar.gz" }, { "package": "pkg:pypi/colorama@0.4.4", - "dependencies": [] + "dependencies": [], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/44/98/5b86278fbbf250d239ae0ecb724f8572af1c91f4a11edf4d36a206189440/colorama-0.4.4-py2.py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/1f/bb/5d3246097ab77fa083a61bd8d3d527b7ae063c7d8e8671b1cf8c4ec10cbe/colorama-0.4.4.tar.gz" }, { "package": "pkg:pypi/commoncode@30.2.0", @@ -301,7 +329,11 @@ "pkg:pypi/saneyaml@0.5.2", "pkg:pypi/six@1.16.0", "pkg:pypi/text-unidecode@1.3" - ] + ], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/e8/48/dcdad0505371f2e332842945faece60caaf22ce44661a7161710a36312b5/commoncode-30.2.0-py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/8b/65/99ad49681e8897ab851014f18bf51e8081a492efc1ef0b443209f7a83e0e/commoncode-30.2.0.tar.gz" }, { "package": "pkg:pypi/dparse2@0.6.1", @@ -309,49 +341,89 @@ "pkg:pypi/packaging@21.3", "pkg:pypi/pyyaml@6.0", "pkg:pypi/toml@0.10.2" - ] + ], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/e5/5b/90c06372cdd08821b4fb013aea5248ed0750fea8299e235df29e8d4a28dd/dparse2-0.6.1-py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/2d/a3/49cd39abdf8b4832cba27d635a775b721388e50671bee7ea0d10afcf0cfd/dparse2-0.6.1.tar.gz" }, { "package": "pkg:pypi/idna@3.3", - "dependencies": [] + "dependencies": [], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/04/a2/d918dcd22354d8958fe113e1a3630137e0fc8b44859ade3063982eacd2a4/idna-3.3-py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/62/08/e3fc7c8161090f742f504f40b1bccbfc544d4a4e09eb774bf40aafce5436/idna-3.3.tar.gz" }, { "package": "pkg:pypi/importlib-metadata@4.8.3", "dependencies": [ "pkg:pypi/zipp@3.6.0" - ] + ], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/a0/a1/b153a0a4caf7a7e3f15c2cd56c7702e2cf3d89b1b359d1f1c5e59d68f4ce/importlib_metadata-4.8.3-py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/85/ed/e65128cc5cb1580f22ee3009d9187ecdfcc43ffb3b581fe854b24e87d8e7/importlib_metadata-4.8.3.tar.gz" }, { "package": "pkg:pypi/intbitset@3.0.1", - "dependencies": [] + "dependencies": [], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/91/8a/ad3229a13ce2ebb6e642147d2063d0d24010e5b68b526b21c060c169cc5f/intbitset-3.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/f8/80/81bf8129a2cc012a225ea0dc39cd6e11531a61d115616b1eead33b157164/intbitset-3.0.1.tar.gz" }, { "package": "pkg:pypi/packageurl-python@0.9.9", - "dependencies": [] + "dependencies": [], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/59/48/e9962fd0a4b982e1ed41a64cb38366e680f8d5e501248c0b520a667ccf87/packageurl_python-0.9.9-py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/6e/ee/8d89d660da6e44d77f547de9949b380dc93b08b758ee361bc237bcc8b179/packageurl-python-0.9.9.tar.gz" }, { "package": "pkg:pypi/packaging@21.3", "dependencies": [ "pkg:pypi/pyparsing@3.0.9" - ] + ], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/05/8e/8de486cbd03baba4deef4142bd643a3e7bbe954a784dc1bb17142572d127/packaging-21.3-py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/df/9e/d1a7217f69310c1db8fdf8ab396229f55a699ce34a203691794c5d1cad0c/packaging-21.3.tar.gz" }, { "package": "pkg:pypi/pip-requirements-parser@31.2.0", "dependencies": [ "pkg:pypi/packaging@21.3" - ] + ], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/67/2e/94750665759e54b39c9c49eff98d9db1385896c7331b2e44e7c69eec3630/pip_requirements_parser-31.2.0-py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/fc/aa/4fbc8040db7afae616eda6329ddc8ef73afc8bcb611bf9126937970bca83/pip-requirements-parser-31.2.0.tar.gz" }, { "package": "pkg:pypi/pkginfo2@30.0.0", - "dependencies": [] + "dependencies": [], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/49/01/4e506c68c9ea09c702b1eac87e6d2cda6d6633e6ed42ec1f43662e246769/pkginfo2-30.0.0-py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/90/8d/09cc1c99a30ac14050fc4e04e549e024be83ff72a7f63e75023501baf977/pkginfo2-30.0.0.tar.gz" }, { "package": "pkg:pypi/pyparsing@3.0.9", - "dependencies": [] + "dependencies": [], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/6c/10/a7d0fa5baea8fe7b50f448ab742f26f52b80bfca85ac2be9d35cdd9a3246/pyparsing-3.0.9-py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/71/22/207523d16464c40a0310d2d4d8926daffa00ac1f5b1576170a32db749636/pyparsing-3.0.9.tar.gz" }, { "package": "pkg:pypi/pyyaml@6.0", - "dependencies": [] + "dependencies": [], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/d7/42/7ad4b6d67a16229496d4f6e74201bdbebcf4bc1e87d5a70c9297d4961bd2/PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/36/2b/61d51a2c4f25ef062ae3f74576b01638bebad5e045f747ff12643df63844/PyYAML-6.0.tar.gz" }, { "package": "pkg:pypi/requests@2.27.1", @@ -360,49 +432,93 @@ "pkg:pypi/charset-normalizer@2.0.12", "pkg:pypi/idna@3.3", "pkg:pypi/urllib3@1.26.9" - ] + ], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/2d/61/08076519c80041bc0ffa1a8af0cbd3bf3e2b62af10435d269a9d0f40564d/requests-2.27.1-py2.py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/60/f3/26ff3767f099b73e0efa138a9998da67890793bfa475d8278f84a30fec77/requests-2.27.1.tar.gz" }, { "package": "pkg:pypi/resolvelib@0.8.1", - "dependencies": [] + "dependencies": [], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/98/c0/46cfa3f56e43033b705965120058c018375600fa8fdb44c4e53d75820673/resolvelib-0.8.1-py2.py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/ac/20/9541749d77aebf66dd92e2b803f38a50e3a5c76e7876f45eb2b37e758d82/resolvelib-0.8.1.tar.gz" }, { "package": "pkg:pypi/saneyaml@0.5.2", "dependencies": [ "pkg:pypi/pyyaml@6.0" - ] + ], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/7e/62/68fe1eb6012393324af20f772fc37b2148cadcebbd8a610949e5a1b145b4/saneyaml-0.5.2-py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/d1/4a/7374cac103bdfec7c199606784119bee9171ba051290b219ffec1bedc650/saneyaml-0.5.2.tar.gz" }, { "package": "pkg:pypi/six@1.16.0", - "dependencies": [] + "dependencies": [], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/71/39/171f1c67cd00715f190ba0b100d606d440a28c93c7714febeca8b79af85e/six-1.16.0.tar.gz" }, { "package": "pkg:pypi/soupsieve@2.3.2.post1", - "dependencies": [] + "dependencies": [], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/16/e3/4ad79882b92617e3a4a0df1960d6bce08edfb637737ac5c3f3ba29022e25/soupsieve-2.3.2.post1-py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/f3/03/bac179d539362319b4779a00764e95f7542f4920084163db6b0fd4742d38/soupsieve-2.3.2.post1.tar.gz" }, { "package": "pkg:pypi/text-unidecode@1.3", - "dependencies": [] + "dependencies": [], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/ab/e2/e9a00f0ccb71718418230718b3d900e71a5d16e701a3dae079a21e9cd8f8/text-unidecode-1.3.tar.gz" }, { "package": "pkg:pypi/toml@0.10.2", - "dependencies": [] + "dependencies": [], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/be/ba/1f744cdc819428fc6b5084ec34d9b30660f6f9daaf70eead706e3203ec3c/toml-0.10.2.tar.gz" }, { "package": "pkg:pypi/typing-extensions@4.1.1", - "dependencies": [] + "dependencies": [], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/45/6b/44f7f8f1e110027cf88956b59f2fad776cca7e1704396d043f89effd3a0e/typing_extensions-4.1.1-py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/b1/5a/8b5fbb891ef3f81fc923bf3cb4a578c0abf9471eb50ce0f51c74212182ab/typing_extensions-4.1.1.tar.gz" }, { "package": "pkg:pypi/typing@3.6.6", - "dependencies": [] + "dependencies": [], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/4a/bd/eee1157fc2d8514970b345d69cb9975dcd1e42cd7e61146ed841f6e68309/typing-3.6.6-py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/bf/9b/2bf84e841575b633d8d91ad923e198a415e3901f228715524689495b4317/typing-3.6.6.tar.gz" }, { "package": "pkg:pypi/urllib3@1.26.9", - "dependencies": [] + "dependencies": [], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/ec/03/062e6444ce4baf1eac17a6a0ebfe36bb1ad05e1df0e20b110de59c278498/urllib3-1.26.9-py2.py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/1b/a5/4eab74853625505725cefdf168f48661b2cd04e7843ab836f3f63abf81da/urllib3-1.26.9.tar.gz" }, { "package": "pkg:pypi/zipp@3.6.0", - "dependencies": [] + "dependencies": [], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/bd/df/d4a4974a3e3957fd1c1fa3082366d7fff6e428ddb55f074bf64876f8e8ad/zipp-3.6.0-py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/02/bf/0d03dbdedb83afec081fefe86cae3a2447250ef1a81ac601a9a56e785401/zipp-3.6.0.tar.gz" } ] } \ No newline at end of file diff --git a/tests/data/single-url-except-simple-expected.json b/tests/data/single-url-except-simple-expected.json index fc64acc5..b03f6a63 100644 --- a/tests/data/single-url-except-simple-expected.json +++ b/tests/data/single-url-except-simple-expected.json @@ -29,7 +29,11 @@ "resolved_dependencies": [ { "package": "pkg:pypi/click@8.1.3", - "dependencies": [] + "dependencies": [], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/c2/f1/df59e28c642d583f7dacffb1e0965d0e00b218e0186d7858ac5233dce840/click-8.1.3-py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/59/87/84326af34517fca8c58418d148f2403df25303e02736832403587318e9e8/click-8.1.3.tar.gz" }, { "package": "pkg:pypi/flask@2.1.3", @@ -39,35 +43,63 @@ "pkg:pypi/itsdangerous@2.1.2", "pkg:pypi/jinja2@3.1.2", "pkg:pypi/werkzeug@2.1.2" - ] + ], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/af/6a/00d144ac1626fbb44c4ff36519712e258128985a5d0ae43344778ae5cbb9/Flask-2.1.3-py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/5b/77/3accd62b8771954e9584beb03f080385b32ddcad30009d2a4fe4068a05d9/Flask-2.1.3.tar.gz" }, { "package": "pkg:pypi/importlib-metadata@4.12.0", "dependencies": [ "pkg:pypi/zipp@3.8.1" - ] + ], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/d2/a2/8c239dc898138f208dd14b441b196e7b3032b94d3137d9d8453e186967fc/importlib_metadata-4.12.0-py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/1a/16/441080c907df829016729e71d8bdd42d99b9bdde48b01492ed08912c0aa9/importlib_metadata-4.12.0.tar.gz" }, { "package": "pkg:pypi/itsdangerous@2.1.2", - "dependencies": [] + "dependencies": [], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/7f/a1/d3fb83e7a61fa0c0d3d08ad0a94ddbeff3731c05212617dff3a94e097f08/itsdangerous-2.1.2.tar.gz" }, { "package": "pkg:pypi/jinja2@3.1.2", "dependencies": [ "pkg:pypi/markupsafe@2.1.1" - ] + ], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/bc/c3/f068337a370801f372f2f8f6bad74a5c140f6fda3d9de154052708dd3c65/Jinja2-3.1.2-py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/7a/ff/75c28576a1d900e87eb6335b063fab47a8ef3c8b4d88524c4bf78f670cce/Jinja2-3.1.2.tar.gz" }, { "package": "pkg:pypi/markupsafe@2.1.1", - "dependencies": [] + "dependencies": [], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/fd/f4/524d2e8f5a3727cf309c2b7df7c732038375322df1376c9e9ef3aa92fcaf/MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/1d/97/2288fe498044284f39ab8950703e88abbac2abbdf65524d576157af70556/MarkupSafe-2.1.1.tar.gz" }, { "package": "pkg:pypi/werkzeug@2.1.2", - "dependencies": [] + "dependencies": [], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/c4/44/f50f2d22cdfb6d56c03d1b4cc3cfa03ebee2f21b59a7768f151e43415ba5/Werkzeug-2.1.2-py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/10/cf/97eb1a3847c01ae53e8376bc21145555ac95279523a935963dc8ff96c50b/Werkzeug-2.1.2.tar.gz" }, { "package": "pkg:pypi/zipp@3.8.1", - "dependencies": [] + "dependencies": [], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/f0/36/639d6742bcc3ffdce8b85c31d79fcfae7bb04b95f0e5c4c6f8b206a038cc/zipp-3.8.1-py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/3b/e3/fb79a1ea5f3a7e9745f688855d3c673f2ef7921639a380ec76f7d4d83a85/zipp-3.8.1.tar.gz" } ] } \ No newline at end of file diff --git a/tests/data/single-url-expected.json b/tests/data/single-url-expected.json index aff991a1..34b600f5 100644 --- a/tests/data/single-url-expected.json +++ b/tests/data/single-url-expected.json @@ -28,7 +28,11 @@ "resolved_dependencies": [ { "package": "pkg:pypi/zipp@3.8.0", - "dependencies": [] + "dependencies": [], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/80/0e/16a7ee38617aab6a624e95948d314097cc2669edae9b02ded53309941cfc/zipp-3.8.0-py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/cc/3c/3e8c69cd493297003da83f26ccf1faea5dd7da7892a0a7c965ac3bcba7bf/zipp-3.8.0.tar.gz" } ] } \ No newline at end of file diff --git a/tests/data/tilde_req-expected.json b/tests/data/tilde_req-expected.json index d0b42735..5af95dfd 100644 --- a/tests/data/tilde_req-expected.json +++ b/tests/data/tilde_req-expected.json @@ -29,7 +29,11 @@ "resolved_dependencies": [ { "package": "pkg:pypi/zipp@3.8.1", - "dependencies": [] + "dependencies": [], + "wheel_urls": [ + "https://files.pythonhosted.org/packages/f0/36/639d6742bcc3ffdce8b85c31d79fcfae7bb04b95f0e5c4c6f8b206a038cc/zipp-3.8.1-py3-none-any.whl" + ], + "sdist_url": "https://files.pythonhosted.org/packages/3b/e3/fb79a1ea5f3a7e9745f688855d3c673f2ef7921639a380ec76f7d4d83a85/zipp-3.8.1.tar.gz" } ] } \ No newline at end of file From d6478fc4cf2c0c293d2840affd152dcab1e76b97 Mon Sep 17 00:00:00 2001 From: Philippe Ombredanne Date: Wed, 20 Jul 2022 08:48:21 +0200 Subject: [PATCH 2/3] Prefer using named keyword arguments Signed-off-by: Philippe Ombredanne --- src/python_inspector/resolution.py | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/python_inspector/resolution.py b/src/python_inspector/resolution.py index db5e3173..4b66c9d1 100644 --- a/src/python_inspector/resolution.py +++ b/src/python_inspector/resolution.py @@ -390,7 +390,11 @@ def get_wheel_download_urls(purl, repos, environment, python_version): """ for repo in repos: for wheel in utils_pypi.get_supported_and_valid_wheels( - repo, purl.name, purl.version, environment, python_version + repo=repo, + name=purl.name, + version=purl.version, + environment=environment, + python_version=python_version, ): yield wheel.download_url @@ -400,7 +404,12 @@ def get_sdist_download_url(purl, repos, python_version): Return a list of download urls for the given purl. """ for repo in repos: - sdist = utils_pypi.get_valid_sdist(repo, purl.name, purl.version, python_version) + sdist = utils_pypi.get_valid_sdist( + repo=repo, + name=purl.name, + version=purl.version, + python_version=python_version, + ) if sdist: return sdist.download_url @@ -458,11 +467,20 @@ def format_resolution(results, environment, repos, as_tree=False): ) dependencies.append(str(dep_purl)) dependencies.sort() - python_version = get_python_version_from_env_tag(environment.python_version) + python_version = get_python_version_from_env_tag(python_version=environment.python_version) wheel_urls = list( - get_wheel_download_urls(parent_purl, repos, environment, python_version) + get_wheel_download_urls( + purl=parent_purl, + repos=repos, + environment=environment, + python_version=python_version, + ) + ) + sdist_url = get_sdist_download_url( + purl=parent_purl, + repos=repos, + python_version=python_version, ) - sdist_url = get_sdist_download_url(parent_purl, repos, python_version) parent_children = dict( package=str(parent_purl), dependencies=dependencies, From 8aa1dc388bcbff30d98bc4c6fd5e02f5061fe021 Mon Sep 17 00:00:00 2001 From: Tushar Goel Date: Wed, 20 Jul 2022 12:29:03 +0530 Subject: [PATCH 3/3] Fix codestyle Signed-off-by: Tushar Goel --- src/python_inspector/resolution.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/python_inspector/resolution.py b/src/python_inspector/resolution.py index 4b66c9d1..dbdce29e 100644 --- a/src/python_inspector/resolution.py +++ b/src/python_inspector/resolution.py @@ -467,7 +467,9 @@ def format_resolution(results, environment, repos, as_tree=False): ) dependencies.append(str(dep_purl)) dependencies.sort() - python_version = get_python_version_from_env_tag(python_version=environment.python_version) + python_version = get_python_version_from_env_tag( + python_version=environment.python_version + ) wheel_urls = list( get_wheel_download_urls( purl=parent_purl,