diff --git a/_quarto.yml b/_quarto.yml index f249d19d8..d75d2b4af 100644 --- a/_quarto.yml +++ b/_quarto.yml @@ -88,6 +88,7 @@ quartodoc: - read_resource_batches - write_resource_batch - write_resource_data + - DataResourceError - title: "Package property dataclasses" desc: "Dataclasses to help create properties at the package level." diff --git a/pyproject.toml b/pyproject.toml index f69c0ad82..5fe55ba91 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,6 +33,7 @@ keywords = [ ] requires-python = ">=3.12" dependencies = [ + "check-datapackage>=0.23.1", "dacite>=1.9.2", "deepmerge>=2.0", "jinja2>=3.1.6", diff --git a/src/seedcase_sprout/__init__.py b/src/seedcase_sprout/__init__.py index 9d5382995..179d49fb3 100644 --- a/src/seedcase_sprout/__init__.py +++ b/src/seedcase_sprout/__init__.py @@ -8,6 +8,7 @@ from .as_readme_text import as_readme_text from .check_data import check_data from .check_properties import ( + DataResourceError, check_package_properties, check_properties, check_resource_properties, @@ -91,4 +92,5 @@ "check_properties", "check_resource_properties", "check_data", + "DataResourceError", ] diff --git a/src/seedcase_sprout/check_datapackage/__init__.py b/src/seedcase_sprout/check_datapackage/__init__.py deleted file mode 100644 index 2db067808..000000000 --- a/src/seedcase_sprout/check_datapackage/__init__.py +++ /dev/null @@ -1,27 +0,0 @@ -"""Check functions and constants for the Frictionless Data Package standard.""" - -from .check_error import CheckError -from .check_error_matcher import CheckErrorMatcher -from .check_package_properties import check_package_properties -from .check_properties import check_properties -from .check_resource_properties import check_resource_properties -from .constants import ( - PACKAGE_RECOMMENDED_FIELDS, - PACKAGE_REQUIRED_FIELDS, - RESOURCE_REQUIRED_FIELDS, - RequiredFieldType, -) -from .exclude_matching_errors import exclude_matching_errors - -__all__ = [ - "CheckError", - "CheckErrorMatcher", - "check_properties", - "check_package_properties", - "check_resource_properties", - "PACKAGE_RECOMMENDED_FIELDS", - "PACKAGE_REQUIRED_FIELDS", - "RESOURCE_REQUIRED_FIELDS", - "RequiredFieldType", - "exclude_matching_errors", -] diff --git a/src/seedcase_sprout/check_datapackage/check_error.py b/src/seedcase_sprout/check_datapackage/check_error.py deleted file mode 100644 index 83bd0e84e..000000000 --- a/src/seedcase_sprout/check_datapackage/check_error.py +++ /dev/null @@ -1,89 +0,0 @@ -from functools import total_ordering - - -@total_ordering -class CheckError(Exception): - """Raised or returned when a properties object fails a single check.""" - - def __init__( - self, - message: str, - json_path: str, - validator: str, - ): - """Initialises CheckError. - - Args: - message: The error message. - json_path: The path to the JSON field within the enclosing JSON object where - the error occurred. - validator: The name of the validator that failed. - """ - self.message = message - self.json_path = json_path - self.validator = validator - super().__init__(self.__str__()) - - def __eq__(self, other: object) -> bool: - """Checks if this error is equal to an object. - - Args: - other: The object to compare. - - Returns: - If the objects are equal. - """ - if not isinstance(other, CheckError): - return NotImplemented - return ( - self.message == other.message - and self.json_path == other.json_path - and self.validator == other.validator - ) - - def __lt__(self, other: object) -> bool: - """Checks if this error is less than an object. - - Args: - other: The object to compare. - - Returns: - The result of the comparison. - """ - if not isinstance(other, CheckError): - return NotImplemented - return (self.json_path, self.validator, self.message) < ( - other.json_path, - other.validator, - other.message, - ) - - def __hash__(self) -> int: - """Returns a hash for this error. - - Returns: - The hash. - """ - return hash((self.message, self.json_path, self.validator)) - - def __str__(self) -> str: - """Returns a user-friendly string representation of the error. - - Returns: - The string representation. - """ - return ( - f"Error at `{self.json_path}` caused by `{self.validator}`: {self.message}" - ) - - def __repr__(self) -> str: - """Returns a developer-friendly, unambiguous representation of the error. - - Returns: - The developer-friendly representation. - """ - return ( - f"CheckError(message={self.message!r}, " - f"json_path={self.json_path!r}, " - f"validator={self.validator!r})" - ) diff --git a/src/seedcase_sprout/check_datapackage/check_error_matcher.py b/src/seedcase_sprout/check_datapackage/check_error_matcher.py deleted file mode 100644 index d00c14cb9..000000000 --- a/src/seedcase_sprout/check_datapackage/check_error_matcher.py +++ /dev/null @@ -1,85 +0,0 @@ -import re -from dataclasses import dataclass - -from seedcase_sprout.check_datapackage.check_error import CheckError - - -@dataclass -class CheckErrorMatcher: - r"""A class that helps to filter `CheckError`s based on their attributes. - - Examples: - ```{python} - error = CheckError( - message="123 is not of type 'string'", - json_path="$.resources[0].name", - validator="type", - ) - matcher = CheckErrorMatcher( - message="of type 'string'", - json_path=r"resources\[.\]", - validator="type", - ) - matcher.matches(error) - - ``` - """ - - # The substring to find in the error message. - message: str | None = None - # The subpath to find in the error's `json_path`. Expressed as a regular expression. - json_path: str | None = None - # The validator to match. - validator: str | None = None - - def matches(self, error: CheckError) -> bool: - """Determines if this matcher matches the given `CheckError`. - - Args: - error: The `CheckError` to match. - - Returns: - If there was a match. - """ - return ( - self.message_matches(error) - and self.json_path_matches(error) - and self.validator_matches(error) - ) - - def message_matches(self, error: CheckError) -> bool: - """Determines if this matcher matches the message of the given `CheckError`. - - Args: - error: The `CheckError` to match. - - Returns: - If there was a match. - """ - return self.message is None or self.message in error.message - - def json_path_matches(self, error: CheckError) -> bool: - """Determines if this matcher matches the `json_path` of the given `CheckError`. - - Matching regular expressions is supported. - - Args: - error: The `CheckError` to match. - - Returns: - If there was a match. - """ - if self.json_path is None: - return True - return re.search(self.json_path, error.json_path) is not None - - def validator_matches(self, error: CheckError) -> bool: - """Determines if this matcher matches the validator of the given `CheckError`. - - Args: - error: The `CheckError` to match. - - Returns: - If there was a match. - """ - return self.validator is None or self.validator == error.validator diff --git a/src/seedcase_sprout/check_datapackage/check_package_properties.py b/src/seedcase_sprout/check_datapackage/check_package_properties.py deleted file mode 100644 index 5f7e8a0f1..000000000 --- a/src/seedcase_sprout/check_datapackage/check_package_properties.py +++ /dev/null @@ -1,47 +0,0 @@ -from typing import Any - -from seedcase_sprout.check_datapackage.check_error import CheckError -from seedcase_sprout.check_datapackage.constants import ( - DATA_PACKAGE_SCHEMA_PATH, -) -from seedcase_sprout.check_datapackage.internals import ( - _add_package_recommendations, - _check_object_against_json_schema, - _read_json, -) - - -def check_package_properties( - properties: dict[str, Any], check_recommendations: bool = True -) -> list[CheckError]: - """Checks that `properties` matches the Data Package standard (v2.0). - - Only package properties are checked. Schema constraints for resource properties are - removed, so the internal structure of resource properties is not checked. - Structural, type and format constraints are all checked. All schema violations are - collected before errors are returned. - - The schema loaded or constructed in this function overrides any values specified - in the `$schema` attribute of `properties`, including the default value. - - Args: - properties: The package properties to check. - check_recommendations: Whether `properties` should be checked against - recommendations in the Data Package standard in addition to requirements. - Defaults to True. - - Returns: - A list of errors. An empty list, if no errors are found. - """ - schema = _read_json(DATA_PACKAGE_SCHEMA_PATH) - - # Recommendations from the Data Package standard - if check_recommendations: - _add_package_recommendations(schema) - - # Remove schema constraints for resource properties - schema["required"].remove("resources") - del schema["properties"]["resources"]["minItems"] - del schema["properties"]["resources"]["items"] - - return _check_object_against_json_schema(properties, schema) diff --git a/src/seedcase_sprout/check_datapackage/check_properties.py b/src/seedcase_sprout/check_datapackage/check_properties.py deleted file mode 100644 index e2920fab3..000000000 --- a/src/seedcase_sprout/check_datapackage/check_properties.py +++ /dev/null @@ -1,40 +0,0 @@ -from typing import Any - -from seedcase_sprout.check_datapackage.check_error import CheckError -from seedcase_sprout.check_datapackage.constants import DATA_PACKAGE_SCHEMA_PATH -from seedcase_sprout.check_datapackage.internals import ( - _add_package_recommendations, - _add_resource_recommendations, - _check_object_against_json_schema, - _read_json, -) - - -def check_properties( - properties: dict[str, Any], check_recommendations: bool = True -) -> list[CheckError]: - """Checks that `properties` matches the Data Package standard (v2.0). - - Both package and resource properties are checked. Structural, type and format - constraints are all checked. All schema violations are - collected before errors are returned. - - The schema loaded or constructed in this function overrides any values specified - in the `$schema` attribute of `properties`, including the default value. - - Args: - properties: The full package properties to check, including resource properties. - check_recommendations: Whether `properties` should be checked against - recommendations in the Data Package standard in addition to requirements. - Defaults to True. - - Returns: - A list of errors. An empty list, if no errors are found. - """ - schema = _read_json(DATA_PACKAGE_SCHEMA_PATH) - - if check_recommendations: - _add_package_recommendations(schema) - _add_resource_recommendations(schema) - - return _check_object_against_json_schema(properties, schema) diff --git a/src/seedcase_sprout/check_datapackage/check_resource_properties.py b/src/seedcase_sprout/check_datapackage/check_resource_properties.py deleted file mode 100644 index 48213e1fc..000000000 --- a/src/seedcase_sprout/check_datapackage/check_resource_properties.py +++ /dev/null @@ -1,41 +0,0 @@ -from typing import Any - -from seedcase_sprout.check_datapackage.check_error import CheckError -from seedcase_sprout.check_datapackage.constants import DATA_PACKAGE_SCHEMA_PATH -from seedcase_sprout.check_datapackage.internals import ( - _add_resource_recommendations, - _check_object_against_json_schema, - _read_json, -) - - -def check_resource_properties( - properties: dict[str, Any], check_recommendations: bool = True -) -> list[CheckError]: - """Checks that the resource `properties` matches the Data Resource standard (v2.0). - - This function expects an individual set of resource properties as input. Structural, - type and format constraints are all checked. All schema violations are collected - before errors are returned. - - The schema loaded or constructed in this function overrides any values specified - in the `$schema` attribute of `properties`, including the default value. - - Args: - properties: The resource properties to check. - check_recommendations: Whether `properties` should be checked against - recommendations in the Data Resource standard in addition to requirements. - Defaults to True. - - Returns: - A list of errors. An empty list, if no errors are found. - """ - schema = _read_json(DATA_PACKAGE_SCHEMA_PATH) - - # Recommendations from the Data Package standard - if check_recommendations: - _add_resource_recommendations(schema) - - # Consider only Data Resource schema - schema = schema["properties"]["resources"]["items"] - return _check_object_against_json_schema(properties, schema) diff --git a/src/seedcase_sprout/check_datapackage/constants.py b/src/seedcase_sprout/check_datapackage/constants.py deleted file mode 100644 index ad1a2d349..000000000 --- a/src/seedcase_sprout/check_datapackage/constants.py +++ /dev/null @@ -1,49 +0,0 @@ -from enum import Enum -from importlib.resources import files -from pathlib import Path - - -# Data Package standard required fields and their types -class RequiredFieldType(str, Enum): - """A class enumerating allowed types for required fields.""" - - str = "str" - list = "list" - any = "any" - - -COMPLEX_VALIDATORS = {"allOf", "anyOf", "oneOf"} - -DATA_PACKAGE_SCHEMA_PATH = Path( - str( - files("seedcase_sprout.check_datapackage.schemas").joinpath( - "data-package-schema.json" - ) - ) -) - -NAME_PATTERN = r"^[a-z0-9._-]+$" - -PACKAGE_RECOMMENDED_FIELDS = { - "name": RequiredFieldType.str, - "id": RequiredFieldType.str, - "licenses": RequiredFieldType.list, -} - -PACKAGE_REQUIRED_FIELDS = { - "resources": RequiredFieldType.list, -} - -RESOURCE_REQUIRED_FIELDS = { - "name": RequiredFieldType.str, - "path": RequiredFieldType.str, - "data": RequiredFieldType.any, -} - -# From https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string -SEMVER_PATTERN = ( - r"^(?P0|[1-9]\d*)\.(?P0|[1-9]\d*)\.(?P0|[1-9]\d*)" - r"(?:-(?P(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0" - r"|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?P" - r"[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$" -) diff --git a/src/seedcase_sprout/check_datapackage/exclude_matching_errors.py b/src/seedcase_sprout/check_datapackage/exclude_matching_errors.py deleted file mode 100644 index 7f40ca5e0..000000000 --- a/src/seedcase_sprout/check_datapackage/exclude_matching_errors.py +++ /dev/null @@ -1,21 +0,0 @@ -from seedcase_sprout.check_datapackage.check_error import CheckError -from seedcase_sprout.check_datapackage.check_error_matcher import CheckErrorMatcher - - -def exclude_matching_errors( - errors: list[CheckError], matchers: list[CheckErrorMatcher] -) -> list[CheckError]: - """Returns a new list of errors, with errors matched by any `matchers` filtered out. - - Args: - errors: The errors to exclude matching errors from. - matchers: The matches to exclude. - - Returns: - A list of errors without any errors that matched. - """ - return [ - error - for error in errors - if not any(matcher.matches(error) for matcher in matchers) - ] diff --git a/src/seedcase_sprout/check_datapackage/internals.py b/src/seedcase_sprout/check_datapackage/internals.py deleted file mode 100644 index fb9d03d52..000000000 --- a/src/seedcase_sprout/check_datapackage/internals.py +++ /dev/null @@ -1,160 +0,0 @@ -import re -from json import loads -from pathlib import Path -from typing import Any, Iterator - -from jsonschema import Draft7Validator, FormatChecker, ValidationError - -from seedcase_sprout.check_datapackage.check_error import CheckError -from seedcase_sprout.check_datapackage.constants import ( - COMPLEX_VALIDATORS, - NAME_PATTERN, - PACKAGE_RECOMMENDED_FIELDS, - SEMVER_PATTERN, -) - - -def _read_json(path: Path) -> dict[str, Any]: - """Reads the contents of a JSON file into an object. - - Args: - path: The path to the file to load. - - Returns: - The contents of the file as an object. - - Raises: - JSONDecodeError: If the contents of the file cannot be de-serialised as JSON. - TypeError: If the object in the file is not a dictionary. - """ - loaded_object = loads(path.read_text()) - if not isinstance(loaded_object, dict): - raise TypeError( - f"Expected {path} to contain a JSON dictionary object " - f"but found {type(loaded_object)}." - ) - return loaded_object - - -def _add_package_recommendations(schema: dict[str, Any]) -> dict[str, Any]: - """Add recommendations from the Data Package standard to the schema. - - Modifies the schema in place. - - Args: - schema: The full Data Package schema. - - Returns: - The updated Data Package schema. - """ - schema["required"].extend(PACKAGE_RECOMMENDED_FIELDS.keys()) - schema["properties"]["name"]["pattern"] = NAME_PATTERN - schema["properties"]["version"]["pattern"] = SEMVER_PATTERN - schema["properties"]["contributors"]["items"]["required"] = ["title"] - schema["properties"]["sources"]["items"]["required"] = ["title"] - return schema - - -def _add_resource_recommendations(schema: dict[str, Any]) -> dict[str, Any]: - """Add recommendations from the Data Resource standard to the schema. - - Modifies the schema in place. - - Args: - schema: The full Data Package schema. - - Returns: - The updated Data Package schema. - """ - schema["properties"]["resources"]["items"]["properties"]["name"]["pattern"] = ( - NAME_PATTERN - ) - return schema - - -def _check_object_against_json_schema( - json_object: dict[str, Any], schema: dict[str, Any] -) -> list[CheckError]: - """Checks that `json_object` matches the given JSON schema. - - Structural, type and format constraints are all checked. All schema violations are - collected before errors are returned. - - Args: - json_object: The JSON object to check. - schema: The JSON schema to check against. - - Returns: - A list of errors. An empty list, if no errors are found. - - Raises: - jsonschema.exceptions.SchemaError: If the given schema is invalid. - """ - Draft7Validator.check_schema(schema) - validator = Draft7Validator(schema, format_checker=FormatChecker()) - return _validation_errors_to_check_errors(validator.iter_errors(json_object)) - - -def _validation_errors_to_check_errors( - validation_errors: Iterator[ValidationError], -) -> list[CheckError]: - """Transforms `jsonschema.ValidationError`s to more compact `CheckError`s. - - The list of errors is: - - - flattened - - filtered for summary-type errors - - filtered for duplicates - - sorted by error location - - Args: - validation_errors: The `jsonschema.ValidationError`s to transform. - - Returns: - A list of `CheckError`s. - """ - check_errors = [ - CheckError( - message=error.message, - json_path=_get_full_json_path_from_error(error), - validator=str(error.validator), - ) - for error in _unwrap_errors(list(validation_errors)) - if str(error.validator) not in COMPLEX_VALIDATORS - ] - return sorted(set(check_errors)) - - -def _unwrap_errors(errors: list[ValidationError]) -> list[ValidationError]: - """Recursively extracts all errors into a flat list of errors. - - Args: - errors: A nested list of errors. - - Returns: - A flat list of errors. - """ - unwrapped = [] - for error in errors: - unwrapped.append(error) - if error.context: - unwrapped.extend(_unwrap_errors(error.context)) - return unwrapped - - -def _get_full_json_path_from_error(error: ValidationError) -> str: - """Returns the full `json_path` to the error. - - For 'required' errors, the field name is extracted from the error message. - - Args: - error: The error to get the full `json_path` for. - - Returns: - The full `json_path` of the error. - """ - if str(error.validator) == "required": - match = re.search("'(.*)' is a required property", error.message) - if match: - return f"{error.json_path}.{match.group(1)}" - return error.json_path diff --git a/src/seedcase_sprout/check_datapackage/py.typed b/src/seedcase_sprout/check_datapackage/py.typed deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/seedcase_sprout/check_datapackage/schemas/data-package-schema.json b/src/seedcase_sprout/check_datapackage/schemas/data-package-schema.json deleted file mode 100644 index 82e540746..000000000 --- a/src/seedcase_sprout/check_datapackage/schemas/data-package-schema.json +++ /dev/null @@ -1,3161 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Data Package", - "description": "Data Package", - "type": "object", - "required": [ - "resources" - ], - "properties": { - "$schema": { - "default": "https://datapackage.org/profiles/1.0/datapackage.json", - "propertyOrder": 10, - "title": "Profile", - "description": "The profile of this descriptor.", - "type": "string" - }, - "name": { - "propertyOrder": 20, - "title": "Name", - "description": "An identifier string.", - "type": "string", - "context": "This is ideally a url-usable and human-readable name. Name `SHOULD` be invariant, meaning it `SHOULD NOT` change when its parent descriptor is updated.", - "examples": [ - "{\n \"name\": \"my-nice-name\"\n}\n" - ] - }, - "id": { - "propertyOrder": 30, - "title": "ID", - "description": "A property reserved for globally unique identifiers. Examples of identifiers that are unique include UUIDs and DOIs.", - "context": "A common usage pattern for Data Packages is as a packaging format within the bounds of a system or platform. In these cases, a unique identifier for a package is desired for common data handling workflows, such as updating an existing package. While at the level of the specification, global uniqueness cannot be validated, consumers using the `id` property `MUST` ensure identifiers are globally unique.", - "type": "string", - "examples": [ - "{\n \"id\": \"b03ec84-77fd-4270-813b-0c698943f7ce\"\n}\n", - "{\n \"id\": \"http://dx.doi.org/10.1594/PANGAEA.726855\"\n}\n" - ] - }, - "title": { - "propertyOrder": 40, - "title": "Title", - "description": "A human-readable title.", - "type": "string", - "examples": [ - "{\n \"title\": \"My Package Title\"\n}\n" - ] - }, - "description": { - "propertyOrder": 50, - "format": "textarea", - "title": "Description", - "description": "A text description. Markdown is encouraged.", - "type": "string", - "examples": [ - "{\n \"description\": \"# My Package description\\nAll about my package.\"\n}\n" - ] - }, - "homepage": { - "propertyOrder": 60, - "title": "Home Page", - "description": "The home on the web that is related to this data package.", - "type": "string", - "format": "uri", - "examples": [ - "{\n \"homepage\": \"http://example.com/\"\n}\n" - ] - }, - "version": { - "propertyOrder": 65, - "title": "Version", - "description": "A unique version number for this descriptor.", - "type": "string", - "examples": [ - "{\n \"version\": \"0.0.1\"\n}\n", - "{\n \"version\": \"1.0.1-beta\"\n}\n" - ] - }, - "created": { - "propertyOrder": 70, - "title": "Created", - "description": "The datetime on which this descriptor was created.", - "context": "The datetime must conform to the string formats for datetime as described in [RFC3339](https://tools.ietf.org/html/rfc3339#section-5.6)", - "type": "string", - "format": "date-time", - "examples": [ - "{\n \"created\": \"1985-04-12T23:20:50.52Z\"\n}\n" - ] - }, - "contributors": { - "propertyOrder": 80, - "title": "Contributors", - "description": "The contributors to this descriptor.", - "type": "array", - "minItems": 1, - "items": { - "title": "Contributor", - "description": "A contributor to this descriptor.", - "properties": { - "title": { - "title": "Title", - "description": "A human-readable title.", - "type": "string", - "examples": [ - "{\n \"title\": \"My Package Title\"\n}\n" - ] - }, - "path": { - "title": "Path", - "description": "A fully qualified URL, or a POSIX file path.", - "type": "string", - "pattern": "^((?=[^./~])(?!file:)((?!\\/\\.\\.\\/)(?!\\\\)(?!:\\/\\/).)*|(http|ftp)s?:\\/\\/.*)$", - "examples": [ - "{\n \"path\": \"file.csv\"\n}\n", - "{\n \"path\": \"http://example.com/file.csv\"\n}\n" - ], - "context": "Implementations need to negotiate the type of path provided, and dereference the data accordingly." - }, - "email": { - "title": "Email", - "description": "An email address.", - "type": "string", - "format": "email", - "examples": [ - "{\n \"email\": \"example@example.com\"\n}\n" - ] - }, - "givenName": { - "type": "string" - }, - "familyName": { - "type": "string" - }, - "organization": { - "title": "Organization", - "description": "An organizational affiliation for this contributor.", - "type": "string" - }, - "roles": { - "type": "array", - "minItems": 1, - "items": { - "type": "string" - } - } - }, - "minProperties": 1, - "context": "Use of this property does not imply that the person was the original creator of, or a contributor to, the data in the descriptor, but refers to the composition of the descriptor itself." - }, - "examples": [ - "{\n \"contributors\": [\n {\n \"title\": \"Joe Bloggs\"\n }\n ]\n}\n", - "{\n \"contributors\": [\n {\n \"title\": \"Joe Bloggs\",\n \"email\": \"joe@example.com\",\n \"role\": \"author\"\n }\n ]\n}\n" - ] - }, - "keywords": { - "propertyOrder": 90, - "title": "Keywords", - "description": "A list of keywords that describe this package.", - "type": "array", - "minItems": 1, - "items": { - "type": "string" - }, - "examples": [ - "{\n \"keywords\": [\n \"data\",\n \"fiscal\",\n \"transparency\"\n ]\n}\n" - ] - }, - "image": { - "propertyOrder": 100, - "title": "Image", - "description": "A image to represent this package.", - "type": "string", - "examples": [ - "{\n \"image\": \"http://example.com/image.jpg\"\n}\n", - "{\n \"image\": \"relative/to/image.jpg\"\n}\n" - ] - }, - "licenses": { - "propertyOrder": 110, - "title": "Licenses", - "description": "The license(s) under which this package is published.", - "type": "array", - "minItems": 1, - "items": { - "title": "License", - "description": "A license for this descriptor.", - "type": "object", - "anyOf": [ - { - "required": [ - "name" - ] - }, - { - "required": [ - "path" - ] - } - ], - "properties": { - "name": { - "title": "Open Definition license identifier", - "description": "MUST be an Open Definition license identifier, see http://licenses.opendefinition.org/", - "type": "string", - "pattern": "^([-a-zA-Z0-9._])+$" - }, - "path": { - "title": "Path", - "description": "A fully qualified URL, or a POSIX file path.", - "type": "string", - "pattern": "^((?=[^./~])(?!file:)((?!\\/\\.\\.\\/)(?!\\\\)(?!:\\/\\/).)*|(http|ftp)s?:\\/\\/.*)$", - "examples": [ - "{\n \"path\": \"file.csv\"\n}\n", - "{\n \"path\": \"http://example.com/file.csv\"\n}\n" - ], - "context": "Implementations need to negotiate the type of path provided, and dereference the data accordingly." - }, - "title": { - "title": "Title", - "description": "A human-readable title.", - "type": "string", - "examples": [ - "{\n \"title\": \"My Package Title\"\n}\n" - ] - } - }, - "context": "Use of this property does not imply that the person was the original creator of, or a contributor to, the data in the descriptor, but refers to the composition of the descriptor itself." - }, - "context": "This property is not legally binding and does not guarantee that the package is licensed under the terms defined herein.", - "examples": [ - "{\n \"licenses\": [\n {\n \"name\": \"odc-pddl-1.0\",\n \"path\": \"http://opendatacommons.org/licenses/pddl/\",\n \"title\": \"Open Data Commons Public Domain Dedication and License v1.0\"\n }\n ]\n}\n" - ] - }, - "resources": { - "propertyOrder": 120, - "title": "Data Resources", - "description": "An `array` of Data Resource objects, each compliant with the [Data Resource](/data-resource/) specification.", - "type": "array", - "minItems": 1, - "items": { - "title": "Data Resource", - "description": "Data Resource.", - "type": "object", - "oneOf": [ - { - "required": [ - "name", - "data" - ] - }, - { - "required": [ - "name", - "path" - ] - } - ], - "properties": { - "$schema": { - "default": "https://datapackage.org/profiles/1.0/dataresource.json", - "propertyOrder": 10, - "title": "Profile", - "description": "The profile of this descriptor.", - "type": "string" - }, - "name": { - "propertyOrder": 20, - "title": "Name", - "description": "An identifier string.", - "type": "string", - "context": "This is ideally a url-usable and human-readable name. Name `SHOULD` be invariant, meaning it `SHOULD NOT` change when its parent descriptor is updated.", - "examples": [ - "{\n \"name\": \"my-nice-name\"\n}\n" - ] - }, - "path": { - "propertyOrder": 30, - "title": "Path", - "description": "A reference to the data for this resource, as either a path as a string, or an array of paths as strings. of valid URIs.", - "oneOf": [ - { - "title": "Path", - "description": "A fully qualified URL, or a POSIX file path.", - "type": "string", - "pattern": "^((?=[^./~])(?!file:)((?!\\/\\.\\.\\/)(?!\\\\)(?!:\\/\\/).)*|(http|ftp)s?:\\/\\/.*)$", - "examples": [ - "{\n \"path\": \"file.csv\"\n}\n", - "{\n \"path\": \"http://example.com/file.csv\"\n}\n" - ], - "context": "Implementations need to negotiate the type of path provided, and dereference the data accordingly." - }, - { - "type": "array", - "minItems": 1, - "items": { - "title": "Path", - "description": "A fully qualified URL, or a POSIX file path.", - "type": "string", - "pattern": "^((?=[^./~])(?!file:)((?!\\/\\.\\.\\/)(?!\\\\)(?!:\\/\\/).)*|(http|ftp)s?:\\/\\/.*)$", - "examples": [ - "{\n \"path\": \"file.csv\"\n}\n", - "{\n \"path\": \"http://example.com/file.csv\"\n}\n" - ], - "context": "Implementations need to negotiate the type of path provided, and dereference the data accordingly." - }, - "examples": [ - "[ \"file.csv\" ]\n", - "[ \"http://example.com/file.csv\" ]\n" - ] - } - ], - "context": "The dereferenced value of each referenced data source in `path` `MUST` be commensurate with a native, dereferenced representation of the data the resource describes. For example, in a *Tabular* Data Resource, this means that the dereferenced value of `path` `MUST` be an array.", - "examples": [ - "{\n \"path\": [\n \"file.csv\",\n \"file2.csv\"\n ]\n}\n", - "{\n \"path\": [\n \"http://example.com/file.csv\",\n \"http://example.com/file2.csv\"\n ]\n}\n", - "{\n \"path\": \"http://example.com/file.csv\"\n}\n" - ] - }, - "data": { - "propertyOrder": 230, - "title": "Data", - "description": "Inline data for this resource." - }, - "type": { - "propertyOrder": 235, - "type": "string", - "enum": [ - "table" - ] - }, - "title": { - "title": "Title", - "description": "A human-readable title.", - "type": "string", - "examples": [ - "{\n \"title\": \"My Package Title\"\n}\n" - ], - "propertyOrder": 50 - }, - "description": { - "propertyOrder": 60, - "format": "textarea", - "title": "Description", - "description": "A text description. Markdown is encouraged.", - "type": "string", - "examples": [ - "{\n \"description\": \"# My Package description\\nAll about my package.\"\n}\n" - ] - }, - "homepage": { - "propertyOrder": 70, - "title": "Home Page", - "description": "The home on the web that is related to this data package.", - "type": "string", - "format": "uri", - "examples": [ - "{\n \"homepage\": \"http://example.com/\"\n}\n" - ] - }, - "sources": { - "propertyOrder": 140, - "options": { - "hidden": true - }, - "title": "Sources", - "description": "The raw sources for this resource.", - "type": "array", - "minItems": 0, - "items": { - "title": "Source", - "description": "A source file.", - "type": "object", - "minProperties": 1, - "properties": { - "title": { - "title": "Title", - "description": "A human-readable title.", - "type": "string", - "examples": [ - "{\n \"title\": \"My Package Title\"\n}\n" - ] - }, - "path": { - "title": "Path", - "description": "A fully qualified URL, or a POSIX file path.", - "type": "string", - "pattern": "^((?=[^./~])(?!file:)((?!\\/\\.\\.\\/)(?!\\\\)(?!:\\/\\/).)*|(http|ftp)s?:\\/\\/.*)$", - "examples": [ - "{\n \"path\": \"file.csv\"\n}\n", - "{\n \"path\": \"http://example.com/file.csv\"\n}\n" - ], - "context": "Implementations need to negotiate the type of path provided, and dereference the data accordingly." - }, - "email": { - "title": "Email", - "description": "An email address.", - "type": "string", - "format": "email", - "examples": [ - "{\n \"email\": \"example@example.com\"\n}\n" - ] - }, - "version": { - "type": "string" - } - } - }, - "examples": [ - "{\n \"sources\": [\n {\n \"title\": \"World Bank and OECD\",\n \"path\": \"http://data.worldbank.org/indicator/NY.GDP.MKTP.CD\"\n }\n ]\n}\n" - ] - }, - "licenses": { - "description": "The license(s) under which the resource is published.", - "propertyOrder": 150, - "options": { - "hidden": true - }, - "title": "Licenses", - "type": "array", - "minItems": 1, - "items": { - "title": "License", - "description": "A license for this descriptor.", - "type": "object", - "anyOf": [ - { - "required": [ - "name" - ] - }, - { - "required": [ - "path" - ] - } - ], - "properties": { - "name": { - "title": "Open Definition license identifier", - "description": "MUST be an Open Definition license identifier, see http://licenses.opendefinition.org/", - "type": "string", - "pattern": "^([-a-zA-Z0-9._])+$" - }, - "path": { - "title": "Path", - "description": "A fully qualified URL, or a POSIX file path.", - "type": "string", - "pattern": "^((?=[^./~])(?!file:)((?!\\/\\.\\.\\/)(?!\\\\)(?!:\\/\\/).)*|(http|ftp)s?:\\/\\/.*)$", - "examples": [ - "{\n \"path\": \"file.csv\"\n}\n", - "{\n \"path\": \"http://example.com/file.csv\"\n}\n" - ], - "context": "Implementations need to negotiate the type of path provided, and dereference the data accordingly." - }, - "title": { - "title": "Title", - "description": "A human-readable title.", - "type": "string", - "examples": [ - "{\n \"title\": \"My Package Title\"\n}\n" - ] - } - }, - "context": "Use of this property does not imply that the person was the original creator of, or a contributor to, the data in the descriptor, but refers to the composition of the descriptor itself." - }, - "context": "This property is not legally binding and does not guarantee that the package is licensed under the terms defined herein.", - "examples": [ - "{\n \"licenses\": [\n {\n \"name\": \"odc-pddl-1.0\",\n \"path\": \"http://opendatacommons.org/licenses/pddl/\",\n \"title\": \"Open Data Commons Public Domain Dedication and License v1.0\"\n }\n ]\n}\n" - ] - }, - "format": { - "propertyOrder": 80, - "title": "Format", - "description": "The file format of this resource.", - "context": "`csv`, `xls`, `json` are examples of common formats.", - "type": "string", - "examples": [ - "{\n \"format\": \"xls\"\n}\n" - ] - }, - "mediatype": { - "propertyOrder": 90, - "title": "Media Type", - "description": "The media type of this resource. Can be any valid media type listed with [IANA](https://www.iana.org/assignments/media-types/media-types.xhtml).", - "type": "string", - "pattern": "^(.+)/(.+)$", - "examples": [ - "{\n \"mediatype\": \"text/csv\"\n}\n" - ] - }, - "encoding": { - "propertyOrder": 100, - "title": "Encoding", - "description": "The file encoding of this resource.", - "type": "string", - "default": "utf-8", - "examples": [ - "{\n \"encoding\": \"utf-8\"\n}\n" - ] - }, - "bytes": { - "propertyOrder": 110, - "options": { - "hidden": true - }, - "title": "Bytes", - "description": "The size of this resource in bytes.", - "type": "integer", - "examples": [ - "{\n \"bytes\": 2082\n}\n" - ] - }, - "hash": { - "propertyOrder": 120, - "options": { - "hidden": true - }, - "title": "Hash", - "type": "string", - "description": "The MD5 hash of this resource. Indicate other hashing algorithms with the {algorithm}:{hash} format.", - "pattern": "^([^:]+:[a-fA-F0-9]+|[a-fA-F0-9]{32}|)$", - "examples": [ - "{\n \"hash\": \"d25c9c77f588f5dc32059d2da1136c02\"\n}\n", - "{\n \"hash\": \"SHA256:5262f12512590031bbcc9a430452bfd75c2791ad6771320bb4b5728bfb78c4d0\"\n}\n" - ] - }, - "dialect": { - "propertyOrder": 130, - "title": "Table Dialect", - "description": "The Table dialect descriptor.", - "type": "object", - "properties": { - "$schema": { - "default": "https://datapackage.org/profiles/1.0/tabledialect.json", - "propertyOrder": 10, - "title": "Profile", - "description": "The profile of this descriptor.", - "type": "string" - }, - "header": { - "title": "Header", - "description": "Specifies if the file includes a header row, always as the first row in the file.", - "type": "boolean", - "default": true, - "examples": [ - "{\n \"header\": true\n}\n" - ] - }, - "headerRows": { - "type": "array", - "default": [ - 1 - ], - "items": { - "type": "integer", - "minimum": 1 - } - }, - "headerJoin": { - "type": "string", - "default": " " - }, - "commentRows": { - "type": "array", - "default": [ - 1 - ], - "items": { - "type": "integer", - "minimum": 1 - } - }, - "commentChar": { - "title": "Comment Character", - "description": "Specifies that any row beginning with this one-character string, without preceeding whitespace, causes the entire line to be ignored.", - "type": "string", - "examples": [ - "{\n \"commentChar\": \"#\"\n}\n" - ] - }, - "delimiter": { - "title": "Delimiter", - "description": "A character sequence to use as the field separator.", - "type": "string", - "default": ",", - "examples": [ - "{\n \"delimiter\": \",\"\n}\n", - "{\n \"delimiter\": \";\"\n}\n" - ] - }, - "lineTerminator": { - "title": "Line Terminator", - "description": "Specifies the character sequence that must be used to terminate rows.", - "type": "string", - "default": "\r\n", - "examples": [ - "{\n \"lineTerminator\": \"\\r\\n\"\n}\n", - "{\n \"lineTerminator\": \"\\n\"\n}\n" - ] - }, - "quoteChar": { - "title": "Quote Character", - "description": "Specifies a one-character string to use as the quoting character.", - "type": "string", - "default": "\"", - "examples": [ - "{\n \"quoteChar\": \"'\"\n}\n" - ] - }, - "doubleQuote": { - "title": "Double Quote", - "description": "Specifies the handling of quotes inside fields.", - "context": "If Double Quote is set to true, two consecutive quotes must be interpreted as one.", - "type": "boolean", - "default": true, - "examples": [ - "{\n \"doubleQuote\": true\n}\n" - ] - }, - "escapeChar": { - "title": "Escape Character", - "description": "Specifies a one-character string to use as the escape character.", - "type": "string", - "examples": [ - "{\n \"escapeChar\": \"\\\\\"\n}\n" - ] - }, - "nullSequence": { - "title": "Null Sequence", - "description": "Specifies the null sequence, for example, `\\N`.", - "type": "string", - "examples": [ - "{\n \"nullSequence\": \"\\N\"\n}\n" - ] - }, - "skipInitialSpace": { - "title": "Skip Initial Space", - "description": "Specifies the interpretation of whitespace immediately following a delimiter. If false, whitespace immediately after a delimiter should be treated as part of the subsequent field.", - "type": "boolean", - "default": false, - "examples": [ - "{\n \"skipInitialSpace\": true\n}\n" - ] - }, - "property": { - "type": "string" - }, - "itemType": { - "type": "string", - "enum": [ - "array", - "object" - ] - }, - "itemKeys": { - "type": "array", - "items": { - "type": "string" - } - }, - "sheetNumber": { - "type": "integer", - "minimum": 1 - }, - "sheetName": { - "type": "string" - }, - "table": { - "type": "string" - } - } - }, - "schema": { - "propertyOrder": 140, - "title": "Table Schema", - "description": "A Table Schema for this resource, compliant with the [Table Schema](/tableschema/) specification.", - "type": [ - "string", - "object" - ], - "required": [ - "fields" - ], - "properties": { - "$schema": { - "default": "https://datapackage.org/profiles/1.0/tableschema.json", - "propertyOrder": 10, - "title": "Profile", - "description": "The profile of this descriptor.", - "type": "string" - }, - "fields": { - "type": "array", - "minItems": 1, - "items": { - "title": "Table Schema Field", - "type": "object", - "oneOf": [ - { - "type": "object", - "title": "String Field", - "description": "The field contains strings, that is, sequences of characters.", - "required": [ - "name" - ], - "properties": { - "name": { - "title": "Name", - "description": "A name for this field.", - "type": "string" - }, - "title": { - "title": "Title", - "description": "A human-readable title.", - "type": "string", - "examples": [ - "{\n \"title\": \"My Package Title\"\n}\n" - ] - }, - "description": { - "title": "Description", - "description": "A text description. Markdown is encouraged.", - "type": "string", - "examples": [ - "{\n \"description\": \"# My Package description\\nAll about my package.\"\n}\n" - ] - }, - "example": { - "title": "Example", - "description": "An example value for the field.", - "type": "string", - "examples": [ - "{\n \"example\": \"Put here an example value for your field\"\n}\n" - ] - }, - "missingValues": { - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "array", - "items": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "label": { - "type": "string" - } - } - } - } - ], - "default": [ - "" - ], - "description": "Values that when encountered in the source, should be considered as `null`, 'not present', or 'blank' values.", - "context": "Many datasets arrive with missing data values, either because a value was not collected or it never existed.\nMissing values may be indicated simply by the value being empty in other cases a special value may have been used e.g. `-`, `NaN`, `0`, `-9999` etc.\nThe `missingValues` property provides a way to indicate that these values should be interpreted as equivalent to null.\n\n`missingValues` are strings rather than being the data type of the particular field. This allows for comparison prior to casting and for fields to have missing value which are not of their type, for example a `number` field to have missing values indicated by `-`.\n\nThe default value of `missingValue` for a non-string type field is the empty string `''`. For string type fields there is no default for `missingValue` (for string fields the empty string `''` is a valid value and need not indicate null).", - "examples": [ - "{\n \"missingValues\": [\n \"-\",\n \"NaN\",\n \"\"\n ]\n}\n", - "{\n \"missingValues\": []\n}\n" - ] - }, - "categories": { - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "array", - "items": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "label": { - "type": "string" - } - } - } - } - ] - }, - "categoriesOrdered": { - "type": "boolean" - }, - "type": { - "description": "The type keyword, which `MUST` be a value of `string`.", - "enum": [ - "string" - ] - }, - "format": { - "description": "The format keyword options for `string` are `default`, `email`, `uri`, `binary`, and `uuid`.", - "context": "The following `format` options are supported:\n * **default**: any valid string.\n * **email**: A valid email address.\n * **uri**: A valid URI.\n * **binary**: A base64 encoded string representing binary data.\n * **uuid**: A string that is a uuid.", - "enum": [ - "default", - "email", - "uri", - "binary", - "uuid" - ], - "default": "default" - }, - "constraints": { - "title": "Constraints", - "description": "The following constraints are supported for `string` fields.", - "type": "object", - "properties": { - "required": { - "type": "boolean", - "description": "Indicates whether a property must have a value for each instance.", - "context": "An empty string is considered to be a missing value." - }, - "unique": { - "type": "boolean", - "description": "When `true`, each value for the property `MUST` be unique." - }, - "pattern": { - "type": "string", - "description": "A regular expression pattern to test each value of the property against, where a truthy response indicates validity.", - "context": "Regular expressions `SHOULD` conform to the [XML Schema regular expression syntax](http://www.w3.org/TR/xmlschema-2/#regexs)." - }, - "enum": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "type": "string" - } - }, - "minLength": { - "type": "integer", - "description": "An integer that specifies the minimum length of a value." - }, - "maxLength": { - "type": "integer", - "description": "An integer that specifies the maximum length of a value." - } - } - }, - "rdfType": { - "type": "string", - "description": "The RDF type for this field." - } - }, - "examples": [ - "{\n \"name\": \"name\",\n \"type\": \"string\"\n}\n", - "{\n \"name\": \"name\",\n \"type\": \"string\",\n \"format\": \"email\"\n}\n", - "{\n \"name\": \"name\",\n \"type\": \"string\",\n \"constraints\": {\n \"minLength\": 3,\n \"maxLength\": 35\n }\n}\n" - ] - }, - { - "type": "object", - "title": "Number Field", - "description": "The field contains numbers of any kind including decimals.", - "context": "The lexical formatting follows that of decimal in [XMLSchema](https://www.w3.org/TR/xmlschema-2/#decimal): a non-empty finite-length sequence of decimal digits separated by a period as a decimal indicator. An optional leading sign is allowed. If the sign is omitted, '+' is assumed. Leading and trailing zeroes are optional. If the fractional part is zero, the period and following zero(es) can be omitted. For example: '-1.23', '12678967.543233', '+100000.00', '210'.\n\nThe following special string values are permitted (case does not need to be respected):\n - NaN: not a number\n - INF: positive infinity\n - -INF: negative infinity\n\nA number `MAY` also have a trailing:\n - exponent: this `MUST` consist of an E followed by an optional + or - sign followed by one or more decimal digits (0-9)\n - percentage: the percentage sign: `%`. In conversion percentages should be divided by 100.\n\nIf both exponent and percentages are present the percentage `MUST` follow the exponent e.g. '53E10%' (equals 5.3).", - "required": [ - "name", - "type" - ], - "properties": { - "name": { - "title": "Name", - "description": "A name for this field.", - "type": "string" - }, - "title": { - "title": "Title", - "description": "A human-readable title.", - "type": "string", - "examples": [ - "{\n \"title\": \"My Package Title\"\n}\n" - ] - }, - "description": { - "title": "Description", - "description": "A text description. Markdown is encouraged.", - "type": "string", - "examples": [ - "{\n \"description\": \"# My Package description\\nAll about my package.\"\n}\n" - ] - }, - "example": { - "title": "Example", - "description": "An example value for the field.", - "type": "string", - "examples": [ - "{\n \"example\": \"Put here an example value for your field\"\n}\n" - ] - }, - "missingValues": { - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "array", - "items": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "label": { - "type": "string" - } - } - } - } - ], - "default": [ - "" - ], - "description": "Values that when encountered in the source, should be considered as `null`, 'not present', or 'blank' values.", - "context": "Many datasets arrive with missing data values, either because a value was not collected or it never existed.\nMissing values may be indicated simply by the value being empty in other cases a special value may have been used e.g. `-`, `NaN`, `0`, `-9999` etc.\nThe `missingValues` property provides a way to indicate that these values should be interpreted as equivalent to null.\n\n`missingValues` are strings rather than being the data type of the particular field. This allows for comparison prior to casting and for fields to have missing value which are not of their type, for example a `number` field to have missing values indicated by `-`.\n\nThe default value of `missingValue` for a non-string type field is the empty string `''`. For string type fields there is no default for `missingValue` (for string fields the empty string `''` is a valid value and need not indicate null).", - "examples": [ - "{\n \"missingValues\": [\n \"-\",\n \"NaN\",\n \"\"\n ]\n}\n", - "{\n \"missingValues\": []\n}\n" - ] - }, - "type": { - "description": "The type keyword, which `MUST` be a value of `number`.", - "enum": [ - "number" - ] - }, - "format": { - "description": "There are no format keyword options for `number`: only `default` is allowed.", - "enum": [ - "default" - ], - "default": "default" - }, - "bareNumber": { - "type": "boolean", - "title": "bareNumber", - "description": "a boolean field with a default of `true`. If `true` the physical contents of this field must follow the formatting constraints already set out. If `false` the contents of this field may contain leading and/or trailing non-numeric characters (which implementors MUST therefore strip). The purpose of `bareNumber` is to allow publishers to publish numeric data that contains trailing characters such as percentages e.g. `95%` or leading characters such as currencies e.g. `\u20ac95` or `EUR 95`. Note that it is entirely up to implementors what, if anything, they do with stripped text.", - "default": true - }, - "groupChar": { - "type": "string", - "title": "groupChar", - "description": "A string whose value is used to group digits within the number. This property does not have a default value. A common value is `,` e.g. '100,000'." - }, - "decimalChar": { - "type": "string", - "description": "A string whose value is used to represent a decimal point within the number. The default value is `.`." - }, - "constraints": { - "title": "Constraints", - "description": "The following constraints are supported for `number` fields.", - "type": "object", - "properties": { - "required": { - "type": "boolean", - "description": "Indicates whether a property must have a value for each instance.", - "context": "An empty string is considered to be a missing value." - }, - "unique": { - "type": "boolean", - "description": "When `true`, each value for the property `MUST` be unique." - }, - "enum": { - "oneOf": [ - { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "type": "string" - } - }, - { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "type": "number" - } - } - ] - }, - "minimum": { - "oneOf": [ - { - "type": "string" - }, - { - "type": "number" - } - ] - }, - "maximum": { - "oneOf": [ - { - "type": "string" - }, - { - "type": "number" - } - ] - }, - "exclusiveMinimum": { - "oneOf": [ - { - "type": "string" - }, - { - "type": "number" - } - ] - }, - "exclusiveMaximum": { - "oneOf": [ - { - "type": "string" - }, - { - "type": "number" - } - ] - } - } - }, - "rdfType": { - "type": "string", - "description": "The RDF type for this field." - } - }, - "examples": [ - "{\n \"name\": \"field-name\",\n \"type\": \"number\"\n}\n", - "{\n \"name\": \"field-name\",\n \"type\": \"number\",\n \"constraints\": {\n \"enum\": [ \"1.00\", \"1.50\", \"2.00\" ]\n }\n}\n" - ] - }, - { - "type": "object", - "title": "Integer Field", - "description": "The field contains integers - that is whole numbers.", - "context": "Integer values are indicated in the standard way for any valid integer.", - "required": [ - "name", - "type" - ], - "properties": { - "name": { - "title": "Name", - "description": "A name for this field.", - "type": "string" - }, - "title": { - "title": "Title", - "description": "A human-readable title.", - "type": "string", - "examples": [ - "{\n \"title\": \"My Package Title\"\n}\n" - ] - }, - "description": { - "title": "Description", - "description": "A text description. Markdown is encouraged.", - "type": "string", - "examples": [ - "{\n \"description\": \"# My Package description\\nAll about my package.\"\n}\n" - ] - }, - "example": { - "title": "Example", - "description": "An example value for the field.", - "type": "string", - "examples": [ - "{\n \"example\": \"Put here an example value for your field\"\n}\n" - ] - }, - "missingValues": { - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "array", - "items": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "label": { - "type": "string" - } - } - } - } - ], - "default": [ - "" - ], - "description": "Values that when encountered in the source, should be considered as `null`, 'not present', or 'blank' values.", - "context": "Many datasets arrive with missing data values, either because a value was not collected or it never existed.\nMissing values may be indicated simply by the value being empty in other cases a special value may have been used e.g. `-`, `NaN`, `0`, `-9999` etc.\nThe `missingValues` property provides a way to indicate that these values should be interpreted as equivalent to null.\n\n`missingValues` are strings rather than being the data type of the particular field. This allows for comparison prior to casting and for fields to have missing value which are not of their type, for example a `number` field to have missing values indicated by `-`.\n\nThe default value of `missingValue` for a non-string type field is the empty string `''`. For string type fields there is no default for `missingValue` (for string fields the empty string `''` is a valid value and need not indicate null).", - "examples": [ - "{\n \"missingValues\": [\n \"-\",\n \"NaN\",\n \"\"\n ]\n}\n", - "{\n \"missingValues\": []\n}\n" - ] - }, - "categories": { - "anyOf": [ - { - "type": "array", - "items": { - "type": "integer" - } - }, - { - "type": "array", - "items": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "integer" - }, - "label": { - "type": "string" - } - } - } - } - ] - }, - "categoriesOrdered": { - "type": "boolean" - }, - "type": { - "description": "The type keyword, which `MUST` be a value of `integer`.", - "enum": [ - "integer" - ] - }, - "format": { - "description": "There are no format keyword options for `integer`: only `default` is allowed.", - "enum": [ - "default" - ], - "default": "default" - }, - "bareNumber": { - "type": "boolean", - "title": "bareNumber", - "description": "a boolean field with a default of `true`. If `true` the physical contents of this field must follow the formatting constraints already set out. If `false` the contents of this field may contain leading and/or trailing non-numeric characters (which implementors MUST therefore strip). The purpose of `bareNumber` is to allow publishers to publish numeric data that contains trailing characters such as percentages e.g. `95%` or leading characters such as currencies e.g. `\u20ac95` or `EUR 95`. Note that it is entirely up to implementors what, if anything, they do with stripped text.", - "default": true - }, - "groupChar": { - "type": "string", - "title": "groupChar", - "description": "A string whose value is used to group digits within the number. This property does not have a default value. A common value is `,` e.g. '100,000'." - }, - "constraints": { - "title": "Constraints", - "description": "The following constraints are supported for `integer` fields.", - "type": "object", - "properties": { - "required": { - "type": "boolean", - "description": "Indicates whether a property must have a value for each instance.", - "context": "An empty string is considered to be a missing value." - }, - "unique": { - "type": "boolean", - "description": "When `true`, each value for the property `MUST` be unique." - }, - "enum": { - "oneOf": [ - { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "type": "string" - } - }, - { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "type": "integer" - } - } - ] - }, - "minimum": { - "oneOf": [ - { - "type": "string" - }, - { - "type": "integer" - } - ] - }, - "maximum": { - "oneOf": [ - { - "type": "string" - }, - { - "type": "integer" - } - ] - }, - "exclusiveMinimum": { - "oneOf": [ - { - "type": "string" - }, - { - "type": "integer" - } - ] - }, - "exclusiveMaximum": { - "oneOf": [ - { - "type": "string" - }, - { - "type": "integer" - } - ] - } - } - }, - "rdfType": { - "type": "string", - "description": "The RDF type for this field." - } - }, - "examples": [ - "{\n \"name\": \"age\",\n \"type\": \"integer\",\n \"constraints\": {\n \"unique\": true,\n \"minimum\": 100,\n \"maximum\": 9999\n }\n}\n" - ] - }, - { - "type": "object", - "title": "Date Field", - "description": "The field contains temporal date values.", - "required": [ - "name", - "type" - ], - "properties": { - "name": { - "title": "Name", - "description": "A name for this field.", - "type": "string" - }, - "title": { - "title": "Title", - "description": "A human-readable title.", - "type": "string", - "examples": [ - "{\n \"title\": \"My Package Title\"\n}\n" - ] - }, - "description": { - "title": "Description", - "description": "A text description. Markdown is encouraged.", - "type": "string", - "examples": [ - "{\n \"description\": \"# My Package description\\nAll about my package.\"\n}\n" - ] - }, - "example": { - "title": "Example", - "description": "An example value for the field.", - "type": "string", - "examples": [ - "{\n \"example\": \"Put here an example value for your field\"\n}\n" - ] - }, - "missingValues": { - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "array", - "items": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "label": { - "type": "string" - } - } - } - } - ], - "default": [ - "" - ], - "description": "Values that when encountered in the source, should be considered as `null`, 'not present', or 'blank' values.", - "context": "Many datasets arrive with missing data values, either because a value was not collected or it never existed.\nMissing values may be indicated simply by the value being empty in other cases a special value may have been used e.g. `-`, `NaN`, `0`, `-9999` etc.\nThe `missingValues` property provides a way to indicate that these values should be interpreted as equivalent to null.\n\n`missingValues` are strings rather than being the data type of the particular field. This allows for comparison prior to casting and for fields to have missing value which are not of their type, for example a `number` field to have missing values indicated by `-`.\n\nThe default value of `missingValue` for a non-string type field is the empty string `''`. For string type fields there is no default for `missingValue` (for string fields the empty string `''` is a valid value and need not indicate null).", - "examples": [ - "{\n \"missingValues\": [\n \"-\",\n \"NaN\",\n \"\"\n ]\n}\n", - "{\n \"missingValues\": []\n}\n" - ] - }, - "type": { - "description": "The type keyword, which `MUST` be a value of `date`.", - "enum": [ - "date" - ] - }, - "format": { - "description": "The format keyword options for `date` are `default`, `any`, and `{PATTERN}`.", - "context": "The following `format` options are supported:\n * **default**: An ISO8601 format string of YYYY-MM-DD.\n * **any**: Any parsable representation of a date. The implementing library can attempt to parse the datetime via a range of strategies.\n * **{PATTERN}**: The value can be parsed according to `{PATTERN}`, which `MUST` follow the date formatting syntax of C / Python [strftime](http://strftime.org/).", - "default": "default" - }, - "constraints": { - "title": "Constraints", - "description": "The following constraints are supported for `date` fields.", - "type": "object", - "properties": { - "required": { - "type": "boolean", - "description": "Indicates whether a property must have a value for each instance.", - "context": "An empty string is considered to be a missing value." - }, - "unique": { - "type": "boolean", - "description": "When `true`, each value for the property `MUST` be unique." - }, - "enum": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "type": "string" - } - }, - "minimum": { - "type": "string" - }, - "maximum": { - "type": "string" - }, - "exclusiveMinimum": { - "type": "string" - }, - "exclusiveMaximum": { - "type": "string" - } - } - }, - "rdfType": { - "type": "string", - "description": "The RDF type for this field." - } - }, - "examples": [ - "{\n \"name\": \"date_of_birth\",\n \"type\": \"date\"\n}\n", - "{\n \"name\": \"date_of_birth\",\n \"type\": \"date\",\n \"constraints\": {\n \"minimum\": \"01-01-1900\"\n }\n}\n", - "{\n \"name\": \"date_of_birth\",\n \"type\": \"date\",\n \"format\": \"MM-DD-YYYY\"\n}\n" - ] - }, - { - "type": "object", - "title": "Time Field", - "description": "The field contains temporal time values.", - "required": [ - "name", - "type" - ], - "properties": { - "name": { - "title": "Name", - "description": "A name for this field.", - "type": "string" - }, - "title": { - "title": "Title", - "description": "A human-readable title.", - "type": "string", - "examples": [ - "{\n \"title\": \"My Package Title\"\n}\n" - ] - }, - "description": { - "title": "Description", - "description": "A text description. Markdown is encouraged.", - "type": "string", - "examples": [ - "{\n \"description\": \"# My Package description\\nAll about my package.\"\n}\n" - ] - }, - "example": { - "title": "Example", - "description": "An example value for the field.", - "type": "string", - "examples": [ - "{\n \"example\": \"Put here an example value for your field\"\n}\n" - ] - }, - "missingValues": { - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "array", - "items": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "label": { - "type": "string" - } - } - } - } - ], - "default": [ - "" - ], - "description": "Values that when encountered in the source, should be considered as `null`, 'not present', or 'blank' values.", - "context": "Many datasets arrive with missing data values, either because a value was not collected or it never existed.\nMissing values may be indicated simply by the value being empty in other cases a special value may have been used e.g. `-`, `NaN`, `0`, `-9999` etc.\nThe `missingValues` property provides a way to indicate that these values should be interpreted as equivalent to null.\n\n`missingValues` are strings rather than being the data type of the particular field. This allows for comparison prior to casting and for fields to have missing value which are not of their type, for example a `number` field to have missing values indicated by `-`.\n\nThe default value of `missingValue` for a non-string type field is the empty string `''`. For string type fields there is no default for `missingValue` (for string fields the empty string `''` is a valid value and need not indicate null).", - "examples": [ - "{\n \"missingValues\": [\n \"-\",\n \"NaN\",\n \"\"\n ]\n}\n", - "{\n \"missingValues\": []\n}\n" - ] - }, - "type": { - "description": "The type keyword, which `MUST` be a value of `time`.", - "enum": [ - "time" - ] - }, - "format": { - "description": "The format keyword options for `time` are `default`, `any`, and `{PATTERN}`.", - "context": "The following `format` options are supported:\n * **default**: An ISO8601 format string for time.\n * **any**: Any parsable representation of a date. The implementing library can attempt to parse the datetime via a range of strategies.\n * **{PATTERN}**: The value can be parsed according to `{PATTERN}`, which `MUST` follow the date formatting syntax of C / Python [strftime](http://strftime.org/).", - "default": "default" - }, - "constraints": { - "title": "Constraints", - "description": "The following constraints are supported for `time` fields.", - "type": "object", - "properties": { - "required": { - "type": "boolean", - "description": "Indicates whether a property must have a value for each instance.", - "context": "An empty string is considered to be a missing value." - }, - "unique": { - "type": "boolean", - "description": "When `true`, each value for the property `MUST` be unique." - }, - "enum": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "type": "string" - } - }, - "minimum": { - "type": "string" - }, - "maximum": { - "type": "string" - }, - "exclusiveMinimum": { - "type": "string" - }, - "exclusiveMaximum": { - "type": "string" - } - } - }, - "rdfType": { - "type": "string", - "description": "The RDF type for this field." - } - }, - "examples": [ - "{\n \"name\": \"appointment_start\",\n \"type\": \"time\"\n}\n", - "{\n \"name\": \"appointment_start\",\n \"type\": \"time\",\n \"format\": \"any\"\n}\n" - ] - }, - { - "type": "object", - "title": "Date Time Field", - "description": "The field contains temporal datetime values.", - "required": [ - "name", - "type" - ], - "properties": { - "name": { - "title": "Name", - "description": "A name for this field.", - "type": "string" - }, - "title": { - "title": "Title", - "description": "A human-readable title.", - "type": "string", - "examples": [ - "{\n \"title\": \"My Package Title\"\n}\n" - ] - }, - "description": { - "title": "Description", - "description": "A text description. Markdown is encouraged.", - "type": "string", - "examples": [ - "{\n \"description\": \"# My Package description\\nAll about my package.\"\n}\n" - ] - }, - "example": { - "title": "Example", - "description": "An example value for the field.", - "type": "string", - "examples": [ - "{\n \"example\": \"Put here an example value for your field\"\n}\n" - ] - }, - "missingValues": { - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "array", - "items": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "label": { - "type": "string" - } - } - } - } - ], - "default": [ - "" - ], - "description": "Values that when encountered in the source, should be considered as `null`, 'not present', or 'blank' values.", - "context": "Many datasets arrive with missing data values, either because a value was not collected or it never existed.\nMissing values may be indicated simply by the value being empty in other cases a special value may have been used e.g. `-`, `NaN`, `0`, `-9999` etc.\nThe `missingValues` property provides a way to indicate that these values should be interpreted as equivalent to null.\n\n`missingValues` are strings rather than being the data type of the particular field. This allows for comparison prior to casting and for fields to have missing value which are not of their type, for example a `number` field to have missing values indicated by `-`.\n\nThe default value of `missingValue` for a non-string type field is the empty string `''`. For string type fields there is no default for `missingValue` (for string fields the empty string `''` is a valid value and need not indicate null).", - "examples": [ - "{\n \"missingValues\": [\n \"-\",\n \"NaN\",\n \"\"\n ]\n}\n", - "{\n \"missingValues\": []\n}\n" - ] - }, - "type": { - "description": "The type keyword, which `MUST` be a value of `datetime`.", - "enum": [ - "datetime" - ] - }, - "format": { - "description": "The format keyword options for `datetime` are `default`, `any`, and `{PATTERN}`.", - "context": "The following `format` options are supported:\n * **default**: An ISO8601 format string for datetime.\n * **any**: Any parsable representation of a date. The implementing library can attempt to parse the datetime via a range of strategies.\n * **{PATTERN}**: The value can be parsed according to `{PATTERN}`, which `MUST` follow the date formatting syntax of C / Python [strftime](http://strftime.org/).", - "default": "default" - }, - "constraints": { - "title": "Constraints", - "description": "The following constraints are supported for `datetime` fields.", - "type": "object", - "properties": { - "required": { - "type": "boolean", - "description": "Indicates whether a property must have a value for each instance.", - "context": "An empty string is considered to be a missing value." - }, - "unique": { - "type": "boolean", - "description": "When `true`, each value for the property `MUST` be unique." - }, - "enum": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "type": "string" - } - }, - "minimum": { - "type": "string" - }, - "maximum": { - "type": "string" - }, - "exclusiveMinimum": { - "type": "string" - }, - "exclusiveMaximum": { - "type": "string" - } - } - }, - "rdfType": { - "type": "string", - "description": "The RDF type for this field." - } - }, - "examples": [ - "{\n \"name\": \"timestamp\",\n \"type\": \"datetime\"\n}\n", - "{\n \"name\": \"timestamp\",\n \"type\": \"datetime\",\n \"format\": \"default\"\n}\n" - ] - }, - { - "type": "object", - "title": "Year Field", - "description": "A calendar year, being an integer with 4 digits. Equivalent to [gYear in XML Schema](https://www.w3.org/TR/xmlschema-2/#gYear)", - "required": [ - "name", - "type" - ], - "properties": { - "name": { - "title": "Name", - "description": "A name for this field.", - "type": "string" - }, - "title": { - "title": "Title", - "description": "A human-readable title.", - "type": "string", - "examples": [ - "{\n \"title\": \"My Package Title\"\n}\n" - ] - }, - "description": { - "title": "Description", - "description": "A text description. Markdown is encouraged.", - "type": "string", - "examples": [ - "{\n \"description\": \"# My Package description\\nAll about my package.\"\n}\n" - ] - }, - "example": { - "title": "Example", - "description": "An example value for the field.", - "type": "string", - "examples": [ - "{\n \"example\": \"Put here an example value for your field\"\n}\n" - ] - }, - "missingValues": { - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "array", - "items": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "label": { - "type": "string" - } - } - } - } - ], - "default": [ - "" - ], - "description": "Values that when encountered in the source, should be considered as `null`, 'not present', or 'blank' values.", - "context": "Many datasets arrive with missing data values, either because a value was not collected or it never existed.\nMissing values may be indicated simply by the value being empty in other cases a special value may have been used e.g. `-`, `NaN`, `0`, `-9999` etc.\nThe `missingValues` property provides a way to indicate that these values should be interpreted as equivalent to null.\n\n`missingValues` are strings rather than being the data type of the particular field. This allows for comparison prior to casting and for fields to have missing value which are not of their type, for example a `number` field to have missing values indicated by `-`.\n\nThe default value of `missingValue` for a non-string type field is the empty string `''`. For string type fields there is no default for `missingValue` (for string fields the empty string `''` is a valid value and need not indicate null).", - "examples": [ - "{\n \"missingValues\": [\n \"-\",\n \"NaN\",\n \"\"\n ]\n}\n", - "{\n \"missingValues\": []\n}\n" - ] - }, - "type": { - "description": "The type keyword, which `MUST` be a value of `year`.", - "enum": [ - "year" - ] - }, - "format": { - "description": "There are no format keyword options for `year`: only `default` is allowed.", - "enum": [ - "default" - ], - "default": "default" - }, - "constraints": { - "title": "Constraints", - "description": "The following constraints are supported for `year` fields.", - "type": "object", - "properties": { - "required": { - "type": "boolean", - "description": "Indicates whether a property must have a value for each instance.", - "context": "An empty string is considered to be a missing value." - }, - "unique": { - "type": "boolean", - "description": "When `true`, each value for the property `MUST` be unique." - }, - "enum": { - "oneOf": [ - { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "type": "string" - } - }, - { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "type": "integer" - } - } - ] - }, - "minimum": { - "oneOf": [ - { - "type": "string" - }, - { - "type": "integer" - } - ] - }, - "maximum": { - "oneOf": [ - { - "type": "string" - }, - { - "type": "integer" - } - ] - }, - "exclusiveMinimum": { - "oneOf": [ - { - "type": "string" - }, - { - "type": "integer" - } - ] - }, - "exclusiveMaximum": { - "oneOf": [ - { - "type": "string" - }, - { - "type": "integer" - } - ] - } - } - }, - "rdfType": { - "type": "string", - "description": "The RDF type for this field." - } - }, - "examples": [ - "{\n \"name\": \"year\",\n \"type\": \"year\"\n}\n", - "{\n \"name\": \"year\",\n \"type\": \"year\",\n \"constraints\": {\n \"minimum\": 1970,\n \"maximum\": 2003\n }\n}\n" - ] - }, - { - "type": "object", - "title": "Year Month Field", - "description": "A calendar year month, being an integer with 1 or 2 digits. Equivalent to [gYearMonth in XML Schema](https://www.w3.org/TR/xmlschema-2/#gYearMonth)", - "required": [ - "name", - "type" - ], - "properties": { - "name": { - "title": "Name", - "description": "A name for this field.", - "type": "string" - }, - "title": { - "title": "Title", - "description": "A human-readable title.", - "type": "string", - "examples": [ - "{\n \"title\": \"My Package Title\"\n}\n" - ] - }, - "description": { - "title": "Description", - "description": "A text description. Markdown is encouraged.", - "type": "string", - "examples": [ - "{\n \"description\": \"# My Package description\\nAll about my package.\"\n}\n" - ] - }, - "example": { - "title": "Example", - "description": "An example value for the field.", - "type": "string", - "examples": [ - "{\n \"example\": \"Put here an example value for your field\"\n}\n" - ] - }, - "missingValues": { - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "array", - "items": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "label": { - "type": "string" - } - } - } - } - ], - "default": [ - "" - ], - "description": "Values that when encountered in the source, should be considered as `null`, 'not present', or 'blank' values.", - "context": "Many datasets arrive with missing data values, either because a value was not collected or it never existed.\nMissing values may be indicated simply by the value being empty in other cases a special value may have been used e.g. `-`, `NaN`, `0`, `-9999` etc.\nThe `missingValues` property provides a way to indicate that these values should be interpreted as equivalent to null.\n\n`missingValues` are strings rather than being the data type of the particular field. This allows for comparison prior to casting and for fields to have missing value which are not of their type, for example a `number` field to have missing values indicated by `-`.\n\nThe default value of `missingValue` for a non-string type field is the empty string `''`. For string type fields there is no default for `missingValue` (for string fields the empty string `''` is a valid value and need not indicate null).", - "examples": [ - "{\n \"missingValues\": [\n \"-\",\n \"NaN\",\n \"\"\n ]\n}\n", - "{\n \"missingValues\": []\n}\n" - ] - }, - "type": { - "description": "The type keyword, which `MUST` be a value of `yearmonth`.", - "enum": [ - "yearmonth" - ] - }, - "format": { - "description": "There are no format keyword options for `yearmonth`: only `default` is allowed.", - "enum": [ - "default" - ], - "default": "default" - }, - "constraints": { - "title": "Constraints", - "description": "The following constraints are supported for `yearmonth` fields.", - "type": "object", - "properties": { - "required": { - "type": "boolean", - "description": "Indicates whether a property must have a value for each instance.", - "context": "An empty string is considered to be a missing value." - }, - "unique": { - "type": "boolean", - "description": "When `true`, each value for the property `MUST` be unique." - }, - "enum": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "type": "string" - } - }, - "minimum": { - "type": "string" - }, - "maximum": { - "type": "string" - }, - "exclusiveMinimum": { - "type": "string" - }, - "exclusiveMaximum": { - "type": "string" - } - } - }, - "rdfType": { - "type": "string", - "description": "The RDF type for this field." - } - }, - "examples": [ - "{\n \"name\": \"month\",\n \"type\": \"yearmonth\"\n}\n", - "{\n \"name\": \"month\",\n \"type\": \"yearmonth\",\n \"constraints\": {\n \"minimum\": 1,\n \"maximum\": 6\n }\n}\n" - ] - }, - { - "type": "object", - "title": "Boolean Field", - "description": "The field contains boolean (true/false) data.", - "required": [ - "name", - "type" - ], - "properties": { - "name": { - "title": "Name", - "description": "A name for this field.", - "type": "string" - }, - "title": { - "title": "Title", - "description": "A human-readable title.", - "type": "string", - "examples": [ - "{\n \"title\": \"My Package Title\"\n}\n" - ] - }, - "description": { - "title": "Description", - "description": "A text description. Markdown is encouraged.", - "type": "string", - "examples": [ - "{\n \"description\": \"# My Package description\\nAll about my package.\"\n}\n" - ] - }, - "example": { - "title": "Example", - "description": "An example value for the field.", - "type": "string", - "examples": [ - "{\n \"example\": \"Put here an example value for your field\"\n}\n" - ] - }, - "missingValues": { - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "array", - "items": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "label": { - "type": "string" - } - } - } - } - ], - "default": [ - "" - ], - "description": "Values that when encountered in the source, should be considered as `null`, 'not present', or 'blank' values.", - "context": "Many datasets arrive with missing data values, either because a value was not collected or it never existed.\nMissing values may be indicated simply by the value being empty in other cases a special value may have been used e.g. `-`, `NaN`, `0`, `-9999` etc.\nThe `missingValues` property provides a way to indicate that these values should be interpreted as equivalent to null.\n\n`missingValues` are strings rather than being the data type of the particular field. This allows for comparison prior to casting and for fields to have missing value which are not of their type, for example a `number` field to have missing values indicated by `-`.\n\nThe default value of `missingValue` for a non-string type field is the empty string `''`. For string type fields there is no default for `missingValue` (for string fields the empty string `''` is a valid value and need not indicate null).", - "examples": [ - "{\n \"missingValues\": [\n \"-\",\n \"NaN\",\n \"\"\n ]\n}\n", - "{\n \"missingValues\": []\n}\n" - ] - }, - "type": { - "description": "The type keyword, which `MUST` be a value of `boolean`.", - "enum": [ - "boolean" - ] - }, - "format": { - "description": "There are no format keyword options for `boolean`: only `default` is allowed.", - "enum": [ - "default" - ], - "default": "default" - }, - "trueValues": { - "type": "array", - "minItems": 1, - "items": { - "type": "string" - }, - "default": [ - "true", - "True", - "TRUE", - "1" - ] - }, - "falseValues": { - "type": "array", - "minItems": 1, - "items": { - "type": "string" - }, - "default": [ - "false", - "False", - "FALSE", - "0" - ] - }, - "constraints": { - "title": "Constraints", - "description": "The following constraints are supported for `boolean` fields.", - "type": "object", - "properties": { - "required": { - "type": "boolean", - "description": "Indicates whether a property must have a value for each instance.", - "context": "An empty string is considered to be a missing value." - }, - "enum": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "type": "boolean" - } - } - } - }, - "rdfType": { - "type": "string", - "description": "The RDF type for this field." - } - }, - "examples": [ - "{\n \"name\": \"registered\",\n \"type\": \"boolean\"\n}\n" - ] - }, - { - "type": "object", - "title": "Object Field", - "description": "The field contains data which can be parsed as a valid JSON object.", - "required": [ - "name", - "type" - ], - "properties": { - "name": { - "title": "Name", - "description": "A name for this field.", - "type": "string" - }, - "title": { - "title": "Title", - "description": "A human-readable title.", - "type": "string", - "examples": [ - "{\n \"title\": \"My Package Title\"\n}\n" - ] - }, - "description": { - "title": "Description", - "description": "A text description. Markdown is encouraged.", - "type": "string", - "examples": [ - "{\n \"description\": \"# My Package description\\nAll about my package.\"\n}\n" - ] - }, - "example": { - "title": "Example", - "description": "An example value for the field.", - "type": "string", - "examples": [ - "{\n \"example\": \"Put here an example value for your field\"\n}\n" - ] - }, - "missingValues": { - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "array", - "items": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "label": { - "type": "string" - } - } - } - } - ], - "default": [ - "" - ], - "description": "Values that when encountered in the source, should be considered as `null`, 'not present', or 'blank' values.", - "context": "Many datasets arrive with missing data values, either because a value was not collected or it never existed.\nMissing values may be indicated simply by the value being empty in other cases a special value may have been used e.g. `-`, `NaN`, `0`, `-9999` etc.\nThe `missingValues` property provides a way to indicate that these values should be interpreted as equivalent to null.\n\n`missingValues` are strings rather than being the data type of the particular field. This allows for comparison prior to casting and for fields to have missing value which are not of their type, for example a `number` field to have missing values indicated by `-`.\n\nThe default value of `missingValue` for a non-string type field is the empty string `''`. For string type fields there is no default for `missingValue` (for string fields the empty string `''` is a valid value and need not indicate null).", - "examples": [ - "{\n \"missingValues\": [\n \"-\",\n \"NaN\",\n \"\"\n ]\n}\n", - "{\n \"missingValues\": []\n}\n" - ] - }, - "type": { - "description": "The type keyword, which `MUST` be a value of `object`.", - "enum": [ - "object" - ] - }, - "format": { - "description": "There are no format keyword options for `object`: only `default` is allowed.", - "enum": [ - "default" - ], - "default": "default" - }, - "constraints": { - "title": "Constraints", - "description": "The following constraints apply for `object` fields.", - "type": "object", - "properties": { - "required": { - "type": "boolean", - "description": "Indicates whether a property must have a value for each instance.", - "context": "An empty string is considered to be a missing value." - }, - "unique": { - "type": "boolean", - "description": "When `true`, each value for the property `MUST` be unique." - }, - "enum": { - "oneOf": [ - { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "type": "string" - } - }, - { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "type": "object" - } - } - ] - }, - "minLength": { - "type": "integer", - "description": "An integer that specifies the minimum length of a value." - }, - "maxLength": { - "type": "integer", - "description": "An integer that specifies the maximum length of a value." - }, - "jsonSchema": { - "type": "object", - "description": "A valid JSON Schema object to validate field values. If a field value conforms to the provided JSON Schema then this field value is valid." - } - } - }, - "rdfType": { - "type": "string", - "description": "The RDF type for this field." - } - }, - "examples": [ - "{\n \"name\": \"extra\"\n \"type\": \"object\"\n}\n" - ] - }, - { - "type": "object", - "title": "GeoPoint Field", - "description": "The field contains data describing a geographic point.", - "required": [ - "name", - "type" - ], - "properties": { - "name": { - "title": "Name", - "description": "A name for this field.", - "type": "string" - }, - "title": { - "title": "Title", - "description": "A human-readable title.", - "type": "string", - "examples": [ - "{\n \"title\": \"My Package Title\"\n}\n" - ] - }, - "description": { - "title": "Description", - "description": "A text description. Markdown is encouraged.", - "type": "string", - "examples": [ - "{\n \"description\": \"# My Package description\\nAll about my package.\"\n}\n" - ] - }, - "example": { - "title": "Example", - "description": "An example value for the field.", - "type": "string", - "examples": [ - "{\n \"example\": \"Put here an example value for your field\"\n}\n" - ] - }, - "missingValues": { - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "array", - "items": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "label": { - "type": "string" - } - } - } - } - ], - "default": [ - "" - ], - "description": "Values that when encountered in the source, should be considered as `null`, 'not present', or 'blank' values.", - "context": "Many datasets arrive with missing data values, either because a value was not collected or it never existed.\nMissing values may be indicated simply by the value being empty in other cases a special value may have been used e.g. `-`, `NaN`, `0`, `-9999` etc.\nThe `missingValues` property provides a way to indicate that these values should be interpreted as equivalent to null.\n\n`missingValues` are strings rather than being the data type of the particular field. This allows for comparison prior to casting and for fields to have missing value which are not of their type, for example a `number` field to have missing values indicated by `-`.\n\nThe default value of `missingValue` for a non-string type field is the empty string `''`. For string type fields there is no default for `missingValue` (for string fields the empty string `''` is a valid value and need not indicate null).", - "examples": [ - "{\n \"missingValues\": [\n \"-\",\n \"NaN\",\n \"\"\n ]\n}\n", - "{\n \"missingValues\": []\n}\n" - ] - }, - "type": { - "description": "The type keyword, which `MUST` be a value of `geopoint`.", - "enum": [ - "geopoint" - ] - }, - "format": { - "description": "The format keyword options for `geopoint` are `default`,`array`, and `object`.", - "context": "The following `format` options are supported:\n * **default**: A string of the pattern 'lon, lat', where `lon` is the longitude and `lat` is the latitude.\n * **array**: An array of exactly two items, where each item is either a number, or a string parsable as a number, and the first item is `lon` and the second item is `lat`.\n * **object**: A JSON object with exactly two keys, `lat` and `lon`", - "notes": [ - "Implementations `MUST` strip all white space in the default format of `lon, lat`." - ], - "enum": [ - "default", - "array", - "object" - ], - "default": "default" - }, - "constraints": { - "title": "Constraints", - "description": "The following constraints are supported for `geopoint` fields.", - "type": "object", - "properties": { - "required": { - "type": "boolean", - "description": "Indicates whether a property must have a value for each instance.", - "context": "An empty string is considered to be a missing value." - }, - "unique": { - "type": "boolean", - "description": "When `true`, each value for the property `MUST` be unique." - }, - "enum": { - "oneOf": [ - { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "type": "string" - } - }, - { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "type": "array" - } - }, - { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "type": "object" - } - } - ] - } - } - }, - "rdfType": { - "type": "string", - "description": "The RDF type for this field." - } - }, - "examples": [ - "{\n \"name\": \"post_office\",\n \"type\": \"geopoint\"\n}\n", - "{\n \"name\": \"post_office\",\n \"type\": \"geopoint\",\n \"format\": \"array\"\n}\n" - ] - }, - { - "type": "object", - "title": "GeoJSON Field", - "description": "The field contains a JSON object according to GeoJSON or TopoJSON", - "required": [ - "name", - "type" - ], - "properties": { - "name": { - "title": "Name", - "description": "A name for this field.", - "type": "string" - }, - "title": { - "title": "Title", - "description": "A human-readable title.", - "type": "string", - "examples": [ - "{\n \"title\": \"My Package Title\"\n}\n" - ] - }, - "description": { - "title": "Description", - "description": "A text description. Markdown is encouraged.", - "type": "string", - "examples": [ - "{\n \"description\": \"# My Package description\\nAll about my package.\"\n}\n" - ] - }, - "example": { - "title": "Example", - "description": "An example value for the field.", - "type": "string", - "examples": [ - "{\n \"example\": \"Put here an example value for your field\"\n}\n" - ] - }, - "missingValues": { - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "array", - "items": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "label": { - "type": "string" - } - } - } - } - ], - "default": [ - "" - ], - "description": "Values that when encountered in the source, should be considered as `null`, 'not present', or 'blank' values.", - "context": "Many datasets arrive with missing data values, either because a value was not collected or it never existed.\nMissing values may be indicated simply by the value being empty in other cases a special value may have been used e.g. `-`, `NaN`, `0`, `-9999` etc.\nThe `missingValues` property provides a way to indicate that these values should be interpreted as equivalent to null.\n\n`missingValues` are strings rather than being the data type of the particular field. This allows for comparison prior to casting and for fields to have missing value which are not of their type, for example a `number` field to have missing values indicated by `-`.\n\nThe default value of `missingValue` for a non-string type field is the empty string `''`. For string type fields there is no default for `missingValue` (for string fields the empty string `''` is a valid value and need not indicate null).", - "examples": [ - "{\n \"missingValues\": [\n \"-\",\n \"NaN\",\n \"\"\n ]\n}\n", - "{\n \"missingValues\": []\n}\n" - ] - }, - "type": { - "description": "The type keyword, which `MUST` be a value of `geojson`.", - "enum": [ - "geojson" - ] - }, - "format": { - "description": "The format keyword options for `geojson` are `default` and `topojson`.", - "context": "The following `format` options are supported:\n * **default**: A geojson object as per the [GeoJSON spec](http://geojson.org/).\n * **topojson**: A topojson object as per the [TopoJSON spec](https://github.com/topojson/topojson-specification/blob/master/README.md)", - "enum": [ - "default", - "topojson" - ], - "default": "default" - }, - "constraints": { - "title": "Constraints", - "description": "The following constraints are supported for `geojson` fields.", - "type": "object", - "properties": { - "required": { - "type": "boolean", - "description": "Indicates whether a property must have a value for each instance.", - "context": "An empty string is considered to be a missing value." - }, - "unique": { - "type": "boolean", - "description": "When `true`, each value for the property `MUST` be unique." - }, - "enum": { - "oneOf": [ - { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "type": "string" - } - }, - { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "type": "object" - } - } - ] - }, - "minLength": { - "type": "integer", - "description": "An integer that specifies the minimum length of a value." - }, - "maxLength": { - "type": "integer", - "description": "An integer that specifies the maximum length of a value." - } - } - }, - "rdfType": { - "type": "string", - "description": "The RDF type for this field." - } - }, - "examples": [ - "{\n \"name\": \"city_limits\",\n \"type\": \"geojson\"\n}\n", - "{\n \"name\": \"city_limits\",\n \"type\": \"geojson\",\n \"format\": \"topojson\"\n}\n" - ] - }, - { - "type": "object", - "title": "Array Field", - "description": "The field contains data which can be parsed as a valid JSON array.", - "required": [ - "name", - "type" - ], - "properties": { - "name": { - "title": "Name", - "description": "A name for this field.", - "type": "string" - }, - "title": { - "title": "Title", - "description": "A human-readable title.", - "type": "string", - "examples": [ - "{\n \"title\": \"My Package Title\"\n}\n" - ] - }, - "description": { - "title": "Description", - "description": "A text description. Markdown is encouraged.", - "type": "string", - "examples": [ - "{\n \"description\": \"# My Package description\\nAll about my package.\"\n}\n" - ] - }, - "example": { - "title": "Example", - "description": "An example value for the field.", - "type": "string", - "examples": [ - "{\n \"example\": \"Put here an example value for your field\"\n}\n" - ] - }, - "missingValues": { - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "array", - "items": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "label": { - "type": "string" - } - } - } - } - ], - "default": [ - "" - ], - "description": "Values that when encountered in the source, should be considered as `null`, 'not present', or 'blank' values.", - "context": "Many datasets arrive with missing data values, either because a value was not collected or it never existed.\nMissing values may be indicated simply by the value being empty in other cases a special value may have been used e.g. `-`, `NaN`, `0`, `-9999` etc.\nThe `missingValues` property provides a way to indicate that these values should be interpreted as equivalent to null.\n\n`missingValues` are strings rather than being the data type of the particular field. This allows for comparison prior to casting and for fields to have missing value which are not of their type, for example a `number` field to have missing values indicated by `-`.\n\nThe default value of `missingValue` for a non-string type field is the empty string `''`. For string type fields there is no default for `missingValue` (for string fields the empty string `''` is a valid value and need not indicate null).", - "examples": [ - "{\n \"missingValues\": [\n \"-\",\n \"NaN\",\n \"\"\n ]\n}\n", - "{\n \"missingValues\": []\n}\n" - ] - }, - "type": { - "description": "The type keyword, which `MUST` be a value of `array`.", - "enum": [ - "array" - ] - }, - "format": { - "description": "There are no format keyword options for `array`: only `default` is allowed.", - "enum": [ - "default" - ], - "default": "default" - }, - "constraints": { - "title": "Constraints", - "description": "The following constraints apply for `array` fields.", - "type": "object", - "properties": { - "required": { - "type": "boolean", - "description": "Indicates whether a property must have a value for each instance.", - "context": "An empty string is considered to be a missing value." - }, - "unique": { - "type": "boolean", - "description": "When `true`, each value for the property `MUST` be unique." - }, - "enum": { - "oneOf": [ - { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "type": "string" - } - }, - { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "type": "array" - } - } - ] - }, - "minLength": { - "type": "integer", - "description": "An integer that specifies the minimum length of a value." - }, - "maxLength": { - "type": "integer", - "description": "An integer that specifies the maximum length of a value." - }, - "jsonSchema": { - "type": "object", - "description": "A valid JSON Schema object to validate field values. If a field value conforms to the provided JSON Schema then this field value is valid." - } - } - }, - "rdfType": { - "type": "string", - "description": "The RDF type for this field." - } - }, - "examples": [ - "{\n \"name\": \"options\"\n \"type\": \"array\"\n}\n" - ] - }, - { - "type": "object", - "title": "Duration Field", - "description": "The field contains a duration of time.", - "context": "The lexical representation for duration is the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601#Durations) extended format `PnYnMnDTnHnMnS`, where `nY` represents the number of years, `nM` the number of months, `nD` the number of days, 'T' is the date/time separator, `nH` the number of hours, `nM` the number of minutes and `nS` the number of seconds. The number of seconds can include decimal digits to arbitrary precision. Date and time elements including their designator may be omitted if their value is zero, and lower order elements may also be omitted for reduced precision. Here we follow the definition of [XML Schema duration datatype](http://www.w3.org/TR/xmlschema-2/#duration) directly and that definition is implicitly inlined here.", - "required": [ - "name", - "type" - ], - "properties": { - "name": { - "title": "Name", - "description": "A name for this field.", - "type": "string" - }, - "title": { - "title": "Title", - "description": "A human-readable title.", - "type": "string", - "examples": [ - "{\n \"title\": \"My Package Title\"\n}\n" - ] - }, - "description": { - "title": "Description", - "description": "A text description. Markdown is encouraged.", - "type": "string", - "examples": [ - "{\n \"description\": \"# My Package description\\nAll about my package.\"\n}\n" - ] - }, - "example": { - "title": "Example", - "description": "An example value for the field.", - "type": "string", - "examples": [ - "{\n \"example\": \"Put here an example value for your field\"\n}\n" - ] - }, - "missingValues": { - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "array", - "items": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "label": { - "type": "string" - } - } - } - } - ], - "default": [ - "" - ], - "description": "Values that when encountered in the source, should be considered as `null`, 'not present', or 'blank' values.", - "context": "Many datasets arrive with missing data values, either because a value was not collected or it never existed.\nMissing values may be indicated simply by the value being empty in other cases a special value may have been used e.g. `-`, `NaN`, `0`, `-9999` etc.\nThe `missingValues` property provides a way to indicate that these values should be interpreted as equivalent to null.\n\n`missingValues` are strings rather than being the data type of the particular field. This allows for comparison prior to casting and for fields to have missing value which are not of their type, for example a `number` field to have missing values indicated by `-`.\n\nThe default value of `missingValue` for a non-string type field is the empty string `''`. For string type fields there is no default for `missingValue` (for string fields the empty string `''` is a valid value and need not indicate null).", - "examples": [ - "{\n \"missingValues\": [\n \"-\",\n \"NaN\",\n \"\"\n ]\n}\n", - "{\n \"missingValues\": []\n}\n" - ] - }, - "type": { - "description": "The type keyword, which `MUST` be a value of `duration`.", - "enum": [ - "duration" - ] - }, - "format": { - "description": "There are no format keyword options for `duration`: only `default` is allowed.", - "enum": [ - "default" - ], - "default": "default" - }, - "constraints": { - "title": "Constraints", - "description": "The following constraints are supported for `duration` fields.", - "type": "object", - "properties": { - "required": { - "type": "boolean", - "description": "Indicates whether a property must have a value for each instance.", - "context": "An empty string is considered to be a missing value." - }, - "unique": { - "type": "boolean", - "description": "When `true`, each value for the property `MUST` be unique." - }, - "enum": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "type": "string" - } - }, - "minimum": { - "type": "string" - }, - "maximum": { - "type": "string" - }, - "exclusiveMinimum": { - "type": "string" - }, - "exclusiveMaximum": { - "type": "string" - } - } - }, - "rdfType": { - "type": "string", - "description": "The RDF type for this field." - } - }, - "examples": [ - "{\n \"name\": \"period\"\n \"type\": \"duration\"\n}\n" - ] - }, - { - "type": "object", - "title": "Any Field", - "description": "Any value is accepted, including values that are not captured by the type/format/constraint requirements of the specification.", - "required": [ - "name", - "type" - ], - "properties": { - "name": { - "title": "Name", - "description": "A name for this field.", - "type": "string" - }, - "title": { - "title": "Title", - "description": "A human-readable title.", - "type": "string", - "examples": [ - "{\n \"title\": \"My Package Title\"\n}\n" - ] - }, - "description": { - "title": "Description", - "description": "A text description. Markdown is encouraged.", - "type": "string", - "examples": [ - "{\n \"description\": \"# My Package description\\nAll about my package.\"\n}\n" - ] - }, - "example": { - "title": "Example", - "description": "An example value for the field.", - "type": "string", - "examples": [ - "{\n \"example\": \"Put here an example value for your field\"\n}\n" - ] - }, - "missingValues": { - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "array", - "items": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "label": { - "type": "string" - } - } - } - } - ], - "default": [ - "" - ], - "description": "Values that when encountered in the source, should be considered as `null`, 'not present', or 'blank' values.", - "context": "Many datasets arrive with missing data values, either because a value was not collected or it never existed.\nMissing values may be indicated simply by the value being empty in other cases a special value may have been used e.g. `-`, `NaN`, `0`, `-9999` etc.\nThe `missingValues` property provides a way to indicate that these values should be interpreted as equivalent to null.\n\n`missingValues` are strings rather than being the data type of the particular field. This allows for comparison prior to casting and for fields to have missing value which are not of their type, for example a `number` field to have missing values indicated by `-`.\n\nThe default value of `missingValue` for a non-string type field is the empty string `''`. For string type fields there is no default for `missingValue` (for string fields the empty string `''` is a valid value and need not indicate null).", - "examples": [ - "{\n \"missingValues\": [\n \"-\",\n \"NaN\",\n \"\"\n ]\n}\n", - "{\n \"missingValues\": []\n}\n" - ] - }, - "type": { - "description": "The type keyword, which `MUST` be a value of `any`.", - "enum": [ - "any" - ] - }, - "constraints": { - "title": "Constraints", - "description": "The following constraints apply to `any` fields.", - "type": "object", - "properties": { - "required": { - "type": "boolean", - "description": "Indicates whether a property must have a value for each instance.", - "context": "An empty string is considered to be a missing value." - }, - "unique": { - "type": "boolean", - "description": "When `true`, each value for the property `MUST` be unique." - }, - "enum": { - "type": "array", - "minItems": 1, - "uniqueItems": true - } - } - }, - "rdfType": { - "type": "string", - "description": "The RDF type for this field." - } - }, - "examples": [ - "{\n \"name\": \"notes\",\n \"type\": \"any\"\n" - ] - } - ] - }, - "description": "An `array` of Table Schema Field objects.", - "examples": [ - "{\n \"fields\": [\n {\n \"name\": \"my-field-name\"\n }\n ]\n}\n", - "{\n \"fields\": [\n {\n \"name\": \"my-field-name\",\n \"type\": \"number\"\n },\n {\n \"name\": \"my-field-name-2\",\n \"type\": \"string\",\n \"format\": \"email\"\n }\n ]\n}\n" - ] - }, - "fieldsMatch": { - "type": "array", - "item": { - "type": "string", - "enum": [ - "exact", - "equal", - "subset", - "superset", - "partial" - ], - "default": "exact" - } - }, - "primaryKey": { - "oneOf": [ - { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ], - "description": "A primary key is a field name or an array of field names, whose values `MUST` uniquely identify each row in the table.", - "context": "Field name in the `primaryKey` `MUST` be unique, and `MUST` match a field name in the associated table. It is acceptable to have an array with a single value, indicating that the value of a single field is the primary key.", - "examples": [ - "{\n \"primaryKey\": [\n \"name\"\n ]\n}\n", - "{\n \"primaryKey\": [\n \"first_name\",\n \"last_name\"\n ]\n}\n" - ] - }, - "uniqueKeys": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "type": "string" - } - } - }, - "foreignKeys": { - "type": "array", - "minItems": 1, - "items": { - "title": "Table Schema Foreign Key", - "description": "Table Schema Foreign Key", - "type": "object", - "required": [ - "fields", - "reference" - ], - "oneOf": [ - { - "properties": { - "fields": { - "type": "array", - "items": { - "type": "string", - "minItems": 1, - "uniqueItems": true, - "description": "Fields that make up the primary key." - } - }, - "reference": { - "type": "object", - "required": [ - "fields" - ], - "properties": { - "resource": { - "type": "string" - }, - "fields": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1, - "uniqueItems": true - } - } - } - } - }, - { - "properties": { - "fields": { - "type": "string", - "description": "Fields that make up the primary key." - }, - "reference": { - "type": "object", - "required": [ - "fields" - ], - "properties": { - "resource": { - "type": "string" - }, - "fields": { - "type": "string" - } - } - } - } - } - ] - }, - "examples": [ - "{\n \"foreignKeys\": [\n {\n \"fields\": \"state\",\n \"reference\": {\n \"resource\": \"the-resource\",\n \"fields\": \"state_id\"\n }\n }\n ]\n}\n", - "{\n \"foreignKeys\": [\n {\n \"fields\": \"state\",\n \"reference\": {\n \"fields\": \"id\"\n }\n }\n ]\n}\n" - ] - }, - "missingValues": { - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "array", - "items": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "label": { - "type": "string" - } - } - } - } - ], - "default": [ - "" - ], - "description": "Values that when encountered in the source, should be considered as `null`, 'not present', or 'blank' values.", - "context": "Many datasets arrive with missing data values, either because a value was not collected or it never existed.\nMissing values may be indicated simply by the value being empty in other cases a special value may have been used e.g. `-`, `NaN`, `0`, `-9999` etc.\nThe `missingValues` property provides a way to indicate that these values should be interpreted as equivalent to null.\n\n`missingValues` are strings rather than being the data type of the particular field. This allows for comparison prior to casting and for fields to have missing value which are not of their type, for example a `number` field to have missing values indicated by `-`.\n\nThe default value of `missingValue` for a non-string type field is the empty string `''`. For string type fields there is no default for `missingValue` (for string fields the empty string `''` is a valid value and need not indicate null).", - "examples": [ - "{\n \"missingValues\": [\n \"-\",\n \"NaN\",\n \"\"\n ]\n}\n", - "{\n \"missingValues\": []\n}\n" - ] - } - }, - "examples": [ - "{\n \"schema\": {\n \"fields\": [\n {\n \"name\": \"first_name\",\n \"type\": \"string\"\n \"constraints\": {\n \"required\": true\n }\n },\n {\n \"name\": \"age\",\n \"type\": \"integer\"\n },\n ],\n \"primaryKey\": [\n \"name\"\n ]\n }\n}\n" - ] - } - } - }, - "examples": [ - "{\n \"resources\": [\n {\n \"name\": \"my-data\",\n \"data\": [\n \"data.csv\"\n ],\n \"mediatype\": \"text/csv\"\n }\n ]\n}\n" - ] - }, - "sources": { - "propertyOrder": 200, - "options": { - "hidden": true - }, - "title": "Sources", - "description": "The raw sources for this resource.", - "type": "array", - "minItems": 0, - "items": { - "title": "Source", - "description": "A source file.", - "type": "object", - "minProperties": 1, - "properties": { - "title": { - "title": "Title", - "description": "A human-readable title.", - "type": "string", - "examples": [ - "{\n \"title\": \"My Package Title\"\n}\n" - ] - }, - "path": { - "title": "Path", - "description": "A fully qualified URL, or a POSIX file path.", - "type": "string", - "pattern": "^((?=[^./~])(?!file:)((?!\\/\\.\\.\\/)(?!\\\\)(?!:\\/\\/).)*|(http|ftp)s?:\\/\\/.*)$", - "examples": [ - "{\n \"path\": \"file.csv\"\n}\n", - "{\n \"path\": \"http://example.com/file.csv\"\n}\n" - ], - "context": "Implementations need to negotiate the type of path provided, and dereference the data accordingly." - }, - "email": { - "title": "Email", - "description": "An email address.", - "type": "string", - "format": "email", - "examples": [ - "{\n \"email\": \"example@example.com\"\n}\n" - ] - }, - "version": { - "type": "string" - } - } - }, - "examples": [ - "{\n \"sources\": [\n {\n \"title\": \"World Bank and OECD\",\n \"path\": \"http://data.worldbank.org/indicator/NY.GDP.MKTP.CD\"\n }\n ]\n}\n" - ] - } - } -} diff --git a/src/seedcase_sprout/check_properties.py b/src/seedcase_sprout/check_properties.py index 512761d94..f05d39757 100644 --- a/src/seedcase_sprout/check_properties.py +++ b/src/seedcase_sprout/check_properties.py @@ -1,17 +1,18 @@ from typing import Any -import seedcase_sprout.check_datapackage as cdp +import check_datapackage as cdp + +from seedcase_sprout.internals.create import _create_resource_data_path +from seedcase_sprout.internals.functionals import _map from seedcase_sprout.properties import PackageProperties, ResourceProperties -from seedcase_sprout.sprout_checks.get_sprout_package_errors import ( - get_sprout_package_errors, +from seedcase_sprout.sprout_checks.is_resource_name_correct import ( + _is_resource_name_correct, ) -from seedcase_sprout.sprout_checks.get_sprout_resource_errors import ( - get_sprout_resource_errors, +from seedcase_sprout.sprout_checks.required_fields import ( + PACKAGE_SPROUT_REQUIRED_FIELDS, + RESOURCE_SPROUT_REQUIRED_FIELDS, ) -# Script only constant -_RESOURCE_FIELD_PATTERN = r"resources\[\d+\]" - def check_package_properties(properties: Any) -> PackageProperties: """Check `PackageProperties` (not `ResourceProperties`) against the requirements. @@ -29,16 +30,15 @@ def check_package_properties(properties: Any) -> PackageProperties: The `properties` if all checks pass. Raises: - ExceptionGroup: A group of `CheckError`s, one error per failed check. + DataPackageError: an error flagging issues in the package properties. """ package_properties = _check_is_package_properties_type(properties) return _generic_check_properties( package_properties, - ignore=[ - # Ignore checks on specific resources within the resource field. - cdp.CheckErrorMatcher(json_path=_RESOURCE_FIELD_PATTERN), - # Ignore missing resources. - cdp.CheckErrorMatcher(json_path=r"resources$", validator="required"), + exclusions=[ + cdp.Exclusion(jsonpath="$.resources[*] | $.resources[*].*"), + cdp.Exclusion(jsonpath="$.resources", type="required"), + cdp.Exclusion(jsonpath="$.resources", type="minItems"), ], ) @@ -67,7 +67,7 @@ def check_properties(properties: Any) -> PackageProperties: The `properties` if all checks pass. Raises: - ExceptionGroup: A group of `CheckError`s, one error per failed check. + DataPackageError: an error flagging issues in the properties. """ package_properties = _check_is_package_properties_type(properties) if not package_properties.resources: @@ -77,6 +77,18 @@ def check_properties(properties: Any) -> PackageProperties: return package_properties +class DataResourceError(Exception): + """Error listing issues in a data resource.""" + + def __init__( + self, + data_package_error: cdp.DataPackageError, + ) -> None: + """Create a `DataResourceError` from a `cdp.DataPackageError`.""" + message = str(data_package_error).replace("package.resources[0]", "resource") + super().__init__(message) + + def check_resource_properties(properties: Any) -> ResourceProperties: """Checks that only the resource `properties` match Sprout's requirements. @@ -96,31 +108,26 @@ def check_resource_properties(properties: Any) -> ResourceProperties: Outputs the `properties` if all checks pass. Raises: - ExceptionGroup: A group of `CheckError`s, one error per failed check. + DataResourceError: an error flagging issues in the resource properties. """ - package_field_pattern = r"\$\.\w+$" resource_properties = _check_is_resource_properties_type(properties) try: _generic_check_properties( PackageProperties(resources=[resource_properties]), - ignore=[cdp.CheckErrorMatcher(json_path=package_field_pattern)], + exclusions=[cdp.Exclusion(jsonpath="$.*")], ) - # TODO: This probably is better placed in the `check-datapackage` package. - except ExceptionGroup as error_info: - for error in error_info.exceptions: - if isinstance(error, cdp.CheckError): - error.json_path = error.json_path.replace(".resources[0]", "") - raise error_info + except cdp.DataPackageError as error: + raise DataResourceError(error) from None return resource_properties def _generic_check_properties( - properties: PackageProperties, ignore: list[cdp.CheckErrorMatcher] = [] + properties: PackageProperties, exclusions: list[cdp.Exclusion] = [] ) -> PackageProperties: """A generic check for Sprout-specific requirements on the Frictionless standard. - All `properties`, excluding those in `ignore`, are checked against the Data + All `properties`, excluding those in `exclusions`, are checked against the Data Package standard as well as the following Sprout-specific requirements: - Sprout-specific required fields are present @@ -131,50 +138,138 @@ def _generic_check_properties( Args: properties: The full package properties to check, including resource properties. - ignore: A list of matchers for any `CheckErrors` to ignore. + exclusions: A list of exclusions for any checks to ignore. Returns: Outputs the `properties` object if all checks pass. Raises: - ExceptionGroup: A group of `CheckError`s, one error per failed check. + DataPackageError: an error flagging issues in the properties. """ - properties_dict = properties.compact_dict - - errors = cdp.check_properties(properties_dict) + package_required_checks = _map( + PACKAGE_SPROUT_REQUIRED_FIELDS, + lambda field: cdp.RequiredCheck( + jsonpath=f"$.{field}", + message=f"'{field}' is a required property", + ), + ) - errors += get_sprout_package_errors(properties_dict) + resource_required_checks = _map( + RESOURCE_SPROUT_REQUIRED_FIELDS, + lambda field: cdp.RequiredCheck( + jsonpath=f"$.resources[*].{field}", + message=f"'{field}' is a required property", + ), + ) - resources = properties_dict.get("resources") - if isinstance(resources, list): - for index, resource in enumerate(resources): - if isinstance(resource, dict): - errors += get_sprout_resource_errors(resource, index) + not_blank_resource_fields = _map( + RESOURCE_SPROUT_REQUIRED_FIELDS, lambda field: f"$.resources[*].{field}" + ) + not_blank = cdp.CustomCheck( + jsonpath=( + f"$.{' | '.join(PACKAGE_SPROUT_REQUIRED_FIELDS)} " + "| $.contributors[*].title" + "| $.sources[*].title" + "| $.licenses[*].name" + "| $.licenses[*].path" + f"| {' | '.join(not_blank_resource_fields)}" + ), + message="This property must not be empty.", + check=lambda value: bool(value), + type="not-blank", + ) + resource_path_string = cdp.CustomCheck( + jsonpath="$.resources[*].path", + message="Resource path must be of type string.", + check=lambda value: isinstance(value, str), + type="resource-path-string", + ) + resource_path_format = cdp.CustomCheck( + jsonpath="$.resources[*]", + message=( + "Resource path must have the format " + "`resources//data.parquet`." + ), + check=lambda value: _check_resource_path_format(value), + type="resource-path-format", + ) + no_resource_data = cdp.CustomCheck( + jsonpath="$.resources[*].data", + message=( + "Sprout doesn't use the `data` field, instead it expects data " + "in separate files that are given in the `path` field." + ), + check=lambda value: value is None, + type="no-inline-data", + ) + exclude_resource_data = cdp.Exclusion(jsonpath="$.resources[*].data") + exclude_resource_path_or_data_required = cdp.Exclusion( + jsonpath="$.resources[*]", type="required" + ) + exclude_resource_path_type = cdp.Exclusion( + jsonpath="$.resources[*].path", type="type" + ) + exclude_resource_path_pattern = cdp.Exclusion( + jsonpath="$.resources[*].path", type="pattern" + ) + exclude_resource_path_min_items = cdp.Exclusion( + jsonpath="$.resources[*].path", type="minItems" + ) - errors = cdp.exclude_matching_errors( - errors, - [ - *ignore, - cdp.CheckErrorMatcher( - validator="required", json_path=rf"{_RESOURCE_FIELD_PATTERN}\.data$" - ), - cdp.CheckErrorMatcher( - validator="type", - json_path=rf"{_RESOURCE_FIELD_PATTERN}\.path$", - message="not of type 'array'", + cdp.check( + properties.compact_dict, + config=cdp.Config( + strict=True, + exclusions=[ + exclude_resource_data, + exclude_resource_path_or_data_required, + exclude_resource_path_type, + exclude_resource_path_pattern, + exclude_resource_path_min_items, + ] + + exclusions, + extensions=cdp.Extensions( + required_checks=package_required_checks + resource_required_checks, + custom_checks=[ + not_blank, + resource_path_string, + resource_path_format, + no_resource_data, + ], ), - ], + ), + error=True, ) - errors = sorted(set(errors)) - - if errors: - raise ExceptionGroup( - f"The following checks failed on the properties:\n{properties}", errors - ) return properties +def _check_resource_path_format(resource_properties: Any) -> bool: + """Checks if the data path in the resource properties has the correct format. + + As the path is constructed from the resource name, its format can only be checked + if the resource name is correct. + """ + if not isinstance(resource_properties, dict): + return True + + name = resource_properties.get("name") + path = resource_properties.get("path") + + if ( + # Do not check path if name is incorrect + not _is_resource_name_correct(name) + # Do not check path if not string + or not isinstance(path, str) + # Do not check path if blank + or path == "" + ): + return True + + expected_path = _create_resource_data_path(str(name)) + return path == expected_path + + def _check_is_package_properties_type(properties: Any) -> PackageProperties: if not isinstance(properties, PackageProperties): raise TypeError( diff --git a/src/seedcase_sprout/internals/functionals.py b/src/seedcase_sprout/internals/functionals.py index baa6bf4cf..fe91c2aa5 100644 --- a/src/seedcase_sprout/internals/functionals.py +++ b/src/seedcase_sprout/internals/functionals.py @@ -1,14 +1,14 @@ """Mimicking the functional programming tools from R and the R package purrr.""" from itertools import repeat -from typing import Callable, TypeVar +from typing import Callable, Iterable, TypeVar T = TypeVar("T") U = TypeVar("U") V = TypeVar("V") -def _map(x: list[T], fn: Callable[[T], U]) -> list[U]: +def _map(x: Iterable[T], fn: Callable[[T], U]) -> list[U]: """Use a function on each item in a list. This is a simpler, more user-friendly version of the built-in `map()` diff --git a/src/seedcase_sprout/sprout_checks/check_fields_not_blank.py b/src/seedcase_sprout/sprout_checks/check_fields_not_blank.py deleted file mode 100644 index ca117ac3c..000000000 --- a/src/seedcase_sprout/sprout_checks/check_fields_not_blank.py +++ /dev/null @@ -1,42 +0,0 @@ -from typing import Any - -from seedcase_sprout.check_datapackage import CheckError, RequiredFieldType -from seedcase_sprout.sprout_checks.get_blank_value_for_type import ( - get_blank_value_for_type, -) -from seedcase_sprout.sprout_checks.get_json_path_to_resource_field import ( - get_json_path_to_resource_field, -) - -SPROUT_BLANK_ERROR_MESSAGE = "The '{field_name}' field is blank, please fill it in." - - -def check_fields_not_blank( - properties: dict[str, Any], - fields: dict[str, RequiredFieldType], - index: int | None = None, -) -> list[CheckError]: - """Checks that fields in `fields` are not blank if they are present. - - Fields not present in `properties` are not checked. - - For resource properties, an index may be supplied, if the resource properties are - part of a set of package properties. - - Args: - properties: The properties where the fields are. - fields: A set of fields and their types. - index: The index of the resource properties. Defaults to None. - - Returns: - A list of errors. An empty list if no errors were found. - """ - return [ - CheckError( - message=SPROUT_BLANK_ERROR_MESSAGE.format(field_name=field), - json_path=get_json_path_to_resource_field(field, index), - validator="blank", - ) - for field, type in fields.items() - if properties.get(field) == get_blank_value_for_type(type) - ] diff --git a/src/seedcase_sprout/sprout_checks/check_fields_present.py b/src/seedcase_sprout/sprout_checks/check_fields_present.py deleted file mode 100644 index 89eb8459f..000000000 --- a/src/seedcase_sprout/sprout_checks/check_fields_present.py +++ /dev/null @@ -1,37 +0,0 @@ -from typing import Any - -from seedcase_sprout.check_datapackage import CheckError, RequiredFieldType -from seedcase_sprout.sprout_checks.get_json_path_to_resource_field import ( - get_json_path_to_resource_field, -) - -CHECKS_REQUIRED_ERROR_MESSAGE = "'{field_name}' is a required property" - - -def check_fields_present( - properties: dict[str, Any], - required_fields: dict[str, RequiredFieldType], - index: int | None = None, -) -> list[CheckError]: - """Checks that all fields in `required_fields` are present. - - For resource properties, an index may be supplied, if the resource properties are - part of a set of package properties. - - Args: - properties: The properties to check. - required_fields: The set of required fields and their types. - index: The index of the resource properties. Defaults to None. - - Returns: - A list of errors. An empty list if no errors were found. - """ - return [ - CheckError( - message=CHECKS_REQUIRED_ERROR_MESSAGE.format(field_name=field), - json_path=get_json_path_to_resource_field(field, index), - validator="required", - ) - for field in required_fields.keys() - if properties.get(field) is None - ] diff --git a/src/seedcase_sprout/sprout_checks/check_list_item_field_not_blank.py b/src/seedcase_sprout/sprout_checks/check_list_item_field_not_blank.py deleted file mode 100644 index bd3e40e76..000000000 --- a/src/seedcase_sprout/sprout_checks/check_list_item_field_not_blank.py +++ /dev/null @@ -1,37 +0,0 @@ -from typing import Any - -from seedcase_sprout.check_datapackage import CheckError, RequiredFieldType -from seedcase_sprout.sprout_checks.check_fields_not_blank import ( - SPROUT_BLANK_ERROR_MESSAGE, -) -from seedcase_sprout.sprout_checks.get_blank_value_for_type import ( - get_blank_value_for_type, -) - - -def check_list_item_field_not_blank( - properties: dict[str, Any], - list_name: str, - field_name: str, - field_type: RequiredFieldType = RequiredFieldType.str, -) -> list[CheckError]: - """Checks that the specified field of items in a list is not blank. - - Args: - properties: The properties object containing the list. - list_name: The name of the list field. - field_name: The name of the item field. - field_type: The type of the item field. Defaults to str. - - Returns: - A list of errors. An empty list if no errors were found. - """ - return [ - CheckError( - message=SPROUT_BLANK_ERROR_MESSAGE.format(field_name=field_name), - json_path=f"$.{list_name}[{index}].{field_name}", - validator="blank", - ) - for index, item in enumerate(properties.get(list_name, [])) - if item.get(field_name) == get_blank_value_for_type(field_type) - ] diff --git a/src/seedcase_sprout/sprout_checks/check_no_inline_data.py b/src/seedcase_sprout/sprout_checks/check_no_inline_data.py deleted file mode 100644 index 2d9cb23d4..000000000 --- a/src/seedcase_sprout/sprout_checks/check_no_inline_data.py +++ /dev/null @@ -1,33 +0,0 @@ -from typing import Any - -from seedcase_sprout.check_datapackage import CheckError -from seedcase_sprout.sprout_checks.get_json_path_to_resource_field import ( - get_json_path_to_resource_field, -) - - -def check_no_inline_data( - properties: dict[str, Any], index: int | None = None -) -> list[CheckError]: - """Checks that the `data` field of a set of resource properties is not set. - - Args: - properties: The resource properties. - index: The index of the resource properties. Defaults to None. - - Returns: - A list of errors. The empty list if no error was found. - """ - if properties.get("data") is None: - return [] - - return [ - CheckError( - message=( - "Sprout doesn't use the 'data' field, instead it expects data " - "in separate files that are given in the 'path' field." - ), - json_path=get_json_path_to_resource_field("data", index), - validator="inline-data", - ) - ] diff --git a/src/seedcase_sprout/sprout_checks/check_required_package_properties_not_blank.py b/src/seedcase_sprout/sprout_checks/check_required_package_properties_not_blank.py deleted file mode 100644 index dd380a592..000000000 --- a/src/seedcase_sprout/sprout_checks/check_required_package_properties_not_blank.py +++ /dev/null @@ -1,34 +0,0 @@ -from typing import Any - -from seedcase_sprout.check_datapackage import CheckError -from seedcase_sprout.sprout_checks.check_fields_not_blank import ( - check_fields_not_blank, -) -from seedcase_sprout.sprout_checks.check_list_item_field_not_blank import ( - check_list_item_field_not_blank, -) -from seedcase_sprout.sprout_checks.required_fields import ( - PACKAGE_SPROUT_REQUIRED_FIELDS, -) - - -def check_required_package_properties_not_blank( - properties: dict[str, Any], -) -> list[CheckError]: - """Checks that required package properties fields are not blank. - - Both Sprout-specific required fields and fields required by the Data Package - standard are checked. - - Args: - properties: The package properties. - - Returns: - A list of errors. An empty list if no errors were found. - """ - errors = check_fields_not_blank(properties, PACKAGE_SPROUT_REQUIRED_FIELDS) - errors += check_list_item_field_not_blank(properties, "contributors", "title") - errors += check_list_item_field_not_blank(properties, "sources", "title") - errors += check_list_item_field_not_blank(properties, "licenses", "name") - errors += check_list_item_field_not_blank(properties, "licenses", "path") - return errors diff --git a/src/seedcase_sprout/sprout_checks/check_resource_path_string.py b/src/seedcase_sprout/sprout_checks/check_resource_path_string.py deleted file mode 100644 index 804426f98..000000000 --- a/src/seedcase_sprout/sprout_checks/check_resource_path_string.py +++ /dev/null @@ -1,35 +0,0 @@ -from typing import Any - -from seedcase_sprout.check_datapackage import CheckError -from seedcase_sprout.sprout_checks.get_json_path_to_resource_field import ( - get_json_path_to_resource_field, -) - -CHECKS_TYPE_ERROR_MESSAGE = "{field_value} is not of type '{field_type}'" - - -def check_resource_path_string( - properties: dict[str, Any], index: int | None = None -) -> list[CheckError]: - """Checks that the `path` field of a set of resource properties is of type string. - - Args: - properties: The resource properties. - index: The index of the resource properties. Defaults to None. - - Returns: - A list of errors. An empty list if no error was found. - """ - path = properties.get("path", "") - if isinstance(path, str): - return [] - - return [ - CheckError( - message=CHECKS_TYPE_ERROR_MESSAGE.format( - field_value=path, field_type="string" - ), - json_path=get_json_path_to_resource_field("path", index), - validator="type", - ) - ] diff --git a/src/seedcase_sprout/sprout_checks/exclude_non_sprout_resource_errors.py b/src/seedcase_sprout/sprout_checks/exclude_non_sprout_resource_errors.py deleted file mode 100644 index 3e4918c8a..000000000 --- a/src/seedcase_sprout/sprout_checks/exclude_non_sprout_resource_errors.py +++ /dev/null @@ -1,28 +0,0 @@ -from seedcase_sprout.check_datapackage import CheckError - - -def exclude_non_sprout_resource_errors( - errors: list[CheckError], -) -> list[CheckError]: - """Filters out resource errors that are not relevant for Sprout. - - Errors filtered out: - - inline `data` required but missing - - `path` is not of type array - - Args: - errors: The full error list. - - Returns: - The filtered error list. - """ - return [ - error - for error in errors - if not (error.validator == "required" and error.json_path.endswith(".data")) - and not ( - error.validator == "type" - and error.json_path.endswith(".path") - and error.message.endswith("not of type 'array'") - ) - ] diff --git a/src/seedcase_sprout/sprout_checks/get_blank_value_for_type.py b/src/seedcase_sprout/sprout_checks/get_blank_value_for_type.py deleted file mode 100644 index a6a556b5a..000000000 --- a/src/seedcase_sprout/sprout_checks/get_blank_value_for_type.py +++ /dev/null @@ -1,21 +0,0 @@ -from typing import Any - -from seedcase_sprout.check_datapackage import RequiredFieldType - - -def get_blank_value_for_type(type: RequiredFieldType) -> str | list[Any] | None: - """Returns the blank value for each type of (required) field. - - Args: - type: The type of the field. - - Returns: - The corresponding blank value. - """ - match type: - case RequiredFieldType.str: - return "" - case RequiredFieldType.list: - return [] - case _: - return None diff --git a/src/seedcase_sprout/sprout_checks/get_json_path_to_resource_field.py b/src/seedcase_sprout/sprout_checks/get_json_path_to_resource_field.py deleted file mode 100644 index 3fa4496db..000000000 --- a/src/seedcase_sprout/sprout_checks/get_json_path_to_resource_field.py +++ /dev/null @@ -1,14 +0,0 @@ -def get_json_path_to_resource_field(field: str, index: int | None = None) -> str: - """Creates the JSON path to the specified field of a set of resource properties. - - Optionally adds the index of the resource properties, if they are part of a set of - package properties. - - Args: - field: The name of the field. - index: The index of the resource properties. Defaults to None. - - Returns: - The JSON path. - """ - return "$." + ("" if index is None else f"resources[{index}].") + field diff --git a/src/seedcase_sprout/sprout_checks/get_sprout_package_errors.py b/src/seedcase_sprout/sprout_checks/get_sprout_package_errors.py deleted file mode 100644 index c8a605fa6..000000000 --- a/src/seedcase_sprout/sprout_checks/get_sprout_package_errors.py +++ /dev/null @@ -1,26 +0,0 @@ -from typing import Any - -from seedcase_sprout.check_datapackage import CheckError -from seedcase_sprout.sprout_checks.check_fields_present import ( - check_fields_present, -) -from seedcase_sprout.sprout_checks.check_required_package_properties_not_blank import ( # noqa: E501 - check_required_package_properties_not_blank, -) -from seedcase_sprout.sprout_checks.required_fields import ( - PACKAGE_SPROUT_REQUIRED_FIELDS, -) - - -def get_sprout_package_errors(properties: dict[str, Any]) -> list[CheckError]: - """Checks the package `properties` against Sprout-specific requirements only. - - Args: - properties: The package properties. - - Returns: - A list of errors. An empty list if no errors were found. - """ - errors = check_required_package_properties_not_blank(properties) - errors += check_fields_present(properties, PACKAGE_SPROUT_REQUIRED_FIELDS) - return errors diff --git a/src/seedcase_sprout/sprout_checks/get_sprout_resource_errors.py b/src/seedcase_sprout/sprout_checks/get_sprout_resource_errors.py deleted file mode 100644 index d543a6432..000000000 --- a/src/seedcase_sprout/sprout_checks/get_sprout_resource_errors.py +++ /dev/null @@ -1,87 +0,0 @@ -from typing import Any - -import seedcase_sprout.check_datapackage as cdp -from seedcase_sprout.internals import ( - _create_resource_data_path, -) -from seedcase_sprout.sprout_checks.check_fields_not_blank import ( - check_fields_not_blank, -) -from seedcase_sprout.sprout_checks.check_fields_present import ( - check_fields_present, -) -from seedcase_sprout.sprout_checks.check_no_inline_data import check_no_inline_data -from seedcase_sprout.sprout_checks.check_resource_path_string import ( - check_resource_path_string, -) -from seedcase_sprout.sprout_checks.get_json_path_to_resource_field import ( - get_json_path_to_resource_field, -) -from seedcase_sprout.sprout_checks.is_resource_name_correct import ( - _is_resource_name_correct, -) -from seedcase_sprout.sprout_checks.required_fields import ( - RESOURCE_SPROUT_REQUIRED_FIELDS, -) - - -def get_sprout_resource_errors( - properties: dict[str, Any], index: int | None = None -) -> list[cdp.CheckError]: - """Checks the resource `properties` against Sprout-specific requirements only. - - Args: - properties: The resource properties. - index: The index of the resource properties. Defaults to None. - - Returns: - A list of errors. An empty list if no errors were found. - """ - errors = check_resource_path_string(properties, index) - errors += _check_resource_path_format(properties, index) - errors += check_no_inline_data(properties, index) - errors += check_fields_not_blank(properties, RESOURCE_SPROUT_REQUIRED_FIELDS, index) - errors += check_fields_present(properties, RESOURCE_SPROUT_REQUIRED_FIELDS, index) - return errors - - -def _check_resource_path_format( - properties: dict[str, Any], index: int | None = None -) -> list[cdp.CheckError]: - """Checks if the data path in the resource properties has the correct format. - - As the path is constructed from the resource name, its format can only be checked - if the resource name is correct. Type, required, and blank errors are not flagged - here to avoid flagging them twice. - - Args: - properties: The resource properties to check. - index: The index of the resource properties. Defaults to None. - - Returns: - A list of errors. An empty list if no errors were found. - """ - name = properties.get("name") - path = properties.get("path") - - if ( - # Do not check path if name is incorrect - not _is_resource_name_correct(name) - # Do not flag type and required errors twice - or not isinstance(path, str) - # Do not flag blank errors twice - or path == "" - ): - return [] - - expected_path = _create_resource_data_path(str(name)) - if path == expected_path: - return [] - - return [ - cdp.CheckError( - message=f"Expected the path to be '{expected_path}' but found '{path}'.", - json_path=get_json_path_to_resource_field("path", index), - validator="pattern", - ) - ] diff --git a/src/seedcase_sprout/sprout_checks/is_resource_name_correct.py b/src/seedcase_sprout/sprout_checks/is_resource_name_correct.py index ad082952c..edf87f268 100644 --- a/src/seedcase_sprout/sprout_checks/is_resource_name_correct.py +++ b/src/seedcase_sprout/sprout_checks/is_resource_name_correct.py @@ -1,7 +1,7 @@ import re from typing import Any -from seedcase_sprout.check_datapackage.constants import NAME_PATTERN +NAME_PATTERN = r"^[a-z0-9._-]+$" def _is_resource_name_correct(resource_name: Any) -> bool: diff --git a/src/seedcase_sprout/sprout_checks/required_fields.py b/src/seedcase_sprout/sprout_checks/required_fields.py index 459f19fa4..cbb23a638 100644 --- a/src/seedcase_sprout/sprout_checks/required_fields.py +++ b/src/seedcase_sprout/sprout_checks/required_fields.py @@ -1,21 +1,18 @@ -import seedcase_sprout.check_datapackage as cdp - -# Sprout-specific required fields and their types +# Sprout-specific required fields PACKAGE_SPROUT_REQUIRED_FIELDS = ( - cdp.PACKAGE_REQUIRED_FIELDS - | cdp.PACKAGE_RECOMMENDED_FIELDS - | { - "title": cdp.RequiredFieldType.str, - "description": cdp.RequiredFieldType.str, - "version": cdp.RequiredFieldType.str, - "created": cdp.RequiredFieldType.str, - } + "name", + "id", + "licenses", + "title", + "description", + "version", + "created", ) -PACKAGE_SPROUT_REQUIRED_FIELDS.pop("resources", None) -RESOURCE_SPROUT_REQUIRED_FIELDS = cdp.RESOURCE_REQUIRED_FIELDS | { - "title": cdp.RequiredFieldType.str, - "description": cdp.RequiredFieldType.str, -} -RESOURCE_SPROUT_REQUIRED_FIELDS.pop("data", None) +RESOURCE_SPROUT_REQUIRED_FIELDS = ( + "name", + "path", + "title", + "description", +) diff --git a/tests/assert_raises_errors.py b/tests/assert_raises_errors.py index e40ad51f6..208158acb 100644 --- a/tests/assert_raises_errors.py +++ b/tests/assert_raises_errors.py @@ -2,8 +2,6 @@ from pytest import raises -from seedcase_sprout.check_datapackage.check_error import CheckError - def assert_raises_errors( fn: Callable[[], Any], @@ -18,10 +16,3 @@ def assert_raises_errors( assert all(isinstance(error, error_type) for error in errors) if error_count is not None: assert len(errors) == error_count - - -def assert_raises_check_errors( - fn: Callable[[], Any], error_count: int | None = None -) -> None: - """Asserts that the function raises a group of `CheckError`s.""" - assert_raises_errors(fn, CheckError, error_count) diff --git a/tests/check_datapackage/test_check_error.py b/tests/check_datapackage/test_check_error.py deleted file mode 100644 index 3aeb00f07..000000000 --- a/tests/check_datapackage/test_check_error.py +++ /dev/null @@ -1,76 +0,0 @@ -from pytest import mark, raises - -from seedcase_sprout.check_datapackage.check_error import CheckError - -check_error = CheckError( - message="There was an error!", json_path="a.b.field", validator="a-validator" -) - - -def test_error_stringified_correctly(): - """Should stringify error correctly.""" - assert ( - str(check_error) - == "Error at `a.b.field` caused by `a-validator`: There was an error!" - ) - - -def test_error_represented_correctly(): - """Should generate the developer-friendly representation correctly.""" - assert repr(check_error) == ( - "CheckError(message='There was an error!', json_path='a.b.field', " - "validator='a-validator')" - ) - - -@mark.parametrize( - "error, other, expected", - [ - (CheckError("msg1", "path1", "v1"), CheckError("msg1", "path1", "v1"), True), - (CheckError("msg1", "path1", "v1"), CheckError("msg2", "path1", "v1"), False), - (CheckError("msg1", "path1", "v1"), CheckError("msg1", "path2", "v1"), False), - (CheckError("msg1", "path1", "v1"), CheckError("msg1", "path1", "v2"), False), - (CheckError("msg1", "path1", "v1"), None, False), - (CheckError("msg1", "path1", "v1"), "not a CheckError", False), - ], -) -def test_equality_checked_correctly(error, other, expected): - """Should compare errors for equality correctly.""" - assert (error == other) is expected - assert (other == error) is expected - - -@mark.parametrize( - "error, other, expected", - [ - (CheckError("msg A", "path1", "v1"), CheckError("msg A", "path2", "v1"), True), - (CheckError("msg A", "path1", "v1"), CheckError("msg A", "path1", "v2"), True), - (CheckError("msg A", "path1", "v1"), CheckError("msg B", "path1", "v1"), True), - (CheckError("msg A", "path2", "v1"), CheckError("msg A", "path1", "v1"), False), - (CheckError("msg A", "path1", "v2"), CheckError("msg A", "path1", "v1"), False), - (CheckError("msg B", "path1", "v1"), CheckError("msg A", "path1", "v1"), False), - ], -) -def test_lt_checked_correctly_for_different_errors(error, other, expected): - """Should find the smaller (the one that comes first) of two different errors.""" - assert (error < other) is expected - assert (other < error) is not expected - - -def test_lt_checked_correctly_for_same_error(): - """Should not consider an error smaller than itself.""" - assert not (check_error < check_error) - - -@mark.parametrize( - "error, other", - [ - (CheckError("msg", "path", "val"), None), - (CheckError("msg", "path", "val"), "not a CheckError"), - ], -) -def test_lt_raises_error_for_wrong_type(error, other): - """Should raise an error when comparing an error with an object of a different - type.""" - with raises(TypeError): - error < other diff --git a/tests/check_datapackage/test_check_error_matcher.py b/tests/check_datapackage/test_check_error_matcher.py deleted file mode 100644 index 14dfa2a85..000000000 --- a/tests/check_datapackage/test_check_error_matcher.py +++ /dev/null @@ -1,104 +0,0 @@ -from pytest import mark - -from seedcase_sprout.check_datapackage.check_error import CheckError -from seedcase_sprout.check_datapackage.check_error_matcher import CheckErrorMatcher - - -@mark.parametrize( - "message,matcher,expected", - [ - ("", "", True), - ("Match!", None, True), - ("Match!", "", True), - ("Complete match", "Complete match", True), - ("Beginning matches", "Beginning", True), - ("End matches", "d matches", True), - ("", "No match", False), - ("No match", "something else", False), - ], -) -def test_matches_message(message, matcher, expected): - """Should match if the matcher's message is a substring of the error's message.""" - assert ( - CheckErrorMatcher(message=matcher).matches( - CheckError(message=message, json_path="$.name", validator="") - ) - is expected - ) - - -@mark.parametrize( - "json_path,matcher,expected", - [ - ("$.match", None, True), - ("$.match", "", True), - ("", "", True), - ("$.same", r"\$\.same", True), - ("$.start.match", r"\$\.start", True), - ("$.start.match", r"^\$\.start", True), - ("$.match.end", "end", True), - ("$.match.end", r"end$", True), - ("$.match.middle.match", "middle", True), - ("$.match.list[999].match", r"list\[\d+\]", True), - ("$.not.last.field", r"\.last$", False), - ("$.not.first.field", r"^\$\.first", False), - ("$.no.match", "other", False), - ], -) -def test_matches_json_path(json_path, matcher, expected): - """Should match if the regular expression in the matcher's `json_path` matches the - `json_path` of the error.""" - assert ( - CheckErrorMatcher(json_path=matcher).matches( - CheckError(message="Hello", json_path=json_path, validator="") - ) - is expected - ) - - -@mark.parametrize( - "validator,matcher,expected", - [ - ("match", None, True), - ("match", "match", True), - ("", "", True), - ("no-match", "match", False), - ("no-match", "", False), - ("", "no-match", False), - ], -) -def test_matches_validator(validator, matcher, expected): - """Should match if the matcher's validator is the same as the error's.""" - assert ( - CheckErrorMatcher(validator=matcher).matches( - CheckError(message="Hello", json_path="", validator=validator) - ) - is expected - ) - - -@mark.parametrize( - "message,json_path,validator,expected", - [ - ("name' is a", "name", "required", True), - ("name' is a", "name", "no-match", False), - ("name' is a", r"no\.match", "required", False), - ("no match", "name", "required", False), - ("no match", "name", "no-match", False), - ("no match", r"no\.match", "no-match", False), - ], -) -def test_matches_on_all_fields(message, json_path, validator, expected): - """Should only match if all fields match.""" - assert ( - CheckErrorMatcher( - message=message, json_path=json_path, validator=validator - ).matches( - CheckError( - message="'name' is a required property", - json_path="$.name", - validator="required", - ) - ) - is expected - ) diff --git a/tests/check_datapackage/test_check_package_properties.py b/tests/check_datapackage/test_check_package_properties.py deleted file mode 100644 index a456dfe60..000000000 --- a/tests/check_datapackage/test_check_package_properties.py +++ /dev/null @@ -1,139 +0,0 @@ -from pytest import mark - -from seedcase_sprout.check_datapackage.check_package_properties import ( - check_package_properties, -) - -# Without recommendations - - -def test_passes_matching_properties(): - """Should pass properties matching the schema.""" - properties = { - "name": "a name with spaces", - "title": "A Title", - "created": "2024-05-14T05:00:01+00:00", - "version": "a version", - "contributors": [{"email": "jane@doe.com"}], - "sources": [{"email": "jane@doe.com"}], - } - - assert check_package_properties(properties, check_recommendations=False) == [] - - -@mark.parametrize("resources", [[], [{}], [{"name": "name", "path": "data.csv"}]]) -def test_passes_matching_properties_without_checking_resources(resources): - """Should pass matching package properties without checking individual resource - properties.""" - properties = {"resources": resources} - - assert check_package_properties(properties, check_recommendations=False) == [] - - -def test_fails_properties_with_resources_of_wrong_type(): - """Should fail properties if they have a `resources` field with a value of the wrong - type.""" - properties = {"resources": 123} - errors = check_package_properties(properties, check_recommendations=False) - - assert len(errors) == 1 - assert errors[0].validator == "type" - assert errors[0].json_path == "$.resources" - - -def test_fails_properties_with_missing_required_fields(): - """Should fail properties with missing required fields.""" - properties = { - "name": "a name", - "licenses": [{"title": "my license"}], - } - - errors = check_package_properties(properties, check_recommendations=False) - - assert len(errors) == 2 - assert all(error.validator == "required" for error in errors) - assert {error.json_path for error in errors} == { - "$.licenses[0].name", - "$.licenses[0].path", - } - - -def test_fails_properties_with_bad_type(): - """Should fail properties with a field of the wrong type.""" - properties = {"name": 123} - errors = check_package_properties(properties, check_recommendations=False) - - assert len(errors) == 1 - assert errors[0].validator == "type" - assert errors[0].json_path == "$.name" - - -def test_fails_properties_with_bad_format(): - """Should fail properties with a field of the wrong format.""" - properties = {"name": "a name", "homepage": "not a URL"} - - errors = check_package_properties(properties, check_recommendations=False) - - assert len(errors) == 1 - assert errors[0].validator == "format" - assert errors[0].json_path == "$.homepage" - - -def test_fails_properties_with_pattern_mismatch(): - """Should fail properties with a field that does not match the pattern.""" - properties = {"name": "a name", "contributors": [{"path": "/a/bad/path"}]} - - errors = check_package_properties(properties, check_recommendations=False) - - assert len(errors) == 1 - assert errors[0].validator == "pattern" - assert errors[0].json_path == "$.contributors[0].path" - - -# With recommendations - - -def test_passes_matching_properties_with_recommendations(): - """Should pass properties matching recommendations.""" - properties = { - "name": "a-name-with-no-spaces", - "title": "A Title", - "id": "123", - "created": "2024-05-14T05:00:01+00:00", - "version": "3.2.1", - "contributors": [{"title": "a contributor"}], - "sources": [{"title": "a source"}], - "licenses": [{"name": "a-license"}], - } - - assert check_package_properties(properties, check_recommendations=True) == [] - - -def test_fails_properties_with_missing_required_fields_with_recommendations(): - """Should fail properties with missing required fields.""" - errors = check_package_properties({}, check_recommendations=True) - - assert len(errors) == 3 - assert all(error.validator == "required" for error in errors) - - -def test_fails_properties_violating_recommendations(): - """Should fail properties that do not meet the recommendations.""" - properties = { - "name": "a name with spaces", - "id": "123", - "version": "not semver", - "contributors": [{"email": "jane@doe.com"}], - "sources": [{"email": "jane@doe.com"}], - "licenses": [{"name": "a-license"}], - } - - errors = check_package_properties(properties, check_recommendations=True) - - assert len(errors) == 4 - assert {error.json_path for error in errors} == { - "$.name", - "$.version", - "$.contributors[0].title", - "$.sources[0].title", - } diff --git a/tests/check_datapackage/test_check_properties.py b/tests/check_datapackage/test_check_properties.py deleted file mode 100644 index 0593c37f4..000000000 --- a/tests/check_datapackage/test_check_properties.py +++ /dev/null @@ -1,169 +0,0 @@ -from pytest import mark - -from seedcase_sprout.check_datapackage.check_properties import check_properties - -# Without recommendations - - -def test_passes_matching_properties_with_resources(): - """Should pass properties matching the schema.""" - properties = { - "name": "a name with spaces", - "title": "A Title", - "created": "2024-05-14T05:00:01+00:00", - "version": "a version", - "contributors": [{"email": "jane@doe.com"}], - "sources": [{"email": "jane@doe.com"}], - "resources": [{"name": "a name", "path": "data.csv"}], - } - - assert check_properties(properties, check_recommendations=False) == [] - - -def test_fails_properties_without_resources(): - """Should fail properties without resources.""" - properties = {"name": "a name with spaces"} - - errors = check_properties(properties, check_recommendations=False) - - assert len(errors) == 1 - assert errors[0].validator == "required" - assert errors[0].json_path == "$.resources" - - -@mark.parametrize( - "resources, json_path, num_errors", - [ - ([], "$.resources", 1), - ([{}], "$.resources[0].data", 3), - ([{"name": "a name", "path": "/a/bad/path"}], "$.resources[0].path", 2), - ], -) -def test_fails_properties_with_bad_resources(resources, json_path, num_errors): - """Should fail properties with malformed resources.""" - properties = { - "name": "a name with spaces", - "resources": resources, - } - - errors = check_properties(properties, check_recommendations=False) - - assert len(errors) == num_errors - assert errors[0].json_path == json_path - - -def test_fails_properties_with_missing_required_fields(): - """Should fail properties with missing required fields.""" - properties = { - "name": "a name", - "resources": [{"name": "a name", "path": "data.csv"}], - "licenses": [{"title": "my license"}], - } - - errors = check_properties(properties, check_recommendations=False) - - assert len(errors) == 2 - assert all(error.validator == "required" for error in errors) - assert {error.json_path for error in errors} == { - "$.licenses[0].name", - "$.licenses[0].path", - } - - -def test_fails_properties_with_bad_type(): - """Should fail properties with a field of the wrong type.""" - properties = { - "name": 123, - "resources": [{"name": "a name", "path": "data.csv"}], - } - errors = check_properties(properties, check_recommendations=False) - - assert len(errors) == 1 - assert errors[0].validator == "type" - assert errors[0].json_path == "$.name" - - -def test_fails_properties_with_bad_format(): - """Should fail properties with a field of the wrong format.""" - properties = { - "name": "a name", - "resources": [{"name": "a name", "path": "data.csv"}], - "homepage": "not a URL", - } - - errors = check_properties(properties, check_recommendations=False) - - assert len(errors) == 1 - assert errors[0].validator == "format" - assert errors[0].json_path == "$.homepage" - - -def test_fails_properties_with_pattern_mismatch(): - """Should fail properties with a field that does not match the pattern.""" - properties = { - "name": "a name", - "resources": [{"name": "a name", "path": "data.csv"}], - "contributors": [{"path": "/a/bad/path"}], - } - - errors = check_properties(properties, check_recommendations=False) - - assert len(errors) == 1 - assert errors[0].validator == "pattern" - assert errors[0].json_path == "$.contributors[0].path" - - -# With recommendations - - -def test_passes_matching_properties_with_recommendations(): - """Should pass properties matching recommendations.""" - properties = { - "name": "a-name-with-no-spaces", - "title": "A Title", - "id": "123", - "created": "2024-05-14T05:00:01+00:00", - "version": "3.2.1", - "contributors": [{"title": "a contributor"}], - "sources": [{"title": "a source"}], - "licenses": [{"name": "a-license"}], - "resources": [{"name": "a-name-with-no-spaces", "path": "data.csv"}], - } - - assert check_properties(properties, check_recommendations=True) == [] - - -def test_fails_properties_with_missing_required_fields_with_recommendations(): - """Should fail properties with missing required fields.""" - properties = { - "resources": [{"name": "a-name-with-no-spaces", "path": "data.csv"}], - } - - errors = check_properties(properties, check_recommendations=True) - - assert len(errors) == 3 - assert all(error.validator == "required" for error in errors) - - -def test_fails_properties_violating_recommendations(): - """Should fail properties that do not meet the recommendations.""" - properties = { - "name": "a name with spaces", - "id": "123", - "version": "not semver", - "contributors": [{"email": "jane@doe.com"}], - "sources": [{"email": "jane@doe.com"}], - "licenses": [{"name": "a-license"}], - "resources": [{"name": "a name with spaces", "path": "data.csv"}], - } - - errors = check_properties(properties, check_recommendations=True) - - assert len(errors) == 5 - assert {error.json_path for error in errors} == { - "$.name", - "$.version", - "$.contributors[0].title", - "$.sources[0].title", - "$.resources[0].name", - } diff --git a/tests/check_datapackage/test_check_resource_properties.py b/tests/check_datapackage/test_check_resource_properties.py deleted file mode 100644 index 13cf86db7..000000000 --- a/tests/check_datapackage/test_check_resource_properties.py +++ /dev/null @@ -1,73 +0,0 @@ -from seedcase_sprout.check_datapackage.check_resource_properties import ( - check_resource_properties, -) - -# Without recommendations - - -def test_passes_matching_properties(): - """Should pass properties matching the schema.""" - properties = {"name": "a name with spaces", "path": "data.csv"} - - assert check_resource_properties(properties, check_recommendations=False) == [] - - -def test_fails_properties_with_missing_required_fields(): - """Should fail properties with missing required fields.""" - errors = check_resource_properties({}, check_recommendations=False) - - assert len(errors) == 3 - assert all(error.validator == "required" for error in errors) - - -def test_fails_properties_with_bad_type(): - """Should fail properties with a field of the wrong type.""" - properties = {"name": 123, "path": "data.csv"} - - errors = check_resource_properties(properties, check_recommendations=False) - - assert len(errors) == 1 - assert errors[0].validator == "type" - assert errors[0].json_path == "$.name" - - -def test_fails_properties_with_bad_format(): - """Should fail properties with a field of the wrong format.""" - properties = {"name": "name", "path": "data.csv", "homepage": "not a URL"} - - errors = check_resource_properties(properties, check_recommendations=False) - - assert len(errors) == 1 - assert errors[0].validator == "format" - assert errors[0].json_path == "$.homepage" - - -def test_fails_properties_with_pattern_mismatch(): - """Should fail properties with a field that does not match the pattern.""" - properties = {"name": "a name with spaces", "path": "/bad/path.csv"} - - errors = check_resource_properties(properties, check_recommendations=False) - - assert all(error.json_path == "$.path" for error in errors) - assert any(error.validator == "pattern" for error in errors) - - -# With recommendations - - -def test_passes_matching_properties_with_recommendations(): - """Should pass properties matching recommendations.""" - properties = {"name": "a-name-with-no-spaces", "path": "data.csv"} - - assert check_resource_properties(properties, check_recommendations=True) == [] - - -def test_fails_properties_with_pattern_mismatch_with_recommendations(): - """Should fail properties with field violating recommendations.""" - properties = {"name": "a name with spaces", "path": "data.csv"} - - errors = check_resource_properties(properties, check_recommendations=True) - - assert len(errors) == 1 - assert errors[0].validator == "pattern" - assert errors[0].json_path == "$.name" diff --git a/tests/check_datapackage/test_exclude_matching_errors.py b/tests/check_datapackage/test_exclude_matching_errors.py deleted file mode 100644 index d9b67c6fc..000000000 --- a/tests/check_datapackage/test_exclude_matching_errors.py +++ /dev/null @@ -1,53 +0,0 @@ -from seedcase_sprout.check_datapackage.check_error import CheckError -from seedcase_sprout.check_datapackage.check_error_matcher import CheckErrorMatcher -from seedcase_sprout.check_datapackage.exclude_matching_errors import ( - exclude_matching_errors, -) - -errors = [ - CheckError("'path' is a required property", "$.path", "required"), - CheckError("'name' is a required property", "$.name", "required"), - CheckError("123 is not of type 'string'", "$.resources[0].name", "type"), - CheckError("pattern 'xyz' doesn't match", "$.created", "pattern"), - CheckError("pattern 'xyz' doesn't match", "$.version", "pattern"), -] - - -def test_empty_matchers_have_no_effect(): - """An empty list as a list of matchers should have no effect.""" - assert exclude_matching_errors(errors, []) == errors - - -def test_not_matching_matchers_have_no_effect(): - """If no matchers match, no errors should be excluded.""" - assert ( - exclude_matching_errors( - errors, - [ - CheckErrorMatcher(validator="no-match"), - CheckErrorMatcher( - validator="required", json_path="path", message="no match!" - ), - CheckErrorMatcher( - validator="type", json_path=r"\$no\.match", message="123 is not" - ), - ], - ) - == errors - ) - - -def test_matched_errors_are_excluded(): - """If any matchers match, the error should be excluded.""" - assert ( - exclude_matching_errors( - errors, - [ - CheckErrorMatcher(json_path="name", validator="required"), - CheckErrorMatcher(validator="pattern"), - CheckErrorMatcher(validator="type"), - CheckErrorMatcher(message="type 'string'"), - ], - ) - == errors[:1] - ) diff --git a/tests/sprout_checks/test_check_data.py b/tests/sprout_checks/test_check_data.py index fe16608ed..80d19e66e 100644 --- a/tests/sprout_checks/test_check_data.py +++ b/tests/sprout_checks/test_check_data.py @@ -5,6 +5,7 @@ from pytest import fixture, mark, raises from seedcase_sprout.check_data import check_data +from seedcase_sprout.check_properties import DataResourceError from seedcase_sprout.examples import ( example_data, example_resource_properties, @@ -16,7 +17,6 @@ TableSchemaProperties, ) from tests.assert_raises_errors import ( - assert_raises_check_errors, assert_raises_errors, ) @@ -213,4 +213,5 @@ def test_rejects_geopoint_with_incorrect_inner_type(): def test_rejects_incorrect_resource_properties(): """Should throw an error if the resource properties are incorrect.""" - assert_raises_check_errors(lambda: check_data(example_data(), ResourceProperties())) + with raises(DataResourceError): + check_data(example_data(), ResourceProperties()) diff --git a/tests/sprout_checks/test_check_fields_not_blank.py b/tests/sprout_checks/test_check_fields_not_blank.py deleted file mode 100644 index 83c061cc0..000000000 --- a/tests/sprout_checks/test_check_fields_not_blank.py +++ /dev/null @@ -1,57 +0,0 @@ -from pytest import mark - -from seedcase_sprout.check_datapackage import RequiredFieldType -from seedcase_sprout.sprout_checks.check_fields_not_blank import ( - check_fields_not_blank, -) -from seedcase_sprout.sprout_checks.get_json_path_to_resource_field import ( - get_json_path_to_resource_field, -) - -FIELDS = {"name": RequiredFieldType.str, "tags": RequiredFieldType.list} - - -@mark.parametrize("index", [None, 2]) -def test_no_error_found_in_properties_with_populated_fields(index): - """Should pass properties with fields populated.""" - properties = {"name": "My name", "tags": ["a", "b"]} - - assert check_fields_not_blank(properties, FIELDS, index) == [] - - -@mark.parametrize("index", [None, 2]) -def test_no_error_found_in_properties_with_fields_missing(index): - """Should pass properties without the specified fields.""" - assert check_fields_not_blank({}, FIELDS, index) == [] - - -@mark.parametrize("index", [None, 2]) -def test_error_found_if_properties_have_a_blank_field(index): - """Should find an error if properties contain a blank field.""" - properties = {"name": "My name", "tags": []} - - errors = check_fields_not_blank(properties, FIELDS, index) - - assert len(errors) == 1 - assert "blank" in errors[0].message - assert errors[0].json_path == get_json_path_to_resource_field("tags", index) - assert errors[0].validator == "blank" - - -@mark.parametrize("index", [None, 2]) -def test_error_found_if_properties_have_multiple_blank_fields(index): - """Should find an error if properties contain multiple blank fields.""" - properties = {"name": "", "tags": []} - - errors = check_fields_not_blank(properties, FIELDS, index) - - assert len(errors) == 2 - assert all(error.validator == "blank" for error in errors) - assert any( - error.json_path == get_json_path_to_resource_field("name", index) - for error in errors - ) - assert any( - error.json_path == get_json_path_to_resource_field("tags", index) - for error in errors - ) diff --git a/tests/sprout_checks/test_check_fields_present.py b/tests/sprout_checks/test_check_fields_present.py deleted file mode 100644 index 9ce89dfec..000000000 --- a/tests/sprout_checks/test_check_fields_present.py +++ /dev/null @@ -1,57 +0,0 @@ -from pytest import mark - -from seedcase_sprout.check_datapackage import RequiredFieldType -from seedcase_sprout.sprout_checks.check_fields_present import ( - check_fields_present, -) -from seedcase_sprout.sprout_checks.get_json_path_to_resource_field import ( - get_json_path_to_resource_field, -) - -REQUIRED_FIELDS = {"name": RequiredFieldType.str, "tags": RequiredFieldType.list} - - -@mark.parametrize("index", [None, 2]) -def test_no_error_found_in_properties_with_required_fields(index): - """Should pass properties with required fields present and populated.""" - properties = {"name": "My name", "tags": ["a", "b"]} - - assert check_fields_present(properties, REQUIRED_FIELDS, index) == [] - - -@mark.parametrize("index", [None, 2]) -def test_no_error_found_in_properties_with_required_fields_blank(index): - """Should pass properties with required fields present but blank.""" - properties = {"name": "", "tags": []} - - assert check_fields_present(properties, REQUIRED_FIELDS, index) == [] - - -@mark.parametrize("index", [None, 2]) -def test_error_found_if_there_is_a_missing_required_field(index): - """Should find an error if there is a missing required field.""" - properties = {"name": "My name"} - - errors = check_fields_present(properties, REQUIRED_FIELDS, index) - - assert len(errors) == 1 - assert "required" in errors[0].message - assert errors[0].json_path == get_json_path_to_resource_field("tags", index) - assert errors[0].validator == "required" - - -@mark.parametrize("index", [None, 2]) -def test_error_found_if_there_are_multiple_missing_required_fields(index): - """Should find an error if there are multiple missing required fields.""" - errors = check_fields_present({}, REQUIRED_FIELDS, index) - - assert len(errors) == 2 - assert all(error.validator == "required" for error in errors) - assert any( - error.json_path == get_json_path_to_resource_field("name", index) - for error in errors - ) - assert any( - error.json_path == get_json_path_to_resource_field("tags", index) - for error in errors - ) diff --git a/tests/sprout_checks/test_check_list_item_field_not_blank.py b/tests/sprout_checks/test_check_list_item_field_not_blank.py deleted file mode 100644 index a2f5db1e8..000000000 --- a/tests/sprout_checks/test_check_list_item_field_not_blank.py +++ /dev/null @@ -1,74 +0,0 @@ -from pytest import mark - -from seedcase_sprout.check_datapackage import RequiredFieldType -from seedcase_sprout.sprout_checks.check_list_item_field_not_blank import ( - check_list_item_field_not_blank, -) -from seedcase_sprout.sprout_checks.get_blank_value_for_type import ( - get_blank_value_for_type, -) - - -def test_no_error_found_in_properties_without_list(): - """Should pass if the properties do not contain the specified list.""" - assert check_list_item_field_not_blank({}, "items", "field") == [] - - -@mark.parametrize("items", [[], [{}, {}], [{"a": 1}, {"a": 2}]]) -def test_no_error_found_when_list_does_not_contain_field(items): - """Should pass if list items do not contain the field.""" - properties = {"items": items} - - assert check_list_item_field_not_blank(properties, "items", "field") == [] - - -def test_no_error_found_when_fields_populated(): - """Should pass if all fields are populated.""" - properties = {"items": [{"field": "value"}, {"field": "value"}]} - - assert check_list_item_field_not_blank(properties, "items", "field") == [] - - -def test_no_error_found_when_fields_are_of_wrong_type(): - """Should pass if the fields are present but of the wrong type.""" - properties = {"items": [{"field": "value"}, {"field": ""}]} - - assert ( - check_list_item_field_not_blank( - properties, "items", "field", RequiredFieldType.list - ) - == [] - ) - - -@mark.parametrize( - "field_type,value", - [(RequiredFieldType.str, "value"), (RequiredFieldType.list, [1])], -) -def test_error_found_if_an_item_has_a_blank_field(field_type, value): - """Should find an error if there is an item with a blank field.""" - properties = { - "items": [{"field": value}, {"field": get_blank_value_for_type(field_type)}] - } - - errors = check_list_item_field_not_blank(properties, "items", "field", field_type) - - assert len(errors) == 1 - assert "blank" in errors[0].message - assert errors[0].json_path == "$.items[1].field" - assert errors[0].validator == "blank" - - -@mark.parametrize("field_type", RequiredFieldType) -def test_error_found_if_multiple_items_have_a_blank_field(field_type): - """Should find an error if there are multiple items with a blank field.""" - properties = {"items": [{"field": get_blank_value_for_type(field_type)}] * 2} - - errors = check_list_item_field_not_blank(properties, "items", "field", field_type) - - assert len(errors) == 2 - assert all( - "blank" in error.message and error.validator == "blank" for error in errors - ) - assert any(error.json_path == "$.items[0].field" for error in errors) - assert any(error.json_path == "$.items[1].field" for error in errors) diff --git a/tests/sprout_checks/test_check_no_inline_data.py b/tests/sprout_checks/test_check_no_inline_data.py deleted file mode 100644 index 47ae12c19..000000000 --- a/tests/sprout_checks/test_check_no_inline_data.py +++ /dev/null @@ -1,25 +0,0 @@ -from pytest import mark - -from seedcase_sprout.sprout_checks.check_no_inline_data import check_no_inline_data -from seedcase_sprout.sprout_checks.get_json_path_to_resource_field import ( - get_json_path_to_resource_field, -) - - -@mark.parametrize("index", [None, 2]) -def test_passes_if_data_not_set(index): - """Should pass if inline data is not set.""" - assert check_no_inline_data({}, index) == [] - - -@mark.parametrize("index", [None, 2]) -def test_error_found_if_data_is_set(index): - """Should find an error if inline data is set.""" - properties = {"data": "some data"} - - errors = check_no_inline_data(properties, index) - - assert len(errors) == 1 - assert errors[0].message - assert errors[0].json_path == get_json_path_to_resource_field("data", index) - assert errors[0].validator == "inline-data" diff --git a/tests/sprout_checks/test_check_properties.py b/tests/sprout_checks/test_check_properties.py index 7de10a6eb..eb4f9f864 100644 --- a/tests/sprout_checks/test_check_properties.py +++ b/tests/sprout_checks/test_check_properties.py @@ -1,10 +1,10 @@ from pathlib import Path -from typing import cast -from pytest import ExceptionInfo, fixture, mark, raises +import check_datapackage as cdp +from pytest import fixture, mark, raises -from seedcase_sprout.check_datapackage import CheckError from seedcase_sprout.check_properties import ( + DataResourceError, check_package_properties, check_properties, check_resource_properties, @@ -17,9 +17,6 @@ ResourceProperties, SourceProperties, ) -from seedcase_sprout.sprout_checks.get_blank_value_for_type import ( - get_blank_value_for_type, -) from seedcase_sprout.sprout_checks.required_fields import ( PACKAGE_SPROUT_REQUIRED_FIELDS, RESOURCE_SPROUT_REQUIRED_FIELDS, @@ -60,9 +57,23 @@ def test_passes_correct_properties(properties): assert check_resource_properties(properties.resources[0]) == properties.resources[0] assert check_resource_properties(properties.resources[1]) == properties.resources[1] - # Even when resources isn't there. - delattr(properties, "resources") - assert check_properties(properties) == properties + +@mark.parametrize("resources", [None, [], [ResourceProperties()]]) +def test_check_package_properties_excludes_resource_properties(properties, resources): + """Should pass if there are no resources or if individual resources are + incorrect.""" + properties.resources = resources + + assert check_package_properties(properties) == properties + + +def test_check_package_properties_flags_bad_resource_type(properties): + """Should raise an error if the `resources` property as a whole is the wrong + type.""" + properties.resources = 123 + + with raises(cdp.DataPackageError): + check_package_properties(properties) def test_error_incorrect_argument(): @@ -92,234 +103,204 @@ def test_error_incorrect_argument(): check_resource_properties("") -@mark.parametrize("field", PACKAGE_SPROUT_REQUIRED_FIELDS.keys()) +@mark.parametrize("field", PACKAGE_SPROUT_REQUIRED_FIELDS) def test_error_missing_required_package_properties(properties, field): """Should be an error if a required package properties is missing.""" delattr(properties, field) # All properties checks - with raises(ExceptionGroup) as error_info: + with raises(cdp.DataPackageError): check_properties(properties) - errors = _as_check_errors(error_info) - assert len(errors) == 1 - assert errors[0].json_path == f"$.{field}" - assert errors[0].validator == "required" - # Package only checks - with raises(ExceptionGroup) as error_info: + with raises(cdp.DataPackageError): check_package_properties(properties) - errors = _as_check_errors(error_info) - assert len(errors) == 1 - assert errors[0].json_path == f"$.{field}" - assert errors[0].validator == "required" +def test_check_in_strict_mode(properties): + """Properties should be checked in strict mode.""" + properties.name = "a name with spaces" -@mark.parametrize( - "item,value,validator", - [ - ("name", "a name with spaces", "pattern"), - ("title", 123, "type"), - ("homepage", "not a URL", "format"), - ("resources", 123, "type"), - ], -) -def test_error_incorrect_property_values(properties, item, value, validator): - """Should be an error when the property value is incorrect.""" - setattr(properties, item, value) + # All properties checks + with raises(cdp.DataPackageError): + check_properties(properties) - with raises(ExceptionGroup) as error_info: + # Package only checks + with raises(cdp.DataPackageError): check_package_properties(properties) - errors = _as_check_errors(error_info) - assert len(errors) == 1 - assert errors[0].json_path == f"$.{item}" - assert errors[0].validator == f"{validator}" - with raises(ExceptionGroup) as error_info: +@mark.parametrize("name", PACKAGE_SPROUT_REQUIRED_FIELDS) +@mark.parametrize("value", ["", []]) +def test_error_blank_package_properties(properties, name, value): + """Should be an error when a required package field is blank.""" + setattr(properties, name, value) + + # All properties checks + with raises(cdp.DataPackageError): check_properties(properties) - errors = _as_check_errors(error_info) - assert len(errors) == 1 - assert errors[0].json_path == f"$.{item}" - assert errors[0].validator == f"{validator}" + # Package only checks + with raises(cdp.DataPackageError): + check_package_properties(properties) -@mark.parametrize("name,type", PACKAGE_SPROUT_REQUIRED_FIELDS.items()) -def test_error_blank_package_properties(properties, name, type): - """Should be an error when a required package field is blank.""" - setattr(properties, name, get_blank_value_for_type(type)) +@mark.parametrize( + "field, value", + [ + ("contributors", ContributorProperties(title="")), + ("sources", SourceProperties(title="")), + ("licenses", LicenseProperties(name="")), + ("licenses", LicenseProperties(path="")), + ], +) +def test_error_blank_nested_properties(properties, field, value): + """Should have errors when the nested required properties are blank.""" + setattr(properties, field, [value]) - with raises(ExceptionGroup) as error_info: + # All properties checks + with raises(cdp.DataPackageError): check_properties(properties) - blank_errors = [ - error for error in _as_check_errors(error_info) if error.validator == "blank" - ] + # Package only checks + with raises(cdp.DataPackageError): + check_package_properties(properties) - assert len(blank_errors) == 1 - assert blank_errors[0].json_path == f"$.{name}" - with raises(ExceptionGroup) as error_info: - check_package_properties(properties) +# Resource properties specific -------------------------------------------- + - blank_errors = [ - error for error in _as_check_errors(error_info) if error.validator == "blank" - ] +def test_passes_good_resource_properties(): + """Should pass good resource properties.""" + properties = example_resource_properties() - assert len(blank_errors) == 1 - assert blank_errors[0].json_path == f"$.{name}" + assert check_resource_properties(properties) == properties -def test_error_missing_required_nested_properties(properties): - """Should have errors when the nested required properties are missing.""" - setattr(properties, "licenses", [{}]) - setattr(properties, "contributors", [{}]) - setattr(properties, "sources", [{}]) +def test_data_resource_error(): + """`DataResourceError` message should be formatted correctly.""" + properties = example_resource_properties() + properties.name = None - with raises(ExceptionGroup) as error_info: - check_package_properties(properties) + with raises(DataResourceError) as error: + check_resource_properties(properties) - required_errors = [ - error for error in _as_check_errors(error_info) if error.validator == "required" - ] - assert [error.json_path for error in required_errors] == [ - "$.contributors[0].title", - "$.licenses[0].name", - "$.licenses[0].path", - "$.sources[0].title", - ] - - with raises(ExceptionGroup) as error_info: - check_properties(properties) + assert "package.resources[0]" not in str(error.value) - required_errors = [ - error for error in _as_check_errors(error_info) if error.validator == "required" - ] - assert [error.json_path for error in required_errors] == [ - "$.contributors[0].title", - "$.licenses[0].name", - "$.licenses[0].path", - "$.sources[0].title", - ] +def test_errors_flagged_for_fields_with_multipart_name(): + """Errors should be flagged when the name of the field has more than one word.""" + properties = example_resource_properties() + assert properties.schema + properties.schema.primary_key = [] -# Resource properties specific -------------------------------------------- + with raises(DataResourceError): + check_resource_properties(properties) @mark.parametrize( "field", - RESOURCE_SPROUT_REQUIRED_FIELDS.keys(), + RESOURCE_SPROUT_REQUIRED_FIELDS, ) def test_error_missing_required_resource_properties(properties, field): """Should be an error if a required resource properties is missing.""" delattr(properties.resources[0], field) - with raises(ExceptionGroup) as error_info: - check_resource_properties(properties.resources[0]) - - errors = _as_check_errors(error_info) - assert len(errors) == 1 - assert errors[0].json_path == f"$.{field}" - assert errors[0].validator == "required" - - with raises(ExceptionGroup) as error_info: + # All properties checks + with raises(cdp.DataPackageError): check_properties(properties) - errors = _as_check_errors(error_info) - assert len(errors) == 1 - assert errors[0].json_path == f"$.resources[0].{field}" - assert errors[0].validator == "required" + # Resource only checks + with raises(DataResourceError): + check_resource_properties(properties.resources[0]) -@mark.parametrize("name,type", RESOURCE_SPROUT_REQUIRED_FIELDS.items()) -def test_error_blank_resource_properties(properties, name, type): +@mark.parametrize("name", RESOURCE_SPROUT_REQUIRED_FIELDS) +def test_error_blank_resource_properties(properties, name): """Should be an error when one required resource field is blank.""" - setattr(properties.resources[0], name, get_blank_value_for_type(type)) + setattr(properties.resources[0], name, "") - with raises(ExceptionGroup) as error_info: + # All properties checks + with raises(cdp.DataPackageError): check_properties(properties) - blank_errors = [ - error for error in _as_check_errors(error_info) if error.validator == "blank" - ] - - assert len(blank_errors) == 1 - assert blank_errors[0].json_path == f"$.resources[0].{name}" - - with raises(ExceptionGroup) as error_info: + # Resource only checks + with raises(DataResourceError): check_resource_properties(properties.resources[0]) - blank_errors = [ - error for error in _as_check_errors(error_info) if error.validator == "blank" - ] - - assert len(blank_errors) == 1 - assert blank_errors[0].json_path == f"$.{name}" +@mark.parametrize( + "path", ["", [], 123, str(Path("resources", "1")), "/bad/path/data.csv"] +) +def test_error_no_resource_name_in_path(properties, path): + """Should be an error when the resource name isn't in the path or the path is + empty.""" + properties.resources[0].path = path -def test_errors_flagged_for_fields_with_multipart_name(): - """Errors should be flagged when the name of the field has more than one word.""" - properties = example_resource_properties() - assert properties.schema - properties.schema.primary_key = [] + # All properties checks + with raises(cdp.DataPackageError): + check_properties(properties) - with raises(ExceptionGroup) as error_info: - check_resource_properties(properties) + # Resource only checks + with raises(DataResourceError): + check_resource_properties(properties.resources[0]) - assert all( - error.json_path == "$.schema.primaryKey" - for error in _as_check_errors(error_info) - ) +def test_excludes_path_or_data_required(properties): + """When both path and data are missing, only path should be flagged.""" + delattr(properties.resources[0], "path") -def test_error_incorrect_resource_property_values(properties): - """Should be an error when the property value is incorrect.""" - properties.resources[0].title = 123 + # All properties checks + with raises(cdp.DataPackageError) as error1: + check_properties(properties) + assert "`data`" not in str(error1.value) - with raises(ExceptionGroup) as error_info: + # Resource only checks + with raises(DataResourceError) as error2: check_resource_properties(properties.resources[0]) + assert "`data`" not in str(error2.value) - errors = _as_check_errors(error_info) - assert len(errors) == 1 - assert errors[0].json_path == "$.title" - assert errors[0].validator == "type" - with raises(ExceptionGroup) as error_info: +def test_does_not_suggest_path_can_be_array(properties): + """Should not suggest that path can be an array.""" + properties.resources[0].path = 123 + + # All properties checks + with raises(cdp.DataPackageError) as error1: check_properties(properties) + assert "array" not in str(error1.value) - errors = _as_check_errors(error_info) - assert len(errors) == 1 - assert errors[0].json_path == "$.resources[0].title" - assert errors[0].validator == "type" + # Resource only checks + with raises(DataResourceError) as error2: + check_resource_properties(properties.resources[0]) + assert "array" not in str(error2.value) -@mark.parametrize( - "path", ["", [], 123, str(Path("resources", "1")), "/bad/path/data.csv"] -) -def test_error_no_resource_name_in_path(properties, path): - """Should be an error when the resource name isn't in the `path` or is empty.""" - properties.resources[0].path = path +def test_does_not_suggest_path_should_match_regex(properties): + """Should not suggest that the path has to match a general path regex.""" + properties.resources[0].path = "/bad/path" - with raises(ExceptionGroup) as error_info: - check_resource_properties(properties.resources[0]) + # All properties checks + with raises(cdp.DataPackageError) as error1: + check_properties(properties) + assert "not match" not in str(error1.value) - errors = _as_check_errors(error_info) - assert len(errors) >= 1 - assert all(error.json_path.endswith("path") for error in errors) + # Resource only checks + with raises(DataResourceError) as error2: + check_resource_properties(properties.resources[0]) + assert "not match" not in str(error2.value) - with raises(ExceptionGroup) as error_info: - check_properties(properties) - errors = _as_check_errors(error_info) - assert len(errors) >= 1 - assert all(error.json_path.endswith("path") for error in errors) +def test_does_not_suggest_path_array_should_be_non_empty(properties): + """Should not suggest that a path that is an array should not be empty.""" + properties.resources[0].path = [] + # All properties checks + with raises(cdp.DataPackageError) as error1: + check_properties(properties) + assert "non-empty" not in str(error1.value) -def _as_check_errors( - error_info: ExceptionInfo[ExceptionGroup[Exception]], -) -> list[CheckError]: - errors = error_info.value.exceptions - assert all(isinstance(error, CheckError) for error in errors) - return cast(list[CheckError], errors) + # Resource only checks + with raises(DataResourceError) as error2: + check_resource_properties(properties.resources[0]) + assert "non-empty" not in str(error2.value) diff --git a/tests/sprout_checks/test_check_required_package_properties_not_blank.py b/tests/sprout_checks/test_check_required_package_properties_not_blank.py deleted file mode 100644 index 5965a037e..000000000 --- a/tests/sprout_checks/test_check_required_package_properties_not_blank.py +++ /dev/null @@ -1,80 +0,0 @@ -from pytest import fixture, mark - -from seedcase_sprout.sprout_checks.check_required_package_properties_not_blank import ( # noqa: E501 - check_required_package_properties_not_blank, -) -from seedcase_sprout.sprout_checks.get_blank_value_for_type import ( - get_blank_value_for_type, -) -from seedcase_sprout.sprout_checks.required_fields import ( - PACKAGE_SPROUT_REQUIRED_FIELDS, -) - - -@fixture -def properties(): - return { - "name": "package-1", - "id": "abc1", - "title": "Package 1", - "description": "A package.", - "version": "1.0.0", - "created": "2024-05-14T05:00:01+00:00", - "licenses": [{"name": "a-license"}], - "contributors": [{"title": "a contributor"}], - "sources": [{"title": "a source"}], - } - - -def test_no_error_found_if_all_required_fields_populated(properties): - """Should pass if all required fields are present and populated.""" - assert check_required_package_properties_not_blank(properties) == [] - - -def test_no_error_found_if_all_required_fields_missing(): - """Should pass if all required fields are missing.""" - assert check_required_package_properties_not_blank({}) == [] - - -@mark.parametrize( - "field,value,json_path", - [ - *[ - (name, get_blank_value_for_type(type), f"$.{name}") - for name, type in PACKAGE_SPROUT_REQUIRED_FIELDS.items() - ], - ("contributors", [{"title": ""}], "$.contributors[0].title"), - ("sources", [{"title": ""}], "$.sources[0].title"), - ("licenses", [{"name": ""}], "$.licenses[0].name"), - ("licenses", [{"path": ""}], "$.licenses[0].path"), - ], -) -def test_error_found_if_required_field_is_blank(properties, field, value, json_path): - """Should find an error if a required field is present but blank.""" - properties[field] = value - - errors = check_required_package_properties_not_blank(properties) - - assert len(errors) == 1 - assert errors[0].json_path == json_path - assert errors[0].validator == "blank" - - -def test_error_found_if_all_required_fields_are_blank(): - """Should find an error if all required fields are present but blank.""" - properties = { - "name": "", - "id": "", - "title": "", - "description": "", - "version": "", - "created": "", - "licenses": [{"name": "", "path": ""}], - "contributors": [{"title": ""}], - "sources": [{"title": ""}], - } - - errors = check_required_package_properties_not_blank(properties) - - assert len(errors) == 10 - assert all(error.validator == "blank" for error in errors) diff --git a/tests/sprout_checks/test_check_resource_path_string.py b/tests/sprout_checks/test_check_resource_path_string.py deleted file mode 100644 index 1a8835843..000000000 --- a/tests/sprout_checks/test_check_resource_path_string.py +++ /dev/null @@ -1,35 +0,0 @@ -from pytest import mark - -from seedcase_sprout.sprout_checks.check_resource_path_string import ( - check_resource_path_string, -) -from seedcase_sprout.sprout_checks.get_json_path_to_resource_field import ( - get_json_path_to_resource_field, -) - - -@mark.parametrize("index", [None, 2]) -def test_passes_if_data_path_string(index): - """Should pass if the path is of type string.""" - properties = {"path": "a string"} - - assert check_resource_path_string(properties, index) == [] - - -@mark.parametrize("index", [None, 2]) -def test_passes_if_data_path_not_present(index): - """Should pass if the path is not set.""" - assert check_resource_path_string({}, index) == [] - - -@mark.parametrize("index", [None, 2]) -def test_error_found_if_path_not_string(index): - """Should find an error if the path is not of type string.""" - properties = {"path": 123} - - errors = check_resource_path_string(properties, index) - - assert len(errors) == 1 - assert "string" in errors[0].message - assert errors[0].json_path == get_json_path_to_resource_field("path", index) - assert errors[0].validator == "type" diff --git a/tests/sprout_checks/test_exclude_non_sprout_resource_errors.py b/tests/sprout_checks/test_exclude_non_sprout_resource_errors.py deleted file mode 100644 index 31298568b..000000000 --- a/tests/sprout_checks/test_exclude_non_sprout_resource_errors.py +++ /dev/null @@ -1,52 +0,0 @@ -from seedcase_sprout.check_datapackage import CheckError -from seedcase_sprout.sprout_checks.exclude_non_sprout_resource_errors import ( - exclude_non_sprout_resource_errors, -) - - -def test_returns_unaltered_empty_list(): - """Should not alter an empty list.""" - assert exclude_non_sprout_resource_errors([]) == [] - - -def test_returns_only_sprout_related_errors(): - """Should only remove errors not relevant for Sprout.""" - errors = [ - CheckError( - message="'data' is a required property", - json_path="$.data", - validator="required", - ), - CheckError( - message="'name' is a required property", - json_path="$.name", - validator="required", - ), - CheckError( - message="123 is not of type 'array'", json_path="$.path", validator="type" - ), - CheckError( - message="123 is not of type 'string'", json_path="$.path", validator="type" - ), - CheckError( - message="123 is not of type 'array'", - json_path="$.sources", - validator="type", - ), - ] - - assert exclude_non_sprout_resource_errors(errors) == [ - CheckError( - message="'name' is a required property", - json_path="$.name", - validator="required", - ), - CheckError( - message="123 is not of type 'string'", json_path="$.path", validator="type" - ), - CheckError( - message="123 is not of type 'array'", - json_path="$.sources", - validator="type", - ), - ] diff --git a/tests/sprout_checks/test_get_blank_value_for_type.py b/tests/sprout_checks/test_get_blank_value_for_type.py deleted file mode 100644 index f4301c085..000000000 --- a/tests/sprout_checks/test_get_blank_value_for_type.py +++ /dev/null @@ -1,21 +0,0 @@ -from pytest import mark - -from seedcase_sprout.check_datapackage import RequiredFieldType -from seedcase_sprout.sprout_checks.get_blank_value_for_type import ( - get_blank_value_for_type, -) - - -@mark.parametrize( - "type,value", - [ - (RequiredFieldType.str, ""), - (RequiredFieldType.list, []), - ("int", None), - (None, None), - ("something else", None), - ], -) -def test_returns_expected_blank_value_for_each_type(type, value): - """Should return the expected blank value for each type.""" - assert get_blank_value_for_type(type) == value diff --git a/tests/sprout_checks/test_get_json_path_to_resource_field.py b/tests/sprout_checks/test_get_json_path_to_resource_field.py deleted file mode 100644 index e2de7117c..000000000 --- a/tests/sprout_checks/test_get_json_path_to_resource_field.py +++ /dev/null @@ -1,13 +0,0 @@ -from seedcase_sprout.sprout_checks.get_json_path_to_resource_field import ( - get_json_path_to_resource_field, -) - - -def test_returns_expected_json_path_without_index(): - """Should form the correct JSON path with no index supplied.""" - assert get_json_path_to_resource_field("myField") == "$.myField" - - -def test_returns_correct_path_with_index(): - """Should form the correct JSON path with a resource index supplied.""" - assert get_json_path_to_resource_field("myField", 2) == "$.resources[2].myField" diff --git a/tests/sprout_checks/test_get_sprout_package_errors.py b/tests/sprout_checks/test_get_sprout_package_errors.py deleted file mode 100644 index b50ce1ec8..000000000 --- a/tests/sprout_checks/test_get_sprout_package_errors.py +++ /dev/null @@ -1,48 +0,0 @@ -from typing import Any - -from pytest import fixture, mark - -from seedcase_sprout.examples import example_package_properties -from seedcase_sprout.sprout_checks.get_blank_value_for_type import ( - get_blank_value_for_type, -) -from seedcase_sprout.sprout_checks.get_sprout_package_errors import ( - get_sprout_package_errors, -) -from seedcase_sprout.sprout_checks.required_fields import ( - PACKAGE_SPROUT_REQUIRED_FIELDS, -) - - -@fixture -def properties() -> dict[str, Any]: - return example_package_properties().compact_dict - - -def test_passes_full_package_properties(properties): - """Should pass with a full set of package properties.""" - assert get_sprout_package_errors(properties) == [] - - -@mark.parametrize("name,type", PACKAGE_SPROUT_REQUIRED_FIELDS.items()) -def test_error_found_if_fields_are_blank(properties, name, type): - """Should find an error if there is one required field that is present but blank.""" - properties[name] = get_blank_value_for_type(type) - - errors = get_sprout_package_errors(properties) - - assert len(errors) == 1 - assert errors[0].json_path == f"$.{name}" - assert errors[0].validator == "blank" - - -@mark.parametrize("name", PACKAGE_SPROUT_REQUIRED_FIELDS.keys()) -def test_error_found_if_required_fields_are_missing(properties, name): - """Should find an error if there is a missing required field.""" - del properties[name] - - errors = get_sprout_package_errors(properties) - - assert len(errors) == 1 - assert errors[0].json_path == f"$.{name}" - assert errors[0].validator == "required" diff --git a/tests/sprout_checks/test_get_sprout_resource_errors.py b/tests/sprout_checks/test_get_sprout_resource_errors.py deleted file mode 100644 index 70ddb8ef4..000000000 --- a/tests/sprout_checks/test_get_sprout_resource_errors.py +++ /dev/null @@ -1,88 +0,0 @@ -from pathlib import Path - -from pytest import fixture, mark - -from seedcase_sprout.properties import ResourceProperties -from seedcase_sprout.sprout_checks.get_blank_value_for_type import ( - get_blank_value_for_type, -) -from seedcase_sprout.sprout_checks.get_json_path_to_resource_field import ( - get_json_path_to_resource_field, -) -from seedcase_sprout.sprout_checks.get_sprout_resource_errors import ( - get_sprout_resource_errors, -) -from seedcase_sprout.sprout_checks.required_fields import ( - RESOURCE_SPROUT_REQUIRED_FIELDS, -) - - -@fixture -def properties(): - return ResourceProperties( - name="resource-1", - title="Resource 1", - description="A resource.", - ).compact_dict - - -def test_passes_full_resource_properties(properties): - """Should pass with a full set of resource properties.""" - assert get_sprout_resource_errors(properties) == [] - - -@mark.parametrize("index", [None, 2]) -def test_error_found_if_inline_data_is_set(properties, index): - """Should find an error if inline data is set.""" - properties["data"] = "some data" - - errors = get_sprout_resource_errors(properties, index=index) - - assert len(errors) == 1 - assert errors[0].json_path == get_json_path_to_resource_field("data", index) - assert errors[0].validator == "inline-data" - - -@mark.parametrize("index", [None, 2]) -@mark.parametrize("name,type", RESOURCE_SPROUT_REQUIRED_FIELDS.items()) -def test_error_found_if_fields_are_blank(properties, name, type, index): - """Should find an error if there is one required field that is present but blank.""" - properties[name] = get_blank_value_for_type(type) - - errors = get_sprout_resource_errors(properties, index=index) - - assert len(errors) == 1 - assert errors[0].json_path == get_json_path_to_resource_field(name, index) - assert errors[0].validator == "blank" - - -@mark.parametrize("index", [None, 2]) -@mark.parametrize("name", RESOURCE_SPROUT_REQUIRED_FIELDS.keys()) -def test_error_found_if_required_fields_are_missing(properties, name, index): - """Should find an error if there is a missing required field.""" - del properties[name] - - errors = get_sprout_resource_errors(properties, index=index) - - assert len(errors) == 1 - assert errors[0].json_path == get_json_path_to_resource_field(name, index) - assert errors[0].validator == "required" - - -@mark.parametrize("path", ["", [], str(Path("resources", "1"))]) -def test_error_found_if_data_path_is_incorrect_(properties, path): - """Should find one error if `path` is not a string or has the wrong format.""" - properties["path"] = path - - errors = get_sprout_resource_errors(properties) - - assert len(errors) == 1 - assert errors[0].json_path == get_json_path_to_resource_field("path") - - -def test_ignores_path_if_name_incorrect(properties): - """Should not check the path if the name is incorrect.""" - properties["name"] = "name with spaces" - properties["path"] = "bad/path" - - assert get_sprout_resource_errors(properties) == [] diff --git a/tests/test_read_properties.py b/tests/test_read_properties.py index 0bcd8b8dd..c523c4463 100644 --- a/tests/test_read_properties.py +++ b/tests/test_read_properties.py @@ -1,6 +1,7 @@ from json import JSONDecodeError from pathlib import Path +import check_datapackage as cdp from pytest import raises from seedcase_sprout import ( @@ -62,7 +63,7 @@ def test_error_incorrect_properties_in_file(tmp_path): properties.name = "incorrect name" _write_json(properties.compact_dict, tmp_path / "datapackage.json") - with raises(ExceptionGroup): + with raises(cdp.DataPackageError): read_properties(tmp_path / "datapackage.json") diff --git a/tests/test_read_resource_batches.py b/tests/test_read_resource_batches.py index 0e7392015..faa415f6e 100644 --- a/tests/test_read_resource_batches.py +++ b/tests/test_read_resource_batches.py @@ -4,6 +4,7 @@ import polars as pl from pytest import fixture, mark, raises +from seedcase_sprout.check_properties import DataResourceError from seedcase_sprout.constants import BATCH_TIMESTAMP_COLUMN_NAME from seedcase_sprout.examples import example_resource_properties from seedcase_sprout.properties import ( @@ -14,9 +15,6 @@ from seedcase_sprout.read_resource_batches import ( read_resource_batches, ) -from tests.assert_raises_errors import ( - assert_raises_check_errors, -) from tests.directory_structure_setup import ( create_test_data_package, ) @@ -200,11 +198,10 @@ def test_raises_error_when_properties_do_not_match_data( def test_raises_error_with_empty_resource_properties(resource_paths): """Raises errors from checks if the resource properties are empty.""" # When, Then - assert_raises_check_errors( - lambda: read_resource_batches( + with raises(DataResourceError): + read_resource_batches( resource_properties=ResourceProperties(), paths=resource_paths ) - ) def test_uses_cwd_if_no_paths(tmp_cwd, test_package, resource_properties): diff --git a/tests/test_write_properties.py b/tests/test_write_properties.py index 332f42f31..9cdd74c27 100644 --- a/tests/test_write_properties.py +++ b/tests/test_write_properties.py @@ -1,5 +1,6 @@ from pathlib import Path +import check_datapackage as cdp from pytest import fixture, raises from seedcase_sprout.examples import ( @@ -64,7 +65,7 @@ def test_throws_error_if_error_in_package_properties(path, properties): """Should throw `CheckError`s if there are errors in the package properties.""" properties.id = None - with raises(ExceptionGroup): + with raises(cdp.DataPackageError): write_properties(properties, path) @@ -72,7 +73,7 @@ def test_throws_error_if_error_in_resource_properties(path, properties): """Should throw `CheckError`s if there are errors in the resource properties.""" properties.resources[0].name = "invalid name with spaces" - with raises(ExceptionGroup): + with raises(cdp.DataPackageError): write_properties(properties, path) @@ -107,7 +108,7 @@ def test_throws_error_if_resource_description_is_none(path, properties): dedentation works and the subsequent check fails.""" properties.resources[0].description = None - with raises(ExceptionGroup): + with raises(cdp.DataPackageError): write_properties(properties, path) diff --git a/tests/test_write_resource_data.py b/tests/test_write_resource_data.py index e2f6d6591..af769df5c 100644 --- a/tests/test_write_resource_data.py +++ b/tests/test_write_resource_data.py @@ -2,7 +2,9 @@ import polars as pl from polars.testing import assert_frame_equal +from pytest import raises +from seedcase_sprout.check_properties import DataResourceError from seedcase_sprout.examples import ( ExamplePackage, example_data, @@ -14,7 +16,6 @@ from seedcase_sprout.read_properties import read_properties from seedcase_sprout.write_resource_data import write_resource_data from tests.assert_raises_errors import ( - assert_raises_check_errors, assert_raises_errors, ) @@ -65,9 +66,8 @@ def test_throws_error_if_resource_properties_incorrect(): resource_properties = example_resource_properties() resource_properties.name = "spaces in name" - assert_raises_check_errors( - lambda: write_resource_data(example_data(), resource_properties) - ) + with raises(DataResourceError): + write_resource_data(example_data(), resource_properties) def test_throws_error_if_properties_do_not_match_data(): diff --git a/tools/vulture-allowlist.py b/tools/vulture-allowlist.py index cca8438a5..8f4ef3908 100644 --- a/tools/vulture-allowlist.py +++ b/tools/vulture-allowlist.py @@ -18,6 +18,7 @@ exclusive_minimum # unused variable (src/seedcase_sprout/properties.py:250) exclusive_maximum # unused variable (src/seedcase_sprout/properties.py:251) json_schema # unused variable (src/seedcase_sprout/properties.py:252) +format # unused variable (src/seedcase_sprout/properties.py:281) example # unused variable (src/seedcase_sprout/properties.py:287) constraints # unused variable (src/seedcase_sprout/properties.py:288) categories # unused variable (src/seedcase_sprout/properties.py:289) @@ -26,6 +27,8 @@ unique_keys # unused variable (src/seedcase_sprout/properties.py:334) foreign_keys # unused variable (src/seedcase_sprout/properties.py:335) missing_values # unused variable (src/seedcase_sprout/properties.py:336) +format # unused variable (src/seedcase_sprout/properties.py:382) +hash # unused variable (src/seedcase_sprout/properties.py:386) mediatype # unused variable (src/seedcase_sprout/properties.py:391) encoding # unused variable (src/seedcase_sprout/properties.py:392) bytes # unused variable (src/seedcase_sprout/properties.py:393) diff --git a/uv.lock b/uv.lock index d19d4096a..185aacce9 100644 --- a/uv.lock +++ b/uv.lock @@ -105,11 +105,11 @@ wheels = [ [[package]] name = "asttokens" -version = "3.0.0" +version = "3.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978, upload-time = "2024-11-30T04:30:14.439Z" } +sdist = { url = "https://files.pythonhosted.org/packages/be/a5/8e3f9b6771b0b408517c82d97aed8f2036509bc247d46114925e32fe33f0/asttokens-3.0.1.tar.gz", hash = "sha256:71a4ee5de0bde6a31d64f6b13f2293ac190344478f081c3d1bccfcf5eacb0cb7", size = 62308, upload-time = "2025-11-15T16:43:48.578Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918, upload-time = "2024-11-30T04:30:10.946Z" }, + { url = "https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl", hash = "sha256:15a3ebc0f43c2d0a50eeafea25e19046c68398e487b9f1f5b517f7c0f40f976a", size = 27047, upload-time = "2025-11-15T16:43:16.109Z" }, ] [[package]] @@ -141,7 +141,7 @@ wheels = [ [[package]] name = "bandit" -version = "1.8.6" +version = "1.9.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, @@ -149,18 +149,18 @@ dependencies = [ { name = "rich" }, { name = "stevedore" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fb/b5/7eb834e213d6f73aace21938e5e90425c92e5f42abafaf8a6d5d21beed51/bandit-1.8.6.tar.gz", hash = "sha256:dbfe9c25fc6961c2078593de55fd19f2559f9e45b99f1272341f5b95dea4e56b", size = 4240271, upload-time = "2025-07-06T03:10:50.9Z" } +sdist = { url = "https://files.pythonhosted.org/packages/80/d5/82fc87a82ad9536215c1b5693bbb675439f6f2d0c2fca74b2df2cb9db925/bandit-1.9.1.tar.gz", hash = "sha256:6dbafd1a51e276e065404f06980d624bad142344daeac3b085121fcfd117b7cf", size = 4241552, upload-time = "2025-11-18T00:06:06.043Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/48/ca/ba5f909b40ea12ec542d5d7bdd13ee31c4d65f3beed20211ef81c18fa1f3/bandit-1.8.6-py3-none-any.whl", hash = "sha256:3348e934d736fcdb68b6aa4030487097e23a501adf3e7827b63658df464dddd0", size = 133808, upload-time = "2025-07-06T03:10:49.134Z" }, + { url = "https://files.pythonhosted.org/packages/7f/82/249a7710242b7a05f7f4245a0da3cdd4042e4377f5d00059619fa2b941f3/bandit-1.9.1-py3-none-any.whl", hash = "sha256:0a1f34c04f067ee28985b7854edaa659c9299bd71e1b7e18236e46cccc79720b", size = 134216, upload-time = "2025-11-18T00:06:04.645Z" }, ] [[package]] name = "beartype" -version = "0.22.2" +version = "0.22.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/04/96/43ed27f27127155f24f5cf85df0c27fd2ac2ab67d94cecc8f76933f91679/beartype-0.22.2.tar.gz", hash = "sha256:ff3a7df26af8d15fa87f97934f0f6d41bbdadca971c410819104998dd26013d2", size = 1574491, upload-time = "2025-10-04T06:37:56.451Z" } +sdist = { url = "https://files.pythonhosted.org/packages/88/e2/105ceb1704cb80fe4ab3872529ab7b6f365cf7c74f725e6132d0efcf1560/beartype-0.22.6.tar.gz", hash = "sha256:97fbda69c20b48c5780ac2ca60ce3c1bb9af29b3a1a0216898ffabdd523e48f4", size = 1588975, upload-time = "2025-11-20T04:47:14.736Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/96/2a/a4773109619010192e72f48e95165b14790413a51f513c879c8d63f67e17/beartype-0.22.2-py3-none-any.whl", hash = "sha256:12077afe3528eba5c5b801f816712f7ff06f6da5509994c79561e29b48bcedb8", size = 1317280, upload-time = "2025-10-04T06:37:53.99Z" }, + { url = "https://files.pythonhosted.org/packages/98/c9/ceecc71fe2c9495a1d8e08d44f5f31f5bca1350d5b2e27a4b6265424f59e/beartype-0.22.6-py3-none-any.whl", hash = "sha256:0584bc46a2ea2a871509679278cda992eadde676c01356ab0ac77421f3c9a093", size = 1324807, upload-time = "2025-11-20T04:47:11.837Z" }, ] [[package]] @@ -178,7 +178,7 @@ wheels = [ [[package]] name = "black" -version = "25.9.0" +version = "25.11.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -188,29 +188,33 @@ dependencies = [ { name = "platformdirs" }, { name = "pytokens" }, ] -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" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/ad/33adf4708633d047950ff2dfdea2e215d84ac50ef95aff14a614e4b6e9b2/black-25.11.0.tar.gz", hash = "sha256:9a323ac32f5dc75ce7470501b887250be5005a01602e931a15e45593f70f6e08", size = 655669, upload-time = "2025-11-10T01:53:50.558Z" } wheels = [ - { 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" }, + { url = "https://files.pythonhosted.org/packages/7f/12/5c35e600b515f35ffd737da7febdb2ab66bb8c24d88560d5e3ef3d28c3fd/black-25.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:80e7486ad3535636657aa180ad32a7d67d7c273a80e12f1b4bfa0823d54e8fac", size = 1772831, upload-time = "2025-11-10T02:03:47Z" }, + { url = "https://files.pythonhosted.org/packages/1a/75/b3896bec5a2bb9ed2f989a970ea40e7062f8936f95425879bbe162746fe5/black-25.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6cced12b747c4c76bc09b4db057c319d8545307266f41aaee665540bc0e04e96", size = 1608520, upload-time = "2025-11-10T01:58:46.895Z" }, + { url = "https://files.pythonhosted.org/packages/f3/b5/2bfc18330eddbcfb5aab8d2d720663cd410f51b2ed01375f5be3751595b0/black-25.11.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cb2d54a39e0ef021d6c5eef442e10fd71fcb491be6413d083a320ee768329dd", size = 1682719, upload-time = "2025-11-10T01:56:55.24Z" }, + { url = "https://files.pythonhosted.org/packages/96/fb/f7dc2793a22cdf74a72114b5ed77fe3349a2e09ef34565857a2f917abdf2/black-25.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae263af2f496940438e5be1a0c1020e13b09154f3af4df0835ea7f9fe7bfa409", size = 1362684, upload-time = "2025-11-10T01:57:07.639Z" }, + { url = "https://files.pythonhosted.org/packages/ad/47/3378d6a2ddefe18553d1115e36aea98f4a90de53b6a3017ed861ba1bd3bc/black-25.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0a1d40348b6621cc20d3d7530a5b8d67e9714906dfd7346338249ad9c6cedf2b", size = 1772446, upload-time = "2025-11-10T02:02:16.181Z" }, + { url = "https://files.pythonhosted.org/packages/ba/4b/0f00bfb3d1f7e05e25bfc7c363f54dc523bb6ba502f98f4ad3acf01ab2e4/black-25.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:51c65d7d60bb25429ea2bf0731c32b2a2442eb4bd3b2afcb47830f0b13e58bfd", size = 1607983, upload-time = "2025-11-10T02:02:52.502Z" }, + { url = "https://files.pythonhosted.org/packages/99/fe/49b0768f8c9ae57eb74cc10a1f87b4c70453551d8ad498959721cc345cb7/black-25.11.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:936c4dd07669269f40b497440159a221ee435e3fddcf668e0c05244a9be71993", size = 1682481, upload-time = "2025-11-10T01:57:12.35Z" }, + { url = "https://files.pythonhosted.org/packages/55/17/7e10ff1267bfa950cc16f0a411d457cdff79678fbb77a6c73b73a5317904/black-25.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:f42c0ea7f59994490f4dccd64e6b2dd49ac57c7c84f38b8faab50f8759db245c", size = 1363869, upload-time = "2025-11-10T01:58:24.608Z" }, + { url = "https://files.pythonhosted.org/packages/67/c0/cc865ce594d09e4cd4dfca5e11994ebb51604328489f3ca3ae7bb38a7db5/black-25.11.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:35690a383f22dd3e468c85dc4b915217f87667ad9cce781d7b42678ce63c4170", size = 1771358, upload-time = "2025-11-10T02:03:33.331Z" }, + { url = "https://files.pythonhosted.org/packages/37/77/4297114d9e2fd2fc8ab0ab87192643cd49409eb059e2940391e7d2340e57/black-25.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:dae49ef7369c6caa1a1833fd5efb7c3024bb7e4499bf64833f65ad27791b1545", size = 1612902, upload-time = "2025-11-10T01:59:33.382Z" }, + { url = "https://files.pythonhosted.org/packages/de/63/d45ef97ada84111e330b2b2d45e1dd163e90bd116f00ac55927fb6bf8adb/black-25.11.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bd4a22a0b37401c8e492e994bce79e614f91b14d9ea911f44f36e262195fdda", size = 1680571, upload-time = "2025-11-10T01:57:04.239Z" }, + { url = "https://files.pythonhosted.org/packages/ff/4b/5604710d61cdff613584028b4cb4607e56e148801ed9b38ee7970799dab6/black-25.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:aa211411e94fdf86519996b7f5f05e71ba34835d8f0c0f03c00a26271da02664", size = 1382599, upload-time = "2025-11-10T01:57:57.427Z" }, + { url = "https://files.pythonhosted.org/packages/00/5d/aed32636ed30a6e7f9efd6ad14e2a0b0d687ae7c8c7ec4e4a557174b895c/black-25.11.0-py3-none-any.whl", hash = "sha256:e3f562da087791e96cefcd9dda058380a442ab322a02e222add53736451f604b", size = 204918, upload-time = "2025-11-10T01:53:48.917Z" }, ] [[package]] name = "bleach" -version = "6.2.0" +version = "6.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "webencodings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/76/9a/0e33f5054c54d349ea62c277191c020c2d6ef1d65ab2cb1993f91ec846d1/bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f", size = 203083, upload-time = "2024-10-29T18:30:40.477Z" } +sdist = { url = "https://files.pythonhosted.org/packages/07/18/3c8523962314be6bf4c8989c79ad9531c825210dd13a8669f6b84336e8bd/bleach-6.3.0.tar.gz", hash = "sha256:6f3b91b1c0a02bb9a78b5a454c92506aa0fdf197e1d5e114d2e00c6f64306d22", size = 203533, upload-time = "2025-10-27T17:57:39.211Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fc/55/96142937f66150805c25c4d0f31ee4132fd33497753400734f9dfdcbdc66/bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e", size = 163406, upload-time = "2024-10-29T18:30:38.186Z" }, + { url = "https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl", hash = "sha256:fe10ec77c93ddf3d13a73b035abaac7a9f5e436513864ccdad516693213c65d6", size = 164437, upload-time = "2025-10-27T17:57:37.538Z" }, ] [package.optional-dependencies] @@ -220,11 +224,11 @@ css = [ [[package]] name = "certifi" -version = "2025.10.5" +version = "2025.11.12" 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/a2/8c/58f469717fa48465e4a50c014a0400602d3c437d7c0c468e17ada824da3a/certifi-2025.11.12.tar.gz", hash = "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316", size = 160538, upload-time = "2025-11-12T02:54:51.517Z" } 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/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b", size = 159438, upload-time = "2025-11-12T02:54:49.735Z" }, ] [[package]] @@ -286,11 +290,11 @@ wheels = [ [[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]] @@ -350,16 +354,31 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" }, ] +[[package]] +name = "check-datapackage" +version = "0.23.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonschema" }, + { name = "pydantic" }, + { name = "python-jsonpath" }, + { name = "types-jsonschema" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a6/a8/ebaa7324aee42776437960201496af580ff56be2ff670f5d86636e8eab75/check_datapackage-0.23.1.tar.gz", hash = "sha256:9990adbda08bc5a9b0d8f831c274874dcd8170300bde1c4460d978cf9177877a", size = 1145943, upload-time = "2025-11-27T09:29:40.822Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ad/b9/87a082374f9f14026cdda201fa6c62dff20b85fb2d7f274ff6f23d0971fb/check_datapackage-0.23.1-py3-none-any.whl", hash = "sha256:86fe8b6c5d98d4959c1b71c9e25ac3a2e3f32766001542af5cf9e00c8d57eae7", size = 32427, upload-time = "2025-11-27T09:29:39.734Z" }, +] + [[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]] @@ -382,7 +401,7 @@ wheels = [ [[package]] name = "commitizen" -version = "4.9.1" +version = "4.10.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "argcomplete" }, @@ -398,83 +417,83 @@ dependencies = [ { name = "termcolor" }, { name = "tomlkit" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/77/19/927ac5b0eabb9451e2d5bb45b30813915c9a1260713b5b68eeb31358ea23/commitizen-4.9.1.tar.gz", hash = "sha256:b076b24657718f7a35b1068f2083bd39b4065d250164a1398d1dac235c51753b", size = 56610, upload-time = "2025-09-10T14:19:33.746Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/b3/cc29794fc2ecd7aa7353105773ca18ecd761c3ba5b38879bd106b3fc8840/commitizen-4.10.0.tar.gz", hash = "sha256:cc58067403b9eff21d0423b3d9a29bda05254bd51ad5bdd1fd0594bff31277e1", size = 56820, upload-time = "2025-11-10T14:08:49.365Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cf/49/577035b841442fe031b017027c3d99278b46104d227f0353c69dbbe55148/commitizen-4.9.1-py3-none-any.whl", hash = "sha256:4241b2ecae97b8109af8e587c36bc3b805a09b9a311084d159098e12d6ead497", size = 80624, upload-time = "2025-09-10T14:19:32.102Z" }, + { url = "https://files.pythonhosted.org/packages/b3/5d/2bd8881737d6a5652ae3ebc37736893b9a7425f0eb16e605d1ff2957267e/commitizen-4.10.0-py3-none-any.whl", hash = "sha256:3fe56c168b30b30b84b8329cba6b132e77b4eb304a5460bbe2186aad0f78c966", size = 81269, upload-time = "2025-11-10T14:08:48.001Z" }, ] [[package]] name = "coverage" -version = "7.11.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1c/38/ee22495420457259d2f3390309505ea98f98a5eed40901cf62196abad006/coverage-7.11.0.tar.gz", hash = "sha256:167bd504ac1ca2af7ff3b81d245dfea0292c5032ebef9d66cc08a7d28c1b8050", size = 811905, upload-time = "2025-10-15T15:15:08.542Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c4/db/86f6906a7c7edc1a52b2c6682d6dd9be775d73c0dfe2b84f8923dfea5784/coverage-7.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9c49e77811cf9d024b95faf86c3f059b11c0c9be0b0d61bc598f453703bd6fd1", size = 216098, upload-time = "2025-10-15T15:13:02.916Z" }, - { url = "https://files.pythonhosted.org/packages/21/54/e7b26157048c7ba555596aad8569ff903d6cd67867d41b75287323678ede/coverage-7.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a61e37a403a778e2cda2a6a39abcc895f1d984071942a41074b5c7ee31642007", size = 216331, upload-time = "2025-10-15T15:13:04.403Z" }, - { url = "https://files.pythonhosted.org/packages/b9/19/1ce6bf444f858b83a733171306134a0544eaddf1ca8851ede6540a55b2ad/coverage-7.11.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c79cae102bb3b1801e2ef1511fb50e91ec83a1ce466b2c7c25010d884336de46", size = 247825, upload-time = "2025-10-15T15:13:05.92Z" }, - { url = "https://files.pythonhosted.org/packages/71/0b/d3bcbbc259fcced5fb67c5d78f6e7ee965f49760c14afd931e9e663a83b2/coverage-7.11.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:16ce17ceb5d211f320b62df002fa7016b7442ea0fd260c11cec8ce7730954893", size = 250573, upload-time = "2025-10-15T15:13:07.471Z" }, - { url = "https://files.pythonhosted.org/packages/58/8d/b0ff3641a320abb047258d36ed1c21d16be33beed4152628331a1baf3365/coverage-7.11.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:80027673e9d0bd6aef86134b0771845e2da85755cf686e7c7c59566cf5a89115", size = 251706, upload-time = "2025-10-15T15:13:09.4Z" }, - { url = "https://files.pythonhosted.org/packages/59/c8/5a586fe8c7b0458053d9c687f5cff515a74b66c85931f7fe17a1c958b4ac/coverage-7.11.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4d3ffa07a08657306cd2215b0da53761c4d73cb54d9143b9303a6481ec0cd415", size = 248221, upload-time = "2025-10-15T15:13:10.964Z" }, - { url = "https://files.pythonhosted.org/packages/d0/ff/3a25e3132804ba44cfa9a778cdf2b73dbbe63ef4b0945e39602fc896ba52/coverage-7.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a3b6a5f8b2524fd6c1066bc85bfd97e78709bb5e37b5b94911a6506b65f47186", size = 249624, upload-time = "2025-10-15T15:13:12.5Z" }, - { url = "https://files.pythonhosted.org/packages/c5/12/ff10c8ce3895e1b17a73485ea79ebc1896a9e466a9d0f4aef63e0d17b718/coverage-7.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fcc0a4aa589de34bc56e1a80a740ee0f8c47611bdfb28cd1849de60660f3799d", size = 247744, upload-time = "2025-10-15T15:13:14.554Z" }, - { url = "https://files.pythonhosted.org/packages/16/02/d500b91f5471b2975947e0629b8980e5e90786fe316b6d7299852c1d793d/coverage-7.11.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:dba82204769d78c3fd31b35c3d5f46e06511936c5019c39f98320e05b08f794d", size = 247325, upload-time = "2025-10-15T15:13:16.438Z" }, - { url = "https://files.pythonhosted.org/packages/77/11/dee0284fbbd9cd64cfce806b827452c6df3f100d9e66188e82dfe771d4af/coverage-7.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:81b335f03ba67309a95210caf3eb43bd6fe75a4e22ba653ef97b4696c56c7ec2", size = 249180, upload-time = "2025-10-15T15:13:17.959Z" }, - { url = "https://files.pythonhosted.org/packages/59/1b/cdf1def928f0a150a057cab03286774e73e29c2395f0d30ce3d9e9f8e697/coverage-7.11.0-cp312-cp312-win32.whl", hash = "sha256:037b2d064c2f8cc8716fe4d39cb705779af3fbf1ba318dc96a1af858888c7bb5", size = 218479, upload-time = "2025-10-15T15:13:19.608Z" }, - { url = "https://files.pythonhosted.org/packages/ff/55/e5884d55e031da9c15b94b90a23beccc9d6beee65e9835cd6da0a79e4f3a/coverage-7.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:d66c0104aec3b75e5fd897e7940188ea1892ca1d0235316bf89286d6a22568c0", size = 219290, upload-time = "2025-10-15T15:13:21.593Z" }, - { url = "https://files.pythonhosted.org/packages/23/a8/faa930cfc71c1d16bc78f9a19bb73700464f9c331d9e547bfbc1dbd3a108/coverage-7.11.0-cp312-cp312-win_arm64.whl", hash = "sha256:d91ebeac603812a09cf6a886ba6e464f3bbb367411904ae3790dfe28311b15ad", size = 217924, upload-time = "2025-10-15T15:13:23.39Z" }, - { url = "https://files.pythonhosted.org/packages/60/7f/85e4dfe65e400645464b25c036a26ac226cf3a69d4a50c3934c532491cdd/coverage-7.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cc3f49e65ea6e0d5d9bd60368684fe52a704d46f9e7fc413918f18d046ec40e1", size = 216129, upload-time = "2025-10-15T15:13:25.371Z" }, - { url = "https://files.pythonhosted.org/packages/96/5d/dc5fa98fea3c175caf9d360649cb1aa3715e391ab00dc78c4c66fabd7356/coverage-7.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f39ae2f63f37472c17b4990f794035c9890418b1b8cca75c01193f3c8d3e01be", size = 216380, upload-time = "2025-10-15T15:13:26.976Z" }, - { url = "https://files.pythonhosted.org/packages/b2/f5/3da9cc9596708273385189289c0e4d8197d37a386bdf17619013554b3447/coverage-7.11.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7db53b5cdd2917b6eaadd0b1251cf4e7d96f4a8d24e174bdbdf2f65b5ea7994d", size = 247375, upload-time = "2025-10-15T15:13:28.923Z" }, - { url = "https://files.pythonhosted.org/packages/65/6c/f7f59c342359a235559d2bc76b0c73cfc4bac7d61bb0df210965cb1ecffd/coverage-7.11.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10ad04ac3a122048688387828b4537bc9cf60c0bf4869c1e9989c46e45690b82", size = 249978, upload-time = "2025-10-15T15:13:30.525Z" }, - { url = "https://files.pythonhosted.org/packages/e7/8c/042dede2e23525e863bf1ccd2b92689692a148d8b5fd37c37899ba882645/coverage-7.11.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4036cc9c7983a2b1f2556d574d2eb2154ac6ed55114761685657e38782b23f52", size = 251253, upload-time = "2025-10-15T15:13:32.174Z" }, - { url = "https://files.pythonhosted.org/packages/7b/a9/3c58df67bfa809a7bddd786356d9c5283e45d693edb5f3f55d0986dd905a/coverage-7.11.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7ab934dd13b1c5e94b692b1e01bd87e4488cb746e3a50f798cb9464fd128374b", size = 247591, upload-time = "2025-10-15T15:13:34.147Z" }, - { url = "https://files.pythonhosted.org/packages/26/5b/c7f32efd862ee0477a18c41e4761305de6ddd2d49cdeda0c1116227570fd/coverage-7.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59a6e5a265f7cfc05f76e3bb53eca2e0dfe90f05e07e849930fecd6abb8f40b4", size = 249411, upload-time = "2025-10-15T15:13:38.425Z" }, - { url = "https://files.pythonhosted.org/packages/76/b5/78cb4f1e86c1611431c990423ec0768122905b03837e1b4c6a6f388a858b/coverage-7.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:df01d6c4c81e15a7c88337b795bb7595a8596e92310266b5072c7e301168efbd", size = 247303, upload-time = "2025-10-15T15:13:40.464Z" }, - { url = "https://files.pythonhosted.org/packages/87/c9/23c753a8641a330f45f221286e707c427e46d0ffd1719b080cedc984ec40/coverage-7.11.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:8c934bd088eed6174210942761e38ee81d28c46de0132ebb1801dbe36a390dcc", size = 247157, upload-time = "2025-10-15T15:13:42.087Z" }, - { url = "https://files.pythonhosted.org/packages/c5/42/6e0cc71dc8a464486e944a4fa0d85bdec031cc2969e98ed41532a98336b9/coverage-7.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a03eaf7ec24078ad64a07f02e30060aaf22b91dedf31a6b24d0d98d2bba7f48", size = 248921, upload-time = "2025-10-15T15:13:43.715Z" }, - { url = "https://files.pythonhosted.org/packages/e8/1c/743c2ef665e6858cccb0f84377dfe3a4c25add51e8c7ef19249be92465b6/coverage-7.11.0-cp313-cp313-win32.whl", hash = "sha256:695340f698a5f56f795b2836abe6fb576e7c53d48cd155ad2f80fd24bc63a040", size = 218526, upload-time = "2025-10-15T15:13:45.336Z" }, - { url = "https://files.pythonhosted.org/packages/ff/d5/226daadfd1bf8ddbccefbd3aa3547d7b960fb48e1bdac124e2dd13a2b71a/coverage-7.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:2727d47fce3ee2bac648528e41455d1b0c46395a087a229deac75e9f88ba5a05", size = 219317, upload-time = "2025-10-15T15:13:47.401Z" }, - { url = "https://files.pythonhosted.org/packages/97/54/47db81dcbe571a48a298f206183ba8a7ba79200a37cd0d9f4788fcd2af4a/coverage-7.11.0-cp313-cp313-win_arm64.whl", hash = "sha256:0efa742f431529699712b92ecdf22de8ff198df41e43aeaaadf69973eb93f17a", size = 217948, upload-time = "2025-10-15T15:13:49.096Z" }, - { url = "https://files.pythonhosted.org/packages/e5/8b/cb68425420154e7e2a82fd779a8cc01549b6fa83c2ad3679cd6c088ebd07/coverage-7.11.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:587c38849b853b157706407e9ebdca8fd12f45869edb56defbef2daa5fb0812b", size = 216837, upload-time = "2025-10-15T15:13:51.09Z" }, - { url = "https://files.pythonhosted.org/packages/33/55/9d61b5765a025685e14659c8d07037247de6383c0385757544ffe4606475/coverage-7.11.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b971bdefdd75096163dd4261c74be813c4508477e39ff7b92191dea19f24cd37", size = 217061, upload-time = "2025-10-15T15:13:52.747Z" }, - { url = "https://files.pythonhosted.org/packages/52/85/292459c9186d70dcec6538f06ea251bc968046922497377bf4a1dc9a71de/coverage-7.11.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:269bfe913b7d5be12ab13a95f3a76da23cf147be7fa043933320ba5625f0a8de", size = 258398, upload-time = "2025-10-15T15:13:54.45Z" }, - { url = "https://files.pythonhosted.org/packages/1f/e2/46edd73fb8bf51446c41148d81944c54ed224854812b6ca549be25113ee0/coverage-7.11.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:dadbcce51a10c07b7c72b0ce4a25e4b6dcb0c0372846afb8e5b6307a121eb99f", size = 260574, upload-time = "2025-10-15T15:13:56.145Z" }, - { url = "https://files.pythonhosted.org/packages/07/5e/1df469a19007ff82e2ca8fe509822820a31e251f80ee7344c34f6cd2ec43/coverage-7.11.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9ed43fa22c6436f7957df036331f8fe4efa7af132054e1844918866cd228af6c", size = 262797, upload-time = "2025-10-15T15:13:58.635Z" }, - { url = "https://files.pythonhosted.org/packages/f9/50/de216b31a1434b94d9b34a964c09943c6be45069ec704bfc379d8d89a649/coverage-7.11.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9516add7256b6713ec08359b7b05aeff8850c98d357784c7205b2e60aa2513fa", size = 257361, upload-time = "2025-10-15T15:14:00.409Z" }, - { url = "https://files.pythonhosted.org/packages/82/1e/3f9f8344a48111e152e0fd495b6fff13cc743e771a6050abf1627a7ba918/coverage-7.11.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb92e47c92fcbcdc692f428da67db33337fa213756f7adb6a011f7b5a7a20740", size = 260349, upload-time = "2025-10-15T15:14:02.188Z" }, - { url = "https://files.pythonhosted.org/packages/65/9b/3f52741f9e7d82124272f3070bbe316006a7de1bad1093f88d59bfc6c548/coverage-7.11.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d06f4fc7acf3cabd6d74941d53329e06bab00a8fe10e4df2714f0b134bfc64ef", size = 258114, upload-time = "2025-10-15T15:14:03.907Z" }, - { url = "https://files.pythonhosted.org/packages/0b/8b/918f0e15f0365d50d3986bbd3338ca01178717ac5678301f3f547b6619e6/coverage-7.11.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:6fbcee1a8f056af07ecd344482f711f563a9eb1c2cad192e87df00338ec3cdb0", size = 256723, upload-time = "2025-10-15T15:14:06.324Z" }, - { url = "https://files.pythonhosted.org/packages/44/9e/7776829f82d3cf630878a7965a7d70cc6ca94f22c7d20ec4944f7148cb46/coverage-7.11.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dbbf012be5f32533a490709ad597ad8a8ff80c582a95adc8d62af664e532f9ca", size = 259238, upload-time = "2025-10-15T15:14:08.002Z" }, - { url = "https://files.pythonhosted.org/packages/9a/b8/49cf253e1e7a3bedb85199b201862dd7ca4859f75b6cf25ffa7298aa0760/coverage-7.11.0-cp313-cp313t-win32.whl", hash = "sha256:cee6291bb4fed184f1c2b663606a115c743df98a537c969c3c64b49989da96c2", size = 219180, upload-time = "2025-10-15T15:14:09.786Z" }, - { url = "https://files.pythonhosted.org/packages/ac/e1/1a541703826be7ae2125a0fb7f821af5729d56bb71e946e7b933cc7a89a4/coverage-7.11.0-cp313-cp313t-win_amd64.whl", hash = "sha256:a386c1061bf98e7ea4758e4313c0ab5ecf57af341ef0f43a0bf26c2477b5c268", size = 220241, upload-time = "2025-10-15T15:14:11.471Z" }, - { url = "https://files.pythonhosted.org/packages/d5/d1/5ee0e0a08621140fd418ec4020f595b4d52d7eb429ae6a0c6542b4ba6f14/coverage-7.11.0-cp313-cp313t-win_arm64.whl", hash = "sha256:f9ea02ef40bb83823b2b04964459d281688fe173e20643870bb5d2edf68bc836", size = 218510, upload-time = "2025-10-15T15:14:13.46Z" }, - { url = "https://files.pythonhosted.org/packages/f4/06/e923830c1985ce808e40a3fa3eb46c13350b3224b7da59757d37b6ce12b8/coverage-7.11.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c770885b28fb399aaf2a65bbd1c12bf6f307ffd112d6a76c5231a94276f0c497", size = 216110, upload-time = "2025-10-15T15:14:15.157Z" }, - { url = "https://files.pythonhosted.org/packages/42/82/cdeed03bfead45203fb651ed756dfb5266028f5f939e7f06efac4041dad5/coverage-7.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a3d0e2087dba64c86a6b254f43e12d264b636a39e88c5cc0a01a7c71bcfdab7e", size = 216395, upload-time = "2025-10-15T15:14:16.863Z" }, - { url = "https://files.pythonhosted.org/packages/fc/ba/e1c80caffc3199aa699813f73ff097bc2df7b31642bdbc7493600a8f1de5/coverage-7.11.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:73feb83bb41c32811973b8565f3705caf01d928d972b72042b44e97c71fd70d1", size = 247433, upload-time = "2025-10-15T15:14:18.589Z" }, - { url = "https://files.pythonhosted.org/packages/80/c0/5b259b029694ce0a5bbc1548834c7ba3db41d3efd3474489d7efce4ceb18/coverage-7.11.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c6f31f281012235ad08f9a560976cc2fc9c95c17604ff3ab20120fe480169bca", size = 249970, upload-time = "2025-10-15T15:14:20.307Z" }, - { url = "https://files.pythonhosted.org/packages/8c/86/171b2b5e1aac7e2fd9b43f7158b987dbeb95f06d1fbecad54ad8163ae3e8/coverage-7.11.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9570ad567f880ef675673992222746a124b9595506826b210fbe0ce3f0499cd", size = 251324, upload-time = "2025-10-15T15:14:22.419Z" }, - { url = "https://files.pythonhosted.org/packages/1a/7e/7e10414d343385b92024af3932a27a1caf75c6e27ee88ba211221ff1a145/coverage-7.11.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8badf70446042553a773547a61fecaa734b55dc738cacf20c56ab04b77425e43", size = 247445, upload-time = "2025-10-15T15:14:24.205Z" }, - { url = "https://files.pythonhosted.org/packages/c4/3b/e4f966b21f5be8c4bf86ad75ae94efa0de4c99c7bbb8114476323102e345/coverage-7.11.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a09c1211959903a479e389685b7feb8a17f59ec5a4ef9afde7650bd5eabc2777", size = 249324, upload-time = "2025-10-15T15:14:26.234Z" }, - { url = "https://files.pythonhosted.org/packages/00/a2/8479325576dfcd909244d0df215f077f47437ab852ab778cfa2f8bf4d954/coverage-7.11.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:5ef83b107f50db3f9ae40f69e34b3bd9337456c5a7fe3461c7abf8b75dd666a2", size = 247261, upload-time = "2025-10-15T15:14:28.42Z" }, - { url = "https://files.pythonhosted.org/packages/7b/d8/3a9e2db19d94d65771d0f2e21a9ea587d11b831332a73622f901157cc24b/coverage-7.11.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:f91f927a3215b8907e214af77200250bb6aae36eca3f760f89780d13e495388d", size = 247092, upload-time = "2025-10-15T15:14:30.784Z" }, - { url = "https://files.pythonhosted.org/packages/b3/b1/bbca3c472544f9e2ad2d5116b2379732957048be4b93a9c543fcd0207e5f/coverage-7.11.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cdbcd376716d6b7fbfeedd687a6c4be019c5a5671b35f804ba76a4c0a778cba4", size = 248755, upload-time = "2025-10-15T15:14:32.585Z" }, - { url = "https://files.pythonhosted.org/packages/89/49/638d5a45a6a0f00af53d6b637c87007eb2297042186334e9923a61aa8854/coverage-7.11.0-cp314-cp314-win32.whl", hash = "sha256:bab7ec4bb501743edc63609320aaec8cd9188b396354f482f4de4d40a9d10721", size = 218793, upload-time = "2025-10-15T15:14:34.972Z" }, - { url = "https://files.pythonhosted.org/packages/30/cc/b675a51f2d068adb3cdf3799212c662239b0ca27f4691d1fff81b92ea850/coverage-7.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:3d4ba9a449e9364a936a27322b20d32d8b166553bfe63059bd21527e681e2fad", size = 219587, upload-time = "2025-10-15T15:14:37.047Z" }, - { url = "https://files.pythonhosted.org/packages/93/98/5ac886876026de04f00820e5094fe22166b98dcb8b426bf6827aaf67048c/coverage-7.11.0-cp314-cp314-win_arm64.whl", hash = "sha256:ce37f215223af94ef0f75ac68ea096f9f8e8c8ec7d6e8c346ee45c0d363f0479", size = 218168, upload-time = "2025-10-15T15:14:38.861Z" }, - { url = "https://files.pythonhosted.org/packages/14/d1/b4145d35b3e3ecf4d917e97fc8895bcf027d854879ba401d9ff0f533f997/coverage-7.11.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:f413ce6e07e0d0dc9c433228727b619871532674b45165abafe201f200cc215f", size = 216850, upload-time = "2025-10-15T15:14:40.651Z" }, - { url = "https://files.pythonhosted.org/packages/ca/d1/7f645fc2eccd318369a8a9948acc447bb7c1ade2911e31d3c5620544c22b/coverage-7.11.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:05791e528a18f7072bf5998ba772fe29db4da1234c45c2087866b5ba4dea710e", size = 217071, upload-time = "2025-10-15T15:14:42.755Z" }, - { url = "https://files.pythonhosted.org/packages/54/7d/64d124649db2737ceced1dfcbdcb79898d5868d311730f622f8ecae84250/coverage-7.11.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cacb29f420cfeb9283b803263c3b9a068924474ff19ca126ba9103e1278dfa44", size = 258570, upload-time = "2025-10-15T15:14:44.542Z" }, - { url = "https://files.pythonhosted.org/packages/6c/3f/6f5922f80dc6f2d8b2c6f974835c43f53eb4257a7797727e6ca5b7b2ec1f/coverage-7.11.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:314c24e700d7027ae3ab0d95fbf8d53544fca1f20345fd30cd219b737c6e58d3", size = 260738, upload-time = "2025-10-15T15:14:46.436Z" }, - { url = "https://files.pythonhosted.org/packages/0e/5f/9e883523c4647c860b3812b417a2017e361eca5b635ee658387dc11b13c1/coverage-7.11.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:630d0bd7a293ad2fc8b4b94e5758c8b2536fdf36c05f1681270203e463cbfa9b", size = 262994, upload-time = "2025-10-15T15:14:48.3Z" }, - { url = "https://files.pythonhosted.org/packages/07/bb/43b5a8e94c09c8bf51743ffc65c4c841a4ca5d3ed191d0a6919c379a1b83/coverage-7.11.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e89641f5175d65e2dbb44db15fe4ea48fade5d5bbb9868fdc2b4fce22f4a469d", size = 257282, upload-time = "2025-10-15T15:14:50.236Z" }, - { url = "https://files.pythonhosted.org/packages/aa/e5/0ead8af411411330b928733e1d201384b39251a5f043c1612970310e8283/coverage-7.11.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c9f08ea03114a637dab06cedb2e914da9dc67fa52c6015c018ff43fdde25b9c2", size = 260430, upload-time = "2025-10-15T15:14:52.413Z" }, - { url = "https://files.pythonhosted.org/packages/ae/66/03dd8bb0ba5b971620dcaac145461950f6d8204953e535d2b20c6b65d729/coverage-7.11.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ce9f3bde4e9b031eaf1eb61df95c1401427029ea1bfddb8621c1161dcb0fa02e", size = 258190, upload-time = "2025-10-15T15:14:54.268Z" }, - { url = "https://files.pythonhosted.org/packages/45/ae/28a9cce40bf3174426cb2f7e71ee172d98e7f6446dff936a7ccecee34b14/coverage-7.11.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:e4dc07e95495923d6fd4d6c27bf70769425b71c89053083843fd78f378558996", size = 256658, upload-time = "2025-10-15T15:14:56.436Z" }, - { url = "https://files.pythonhosted.org/packages/5c/7c/3a44234a8599513684bfc8684878fd7b126c2760f79712bb78c56f19efc4/coverage-7.11.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:424538266794db2861db4922b05d729ade0940ee69dcf0591ce8f69784db0e11", size = 259342, upload-time = "2025-10-15T15:14:58.538Z" }, - { url = "https://files.pythonhosted.org/packages/e1/e6/0108519cba871af0351725ebdb8660fd7a0fe2ba3850d56d32490c7d9b4b/coverage-7.11.0-cp314-cp314t-win32.whl", hash = "sha256:4c1eeb3fb8eb9e0190bebafd0462936f75717687117339f708f395fe455acc73", size = 219568, upload-time = "2025-10-15T15:15:00.382Z" }, - { url = "https://files.pythonhosted.org/packages/c9/76/44ba876e0942b4e62fdde23ccb029ddb16d19ba1bef081edd00857ba0b16/coverage-7.11.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b56efee146c98dbf2cf5cffc61b9829d1e94442df4d7398b26892a53992d3547", size = 220687, upload-time = "2025-10-15T15:15:02.322Z" }, - { url = "https://files.pythonhosted.org/packages/b9/0c/0df55ecb20d0d0ed5c322e10a441775e1a3a5d78c60f0c4e1abfe6fcf949/coverage-7.11.0-cp314-cp314t-win_arm64.whl", hash = "sha256:b5c2705afa83f49bd91962a4094b6b082f94aef7626365ab3f8f4bd159c5acf3", size = 218711, upload-time = "2025-10-15T15:15:04.575Z" }, - { url = "https://files.pythonhosted.org/packages/5f/04/642c1d8a448ae5ea1369eac8495740a79eb4e581a9fb0cbdce56bbf56da1/coverage-7.11.0-py3-none-any.whl", hash = "sha256:4b7589765348d78fb4e5fb6ea35d07564e387da2fc5efff62e0222971f155f68", size = 207761, upload-time = "2025-10-15T15:15:06.439Z" }, +version = "7.12.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/89/26/4a96807b193b011588099c3b5c89fbb05294e5b90e71018e065465f34eb6/coverage-7.12.0.tar.gz", hash = "sha256:fc11e0a4e372cb5f282f16ef90d4a585034050ccda536451901abfb19a57f40c", size = 819341, upload-time = "2025-11-18T13:34:20.766Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/bf/638c0427c0f0d47638242e2438127f3c8ee3cfc06c7fdeb16778ed47f836/coverage-7.12.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:29644c928772c78512b48e14156b81255000dcfd4817574ff69def189bcb3647", size = 217704, upload-time = "2025-11-18T13:32:28.906Z" }, + { url = "https://files.pythonhosted.org/packages/08/e1/706fae6692a66c2d6b871a608bbde0da6281903fa0e9f53a39ed441da36a/coverage-7.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8638cbb002eaa5d7c8d04da667813ce1067080b9a91099801a0053086e52b736", size = 218064, upload-time = "2025-11-18T13:32:30.161Z" }, + { url = "https://files.pythonhosted.org/packages/a9/8b/eb0231d0540f8af3ffda39720ff43cb91926489d01524e68f60e961366e4/coverage-7.12.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:083631eeff5eb9992c923e14b810a179798bb598e6a0dd60586819fc23be6e60", size = 249560, upload-time = "2025-11-18T13:32:31.835Z" }, + { url = "https://files.pythonhosted.org/packages/e9/a1/67fb52af642e974d159b5b379e4d4c59d0ebe1288677fbd04bbffe665a82/coverage-7.12.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:99d5415c73ca12d558e07776bd957c4222c687b9f1d26fa0e1b57e3598bdcde8", size = 252318, upload-time = "2025-11-18T13:32:33.178Z" }, + { url = "https://files.pythonhosted.org/packages/41/e5/38228f31b2c7665ebf9bdfdddd7a184d56450755c7e43ac721c11a4b8dab/coverage-7.12.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e949ebf60c717c3df63adb4a1a366c096c8d7fd8472608cd09359e1bd48ef59f", size = 253403, upload-time = "2025-11-18T13:32:34.45Z" }, + { url = "https://files.pythonhosted.org/packages/ec/4b/df78e4c8188f9960684267c5a4897836f3f0f20a20c51606ee778a1d9749/coverage-7.12.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6d907ddccbca819afa2cd014bc69983b146cca2735a0b1e6259b2a6c10be1e70", size = 249984, upload-time = "2025-11-18T13:32:35.747Z" }, + { url = "https://files.pythonhosted.org/packages/ba/51/bb163933d195a345c6f63eab9e55743413d064c291b6220df754075c2769/coverage-7.12.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b1518ecbad4e6173f4c6e6c4a46e49555ea5679bf3feda5edb1b935c7c44e8a0", size = 251339, upload-time = "2025-11-18T13:32:37.352Z" }, + { url = "https://files.pythonhosted.org/packages/15/40/c9b29cdb8412c837cdcbc2cfa054547dd83affe6cbbd4ce4fdb92b6ba7d1/coverage-7.12.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:51777647a749abdf6f6fd8c7cffab12de68ab93aab15efc72fbbb83036c2a068", size = 249489, upload-time = "2025-11-18T13:32:39.212Z" }, + { url = "https://files.pythonhosted.org/packages/c8/da/b3131e20ba07a0de4437a50ef3b47840dfabf9293675b0cd5c2c7f66dd61/coverage-7.12.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:42435d46d6461a3b305cdfcad7cdd3248787771f53fe18305548cba474e6523b", size = 249070, upload-time = "2025-11-18T13:32:40.598Z" }, + { url = "https://files.pythonhosted.org/packages/70/81/b653329b5f6302c08d683ceff6785bc60a34be9ae92a5c7b63ee7ee7acec/coverage-7.12.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5bcead88c8423e1855e64b8057d0544e33e4080b95b240c2a355334bb7ced937", size = 250929, upload-time = "2025-11-18T13:32:42.915Z" }, + { url = "https://files.pythonhosted.org/packages/a3/00/250ac3bca9f252a5fb1338b5ad01331ebb7b40223f72bef5b1b2cb03aa64/coverage-7.12.0-cp312-cp312-win32.whl", hash = "sha256:dcbb630ab034e86d2a0f79aefd2be07e583202f41e037602d438c80044957baa", size = 220241, upload-time = "2025-11-18T13:32:44.665Z" }, + { url = "https://files.pythonhosted.org/packages/64/1c/77e79e76d37ce83302f6c21980b45e09f8aa4551965213a10e62d71ce0ab/coverage-7.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:2fd8354ed5d69775ac42986a691fbf68b4084278710cee9d7c3eaa0c28fa982a", size = 221051, upload-time = "2025-11-18T13:32:46.008Z" }, + { url = "https://files.pythonhosted.org/packages/31/f5/641b8a25baae564f9e52cac0e2667b123de961985709a004e287ee7663cc/coverage-7.12.0-cp312-cp312-win_arm64.whl", hash = "sha256:737c3814903be30695b2de20d22bcc5428fdae305c61ba44cdc8b3252984c49c", size = 219692, upload-time = "2025-11-18T13:32:47.372Z" }, + { url = "https://files.pythonhosted.org/packages/b8/14/771700b4048774e48d2c54ed0c674273702713c9ee7acdfede40c2666747/coverage-7.12.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:47324fffca8d8eae7e185b5bb20c14645f23350f870c1649003618ea91a78941", size = 217725, upload-time = "2025-11-18T13:32:49.22Z" }, + { url = "https://files.pythonhosted.org/packages/17/a7/3aa4144d3bcb719bf67b22d2d51c2d577bf801498c13cb08f64173e80497/coverage-7.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ccf3b2ede91decd2fb53ec73c1f949c3e034129d1e0b07798ff1d02ea0c8fa4a", size = 218098, upload-time = "2025-11-18T13:32:50.78Z" }, + { url = "https://files.pythonhosted.org/packages/fc/9c/b846bbc774ff81091a12a10203e70562c91ae71badda00c5ae5b613527b1/coverage-7.12.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b365adc70a6936c6b0582dc38746b33b2454148c02349345412c6e743efb646d", size = 249093, upload-time = "2025-11-18T13:32:52.554Z" }, + { url = "https://files.pythonhosted.org/packages/76/b6/67d7c0e1f400b32c883e9342de4a8c2ae7c1a0b57c5de87622b7262e2309/coverage-7.12.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bc13baf85cd8a4cfcf4a35c7bc9d795837ad809775f782f697bf630b7e200211", size = 251686, upload-time = "2025-11-18T13:32:54.862Z" }, + { url = "https://files.pythonhosted.org/packages/cc/75/b095bd4b39d49c3be4bffbb3135fea18a99a431c52dd7513637c0762fecb/coverage-7.12.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:099d11698385d572ceafb3288a5b80fe1fc58bf665b3f9d362389de488361d3d", size = 252930, upload-time = "2025-11-18T13:32:56.417Z" }, + { url = "https://files.pythonhosted.org/packages/6e/f3/466f63015c7c80550bead3093aacabf5380c1220a2a93c35d374cae8f762/coverage-7.12.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:473dc45d69694069adb7680c405fb1e81f60b2aff42c81e2f2c3feaf544d878c", size = 249296, upload-time = "2025-11-18T13:32:58.074Z" }, + { url = "https://files.pythonhosted.org/packages/27/86/eba2209bf2b7e28c68698fc13437519a295b2d228ba9e0ec91673e09fa92/coverage-7.12.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:583f9adbefd278e9de33c33d6846aa8f5d164fa49b47144180a0e037f0688bb9", size = 251068, upload-time = "2025-11-18T13:32:59.646Z" }, + { url = "https://files.pythonhosted.org/packages/ec/55/ca8ae7dbba962a3351f18940b359b94c6bafdd7757945fdc79ec9e452dc7/coverage-7.12.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b2089cc445f2dc0af6f801f0d1355c025b76c24481935303cf1af28f636688f0", size = 249034, upload-time = "2025-11-18T13:33:01.481Z" }, + { url = "https://files.pythonhosted.org/packages/7a/d7/39136149325cad92d420b023b5fd900dabdd1c3a0d1d5f148ef4a8cedef5/coverage-7.12.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:950411f1eb5d579999c5f66c62a40961f126fc71e5e14419f004471957b51508", size = 248853, upload-time = "2025-11-18T13:33:02.935Z" }, + { url = "https://files.pythonhosted.org/packages/fe/b6/76e1add8b87ef60e00643b0b7f8f7bb73d4bf5249a3be19ebefc5793dd25/coverage-7.12.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b1aab7302a87bafebfe76b12af681b56ff446dc6f32ed178ff9c092ca776e6bc", size = 250619, upload-time = "2025-11-18T13:33:04.336Z" }, + { url = "https://files.pythonhosted.org/packages/95/87/924c6dc64f9203f7a3c1832a6a0eee5a8335dbe5f1bdadcc278d6f1b4d74/coverage-7.12.0-cp313-cp313-win32.whl", hash = "sha256:d7e0d0303c13b54db495eb636bc2465b2fb8475d4c8bcec8fe4b5ca454dfbae8", size = 220261, upload-time = "2025-11-18T13:33:06.493Z" }, + { url = "https://files.pythonhosted.org/packages/91/77/dd4aff9af16ff776bf355a24d87eeb48fc6acde54c907cc1ea89b14a8804/coverage-7.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:ce61969812d6a98a981d147d9ac583a36ac7db7766f2e64a9d4d059c2fe29d07", size = 221072, upload-time = "2025-11-18T13:33:07.926Z" }, + { url = "https://files.pythonhosted.org/packages/70/49/5c9dc46205fef31b1b226a6e16513193715290584317fd4df91cdaf28b22/coverage-7.12.0-cp313-cp313-win_arm64.whl", hash = "sha256:bcec6f47e4cb8a4c2dc91ce507f6eefc6a1b10f58df32cdc61dff65455031dfc", size = 219702, upload-time = "2025-11-18T13:33:09.631Z" }, + { url = "https://files.pythonhosted.org/packages/9b/62/f87922641c7198667994dd472a91e1d9b829c95d6c29529ceb52132436ad/coverage-7.12.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:459443346509476170d553035e4a3eed7b860f4fe5242f02de1010501956ce87", size = 218420, upload-time = "2025-11-18T13:33:11.153Z" }, + { url = "https://files.pythonhosted.org/packages/85/dd/1cc13b2395ef15dbb27d7370a2509b4aee77890a464fb35d72d428f84871/coverage-7.12.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:04a79245ab2b7a61688958f7a855275997134bc84f4a03bc240cf64ff132abf6", size = 218773, upload-time = "2025-11-18T13:33:12.569Z" }, + { url = "https://files.pythonhosted.org/packages/74/40/35773cc4bb1e9d4658d4fb669eb4195b3151bef3bbd6f866aba5cd5dac82/coverage-7.12.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:09a86acaaa8455f13d6a99221d9654df249b33937b4e212b4e5a822065f12aa7", size = 260078, upload-time = "2025-11-18T13:33:14.037Z" }, + { url = "https://files.pythonhosted.org/packages/ec/ee/231bb1a6ffc2905e396557585ebc6bdc559e7c66708376d245a1f1d330fc/coverage-7.12.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:907e0df1b71ba77463687a74149c6122c3f6aac56c2510a5d906b2f368208560", size = 262144, upload-time = "2025-11-18T13:33:15.601Z" }, + { url = "https://files.pythonhosted.org/packages/28/be/32f4aa9f3bf0b56f3971001b56508352c7753915345d45fab4296a986f01/coverage-7.12.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9b57e2d0ddd5f0582bae5437c04ee71c46cd908e7bc5d4d0391f9a41e812dd12", size = 264574, upload-time = "2025-11-18T13:33:17.354Z" }, + { url = "https://files.pythonhosted.org/packages/68/7c/00489fcbc2245d13ab12189b977e0cf06ff3351cb98bc6beba8bd68c5902/coverage-7.12.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:58c1c6aa677f3a1411fe6fb28ec3a942e4f665df036a3608816e0847fad23296", size = 259298, upload-time = "2025-11-18T13:33:18.958Z" }, + { url = "https://files.pythonhosted.org/packages/96/b4/f0760d65d56c3bea95b449e02570d4abd2549dc784bf39a2d4721a2d8ceb/coverage-7.12.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4c589361263ab2953e3c4cd2a94db94c4ad4a8e572776ecfbad2389c626e4507", size = 262150, upload-time = "2025-11-18T13:33:20.644Z" }, + { url = "https://files.pythonhosted.org/packages/c5/71/9a9314df00f9326d78c1e5a910f520d599205907432d90d1c1b7a97aa4b1/coverage-7.12.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:91b810a163ccad2e43b1faa11d70d3cf4b6f3d83f9fd5f2df82a32d47b648e0d", size = 259763, upload-time = "2025-11-18T13:33:22.189Z" }, + { url = "https://files.pythonhosted.org/packages/10/34/01a0aceed13fbdf925876b9a15d50862eb8845454301fe3cdd1df08b2182/coverage-7.12.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:40c867af715f22592e0d0fb533a33a71ec9e0f73a6945f722a0c85c8c1cbe3a2", size = 258653, upload-time = "2025-11-18T13:33:24.239Z" }, + { url = "https://files.pythonhosted.org/packages/8d/04/81d8fd64928acf1574bbb0181f66901c6c1c6279c8ccf5f84259d2c68ae9/coverage-7.12.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:68b0d0a2d84f333de875666259dadf28cc67858bc8fd8b3f1eae84d3c2bec455", size = 260856, upload-time = "2025-11-18T13:33:26.365Z" }, + { url = "https://files.pythonhosted.org/packages/f2/76/fa2a37bfaeaf1f766a2d2360a25a5297d4fb567098112f6517475eee120b/coverage-7.12.0-cp313-cp313t-win32.whl", hash = "sha256:73f9e7fbd51a221818fd11b7090eaa835a353ddd59c236c57b2199486b116c6d", size = 220936, upload-time = "2025-11-18T13:33:28.165Z" }, + { url = "https://files.pythonhosted.org/packages/f9/52/60f64d932d555102611c366afb0eb434b34266b1d9266fc2fe18ab641c47/coverage-7.12.0-cp313-cp313t-win_amd64.whl", hash = "sha256:24cff9d1f5743f67db7ba46ff284018a6e9aeb649b67aa1e70c396aa1b7cb23c", size = 222001, upload-time = "2025-11-18T13:33:29.656Z" }, + { url = "https://files.pythonhosted.org/packages/77/df/c303164154a5a3aea7472bf323b7c857fed93b26618ed9fc5c2955566bb0/coverage-7.12.0-cp313-cp313t-win_arm64.whl", hash = "sha256:c87395744f5c77c866d0f5a43d97cc39e17c7f1cb0115e54a2fe67ca75c5d14d", size = 220273, upload-time = "2025-11-18T13:33:31.415Z" }, + { url = "https://files.pythonhosted.org/packages/bf/2e/fc12db0883478d6e12bbd62d481210f0c8daf036102aa11434a0c5755825/coverage-7.12.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a1c59b7dc169809a88b21a936eccf71c3895a78f5592051b1af8f4d59c2b4f92", size = 217777, upload-time = "2025-11-18T13:33:32.86Z" }, + { url = "https://files.pythonhosted.org/packages/1f/c1/ce3e525d223350c6ec16b9be8a057623f54226ef7f4c2fee361ebb6a02b8/coverage-7.12.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8787b0f982e020adb732b9f051f3e49dd5054cebbc3f3432061278512a2b1360", size = 218100, upload-time = "2025-11-18T13:33:34.532Z" }, + { url = "https://files.pythonhosted.org/packages/15/87/113757441504aee3808cb422990ed7c8bcc2d53a6779c66c5adef0942939/coverage-7.12.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5ea5a9f7dc8877455b13dd1effd3202e0bca72f6f3ab09f9036b1bcf728f69ac", size = 249151, upload-time = "2025-11-18T13:33:36.135Z" }, + { url = "https://files.pythonhosted.org/packages/d9/1d/9529d9bd44049b6b05bb319c03a3a7e4b0a8a802d28fa348ad407e10706d/coverage-7.12.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fdba9f15849534594f60b47c9a30bc70409b54947319a7c4fd0e8e3d8d2f355d", size = 251667, upload-time = "2025-11-18T13:33:37.996Z" }, + { url = "https://files.pythonhosted.org/packages/11/bb/567e751c41e9c03dc29d3ce74b8c89a1e3396313e34f255a2a2e8b9ebb56/coverage-7.12.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a00594770eb715854fb1c57e0dea08cce6720cfbc531accdb9850d7c7770396c", size = 253003, upload-time = "2025-11-18T13:33:39.553Z" }, + { url = "https://files.pythonhosted.org/packages/e4/b3/c2cce2d8526a02fb9e9ca14a263ca6fc074449b33a6afa4892838c903528/coverage-7.12.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5560c7e0d82b42eb1951e4f68f071f8017c824ebfd5a6ebe42c60ac16c6c2434", size = 249185, upload-time = "2025-11-18T13:33:42.086Z" }, + { url = "https://files.pythonhosted.org/packages/0e/a7/967f93bb66e82c9113c66a8d0b65ecf72fc865adfba5a145f50c7af7e58d/coverage-7.12.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d6c2e26b481c9159c2773a37947a9718cfdc58893029cdfb177531793e375cfc", size = 251025, upload-time = "2025-11-18T13:33:43.634Z" }, + { url = "https://files.pythonhosted.org/packages/b9/b2/f2f6f56337bc1af465d5b2dc1ee7ee2141b8b9272f3bf6213fcbc309a836/coverage-7.12.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:6e1a8c066dabcde56d5d9fed6a66bc19a2883a3fe051f0c397a41fc42aedd4cc", size = 248979, upload-time = "2025-11-18T13:33:46.04Z" }, + { url = "https://files.pythonhosted.org/packages/f4/7a/bf4209f45a4aec09d10a01a57313a46c0e0e8f4c55ff2965467d41a92036/coverage-7.12.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:f7ba9da4726e446d8dd8aae5a6cd872511184a5d861de80a86ef970b5dacce3e", size = 248800, upload-time = "2025-11-18T13:33:47.546Z" }, + { url = "https://files.pythonhosted.org/packages/b8/b7/1e01b8696fb0521810f60c5bbebf699100d6754183e6cc0679bf2ed76531/coverage-7.12.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e0f483ab4f749039894abaf80c2f9e7ed77bbf3c737517fb88c8e8e305896a17", size = 250460, upload-time = "2025-11-18T13:33:49.537Z" }, + { url = "https://files.pythonhosted.org/packages/71/ae/84324fb9cb46c024760e706353d9b771a81b398d117d8c1fe010391c186f/coverage-7.12.0-cp314-cp314-win32.whl", hash = "sha256:76336c19a9ef4a94b2f8dc79f8ac2da3f193f625bb5d6f51a328cd19bfc19933", size = 220533, upload-time = "2025-11-18T13:33:51.16Z" }, + { url = "https://files.pythonhosted.org/packages/e2/71/1033629deb8460a8f97f83e6ac4ca3b93952e2b6f826056684df8275e015/coverage-7.12.0-cp314-cp314-win_amd64.whl", hash = "sha256:7c1059b600aec6ef090721f8f633f60ed70afaffe8ecab85b59df748f24b31fe", size = 221348, upload-time = "2025-11-18T13:33:52.776Z" }, + { url = "https://files.pythonhosted.org/packages/0a/5f/ac8107a902f623b0c251abdb749be282dc2ab61854a8a4fcf49e276fce2f/coverage-7.12.0-cp314-cp314-win_arm64.whl", hash = "sha256:172cf3a34bfef42611963e2b661302a8931f44df31629e5b1050567d6b90287d", size = 219922, upload-time = "2025-11-18T13:33:54.316Z" }, + { url = "https://files.pythonhosted.org/packages/79/6e/f27af2d4da367f16077d21ef6fe796c874408219fa6dd3f3efe7751bd910/coverage-7.12.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:aa7d48520a32cb21c7a9b31f81799e8eaec7239db36c3b670be0fa2403828d1d", size = 218511, upload-time = "2025-11-18T13:33:56.343Z" }, + { url = "https://files.pythonhosted.org/packages/67/dd/65fd874aa460c30da78f9d259400d8e6a4ef457d61ab052fd248f0050558/coverage-7.12.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:90d58ac63bc85e0fb919f14d09d6caa63f35a5512a2205284b7816cafd21bb03", size = 218771, upload-time = "2025-11-18T13:33:57.966Z" }, + { url = "https://files.pythonhosted.org/packages/55/e0/7c6b71d327d8068cb79c05f8f45bf1b6145f7a0de23bbebe63578fe5240a/coverage-7.12.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ca8ecfa283764fdda3eae1bdb6afe58bf78c2c3ec2b2edcb05a671f0bba7b3f9", size = 260151, upload-time = "2025-11-18T13:33:59.597Z" }, + { url = "https://files.pythonhosted.org/packages/49/ce/4697457d58285b7200de6b46d606ea71066c6e674571a946a6ea908fb588/coverage-7.12.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:874fe69a0785d96bd066059cd4368022cebbec1a8958f224f0016979183916e6", size = 262257, upload-time = "2025-11-18T13:34:01.166Z" }, + { url = "https://files.pythonhosted.org/packages/2f/33/acbc6e447aee4ceba88c15528dbe04a35fb4d67b59d393d2e0d6f1e242c1/coverage-7.12.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5b3c889c0b8b283a24d721a9eabc8ccafcfc3aebf167e4cd0d0e23bf8ec4e339", size = 264671, upload-time = "2025-11-18T13:34:02.795Z" }, + { url = "https://files.pythonhosted.org/packages/87/ec/e2822a795c1ed44d569980097be839c5e734d4c0c1119ef8e0a073496a30/coverage-7.12.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8bb5b894b3ec09dcd6d3743229dc7f2c42ef7787dc40596ae04c0edda487371e", size = 259231, upload-time = "2025-11-18T13:34:04.397Z" }, + { url = "https://files.pythonhosted.org/packages/72/c5/a7ec5395bb4a49c9b7ad97e63f0c92f6bf4a9e006b1393555a02dae75f16/coverage-7.12.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:79a44421cd5fba96aa57b5e3b5a4d3274c449d4c622e8f76882d76635501fd13", size = 262137, upload-time = "2025-11-18T13:34:06.068Z" }, + { url = "https://files.pythonhosted.org/packages/67/0c/02c08858b764129f4ecb8e316684272972e60777ae986f3865b10940bdd6/coverage-7.12.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:33baadc0efd5c7294f436a632566ccc1f72c867f82833eb59820ee37dc811c6f", size = 259745, upload-time = "2025-11-18T13:34:08.04Z" }, + { url = "https://files.pythonhosted.org/packages/5a/04/4fd32b7084505f3829a8fe45c1a74a7a728cb251aaadbe3bec04abcef06d/coverage-7.12.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:c406a71f544800ef7e9e0000af706b88465f3573ae8b8de37e5f96c59f689ad1", size = 258570, upload-time = "2025-11-18T13:34:09.676Z" }, + { url = "https://files.pythonhosted.org/packages/48/35/2365e37c90df4f5342c4fa202223744119fe31264ee2924f09f074ea9b6d/coverage-7.12.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e71bba6a40883b00c6d571599b4627f50c360b3d0d02bfc658168936be74027b", size = 260899, upload-time = "2025-11-18T13:34:11.259Z" }, + { url = "https://files.pythonhosted.org/packages/05/56/26ab0464ca733fa325e8e71455c58c1c374ce30f7c04cebb88eabb037b18/coverage-7.12.0-cp314-cp314t-win32.whl", hash = "sha256:9157a5e233c40ce6613dead4c131a006adfda70e557b6856b97aceed01b0e27a", size = 221313, upload-time = "2025-11-18T13:34:12.863Z" }, + { url = "https://files.pythonhosted.org/packages/da/1c/017a3e1113ed34d998b27d2c6dba08a9e7cb97d362f0ec988fcd873dcf81/coverage-7.12.0-cp314-cp314t-win_amd64.whl", hash = "sha256:e84da3a0fd233aeec797b981c51af1cabac74f9bd67be42458365b30d11b5291", size = 222423, upload-time = "2025-11-18T13:34:15.14Z" }, + { url = "https://files.pythonhosted.org/packages/4c/36/bcc504fdd5169301b52568802bb1b9cdde2e27a01d39fbb3b4b508ab7c2c/coverage-7.12.0-cp314-cp314t-win_arm64.whl", hash = "sha256:01d24af36fedda51c2b1aca56e4330a3710f83b02a5ff3743a6b015ffa7c9384", size = 220459, upload-time = "2025-11-18T13:34:17.222Z" }, + { url = "https://files.pythonhosted.org/packages/ce/a3/43b749004e3c09452e39bb56347a008f0a0668aad37324a99b5c8ca91d9e/coverage-7.12.0-py3-none-any.whl", hash = "sha256:159d50c0b12e060b15ed3d39f87ed43d4f7f7ad40b8a534f4dd331adbb51104a", size = 209503, upload-time = "2025-11-18T13:34:18.892Z" }, ] [[package]] @@ -565,14 +584,14 @@ wheels = [ [[package]] name = "deprecated" -version = "1.2.18" +version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/98/97/06afe62762c9a8a86af0cfb7bfdab22a43ad17138b07af5b1a58442690a2/deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d", size = 2928744, upload-time = "2025-01-27T10:46:25.7Z" } +sdist = { url = "https://files.pythonhosted.org/packages/49/85/12f0a49a7c4ffb70572b6c2ef13c90c88fd190debda93b23f026b25f9634/deprecated-1.3.1.tar.gz", hash = "sha256:b1b50e0ff0c1fddaa5708a2c6b0a6588bb09b892825ab2b214ac9ea9d92a5223", size = 2932523, upload-time = "2025-10-30T08:19:02.757Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6e/c6/ac0b6c1e2d138f1002bcf799d330bd6d85084fece321e662a14223794041/Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec", size = 9998, upload-time = "2025-01-27T10:46:09.186Z" }, + { url = "https://files.pythonhosted.org/packages/84/d0/205d54408c08b13550c733c4b85429e7ead111c7f0014309637425520a9a/deprecated-1.3.1-py2.py3-none-any.whl", hash = "sha256:597bfef186b6f60181535a29fbe44865ce137a5079f295b479886c82729d5f3f", size = 11298, upload-time = "2025-10-30T08:19:00.758Z" }, ] [[package]] @@ -655,14 +674,14 @@ wheels = [ [[package]] name = "griffe" -version = "1.14.0" +version = "1.15.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ec/d7/6c09dd7ce4c7837e4cdb11dce980cb45ae3cd87677298dc3b781b6bce7d3/griffe-1.14.0.tar.gz", hash = "sha256:9d2a15c1eca966d68e00517de5d69dd1bc5c9f2335ef6c1775362ba5b8651a13", size = 424684, upload-time = "2025-09-05T15:02:29.167Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0d/0c/3a471b6e31951dce2360477420d0a8d1e00dea6cf33b70f3e8c3ab6e28e1/griffe-1.15.0.tar.gz", hash = "sha256:7726e3afd6f298fbc3696e67958803e7ac843c1cfe59734b6251a40cdbfb5eea", size = 424112, upload-time = "2025-11-10T15:03:15.52Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/b1/9ff6578d789a89812ff21e4e0f80ffae20a65d5dd84e7a17873fe3b365be/griffe-1.14.0-py3-none-any.whl", hash = "sha256:0e9d52832cccf0f7188cfe585ba962d2674b241c01916d780925df34873bceb0", size = 144439, upload-time = "2025-09-05T15:02:27.511Z" }, + { url = "https://files.pythonhosted.org/packages/9c/83/3b1d03d36f224edded98e9affd0467630fc09d766c0e56fb1498cbb04a9b/griffe-1.15.0-py3-none-any.whl", hash = "sha256:6f6762661949411031f5fcda9593f586e6ce8340f0ba88921a0f2ef7a81eb9a3", size = 150705, upload-time = "2025-11-10T15:03:13.549Z" }, ] [[package]] @@ -765,7 +784,7 @@ wheels = [ [[package]] name = "ipykernel" -version = "7.0.1" +version = "7.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "appnope", marker = "sys_platform == 'darwin'" }, @@ -782,14 +801,14 @@ dependencies = [ { name = "tornado" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a8/4c/9f0024c8457286c6bfd5405a15d650ec5ea36f420ef9bbc58b301f66cfc5/ipykernel-7.0.1.tar.gz", hash = "sha256:2d3fd7cdef22071c2abbad78f142b743228c5d59cd470d034871ae0ac359533c", size = 171460, upload-time = "2025-10-14T16:17:07.325Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/a4/4948be6eb88628505b83a1f2f40d90254cab66abf2043b3c40fa07dfce0f/ipykernel-7.1.0.tar.gz", hash = "sha256:58a3fc88533d5930c3546dc7eac66c6d288acde4f801e2001e65edc5dc9cf0db", size = 174579, upload-time = "2025-10-27T09:46:39.471Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b8/f7/761037905ffdec673533bfa43af8d4c31c859c778dfc3bbb71899875ec18/ipykernel-7.0.1-py3-none-any.whl", hash = "sha256:87182a8305e28954b6721087dec45b171712610111d494c17bb607befa1c4000", size = 118157, upload-time = "2025-10-14T16:17:05.606Z" }, + { url = "https://files.pythonhosted.org/packages/a3/17/20c2552266728ceba271967b87919664ecc0e33efca29c3efc6baf88c5f9/ipykernel-7.1.0-py3-none-any.whl", hash = "sha256:763b5ec6c5b7776f6a8d7ce09b267693b4e5ce75cb50ae696aaefb3c85e1ea4c", size = 117968, upload-time = "2025-10-27T09:46:37.805Z" }, ] [[package]] name = "ipython" -version = "9.6.0" +version = "9.7.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, @@ -803,9 +822,9 @@ dependencies = [ { name = "stack-data" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2a/34/29b18c62e39ee2f7a6a3bba7efd952729d8aadd45ca17efc34453b717665/ipython-9.6.0.tar.gz", hash = "sha256:5603d6d5d356378be5043e69441a072b50a5b33b4503428c77b04cb8ce7bc731", size = 4396932, upload-time = "2025-09-29T10:55:53.948Z" } +sdist = { url = "https://files.pythonhosted.org/packages/29/e6/48c74d54039241a456add616464ea28c6ebf782e4110d419411b83dae06f/ipython-9.7.0.tar.gz", hash = "sha256:5f6de88c905a566c6a9d6c400a8fed54a638e1f7543d17aae2551133216b1e4e", size = 4422115, upload-time = "2025-11-05T12:18:54.646Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/48/c5/d5e07995077e48220269c28a221e168c91123ad5ceee44d548f54a057fc0/ipython-9.6.0-py3-none-any.whl", hash = "sha256:5f77efafc886d2f023442479b8149e7d86547ad0a979e9da9f045d252f648196", size = 616170, upload-time = "2025-09-29T10:55:47.676Z" }, + { url = "https://files.pythonhosted.org/packages/05/aa/62893d6a591d337aa59dcc4c6f6c842f1fe20cd72c8c5c1f980255243252/ipython-9.7.0-py3-none-any.whl", hash = "sha256:bce8ac85eb9521adc94e1845b4c03d88365fd6ac2f4908ec4ed1eb1b0a065f9f", size = 618911, upload-time = "2025-11-05T12:18:52.484Z" }, ] [[package]] @@ -822,7 +841,7 @@ wheels = [ [[package]] name = "ipywidgets" -version = "8.1.7" +version = "8.1.8" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "comm" }, @@ -831,9 +850,9 @@ dependencies = [ { name = "traitlets" }, { name = "widgetsnbextension" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3e/48/d3dbac45c2814cb73812f98dd6b38bbcc957a4e7bb31d6ea9c03bf94ed87/ipywidgets-8.1.7.tar.gz", hash = "sha256:15f1ac050b9ccbefd45dccfbb2ef6bed0029d8278682d569d71b8dd96bee0376", size = 116721, upload-time = "2025-05-05T12:42:03.489Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/ae/c5ce1edc1afe042eadb445e95b0671b03cee61895264357956e61c0d2ac0/ipywidgets-8.1.8.tar.gz", hash = "sha256:61f969306b95f85fba6b6986b7fe45d73124d1d9e3023a8068710d47a22ea668", size = 116739, upload-time = "2025-11-01T21:18:12.393Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/58/6a/9166369a2f092bd286d24e6307de555d63616e8ddb373ebad2b5635ca4cd/ipywidgets-8.1.7-py3-none-any.whl", hash = "sha256:764f2602d25471c213919b8a1997df04bef869251db4ca8efba1b76b1bd9f7bb", size = 139806, upload-time = "2025-05-05T12:41:56.833Z" }, + { url = "https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl", hash = "sha256:ecaca67aed704a338f88f67b1181b58f821ab5dc89c1f0f5ef99db43c1c2921e", size = 139808, upload-time = "2025-11-01T21:18:10.956Z" }, ] [[package]] @@ -1079,7 +1098,7 @@ wheels = [ [[package]] name = "jupyterlab" -version = "4.4.10" +version = "4.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "async-lru" }, @@ -1096,9 +1115,9 @@ dependencies = [ { name = "tornado" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6a/5d/75c42a48ff5fc826a7dff3fe4004cda47c54f9d981c351efacfbc9139d3c/jupyterlab-4.4.10.tar.gz", hash = "sha256:521c017508af4e1d6d9d8a9d90f47a11c61197ad63b2178342489de42540a615", size = 22969303, upload-time = "2025-10-22T14:50:58.768Z" } +sdist = { url = "https://files.pythonhosted.org/packages/df/e5/4fa382a796a6d8e2cd867816b64f1ff27f906e43a7a83ad9eb389e448cd8/jupyterlab-4.5.0.tar.gz", hash = "sha256:aec33d6d8f1225b495ee2cf20f0514f45e6df8e360bdd7ac9bace0b7ac5177ea", size = 23989880, upload-time = "2025-11-18T13:19:00.365Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/46/1eaa5db8d54a594bdade67afbcae42e9a2da676628be3eb39f36dcff6390/jupyterlab-4.4.10-py3-none-any.whl", hash = "sha256:65939ab4c8dcd0c42185c2d0d1a9d60b254dc8c46fc4fdb286b63c51e9358e07", size = 12293385, upload-time = "2025-10-22T14:50:54.075Z" }, + { url = "https://files.pythonhosted.org/packages/6c/1e/5a4d5498eba382fee667ed797cf64ae5d1b13b04356df62f067f48bb0f61/jupyterlab-4.5.0-py3-none-any.whl", hash = "sha256:88e157c75c1afff64c7dc4b801ec471450b922a4eae4305211ddd40da8201c8a", size = 12380641, upload-time = "2025-11-18T13:18:56.252Z" }, ] [[package]] @@ -1130,20 +1149,20 @@ wheels = [ [[package]] name = "jupyterlab-widgets" -version = "3.0.15" +version = "3.0.16" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b9/7d/160595ca88ee87ac6ba95d82177d29ec60aaa63821d3077babb22ce031a5/jupyterlab_widgets-3.0.15.tar.gz", hash = "sha256:2920888a0c2922351a9202817957a68c07d99673504d6cd37345299e971bb08b", size = 213149, upload-time = "2025-05-05T12:32:31.004Z" } +sdist = { url = "https://files.pythonhosted.org/packages/26/2d/ef58fed122b268c69c0aa099da20bc67657cdfb2e222688d5731bd5b971d/jupyterlab_widgets-3.0.16.tar.gz", hash = "sha256:423da05071d55cf27a9e602216d35a3a65a3e41cdf9c5d3b643b814ce38c19e0", size = 897423, upload-time = "2025-11-01T21:11:29.724Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/43/6a/ca128561b22b60bd5a0c4ea26649e68c8556b82bc70a0c396eebc977fe86/jupyterlab_widgets-3.0.15-py3-none-any.whl", hash = "sha256:d59023d7d7ef71400d51e6fee9a88867f6e65e10a4201605d2d7f3e8f012a31c", size = 216571, upload-time = "2025-05-05T12:32:29.534Z" }, + { url = "https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl", hash = "sha256:45fa36d9c6422cf2559198e4db481aa243c7a32d9926b500781c830c80f7ecf8", size = 914926, upload-time = "2025-11-01T21:11:28.008Z" }, ] [[package]] name = "lark" -version = "1.3.0" +version = "1.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1d/37/a13baf0135f348af608c667633cbe5d13aa2c5c15a56ae9ad3e6cba45ae3/lark-1.3.0.tar.gz", hash = "sha256:9a3839d0ca5e1faf7cfa3460e420e859b66bcbde05b634e73c369c8244c5fa48", size = 259551, upload-time = "2025-09-22T13:45:05.072Z" } +sdist = { url = "https://files.pythonhosted.org/packages/da/34/28fff3ab31ccff1fd4f6c7c7b0ceb2b6968d8ea4950663eadcb5720591a0/lark-1.3.1.tar.gz", hash = "sha256:b426a7a6d6d53189d318f2b6236ab5d6429eaf09259f1ca33eb716eed10d2905", size = 382732, upload-time = "2025-10-27T18:25:56.653Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/3e/1c6b43277de64fc3c0333b0e72ab7b52ddaaea205210d60d9b9f83c3d0c7/lark-1.3.0-py3-none-any.whl", hash = "sha256:80661f261fb2584a9828a097a2432efd575af27d20be0fd35d17f0fe37253831", size = 113002, upload-time = "2025-09-22T13:45:03.747Z" }, + { url = "https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl", hash = "sha256:c629b661023a014c37da873b4ff58a817398d12635d3bbb2c5a03be7fe5d1e12", size = 113151, upload-time = "2025-10-27T18:25:54.882Z" }, ] [[package]] @@ -1223,14 +1242,14 @@ wheels = [ [[package]] name = "matplotlib-inline" -version = "0.1.7" +version = "0.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159, upload-time = "2024-04-15T13:44:44.803Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/74/97e72a36efd4ae2bccb3463284300f8953f199b5ffbc04cbbb0ec78f74b1/matplotlib_inline-0.2.1.tar.gz", hash = "sha256:e1ee949c340d771fc39e241ea75683deb94762c8fa5f2927ec57c83c4dffa9fe", size = 8110, upload-time = "2025-10-23T09:00:22.126Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899, upload-time = "2024-04-15T13:44:43.265Z" }, + { url = "https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl", hash = "sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76", size = 9516, upload-time = "2025-10-23T09:00:20.675Z" }, ] [[package]] @@ -1385,7 +1404,7 @@ wheels = [ [[package]] name = "notebook" -version = "7.4.7" +version = "7.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jupyter-server" }, @@ -1394,9 +1413,9 @@ dependencies = [ { name = "notebook-shim" }, { name = "tornado" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/04/09/f6f64ba156842ef68d3ea763fa171a2f7e7224f200a15dd4af5b83c34756/notebook-7.4.7.tar.gz", hash = "sha256:3f0a04027dfcee8a876de48fba13ab77ec8c12f72f848a222ed7f5081b9e342a", size = 13937702, upload-time = "2025-09-27T08:00:22.536Z" } +sdist = { url = "https://files.pythonhosted.org/packages/89/ac/a97041621250a4fc5af379fb377942841eea2ca146aab166b8fcdfba96c2/notebook-7.5.0.tar.gz", hash = "sha256:3b27eaf9913033c28dde92d02139414c608992e1df4b969c843219acf2ff95e4", size = 14052074, upload-time = "2025-11-19T08:36:20.093Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6c/d7/06d13087e20388926e7423d2489e728d2e59f2453039cdb0574a7c070e76/notebook-7.4.7-py3-none-any.whl", hash = "sha256:362b7c95527f7dd3c4c84d410b782872fd9c734fb2524c11dd92758527b6eda6", size = 14342894, upload-time = "2025-09-27T08:00:18.496Z" }, + { url = "https://files.pythonhosted.org/packages/73/96/00df2a4760f10f5af0f45c4955573cae6189931f9a30265a35865f8c1031/notebook-7.5.0-py3-none-any.whl", hash = "sha256:3300262d52905ca271bd50b22617681d95f08a8360d099e097726e6d2efb5811", size = 14460968, upload-time = "2025-11-19T08:36:15.869Z" }, ] [[package]] @@ -1548,47 +1567,47 @@ wheels = [ [[package]] name = "plum-dispatch" -version = "2.5.8" +version = "2.6.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "beartype" }, { name = "rich" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a5/d7/2a2b418dd0a48400fd9a63df0a8e82de05a3642610675e8bd2870909685f/plum_dispatch-2.5.8.tar.gz", hash = "sha256:b1cc091873b94ec0075bbf9ccc91edce2f2bbad3cac4328eb8626284a50aef76", size = 35240, upload-time = "2025-10-07T17:54:24.462Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9b/49/1da3299aceee66bb48e8f89b85d4a5af95ac863df39c2c295a1a238c91fc/plum_dispatch-2.6.0.tar.gz", hash = "sha256:09367134541a05f965e3f58c191f4f45b91ef1d87613835171790617bb87ce6d", size = 35394, upload-time = "2025-10-28T13:05:58.358Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/c1/8ccc8ba81154fb9c29c62032a1aa5e2f56045d1446a4605a249daf433974/plum_dispatch-2.5.8-py3-none-any.whl", hash = "sha256:02c6561718e83b5599c863d8c2bb4a64d8e852ac84ec09e49043145c3f48313a", size = 42061, upload-time = "2025-10-07T17:54:22.953Z" }, + { url = "https://files.pythonhosted.org/packages/4f/6a/f435b9d12f34e03548949a51c7475775feda4c3e5b5373e180d70fd7fbe4/plum_dispatch-2.6.0-py3-none-any.whl", hash = "sha256:8e9b8f20c5119f944720fa5b93f84338a9f604329f016a5132e419e4894cddf1", size = 42251, upload-time = "2025-10-28T13:05:56.874Z" }, ] [[package]] name = "polars" -version = "1.35.1" +version = "1.35.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "polars-runtime-32" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9b/5b/3caad788d93304026cbf0ab4c37f8402058b64a2f153b9c62f8b30f5d2ee/polars-1.35.1.tar.gz", hash = "sha256:06548e6d554580151d6ca7452d74bceeec4640b5b9261836889b8e68cfd7a62e", size = 694881, upload-time = "2025-10-30T12:12:52.294Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fa/43/09d4738aa24394751cb7e5d1fc4b5ef461d796efcadd9d00c79578332063/polars-1.35.2.tar.gz", hash = "sha256:ae458b05ca6e7ca2c089342c70793f92f1103c502dc1b14b56f0a04f2cc1d205", size = 694895, upload-time = "2025-11-09T13:20:05.921Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/4c/21a227b722534404241c2a76beceb7463469d50c775a227fc5c209eb8adc/polars-1.35.1-py3-none-any.whl", hash = "sha256:c29a933f28aa330d96a633adbd79aa5e6a6247a802a720eead9933f4613bdbf4", size = 783598, upload-time = "2025-10-30T12:11:54.668Z" }, + { url = "https://files.pythonhosted.org/packages/b4/9a/24e4b890c7ee4358964aa92c4d1865df0e8831f7df6abaa3a39914521724/polars-1.35.2-py3-none-any.whl", hash = "sha256:5e8057c8289ac148c793478323b726faea933d9776bd6b8a554b0ab7c03db87e", size = 783597, upload-time = "2025-11-09T13:18:51.361Z" }, ] [[package]] name = "polars-runtime-32" -version = "1.35.1" +version = "1.35.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/df/3e/19c252e8eb4096300c1a36ec3e50a27e5fa9a1ccaf32d3927793c16abaee/polars_runtime_32-1.35.1.tar.gz", hash = "sha256:f6b4ec9cd58b31c87af1b8c110c9c986d82345f1d50d7f7595b5d447a19dc365", size = 2696218, upload-time = "2025-10-30T12:12:53.479Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cb/75/ac1256ace28c832a0997b20ba9d10a9d3739bd4d457c1eb1e7d196b6f88b/polars_runtime_32-1.35.2.tar.gz", hash = "sha256:6e6e35733ec52abe54b7d30d245e6586b027d433315d20edfb4a5d162c79fe90", size = 2694387, upload-time = "2025-11-09T13:20:07.624Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/08/2c/da339459805a26105e9d9c2f07e43ca5b8baeee55acd5457e6881487a79a/polars_runtime_32-1.35.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:6f051a42f6ae2f26e3bc2cf1f170f2120602976e2a3ffb6cfba742eecc7cc620", size = 40525100, upload-time = "2025-10-30T12:11:58.098Z" }, - { url = "https://files.pythonhosted.org/packages/27/70/a0733568b3533481924d2ce68b279ab3d7334e5fa6ed259f671f650b7c5e/polars_runtime_32-1.35.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:c2232f9cf05ba59efc72d940b86c033d41fd2d70bf2742e8115ed7112a766aa9", size = 36701908, upload-time = "2025-10-30T12:12:02.166Z" }, - { url = "https://files.pythonhosted.org/packages/46/54/6c09137bef9da72fd891ba58c2962cc7c6c5cad4649c0e668d6b344a9d7b/polars_runtime_32-1.35.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42f9837348557fd674477ea40a6ac8a7e839674f6dd0a199df24be91b026024c", size = 41317692, upload-time = "2025-10-30T12:12:04.928Z" }, - { url = "https://files.pythonhosted.org/packages/22/55/81c5b266a947c339edd7fbaa9e1d9614012d02418453f48b76cc177d3dd9/polars_runtime_32-1.35.1-cp39-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:c873aeb36fed182d5ebc35ca17c7eb193fe83ae2ea551ee8523ec34776731390", size = 37853058, upload-time = "2025-10-30T12:12:08.342Z" }, - { url = "https://files.pythonhosted.org/packages/6c/58/be8b034d559eac515f52408fd6537be9bea095bc0388946a4e38910d3d50/polars_runtime_32-1.35.1-cp39-abi3-win_amd64.whl", hash = "sha256:35cde9453ca7032933f0e58e9ed4388f5a1e415dd0db2dd1e442c81d815e630c", size = 41289554, upload-time = "2025-10-30T12:12:11.104Z" }, - { url = "https://files.pythonhosted.org/packages/f4/7f/e0111b9e2a1169ea82cde3ded9c92683e93c26dfccd72aee727996a1ac5b/polars_runtime_32-1.35.1-cp39-abi3-win_arm64.whl", hash = "sha256:fd77757a6c9eb9865c4bfb7b07e22225207c6b7da382bd0b9bd47732f637105d", size = 36958878, upload-time = "2025-10-30T12:12:15.206Z" }, + { url = "https://files.pythonhosted.org/packages/66/de/a532b81e68e636483a5dd764d72e106215543f3ef49a142272b277ada8fe/polars_runtime_32-1.35.2-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:e465d12a29e8df06ea78947e50bd361cdf77535cd904fd562666a8a9374e7e3a", size = 40524507, upload-time = "2025-11-09T13:18:55.727Z" }, + { url = "https://files.pythonhosted.org/packages/2d/0b/679751ea6aeaa7b3e33a70ba17f9c8150310792583f3ecf9bb1ce15fe15c/polars_runtime_32-1.35.2-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:ef2b029b78f64fb53f126654c0bfa654045c7546bd0de3009d08bd52d660e8cc", size = 36700154, upload-time = "2025-11-09T13:18:59.78Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c8/fd9f48dd6b89ae9cff53d896b51d08579ef9c739e46ea87a647b376c8ca2/polars_runtime_32-1.35.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85dda0994b5dff7f456bb2f4bbd22be9a9e5c5e28670e23fedb13601ec99a46d", size = 41317788, upload-time = "2025-11-09T13:19:03.949Z" }, + { url = "https://files.pythonhosted.org/packages/67/89/e09d9897a70b607e22a36c9eae85a5b829581108fd1e3d4292e5c0f52939/polars_runtime_32-1.35.2-cp39-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:3b9006902fc51b768ff747c0f74bd4ce04005ee8aeb290ce9c07ce1cbe1b58a9", size = 37850590, upload-time = "2025-11-09T13:19:08.154Z" }, + { url = "https://files.pythonhosted.org/packages/dc/40/96a808ca5cc8707894e196315227f04a0c82136b7fb25570bc51ea33b88d/polars_runtime_32-1.35.2-cp39-abi3-win_amd64.whl", hash = "sha256:ddc015fac39735592e2e7c834c02193ba4d257bb4c8c7478b9ebe440b0756b84", size = 41290019, upload-time = "2025-11-09T13:19:12.214Z" }, + { url = "https://files.pythonhosted.org/packages/f4/d1/8d1b28d007da43c750367c8bf5cb0f22758c16b1104b2b73b9acadb2d17a/polars_runtime_32-1.35.2-cp39-abi3-win_arm64.whl", hash = "sha256:6861145aa321a44eda7cc6694fb7751cb7aa0f21026df51b5faa52e64f9dc39b", size = 36955684, upload-time = "2025-11-09T13:19:15.666Z" }, ] [[package]] name = "pre-commit" -version = "4.3.0" +version = "4.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cfgv" }, @@ -1597,9 +1616,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/a6/49/7845c2d7bf6474efd8e27905b51b11e6ce411708c91e829b93f324de9929/pre_commit-4.4.0.tar.gz", hash = "sha256:f0233ebab440e9f17cabbb558706eb173d19ace965c68cdce2c081042b4fab15", size = 197501, upload-time = "2025-11-08T21:12:11.607Z" } 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/27/11/574fe7d13acf30bfd0a8dd7fa1647040f2b8064f13f43e8c963b1e65093b/pre_commit-4.4.0-py2.py3-none-any.whl", hash = "sha256:b35ea52957cbf83dcc5d8ee636cbead8624e3a15fbfa61a370e42158ac8a5813", size = 226049, upload-time = "2025-11-08T21:12:10.228Z" }, ] [[package]] @@ -1625,18 +1644,28 @@ wheels = [ [[package]] name = "psutil" -version = "7.1.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/89/fc/889242351a932d6183eec5df1fc6539b6f36b6a88444f1e63f18668253aa/psutil-7.1.1.tar.gz", hash = "sha256:092b6350145007389c1cfe5716050f02030a05219d90057ea867d18fe8d372fc", size = 487067, upload-time = "2025-10-19T15:43:59.373Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/51/30/f97f8fb1f9ecfbeae4b5ca738dcae66ab28323b5cfbc96cb5565f3754056/psutil-7.1.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:8fa59d7b1f01f0337f12cd10dbd76e4312a4d3c730a4fedcbdd4e5447a8b8460", size = 244221, upload-time = "2025-10-19T15:44:03.145Z" }, - { url = "https://files.pythonhosted.org/packages/7b/98/b8d1f61ebf35f4dbdbaabadf9208282d8adc820562f0257e5e6e79e67bf2/psutil-7.1.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:2a95104eae85d088891716db676f780c1404fc15d47fde48a46a5d61e8f5ad2c", size = 245660, upload-time = "2025-10-19T15:44:05.657Z" }, - { url = "https://files.pythonhosted.org/packages/f0/4a/b8015d7357fefdfe34bc4a3db48a107bae4bad0b94fb6eb0613f09a08ada/psutil-7.1.1-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:98629cd8567acefcc45afe2f4ba1e9290f579eacf490a917967decce4b74ee9b", size = 286963, upload-time = "2025-10-19T15:44:08.877Z" }, - { url = "https://files.pythonhosted.org/packages/3d/3c/b56076bb35303d0733fc47b110a1c9cce081a05ae2e886575a3587c1ee76/psutil-7.1.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92ebc58030fb054fa0f26c3206ef01c31c29d67aee1367e3483c16665c25c8d2", size = 290118, upload-time = "2025-10-19T15:44:11.897Z" }, - { url = "https://files.pythonhosted.org/packages/dc/af/c13d360c0adc6f6218bf9e2873480393d0f729c8dd0507d171f53061c0d3/psutil-7.1.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:146a704f224fb2ded2be3da5ac67fc32b9ea90c45b51676f9114a6ac45616967", size = 292587, upload-time = "2025-10-19T15:44:14.67Z" }, - { url = "https://files.pythonhosted.org/packages/90/2d/c933e7071ba60c7862813f2c7108ec4cf8304f1c79660efeefd0de982258/psutil-7.1.1-cp37-abi3-win32.whl", hash = "sha256:295c4025b5cd880f7445e4379e6826f7307e3d488947bf9834e865e7847dc5f7", size = 243772, upload-time = "2025-10-19T15:44:16.938Z" }, - { url = "https://files.pythonhosted.org/packages/be/f3/11fd213fff15427bc2853552138760c720fd65032d99edfb161910d04127/psutil-7.1.1-cp37-abi3-win_amd64.whl", hash = "sha256:9b4f17c5f65e44f69bd3a3406071a47b79df45cf2236d1f717970afcb526bcd3", size = 246936, upload-time = "2025-10-19T15:44:18.663Z" }, - { url = "https://files.pythonhosted.org/packages/0a/8d/8a9a45c8b655851f216c1d44f68e3533dc8d2c752ccd0f61f1aa73be4893/psutil-7.1.1-cp37-abi3-win_arm64.whl", hash = "sha256:5457cf741ca13da54624126cd5d333871b454ab133999a9a103fb097a7d7d21a", size = 243944, upload-time = "2025-10-19T15:44:20.666Z" }, +version = "7.1.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/88/bdd0a41e5857d5d703287598cbf08dad90aed56774ea52ae071bae9071b6/psutil-7.1.3.tar.gz", hash = "sha256:6c86281738d77335af7aec228328e944b30930899ea760ecf33a4dba66be5e74", size = 489059, upload-time = "2025-11-02T12:25:54.619Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/93/0c49e776b8734fef56ec9c5c57f923922f2cf0497d62e0f419465f28f3d0/psutil-7.1.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0005da714eee687b4b8decd3d6cc7c6db36215c9e74e5ad2264b90c3df7d92dc", size = 239751, upload-time = "2025-11-02T12:25:58.161Z" }, + { url = "https://files.pythonhosted.org/packages/6f/8d/b31e39c769e70780f007969815195a55c81a63efebdd4dbe9e7a113adb2f/psutil-7.1.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:19644c85dcb987e35eeeaefdc3915d059dac7bd1167cdcdbf27e0ce2df0c08c0", size = 240368, upload-time = "2025-11-02T12:26:00.491Z" }, + { url = "https://files.pythonhosted.org/packages/62/61/23fd4acc3c9eebbf6b6c78bcd89e5d020cfde4acf0a9233e9d4e3fa698b4/psutil-7.1.3-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95ef04cf2e5ba0ab9eaafc4a11eaae91b44f4ef5541acd2ee91d9108d00d59a7", size = 287134, upload-time = "2025-11-02T12:26:02.613Z" }, + { url = "https://files.pythonhosted.org/packages/30/1c/f921a009ea9ceb51aa355cb0cc118f68d354db36eae18174bab63affb3e6/psutil-7.1.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1068c303be3a72f8e18e412c5b2a8f6d31750fb152f9cb106b54090296c9d251", size = 289904, upload-time = "2025-11-02T12:26:05.207Z" }, + { url = "https://files.pythonhosted.org/packages/a6/82/62d68066e13e46a5116df187d319d1724b3f437ddd0f958756fc052677f4/psutil-7.1.3-cp313-cp313t-win_amd64.whl", hash = "sha256:18349c5c24b06ac5612c0428ec2a0331c26443d259e2a0144a9b24b4395b58fa", size = 249642, upload-time = "2025-11-02T12:26:07.447Z" }, + { url = "https://files.pythonhosted.org/packages/df/ad/c1cd5fe965c14a0392112f68362cfceb5230819dbb5b1888950d18a11d9f/psutil-7.1.3-cp313-cp313t-win_arm64.whl", hash = "sha256:c525ffa774fe4496282fb0b1187725793de3e7c6b29e41562733cae9ada151ee", size = 245518, upload-time = "2025-11-02T12:26:09.719Z" }, + { url = "https://files.pythonhosted.org/packages/2e/bb/6670bded3e3236eb4287c7bcdc167e9fae6e1e9286e437f7111caed2f909/psutil-7.1.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:b403da1df4d6d43973dc004d19cee3b848e998ae3154cc8097d139b77156c353", size = 239843, upload-time = "2025-11-02T12:26:11.968Z" }, + { url = "https://files.pythonhosted.org/packages/b8/66/853d50e75a38c9a7370ddbeefabdd3d3116b9c31ef94dc92c6729bc36bec/psutil-7.1.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ad81425efc5e75da3f39b3e636293360ad8d0b49bed7df824c79764fb4ba9b8b", size = 240369, upload-time = "2025-11-02T12:26:14.358Z" }, + { url = "https://files.pythonhosted.org/packages/41/bd/313aba97cb5bfb26916dc29cf0646cbe4dd6a89ca69e8c6edce654876d39/psutil-7.1.3-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f33a3702e167783a9213db10ad29650ebf383946e91bc77f28a5eb083496bc9", size = 288210, upload-time = "2025-11-02T12:26:16.699Z" }, + { url = "https://files.pythonhosted.org/packages/c2/fa/76e3c06e760927a0cfb5705eb38164254de34e9bd86db656d4dbaa228b04/psutil-7.1.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fac9cd332c67f4422504297889da5ab7e05fd11e3c4392140f7370f4208ded1f", size = 291182, upload-time = "2025-11-02T12:26:18.848Z" }, + { url = "https://files.pythonhosted.org/packages/0f/1d/5774a91607035ee5078b8fd747686ebec28a962f178712de100d00b78a32/psutil-7.1.3-cp314-cp314t-win_amd64.whl", hash = "sha256:3792983e23b69843aea49c8f5b8f115572c5ab64c153bada5270086a2123c7e7", size = 250466, upload-time = "2025-11-02T12:26:21.183Z" }, + { url = "https://files.pythonhosted.org/packages/00/ca/e426584bacb43a5cb1ac91fae1937f478cd8fbe5e4ff96574e698a2c77cd/psutil-7.1.3-cp314-cp314t-win_arm64.whl", hash = "sha256:31d77fcedb7529f27bb3a0472bea9334349f9a04160e8e6e5020f22c59893264", size = 245756, upload-time = "2025-11-02T12:26:23.148Z" }, + { url = "https://files.pythonhosted.org/packages/ef/94/46b9154a800253e7ecff5aaacdf8ebf43db99de4a2dfa18575b02548654e/psutil-7.1.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2bdbcd0e58ca14996a42adf3621a6244f1bb2e2e528886959c72cf1e326677ab", size = 238359, upload-time = "2025-11-02T12:26:25.284Z" }, + { url = "https://files.pythonhosted.org/packages/68/3a/9f93cff5c025029a36d9a92fef47220ab4692ee7f2be0fba9f92813d0cb8/psutil-7.1.3-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:bc31fa00f1fbc3c3802141eede66f3a2d51d89716a194bf2cd6fc68310a19880", size = 239171, upload-time = "2025-11-02T12:26:27.23Z" }, + { url = "https://files.pythonhosted.org/packages/ce/b1/5f49af514f76431ba4eea935b8ad3725cdeb397e9245ab919dbc1d1dc20f/psutil-7.1.3-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3bb428f9f05c1225a558f53e30ccbad9930b11c3fc206836242de1091d3e7dd3", size = 263261, upload-time = "2025-11-02T12:26:29.48Z" }, + { url = "https://files.pythonhosted.org/packages/e0/95/992c8816a74016eb095e73585d747e0a8ea21a061ed3689474fabb29a395/psutil-7.1.3-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56d974e02ca2c8eb4812c3f76c30e28836fffc311d55d979f1465c1feeb2b68b", size = 264635, upload-time = "2025-11-02T12:26:31.74Z" }, + { url = "https://files.pythonhosted.org/packages/55/4c/c3ed1a622b6ae2fd3c945a366e64eb35247a31e4db16cf5095e269e8eb3c/psutil-7.1.3-cp37-abi3-win_amd64.whl", hash = "sha256:f39c2c19fe824b47484b96f9692932248a54c43799a84282cfe58d05a6449efd", size = 247633, upload-time = "2025-11-02T12:26:33.887Z" }, + { url = "https://files.pythonhosted.org/packages/c9/ad/33b2ccec09bf96c2b2ef3f9a6f66baac8253d7565d8839e024a6b905d45d/psutil-7.1.3-cp37-abi3-win_arm64.whl", hash = "sha256:bd0d69cee829226a761e92f28140bec9a5ee9d5b4fb4b0cc589068dbfff559b1", size = 244608, upload-time = "2025-11-02T12:26:36.136Z" }, ] [[package]] @@ -1668,7 +1697,7 @@ wheels = [ [[package]] name = "pydantic" -version = "2.12.3" +version = "2.12.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, @@ -1676,76 +1705,80 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f3/1e/4f0a3233767010308f2fd6bd0814597e3f63f1dc98304a9112b8759df4ff/pydantic-2.12.3.tar.gz", hash = "sha256:1da1c82b0fc140bb0103bc1441ffe062154c8d38491189751ee00fd8ca65ce74", size = 819383, upload-time = "2025-10-17T15:04:21.222Z" } +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" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/6b/83661fa77dcefa195ad5f8cd9af3d1a7450fd57cc883ad04d65446ac2029/pydantic-2.12.3-py3-none-any.whl", hash = "sha256:6986454a854bc3bc6e5443e1369e06a3a456af9d339eda45510f517d9ea5c6bf", size = 462431, upload-time = "2025-10-17T15:04:19.346Z" }, + { 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" }, ] [[package]] name = "pydantic-core" -version = "2.41.4" +version = "2.41.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/df/18/d0944e8eaaa3efd0a91b0f1fc537d3be55ad35091b6a87638211ba691964/pydantic_core-2.41.4.tar.gz", hash = "sha256:70e47929a9d4a1905a67e4b687d5946026390568a8e952b92824118063cee4d5", size = 457557, upload-time = "2025-10-14T10:23:47.909Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/81/d3b3e95929c4369d30b2a66a91db63c8ed0a98381ae55a45da2cd1cc1288/pydantic_core-2.41.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ab06d77e053d660a6faaf04894446df7b0a7e7aba70c2797465a0a1af00fc887", size = 2099043, upload-time = "2025-10-14T10:20:28.561Z" }, - { url = "https://files.pythonhosted.org/packages/58/da/46fdac49e6717e3a94fc9201403e08d9d61aa7a770fab6190b8740749047/pydantic_core-2.41.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c53ff33e603a9c1179a9364b0a24694f183717b2e0da2b5ad43c316c956901b2", size = 1910699, upload-time = "2025-10-14T10:20:30.217Z" }, - { url = "https://files.pythonhosted.org/packages/1e/63/4d948f1b9dd8e991a5a98b77dd66c74641f5f2e5225fee37994b2e07d391/pydantic_core-2.41.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:304c54176af2c143bd181d82e77c15c41cbacea8872a2225dd37e6544dce9999", size = 1952121, upload-time = "2025-10-14T10:20:32.246Z" }, - { url = "https://files.pythonhosted.org/packages/b2/a7/e5fc60a6f781fc634ecaa9ecc3c20171d238794cef69ae0af79ac11b89d7/pydantic_core-2.41.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:025ba34a4cf4fb32f917d5d188ab5e702223d3ba603be4d8aca2f82bede432a4", size = 2041590, upload-time = "2025-10-14T10:20:34.332Z" }, - { url = "https://files.pythonhosted.org/packages/70/69/dce747b1d21d59e85af433428978a1893c6f8a7068fa2bb4a927fba7a5ff/pydantic_core-2.41.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b9f5f30c402ed58f90c70e12eff65547d3ab74685ffe8283c719e6bead8ef53f", size = 2219869, upload-time = "2025-10-14T10:20:35.965Z" }, - { url = "https://files.pythonhosted.org/packages/83/6a/c070e30e295403bf29c4df1cb781317b6a9bac7cd07b8d3acc94d501a63c/pydantic_core-2.41.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd96e5d15385d301733113bcaa324c8bcf111275b7675a9c6e88bfb19fc05e3b", size = 2345169, upload-time = "2025-10-14T10:20:37.627Z" }, - { url = "https://files.pythonhosted.org/packages/f0/83/06d001f8043c336baea7fd202a9ac7ad71f87e1c55d8112c50b745c40324/pydantic_core-2.41.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98f348cbb44fae6e9653c1055db7e29de67ea6a9ca03a5fa2c2e11a47cff0e47", size = 2070165, upload-time = "2025-10-14T10:20:39.246Z" }, - { url = "https://files.pythonhosted.org/packages/14/0a/e567c2883588dd12bcbc110232d892cf385356f7c8a9910311ac997ab715/pydantic_core-2.41.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec22626a2d14620a83ca583c6f5a4080fa3155282718b6055c2ea48d3ef35970", size = 2189067, upload-time = "2025-10-14T10:20:41.015Z" }, - { url = "https://files.pythonhosted.org/packages/f4/1d/3d9fca34273ba03c9b1c5289f7618bc4bd09c3ad2289b5420481aa051a99/pydantic_core-2.41.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3a95d4590b1f1a43bf33ca6d647b990a88f4a3824a8c4572c708f0b45a5290ed", size = 2132997, upload-time = "2025-10-14T10:20:43.106Z" }, - { url = "https://files.pythonhosted.org/packages/52/70/d702ef7a6cd41a8afc61f3554922b3ed8d19dd54c3bd4bdbfe332e610827/pydantic_core-2.41.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:f9672ab4d398e1b602feadcffcdd3af44d5f5e6ddc15bc7d15d376d47e8e19f8", size = 2307187, upload-time = "2025-10-14T10:20:44.849Z" }, - { url = "https://files.pythonhosted.org/packages/68/4c/c06be6e27545d08b802127914156f38d10ca287a9e8489342793de8aae3c/pydantic_core-2.41.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:84d8854db5f55fead3b579f04bda9a36461dab0730c5d570e1526483e7bb8431", size = 2305204, upload-time = "2025-10-14T10:20:46.781Z" }, - { url = "https://files.pythonhosted.org/packages/b0/e5/35ae4919bcd9f18603419e23c5eaf32750224a89d41a8df1a3704b69f77e/pydantic_core-2.41.4-cp312-cp312-win32.whl", hash = "sha256:9be1c01adb2ecc4e464392c36d17f97e9110fbbc906bcbe1c943b5b87a74aabd", size = 1972536, upload-time = "2025-10-14T10:20:48.39Z" }, - { url = "https://files.pythonhosted.org/packages/1e/c2/49c5bb6d2a49eb2ee3647a93e3dae7080c6409a8a7558b075027644e879c/pydantic_core-2.41.4-cp312-cp312-win_amd64.whl", hash = "sha256:d682cf1d22bab22a5be08539dca3d1593488a99998f9f412137bc323179067ff", size = 2031132, upload-time = "2025-10-14T10:20:50.421Z" }, - { url = "https://files.pythonhosted.org/packages/06/23/936343dbcba6eec93f73e95eb346810fc732f71ba27967b287b66f7b7097/pydantic_core-2.41.4-cp312-cp312-win_arm64.whl", hash = "sha256:833eebfd75a26d17470b58768c1834dfc90141b7afc6eb0429c21fc5a21dcfb8", size = 1969483, upload-time = "2025-10-14T10:20:52.35Z" }, - { url = "https://files.pythonhosted.org/packages/13/d0/c20adabd181a029a970738dfe23710b52a31f1258f591874fcdec7359845/pydantic_core-2.41.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:85e050ad9e5f6fe1004eec65c914332e52f429bc0ae12d6fa2092407a462c746", size = 2105688, upload-time = "2025-10-14T10:20:54.448Z" }, - { url = "https://files.pythonhosted.org/packages/00/b6/0ce5c03cec5ae94cca220dfecddc453c077d71363b98a4bbdb3c0b22c783/pydantic_core-2.41.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7393f1d64792763a48924ba31d1e44c2cfbc05e3b1c2c9abb4ceeadd912cced", size = 1910807, upload-time = "2025-10-14T10:20:56.115Z" }, - { url = "https://files.pythonhosted.org/packages/68/3e/800d3d02c8beb0b5c069c870cbb83799d085debf43499c897bb4b4aaff0d/pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94dab0940b0d1fb28bcab847adf887c66a27a40291eedf0b473be58761c9799a", size = 1956669, upload-time = "2025-10-14T10:20:57.874Z" }, - { url = "https://files.pythonhosted.org/packages/60/a4/24271cc71a17f64589be49ab8bd0751f6a0a03046c690df60989f2f95c2c/pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:de7c42f897e689ee6f9e93c4bec72b99ae3b32a2ade1c7e4798e690ff5246e02", size = 2051629, upload-time = "2025-10-14T10:21:00.006Z" }, - { url = "https://files.pythonhosted.org/packages/68/de/45af3ca2f175d91b96bfb62e1f2d2f1f9f3b14a734afe0bfeff079f78181/pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:664b3199193262277b8b3cd1e754fb07f2c6023289c815a1e1e8fb415cb247b1", size = 2224049, upload-time = "2025-10-14T10:21:01.801Z" }, - { url = "https://files.pythonhosted.org/packages/af/8f/ae4e1ff84672bf869d0a77af24fd78387850e9497753c432875066b5d622/pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d95b253b88f7d308b1c0b417c4624f44553ba4762816f94e6986819b9c273fb2", size = 2342409, upload-time = "2025-10-14T10:21:03.556Z" }, - { url = "https://files.pythonhosted.org/packages/18/62/273dd70b0026a085c7b74b000394e1ef95719ea579c76ea2f0cc8893736d/pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1351f5bbdbbabc689727cb91649a00cb9ee7203e0a6e54e9f5ba9e22e384b84", size = 2069635, upload-time = "2025-10-14T10:21:05.385Z" }, - { url = "https://files.pythonhosted.org/packages/30/03/cf485fff699b4cdaea469bc481719d3e49f023241b4abb656f8d422189fc/pydantic_core-2.41.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1affa4798520b148d7182da0615d648e752de4ab1a9566b7471bc803d88a062d", size = 2194284, upload-time = "2025-10-14T10:21:07.122Z" }, - { url = "https://files.pythonhosted.org/packages/f9/7e/c8e713db32405dfd97211f2fc0a15d6bf8adb7640f3d18544c1f39526619/pydantic_core-2.41.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7b74e18052fea4aa8dea2fb7dbc23d15439695da6cbe6cfc1b694af1115df09d", size = 2137566, upload-time = "2025-10-14T10:21:08.981Z" }, - { url = "https://files.pythonhosted.org/packages/04/f7/db71fd4cdccc8b75990f79ccafbbd66757e19f6d5ee724a6252414483fb4/pydantic_core-2.41.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:285b643d75c0e30abda9dc1077395624f314a37e3c09ca402d4015ef5979f1a2", size = 2316809, upload-time = "2025-10-14T10:21:10.805Z" }, - { url = "https://files.pythonhosted.org/packages/76/63/a54973ddb945f1bca56742b48b144d85c9fc22f819ddeb9f861c249d5464/pydantic_core-2.41.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:f52679ff4218d713b3b33f88c89ccbf3a5c2c12ba665fb80ccc4192b4608dbab", size = 2311119, upload-time = "2025-10-14T10:21:12.583Z" }, - { url = "https://files.pythonhosted.org/packages/f8/03/5d12891e93c19218af74843a27e32b94922195ded2386f7b55382f904d2f/pydantic_core-2.41.4-cp313-cp313-win32.whl", hash = "sha256:ecde6dedd6fff127c273c76821bb754d793be1024bc33314a120f83a3c69460c", size = 1981398, upload-time = "2025-10-14T10:21:14.584Z" }, - { url = "https://files.pythonhosted.org/packages/be/d8/fd0de71f39db91135b7a26996160de71c073d8635edfce8b3c3681be0d6d/pydantic_core-2.41.4-cp313-cp313-win_amd64.whl", hash = "sha256:d081a1f3800f05409ed868ebb2d74ac39dd0c1ff6c035b5162356d76030736d4", size = 2030735, upload-time = "2025-10-14T10:21:16.432Z" }, - { url = "https://files.pythonhosted.org/packages/72/86/c99921c1cf6650023c08bfab6fe2d7057a5142628ef7ccfa9921f2dda1d5/pydantic_core-2.41.4-cp313-cp313-win_arm64.whl", hash = "sha256:f8e49c9c364a7edcbe2a310f12733aad95b022495ef2a8d653f645e5d20c1564", size = 1973209, upload-time = "2025-10-14T10:21:18.213Z" }, - { url = "https://files.pythonhosted.org/packages/36/0d/b5706cacb70a8414396efdda3d72ae0542e050b591119e458e2490baf035/pydantic_core-2.41.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ed97fd56a561f5eb5706cebe94f1ad7c13b84d98312a05546f2ad036bafe87f4", size = 1877324, upload-time = "2025-10-14T10:21:20.363Z" }, - { url = "https://files.pythonhosted.org/packages/de/2d/cba1fa02cfdea72dfb3a9babb067c83b9dff0bbcb198368e000a6b756ea7/pydantic_core-2.41.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a870c307bf1ee91fc58a9a61338ff780d01bfae45922624816878dce784095d2", size = 1884515, upload-time = "2025-10-14T10:21:22.339Z" }, - { url = "https://files.pythonhosted.org/packages/07/ea/3df927c4384ed9b503c9cc2d076cf983b4f2adb0c754578dfb1245c51e46/pydantic_core-2.41.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d25e97bc1f5f8f7985bdc2335ef9e73843bb561eb1fa6831fdfc295c1c2061cf", size = 2042819, upload-time = "2025-10-14T10:21:26.683Z" }, - { url = "https://files.pythonhosted.org/packages/6a/ee/df8e871f07074250270a3b1b82aad4cd0026b588acd5d7d3eb2fcb1471a3/pydantic_core-2.41.4-cp313-cp313t-win_amd64.whl", hash = "sha256:d405d14bea042f166512add3091c1af40437c2e7f86988f3915fabd27b1e9cd2", size = 1995866, upload-time = "2025-10-14T10:21:28.951Z" }, - { url = "https://files.pythonhosted.org/packages/fc/de/b20f4ab954d6d399499c33ec4fafc46d9551e11dc1858fb7f5dca0748ceb/pydantic_core-2.41.4-cp313-cp313t-win_arm64.whl", hash = "sha256:19f3684868309db5263a11bace3c45d93f6f24afa2ffe75a647583df22a2ff89", size = 1970034, upload-time = "2025-10-14T10:21:30.869Z" }, - { url = "https://files.pythonhosted.org/packages/54/28/d3325da57d413b9819365546eb9a6e8b7cbd9373d9380efd5f74326143e6/pydantic_core-2.41.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:e9205d97ed08a82ebb9a307e92914bb30e18cdf6f6b12ca4bedadb1588a0bfe1", size = 2102022, upload-time = "2025-10-14T10:21:32.809Z" }, - { url = "https://files.pythonhosted.org/packages/9e/24/b58a1bc0d834bf1acc4361e61233ee217169a42efbdc15a60296e13ce438/pydantic_core-2.41.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:82df1f432b37d832709fbcc0e24394bba04a01b6ecf1ee87578145c19cde12ac", size = 1905495, upload-time = "2025-10-14T10:21:34.812Z" }, - { url = "https://files.pythonhosted.org/packages/fb/a4/71f759cc41b7043e8ecdaab81b985a9b6cad7cec077e0b92cff8b71ecf6b/pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3b4cc4539e055cfa39a3763c939f9d409eb40e85813257dcd761985a108554", size = 1956131, upload-time = "2025-10-14T10:21:36.924Z" }, - { url = "https://files.pythonhosted.org/packages/b0/64/1e79ac7aa51f1eec7c4cda8cbe456d5d09f05fdd68b32776d72168d54275/pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b1eb1754fce47c63d2ff57fdb88c351a6c0150995890088b33767a10218eaa4e", size = 2052236, upload-time = "2025-10-14T10:21:38.927Z" }, - { url = "https://files.pythonhosted.org/packages/e9/e3/a3ffc363bd4287b80f1d43dc1c28ba64831f8dfc237d6fec8f2661138d48/pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e6ab5ab30ef325b443f379ddb575a34969c333004fca5a1daa0133a6ffaad616", size = 2223573, upload-time = "2025-10-14T10:21:41.574Z" }, - { url = "https://files.pythonhosted.org/packages/28/27/78814089b4d2e684a9088ede3790763c64693c3d1408ddc0a248bc789126/pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:31a41030b1d9ca497634092b46481b937ff9397a86f9f51bd41c4767b6fc04af", size = 2342467, upload-time = "2025-10-14T10:21:44.018Z" }, - { url = "https://files.pythonhosted.org/packages/92/97/4de0e2a1159cb85ad737e03306717637842c88c7fd6d97973172fb183149/pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a44ac1738591472c3d020f61c6df1e4015180d6262ebd39bf2aeb52571b60f12", size = 2063754, upload-time = "2025-10-14T10:21:46.466Z" }, - { url = "https://files.pythonhosted.org/packages/0f/50/8cb90ce4b9efcf7ae78130afeb99fd1c86125ccdf9906ef64b9d42f37c25/pydantic_core-2.41.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d72f2b5e6e82ab8f94ea7d0d42f83c487dc159c5240d8f83beae684472864e2d", size = 2196754, upload-time = "2025-10-14T10:21:48.486Z" }, - { url = "https://files.pythonhosted.org/packages/34/3b/ccdc77af9cd5082723574a1cc1bcae7a6acacc829d7c0a06201f7886a109/pydantic_core-2.41.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:c4d1e854aaf044487d31143f541f7aafe7b482ae72a022c664b2de2e466ed0ad", size = 2137115, upload-time = "2025-10-14T10:21:50.63Z" }, - { url = "https://files.pythonhosted.org/packages/ca/ba/e7c7a02651a8f7c52dc2cff2b64a30c313e3b57c7d93703cecea76c09b71/pydantic_core-2.41.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b568af94267729d76e6ee5ececda4e283d07bbb28e8148bb17adad93d025d25a", size = 2317400, upload-time = "2025-10-14T10:21:52.959Z" }, - { url = "https://files.pythonhosted.org/packages/2c/ba/6c533a4ee8aec6b812c643c49bb3bd88d3f01e3cebe451bb85512d37f00f/pydantic_core-2.41.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:6d55fb8b1e8929b341cc313a81a26e0d48aa3b519c1dbaadec3a6a2b4fcad025", size = 2312070, upload-time = "2025-10-14T10:21:55.419Z" }, - { url = "https://files.pythonhosted.org/packages/22/ae/f10524fcc0ab8d7f96cf9a74c880243576fd3e72bd8ce4f81e43d22bcab7/pydantic_core-2.41.4-cp314-cp314-win32.whl", hash = "sha256:5b66584e549e2e32a1398df11da2e0a7eff45d5c2d9db9d5667c5e6ac764d77e", size = 1982277, upload-time = "2025-10-14T10:21:57.474Z" }, - { url = "https://files.pythonhosted.org/packages/b4/dc/e5aa27aea1ad4638f0c3fb41132f7eb583bd7420ee63204e2d4333a3bbf9/pydantic_core-2.41.4-cp314-cp314-win_amd64.whl", hash = "sha256:557a0aab88664cc552285316809cab897716a372afaf8efdbef756f8b890e894", size = 2024608, upload-time = "2025-10-14T10:21:59.557Z" }, - { url = "https://files.pythonhosted.org/packages/3e/61/51d89cc2612bd147198e120a13f150afbf0bcb4615cddb049ab10b81b79e/pydantic_core-2.41.4-cp314-cp314-win_arm64.whl", hash = "sha256:3f1ea6f48a045745d0d9f325989d8abd3f1eaf47dd00485912d1a3a63c623a8d", size = 1967614, upload-time = "2025-10-14T10:22:01.847Z" }, - { url = "https://files.pythonhosted.org/packages/0d/c2/472f2e31b95eff099961fa050c376ab7156a81da194f9edb9f710f68787b/pydantic_core-2.41.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6c1fe4c5404c448b13188dd8bd2ebc2bdd7e6727fa61ff481bcc2cca894018da", size = 1876904, upload-time = "2025-10-14T10:22:04.062Z" }, - { url = "https://files.pythonhosted.org/packages/4a/07/ea8eeb91173807ecdae4f4a5f4b150a520085b35454350fc219ba79e66a3/pydantic_core-2.41.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:523e7da4d43b113bf8e7b49fa4ec0c35bf4fe66b2230bfc5c13cc498f12c6c3e", size = 1882538, upload-time = "2025-10-14T10:22:06.39Z" }, - { url = "https://files.pythonhosted.org/packages/1e/29/b53a9ca6cd366bfc928823679c6a76c7a4c69f8201c0ba7903ad18ebae2f/pydantic_core-2.41.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5729225de81fb65b70fdb1907fcf08c75d498f4a6f15af005aabb1fdadc19dfa", size = 2041183, upload-time = "2025-10-14T10:22:08.812Z" }, - { url = "https://files.pythonhosted.org/packages/c7/3d/f8c1a371ceebcaf94d6dd2d77c6cf4b1c078e13a5837aee83f760b4f7cfd/pydantic_core-2.41.4-cp314-cp314t-win_amd64.whl", hash = "sha256:de2cfbb09e88f0f795fd90cf955858fc2c691df65b1f21f0aa00b99f3fbc661d", size = 1993542, upload-time = "2025-10-14T10:22:11.332Z" }, - { url = "https://files.pythonhosted.org/packages/8a/ac/9fc61b4f9d079482a290afe8d206b8f490e9fd32d4fc03ed4fc698214e01/pydantic_core-2.41.4-cp314-cp314t-win_arm64.whl", hash = "sha256:d34f950ae05a83e0ede899c595f312ca976023ea1db100cd5aa188f7005e3ab0", size = 1973897, upload-time = "2025-10-14T10:22:13.444Z" }, - { url = "https://files.pythonhosted.org/packages/c4/48/ae937e5a831b7c0dc646b2ef788c27cd003894882415300ed21927c21efa/pydantic_core-2.41.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:4f5d640aeebb438517150fdeec097739614421900e4a08db4a3ef38898798537", size = 2112087, upload-time = "2025-10-14T10:22:56.818Z" }, - { url = "https://files.pythonhosted.org/packages/5e/db/6db8073e3d32dae017da7e0d16a9ecb897d0a4d92e00634916e486097961/pydantic_core-2.41.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:4a9ab037b71927babc6d9e7fc01aea9e66dc2a4a34dff06ef0724a4049629f94", size = 1920387, upload-time = "2025-10-14T10:22:59.342Z" }, - { url = "https://files.pythonhosted.org/packages/0d/c1/dd3542d072fcc336030d66834872f0328727e3b8de289c662faa04aa270e/pydantic_core-2.41.4-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4dab9484ec605c3016df9ad4fd4f9a390bc5d816a3b10c6550f8424bb80b18c", size = 1951495, upload-time = "2025-10-14T10:23:02.089Z" }, - { url = "https://files.pythonhosted.org/packages/2b/c6/db8d13a1f8ab3f1eb08c88bd00fd62d44311e3456d1e85c0e59e0a0376e7/pydantic_core-2.41.4-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8a5028425820731d8c6c098ab642d7b8b999758e24acae03ed38a66eca8335", size = 2139008, upload-time = "2025-10-14T10:23:04.539Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/5d/5f6c63eebb5afee93bcaae4ce9a898f3373ca23df3ccaef086d0233a35a7/pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", size = 2110990, upload-time = "2025-11-04T13:39:58.079Z" }, + { url = "https://files.pythonhosted.org/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", size = 1896003, upload-time = "2025-11-04T13:39:59.956Z" }, + { url = "https://files.pythonhosted.org/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", size = 1919200, upload-time = "2025-11-04T13:40:02.241Z" }, + { url = "https://files.pythonhosted.org/packages/38/de/8c36b5198a29bdaade07b5985e80a233a5ac27137846f3bc2d3b40a47360/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75", size = 2052578, upload-time = "2025-11-04T13:40:04.401Z" }, + { url = "https://files.pythonhosted.org/packages/00/b5/0e8e4b5b081eac6cb3dbb7e60a65907549a1ce035a724368c330112adfdd/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05", size = 2208504, upload-time = "2025-11-04T13:40:06.072Z" }, + { url = "https://files.pythonhosted.org/packages/77/56/87a61aad59c7c5b9dc8caad5a41a5545cba3810c3e828708b3d7404f6cef/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc", size = 2335816, upload-time = "2025-11-04T13:40:07.835Z" }, + { url = "https://files.pythonhosted.org/packages/0d/76/941cc9f73529988688a665a5c0ecff1112b3d95ab48f81db5f7606f522d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c", size = 2075366, upload-time = "2025-11-04T13:40:09.804Z" }, + { url = "https://files.pythonhosted.org/packages/d3/43/ebef01f69baa07a482844faaa0a591bad1ef129253ffd0cdaa9d8a7f72d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5", size = 2171698, upload-time = "2025-11-04T13:40:12.004Z" }, + { url = "https://files.pythonhosted.org/packages/b1/87/41f3202e4193e3bacfc2c065fab7706ebe81af46a83d3e27605029c1f5a6/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c", size = 2132603, upload-time = "2025-11-04T13:40:13.868Z" }, + { url = "https://files.pythonhosted.org/packages/49/7d/4c00df99cb12070b6bccdef4a195255e6020a550d572768d92cc54dba91a/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294", size = 2329591, upload-time = "2025-11-04T13:40:15.672Z" }, + { url = "https://files.pythonhosted.org/packages/cc/6a/ebf4b1d65d458f3cda6a7335d141305dfa19bdc61140a884d165a8a1bbc7/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1", size = 2319068, upload-time = "2025-11-04T13:40:17.532Z" }, + { url = "https://files.pythonhosted.org/packages/49/3b/774f2b5cd4192d5ab75870ce4381fd89cf218af999515baf07e7206753f0/pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d", size = 1985908, upload-time = "2025-11-04T13:40:19.309Z" }, + { url = "https://files.pythonhosted.org/packages/86/45/00173a033c801cacf67c190fef088789394feaf88a98a7035b0e40d53dc9/pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815", size = 2020145, upload-time = "2025-11-04T13:40:21.548Z" }, + { url = "https://files.pythonhosted.org/packages/f9/22/91fbc821fa6d261b376a3f73809f907cec5ca6025642c463d3488aad22fb/pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3", size = 1976179, upload-time = "2025-11-04T13:40:23.393Z" }, + { url = "https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9", size = 2120403, upload-time = "2025-11-04T13:40:25.248Z" }, + { url = "https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34", size = 1896206, upload-time = "2025-11-04T13:40:27.099Z" }, + { url = "https://files.pythonhosted.org/packages/15/df/a4c740c0943e93e6500f9eb23f4ca7ec9bf71b19e608ae5b579678c8d02f/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0", size = 1919307, upload-time = "2025-11-04T13:40:29.806Z" }, + { url = "https://files.pythonhosted.org/packages/9a/e3/6324802931ae1d123528988e0e86587c2072ac2e5394b4bc2bc34b61ff6e/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33", size = 2063258, upload-time = "2025-11-04T13:40:33.544Z" }, + { url = "https://files.pythonhosted.org/packages/c9/d4/2230d7151d4957dd79c3044ea26346c148c98fbf0ee6ebd41056f2d62ab5/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e", size = 2214917, upload-time = "2025-11-04T13:40:35.479Z" }, + { url = "https://files.pythonhosted.org/packages/e6/9f/eaac5df17a3672fef0081b6c1bb0b82b33ee89aa5cec0d7b05f52fd4a1fa/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2", size = 2332186, upload-time = "2025-11-04T13:40:37.436Z" }, + { 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 = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586", size = 2073164, upload-time = "2025-11-04T13:40:40.289Z" }, + { url = "https://files.pythonhosted.org/packages/bf/e3/f6e262673c6140dd3305d144d032f7bd5f7497d3871c1428521f19f9efa2/pydantic_core-2.41.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d", size = 2179146, upload-time = "2025-11-04T13:40:42.809Z" }, + { url = "https://files.pythonhosted.org/packages/75/c7/20bd7fc05f0c6ea2056a4565c6f36f8968c0924f19b7d97bbfea55780e73/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740", size = 2137788, upload-time = "2025-11-04T13:40:44.752Z" }, + { url = "https://files.pythonhosted.org/packages/3a/8d/34318ef985c45196e004bc46c6eab2eda437e744c124ef0dbe1ff2c9d06b/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e", size = 2340133, upload-time = "2025-11-04T13:40:46.66Z" }, + { url = "https://files.pythonhosted.org/packages/9c/59/013626bf8c78a5a5d9350d12e7697d3d4de951a75565496abd40ccd46bee/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858", size = 2324852, upload-time = "2025-11-04T13:40:48.575Z" }, + { url = "https://files.pythonhosted.org/packages/1a/d9/c248c103856f807ef70c18a4f986693a46a8ffe1602e5d361485da502d20/pydantic_core-2.41.5-cp313-cp313-win32.whl", hash = "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36", size = 1994679, upload-time = "2025-11-04T13:40:50.619Z" }, + { url = "https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl", hash = "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11", size = 2019766, upload-time = "2025-11-04T13:40:52.631Z" }, + { url = "https://files.pythonhosted.org/packages/73/7d/f2f9db34af103bea3e09735bb40b021788a5e834c81eedb541991badf8f5/pydantic_core-2.41.5-cp313-cp313-win_arm64.whl", hash = "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd", size = 1981005, upload-time = "2025-11-04T13:40:54.734Z" }, + { url = "https://files.pythonhosted.org/packages/ea/28/46b7c5c9635ae96ea0fbb779e271a38129df2550f763937659ee6c5dbc65/pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a", size = 2119622, upload-time = "2025-11-04T13:40:56.68Z" }, + { url = "https://files.pythonhosted.org/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14", size = 1891725, upload-time = "2025-11-04T13:40:58.807Z" }, + { url = "https://files.pythonhosted.org/packages/23/04/e89c29e267b8060b40dca97bfc64a19b2a3cf99018167ea1677d96368273/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1", size = 1915040, upload-time = "2025-11-04T13:41:00.853Z" }, + { url = "https://files.pythonhosted.org/packages/84/a3/15a82ac7bd97992a82257f777b3583d3e84bdb06ba6858f745daa2ec8a85/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66", size = 2063691, upload-time = "2025-11-04T13:41:03.504Z" }, + { url = "https://files.pythonhosted.org/packages/74/9b/0046701313c6ef08c0c1cf0e028c67c770a4e1275ca73131563c5f2a310a/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869", size = 2213897, upload-time = "2025-11-04T13:41:05.804Z" }, + { url = "https://files.pythonhosted.org/packages/8a/cd/6bac76ecd1b27e75a95ca3a9a559c643b3afcd2dd62086d4b7a32a18b169/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2", size = 2333302, upload-time = "2025-11-04T13:41:07.809Z" }, + { url = "https://files.pythonhosted.org/packages/4c/d2/ef2074dc020dd6e109611a8be4449b98cd25e1b9b8a303c2f0fca2f2bcf7/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375", size = 2064877, upload-time = "2025-11-04T13:41:09.827Z" }, + { url = "https://files.pythonhosted.org/packages/18/66/e9db17a9a763d72f03de903883c057b2592c09509ccfe468187f2a2eef29/pydantic_core-2.41.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553", size = 2180680, upload-time = "2025-11-04T13:41:12.379Z" }, + { url = "https://files.pythonhosted.org/packages/d3/9e/3ce66cebb929f3ced22be85d4c2399b8e85b622db77dad36b73c5387f8f8/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90", size = 2138960, upload-time = "2025-11-04T13:41:14.627Z" }, + { url = "https://files.pythonhosted.org/packages/a6/62/205a998f4327d2079326b01abee48e502ea739d174f0a89295c481a2272e/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07", size = 2339102, upload-time = "2025-11-04T13:41:16.868Z" }, + { url = "https://files.pythonhosted.org/packages/3c/0d/f05e79471e889d74d3d88f5bd20d0ed189ad94c2423d81ff8d0000aab4ff/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb", size = 2326039, upload-time = "2025-11-04T13:41:18.934Z" }, + { url = "https://files.pythonhosted.org/packages/ec/e1/e08a6208bb100da7e0c4b288eed624a703f4d129bde2da475721a80cab32/pydantic_core-2.41.5-cp314-cp314-win32.whl", hash = "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23", size = 1995126, upload-time = "2025-11-04T13:41:21.418Z" }, + { url = "https://files.pythonhosted.org/packages/48/5d/56ba7b24e9557f99c9237e29f5c09913c81eeb2f3217e40e922353668092/pydantic_core-2.41.5-cp314-cp314-win_amd64.whl", hash = "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf", size = 2015489, upload-time = "2025-11-04T13:41:24.076Z" }, + { url = "https://files.pythonhosted.org/packages/4e/bb/f7a190991ec9e3e0ba22e4993d8755bbc4a32925c0b5b42775c03e8148f9/pydantic_core-2.41.5-cp314-cp314-win_arm64.whl", hash = "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0", size = 1977288, upload-time = "2025-11-04T13:41:26.33Z" }, + { url = "https://files.pythonhosted.org/packages/92/ed/77542d0c51538e32e15afe7899d79efce4b81eee631d99850edc2f5e9349/pydantic_core-2.41.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a", size = 2120255, upload-time = "2025-11-04T13:41:28.569Z" }, + { url = "https://files.pythonhosted.org/packages/bb/3d/6913dde84d5be21e284439676168b28d8bbba5600d838b9dca99de0fad71/pydantic_core-2.41.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3", size = 1863760, upload-time = "2025-11-04T13:41:31.055Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f0/e5e6b99d4191da102f2b0eb9687aaa7f5bea5d9964071a84effc3e40f997/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c", size = 1878092, upload-time = "2025-11-04T13:41:33.21Z" }, + { url = "https://files.pythonhosted.org/packages/71/48/36fb760642d568925953bcc8116455513d6e34c4beaa37544118c36aba6d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612", size = 2053385, upload-time = "2025-11-04T13:41:35.508Z" }, + { url = "https://files.pythonhosted.org/packages/20/25/92dc684dd8eb75a234bc1c764b4210cf2646479d54b47bf46061657292a8/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d", size = 2218832, upload-time = "2025-11-04T13:41:37.732Z" }, + { url = "https://files.pythonhosted.org/packages/e2/09/f53e0b05023d3e30357d82eb35835d0f6340ca344720a4599cd663dca599/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9", size = 2327585, upload-time = "2025-11-04T13:41:40Z" }, + { url = "https://files.pythonhosted.org/packages/aa/4e/2ae1aa85d6af35a39b236b1b1641de73f5a6ac4d5a7509f77b814885760c/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660", size = 2041078, upload-time = "2025-11-04T13:41:42.323Z" }, + { url = "https://files.pythonhosted.org/packages/cd/13/2e215f17f0ef326fc72afe94776edb77525142c693767fc347ed6288728d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9", size = 2173914, upload-time = "2025-11-04T13:41:45.221Z" }, + { url = "https://files.pythonhosted.org/packages/02/7a/f999a6dcbcd0e5660bc348a3991c8915ce6599f4f2c6ac22f01d7a10816c/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3", size = 2129560, upload-time = "2025-11-04T13:41:47.474Z" }, + { url = "https://files.pythonhosted.org/packages/3a/b1/6c990ac65e3b4c079a4fb9f5b05f5b013afa0f4ed6780a3dd236d2cbdc64/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf", size = 2329244, upload-time = "2025-11-04T13:41:49.992Z" }, + { url = "https://files.pythonhosted.org/packages/d9/02/3c562f3a51afd4d88fff8dffb1771b30cfdfd79befd9883ee094f5b6c0d8/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470", size = 2331955, upload-time = "2025-11-04T13:41:54.079Z" }, + { url = "https://files.pythonhosted.org/packages/5c/96/5fb7d8c3c17bc8c62fdb031c47d77a1af698f1d7a406b0f79aaa1338f9ad/pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa", size = 1988906, upload-time = "2025-11-04T13:41:56.606Z" }, + { url = "https://files.pythonhosted.org/packages/22/ed/182129d83032702912c2e2d8bbe33c036f342cc735737064668585dac28f/pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c", size = 1981607, upload-time = "2025-11-04T13:41:58.889Z" }, + { url = "https://files.pythonhosted.org/packages/9f/ed/068e41660b832bb0b1aa5b58011dea2a3fe0ba7861ff38c4d4904c1c1a99/pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008", size = 1974769, upload-time = "2025-11-04T13:42:01.186Z" }, + { url = "https://files.pythonhosted.org/packages/09/32/59b0c7e63e277fa7911c2fc70ccfb45ce4b98991e7ef37110663437005af/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", size = 2110495, upload-time = "2025-11-04T13:42:49.689Z" }, + { url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388, upload-time = "2025-11-04T13:42:52.215Z" }, + { url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879, upload-time = "2025-11-04T13:42:56.483Z" }, + { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload-time = "2025-11-04T13:42:59.471Z" }, ] [[package]] @@ -1759,7 +1792,7 @@ wheels = [ [[package]] name = "pytest" -version = "8.4.2" +version = "9.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, @@ -1768,9 +1801,9 @@ dependencies = [ { name = "pluggy" }, { name = "pygments" }, ] -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/07/56/f013048ac4bc4c1d9be45afd4ab209ea62822fb1598f40687e6bf45dcea4/pytest-9.0.1.tar.gz", hash = "sha256:3e9c069ea73583e255c3b21cf46b8d3c56f6e3a1a8f6da94ccb0fcf57b9d73c8", size = 1564125, upload-time = "2025-11-12T13:05:09.333Z" } 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/0b/8b/6300fb80f858cda1c51ffa17075df5d846757081d11ab4aa35cef9e6258b/pytest-9.0.1-py3-none-any.whl", hash = "sha256:67be0030d194df2dfa7b556f2e56fb3c3315bd5c8822c6951162b92b32ce7dad", size = 373668, upload-time = "2025-11-12T13:05:07.379Z" }, ] [[package]] @@ -1808,13 +1841,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl", hash = "sha256:af09c9daf6a813aa4cc7180395f50f2a9e5fa056034c9953aec92e381c5ba1e2", size = 15548, upload-time = "2025-10-06T04:15:17.553Z" }, ] +[[package]] +name = "python-jsonpath" +version = "2.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/db/f1f19205b0df6eb0195de154dc6c967448802dfb573487fa8a4206a243cd/python_jsonpath-2.0.1.tar.gz", hash = "sha256:32a84ebb2dc0ec1b42a6e165b0f9174aef8310bad29154ad9aee31ac37cca18f", size = 49659, upload-time = "2025-09-13T08:01:47.82Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/d4/64d7cdc01269f5fed45e6a69f5395c30451958c299ca5cbc1442a4f3f9b9/python_jsonpath-2.0.1-py3-none-any.whl", hash = "sha256:ebd518b7c883acc5b976518d76b6c96288405edec7d9ef838641869c1e1a5eb7", size = 64060, upload-time = "2025-09-13T08:01:46.184Z" }, +] + [[package]] name = "pytokens" -version = "0.2.0" +version = "0.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d4/c2/dbadcdddb412a267585459142bfd7cc241e6276db69339353ae6e241ab2b/pytokens-0.2.0.tar.gz", hash = "sha256:532d6421364e5869ea57a9523bf385f02586d4662acbcc0342afd69511b4dd43", size = 15368, upload-time = "2025-10-15T08:02:42.738Z" } +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/89/5a/c269ea6b348b6f2c32686635df89f32dbe05df1088dd4579302a6f8f99af/pytokens-0.2.0-py3-none-any.whl", hash = "sha256:74d4b318c67f4295c13782ddd9abcb7e297ec5630ad060eb90abf7ebbefe59f8", size = 12038, upload-time = "2025-10-15T08:02:41.694Z" }, + { 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" }, ] [[package]] @@ -2032,109 +2074,109 @@ wheels = [ [[package]] name = "rpds-py" -version = "0.27.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e9/dd/2c0cbe774744272b0ae725f44032c77bdcab6e8bcf544bffa3b6e70c8dba/rpds_py-0.27.1.tar.gz", hash = "sha256:26a1c73171d10b7acccbded82bf6a586ab8203601e565badc74bbbf8bc5a10f8", size = 27479, upload-time = "2025-08-27T12:16:36.024Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/fe/38de28dee5df58b8198c743fe2bea0c785c6d40941b9950bac4cdb71a014/rpds_py-0.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ae2775c1973e3c30316892737b91f9283f9908e3cc7625b9331271eaaed7dc90", size = 361887, upload-time = "2025-08-27T12:13:10.233Z" }, - { url = "https://files.pythonhosted.org/packages/7c/9a/4b6c7eedc7dd90986bf0fab6ea2a091ec11c01b15f8ba0a14d3f80450468/rpds_py-0.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2643400120f55c8a96f7c9d858f7be0c88d383cd4653ae2cf0d0c88f668073e5", size = 345795, upload-time = "2025-08-27T12:13:11.65Z" }, - { url = "https://files.pythonhosted.org/packages/6f/0e/e650e1b81922847a09cca820237b0edee69416a01268b7754d506ade11ad/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16323f674c089b0360674a4abd28d5042947d54ba620f72514d69be4ff64845e", size = 385121, upload-time = "2025-08-27T12:13:13.008Z" }, - { url = "https://files.pythonhosted.org/packages/1b/ea/b306067a712988e2bff00dcc7c8f31d26c29b6d5931b461aa4b60a013e33/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a1f4814b65eacac94a00fc9a526e3fdafd78e439469644032032d0d63de4881", size = 398976, upload-time = "2025-08-27T12:13:14.368Z" }, - { url = "https://files.pythonhosted.org/packages/2c/0a/26dc43c8840cb8fe239fe12dbc8d8de40f2365e838f3d395835dde72f0e5/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ba32c16b064267b22f1850a34051121d423b6f7338a12b9459550eb2096e7ec", size = 525953, upload-time = "2025-08-27T12:13:15.774Z" }, - { url = "https://files.pythonhosted.org/packages/22/14/c85e8127b573aaf3a0cbd7fbb8c9c99e735a4a02180c84da2a463b766e9e/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5c20f33fd10485b80f65e800bbe5f6785af510b9f4056c5a3c612ebc83ba6cb", size = 407915, upload-time = "2025-08-27T12:13:17.379Z" }, - { url = "https://files.pythonhosted.org/packages/ed/7b/8f4fee9ba1fb5ec856eb22d725a4efa3deb47f769597c809e03578b0f9d9/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:466bfe65bd932da36ff279ddd92de56b042f2266d752719beb97b08526268ec5", size = 386883, upload-time = "2025-08-27T12:13:18.704Z" }, - { url = "https://files.pythonhosted.org/packages/86/47/28fa6d60f8b74fcdceba81b272f8d9836ac0340570f68f5df6b41838547b/rpds_py-0.27.1-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:41e532bbdcb57c92ba3be62c42e9f096431b4cf478da9bc3bc6ce5c38ab7ba7a", size = 405699, upload-time = "2025-08-27T12:13:20.089Z" }, - { url = "https://files.pythonhosted.org/packages/d0/fd/c5987b5e054548df56953a21fe2ebed51fc1ec7c8f24fd41c067b68c4a0a/rpds_py-0.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f149826d742b406579466283769a8ea448eed82a789af0ed17b0cd5770433444", size = 423713, upload-time = "2025-08-27T12:13:21.436Z" }, - { url = "https://files.pythonhosted.org/packages/ac/ba/3c4978b54a73ed19a7d74531be37a8bcc542d917c770e14d372b8daea186/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:80c60cfb5310677bd67cb1e85a1e8eb52e12529545441b43e6f14d90b878775a", size = 562324, upload-time = "2025-08-27T12:13:22.789Z" }, - { url = "https://files.pythonhosted.org/packages/b5/6c/6943a91768fec16db09a42b08644b960cff540c66aab89b74be6d4a144ba/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7ee6521b9baf06085f62ba9c7a3e5becffbc32480d2f1b351559c001c38ce4c1", size = 593646, upload-time = "2025-08-27T12:13:24.122Z" }, - { url = "https://files.pythonhosted.org/packages/11/73/9d7a8f4be5f4396f011a6bb7a19fe26303a0dac9064462f5651ced2f572f/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a512c8263249a9d68cac08b05dd59d2b3f2061d99b322813cbcc14c3c7421998", size = 558137, upload-time = "2025-08-27T12:13:25.557Z" }, - { url = "https://files.pythonhosted.org/packages/6e/96/6772cbfa0e2485bcceef8071de7821f81aeac8bb45fbfd5542a3e8108165/rpds_py-0.27.1-cp312-cp312-win32.whl", hash = "sha256:819064fa048ba01b6dadc5116f3ac48610435ac9a0058bbde98e569f9e785c39", size = 221343, upload-time = "2025-08-27T12:13:26.967Z" }, - { url = "https://files.pythonhosted.org/packages/67/b6/c82f0faa9af1c6a64669f73a17ee0eeef25aff30bb9a1c318509efe45d84/rpds_py-0.27.1-cp312-cp312-win_amd64.whl", hash = "sha256:d9199717881f13c32c4046a15f024971a3b78ad4ea029e8da6b86e5aa9cf4594", size = 232497, upload-time = "2025-08-27T12:13:28.326Z" }, - { url = "https://files.pythonhosted.org/packages/e1/96/2817b44bd2ed11aebacc9251da03689d56109b9aba5e311297b6902136e2/rpds_py-0.27.1-cp312-cp312-win_arm64.whl", hash = "sha256:33aa65b97826a0e885ef6e278fbd934e98cdcfed80b63946025f01e2f5b29502", size = 222790, upload-time = "2025-08-27T12:13:29.71Z" }, - { url = "https://files.pythonhosted.org/packages/cc/77/610aeee8d41e39080c7e14afa5387138e3c9fa9756ab893d09d99e7d8e98/rpds_py-0.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e4b9fcfbc021633863a37e92571d6f91851fa656f0180246e84cbd8b3f6b329b", size = 361741, upload-time = "2025-08-27T12:13:31.039Z" }, - { url = "https://files.pythonhosted.org/packages/3a/fc/c43765f201c6a1c60be2043cbdb664013def52460a4c7adace89d6682bf4/rpds_py-0.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1441811a96eadca93c517d08df75de45e5ffe68aa3089924f963c782c4b898cf", size = 345574, upload-time = "2025-08-27T12:13:32.902Z" }, - { url = "https://files.pythonhosted.org/packages/20/42/ee2b2ca114294cd9847d0ef9c26d2b0851b2e7e00bf14cc4c0b581df0fc3/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55266dafa22e672f5a4f65019015f90336ed31c6383bd53f5e7826d21a0e0b83", size = 385051, upload-time = "2025-08-27T12:13:34.228Z" }, - { url = "https://files.pythonhosted.org/packages/fd/e8/1e430fe311e4799e02e2d1af7c765f024e95e17d651612425b226705f910/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d78827d7ac08627ea2c8e02c9e5b41180ea5ea1f747e9db0915e3adf36b62dcf", size = 398395, upload-time = "2025-08-27T12:13:36.132Z" }, - { url = "https://files.pythonhosted.org/packages/82/95/9dc227d441ff2670651c27a739acb2535ccaf8b351a88d78c088965e5996/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae92443798a40a92dc5f0b01d8a7c93adde0c4dc965310a29ae7c64d72b9fad2", size = 524334, upload-time = "2025-08-27T12:13:37.562Z" }, - { url = "https://files.pythonhosted.org/packages/87/01/a670c232f401d9ad461d9a332aa4080cd3cb1d1df18213dbd0d2a6a7ab51/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c46c9dd2403b66a2a3b9720ec4b74d4ab49d4fabf9f03dfdce2d42af913fe8d0", size = 407691, upload-time = "2025-08-27T12:13:38.94Z" }, - { url = "https://files.pythonhosted.org/packages/03/36/0a14aebbaa26fe7fab4780c76f2239e76cc95a0090bdb25e31d95c492fcd/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2efe4eb1d01b7f5f1939f4ef30ecea6c6b3521eec451fb93191bf84b2a522418", size = 386868, upload-time = "2025-08-27T12:13:40.192Z" }, - { url = "https://files.pythonhosted.org/packages/3b/03/8c897fb8b5347ff6c1cc31239b9611c5bf79d78c984430887a353e1409a1/rpds_py-0.27.1-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:15d3b4d83582d10c601f481eca29c3f138d44c92187d197aff663a269197c02d", size = 405469, upload-time = "2025-08-27T12:13:41.496Z" }, - { url = "https://files.pythonhosted.org/packages/da/07/88c60edc2df74850d496d78a1fdcdc7b54360a7f610a4d50008309d41b94/rpds_py-0.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4ed2e16abbc982a169d30d1a420274a709949e2cbdef119fe2ec9d870b42f274", size = 422125, upload-time = "2025-08-27T12:13:42.802Z" }, - { url = "https://files.pythonhosted.org/packages/6b/86/5f4c707603e41b05f191a749984f390dabcbc467cf833769b47bf14ba04f/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a75f305c9b013289121ec0f1181931975df78738cdf650093e6b86d74aa7d8dd", size = 562341, upload-time = "2025-08-27T12:13:44.472Z" }, - { url = "https://files.pythonhosted.org/packages/b2/92/3c0cb2492094e3cd9baf9e49bbb7befeceb584ea0c1a8b5939dca4da12e5/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:67ce7620704745881a3d4b0ada80ab4d99df390838839921f99e63c474f82cf2", size = 592511, upload-time = "2025-08-27T12:13:45.898Z" }, - { url = "https://files.pythonhosted.org/packages/10/bb/82e64fbb0047c46a168faa28d0d45a7851cd0582f850b966811d30f67ad8/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d992ac10eb86d9b6f369647b6a3f412fc0075cfd5d799530e84d335e440a002", size = 557736, upload-time = "2025-08-27T12:13:47.408Z" }, - { url = "https://files.pythonhosted.org/packages/00/95/3c863973d409210da7fb41958172c6b7dbe7fc34e04d3cc1f10bb85e979f/rpds_py-0.27.1-cp313-cp313-win32.whl", hash = "sha256:4f75e4bd8ab8db624e02c8e2fc4063021b58becdbe6df793a8111d9343aec1e3", size = 221462, upload-time = "2025-08-27T12:13:48.742Z" }, - { url = "https://files.pythonhosted.org/packages/ce/2c/5867b14a81dc217b56d95a9f2a40fdbc56a1ab0181b80132beeecbd4b2d6/rpds_py-0.27.1-cp313-cp313-win_amd64.whl", hash = "sha256:f9025faafc62ed0b75a53e541895ca272815bec18abe2249ff6501c8f2e12b83", size = 232034, upload-time = "2025-08-27T12:13:50.11Z" }, - { url = "https://files.pythonhosted.org/packages/c7/78/3958f3f018c01923823f1e47f1cc338e398814b92d83cd278364446fac66/rpds_py-0.27.1-cp313-cp313-win_arm64.whl", hash = "sha256:ed10dc32829e7d222b7d3b93136d25a406ba9788f6a7ebf6809092da1f4d279d", size = 222392, upload-time = "2025-08-27T12:13:52.587Z" }, - { url = "https://files.pythonhosted.org/packages/01/76/1cdf1f91aed5c3a7bf2eba1f1c4e4d6f57832d73003919a20118870ea659/rpds_py-0.27.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:92022bbbad0d4426e616815b16bc4127f83c9a74940e1ccf3cfe0b387aba0228", size = 358355, upload-time = "2025-08-27T12:13:54.012Z" }, - { url = "https://files.pythonhosted.org/packages/c3/6f/bf142541229374287604caf3bb2a4ae17f0a580798fd72d3b009b532db4e/rpds_py-0.27.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:47162fdab9407ec3f160805ac3e154df042e577dd53341745fc7fb3f625e6d92", size = 342138, upload-time = "2025-08-27T12:13:55.791Z" }, - { url = "https://files.pythonhosted.org/packages/1a/77/355b1c041d6be40886c44ff5e798b4e2769e497b790f0f7fd1e78d17e9a8/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb89bec23fddc489e5d78b550a7b773557c9ab58b7946154a10a6f7a214a48b2", size = 380247, upload-time = "2025-08-27T12:13:57.683Z" }, - { url = "https://files.pythonhosted.org/packages/d6/a4/d9cef5c3946ea271ce2243c51481971cd6e34f21925af2783dd17b26e815/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e48af21883ded2b3e9eb48cb7880ad8598b31ab752ff3be6457001d78f416723", size = 390699, upload-time = "2025-08-27T12:13:59.137Z" }, - { url = "https://files.pythonhosted.org/packages/3a/06/005106a7b8c6c1a7e91b73169e49870f4af5256119d34a361ae5240a0c1d/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f5b7bd8e219ed50299e58551a410b64daafb5017d54bbe822e003856f06a802", size = 521852, upload-time = "2025-08-27T12:14:00.583Z" }, - { url = "https://files.pythonhosted.org/packages/e5/3e/50fb1dac0948e17a02eb05c24510a8fe12d5ce8561c6b7b7d1339ab7ab9c/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08f1e20bccf73b08d12d804d6e1c22ca5530e71659e6673bce31a6bb71c1e73f", size = 402582, upload-time = "2025-08-27T12:14:02.034Z" }, - { url = "https://files.pythonhosted.org/packages/cb/b0/f4e224090dc5b0ec15f31a02d746ab24101dd430847c4d99123798661bfc/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dc5dceeaefcc96dc192e3a80bbe1d6c410c469e97bdd47494a7d930987f18b2", size = 384126, upload-time = "2025-08-27T12:14:03.437Z" }, - { url = "https://files.pythonhosted.org/packages/54/77/ac339d5f82b6afff1df8f0fe0d2145cc827992cb5f8eeb90fc9f31ef7a63/rpds_py-0.27.1-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:d76f9cc8665acdc0c9177043746775aa7babbf479b5520b78ae4002d889f5c21", size = 399486, upload-time = "2025-08-27T12:14:05.443Z" }, - { url = "https://files.pythonhosted.org/packages/d6/29/3e1c255eee6ac358c056a57d6d6869baa00a62fa32eea5ee0632039c50a3/rpds_py-0.27.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:134fae0e36022edad8290a6661edf40c023562964efea0cc0ec7f5d392d2aaef", size = 414832, upload-time = "2025-08-27T12:14:06.902Z" }, - { url = "https://files.pythonhosted.org/packages/3f/db/6d498b844342deb3fa1d030598db93937a9964fcf5cb4da4feb5f17be34b/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb11a4f1b2b63337cfd3b4d110af778a59aae51c81d195768e353d8b52f88081", size = 557249, upload-time = "2025-08-27T12:14:08.37Z" }, - { url = "https://files.pythonhosted.org/packages/60/f3/690dd38e2310b6f68858a331399b4d6dbb9132c3e8ef8b4333b96caf403d/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:13e608ac9f50a0ed4faec0e90ece76ae33b34c0e8656e3dceb9a7db994c692cd", size = 587356, upload-time = "2025-08-27T12:14:10.034Z" }, - { url = "https://files.pythonhosted.org/packages/86/e3/84507781cccd0145f35b1dc32c72675200c5ce8d5b30f813e49424ef68fc/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dd2135527aa40f061350c3f8f89da2644de26cd73e4de458e79606384f4f68e7", size = 555300, upload-time = "2025-08-27T12:14:11.783Z" }, - { url = "https://files.pythonhosted.org/packages/e5/ee/375469849e6b429b3516206b4580a79e9ef3eb12920ddbd4492b56eaacbe/rpds_py-0.27.1-cp313-cp313t-win32.whl", hash = "sha256:3020724ade63fe320a972e2ffd93b5623227e684315adce194941167fee02688", size = 216714, upload-time = "2025-08-27T12:14:13.629Z" }, - { url = "https://files.pythonhosted.org/packages/21/87/3fc94e47c9bd0742660e84706c311a860dcae4374cf4a03c477e23ce605a/rpds_py-0.27.1-cp313-cp313t-win_amd64.whl", hash = "sha256:8ee50c3e41739886606388ba3ab3ee2aae9f35fb23f833091833255a31740797", size = 228943, upload-time = "2025-08-27T12:14:14.937Z" }, - { url = "https://files.pythonhosted.org/packages/70/36/b6e6066520a07cf029d385de869729a895917b411e777ab1cde878100a1d/rpds_py-0.27.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:acb9aafccaae278f449d9c713b64a9e68662e7799dbd5859e2c6b3c67b56d334", size = 362472, upload-time = "2025-08-27T12:14:16.333Z" }, - { url = "https://files.pythonhosted.org/packages/af/07/b4646032e0dcec0df9c73a3bd52f63bc6c5f9cda992f06bd0e73fe3fbebd/rpds_py-0.27.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b7fb801aa7f845ddf601c49630deeeccde7ce10065561d92729bfe81bd21fb33", size = 345676, upload-time = "2025-08-27T12:14:17.764Z" }, - { url = "https://files.pythonhosted.org/packages/b0/16/2f1003ee5d0af4bcb13c0cf894957984c32a6751ed7206db2aee7379a55e/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe0dd05afb46597b9a2e11c351e5e4283c741237e7f617ffb3252780cca9336a", size = 385313, upload-time = "2025-08-27T12:14:19.829Z" }, - { url = "https://files.pythonhosted.org/packages/05/cd/7eb6dd7b232e7f2654d03fa07f1414d7dfc980e82ba71e40a7c46fd95484/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b6dfb0e058adb12d8b1d1b25f686e94ffa65d9995a5157afe99743bf7369d62b", size = 399080, upload-time = "2025-08-27T12:14:21.531Z" }, - { url = "https://files.pythonhosted.org/packages/20/51/5829afd5000ec1cb60f304711f02572d619040aa3ec033d8226817d1e571/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed090ccd235f6fa8bb5861684567f0a83e04f52dfc2e5c05f2e4b1309fcf85e7", size = 523868, upload-time = "2025-08-27T12:14:23.485Z" }, - { url = "https://files.pythonhosted.org/packages/05/2c/30eebca20d5db95720ab4d2faec1b5e4c1025c473f703738c371241476a2/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf876e79763eecf3e7356f157540d6a093cef395b65514f17a356f62af6cc136", size = 408750, upload-time = "2025-08-27T12:14:24.924Z" }, - { url = "https://files.pythonhosted.org/packages/90/1a/cdb5083f043597c4d4276eae4e4c70c55ab5accec078da8611f24575a367/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12ed005216a51b1d6e2b02a7bd31885fe317e45897de81d86dcce7d74618ffff", size = 387688, upload-time = "2025-08-27T12:14:27.537Z" }, - { url = "https://files.pythonhosted.org/packages/7c/92/cf786a15320e173f945d205ab31585cc43969743bb1a48b6888f7a2b0a2d/rpds_py-0.27.1-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:ee4308f409a40e50593c7e3bb8cbe0b4d4c66d1674a316324f0c2f5383b486f9", size = 407225, upload-time = "2025-08-27T12:14:28.981Z" }, - { url = "https://files.pythonhosted.org/packages/33/5c/85ee16df5b65063ef26017bef33096557a4c83fbe56218ac7cd8c235f16d/rpds_py-0.27.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b08d152555acf1f455154d498ca855618c1378ec810646fcd7c76416ac6dc60", size = 423361, upload-time = "2025-08-27T12:14:30.469Z" }, - { url = "https://files.pythonhosted.org/packages/4b/8e/1c2741307fcabd1a334ecf008e92c4f47bb6f848712cf15c923becfe82bb/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:dce51c828941973a5684d458214d3a36fcd28da3e1875d659388f4f9f12cc33e", size = 562493, upload-time = "2025-08-27T12:14:31.987Z" }, - { url = "https://files.pythonhosted.org/packages/04/03/5159321baae9b2222442a70c1f988cbbd66b9be0675dd3936461269be360/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:c1476d6f29eb81aa4151c9a31219b03f1f798dc43d8af1250a870735516a1212", size = 592623, upload-time = "2025-08-27T12:14:33.543Z" }, - { url = "https://files.pythonhosted.org/packages/ff/39/c09fd1ad28b85bc1d4554a8710233c9f4cefd03d7717a1b8fbfd171d1167/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3ce0cac322b0d69b63c9cdb895ee1b65805ec9ffad37639f291dd79467bee675", size = 558800, upload-time = "2025-08-27T12:14:35.436Z" }, - { url = "https://files.pythonhosted.org/packages/c5/d6/99228e6bbcf4baa764b18258f519a9035131d91b538d4e0e294313462a98/rpds_py-0.27.1-cp314-cp314-win32.whl", hash = "sha256:dfbfac137d2a3d0725758cd141f878bf4329ba25e34979797c89474a89a8a3a3", size = 221943, upload-time = "2025-08-27T12:14:36.898Z" }, - { url = "https://files.pythonhosted.org/packages/be/07/c802bc6b8e95be83b79bdf23d1aa61d68324cb1006e245d6c58e959e314d/rpds_py-0.27.1-cp314-cp314-win_amd64.whl", hash = "sha256:a6e57b0abfe7cc513450fcf529eb486b6e4d3f8aee83e92eb5f1ef848218d456", size = 233739, upload-time = "2025-08-27T12:14:38.386Z" }, - { url = "https://files.pythonhosted.org/packages/c8/89/3e1b1c16d4c2d547c5717377a8df99aee8099ff050f87c45cb4d5fa70891/rpds_py-0.27.1-cp314-cp314-win_arm64.whl", hash = "sha256:faf8d146f3d476abfee026c4ae3bdd9ca14236ae4e4c310cbd1cf75ba33d24a3", size = 223120, upload-time = "2025-08-27T12:14:39.82Z" }, - { url = "https://files.pythonhosted.org/packages/62/7e/dc7931dc2fa4a6e46b2a4fa744a9fe5c548efd70e0ba74f40b39fa4a8c10/rpds_py-0.27.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:ba81d2b56b6d4911ce735aad0a1d4495e808b8ee4dc58715998741a26874e7c2", size = 358944, upload-time = "2025-08-27T12:14:41.199Z" }, - { url = "https://files.pythonhosted.org/packages/e6/22/4af76ac4e9f336bfb1a5f240d18a33c6b2fcaadb7472ac7680576512b49a/rpds_py-0.27.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:84f7d509870098de0e864cad0102711c1e24e9b1a50ee713b65928adb22269e4", size = 342283, upload-time = "2025-08-27T12:14:42.699Z" }, - { url = "https://files.pythonhosted.org/packages/1c/15/2a7c619b3c2272ea9feb9ade67a45c40b3eeb500d503ad4c28c395dc51b4/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9e960fc78fecd1100539f14132425e1d5fe44ecb9239f8f27f079962021523e", size = 380320, upload-time = "2025-08-27T12:14:44.157Z" }, - { url = "https://files.pythonhosted.org/packages/a2/7d/4c6d243ba4a3057e994bb5bedd01b5c963c12fe38dde707a52acdb3849e7/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62f85b665cedab1a503747617393573995dac4600ff51869d69ad2f39eb5e817", size = 391760, upload-time = "2025-08-27T12:14:45.845Z" }, - { url = "https://files.pythonhosted.org/packages/b4/71/b19401a909b83bcd67f90221330bc1ef11bc486fe4e04c24388d28a618ae/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fed467af29776f6556250c9ed85ea5a4dd121ab56a5f8b206e3e7a4c551e48ec", size = 522476, upload-time = "2025-08-27T12:14:47.364Z" }, - { url = "https://files.pythonhosted.org/packages/e4/44/1a3b9715c0455d2e2f0f6df5ee6d6f5afdc423d0773a8a682ed2b43c566c/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2729615f9d430af0ae6b36cf042cb55c0936408d543fb691e1a9e36648fd35a", size = 403418, upload-time = "2025-08-27T12:14:49.991Z" }, - { url = "https://files.pythonhosted.org/packages/1c/4b/fb6c4f14984eb56673bc868a66536f53417ddb13ed44b391998100a06a96/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b207d881a9aef7ba753d69c123a35d96ca7cb808056998f6b9e8747321f03b8", size = 384771, upload-time = "2025-08-27T12:14:52.159Z" }, - { url = "https://files.pythonhosted.org/packages/c0/56/d5265d2d28b7420d7b4d4d85cad8ef891760f5135102e60d5c970b976e41/rpds_py-0.27.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:639fd5efec029f99b79ae47e5d7e00ad8a773da899b6309f6786ecaf22948c48", size = 400022, upload-time = "2025-08-27T12:14:53.859Z" }, - { url = "https://files.pythonhosted.org/packages/8f/e9/9f5fc70164a569bdd6ed9046486c3568d6926e3a49bdefeeccfb18655875/rpds_py-0.27.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fecc80cb2a90e28af8a9b366edacf33d7a91cbfe4c2c4544ea1246e949cfebeb", size = 416787, upload-time = "2025-08-27T12:14:55.673Z" }, - { url = "https://files.pythonhosted.org/packages/d4/64/56dd03430ba491db943a81dcdef115a985aac5f44f565cd39a00c766d45c/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42a89282d711711d0a62d6f57d81aa43a1368686c45bc1c46b7f079d55692734", size = 557538, upload-time = "2025-08-27T12:14:57.245Z" }, - { url = "https://files.pythonhosted.org/packages/3f/36/92cc885a3129993b1d963a2a42ecf64e6a8e129d2c7cc980dbeba84e55fb/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:cf9931f14223de59551ab9d38ed18d92f14f055a5f78c1d8ad6493f735021bbb", size = 588512, upload-time = "2025-08-27T12:14:58.728Z" }, - { url = "https://files.pythonhosted.org/packages/dd/10/6b283707780a81919f71625351182b4f98932ac89a09023cb61865136244/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f39f58a27cc6e59f432b568ed8429c7e1641324fbe38131de852cd77b2d534b0", size = 555813, upload-time = "2025-08-27T12:15:00.334Z" }, - { url = "https://files.pythonhosted.org/packages/04/2e/30b5ea18c01379da6272a92825dd7e53dc9d15c88a19e97932d35d430ef7/rpds_py-0.27.1-cp314-cp314t-win32.whl", hash = "sha256:d5fa0ee122dc09e23607a28e6d7b150da16c662e66409bbe85230e4c85bb528a", size = 217385, upload-time = "2025-08-27T12:15:01.937Z" }, - { url = "https://files.pythonhosted.org/packages/32/7d/97119da51cb1dd3f2f3c0805f155a3aa4a95fa44fe7d78ae15e69edf4f34/rpds_py-0.27.1-cp314-cp314t-win_amd64.whl", hash = "sha256:6567d2bb951e21232c2f660c24cf3470bb96de56cdcb3f071a83feeaff8a2772", size = 230097, upload-time = "2025-08-27T12:15:03.961Z" }, +version = "0.29.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/33/23b3b3419b6a3e0f559c7c0d2ca8fc1b9448382b25245033788785921332/rpds_py-0.29.0.tar.gz", hash = "sha256:fe55fe686908f50154d1dc599232016e50c243b438c3b7432f24e2895b0e5359", size = 69359, upload-time = "2025-11-16T14:50:39.532Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/50/bc0e6e736d94e420df79be4deb5c9476b63165c87bb8f19ef75d100d21b3/rpds_py-0.29.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a0891cfd8db43e085c0ab93ab7e9b0c8fee84780d436d3b266b113e51e79f954", size = 376000, upload-time = "2025-11-16T14:48:19.141Z" }, + { url = "https://files.pythonhosted.org/packages/3e/3a/46676277160f014ae95f24de53bed0e3b7ea66c235e7de0b9df7bd5d68ba/rpds_py-0.29.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3897924d3f9a0361472d884051f9a2460358f9a45b1d85a39a158d2f8f1ad71c", size = 360575, upload-time = "2025-11-16T14:48:20.443Z" }, + { url = "https://files.pythonhosted.org/packages/75/ba/411d414ed99ea1afdd185bbabeeaac00624bd1e4b22840b5e9967ade6337/rpds_py-0.29.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a21deb8e0d1571508c6491ce5ea5e25669b1dd4adf1c9d64b6314842f708b5d", size = 392159, upload-time = "2025-11-16T14:48:22.12Z" }, + { url = "https://files.pythonhosted.org/packages/8f/b1/e18aa3a331f705467a48d0296778dc1fea9d7f6cf675bd261f9a846c7e90/rpds_py-0.29.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9efe71687d6427737a0a2de9ca1c0a216510e6cd08925c44162be23ed7bed2d5", size = 410602, upload-time = "2025-11-16T14:48:23.563Z" }, + { url = "https://files.pythonhosted.org/packages/2f/6c/04f27f0c9f2299274c76612ac9d2c36c5048bb2c6c2e52c38c60bf3868d9/rpds_py-0.29.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:40f65470919dc189c833e86b2c4bd21bd355f98436a2cef9e0a9a92aebc8e57e", size = 515808, upload-time = "2025-11-16T14:48:24.949Z" }, + { url = "https://files.pythonhosted.org/packages/83/56/a8412aa464fb151f8bc0d91fb0bb888adc9039bd41c1c6ba8d94990d8cf8/rpds_py-0.29.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:def48ff59f181130f1a2cb7c517d16328efac3ec03951cca40c1dc2049747e83", size = 416015, upload-time = "2025-11-16T14:48:26.782Z" }, + { url = "https://files.pythonhosted.org/packages/04/4c/f9b8a05faca3d9e0a6397c90d13acb9307c9792b2bff621430c58b1d6e76/rpds_py-0.29.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad7bd570be92695d89285a4b373006930715b78d96449f686af422debb4d3949", size = 395325, upload-time = "2025-11-16T14:48:28.055Z" }, + { url = "https://files.pythonhosted.org/packages/34/60/869f3bfbf8ed7b54f1ad9a5543e0fdffdd40b5a8f587fe300ee7b4f19340/rpds_py-0.29.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:5a572911cd053137bbff8e3a52d31c5d2dba51d3a67ad902629c70185f3f2181", size = 410160, upload-time = "2025-11-16T14:48:29.338Z" }, + { url = "https://files.pythonhosted.org/packages/91/aa/e5b496334e3aba4fe4c8a80187b89f3c1294c5c36f2a926da74338fa5a73/rpds_py-0.29.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d583d4403bcbf10cffc3ab5cee23d7643fcc960dff85973fd3c2d6c86e8dbb0c", size = 425309, upload-time = "2025-11-16T14:48:30.691Z" }, + { url = "https://files.pythonhosted.org/packages/85/68/4e24a34189751ceb6d66b28f18159922828dd84155876551f7ca5b25f14f/rpds_py-0.29.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:070befbb868f257d24c3bb350dbd6e2f645e83731f31264b19d7231dd5c396c7", size = 574644, upload-time = "2025-11-16T14:48:31.964Z" }, + { url = "https://files.pythonhosted.org/packages/8c/cf/474a005ea4ea9c3b4f17b6108b6b13cebfc98ebaff11d6e1b193204b3a93/rpds_py-0.29.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fc935f6b20b0c9f919a8ff024739174522abd331978f750a74bb68abd117bd19", size = 601605, upload-time = "2025-11-16T14:48:33.252Z" }, + { url = "https://files.pythonhosted.org/packages/f4/b1/c56f6a9ab8c5f6bb5c65c4b5f8229167a3a525245b0773f2c0896686b64e/rpds_py-0.29.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8c5a8ecaa44ce2d8d9d20a68a2483a74c07f05d72e94a4dff88906c8807e77b0", size = 564593, upload-time = "2025-11-16T14:48:34.643Z" }, + { url = "https://files.pythonhosted.org/packages/b3/13/0494cecce4848f68501e0a229432620b4b57022388b071eeff95f3e1e75b/rpds_py-0.29.0-cp312-cp312-win32.whl", hash = "sha256:ba5e1aeaf8dd6d8f6caba1f5539cddda87d511331714b7b5fc908b6cfc3636b7", size = 223853, upload-time = "2025-11-16T14:48:36.419Z" }, + { url = "https://files.pythonhosted.org/packages/1f/6a/51e9aeb444a00cdc520b032a28b07e5f8dc7bc328b57760c53e7f96997b4/rpds_py-0.29.0-cp312-cp312-win_amd64.whl", hash = "sha256:b5f6134faf54b3cb83375db0f113506f8b7770785be1f95a631e7e2892101977", size = 239895, upload-time = "2025-11-16T14:48:37.956Z" }, + { url = "https://files.pythonhosted.org/packages/d1/d4/8bce56cdad1ab873e3f27cb31c6a51d8f384d66b022b820525b879f8bed1/rpds_py-0.29.0-cp312-cp312-win_arm64.whl", hash = "sha256:b016eddf00dca7944721bf0cd85b6af7f6c4efaf83ee0b37c4133bd39757a8c7", size = 230321, upload-time = "2025-11-16T14:48:39.71Z" }, + { url = "https://files.pythonhosted.org/packages/fd/d9/c5de60d9d371bbb186c3e9bf75f4fc5665e11117a25a06a6b2e0afb7380e/rpds_py-0.29.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1585648d0760b88292eecab5181f5651111a69d90eff35d6b78aa32998886a61", size = 375710, upload-time = "2025-11-16T14:48:41.063Z" }, + { url = "https://files.pythonhosted.org/packages/b3/b3/0860cdd012291dc21272895ce107f1e98e335509ba986dd83d72658b82b9/rpds_py-0.29.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:521807963971a23996ddaf764c682b3e46459b3c58ccd79fefbe16718db43154", size = 360582, upload-time = "2025-11-16T14:48:42.423Z" }, + { url = "https://files.pythonhosted.org/packages/92/8a/a18c2f4a61b3407e56175f6aab6deacdf9d360191a3d6f38566e1eaf7266/rpds_py-0.29.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a8896986efaa243ab713c69e6491a4138410f0fe36f2f4c71e18bd5501e8014", size = 391172, upload-time = "2025-11-16T14:48:43.75Z" }, + { url = "https://files.pythonhosted.org/packages/fd/49/e93354258508c50abc15cdcd5fcf7ac4117f67bb6233ad7859f75e7372a0/rpds_py-0.29.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1d24564a700ef41480a984c5ebed62b74e6ce5860429b98b1fede76049e953e6", size = 409586, upload-time = "2025-11-16T14:48:45.498Z" }, + { url = "https://files.pythonhosted.org/packages/5a/8d/a27860dae1c19a6bdc901f90c81f0d581df1943355802961a57cdb5b6cd1/rpds_py-0.29.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e6596b93c010d386ae46c9fba9bfc9fc5965fa8228edeac51576299182c2e31c", size = 516339, upload-time = "2025-11-16T14:48:47.308Z" }, + { url = "https://files.pythonhosted.org/packages/fc/ad/a75e603161e79b7110c647163d130872b271c6b28712c803c65d492100f7/rpds_py-0.29.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5cc58aac218826d054c7da7f95821eba94125d88be673ff44267bb89d12a5866", size = 416201, upload-time = "2025-11-16T14:48:48.615Z" }, + { url = "https://files.pythonhosted.org/packages/b9/42/555b4ee17508beafac135c8b450816ace5a96194ce97fefc49d58e5652ea/rpds_py-0.29.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de73e40ebc04dd5d9556f50180395322193a78ec247e637e741c1b954810f295", size = 395095, upload-time = "2025-11-16T14:48:50.027Z" }, + { url = "https://files.pythonhosted.org/packages/cd/f0/c90b671b9031e800ec45112be42ea9f027f94f9ac25faaac8770596a16a1/rpds_py-0.29.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:295ce5ac7f0cf69a651ea75c8f76d02a31f98e5698e82a50a5f4d4982fbbae3b", size = 410077, upload-time = "2025-11-16T14:48:51.515Z" }, + { url = "https://files.pythonhosted.org/packages/3d/80/9af8b640b81fe21e6f718e9dec36c0b5f670332747243130a5490f292245/rpds_py-0.29.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1ea59b23ea931d494459c8338056fe7d93458c0bf3ecc061cd03916505369d55", size = 424548, upload-time = "2025-11-16T14:48:53.237Z" }, + { url = "https://files.pythonhosted.org/packages/e4/0b/b5647446e991736e6a495ef510e6710df91e880575a586e763baeb0aa770/rpds_py-0.29.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f49d41559cebd608042fdcf54ba597a4a7555b49ad5c1c0c03e0af82692661cd", size = 573661, upload-time = "2025-11-16T14:48:54.769Z" }, + { url = "https://files.pythonhosted.org/packages/f7/b3/1b1c9576839ff583d1428efbf59f9ee70498d8ce6c0b328ac02f1e470879/rpds_py-0.29.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:05a2bd42768ea988294ca328206efbcc66e220d2d9b7836ee5712c07ad6340ea", size = 600937, upload-time = "2025-11-16T14:48:56.247Z" }, + { url = "https://files.pythonhosted.org/packages/6c/7b/b6cfca2f9fee4c4494ce54f7fb1b9f578867495a9aa9fc0d44f5f735c8e0/rpds_py-0.29.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:33ca7bdfedd83339ca55da3a5e1527ee5870d4b8369456b5777b197756f3ca22", size = 564496, upload-time = "2025-11-16T14:48:57.691Z" }, + { url = "https://files.pythonhosted.org/packages/b9/fb/ba29ec7f0f06eb801bac5a23057a9ff7670623b5e8013bd59bec4aa09de8/rpds_py-0.29.0-cp313-cp313-win32.whl", hash = "sha256:20c51ae86a0bb9accc9ad4e6cdeec58d5ebb7f1b09dd4466331fc65e1766aae7", size = 223126, upload-time = "2025-11-16T14:48:59.058Z" }, + { url = "https://files.pythonhosted.org/packages/3c/6b/0229d3bed4ddaa409e6d90b0ae967ed4380e4bdd0dad6e59b92c17d42457/rpds_py-0.29.0-cp313-cp313-win_amd64.whl", hash = "sha256:6410e66f02803600edb0b1889541f4b5cc298a5ccda0ad789cc50ef23b54813e", size = 239771, upload-time = "2025-11-16T14:49:00.872Z" }, + { url = "https://files.pythonhosted.org/packages/e4/38/d2868f058b164f8efd89754d85d7b1c08b454f5c07ac2e6cc2e9bd4bd05b/rpds_py-0.29.0-cp313-cp313-win_arm64.whl", hash = "sha256:56838e1cd9174dc23c5691ee29f1d1be9eab357f27efef6bded1328b23e1ced2", size = 229994, upload-time = "2025-11-16T14:49:02.673Z" }, + { url = "https://files.pythonhosted.org/packages/52/91/5de91c5ec7d41759beec9b251630824dbb8e32d20c3756da1a9a9d309709/rpds_py-0.29.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:37d94eadf764d16b9a04307f2ab1d7af6dc28774bbe0535c9323101e14877b4c", size = 365886, upload-time = "2025-11-16T14:49:04.133Z" }, + { url = "https://files.pythonhosted.org/packages/85/7c/415d8c1b016d5f47ecec5145d9d6d21002d39dce8761b30f6c88810b455a/rpds_py-0.29.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d472cf73efe5726a067dce63eebe8215b14beabea7c12606fd9994267b3cfe2b", size = 355262, upload-time = "2025-11-16T14:49:05.543Z" }, + { url = "https://files.pythonhosted.org/packages/3d/14/bf83e2daa4f980e4dc848aed9299792a8b84af95e12541d9e7562f84a6ef/rpds_py-0.29.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72fdfd5ff8992e4636621826371e3ac5f3e3b8323e9d0e48378e9c13c3dac9d0", size = 384826, upload-time = "2025-11-16T14:49:07.301Z" }, + { url = "https://files.pythonhosted.org/packages/33/b8/53330c50a810ae22b4fbba5e6cf961b68b9d72d9bd6780a7c0a79b070857/rpds_py-0.29.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2549d833abdf8275c901313b9e8ff8fba57e50f6a495035a2a4e30621a2f7cc4", size = 394234, upload-time = "2025-11-16T14:49:08.782Z" }, + { url = "https://files.pythonhosted.org/packages/cc/32/01e2e9645cef0e584f518cfde4567563e57db2257244632b603f61b40e50/rpds_py-0.29.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4448dad428f28a6a767c3e3b80cde3446a22a0efbddaa2360f4bb4dc836d0688", size = 520008, upload-time = "2025-11-16T14:49:10.253Z" }, + { url = "https://files.pythonhosted.org/packages/98/c3/0d1b95a81affae2b10f950782e33a1fd2edd6ce2a479966cac98c9a66f57/rpds_py-0.29.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:115f48170fd4296a33938d8c11f697f5f26e0472e43d28f35624764173a60e4d", size = 409569, upload-time = "2025-11-16T14:49:12.478Z" }, + { url = "https://files.pythonhosted.org/packages/fa/60/aa3b8678f3f009f675b99174fa2754302a7fbfe749162e8043d111de2d88/rpds_py-0.29.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e5bb73ffc029820f4348e9b66b3027493ae00bca6629129cd433fd7a76308ee", size = 385188, upload-time = "2025-11-16T14:49:13.88Z" }, + { url = "https://files.pythonhosted.org/packages/92/02/5546c1c8aa89c18d40c1fcffdcc957ba730dee53fb7c3ca3a46f114761d2/rpds_py-0.29.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:b1581fcde18fcdf42ea2403a16a6b646f8eb1e58d7f90a0ce693da441f76942e", size = 398587, upload-time = "2025-11-16T14:49:15.339Z" }, + { url = "https://files.pythonhosted.org/packages/6c/e0/ad6eeaf47e236eba052fa34c4073078b9e092bd44da6bbb35aaae9580669/rpds_py-0.29.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16e9da2bda9eb17ea318b4c335ec9ac1818e88922cbe03a5743ea0da9ecf74fb", size = 416641, upload-time = "2025-11-16T14:49:16.832Z" }, + { url = "https://files.pythonhosted.org/packages/1a/93/0acedfd50ad9cdd3879c615a6dc8c5f1ce78d2fdf8b87727468bb5bb4077/rpds_py-0.29.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:28fd300326dd21198f311534bdb6d7e989dd09b3418b3a91d54a0f384c700967", size = 566683, upload-time = "2025-11-16T14:49:18.342Z" }, + { url = "https://files.pythonhosted.org/packages/62/53/8c64e0f340a9e801459fc6456821abc15b3582cb5dc3932d48705a9d9ac7/rpds_py-0.29.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2aba991e041d031c7939e1358f583ae405a7bf04804ca806b97a5c0e0af1ea5e", size = 592730, upload-time = "2025-11-16T14:49:19.767Z" }, + { url = "https://files.pythonhosted.org/packages/85/ef/3109b6584f8c4b0d2490747c916df833c127ecfa82be04d9a40a376f2090/rpds_py-0.29.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7f437026dbbc3f08c99cc41a5b2570c6e1a1ddbe48ab19a9b814254128d4ea7a", size = 557361, upload-time = "2025-11-16T14:49:21.574Z" }, + { url = "https://files.pythonhosted.org/packages/ff/3b/61586475e82d57f01da2c16edb9115a618afe00ce86fe1b58936880b15af/rpds_py-0.29.0-cp313-cp313t-win32.whl", hash = "sha256:6e97846e9800a5d0fe7be4d008f0c93d0feeb2700da7b1f7528dabafb31dfadb", size = 211227, upload-time = "2025-11-16T14:49:23.03Z" }, + { url = "https://files.pythonhosted.org/packages/3b/3a/12dc43f13594a54ea0c9d7e9d43002116557330e3ad45bc56097ddf266e2/rpds_py-0.29.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f49196aec7c4b406495f60e6f947ad71f317a765f956d74bbd83996b9edc0352", size = 225248, upload-time = "2025-11-16T14:49:24.841Z" }, + { url = "https://files.pythonhosted.org/packages/89/b1/0b1474e7899371d9540d3bbb2a499a3427ae1fc39c998563fe9035a1073b/rpds_py-0.29.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:394d27e4453d3b4d82bb85665dc1fcf4b0badc30fc84282defed71643b50e1a1", size = 363731, upload-time = "2025-11-16T14:49:26.683Z" }, + { url = "https://files.pythonhosted.org/packages/28/12/3b7cf2068d0a334ed1d7b385a9c3c8509f4c2bcba3d4648ea71369de0881/rpds_py-0.29.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:55d827b2ae95425d3be9bc9a5838b6c29d664924f98146557f7715e331d06df8", size = 354343, upload-time = "2025-11-16T14:49:28.24Z" }, + { url = "https://files.pythonhosted.org/packages/eb/73/5afcf8924bc02a749416eda64e17ac9c9b28f825f4737385295a0e99b0c1/rpds_py-0.29.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc31a07ed352e5462d3ee1b22e89285f4ce97d5266f6d1169da1142e78045626", size = 385406, upload-time = "2025-11-16T14:49:29.943Z" }, + { url = "https://files.pythonhosted.org/packages/c8/37/5db736730662508535221737a21563591b6f43c77f2e388951c42f143242/rpds_py-0.29.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c4695dd224212f6105db7ea62197144230b808d6b2bba52238906a2762f1d1e7", size = 396162, upload-time = "2025-11-16T14:49:31.833Z" }, + { url = "https://files.pythonhosted.org/packages/70/0d/491c1017d14f62ce7bac07c32768d209a50ec567d76d9f383b4cfad19b80/rpds_py-0.29.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcae1770b401167f8b9e1e3f566562e6966ffa9ce63639916248a9e25fa8a244", size = 517719, upload-time = "2025-11-16T14:49:33.804Z" }, + { url = "https://files.pythonhosted.org/packages/d7/25/b11132afcb17cd5d82db173f0c8dab270ffdfaba43e5ce7a591837ae9649/rpds_py-0.29.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:90f30d15f45048448b8da21c41703b31c61119c06c216a1bf8c245812a0f0c17", size = 409498, upload-time = "2025-11-16T14:49:35.222Z" }, + { url = "https://files.pythonhosted.org/packages/0f/7d/e6543cedfb2e6403a1845710a5ab0e0ccf8fc288e0b5af9a70bfe2c12053/rpds_py-0.29.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44a91e0ab77bdc0004b43261a4b8cd6d6b451e8d443754cfda830002b5745b32", size = 382743, upload-time = "2025-11-16T14:49:36.704Z" }, + { url = "https://files.pythonhosted.org/packages/75/11/a4ebc9f654293ae9fefb83b2b6be7f3253e85ea42a5db2f77d50ad19aaeb/rpds_py-0.29.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:4aa195e5804d32c682e453b34474f411ca108e4291c6a0f824ebdc30a91c973c", size = 400317, upload-time = "2025-11-16T14:49:39.132Z" }, + { url = "https://files.pythonhosted.org/packages/52/18/97677a60a81c7f0e5f64e51fb3f8271c5c8fcabf3a2df18e97af53d7c2bf/rpds_py-0.29.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7971bdb7bf4ee0f7e6f67fa4c7fbc6019d9850cc977d126904392d363f6f8318", size = 416979, upload-time = "2025-11-16T14:49:40.575Z" }, + { url = "https://files.pythonhosted.org/packages/f0/69/28ab391a9968f6c746b2a2db181eaa4d16afaa859fedc9c2f682d19f7e18/rpds_py-0.29.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8ae33ad9ce580c7a47452c3b3f7d8a9095ef6208e0a0c7e4e2384f9fc5bf8212", size = 567288, upload-time = "2025-11-16T14:49:42.24Z" }, + { url = "https://files.pythonhosted.org/packages/3b/d3/0c7afdcdb830eee94f5611b64e71354ffe6ac8df82d00c2faf2bfffd1d4e/rpds_py-0.29.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:c661132ab2fb4eeede2ef69670fd60da5235209874d001a98f1542f31f2a8a94", size = 593157, upload-time = "2025-11-16T14:49:43.782Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ac/a0fcbc2feed4241cf26d32268c195eb88ddd4bd862adfc9d4b25edfba535/rpds_py-0.29.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:bb78b3a0d31ac1bde132c67015a809948db751cb4e92cdb3f0b242e430b6ed0d", size = 554741, upload-time = "2025-11-16T14:49:45.557Z" }, + { url = "https://files.pythonhosted.org/packages/0f/f1/fcc24137c470df8588674a677f33719d5800ec053aaacd1de8a5d5d84d9e/rpds_py-0.29.0-cp314-cp314-win32.whl", hash = "sha256:f475f103488312e9bd4000bc890a95955a07b2d0b6e8884aef4be56132adbbf1", size = 215508, upload-time = "2025-11-16T14:49:47.562Z" }, + { url = "https://files.pythonhosted.org/packages/7b/c7/1d169b2045512eac019918fc1021ea07c30e84a4343f9f344e3e0aa8c788/rpds_py-0.29.0-cp314-cp314-win_amd64.whl", hash = "sha256:b9cf2359a4fca87cfb6801fae83a76aedf66ee1254a7a151f1341632acf67f1b", size = 228125, upload-time = "2025-11-16T14:49:49.064Z" }, + { url = "https://files.pythonhosted.org/packages/be/36/0cec88aaba70ec4a6e381c444b0d916738497d27f0c30406e3d9fcbd3bc2/rpds_py-0.29.0-cp314-cp314-win_arm64.whl", hash = "sha256:9ba8028597e824854f0f1733d8b964e914ae3003b22a10c2c664cb6927e0feb9", size = 221992, upload-time = "2025-11-16T14:49:50.777Z" }, + { url = "https://files.pythonhosted.org/packages/b1/fa/a2e524631717c9c0eb5d90d30f648cfba6b731047821c994acacb618406c/rpds_py-0.29.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:e71136fd0612556b35c575dc2726ae04a1669e6a6c378f2240312cf5d1a2ab10", size = 366425, upload-time = "2025-11-16T14:49:52.691Z" }, + { url = "https://files.pythonhosted.org/packages/a2/a4/6d43ebe0746ff694a30233f63f454aed1677bd50ab7a59ff6b2bb5ac61f2/rpds_py-0.29.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:76fe96632d53f3bf0ea31ede2f53bbe3540cc2736d4aec3b3801b0458499ef3a", size = 355282, upload-time = "2025-11-16T14:49:54.292Z" }, + { url = "https://files.pythonhosted.org/packages/fa/a7/52fd8270e0320b09eaf295766ae81dd175f65394687906709b3e75c71d06/rpds_py-0.29.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9459a33f077130dbb2c7c3cea72ee9932271fb3126404ba2a2661e4fe9eb7b79", size = 384968, upload-time = "2025-11-16T14:49:55.857Z" }, + { url = "https://files.pythonhosted.org/packages/f4/7d/e6bc526b7a14e1ef80579a52c1d4ad39260a058a51d66c6039035d14db9d/rpds_py-0.29.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5c9546cfdd5d45e562cc0444b6dddc191e625c62e866bf567a2c69487c7ad28a", size = 394714, upload-time = "2025-11-16T14:49:57.343Z" }, + { url = "https://files.pythonhosted.org/packages/c0/3f/f0ade3954e7db95c791e7eaf978aa7e08a756d2046e8bdd04d08146ed188/rpds_py-0.29.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12597d11d97b8f7e376c88929a6e17acb980e234547c92992f9f7c058f1a7310", size = 520136, upload-time = "2025-11-16T14:49:59.162Z" }, + { url = "https://files.pythonhosted.org/packages/87/b3/07122ead1b97009715ab9d4082be6d9bd9546099b2b03fae37c3116f72be/rpds_py-0.29.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28de03cf48b8a9e6ec10318f2197b83946ed91e2891f651a109611be4106ac4b", size = 409250, upload-time = "2025-11-16T14:50:00.698Z" }, + { url = "https://files.pythonhosted.org/packages/c9/c6/dcbee61fd1dc892aedcb1b489ba661313101aa82ec84b1a015d4c63ebfda/rpds_py-0.29.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd7951c964069039acc9d67a8ff1f0a7f34845ae180ca542b17dc1456b1f1808", size = 384940, upload-time = "2025-11-16T14:50:02.312Z" }, + { url = "https://files.pythonhosted.org/packages/47/11/914ecb6f3574cf9bf8b38aced4063e0f787d6e1eb30b181a7efbc6c1da9a/rpds_py-0.29.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:c07d107b7316088f1ac0177a7661ca0c6670d443f6fe72e836069025e6266761", size = 399392, upload-time = "2025-11-16T14:50:03.829Z" }, + { url = "https://files.pythonhosted.org/packages/f5/fd/2f4bd9433f58f816434bb934313584caa47dbc6f03ce5484df8ac8980561/rpds_py-0.29.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1de2345af363d25696969befc0c1688a6cb5e8b1d32b515ef84fc245c6cddba3", size = 416796, upload-time = "2025-11-16T14:50:05.558Z" }, + { url = "https://files.pythonhosted.org/packages/79/a5/449f0281af33efa29d5c71014399d74842342ae908d8cd38260320167692/rpds_py-0.29.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:00e56b12d2199ca96068057e1ae7f9998ab6e99cda82431afafd32f3ec98cca9", size = 566843, upload-time = "2025-11-16T14:50:07.243Z" }, + { url = "https://files.pythonhosted.org/packages/ab/32/0a6a1ccee2e37fcb1b7ba9afde762b77182dbb57937352a729c6cd3cf2bb/rpds_py-0.29.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3919a3bbecee589300ed25000b6944174e07cd20db70552159207b3f4bbb45b8", size = 593956, upload-time = "2025-11-16T14:50:09.029Z" }, + { url = "https://files.pythonhosted.org/packages/4a/3d/eb820f95dce4306f07a495ede02fb61bef36ea201d9137d4fcd5ab94ec1e/rpds_py-0.29.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7fa2ccc312bbd91e43aa5e0869e46bc03278a3dddb8d58833150a18b0f0283a", size = 557288, upload-time = "2025-11-16T14:50:10.73Z" }, + { url = "https://files.pythonhosted.org/packages/e9/f8/b8ff786f40470462a252918e0836e0db903c28e88e3eec66bc4a7856ee5d/rpds_py-0.29.0-cp314-cp314t-win32.whl", hash = "sha256:97c817863ffc397f1e6a6e9d2d89fe5408c0a9922dac0329672fb0f35c867ea5", size = 211382, upload-time = "2025-11-16T14:50:12.827Z" }, + { url = "https://files.pythonhosted.org/packages/c9/7f/1a65ae870bc9d0576aebb0c501ea5dccf1ae2178fe2821042150ebd2e707/rpds_py-0.29.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2023473f444752f0f82a58dfcbee040d0a1b3d1b3c2ec40e884bd25db6d117d2", size = 225919, upload-time = "2025-11-16T14:50:14.734Z" }, ] [[package]] name = "ruff" -version = "0.14.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/75/62/50b7727004dfe361104dfbf898c45a9a2fdfad8c72c04ae62900224d6ecf/ruff-0.14.3.tar.gz", hash = "sha256:4ff876d2ab2b161b6de0aa1f5bd714e8e9b4033dc122ee006925fbacc4f62153", size = 5558687, upload-time = "2025-10-31T00:26:26.878Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/8e/0c10ff1ea5d4360ab8bfca4cb2c9d979101a391f3e79d2616c9bf348cd26/ruff-0.14.3-py3-none-linux_armv6l.whl", hash = "sha256:876b21e6c824f519446715c1342b8e60f97f93264012de9d8d10314f8a79c371", size = 12535613, upload-time = "2025-10-31T00:25:44.302Z" }, - { url = "https://files.pythonhosted.org/packages/d3/c8/6724f4634c1daf52409fbf13fefda64aa9c8f81e44727a378b7b73dc590b/ruff-0.14.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b6fd8c79b457bedd2abf2702b9b472147cd860ed7855c73a5247fa55c9117654", size = 12855812, upload-time = "2025-10-31T00:25:47.793Z" }, - { url = "https://files.pythonhosted.org/packages/de/03/db1bce591d55fd5f8a08bb02517fa0b5097b2ccabd4ea1ee29aa72b67d96/ruff-0.14.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:71ff6edca490c308f083156938c0c1a66907151263c4abdcb588602c6e696a14", size = 11944026, upload-time = "2025-10-31T00:25:49.657Z" }, - { url = "https://files.pythonhosted.org/packages/0b/75/4f8dbd48e03272715d12c87dc4fcaaf21b913f0affa5f12a4e9c6f8a0582/ruff-0.14.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:786ee3ce6139772ff9272aaf43296d975c0217ee1b97538a98171bf0d21f87ed", size = 12356818, upload-time = "2025-10-31T00:25:51.949Z" }, - { url = "https://files.pythonhosted.org/packages/ec/9b/506ec5b140c11d44a9a4f284ea7c14ebf6f8b01e6e8917734a3325bff787/ruff-0.14.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cd6291d0061811c52b8e392f946889916757610d45d004e41140d81fb6cd5ddc", size = 12336745, upload-time = "2025-10-31T00:25:54.248Z" }, - { url = "https://files.pythonhosted.org/packages/c7/e1/c560d254048c147f35e7f8131d30bc1f63a008ac61595cf3078a3e93533d/ruff-0.14.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a497ec0c3d2c88561b6d90f9c29f5ae68221ac00d471f306fa21fa4264ce5fcd", size = 13101684, upload-time = "2025-10-31T00:25:56.253Z" }, - { url = "https://files.pythonhosted.org/packages/a5/32/e310133f8af5cd11f8cc30f52522a3ebccc5ea5bff4b492f94faceaca7a8/ruff-0.14.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:e231e1be58fc568950a04fbe6887c8e4b85310e7889727e2b81db205c45059eb", size = 14535000, upload-time = "2025-10-31T00:25:58.397Z" }, - { url = "https://files.pythonhosted.org/packages/a2/a1/7b0470a22158c6d8501eabc5e9b6043c99bede40fa1994cadf6b5c2a61c7/ruff-0.14.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:469e35872a09c0e45fecf48dd960bfbce056b5db2d5e6b50eca329b4f853ae20", size = 14156450, upload-time = "2025-10-31T00:26:00.889Z" }, - { url = "https://files.pythonhosted.org/packages/0a/96/24bfd9d1a7f532b560dcee1a87096332e461354d3882124219bcaff65c09/ruff-0.14.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d6bc90307c469cb9d28b7cfad90aaa600b10d67c6e22026869f585e1e8a2db0", size = 13568414, upload-time = "2025-10-31T00:26:03.291Z" }, - { url = "https://files.pythonhosted.org/packages/a7/e7/138b883f0dfe4ad5b76b58bf4ae675f4d2176ac2b24bdd81b4d966b28c61/ruff-0.14.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2f8a0bbcffcfd895df39c9a4ecd59bb80dca03dc43f7fb63e647ed176b741e", size = 13315293, upload-time = "2025-10-31T00:26:05.708Z" }, - { url = "https://files.pythonhosted.org/packages/33/f4/c09bb898be97b2eb18476b7c950df8815ef14cf956074177e9fbd40b7719/ruff-0.14.3-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:678fdd7c7d2d94851597c23ee6336d25f9930b460b55f8598e011b57c74fd8c5", size = 13539444, upload-time = "2025-10-31T00:26:08.09Z" }, - { url = "https://files.pythonhosted.org/packages/9c/aa/b30a1db25fc6128b1dd6ff0741fa4abf969ded161599d07ca7edd0739cc0/ruff-0.14.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:1ec1ac071e7e37e0221d2f2dbaf90897a988c531a8592a6a5959f0603a1ecf5e", size = 12252581, upload-time = "2025-10-31T00:26:10.297Z" }, - { url = "https://files.pythonhosted.org/packages/da/13/21096308f384d796ffe3f2960b17054110a9c3828d223ca540c2b7cc670b/ruff-0.14.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:afcdc4b5335ef440d19e7df9e8ae2ad9f749352190e96d481dc501b753f0733e", size = 12307503, upload-time = "2025-10-31T00:26:12.646Z" }, - { url = "https://files.pythonhosted.org/packages/cb/cc/a350bac23f03b7dbcde3c81b154706e80c6f16b06ff1ce28ed07dc7b07b0/ruff-0.14.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:7bfc42f81862749a7136267a343990f865e71fe2f99cf8d2958f684d23ce3dfa", size = 12675457, upload-time = "2025-10-31T00:26:15.044Z" }, - { url = "https://files.pythonhosted.org/packages/cb/76/46346029fa2f2078826bc88ef7167e8c198e58fe3126636e52f77488cbba/ruff-0.14.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:a65e448cfd7e9c59fae8cf37f9221585d3354febaad9a07f29158af1528e165f", size = 13403980, upload-time = "2025-10-31T00:26:17.81Z" }, - { url = "https://files.pythonhosted.org/packages/9f/a4/35f1ef68c4e7b236d4a5204e3669efdeefaef21f0ff6a456792b3d8be438/ruff-0.14.3-py3-none-win32.whl", hash = "sha256:f3d91857d023ba93e14ed2d462ab62c3428f9bbf2b4fbac50a03ca66d31991f7", size = 12500045, upload-time = "2025-10-31T00:26:20.503Z" }, - { url = "https://files.pythonhosted.org/packages/03/15/51960ae340823c9859fb60c63301d977308735403e2134e17d1d2858c7fb/ruff-0.14.3-py3-none-win_amd64.whl", hash = "sha256:d7b7006ac0756306db212fd37116cce2bd307e1e109375e1c6c106002df0ae5f", size = 13594005, upload-time = "2025-10-31T00:26:22.533Z" }, - { url = "https://files.pythonhosted.org/packages/b7/73/4de6579bac8e979fca0a77e54dec1f1e011a0d268165eb8a9bc0982a6564/ruff-0.14.3-py3-none-win_arm64.whl", hash = "sha256:26eb477ede6d399d898791d01961e16b86f02bc2486d0d1a7a9bb2379d055dc1", size = 12590017, upload-time = "2025-10-31T00:26:24.52Z" }, +version = "0.14.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/fa/fbb67a5780ae0f704876cb8ac92d6d76da41da4dc72b7ed3565ab18f2f52/ruff-0.14.5.tar.gz", hash = "sha256:8d3b48d7d8aad423d3137af7ab6c8b1e38e4de104800f0d596990f6ada1a9fc1", size = 5615944, upload-time = "2025-11-13T19:58:51.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/31/c07e9c535248d10836a94e4f4e8c5a31a1beed6f169b31405b227872d4f4/ruff-0.14.5-py3-none-linux_armv6l.whl", hash = "sha256:f3b8248123b586de44a8018bcc9fefe31d23dda57a34e6f0e1e53bd51fd63594", size = 13171630, upload-time = "2025-11-13T19:57:54.894Z" }, + { url = "https://files.pythonhosted.org/packages/8e/5c/283c62516dca697cd604c2796d1487396b7a436b2f0ecc3fd412aca470e0/ruff-0.14.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:f7a75236570318c7a30edd7f5491945f0169de738d945ca8784500b517163a72", size = 13413925, upload-time = "2025-11-13T19:57:59.181Z" }, + { url = "https://files.pythonhosted.org/packages/b6/f3/aa319f4afc22cb6fcba2b9cdfc0f03bbf747e59ab7a8c5e90173857a1361/ruff-0.14.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6d146132d1ee115f8802356a2dc9a634dbf58184c51bff21f313e8cd1c74899a", size = 12574040, upload-time = "2025-11-13T19:58:02.056Z" }, + { url = "https://files.pythonhosted.org/packages/f9/7f/cb5845fcc7c7e88ed57f58670189fc2ff517fe2134c3821e77e29fd3b0c8/ruff-0.14.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2380596653dcd20b057794d55681571a257a42327da8894b93bbd6111aa801f", size = 13009755, upload-time = "2025-11-13T19:58:05.172Z" }, + { url = "https://files.pythonhosted.org/packages/21/d2/bcbedbb6bcb9253085981730687ddc0cc7b2e18e8dc13cf4453de905d7a0/ruff-0.14.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2d1fa985a42b1f075a098fa1ab9d472b712bdb17ad87a8ec86e45e7fa6273e68", size = 12937641, upload-time = "2025-11-13T19:58:08.345Z" }, + { url = "https://files.pythonhosted.org/packages/a4/58/e25de28a572bdd60ffc6bb71fc7fd25a94ec6a076942e372437649cbb02a/ruff-0.14.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88f0770d42b7fa02bbefddde15d235ca3aa24e2f0137388cc15b2dcbb1f7c7a7", size = 13610854, upload-time = "2025-11-13T19:58:11.419Z" }, + { url = "https://files.pythonhosted.org/packages/7d/24/43bb3fd23ecee9861970978ea1a7a63e12a204d319248a7e8af539984280/ruff-0.14.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:3676cb02b9061fee7294661071c4709fa21419ea9176087cb77e64410926eb78", size = 15061088, upload-time = "2025-11-13T19:58:14.551Z" }, + { url = "https://files.pythonhosted.org/packages/23/44/a022f288d61c2f8c8645b24c364b719aee293ffc7d633a2ca4d116b9c716/ruff-0.14.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b595bedf6bc9cab647c4a173a61acf4f1ac5f2b545203ba82f30fcb10b0318fb", size = 14734717, upload-time = "2025-11-13T19:58:17.518Z" }, + { url = "https://files.pythonhosted.org/packages/58/81/5c6ba44de7e44c91f68073e0658109d8373b0590940efe5bd7753a2585a3/ruff-0.14.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f55382725ad0bdb2e8ee2babcbbfb16f124f5a59496a2f6a46f1d9d99d93e6e2", size = 14028812, upload-time = "2025-11-13T19:58:20.533Z" }, + { url = "https://files.pythonhosted.org/packages/ad/ef/41a8b60f8462cb320f68615b00299ebb12660097c952c600c762078420f8/ruff-0.14.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7497d19dce23976bdaca24345ae131a1d38dcfe1b0850ad8e9e6e4fa321a6e19", size = 13825656, upload-time = "2025-11-13T19:58:23.345Z" }, + { url = "https://files.pythonhosted.org/packages/7c/00/207e5de737fdb59b39eb1fac806904fe05681981b46d6a6db9468501062e/ruff-0.14.5-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:410e781f1122d6be4f446981dd479470af86537fb0b8857f27a6e872f65a38e4", size = 13959922, upload-time = "2025-11-13T19:58:26.537Z" }, + { url = "https://files.pythonhosted.org/packages/bc/7e/fa1f5c2776db4be405040293618846a2dece5c70b050874c2d1f10f24776/ruff-0.14.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c01be527ef4c91a6d55e53b337bfe2c0f82af024cc1a33c44792d6844e2331e1", size = 12932501, upload-time = "2025-11-13T19:58:29.822Z" }, + { url = "https://files.pythonhosted.org/packages/67/d8/d86bf784d693a764b59479a6bbdc9515ae42c340a5dc5ab1dabef847bfaa/ruff-0.14.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:f66e9bb762e68d66e48550b59c74314168ebb46199886c5c5aa0b0fbcc81b151", size = 12927319, upload-time = "2025-11-13T19:58:32.923Z" }, + { url = "https://files.pythonhosted.org/packages/ac/de/ee0b304d450ae007ce0cb3e455fe24fbcaaedae4ebaad6c23831c6663651/ruff-0.14.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:d93be8f1fa01022337f1f8f3bcaa7ffee2d0b03f00922c45c2207954f351f465", size = 13206209, upload-time = "2025-11-13T19:58:35.952Z" }, + { url = "https://files.pythonhosted.org/packages/33/aa/193ca7e3a92d74f17d9d5771a765965d2cf42c86e6f0fd95b13969115723/ruff-0.14.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:c135d4b681f7401fe0e7312017e41aba9b3160861105726b76cfa14bc25aa367", size = 13953709, upload-time = "2025-11-13T19:58:39.002Z" }, + { url = "https://files.pythonhosted.org/packages/cc/f1/7119e42aa1d3bf036ffc9478885c2e248812b7de9abea4eae89163d2929d/ruff-0.14.5-py3-none-win32.whl", hash = "sha256:c83642e6fccfb6dea8b785eb9f456800dcd6a63f362238af5fc0c83d027dd08b", size = 12925808, upload-time = "2025-11-13T19:58:42.779Z" }, + { url = "https://files.pythonhosted.org/packages/3b/9d/7c0a255d21e0912114784e4a96bf62af0618e2190cae468cd82b13625ad2/ruff-0.14.5-py3-none-win_amd64.whl", hash = "sha256:9d55d7af7166f143c94eae1db3312f9ea8f95a4defef1979ed516dbb38c27621", size = 14331546, upload-time = "2025-11-13T19:58:45.691Z" }, + { url = "https://files.pythonhosted.org/packages/e5/80/69756670caedcf3b9be597a6e12276a6cf6197076eb62aad0c608f8efce0/ruff-0.14.5-py3-none-win_arm64.whl", hash = "sha256:4b700459d4649e2594b31f20a9de33bc7c19976d4746d8d0798ad959621d64a4", size = 13433331, upload-time = "2025-11-13T19:58:48.434Z" }, ] [[package]] @@ -2142,6 +2184,7 @@ name = "seedcase-sprout" version = "0.48.1" source = { editable = "." } dependencies = [ + { name = "check-datapackage" }, { name = "dacite" }, { name = "deepmerge" }, { name = "jinja2" }, @@ -2175,6 +2218,7 @@ dev = [ [package.metadata] requires-dist = [ + { name = "check-datapackage", specifier = ">=0.23.1" }, { name = "dacite", specifier = ">=1.9.2" }, { name = "deepmerge", specifier = ">=2.0" }, { name = "jinja2", specifier = ">=3.1.6" }, @@ -2293,11 +2337,11 @@ wheels = [ [[package]] name = "stevedore" -version = "5.5.0" +version = "5.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2a/5f/8418daad5c353300b7661dd8ce2574b0410a6316a8be650a189d5c68d938/stevedore-5.5.0.tar.gz", hash = "sha256:d31496a4f4df9825e1a1e4f1f74d19abb0154aff311c3b376fcc89dae8fccd73", size = 513878, upload-time = "2025-08-25T12:54:26.806Z" } +sdist = { url = "https://files.pythonhosted.org/packages/96/5b/496f8abebd10c3301129abba7ddafd46c71d799a70c44ab080323987c4c9/stevedore-5.6.0.tar.gz", hash = "sha256:f22d15c6ead40c5bbfa9ca54aa7e7b4a07d59b36ae03ed12ced1a54cf0b51945", size = 516074, upload-time = "2025-11-20T10:06:07.264Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/80/c5/0c06759b95747882bb50abda18f5fb48c3e9b0fbfc6ebc0e23550b52415d/stevedore-5.5.0-py3-none-any.whl", hash = "sha256:18363d4d268181e8e8452e71a38cd77630f345b2ef6b4a8d5614dac5ee0d18cf", size = 49518, upload-time = "2025-08-25T12:54:25.445Z" }, + { url = "https://files.pythonhosted.org/packages/f4/40/8561ce06dc46fd17242c7724ab25b257a2ac1b35f4ebf551b40ce6105cfa/stevedore-5.6.0-py3-none-any.whl", hash = "sha256:4a36dccefd7aeea0c70135526cecb7766c4c84c473b1af68db23d541b6dc1820", size = 54428, upload-time = "2025-11-20T10:06:05.946Z" }, ] [[package]] @@ -2311,11 +2355,11 @@ wheels = [ [[package]] name = "termcolor" -version = "3.1.0" +version = "3.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ca/6c/3d75c196ac07ac8749600b60b03f4f6094d54e132c4d94ebac6ee0e0add0/termcolor-3.1.0.tar.gz", hash = "sha256:6a6dd7fbee581909eeec6a756cff1d7f7c376063b14e4a298dc4980309e55970", size = 14324, upload-time = "2025-04-30T11:37:53.791Z" } +sdist = { url = "https://files.pythonhosted.org/packages/87/56/ab275c2b56a5e2342568838f0d5e3e66a32354adcc159b495e374cda43f5/termcolor-3.2.0.tar.gz", hash = "sha256:610e6456feec42c4bcd28934a8c87a06c3fa28b01561d46aa09a9881b8622c58", size = 14423, upload-time = "2025-10-25T19:11:42.586Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4f/bd/de8d508070629b6d84a30d01d57e4a65c69aa7f5abe7560b8fad3b50ea59/termcolor-3.1.0-py3-none-any.whl", hash = "sha256:591dd26b5c2ce03b9e43f391264626557873ce1d379019786f99b0c2bee140aa", size = 7684, upload-time = "2025-04-30T11:37:52.382Z" }, + { url = "https://files.pythonhosted.org/packages/f9/d5/141f53d7c1eb2a80e6d3e9a390228c3222c27705cbe7f048d3623053f3ca/termcolor-3.2.0-py3-none-any.whl", hash = "sha256:a10343879eba4da819353c55cb8049b0933890c2ebf9ad5d3ecd2bb32ea96ea6", size = 7698, upload-time = "2025-10-25T19:11:41.536Z" }, ] [[package]] @@ -2334,68 +2378,65 @@ wheels = [ [[package]] name = "time-machine" -version = "2.19.0" +version = "3.0.0" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "python-dateutil" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f8/a4/1b5fdd165f61b67f445fac2a7feb0c655118edef429cd09ff5a8067f7f1d/time_machine-2.19.0.tar.gz", hash = "sha256:7c5065a8b3f2bbb449422c66ef71d114d3f909c276a6469642ecfffb6a0fcd29", size = 14576, upload-time = "2025-08-19T17:22:08.402Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/aa/7e00614d339e4d687f6e96e312a1566022528427d237ec639df66c4547bc/time_machine-2.19.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c85cf437dc3c07429456d8d6670ac90ecbd8241dcd0fbf03e8db2800576f91ff", size = 19308, upload-time = "2025-08-19T17:20:55.25Z" }, - { url = "https://files.pythonhosted.org/packages/ab/3c/bde3c757394f5bca2fbc1528d4117960a26c38f9b160bf471b38d2378d8f/time_machine-2.19.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d9238897e8ef54acdf59f5dff16f59ca0720e7c02d820c56b4397c11db5d3eb9", size = 15019, upload-time = "2025-08-19T17:20:56.204Z" }, - { url = "https://files.pythonhosted.org/packages/c8/e0/8ca916dd918018352d377f1f5226ee071cfbeb7dbbde2b03d14a411ac2b1/time_machine-2.19.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e312c7d5d6bfffb96c6a7b39ff29e3046de100d7efaa3c01552654cfbd08f14c", size = 33079, upload-time = "2025-08-19T17:20:57.166Z" }, - { url = "https://files.pythonhosted.org/packages/48/69/184a0209f02dd0cb5e01e8d13cd4c97a5f389c4e3d09b95160dd676ad1e7/time_machine-2.19.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:714c40b2c90d1c57cc403382d5a9cf16e504cb525bfe9650095317da3c3d62b5", size = 34925, upload-time = "2025-08-19T17:20:58.117Z" }, - { url = "https://files.pythonhosted.org/packages/43/42/4bbf4309e8e57cea1086eb99052d97ff6ddecc1ab6a3b07aa4512f8bf963/time_machine-2.19.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2eaa1c675d500dc3ccae19e9fb1feff84458a68c132bbea47a80cc3dd2df7072", size = 36384, upload-time = "2025-08-19T17:20:59.108Z" }, - { url = "https://files.pythonhosted.org/packages/b1/af/9f510dc1719157348c1a2e87423aed406589070b54b503cb237d9bf3a4fe/time_machine-2.19.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e77a414e9597988af53b2b2e67242c9d2f409769df0d264b6d06fda8ca3360d4", size = 34881, upload-time = "2025-08-19T17:21:00.116Z" }, - { url = "https://files.pythonhosted.org/packages/ca/28/61764a635c70cc76c76ba582dfdc1a84834cddaeb96789023af5214426b2/time_machine-2.19.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:cd93996970e11c382b04d4937c3cd0b0167adeef14725ece35aae88d8a01733c", size = 32931, upload-time = "2025-08-19T17:21:01.095Z" }, - { url = "https://files.pythonhosted.org/packages/b6/e0/f028d93b266e6ade8aca5851f76ebbc605b2905cdc29981a2943b43e1a6c/time_machine-2.19.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8e20a6d8d6e23174bd7e931e134d9610b136db460b249d07e84ecdad029ec352", size = 34241, upload-time = "2025-08-19T17:21:02.052Z" }, - { url = "https://files.pythonhosted.org/packages/7d/a6/36d1950ed1d3f613158024cf1dcc73db1d9ef0b9117cf51ef2e37dc06499/time_machine-2.19.0-cp312-cp312-win32.whl", hash = "sha256:95afc9bc65228b27be80c2756799c20b8eb97c4ef382a9b762b6d7888bc84099", size = 17021, upload-time = "2025-08-19T17:21:03.374Z" }, - { url = "https://files.pythonhosted.org/packages/b1/0d/e2dce93355abda3cac69e77fe96566757e98b8fe7fdcbddce89c9ced3f5f/time_machine-2.19.0-cp312-cp312-win_amd64.whl", hash = "sha256:e84909af950e2448f4e2562ea5759c946248c99ab380d2b47d79b62bd76fa236", size = 17857, upload-time = "2025-08-19T17:21:04.331Z" }, - { url = "https://files.pythonhosted.org/packages/eb/28/50ae6fb83b7feeeca7a461c0dc156cf7ef5e6ef594a600d06634fde6a2cb/time_machine-2.19.0-cp312-cp312-win_arm64.whl", hash = "sha256:0390a1ea9fa7e9d772a39b7c61b34fdcca80eb9ffac339cc0441c6c714c81470", size = 16677, upload-time = "2025-08-19T17:21:05.39Z" }, - { url = "https://files.pythonhosted.org/packages/a9/b8/24ebce67aa531bae2cbe164bb3f4abc6467dc31f3aead35e77f5a075ea3e/time_machine-2.19.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5e172866753e6041d3b29f3037dc47c20525176a494a71bbd0998dfdc4f11f2f", size = 19373, upload-time = "2025-08-19T17:21:06.701Z" }, - { url = "https://files.pythonhosted.org/packages/53/a5/c9a5240fd2f845d3ff9fa26f8c8eaa29f7239af9d65007e61d212250f15b/time_machine-2.19.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f70f68379bd6f542ae6775cce9a4fa3dcc20bf7959c42eaef871c14469e18097", size = 15056, upload-time = "2025-08-19T17:21:07.667Z" }, - { url = "https://files.pythonhosted.org/packages/b9/92/66cce5d2fb2a5e68459aca85fd18a7e2d216f725988940cd83f96630f2f1/time_machine-2.19.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e69e0b0f694728a00e72891ef8dd00c7542952cb1c87237db594b6b27d504a96", size = 33172, upload-time = "2025-08-19T17:21:08.619Z" }, - { url = "https://files.pythonhosted.org/packages/ae/20/b499e9ab4364cd466016c33dcdf4f56629ca4c20b865bd4196d229f31d92/time_machine-2.19.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3ae0a8b869574301ec5637e32c270c7384cca5cd6e230f07af9d29271a7fa293", size = 35042, upload-time = "2025-08-19T17:21:09.622Z" }, - { url = "https://files.pythonhosted.org/packages/41/32/b252d3d32791eb16c07d553c820dbc33d9c7fa771de3d1c602190bded2b7/time_machine-2.19.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:554e4317de90e2f7605ff80d153c8bb56b38c0d0c0279feb17e799521e987b8c", size = 36535, upload-time = "2025-08-19T17:21:10.571Z" }, - { url = "https://files.pythonhosted.org/packages/98/cf/4d0470062b9742e1b040ab81bad04d1a5d1de09806507bb6188989cfa1a7/time_machine-2.19.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6567a5ec5538ed550539ac29be11b3cb36af1f9894e2a72940cba0292cc7c3c9", size = 34945, upload-time = "2025-08-19T17:21:11.538Z" }, - { url = "https://files.pythonhosted.org/packages/24/71/2f741b29d98b1c18f6777a32236497c3d3264b6077e431cea4695684c8a1/time_machine-2.19.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:82e9ffe8dfff07b0d810a2ad015a82cd78c6a237f6c7cf185fa7f747a3256f8a", size = 33014, upload-time = "2025-08-19T17:21:12.858Z" }, - { url = "https://files.pythonhosted.org/packages/e8/83/ca8dba6106562843fd99f672e5aaf95badbc10f4f13f7cfe8d8640a7019d/time_machine-2.19.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7e1c4e578cdd69b3531d8dd3fbcb92a0cd879dadb912ee37af99c3a9e3c0d285", size = 34350, upload-time = "2025-08-19T17:21:13.923Z" }, - { url = "https://files.pythonhosted.org/packages/21/7f/34fe540450e18d0a993240100e4b86e8d03d831b92af8bb6ddb2662dc6fc/time_machine-2.19.0-cp313-cp313-win32.whl", hash = "sha256:72dbd4cbc3d96dec9dd281ddfbb513982102776b63e4e039f83afb244802a9e5", size = 17047, upload-time = "2025-08-19T17:21:14.874Z" }, - { url = "https://files.pythonhosted.org/packages/bf/5d/c8be73df82c7ebe7cd133279670e89b8b110af3ce1412c551caa9d08e625/time_machine-2.19.0-cp313-cp313-win_amd64.whl", hash = "sha256:e17e3e089ac95f9a145ce07ff615e3c85674f7de36f2d92aaf588493a23ffb4b", size = 17868, upload-time = "2025-08-19T17:21:15.819Z" }, - { url = "https://files.pythonhosted.org/packages/92/13/2dfd3b8fb285308f61cd7aa9bfa96f46ddf916e3549a0f0afd094c556599/time_machine-2.19.0-cp313-cp313-win_arm64.whl", hash = "sha256:149072aff8e3690e14f4916103d898ea0d5d9c95531b6aa0995251c299533f7b", size = 16710, upload-time = "2025-08-19T17:21:16.748Z" }, - { url = "https://files.pythonhosted.org/packages/05/c1/deebb361727d2c5790f9d4d874be1b19afd41f4375581df465e6718b46a2/time_machine-2.19.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:f3589fee1ed0ab6ee424a55b0ea1ec694c4ba64cc26895bcd7d99f3d1bc6a28a", size = 20053, upload-time = "2025-08-19T17:21:17.704Z" }, - { url = "https://files.pythonhosted.org/packages/45/e8/fe3376951e6118d8ec1d1f94066a169b791424fe4a26c7dfc069b153ee08/time_machine-2.19.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7887e85275c4975fe54df03dcdd5f38bd36be973adc68a8c77e17441c3b443d6", size = 15423, upload-time = "2025-08-19T17:21:18.668Z" }, - { url = "https://files.pythonhosted.org/packages/9c/c7/f88d95cd1a87c650cf3749b4d64afdaf580297aa18ad7f4b44ec9d252dfc/time_machine-2.19.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ce0be294c209928563fcce1c587963e60ec803436cf1e181acd5bc1e425d554b", size = 39630, upload-time = "2025-08-19T17:21:19.645Z" }, - { url = "https://files.pythonhosted.org/packages/cc/5d/65a5c48a65357e56ec6f032972e4abd1c02d4fca4b0717a3aaefd19014d4/time_machine-2.19.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a62fd1ab380012c86f4c042010418ed45eb31604f4bf4453e17c9fa60bc56a29", size = 41242, upload-time = "2025-08-19T17:21:20.979Z" }, - { url = "https://files.pythonhosted.org/packages/f6/f9/fe5209e1615fde0a8cad6c4e857157b150333ed1fe31a7632b08cfe0ebdd/time_machine-2.19.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b25ec853a4530a5800731257f93206b12cbdee85ede964ebf8011b66086a7914", size = 44278, upload-time = "2025-08-19T17:21:21.984Z" }, - { url = "https://files.pythonhosted.org/packages/4a/3a/a5e5fe9c5d614cde0a9387ff35e8dfd12c5ef6384e4c1a21b04e6e0b905d/time_machine-2.19.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a430e4d0e0556f021a9c78e9b9f68e5e8910bdace4aa34ed4d1a73e239ed9384", size = 42321, upload-time = "2025-08-19T17:21:23.755Z" }, - { url = "https://files.pythonhosted.org/packages/a1/c5/56eca774e9162bc1ce59111d2bd69140dc8908c9478c92ec7bd15d547600/time_machine-2.19.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2415b7495ec4364c8067071e964fbadfe746dd4cdb43983f2f0bd6ebed13315c", size = 39270, upload-time = "2025-08-19T17:21:26.009Z" }, - { url = "https://files.pythonhosted.org/packages/9b/69/5dd0c420667578169a12acc8c8fd7452e8cfb181e41c9b4ac7e88fa36686/time_machine-2.19.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dbfc6b90c10f288594e1bf89a728a98cc0030791fd73541bbdc6b090aff83143", size = 40193, upload-time = "2025-08-19T17:21:27.054Z" }, - { url = "https://files.pythonhosted.org/packages/75/a7/de974d421bd55c9355583427c2a38fb0237bb5fd6614af492ba89dacb2f9/time_machine-2.19.0-cp313-cp313t-win32.whl", hash = "sha256:16f5d81f650c0a4d117ab08036dc30b5f8b262e11a4a0becc458e7f1c011b228", size = 17542, upload-time = "2025-08-19T17:21:28.674Z" }, - { url = "https://files.pythonhosted.org/packages/76/0a/aa0d05becd5d06ae8d3f16d657dc8cc9400c8d79aef80299de196467ff12/time_machine-2.19.0-cp313-cp313t-win_amd64.whl", hash = "sha256:645699616ec14e147094f601e6ab9553ff6cea37fad9c42720a6d7ed04bcd5dc", size = 18703, upload-time = "2025-08-19T17:21:29.663Z" }, - { url = "https://files.pythonhosted.org/packages/1f/c0/f785a4c7c73aa176510f7c48b84b49c26be84af0d534deb222e0327f750e/time_machine-2.19.0-cp313-cp313t-win_arm64.whl", hash = "sha256:b32daa965d13237536ea3afaa5ad61ade2b2d9314bc3a20196a0d2e1d7b57c6a", size = 17020, upload-time = "2025-08-19T17:21:30.653Z" }, - { url = "https://files.pythonhosted.org/packages/ed/97/c5fb51def06c0b2b6735332ad118ab35b4d9b85368792e5b638e99b1b686/time_machine-2.19.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:31cb43c8fd2d961f31bed0ff4e0026964d2b35e5de9e0fabbfecf756906d3612", size = 19360, upload-time = "2025-08-19T17:21:31.94Z" }, - { url = "https://files.pythonhosted.org/packages/2d/4e/2d795f7d6b7f5205ffe737a05bb1cf19d8038233b797062b2ef412b8512b/time_machine-2.19.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:bdf481a75afc6bff3e520db594501975b652f7def21cd1de6aa971d35ba644e6", size = 15033, upload-time = "2025-08-19T17:21:32.934Z" }, - { url = "https://files.pythonhosted.org/packages/dd/32/9bad501e360b4e758c58fae616ca5f8c7ad974b343f2463a15b2bf77a366/time_machine-2.19.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:00bee4bb950ac6a08d62af78e4da0cf2b4fc2abf0de2320d0431bf610db06e7c", size = 33379, upload-time = "2025-08-19T17:21:33.925Z" }, - { url = "https://files.pythonhosted.org/packages/a3/45/eda0ca4d793dfd162478d6163759b1c6ce7f6e61daa7fd7d62b31f21f87f/time_machine-2.19.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9f02199490906582302ce09edd32394fb393271674c75d7aa76c7a3245f16003", size = 35123, upload-time = "2025-08-19T17:21:34.945Z" }, - { url = "https://files.pythonhosted.org/packages/f0/5a/97e16325442ae5731fcaac794f0a1ef9980eff8a5491e58201d7eb814a34/time_machine-2.19.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e35726c7ba625f844c13b1fc0d4f81f394eefaee1d3a094a9093251521f2ef15", size = 36588, upload-time = "2025-08-19T17:21:35.975Z" }, - { url = "https://files.pythonhosted.org/packages/e8/9d/bf0b2ccc930cc4a316f26f1c78d3f313cd0fa13bb7480369b730a8f129db/time_machine-2.19.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:304315023999cd401ff02698870932b893369e1cfeb2248d09f6490507a92e97", size = 35013, upload-time = "2025-08-19T17:21:37.017Z" }, - { url = "https://files.pythonhosted.org/packages/f0/5a/39ac6a3078174f9715d88364871348b249631f12e76de1b862433b3f8862/time_machine-2.19.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:9765d4f003f263ea8bfd90d2d15447ca4b3dfa181922cf6cf808923b02ac180a", size = 33303, upload-time = "2025-08-19T17:21:38.352Z" }, - { url = "https://files.pythonhosted.org/packages/b3/ac/d8646baf9f95f2e792a6d7a7b35e92fca253c4a992afff801beafae0e5c2/time_machine-2.19.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7837ef3fd5911eb9b480909bb93d922737b6bdecea99dfcedb0a03807de9b2d3", size = 34440, upload-time = "2025-08-19T17:21:39.382Z" }, - { url = "https://files.pythonhosted.org/packages/ce/8b/8b6568c5ae966d80ead03ab537be3c6acf2af06fb501c2d466a3162c6295/time_machine-2.19.0-cp314-cp314-win32.whl", hash = "sha256:4bb5bd43b1bdfac3007b920b51d8e761f024ed465cfeec63ac4296922a4ec428", size = 17162, upload-time = "2025-08-19T17:21:40.381Z" }, - { url = "https://files.pythonhosted.org/packages/46/a5/211c1ab4566eba5308b2dc001b6349e3a032e3f6afa67ca2f27ea6b27af5/time_machine-2.19.0-cp314-cp314-win_amd64.whl", hash = "sha256:f583bbd0aa8ab4a7c45a684bf636d9e042d466e30bcbae1d13e7541e2cbe7207", size = 18040, upload-time = "2025-08-19T17:21:41.363Z" }, - { url = "https://files.pythonhosted.org/packages/b8/fc/4c2fb705f6371cb83824da45a8b967514a922fc092a0ef53979334d97a70/time_machine-2.19.0-cp314-cp314-win_arm64.whl", hash = "sha256:f379c6f8a6575a8284592179cf528ce89373f060301323edcc44f1fa1d37be12", size = 16752, upload-time = "2025-08-19T17:21:42.336Z" }, - { url = "https://files.pythonhosted.org/packages/79/ab/6437d18f31c666b5116c97572a282ac2590a82a0a9867746a6647eaf4613/time_machine-2.19.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:a3b8981f9c663b0906b05ab4d0ca211fae4b63b47c6ec26de5374fe56c836162", size = 20057, upload-time = "2025-08-19T17:21:43.35Z" }, - { url = "https://files.pythonhosted.org/packages/6c/a2/e03639ec2ba7200328bbcad8a2b2b1d5fccca9cceb9481b164a1cabdcb33/time_machine-2.19.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8e9c6363893e7f52c226afbebb23e825259222d100e67dfd24c8a6d35f1a1907", size = 15430, upload-time = "2025-08-19T17:21:44.725Z" }, - { url = "https://files.pythonhosted.org/packages/5d/ff/39e63a48e840f3e36ce24846ee51dd99c6dba635659b1750a2993771e88e/time_machine-2.19.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:206fcd6c9a6f00cac83db446ad1effc530a8cec244d2780af62db3a2d0a9871b", size = 39622, upload-time = "2025-08-19T17:21:45.821Z" }, - { url = "https://files.pythonhosted.org/packages/9a/2e/ee5ac79c4954768705801e54817c7d58e07e25a0bb227e775f501f3e2122/time_machine-2.19.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bf33016a1403c123373ffaeff25e26e69d63bf2c63b6163932efed94160db7ef", size = 41235, upload-time = "2025-08-19T17:21:46.783Z" }, - { url = "https://files.pythonhosted.org/packages/3a/3e/9af5f39525e779185c77285b8bbae15340eeeaa0afb33d458bc8b47d459b/time_machine-2.19.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9247c4bb9bbd3ff584ef4efbdec8efd9f37aa08bcfc4728bde1e489c2cb445bd", size = 44276, upload-time = "2025-08-19T17:21:47.759Z" }, - { url = "https://files.pythonhosted.org/packages/59/fe/572c7443cc27140bbeae3947279bbd4a120f9e8622253a20637f260b7813/time_machine-2.19.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:77f9bb0b86758d1f2d9352642c874946ad5815df53ef4ca22eb9d532179fe50d", size = 42330, upload-time = "2025-08-19T17:21:48.881Z" }, - { url = "https://files.pythonhosted.org/packages/cf/24/1a81c2e08ee7dae13ec8ceed27a29afa980c3d63852e42f1e023bf0faa03/time_machine-2.19.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0b529e262df3b9c449f427385f4d98250828c879168c2e00eec844439f40b370", size = 39281, upload-time = "2025-08-19T17:21:49.907Z" }, - { url = "https://files.pythonhosted.org/packages/d2/60/6f0d6e5108978ca1a2a4ffb4d1c7e176d9199bb109fd44efe2680c60b52a/time_machine-2.19.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9199246e31cdc810e5d89cb71d09144c4d745960fdb0824da4994d152aca3303", size = 40201, upload-time = "2025-08-19T17:21:50.953Z" }, - { url = "https://files.pythonhosted.org/packages/73/b9/3ea4951e8293b0643feb98c0b9a176fa822154f1810835db3f282968ab10/time_machine-2.19.0-cp314-cp314t-win32.whl", hash = "sha256:0fe81bae55b7aefc2c2a34eb552aa82e6c61a86b3353a3c70df79b9698cb02ca", size = 17743, upload-time = "2025-08-19T17:21:51.948Z" }, - { url = "https://files.pythonhosted.org/packages/e4/8b/cd802884ca8a98e2b6cdc2397d57dd12ff8a7d1481e06fc3fad3d4e7e5ff/time_machine-2.19.0-cp314-cp314t-win_amd64.whl", hash = "sha256:7253791b8d7e7399fbeed7a8193cb01bc004242864306288797056badbdaf80b", size = 18956, upload-time = "2025-08-19T17:21:52.997Z" }, - { url = "https://files.pythonhosted.org/packages/c6/49/cabb1593896082fd55e34768029b8b0ca23c9be8b2dc127e0fc14796d33e/time_machine-2.19.0-cp314-cp314t-win_arm64.whl", hash = "sha256:536bd1ac31ab06a1522e7bf287602188f502dc19d122b1502c4f60b1e8efac79", size = 17068, upload-time = "2025-08-19T17:21:54.064Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/4b/f9/e42f31296b3580cc075bccfb3943cfb574316c57b979191b5ecc13879c26/time_machine-3.0.0.tar.gz", hash = "sha256:c75b5d91f711d10ff4052f00e6cf6869b2de358d1fc2ec224ba22ac629b17638", size = 14414, upload-time = "2025-11-18T16:23:20.69Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/28/48e6f3161c0734d90863ee6f792ae07972cda4bafed131e5986bb9a8d09e/time_machine-3.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4f976198d9763439f942f6d5d25684f4f53b64aa8d8ea8d4d8f2230efbb3742d", size = 18833, upload-time = "2025-11-18T16:22:16.463Z" }, + { url = "https://files.pythonhosted.org/packages/e0/d3/c5543c94e7a394eb4147361859682ac57b46dc17279463df87ccb827a042/time_machine-3.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:302e5bf1e23efbf7b14bd54df0535d3949478f3eefb9277e4c5572a162a64dbf", size = 14931, upload-time = "2025-11-18T16:22:17.487Z" }, + { url = "https://files.pythonhosted.org/packages/a6/1a/e453fe5a2f19ca08d24ebc788923f3ee3440706e4e78397cbe88644090b5/time_machine-3.0.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5f3c78e9742f7d170c689a365d069ea14414c6025bce20366f225cedb97c3e95", size = 32600, upload-time = "2025-11-18T16:22:18.43Z" }, + { url = "https://files.pythonhosted.org/packages/45/7f/554c3d1e9781d6788937ca59d3a921fd5cd86fd89ebef2fb2cd04cf5e47a/time_machine-3.0.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5a35166e11788a1db7202bd8b0c4d51cd99f9f78aeae670f0f0ee518b81f8da3", size = 34153, upload-time = "2025-11-18T16:22:19.455Z" }, + { url = "https://files.pythonhosted.org/packages/26/68/e660663cdf2dd10a26bd6f8df8293792a6db5f5cdb51064ab169a4815165/time_machine-3.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fb42c5167e271f4b5dc8a4a3e7f1809cc119e3d271e0c7010641346c662c6c1f", size = 35532, upload-time = "2025-11-18T16:22:20.424Z" }, + { url = "https://files.pythonhosted.org/packages/57/f1/65ab06dbaa8649de73f793becf30a1d8c83b5418451a45d225001225675c/time_machine-3.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e3c4588df98ffafb986bd74736dbb3ca0020daf15a62257ec1578551595102d5", size = 34240, upload-time = "2025-11-18T16:22:21.371Z" }, + { url = "https://files.pythonhosted.org/packages/59/ff/aeb1f6a65f2bd295bcf3045e8585afa0d19c4453d2ca7b97a2feb69b621e/time_machine-3.0.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6bb3cb74a4be077c0d76bdfe6b4a540d0cc68a196848274949d501523afacca9", size = 32463, upload-time = "2025-11-18T16:22:22.372Z" }, + { url = "https://files.pythonhosted.org/packages/45/63/cd89a3917b7dace04d7262fd5548312f678c5b6e5b4d1e6af3871a285146/time_machine-3.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b807c3c8b6f54b2afd3e9ce11e26692d056f29c5806f76f05ea4363e73511e25", size = 33652, upload-time = "2025-11-18T16:22:23.749Z" }, + { url = "https://files.pythonhosted.org/packages/91/58/f012100f547ed968939978c58c11183179979df9c17300fd4406cf925d3e/time_machine-3.0.0-cp312-cp312-win32.whl", hash = "sha256:23f127f8483236c50061ed06bad23bbf71100ccd55582f39039dda2c1cca9abb", size = 16945, upload-time = "2025-11-18T16:22:24.727Z" }, + { url = "https://files.pythonhosted.org/packages/eb/aa/55726f20e13e8f6dcbf743c02655af37454cc4a82bde6e8868ac68b2f02e/time_machine-3.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:fd297253e8999f9e15766df2fe8609fb17917c5229b92c3b89dc4fcbf7f7bdc8", size = 17705, upload-time = "2025-11-18T16:22:26.064Z" }, + { url = "https://files.pythonhosted.org/packages/4f/3c/13cce77f5f7cec744e3cfd7b686c4fe3420aec79470a363f4b6d379e664c/time_machine-3.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:e70c5c0f5d65b8b3dc430b8179d3259a55c212945e18adb8d81ddc929a840dff", size = 16503, upload-time = "2025-11-18T16:22:27.43Z" }, + { url = "https://files.pythonhosted.org/packages/8b/b2/9902f1bf56156b5366fa70d92db859a9e5a7d1ab0378c654c2a88fae9b1a/time_machine-3.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:570f7dee1fe950c2a7e370521749d235ee8d8ac81025e1dd3ab87f153df4a82e", size = 18897, upload-time = "2025-11-18T16:22:28.405Z" }, + { url = "https://files.pythonhosted.org/packages/eb/53/7e6d914c16756acbbcf37ec4d638c7245c0610473f74f6a149044dc59c0b/time_machine-3.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7df1ed6dedea88e18da5f15f42bc4496f4233196c6013e7cd0cf35c7af438d4f", size = 14961, upload-time = "2025-11-18T16:22:30.184Z" }, + { url = "https://files.pythonhosted.org/packages/2f/d8/29ac211c92d283a8987a9249edc432daefab94f08351be363020949458c4/time_machine-3.0.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ee1ed6bcff137f01c7c4201cabb870b8ac33e198d45a7aca6237289ad35fb393", size = 32689, upload-time = "2025-11-18T16:22:31.177Z" }, + { url = "https://files.pythonhosted.org/packages/f2/fc/1175e0bdec0f0366fb058dfe06387e0d8a8704712fad073b0e96992bed15/time_machine-3.0.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:af43206c1c29ea2a8f65bb3fbba3bfd6cc9c043646495d4050006fdc99fbde87", size = 34277, upload-time = "2025-11-18T16:22:32.16Z" }, + { url = "https://files.pythonhosted.org/packages/15/50/0e770ce9ba5982570b76044d4e05dcc1637ecb9e883bd916bc6204aec17d/time_machine-3.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f170670d22d4300669ba753c8dc5cf3aa814cf8ad4db65f5014d23b48de71ed5", size = 35677, upload-time = "2025-11-18T16:22:33.176Z" }, + { url = "https://files.pythonhosted.org/packages/19/a1/e98a027bd59f2472aaecd65d4dffe77732827d4a91e18b9dc6c9cee1f9bd/time_machine-3.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:69aec20b58584b9bd4129f1645299ee2da512a04fceeb3d91bfadbede6b2b482", size = 34337, upload-time = "2025-11-18T16:22:34.499Z" }, + { url = "https://files.pythonhosted.org/packages/44/33/cf7d323555322a13d2ab2fc479b5b11bcf92e78fea4b011f5a4e92eceede/time_machine-3.0.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6e9b820eb563cf4a099e686ea130a06c279bcc18212939e287fdf2724717813a", size = 32581, upload-time = "2025-11-18T16:22:35.482Z" }, + { url = "https://files.pythonhosted.org/packages/53/a5/a863faaaa527a540f7bc6bb9b0e0a4485514894bd9c81aa5388c2a08b2c6/time_machine-3.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7a50e27b0870dc3d87bfefdb37fa622d9af3c74bcf01f15606175c8fba12628d", size = 33756, upload-time = "2025-11-18T16:22:36.44Z" }, + { url = "https://files.pythonhosted.org/packages/12/11/722ffd9e63613146212299058cf9734afae0ddd8b13778e5918b15e2d2ff/time_machine-3.0.0-cp313-cp313-win32.whl", hash = "sha256:9ab5dfe375c59ffcf1307c9efaadbebeb78aa9284c6a4dd2382e90e365433364", size = 16966, upload-time = "2025-11-18T16:22:37.827Z" }, + { url = "https://files.pythonhosted.org/packages/c9/25/bd3c13b4b87fcd82e43dea16a0bd54108e47202da413b79c388be8d20cba/time_machine-3.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:136260860e929d508b104a475ffb51e8ef3b707ffd4ab82a5b1d91560d25fbac", size = 17710, upload-time = "2025-11-18T16:22:38.83Z" }, + { url = "https://files.pythonhosted.org/packages/cc/6d/ac3d66fbd62c9118e7b2863e99c477e5403b2f678c6845c24632009e73b2/time_machine-3.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:92994d1c893c02b2ba6880f4f23057437da2cfb1cf351ad637fb14062a270636", size = 16539, upload-time = "2025-11-18T16:22:39.828Z" }, + { url = "https://files.pythonhosted.org/packages/90/4a/15dd1dbfdc4cfed108f8109df60ff738e6c656cfbab84d7e372840533163/time_machine-3.0.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ce1e75df12701b146566ecb0bac733c520597ce2b263420a1b9ec32ff73a758b", size = 19570, upload-time = "2025-11-18T16:22:40.835Z" }, + { url = "https://files.pythonhosted.org/packages/43/e8/f791b058777affbf2e10fb38b14b192d7d4de4787b12598255d129b52893/time_machine-3.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:fb65a93600f6df62053da887e05dfa7b214b6f58a09c37c3125c3803413bff9f", size = 15230, upload-time = "2025-11-18T16:22:42.152Z" }, + { url = "https://files.pythonhosted.org/packages/61/db/ca459b6f090c8ff5a8453607361fb57ddf0413693b8d68d878f181c8a236/time_machine-3.0.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b2d0f6ce928de57df88d429309ceabec11cd94007797d2e8f2f3b5717aa68858", size = 38787, upload-time = "2025-11-18T16:22:43.169Z" }, + { url = "https://files.pythonhosted.org/packages/3a/94/d713e6bcf3e0fff8c36ece00fe11336b4cbc2511b99a8c73a7517c2785e7/time_machine-3.0.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:00cf841c8721168b115887461fac115e0556c636e16a272128db1a51e4fb7049", size = 40337, upload-time = "2025-11-18T16:22:44.147Z" }, + { url = "https://files.pythonhosted.org/packages/9f/48/24b70399e40fb1cabb007844539ea72cb301087cea092bc706a9786bf97e/time_machine-3.0.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:218bdd19387cfbd128fd16e93dbde940ba108b0b05cb65e3fae4e88260124456", size = 43098, upload-time = "2025-11-18T16:22:45.158Z" }, + { url = "https://files.pythonhosted.org/packages/5e/1d/bb5544ae8ba162072141aacdb1a744a9b00a3a3bd966e15c395301de0d71/time_machine-3.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:7fcef741bc36ae786336cf65acf741172a530362addfc57b3666bf32efe21091", size = 41300, upload-time = "2025-11-18T16:22:46.505Z" }, + { url = "https://files.pythonhosted.org/packages/98/63/284d5f4cb095db5c4dc41d997448c45285d8085feed263667c14ea2e5959/time_machine-3.0.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:c5cf94229d655c5ff9a0d9e748f48ff290991e9086ab477ccc1b60ac7f998bf9", size = 38525, upload-time = "2025-11-18T16:22:47.847Z" }, + { url = "https://files.pythonhosted.org/packages/0a/32/28feda77c0ddcff6695b4598fed0017e35d3b1f48204915d71fbce690200/time_machine-3.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:979630bcb6c314e27cea0ac2301d09aea20411b9fc056c0333260897e5a3b902", size = 39399, upload-time = "2025-11-18T16:22:48.833Z" }, + { url = "https://files.pythonhosted.org/packages/02/35/38ede5c528284a9446092c4d414f310221c0f704cfc030f1911eac51fc0a/time_machine-3.0.0-cp313-cp313t-win32.whl", hash = "sha256:4e06d6b64144635db65c902c109431accbd70d0dfdfdb388e34d940b9fabdf93", size = 17420, upload-time = "2025-11-18T16:22:49.872Z" }, + { url = "https://files.pythonhosted.org/packages/6d/7a/1dc7586741d9f5d38d542d70848bcb3d9ce1d997294ff276e4aa00858fbd/time_machine-3.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:fe0a079104bcdf7a43d1c94baaf38dbde2e74ff9576ff7a95014d1b5b5e0e39b", size = 18495, upload-time = "2025-11-18T16:22:51.171Z" }, + { url = "https://files.pythonhosted.org/packages/f5/e3/e481270d28bf20d9c4b74107e915d9c1d6f88b70d19f78a990006d703cc9/time_machine-3.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:ff056d982f1e919d69a3db7001367df193bb68c7be0f7245da31f4af1dc73f4b", size = 16836, upload-time = "2025-11-18T16:22:52.183Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ff/25b31b2b7680ef2b7ec0268dc486245f6262dd689fcd0554037bf23b7bdc/time_machine-3.0.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:efb56b19c649afc6433a288b48e3d92587d5bf9a599df5003cf10f6029feaca5", size = 18876, upload-time = "2025-11-18T16:22:53.511Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2c/38f74e524915fe761957980d6f19c8adf78927798ff2f459b1aedd67137b/time_machine-3.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fa2bb8c0b59ae2e66e56d676f54a020166a9a02e80cde64b73b60efbdec12566", size = 15005, upload-time = "2025-11-18T16:22:54.852Z" }, + { url = "https://files.pythonhosted.org/packages/5d/f9/78c618227ad3a2b77dace42a86db203547e3d98c921b15dbb4223441c83b/time_machine-3.0.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5f853ee8a65a59759992d306c815251c6c7acd3d9b5e38f68400bd9c300a3b5a", size = 32775, upload-time = "2025-11-18T16:22:56.212Z" }, + { url = "https://files.pythonhosted.org/packages/d6/d0/561a7bc3d8bec8f4309cd37d9d841eeb5e170e6b4082cd9e7662f65c0380/time_machine-3.0.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:56d5d71f160e6f9721a4e059fa97f51acbc656e500fcff5f7919d018d65ee8a7", size = 34365, upload-time = "2025-11-18T16:22:57.621Z" }, + { url = "https://files.pythonhosted.org/packages/20/d7/840b1981c35b1f47f0540cf32cd69851368a25a6a9ad196e33d131cb9f62/time_machine-3.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a79729b0d8c34f8b39dbc11f7aec2948df73af505659b7a192eaf597b7297f37", size = 35759, upload-time = "2025-11-18T16:22:58.588Z" }, + { url = "https://files.pythonhosted.org/packages/5f/29/0cf8dbfe920a21f1f1aae4878ca4aa0edfc9ea8080c98cc5d5f84ac7d857/time_machine-3.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:03b873195adc636fcf1b10dc75f014a7b4cbbb87b129fe5ca0281704064bbef0", size = 34428, upload-time = "2025-11-18T16:22:59.64Z" }, + { url = "https://files.pythonhosted.org/packages/3b/0b/8c44cd41eaf1ddf844d308a509a2375f7e1886db3358e5f645d5b042f245/time_machine-3.0.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:6834d7e4e678d2206416129337aa3f0b89666d017bc59e7594504614d66bb0a7", size = 32795, upload-time = "2025-11-18T16:23:01.048Z" }, + { url = "https://files.pythonhosted.org/packages/09/99/213c32e8f2710d8af0e39af64a77665938e455071fa4754907253df865e4/time_machine-3.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2e9307c82e52b3c1947b7dea37ea6c917c2ec5db8a43a4f0c2ad00d3ce3dead3", size = 33844, upload-time = "2025-11-18T16:23:02.399Z" }, + { url = "https://files.pythonhosted.org/packages/09/d9/74a99eb10e617da578bd70c3a37b45f75d3e4dd902c91e0f285ddb2cc70a/time_machine-3.0.0-cp314-cp314-win32.whl", hash = "sha256:001ea238749cfecf69703c1850a79e06d3cb3a9c8fc1cf6db3f7d698c0b3ad43", size = 17111, upload-time = "2025-11-18T16:23:04.382Z" }, + { url = "https://files.pythonhosted.org/packages/95/66/3947a8a6f2c8e87ee122bc4a69f68f827cd8e324db98d8c2a928d73e57eb/time_machine-3.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:fc9f5bb623ae82bd6277c27a84406cc0701c5ab5653ce4933fde58abbdb948eb", size = 17990, upload-time = "2025-11-18T16:23:05.38Z" }, + { url = "https://files.pythonhosted.org/packages/b8/6d/9f7e1deecc2f98eb4120274841ae8277f45b09da8bc6f4a2a6b3f2f78dcb/time_machine-3.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:d8816469d316e842860f029d78f2574e8691f7a536d1dbf6fc05ac8b74d40451", size = 16615, upload-time = "2025-11-18T16:23:06.46Z" }, + { url = "https://files.pythonhosted.org/packages/82/f8/218d572841e84c1e14cec84636b5233f9de1b9629e4dea01f34a83610181/time_machine-3.0.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:75cc9fdf90117f807fd675ab6a4f67233960c2ce63a4a0877e8df14335f8a907", size = 19558, upload-time = "2025-11-18T16:23:07.443Z" }, + { url = "https://files.pythonhosted.org/packages/d1/42/6b93b5a2f74db1ce1a2c9e98af9f95c10921688afaf4cfeb6a2257f364b6/time_machine-3.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:5a714418d25ae06b6e44f1004db816a86a58a281f4c263d77cda1ffd82db6bb7", size = 15281, upload-time = "2025-11-18T16:23:08.532Z" }, + { url = "https://files.pythonhosted.org/packages/85/65/03bc8c3bbddc78b6f3589b2e74746067009da10eb7879cfd8d017a96c66f/time_machine-3.0.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0fe87654e07e1f29c591c3acbf8e922700f1c8ac0a0dd853e3c20fb0279fa9ce", size = 38780, upload-time = "2025-11-18T16:23:10.399Z" }, + { url = "https://files.pythonhosted.org/packages/da/74/7f636a953eee3cdc99649cf0fcf5e6de7b0d80e40d053533d474bb3854ad/time_machine-3.0.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e0d5f4db8dbb8f3c92a49e3884bf567985e925f696160c9bb9823804cf07ae3e", size = 40336, upload-time = "2025-11-18T16:23:11.427Z" }, + { url = "https://files.pythonhosted.org/packages/b9/5a/7c0ecd546345d869341908428ed0749b35cd63ac75077d47cf1c1179b2b8/time_machine-3.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4537162591c0fdc0a180839fdb3b3a935fee0b85f707e7bb4c4385d1d4159553", size = 43079, upload-time = "2025-11-18T16:23:12.899Z" }, + { url = "https://files.pythonhosted.org/packages/5b/65/91cbf3897ca8673ab4b50f4ce9d6597a8d660bdfedb79f61634aa1b6631a/time_machine-3.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0c13687a0dcbd3581e9034d7ee7c99d6f19b6700123d28eae3b8f5aa8b0c2751", size = 41284, upload-time = "2025-11-18T16:23:13.97Z" }, + { url = "https://files.pythonhosted.org/packages/b6/58/5df71cddcdcc4183d5215a100b0597e55ced75f949d78e77a6a8c9614571/time_machine-3.0.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:69d669947aade3bd6b178aa81c9a7d1133dcc7098424a271e6615d6430d1ba78", size = 38511, upload-time = "2025-11-18T16:23:15.286Z" }, + { url = "https://files.pythonhosted.org/packages/e4/0c/0349bfed884a67aa1ee43ebd9579174e1da8d9d3be3ec8b54f0cf5d81ab4/time_machine-3.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b633823375677db1be2d60232f050b07a5d35c7f3dfb66b77c1115b260e352fa", size = 39408, upload-time = "2025-11-18T16:23:16.41Z" }, + { url = "https://files.pythonhosted.org/packages/b4/e6/0d348400bed42cb8854650a6ad67a2bf1f69544d8fd2c6fec3f26a8c1984/time_machine-3.0.0-cp314-cp314t-win32.whl", hash = "sha256:e2d1fb442fb785b179560b2f6ff58f7102cad87f3de7be379bbd112e551ca36e", size = 17657, upload-time = "2025-11-18T16:23:17.413Z" }, + { url = "https://files.pythonhosted.org/packages/9b/8a/5cd904078128d3c9852d0c3db3eef0c32b3b1db2513b432b4a473ee4f393/time_machine-3.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:71039cff1b48f0e24fad041afd3b63b573e44e059207193e3f870705d604e316", size = 18778, upload-time = "2025-11-18T16:23:18.505Z" }, + { url = "https://files.pythonhosted.org/packages/5d/79/635e2a21487f4953ca4be55d9c5c1f899e5fac4c60dd9233fcb9e4929675/time_machine-3.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:c34ddb3bde48da637f6f2fe5daec3d2c2cb2f10d07e331fc33f54a714f4a6a25", size = 16928, upload-time = "2025-11-18T16:23:19.63Z" }, ] [[package]] @@ -2515,19 +2556,19 @@ wheels = [ [[package]] name = "typos" -version = "1.39.0" +version = "1.39.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a5/22/78415800dff3fe97e2cc0a0286f9c64c448f97e5b0472fb1374e1729ccd9/typos-1.39.0.tar.gz", hash = "sha256:d22e0be146296ab2afafdccbf0e5f555e48acc78329f2d64a6a8230a045ee2a8", size = 1765731, upload-time = "2025-10-31T14:56:11.614Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3c/ce/798c6fb728ada6dca01020afe7ba849019e8a1557e2a2dcdafa124450337/typos-1.39.2.tar.gz", hash = "sha256:8adcffef1a8c0cb505befa3588ec057c654449b2516a0283f663fe5bbce07898", size = 1760834, upload-time = "2025-11-13T18:38:36.579Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8d/97/b4823e83b7ee7bb41697d725498ed9f934c3884c7525b8705fff384ff901/typos-1.39.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:99fb6d7a02f217d12e95191be0c29d3bd1cada0177b3c5f3805c06e0dacf849d", size = 3496603, upload-time = "2025-10-31T14:55:55.912Z" }, - { url = "https://files.pythonhosted.org/packages/60/1d/961a558882d95243d506fced7289414b5d1bd71e1fd43aea3a57cd436b9c/typos-1.39.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:b1bbafb016dac632a592ac377dfffe75719b46dce68b76e4f446c9da1f8f8742", size = 3379596, upload-time = "2025-10-31T14:55:58.461Z" }, - { url = "https://files.pythonhosted.org/packages/f0/79/f8c68cc34ad4e14e390571c6253dc7ef8d283afc197c3503c0ab076a0d1d/typos-1.39.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1c056076391f651522b4535a0d59278637138fa442751664b68faee1acd568", size = 8160884, upload-time = "2025-10-31T14:56:00.034Z" }, - { url = "https://files.pythonhosted.org/packages/2f/ac/755520a173ff37edf25e355e6fd31ebaf0abebe83bfc6b5925c5a8829caf/typos-1.39.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edaa69b55ce91b8671538aa2a90b17cd819729aff675d177438f2d944e5302b5", size = 7135989, upload-time = "2025-10-31T14:56:01.805Z" }, - { url = "https://files.pythonhosted.org/packages/c5/ab/55fb7c783586727ab19678a4a2ec1992afd01a7f4191fa5a3240d74b0de5/typos-1.39.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bd9ac3c38941735731dee57d68c343c246382268eb25ffa42e9a61b9681ba09", size = 7669888, upload-time = "2025-10-31T14:56:03.441Z" }, - { url = "https://files.pythonhosted.org/packages/0e/24/e55182a0e142b0695e9008707a1b6b36129312e703fed6e07104b899fffd/typos-1.39.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:8db67a6d4fe81e5c31f59696d21d84f903bda63db09361cab4121e1a5e7308bf", size = 7057308, upload-time = "2025-10-31T14:56:05.166Z" }, - { url = "https://files.pythonhosted.org/packages/36/dc/8c72ab8db74d1ff8298ad0727c1fca8204d3a614c521abeb19208dff0e97/typos-1.39.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:cedda788cd563871f0da4771aa85346c374139d2a26ae9207b51e6d505518975", size = 8083276, upload-time = "2025-10-31T14:56:06.817Z" }, - { url = "https://files.pythonhosted.org/packages/be/eb/52741770f7c6bd6cd5c22fe93a566c522591b285026e76cfb55cfc1fbaa9/typos-1.39.0-py3-none-win32.whl", hash = "sha256:f698db497d3358475d9c03f585ef528e53e999321ae2ccf9bc093a2dc1ca2e91", size = 3055051, upload-time = "2025-10-31T14:56:08.187Z" }, - { url = "https://files.pythonhosted.org/packages/f6/db/1881fb61b78885d79d73a102b1341e09cb2777835e5149d4b1383b4d943d/typos-1.39.0-py3-none-win_amd64.whl", hash = "sha256:0f7caf772b9b71d749ccfbef197db537dac3d76f2af8f6e77729c7d115f714b0", size = 3240206, upload-time = "2025-10-31T14:56:09.956Z" }, + { url = "https://files.pythonhosted.org/packages/bd/57/c35f9f585e12c1831cd00687328994c58cdb3c29b8652918007b719c40c1/typos-1.39.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:259f03703ff1a651fd1b85cd670135afb8ab5c894bc2f47db9a2608adaacabbe", size = 3505142, upload-time = "2025-11-13T18:38:16.609Z" }, + { url = "https://files.pythonhosted.org/packages/48/01/3f47d9d67821addf6d697259e54736f1937d4787c7a17f32adc0382149db/typos-1.39.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3c76967a807ad607baa68093915a0882ae161317d720760fab1e4a4448be5a8a", size = 3387192, upload-time = "2025-11-13T18:38:19.541Z" }, + { url = "https://files.pythonhosted.org/packages/16/c2/4109f47700363a4c6db6a088ac9b4ac2cce3cebb96277af53a0d154727c9/typos-1.39.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8bd555f08031676516133dcddf46c7ed7cf5f0bb5d3989ea78592485ef47c6d", size = 8205619, upload-time = "2025-11-13T18:38:21.548Z" }, + { url = "https://files.pythonhosted.org/packages/63/1f/a3b66a820f94c2ee91078d775bc8c662cfaef36f33a5c258cce32957cd1a/typos-1.39.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cbfa249349d9c06e5ef3452bc7696267f29ec1a7c005a422b6e9fff906b9b52e", size = 7185111, upload-time = "2025-11-13T18:38:23.921Z" }, + { url = "https://files.pythonhosted.org/packages/e3/b5/1702763ae72cf8c3e52af9ae91834ec229a3f2b927b6f975e7920b8cfc4c/typos-1.39.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d3690011e09ce92a8ea2563ce43dd3bcd8341314d8d9db40c34c0ac6722c860", size = 7723718, upload-time = "2025-11-13T18:38:26.005Z" }, + { url = "https://files.pythonhosted.org/packages/65/38/f2d6a9908cdc3a5a6cc0a2f7510fa5a81b6438e3360f30e9f04a6086c5a3/typos-1.39.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:f112aad95b60717510ace69c21e70dc9b3785c10d42e6bda4391a05801b2ee9d", size = 7103485, upload-time = "2025-11-13T18:38:28.006Z" }, + { url = "https://files.pythonhosted.org/packages/78/05/35ac5e58f367720d75bedaf419173dd8caf9e9b62cd040ff1eb885c9aa25/typos-1.39.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:9221c88ee88532ef4b259bd94f1cb669bee9752ccd196eac45e0be7d5850c3e3", size = 8134326, upload-time = "2025-11-13T18:38:30.078Z" }, + { url = "https://files.pythonhosted.org/packages/69/37/1de337e2cb0bb0a457fdb01230f2d88b9de7ac90ebac9591dcd5d8f3dded/typos-1.39.2-py3-none-win32.whl", hash = "sha256:a8fefdcfccce6b9cdd6a343930c5b86e818dca48af661ba719964261040e609b", size = 3061270, upload-time = "2025-11-13T18:38:33.207Z" }, + { url = "https://files.pythonhosted.org/packages/b3/ba/c04aaae18c66ead2beef5395a168895e18f6760a2f93f9d9ae7797dbcc06/typos-1.39.2-py3-none-win_amd64.whl", hash = "sha256:974d4fa7327dea198764d6eb1995a367e39779b6c70de6937511512adbb7e3cb", size = 3249181, upload-time = "2025-11-13T18:38:34.773Z" }, ] [[package]] @@ -2559,16 +2600,16 @@ wheels = [ [[package]] name = "virtualenv" -version = "20.35.3" +version = "20.35.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "distlib" }, { name = "filelock" }, { name = "platformdirs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a4/d5/b0ccd381d55c8f45d46f77df6ae59fbc23d19e901e2d523395598e5f4c93/virtualenv-20.35.3.tar.gz", hash = "sha256:4f1a845d131133bdff10590489610c98c168ff99dc75d6c96853801f7f67af44", size = 6002907, upload-time = "2025-10-10T21:23:33.178Z" } +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" } wheels = [ - { url = "https://files.pythonhosted.org/packages/27/73/d9a94da0e9d470a543c1b9d3ccbceb0f59455983088e727b8a1824ed90fb/virtualenv-20.35.3-py3-none-any.whl", hash = "sha256:63d106565078d8c8d0b206d48080f938a8b25361e19432d2c9db40d2899c810a", size = 5981061, upload-time = "2025-10-10T21:23:30.433Z" }, + { 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" }, ] [[package]] @@ -2615,11 +2656,11 @@ wheels = [ [[package]] name = "webcolors" -version = "24.11.1" +version = "25.10.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7b/29/061ec845fb58521848f3739e466efd8250b4b7b98c1b6c5bf4d40b419b7e/webcolors-24.11.1.tar.gz", hash = "sha256:ecb3d768f32202af770477b8b65f318fa4f566c22948673a977b00d589dd80f6", size = 45064, upload-time = "2024-11-11T07:43:24.224Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/7a/eb316761ec35664ea5174709a68bbd3389de60d4a1ebab8808bfc264ed67/webcolors-25.10.0.tar.gz", hash = "sha256:62abae86504f66d0f6364c2a8520de4a0c47b80c03fc3a5f1815fedbef7c19bf", size = 53491, upload-time = "2025-10-31T07:51:03.977Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/60/e8/c0e05e4684d13459f93d312077a9a2efbe04d59c393bc2b8802248c908d4/webcolors-24.11.1-py3-none-any.whl", hash = "sha256:515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9", size = 14934, upload-time = "2024-11-11T07:43:22.529Z" }, + { url = "https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl", hash = "sha256:032c727334856fc0b968f63daa252a1ac93d33db2f5267756623c210e57a4f1d", size = 14905, upload-time = "2025-10-31T07:51:01.778Z" }, ] [[package]] @@ -2642,60 +2683,80 @@ wheels = [ [[package]] name = "widgetsnbextension" -version = "4.0.14" +version = "4.0.15" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/41/53/2e0253c5efd69c9656b1843892052a31c36d37ad42812b5da45c62191f7e/widgetsnbextension-4.0.14.tar.gz", hash = "sha256:a3629b04e3edb893212df862038c7232f62973373869db5084aed739b437b5af", size = 1097428, upload-time = "2025-04-10T13:01:25.628Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/f4/c67440c7fb409a71b7404b7aefcd7569a9c0d6bd071299bf4198ae7a5d95/widgetsnbextension-4.0.15.tar.gz", hash = "sha256:de8610639996f1567952d763a5a41af8af37f2575a41f9852a38f947eb82a3b9", size = 1097402, upload-time = "2025-11-01T21:15:55.178Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/51/5447876806d1088a0f8f71e16542bf350918128d0a69437df26047c8e46f/widgetsnbextension-4.0.14-py3-none-any.whl", hash = "sha256:4875a9eaf72fbf5079dc372a51a9f268fc38d46f767cbf85c43a36da5cb9b575", size = 2196503, upload-time = "2025-04-10T13:01:23.086Z" }, + { url = "https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl", hash = "sha256:8156704e4346a571d9ce73b84bee86a29906c9abfd7223b7228a28899ccf3366", size = 2196503, upload-time = "2025-11-01T21:15:53.565Z" }, ] [[package]] name = "wrapt" -version = "1.17.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/95/8f/aeb76c5b46e273670962298c23e7ddde79916cb74db802131d49a85e4b7d/wrapt-1.17.3.tar.gz", hash = "sha256:f66eb08feaa410fe4eebd17f2a2c8e2e46d3476e9f8c783daa8e09e0faa666d0", size = 55547, upload-time = "2025-08-12T05:53:21.714Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/41/cad1aba93e752f1f9268c77270da3c469883d56e2798e7df6240dcb2287b/wrapt-1.17.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ab232e7fdb44cdfbf55fc3afa31bcdb0d8980b9b95c38b6405df2acb672af0e0", size = 53998, upload-time = "2025-08-12T05:51:47.138Z" }, - { url = "https://files.pythonhosted.org/packages/60/f8/096a7cc13097a1869fe44efe68dace40d2a16ecb853141394047f0780b96/wrapt-1.17.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9baa544e6acc91130e926e8c802a17f3b16fbea0fd441b5a60f5cf2cc5c3deba", size = 39020, upload-time = "2025-08-12T05:51:35.906Z" }, - { url = "https://files.pythonhosted.org/packages/33/df/bdf864b8997aab4febb96a9ae5c124f700a5abd9b5e13d2a3214ec4be705/wrapt-1.17.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6b538e31eca1a7ea4605e44f81a48aa24c4632a277431a6ed3f328835901f4fd", size = 39098, upload-time = "2025-08-12T05:51:57.474Z" }, - { url = "https://files.pythonhosted.org/packages/9f/81/5d931d78d0eb732b95dc3ddaeeb71c8bb572fb01356e9133916cd729ecdd/wrapt-1.17.3-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:042ec3bb8f319c147b1301f2393bc19dba6e176b7da446853406d041c36c7828", size = 88036, upload-time = "2025-08-12T05:52:34.784Z" }, - { url = "https://files.pythonhosted.org/packages/ca/38/2e1785df03b3d72d34fc6252d91d9d12dc27a5c89caef3335a1bbb8908ca/wrapt-1.17.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3af60380ba0b7b5aeb329bc4e402acd25bd877e98b3727b0135cb5c2efdaefe9", size = 88156, upload-time = "2025-08-12T05:52:13.599Z" }, - { url = "https://files.pythonhosted.org/packages/b3/8b/48cdb60fe0603e34e05cffda0b2a4adab81fd43718e11111a4b0100fd7c1/wrapt-1.17.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0b02e424deef65c9f7326d8c19220a2c9040c51dc165cddb732f16198c168396", size = 87102, upload-time = "2025-08-12T05:52:14.56Z" }, - { url = "https://files.pythonhosted.org/packages/3c/51/d81abca783b58f40a154f1b2c56db1d2d9e0d04fa2d4224e357529f57a57/wrapt-1.17.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:74afa28374a3c3a11b3b5e5fca0ae03bef8450d6aa3ab3a1e2c30e3a75d023dc", size = 87732, upload-time = "2025-08-12T05:52:36.165Z" }, - { url = "https://files.pythonhosted.org/packages/9e/b1/43b286ca1392a006d5336412d41663eeef1ad57485f3e52c767376ba7e5a/wrapt-1.17.3-cp312-cp312-win32.whl", hash = "sha256:4da9f45279fff3543c371d5ababc57a0384f70be244de7759c85a7f989cb4ebe", size = 36705, upload-time = "2025-08-12T05:53:07.123Z" }, - { url = "https://files.pythonhosted.org/packages/28/de/49493f962bd3c586ab4b88066e967aa2e0703d6ef2c43aa28cb83bf7b507/wrapt-1.17.3-cp312-cp312-win_amd64.whl", hash = "sha256:e71d5c6ebac14875668a1e90baf2ea0ef5b7ac7918355850c0908ae82bcb297c", size = 38877, upload-time = "2025-08-12T05:53:05.436Z" }, - { url = "https://files.pythonhosted.org/packages/f1/48/0f7102fe9cb1e8a5a77f80d4f0956d62d97034bbe88d33e94699f99d181d/wrapt-1.17.3-cp312-cp312-win_arm64.whl", hash = "sha256:604d076c55e2fdd4c1c03d06dc1a31b95130010517b5019db15365ec4a405fc6", size = 36885, upload-time = "2025-08-12T05:52:54.367Z" }, - { url = "https://files.pythonhosted.org/packages/fc/f6/759ece88472157acb55fc195e5b116e06730f1b651b5b314c66291729193/wrapt-1.17.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a47681378a0439215912ef542c45a783484d4dd82bac412b71e59cf9c0e1cea0", size = 54003, upload-time = "2025-08-12T05:51:48.627Z" }, - { url = "https://files.pythonhosted.org/packages/4f/a9/49940b9dc6d47027dc850c116d79b4155f15c08547d04db0f07121499347/wrapt-1.17.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a30837587c6ee3cd1a4d1c2ec5d24e77984d44e2f34547e2323ddb4e22eb77", size = 39025, upload-time = "2025-08-12T05:51:37.156Z" }, - { url = "https://files.pythonhosted.org/packages/45/35/6a08de0f2c96dcdd7fe464d7420ddb9a7655a6561150e5fc4da9356aeaab/wrapt-1.17.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:16ecf15d6af39246fe33e507105d67e4b81d8f8d2c6598ff7e3ca1b8a37213f7", size = 39108, upload-time = "2025-08-12T05:51:58.425Z" }, - { url = "https://files.pythonhosted.org/packages/0c/37/6faf15cfa41bf1f3dba80cd3f5ccc6622dfccb660ab26ed79f0178c7497f/wrapt-1.17.3-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6fd1ad24dc235e4ab88cda009e19bf347aabb975e44fd5c2fb22a3f6e4141277", size = 88072, upload-time = "2025-08-12T05:52:37.53Z" }, - { url = "https://files.pythonhosted.org/packages/78/f2/efe19ada4a38e4e15b6dff39c3e3f3f73f5decf901f66e6f72fe79623a06/wrapt-1.17.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ed61b7c2d49cee3c027372df5809a59d60cf1b6c2f81ee980a091f3afed6a2d", size = 88214, upload-time = "2025-08-12T05:52:15.886Z" }, - { url = "https://files.pythonhosted.org/packages/40/90/ca86701e9de1622b16e09689fc24b76f69b06bb0150990f6f4e8b0eeb576/wrapt-1.17.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:423ed5420ad5f5529db9ce89eac09c8a2f97da18eb1c870237e84c5a5c2d60aa", size = 87105, upload-time = "2025-08-12T05:52:17.914Z" }, - { url = "https://files.pythonhosted.org/packages/fd/e0/d10bd257c9a3e15cbf5523025252cc14d77468e8ed644aafb2d6f54cb95d/wrapt-1.17.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e01375f275f010fcbf7f643b4279896d04e571889b8a5b3f848423d91bf07050", size = 87766, upload-time = "2025-08-12T05:52:39.243Z" }, - { url = "https://files.pythonhosted.org/packages/e8/cf/7d848740203c7b4b27eb55dbfede11aca974a51c3d894f6cc4b865f42f58/wrapt-1.17.3-cp313-cp313-win32.whl", hash = "sha256:53e5e39ff71b3fc484df8a522c933ea2b7cdd0d5d15ae82e5b23fde87d44cbd8", size = 36711, upload-time = "2025-08-12T05:53:10.074Z" }, - { url = "https://files.pythonhosted.org/packages/57/54/35a84d0a4d23ea675994104e667ceff49227ce473ba6a59ba2c84f250b74/wrapt-1.17.3-cp313-cp313-win_amd64.whl", hash = "sha256:1f0b2f40cf341ee8cc1a97d51ff50dddb9fcc73241b9143ec74b30fc4f44f6cb", size = 38885, upload-time = "2025-08-12T05:53:08.695Z" }, - { url = "https://files.pythonhosted.org/packages/01/77/66e54407c59d7b02a3c4e0af3783168fff8e5d61def52cda8728439d86bc/wrapt-1.17.3-cp313-cp313-win_arm64.whl", hash = "sha256:7425ac3c54430f5fc5e7b6f41d41e704db073309acfc09305816bc6a0b26bb16", size = 36896, upload-time = "2025-08-12T05:52:55.34Z" }, - { url = "https://files.pythonhosted.org/packages/02/a2/cd864b2a14f20d14f4c496fab97802001560f9f41554eef6df201cd7f76c/wrapt-1.17.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cf30f6e3c077c8e6a9a7809c94551203c8843e74ba0c960f4a98cd80d4665d39", size = 54132, upload-time = "2025-08-12T05:51:49.864Z" }, - { url = "https://files.pythonhosted.org/packages/d5/46/d011725b0c89e853dc44cceb738a307cde5d240d023d6d40a82d1b4e1182/wrapt-1.17.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e228514a06843cae89621384cfe3a80418f3c04aadf8a3b14e46a7be704e4235", size = 39091, upload-time = "2025-08-12T05:51:38.935Z" }, - { url = "https://files.pythonhosted.org/packages/2e/9e/3ad852d77c35aae7ddebdbc3b6d35ec8013af7d7dddad0ad911f3d891dae/wrapt-1.17.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:5ea5eb3c0c071862997d6f3e02af1d055f381b1d25b286b9d6644b79db77657c", size = 39172, upload-time = "2025-08-12T05:51:59.365Z" }, - { url = "https://files.pythonhosted.org/packages/c3/f7/c983d2762bcce2326c317c26a6a1e7016f7eb039c27cdf5c4e30f4160f31/wrapt-1.17.3-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:281262213373b6d5e4bb4353bc36d1ba4084e6d6b5d242863721ef2bf2c2930b", size = 87163, upload-time = "2025-08-12T05:52:40.965Z" }, - { url = "https://files.pythonhosted.org/packages/e4/0f/f673f75d489c7f22d17fe0193e84b41540d962f75fce579cf6873167c29b/wrapt-1.17.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dc4a8d2b25efb6681ecacad42fca8859f88092d8732b170de6a5dddd80a1c8fa", size = 87963, upload-time = "2025-08-12T05:52:20.326Z" }, - { url = "https://files.pythonhosted.org/packages/df/61/515ad6caca68995da2fac7a6af97faab8f78ebe3bf4f761e1b77efbc47b5/wrapt-1.17.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:373342dd05b1d07d752cecbec0c41817231f29f3a89aa8b8843f7b95992ed0c7", size = 86945, upload-time = "2025-08-12T05:52:21.581Z" }, - { url = "https://files.pythonhosted.org/packages/d3/bd/4e70162ce398462a467bc09e768bee112f1412e563620adc353de9055d33/wrapt-1.17.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d40770d7c0fd5cbed9d84b2c3f2e156431a12c9a37dc6284060fb4bec0b7ffd4", size = 86857, upload-time = "2025-08-12T05:52:43.043Z" }, - { url = "https://files.pythonhosted.org/packages/2b/b8/da8560695e9284810b8d3df8a19396a6e40e7518059584a1a394a2b35e0a/wrapt-1.17.3-cp314-cp314-win32.whl", hash = "sha256:fbd3c8319de8e1dc79d346929cd71d523622da527cca14e0c1d257e31c2b8b10", size = 37178, upload-time = "2025-08-12T05:53:12.605Z" }, - { url = "https://files.pythonhosted.org/packages/db/c8/b71eeb192c440d67a5a0449aaee2310a1a1e8eca41676046f99ed2487e9f/wrapt-1.17.3-cp314-cp314-win_amd64.whl", hash = "sha256:e1a4120ae5705f673727d3253de3ed0e016f7cd78dc463db1b31e2463e1f3cf6", size = 39310, upload-time = "2025-08-12T05:53:11.106Z" }, - { url = "https://files.pythonhosted.org/packages/45/20/2cda20fd4865fa40f86f6c46ed37a2a8356a7a2fde0773269311f2af56c7/wrapt-1.17.3-cp314-cp314-win_arm64.whl", hash = "sha256:507553480670cab08a800b9463bdb881b2edeed77dc677b0a5915e6106e91a58", size = 37266, upload-time = "2025-08-12T05:52:56.531Z" }, - { url = "https://files.pythonhosted.org/packages/77/ed/dd5cf21aec36c80443c6f900449260b80e2a65cf963668eaef3b9accce36/wrapt-1.17.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:ed7c635ae45cfbc1a7371f708727bf74690daedc49b4dba310590ca0bd28aa8a", size = 56544, upload-time = "2025-08-12T05:51:51.109Z" }, - { url = "https://files.pythonhosted.org/packages/8d/96/450c651cc753877ad100c7949ab4d2e2ecc4d97157e00fa8f45df682456a/wrapt-1.17.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:249f88ed15503f6492a71f01442abddd73856a0032ae860de6d75ca62eed8067", size = 40283, upload-time = "2025-08-12T05:51:39.912Z" }, - { url = "https://files.pythonhosted.org/packages/d1/86/2fcad95994d9b572db57632acb6f900695a648c3e063f2cd344b3f5c5a37/wrapt-1.17.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a03a38adec8066d5a37bea22f2ba6bbf39fcdefbe2d91419ab864c3fb515454", size = 40366, upload-time = "2025-08-12T05:52:00.693Z" }, - { url = "https://files.pythonhosted.org/packages/64/0e/f4472f2fdde2d4617975144311f8800ef73677a159be7fe61fa50997d6c0/wrapt-1.17.3-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5d4478d72eb61c36e5b446e375bbc49ed002430d17cdec3cecb36993398e1a9e", size = 108571, upload-time = "2025-08-12T05:52:44.521Z" }, - { url = "https://files.pythonhosted.org/packages/cc/01/9b85a99996b0a97c8a17484684f206cbb6ba73c1ce6890ac668bcf3838fb/wrapt-1.17.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:223db574bb38637e8230eb14b185565023ab624474df94d2af18f1cdb625216f", size = 113094, upload-time = "2025-08-12T05:52:22.618Z" }, - { url = "https://files.pythonhosted.org/packages/25/02/78926c1efddcc7b3aa0bc3d6b33a822f7d898059f7cd9ace8c8318e559ef/wrapt-1.17.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e405adefb53a435f01efa7ccdec012c016b5a1d3f35459990afc39b6be4d5056", size = 110659, upload-time = "2025-08-12T05:52:24.057Z" }, - { url = "https://files.pythonhosted.org/packages/dc/ee/c414501ad518ac3e6fe184753632fe5e5ecacdcf0effc23f31c1e4f7bfcf/wrapt-1.17.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:88547535b787a6c9ce4086917b6e1d291aa8ed914fdd3a838b3539dc95c12804", size = 106946, upload-time = "2025-08-12T05:52:45.976Z" }, - { url = "https://files.pythonhosted.org/packages/be/44/a1bd64b723d13bb151d6cc91b986146a1952385e0392a78567e12149c7b4/wrapt-1.17.3-cp314-cp314t-win32.whl", hash = "sha256:41b1d2bc74c2cac6f9074df52b2efbef2b30bdfe5f40cb78f8ca22963bc62977", size = 38717, upload-time = "2025-08-12T05:53:15.214Z" }, - { url = "https://files.pythonhosted.org/packages/79/d9/7cfd5a312760ac4dd8bf0184a6ee9e43c33e47f3dadc303032ce012b8fa3/wrapt-1.17.3-cp314-cp314t-win_amd64.whl", hash = "sha256:73d496de46cd2cdbdbcce4ae4bcdb4afb6a11234a1df9c085249d55166b95116", size = 41334, upload-time = "2025-08-12T05:53:14.178Z" }, - { url = "https://files.pythonhosted.org/packages/46/78/10ad9781128ed2f99dbc474f43283b13fea8ba58723e98844367531c18e9/wrapt-1.17.3-cp314-cp314t-win_arm64.whl", hash = "sha256:f38e60678850c42461d4202739f9bf1e3a737c7ad283638251e79cc49effb6b6", size = 38471, upload-time = "2025-08-12T05:52:57.784Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f6/a933bd70f98e9cf3e08167fc5cd7aaaca49147e48411c0bd5ae701bb2194/wrapt-1.17.3-py3-none-any.whl", hash = "sha256:7171ae35d2c33d326ac19dd8facb1e82e5fd04ef8c6c0e394d7af55a55051c22", size = 23591, upload-time = "2025-08-12T05:53:20.674Z" }, +version = "2.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/49/2a/6de8a50cb435b7f42c46126cf1a54b2aab81784e74c8595c8e025e8f36d3/wrapt-2.0.1.tar.gz", hash = "sha256:9c9c635e78497cacb81e84f8b11b23e0aacac7a136e73b8e5b2109a1d9fc468f", size = 82040, upload-time = "2025-11-07T00:45:33.312Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/73/8cb252858dc8254baa0ce58ce382858e3a1cf616acebc497cb13374c95c6/wrapt-2.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1fdbb34da15450f2b1d735a0e969c24bdb8d8924892380126e2a293d9902078c", size = 78129, upload-time = "2025-11-07T00:43:48.852Z" }, + { url = "https://files.pythonhosted.org/packages/19/42/44a0db2108526ee6e17a5ab72478061158f34b08b793df251d9fbb9a7eb4/wrapt-2.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3d32794fe940b7000f0519904e247f902f0149edbe6316c710a8562fb6738841", size = 61205, upload-time = "2025-11-07T00:43:50.402Z" }, + { url = "https://files.pythonhosted.org/packages/4d/8a/5b4b1e44b791c22046e90d9b175f9a7581a8cc7a0debbb930f81e6ae8e25/wrapt-2.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:386fb54d9cd903ee0012c09291336469eb7b244f7183d40dc3e86a16a4bace62", size = 61692, upload-time = "2025-11-07T00:43:51.678Z" }, + { url = "https://files.pythonhosted.org/packages/11/53/3e794346c39f462bcf1f58ac0487ff9bdad02f9b6d5ee2dc84c72e0243b2/wrapt-2.0.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7b219cb2182f230676308cdcacd428fa837987b89e4b7c5c9025088b8a6c9faf", size = 121492, upload-time = "2025-11-07T00:43:55.017Z" }, + { url = "https://files.pythonhosted.org/packages/c6/7e/10b7b0e8841e684c8ca76b462a9091c45d62e8f2de9c4b1390b690eadf16/wrapt-2.0.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:641e94e789b5f6b4822bb8d8ebbdfc10f4e4eae7756d648b717d980f657a9eb9", size = 123064, upload-time = "2025-11-07T00:43:56.323Z" }, + { url = "https://files.pythonhosted.org/packages/0e/d1/3c1e4321fc2f5ee7fd866b2d822aa89b84495f28676fd976c47327c5b6aa/wrapt-2.0.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fe21b118b9f58859b5ebaa4b130dee18669df4bd111daad082b7beb8799ad16b", size = 117403, upload-time = "2025-11-07T00:43:53.258Z" }, + { url = "https://files.pythonhosted.org/packages/a4/b0/d2f0a413cf201c8c2466de08414a15420a25aa83f53e647b7255cc2fab5d/wrapt-2.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:17fb85fa4abc26a5184d93b3efd2dcc14deb4b09edcdb3535a536ad34f0b4dba", size = 121500, upload-time = "2025-11-07T00:43:57.468Z" }, + { url = "https://files.pythonhosted.org/packages/bd/45/bddb11d28ca39970a41ed48a26d210505120f925918592283369219f83cc/wrapt-2.0.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:b89ef9223d665ab255ae42cc282d27d69704d94be0deffc8b9d919179a609684", size = 116299, upload-time = "2025-11-07T00:43:58.877Z" }, + { url = "https://files.pythonhosted.org/packages/81/af/34ba6dd570ef7a534e7eec0c25e2615c355602c52aba59413411c025a0cb/wrapt-2.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a453257f19c31b31ba593c30d997d6e5be39e3b5ad9148c2af5a7314061c63eb", size = 120622, upload-time = "2025-11-07T00:43:59.962Z" }, + { url = "https://files.pythonhosted.org/packages/e2/3e/693a13b4146646fb03254636f8bafd20c621955d27d65b15de07ab886187/wrapt-2.0.1-cp312-cp312-win32.whl", hash = "sha256:3e271346f01e9c8b1130a6a3b0e11908049fe5be2d365a5f402778049147e7e9", size = 58246, upload-time = "2025-11-07T00:44:03.169Z" }, + { url = "https://files.pythonhosted.org/packages/a7/36/715ec5076f925a6be95f37917b66ebbeaa1372d1862c2ccd7a751574b068/wrapt-2.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:2da620b31a90cdefa9cd0c2b661882329e2e19d1d7b9b920189956b76c564d75", size = 60492, upload-time = "2025-11-07T00:44:01.027Z" }, + { url = "https://files.pythonhosted.org/packages/ef/3e/62451cd7d80f65cc125f2b426b25fbb6c514bf6f7011a0c3904fc8c8df90/wrapt-2.0.1-cp312-cp312-win_arm64.whl", hash = "sha256:aea9c7224c302bc8bfc892b908537f56c430802560e827b75ecbde81b604598b", size = 58987, upload-time = "2025-11-07T00:44:02.095Z" }, + { url = "https://files.pythonhosted.org/packages/ad/fe/41af4c46b5e498c90fc87981ab2972fbd9f0bccda597adb99d3d3441b94b/wrapt-2.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:47b0f8bafe90f7736151f61482c583c86b0693d80f075a58701dd1549b0010a9", size = 78132, upload-time = "2025-11-07T00:44:04.628Z" }, + { url = "https://files.pythonhosted.org/packages/1c/92/d68895a984a5ebbbfb175512b0c0aad872354a4a2484fbd5552e9f275316/wrapt-2.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cbeb0971e13b4bd81d34169ed57a6dda017328d1a22b62fda45e1d21dd06148f", size = 61211, upload-time = "2025-11-07T00:44:05.626Z" }, + { url = "https://files.pythonhosted.org/packages/e8/26/ba83dc5ae7cf5aa2b02364a3d9cf74374b86169906a1f3ade9a2d03cf21c/wrapt-2.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb7cffe572ad0a141a7886a1d2efa5bef0bf7fe021deeea76b3ab334d2c38218", size = 61689, upload-time = "2025-11-07T00:44:06.719Z" }, + { url = "https://files.pythonhosted.org/packages/cf/67/d7a7c276d874e5d26738c22444d466a3a64ed541f6ef35f740dbd865bab4/wrapt-2.0.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c8d60527d1ecfc131426b10d93ab5d53e08a09c5fa0175f6b21b3252080c70a9", size = 121502, upload-time = "2025-11-07T00:44:09.557Z" }, + { url = "https://files.pythonhosted.org/packages/0f/6b/806dbf6dd9579556aab22fc92908a876636e250f063f71548a8660382184/wrapt-2.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c654eafb01afac55246053d67a4b9a984a3567c3808bb7df2f8de1c1caba2e1c", size = 123110, upload-time = "2025-11-07T00:44:10.64Z" }, + { url = "https://files.pythonhosted.org/packages/e5/08/cdbb965fbe4c02c5233d185d070cabed2ecc1f1e47662854f95d77613f57/wrapt-2.0.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:98d873ed6c8b4ee2418f7afce666751854d6d03e3c0ec2a399bb039cd2ae89db", size = 117434, upload-time = "2025-11-07T00:44:08.138Z" }, + { url = "https://files.pythonhosted.org/packages/2d/d1/6aae2ce39db4cb5216302fa2e9577ad74424dfbe315bd6669725569e048c/wrapt-2.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c9e850f5b7fc67af856ff054c71690d54fa940c3ef74209ad9f935b4f66a0233", size = 121533, upload-time = "2025-11-07T00:44:12.142Z" }, + { url = "https://files.pythonhosted.org/packages/79/35/565abf57559fbe0a9155c29879ff43ce8bd28d2ca61033a3a3dd67b70794/wrapt-2.0.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e505629359cb5f751e16e30cf3f91a1d3ddb4552480c205947da415d597f7ac2", size = 116324, upload-time = "2025-11-07T00:44:13.28Z" }, + { url = "https://files.pythonhosted.org/packages/e1/e0/53ff5e76587822ee33e560ad55876d858e384158272cd9947abdd4ad42ca/wrapt-2.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2879af909312d0baf35f08edeea918ee3af7ab57c37fe47cb6a373c9f2749c7b", size = 120627, upload-time = "2025-11-07T00:44:14.431Z" }, + { url = "https://files.pythonhosted.org/packages/7c/7b/38df30fd629fbd7612c407643c63e80e1c60bcc982e30ceeae163a9800e7/wrapt-2.0.1-cp313-cp313-win32.whl", hash = "sha256:d67956c676be5a24102c7407a71f4126d30de2a569a1c7871c9f3cabc94225d7", size = 58252, upload-time = "2025-11-07T00:44:17.814Z" }, + { url = "https://files.pythonhosted.org/packages/85/64/d3954e836ea67c4d3ad5285e5c8fd9d362fd0a189a2db622df457b0f4f6a/wrapt-2.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:9ca66b38dd642bf90c59b6738af8070747b610115a39af2498535f62b5cdc1c3", size = 60500, upload-time = "2025-11-07T00:44:15.561Z" }, + { url = "https://files.pythonhosted.org/packages/89/4e/3c8b99ac93527cfab7f116089db120fef16aac96e5f6cdb724ddf286086d/wrapt-2.0.1-cp313-cp313-win_arm64.whl", hash = "sha256:5a4939eae35db6b6cec8e7aa0e833dcca0acad8231672c26c2a9ab7a0f8ac9c8", size = 58993, upload-time = "2025-11-07T00:44:16.65Z" }, + { url = "https://files.pythonhosted.org/packages/f9/f4/eff2b7d711cae20d220780b9300faa05558660afb93f2ff5db61fe725b9a/wrapt-2.0.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a52f93d95c8d38fed0669da2ebdb0b0376e895d84596a976c15a9eb45e3eccb3", size = 82028, upload-time = "2025-11-07T00:44:18.944Z" }, + { url = "https://files.pythonhosted.org/packages/0c/67/cb945563f66fd0f61a999339460d950f4735c69f18f0a87ca586319b1778/wrapt-2.0.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4e54bbf554ee29fcceee24fa41c4d091398b911da6e7f5d7bffda963c9aed2e1", size = 62949, upload-time = "2025-11-07T00:44:20.074Z" }, + { url = "https://files.pythonhosted.org/packages/ec/ca/f63e177f0bbe1e5cf5e8d9b74a286537cd709724384ff20860f8f6065904/wrapt-2.0.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:908f8c6c71557f4deaa280f55d0728c3bca0960e8c3dd5ceeeafb3c19942719d", size = 63681, upload-time = "2025-11-07T00:44:21.345Z" }, + { url = "https://files.pythonhosted.org/packages/39/a1/1b88fcd21fd835dca48b556daef750952e917a2794fa20c025489e2e1f0f/wrapt-2.0.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e2f84e9af2060e3904a32cea9bb6db23ce3f91cfd90c6b426757cf7cc01c45c7", size = 152696, upload-time = "2025-11-07T00:44:24.318Z" }, + { url = "https://files.pythonhosted.org/packages/62/1c/d9185500c1960d9f5f77b9c0b890b7fc62282b53af7ad1b6bd779157f714/wrapt-2.0.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e3612dc06b436968dfb9142c62e5dfa9eb5924f91120b3c8ff501ad878f90eb3", size = 158859, upload-time = "2025-11-07T00:44:25.494Z" }, + { url = "https://files.pythonhosted.org/packages/91/60/5d796ed0f481ec003220c7878a1d6894652efe089853a208ea0838c13086/wrapt-2.0.1-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6d2d947d266d99a1477cd005b23cbd09465276e302515e122df56bb9511aca1b", size = 146068, upload-time = "2025-11-07T00:44:22.81Z" }, + { url = "https://files.pythonhosted.org/packages/04/f8/75282dd72f102ddbfba137e1e15ecba47b40acff32c08ae97edbf53f469e/wrapt-2.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:7d539241e87b650cbc4c3ac9f32c8d1ac8a54e510f6dca3f6ab60dcfd48c9b10", size = 155724, upload-time = "2025-11-07T00:44:26.634Z" }, + { url = "https://files.pythonhosted.org/packages/5a/27/fe39c51d1b344caebb4a6a9372157bdb8d25b194b3561b52c8ffc40ac7d1/wrapt-2.0.1-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:4811e15d88ee62dbf5c77f2c3ff3932b1e3ac92323ba3912f51fc4016ce81ecf", size = 144413, upload-time = "2025-11-07T00:44:27.939Z" }, + { url = "https://files.pythonhosted.org/packages/83/2b/9f6b643fe39d4505c7bf926d7c2595b7cb4b607c8c6b500e56c6b36ac238/wrapt-2.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c1c91405fcf1d501fa5d55df21e58ea49e6b879ae829f1039faaf7e5e509b41e", size = 150325, upload-time = "2025-11-07T00:44:29.29Z" }, + { url = "https://files.pythonhosted.org/packages/bb/b6/20ffcf2558596a7f58a2e69c89597128781f0b88e124bf5a4cadc05b8139/wrapt-2.0.1-cp313-cp313t-win32.whl", hash = "sha256:e76e3f91f864e89db8b8d2a8311d57df93f01ad6bb1e9b9976d1f2e83e18315c", size = 59943, upload-time = "2025-11-07T00:44:33.211Z" }, + { url = "https://files.pythonhosted.org/packages/87/6a/0e56111cbb3320151eed5d3821ee1373be13e05b376ea0870711f18810c3/wrapt-2.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:83ce30937f0ba0d28818807b303a412440c4b63e39d3d8fc036a94764b728c92", size = 63240, upload-time = "2025-11-07T00:44:30.935Z" }, + { url = "https://files.pythonhosted.org/packages/1d/54/5ab4c53ea1f7f7e5c3e7c1095db92932cc32fd62359d285486d00c2884c3/wrapt-2.0.1-cp313-cp313t-win_arm64.whl", hash = "sha256:4b55cacc57e1dc2d0991dbe74c6419ffd415fb66474a02335cb10efd1aa3f84f", size = 60416, upload-time = "2025-11-07T00:44:32.002Z" }, + { url = "https://files.pythonhosted.org/packages/73/81/d08d83c102709258e7730d3cd25befd114c60e43ef3891d7e6877971c514/wrapt-2.0.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:5e53b428f65ece6d9dad23cb87e64506392b720a0b45076c05354d27a13351a1", size = 78290, upload-time = "2025-11-07T00:44:34.691Z" }, + { url = "https://files.pythonhosted.org/packages/f6/14/393afba2abb65677f313aa680ff0981e829626fed39b6a7e3ec807487790/wrapt-2.0.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ad3ee9d0f254851c71780966eb417ef8e72117155cff04821ab9b60549694a55", size = 61255, upload-time = "2025-11-07T00:44:35.762Z" }, + { url = "https://files.pythonhosted.org/packages/c4/10/a4a1f2fba205a9462e36e708ba37e5ac95f4987a0f1f8fd23f0bf1fc3b0f/wrapt-2.0.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d7b822c61ed04ee6ad64bc90d13368ad6eb094db54883b5dde2182f67a7f22c0", size = 61797, upload-time = "2025-11-07T00:44:37.22Z" }, + { url = "https://files.pythonhosted.org/packages/12/db/99ba5c37cf1c4fad35349174f1e38bd8d992340afc1ff27f526729b98986/wrapt-2.0.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7164a55f5e83a9a0b031d3ffab4d4e36bbec42e7025db560f225489fa929e509", size = 120470, upload-time = "2025-11-07T00:44:39.425Z" }, + { url = "https://files.pythonhosted.org/packages/30/3f/a1c8d2411eb826d695fc3395a431757331582907a0ec59afce8fe8712473/wrapt-2.0.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e60690ba71a57424c8d9ff28f8d006b7ad7772c22a4af432188572cd7fa004a1", size = 122851, upload-time = "2025-11-07T00:44:40.582Z" }, + { url = "https://files.pythonhosted.org/packages/b3/8d/72c74a63f201768d6a04a8845c7976f86be6f5ff4d74996c272cefc8dafc/wrapt-2.0.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3cd1a4bd9a7a619922a8557e1318232e7269b5fb69d4ba97b04d20450a6bf970", size = 117433, upload-time = "2025-11-07T00:44:38.313Z" }, + { url = "https://files.pythonhosted.org/packages/c7/5a/df37cf4042cb13b08256f8e27023e2f9b3d471d553376616591bb99bcb31/wrapt-2.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b4c2e3d777e38e913b8ce3a6257af72fb608f86a1df471cb1d4339755d0a807c", size = 121280, upload-time = "2025-11-07T00:44:41.69Z" }, + { url = "https://files.pythonhosted.org/packages/54/34/40d6bc89349f9931e1186ceb3e5fbd61d307fef814f09fbbac98ada6a0c8/wrapt-2.0.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:3d366aa598d69416b5afedf1faa539fac40c1d80a42f6b236c88c73a3c8f2d41", size = 116343, upload-time = "2025-11-07T00:44:43.013Z" }, + { url = "https://files.pythonhosted.org/packages/70/66/81c3461adece09d20781dee17c2366fdf0cb8754738b521d221ca056d596/wrapt-2.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c235095d6d090aa903f1db61f892fffb779c1eaeb2a50e566b52001f7a0f66ed", size = 119650, upload-time = "2025-11-07T00:44:44.523Z" }, + { url = "https://files.pythonhosted.org/packages/46/3a/d0146db8be8761a9e388cc9cc1c312b36d583950ec91696f19bbbb44af5a/wrapt-2.0.1-cp314-cp314-win32.whl", hash = "sha256:bfb5539005259f8127ea9c885bdc231978c06b7a980e63a8a61c8c4c979719d0", size = 58701, upload-time = "2025-11-07T00:44:48.277Z" }, + { url = "https://files.pythonhosted.org/packages/1a/38/5359da9af7d64554be63e9046164bd4d8ff289a2dd365677d25ba3342c08/wrapt-2.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:4ae879acc449caa9ed43fc36ba08392b9412ee67941748d31d94e3cedb36628c", size = 60947, upload-time = "2025-11-07T00:44:46.086Z" }, + { url = "https://files.pythonhosted.org/packages/aa/3f/96db0619276a833842bf36343685fa04f987dd6e3037f314531a1e00492b/wrapt-2.0.1-cp314-cp314-win_arm64.whl", hash = "sha256:8639b843c9efd84675f1e100ed9e99538ebea7297b62c4b45a7042edb84db03e", size = 59359, upload-time = "2025-11-07T00:44:47.164Z" }, + { url = "https://files.pythonhosted.org/packages/71/49/5f5d1e867bf2064bf3933bc6cf36ade23505f3902390e175e392173d36a2/wrapt-2.0.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:9219a1d946a9b32bb23ccae66bdb61e35c62773ce7ca6509ceea70f344656b7b", size = 82031, upload-time = "2025-11-07T00:44:49.4Z" }, + { url = "https://files.pythonhosted.org/packages/2b/89/0009a218d88db66ceb83921e5685e820e2c61b59bbbb1324ba65342668bc/wrapt-2.0.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:fa4184e74197af3adad3c889a1af95b53bb0466bced92ea99a0c014e48323eec", size = 62952, upload-time = "2025-11-07T00:44:50.74Z" }, + { url = "https://files.pythonhosted.org/packages/ae/18/9b968e920dd05d6e44bcc918a046d02afea0fb31b2f1c80ee4020f377cbe/wrapt-2.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c5ef2f2b8a53b7caee2f797ef166a390fef73979b15778a4a153e4b5fedce8fa", size = 63688, upload-time = "2025-11-07T00:44:52.248Z" }, + { url = "https://files.pythonhosted.org/packages/a6/7d/78bdcb75826725885d9ea26c49a03071b10c4c92da93edda612910f150e4/wrapt-2.0.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e042d653a4745be832d5aa190ff80ee4f02c34b21f4b785745eceacd0907b815", size = 152706, upload-time = "2025-11-07T00:44:54.613Z" }, + { url = "https://files.pythonhosted.org/packages/dd/77/cac1d46f47d32084a703df0d2d29d47e7eb2a7d19fa5cbca0e529ef57659/wrapt-2.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2afa23318136709c4b23d87d543b425c399887b4057936cd20386d5b1422b6fa", size = 158866, upload-time = "2025-11-07T00:44:55.79Z" }, + { url = "https://files.pythonhosted.org/packages/8a/11/b521406daa2421508903bf8d5e8b929216ec2af04839db31c0a2c525eee0/wrapt-2.0.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6c72328f668cf4c503ffcf9434c2b71fdd624345ced7941bc6693e61bbe36bef", size = 146148, upload-time = "2025-11-07T00:44:53.388Z" }, + { url = "https://files.pythonhosted.org/packages/0c/c0/340b272bed297baa7c9ce0c98ef7017d9c035a17a6a71dce3184b8382da2/wrapt-2.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3793ac154afb0e5b45d1233cb94d354ef7a983708cc3bb12563853b1d8d53747", size = 155737, upload-time = "2025-11-07T00:44:56.971Z" }, + { url = "https://files.pythonhosted.org/packages/f3/93/bfcb1fb2bdf186e9c2883a4d1ab45ab099c79cbf8f4e70ea453811fa3ea7/wrapt-2.0.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:fec0d993ecba3991645b4857837277469c8cc4c554a7e24d064d1ca291cfb81f", size = 144451, upload-time = "2025-11-07T00:44:58.515Z" }, + { url = "https://files.pythonhosted.org/packages/d2/6b/dca504fb18d971139d232652656180e3bd57120e1193d9a5899c3c0b7cdd/wrapt-2.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:949520bccc1fa227274da7d03bf238be15389cd94e32e4297b92337df9b7a349", size = 150353, upload-time = "2025-11-07T00:44:59.753Z" }, + { url = "https://files.pythonhosted.org/packages/1d/f6/a1de4bd3653afdf91d250ca5c721ee51195df2b61a4603d4b373aa804d1d/wrapt-2.0.1-cp314-cp314t-win32.whl", hash = "sha256:be9e84e91d6497ba62594158d3d31ec0486c60055c49179edc51ee43d095f79c", size = 60609, upload-time = "2025-11-07T00:45:03.315Z" }, + { url = "https://files.pythonhosted.org/packages/01/3a/07cd60a9d26fe73efead61c7830af975dfdba8537632d410462672e4432b/wrapt-2.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:61c4956171c7434634401db448371277d07032a81cc21c599c22953374781395", size = 64038, upload-time = "2025-11-07T00:45:00.948Z" }, + { url = "https://files.pythonhosted.org/packages/41/99/8a06b8e17dddbf321325ae4eb12465804120f699cd1b8a355718300c62da/wrapt-2.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:35cdbd478607036fee40273be8ed54a451f5f23121bd9d4be515158f9498f7ad", size = 60634, upload-time = "2025-11-07T00:45:02.087Z" }, + { url = "https://files.pythonhosted.org/packages/15/d1/b51471c11592ff9c012bd3e2f7334a6ff2f42a7aed2caffcf0bdddc9cb89/wrapt-2.0.1-py3-none-any.whl", hash = "sha256:4d2ce1bf1a48c5277d7969259232b57645aae5686dba1eaeade39442277afbca", size = 44046, upload-time = "2025-11-07T00:45:32.116Z" }, ] [[package]]