diff --git a/requirements-dev.txt b/requirements-dev.txt index 6514e9e2..cf95bf26 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -38,4 +38,4 @@ tomli==1.2.3 tqdm==4.64.0 twine==3.8.0 typed-ast==1.5.4 -webencodings==0.5.1 \ No newline at end of file +webencodings==0.5.1 diff --git a/requirements.txt b/requirements.txt index 610856cb..b177fb4c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -24,3 +24,4 @@ text-unidecode==1.3 toml==0.10.2 urllib3==1.26.11 zipp==3.8.1 +pydantic_settings == 2.4.0 diff --git a/requirements_builder.ABOUT b/requirements_builder.ABOUT index 251c9de6..0c7e37fa 100644 --- a/requirements_builder.ABOUT +++ b/requirements_builder.ABOUT @@ -68,6 +68,7 @@ install_requires = saneyaml >= 0.5.2 toml >= 0.10.0 mock >= 3.0.5 + pydantic_settings >= 2.4.0 [options.packages.find] where = src diff --git a/setup.cfg b/setup.cfg index 6d8f566c..14b68302 100644 --- a/setup.cfg +++ b/setup.cfg @@ -69,6 +69,7 @@ install_requires = toml >= 0.10.0 mock >= 3.0.5 packvers >= 21.5 + pydantic_settings >= 2.4.0 [options.packages.find] where = src diff --git a/src/python_inspector/__init__.py b/src/python_inspector/__init__.py index a990b071..d4c25e4a 100644 --- a/src/python_inspector/__init__.py +++ b/src/python_inspector/__init__.py @@ -7,4 +7,7 @@ # See https://aboutcode.org for more information about nexB OSS projects. # -DEFAULT_PYTHON_VERSION = "3.8" +from python_inspector.settings import Settings + +# Initialize global settings +settings = Settings() # type: ignore diff --git a/src/python_inspector/api.py b/src/python_inspector/api.py index a64d0c17..7b168954 100644 --- a/src/python_inspector/api.py +++ b/src/python_inspector/api.py @@ -11,38 +11,26 @@ import os from netrc import netrc -from typing import Dict -from typing import List -from typing import NamedTuple -from typing import Sequence +from typing import Dict, List, NamedTuple, Optional, Sequence from packageurl import PackageURL from packvers.requirements import Requirement -from resolvelib import BaseReporter -from resolvelib import Resolver - -from _packagedcode.models import DependentPackage -from _packagedcode.models import PackageData -from _packagedcode.pypi import PipRequirementsFileHandler -from _packagedcode.pypi import PythonSetupPyHandler -from _packagedcode.pypi import can_process_dependent_package -from python_inspector import DEFAULT_PYTHON_VERSION -from python_inspector import dependencies -from python_inspector import utils -from python_inspector import utils_pypi +from resolvelib import BaseReporter, Resolver + +from _packagedcode.models import DependentPackage, PackageData +from _packagedcode.pypi import (PipRequirementsFileHandler, + PythonSetupPyHandler, + can_process_dependent_package) +from python_inspector import dependencies, settings, utils, utils_pypi from python_inspector.package_data import get_pypi_data_from_purl -from python_inspector.resolution import PythonInputProvider -from python_inspector.resolution import format_pdt_tree -from python_inspector.resolution import format_resolution -from python_inspector.resolution import get_environment_marker_from_environment -from python_inspector.resolution import get_package_list -from python_inspector.resolution import get_python_version_from_env_tag -from python_inspector.resolution import get_reqs_insecurely -from python_inspector.resolution import get_requirements_from_python_manifest -from python_inspector.utils_pypi import PLATFORMS_BY_OS -from python_inspector.utils_pypi import PYPI_SIMPLE_URL -from python_inspector.utils_pypi import Environment -from python_inspector.utils_pypi import valid_python_versions +from python_inspector.resolution import ( + PythonInputProvider, format_pdt_tree, format_resolution, + get_environment_marker_from_environment, get_package_list, + get_python_version_from_env_tag, get_reqs_insecurely, + get_requirements_from_python_manifest) +from python_inspector.settings import TraceLevel +from python_inspector.utils_pypi import (PLATFORMS_BY_OS, Environment, + valid_python_versions) class Resolution(NamedTuple): @@ -79,7 +67,6 @@ def resolve_dependencies( specifiers=tuple(), python_version=None, operating_system=None, - index_urls=tuple([PYPI_SIMPLE_URL]), pdt_output=None, netrc_file=None, max_rounds=200000, @@ -105,6 +92,9 @@ def resolve_dependencies( to PyPI.org """ + if verbose: + settings.TRACE = TraceLevel.TRACE + if not operating_system: raise Exception(f"No operating system provided.") if operating_system not in PLATFORMS_BY_OS: @@ -147,8 +137,9 @@ def resolve_dependencies( files = [] - if PYPI_SIMPLE_URL not in index_urls: - index_urls = tuple([PYPI_SIMPLE_URL]) + tuple(index_urls) + index_urls = tuple([settings.INDEX_URL]) + if settings.EXTRA_INDEX_URLS: + index_urls = index_urls + tuple(settings.EXTRA_INDEX_URLS) # requirements for req_file in requirement_files: @@ -366,7 +357,7 @@ def resolve( def get_resolved_dependencies( requirements: List[Requirement], - environment: Environment = None, + environment: Environment, repos: Sequence[utils_pypi.PypiSimpleRepository] = tuple(), as_tree: bool = False, max_rounds: int = 200000, diff --git a/src/python_inspector/cli_utils.py b/src/python_inspector/cli_utils.py index 4b94cde2..890e3c1e 100644 --- a/src/python_inspector/cli_utils.py +++ b/src/python_inspector/cli_utils.py @@ -20,6 +20,10 @@ class FileOptionType(click.File): """ def convert(self, value, param, ctx): + if not ctx: + self.fail( + "Trying to access a command from invalid context." + ) known_opts = set( chain.from_iterable( p.opts for p in ctx.command.params if isinstance(p, click.Option)) diff --git a/src/python_inspector/dependencies.py b/src/python_inspector/dependencies.py index bfb060f7..f490c348 100644 --- a/src/python_inspector/dependencies.py +++ b/src/python_inspector/dependencies.py @@ -17,12 +17,13 @@ from _packagedcode.pypi import PipRequirementsFileHandler from _packagedcode.pypi import get_requirements_txt_dependencies +from python_inspector import settings +from python_inspector.settings import TraceLevel + """ Utilities to resolve dependencies . """ -TRACE = False - def get_dependencies_from_requirements(requirements_file="requirements.txt"): """ @@ -33,7 +34,7 @@ def get_dependencies_from_requirements(requirements_file="requirements.txt"): location=requirements_file, include_nested=True ) for dependent_package in dependent_packages: - if TRACE: + if settings.TRACE == TraceLevel.TRACE: print( "dependent_package.extracted_requirement:", dependent_package.extracted_requirement, @@ -69,9 +70,9 @@ def get_dependency(specifier): requirement = Requirement(requirement_string=specifier) scope = "install" - is_runtime = True - is_optional = False - + is_runtime: bool = True + is_optional: bool= False + if requirement.name: # will be None if not pinned version = None diff --git a/src/python_inspector/package_data.py b/src/python_inspector/package_data.py index a320bf80..2682004f 100644 --- a/src/python_inspector/package_data.py +++ b/src/python_inspector/package_data.py @@ -14,14 +14,11 @@ from packageurl import PackageURL from _packagedcode.models import PackageData -from _packagedcode.pypi import get_declared_license -from _packagedcode.pypi import get_description -from _packagedcode.pypi import get_keywords -from _packagedcode.pypi import get_parties +from _packagedcode.pypi import (get_declared_license, get_description, + get_keywords, get_parties) from python_inspector import utils_pypi from python_inspector.resolution import get_python_version_from_env_tag -from python_inspector.utils_pypi import Environment -from python_inspector.utils_pypi import PypiSimpleRepository +from python_inspector.utils_pypi import Environment, PypiSimpleRepository def get_pypi_data_from_purl( diff --git a/src/python_inspector/resolution.py b/src/python_inspector/resolution.py index f160b113..d323084b 100644 --- a/src/python_inspector/resolution.py +++ b/src/python_inspector/resolution.py @@ -12,36 +12,25 @@ import os import re import tarfile -from typing import Dict -from typing import Generator -from typing import List -from typing import NamedTuple -from typing import Tuple -from typing import Union +from typing import Dict, Generator, List, NamedTuple, Tuple, Union from zipfile import ZipFile import packvers.utils from packageurl import PackageURL from packvers.requirements import Requirement -from packvers.version import LegacyVersion -from packvers.version import Version +from packvers.version import LegacyVersion, Version from packvers.version import parse as parse_version from resolvelib import AbstractProvider from resolvelib.structs import DirectedGraph from _packagedcode.models import DependentPackage -from _packagedcode.pypi import BasePypiHandler -from _packagedcode.pypi import PipRequirementsFileHandler -from _packagedcode.pypi import PypiWheelHandler -from _packagedcode.pypi import PythonSetupPyHandler -from _packagedcode.pypi import SetupCfgHandler -from _packagedcode.pypi import can_process_dependent_package +from _packagedcode.pypi import (BasePypiHandler, PipRequirementsFileHandler, + PypiWheelHandler, PythonSetupPyHandler, + SetupCfgHandler, can_process_dependent_package) from python_inspector import utils_pypi from python_inspector.error import NoVersionsFound from python_inspector.setup_py_live_eval import iter_requirements -from python_inspector.utils import Candidate -from python_inspector.utils import contain_string -from python_inspector.utils import get_response +from python_inspector.utils import Candidate, contain_string, get_response from python_inspector.utils_pypi import PypiSimpleRepository diff --git a/src/python_inspector/resolve_cli.py b/src/python_inspector/resolve_cli.py index a8670d11..0a46b772 100644 --- a/src/python_inspector/resolve_cli.py +++ b/src/python_inspector/resolve_cli.py @@ -13,16 +13,13 @@ import click -from python_inspector import utils_pypi +from python_inspector import settings, utils_pypi from python_inspector.cli_utils import FileOptionType +from python_inspector.settings import TraceLevel from python_inspector.utils import write_output_in_file -TRACE = False - __version__ = "0.12.0" -DEFAULT_PYTHON_VERSION = "38" -PYPI_SIMPLE_URL = "https://pypi.org/simple" def print_version(ctx, param, value): @@ -89,13 +86,21 @@ def print_version(ctx, param, value): ) @click.option( "--index-url", - "index_urls", + "index_url", type=str, metavar="INDEX", show_default=True, - default=tuple([PYPI_SIMPLE_URL]), + required=False, + help="PyPI default index URL to use. Defaults to pypi.org refistry." +) +@click.option( + "--extra-index-urls", + "extra_index_urls", + type=str, + show_default=False, multiple=True, - help="PyPI simple index URL(s) to use in order of preference. " + required=False, + help="PyPI extra index URL(s) to try after index-url in order of preference. " "This option can be used multiple times.", ) @click.option( @@ -192,7 +197,8 @@ def resolve_dependencies( specifiers, python_version, operating_system, - index_urls, + index_url, + extra_index_urls, json_output, pdt_output, netrc_file, @@ -201,7 +207,7 @@ def resolve_dependencies( use_pypi_json_api=False, analyze_setup_py_insecurely=False, prefer_source=False, - verbose=TRACE, + verbose=False, generic_paths=False, ignore_errors=False, ): @@ -255,6 +261,11 @@ def resolve_dependencies( errors=[], ) + if index_url: + settings.INDEX_URL = index_url + if extra_index_urls: + settings.EXTRA_INDEX_URLS = extra_index_urls + try: resolution_result: Dict = resolver_api( requirement_files=requirement_files, @@ -262,7 +273,6 @@ def resolve_dependencies( specifiers=specifiers, python_version=python_version, operating_system=operating_system, - index_urls=index_urls, pdt_output=pdt_output, netrc_file=netrc_file, max_rounds=max_rounds, diff --git a/src/python_inspector/settings.py b/src/python_inspector/settings.py new file mode 100644 index 00000000..80ce121e --- /dev/null +++ b/src/python_inspector/settings.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright (c) nexB Inc. and others. All rights reserved. +# ScanCode is a trademark of nexB Inc. +# SPDX-License-Identifier: Apache-2.0 +# See http://www.apache.org/licenses/LICENSE-2.0 for the license text. +# See https://github.com/aboutcode-org/python-inspector for support or download. +# See https://aboutcode.org for more information about nexB OSS projects. +# + +from enum import Enum +from typing import List, Optional + +from pydantic_settings import BaseSettings, SettingsConfigDict + +# Reference: https://docs.pydantic.dev/latest/concepts/pydantic_settings/ + +class TraceLevel(int, Enum): + TRACE = 1 + TRACE_DEEP = 2 + TRACE_ULTRA_DEEP = 3 + +class Settings(BaseSettings, case_sensitive=True): + model_config = SettingsConfigDict(env_file='.env', env_file_encoding='utf-8', env_prefix="PYTHON_INSPECTOR",) + DEFAULT_PYTHON_VERSION: str = "38" + INDEX_URL: str = "https://pypi.org/simple" + EXTRA_INDEX_URLS: Optional[List[str]] = None + TRACE: Optional[TraceLevel] = None diff --git a/src/python_inspector/utils_pypi.py b/src/python_inspector/utils_pypi.py index 2af5d57f..fdaea5fe 100644 --- a/src/python_inspector/utils_pypi.py +++ b/src/python_inspector/utils_pypi.py @@ -17,12 +17,8 @@ import tempfile import time from collections import defaultdict -from typing import List -from typing import NamedTuple -from urllib.parse import quote_plus -from urllib.parse import unquote -from urllib.parse import urlparse -from urllib.parse import urlunparse +from typing import List, NamedTuple +from urllib.parse import quote_plus, unquote, urlparse, urlunparse import attr import packageurl @@ -34,8 +30,8 @@ from packvers import version as packaging_version from packvers.specifiers import SpecifierSet -from python_inspector import DEFAULT_PYTHON_VERSION -from python_inspector import utils_pip_compatibility_tags +from python_inspector import settings, utils_pip_compatibility_tags +from python_inspector.settings import TraceLevel """ Utilities to manage Python thirparty libraries source, binaries and metadata in @@ -97,10 +93,6 @@ """ -TRACE = False -TRACE_DEEP = False -TRACE_ULTRA_DEEP = False - # Supported environments PYTHON_VERSIONS = "27", "36", "37", "38", "39", "310", "311", "312" @@ -191,10 +183,7 @@ def get_python_dot_version(version): os.makedirs(CACHE_THIRDPARTY_DIR, exist_ok=True) -################################################################################ - -PYPI_SIMPLE_URL = "https://pypi.org/simple" -PYPI_INDEX_URLS = (PYPI_SIMPLE_URL,) +PYPI_INDEX_URLS = (settings.INDEX_URL) ################################################################################ @@ -224,7 +213,7 @@ def download_wheel( repos=tuple(), verbose=False, echo_func=None, - python_version=DEFAULT_PYTHON_VERSION, + python_version=settings.DEFAULT_PYTHON_VERSION, ): """ Download the wheels binary distribution(s) of package ``name`` and @@ -234,7 +223,7 @@ def download_wheel( Use the first PyPI simple repository from a list of ``repos`` that contains this wheel. """ - if TRACE_DEEP: + if settings.TRACE == TraceLevel.TRACE: print(f" download_wheel: {name}=={version} for envt: {environment}") if not repos: @@ -246,7 +235,7 @@ def download_wheel( repo, name, version, environment, python_version ) if not supported_and_valid_wheels: - if TRACE_DEEP: + if settings.TRACE == TraceLevel.TRACE_DEEP: print( f" download_wheel: No supported and valid wheel for {name}=={version}: {environment} " ) @@ -265,44 +254,44 @@ def download_wheel( return fetched_wheel_filenames -def get_valid_sdist(repo, name, version, python_version=DEFAULT_PYTHON_VERSION): +def get_valid_sdist(repo, name, version, python_version=settings.DEFAULT_PYTHON_VERSION): package = repo.get_package_version(name=name, version=version) if not package: - if TRACE_DEEP: + if settings.TRACE == TraceLevel.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: + if settings.TRACE == TraceLevel.TRACE_DEEP: print(f" get_valid_sdist: No sdist for {name}=={version}") return if not valid_python_version( python_requires=sdist.python_requires, python_version=python_version ): return - if TRACE_DEEP: + if settings.TRACE == TraceLevel.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 + repo, name, version, environment, python_version=settings.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: + if settings.TRACE == TraceLevel.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: + if settings.TRACE == TraceLevel.TRACE_DEEP: print( f" get_supported_and_valid_wheels: No supported wheel for {name}=={version}: {environment}" ) @@ -313,7 +302,7 @@ def get_supported_and_valid_wheels( python_requires=wheel.python_requires, python_version=python_version ): continue - if TRACE_DEEP: + if settings.TRACE == TraceLevel.TRACE_DEEP: print( f""" get_supported_and_valid_wheels: Getting wheel from index (or cache): {wheel.download_url}""" @@ -338,7 +327,7 @@ def download_sdist( repos=tuple(), verbose=False, echo_func=None, - python_version=DEFAULT_PYTHON_VERSION, + python_version=settings.DEFAULT_PYTHON_VERSION, ): """ Download the sdist source distribution of package ``name`` and ``version`` @@ -347,7 +336,7 @@ def download_sdist( Use the first PyPI simple repository from a list of ``repos`` that contains this sdist. """ - if TRACE: + if settings.TRACE == TraceLevel.TRACE_DEEP: print(f" download_sdist: {name}=={version}") if not repos: @@ -358,7 +347,7 @@ def download_sdist( for repo in repos: sdist = get_valid_sdist(repo, name, version, python_version=python_version) if not sdist: - if TRACE_DEEP: + if settings.TRACE == TraceLevel.TRACE_DEEP: print(f" download_sdist: No valid sdist for {name}=={version}") continue fetched_sdist_filename = sdist.download( @@ -625,7 +614,7 @@ def get_best_download_url(self, repos=tuple()): for repo in repos: package = repo.get_package_version(name=self.name, version=self.version) if not package: - if TRACE: + if settings.TRACE == TraceLevel.TRACE: print( f" get_best_download_url: {self.name}=={self.version} " f"not found in {repo.index_url}" @@ -635,7 +624,7 @@ def get_best_download_url(self, repos=tuple()): if pypi_url: return pypi_url else: - if TRACE: + if settings.TRACE == TraceLevel.TRACE: print( f" get_best_download_url: {self.filename} not found in {repo.index_url}" ) @@ -651,7 +640,7 @@ def download( Return the fetched filename. """ assert self.filename - if TRACE_DEEP: + if settings.TRACE == TraceLevel.TRACE_DEEP: print( f"Fetching distribution of {self.name}=={self.version}:", self.filename, @@ -1115,7 +1104,7 @@ def is_supported_by_tags(self, tags): """ Return True is this wheel is compatible with one of a list of PEP 425 tags. """ - if TRACE_DEEP: + if settings.TRACE == TraceLevel.TRACE_DEEP: print() print("is_supported_by_tags: tags:", tags) print("self.tags:", self.tags) @@ -1187,13 +1176,13 @@ class PypiPackage(NameVer): metadata=dict(help="List of Wheel for this package"), ) - def get_supported_wheels(self, environment, verbose=TRACE_ULTRA_DEEP): + def get_supported_wheels(self, environment): """ Yield all the Wheel of this package supported and compatible with the Environment `environment`. """ envt_tags = environment.tags() - if verbose: + if settings.TRACE == TraceLevel.TRACE_ULTRA_DEEP: print("get_supported_wheels: envt_tags:", envt_tags) for wheel in self.wheels: if wheel.is_supported_by_tags(envt_tags): @@ -1220,7 +1209,7 @@ def package_from_dists(cls, dists): >>> assert package.wheels == [w1, w2] """ dists = list(dists) - if TRACE_DEEP: + if settings.TRACE == TraceLevel.TRACE_DEEP: print(f"package_from_dists: {dists}") if not dists: return @@ -1257,7 +1246,7 @@ def package_from_dists(cls, dists): else: raise Exception(f"Unknown distribution type: {dist}") - if TRACE_DEEP: + if settings.TRACE == TraceLevel.TRACE_DEEP: print(f"package_from_dists: {package}") return package @@ -1269,7 +1258,7 @@ def packages_from_links(cls, links: List[Link]): These are sorted by name and then by version from oldest to newest. """ dists = PypiPackage.dists_from_links(links) - if TRACE_ULTRA_DEEP: + if settings.TRACE == TraceLevel.TRACE_ULTRA_DEEP: print("packages_from_many_paths_or_urls: dists:", dists) dists = NameVer.sorted(dists) @@ -1279,7 +1268,7 @@ def packages_from_links(cls, links: List[Link]): key=NameVer.sortable_name_version, ): package = PypiPackage.package_from_dists(dists_of_package) - if TRACE_ULTRA_DEEP: + if settings.TRACE == TraceLevel.TRACE_ULTRA_DEEP: print("packages_from_many_paths_or_urls", package) yield package @@ -1316,14 +1305,14 @@ def dists_from_links(cls, links: List[Link]): Sdist bitarray 0.8.1 """ dists = [] - if TRACE_ULTRA_DEEP: + if settings.TRACE == TraceLevel.TRACE_ULTRA_DEEP: print(" ###paths_or_urls:", links) installable: List[Link] = [link for link in links if link.url.endswith(EXTENSIONS)] for link in installable: try: dist = Distribution.from_link(link=link) dists.append(dist) - if TRACE_DEEP: + if settings.TRACE == TraceLevel.TRACE_DEEP: print( " ===> dists_from_paths_or_urls:", dist, @@ -1335,7 +1324,7 @@ def dists_from_links(cls, links: List[Link]): link.url, ) except InvalidDistributionFilename: - if TRACE_DEEP: + if settings.TRACE == TraceLevel.TRACE_DEEP: print(f" Skipping invalid distribution from: {link.url}") continue return dists @@ -1464,7 +1453,7 @@ class PypiSimpleRepository: index_url = attr.ib( type=str, - default=PYPI_SIMPLE_URL, + default=settings.INDEX_URL, metadata=dict(help="Base PyPI simple URL for this index."), ) @@ -1527,10 +1516,10 @@ def _get_package_versions_map( } self.packages[normalized_name] = versions except RemoteNotFetchedException as e: - if TRACE: + if settings.TRACE == TraceLevel.TRACE: print(f"failed to fetch package name: {name} from: {self.index_url}:\n{e}") - if not versions and TRACE: + if not versions and settings.TRACE == TraceLevel.TRACE: print(f"WARNING: package {name} not found in repo: {self.index_url}") return versions @@ -1640,7 +1629,7 @@ def resolve_relative_url(package_url, url): return url -PYPI_PUBLIC_REPO = PypiSimpleRepository(index_url=PYPI_SIMPLE_URL) +PYPI_PUBLIC_REPO = PypiSimpleRepository(index_url=settings.INDEX_URL) DEFAULT_PYPI_REPOS = (PYPI_PUBLIC_REPO,) DEFAULT_PYPI_REPOS_BY_URL = {r.index_url: r for r in DEFAULT_PYPI_REPOS} @@ -1682,7 +1671,7 @@ def get( cached = os.path.join(self.directory, cache_key) if force or not os.path.exists(cached): - if TRACE_DEEP: + if settings.TRACE == TraceLevel.TRACE_DEEP: print(f" FILE CACHE MISS: {path_or_url}") content = get_file_content( path_or_url=path_or_url, @@ -1696,7 +1685,7 @@ def get( fo.write(content) return content else: - if TRACE_DEEP: + if settings.TRACE == TraceLevel.TRACE_DEEP: print(f" FILE CACHE HIT: {path_or_url}") return get_local_file_content(path=cached, as_text=as_text) @@ -1716,7 +1705,7 @@ def get_file_content( remote URL. Return the content as bytes is `as_text` is False. """ if path_or_url.startswith("https://"): - if TRACE_DEEP: + if settings.TRACE == TraceLevel.TRACE_DEEP: print(f"Fetching: {path_or_url}") _headers, content = get_remote_file_content( url=path_or_url, diff --git a/tests/test_resolution.py b/tests/test_resolution.py index 5269f7a1..87329985 100644 --- a/tests/test_resolution.py +++ b/tests/test_resolution.py @@ -20,14 +20,13 @@ from _packagedcode import models from python_inspector.api import get_resolved_dependencies from python_inspector.error import NoVersionsFound -from python_inspector.resolution import PythonInputProvider -from python_inspector.resolution import get_requirements_from_dependencies -from python_inspector.resolution import get_requirements_from_python_manifest -from python_inspector.resolution import is_valid_version -from python_inspector.resolution import parse_reqs_from_setup_py_insecurely -from python_inspector.utils_pypi import PYPI_PUBLIC_REPO -from python_inspector.utils_pypi import Environment -from python_inspector.utils_pypi import PypiSimpleRepository +from python_inspector.resolution import (PythonInputProvider, + get_requirements_from_dependencies, + get_requirements_from_python_manifest, + is_valid_version, + parse_reqs_from_setup_py_insecurely) +from python_inspector.utils_pypi import (PYPI_PUBLIC_REPO, Environment, + PypiSimpleRepository) setup_test_env = FileDrivenTesting() setup_test_env.test_data_dir = os.path.join(os.path.dirname(__file__), "data") @@ -49,10 +48,10 @@ def test_get_resolved_dependencies_with_flask_and_python_310(): assert plist == [ "pkg:pypi/click@8.1.7", "pkg:pypi/flask@2.1.2", - "pkg:pypi/itsdangerous@2.1.2", - "pkg:pypi/jinja2@3.1.3", + "pkg:pypi/itsdangerous@2.2.0", + "pkg:pypi/jinja2@3.1.4", "pkg:pypi/markupsafe@2.1.5", - "pkg:pypi/werkzeug@3.0.1", + "pkg:pypi/werkzeug@3.0.3", ] @@ -73,10 +72,10 @@ def test_get_resolved_dependencies_with_flask_and_python_310_windows(): "pkg:pypi/click@8.1.7", "pkg:pypi/colorama@0.4.6", "pkg:pypi/flask@2.1.2", - "pkg:pypi/itsdangerous@2.1.2", - "pkg:pypi/jinja2@3.1.3", + "pkg:pypi/itsdangerous@2.2.0", + "pkg:pypi/jinja2@3.1.4", "pkg:pypi/markupsafe@2.1.5", - "pkg:pypi/werkzeug@3.0.1", + "pkg:pypi/werkzeug@3.0.3", ] @@ -123,12 +122,12 @@ def test_get_resolved_dependencies_with_tilde_requirement_using_json_api(): assert plist == [ "pkg:pypi/click@8.1.7", "pkg:pypi/flask@2.1.3", - "pkg:pypi/importlib-metadata@7.1.0", - "pkg:pypi/itsdangerous@2.1.2", - "pkg:pypi/jinja2@3.1.3", + "pkg:pypi/importlib-metadata@8.2.0", + "pkg:pypi/itsdangerous@2.2.0", + "pkg:pypi/jinja2@3.1.4", "pkg:pypi/markupsafe@2.1.5", - "pkg:pypi/werkzeug@3.0.1", - "pkg:pypi/zipp@3.18.1", + "pkg:pypi/werkzeug@3.0.3", + "pkg:pypi/zipp@3.19.2", ]