Skip to content

feat: Implement settings for python-inspector #186

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
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
2 changes: 1 addition & 1 deletion requirements-dev.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
webencodings==0.5.1
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
1 change: 1 addition & 0 deletions requirements_builder.ABOUT
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
5 changes: 4 additions & 1 deletion src/python_inspector/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
55 changes: 23 additions & 32 deletions src/python_inspector/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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,
Expand All @@ -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:
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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,
Expand Down
4 changes: 4 additions & 0 deletions src/python_inspector/cli_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down
13 changes: 7 additions & 6 deletions src/python_inspector/dependencies.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"):
"""
Expand All @@ -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,
Expand Down Expand Up @@ -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
Expand Down
9 changes: 3 additions & 6 deletions src/python_inspector/package_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
23 changes: 6 additions & 17 deletions src/python_inspector/resolution.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand Down
32 changes: 21 additions & 11 deletions src/python_inspector/resolve_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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,
Expand All @@ -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,
):
Expand Down Expand Up @@ -255,14 +261,18 @@ 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,
setup_py_file=setup_py_file,
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,
Expand Down
29 changes: 29 additions & 0 deletions src/python_inspector/settings.py
Original file line number Diff line number Diff line change
@@ -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
Loading
Loading