diff --git a/.gitignore b/.gitignore index 2f94ff7..00dc4f2 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,9 @@ wheels/ # Virtual environments .venv .python-version + +# Old python requirements +requirements.txt + +# Ort directories +output diff --git a/.ort.yml b/.ort.yml new file mode 100644 index 0000000..913da3d --- /dev/null +++ b/.ort.yml @@ -0,0 +1,9 @@ +analyzer: + enabled_package_managers: + - PIP + +excludes: + paths: + - pattern: 'tests/data/**' + comment: 'Test data' + reason: TEST_OF diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index fc86f84..f9ca058 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -12,7 +12,7 @@ repos: - '--fix=lf' - repo: https://github.com/astral-sh/ruff-pre-commit - rev: 'v0.14.4' + rev: 'v0.14.10' hooks: - id: ruff args: [--fix] @@ -26,7 +26,7 @@ repos: - repo: https://github.com/astral-sh/uv-pre-commit # uv version. - rev: 0.9.7 + rev: 0.9.18 hooks: - id: uv-lock @@ -36,8 +36,9 @@ repos: - id: codespell - repo: https://github.com/facebook/pyrefly-pre-commit - rev: 0.0.1 + rev: 0.46.0 hooks: - - id: pyrefly-typecheck-system + - id: pyrefly-check name: Pyrefly (type checking) pass_filenames: false + language: system diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 6d8c9f6..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "python.testing.pytestArgs": ["."], - "python.testing.unittestEnabled": false, - "python.testing.pytestEnabled": true -} diff --git a/examples/ort_result.py b/examples/ort_result.py new file mode 100644 index 0000000..cfe7746 --- /dev/null +++ b/examples/ort_result.py @@ -0,0 +1,32 @@ +# SPDX-FileCopyrightText: 2025 Helio Chissini de Castro +# SPDX-License-Identifier: MIT +# +import logging +import sys +from pathlib import Path + +import click +import yaml +from pydantic import ValidationError +from rich.pretty import pprint + +from ort import OrtResult + +logger = logging.getLogger() + + +@click.command() +@click.argument("datafile") +def main(datafile: str) -> None: + try: + with Path(datafile).open() as fd: + data = yaml.safe_load(fd) + parsed = OrtResult(**data) + pprint(parsed) + except ValidationError as e: + logger.error(e) + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/examples/any.py b/examples/repo_config.py similarity index 100% rename from examples/any.py rename to examples/repo_config.py diff --git a/pyproject.toml b/pyproject.toml index a05ba0a..46df6b2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,14 +4,14 @@ build-backend = "uv_build" [project] name = "python-ort" -version = "0.4.3" +version = "0.5.0" description = "A Python Ort model serialization library" readme = "README.md" license = "MIT" license-files = ["LICENSE"] requires-python = ">=3.10" dependencies = [ - "pydantic>=2.12.4", + "pydantic>=2.12.5", ] classifiers = [ "Development Status :: 3 - Alpha", @@ -31,13 +31,13 @@ module-root = "src" [dependency-groups] dev = [ - "datamodel-code-generator[http]>=0.35.0", - "pre-commit>=4.3.0", + "datamodel-code-generator[http]>=0.53.0", + "pre-commit>=4.5.1", "pycodestyle>=2.14.0", - "pyrefly>=0.40.0", - "pytest>=8.4.2", + "pyrefly>=0.49.0", + "pytest>=9.0.2", "rich>=14.2.0", - "ruff>=0.14.4", + "ruff>=0.14.14", "types-pyyaml>=6.0.12.20250915", ] diff --git a/src/ort/__init__.py b/src/ort/__init__.py index 6d01aa6..2e3fcd3 100644 --- a/src/ort/__init__.py +++ b/src/ort/__init__.py @@ -2,8 +2,12 @@ # # SPDX-License-Identifier: MIT +from ort.models.analyzer_result import AnalyzerResult +from ort.models.ort_result import OrtResult from ort.models.repository_configuration import OrtRepositoryConfiguration __all__ = [ + "AnalyzerResult", "OrtRepositoryConfiguration", + "OrtResult", ] diff --git a/src/ort/models/__init__.py b/src/ort/models/__init__.py index e69de29..a51a053 100644 --- a/src/ort/models/__init__.py +++ b/src/ort/models/__init__.py @@ -0,0 +1,10 @@ +# SPDX-FileCopyrightText: 2025 Helio Chissini de Castro +# SPDX-License-Identifier: MIT + +from .identifier import Identifier +from .vcstype import VcsType + +__all__ = [ + "Identifier", + "VcsType", +] diff --git a/src/ort/models/analyzer_result.py b/src/ort/models/analyzer_result.py new file mode 100644 index 0000000..784e037 --- /dev/null +++ b/src/ort/models/analyzer_result.py @@ -0,0 +1,43 @@ +# SPDX-FileCopyrightText: 2025 Helio Chissini de Castro +# SPDX-License-Identifier: MIT + + +from pydantic import BaseModel, ConfigDict, Field + +from ort.models.dependency_graph import DependencyGraph +from ort.models.identifier import Identifier +from ort.models.issue import Issue +from ort.models.package import Package +from ort.models.project import Project + + +class AnalyzerResult(BaseModel): + """ + A class that merges all information from individual [ProjectAnalyzerResult]s created for each found definition file. + """ + + model_config = ConfigDict( + extra="forbid", + ) + + projects: set[Project] = Field( + description="Sorted set of the projects, as they appear in the individual analyzer results.", + ) + + packages: set[Package] = Field( + description="The set of identified packages for all projects.", + ) + + issues: dict[Identifier, list[Issue]] = Field( + default_factory=dict, + description="The lists of Issue objects that occurred within the analyzed projects themselves. Issues related" + "to project dependencies are contained in the dependencies of the project's scopes. This property is not" + "serialized if the map is empty to reduce the size of the result file.", + ) + + dependency_graphs: dict[str, DependencyGraph] = Field( + default_factory=dict, + description="A map with DependencyGraph objects keyed by the name of the package manager that created this" + "graph. Package managers supporting this feature can construct a shared DependencyGraph over all projects and" + "store it in this map.", + ) diff --git a/src/ort/models/analyzer_run.py b/src/ort/models/analyzer_run.py new file mode 100644 index 0000000..00f0891 --- /dev/null +++ b/src/ort/models/analyzer_run.py @@ -0,0 +1,37 @@ +# SPDX-FileCopyrightText: 2025 Helio Chissini de Castro +# SPDX-License-Identifier: MIT + +from datetime import datetime + +from pydantic import BaseModel, ConfigDict, Field + +from ort.models.analyzer_result import AnalyzerResult +from ort.models.config.analyzer_configuration import AnalyzerConfiguration +from ort.utils.environment import Environment + + +class AnalyzerRun(BaseModel): + """ + The summary of a single run of the analyzer. + + """ + + model_config = ConfigDict( + extra="forbid", + ) + start_time: datetime = Field( + description="The time the analyzer was started.", + ) + end_time: datetime = Field( + description="The time the analyzer has finished.", + ) + environment: Environment = Field( + description="The [Environment] in which the analyzer was executed.", + ) + config: AnalyzerConfiguration = Field( + description="The [AnalyzerConfiguration] used for this run.", + ) + result: AnalyzerResult | None = Field( + default=None, + description="The result of this run.", + ) diff --git a/src/ort/models/config/analyzer_configuration.py b/src/ort/models/config/analyzer_configuration.py index d3c6d8b..1d83fbe 100644 --- a/src/ort/models/config/analyzer_configuration.py +++ b/src/ort/models/config/analyzer_configuration.py @@ -38,11 +38,9 @@ class AnalyzerConfiguration(BaseModel): """ - Enable the analysis of projects that use version ranges to declare their dependencies. If set to true, - dependencies of exactly the same project might change with another scan done at a later time if any of the - (transitive) dependencies are declared using version ranges and a new version of such a dependency was - published in the meantime. If set to false, analysis of projects that use version ranges will fail. Defaults to - false. + The configuration model of the analyzer. This class is (de-)serialized in the following places: + - Deserialized from "config.yml" as part of [OrtConfiguration] (via Hoplite). + - (De-)Serialized as part of [org.ossreviewtoolkit.model.OrtResult] (via Jackson). """ model_config = ConfigDict( diff --git a/src/ort/models/dependency_graph.py b/src/ort/models/dependency_graph.py new file mode 100644 index 0000000..4a4be5b --- /dev/null +++ b/src/ort/models/dependency_graph.py @@ -0,0 +1,98 @@ +# SPDX-FileCopyrightText: 2025 Helio Chissini de Castro +# SPDX-License-Identifier: MIT + + +from pydantic import BaseModel, ConfigDict, Field, field_validator + +from ort.models.dependency_graph_edge import DependencyGraphEdge +from ort.models.dependency_graph_node import DependencyGraphNode +from ort.models.dependency_reference import DependencyReference +from ort.models.identifier import Identifier +from ort.models.root_dependency_index import RootDependencyIndex + + +class DependencyGraph(BaseModel): + """ + Represents the graph of dependencies of a project. + + This class holds information about a project's scopes and their dependencies in a format that minimizes the + consumption of memory. In projects with many scopes there is often a high degree of duplication in the dependencies + of the scopes. To avoid this, this class aims to share as many parts of the dependency graph as possible between + the different scopes. Ideally, there is only a single dependency graph containing the dependencies used by all + scopes. This is not always possible due to inconsistencies in dependency relations, like a package using different + dependencies in different scopes. Then the dependency graph is split into multiple fragments, and each fragment has + a consistent view on the dependencies it contains. + + When constructing a dependency graph the dependencies are organized as a connected structure of DependencyReference + objects in memory. Originally, the serialization format of a graph was based on this structure, but that turned out + to be not ideal: During serialization, sub graphs referenced from multiple nodes (e.g. libraries with transitive + dependencies referenced from multiple projects) get duplicated, which can cause a significant amount of redundancy. + Therefore, the data representation has been changed again to a form, which can be serialized without introducing + redundancy. It consists of the following elements: + + - packages: A list with the coordinates of all the packages (free of duplication) that are referenced by the graph. + This allows extracting the packages directly, but also has the advantage that the package coordinates do not have + to be repeated over and over: All the references to packages are expressed by indices into this list. + - nodes: An ordered list with the nodes of the dependency graph. A single node represents a package, and therefore + has a reference into the list with package coordinates. It can, however, happen that packages occur multiple + times in the graph if they are in different subtrees with different sets of transitive dependencies. Then there + are multiple nodes for the packages affected, and a fragment_index is used to identify them uniquely. Nodes also + store information about issues of a package and their linkage. + - edges: Here the structure of the graph comes in. Each edge connects two nodes and represents a directed + depends-on relationship. The nodes are referenced by numeric indices into the list of nodes. + - scopes: This is a map that associates the scopes used by projects with their direct dependencies. A single + dependency graph contains the dependencies of all the projects processed by a specific package manager. + Therefore, the keys of this map are scope names qualified by the coordinates of a project; which makes them + unique. The values are references to the nodes in the graph that correspond to the packages the scopes depend on + directly. + + To navigate this structure, start with a scope and gather the references to its direct dependency nodes. Then, by + following the edges starting from these nodes, the set of transitive dependencies can be determined. The numeric + indices can be resolved via the packages list. + """ + + model_config = ConfigDict( + extra="forbid", + ) + + packages: list[Identifier] = Field( + default_factory=list, + description="A list with the identifiers of the packages that appear in the dependency graph. This list is " + "used to resolve the numeric indices contained in the dependency_graph_node objects.", + ) + + scope_roots: set[DependencyReference] = Field( + default_factory=set, + description="Stores the dependency graph as a list of root nodes for the direct dependencies referenced by " + "scopes. Starting with these nodes, the whole graph can be traversed. The nodes are constructed " + "from the direct dependencies declared by scopes that cannot be reached via other paths in the " + "dependency graph. Note that this property exists for backwards compatibility only; it is replaced " + "by the lists of nodes and edges.", + ) + + scopes: dict[str, list[RootDependencyIndex]] = Field( + default_factory=dict, + description="A mapping from scope names to the direct dependencies of the scopes. Based on this information, " + "the set of scopes of a project can be constructed from the serialized form.", + ) + + nodes: list[DependencyGraphNode] = Field( + default_factory=list, + description="A list with the nodes of this dependency graph. Nodes correspond to packages, but in contrast to " + "the packages list, there can be multiple nodes for a single package. The order of nodes in this " + "list is relevant; the edges of the graph reference their nodes by numeric indices.", + ) + + edges: set[DependencyGraphEdge] = Field( + default_factory=set, + description="A set with the edges of this dependency graph. By traversing the edges, the dependencies of " + "packages can be determined.", + ) + + @field_validator("edges", mode="before") + @classmethod + def sort_and_set_edges(cls, v): + if v is None: + return set() + + return {DependencyGraphEdge.model_validate(e) for e in v} diff --git a/src/ort/models/dependency_graph_edge.py b/src/ort/models/dependency_graph_edge.py new file mode 100644 index 0000000..079b8e9 --- /dev/null +++ b/src/ort/models/dependency_graph_edge.py @@ -0,0 +1,30 @@ +# SPDX-FileCopyrightText: 2025 Helio Chissini de Castro +# SPDX-License-Identifier: MIT + + +from pydantic import BaseModel, ConfigDict, Field + + +class DependencyGraphEdge(BaseModel): + """ + A data class representing an edge in the dependency graph. + + An edge corresponds to a directed depends-on relationship between two packages. The packages are identified by the + numeric indices into the list of nodes. + """ + + model_config = ConfigDict( + extra="forbid", + frozen=True, + ) + + from_: int = Field( + ..., + alias="from", + description="The index of the source node of this edge.", + ) + to_: int = Field( + ..., + alias="to", + description="The index of the destination node of this edge.", + ) diff --git a/src/ort/models/dependency_graph_node.py b/src/ort/models/dependency_graph_node.py new file mode 100644 index 0000000..7ba9099 --- /dev/null +++ b/src/ort/models/dependency_graph_node.py @@ -0,0 +1,44 @@ +# SPDX-FileCopyrightText: 2025 Helio Chissini de Castro +# SPDX-License-Identifier: MIT + + +from pydantic import BaseModel, ConfigDict, Field + +from ort.models.issue import Issue +from ort.models.package_linkage import PackageLinkage + + +class DependencyGraphNode(BaseModel): + """ + A data class representing a node in the dependency graph. + + A node corresponds to a package, which is referenced by a numeric index. A package may, however, occur multiple + times in the dependency graph with different transitive dependencies. In this case, different fragment indices are + used to distinguish between these occurrences. + """ + + model_config = ConfigDict( + extra="forbid", + ) + + pkg: int | None = Field( + default=None, + description="Stores the numeric index of the package dependency referenced by this object. The package behind " + "this index can be resolved by evaluating the list of identifiers stored in DependencyGraph at " + "this index.", + ) + fragment: int = Field( + 0, + description="Stores the index of the fragment in the dependency graph where the referenced dependency is " + "contained. This is needed to uniquely identify the target if the dependency occurs multiple times " + "in the graph.", + ) + linkage: PackageLinkage = Field( + default=PackageLinkage.DYNAMIC, + description="The type of linkage used for the referred package from its dependent package. As most of ORT's " + "supported package managers / languages only support dynamic linking or at least default to it, " + "also use that as the default value here to not blow up ORT result files.", + ) + issues: list[Issue] = Field( + default_factory=list, description="A list of Issue objects that occurred handling this dependency." + ) diff --git a/src/ort/models/dependency_reference.py b/src/ort/models/dependency_reference.py new file mode 100644 index 0000000..58c793b --- /dev/null +++ b/src/ort/models/dependency_reference.py @@ -0,0 +1,51 @@ +# SPDX-FileCopyrightText: 2025 Helio Chissini de Castro +# SPDX-License-Identifier: MIT + + +from pydantic import BaseModel, ConfigDict, Field + +from ort.models.issue import Issue +from ort.models.package_linkage import PackageLinkage + + +class DependencyReference(BaseModel): + """ + A class to model a tree-like structure to represent the dependencies of a project. + + Instances of this class are used to store the relations between dependencies in fragments of dependency trees in an + Analyzer result. The main purpose of this class is to define an efficient serialization format, which avoids + redundancy as far as possible. Therefore, dependencies are represented by numeric indices into an external table. + As a dependency can occur multiple times in the dependency graph with different transitive dependencies, the class + defines another index to distinguish these cases. + + Note: This is by intention no data class. Equality is tested via references and not via the values contained. + """ + + model_config = ConfigDict( + extra="forbid", + ) + + pkg: int = Field( + ..., + description="Stores the numeric index of the package dependency referenced by this object. The package behind " + "this index can be resolved by evaluating the list of identifiers stored in DependencyGraph at " + "this index.", + ) + fragment: int = Field( + default=0, + description="Stores the index of the fragment in the dependency graph where the referenced dependency is " + "contained. This is needed to uniquely identify the target if the dependency occurs multiple times " + "in the graph.", + ) + dependencies: set["DependencyReference"] = Field( + default_factory=set, + description="A set with the references to the dependencies of this dependency. That way a tree-like structure " + "is established.", + ) + linkage: PackageLinkage = Field( + default=PackageLinkage.DYNAMIC, + description="The type of linkage used for the referred package from its dependent package. As most of ORT's " + "supported package managers / languages only support dynamic linking or at least default to it, " + "also use that as the default value here to not blow up ORT result files.", + ) + issues: list[Issue] = Field(..., description="A list of Issue objects that occurred handling this dependency.") diff --git a/src/ort/models/identifier.py b/src/ort/models/identifier.py index 927934c..c301549 100644 --- a/src/ort/models/identifier.py +++ b/src/ort/models/identifier.py @@ -23,6 +23,7 @@ class Identifier(BaseModel): model_config = ConfigDict( extra="forbid", + frozen=True, ) orttype: str = Field( @@ -61,3 +62,6 @@ def parse_string_or_dict(cls, value: Any): "version": parts[3], } raise TypeError("Identifier must be a dict or a string in the correct format") + + def __str__(self) -> str: + return ":".join([self.orttype, self.namespace, self.name, self.version]) diff --git a/src/ort/models/issue.py b/src/ort/models/issue.py new file mode 100644 index 0000000..fa9249f --- /dev/null +++ b/src/ort/models/issue.py @@ -0,0 +1,36 @@ +# SPDX-FileCopyrightText: 2025 Helio Chissini de Castro +# SPDX-License-Identifier: MIT + + +from datetime import datetime + +from pydantic import BaseModel, ConfigDict, Field + +from ort.severity import Severity + + +class Issue(BaseModel): + """ + An issue that occurred while executing ORT. + """ + + model_config = ConfigDict( + extra="forbid", + ) + + timestamp: datetime = Field( + description="The timestamp of the issue.", + ) + source: str = Field( + description="A description of the issue source, e.g. the tool that caused the issue.", + ) + message: str = Field( + description="The issue's message.", + ) + severity: Severity = Field( + description="The issue's severity.", + ) + affected_path: str | None = Field( + default=None, + description="The affected file or directory the issue is limited to, if any.", + ) diff --git a/src/ort/models/ort_configuration.py b/src/ort/models/ort_configuration.py deleted file mode 100644 index 924208a..0000000 --- a/src/ort/models/ort_configuration.py +++ /dev/null @@ -1,322 +0,0 @@ -# SPDX-FileCopyrightText: 2025 Helio Chissini de Castro -# -# SPDX-License-Identifier: MIT - - -from enum import Enum -from pathlib import Path -from typing import Annotated, Any - -import yaml -import yaml.parser -from pydantic import AnyUrl, BaseModel, ConfigDict, Field, RootModel - - -class AdvisorConfig(RootModel[dict[str, dict[str, Any]] | None]): - root: dict[str, dict[str, Any]] | None = None - - -class Sw360Configuration(BaseModel): - model_config = ConfigDict( - extra="forbid", - ) - rest_url: Annotated[AnyUrl, Field(alias="restUrl")] - auth_url: Annotated[AnyUrl, Field(alias="authUrl")] - username: str - password: str | None = None - client_id: Annotated[str, Field(alias="clientId")] - client_password: Annotated[str | None, Field(alias="clientPassword")] = None - token: str | None = None - - -class LicenseFilePatterns(BaseModel): - model_config = ConfigDict( - extra="forbid", - ) - license_filenames: Annotated[list[str] | None, Field(alias="licenseFilenames")] = None - patent_filenames: Annotated[list[str] | None, Field(alias="patentFilenames")] = None - other_license_filenames: Annotated[list[str] | None, Field(alias="otherLicenseFilenames")] = None - - -class Jira(BaseModel): - model_config = ConfigDict( - extra="forbid", - ) - host: str | None = None - username: str | None = None - password: str | None = None - - -class Mail(BaseModel): - model_config = ConfigDict( - extra="forbid", - ) - host_name: Annotated[str | None, Field(alias="hostName")] = None - username: str | None = None - password: str | None = None - port: int | None = None - use_ssl: Annotated[bool | None, Field(alias="useSsl")] = None - from_address: Annotated[str | None, Field(alias="fromAddress")] = None - - -class ReporterOptions(AdvisorConfig): - pass - - -class LocalFileStorage(BaseModel): - model_config = ConfigDict( - extra="forbid", - ) - directory: str - compression: bool | None = None - - -class S3FileStorage(BaseModel): - model_config = ConfigDict( - extra="forbid", - ) - access_key_id: Annotated[str | None, Field(alias="accessKeyId")] = None - aws_region: Annotated[str | None, Field(alias="awsRegion")] = None - bucket_name: Annotated[str, Field(alias="bucketName")] - compression: bool | None = None - custom_endpoint: Annotated[str | None, Field(alias="customEndpoint")] = None - secret_access_key: Annotated[str | None, Field(alias="secretAccessKey")] = None - - -class Connection(BaseModel): - model_config = ConfigDict( - extra="forbid", - ) - url: str - schema_: Annotated[str | None, Field(alias="schema")] = None - username: str - password: str | None = None - sslmode: str | None = None - sslcert: str | None = None - sslkey: str | None = None - sslrootcert: str | None = None - connection_timeout: Annotated[int | None, Field(alias="connectionTimeout")] = None - idle_timeout: Annotated[int | None, Field(alias="idleTimeout")] = None - keepalive_time: Annotated[int | None, Field(alias="keepaliveTime")] = None - max_lifetime: Annotated[int | None, Field(alias="maxLifetime")] = None - maximum_pool_size: Annotated[int | None, Field(alias="maximumPoolSize")] = None - minimum_idle: Annotated[int | None, Field(alias="minimumIdle")] = None - - -class DetectedLicenseMapping(RootModel[dict[str, str] | None]): - root: dict[str, str] | None = None - - -class ScannerConfig(AdvisorConfig): - pass - - -class Storages(AdvisorConfig): - pass - - -class Severity(Enum): - HINT = "HINT" - WARNING = "WARNING" - ERROR = "ERROR" - - -class SourceCodeOrigins(Enum): - ARTIFACT = "ARTIFACT" - VCS = "VCS" - - -class StorageTypes(Enum): - AWS = "aws" - CLEARLY_DEFINED = "clearlyDefined" - HTTP = "http" - LOCAL = "local" - POSTGRES = "postgres" - - -class Headers(RootModel[dict[str, bool | float | str] | None]): - root: dict[str, bool | float | str] | None = None - - -class Advisor(BaseModel): - model_config = ConfigDict( - extra="forbid", - ) - skip_excluded: Annotated[bool | None, Field(alias="skipExcluded")] = None - config: AdvisorConfig | None = None - - -class Downloader(BaseModel): - model_config = ConfigDict( - extra="forbid", - ) - allow_moving_revisions: Annotated[bool | None, Field(alias="allowMovingRevisions")] = None - included_license_categories: Annotated[list[str] | None, Field(alias="includedLicenseCategories")] = None - skip_excluded: Annotated[bool | None, Field(alias="skipExcluded")] = None - source_code_origins: Annotated[list[SourceCodeOrigins] | None, Field(alias="sourceCodeOrigins")] = None - - -class Notifier(BaseModel): - model_config = ConfigDict( - extra="forbid", - ) - mail: Mail | None = None - jira: Jira | None = None - - -class Reporter(BaseModel): - model_config = ConfigDict( - extra="forbid", - ) - config: ReporterOptions - - -class HttpFileStorage(BaseModel): - model_config = ConfigDict( - extra="forbid", - ) - url: AnyUrl - query: str | None = None - headers: Headers | None = None - - -class PostgresConfig(BaseModel): - model_config = ConfigDict( - extra="forbid", - ) - connection: Connection - - -class AnalyzerConfigurationSchema(BaseModel): - """ - Configurations for package managers used by the The OSS-Review-Toolkit (ORT). - A full list of all available options can be found at - https://github.com/oss-review-toolkit/ort/blob/main/model/src/main/kotlin/config/AnalyzerConfiguration.kt. - """ - - model_config = ConfigDict( - extra="forbid", - ) - allow_dynamic_versions: Annotated[bool | None, Field(alias="allowDynamicVersions")] = None - # enabled_package_managers: Annotated[list[PackageManager] | None, Field(alias="enabledPackageManagers")] = None - # # disabled_package_managers: Annotated[list[OrtPackageManagers] | None, - # Field(alias="disabledPackageManagers")] = None - # package_managers: Annotated[OrtPackageManagerConfigurations | None, Field(alias="packageManagers")] = None - sw360_configuration: Annotated[Sw360Configuration | None, Field(alias="sw360Configuration")] = None - skip_excluded: Annotated[bool | None, Field(alias="skipExcluded")] = None - - -class FileStorage1(BaseModel): - model_config = ConfigDict( - extra="forbid", - ) - local_file_storage: Annotated[LocalFileStorage, Field(alias="localFileStorage")] - http_file_storage: Annotated[HttpFileStorage | None, Field(alias="httpFileStorage")] = None - s3_file_storage: Annotated[S3FileStorage | None, Field(alias="s3FileStorage")] = None - - -class FileStorage2(BaseModel): - model_config = ConfigDict( - extra="forbid", - ) - local_file_storage: Annotated[LocalFileStorage | None, Field(alias="localFileStorage")] = None - http_file_storage: Annotated[HttpFileStorage, Field(alias="httpFileStorage")] - s3_file_storage: Annotated[S3FileStorage | None, Field(alias="s3FileStorage")] = None - - -class FileStorage3(BaseModel): - model_config = ConfigDict( - extra="forbid", - ) - local_file_storage: Annotated[LocalFileStorage | None, Field(alias="localFileStorage")] = None - http_file_storage: Annotated[HttpFileStorage | None, Field(alias="httpFileStorage")] = None - s3_file_storage: Annotated[S3FileStorage, Field(alias="s3FileStorage")] - - -class FileStorage(RootModel[FileStorage1 | FileStorage2 | FileStorage3]): - root: FileStorage1 | FileStorage2 | FileStorage3 - - -class ProvenanceStorage(BaseModel): - model_config = ConfigDict( - extra="forbid", - ) - file_storage: Annotated[FileStorage | None, Field(alias="fileStorage")] = None - postgres_storage: Annotated[PostgresConfig | None, Field(alias="postgresStorage")] = None - - -class Analyzer(RootModel[AnalyzerConfigurationSchema]): - root: AnalyzerConfigurationSchema - - -class Archive(BaseModel): - model_config = ConfigDict( - extra="forbid", - ) - enabled: bool | None = None - file_storage: Annotated[FileStorage | None, Field(alias="fileStorage")] = None - postgres_storage: Annotated[PostgresConfig | None, Field(alias="postgresStorage")] = None - - -class FileListStorage(ProvenanceStorage): - pass - - -class Scanner(BaseModel): - model_config = ConfigDict( - extra="forbid", - ) - skip_concluded: Annotated[bool | None, Field(alias="skipConcluded")] = None - skip_excluded: Annotated[bool | None, Field(alias="skipExcluded")] = None - archive: Archive | None = None - detected_license_mapping: Annotated[DetectedLicenseMapping | None, Field(alias="detectedLicenseMapping")] = None - file_list_storage: Annotated[FileListStorage | None, Field(alias="fileListStorage")] = None - config: ScannerConfig | None = None - storages: Storages | None = None - storage_readers: Annotated[list[StorageTypes] | None, Field(alias="storageReaders")] = None - storage_writers: Annotated[list[StorageTypes] | None, Field(alias="storageWriters")] = None - ignore_patterns: Annotated[list[str] | None, Field(alias="ignorePatterns")] = None - provenance_storage: Annotated[ProvenanceStorage | None, Field(alias="provenanceStorage")] = None - - -class Ort(BaseModel): - license_file_patterns: Annotated[LicenseFilePatterns | None, Field(alias="licenseFilePatterns")] = None - severe_issue_threshold: Annotated[Severity | None, Field(alias="severeIssueThreshold")] = None - severe_rule_violation_threshold: Annotated[Severity | None, Field(alias="severeRuleViolationThreshold")] = None - enable_repository_package_curations: Annotated[bool | None, Field(alias="enableRepositoryPackageCurations")] = None - enable_repository_package_configurations: Annotated[ - bool | None, Field(alias="enableRepositoryPackageConfigurations") - ] = None - analyzer: Analyzer | None = None - advisor: Advisor | None = None - downloader: Downloader | None = None - scanner: Scanner | None = None - reporter: Reporter | None = None - notifier: Notifier | None = None - - -class OrtConfiguration(BaseModel): - """ - The main configuration file for the OSS-Review-Toolkit (ORT). - A full list of all available options can be found at - https://github.com/oss-review-toolkit/ort/blob/main/model/src/main/resources/reference.yml. - """ - - ort: Ort - - def __init__(self, ort_file: str | Path | None = None, **data: dict[str, Any]) -> None: - if ort_file: - if isinstance(ort_file, str): - ort_file = Path(ort_file) - try: - with ort_file.open() as fp: - model = yaml.safe_load(fp) - data.update(model) - except FileNotFoundError as e: - raise ValueError(e) - except yaml.parser.ParserError as e: - print(f"Error decoding YAML from {ort_file}") - raise ValueError(e) - except Exception as e: - raise ValueError(e) - super().__init__(**data) diff --git a/src/ort/models/ort_result.py b/src/ort/models/ort_result.py new file mode 100644 index 0000000..2a6de4c --- /dev/null +++ b/src/ort/models/ort_result.py @@ -0,0 +1,32 @@ +# SPDX-FileCopyrightText: 2025 Helio Chissini de Castro +# SPDX-License-Identifier: MIT + + +from pydantic import BaseModel, ConfigDict, Field + +from ort.models.analyzer_run import AnalyzerRun +from ort.models.repository import Repository + + +class OrtResult(BaseModel): + """ + The common output format for the analyzer and scanner. It contains information about the scanned repository, + and the analyzer and scanner will add their result to it. + + Attributes: + repository(Repository): Information about the repository that was used as input. + analyzer(AnalyzerRun): An [AnalyzerRun] containing details about the analyzer that was run using [repository] + as input. Can be null if the [repository] was not yet analyzed. + + """ + + model_config = ConfigDict( + extra="ignore", + ) + repository: Repository = Field( + description="Information about the repository that was used as input.", + ) + analyzer: AnalyzerRun = Field( + description="An [AnalyzerRun] containing details about the analyzer that was run using [repository]" + "as input. Can be null if the [repository] was not yet analyzed." + ) diff --git a/src/ort/models/package.py b/src/ort/models/package.py new file mode 100644 index 0000000..ce8c96f --- /dev/null +++ b/src/ort/models/package.py @@ -0,0 +1,130 @@ +# SPDX-FileCopyrightText: 2025 Helio Chissini de Castro +# SPDX-License-Identifier: MIT + + +from pydantic import BaseModel, ConfigDict, Field + +from ort.models.identifier import Identifier +from ort.models.remote_artifact import RemoteArtifact +from ort.models.source_code_origin import SourceCodeOrigin +from ort.models.vcsinfo import VcsInfo +from ort.utils.processed_declared_license import ProcessedDeclaredLicense + + +class Package(BaseModel): + """ + A generic descriptor for a software package. It contains all relevant metadata about a package like the name, + version, and how to retrieve the package and its source code. It does not contain information about the package's + dependencies, however. This is because at this stage ORT would only be able to get the declared dependencies, + whereas the resolved dependencies are of interest. Resolved dependencies might differ from declared dependencies + due to specified version ranges, or change depending on how the package is used in a project due to the build + system's dependency resolution process. For example, if multiple versions of the same package are used in a + project, the build system might decide to align on a single version of that package. + """ + + model_config = ConfigDict( + extra="forbid", + ) + + id: Identifier = Field( + description="The unique identifier of this package. The id's type is the name of the package type or protocol " + "(e.g. 'Maven' for a file from a Maven repository).", + ) + + purl: str = Field( + ..., + description="An additional identifier in package URL syntax (https://github.com/package-url/purl-spec).", + ) + + cpe: str | None = Field( + default=None, + description="An optional additional identifier in CPE syntax (https://cpe.mitre.org/specification/).", + ) + + authors: set[str] = Field( + default_factory=set, + description="The set of authors declared for this package.", + ) + + declared_licenses: set[str] = Field( + ..., + description="The set of licenses declared for this package. This does not necessarily correspond to" + "the licenses as detected by a scanner. Both need to be taken into account for any conclusions.", + ) + + declared_licenses_processed: ProcessedDeclaredLicense = Field( + ..., + description="The declared licenses as SpdxExpression. If declared_licenses contains multiple licenses they are " + "concatenated with SpdxOperator.AND.", + ) + + concluded_license: str | None = Field( + default=None, + description="The concluded license as an SpdxExpression. It can be used to override the declared/detected " + "licenses of a package. ORT itself does not set this field, it needs to be set by the user using a " + "PackageCuration.", + ) + + description: str = Field( + ..., + description="The description of the package, as provided by the package manager.", + ) + + homepage_url: str = Field( + ..., + description="The homepage of the package.", + ) + + binary_artifact: RemoteArtifact = Field( + ..., + description="The remote artifact where the binary package can be downloaded.", + ) + + source_artifact: RemoteArtifact = Field( + ..., + description="The remote artifact where the source package can be downloaded.", + ) + + vcs: VcsInfo = Field( + ..., + description="Original VCS-related information as defined in the package's metadata.", + ) + + vcs_processed: VcsInfo = Field( + ..., + description="Processed VCS-related information about the package in normalized form. The information is either " + "derived from vcs, guessed from additional data as a fallback, or empty. On top of that PackageCurations may " + "have been applied.", + ) + + is_metadata_only: bool = Field( + default=False, + description="Indicates whether the package is just metadata, like e.g. Maven BOM artifacts which only define " + "constraints for dependency versions.", + ) + + is_modified: bool = Field( + default=False, + description="Indicates whether the source code of the package has been modified compared to the original source" + "code, e.g., in case of a fork of an upstream Open Source project.", + ) + + source_code_origins: list[SourceCodeOrigin] | None = Field( + default=None, + description="The considered source code origins and their priority order to use for this package. If null, the " + "configured default is used. If not null, this must not be empty and not contain any duplicates.", + ) + + labels: dict[str, str] = Field( + default_factory=dict, + description="User defined labels associated with this package. The labels are not interpreted by the core of" + "ORT itself, but can be used in parts of ORT such as plugins, in evaluator rules, or in reporter templates.", + ) + + def __hash__(self) -> int: + return hash(self.id) + + def __eq__(self, other) -> bool: + if not isinstance(other, Package): + return NotImplemented + return self.id == other.id diff --git a/src/ort/models/package_linkage.py b/src/ort/models/package_linkage.py new file mode 100644 index 0000000..f4625e2 --- /dev/null +++ b/src/ort/models/package_linkage.py @@ -0,0 +1,33 @@ +# SPDX-FileCopyrightText: 2025 Helio Chissini de Castro +# SPDX-License-Identifier: MIT + + +from enum import Enum, auto + + +class PackageLinkage(Enum): + """ + A class to denote the linkage type between two packages. + + Members: + DYNAMIC: + A dynamically linked package whose source code is not directly defined in the project itself, + but which is retrieved as an external artifact. + + STATIC: + A statically linked package whose source code is not directly defined in the project itself, + but which is retrieved as an external artifact. + + PROJECT_DYNAMIC: + A dynamically linked package whose source code is part of the project itself, + e.g. a subproject of a multi-project. + + PROJECT_STATIC: + A statically linked package whose source code is part of the project itself, + e.g. a subproject of a multi-project. + """ + + DYNAMIC = auto() + STATIC = auto() + PROJECT_DYNAMIC = auto() + PROJECT_STATIC = auto() diff --git a/src/ort/models/package_reference.py b/src/ort/models/package_reference.py new file mode 100644 index 0000000..876783f --- /dev/null +++ b/src/ort/models/package_reference.py @@ -0,0 +1,33 @@ +# SPDX-FileCopyrightText: 2025 Helio Chissini de Castro +# SPDX-License-Identifier: MIT + + +from pydantic import BaseModel, ConfigDict, Field + +from ort.models.issue import Issue +from ort.models.package_linkage import PackageLinkage + + +class PackageReference(BaseModel): + """ + A human-readable reference to a software [Package]. Each package reference itself refers to other package + references that are dependencies of the package. + """ + + model_config = ConfigDict( + extra="forbid", + ) + + id: str = Field(description="The identifier of the package.") + linkage: PackageLinkage = Field( + description="The type of linkage used for the referred package from its dependent package. As most of ORT's " + "supported package managers / languages only support dynamic linking or at least default to it, " + "also use that as the default value here to not blow up ORT result files.", + ) + dependencies: set["PackageReference"] = Field( + description="The set of references to packages this package depends on. Note that this list depends on the " + "scope in which this package is referenced.", + ) + issues: list[Issue] = Field( + description="A list of issues that occurred handling this PackageReference.", + ) diff --git a/src/ort/models/project.py b/src/ort/models/project.py new file mode 100644 index 0000000..5d39544 --- /dev/null +++ b/src/ort/models/project.py @@ -0,0 +1,80 @@ +# SPDX-FileCopyrightText: 2025 Helio Chissini de Castro +# SPDX-License-Identifier: MIT + + +from pydantic import BaseModel, ConfigDict, Field + +from ort.models.identifier import Identifier +from ort.models.scope import Scope +from ort.models.vcsinfo import VcsInfo +from ort.utils.processed_declared_license import ProcessedDeclaredLicense + + +class Project(BaseModel): + """ + A class describing a software project. A Project is very similar to a Package but contains some additional + metadata like e.g. the homepage_url. Most importantly, it defines the dependency scopes that refer to the actual + packages. + """ + + model_config = ConfigDict( + extra="forbid", + ) + + id: Identifier = Field( + ..., + description="The unique identifier of this project. The id's type is the name of the package manager that" + "manages this project (e.g. 'Gradle' for a Gradle project).", + ) + cpe: str | None = Field( + None, description="An optional additional identifier in CPE syntax (https://cpe.mitre.org/specification/)." + ) + definition_file_path: str = Field( + ..., + description="The path to the definition file of this project, relative to the root of the repository described" + "in vcs and vcs_processed.", + ) + authors: set[str] = Field(default_factory=set, description="The set of authors declared for this project.") + declared_licenses: set[str] = Field( + ..., + description="The set of licenses declared for this project. This does not necessarily correspond to the" + "licenses as detected by a scanner. Both need to be taken into account for any conclusions.", + ) + declared_licenses_processed: ProcessedDeclaredLicense = Field( + ..., + description="The declared licenses as SpdxExpression. If declared_licenses contains multiple licenses they are" + "concatenated with SpdxOperator.AND.", + ) + vcs: VcsInfo = Field( + ..., + description="Original VCS-related information as defined in the Project's metadata.", + ) + vcs_processed: VcsInfo = Field( + ..., + description="Processed VCS-related information about the Project that has e.g. common mistakes corrected.", + ) + description: str = Field( + default_factory=str, + description="The description of project.", + ) + homepage_url: str = Field(..., description="The URL to the project's homepage.") + scope_dependencies: set[Scope] | None = Field( + None, + description="Holds information about the scopes and their dependencies of this project if no DependencyGraph" + "is available. NOTE: Do not use this property to access scope information. Use scopes instead, which is" + "correctly initialized in all cases.", + ) + scope_names: set[str] | None = Field( + None, + description="Contains dependency information as a set of scope names in case a shared DependencyGraph is used." + "The scopes of this project and their dependencies can then be constructed as the corresponding sub graph of" + "the shared graph.", + ) + + def __hash__(self) -> int: + return hash(self.id) + + def __eq__(self, other) -> bool: + if not isinstance(other, Project): + return NotImplemented + return self.id == other.id diff --git a/src/ort/models/remote_artifact.py b/src/ort/models/remote_artifact.py new file mode 100644 index 0000000..aa130d6 --- /dev/null +++ b/src/ort/models/remote_artifact.py @@ -0,0 +1,20 @@ +# SPDX-FileCopyrightText: 2025 Helio Chissini de Castro +# SPDX-License-Identifier: MIT + + +from pydantic import BaseModel, Field + +from ort.models.hash import Hash + + +class RemoteArtifact(BaseModel): + """ + Bundles information about a remote artifact. + """ + + url: str = Field( + description="The URL of the remote artifact.", + ) + hash: Hash = Field( + description="The hash of the remote artifact.", + ) diff --git a/src/ort/models/repository.py b/src/ort/models/repository.py new file mode 100644 index 0000000..b7d241c --- /dev/null +++ b/src/ort/models/repository.py @@ -0,0 +1,42 @@ +# SPDX-FileCopyrightText: 2025 Helio Chissini de Castro +# SPDX-License-Identifier: MIT + + +from pydantic import BaseModel, ConfigDict, Field + +from ort.models.repository_configuration import OrtRepositoryConfiguration +from ort.models.vcsinfo import VcsInfo + + +class Repository(BaseModel): + """ + A description of the source code repository that was used as input for ORT. + + Attributes: + vcs(VcsInfo): Original VCS-related information from the working tree containing the analyzer root. + vcs_precessed(VcsInfo): Processed VCS-related information from the working tree containing the analyzer root + that has e.g. common mistakes corrected. + nested_repositories(dict[str, VcsInfo]): A map of nested repositories, for example Git submodules or Git-Repo + modules. The key is the path to the nested repository relative to the root of the main repository. + config(OrtRepositoryConfiguration): The configuration of the repository, parsed from [ORT_REPO_CONFIG_FILENAME]. + + """ + + model_config = ConfigDict( + extra="forbid", + ) + vcs: VcsInfo = Field( + description="Original VCS-related information from the working tree containing the analyzer root." + ) + vcs_processed: VcsInfo = Field( + description="Processed VCS-related information from the working tree containing the analyzer root" + " that has e.g. common mistakes corrected." + ) + nested_repositories: dict[str, VcsInfo] = Field( + default_factory=dict, + description="A map of nested repositories, for example Git submodules or Git-Repo" + "modules. The key is the path to the nested repository relative to the root of the main repository.", + ) + config: OrtRepositoryConfiguration = Field( + description="The configuration of the repository, parsed from [ORT_REPO_CONFIG_FILENAME]." + ) diff --git a/src/ort/models/root_dependency_index.py b/src/ort/models/root_dependency_index.py new file mode 100644 index 0000000..f28f355 --- /dev/null +++ b/src/ort/models/root_dependency_index.py @@ -0,0 +1,27 @@ +# SPDX-FileCopyrightText: 2025 Helio Chissini de Castro +# SPDX-License-Identifier: MIT + + +from pydantic import BaseModel, Field + + +class RootDependencyIndex(BaseModel): + """ + A data class representing the index of a root dependency of a scope. + + Instances of this class are used to reference the direct dependencies of scopes in the shared dependency graph. + These dependencies form the roots of the dependency trees spawned by scopes. + """ + + root: int = Field( + ..., + description="The index of the root dependency referenced by this object. Each package acting as a dependency " + "is assigned a unique index. Storing an index rather than an identifier reduces the amount of " + "memory consumed by this representation.", + ) + fragment: int = Field( + default=0, + description="The index of the fragment of the dependency graph this reference points to. This is used to " + "distinguish between packages that occur multiple times in the dependency graph with different " + "dependencies.", + ) diff --git a/src/ort/models/scope.py b/src/ort/models/scope.py new file mode 100644 index 0000000..fec901a --- /dev/null +++ b/src/ort/models/scope.py @@ -0,0 +1,30 @@ +# SPDX-FileCopyrightText: 2025 Helio Chissini de Castro +# SPDX-License-Identifier: MIT + + +from pydantic import BaseModel, ConfigDict, Field + +from ort.models.package_reference import PackageReference + + +class Scope(BaseModel): + """ + The scope class puts package dependencies into context. + """ + + model_config = ConfigDict( + extra="forbid", + ) + + name: str = Field( + description='The respective package manager\'s native name for the scope, e.g. "compile", "provided" etc. ' + 'for Maven, or "dependencies", "devDependencies" etc. for NPM.', + ) + dependencies: set[PackageReference] = Field( + description="The set of references to packages in this scope. Note that only the first-order packages in this " + "set actually belong to the scope of 'name'. Transitive dependency packages usually belong to the " + "scope that describes the packages required to compile the product. As an example, if this was the " + "Maven \"test\" scope, all first-order items in 'dependencies' would be packages required for " + "testing the product. But transitive dependencies would not be test dependencies of the test " + "dependencies, but compile dependencies of test dependencies.", + ) diff --git a/src/ort/models/source_code_origin.py b/src/ort/models/source_code_origin.py index 8f5b743..5bb7622 100644 --- a/src/ort/models/source_code_origin.py +++ b/src/ort/models/source_code_origin.py @@ -5,5 +5,9 @@ class SourceCodeOrigin(Enum): + """ + An enumeration of supported source code origins. + """ + vcs = "VCS" artifact = "ARTIFACT" diff --git a/src/ort/models/vcsinfo.py b/src/ort/models/vcsinfo.py index edf0e17..699d57d 100644 --- a/src/ort/models/vcsinfo.py +++ b/src/ort/models/vcsinfo.py @@ -22,7 +22,11 @@ class VcsInfo(BaseModel): default_factory=VcsType, description="The type of the VCS, for example Git, GitRepo, Mercurial, etc.", ) - url: AnyUrl = Field(description="The URL to the VCS repository.") + url: AnyUrl | str = Field( + default="", + description="The URL to the VCS repository.", + ) + revision: str = Field( description="The VCS-specific revision (tag, branch, SHA1) that the version of the package maps to." ) diff --git a/src/ort/models/vcstype.py b/src/ort/models/vcstype.py index 51e9b1c..824f73a 100644 --- a/src/ort/models/vcstype.py +++ b/src/ort/models/vcstype.py @@ -1,7 +1,7 @@ # SPDX-FileCopyrightText: 2025 Helio Chissini de Castro # SPDX-License-Identifier: MIT -from pydantic import BaseModel, Field, model_validator +from pydantic import BaseModel, Field, model_serializer, model_validator # Define known VCS types as constants GIT = ["Git", "GitHub", "GitLab"] @@ -43,3 +43,8 @@ def _forName(cls, value): else: return {"name": ""} return {"name": ""} + + @model_serializer(mode="plain") + def serialize(self): + # Serialize as a string instead of an object + return self.name diff --git a/src/ort/severity.py b/src/ort/severity.py new file mode 100644 index 0000000..592ba9a --- /dev/null +++ b/src/ort/severity.py @@ -0,0 +1,19 @@ +# SPDX-FileCopyrightText: 2025 Helio Chissini de Castro +# SPDX-License-Identifier: MIT + +from enum import Enum, auto + + +class Severity(Enum): + """ + A generic class§ describing a severity, e.g. of issues, sorted from least severe to most severe. + + Members: + HINT: A hint is something that is provided for information only. + WARNING: A warning is something that should be addressed. + ERROR: An error is something that has to be addressed. + """ + + HINT = auto() + WARNING = auto() + ERROR = auto() diff --git a/src/ort/utils/__init__.py b/src/ort/utils/__init__.py new file mode 100644 index 0000000..6567d53 --- /dev/null +++ b/src/ort/utils/__init__.py @@ -0,0 +1,10 @@ +# SPDX-FileCopyrightText: 2025 Helio Chissini de Castro +# SPDX-License-Identifier: MIT + +from ort.utils.environment import Environment +from ort.utils.processed_declared_license import ProcessedDeclaredLicense + +__all__ = [ + "Environment", + "ProcessedDeclaredLicense", +] diff --git a/src/ort/utils/environment.py b/src/ort/utils/environment.py new file mode 100644 index 0000000..170c7bc --- /dev/null +++ b/src/ort/utils/environment.py @@ -0,0 +1,38 @@ +# SPDX-FileCopyrightText: 2025 Helio Chissini de Castro +# SPDX-License-Identifier: MIT + + +from pydantic import BaseModel, ConfigDict, Field + + +class Environment(BaseModel): + """ + A description of the environment that ORT was executed in. + """ + + model_config = ConfigDict( + extra="allow", + ) + + ort_version: str = Field( + description="The version of the OSS Review Toolkit as a string.", + ) + build_jdk: str = Field( + description="The version of Java used to build ORT.", + ) + java_version: str = Field( + description="The version of Java used to run ORT.", + ) + os: str = Field( + description="Name of the operating system, defaults to [Os.Name].", + ) + processors: int = Field( + description="The number of logical processors available.", + ) + max_memory: int = Field( + description="The maximum amount of memory available.", + ) + variables: dict[str, str] = Field( + default_factory=dict, + description="Map of selected environment variables that might be relevant for debugging.", + ) diff --git a/src/ort/utils/processed_declared_license.py b/src/ort/utils/processed_declared_license.py new file mode 100644 index 0000000..399de04 --- /dev/null +++ b/src/ort/utils/processed_declared_license.py @@ -0,0 +1,30 @@ +# SPDX-FileCopyrightText: 2025 Helio Chissini de Castro +# SPDX-License-Identifier: MIT + + +from pydantic import BaseModel, ConfigDict, Field + + +class ProcessedDeclaredLicense(BaseModel): + """ + The resulting SPDX expression, or null if no license could be mapped. + """ + + model_config = ConfigDict( + extra="forbid", + ) + + spdx_expression: str | None = Field( + default=None, + description="The resulting SPDX expression, or null if no license could be mapped.", + ) + mapped: dict[str, str] = Field( + default_factory=dict, + description="A map from the original declared license strings to the SPDX expressions they were mapped to. " + "If the original declared license string and the processed declared license are identical they " + "are not contained in this map.", + ) + unmapped: set[str] = Field( + default_factory=set, + description="Declared licenses that could not be mapped to an SPDX expression.", + ) diff --git a/tests/data/analyzer-result.yml b/tests/data/analyzer-result.yml new file mode 100644 index 0000000..6917353 --- /dev/null +++ b/tests/data/analyzer-result.yml @@ -0,0 +1,1832 @@ +--- +repository: + vcs: + type: "Git" + url: "https://github.com/heliocastro/python-ort" + revision: "2d51ebb6a95f7064b0716cb1743f9cb4de754b44" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/heliocastro/python-ort.git" + revision: "2d51ebb6a95f7064b0716cb1743f9cb4de754b44" + path: "" + config: + analyzer: + enabled_package_managers: + - "PIP" + excludes: + paths: + - pattern: "tests/data/**" + reason: "TEST_OF" + comment: "Test data" +analyzer: + start_time: "2025-12-22T09:52:31.467090Z" + end_time: "2025-12-22T09:52:39.463877Z" + environment: + ort_version: "73.0.0" + build_jdk: "21.0.9+10-LTS" + java_version: "21.0.9" + os: "Mac OS X" + processors: 12 + max_memory: 6442450944 + variables: + ORT_CONFIG_DIR: "/Users/dhxbwm7/data/ort-config" + HOME: "/Users/dhxbwm7" + SHELL: "/bin/zsh" + TERM: "xterm-ghostty" + JAVA_HOME: "/opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk/Contents/Home" + GOPATH: "/Users/dhxbwm7/.local/toolchains/golang" + config: + allow_dynamic_versions: false + enabled_package_managers: + - "PIP" + skip_excluded: true + result: + projects: + - id: "PIP::requirements.txt:2d51ebb6a95f7064b0716cb1743f9cb4de754b44" + definition_file_path: "requirements.txt" + declared_licenses: [] + declared_licenses_processed: {} + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/heliocastro/python-ort.git" + revision: "2d51ebb6a95f7064b0716cb1743f9cb4de754b44" + path: "" + homepage_url: "" + scope_names: + - "install" + packages: + - id: "PyPI::annotated-types:0.7.0" + purl: "pkg:pypi/annotated-types@0.7.0" + authors: + - "Adrian Garcia Badaracco <1755071+adriangb@users.noreply.github.com>, Samuel\ + \ Colvin , Zac Hatfield-Dodds " + declared_licenses: + - "MIT License" + declared_licenses_processed: + spdx_expression: "MIT" + mapped: + MIT License: "MIT" + description: "Reusable constraint types to use with typing.Annotated" + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl" + hash: + value: "1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz" + hash: + value: "aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/annotated-types/annotated-types.git" + revision: "" + path: "" + - id: "PyPI::anyio:4.12.0" + purl: "pkg:pypi/anyio@4.12.0" + authors: + - "Alex Grönholm " + declared_licenses: [] + declared_licenses_processed: {} + description: "High-level concurrency and networking framework on top of asyncio\ + \ or Trio" + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/7f/9c/36c5c37947ebfb8c7f22e0eb6e4d188ee2d53aa3880f3f2744fb894f0cb1/anyio-4.12.0-py3-none-any.whl" + hash: + value: "dad2376a628f98eeca4881fc56cd06affd18f659b17a747d3ff0307ced94b1bb" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/16/ce/8a777047513153587e5434fd752e89334ac33e379aa3497db860eeb60377/anyio-4.12.0.tar.gz" + hash: + value: "73c693b567b0c55130c104d0b43a9baf3aa6a31fc6110116509f27bf75e21ec0" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "" + url: "" + revision: "" + path: "" + - id: "PyPI::argcomplete:3.6.3" + purl: "pkg:pypi/argcomplete@3.6.3" + authors: + - "Andrey Kislyuk " + declared_licenses: + - "Apache Software License" + declared_licenses_processed: + spdx_expression: "Apache-2.0" + mapped: + Apache Software License: "Apache-2.0" + description: "Bash tab completion for argparse" + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/74/f5/9373290775639cb67a2fce7f629a1c240dce9f12fe927bc32b2736e16dfc/argcomplete-3.6.3-py3-none-any.whl" + hash: + value: "f5007b3a600ccac5d25bbce33089211dfd49eab4a7718da3f10e3082525a92ce" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/38/61/0b9ae6399dd4a58d8c1b1dc5a27d6f2808023d0b5dd3104bb99f45a33ff6/argcomplete-3.6.3.tar.gz" + hash: + value: "62e8ed4fd6a45864acc8235409461b72c9a28ee785a2011cc5eb78318786c89c" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/kislyuk/argcomplete.git" + revision: "" + path: "" + - id: "PyPI::black:25.12.0" + purl: "pkg:pypi/black@25.12.0" + authors: + - "Łukasz Langa " + declared_licenses: [] + declared_licenses_processed: {} + description: "The uncompromising code formatter." + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/74/98/38aaa018b2ab06a863974c12b14a6266badc192b20603a81b738c47e902e/black-25.12.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" + hash: + value: "0e509c858adf63aa61d908061b52e580c40eae0dfa72415fa47ac01b12e29baf" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/c4/d9/07b458a3f1c525ac392b5edc6b191ff140b596f9d77092429417a54e249d/black-25.12.0.tar.gz" + hash: + value: "8d3dd9cea14bff7ddc0eb243c811cdb1a011ebb4800a5f0335a01a68654796a7" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "" + url: "" + revision: "" + path: "" + - id: "PyPI::certifi:2025.11.12" + purl: "pkg:pypi/certifi@2025.11.12" + authors: + - "Kenneth Reitz " + declared_licenses: + - "MPL-2.0" + - "Mozilla Public License 2.0 (MPL 2.0)" + declared_licenses_processed: + spdx_expression: "MPL-2.0" + mapped: + Mozilla Public License 2.0 (MPL 2.0): "MPL-2.0" + description: "Python package for providing Mozilla's CA Bundle." + homepage_url: "https://github.com/certifi/python-certifi" + binary_artifact: + url: "https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl" + hash: + value: "97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/a2/8c/58f469717fa48465e4a50c014a0400602d3c437d7c0c468e17ada824da3a/certifi-2025.11.12.tar.gz" + hash: + value: "d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/certifi/python-certifi.git" + revision: "" + path: "" + - id: "PyPI::cfgv:3.5.0" + purl: "pkg:pypi/cfgv@3.5.0" + authors: + - "Anthony Sottile " + declared_licenses: + - "MIT" + declared_licenses_processed: + spdx_expression: "MIT" + description: "[![build status](https://github.com/asottile/cfgv/actions/workflows/main.yml/badge.svg)](https://github.com/asottile/cfgv/actions/workflows/main.yml)" + homepage_url: "https://github.com/asottile/cfgv" + binary_artifact: + url: "https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl" + hash: + value: "a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/4e/b5/721b8799b04bf9afe054a3899c6cf4e880fcf8563cc71c15610242490a0c/cfgv-3.5.0.tar.gz" + hash: + value: "d5b1034354820651caa73ede66a6294d6e95c1b00acc5e9b098e917404669132" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/asottile/cfgv.git" + revision: "" + path: "" + - id: "PyPI::click:8.3.1" + purl: "pkg:pypi/click@8.3.1" + declared_licenses: [] + declared_licenses_processed: {} + description: "Composable command line interface toolkit" + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl" + hash: + value: "981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz" + hash: + value: "12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/pallets/click.git" + revision: "" + path: "" + - id: "PyPI::datamodel-code-generator:0.46.0" + purl: "pkg:pypi/datamodel-code-generator@0.46.0" + authors: + - "Koudai Aono " + declared_licenses: + - "MIT License" + declared_licenses_processed: + spdx_expression: "MIT" + mapped: + MIT License: "MIT" + description: "Datamodel Code Generator" + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/f2/31/17c3217d35848d3aff2828d5de91f2f608734bad5cd2e4e4f845037753e0/datamodel_code_generator-0.46.0-py3-none-any.whl" + hash: + value: "cdb990bdb129ee1ceb37ac243879decabb91fa53e27439ba67da20da9caee0ee" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/60/f5/8c1e9c0cb0752ee98baebd1fb98c389d8ee125e21c7acd8d7d9f6883b314/datamodel_code_generator-0.46.0.tar.gz" + hash: + value: "c020f9b014f93c02b526791b03bac235b49803ee178f11598e0a3465dadf9317" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/koxudaxi/datamodel-code-generator.git" + revision: "" + path: "" + - id: "PyPI::distlib:0.4.0" + purl: "pkg:pypi/distlib@0.4.0" + authors: + - "Vinay Sajip " + declared_licenses: + - "PSF-2.0" + - "Python Software Foundation License" + declared_licenses_processed: + spdx_expression: "PSF-2.0" + mapped: + Python Software Foundation License: "PSF-2.0" + description: "Distribution utilities" + homepage_url: "https://github.com/pypa/distlib" + binary_artifact: + url: "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl" + hash: + value: "9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz" + hash: + value: "feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/pypa/distlib.git" + revision: "" + path: "" + - id: "PyPI::exceptiongroup:1.3.1" + purl: "pkg:pypi/exceptiongroup@1.3.1" + authors: + - "Alex Grönholm " + declared_licenses: + - "MIT License" + declared_licenses_processed: + spdx_expression: "MIT" + mapped: + MIT License: "MIT" + description: "Backport of PEP 654 (exception groups)" + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl" + hash: + value: "a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz" + hash: + value: "8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "" + url: "" + revision: "" + path: "" + - id: "PyPI::filelock:3.20.1" + purl: "pkg:pypi/filelock@3.20.1" + declared_licenses: + - "The Unlicense (Unlicense)" + declared_licenses_processed: + spdx_expression: "Unlicense" + mapped: + The Unlicense (Unlicense): "Unlicense" + description: "A platform independent file lock." + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/e3/7f/a1a97644e39e7316d850784c642093c99df1290a460df4ede27659056834/filelock-3.20.1-py3-none-any.whl" + hash: + value: "15d9e9a67306188a44baa72f569d2bfd803076269365fdea0934385da4dc361a" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/a7/23/ce7a1126827cedeb958fc043d61745754464eb56c5937c35bbf2b8e26f34/filelock-3.20.1.tar.gz" + hash: + value: "b8360948b351b80f420878d8516519a2204b07aefcdcfd24912a5d33127f188c" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/tox-dev/py-filelock.git" + revision: "" + path: "" + - id: "PyPI::genson:1.3.0" + purl: "pkg:pypi/genson@1.3.0" + authors: + - "Jon Wolverton " + declared_licenses: + - "MIT" + - "MIT License" + declared_licenses_processed: + spdx_expression: "MIT" + mapped: + MIT License: "MIT" + description: "GenSON is a powerful, user-friendly JSON Schema generator." + homepage_url: "https://github.com/wolverdude/genson/" + binary_artifact: + url: "https://files.pythonhosted.org/packages/f8/5c/e226de133afd8bb267ec27eead9ae3d784b95b39a287ed404caab39a5f50/genson-1.3.0-py3-none-any.whl" + hash: + value: "468feccd00274cc7e4c09e84b08704270ba8d95232aa280f65b986139cec67f7" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/c5/cf/2303c8ad276dcf5ee2ad6cf69c4338fd86ef0f471a5207b069adf7a393cf/genson-1.3.0.tar.gz" + hash: + value: "e02db9ac2e3fd29e65b5286f7135762e2cd8a986537c075b06fc5f1517308e37" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/wolverdude/genson.git" + revision: "" + path: "" + - id: "PyPI::h11:0.16.0" + purl: "pkg:pypi/h11@0.16.0" + authors: + - "Nathaniel J. Smith " + declared_licenses: + - "MIT" + - "MIT License" + declared_licenses_processed: + spdx_expression: "MIT" + mapped: + MIT License: "MIT" + description: "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" + homepage_url: "https://github.com/python-hyper/h11" + binary_artifact: + url: "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl" + hash: + value: "63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz" + hash: + value: "4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/python-hyper/h11.git" + revision: "" + path: "" + - id: "PyPI::httpcore:1.0.9" + purl: "pkg:pypi/httpcore@1.0.9" + authors: + - "Tom Christie " + declared_licenses: + - "BSD License" + declared_licenses_processed: + unmapped: + - "BSD License" + description: "A minimal low-level HTTP client." + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl" + hash: + value: "2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz" + hash: + value: "6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/encode/httpcore.git" + revision: "" + path: "" + - id: "PyPI::httpx:0.28.1" + purl: "pkg:pypi/httpx@0.28.1" + authors: + - "Tom Christie " + declared_licenses: + - "BSD License" + - "BSD-3-Clause" + declared_licenses_processed: + spdx_expression: "BSD-3-Clause" + mapped: + BSD License: "BSD-3-Clause" + description: "The next generation HTTP client." + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl" + hash: + value: "d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz" + hash: + value: "75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/encode/httpx.git" + revision: "" + path: "" + - id: "PyPI::identify:2.6.15" + purl: "pkg:pypi/identify@2.6.15" + authors: + - "Chris Kuehl " + declared_licenses: + - "MIT" + declared_licenses_processed: + spdx_expression: "MIT" + description: "[![build status](https://github.com/pre-commit/identify/actions/workflows/main.yml/badge.svg)](https://github.com/pre-commit/identify/actions/workflows/main.yml)" + homepage_url: "https://github.com/pre-commit/identify" + binary_artifact: + url: "https://files.pythonhosted.org/packages/0f/1c/e5fd8f973d4f375adb21565739498e2e9a1e54c858a97b9a8ccfdc81da9b/identify-2.6.15-py2.py3-none-any.whl" + hash: + value: "1181ef7608e00704db228516541eb83a88a9f94433a8c80bb9b5bd54b1d81757" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/ff/e7/685de97986c916a6d93b3876139e00eef26ad5bbbd61925d670ae8013449/identify-2.6.15.tar.gz" + hash: + value: "e4f4864b96c6557ef2a1e1c951771838f4edc9df3a72ec7118b338801b11c7bf" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/pre-commit/identify.git" + revision: "" + path: "" + - id: "PyPI::idna:3.11" + purl: "pkg:pypi/idna@3.11" + authors: + - "Kim Davies " + declared_licenses: [] + declared_licenses_processed: {} + description: "Internationalized Domain Names in Applications (IDNA)" + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl" + hash: + value: "771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz" + hash: + value: "795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/kjd/idna.git" + revision: "" + path: "" + - id: "PyPI::inflect:7.5.0" + purl: "pkg:pypi/inflect@7.5.0" + authors: + - "Paul Dyson " + declared_licenses: + - "MIT License" + declared_licenses_processed: + spdx_expression: "MIT" + mapped: + MIT License: "MIT" + description: "Correctly generate plurals, singular nouns, ordinals, indefinite\ + \ articles" + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/8a/eb/427ed2b20a38a4ee29f24dbe4ae2dafab198674fe9a85e3d6adf9e5f5f41/inflect-7.5.0-py3-none-any.whl" + hash: + value: "2aea70e5e70c35d8350b8097396ec155ffd68def678c7ff97f51aa69c1d92344" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/78/c6/943357d44a21fd995723d07ccaddd78023eace03c1846049a2645d4324a3/inflect-7.5.0.tar.gz" + hash: + value: "faf19801c3742ed5a05a8ce388e0d8fe1a07f8d095c82201eb904f5d27ad571f" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/jaraco/inflect.git" + revision: "" + path: "" + - id: "PyPI::iniconfig:2.3.0" + purl: "pkg:pypi/iniconfig@2.3.0" + authors: + - "Ronny Pfannschmidt , Holger Krekel " + declared_licenses: [] + declared_licenses_processed: {} + description: "brain-dead simple config-ini parsing" + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl" + hash: + value: "f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz" + hash: + value: "c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "" + url: "" + revision: "" + path: "" + - id: "PyPI::isort:7.0.0" + purl: "pkg:pypi/isort@7.0.0" + authors: + - "Timothy Crosley , staticdev " + declared_licenses: + - "MIT License" + declared_licenses_processed: + spdx_expression: "MIT" + mapped: + MIT License: "MIT" + description: "A Python utility / library to sort Python imports." + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/7f/ed/e3705d6d02b4f7aea715a353c8ce193efd0b5db13e204df895d38734c244/isort-7.0.0-py3-none-any.whl" + hash: + value: "1bcabac8bc3c36c7fb7b98a76c8abb18e0f841a3ba81decac7691008592499c1" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/63/53/4f3c058e3bace40282876f9b553343376ee687f3c35a525dc79dbd450f88/isort-7.0.0.tar.gz" + hash: + value: "5513527951aadb3ac4292a41a16cbc50dd1642432f5e8c20057d414bdafb4187" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "" + url: "" + revision: "" + path: "" + - id: "PyPI::jinja2:3.1.6" + purl: "pkg:pypi/jinja2@3.1.6" + declared_licenses: + - "BSD License" + declared_licenses_processed: + unmapped: + - "BSD License" + description: "A very fast and expressive template engine." + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl" + hash: + value: "85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz" + hash: + value: "0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/pallets/jinja.git" + revision: "" + path: "" + - id: "PyPI::markdown-it-py:4.0.0" + purl: "pkg:pypi/markdown-it-py@4.0.0" + authors: + - "Chris Sewell " + declared_licenses: + - "MIT License" + declared_licenses_processed: + spdx_expression: "MIT" + mapped: + MIT License: "MIT" + description: "Python port of markdown-it. Markdown parsing, done right!" + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl" + hash: + value: "87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz" + hash: + value: "cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "" + url: "" + revision: "" + path: "" + - id: "PyPI::markupsafe:3.0.3" + purl: "pkg:pypi/markupsafe@3.0.3" + declared_licenses: [] + declared_licenses_processed: {} + description: "Safely add untrusted strings to HTML/XML markup." + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl" + hash: + value: "8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz" + hash: + value: "722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/pallets/markupsafe.git" + revision: "" + path: "" + - id: "PyPI::mdurl:0.1.2" + purl: "pkg:pypi/mdurl@0.1.2" + authors: + - "Taneli Hukkinen " + declared_licenses: + - "MIT License" + declared_licenses_processed: + spdx_expression: "MIT" + mapped: + MIT License: "MIT" + description: "Markdown URL utilities" + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl" + hash: + value: "84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz" + hash: + value: "bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "" + url: "" + revision: "" + path: "" + - id: "PyPI::more-itertools:10.8.0" + purl: "pkg:pypi/more-itertools@10.8.0" + authors: + - "Erik Rose " + declared_licenses: [] + declared_licenses_processed: {} + description: "More routines for operating on iterables, beyond itertools" + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/a4/8e/469e5a4a2f5855992e425f3cb33804cc07bf18d48f2db061aec61ce50270/more_itertools-10.8.0-py3-none-any.whl" + hash: + value: "52d4362373dcf7c52546bc4af9a86ee7c4579df9a8dc268be0a2f949d376cc9b" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/ea/5d/38b681d3fce7a266dd9ab73c66959406d565b3e85f21d5e66e1181d93721/more_itertools-10.8.0.tar.gz" + hash: + value: "f638ddf8a1a0d134181275fb5d58b086ead7c6a72429ad725c67503f13ba30bd" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "" + url: "" + revision: "" + path: "" + - id: "PyPI::mypy-extensions:1.1.0" + purl: "pkg:pypi/mypy-extensions@1.1.0" + authors: + - "The mypy developers " + declared_licenses: [] + declared_licenses_processed: {} + description: "Type system extensions for programs checked with the mypy type\ + \ checker." + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl" + hash: + value: "1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz" + hash: + value: "52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "" + url: "" + revision: "" + path: "" + - id: "PyPI::nodeenv:1.10.0" + purl: "pkg:pypi/nodeenv@1.10.0" + authors: + - "Eugene Kalinin " + declared_licenses: + - "BSD" + - "BSD License" + declared_licenses_processed: + spdx_expression: "BSD-3-Clause" + mapped: + BSD: "BSD-3-Clause" + BSD License: "BSD-3-Clause" + description: "Node.js virtual environment builder" + homepage_url: "https://github.com/ekalinin/nodeenv" + binary_artifact: + url: "https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl" + hash: + value: "5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/24/bf/d1bda4f6168e0b2e9e5958945e01910052158313224ada5ce1fb2e1113b8/nodeenv-1.10.0.tar.gz" + hash: + value: "996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/ekalinin/nodeenv.git" + revision: "" + path: "" + - id: "PyPI::packaging:25.0" + purl: "pkg:pypi/packaging@25.0" + authors: + - "Donald Stufft " + declared_licenses: + - "Apache Software License" + - "BSD License" + declared_licenses_processed: + spdx_expression: "Apache-2.0" + mapped: + Apache Software License: "Apache-2.0" + unmapped: + - "BSD License" + description: "Core utilities for Python packages" + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl" + hash: + value: "29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz" + hash: + value: "d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/pypa/packaging.git" + revision: "" + path: "" + - id: "PyPI::pathspec:0.12.1" + purl: "pkg:pypi/pathspec@0.12.1" + authors: + - "\"Caleb P. Burns\" " + declared_licenses: + - "Mozilla Public License 2.0 (MPL 2.0)" + declared_licenses_processed: + spdx_expression: "MPL-2.0" + mapped: + Mozilla Public License 2.0 (MPL 2.0): "MPL-2.0" + description: "Utility library for gitignore style pattern matching of file paths." + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl" + hash: + value: "a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz" + hash: + value: "a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/cpburnz/python-pathspec.git" + revision: "" + path: "" + - id: "PyPI::platformdirs:4.5.1" + purl: "pkg:pypi/platformdirs@4.5.1" + declared_licenses: + - "MIT License" + declared_licenses_processed: + spdx_expression: "MIT" + mapped: + MIT License: "MIT" + description: "A small Python package for determining appropriate platform-specific\ + \ dirs, e.g. a `user data dir`." + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl" + hash: + value: "d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/cf/86/0248f086a84f01b37aaec0fa567b397df1a119f73c16f6c7a9aac73ea309/platformdirs-4.5.1.tar.gz" + hash: + value: "61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/tox-dev/platformdirs.git" + revision: "" + path: "" + - id: "PyPI::pluggy:1.6.0" + purl: "pkg:pypi/pluggy@1.6.0" + authors: + - "Holger Krekel " + declared_licenses: + - "MIT" + - "MIT License" + declared_licenses_processed: + spdx_expression: "MIT" + mapped: + MIT License: "MIT" + description: "plugin and hook calling mechanisms for python" + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl" + hash: + value: "e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz" + hash: + value: "7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "" + url: "" + revision: "" + path: "" + - id: "PyPI::pre-commit:4.5.1" + purl: "pkg:pypi/pre-commit@4.5.1" + authors: + - "Anthony Sottile " + declared_licenses: + - "MIT" + declared_licenses_processed: + spdx_expression: "MIT" + description: "[![build status](https://github.com/pre-commit/pre-commit/actions/workflows/main.yml/badge.svg)](https://github.com/pre-commit/pre-commit/actions/workflows/main.yml)" + homepage_url: "https://github.com/pre-commit/pre-commit" + binary_artifact: + url: "https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl" + hash: + value: "3b3afd891e97337708c1674210f8eba659b52a38ea5f822ff142d10786221f77" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/40/f1/6d86a29246dfd2e9b6237f0b5823717f60cad94d47ddc26afa916d21f525/pre_commit-4.5.1.tar.gz" + hash: + value: "eb545fcff725875197837263e977ea257a402056661f09dae08e4b149b030a61" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/pre-commit/pre-commit.git" + revision: "" + path: "" + - id: "PyPI::pycodestyle:2.14.0" + purl: "pkg:pypi/pycodestyle@2.14.0" + authors: + - "Johann C. Rocholl " + declared_licenses: + - "MIT" + declared_licenses_processed: + spdx_expression: "MIT" + description: "pycodestyle (formerly called pep8) - Python style guide checker" + homepage_url: "https://pycodestyle.pycqa.org/" + binary_artifact: + url: "https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl" + hash: + value: "dd6bf7cb4ee77f8e016f9c8e74a35ddd9f67e1d5fd4184d86c3b98e07099f42d" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/11/e0/abfd2a0d2efe47670df87f3e3a0e2edda42f055053c85361f19c0e2c1ca8/pycodestyle-2.14.0.tar.gz" + hash: + value: "c4b5b517d278089ff9d0abdec919cd97262a3367449ea1c8b49b91529167b783" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "" + url: "" + revision: "" + path: "" + - id: "PyPI::pydantic:2.12.5" + purl: "pkg:pypi/pydantic@2.12.5" + authors: + - "Samuel Colvin , Eric Jolibois ,\ + \ Hasan Ramezani , Adrian Garcia Badaracco <1755071+adriangb@users.noreply.github.com>,\ + \ Terrence Dorsey , David Montague ,\ + \ Serge Matveenko , Marcelo Trylesinski ,\ + \ Sydney Runkle , David Hewitt ,\ + \ Alex Hall , Victorien Plot , Douwe\ + \ Maan " + declared_licenses: [] + declared_licenses_processed: {} + description: "# Pydantic Validation" + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl" + hash: + value: "e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz" + hash: + value: "4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/pydantic/pydantic.git" + revision: "" + path: "" + - id: "PyPI::pydantic-core:2.41.5" + purl: "pkg:pypi/pydantic-core@2.41.5" + authors: + - "Samuel Colvin , Adrian Garcia Badaracco <1755071+adriangb@users.noreply.github.com>,\ + \ David Montague , David Hewitt ,\ + \ Sydney Runkle , Victorien Plot " + declared_licenses: [] + declared_licenses_processed: {} + description: "Core functionality for Pydantic validation and serialization" + homepage_url: "https://github.com/pydantic/pydantic-core" + binary_artifact: + url: "https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + hash: + value: "406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz" + hash: + value: "08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/pydantic/pydantic-core.git" + revision: "" + path: "" + - id: "PyPI::pygments:2.19.2" + purl: "pkg:pypi/pygments@2.19.2" + authors: + - "Georg Brandl " + declared_licenses: + - "BSD License" + - "BSD-2-Clause" + declared_licenses_processed: + spdx_expression: "BSD-2-Clause" + mapped: + BSD License: "BSD-2-Clause" + description: "Pygments" + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl" + hash: + value: "86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz" + hash: + value: "636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/pygments/pygments.git" + revision: "" + path: "" + - id: "PyPI::pyrefly:0.46.0" + purl: "pkg:pypi/pyrefly@0.46.0" + declared_licenses: [] + declared_licenses_processed: {} + description: "A fast type checker and language server for Python with powerful\ + \ IDE features" + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/70/b0/55efd3ea7a7fa04b396abb4d7f7bd93911f3b2a3f05436291ab7554ca3c8/pyrefly-0.46.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + hash: + value: "4d43783984d8cb4167e3d07c96477ba1d8367ef7b6c27621d9cc1af5ccc1cf44" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/41/2e/5bf8c90b553d7d058151293c97d1cde8614a0b7f8e9fbad9641600f109b2/pyrefly-0.46.0.tar.gz" + hash: + value: "4fa77309286f850bf4378b8bdfd15b812a5c2927454ab015f01cbdb7b90dc333" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "" + url: "" + revision: "" + path: "" + - id: "PyPI::pytest:9.0.2" + purl: "pkg:pypi/pytest@9.0.2" + authors: + - "Holger Krekel, Bruno Oliveira, Ronny Pfannschmidt, Floris Bruynooghe, Brianna\ + \ Laugher, Florian Bruhin, Others (See AUTHORS)" + declared_licenses: [] + declared_licenses_processed: {} + description: "pytest: simple powerful testing with Python" + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl" + hash: + value: "711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz" + hash: + value: "75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/pytest-dev/pytest.git" + revision: "" + path: "" + - id: "PyPI::pytokens:0.3.0" + purl: "pkg:pypi/pytokens@0.3.0" + authors: + - "Tushar Sadhwani " + declared_licenses: + - "MIT" + - "MIT License" + declared_licenses_processed: + spdx_expression: "MIT" + mapped: + MIT License: "MIT" + description: "# pytokens" + homepage_url: "https://github.com/tusharsadhwani/pytokens" + binary_artifact: + url: "https://files.pythonhosted.org/packages/84/25/d9db8be44e205a124f6c98bc0324b2bb149b7431c53877fc6d1038dddaf5/pytokens-0.3.0-py3-none-any.whl" + hash: + value: "95b2b5eaf832e469d141a378872480ede3f251a5a5041b8ec6e581d3ac71bbf3" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/4e/8d/a762be14dae1c3bf280202ba3172020b2b0b4c537f94427435f19c413b72/pytokens-0.3.0.tar.gz" + hash: + value: "2f932b14ed08de5fcf0b391ace2642f858f1394c0857202959000b68ed7a458a" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/tusharsadhwani/pytokens.git" + revision: "" + path: "" + - id: "PyPI::pyyaml:6.0.3" + purl: "pkg:pypi/pyyaml@6.0.3" + authors: + - "Kirill Simonov " + declared_licenses: + - "MIT" + - "MIT License" + declared_licenses_processed: + spdx_expression: "MIT" + mapped: + MIT License: "MIT" + description: "YAML parser and emitter for Python" + homepage_url: "https://pyyaml.org/" + binary_artifact: + url: "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" + hash: + value: "0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz" + hash: + value: "d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/yaml/pyyaml.git" + revision: "" + path: "" + - id: "PyPI::rich:14.2.0" + purl: "pkg:pypi/rich@14.2.0" + authors: + - "Will McGugan " + declared_licenses: + - "MIT" + - "MIT License" + declared_licenses_processed: + spdx_expression: "MIT" + mapped: + MIT License: "MIT" + description: "Render rich text, tables, progress bars, syntax highlighting,\ + \ markdown and more to the terminal" + homepage_url: "https://github.com/Textualize/rich" + binary_artifact: + url: "https://files.pythonhosted.org/packages/25/7a/b0178788f8dc6cafce37a212c99565fa1fe7872c70c6c9c1e1a372d9d88f/rich-14.2.0-py3-none-any.whl" + hash: + value: "76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/fb/d2/8920e102050a0de7bfabeb4c4614a49248cf8d5d7a8d01885fbb24dc767a/rich-14.2.0.tar.gz" + hash: + value: "73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/Textualize/rich.git" + revision: "" + path: "" + - id: "PyPI::ruff:0.14.10" + purl: "pkg:pypi/ruff@0.14.10" + authors: + - "\"Astral Software Inc.\" " + declared_licenses: + - "MIT License" + declared_licenses_processed: + spdx_expression: "MIT" + mapped: + MIT License: "MIT" + description: "" + homepage_url: "https://docs.astral.sh/ruff" + binary_artifact: + url: "https://files.pythonhosted.org/packages/b3/19/9e050c0dca8aba824d67cc0db69fb459c28d8cd3f6855b1405b3f29cc91d/ruff-0.14.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + hash: + value: "59aabd2e2c4fd614d2862e7939c34a532c04f1084476d6833dddef4afab87e9f" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/57/08/52232a877978dd8f9cf2aeddce3e611b40a63287dfca29b6b8da791f5e8d/ruff-0.14.10.tar.gz" + hash: + value: "9a2e830f075d1a42cd28420d7809ace390832a490ed0966fe373ba288e77aaf4" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "" + url: "" + revision: "" + path: "" + - id: "PyPI::tomli:2.3.0" + purl: "pkg:pypi/tomli@2.3.0" + authors: + - "Taneli Hukkinen " + declared_licenses: [] + declared_licenses_processed: {} + description: "[![Build Status](https://github.com/hukkin/tomli/actions/workflows/tests.yaml/badge.svg?branch=master)](https://github.com/hukkin/tomli/actions?query=workflow%3ATests+branch%3Amaster+event%3Apush)" + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/d5/f4/0fbd014909748706c01d16824eadb0307115f9562a15cbb012cd9b3512c5/tomli-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" + hash: + value: "4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/52/ed/3f73f72945444548f33eba9a87fc7a6e969915e7b1acc8260b30e1f76a2f/tomli-2.3.0.tar.gz" + hash: + value: "64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "" + url: "" + revision: "" + path: "" + - id: "PyPI::typeguard:4.4.4" + purl: "pkg:pypi/typeguard@4.4.4" + authors: + - "Alex Grönholm " + declared_licenses: [] + declared_licenses_processed: {} + description: "Run-time type checker for Python" + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/1b/a9/e3aee762739c1d7528da1c3e06d518503f8b6c439c35549b53735ba52ead/typeguard-4.4.4-py3-none-any.whl" + hash: + value: "b5f562281b6bfa1f5492470464730ef001646128b180769880468bd84b68b09e" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/c7/68/71c1a15b5f65f40e91b65da23b8224dad41349894535a97f63a52e462196/typeguard-4.4.4.tar.gz" + hash: + value: "3a7fd2dffb705d4d0efaed4306a704c89b9dee850b688f060a8b1615a79e5f74" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "" + url: "" + revision: "" + path: "" + - id: "PyPI::types-pyyaml:6.0.12.20250915" + purl: "pkg:pypi/types-pyyaml@6.0.12.20250915" + declared_licenses: [] + declared_licenses_processed: {} + description: "## Typing stubs for PyYAML" + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/bd/e0/1eed384f02555dde685fff1a1ac805c1c7dcb6dd019c916fe659b1c1f9ec/types_pyyaml-6.0.12.20250915-py3-none-any.whl" + hash: + value: "e7d4d9e064e89a3b3cae120b4990cd370874d2bf12fa5f46c97018dd5d3c9ab6" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/7e/69/3c51b36d04da19b92f9e815be12753125bd8bc247ba0470a982e6979e71c/types_pyyaml-6.0.12.20250915.tar.gz" + hash: + value: "0f8b54a528c303f0e6f7165687dd33fafa81c807fcac23f632b63aa624ced1d3" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "" + url: "" + revision: "" + path: "" + - id: "PyPI::typing-extensions:4.15.0" + purl: "pkg:pypi/typing-extensions@4.15.0" + authors: + - "\"Guido van Rossum, Jukka Lehtosalo, Łukasz Langa, Michael Lee\" " + declared_licenses: [] + declared_licenses_processed: {} + description: "Backported and Experimental Type Hints for Python 3.9+" + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl" + hash: + value: "f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz" + hash: + value: "0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "" + url: "" + revision: "" + path: "" + - id: "PyPI::typing-inspection:0.4.2" + purl: "pkg:pypi/typing-inspection@0.4.2" + authors: + - "Victorien Plot " + declared_licenses: [] + declared_licenses_processed: {} + description: "Runtime typing introspection tools" + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl" + hash: + value: "4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz" + hash: + value: "ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/pydantic/typing-inspection.git" + revision: "" + path: "" + - id: "PyPI::virtualenv:20.35.4" + purl: "pkg:pypi/virtualenv@20.35.4" + declared_licenses: + - "MIT License" + declared_licenses_processed: + spdx_expression: "MIT" + mapped: + MIT License: "MIT" + description: "Virtual Python Environment builder" + homepage_url: "" + binary_artifact: + url: "https://files.pythonhosted.org/packages/79/0c/c05523fa3181fdf0c9c52a6ba91a23fbf3246cc095f26f6516f9c60e6771/virtualenv-20.35.4-py3-none-any.whl" + hash: + value: "c21c9cede36c9753eeade68ba7d523529f228a403463376cf821eaae2b650f1b" + algorithm: "SHA-256" + source_artifact: + url: "https://files.pythonhosted.org/packages/20/28/e6f1a6f655d620846bd9df527390ecc26b3805a0c5989048c210e22c5ca9/virtualenv-20.35.4.tar.gz" + hash: + value: "643d3914d73d3eeb0c552cbb12d7e82adf0e504dbf86a3182f8771a153a1971c" + algorithm: "SHA-256" + vcs: + type: "" + url: "" + revision: "" + path: "" + vcs_processed: + type: "Git" + url: "https://github.com/pypa/virtualenv.git" + revision: "" + path: "" + dependency_graphs: + PIP: + packages: + - "PyPI::annotated-types:0.7.0" + - "PyPI::anyio:4.12.0" + - "PyPI::argcomplete:3.6.3" + - "PyPI::black:25.12.0" + - "PyPI::certifi:2025.11.12" + - "PyPI::cfgv:3.5.0" + - "PyPI::click:8.3.1" + - "PyPI::datamodel-code-generator:0.46.0" + - "PyPI::distlib:0.4.0" + - "PyPI::exceptiongroup:1.3.1" + - "PyPI::filelock:3.20.1" + - "PyPI::genson:1.3.0" + - "PyPI::h11:0.16.0" + - "PyPI::httpcore:1.0.9" + - "PyPI::httpx:0.28.1" + - "PyPI::identify:2.6.15" + - "PyPI::idna:3.11" + - "PyPI::inflect:7.5.0" + - "PyPI::iniconfig:2.3.0" + - "PyPI::isort:7.0.0" + - "PyPI::jinja2:3.1.6" + - "PyPI::markdown-it-py:4.0.0" + - "PyPI::markupsafe:3.0.3" + - "PyPI::mdurl:0.1.2" + - "PyPI::more-itertools:10.8.0" + - "PyPI::mypy-extensions:1.1.0" + - "PyPI::nodeenv:1.10.0" + - "PyPI::packaging:25.0" + - "PyPI::pathspec:0.12.1" + - "PyPI::platformdirs:4.5.1" + - "PyPI::pluggy:1.6.0" + - "PyPI::pre-commit:4.5.1" + - "PyPI::pycodestyle:2.14.0" + - "PyPI::pydantic-core:2.41.5" + - "PyPI::pydantic:2.12.5" + - "PyPI::pygments:2.19.2" + - "PyPI::pyrefly:0.46.0" + - "PyPI::pytest:9.0.2" + - "PyPI::pytokens:0.3.0" + - "PyPI::pyyaml:6.0.3" + - "PyPI::rich:14.2.0" + - "PyPI::ruff:0.14.10" + - "PyPI::tomli:2.3.0" + - "PyPI::typeguard:4.4.4" + - "PyPI::types-pyyaml:6.0.12.20250915" + - "PyPI::typing-extensions:4.15.0" + - "PyPI::typing-inspection:0.4.2" + - "PyPI::virtualenv:20.35.4" + scopes: + :requirements.txt:2d51ebb6a95f7064b0716cb1743f9cb4de754b44:install: + - root: 7 + - root: 9 + - root: 14 + - root: 31 + - root: 32 + - root: 36 + - root: 37 + - root: 40 + - root: 41 + - root: 42 + - root: 44 + nodes: + - pkg: 2 + - pkg: 6 + - pkg: 25 + - pkg: 27 + - pkg: 28 + - pkg: 29 + - pkg: 38 + - pkg: 3 + - pkg: 11 + - pkg: 24 + - pkg: 45 + - pkg: 43 + - pkg: 17 + - pkg: 19 + - pkg: 22 + - pkg: 20 + - {} + - pkg: 33 + - pkg: 46 + - pkg: 34 + - pkg: 39 + - pkg: 7 + - pkg: 9 + - pkg: 16 + - pkg: 1 + - pkg: 4 + - pkg: 12 + - pkg: 13 + - pkg: 14 + - pkg: 5 + - pkg: 15 + - pkg: 26 + - pkg: 8 + - pkg: 10 + - pkg: 47 + - pkg: 31 + - pkg: 32 + - pkg: 36 + - pkg: 18 + - pkg: 30 + - pkg: 35 + - pkg: 37 + - pkg: 23 + - pkg: 21 + - pkg: 40 + - pkg: 41 + - pkg: 42 + - pkg: 44 + edges: + - from: 7 + to: 1 + - from: 7 + to: 2 + - from: 7 + to: 3 + - from: 7 + to: 4 + - from: 7 + to: 5 + - from: 7 + to: 6 + - from: 11 + to: 10 + - from: 12 + to: 9 + - from: 12 + to: 11 + - from: 15 + to: 14 + - from: 17 + to: 10 + - from: 18 + to: 10 + - from: 19 + to: 10 + - from: 19 + to: 16 + - from: 19 + to: 17 + - from: 19 + to: 18 + - from: 21 + to: 0 + - from: 21 + to: 3 + - from: 21 + to: 7 + - from: 21 + to: 8 + - from: 21 + to: 12 + - from: 21 + to: 13 + - from: 21 + to: 15 + - from: 21 + to: 19 + - from: 21 + to: 20 + - from: 24 + to: 23 + - from: 27 + to: 25 + - from: 27 + to: 26 + - from: 28 + to: 23 + - from: 28 + to: 24 + - from: 28 + to: 25 + - from: 28 + to: 27 + - from: 34 + to: 5 + - from: 34 + to: 32 + - from: 34 + to: 33 + - from: 35 + to: 20 + - from: 35 + to: 29 + - from: 35 + to: 30 + - from: 35 + to: 31 + - from: 35 + to: 34 + - from: 41 + to: 3 + - from: 41 + to: 38 + - from: 41 + to: 39 + - from: 41 + to: 40 + - from: 43 + to: 42 + - from: 44 + to: 40 + - from: 44 + to: 43 +scanner: null +advisor: null +evaluator: null +resolved_configuration: + package_curations: + - provider: + id: "DefaultDir" + curations: + - id: "PyPI::packaging:" + curations: + comment: "Mapping declared license based on\nhttps://github.com/pypa/packaging/blob/20.9/LICENSE,\n\ + https://github.com/pypa/packaging/blob/20.9/LICENSE.BSD,\nhttps://github.com/pypa/packaging/blob/20.9/LICENSE.APACHE\ + \ and\nhttps://github.com/pypa/packaging/blob/20.9/setup.py#L56-L57.\n" + declared_license_mapping: + Apache Software License: "Apache-2.0 OR BSD-2-Clause" + BSD License: "Apache-2.0 OR BSD-2-Clause" + - id: "PyPI::markupsafe:" + curations: + comment: "Mapping declared license based on\nhttps://github.com/pallets/markupsafe/blob/1.1.0/LICENSE.rst,\n\ + https://github.com/pallets/markupsafe/blob/1.1.0/setup.py#L62 and\nhttps://github.com/pallets/markupsafe/blob/1.1.0/setup.py#L73.\n" + declared_license_mapping: + BSD: "BSD-3-Clause" + BSD License: "BSD-3-Clause" + - id: "PyPI::pygments:" + curations: + comment: "Mapping declared license based on\nhttps://github.com/pygments/pygments/blob/2.16.1/LICENSE,\n\ + https://github.com/pygments/pygments/blob/2.16.1/pyproject.toml#L10 and\n\ + https://github.com/pygments/pygments/blob/2.16.1/pyproject.toml#L28.\n" + declared_license_mapping: + BSD License: "BSD-2-Clause" + - id: "PyPI::pluggy:1.6.0" + curations: + comment: "Repository moved to https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz" + source_artifact: + url: "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz" + hash: + value: "54391218af778acb006c2d915085d469" + algorithm: "MD5" + source_code_origins: + - "ARTIFACT" + - id: "PyPI::httpx:" + curations: + comment: "Mark by the scanner as UNMAPPED_DECLARED_LICENSE when it should\ + \ be BSD License The concluded license is 'BSD-3-Clause'." + declared_license_mapping: + BSD License: "BSD-3-Clause" + - id: "PyPI::idna:" + curations: + comment: "Mapping declared license based on\nhttps://github.com/kjd/idna/blob/v3.2/LICENSE.md,\n\ + https://github.com/kjd/idna/blob/v3.2/setup.py#L32 and\nhttps://github.com/kjd/idna/blob/v3.2/setup.py#L38.\n" + declared_license_mapping: + BSD License: "BSD-3-Clause" + - id: "PyPI::httpcore:1.0.9" + curations: + comment: "Concluded MIT license from https://github.com/encode/httpcore/blob/1.0.9/LICENSE.md" + concluded_license: "BSD-3-Clause" + declared_license_mapping: + BSD License: "BSD-3-Clause" + - id: "PyPI::jinja2:" + curations: + comment: "Mapping declared license based on\nhttps://github.com/pallets/jinja/blob/2.9.5/LICENSE,\n\ + https://github.com/pallets/jinja/blob/2.9.5/setup.py#L45 and\nhttps://github.com/pallets/jinja/blob/2.9.5/setup.py#L57.\n" + declared_license_mapping: + BSD: "BSD-3-Clause" + BSD License: "BSD-3-Clause" + - id: "PyPI::pycodestyle:2.14.0" + curations: + comment: "Repository moved to https://files.pythonhosted.org/packages/11/e0/abfd2a0d2efe47670df87f3e3a0e2edda42f055053c85361f19c0e2c1ca8/pycodestyle-2.14.0.tar.gz" + source_artifact: + url: "https://files.pythonhosted.org/packages/11/e0/abfd2a0d2efe47670df87f3e3a0e2edda42f055053c85361f19c0e2c1ca8/pycodestyle-2.14.0.tar.gz" + hash: + value: "d6dfb0c33b62be4c14ad9f447f6e0d61" + algorithm: "MD5" + source_code_origins: + - "ARTIFACT" + - id: "PyPI::types-pyyaml:6.0.12.20250915" + curations: + comment: "Repository moved to https://files.pythonhosted.org/packages/7e/69/3c51b36d04da19b92f9e815be12753125bd8bc247ba0470a982e6979e71c/types_pyyaml-6.0.12.20250915.tar.gz" + source_artifact: + url: "https://files.pythonhosted.org/packages/7e/69/3c51b36d04da19b92f9e815be12753125bd8bc247ba0470a982e6979e71c/types_pyyaml-6.0.12.20250915.tar.gz" + hash: + value: "f248b64422846c25626c6287d5d13355" + algorithm: "MD5" + source_code_origins: + - "ARTIFACT" + - provider: + id: "DefaultFile" + curations: [] diff --git a/tests/data/ort_configuration_reference.yml b/tests/data/ort_configuration_reference.yml new file mode 100644 index 0000000..3f90162 --- /dev/null +++ b/tests/data/ort_configuration_reference.yml @@ -0,0 +1,393 @@ +# Copyright (C) 2022 The ORT Project Copyright Holders +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# License-Filename: LICENSE + +# A reference configuration file containing all possible ORT configuration options. Some of those options are mutually +# exclusive, so this file is only used to show all options and to validate the configuration. + +ort: + allowedProcessEnvironmentVariableNames: + - PASSPORT + - USER_HOME + deniedProcessEnvironmentVariablesSubstrings: + - PASS + - SECRET + - TOKEN + - USER + + enableRepositoryPackageConfigurations: true + enableRepositoryPackageCurations: true + + # Force overwriting of any existing output files. + forceOverwrite: true + + # License fact providers, ordered from highest to lowest priority. + licenseFactProviders: + SPDX: {} + ScanCode: + options: + scanCodeLicenseTextDir: '/path/to/scancode/license/text/dir' + DefaultDir: {} + Dir: + options: + licenseTextDir: '/path/to/license/text/dir' + + licenseFilePatterns: + licenseFilenames: ['license*'] + noticeFilenames: ['notice*'] + patentFilenames: ['patents'] + otherLicenseFilenames: ['readme*'] + + # Package configurations have to be unique by ID and provenance. Ensure that different providers do not provide + # configurations for the same package, see https://github.com/oss-review-toolkit/ort/issues/6972 for details. + packageConfigurationProviders: + - type: DefaultDir + - type: Dir + id: SomeConfigDir + options: + path: '/some-path/' + mustExist: true + - type: OrtConfig + + # Package curation providers are listed from highest to lowest priority. Technically, they are applied in reverse + # order: The provider with the highest priority is applied last, so it can overwrite any previously applied curations. + packageCurationProviders: + - type: DefaultFile + - type: DefaultDir + - type: File + id: SomeCurationsFile + options: + path: '/some-path/curations.yml' + mustExist: true + - type: File + id: SomeCurationsDir + options: + path: '/some-path/curations-dir' + mustExist: false + - type: OrtConfig + enabled: '${USE_ORT_CONFIG_CURATIONS:-true}' + - type: ClearlyDefined + options: + serverUrl: 'https://api.clearlydefined.io' + minTotalLicenseScore: 80 + - type: Spring + enabled: false + + severeIssueThreshold: ERROR + severeRuleViolationThreshold: ERROR + + analyzer: + allowDynamicVersions: true + + # A list of enabled package managers. + enabledPackageManagers: [Gradle] + + # A list of disabled package managers. Disabling a package manager here overrides enabling it in + # `enabledPackageManagers`. + disabledPackageManagers: [Maven, NPM] + + # A flag to control whether excluded scopes and paths should be skipped during the analysis. + skipExcluded: true + + packageManagers: + Gradle: + # A list of package manager names that this package manager must run after. For example, this can be used if + # another package manager generates files that this package manager requires to run correctly. + mustRunAfter: [NPM] + + GradleInspector: + options: + # An optional path to the Java home to use for Gradle project analysis. By default the Java version that ORT + # itself is run with will be used. + javaHome: "/path/to/java/home" + + Yarn2: + options: + # If set to true, disable verification of HTTPS certificate of remote registries. Useful when using a proxy to + # intercept requests to the registry. + disableRegistryCertificateVerification: false + + Conan: + options: + # Holds a name of the lockfile. Required if allowDynamicVersions = false. + # The lockfile should be located in the same directory as the conanfile.py or conanfile.txt. + lockfileName: "lockfile.lock" + + # If true, the Conan package manager with call a command called "conan2" instead of "conan". + useConan2: true + + advisor: + # A flag to control whether excluded scopes and paths should be skipped when giving the advice. + skipExcluded: true + + config: + BlackDuck: + options: + serverUrl: 'server-url' + secrets: + apiToken: 'token' + + OssIndex: + options: + serverUrl: 'https://ossindex.sonatype.org/' + secrets: + username: username + password: password + + OSV: + options: + serverUrl: 'https://api.osv.dev' + + VulnerableCode: + options: + serverUrl: 'http://localhost:8000' + readTimeout: 40 + secrets: + apiKey: 0123456789012345678901234567890123456789 + + downloader: + allowMovingRevisions: true + + # Only used if the '--license-classifications-file' option is specified. + includedLicenseCategories: + - 'category-a' + - 'category-b' + + # A flag to control whether excluded scopes and paths should be skipped during the download. + skipExcluded: true + + sourceCodeOrigins: [VCS, ARTIFACT] + + scanner: + skipConcluded: true + skipExcluded: true + + archive: + enabled: true + + fileStorage: + localFileStorage: + directory: ~/.ort/scanner/archive + compression: false + + postgresStorage: + connection: + url: 'jdbc:postgresql://your-postgresql-server:5444/your-database' + schema: public + username: username + password: password + sslmode: require + sslcert: /defaultdir/postgresql.crt + sslkey: /defaultdir/postgresql.pk8 + sslrootcert: /defaultdir/root.crt + connectionTimeout: 30000 + idleTimeout: 600000 + keepaliveTime: 0 + maxLifetime: 1800000 + maximumPoolSize: 10 + minimumIdle: 600000 + + # Map scanner license findings to valid SPDX licenses. Note that these mappings are only applied in new scans, + # stored scan results are not affected. + detectedLicenseMapping: + BSD (Three Clause License): 'BSD-3-clause' + LicenseRef-scancode-generic-cla: 'NOASSERTION' + + fileListStorage: + fileStorage: + localFileStorage: + directory: ~/.ort/scanner/file-lists + compression: false + + postgresStorage: + connection: + url: 'jdbc:postgresql://your-postgresql-server:5444/your-database' + schema: public + username: username + password: password + sslmode: require + sslcert: /defaultdir/postgresql.crt + sslkey: /defaultdir/postgresql.pk8 + sslrootcert: /defaultdir/root.crt + connectionTimeout: 30000 + idleTimeout: 600000 + keepaliveTime: 0 + maxLifetime: 1800000 + maximumPoolSize: 10 + minimumIdle: 600000 + + config: + # A map from scanner plugin types to the plugin configuration. + ScanCode: + options: + # Command line options that affect the ScanCode output. If changed, stored scan results that were created with + # different options are not reused. + commandLine: '--copyright,--license,--info,--strip-root,--timeout,300' + + # Command line options that do not affect the ScanCode output. + commandLineNonConfig: '--processes,4' + + # Use per-file license findings instead of per-line ones. + preferFileLicense: false + + # Criteria for matching stored scan results. These can be configured for any scanner that uses semantic + # versioning. Note that the 'maxVersion' is exclusive and not part of the range of accepted versions. + minVersion: '3.2.1-rc2' + maxVersion: '32.0.0' + + FossId: + options: + serverUrl: 'https://fossid.example.com/instance/' + + projectName: 'My Project' + namingScanPattern: '#projectName_#repositoryName_#currentTimestamp_#deltaTag_#branch' + + waitForResult: false + + keepFailedScans: false + deltaScans: true + deltaScanLimit: 10 + + detectLicenseDeclarations: true + detectCopyrightStatements: true + + timeout: 60 + + urlMappings: "https://my-repo.example.org(?.*) -> ssh://my-mapped-repo.example.org${repoPath}" + + sensitivity: 10 + + treatPendingIdentificationsAsError: false + + secrets: + user: user + apiKey: XYZ + + SCANOSS: + options: + apiUrl: 'https://api.osskb.org/' + secrets: + apiKey: 'your API key' + + storages: + local: + backend: + localFileStorage: + directory: ~/.ort/scanner/results + compression: false + + http: + backend: + httpFileStorage: + url: 'https://your-http-server' + query: '?username=user&password=123' + headers: + key1: value1 + key2: value2 + + aws: + backend: + s3FileStorage: + accessKeyId: "accessKey" + awsRegion: "us-east-1" + bucketName: "ort-scan-results" + compression: false + customEndpoint: "http://localhost:4567" + pathStyleAccess: false # Required for some non-AWS S3 providers that do not support DNS style access. + secretAccessKey: "secret" + + clearlyDefined: + serverUrl: 'https://api.clearlydefined.io' + + postgres: + connection: + url: 'jdbc:postgresql://your-postgresql-server:5444/your-database' + schema: public + username: username + password: password + sslmode: require + sslcert: /defaultdir/postgresql.crt + sslkey: /defaultdir/postgresql.pk8 + sslrootcert: /defaultdir/root.crt + connectionTimeout: 30000 + idleTimeout: 600000 + keepaliveTime: 0 + maxLifetime: 1800000 + maximumPoolSize: 10 + minimumIdle: 600000 + type: PROVENANCE_BASED + + # Storage readers are listed from highest to lower priority, i.e. the first match wins. + storageReaders: [local, postgres, http, aws, clearlyDefined] + + # For storage writers no priority is implied by the order; scan results are stored for all writers. + storageWriters: [postgres] + + ignorePatterns: ['**/META-INF/DEPENDENCIES'] + + provenanceStorage: + fileStorage: + localFileStorage: + directory: ~/.ort/scanner/provenance + compression: false + + postgresStorage: + connection: + url: 'jdbc:postgresql://your-postgresql-server:5444/your-database' + schema: public + username: username + password: password + sslmode: require + sslcert: /defaultdir/postgresql.crt + sslkey: /defaultdir/postgresql.pk8 + sslrootcert: /defaultdir/root.crt + connectionTimeout: 30000 + idleTimeout: 600000 + keepaliveTime: 0 + maxLifetime: 1800000 + maximumPoolSize: 10 + minimumIdle: 600000 + + reporter: + config: + CycloneDx: + options: + schema.version: 1.6 + + FossId: + options: + serverUrl: 'https://fossid.example.com/instance/' + secrets: + user: user + apiKey: XYZ + + CtrlXAutomation: + options: + licenseCategoriesToInclude: 'include-in-disclosure-document' + + notifier: + mail: + hostName: 'localhost' + username: user + password: password + port: 465 + useSsl: true + fromAddress: 'no-reply@oss-review-toolkit.org' + + jira: + host: 'http://localhost' + username: user + password: password diff --git a/uv.lock b/uv.lock index afdfdb4..3f478ba 100644 --- a/uv.lock +++ b/uv.lock @@ -13,17 +13,16 @@ wheels = [ [[package]] name = "anyio" -version = "4.11.0" +version = "4.12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "idna" }, - { name = "sniffio" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c6/78/7d432127c41b50bccba979505f272c16cbcadcc33645d5fa3a738110ae75/anyio-4.11.0.tar.gz", hash = "sha256:82a8d0b81e318cc5ce71a5f1f8b5c4e63619620b63141ef8c995fa0db95a57c4", size = 219094, upload-time = "2025-09-23T09:19:12.58Z" } +sdist = { url = "https://files.pythonhosted.org/packages/96/f0/5eb65b2bb0d09ac6776f2eb54adee6abe8228ea05b20a5ad0e4945de8aac/anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703", size = 228685, upload-time = "2026-01-06T11:45:21.246Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/15/b3/9b1a8074496371342ec1e796a96f99c82c945a339cd81a8e73de28b4cf9e/anyio-4.11.0-py3-none-any.whl", hash = "sha256:0287e96f4d26d4149305414d4e3bc32f0dcd0862365a4bddea19d7a1ec38c4fc", size = 109097, upload-time = "2025-09-23T09:19:10.601Z" }, + { url = "https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", size = 113592, upload-time = "2026-01-06T11:45:19.497Z" }, ] [[package]] @@ -37,7 +36,7 @@ wheels = [ [[package]] name = "black" -version = "25.9.0" +version = "26.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -49,55 +48,64 @@ dependencies = [ { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4b/43/20b5c90612d7bdb2bdbcceeb53d588acca3bb8f0e4c5d5c751a2c8fdd55a/black-25.9.0.tar.gz", hash = "sha256:0474bca9a0dd1b51791fcc507a4e02078a1c63f6d4e4ae5544b9848c7adfb619", size = 648393, upload-time = "2025-09-19T00:27:37.758Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/25/40/dbe31fc56b218a858c8fc6f5d8d3ba61c1fa7e989d43d4a4574b8b992840/black-25.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ce41ed2614b706fd55fd0b4a6909d06b5bab344ffbfadc6ef34ae50adba3d4f7", size = 1715605, upload-time = "2025-09-19T00:36:13.483Z" }, - { url = "https://files.pythonhosted.org/packages/92/b2/f46800621200eab6479b1f4c0e3ede5b4c06b768e79ee228bc80270bcc74/black-25.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ab0ce111ef026790e9b13bd216fa7bc48edd934ffc4cbf78808b235793cbc92", size = 1571829, upload-time = "2025-09-19T00:32:42.13Z" }, - { url = "https://files.pythonhosted.org/packages/4e/64/5c7f66bd65af5c19b4ea86062bb585adc28d51d37babf70969e804dbd5c2/black-25.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f96b6726d690c96c60ba682955199f8c39abc1ae0c3a494a9c62c0184049a713", size = 1631888, upload-time = "2025-09-19T00:30:54.212Z" }, - { url = "https://files.pythonhosted.org/packages/3b/64/0b9e5bfcf67db25a6eef6d9be6726499a8a72ebab3888c2de135190853d3/black-25.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:d119957b37cc641596063cd7db2656c5be3752ac17877017b2ffcdb9dfc4d2b1", size = 1327056, upload-time = "2025-09-19T00:31:08.877Z" }, - { url = "https://files.pythonhosted.org/packages/b7/f4/7531d4a336d2d4ac6cc101662184c8e7d068b548d35d874415ed9f4116ef/black-25.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:456386fe87bad41b806d53c062e2974615825c7a52159cde7ccaeb0695fa28fa", size = 1698727, upload-time = "2025-09-19T00:31:14.264Z" }, - { url = "https://files.pythonhosted.org/packages/28/f9/66f26bfbbf84b949cc77a41a43e138d83b109502cd9c52dfc94070ca51f2/black-25.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a16b14a44c1af60a210d8da28e108e13e75a284bf21a9afa6b4571f96ab8bb9d", size = 1555679, upload-time = "2025-09-19T00:31:29.265Z" }, - { url = "https://files.pythonhosted.org/packages/bf/59/61475115906052f415f518a648a9ac679d7afbc8da1c16f8fdf68a8cebed/black-25.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aaf319612536d502fdd0e88ce52d8f1352b2c0a955cc2798f79eeca9d3af0608", size = 1617453, upload-time = "2025-09-19T00:30:42.24Z" }, - { url = "https://files.pythonhosted.org/packages/7f/5b/20fd5c884d14550c911e4fb1b0dae00d4abb60a4f3876b449c4d3a9141d5/black-25.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:c0372a93e16b3954208417bfe448e09b0de5cc721d521866cd9e0acac3c04a1f", size = 1333655, upload-time = "2025-09-19T00:30:56.715Z" }, - { url = "https://files.pythonhosted.org/packages/fb/8e/319cfe6c82f7e2d5bfb4d3353c6cc85b523d677ff59edc61fdb9ee275234/black-25.9.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1b9dc70c21ef8b43248f1d86aedd2aaf75ae110b958a7909ad8463c4aa0880b0", size = 1742012, upload-time = "2025-09-19T00:33:08.678Z" }, - { url = "https://files.pythonhosted.org/packages/94/cc/f562fe5d0a40cd2a4e6ae3f685e4c36e365b1f7e494af99c26ff7f28117f/black-25.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8e46eecf65a095fa62e53245ae2795c90bdecabd53b50c448d0a8bcd0d2e74c4", size = 1581421, upload-time = "2025-09-19T00:35:25.937Z" }, - { url = "https://files.pythonhosted.org/packages/84/67/6db6dff1ebc8965fd7661498aea0da5d7301074b85bba8606a28f47ede4d/black-25.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9101ee58ddc2442199a25cb648d46ba22cd580b00ca4b44234a324e3ec7a0f7e", size = 1655619, upload-time = "2025-09-19T00:30:49.241Z" }, - { url = "https://files.pythonhosted.org/packages/10/10/3faef9aa2a730306cf469d76f7f155a8cc1f66e74781298df0ba31f8b4c8/black-25.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:77e7060a00c5ec4b3367c55f39cf9b06e68965a4f2e61cecacd6d0d9b7ec945a", size = 1342481, upload-time = "2025-09-19T00:31:29.625Z" }, - { url = "https://files.pythonhosted.org/packages/48/99/3acfea65f5e79f45472c45f87ec13037b506522719cd9d4ac86484ff51ac/black-25.9.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0172a012f725b792c358d57fe7b6b6e8e67375dd157f64fa7a3097b3ed3e2175", size = 1742165, upload-time = "2025-09-19T00:34:10.402Z" }, - { url = "https://files.pythonhosted.org/packages/3a/18/799285282c8236a79f25d590f0222dbd6850e14b060dfaa3e720241fd772/black-25.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3bec74ee60f8dfef564b573a96b8930f7b6a538e846123d5ad77ba14a8d7a64f", size = 1581259, upload-time = "2025-09-19T00:32:49.685Z" }, - { url = "https://files.pythonhosted.org/packages/f1/ce/883ec4b6303acdeca93ee06b7622f1fa383c6b3765294824165d49b1a86b/black-25.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b756fc75871cb1bcac5499552d771822fd9db5a2bb8db2a7247936ca48f39831", size = 1655583, upload-time = "2025-09-19T00:30:44.505Z" }, - { url = "https://files.pythonhosted.org/packages/21/17/5c253aa80a0639ccc427a5c7144534b661505ae2b5a10b77ebe13fa25334/black-25.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:846d58e3ce7879ec1ffe816bb9df6d006cd9590515ed5d17db14e17666b2b357", size = 1343428, upload-time = "2025-09-19T00:32:13.839Z" }, - { url = "https://files.pythonhosted.org/packages/1b/46/863c90dcd3f9d41b109b7f19032ae0db021f0b2a81482ba0a1e28c84de86/black-25.9.0-py3-none-any.whl", hash = "sha256:474b34c1342cdc157d307b56c4c65bce916480c4a8f6551fdc6bf9b486a7c4ae", size = 203363, upload-time = "2025-09-19T00:27:35.724Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/13/88/560b11e521c522440af991d46848a2bde64b5f7202ec14e1f46f9509d328/black-26.1.0.tar.gz", hash = "sha256:d294ac3340eef9c9eb5d29288e96dc719ff269a88e27b396340459dd85da4c58", size = 658785, upload-time = "2026-01-18T04:50:11.993Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/1b/523329e713f965ad0ea2b7a047eeb003007792a0353622ac7a8cb2ee6fef/black-26.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ca699710dece84e3ebf6e92ee15f5b8f72870ef984bf944a57a777a48357c168", size = 1849661, upload-time = "2026-01-18T04:59:12.425Z" }, + { url = "https://files.pythonhosted.org/packages/14/82/94c0640f7285fa71c2f32879f23e609dd2aa39ba2641f395487f24a578e7/black-26.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5e8e75dabb6eb83d064b0db46392b25cabb6e784ea624219736e8985a6b3675d", size = 1689065, upload-time = "2026-01-18T04:59:13.993Z" }, + { url = "https://files.pythonhosted.org/packages/f0/78/474373cbd798f9291ed8f7107056e343fd39fef42de4a51c7fd0d360840c/black-26.1.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eb07665d9a907a1a645ee41a0df8a25ffac8ad9c26cdb557b7b88eeeeec934e0", size = 1751502, upload-time = "2026-01-18T04:59:15.971Z" }, + { url = "https://files.pythonhosted.org/packages/29/89/59d0e350123f97bc32c27c4d79563432d7f3530dca2bff64d855c178af8b/black-26.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:7ed300200918147c963c87700ccf9966dceaefbbb7277450a8d646fc5646bf24", size = 1400102, upload-time = "2026-01-18T04:59:17.8Z" }, + { url = "https://files.pythonhosted.org/packages/e1/bc/5d866c7ae1c9d67d308f83af5462ca7046760158bbf142502bad8f22b3a1/black-26.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:c5b7713daea9bf943f79f8c3b46f361cc5229e0e604dcef6a8bb6d1c37d9df89", size = 1207038, upload-time = "2026-01-18T04:59:19.543Z" }, + { url = "https://files.pythonhosted.org/packages/30/83/f05f22ff13756e1a8ce7891db517dbc06200796a16326258268f4658a745/black-26.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3cee1487a9e4c640dc7467aaa543d6c0097c391dc8ac74eb313f2fbf9d7a7cb5", size = 1831956, upload-time = "2026-01-18T04:59:21.38Z" }, + { url = "https://files.pythonhosted.org/packages/7d/f2/b2c570550e39bedc157715e43927360312d6dd677eed2cc149a802577491/black-26.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d62d14ca31c92adf561ebb2e5f2741bf8dea28aef6deb400d49cca011d186c68", size = 1672499, upload-time = "2026-01-18T04:59:23.257Z" }, + { url = "https://files.pythonhosted.org/packages/7a/d7/990d6a94dc9e169f61374b1c3d4f4dd3037e93c2cc12b6f3b12bc663aa7b/black-26.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fb1dafbbaa3b1ee8b4550a84425aac8874e5f390200f5502cf3aee4a2acb2f14", size = 1735431, upload-time = "2026-01-18T04:59:24.729Z" }, + { url = "https://files.pythonhosted.org/packages/36/1c/cbd7bae7dd3cb315dfe6eeca802bb56662cc92b89af272e014d98c1f2286/black-26.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:101540cb2a77c680f4f80e628ae98bd2bd8812fb9d72ade4f8995c5ff019e82c", size = 1400468, upload-time = "2026-01-18T04:59:27.381Z" }, + { url = "https://files.pythonhosted.org/packages/59/b1/9fe6132bb2d0d1f7094613320b56297a108ae19ecf3041d9678aec381b37/black-26.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:6f3977a16e347f1b115662be07daa93137259c711e526402aa444d7a88fdc9d4", size = 1207332, upload-time = "2026-01-18T04:59:28.711Z" }, + { url = "https://files.pythonhosted.org/packages/f5/13/710298938a61f0f54cdb4d1c0baeb672c01ff0358712eddaf29f76d32a0b/black-26.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6eeca41e70b5f5c84f2f913af857cf2ce17410847e1d54642e658e078da6544f", size = 1878189, upload-time = "2026-01-18T04:59:30.682Z" }, + { url = "https://files.pythonhosted.org/packages/79/a6/5179beaa57e5dbd2ec9f1c64016214057b4265647c62125aa6aeffb05392/black-26.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dd39eef053e58e60204f2cdf059e2442e2eb08f15989eefe259870f89614c8b6", size = 1700178, upload-time = "2026-01-18T04:59:32.387Z" }, + { url = "https://files.pythonhosted.org/packages/8c/04/c96f79d7b93e8f09d9298b333ca0d31cd9b2ee6c46c274fd0f531de9dc61/black-26.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9459ad0d6cd483eacad4c6566b0f8e42af5e8b583cee917d90ffaa3778420a0a", size = 1777029, upload-time = "2026-01-18T04:59:33.767Z" }, + { url = "https://files.pythonhosted.org/packages/49/f9/71c161c4c7aa18bdda3776b66ac2dc07aed62053c7c0ff8bbda8c2624fe2/black-26.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:a19915ec61f3a8746e8b10adbac4a577c6ba9851fa4a9e9fbfbcf319887a5791", size = 1406466, upload-time = "2026-01-18T04:59:35.177Z" }, + { url = "https://files.pythonhosted.org/packages/4a/8b/a7b0f974e473b159d0ac1b6bcefffeb6bec465898a516ee5cc989503cbc7/black-26.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:643d27fb5facc167c0b1b59d0315f2674a6e950341aed0fc05cf307d22bf4954", size = 1216393, upload-time = "2026-01-18T04:59:37.18Z" }, + { url = "https://files.pythonhosted.org/packages/79/04/fa2f4784f7237279332aa735cdfd5ae2e7730db0072fb2041dadda9ae551/black-26.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ba1d768fbfb6930fc93b0ecc32a43d8861ded16f47a40f14afa9bb04ab93d304", size = 1877781, upload-time = "2026-01-18T04:59:39.054Z" }, + { url = "https://files.pythonhosted.org/packages/cf/ad/5a131b01acc0e5336740a039628c0ab69d60cf09a2c87a4ec49f5826acda/black-26.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2b807c240b64609cb0e80d2200a35b23c7df82259f80bef1b2c96eb422b4aac9", size = 1699670, upload-time = "2026-01-18T04:59:41.005Z" }, + { url = "https://files.pythonhosted.org/packages/da/7c/b05f22964316a52ab6b4265bcd52c0ad2c30d7ca6bd3d0637e438fc32d6e/black-26.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1de0f7d01cc894066a1153b738145b194414cc6eeaad8ef4397ac9abacf40f6b", size = 1775212, upload-time = "2026-01-18T04:59:42.545Z" }, + { url = "https://files.pythonhosted.org/packages/a6/a3/e8d1526bea0446e040193185353920a9506eab60a7d8beb062029129c7d2/black-26.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:91a68ae46bf07868963671e4d05611b179c2313301bd756a89ad4e3b3db2325b", size = 1409953, upload-time = "2026-01-18T04:59:44.357Z" }, + { url = "https://files.pythonhosted.org/packages/c7/5a/d62ebf4d8f5e3a1daa54adaab94c107b57be1b1a2f115a0249b41931e188/black-26.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:be5e2fe860b9bd9edbf676d5b60a9282994c03fbbd40fe8f5e75d194f96064ca", size = 1217707, upload-time = "2026-01-18T04:59:45.719Z" }, + { url = "https://files.pythonhosted.org/packages/6a/83/be35a175aacfce4b05584ac415fd317dd6c24e93a0af2dcedce0f686f5d8/black-26.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:9dc8c71656a79ca49b8d3e2ce8103210c9481c57798b48deeb3a8bb02db5f115", size = 1871864, upload-time = "2026-01-18T04:59:47.586Z" }, + { url = "https://files.pythonhosted.org/packages/a5/f5/d33696c099450b1274d925a42b7a030cd3ea1f56d72e5ca8bbed5f52759c/black-26.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b22b3810451abe359a964cc88121d57f7bce482b53a066de0f1584988ca36e79", size = 1701009, upload-time = "2026-01-18T04:59:49.443Z" }, + { url = "https://files.pythonhosted.org/packages/1b/87/670dd888c537acb53a863bc15abbd85b22b429237d9de1b77c0ed6b79c42/black-26.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:53c62883b3f999f14e5d30b5a79bd437236658ad45b2f853906c7cbe79de00af", size = 1767806, upload-time = "2026-01-18T04:59:50.769Z" }, + { url = "https://files.pythonhosted.org/packages/fe/9c/cd3deb79bfec5bcf30f9d2100ffeec63eecce826eb63e3961708b9431ff1/black-26.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:f016baaadc423dc960cdddf9acae679e71ee02c4c341f78f3179d7e4819c095f", size = 1433217, upload-time = "2026-01-18T04:59:52.218Z" }, + { url = "https://files.pythonhosted.org/packages/4e/29/f3be41a1cf502a283506f40f5d27203249d181f7a1a2abce1c6ce188035a/black-26.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:66912475200b67ef5a0ab665011964bf924745103f51977a78b4fb92a9fc1bf0", size = 1245773, upload-time = "2026-01-18T04:59:54.457Z" }, + { url = "https://files.pythonhosted.org/packages/e4/3d/51bdb3ecbfadfaf825ec0c75e1de6077422b4afa2091c6c9ba34fbfc0c2d/black-26.1.0-py3-none-any.whl", hash = "sha256:1054e8e47ebd686e078c0bb0eaf31e6ce69c966058d122f2c0c950311f9f3ede", size = 204010, upload-time = "2026-01-18T04:50:09.978Z" }, ] [[package]] name = "certifi" -version = "2025.10.5" +version = "2026.1.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4c/5b/b6ce21586237c77ce67d01dc5507039d444b630dd76611bbca2d8e5dcd91/certifi-2025.10.5.tar.gz", hash = "sha256:47c09d31ccf2acf0be3f701ea53595ee7e0b8fa08801c6624be771df09ae7b43", size = 164519, upload-time = "2025-10-05T04:12:15.808Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", size = 154268, upload-time = "2026-01-04T02:42:41.825Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/37/af0d2ef3967ac0d6113837b44a4f0bfe1328c2b9763bd5b1744520e5cfed/certifi-2025.10.5-py3-none-any.whl", hash = "sha256:0f212c2744a9bb6de0c56639a6f68afe01ecd92d91f14ae897c4fe7bbeeef0de", size = 163286, upload-time = "2025-10-05T04:12:14.03Z" }, + { url = "https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", size = 152900, upload-time = "2026-01-04T02:42:40.15Z" }, ] [[package]] name = "cfgv" -version = "3.4.0" +version = "3.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114, upload-time = "2023-08-12T20:38:17.776Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4e/b5/721b8799b04bf9afe054a3899c6cf4e880fcf8563cc71c15610242490a0c/cfgv-3.5.0.tar.gz", hash = "sha256:d5b1034354820651caa73ede66a6294d6e95c1b00acc5e9b098e917404669132", size = 7334, upload-time = "2025-11-19T20:55:51.612Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload-time = "2023-08-12T20:38:16.269Z" }, + { url = "https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl", hash = "sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0", size = 7445, upload-time = "2025-11-19T20:55:50.744Z" }, ] [[package]] name = "click" -version = "8.3.0" +version = "8.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/46/61/de6cd827efad202d7057d93e0fed9294b96952e188f7384832791c7b2254/click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4", size = 276943, upload-time = "2025-09-18T17:32:23.696Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/db/d3/9dcc0f5797f070ec8edf30fbadfb200e71d9db6b84d211e3b2085a7589a0/click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc", size = 107295, upload-time = "2025-09-18T17:32:22.42Z" }, + { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, ] [[package]] @@ -111,7 +119,7 @@ wheels = [ [[package]] name = "datamodel-code-generator" -version = "0.35.0" +version = "0.53.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "argcomplete" }, @@ -125,9 +133,9 @@ dependencies = [ { name = "pyyaml" }, { name = "tomli", marker = "python_full_version < '3.12'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/70/e1/dbf7c2edb1b1db1f4fd472ee92f985ec97d58902512013d9c4584108329c/datamodel_code_generator-0.35.0.tar.gz", hash = "sha256:46805fa2515d3871f6bfafce9aa63128e735a7a6a4cfcbf9c27b3794ee4ea846", size = 459915, upload-time = "2025-10-09T19:26:49.837Z" } +sdist = { url = "https://files.pythonhosted.org/packages/40/65/3802abca0291263862a16e032e984e61e4d0d30a344d9be97815721d64ff/datamodel_code_generator-0.53.0.tar.gz", hash = "sha256:af46b57ad78e6435873132c52843ef0ec7b768a591d3b9917d3409dfc1ab1c90", size = 809949, upload-time = "2026-01-12T18:14:05.459Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/95/ef/0ed17459fe6076219fcd45f69a0bb4bd1cb041b39095ca2946808a9b5f04/datamodel_code_generator-0.35.0-py3-none-any.whl", hash = "sha256:c356d1e4a555f86667a4262db03d4598a30caeda8f51786555fd269c8abb806b", size = 121436, upload-time = "2025-10-09T19:26:48.437Z" }, + { url = "https://files.pythonhosted.org/packages/ff/43/5dbb6fe09842e10062f94016ccb48c9613f2443253866de3d7b815713b4d/datamodel_code_generator-0.53.0-py3-none-any.whl", hash = "sha256:d1cc2abe79f99b8208c363f5f4b603c29290327ff4e3219a08c0fff45f42aff4", size = 258912, upload-time = "2026-01-12T18:14:02.737Z" }, ] [package.optional-dependencies] @@ -146,23 +154,23 @@ wheels = [ [[package]] name = "exceptiongroup" -version = "1.3.0" +version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0b/9f/a65090624ecf468cdca03533906e7c69ed7588582240cfe7cc9e770b50eb/exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88", size = 29749, upload-time = "2025-05-10T17:42:51.123Z" } +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/36/f4/c6e662dade71f56cd2f3735141b265c3c79293c109549c1e6933b0651ffc/exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10", size = 16674, upload-time = "2025-05-10T17:42:49.33Z" }, + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, ] [[package]] name = "filelock" -version = "3.20.0" +version = "3.20.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/58/46/0028a82567109b5ef6e4d2a1f04a583fb513e6cf9527fcdd09afd817deeb/filelock-3.20.0.tar.gz", hash = "sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4", size = 18922, upload-time = "2025-10-08T18:03:50.056Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/65/ce7f1b70157833bf3cb851b556a37d4547ceafc158aa9b34b36782f23696/filelock-3.20.3.tar.gz", hash = "sha256:18c57ee915c7ec61cff0ecf7f0f869936c7c30191bb0cf406f1341778d0834e1", size = 19485, upload-time = "2026-01-09T17:55:05.421Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/91/7216b27286936c16f5b4d0c530087e4a54eead683e6b0b73dd0c64844af6/filelock-3.20.0-py3-none-any.whl", hash = "sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2", size = 16054, upload-time = "2025-10-08T18:03:48.35Z" }, + { url = "https://files.pythonhosted.org/packages/b5/36/7fb70f04bf00bc646cd5bb45aa9eddb15e19437a28b8fb2b4a5249fac770/filelock-3.20.3-py3-none-any.whl", hash = "sha256:4b0dda527ee31078689fc205ec4f1c1bf7d56cf88b6dc9426c4f230e46c2dce1", size = 16701, upload-time = "2026-01-09T17:55:04.334Z" }, ] [[package]] @@ -213,11 +221,11 @@ wheels = [ [[package]] name = "identify" -version = "2.6.15" +version = "2.6.16" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ff/e7/685de97986c916a6d93b3876139e00eef26ad5bbbd61925d670ae8013449/identify-2.6.15.tar.gz", hash = "sha256:e4f4864b96c6557ef2a1e1c951771838f4edc9df3a72ec7118b338801b11c7bf", size = 99311, upload-time = "2025-10-02T17:43:40.631Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5b/8d/e8b97e6bd3fb6fb271346f7981362f1e04d6a7463abd0de79e1fda17c067/identify-2.6.16.tar.gz", hash = "sha256:846857203b5511bbe94d5a352a48ef2359532bc8f6727b5544077a0dcfb24980", size = 99360, upload-time = "2026-01-12T18:58:58.201Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/1c/e5fd8f973d4f375adb21565739498e2e9a1e54c858a97b9a8ccfdc81da9b/identify-2.6.15-py2.py3-none-any.whl", hash = "sha256:1181ef7608e00704db228516541eb83a88a9f94433a8c80bb9b5bd54b1d81757", size = 99183, upload-time = "2025-10-02T17:43:39.137Z" }, + { url = "https://files.pythonhosted.org/packages/b8/58/40fbbcefeda82364720eba5cf2270f98496bdfa19ea75b4cccae79c698e6/identify-2.6.16-py2.py3-none-any.whl", hash = "sha256:391ee4d77741d994189522896270b787aed8670389bfd60f326d677d64a6dfb0", size = 99202, upload-time = "2026-01-12T18:58:56.627Z" }, ] [[package]] @@ -253,11 +261,11 @@ wheels = [ [[package]] name = "isort" -version = "6.1.0" +version = "7.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1e/82/fa43935523efdfcce6abbae9da7f372b627b27142c3419fcf13bf5b0c397/isort-6.1.0.tar.gz", hash = "sha256:9b8f96a14cfee0677e78e941ff62f03769a06d412aabb9e2a90487b3b7e8d481", size = 824325, upload-time = "2025-10-01T16:26:45.027Z" } +sdist = { url = "https://files.pythonhosted.org/packages/63/53/4f3c058e3bace40282876f9b553343376ee687f3c35a525dc79dbd450f88/isort-7.0.0.tar.gz", hash = "sha256:5513527951aadb3ac4292a41a16cbc50dd1642432f5e8c20057d414bdafb4187", size = 805049, upload-time = "2025-10-11T13:30:59.107Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7f/cc/9b681a170efab4868a032631dea1e8446d8ec718a7f657b94d49d1a12643/isort-6.1.0-py3-none-any.whl", hash = "sha256:58d8927ecce74e5087aef019f778d4081a3b6c98f15a80ba35782ca8a2097784", size = 94329, upload-time = "2025-10-01T16:26:43.291Z" }, + { url = "https://files.pythonhosted.org/packages/7f/ed/e3705d6d02b4f7aea715a353c8ce193efd0b5db13e204df895d38734c244/isort-7.0.0-py3-none-any.whl", hash = "sha256:1bcabac8bc3c36c7fb7b98a76c8abb18e0f841a3ba81decac7691008592499c1", size = 94672, upload-time = "2025-10-11T13:30:57.665Z" }, ] [[package]] @@ -398,38 +406,38 @@ wheels = [ [[package]] name = "nodeenv" -version = "1.9.1" +version = "1.10.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload-time = "2024-06-04T18:44:11.171Z" } +sdist = { url = "https://files.pythonhosted.org/packages/24/bf/d1bda4f6168e0b2e9e5958945e01910052158313224ada5ce1fb2e1113b8/nodeenv-1.10.0.tar.gz", hash = "sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb", size = 55611, upload-time = "2025-12-20T14:08:54.006Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload-time = "2024-06-04T18:44:08.352Z" }, + { url = "https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl", hash = "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827", size = 23438, upload-time = "2025-12-20T14:08:52.782Z" }, ] [[package]] name = "packaging" -version = "25.0" +version = "26.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, + { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, ] [[package]] name = "pathspec" -version = "0.12.1" +version = "1.0.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/b2/bb8e495d5262bfec41ab5cb18f522f1012933347fb5d9e62452d446baca2/pathspec-1.0.3.tar.gz", hash = "sha256:bac5cf97ae2c2876e2d25ebb15078eb04d76e4b98921ee31c6f85ade8b59444d", size = 130841, upload-time = "2026-01-09T15:46:46.009Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, + { url = "https://files.pythonhosted.org/packages/32/2b/121e912bd60eebd623f873fd090de0e84f322972ab25a7f9044c056804ed/pathspec-1.0.3-py3-none-any.whl", hash = "sha256:e80767021c1cc524aa3fb14bedda9c34406591343cc42797b386ce7b9354fb6c", size = 55021, upload-time = "2026-01-09T15:46:44.652Z" }, ] [[package]] name = "platformdirs" -version = "4.5.0" +version = "4.5.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/61/33/9611380c2bdb1225fdef633e2a9610622310fed35ab11dac9620972ee088/platformdirs-4.5.0.tar.gz", hash = "sha256:70ddccdd7c99fc5942e9fc25636a8b34d04c24b335100223152c2803e4063312", size = 21632, upload-time = "2025-10-08T17:44:48.791Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/86/0248f086a84f01b37aaec0fa567b397df1a119f73c16f6c7a9aac73ea309/platformdirs-4.5.1.tar.gz", hash = "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda", size = 21715, upload-time = "2025-12-05T13:52:58.638Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/73/cb/ac7874b3e5d58441674fb70742e6c374b28b0c7cb988d37d991cde47166c/platformdirs-4.5.0-py3-none-any.whl", hash = "sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3", size = 18651, upload-time = "2025-10-08T17:44:47.223Z" }, + { url = "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31", size = 18731, upload-time = "2025-12-05T13:52:56.823Z" }, ] [[package]] @@ -443,7 +451,7 @@ wheels = [ [[package]] name = "pre-commit" -version = "4.3.0" +version = "4.5.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cfgv" }, @@ -452,9 +460,9 @@ dependencies = [ { name = "pyyaml" }, { name = "virtualenv" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ff/29/7cf5bbc236333876e4b41f56e06857a87937ce4bf91e117a6991a2dbb02a/pre_commit-4.3.0.tar.gz", hash = "sha256:499fe450cc9d42e9d58e606262795ecb64dd05438943c62b66f6a8673da30b16", size = 193792, upload-time = "2025-08-09T18:56:14.651Z" } +sdist = { url = "https://files.pythonhosted.org/packages/40/f1/6d86a29246dfd2e9b6237f0b5823717f60cad94d47ddc26afa916d21f525/pre_commit-4.5.1.tar.gz", hash = "sha256:eb545fcff725875197837263e977ea257a402056661f09dae08e4b149b030a61", size = 198232, upload-time = "2025-12-16T21:14:33.552Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/a5/987a405322d78a73b66e39e4a90e4ef156fd7141bf71df987e50717c321b/pre_commit-4.3.0-py2.py3-none-any.whl", hash = "sha256:2b0747ad7e6e967169136edffee14c16e148a778a54e4f967921aa1ebf2308d8", size = 220965, upload-time = "2025-08-09T18:56:13.192Z" }, + { url = "https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl", hash = "sha256:3b3afd891e97337708c1674210f8eba659b52a38ea5f822ff142d10786221f77", size = 226437, upload-time = "2025-12-16T21:14:32.409Z" }, ] [[package]] @@ -468,7 +476,7 @@ wheels = [ [[package]] name = "pydantic" -version = "2.12.4" +version = "2.12.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, @@ -476,9 +484,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/96/ad/a17bc283d7d81837c061c49e3eaa27a45991759a1b7eae1031921c6bd924/pydantic-2.12.4.tar.gz", hash = "sha256:0f8cb9555000a4b5b617f66bfd2566264c4984b27589d3b845685983e8ea85ac", size = 821038, upload-time = "2025-11-05T10:50:08.59Z" } +sdist = { url = "https://files.pythonhosted.org/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", size = 821591, upload-time = "2025-11-26T15:11:46.471Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/82/2f/e68750da9b04856e2a7ec56fc6f034a5a79775e9b9a81882252789873798/pydantic-2.12.4-py3-none-any.whl", hash = "sha256:92d3d202a745d46f9be6df459ac5a064fdaa3c1c4cd8adcfa332ccf3c05f871e", size = 463400, upload-time = "2025-11-05T10:50:06.732Z" }, + { url = "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d", size = 463580, upload-time = "2025-11-26T15:11:44.605Z" }, ] [[package]] @@ -610,23 +618,23 @@ wheels = [ [[package]] name = "pyrefly" -version = "0.40.0" +version = "0.49.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e6/f2/2d20f10f27a955ad11828373d288f01a7a58ec74c896058b7e10357ac0fd/pyrefly-0.40.0.tar.gz", hash = "sha256:1003592ecc0bc605fc060480c5b061b5d34f4f919c391c12f239a51c8865a061", size = 3671519, upload-time = "2025-11-03T15:28:33.264Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b4/19/8ad522587672c6bb013e284ee8a326136f6511c74784141f3fd550b99aee/pyrefly-0.49.0.tar.gz", hash = "sha256:d4e9a978d55253d2cd24c0354bd4cf087026d07bd374388c2ae12a3bc26f93fc", size = 4822135, upload-time = "2026-01-20T15:13:48.061Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e1/e4/4ddf5d3b06601459dce47bd7557fbb6711063eeeeb20f85adb7d6fb0efc2/pyrefly-0.40.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ac856cb7af6b2c3f43bdd684579b4bb122adf66fb98908cddd7b36c0b905b040", size = 9172199, upload-time = "2025-11-03T15:28:14.355Z" }, - { url = "https://files.pythonhosted.org/packages/77/f9/7d9007e8ba8869e34fb7795c44aba37bbdf036312921c1308127a5282dd8/pyrefly-0.40.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d6550055d73fbb921437f246d99397b0ae5c794ca81e0c328e60e164ef32e7ce", size = 8703417, upload-time = "2025-11-03T15:28:17.356Z" }, - { url = "https://files.pythonhosted.org/packages/26/fb/c8fd0b0ebbaac05af977f1b754aa68a32fc227ad9cb9e5b238a86b49db5a/pyrefly-0.40.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:925073c6f823445d41b3e4ba6eaf62b28acaa444e1a5dc66ebbe1a9d134251a0", size = 8934070, upload-time = "2025-11-03T15:28:19.355Z" }, - { url = "https://files.pythonhosted.org/packages/d0/22/ef4c1429ee880de60e36593f17d4c9dcd0e555cba303298b71f6e817ce54/pyrefly-0.40.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28097f49497cf75818d428a080f69e70a7673ea1aab1fc6d796b333f1822e0e3", size = 9835795, upload-time = "2025-11-03T15:28:21.655Z" }, - { url = "https://files.pythonhosted.org/packages/f8/58/11aa4130ab16986af68625d7239bee5064655652444629d7a6a6de265547/pyrefly-0.40.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de3ff4fdb4adb5d2aeb3752811d8da2ae76f8431fed6ae84693fd7a51acc3cfd", size = 9463039, upload-time = "2025-11-03T15:28:24.291Z" }, - { url = "https://files.pythonhosted.org/packages/15/e7/45735e040ba4255b01228ede74add1f545094821b703aa259e45cc9168f0/pyrefly-0.40.0-py3-none-win32.whl", hash = "sha256:13d2d67184fd8044d687dff04ad78ec5b845644ccd83505ec67ef61997a82f06", size = 8987542, upload-time = "2025-11-03T15:28:26.419Z" }, - { url = "https://files.pythonhosted.org/packages/19/a0/1e9c17937ad3327eb12899415d7fc243d9cf1f05f526c941ea716e5235b3/pyrefly-0.40.0-py3-none-win_amd64.whl", hash = "sha256:0332491f3521ca228f1e2f0bbfbe9b5a65835c5d53887649e65638c1262dbe53", size = 9447020, upload-time = "2025-11-03T15:28:28.731Z" }, - { url = "https://files.pythonhosted.org/packages/ab/5f/41af281210ec605b57beca4ff210ba806228db951adfb38b9f007e5c7e95/pyrefly-0.40.0-py3-none-win_arm64.whl", hash = "sha256:35b5439994b3a760f986067743c8c5fde09acd1c1bc46dbc9b092b58a4711d4a", size = 9003431, upload-time = "2025-11-03T15:28:31.013Z" }, + { url = "https://files.pythonhosted.org/packages/5b/47/8c34be1fd5fb3ca74608a71dfece40c4b9d382a8899db8418be9b326ba3f/pyrefly-0.49.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:1cd5516ddab7c745e195fe1470629251962498482025bf2a9a9d53d5bde73729", size = 11644108, upload-time = "2026-01-20T15:13:25.358Z" }, + { url = "https://files.pythonhosted.org/packages/57/01/f492c92b4df963dbfda8d8e1cf57477704df8cdecf907568580af60193fe/pyrefly-0.49.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5a998a37dc1465a648c03076545080a8bd2a421c67cac27686eca43244e8ac69", size = 11246465, upload-time = "2026-01-20T15:13:27.845Z" }, + { url = "https://files.pythonhosted.org/packages/d1/0b/89da00960e9c43ae7aa5f50886e9f87457137c444e513c00b714fdc6ba1e/pyrefly-0.49.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a96b1452fa61d7db6d5ae6b6297f50ba8c006ba7ce420233ebd33eaf95d04cfd", size = 31723528, upload-time = "2026-01-20T15:13:31.686Z" }, + { url = "https://files.pythonhosted.org/packages/f7/69/43a2a1a6bc00037879643d7d5257215fea1988dd2ef3168b5fe3cd55dcf0/pyrefly-0.49.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:97f1b5fb1be6f8f4868fe40e7ebeed055c8483012212267e182d58a8e50723e7", size = 33924099, upload-time = "2026-01-20T15:13:35.056Z" }, + { url = "https://files.pythonhosted.org/packages/f4/df/e475cd37d40221571e25465f0a39dd14123b8a3498f103e39e5938a2645f/pyrefly-0.49.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7ee11eefd1d551629ce1b25888814dbf758aac1a10279537d9425bc53f2d41c", size = 35026928, upload-time = "2026-01-20T15:13:38.403Z" }, + { url = "https://files.pythonhosted.org/packages/54/e2/fe9588b2cb4685c410ebf106bf1d28c66ed2727a5eeeabcfb51fec714143/pyrefly-0.49.0-py3-none-win32.whl", hash = "sha256:6196cb9b20ee977f64fa1fe87e06d3f7a222c5155031d21139fc60464a7a4b9c", size = 10675311, upload-time = "2026-01-20T15:13:40.99Z" }, + { url = "https://files.pythonhosted.org/packages/1a/dc/65fba26966bc2d9a9cbef620ef2a957f72bf3551822d6c250e3d36c2d0ee/pyrefly-0.49.0-py3-none-win_amd64.whl", hash = "sha256:15333b5550fd32a8f9a971ad124714d75f1906a67e48033dcc203258525bc7fd", size = 11418250, upload-time = "2026-01-20T15:13:43.321Z" }, + { url = "https://files.pythonhosted.org/packages/54/3c/9b0af11cbbfd57c5487af2d5d7322c30e7d73179171e1ffa4dda758dd286/pyrefly-0.49.0-py3-none-win_arm64.whl", hash = "sha256:4a57eebced37836791b681626a4be004ebd27221bc208f8200e1e2ca8a8b9510", size = 10962081, upload-time = "2026-01-20T15:13:45.82Z" }, ] [[package]] name = "pytest" -version = "8.4.2" +version = "9.0.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, @@ -637,14 +645,14 @@ dependencies = [ { name = "pygments" }, { name = "tomli", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" }, + { url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" }, ] [[package]] name = "python-ort" -version = "0.4.3" +version = "0.5.0" source = { editable = "." } dependencies = [ { name = "pydantic" }, @@ -663,27 +671,57 @@ dev = [ ] [package.metadata] -requires-dist = [{ name = "pydantic", specifier = ">=2.12.4" }] +requires-dist = [{ name = "pydantic", specifier = ">=2.12.5" }] [package.metadata.requires-dev] dev = [ - { name = "datamodel-code-generator", extras = ["http"], specifier = ">=0.35.0" }, - { name = "pre-commit", specifier = ">=4.3.0" }, + { name = "datamodel-code-generator", extras = ["http"], specifier = ">=0.53.0" }, + { name = "pre-commit", specifier = ">=4.5.1" }, { name = "pycodestyle", specifier = ">=2.14.0" }, - { name = "pyrefly", specifier = ">=0.40.0" }, - { name = "pytest", specifier = ">=8.4.2" }, + { name = "pyrefly", specifier = ">=0.49.0" }, + { name = "pytest", specifier = ">=9.0.2" }, { name = "rich", specifier = ">=14.2.0" }, - { name = "ruff", specifier = ">=0.14.4" }, + { name = "ruff", specifier = ">=0.14.14" }, { name = "types-pyyaml", specifier = ">=6.0.12.20250915" }, ] [[package]] name = "pytokens" -version = "0.3.0" +version = "0.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4e/8d/a762be14dae1c3bf280202ba3172020b2b0b4c537f94427435f19c413b72/pytokens-0.3.0.tar.gz", hash = "sha256:2f932b14ed08de5fcf0b391ace2642f858f1394c0857202959000b68ed7a458a", size = 17644, upload-time = "2025-11-05T13:36:35.34Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/84/25/d9db8be44e205a124f6c98bc0324b2bb149b7431c53877fc6d1038dddaf5/pytokens-0.3.0-py3-none-any.whl", hash = "sha256:95b2b5eaf832e469d141a378872480ede3f251a5a5041b8ec6e581d3ac71bbf3", size = 12195, upload-time = "2025-11-05T13:36:33.183Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/e5/16/4b9cfd90d55e66ffdb277d7ebe3bc25250c2311336ec3fc73b2673c794d5/pytokens-0.4.0.tar.gz", hash = "sha256:6b0b03e6ea7c9f9d47c5c61164b69ad30f4f0d70a5d9fe7eac4d19f24f77af2d", size = 15039, upload-time = "2026-01-19T07:59:50.623Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/c5/c20818fef16c4ab5f9fd7bad699268ba21bf24f655711df4e33bb7a9ab47/pytokens-0.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:af0c3166aea367a9e755a283171befb92dd3043858b94ae9b3b7efbe9def26a3", size = 160682, upload-time = "2026-01-19T07:58:51.583Z" }, + { url = "https://files.pythonhosted.org/packages/46/c4/ad03e4abe05c6af57c4d7f8f031fafe80f0074796d09ab5a73bf2fac895f/pytokens-0.4.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:daae524ed14ca459932cbf51d74325bea643701ba8a8b0cc2d10f7cd4b3e2b63", size = 245748, upload-time = "2026-01-19T07:58:53.944Z" }, + { url = "https://files.pythonhosted.org/packages/6b/b9/4a7ee0a692603b16d8fdfbc5c44e0f6910d45eec6b2c2188daa4670f179d/pytokens-0.4.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e95cb158c44d642ed62f555bf8136bbe780dbd64d2fb0b9169e11ffb944664c3", size = 258671, upload-time = "2026-01-19T07:58:55.667Z" }, + { url = "https://files.pythonhosted.org/packages/fa/a3/02bb29dc4985fb8d759d9c96f189c3a828e74f0879fdb843e9fb7a1db637/pytokens-0.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:df58d44630eaf25f587540e94bdf1fc50b4e6d5f212c786de0fb024bfcb8753a", size = 261749, upload-time = "2026-01-19T07:58:57.442Z" }, + { url = "https://files.pythonhosted.org/packages/10/f2/9a8bdcc5444d85d4dba4aa1b530d81af3edc4a9ab76bf1d53ea8bfe8479d/pytokens-0.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55efcc36f9a2e0e930cfba0ce7f83445306b02f8326745585ed5551864eba73a", size = 102805, upload-time = "2026-01-19T07:58:59.068Z" }, + { url = "https://files.pythonhosted.org/packages/b4/05/3196399a353dd4cd99138a88f662810979ee2f1a1cdb0b417cb2f4507836/pytokens-0.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:92eb3ef88f27c22dc9dbab966ace4d61f6826e02ba04dac8e2d65ea31df56c8e", size = 160075, upload-time = "2026-01-19T07:59:00.316Z" }, + { url = "https://files.pythonhosted.org/packages/28/1d/c8fc4ed0a1c4f660391b201cda00b1d5bbcc00e2998e8bcd48b15eefd708/pytokens-0.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f4b77858a680635ee9904306f54b0ee4781effb89e211ba0a773d76539537165", size = 247318, upload-time = "2026-01-19T07:59:01.636Z" }, + { url = "https://files.pythonhosted.org/packages/8e/0e/53e55ba01f3e858d229cd84b02481542f42ba59050483a78bf2447ee1af7/pytokens-0.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:25cacc20c2ad90acb56f3739d87905473c54ca1fa5967ffcd675463fe965865e", size = 259752, upload-time = "2026-01-19T07:59:04.229Z" }, + { url = "https://files.pythonhosted.org/packages/dc/56/2d930d7f899e3f21868ca6e8ec739ac31e8fc532f66e09cbe45d3df0a84f/pytokens-0.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:628fab535ebc9079e4db35cd63cb401901c7ce8720a9834f9ad44b9eb4e0f1d4", size = 262842, upload-time = "2026-01-19T07:59:06.14Z" }, + { url = "https://files.pythonhosted.org/packages/42/dd/4e7e6920d23deffaf66e6f40d45f7610dcbc132ca5d90ab4faccef22f624/pytokens-0.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:4d0f568d7e82b7e96be56d03b5081de40e43c904eb6492bf09aaca47cd55f35b", size = 102620, upload-time = "2026-01-19T07:59:07.839Z" }, + { url = "https://files.pythonhosted.org/packages/3d/65/65460ebbfefd0bc1b160457904370d44f269e6e4582e0a9b6cba7c267b04/pytokens-0.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cd8da894e5a29ba6b6da8be06a4f7589d7220c099b5e363cb0643234b9b38c2a", size = 159864, upload-time = "2026-01-19T07:59:08.908Z" }, + { url = "https://files.pythonhosted.org/packages/25/70/a46669ec55876c392036b4da9808b5c3b1c5870bbca3d4cc923bf68bdbc1/pytokens-0.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:237ba7cfb677dbd3b01b09860810aceb448871150566b93cd24501d5734a04b1", size = 254448, upload-time = "2026-01-19T07:59:10.594Z" }, + { url = "https://files.pythonhosted.org/packages/62/0b/c486fc61299c2fc3b7f88ee4e115d4c8b6ffd1a7f88dc94b398b5b1bc4b8/pytokens-0.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01d1a61e36812e4e971cfe2c0e4c1f2d66d8311031dac8bf168af8a249fa04dd", size = 268863, upload-time = "2026-01-19T07:59:12.31Z" }, + { url = "https://files.pythonhosted.org/packages/79/92/b036af846707d25feaff7cafbd5280f1bd6a1034c16bb06a7c910209c1ab/pytokens-0.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e47e2ef3ec6ee86909e520d79f965f9b23389fda47460303cf715d510a6fe544", size = 267181, upload-time = "2026-01-19T07:59:13.856Z" }, + { url = "https://files.pythonhosted.org/packages/0d/c0/6d011fc00fefa74ce34816c84a923d2dd7c46b8dbc6ee52d13419786834c/pytokens-0.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:3d36954aba4557fd5a418a03cf595ecbb1cdcce119f91a49b19ef09d691a22ae", size = 102814, upload-time = "2026-01-19T07:59:15.288Z" }, + { url = "https://files.pythonhosted.org/packages/98/63/627b7e71d557383da5a97f473ad50f8d9c2c1f55c7d3c2531a120c796f6e/pytokens-0.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:73eff3bdd8ad08da679867992782568db0529b887bed4c85694f84cdf35eafc6", size = 159744, upload-time = "2026-01-19T07:59:16.88Z" }, + { url = "https://files.pythonhosted.org/packages/28/d7/16f434c37ec3824eba6bcb6e798e5381a8dc83af7a1eda0f95c16fe3ade5/pytokens-0.4.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d97cc1f91b1a8e8ebccf31c367f28225699bea26592df27141deade771ed0afb", size = 253207, upload-time = "2026-01-19T07:59:18.069Z" }, + { url = "https://files.pythonhosted.org/packages/ab/96/04102856b9527701ae57d74a6393d1aca5bad18a1b1ca48ccffb3c93b392/pytokens-0.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a2c8952c537cb73a1a74369501a83b7f9d208c3cf92c41dd88a17814e68d48ce", size = 267452, upload-time = "2026-01-19T07:59:19.328Z" }, + { url = "https://files.pythonhosted.org/packages/0e/ef/0936eb472b89ab2d2c2c24bb81c50417e803fa89c731930d9fb01176fe9f/pytokens-0.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5dbf56f3c748aed9310b310d5b8b14e2c96d3ad682ad5a943f381bdbbdddf753", size = 265965, upload-time = "2026-01-19T07:59:20.613Z" }, + { url = "https://files.pythonhosted.org/packages/ae/f5/64f3d6f7df4a9e92ebda35ee85061f6260e16eac82df9396020eebbca775/pytokens-0.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:e131804513597f2dff2b18f9911d9b6276e21ef3699abeffc1c087c65a3d975e", size = 102813, upload-time = "2026-01-19T07:59:22.012Z" }, + { url = "https://files.pythonhosted.org/packages/5f/f1/d07e6209f18ef378fc2ae9dee8d1dfe91fd2447c2e2dbfa32867b6dd30cf/pytokens-0.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0d7374c917197106d3c4761374718bc55ea2e9ac0fb94171588ef5840ee1f016", size = 159968, upload-time = "2026-01-19T07:59:23.07Z" }, + { url = "https://files.pythonhosted.org/packages/0a/73/0eb111400abd382a04f253b269819db9fcc748aa40748441cebdcb6d068f/pytokens-0.4.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0cd3fa1caf9e47a72ee134a29ca6b5bea84712724bba165d6628baa190c6ea5b", size = 253373, upload-time = "2026-01-19T07:59:24.381Z" }, + { url = "https://files.pythonhosted.org/packages/bd/8d/9e4e2fdb5bcaba679e54afcc304e9f13f488eb4d626e6b613f9553e03dbd/pytokens-0.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c6986576b7b07fe9791854caa5347923005a80b079d45b63b0be70d50cce5f1", size = 267024, upload-time = "2026-01-19T07:59:25.74Z" }, + { url = "https://files.pythonhosted.org/packages/cb/b7/e0a370321af2deb772cff14ff337e1140d1eac2c29a8876bfee995f486f0/pytokens-0.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9940f7c2e2f54fb1cb5fe17d0803c54da7a2bf62222704eb4217433664a186a7", size = 270912, upload-time = "2026-01-19T07:59:27.072Z" }, + { url = "https://files.pythonhosted.org/packages/7c/54/4348f916c440d4c3e68b53b4ed0e66b292d119e799fa07afa159566dcc86/pytokens-0.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:54691cf8f299e7efabcc25adb4ce715d3cef1491e1c930eaf555182f898ef66a", size = 103836, upload-time = "2026-01-19T07:59:28.112Z" }, + { url = "https://files.pythonhosted.org/packages/e8/f8/a693c0cfa9c783a2a8c4500b7b2a8bab420f8ca4f2d496153226bf1c12e3/pytokens-0.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:94ff5db97a0d3cd7248a5b07ba2167bd3edc1db92f76c6db00137bbaf068ddf8", size = 167643, upload-time = "2026-01-19T07:59:29.292Z" }, + { url = "https://files.pythonhosted.org/packages/c0/dd/a64eb1e9f3ec277b69b33ef1b40ffbcc8f0a3bafcde120997efc7bdefebf/pytokens-0.4.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d0dd6261cd9cc95fae1227b1b6ebee023a5fd4a4b6330b071c73a516f5f59b63", size = 289553, upload-time = "2026-01-19T07:59:30.537Z" }, + { url = "https://files.pythonhosted.org/packages/df/22/06c1079d93dbc3bca5d013e1795f3d8b9ed6c87290acd6913c1c526a6bb2/pytokens-0.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0cdca8159df407dbd669145af4171a0d967006e0be25f3b520896bc7068f02c4", size = 302490, upload-time = "2026-01-19T07:59:32.352Z" }, + { url = "https://files.pythonhosted.org/packages/8d/de/a6f5e43115b4fbf4b93aa87d6c83c79932cdb084f9711daae04549e1e4ad/pytokens-0.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4b5770abeb2a24347380a1164a558f0ebe06e98aedbd54c45f7929527a5fb26e", size = 305652, upload-time = "2026-01-19T07:59:33.685Z" }, + { url = "https://files.pythonhosted.org/packages/ab/3d/c136e057cb622e36e0c3ff7a8aaa19ff9720050c4078235691da885fe6ee/pytokens-0.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:74500d72c561dad14c037a9e86a657afd63e277dd5a3bb7570932ab7a3b12551", size = 115472, upload-time = "2026-01-19T07:59:34.734Z" }, + { url = "https://files.pythonhosted.org/packages/7c/3c/6941a82f4f130af6e1c68c076b6789069ef10c04559bd4733650f902fd3b/pytokens-0.4.0-py3-none-any.whl", hash = "sha256:0508d11b4de157ee12063901603be87fb0253e8f4cb9305eb168b1202ab92068", size = 13224, upload-time = "2026-01-19T07:59:49.822Z" }, ] [[package]] @@ -752,99 +790,95 @@ wheels = [ [[package]] name = "rich" -version = "14.2.0" +version = "14.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fb/d2/8920e102050a0de7bfabeb4c4614a49248cf8d5d7a8d01885fbb24dc767a/rich-14.2.0.tar.gz", hash = "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4", size = 219990, upload-time = "2025-10-09T14:16:53.064Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/84/4831f881aa6ff3c976f6d6809b58cdfa350593ffc0dc3c58f5f6586780fb/rich-14.3.1.tar.gz", hash = "sha256:b8c5f568a3a749f9290ec6bddedf835cec33696bfc1e48bcfecb276c7386e4b8", size = 230125, upload-time = "2026-01-24T21:40:44.847Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/25/7a/b0178788f8dc6cafce37a212c99565fa1fe7872c70c6c9c1e1a372d9d88f/rich-14.2.0-py3-none-any.whl", hash = "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd", size = 243393, upload-time = "2025-10-09T14:16:51.245Z" }, + { url = "https://files.pythonhosted.org/packages/87/2a/a1810c8627b9ec8c57ec5ec325d306701ae7be50235e8fd81266e002a3cc/rich-14.3.1-py3-none-any.whl", hash = "sha256:da750b1aebbff0b372557426fb3f35ba56de8ef954b3190315eb64076d6fb54e", size = 309952, upload-time = "2026-01-24T21:40:42.969Z" }, ] [[package]] name = "ruff" -version = "0.14.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/df/55/cccfca45157a2031dcbb5a462a67f7cf27f8b37d4b3b1cd7438f0f5c1df6/ruff-0.14.4.tar.gz", hash = "sha256:f459a49fe1085a749f15414ca76f61595f1a2cc8778ed7c279b6ca2e1fd19df3", size = 5587844, upload-time = "2025-11-06T22:07:45.033Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/17/b9/67240254166ae1eaa38dec32265e9153ac53645a6c6670ed36ad00722af8/ruff-0.14.4-py3-none-linux_armv6l.whl", hash = "sha256:e6604613ffbcf2297cd5dcba0e0ac9bd0c11dc026442dfbb614504e87c349518", size = 12606781, upload-time = "2025-11-06T22:07:01.841Z" }, - { url = "https://files.pythonhosted.org/packages/46/c8/09b3ab245d8652eafe5256ab59718641429f68681ee713ff06c5c549f156/ruff-0.14.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:d99c0b52b6f0598acede45ee78288e5e9b4409d1ce7f661f0fa36d4cbeadf9a4", size = 12946765, upload-time = "2025-11-06T22:07:05.858Z" }, - { url = "https://files.pythonhosted.org/packages/14/bb/1564b000219144bf5eed2359edc94c3590dd49d510751dad26202c18a17d/ruff-0.14.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:9358d490ec030f1b51d048a7fd6ead418ed0826daf6149e95e30aa67c168af33", size = 11928120, upload-time = "2025-11-06T22:07:08.023Z" }, - { url = "https://files.pythonhosted.org/packages/a3/92/d5f1770e9988cc0742fefaa351e840d9aef04ec24ae1be36f333f96d5704/ruff-0.14.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81b40d27924f1f02dfa827b9c0712a13c0e4b108421665322218fc38caf615c2", size = 12370877, upload-time = "2025-11-06T22:07:10.015Z" }, - { url = "https://files.pythonhosted.org/packages/e2/29/e9282efa55f1973d109faf839a63235575519c8ad278cc87a182a366810e/ruff-0.14.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f5e649052a294fe00818650712083cddc6cc02744afaf37202c65df9ea52efa5", size = 12408538, upload-time = "2025-11-06T22:07:13.085Z" }, - { url = "https://files.pythonhosted.org/packages/8e/01/930ed6ecfce130144b32d77d8d69f5c610e6d23e6857927150adf5d7379a/ruff-0.14.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa082a8f878deeba955531f975881828fd6afd90dfa757c2b0808aadb437136e", size = 13141942, upload-time = "2025-11-06T22:07:15.386Z" }, - { url = "https://files.pythonhosted.org/packages/6a/46/a9c89b42b231a9f487233f17a89cbef9d5acd538d9488687a02ad288fa6b/ruff-0.14.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:1043c6811c2419e39011890f14d0a30470f19d47d197c4858b2787dfa698f6c8", size = 14544306, upload-time = "2025-11-06T22:07:17.631Z" }, - { url = "https://files.pythonhosted.org/packages/78/96/9c6cf86491f2a6d52758b830b89b78c2ae61e8ca66b86bf5a20af73d20e6/ruff-0.14.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a9f3a936ac27fb7c2a93e4f4b943a662775879ac579a433291a6f69428722649", size = 14210427, upload-time = "2025-11-06T22:07:19.832Z" }, - { url = "https://files.pythonhosted.org/packages/71/f4/0666fe7769a54f63e66404e8ff698de1dcde733e12e2fd1c9c6efb689cb5/ruff-0.14.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:95643ffd209ce78bc113266b88fba3d39e0461f0cbc8b55fb92505030fb4a850", size = 13658488, upload-time = "2025-11-06T22:07:22.32Z" }, - { url = "https://files.pythonhosted.org/packages/ee/79/6ad4dda2cfd55e41ac9ed6d73ef9ab9475b1eef69f3a85957210c74ba12c/ruff-0.14.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:456daa2fa1021bc86ca857f43fe29d5d8b3f0e55e9f90c58c317c1dcc2afc7b5", size = 13354908, upload-time = "2025-11-06T22:07:24.347Z" }, - { url = "https://files.pythonhosted.org/packages/b5/60/f0b6990f740bb15c1588601d19d21bcc1bd5de4330a07222041678a8e04f/ruff-0.14.4-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:f911bba769e4a9f51af6e70037bb72b70b45a16db5ce73e1f72aefe6f6d62132", size = 13587803, upload-time = "2025-11-06T22:07:26.327Z" }, - { url = "https://files.pythonhosted.org/packages/c9/da/eaaada586f80068728338e0ef7f29ab3e4a08a692f92eb901a4f06bbff24/ruff-0.14.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:76158a7369b3979fa878612c623a7e5430c18b2fd1c73b214945c2d06337db67", size = 12279654, upload-time = "2025-11-06T22:07:28.46Z" }, - { url = "https://files.pythonhosted.org/packages/66/d4/b1d0e82cf9bf8aed10a6d45be47b3f402730aa2c438164424783ac88c0ed/ruff-0.14.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:f3b8f3b442d2b14c246e7aeca2e75915159e06a3540e2f4bed9f50d062d24469", size = 12357520, upload-time = "2025-11-06T22:07:31.468Z" }, - { url = "https://files.pythonhosted.org/packages/04/f4/53e2b42cc82804617e5c7950b7079d79996c27e99c4652131c6a1100657f/ruff-0.14.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c62da9a06779deecf4d17ed04939ae8b31b517643b26370c3be1d26f3ef7dbde", size = 12719431, upload-time = "2025-11-06T22:07:33.831Z" }, - { url = "https://files.pythonhosted.org/packages/a2/94/80e3d74ed9a72d64e94a7b7706b1c1ebaa315ef2076fd33581f6a1cd2f95/ruff-0.14.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5a443a83a1506c684e98acb8cb55abaf3ef725078be40237463dae4463366349", size = 13464394, upload-time = "2025-11-06T22:07:35.905Z" }, - { url = "https://files.pythonhosted.org/packages/54/1a/a49f071f04c42345c793d22f6cf5e0920095e286119ee53a64a3a3004825/ruff-0.14.4-py3-none-win32.whl", hash = "sha256:643b69cb63cd996f1fc7229da726d07ac307eae442dd8974dbc7cf22c1e18fff", size = 12493429, upload-time = "2025-11-06T22:07:38.43Z" }, - { url = "https://files.pythonhosted.org/packages/bc/22/e58c43e641145a2b670328fb98bc384e20679b5774258b1e540207580266/ruff-0.14.4-py3-none-win_amd64.whl", hash = "sha256:26673da283b96fe35fa0c939bf8411abec47111644aa9f7cfbd3c573fb125d2c", size = 13635380, upload-time = "2025-11-06T22:07:40.496Z" }, - { url = "https://files.pythonhosted.org/packages/30/bd/4168a751ddbbf43e86544b4de8b5c3b7be8d7167a2a5cb977d274e04f0a1/ruff-0.14.4-py3-none-win_arm64.whl", hash = "sha256:dd09c292479596b0e6fec8cd95c65c3a6dc68e9ad17b8f2382130f87ff6a75bb", size = 12663065, upload-time = "2025-11-06T22:07:42.603Z" }, -] - -[[package]] -name = "sniffio" -version = "1.3.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, +version = "0.14.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2e/06/f71e3a86b2df0dfa2d2f72195941cd09b44f87711cb7fa5193732cb9a5fc/ruff-0.14.14.tar.gz", hash = "sha256:2d0f819c9a90205f3a867dbbd0be083bee9912e170fd7d9704cc8ae45824896b", size = 4515732, upload-time = "2026-01-22T22:30:17.527Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/89/20a12e97bc6b9f9f68343952da08a8099c57237aef953a56b82711d55edd/ruff-0.14.14-py3-none-linux_armv6l.whl", hash = "sha256:7cfe36b56e8489dee8fbc777c61959f60ec0f1f11817e8f2415f429552846aed", size = 10467650, upload-time = "2026-01-22T22:30:08.578Z" }, + { url = "https://files.pythonhosted.org/packages/a3/b1/c5de3fd2d5a831fcae21beda5e3589c0ba67eec8202e992388e4b17a6040/ruff-0.14.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6006a0082336e7920b9573ef8a7f52eec837add1265cc74e04ea8a4368cd704c", size = 10883245, upload-time = "2026-01-22T22:30:04.155Z" }, + { url = "https://files.pythonhosted.org/packages/b8/7c/3c1db59a10e7490f8f6f8559d1db8636cbb13dccebf18686f4e3c9d7c772/ruff-0.14.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:026c1d25996818f0bf498636686199d9bd0d9d6341c9c2c3b62e2a0198b758de", size = 10231273, upload-time = "2026-01-22T22:30:34.642Z" }, + { url = "https://files.pythonhosted.org/packages/a1/6e/5e0e0d9674be0f8581d1f5e0f0a04761203affce3232c1a1189d0e3b4dad/ruff-0.14.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f666445819d31210b71e0a6d1c01e24447a20b85458eea25a25fe8142210ae0e", size = 10585753, upload-time = "2026-01-22T22:30:31.781Z" }, + { url = "https://files.pythonhosted.org/packages/23/09/754ab09f46ff1884d422dc26d59ba18b4e5d355be147721bb2518aa2a014/ruff-0.14.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c0f18b922c6d2ff9a5e6c3ee16259adc513ca775bcf82c67ebab7cbd9da5bc8", size = 10286052, upload-time = "2026-01-22T22:30:24.827Z" }, + { url = "https://files.pythonhosted.org/packages/c8/cc/e71f88dd2a12afb5f50733851729d6b571a7c3a35bfdb16c3035132675a0/ruff-0.14.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1629e67489c2dea43e8658c3dba659edbfd87361624b4040d1df04c9740ae906", size = 11043637, upload-time = "2026-01-22T22:30:13.239Z" }, + { url = "https://files.pythonhosted.org/packages/67/b2/397245026352494497dac935d7f00f1468c03a23a0c5db6ad8fc49ca3fb2/ruff-0.14.14-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:27493a2131ea0f899057d49d303e4292b2cae2bb57253c1ed1f256fbcd1da480", size = 12194761, upload-time = "2026-01-22T22:30:22.542Z" }, + { url = "https://files.pythonhosted.org/packages/5b/06/06ef271459f778323112c51b7587ce85230785cd64e91772034ddb88f200/ruff-0.14.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01ff589aab3f5b539e35db38425da31a57521efd1e4ad1ae08fc34dbe30bd7df", size = 12005701, upload-time = "2026-01-22T22:30:20.499Z" }, + { url = "https://files.pythonhosted.org/packages/41/d6/99364514541cf811ccc5ac44362f88df66373e9fec1b9d1c4cc830593fe7/ruff-0.14.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc12d74eef0f29f51775f5b755913eb523546b88e2d733e1d701fe65144e89b", size = 11282455, upload-time = "2026-01-22T22:29:59.679Z" }, + { url = "https://files.pythonhosted.org/packages/ca/71/37daa46f89475f8582b7762ecd2722492df26421714a33e72ccc9a84d7a5/ruff-0.14.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb8481604b7a9e75eff53772496201690ce2687067e038b3cc31aaf16aa0b974", size = 11215882, upload-time = "2026-01-22T22:29:57.032Z" }, + { url = "https://files.pythonhosted.org/packages/2c/10/a31f86169ec91c0705e618443ee74ede0bdd94da0a57b28e72db68b2dbac/ruff-0.14.14-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:14649acb1cf7b5d2d283ebd2f58d56b75836ed8c6f329664fa91cdea19e76e66", size = 11180549, upload-time = "2026-01-22T22:30:27.175Z" }, + { url = "https://files.pythonhosted.org/packages/fd/1e/c723f20536b5163adf79bdd10c5f093414293cdf567eed9bdb7b83940f3f/ruff-0.14.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e8058d2145566510790eab4e2fad186002e288dec5e0d343a92fe7b0bc1b3e13", size = 10543416, upload-time = "2026-01-22T22:30:01.964Z" }, + { url = "https://files.pythonhosted.org/packages/3e/34/8a84cea7e42c2d94ba5bde1d7a4fae164d6318f13f933d92da6d7c2041ff/ruff-0.14.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:e651e977a79e4c758eb807f0481d673a67ffe53cfa92209781dfa3a996cf8412", size = 10285491, upload-time = "2026-01-22T22:30:29.51Z" }, + { url = "https://files.pythonhosted.org/packages/55/ef/b7c5ea0be82518906c978e365e56a77f8de7678c8bb6651ccfbdc178c29f/ruff-0.14.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:cc8b22da8d9d6fdd844a68ae937e2a0adf9b16514e9a97cc60355e2d4b219fc3", size = 10733525, upload-time = "2026-01-22T22:30:06.499Z" }, + { url = "https://files.pythonhosted.org/packages/6a/5b/aaf1dfbcc53a2811f6cc0a1759de24e4b03e02ba8762daabd9b6bd8c59e3/ruff-0.14.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:16bc890fb4cc9781bb05beb5ab4cd51be9e7cb376bf1dd3580512b24eb3fda2b", size = 11315626, upload-time = "2026-01-22T22:30:36.848Z" }, + { url = "https://files.pythonhosted.org/packages/2c/aa/9f89c719c467dfaf8ad799b9bae0df494513fb21d31a6059cb5870e57e74/ruff-0.14.14-py3-none-win32.whl", hash = "sha256:b530c191970b143375b6a68e6f743800b2b786bbcf03a7965b06c4bf04568167", size = 10502442, upload-time = "2026-01-22T22:30:38.93Z" }, + { url = "https://files.pythonhosted.org/packages/87/44/90fa543014c45560cae1fffc63ea059fb3575ee6e1cb654562197e5d16fb/ruff-0.14.14-py3-none-win_amd64.whl", hash = "sha256:3dde1435e6b6fe5b66506c1dff67a421d0b7f6488d466f651c07f4cab3bf20fd", size = 11630486, upload-time = "2026-01-22T22:30:10.852Z" }, + { url = "https://files.pythonhosted.org/packages/9e/6a/40fee331a52339926a92e17ae748827270b288a35ef4a15c9c8f2ec54715/ruff-0.14.14-py3-none-win_arm64.whl", hash = "sha256:56e6981a98b13a32236a72a8da421d7839221fa308b223b9283312312e5ac76c", size = 10920448, upload-time = "2026-01-22T22:30:15.417Z" }, ] [[package]] name = "tomli" -version = "2.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/52/ed/3f73f72945444548f33eba9a87fc7a6e969915e7b1acc8260b30e1f76a2f/tomli-2.3.0.tar.gz", hash = "sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549", size = 17392, upload-time = "2025-10-08T22:01:47.119Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/2e/299f62b401438d5fe1624119c723f5d877acc86a4c2492da405626665f12/tomli-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88bd15eb972f3664f5ed4b57c1634a97153b4bac4479dcb6a495f41921eb7f45", size = 153236, upload-time = "2025-10-08T22:01:00.137Z" }, - { url = "https://files.pythonhosted.org/packages/86/7f/d8fffe6a7aefdb61bced88fcb5e280cfd71e08939da5894161bd71bea022/tomli-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:883b1c0d6398a6a9d29b508c331fa56adbcdff647f6ace4dfca0f50e90dfd0ba", size = 148084, upload-time = "2025-10-08T22:01:01.63Z" }, - { url = "https://files.pythonhosted.org/packages/47/5c/24935fb6a2ee63e86d80e4d3b58b222dafaf438c416752c8b58537c8b89a/tomli-2.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1381caf13ab9f300e30dd8feadb3de072aeb86f1d34a8569453ff32a7dea4bf", size = 234832, upload-time = "2025-10-08T22:01:02.543Z" }, - { url = "https://files.pythonhosted.org/packages/89/da/75dfd804fc11e6612846758a23f13271b76d577e299592b4371a4ca4cd09/tomli-2.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0e285d2649b78c0d9027570d4da3425bdb49830a6156121360b3f8511ea3441", size = 242052, upload-time = "2025-10-08T22:01:03.836Z" }, - { url = "https://files.pythonhosted.org/packages/70/8c/f48ac899f7b3ca7eb13af73bacbc93aec37f9c954df3c08ad96991c8c373/tomli-2.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a154a9ae14bfcf5d8917a59b51ffd5a3ac1fd149b71b47a3a104ca4edcfa845", size = 239555, upload-time = "2025-10-08T22:01:04.834Z" }, - { url = "https://files.pythonhosted.org/packages/ba/28/72f8afd73f1d0e7829bfc093f4cb98ce0a40ffc0cc997009ee1ed94ba705/tomli-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:74bf8464ff93e413514fefd2be591c3b0b23231a77f901db1eb30d6f712fc42c", size = 245128, upload-time = "2025-10-08T22:01:05.84Z" }, - { url = "https://files.pythonhosted.org/packages/b6/eb/a7679c8ac85208706d27436e8d421dfa39d4c914dcf5fa8083a9305f58d9/tomli-2.3.0-cp311-cp311-win32.whl", hash = "sha256:00b5f5d95bbfc7d12f91ad8c593a1659b6387b43f054104cda404be6bda62456", size = 96445, upload-time = "2025-10-08T22:01:06.896Z" }, - { url = "https://files.pythonhosted.org/packages/0a/fe/3d3420c4cb1ad9cb462fb52967080575f15898da97e21cb6f1361d505383/tomli-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:4dc4ce8483a5d429ab602f111a93a6ab1ed425eae3122032db7e9acf449451be", size = 107165, upload-time = "2025-10-08T22:01:08.107Z" }, - { url = "https://files.pythonhosted.org/packages/ff/b7/40f36368fcabc518bb11c8f06379a0fd631985046c038aca08c6d6a43c6e/tomli-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d7d86942e56ded512a594786a5ba0a5e521d02529b3826e7761a05138341a2ac", size = 154891, upload-time = "2025-10-08T22:01:09.082Z" }, - { url = "https://files.pythonhosted.org/packages/f9/3f/d9dd692199e3b3aab2e4e4dd948abd0f790d9ded8cd10cbaae276a898434/tomli-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:73ee0b47d4dad1c5e996e3cd33b8a76a50167ae5f96a2607cbe8cc773506ab22", size = 148796, upload-time = "2025-10-08T22:01:10.266Z" }, - { url = "https://files.pythonhosted.org/packages/60/83/59bff4996c2cf9f9387a0f5a3394629c7efa5ef16142076a23a90f1955fa/tomli-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:792262b94d5d0a466afb5bc63c7daa9d75520110971ee269152083270998316f", size = 242121, upload-time = "2025-10-08T22:01:11.332Z" }, - { url = "https://files.pythonhosted.org/packages/45/e5/7c5119ff39de8693d6baab6c0b6dcb556d192c165596e9fc231ea1052041/tomli-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f195fe57ecceac95a66a75ac24d9d5fbc98ef0962e09b2eddec5d39375aae52", size = 250070, upload-time = "2025-10-08T22:01:12.498Z" }, - { url = "https://files.pythonhosted.org/packages/45/12/ad5126d3a278f27e6701abde51d342aa78d06e27ce2bb596a01f7709a5a2/tomli-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e31d432427dcbf4d86958c184b9bfd1e96b5b71f8eb17e6d02531f434fd335b8", size = 245859, upload-time = "2025-10-08T22:01:13.551Z" }, - { url = "https://files.pythonhosted.org/packages/fb/a1/4d6865da6a71c603cfe6ad0e6556c73c76548557a8d658f9e3b142df245f/tomli-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b0882799624980785240ab732537fcfc372601015c00f7fc367c55308c186f6", size = 250296, upload-time = "2025-10-08T22:01:14.614Z" }, - { url = "https://files.pythonhosted.org/packages/a0/b7/a7a7042715d55c9ba6e8b196d65d2cb662578b4d8cd17d882d45322b0d78/tomli-2.3.0-cp312-cp312-win32.whl", hash = "sha256:ff72b71b5d10d22ecb084d345fc26f42b5143c5533db5e2eaba7d2d335358876", size = 97124, upload-time = "2025-10-08T22:01:15.629Z" }, - { url = "https://files.pythonhosted.org/packages/06/1e/f22f100db15a68b520664eb3328fb0ae4e90530887928558112c8d1f4515/tomli-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:1cb4ed918939151a03f33d4242ccd0aa5f11b3547d0cf30f7c74a408a5b99878", size = 107698, upload-time = "2025-10-08T22:01:16.51Z" }, - { url = "https://files.pythonhosted.org/packages/89/48/06ee6eabe4fdd9ecd48bf488f4ac783844fd777f547b8d1b61c11939974e/tomli-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5192f562738228945d7b13d4930baffda67b69425a7f0da96d360b0a3888136b", size = 154819, upload-time = "2025-10-08T22:01:17.964Z" }, - { url = "https://files.pythonhosted.org/packages/f1/01/88793757d54d8937015c75dcdfb673c65471945f6be98e6a0410fba167ed/tomli-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:be71c93a63d738597996be9528f4abe628d1adf5e6eb11607bc8fe1a510b5dae", size = 148766, upload-time = "2025-10-08T22:01:18.959Z" }, - { url = "https://files.pythonhosted.org/packages/42/17/5e2c956f0144b812e7e107f94f1cc54af734eb17b5191c0bbfb72de5e93e/tomli-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4665508bcbac83a31ff8ab08f424b665200c0e1e645d2bd9ab3d3e557b6185b", size = 240771, upload-time = "2025-10-08T22:01:20.106Z" }, - { url = "https://files.pythonhosted.org/packages/d5/f4/0fbd014909748706c01d16824eadb0307115f9562a15cbb012cd9b3512c5/tomli-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf", size = 248586, upload-time = "2025-10-08T22:01:21.164Z" }, - { url = "https://files.pythonhosted.org/packages/30/77/fed85e114bde5e81ecf9bc5da0cc69f2914b38f4708c80ae67d0c10180c5/tomli-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4ea38c40145a357d513bffad0ed869f13c1773716cf71ccaa83b0fa0cc4e42f", size = 244792, upload-time = "2025-10-08T22:01:22.417Z" }, - { url = "https://files.pythonhosted.org/packages/55/92/afed3d497f7c186dc71e6ee6d4fcb0acfa5f7d0a1a2878f8beae379ae0cc/tomli-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad805ea85eda330dbad64c7ea7a4556259665bdf9d2672f5dccc740eb9d3ca05", size = 248909, upload-time = "2025-10-08T22:01:23.859Z" }, - { url = "https://files.pythonhosted.org/packages/f8/84/ef50c51b5a9472e7265ce1ffc7f24cd4023d289e109f669bdb1553f6a7c2/tomli-2.3.0-cp313-cp313-win32.whl", hash = "sha256:97d5eec30149fd3294270e889b4234023f2c69747e555a27bd708828353ab606", size = 96946, upload-time = "2025-10-08T22:01:24.893Z" }, - { url = "https://files.pythonhosted.org/packages/b2/b7/718cd1da0884f281f95ccfa3a6cc572d30053cba64603f79d431d3c9b61b/tomli-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0c95ca56fbe89e065c6ead5b593ee64b84a26fca063b5d71a1122bf26e533999", size = 107705, upload-time = "2025-10-08T22:01:26.153Z" }, - { url = "https://files.pythonhosted.org/packages/19/94/aeafa14a52e16163008060506fcb6aa1949d13548d13752171a755c65611/tomli-2.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cebc6fe843e0733ee827a282aca4999b596241195f43b4cc371d64fc6639da9e", size = 154244, upload-time = "2025-10-08T22:01:27.06Z" }, - { url = "https://files.pythonhosted.org/packages/db/e4/1e58409aa78eefa47ccd19779fc6f36787edbe7d4cd330eeeedb33a4515b/tomli-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4c2ef0244c75aba9355561272009d934953817c49f47d768070c3c94355c2aa3", size = 148637, upload-time = "2025-10-08T22:01:28.059Z" }, - { url = "https://files.pythonhosted.org/packages/26/b6/d1eccb62f665e44359226811064596dd6a366ea1f985839c566cd61525ae/tomli-2.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c22a8bf253bacc0cf11f35ad9808b6cb75ada2631c2d97c971122583b129afbc", size = 241925, upload-time = "2025-10-08T22:01:29.066Z" }, - { url = "https://files.pythonhosted.org/packages/70/91/7cdab9a03e6d3d2bb11beae108da5bdc1c34bdeb06e21163482544ddcc90/tomli-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0eea8cc5c5e9f89c9b90c4896a8deefc74f518db5927d0e0e8d4a80953d774d0", size = 249045, upload-time = "2025-10-08T22:01:31.98Z" }, - { url = "https://files.pythonhosted.org/packages/15/1b/8c26874ed1f6e4f1fcfeb868db8a794cbe9f227299402db58cfcc858766c/tomli-2.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b74a0e59ec5d15127acdabd75ea17726ac4c5178ae51b85bfe39c4f8a278e879", size = 245835, upload-time = "2025-10-08T22:01:32.989Z" }, - { url = "https://files.pythonhosted.org/packages/fd/42/8e3c6a9a4b1a1360c1a2a39f0b972cef2cc9ebd56025168c4137192a9321/tomli-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5870b50c9db823c595983571d1296a6ff3e1b88f734a4c8f6fc6188397de005", size = 253109, upload-time = "2025-10-08T22:01:34.052Z" }, - { url = "https://files.pythonhosted.org/packages/22/0c/b4da635000a71b5f80130937eeac12e686eefb376b8dee113b4a582bba42/tomli-2.3.0-cp314-cp314-win32.whl", hash = "sha256:feb0dacc61170ed7ab602d3d972a58f14ee3ee60494292d384649a3dc38ef463", size = 97930, upload-time = "2025-10-08T22:01:35.082Z" }, - { url = "https://files.pythonhosted.org/packages/b9/74/cb1abc870a418ae99cd5c9547d6bce30701a954e0e721821df483ef7223c/tomli-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:b273fcbd7fc64dc3600c098e39136522650c49bca95df2d11cf3b626422392c8", size = 107964, upload-time = "2025-10-08T22:01:36.057Z" }, - { url = "https://files.pythonhosted.org/packages/54/78/5c46fff6432a712af9f792944f4fcd7067d8823157949f4e40c56b8b3c83/tomli-2.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:940d56ee0410fa17ee1f12b817b37a4d4e4dc4d27340863cc67236c74f582e77", size = 163065, upload-time = "2025-10-08T22:01:37.27Z" }, - { url = "https://files.pythonhosted.org/packages/39/67/f85d9bd23182f45eca8939cd2bc7050e1f90c41f4a2ecbbd5963a1d1c486/tomli-2.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f85209946d1fe94416debbb88d00eb92ce9cd5266775424ff81bc959e001acaf", size = 159088, upload-time = "2025-10-08T22:01:38.235Z" }, - { url = "https://files.pythonhosted.org/packages/26/5a/4b546a0405b9cc0659b399f12b6adb750757baf04250b148d3c5059fc4eb/tomli-2.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a56212bdcce682e56b0aaf79e869ba5d15a6163f88d5451cbde388d48b13f530", size = 268193, upload-time = "2025-10-08T22:01:39.712Z" }, - { url = "https://files.pythonhosted.org/packages/42/4f/2c12a72ae22cf7b59a7fe75b3465b7aba40ea9145d026ba41cb382075b0e/tomli-2.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5f3ffd1e098dfc032d4d3af5c0ac64f6d286d98bc148698356847b80fa4de1b", size = 275488, upload-time = "2025-10-08T22:01:40.773Z" }, - { url = "https://files.pythonhosted.org/packages/92/04/a038d65dbe160c3aa5a624e93ad98111090f6804027d474ba9c37c8ae186/tomli-2.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e01decd096b1530d97d5d85cb4dff4af2d8347bd35686654a004f8dea20fc67", size = 272669, upload-time = "2025-10-08T22:01:41.824Z" }, - { url = "https://files.pythonhosted.org/packages/be/2f/8b7c60a9d1612a7cbc39ffcca4f21a73bf368a80fc25bccf8253e2563267/tomli-2.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8a35dd0e643bb2610f156cca8db95d213a90015c11fee76c946aa62b7ae7e02f", size = 279709, upload-time = "2025-10-08T22:01:43.177Z" }, - { url = "https://files.pythonhosted.org/packages/7e/46/cc36c679f09f27ded940281c38607716c86cf8ba4a518d524e349c8b4874/tomli-2.3.0-cp314-cp314t-win32.whl", hash = "sha256:a1f7f282fe248311650081faafa5f4732bdbfef5d45fe3f2e702fbc6f2d496e0", size = 107563, upload-time = "2025-10-08T22:01:44.233Z" }, - { url = "https://files.pythonhosted.org/packages/84/ff/426ca8683cf7b753614480484f6437f568fd2fda2edbdf57a2d3d8b27a0b/tomli-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:70a251f8d4ba2d9ac2542eecf008b3c8a9fc5c3f9f02c56a9d7952612be2fdba", size = 119756, upload-time = "2025-10-08T22:01:45.234Z" }, - { url = "https://files.pythonhosted.org/packages/77/b8/0135fadc89e73be292b473cb820b4f5a08197779206b33191e801feeae40/tomli-2.3.0-py3-none-any.whl", hash = "sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b", size = 14408, upload-time = "2025-10-08T22:01:46.04Z" }, +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/30/31573e9457673ab10aa432461bee537ce6cef177667deca369efb79df071/tomli-2.4.0.tar.gz", hash = "sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c", size = 17477, upload-time = "2026-01-11T11:22:38.165Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/d9/3dc2289e1f3b32eb19b9785b6a006b28ee99acb37d1d47f78d4c10e28bf8/tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867", size = 153663, upload-time = "2026-01-11T11:21:45.27Z" }, + { url = "https://files.pythonhosted.org/packages/51/32/ef9f6845e6b9ca392cd3f64f9ec185cc6f09f0a2df3db08cbe8809d1d435/tomli-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9", size = 148469, upload-time = "2026-01-11T11:21:46.873Z" }, + { url = "https://files.pythonhosted.org/packages/d6/c2/506e44cce89a8b1b1e047d64bd495c22c9f71f21e05f380f1a950dd9c217/tomli-2.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:551e321c6ba03b55676970b47cb1b73f14a0a4dce6a3e1a9458fd6d921d72e95", size = 236039, upload-time = "2026-01-11T11:21:48.503Z" }, + { url = "https://files.pythonhosted.org/packages/b3/40/e1b65986dbc861b7e986e8ec394598187fa8aee85b1650b01dd925ca0be8/tomli-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76", size = 243007, upload-time = "2026-01-11T11:21:49.456Z" }, + { url = "https://files.pythonhosted.org/packages/9c/6f/6e39ce66b58a5b7ae572a0f4352ff40c71e8573633deda43f6a379d56b3e/tomli-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b168f2731796b045128c45982d3a4874057626da0e2ef1fdd722848b741361d", size = 240875, upload-time = "2026-01-11T11:21:50.755Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ad/cb089cb190487caa80204d503c7fd0f4d443f90b95cf4ef5cf5aa0f439b0/tomli-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:133e93646ec4300d651839d382d63edff11d8978be23da4cc106f5a18b7d0576", size = 246271, upload-time = "2026-01-11T11:21:51.81Z" }, + { url = "https://files.pythonhosted.org/packages/0b/63/69125220e47fd7a3a27fd0de0c6398c89432fec41bc739823bcc66506af6/tomli-2.4.0-cp311-cp311-win32.whl", hash = "sha256:b6c78bdf37764092d369722d9946cb65b8767bfa4110f902a1b2542d8d173c8a", size = 96770, upload-time = "2026-01-11T11:21:52.647Z" }, + { url = "https://files.pythonhosted.org/packages/1e/0d/a22bb6c83f83386b0008425a6cd1fa1c14b5f3dd4bad05e98cf3dbbf4a64/tomli-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:d3d1654e11d724760cdb37a3d7691f0be9db5fbdaef59c9f532aabf87006dbaa", size = 107626, upload-time = "2026-01-11T11:21:53.459Z" }, + { url = "https://files.pythonhosted.org/packages/2f/6d/77be674a3485e75cacbf2ddba2b146911477bd887dda9d8c9dfb2f15e871/tomli-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:cae9c19ed12d4e8f3ebf46d1a75090e4c0dc16271c5bce1c833ac168f08fb614", size = 94842, upload-time = "2026-01-11T11:21:54.831Z" }, + { url = "https://files.pythonhosted.org/packages/3c/43/7389a1869f2f26dba52404e1ef13b4784b6b37dac93bac53457e3ff24ca3/tomli-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:920b1de295e72887bafa3ad9f7a792f811847d57ea6b1215154030cf131f16b1", size = 154894, upload-time = "2026-01-11T11:21:56.07Z" }, + { url = "https://files.pythonhosted.org/packages/e9/05/2f9bf110b5294132b2edf13fe6ca6ae456204f3d749f623307cbb7a946f2/tomli-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6d9a4aee98fac3eab4952ad1d73aee87359452d1c086b5ceb43ed02ddb16b8", size = 149053, upload-time = "2026-01-11T11:21:57.467Z" }, + { url = "https://files.pythonhosted.org/packages/e8/41/1eda3ca1abc6f6154a8db4d714a4d35c4ad90adc0bcf700657291593fbf3/tomli-2.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36b9d05b51e65b254ea6c2585b59d2c4cb91c8a3d91d0ed0f17591a29aaea54a", size = 243481, upload-time = "2026-01-11T11:21:58.661Z" }, + { url = "https://files.pythonhosted.org/packages/d2/6d/02ff5ab6c8868b41e7d4b987ce2b5f6a51d3335a70aa144edd999e055a01/tomli-2.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c8a885b370751837c029ef9bc014f27d80840e48bac415f3412e6593bbc18c1", size = 251720, upload-time = "2026-01-11T11:22:00.178Z" }, + { url = "https://files.pythonhosted.org/packages/7b/57/0405c59a909c45d5b6f146107c6d997825aa87568b042042f7a9c0afed34/tomli-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8768715ffc41f0008abe25d808c20c3d990f42b6e2e58305d5da280ae7d1fa3b", size = 247014, upload-time = "2026-01-11T11:22:01.238Z" }, + { url = "https://files.pythonhosted.org/packages/2c/0e/2e37568edd944b4165735687cbaf2fe3648129e440c26d02223672ee0630/tomli-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b438885858efd5be02a9a133caf5812b8776ee0c969fea02c45e8e3f296ba51", size = 251820, upload-time = "2026-01-11T11:22:02.727Z" }, + { url = "https://files.pythonhosted.org/packages/5a/1c/ee3b707fdac82aeeb92d1a113f803cf6d0f37bdca0849cb489553e1f417a/tomli-2.4.0-cp312-cp312-win32.whl", hash = "sha256:0408e3de5ec77cc7f81960c362543cbbd91ef883e3138e81b729fc3eea5b9729", size = 97712, upload-time = "2026-01-11T11:22:03.777Z" }, + { url = "https://files.pythonhosted.org/packages/69/13/c07a9177d0b3bab7913299b9278845fc6eaaca14a02667c6be0b0a2270c8/tomli-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:685306e2cc7da35be4ee914fd34ab801a6acacb061b6a7abca922aaf9ad368da", size = 108296, upload-time = "2026-01-11T11:22:04.86Z" }, + { url = "https://files.pythonhosted.org/packages/18/27/e267a60bbeeee343bcc279bb9e8fbed0cbe224bc7b2a3dc2975f22809a09/tomli-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:5aa48d7c2356055feef06a43611fc401a07337d5b006be13a30f6c58f869e3c3", size = 94553, upload-time = "2026-01-11T11:22:05.854Z" }, + { url = "https://files.pythonhosted.org/packages/34/91/7f65f9809f2936e1f4ce6268ae1903074563603b2a2bd969ebbda802744f/tomli-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84d081fbc252d1b6a982e1870660e7330fb8f90f676f6e78b052ad4e64714bf0", size = 154915, upload-time = "2026-01-11T11:22:06.703Z" }, + { url = "https://files.pythonhosted.org/packages/20/aa/64dd73a5a849c2e8f216b755599c511badde80e91e9bc2271baa7b2cdbb1/tomli-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9a08144fa4cba33db5255f9b74f0b89888622109bd2776148f2597447f92a94e", size = 149038, upload-time = "2026-01-11T11:22:07.56Z" }, + { url = "https://files.pythonhosted.org/packages/9e/8a/6d38870bd3d52c8d1505ce054469a73f73a0fe62c0eaf5dddf61447e32fa/tomli-2.4.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c73add4bb52a206fd0c0723432db123c0c75c280cbd67174dd9d2db228ebb1b4", size = 242245, upload-time = "2026-01-11T11:22:08.344Z" }, + { url = "https://files.pythonhosted.org/packages/59/bb/8002fadefb64ab2669e5b977df3f5e444febea60e717e755b38bb7c41029/tomli-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fb2945cbe303b1419e2706e711b7113da57b7db31ee378d08712d678a34e51e", size = 250335, upload-time = "2026-01-11T11:22:09.951Z" }, + { url = "https://files.pythonhosted.org/packages/a5/3d/4cdb6f791682b2ea916af2de96121b3cb1284d7c203d97d92d6003e91c8d/tomli-2.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bbb1b10aa643d973366dc2cb1ad94f99c1726a02343d43cbc011edbfac579e7c", size = 245962, upload-time = "2026-01-11T11:22:11.27Z" }, + { url = "https://files.pythonhosted.org/packages/f2/4a/5f25789f9a460bd858ba9756ff52d0830d825b458e13f754952dd15fb7bb/tomli-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4cbcb367d44a1f0c2be408758b43e1ffb5308abe0ea222897d6bfc8e8281ef2f", size = 250396, upload-time = "2026-01-11T11:22:12.325Z" }, + { url = "https://files.pythonhosted.org/packages/aa/2f/b73a36fea58dfa08e8b3a268750e6853a6aac2a349241a905ebd86f3047a/tomli-2.4.0-cp313-cp313-win32.whl", hash = "sha256:7d49c66a7d5e56ac959cb6fc583aff0651094ec071ba9ad43df785abc2320d86", size = 97530, upload-time = "2026-01-11T11:22:13.865Z" }, + { url = "https://files.pythonhosted.org/packages/3b/af/ca18c134b5d75de7e8dc551c5234eaba2e8e951f6b30139599b53de9c187/tomli-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:3cf226acb51d8f1c394c1b310e0e0e61fecdd7adcb78d01e294ac297dd2e7f87", size = 108227, upload-time = "2026-01-11T11:22:15.224Z" }, + { url = "https://files.pythonhosted.org/packages/22/c3/b386b832f209fee8073c8138ec50f27b4460db2fdae9ffe022df89a57f9b/tomli-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:d20b797a5c1ad80c516e41bc1fb0443ddb5006e9aaa7bda2d71978346aeb9132", size = 94748, upload-time = "2026-01-11T11:22:16.009Z" }, + { url = "https://files.pythonhosted.org/packages/f3/c4/84047a97eb1004418bc10bdbcfebda209fca6338002eba2dc27cc6d13563/tomli-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:26ab906a1eb794cd4e103691daa23d95c6919cc2fa9160000ac02370cc9dd3f6", size = 154725, upload-time = "2026-01-11T11:22:17.269Z" }, + { url = "https://files.pythonhosted.org/packages/a8/5d/d39038e646060b9d76274078cddf146ced86dc2b9e8bbf737ad5983609a0/tomli-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:20cedb4ee43278bc4f2fee6cb50daec836959aadaf948db5172e776dd3d993fc", size = 148901, upload-time = "2026-01-11T11:22:18.287Z" }, + { url = "https://files.pythonhosted.org/packages/73/e5/383be1724cb30f4ce44983d249645684a48c435e1cd4f8b5cded8a816d3c/tomli-2.4.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:39b0b5d1b6dd03684b3fb276407ebed7090bbec989fa55838c98560c01113b66", size = 243375, upload-time = "2026-01-11T11:22:19.154Z" }, + { url = "https://files.pythonhosted.org/packages/31/f0/bea80c17971c8d16d3cc109dc3585b0f2ce1036b5f4a8a183789023574f2/tomli-2.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a26d7ff68dfdb9f87a016ecfd1e1c2bacbe3108f4e0f8bcd2228ef9a766c787d", size = 250639, upload-time = "2026-01-11T11:22:20.168Z" }, + { url = "https://files.pythonhosted.org/packages/2c/8f/2853c36abbb7608e3f945d8a74e32ed3a74ee3a1f468f1ffc7d1cb3abba6/tomli-2.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:20ffd184fb1df76a66e34bd1b36b4a4641bd2b82954befa32fe8163e79f1a702", size = 246897, upload-time = "2026-01-11T11:22:21.544Z" }, + { url = "https://files.pythonhosted.org/packages/49/f0/6c05e3196ed5337b9fe7ea003e95fd3819a840b7a0f2bf5a408ef1dad8ed/tomli-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75c2f8bbddf170e8effc98f5e9084a8751f8174ea6ccf4fca5398436e0320bc8", size = 254697, upload-time = "2026-01-11T11:22:23.058Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f5/2922ef29c9f2951883525def7429967fc4d8208494e5ab524234f06b688b/tomli-2.4.0-cp314-cp314-win32.whl", hash = "sha256:31d556d079d72db7c584c0627ff3a24c5d3fb4f730221d3444f3efb1b2514776", size = 98567, upload-time = "2026-01-11T11:22:24.033Z" }, + { url = "https://files.pythonhosted.org/packages/7b/31/22b52e2e06dd2a5fdbc3ee73226d763b184ff21fc24e20316a44ccc4d96b/tomli-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:43e685b9b2341681907759cf3a04e14d7104b3580f808cfde1dfdb60ada85475", size = 108556, upload-time = "2026-01-11T11:22:25.378Z" }, + { url = "https://files.pythonhosted.org/packages/48/3d/5058dff3255a3d01b705413f64f4306a141a8fd7a251e5a495e3f192a998/tomli-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:3d895d56bd3f82ddd6faaff993c275efc2ff38e52322ea264122d72729dca2b2", size = 96014, upload-time = "2026-01-11T11:22:26.138Z" }, + { url = "https://files.pythonhosted.org/packages/b8/4e/75dab8586e268424202d3a1997ef6014919c941b50642a1682df43204c22/tomli-2.4.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:5b5807f3999fb66776dbce568cc9a828544244a8eb84b84b9bafc080c99597b9", size = 163339, upload-time = "2026-01-11T11:22:27.143Z" }, + { url = "https://files.pythonhosted.org/packages/06/e3/b904d9ab1016829a776d97f163f183a48be6a4deb87304d1e0116a349519/tomli-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c084ad935abe686bd9c898e62a02a19abfc9760b5a79bc29644463eaf2840cb0", size = 159490, upload-time = "2026-01-11T11:22:28.399Z" }, + { url = "https://files.pythonhosted.org/packages/e3/5a/fc3622c8b1ad823e8ea98a35e3c632ee316d48f66f80f9708ceb4f2a0322/tomli-2.4.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f2e3955efea4d1cfbcb87bc321e00dc08d2bcb737fd1d5e398af111d86db5df", size = 269398, upload-time = "2026-01-11T11:22:29.345Z" }, + { url = "https://files.pythonhosted.org/packages/fd/33/62bd6152c8bdd4c305ad9faca48f51d3acb2df1f8791b1477d46ff86e7f8/tomli-2.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e0fe8a0b8312acf3a88077a0802565cb09ee34107813bba1c7cd591fa6cfc8d", size = 276515, upload-time = "2026-01-11T11:22:30.327Z" }, + { url = "https://files.pythonhosted.org/packages/4b/ff/ae53619499f5235ee4211e62a8d7982ba9e439a0fb4f2f351a93d67c1dd2/tomli-2.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:413540dce94673591859c4c6f794dfeaa845e98bf35d72ed59636f869ef9f86f", size = 273806, upload-time = "2026-01-11T11:22:32.56Z" }, + { url = "https://files.pythonhosted.org/packages/47/71/cbca7787fa68d4d0a9f7072821980b39fbb1b6faeb5f5cf02f4a5559fa28/tomli-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0dc56fef0e2c1c470aeac5b6ca8cc7b640bb93e92d9803ddaf9ea03e198f5b0b", size = 281340, upload-time = "2026-01-11T11:22:33.505Z" }, + { url = "https://files.pythonhosted.org/packages/f5/00/d595c120963ad42474cf6ee7771ad0d0e8a49d0f01e29576ee9195d9ecdf/tomli-2.4.0-cp314-cp314t-win32.whl", hash = "sha256:d878f2a6707cc9d53a1be1414bbb419e629c3d6e67f69230217bb663e76b5087", size = 108106, upload-time = "2026-01-11T11:22:34.451Z" }, + { url = "https://files.pythonhosted.org/packages/de/69/9aa0c6a505c2f80e519b43764f8b4ba93b5a0bbd2d9a9de6e2b24271b9a5/tomli-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2add28aacc7425117ff6364fe9e06a183bb0251b03f986df0e78e974047571fd", size = 120504, upload-time = "2026-01-11T11:22:35.764Z" }, + { url = "https://files.pythonhosted.org/packages/b3/9f/f1668c281c58cfae01482f7114a4b88d345e4c140386241a1a24dcc9e7bc/tomli-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2b1e3b80e1d5e52e40e9b924ec43d81570f0e7d09d11081b797bc4692765a3d4", size = 99561, upload-time = "2026-01-11T11:22:36.624Z" }, + { url = "https://files.pythonhosted.org/packages/23/d1/136eb2cb77520a31e1f64cbae9d33ec6df0d78bdf4160398e86eec8a8754/tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a", size = 14477, upload-time = "2026-01-11T11:22:37.446Z" }, ] [[package]] @@ -891,7 +925,7 @@ wheels = [ [[package]] name = "virtualenv" -version = "20.35.4" +version = "20.36.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "distlib" }, @@ -899,7 +933,7 @@ dependencies = [ { name = "platformdirs" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/20/28/e6f1a6f655d620846bd9df527390ecc26b3805a0c5989048c210e22c5ca9/virtualenv-20.35.4.tar.gz", hash = "sha256:643d3914d73d3eeb0c552cbb12d7e82adf0e504dbf86a3182f8771a153a1971c", size = 6028799, upload-time = "2025-10-29T06:57:40.511Z" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/a3/4d310fa5f00863544e1d0f4de93bddec248499ccf97d4791bc3122c9d4f3/virtualenv-20.36.1.tar.gz", hash = "sha256:8befb5c81842c641f8ee658481e42641c68b5eab3521d8e092d18320902466ba", size = 6032239, upload-time = "2026-01-09T18:21:01.296Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/79/0c/c05523fa3181fdf0c9c52a6ba91a23fbf3246cc095f26f6516f9c60e6771/virtualenv-20.35.4-py3-none-any.whl", hash = "sha256:c21c9cede36c9753eeade68ba7d523529f228a403463376cf821eaae2b650f1b", size = 6005095, upload-time = "2025-10-29T06:57:37.598Z" }, + { url = "https://files.pythonhosted.org/packages/6a/2a/dc2228b2888f51192c7dc766106cd475f1b768c10caaf9727659726f7391/virtualenv-20.36.1-py3-none-any.whl", hash = "sha256:575a8d6b124ef88f6f51d56d656132389f961062a9177016a50e4f507bbcc19f", size = 6008258, upload-time = "2026-01-09T18:20:59.425Z" }, ]