diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index fa9daee..7c7daa1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,6 @@ repos: # pass_filenames: false # # types: [python] - - id: black name: black language: system @@ -39,7 +38,7 @@ repos: # Tell ruff to fix sorting of imports - "--fix" - "--format=github" - - "--target-version=py37" + - "--target-version=py311" - "." # types: [python] pass_filenames: false @@ -47,16 +46,17 @@ repos: # https://jaredkhan.com/blog/mypy-pre-commit - id: mypy name: mypy + # entry: python -c "import sys; print(sys.argv)" entry: mypy + args: ["--check-untyped-defs"] language: python - # use your preferred Python version - # language_version: python3.7 - # additional_dependencies: ["mypy==0.790"] - types: [python] - # use require_serial so that script - # is only called once per commit + language_version: python3.13 require_serial: true - exclude: shape.py|compareshape.py + # To be able to exclude properly + pass_filenames: true + types: [python] + # args: ["--config-file=pyproject.toml"] + exclude: .*(shape|compareshape)\.py$ # Print the number of files as a sanity-check # verbose: true diff --git a/README.md b/README.md index 5174e55..1db4795 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ -# [Entityshape](https://www.wikidata.org/wiki/Q119899931) -A python library to compare a wikidata entity -(item or lexeme) with a -[Wikibase Entity Schema](https://www.wikidata.org/wiki/Wikidata:WikiProject_Schemas). +# [EntityValidator](https://www.wikidata.org/wiki/Q119899931) +A python library and FastAPI backend to compare a wikidata entity +(item or lexeme) with a [Wikibase Entity Schema](https://www.wikidata.org/wiki/Wikidata:WikiProject_Schemas). Based on https://github.com/Teester/entityshape by Mark Tully and https://github.com/dpriskorn/PyEntityshape by Dennis Priskorn @@ -9,7 +8,7 @@ and https://github.com/dpriskorn/PyEntityshape by Dennis Priskorn # Features * compare a given wikidata item with an entityschema and dig into missing properties, too many statement, etc. * determine whether an item is valid according to a certain schema or not -* support for any Wikibase +* the backend currently only support Wikidata, but the library has support for any Wikibase # Limitations The shape and compareshape classes currently only support: @@ -22,41 +21,36 @@ It is still a bit unclear if and how the qualifier validation works. Validation of lexemes is still considered experimental. Feel free to open an issue with a working or non-working example. -# Installation +~~# Installation Get it from pypi -`$ pip install pyentityshape` +`$ pip install entityvalidator`~~ # Usage -## Jupyter Notebooks +~~## Jupyter Notebooks Example notebooks with code for validation of multiple items: [hiking paths](https://public-paws.wmcloud.org/User:So9q/Validating%20a%20group%20of%20items-all-hiking-paths-in-sweden.ipynb) [campsites](https://public-paws.wmcloud.org/User:So9q/Validating%20a%20group%20of%20items-all-campsites-in-sweden.ipynb) -[shelters](https://public-paws.wmcloud.org/User:So9q/Validating%20a%20group%20of%20items-all-shelters-in-sweden.ipynb) +[shelters](https://public-paws.wmcloud.org/User:So9q/Validating%20a%20group%20of%20items-all-shelters-in-sweden.ipynb)~~ ## CLI Example: ``` -# Note that we default to English so the lang parameter here is optional. +import pprint # Note that we default to Wikidata so the mediawiki_api_url and wikibase_url parameters here are optional. -e = EntityShape(eid="E1", +e = EntityValidator(eid="E1", entity_id="Q1", lang="en", # mediawiki_api_url='http://localhost/api.php', # wikibase_url='http://wikibase.svc' ) -result = e.validate_and_get_result() -# Get human readable result -print(result) -"Valid: False\nProperties_without_enough_correct_statements: instance of (P31)" -# Access the data -print(result.properties_without_enough_correct_statements) -"{'P31'}" +# Machine readable json result +pprint(e.get_result) ``` ## Validation -The is_valid method on the Result object mimics all red warnings displayed by https://www.wikidata.org/wiki/User:Teester/EntityShape.js +The is_valid method on the Result object mimics all red warnings displayed by https://www.wikidata.org/wiki/User:Teester/entityvalidator.js It currently checks these five conditions that all have to be false for the item to be valid: 1. properties with too many statements found @@ -115,7 +109,8 @@ advice and help with Ruff to make this better. GPLv3+ # What I learned -* Forking other peoples undocumented spaghetti code is not much fun. +* Forking other peoples undocumented code is not much fun. * I want to find a more reliable validator that support somevalue and novalue * Pydantic is wonderful yet again it makes working with OOP easy peasy :) -* Ruff is crazy fast and very nice! \ No newline at end of file +* Ruff is crazy fast and very nice! +* FastAPI is super nice \ No newline at end of file diff --git a/api.py b/api.py new file mode 100644 index 0000000..2baa5d4 --- /dev/null +++ b/api.py @@ -0,0 +1,109 @@ +import logging +from typing import Any + +from fastapi import APIRouter, FastAPI, HTTPException, Query +from starlette.responses import RedirectResponse + +import config +from entityvalidator import ( + ApiError, + EidError, + EntityIdError, + EntityValidator, + WikibaseEntitySchemaDownloadError, +) +from entityvalidator.exceptions import ( + MissingInformationError, + NoEntitySchemaDataError, + WikibasePropertiesDownloadError, +) + +app = FastAPI() +logging.basicConfig(level=config.loglevel) +logger = logging.getLogger(__name__) +router = APIRouter() + + +@app.get("/", include_in_schema=False) +def root_redirect(): + return RedirectResponse(url="/docs") + + +@router.get("/validate") +def validate_entities( + # mandatory + eid: str = Query(..., description="EntitySchema ID, ex. E100"), + entity_ids: str = Query( + ..., description="Comma-separated list of entity IDs, e.g. Q42,Q43" + ), + # We only support Wikidata for now + # wikibase_url: str = Query(default="http://www.wikidata.org"), + # mediawiki_api_url: str = Query(default="https://www.wikidata.org/w/api.php") +) -> dict[str, Any]: + """ + Validate a list of entity IDs against a specific Wikibase entity schema. + + Args: + eid (str): The EntitySchema ID to validate against (e.g., "E100"). + entity_ids (str): A comma-separated list of entity IDs to validate (max 100 IDs). + + Returns: + dict: A dictionary containing the validation results: + - results (list): Details of the validation. + + Raises: + HTTPException: Raised in case of validation failure, missing data, API errors, + or unexpected exceptions. + """ + # Split by comma and strip whitespace + entity_list = [e.strip() for e in entity_ids.split(",") if e.strip()] + + # Validate at least 1 entity + if not entity_list: + raise HTTPException( + status_code=400, detail="At least one entity ID must be provided." + ) + + # Optional: validate max length + if len(entity_list) > 100: + raise HTTPException(status_code=400, detail="Maximum 100 entity IDs allowed.") + try: + entity_validator = EntityValidator( + entity_ids=entity_list, + eid=eid, + ) + entity_validator.__download_and_validate__() + + return { + "results": entity_validator.get_results, + } + + except (EntityIdError, EidError) as e: + raise HTTPException( + status_code=422, + detail={"error": "Invalid entity id", "message": str(e)}, + ) from e + except ApiError as e: + raise HTTPException( + status_code=502, + detail={"error": "Upstream API failed", "message": str(e)}, + ) from e + except (WikibaseEntitySchemaDownloadError, WikibasePropertiesDownloadError) as e: + raise HTTPException( + status_code=502, + detail={"error": "Wikibase download failed", "message": str(e)}, + ) from e + except (NoEntitySchemaDataError, MissingInformationError) as e: + raise HTTPException( + status_code=422, + detail={"error": "Missing data", "message": str(e)}, + ) from e + except Exception as e: + logger.exception("Unexpected error during validation") + raise HTTPException( + status_code=500, + detail={"error": "Internal server error", "message": str(e)}, + ) from e + + +app.include_router(router, prefix="/v1") diff --git a/config.py b/config.py new file mode 100644 index 0000000..12a245d --- /dev/null +++ b/config.py @@ -0,0 +1,4 @@ +import logging + +loglevel = logging.INFO +user_agent = "EntityValidator (https://github.com/dpriskorn/entityvalidator)" diff --git a/entityshape/__init__.py b/entityshape/__init__.py deleted file mode 100644 index c2b516f..0000000 --- a/entityshape/__init__.py +++ /dev/null @@ -1,71 +0,0 @@ -import re -from typing import Any, Dict, Optional - -from pydantic import BaseModel - -from entityshape.exceptions import ApiError, EidError, LangError, QidError -from entityshape.models.compareshape import CompareShape -from entityshape.models.result import Result -from entityshape.models.shape import Shape - - -class EntityShape(BaseModel): - """This class models the entityshape API - It has a default timeout of 10 seconds - - The API currently only support items""" - - entity_id: str = "" # item or lexeme - eid: str = "" # entityshape - lang: str = "en" # language defaults to English - result: Result = Result() - eid_regex = re.compile(r"E\d+") - entity_id_regex = re.compile(r"[QL]\d+") - compare_shape_result: Optional[Dict[str, Any]] = None - wikibase_url: str = "http://www.wikidata.org" - mediawiki_api_url: str = "https://www.wikidata.org/w/api.php" - user_agent: str = "entityshape (https://github.com/dpriskorn/entityshape)" - - def __check_inputs__(self): - if not self.lang: - raise LangError("We only support 2 and 3 letter language codes") - if not self.eid: - raise EidError("We need an entityshape EID") - if not re.match(self.eid_regex, self.eid): - raise EidError("EID has to be E followed by only numbers like this: E100") - if not self.entity_id: - raise QidError("We need an item QID") - if not re.match(self.entity_id_regex, self.entity_id): - raise QidError("QID has to be Q followed by only numbers like this: Q100") - - def validate_and_get_result(self) -> Result: - """This method checks if we got the 3 parameters we need and - gets the results and return them""" - self.__check_inputs__() - self.__validate__() - return self.__parse_result__() - - def __validate__(self): - shape: Shape = Shape(self.eid, self.lang) - comparison: CompareShape = CompareShape( - shape.get_schema_shape(), - self.entity_id, - self.lang, - wikibase_url=self.wikibase_url, - mediawiki_api_url=self.mediawiki_api_url, - ) - self.compare_shape_result = {} - self.compare_shape_result = { - "general": comparison.get_general(), - "properties": comparison.get_properties(), - "statements": comparison.get_statements(), - } - - def __parse_result__(self) -> Result: - if self.compare_shape_result: - self.result = Result(**self.compare_shape_result) - self.result.lang = self.lang - self.result.analyze() - return self.result - else: - return Result() diff --git a/entityshape/models/property_value.py b/entityshape/models/property_value.py deleted file mode 100644 index d4570e3..0000000 --- a/entityshape/models/property_value.py +++ /dev/null @@ -1,11 +0,0 @@ -from typing import Optional - -from pydantic import BaseModel - -from entityshape.enums import Necessity, PropertyResponse - - -class PropertyValue(BaseModel): - name: str = "" - necessity: Necessity - response: Optional[PropertyResponse] = None diff --git a/entityshape/models/result.py b/entityshape/models/result.py deleted file mode 100644 index d1edea1..0000000 --- a/entityshape/models/result.py +++ /dev/null @@ -1,202 +0,0 @@ -import logging -from typing import Any, Dict, List, Set - -from pydantic import BaseModel -from wikibaseintegrator import WikibaseIntegrator # type: ignore - -from entityshape.enums import Necessity, PropertyResponse, StatementResponse -from entityshape.models.property_value import PropertyValue -from entityshape.models.result_property import ResultProperty -from entityshape.models.statement_value import StatementValue - -logger = logging.getLogger(__name__) - - -class Result(BaseModel): - general: Dict[Any, Any] = {} - name: str = "" - properties: Dict[str, PropertyValue] = {} - statements: Dict[Any, StatementValue] = {} - missing_properties: Set[str] = set() - required_properties: Set[str] = set() - incorrect_statements: Set[str] = set() - missing_statements: Set[str] = set() - properties_with_too_many_statements: Set[str] = set() - analyzed: bool = False - required_properties_that_are_missing: Set[str] = set() - optional_properties_that_are_missing: Set[str] = set() - properties_without_enough_correct_statements: Set[str] = set() - properties_that_are_not_allowed: Set[str] = set() - statements_with_property_that_is_not_allowed: Set[str] = set() - lang: str = "en" - wikibase_url: str = "http://www.wikidata.org" - mediawiki_api_url: str = "https://www.wikidata.org/w/api.php" - - @property - def some_required_properties_are_missing(self): - return bool(self.required_properties_that_are_missing) - - @property - def properties_with_too_many_statements_found(self): - return bool(self.properties_with_too_many_statements) - - @property - def incorrect_statements_found(self): - return bool(self.incorrect_statements) - - @property - def properties_without_enough_correct_statements_found(self): - return bool(self.properties_without_enough_correct_statements) - - @property - def statements_with_properties_that_are_not_allowed_found(self): - return bool(self.statements_with_property_that_is_not_allowed) - - @property - def is_valid(self) -> bool: - """check if the properties are all allowed, - all required properties are present, - not too many statements, - and none of the statements are incorrect""" - self.analyze() - return bool( - not self.properties_with_too_many_statements_found - and not self.incorrect_statements_found - and not self.some_required_properties_are_missing - and not self.properties_without_enough_correct_statements_found - and not self.statements_with_properties_that_are_not_allowed_found - ) - - @property - def is_empty(self): - return bool(len(self.properties) == 0 and len(self.statements) == 0) - - def analyze(self): - if not self.analyzed: - self.__find_missing_properties__() - self.__find_required_properties__() - self.__find_incorrect_statements__() - self.__find_properties_with_too_many_statements__() - self.__find_properties_with_not_enough_correct_statements__() - self.__find_required_properties_that_are_missing__() - self.__find_optional_properties_that_are_missing__() - self.__find_properties_that_are_not_allowed__() - self.__find_statements_with_property_that_is_not_allowed__() - self.analyzed = True - - def __find_properties_with_too_many_statements__(self): - for property_ in self.properties: - value: PropertyValue = self.properties[property_] - if value.response == PropertyResponse.TOO_MANY_STATEMENTS: - self.properties_with_too_many_statements.add(property_) - - def __find_incorrect_statements__(self): - for statement in self.statements: - value: StatementValue = self.statements[statement] - try: - StatementResponse(value.response) - if value.response == StatementResponse.INCORRECT: - self.incorrect_statements.add(statement) - except ValueError: - # Ignore responses we cannot predict - logger.warning(f"Ignoring statement response: {value.response}") - pass - - def __find_required_properties__(self): - for property_ in self.properties: - value: PropertyValue = self.properties[property_] - if value.necessity == Necessity.REQUIRED: - self.required_properties.add(property_) - - def __find_missing_properties__(self): - for property_ in self.properties: - value: PropertyValue = self.properties[property_] - if value.response == PropertyResponse.MISSING: - self.missing_properties.add(property_) - - def __find_required_properties_that_are_missing__(self): - a = set(self.missing_properties) - b = set(self.required_properties) - # the intersection between these two should be empty - # if all required properties are present - self.required_properties_that_are_missing = a.intersection(b) - - def __find_optional_properties_that_are_missing__(self): - """We calculate using set difference""" - a = set(self.missing_properties) - b = set(self.required_properties) - self.optional_properties_that_are_missing = a.difference(b) - - def __find_properties_with_not_enough_correct_statements__(self): - for property_ in self.properties: - value: PropertyValue = self.properties[property_] - if value.response == PropertyResponse.NOT_ENOUGH_CORRECT_STATEMENTS: - self.properties_without_enough_correct_statements.add(property_) - - def __find_properties_that_are_not_allowed__(self): - for property_ in self.properties: - value: PropertyValue = self.properties[property_] - if value.necessity == Necessity.ABSENT: - self.properties_that_are_not_allowed.add(property_) - - def __find_statements_with_property_that_is_not_allowed__(self): - for statement in self.statements: - value: StatementValue = self.statements[statement] - if value.necessity == Necessity.ABSENT: - self.statements_with_property_that_is_not_allowed.add(value.property) - - def get_properties_as_a_string_with_labels_and_pid( - self, wbi, string_properties: Set[str] - ): - properties: List[ResultProperty] = [] - for property_string in string_properties: - wbi_property = wbi.property.get(property_string) - property_object = ResultProperty( - label=wbi_property.labels.get(language=self.lang).value, - pid=property_string, - ) - properties.append(property_object) - return ", ".join([str(property_) for property_ in properties]) - - def __str__(self): - return self.__repr__() - - def __repr__(self): - """Return the result of the validation as a formatted string - with output exactly describing what caused the validation to fail - - We lookup the labels by default. - If no language is set we fall back to English""" - string = f"Valid: {self.is_valid}" - if self.is_valid: - return string - else: - from wikibaseintegrator.wbi_config import config as wbi_config # type: ignore - - # Update the WBI config with the values from the entityshape config - # This enables support for any Wikibase - wbi_config["MEDIAWIKI_API_URL"] = self.mediawiki_api_url - wbi_config["WIKIBASE_URL"] = self.wikibase_url - wbi = WikibaseIntegrator() - if self.properties_with_too_many_statements_found: - properties_string = self.get_properties_as_a_string_with_labels_and_pid( - string_properties=self.properties_with_too_many_statements, wbi=wbi - ) - string += f"\nProperties with too many statements: {properties_string}" - if self.properties_without_enough_correct_statements_found: - properties_string = self.get_properties_as_a_string_with_labels_and_pid( - string_properties=self.properties_without_enough_correct_statements, - wbi=wbi, - ) - string += ( - f"\nProperties without enough correct statements: " - f"{properties_string}" - ) - if self.required_properties_that_are_missing: - properties_string = self.get_properties_as_a_string_with_labels_and_pid( - string_properties=self.required_properties_that_are_missing, wbi=wbi - ) - string += f"\nRequired properties that are missing: {properties_string}" - if self.incorrect_statements: - string += f"\nIncorrect statements: {self.incorrect_statements}" - return string diff --git a/entityvalidator/__init__.py b/entityvalidator/__init__.py new file mode 100644 index 0000000..e4ba7b5 --- /dev/null +++ b/entityvalidator/__init__.py @@ -0,0 +1,123 @@ +import asyncio +import logging +import re +from re import Pattern +from typing import Any + +import aiohttp +import requests +from aiohttp import ClientSession +from pydantic import BaseModel, Field +from rich.console import Console + +import config +from entityvalidator.exceptions import ( + ApiError, + EidError, + EntityIdError, + NoEntitySchemaDataError, + WikibaseEntitySchemaDownloadError, +) +from entityvalidator.models.entity import Entity + +console = Console() +logging.basicConfig(level=logging.DEBUG) +logger = logging.getLogger(__name__) + + +class EntityValidator(BaseModel): + """Downloads and validates Wikidata entities""" + + entity_ids: list[str] = Field( + ..., min_length=1, description="List of entity IDs, at least one required" + ) + eid: str = Field( + ..., min_length=2, description="EntitySchema ID in a Wikibase" + ) # entityshape + eid_regex: Pattern = re.compile(r"E\d+") + wikibase_url: str = "http://www.wikidata.org" + mediawiki_api_url: str = "https://www.wikidata.org/w/api.php" + user_agent: str = config.user_agent + entities: list[Entity] = [] + entity_schema_data: dict[str, Any] = {} + + def __check_inputs__(self) -> None: + if not re.match(self.eid_regex, self.eid): + raise EidError("EID has to be E followed by only numbers like this: E100") + # if not re.match(self.entity_id_regex, self.entity_id): + # raise QidError("QID has to be Q followed by only numbers like this: Q100") + + def __download_and_validate__(self) -> None: + self.__check_inputs__() # Check if inputs are valid + self.__download_schema__() + if not self.entity_schema_data: + raise NoEntitySchemaDataError("Got no entity schema data from Wikidata") + with console.status("Downloading entity json"): + asyncio.run( + self.__download_json__() + ) # safely run async without nest_asyncio + print(f"Downloaded {len(self.entities)} entities") + if self.entities: + with console.status("Validating entities"): + for entity in self.entities: + entity.check_and_validate() + print("Validation finished") + else: + print("No entities to validate") + + async def __download_json__(self) -> None: + """Get all the JSON data we need asynchronously""" + logger.debug("__download_json__: running") + async with aiohttp.ClientSession() as session: + # Create tasks for downloading JSON data for each entity_id + tasks = [ + self._get_entity_json(entity_id, session) + for entity_id in self.entity_ids + ] + + # Gather and wait for all tasks to complete + await asyncio.gather(*tasks) + # self.json_responses = await asyncio.gather(*tasks) + # Handle results as needed + # We don't handle the results for now. + + async def _get_entity_json(self, entity_id: str, session: ClientSession) -> None: + """ + Downloads the entity from Wikidata asynchronously + """ + logger.debug("_get_entity_json: running") + url = f"{self.wikibase_url}/wiki/Special:EntityData/{entity_id}.json" + headers = {"User-Agent": config.user_agent} + + async with session.get(url, headers=headers) as response: + if response.status == 200: + entity_data = await response.json() + self.entities.append( + Entity( + entity_id=entity_id, + entity_data=entity_data, + eid=self.eid, + entity_schema_data=self.entity_schema_data, + ) + ) + else: + raise WikibaseEntitySchemaDownloadError( + f"Got {response.status} from {url}. " + f"Please check that the configuration is correct" + ) + + def __download_schema__(self) -> None: + """ + Downloads the schema from wikidata + """ + url: str = f"https://www.wikidata.org/wiki/EntitySchema:{self.eid}?action=raw" + headers = {"User-Agent": config.user_agent} + response = requests.get(url, headers=headers) + if response.status_code == 404: + raise WikibaseEntitySchemaDownloadError() + self.entity_schema_data: dict = response.json() + + @property + def get_results(self) -> list[dict[str, Any]]: + self.__download_and_validate__() + return [e.to_dict() for e in self.entities] diff --git a/entityshape/enums.py b/entityvalidator/enums.py similarity index 100% rename from entityshape/enums.py rename to entityvalidator/enums.py diff --git a/entityshape/exceptions.py b/entityvalidator/exceptions.py similarity index 62% rename from entityshape/exceptions.py rename to entityvalidator/exceptions.py index 60428eb..1963827 100644 --- a/entityshape/exceptions.py +++ b/entityvalidator/exceptions.py @@ -1,8 +1,4 @@ -class LangError(BaseException): - pass - - -class QidError(BaseException): +class EntityIdError(BaseException): pass @@ -20,3 +16,11 @@ class WikibaseEntitySchemaDownloadError(BaseException): class WikibasePropertiesDownloadError(BaseException): pass + + +class NoEntitySchemaDataError(BaseException): + pass + + +class MissingInformationError(BaseException): + pass diff --git a/entityshape/models/__init__.py b/entityvalidator/models/__init__.py similarity index 100% rename from entityshape/models/__init__.py rename to entityvalidator/models/__init__.py diff --git a/entityshape/models/compareshape.py b/entityvalidator/models/compareshape.py similarity index 77% rename from entityshape/models/compareshape.py rename to entityvalidator/models/compareshape.py index 2dcc2aa..e09fe5a 100644 --- a/entityshape/models/compareshape.py +++ b/entityvalidator/models/compareshape.py @@ -1,324 +1,326 @@ -""" -Copyright 2023 Dennis Priskorn -Copyright 2021 Mark Tully -Compares a json shape from shape.py with wikidata json -""" -import requests -from requests import Response - -from entityshape.exceptions import ( - WikibaseEntitySchemaDownloadError, - WikibasePropertiesDownloadError, -) - - -class CompareShape: - """ - Compares a wikidata entity (e.g. Q42) with a shape and returns the conformity of - the statements and properties in the entity to the shape - - :param shape: The a json representation of the shape to be compared against - :param entity: The entity to be compared (e.g. Q42) - :param language: The language to use for details like property names - - :returns properties: a json representation of the conformity of each property in the entity - :returns statements: a json representation of the conformity of each statement in the entity - """ - - def __init__( - self, - shape: dict, - entity: str, - language: str, - mediawiki_api_url: str, - wikibase_url: str, - ): - self._entity: str = entity - self._shape: dict = shape - self.mediawiki_api_url = mediawiki_api_url - self.wikibase_url = wikibase_url - self._property_responses: dict = {} - - self._get_entity_json() - if self._entities["entities"][self._entity]: - self._get_props(self._entities["entities"][self._entity]["claims"]) - self._get_property_names(language) - self._compare_statements() - self._compare_properties() - - def get_properties(self) -> dict: - """ - Gets the result of comparison for each property with the schema - :return: json for comparison of properties - """ - return self._compare_properties() - - def get_statements(self) -> dict: - """ - Gets the result of comparison of each statement with the schema - :return: json for comparison of statements - """ - return self._compare_statements() - - def get_general(self) -> dict: - """ - Gets general properties of the comparison - :return: json for general properties of the comparison - """ - general: dict = {} - properties: list = ["lexicalCategory", "language"] - for item in properties: - if item in self._shape and item in self._entities["entities"][self._entity]: - expected: list = self._shape[item]["allowed"] - actual: str = self._entities["entities"][self._entity][item] - general[item] = "incorrect" - if actual in expected: - general[item] = "correct" - return general - - def _compare_statements(self): - """ - Compares the statements in the entity to the schema - """ - statements: dict = {} - claims: dict = self._entities["entities"][self._entity]["claims"] - for claim in claims: - statement_results: list = [] - property_statement_results: list = [] - for statement in claims[claim]: - child: dict = {"property": claim} - allowed: str = "not in schema" - if claim in self._shape: - allowed, extra, qualifiers, required = self._process_claim_in_shape( - claim, statement, child - ) - allowed = self._process_allowed( - allowed, required, qualifiers, extra - ) - if allowed != "": - child["response"] = allowed - statements[statement["id"]] = child - statement_results.append(allowed) - if allowed.startswith("missing"): - allowed = "incorrect" - property_statement_results.append(allowed) - self._property_responses[claim] = property_statement_results - return statements - - def _compare_properties(self): - """ - Compares the properties in the entity to the schema - """ - properties: dict = {} - for claim in self._props: - response: str = "missing" - child: dict = {"name": self._names[claim], "necessity": "absent"} - if claim in self._shape and "necessity" in self._shape[claim]: - child["necessity"] = self._shape[claim]["necessity"] - if claim in self._entities["entities"][self._entity]["claims"]: - response = self._process_claim(claim, child) - if response != "": - child["response"] = response - properties[claim] = child - return properties - - def _process_claim(self, claim, child): - cardinality: str = "" - allowed: str - if "incorrect" in self._property_responses[claim]: - allowed = "incorrect" - elif "correct" in self._property_responses[claim]: - allowed = "correct" - else: - allowed = "present" - if claim in self._shape: - cardinality = self._assess_cardinality(claim, child) - response = allowed if cardinality == "correct" else cardinality - if response == "allowed": - response = "correct" - return response - - def _assess_cardinality(self, claim, child): - cardinality: str = "" - number_of_statements: int = len(self._property_responses[claim]) - min_cardinality = False - max_cardinality = False - if child["necessity"] != "absent": - cardinality = "correct" - if "cardinality" in self._shape[claim]: - claim_cardinality = self._shape[claim]["cardinality"] - min_cardinality = True - max_cardinality = True - if "extra" in self._shape[claim]: - number_of_statements = self._property_responses[claim].count("correct") - if ( - "min" in claim_cardinality - and number_of_statements < claim_cardinality["min"] - ): - min_cardinality = False - if ( - "max" in claim_cardinality - and number_of_statements > claim_cardinality["max"] - ): - max_cardinality = False - if min_cardinality and not max_cardinality: - cardinality = "too many statements" - if max_cardinality and not min_cardinality: - cardinality = "not enough correct statements" - return cardinality - - def _get_entity_json(self): - """ - Downloads the entity from wikidata - """ - url: str = f"{self.wikibase_url}/wiki/Special:EntityData/{self._entity}.json" - response: Response = requests.get(url) - if response.status_code == 200: - self._entities = response.json() - else: - raise WikibaseEntitySchemaDownloadError( - f"Got {response.status_code} from {url}. " - f"Please check that the configuration is correct" - ) - - def _get_props(self, claims: dict): - """ - Gets a list of properties included in the entity - :param claims: The claims in the entity - """ - self._props: list = [] - for claim in claims: - if claim not in self._props: - self._props.append(claim) - for claim in self._shape: - if claim not in self._props and claim.startswith("P"): - self._props.append(claim) - - def _get_property_names(self, language: str): - """ - Gets the names of properties from wikidata - """ - self._names: dict = {} - wikidata_property_list: list = [ - self._props[i * 49 : (i + 1) * 49] - for i in range((len(self._props) + 48) // 48) - ] - for element in wikidata_property_list: - required_properties: str = "|".join(element) - url: str = ( - f"{self.mediawiki_api_url}?action=wbgetentities&ids=" - f"{required_properties}&props=labels&languages={language}&format=json" - ) - response: Response = requests.get(url) - if response.status_code == 200: - json_text: dict = response.json() - print(url) - # print(json_text) - else: - raise WikibasePropertiesDownloadError( - f"Got {response.status_code} from {url}" - ) - for item in element: - try: - self._names[json_text["entities"][item]["id"]] = json_text[ - "entities" - ][item]["labels"][language]["value"] - except KeyError: - self._names[json_text["entities"][item]["id"]] = "" - - def _process_allowed_in_shape_claim(self, claim, param): - allowed = "correct" - if "id" in param["value"]: - value: str = param["value"]["id"] - if value not in self._shape[claim]["allowed"]: - allowed = "incorrect" - return allowed - - @staticmethod - def _process_required_in_shape_claim(shape_claim, datavalue): - required: str = "" - if "required" in shape_claim["required"]: - shape_claim_required = shape_claim["required"]["required"] - required_property: str = next(iter(list(shape_claim_required.keys()))) - required_value: str = shape_claim_required[required_property][0] - else: - required_property: str = next(iter(list(shape_claim["required"].keys()))) - required_value: str = shape_claim["required"][required_property][0] - - query_entity: str = datavalue["value"]["id"] - url: str = ( - f"https://www.wikidata.org/w/api.php?action=wbgetclaims" - f"&entity={query_entity}&property={required_property}&format=json" - ) - response: Response = requests.get(url) - if response.status_code == 200: - json_text: dict = response.json() - else: - raise WikibaseEntitySchemaDownloadError( - f"Got {response.status_code} from {url}" - ) - if required_property in json_text["claims"]: - for key in json_text["claims"][required_property]: - required = ( - "present" - if key["mainsnak"]["datavalue"]["value"]["id"] == required_value - else "incorrect" - ) - else: - required = "missing" - return required - - @staticmethod - def _process_allowed(allowed, required, qualifiers, extra): - if required == "present": - allowed = "correct" if qualifiers == "" else qualifiers - if required == "incorrect": - allowed = ( - "allowed" - if extra == "extra" - else "allowed" - if qualifiers == "" - else qualifiers - ) - if allowed == "incorrect" and extra == "extra": - allowed = "allowed" - if required == "missing": - allowed = required - return allowed - - @staticmethod - def _process_qualifiers_in_shape_claim(shape_claim, statement): - allowed_qualifiers: list = [] - for qualifier in shape_claim["qualifiers"]: - if "qualifiers" in statement and qualifier not in statement["qualifiers"]: - allowed_qualifiers.append(qualifier) - if len(allowed_qualifiers) > 0: - qualifiers: str = "missing qualifiers: " + ", ".join(allowed_qualifiers) - else: - qualifiers = "" - return qualifiers - - def _process_claim_in_shape(self, claim, statement, child): - datavalue: dict = statement["mainsnak"]["datavalue"] - shape_claim: dict = self._shape[claim] - qualifiers: str = "" - required: str = "" - extra: str = "" - - allowed = "present" - if "necessity" in shape_claim: - child["necessity"] = shape_claim["necessity"] - allowed = "allowed" - if "allowed" in shape_claim: - allowed = self._process_allowed_in_shape_claim(claim, datavalue) - if "not_allowed" in shape_claim and "id" in datavalue["value"]: - value: str = datavalue["value"]["id"] - if value in shape_claim["not_allowed"]: - allowed = "not allowed" - if "extra" in shape_claim: - extra: str = "extra" - if "qualifiers" in shape_claim: - qualifiers = self._process_qualifiers_in_shape_claim(shape_claim, statement) - if "required" in shape_claim: - required = self._process_required_in_shape_claim(shape_claim, datavalue) - return allowed, extra, qualifiers, required +""" +Copyright 2023 Dennis Priskorn +Copyright 2021 Mark Tully +Compares a json shape from shape.py with wikidata json +""" +import logging +from typing import Any + +import requests +from requests import Response + +from entityvalidator.exceptions import ( + MissingInformationError, + WikibaseEntitySchemaDownloadError, +) + +logger = logging.getLogger(__name__) + + +class CompareShape: + """ + Compares a wikidata entity (e.g. Q42) with a shape and returns the conformity of + the statements and properties in the entity to the shape + + :param shape: The a json representation of the shape to be compared against + :param entity: The entity to be compared (e.g. Q42) + + :returns properties: a json representation of the conformity of each property in the entity + :returns statements: a json representation of the conformity of each statement in the entity + """ + + def __init__( + self, + shape: dict, + entity: str, + entity_data: dict[str, Any], + mediawiki_api_url: str, + wikibase_url: str, + ): + self._entity: str = entity + self.entity_data = entity_data + self._shape: dict = shape + self.mediawiki_api_url = mediawiki_api_url + self.wikibase_url = wikibase_url + self._property_responses: dict = {} + + # self._get_entity_json() + if not self.entity_data: + raise MissingInformationError() + if self.entity_data["entities"][self._entity]: + self._get_props(self.entity_data["entities"][self._entity]["claims"]) + # self._get_property_names(language) + self._compare_statements() + self._compare_properties() + + def get_properties(self) -> dict: + """ + Gets the result of comparison for each property with the schema + :return: json for comparison of properties + """ + return self._compare_properties() + + def get_statements(self) -> dict: + """ + Gets the result of comparison of each statement with the schema + :return: json for comparison of statements + """ + return self._compare_statements() + + def get_general(self) -> dict: + """ + Gets general properties of the comparison + :return: json for general properties of the comparison + """ + general: dict = {} + properties: list = ["lexicalCategory", "language"] + for item in properties: + if ( + item in self._shape + and item in self.entity_data["entities"][self._entity] + ): + expected: list = self._shape[item]["allowed"] + actual: str = self.entity_data["entities"][self._entity][item] + general[item] = "incorrect" + if actual in expected: + general[item] = "correct" + return general + + def _compare_statements(self): + """ + Compares the statements in the entity to the schema + """ + statements: dict = {} + claims: dict = self.entity_data["entities"][self._entity]["claims"] + for claim in claims: + statement_results: list = [] + property_statement_results: list = [] + for statement in claims[claim]: + child: dict = {"property": claim} + allowed: str = "not in schema" + if claim in self._shape: + allowed, extra, qualifiers, required = self._process_claim_in_shape( + claim, statement, child + ) + allowed = self._process_allowed( + allowed, required, qualifiers, extra + ) + if allowed != "": + child["response"] = allowed + statements[statement["id"]] = child + statement_results.append(allowed) + if allowed.startswith("missing"): + allowed = "incorrect" + property_statement_results.append(allowed) + self._property_responses[claim] = property_statement_results + return statements + + def _compare_properties(self): + """ + Compares the properties in the entity to the schema + """ + properties: dict = {} + for claim in self._props: + response: str = "missing" + # Disable use of _names because it slows the validation down + # child: dict = {"name": self._names[claim], "necessity": "absent"} + child: dict = {"name": "unknown", "necessity": "absent"} + if claim in self._shape and "necessity" in self._shape[claim]: + child["necessity"] = self._shape[claim]["necessity"] + if claim in self.entity_data["entities"][self._entity]["claims"]: + response = self._process_claim(claim, child) + if response != "": + child["response"] = response + properties[claim] = child + return properties + + def _process_claim(self, claim, child): + cardinality: str = "" + allowed: str + if "incorrect" in self._property_responses[claim]: + allowed = "incorrect" + elif "correct" in self._property_responses[claim]: + allowed = "correct" + else: + allowed = "present" + if claim in self._shape: + cardinality = self._assess_cardinality(claim, child) + response = allowed if cardinality == "correct" else cardinality + if response == "allowed": + response = "correct" + return response + + def _assess_cardinality(self, claim, child): + cardinality: str = "" + number_of_statements: int = len(self._property_responses[claim]) + min_cardinality = False + max_cardinality = False + if child["necessity"] != "absent": + cardinality = "correct" + if "cardinality" in self._shape[claim]: + claim_cardinality = self._shape[claim]["cardinality"] + min_cardinality = True + max_cardinality = True + if "extra" in self._shape[claim]: + number_of_statements = self._property_responses[claim].count("correct") + if ( + "min" in claim_cardinality + and number_of_statements < claim_cardinality["min"] + ): + min_cardinality = False + if ( + "max" in claim_cardinality + and number_of_statements > claim_cardinality["max"] + ): + max_cardinality = False + if min_cardinality and not max_cardinality: + cardinality = "too many statements" + if max_cardinality and not min_cardinality: + cardinality = "not enough correct statements" + return cardinality + + def _get_props(self, claims: dict): + """ + Gets a list of properties included in the entity + :param claims: The claims in the entity + """ + self._props: list = [] + for claim in claims: + if claim not in self._props: + self._props.append(claim) + for claim in self._shape: + if claim not in self._props and claim.startswith("P"): + self._props.append(claim) + + # def _get_property_names(self, language: str): + # """ + # Gets the names of properties from wikidata + # """ + # # Optimize this + # self._names: dict = {} + # # What is the purpose of this? + # wikidata_property_list: list = [ + # self._props[i * 49 : (i + 1) * 49] + # for i in range((len(self._props) + 48) // 48) + # ] + # for element in wikidata_property_list: + # required_properties: str = "|".join(element) + # url: str = ( + # f"{self.mediawiki_api_url}?action=wbgetentities&ids=" + # f"{required_properties}&props=labels&languages={language}&format=json" + # ) + # response: Response = requests.get(url) + # if response.status_code == 200: + # json_text: dict = response.json() + # print(url) + # # print(json_text) + # else: + # raise WikibasePropertiesDownloadError( + # f"Got {response.status_code} from {url}" + # ) + # for item in element: + # try: + # self._names[json_text["entities"][item]["id"]] = json_text[ + # "entities" + # ][item]["labels"][language]["value"] + # except KeyError: + # self._names[json_text["entities"][item]["id"]] = "" + + def _process_allowed_in_shape_claim(self, claim, param): + allowed = "correct" + if "id" in param["value"]: + value: str = param["value"]["id"] + if value not in self._shape[claim]["allowed"]: + allowed = "incorrect" + return allowed + + @staticmethod + def _process_required_in_shape_claim(shape_claim, datavalue): + required: str = "" + if "required" in shape_claim["required"]: + shape_claim_required = shape_claim["required"]["required"] + required_property: str = next(iter(list(shape_claim_required.keys()))) + required_value: str = shape_claim_required[required_property][0] + else: + required_property: str = next(iter(list(shape_claim["required"].keys()))) + required_value: str = shape_claim["required"][required_property][0] + + query_entity: str = datavalue["value"]["id"] + # Why is this fetch needed? + url: str = ( + f"https://www.wikidata.org/w/api.php?action=wbgetclaims" + f"&entity={query_entity}&property={required_property}&format=json" + ) + logger.debug("Fetching: {url}") + response: Response = requests.get(url) + if response.status_code == 200: + json_text: dict = response.json() + else: + raise WikibaseEntitySchemaDownloadError( + f"Got {response.status_code} from {url}" + ) + if required_property in json_text["claims"]: + for key in json_text["claims"][required_property]: + required = ( + "present" + if key["mainsnak"]["datavalue"]["value"]["id"] == required_value + else "incorrect" + ) + else: + required = "missing" + return required + + @staticmethod + def _process_allowed(allowed, required, qualifiers, extra): + if required == "present": + allowed = "correct" if qualifiers == "" else qualifiers + if required == "incorrect": + allowed = ( + "allowed" + if extra == "extra" + else "allowed" + if qualifiers == "" + else qualifiers + ) + if allowed == "incorrect" and extra == "extra": + allowed = "allowed" + if required == "missing": + allowed = required + return allowed + + @staticmethod + def _process_qualifiers_in_shape_claim(shape_claim, statement): + allowed_qualifiers: list = [] + for qualifier in shape_claim["qualifiers"]: + if "qualifiers" in statement and qualifier not in statement["qualifiers"]: + allowed_qualifiers.append(qualifier) + if len(allowed_qualifiers) > 0: + qualifiers: str = "missing qualifiers: " + ", ".join(allowed_qualifiers) + else: + qualifiers = "" + return qualifiers + + def _process_claim_in_shape(self, claim, statement, child): + datavalue: dict = statement["mainsnak"]["datavalue"] + shape_claim: dict = self._shape[claim] + qualifiers: str = "" + required: str = "" + extra: str = "" + + allowed = "present" + if "necessity" in shape_claim: + child["necessity"] = shape_claim["necessity"] + allowed = "allowed" + if "allowed" in shape_claim: + allowed = self._process_allowed_in_shape_claim(claim, datavalue) + if "not_allowed" in shape_claim and "id" in datavalue["value"]: + value: str = datavalue["value"]["id"] + if value in shape_claim["not_allowed"]: + allowed = "not allowed" + if "extra" in shape_claim: + extra: str = "extra" + if "qualifiers" in shape_claim: + qualifiers = self._process_qualifiers_in_shape_claim(shape_claim, statement) + if "required" in shape_claim: + required = self._process_required_in_shape_claim(shape_claim, datavalue) + return allowed, extra, qualifiers, required diff --git a/entityvalidator/models/entity.py b/entityvalidator/models/entity.py new file mode 100644 index 0000000..b0b9f83 --- /dev/null +++ b/entityvalidator/models/entity.py @@ -0,0 +1,71 @@ +import re +from re import Pattern +from typing import Any + +from pydantic import BaseModel + +from entityvalidator.exceptions import EntityIdError +from entityvalidator.models.compareshape import CompareShape +from entityvalidator.models.result import Result +from entityvalidator.models.shape import Shape + + +class Entity(BaseModel): + entity_id: str + entity_id_regex: Pattern = re.compile(r"[QL]\d+") + entity_data: dict[str, Any] + entity_schema_data: dict[str, Any] + eid: str # entityshape + result: Result = Result() + compare_shape_result: dict[str, Any] = {} + wikibase_url: str = "http://www.wikidata.org" + mediawiki_api_url: str = "https://www.wikidata.org/w/api.php" + user_agent: str = "entityshape (https://github.com/dpriskorn/entityshape)" + + def __check_inputs__(self): + if not re.match(self.entity_id_regex, self.entity_id): + raise EntityIdError( + "The entity id has to be Q or L followed by only numbers like this: Q100" + ) + + def __validate__(self): + shape: Shape = Shape( + # entity_schema_id=self.eid, + entity_schema_data=self.entity_schema_data, + ) + comparison: CompareShape = CompareShape( + shape=shape.get_schema_shape(), + entity=self.entity_id, + entity_data=self.entity_data, + wikibase_url=self.wikibase_url, + mediawiki_api_url=self.mediawiki_api_url, + ) + self.compare_shape_result = { + "general": comparison.get_general(), + "properties": comparison.get_properties(), + "statements": comparison.get_statements(), + } + + def __parse_result__(self) -> None: + if self.compare_shape_result: + self.result = Result(**self.compare_shape_result) + self.result.analyze() + + def check_and_validate(self) -> None: + """This method checks if we got the 3 parameters we need and + gets the results and return them""" + self.__check_inputs__() + self.__validate__() + self.__parse_result__() + + # def __get_entity_data__(self): + # """Only used for testing""" + # url = f"{self.wikibase_url}/wiki/Special:EntityData/{self.entity_id}.json" + # headers = {"User-Agent": config.user_agent} + # response = requests.get(url, headers=headers) + # self.entity_data = response.json() + + def to_dict(self) -> dict[Any, Any]: + json_ = self.result.to_dict() + json_["entity"] = self.entity_id + return json_ diff --git a/entityvalidator/models/property_value.py b/entityvalidator/models/property_value.py new file mode 100644 index 0000000..2ba5bc1 --- /dev/null +++ b/entityvalidator/models/property_value.py @@ -0,0 +1,9 @@ +from pydantic import BaseModel + +from entityvalidator.enums import Necessity, PropertyResponse + + +class PropertyValue(BaseModel): + name: str = "" + necessity: Necessity + response: PropertyResponse | None = None diff --git a/entityvalidator/models/result.py b/entityvalidator/models/result.py new file mode 100644 index 0000000..c657939 --- /dev/null +++ b/entityvalidator/models/result.py @@ -0,0 +1,233 @@ +import logging +from typing import Any + +from pydantic import BaseModel +from wikibaseintegrator import WikibaseIntegrator # type: ignore + +from entityvalidator.enums import Necessity, PropertyResponse, StatementResponse +from entityvalidator.models.property_value import PropertyValue +from entityvalidator.models.statement_value import StatementValue + +logger = logging.getLogger(__name__) + + +class Result(BaseModel): + general: dict[Any, Any] = {} + name: str = "" + properties: dict[str, PropertyValue] = {} + statements: dict[Any, StatementValue] = {} + missing_properties: set[str] = set() + required_properties: set[str] = set() + incorrect_statements: set[str] = set() + missing_statements: set[str] = set() + properties_with_too_many_statements: set[str] = set() + analyzed: bool = False + required_properties_that_are_missing: set[str] = set() + optional_properties_that_are_missing: set[str] = set() + properties_without_enough_correct_statements: set[str] = set() + properties_that_are_not_allowed: set[str] = set() + statements_with_property_that_is_not_allowed: set[str] = set() + wikibase_url: str = "http://www.wikidata.org" + mediawiki_api_url: str = "https://www.wikidata.org/w/api.php" + + @property + def some_required_properties_are_missing(self) -> bool: + return bool(self.required_properties_that_are_missing) + + @property + def properties_with_too_many_statements_found(self) -> bool: + return bool(self.properties_with_too_many_statements) + + @property + def incorrect_statements_found(self) -> bool: + return bool(self.incorrect_statements) + + @property + def properties_without_enough_correct_statements_found(self) -> bool: + return bool(self.properties_without_enough_correct_statements) + + @property + def statements_with_properties_that_are_not_allowed_found(self) -> bool: + return bool(self.statements_with_property_that_is_not_allowed) + + @property + def is_valid(self) -> bool: + """check if the properties are all allowed, + all required properties are present, + not too many statements, + and none of the statements are incorrect""" + self.analyze() + return bool( + not self.properties_with_too_many_statements_found + and not self.incorrect_statements_found + and not self.some_required_properties_are_missing + and not self.properties_without_enough_correct_statements_found + and not self.statements_with_properties_that_are_not_allowed_found + ) + + @property + def is_empty(self) -> bool: + return bool(len(self.properties) == 0 and len(self.statements) == 0) + + def analyze(self) -> None: + if not self.analyzed: + self.__find_missing_properties__() + self.__find_required_properties__() + self.__find_incorrect_statements__() + self.__find_properties_with_too_many_statements__() + self.__find_properties_with_not_enough_correct_statements__() + self.__find_required_properties_that_are_missing__() + self.__find_optional_properties_that_are_missing__() + self.__find_properties_that_are_not_allowed__() + self.__find_statements_with_property_that_is_not_allowed__() + self.analyzed = True + + def __find_properties_with_too_many_statements__(self) -> None: + for property_ in self.properties: + value: PropertyValue = self.properties[property_] + if value.response == PropertyResponse.TOO_MANY_STATEMENTS: + self.properties_with_too_many_statements.add(property_) + + def __find_incorrect_statements__(self) -> None: + for statement in self.statements: + value: StatementValue = self.statements[statement] + try: + StatementResponse(value.response) + if value.response == StatementResponse.INCORRECT: + self.incorrect_statements.add(statement) + except ValueError: + # Ignore responses we cannot predict + logger.warning(f"Ignoring statement response: {value.response}") + + def __find_required_properties__(self) -> None: + for property_ in self.properties: + value: PropertyValue = self.properties[property_] + if value.necessity == Necessity.REQUIRED: + self.required_properties.add(property_) + + def __find_missing_properties__(self): + for property_ in self.properties: + value: PropertyValue = self.properties[property_] + if value.response == PropertyResponse.MISSING: + self.missing_properties.add(property_) + + def __find_required_properties_that_are_missing__(self) -> None: + a = set(self.missing_properties) + b = set(self.required_properties) + # the intersection between these two should be empty + # if all required properties are present + self.required_properties_that_are_missing = a.intersection(b) + + def __find_optional_properties_that_are_missing__(self): + """We calculate using set difference""" + a = set(self.missing_properties) + b = set(self.required_properties) + self.optional_properties_that_are_missing = a.difference(b) + + def __find_properties_with_not_enough_correct_statements__(self) -> None: + for property_ in self.properties: + value: PropertyValue = self.properties[property_] + if value.response == PropertyResponse.NOT_ENOUGH_CORRECT_STATEMENTS: + self.properties_without_enough_correct_statements.add(property_) + + def __find_properties_that_are_not_allowed__(self) -> None: + for property_ in self.properties: + value: PropertyValue = self.properties[property_] + if value.necessity == Necessity.ABSENT: + self.properties_that_are_not_allowed.add(property_) + + def __find_statements_with_property_that_is_not_allowed__(self) -> None: + for statement in self.statements: + value: StatementValue = self.statements[statement] + if value.necessity == Necessity.ABSENT: + self.statements_with_property_that_is_not_allowed.add(value.property) + + # def get_properties_as_a_string_with_labels_and_pid( + # self, wbi: WikibaseIntegrator, string_properties: Set[str] + # ) -> str: + # properties: list[ResultProperty] = [] + # for property_string in string_properties: + # wbi_property = wbi.property.get(property_string) + # property_object = ResultProperty( + # label=wbi_property.labels.get(language=self.lang).value, + # pid=property_string, + # ) + # properties.append(property_object) + # return ", ".join([str(property_) for property_ in properties]) + + # def __str__(self): + # return self.__repr__() + # + # def __repr__(self): + # """Return the result of the validation as a formatted string + # with output exactly describing what caused the validation to fail + # + # We lookup the labels by default. + # If no language is set we fall back to English""" + # string = f"Valid: {self.is_valid}" + # if self.is_valid: + # return string + # else: + # from wikibaseintegrator.wbi_config import config as wbi_config # type: ignore + # + # # Update the WBI config with the values from the entityshape config + # # This enables support for any Wikibase + # wbi_config["MEDIAWIKI_API_URL"] = self.mediawiki_api_url + # wbi_config["WIKIBASE_URL"] = self.wikibase_url + # wbi = WikibaseIntegrator() + # if self.properties_with_too_many_statements_found: + # properties_string = self.get_properties_as_a_string_with_labels_and_pid( + # string_properties=self.properties_with_too_many_statements, wbi=wbi + # ) + # string += f"\nProperties with too many statements: {properties_string}" + # if self.properties_without_enough_correct_statements_found: + # properties_string = self.get_properties_as_a_string_with_labels_and_pid( + # string_properties=self.properties_without_enough_correct_statements, + # wbi=wbi, + # ) + # string += ( + # f"\nProperties without enough correct statements: " + # f"{properties_string}" + # ) + # if self.required_properties_that_are_missing: + # properties_string = self.get_properties_as_a_string_with_labels_and_pid( + # string_properties=self.required_properties_that_are_missing, wbi=wbi + # ) + # string += f"\nRequired properties that are missing: {properties_string}" + # if self.incorrect_statements: + # string += f"\nIncorrect statements: {self.incorrect_statements}" + # return string + + def to_dict(self) -> dict[str, Any]: + """Return a JSON-serializable dict suitable for API responses.""" + return { + # "name": self.name, + # "general": self.general, + # "lang": self.lang, + # "wikibase_url": self.wikibase_url, + # "mediawiki_api_url": self.mediawiki_api_url, + "is_valid": self.is_valid, + "is_empty": self.is_empty, + "missing_properties": list(self.missing_properties), + "required_properties": list(self.required_properties), + "incorrect_statements": list(self.incorrect_statements), + "missing_statements": list(self.missing_statements), + "properties_with_too_many_statements": list( + self.properties_with_too_many_statements + ), + "required_properties_that_are_missing": list( + self.required_properties_that_are_missing + ), + "optional_properties_that_are_missing": list( + self.optional_properties_that_are_missing + ), + "properties_without_enough_correct_statements": list( + self.properties_without_enough_correct_statements + ), + # "properties_that_are_not_allowed": list( + # self.properties_that_are_not_allowed + # ), + "statements_with_property_that_is_not_allowed": list( + self.statements_with_property_that_is_not_allowed + ), + } diff --git a/entityshape/models/result_property.py b/entityvalidator/models/result_property.py similarity index 100% rename from entityshape/models/result_property.py rename to entityvalidator/models/result_property.py diff --git a/entityshape/models/shape.py b/entityvalidator/models/shape.py similarity index 87% rename from entityshape/models/shape.py rename to entityvalidator/models/shape.py index 0cd1b27..cfb4e80 100644 --- a/entityshape/models/shape.py +++ b/entityvalidator/models/shape.py @@ -1,351 +1,330 @@ -""" -Copyright 2021 Mark Tully -Converts entityschema to json suitable for comparing with a wikidata item -""" -import os -import re -from typing import Any, Match, Optional, Pattern, Union - -import requests - - -class Shape: - """ - Produces a shape in the form of a json for a wikidata entityschema (e.g. E10) - - :param schema: The identifier of the entityschema to be processed - :param language: The language to get the schema name in - - :return name: the name of the entityschema - :return shape: a json representation of the entityschema - """ - - def __init__(self, schema: str, language: str): - # self.name: str = "" - self.schema_shape: dict = {} - - self._shapes: dict = {} - self._schema_shapes: dict = {} - self._language: str = language - self._default_shape_name: str = "" - - self._get_schema_json(schema) - self._strip_schema_comments() - if self._schema_text != "": - self._get_default_shape() - self._translate_schema() - - def get_schema_shape(self): - """ - Gets the json representation of the schema - :return: the json representation of the schema - """ - return self.schema_shape - - def get_name(self): - """ - Gets the name of the schema - :return: the name of the schema - """ - if self._language in self._json_text["labels"]: - return self._json_text["labels"][self._language] - return "" - - def _translate_schema(self): - """ - Converts the entityschema to a json representation - """ - for shape in self._shapes: - self._convert_shape(shape) - schema_json: dict = {} - if self._default_shape_name != "": - schema_json = self._schema_shapes[self._default_shape_name] - for key in schema_json: - if "shape" in schema_json[key]: - schema_json[key] = self._translate_sub_shape(schema_json[key]) - if ( - "required" in schema_json[key] - and "required" in schema_json[key]["required"] - ): - schema_json[key]["required"] = schema_json[key]["required"]["required"] - self.schema_shape = schema_json - - def _convert_shape(self, shape: str): - """ - Converts a shape into its json representation - - :param shape: the name of the shape to be converted - """ - new_shape: str = self._shapes[shape].replace("\n", "") - new_shape = new_shape.replace("\r", "") - if "{" in new_shape: - first_line = new_shape.split("{", 1)[0] - shape_array: list = new_shape.split("{", 1)[1].split(";") - else: - first_line = new_shape.split("[", 1)[0] - shape_array: list = new_shape.split("[", 1)[1].split(";") - try: - shape_json: dict = self._get_shape_properties(first_line) - except AttributeError: - shape_json: dict = {} - for line in shape_array: - if re.match(r".+:P\d", line): - child: dict = {} - selected_property: str = re.search(r"P\d+", line).group(0) - if shape_json.get(selected_property): - child = shape_json[selected_property] - shape_json[selected_property] = self._assess_property(line, child) - if "wikibase:lexicalCategory" in line: - shape_json["lexicalCategory"] = self._assess_property(line, {}) - if "dct:language" in line: - shape_json["language"] = self._assess_property(line, {}) - self._schema_shapes[shape] = shape_json - - def _assess_property(self, line: str, child: dict): - """ - converts a line og a schema to a json representation of itself - - :param line: The line to be converted - :param child: the existing json shape - :return: a json object to be added to the shape - """ - snak: str = self._get_snak_type(line) - if "@<" in line: - sub_shape_name: str = re.search(r"<.*>", line).group(0) - child["shape"] = sub_shape_name[1:-1] - if re.search(r"\[.*]", line): - required_parameters_string: str = re.search(r"\[.*]", line).group(0) - required_parameters_string = re.sub(r"wd:", "", required_parameters_string) - if "^" in line: - child["not_allowed"] = required_parameters_string[1:-1].split() - else: - child["allowed"] = required_parameters_string[1:-1].split() - cardinality: dict = self._get_cardinality(line) - necessity: str = "optional" - if cardinality: - necessity, child = self._assess_cardinality(necessity, child, cardinality) - child["necessity"] = necessity - child["status"] = snak - return child - - @staticmethod - def _get_shape_properties(first_line: str): - """ - Get the overall properties of the shape - - :param first_line: The first line of the shape - :return: a json representation of the properties of the first line - """ - # a closed shape - shape_json: dict = {} - if "CLOSED" in first_line: - shape_json = {"closed": "closed"} - # a shape where values other than those specified are allowed for the specified properties - if "EXTRA" in first_line: - properties = re.findall(r"P\d+", first_line) - for wikidata_property in properties: - shape_json[wikidata_property] = {"extra": "allowed"} - return shape_json - - def _get_schema_json(self, schema): - """ - Downloads the schema from wikidata - - :param schema: the entityschema to be downloaded - """ - url: str = f"https://www.wikidata.org/wiki/EntitySchema:{schema}?action=raw" - response = requests.get(url) - self._json_text: dict = response.json() - - def _strip_schema_comments(self): - """ - Strips the comments out of the schema and converts parts we don't care about - because they're enforced by wikidata - """ - schema_text: str = "" - # remove comments from the schema - for line in self._json_text["schemaText"].splitlines(): - head, _, _ = line.partition("# ") - if line.startswith("#"): - head = "" - schema_text += f"\n{head.strip()}" - # replace data types with the any value designator(.). Since wikidata won't allow items - # to enter the incorrect type (eg. trying to enter a LITERAL value where an IRI (i.e. a - # wikidata item) is required will fail to save - schema_text = schema_text.replace("IRI", ".") - schema_text = schema_text.replace("LITERAL", ".") - schema_text = schema_text.replace("xsd:dateTime", ".") - schema_text = schema_text.replace("xsd:string", ".") - schema_text = schema_text.replace("xsd:decimal", ".") - schema_text = schema_text.replace( - "[ ~ ]", "." - ) - schema_text = schema_text.replace("[ ~ ]", ".") - schema_text = os.linesep.join([s for s in schema_text.splitlines() if s]) - self._schema_text = schema_text - - def _get_default_shape(self): - """ - Gets the default shape to start at in the schema - """ - default_shape_name: Optional[Match[str]] = re.search( - r"start.*=.*@<.*>", self._schema_text, re.IGNORECASE - ) - if default_shape_name is not None: - default_name: str = default_shape_name.group(0).replace(" ", "") - self._default_shape_name = default_name[8:-1] - shape_names: list = re.findall(r"\n<.*>", self._schema_text) - for name in shape_names: - self._shapes[name[2:-1]] = self._get_specific_shape(name[2:-1]) - - def _get_specific_shape(self, shape_name: str): - """ - Extracts a specific shape from the schema - - :param shape_name: The name of the shape to be extracted - :return: The extracted shape - """ - search: Union[Pattern[Union[str, Any]], Pattern] = re.compile( - r"<%s>.*\n?([{\[])" % shape_name - ) - parentheses = self._find_parentheses(self._schema_text) - try: - shape_index: int = re.search(search, self._schema_text).start() - except AttributeError: - shape_index = re.search("<%s>" % shape_name, self._schema_text).start() - closest = None - for character in parentheses: - if (character >= shape_index) and (closest is None or character < closest): - closest = character - if closest: - shape_start: int = shape_index - shape_end: int = parentheses[closest] - shape: str = self._schema_text[shape_start:shape_end] - return shape - return "" - - @staticmethod - def _find_parentheses(shape): - index_list = {} - pop_stack = [] - for index, character in enumerate(shape): - if character in ["{", "["]: - pop_stack.append(index) - elif character in ["}", "]"]: - if len(pop_stack) == 0: - raise IndexError("Too many } for {") - index_list[pop_stack.pop()] = index - if len(pop_stack) > 0: - raise IndexError("No matching } for {") - return index_list - - def _translate_sub_shape(self, schema_json: dict): - """ - Converts a sub-shape to a json representation - - :param schema_json: The json containing the shape to be extracted - :return: The extracted shape - """ - try: - sub_shape: dict = self._schema_shapes[schema_json["shape"]] - del schema_json["shape"] - except KeyError: - del schema_json["shape"] - return schema_json - qualifier_child: dict = {} - reference_child: dict = {} - for key in sub_shape: - if "status" in sub_shape[key]: - ( - qualifier_child, - reference_child, - schema_json, - ) = self._assess_sub_shape_key( - sub_shape, key, schema_json, qualifier_child, reference_child - ) - schema_json["qualifiers"] = qualifier_child - schema_json["references"] = reference_child - return schema_json - - @staticmethod - def _get_cardinality(schema_line: str): - """ - Gets the cardinality of a line of the schema - - :param schema_line: The line to be processed - :return: A json representation of the cardinality in the form {min:x, max:y} - """ - cardinality: dict = {} - if "?" in schema_line: - cardinality["min"] = 0 - cardinality["max"] = 1 - elif "*" in schema_line: - cardinality = {} - elif "+" in schema_line: - cardinality["min"] = 1 - elif "{0}" in schema_line: - cardinality["max"] = 0 - cardinality["min"] = 0 - elif re.search(r"{.+}", schema_line): - match = re.search(r"{((\d+)|(\d+,\d+))}", schema_line) - if hasattr(match, "group"): - match = match.group() - cardinalities = match[1:-1].split(",") - cardinality["min"] = int(cardinalities[0]) - if len(cardinalities) == 1: - cardinality["max"] = int(cardinalities[0]) - else: - cardinality["max"] = int(cardinalities[1]) - else: - cardinality["min"] = 1 - cardinality["max"] = 1 - return cardinality - - @staticmethod - def _get_snak_type(schema_line: str): - """ - Gets the type of snak from a schema line - - :param schema_line: The line to be processed - :return: statement, qualifier or reference - """ - if any(prop in schema_line for prop in ["wdt:", "ps:", "p:"]): - return "statement" - if "pq:" in schema_line: - return "qualifier" - return "reference" - - @staticmethod - def _assess_cardinality(necessity: str, child: dict, cardinality: dict): - if "cardinality" in child: - if "min" in child["cardinality"] and "min" in cardinality: - cardinality["min"] = cardinality["min"] + child["cardinality"]["min"] - if "max" in child["cardinality"] and "max" in cardinality: - cardinality["max"] = cardinality["max"] + child["cardinality"]["max"] - child["cardinality"] = cardinality - if "min" in cardinality and cardinality["min"] > 0: - necessity = "required" - if ( - "max" in cardinality - and "min" in cardinality - and cardinality["max"] == 0 - and cardinality["min"] == 0 - ): - necessity = "absent" - return necessity, child - - def _assess_sub_shape_key( - self, sub_shape, key, schema_json, qualifier_child, reference_child - ): - if "shape" in key: - sub_shape_json = self._translate_sub_shape(key) - if key["status"] == "statement": - schema_json["required"] = sub_shape_json - if sub_shape[key]["status"] == "statement" and "allowed" in sub_shape[key]: - value = sub_shape[key]["allowed"] - schema_json["required"] = {key: value} - if sub_shape[key]["status"] == "qualifier": - qualifier_child[key] = sub_shape[key] - if sub_shape[key]["status"] == "reference": - reference_child[key] = sub_shape[key] - return qualifier_child, reference_child, schema_json +""" +Copyright 2021 Mark Tully +Converts entityschema to json suitable for comparing with a wikidata item +""" +import os +import re +from re import Match, Pattern +from typing import Any + +from pydantic import BaseModel + + +class Shape(BaseModel): + """ + Produces a shape in the form of a json for a wikidata entityschema (e.g. E10) + + :return shape: a json representation of the entityschema + """ + + entity_schema_data: dict[str, Any] + + # self.name: str = "" + schema_shape: dict = {} + + _shapes: dict = {} + _schema_shapes: dict = {} + _default_shape_name: str = "" + + def start(self): + # self._get_schema_json(schema) + self._strip_schema_comments() + if self._schema_text != "": + self._get_default_shape() + self._translate_schema() + + def get_schema_shape(self): + """ + Gets the json representation of the schema + :return: the json representation of the schema + """ + return self.schema_shape + + def _translate_schema(self): + """ + Converts the entityschema to a json representation + """ + for shape in self._shapes: + self._convert_shape(shape) + schema_json: dict = {} + if self._default_shape_name != "": + schema_json = self._schema_shapes[self._default_shape_name] + for key in schema_json: + if "shape" in schema_json[key]: + schema_json[key] = self._translate_sub_shape(schema_json[key]) + if ( + "required" in schema_json[key] + and "required" in schema_json[key]["required"] + ): + schema_json[key]["required"] = schema_json[key]["required"]["required"] + self.schema_shape = schema_json + + def _convert_shape(self, shape: str): + """ + Converts a shape into its json representation + + :param shape: the name of the shape to be converted + """ + new_shape: str = self._shapes[shape].replace("\n", "") + new_shape = new_shape.replace("\r", "") + if "{" in new_shape: + first_line = new_shape.split("{", 1)[0] + shape_array: list = new_shape.split("{", 1)[1].split(";") + else: + first_line = new_shape.split("[", 1)[0] + shape_array: list = new_shape.split("[", 1)[1].split(";") + try: + shape_json: dict = self._get_shape_properties(first_line) + except AttributeError: + shape_json: dict = {} + for line in shape_array: + if re.match(r".+:P\d", line): + child: dict = {} + selected_property: str = re.search(r"P\d+", line).group(0) + if shape_json.get(selected_property): + child = shape_json[selected_property] + shape_json[selected_property] = self._assess_property(line, child) + if "wikibase:lexicalCategory" in line: + shape_json["lexicalCategory"] = self._assess_property(line, {}) + if "dct:language" in line: + shape_json["language"] = self._assess_property(line, {}) + self._schema_shapes[shape] = shape_json + + def _assess_property(self, line: str, child: dict): + """ + converts a line og a schema to a json representation of itself + + :param line: The line to be converted + :param child: the existing json shape + :return: a json object to be added to the shape + """ + snak: str = self._get_snak_type(line) + if "@<" in line: + sub_shape_name: str = re.search(r"<.*>", line).group(0) + child["shape"] = sub_shape_name[1:-1] + if re.search(r"\[.*]", line): + required_parameters_string: str = re.search(r"\[.*]", line).group(0) + required_parameters_string = re.sub(r"wd:", "", required_parameters_string) + if "^" in line: + child["not_allowed"] = required_parameters_string[1:-1].split() + else: + child["allowed"] = required_parameters_string[1:-1].split() + cardinality: dict = self._get_cardinality(line) + necessity: str = "optional" + if cardinality: + necessity, child = self._assess_cardinality(necessity, child, cardinality) + child["necessity"] = necessity + child["status"] = snak + return child + + @staticmethod + def _get_shape_properties(first_line: str): + """ + Get the overall properties of the shape + + :param first_line: The first line of the shape + :return: a json representation of the properties of the first line + """ + # a closed shape + shape_json: dict = {} + if "CLOSED" in first_line: + shape_json = {"closed": "closed"} + # a shape where values other than those specified are allowed for the specified properties + if "EXTRA" in first_line: + properties = re.findall(r"P\d+", first_line) + for wikidata_property in properties: + shape_json[wikidata_property] = {"extra": "allowed"} + return shape_json + + def _strip_schema_comments(self): + """ + Strips the comments out of the schema and converts parts we don't care about + because they're enforced by wikidata + """ + schema_text: str = "" + # remove comments from the schema + for line in self.entity_schema_data["schemaText"].splitlines(): + head, _, _ = line.partition("# ") + if line.startswith("#"): + head = "" + schema_text += f"\n{head.strip()}" + # replace data types with the any value designator(.). Since wikidata won't allow items + # to enter the incorrect type (eg. trying to enter a LITERAL value where an IRI (i.e. a + # wikidata item) is required will fail to save + schema_text = schema_text.replace("IRI", ".") + schema_text = schema_text.replace("LITERAL", ".") + schema_text = schema_text.replace("xsd:dateTime", ".") + schema_text = schema_text.replace("xsd:string", ".") + schema_text = schema_text.replace("xsd:decimal", ".") + schema_text = schema_text.replace( + "[ ~ ]", "." + ) + schema_text = schema_text.replace("[ ~ ]", ".") + schema_text = os.linesep.join([s for s in schema_text.splitlines() if s]) + self._schema_text = schema_text + + def _get_default_shape(self): + """ + Gets the default shape to start at in the schema + """ + default_shape_name: Match[str] | None = re.search( + r"start.*=.*@<.*>", self._schema_text, re.IGNORECASE + ) + if default_shape_name is not None: + default_name: str = default_shape_name.group(0).replace(" ", "") + self._default_shape_name = default_name[8:-1] + shape_names: list = re.findall(r"\n<.*>", self._schema_text) + for name in shape_names: + self._shapes[name[2:-1]] = self._get_specific_shape(name[2:-1]) + + def _get_specific_shape(self, shape_name: str): + """ + Extracts a specific shape from the schema + + :param shape_name: The name of the shape to be extracted + :return: The extracted shape + """ + search: Pattern[str | Any] | Pattern = re.compile( + r"<%s>.*\n?([{\[])" % shape_name + ) + parentheses = self._find_parentheses(self._schema_text) + try: + shape_index: int = re.search(search, self._schema_text).start() + except AttributeError: + shape_index = re.search("<%s>" % shape_name, self._schema_text).start() + closest = None + for character in parentheses: + if (character >= shape_index) and (closest is None or character < closest): + closest = character + if closest: + shape_start: int = shape_index + shape_end: int = parentheses[closest] + shape: str = self._schema_text[shape_start:shape_end] + return shape + return "" + + @staticmethod + def _find_parentheses(shape): + index_list = {} + pop_stack = [] + for index, character in enumerate(shape): + if character in ["{", "["]: + pop_stack.append(index) + elif character in ["}", "]"]: + if len(pop_stack) == 0: + raise IndexError("Too many } for {") + index_list[pop_stack.pop()] = index + if len(pop_stack) > 0: + raise IndexError("No matching } for {") + return index_list + + def _translate_sub_shape(self, schema_json: dict): + """ + Converts a sub-shape to a json representation + + :param schema_json: The json containing the shape to be extracted + :return: The extracted shape + """ + try: + sub_shape: dict = self._schema_shapes[schema_json["shape"]] + del schema_json["shape"] + except KeyError: + del schema_json["shape"] + return schema_json + qualifier_child: dict = {} + reference_child: dict = {} + for key in sub_shape: + if "status" in sub_shape[key]: + ( + qualifier_child, + reference_child, + schema_json, + ) = self._assess_sub_shape_key( + sub_shape, key, schema_json, qualifier_child, reference_child + ) + schema_json["qualifiers"] = qualifier_child + schema_json["references"] = reference_child + return schema_json + + @staticmethod + def _get_cardinality(schema_line: str): + """ + Gets the cardinality of a line of the schema + + :param schema_line: The line to be processed + :return: A json representation of the cardinality in the form {min:x, max:y} + """ + cardinality: dict = {} + if "?" in schema_line: + cardinality["min"] = 0 + cardinality["max"] = 1 + elif "*" in schema_line: + cardinality = {} + elif "+" in schema_line: + cardinality["min"] = 1 + elif "{0}" in schema_line: + cardinality["max"] = 0 + cardinality["min"] = 0 + elif re.search(r"{.+}", schema_line): + match = re.search(r"{((\d+)|(\d+,\d+))}", schema_line) + if hasattr(match, "group"): + match = match.group() + cardinalities = match[1:-1].split(",") + cardinality["min"] = int(cardinalities[0]) + if len(cardinalities) == 1: + cardinality["max"] = int(cardinalities[0]) + else: + cardinality["max"] = int(cardinalities[1]) + else: + cardinality["min"] = 1 + cardinality["max"] = 1 + return cardinality + + @staticmethod + def _get_snak_type(schema_line: str): + """ + Gets the type of snak from a schema line + + :param schema_line: The line to be processed + :return: statement, qualifier or reference + """ + if any(prop in schema_line for prop in ["wdt:", "ps:", "p:"]): + return "statement" + if "pq:" in schema_line: + return "qualifier" + return "reference" + + @staticmethod + def _assess_cardinality(necessity: str, child: dict, cardinality: dict): + if "cardinality" in child: + if "min" in child["cardinality"] and "min" in cardinality: + cardinality["min"] = cardinality["min"] + child["cardinality"]["min"] + if "max" in child["cardinality"] and "max" in cardinality: + cardinality["max"] = cardinality["max"] + child["cardinality"]["max"] + child["cardinality"] = cardinality + if "min" in cardinality and cardinality["min"] > 0: + necessity = "required" + if ( + "max" in cardinality + and "min" in cardinality + and cardinality["max"] == 0 + and cardinality["min"] == 0 + ): + necessity = "absent" + return necessity, child + + def _assess_sub_shape_key( + self, sub_shape, key, schema_json, qualifier_child, reference_child + ): + if "shape" in key: + sub_shape_json = self._translate_sub_shape(key) + if key["status"] == "statement": + schema_json["required"] = sub_shape_json + if sub_shape[key]["status"] == "statement" and "allowed" in sub_shape[key]: + value = sub_shape[key]["allowed"] + schema_json["required"] = {key: value} + if sub_shape[key]["status"] == "qualifier": + qualifier_child[key] = sub_shape[key] + if sub_shape[key]["status"] == "reference": + reference_child[key] = sub_shape[key] + return qualifier_child, reference_child, schema_json diff --git a/entityshape/models/statement_value.py b/entityvalidator/models/statement_value.py similarity index 68% rename from entityshape/models/statement_value.py rename to entityvalidator/models/statement_value.py index 780d4ab..eb5bc19 100644 --- a/entityshape/models/statement_value.py +++ b/entityvalidator/models/statement_value.py @@ -1,8 +1,6 @@ -from typing import Optional - from pydantic import BaseModel -from entityshape.enums import Necessity +from entityvalidator.enums import Necessity class StatementValue(BaseModel): @@ -10,6 +8,6 @@ class StatementValue(BaseModel): Limitation: response can contain arbitrary strings with missing qualifiers so we cannot predict all possible values :/""" - necessity: Optional[Necessity] = None + necessity: Necessity | None = None property: str = "" response: str diff --git a/entityvalidator/models/validate_request.py b/entityvalidator/models/validate_request.py new file mode 100644 index 0000000..8edb04b --- /dev/null +++ b/entityvalidator/models/validate_request.py @@ -0,0 +1,9 @@ +# from pydantic import BaseModel, Field +# +# +# class ValidateRequest(BaseModel): +# eid: str = Field(..., description="EntitySchema ID, ex. E100") +# entity_ids: list[str] = Field( +# ..., max_length=100, description="Lista med max 100 entity IDs (t.ex. Q42)" +# ) +# lang: str = Field("en", description="Språkkod, default = en") diff --git a/poetry.lock b/poetry.lock index 8d546f2..8a2b7e6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,226 @@ -# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.4 and should not be changed by hand. + +[[package]] +name = "aiohappyeyeballs" +version = "2.4.4" +description = "Happy Eyeballs for asyncio" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "aiohappyeyeballs-2.4.4-py3-none-any.whl", hash = "sha256:a980909d50efcd44795c4afeca523296716d50cd756ddca6af8c65b996e27de8"}, + {file = "aiohappyeyeballs-2.4.4.tar.gz", hash = "sha256:5fdd7d87889c63183afc18ce9271f9b0a7d32c2303e394468dd45d514a757745"}, +] + +[[package]] +name = "aiohttp" +version = "3.10.11" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "aiohttp-3.10.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5077b1a5f40ffa3ba1f40d537d3bec4383988ee51fbba6b74aa8fb1bc466599e"}, + {file = "aiohttp-3.10.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8d6a14a4d93b5b3c2891fca94fa9d41b2322a68194422bef0dd5ec1e57d7d298"}, + {file = "aiohttp-3.10.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ffbfde2443696345e23a3c597049b1dd43049bb65337837574205e7368472177"}, + {file = "aiohttp-3.10.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20b3d9e416774d41813bc02fdc0663379c01817b0874b932b81c7f777f67b217"}, + {file = "aiohttp-3.10.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b943011b45ee6bf74b22245c6faab736363678e910504dd7531a58c76c9015a"}, + {file = "aiohttp-3.10.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48bc1d924490f0d0b3658fe5c4b081a4d56ebb58af80a6729d4bd13ea569797a"}, + {file = "aiohttp-3.10.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e12eb3f4b1f72aaaf6acd27d045753b18101524f72ae071ae1c91c1cd44ef115"}, + {file = "aiohttp-3.10.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f14ebc419a568c2eff3c1ed35f634435c24ead2fe19c07426af41e7adb68713a"}, + {file = "aiohttp-3.10.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:72b191cdf35a518bfc7ca87d770d30941decc5aaf897ec8b484eb5cc8c7706f3"}, + {file = "aiohttp-3.10.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5ab2328a61fdc86424ee540d0aeb8b73bbcad7351fb7cf7a6546fc0bcffa0038"}, + {file = "aiohttp-3.10.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:aa93063d4af05c49276cf14e419550a3f45258b6b9d1f16403e777f1addf4519"}, + {file = "aiohttp-3.10.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:30283f9d0ce420363c24c5c2421e71a738a2155f10adbb1a11a4d4d6d2715cfc"}, + {file = "aiohttp-3.10.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e5358addc8044ee49143c546d2182c15b4ac3a60be01c3209374ace05af5733d"}, + {file = "aiohttp-3.10.11-cp310-cp310-win32.whl", hash = "sha256:e1ffa713d3ea7cdcd4aea9cddccab41edf6882fa9552940344c44e59652e1120"}, + {file = "aiohttp-3.10.11-cp310-cp310-win_amd64.whl", hash = "sha256:778cbd01f18ff78b5dd23c77eb82987ee4ba23408cbed233009fd570dda7e674"}, + {file = "aiohttp-3.10.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:80ff08556c7f59a7972b1e8919f62e9c069c33566a6d28586771711e0eea4f07"}, + {file = "aiohttp-3.10.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c8f96e9ee19f04c4914e4e7a42a60861066d3e1abf05c726f38d9d0a466e695"}, + {file = "aiohttp-3.10.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fb8601394d537da9221947b5d6e62b064c9a43e88a1ecd7414d21a1a6fba9c24"}, + {file = "aiohttp-3.10.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ea224cf7bc2d8856d6971cea73b1d50c9c51d36971faf1abc169a0d5f85a382"}, + {file = "aiohttp-3.10.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db9503f79e12d5d80b3efd4d01312853565c05367493379df76d2674af881caa"}, + {file = "aiohttp-3.10.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0f449a50cc33f0384f633894d8d3cd020e3ccef81879c6e6245c3c375c448625"}, + {file = "aiohttp-3.10.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82052be3e6d9e0c123499127782a01a2b224b8af8c62ab46b3f6197035ad94e9"}, + {file = "aiohttp-3.10.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:20063c7acf1eec550c8eb098deb5ed9e1bb0521613b03bb93644b810986027ac"}, + {file = "aiohttp-3.10.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:489cced07a4c11488f47aab1f00d0c572506883f877af100a38f1fedaa884c3a"}, + {file = "aiohttp-3.10.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ea9b3bab329aeaa603ed3bf605f1e2a6f36496ad7e0e1aa42025f368ee2dc07b"}, + {file = "aiohttp-3.10.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ca117819d8ad113413016cb29774b3f6d99ad23c220069789fc050267b786c16"}, + {file = "aiohttp-3.10.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2dfb612dcbe70fb7cdcf3499e8d483079b89749c857a8f6e80263b021745c730"}, + {file = "aiohttp-3.10.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9b615d3da0d60e7d53c62e22b4fd1c70f4ae5993a44687b011ea3a2e49051b8"}, + {file = "aiohttp-3.10.11-cp311-cp311-win32.whl", hash = "sha256:29103f9099b6068bbdf44d6a3d090e0a0b2be6d3c9f16a070dd9d0d910ec08f9"}, + {file = "aiohttp-3.10.11-cp311-cp311-win_amd64.whl", hash = "sha256:236b28ceb79532da85d59aa9b9bf873b364e27a0acb2ceaba475dc61cffb6f3f"}, + {file = "aiohttp-3.10.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7480519f70e32bfb101d71fb9a1f330fbd291655a4c1c922232a48c458c52710"}, + {file = "aiohttp-3.10.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f65267266c9aeb2287a6622ee2bb39490292552f9fbf851baabc04c9f84e048d"}, + {file = "aiohttp-3.10.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7400a93d629a0608dc1d6c55f1e3d6e07f7375745aaa8bd7f085571e4d1cee97"}, + {file = "aiohttp-3.10.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f34b97e4b11b8d4eb2c3a4f975be626cc8af99ff479da7de49ac2c6d02d35725"}, + {file = "aiohttp-3.10.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e7b825da878464a252ccff2958838f9caa82f32a8dbc334eb9b34a026e2c636"}, + {file = "aiohttp-3.10.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9f92a344c50b9667827da308473005f34767b6a2a60d9acff56ae94f895f385"}, + {file = "aiohttp-3.10.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc6f1ab987a27b83c5268a17218463c2ec08dbb754195113867a27b166cd6087"}, + {file = "aiohttp-3.10.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1dc0f4ca54842173d03322793ebcf2c8cc2d34ae91cc762478e295d8e361e03f"}, + {file = "aiohttp-3.10.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7ce6a51469bfaacff146e59e7fb61c9c23006495d11cc24c514a455032bcfa03"}, + {file = "aiohttp-3.10.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:aad3cd91d484d065ede16f3cf15408254e2469e3f613b241a1db552c5eb7ab7d"}, + {file = "aiohttp-3.10.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f4df4b8ca97f658c880fb4b90b1d1ec528315d4030af1ec763247ebfd33d8b9a"}, + {file = "aiohttp-3.10.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2e4e18a0a2d03531edbc06c366954e40a3f8d2a88d2b936bbe78a0c75a3aab3e"}, + {file = "aiohttp-3.10.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6ce66780fa1a20e45bc753cda2a149daa6dbf1561fc1289fa0c308391c7bc0a4"}, + {file = "aiohttp-3.10.11-cp312-cp312-win32.whl", hash = "sha256:a919c8957695ea4c0e7a3e8d16494e3477b86f33067478f43106921c2fef15bb"}, + {file = "aiohttp-3.10.11-cp312-cp312-win_amd64.whl", hash = "sha256:b5e29706e6389a2283a91611c91bf24f218962717c8f3b4e528ef529d112ee27"}, + {file = "aiohttp-3.10.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:703938e22434d7d14ec22f9f310559331f455018389222eed132808cd8f44127"}, + {file = "aiohttp-3.10.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9bc50b63648840854e00084c2b43035a62e033cb9b06d8c22b409d56eb098413"}, + {file = "aiohttp-3.10.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5f0463bf8b0754bc744e1feb61590706823795041e63edf30118a6f0bf577461"}, + {file = "aiohttp-3.10.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6c6dec398ac5a87cb3a407b068e1106b20ef001c344e34154616183fe684288"}, + {file = "aiohttp-3.10.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bcaf2d79104d53d4dcf934f7ce76d3d155302d07dae24dff6c9fffd217568067"}, + {file = "aiohttp-3.10.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:25fd5470922091b5a9aeeb7e75be609e16b4fba81cdeaf12981393fb240dd10e"}, + {file = "aiohttp-3.10.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbde2ca67230923a42161b1f408c3992ae6e0be782dca0c44cb3206bf330dee1"}, + {file = "aiohttp-3.10.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:249c8ff8d26a8b41a0f12f9df804e7c685ca35a207e2410adbd3e924217b9006"}, + {file = "aiohttp-3.10.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:878ca6a931ee8c486a8f7b432b65431d095c522cbeb34892bee5be97b3481d0f"}, + {file = "aiohttp-3.10.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8663f7777ce775f0413324be0d96d9730959b2ca73d9b7e2c2c90539139cbdd6"}, + {file = "aiohttp-3.10.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:6cd3f10b01f0c31481fba8d302b61603a2acb37b9d30e1d14e0f5a58b7b18a31"}, + {file = "aiohttp-3.10.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4e8d8aad9402d3aa02fdc5ca2fe68bcb9fdfe1f77b40b10410a94c7f408b664d"}, + {file = "aiohttp-3.10.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:38e3c4f80196b4f6c3a85d134a534a56f52da9cb8d8e7af1b79a32eefee73a00"}, + {file = "aiohttp-3.10.11-cp313-cp313-win32.whl", hash = "sha256:fc31820cfc3b2863c6e95e14fcf815dc7afe52480b4dc03393c4873bb5599f71"}, + {file = "aiohttp-3.10.11-cp313-cp313-win_amd64.whl", hash = "sha256:4996ff1345704ffdd6d75fb06ed175938c133425af616142e7187f28dc75f14e"}, + {file = "aiohttp-3.10.11-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:74baf1a7d948b3d640badeac333af581a367ab916b37e44cf90a0334157cdfd2"}, + {file = "aiohttp-3.10.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:473aebc3b871646e1940c05268d451f2543a1d209f47035b594b9d4e91ce8339"}, + {file = "aiohttp-3.10.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c2f746a6968c54ab2186574e15c3f14f3e7f67aef12b761e043b33b89c5b5f95"}, + {file = "aiohttp-3.10.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d110cabad8360ffa0dec8f6ec60e43286e9d251e77db4763a87dcfe55b4adb92"}, + {file = "aiohttp-3.10.11-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0099c7d5d7afff4202a0c670e5b723f7718810000b4abcbc96b064129e64bc7"}, + {file = "aiohttp-3.10.11-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0316e624b754dbbf8c872b62fe6dcb395ef20c70e59890dfa0de9eafccd2849d"}, + {file = "aiohttp-3.10.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a5f7ab8baf13314e6b2485965cbacb94afff1e93466ac4d06a47a81c50f9cca"}, + {file = "aiohttp-3.10.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c891011e76041e6508cbfc469dd1a8ea09bc24e87e4c204e05f150c4c455a5fa"}, + {file = "aiohttp-3.10.11-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:9208299251370ee815473270c52cd3f7069ee9ed348d941d574d1457d2c73e8b"}, + {file = "aiohttp-3.10.11-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:459f0f32c8356e8125f45eeff0ecf2b1cb6db1551304972702f34cd9e6c44658"}, + {file = "aiohttp-3.10.11-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:14cdc8c1810bbd4b4b9f142eeee23cda528ae4e57ea0923551a9af4820980e39"}, + {file = "aiohttp-3.10.11-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:971aa438a29701d4b34e4943e91b5e984c3ae6ccbf80dd9efaffb01bd0b243a9"}, + {file = "aiohttp-3.10.11-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:9a309c5de392dfe0f32ee57fa43ed8fc6ddf9985425e84bd51ed66bb16bce3a7"}, + {file = "aiohttp-3.10.11-cp38-cp38-win32.whl", hash = "sha256:9ec1628180241d906a0840b38f162a3215114b14541f1a8711c368a8739a9be4"}, + {file = "aiohttp-3.10.11-cp38-cp38-win_amd64.whl", hash = "sha256:9c6e0ffd52c929f985c7258f83185d17c76d4275ad22e90aa29f38e211aacbec"}, + {file = "aiohttp-3.10.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cdc493a2e5d8dc79b2df5bec9558425bcd39aff59fc949810cbd0832e294b106"}, + {file = "aiohttp-3.10.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b3e70f24e7d0405be2348da9d5a7836936bf3a9b4fd210f8c37e8d48bc32eca6"}, + {file = "aiohttp-3.10.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:968b8fb2a5eee2770eda9c7b5581587ef9b96fbdf8dcabc6b446d35ccc69df01"}, + {file = "aiohttp-3.10.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:deef4362af9493d1382ef86732ee2e4cbc0d7c005947bd54ad1a9a16dd59298e"}, + {file = "aiohttp-3.10.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:686b03196976e327412a1b094f4120778c7c4b9cff9bce8d2fdfeca386b89829"}, + {file = "aiohttp-3.10.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3bf6d027d9d1d34e1c2e1645f18a6498c98d634f8e373395221121f1c258ace8"}, + {file = "aiohttp-3.10.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:099fd126bf960f96d34a760e747a629c27fb3634da5d05c7ef4d35ef4ea519fc"}, + {file = "aiohttp-3.10.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c73c4d3dae0b4644bc21e3de546530531d6cdc88659cdeb6579cd627d3c206aa"}, + {file = "aiohttp-3.10.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0c5580f3c51eea91559db3facd45d72e7ec970b04528b4709b1f9c2555bd6d0b"}, + {file = "aiohttp-3.10.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fdf6429f0caabfd8a30c4e2eaecb547b3c340e4730ebfe25139779b9815ba138"}, + {file = "aiohttp-3.10.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:d97187de3c276263db3564bb9d9fad9e15b51ea10a371ffa5947a5ba93ad6777"}, + {file = "aiohttp-3.10.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:0acafb350cfb2eba70eb5d271f55e08bd4502ec35e964e18ad3e7d34d71f7261"}, + {file = "aiohttp-3.10.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c13ed0c779911c7998a58e7848954bd4d63df3e3575f591e321b19a2aec8df9f"}, + {file = "aiohttp-3.10.11-cp39-cp39-win32.whl", hash = "sha256:22b7c540c55909140f63ab4f54ec2c20d2635c0289cdd8006da46f3327f971b9"}, + {file = "aiohttp-3.10.11-cp39-cp39-win_amd64.whl", hash = "sha256:7b26b1551e481012575dab8e3727b16fe7dd27eb2711d2e63ced7368756268fb"}, + {file = "aiohttp-3.10.11.tar.gz", hash = "sha256:9dc2b8f3dcab2e39e0fa309c8da50c3b55e6f34ab25f1a71d3288f24924d33a7"}, +] + +[package.dependencies] +aiohappyeyeballs = ">=2.3.0" +aiosignal = ">=1.1.2" +async-timeout = {version = ">=4.0,<6.0", markers = "python_version < \"3.11\""} +attrs = ">=17.3.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.12.0,<2.0" + +[package.extras] +speedups = ["Brotli ; platform_python_implementation == \"CPython\"", "aiodns (>=3.2.0) ; sys_platform == \"linux\" or sys_platform == \"darwin\"", "brotlicffi ; platform_python_implementation != \"CPython\""] + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" + +[[package]] +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + +[[package]] +name = "anyio" +version = "4.5.2" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "anyio-4.5.2-py3-none-any.whl", hash = "sha256:c011ee36bc1e8ba40e5a81cb9df91925c218fe9b778554e0b56a21e1b5d4716f"}, + {file = "anyio-4.5.2.tar.gz", hash = "sha256:23009af4ed04ce05991845451e11ef02fc7c5ed29179ac9a420e5ad0ac7ddc5b"}, +] + +[package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} + +[package.extras] +doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1) ; python_version >= \"3.10\"", "uvloop (>=0.21.0b1) ; platform_python_implementation == \"CPython\" and platform_system != \"Windows\""] +trio = ["trio (>=0.26.1)"] + +[[package]] +name = "async-timeout" +version = "5.0.1" +description = "Timeout context manager for asyncio programs" +optional = false +python-versions = ">=3.8" +groups = ["main"] +markers = "python_version < \"3.11\"" +files = [ + {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, + {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, +] + +[[package]] +name = "asyncio" +version = "3.4.3" +description = "reference implementation of PEP 3156" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "asyncio-3.4.3-cp33-none-win32.whl", hash = "sha256:b62c9157d36187eca799c378e572c969f0da87cd5fc42ca372d92cdb06e7e1de"}, + {file = "asyncio-3.4.3-cp33-none-win_amd64.whl", hash = "sha256:c46a87b48213d7464f22d9a497b9eef8c1928b68320a2fa94240f969f6fec08c"}, + {file = "asyncio-3.4.3-py3-none-any.whl", hash = "sha256:c4d18b22701821de07bd6aea8b53d21449ec0ec5680645e5317062ea21817d2d"}, + {file = "asyncio-3.4.3.tar.gz", hash = "sha256:83360ff8bc97980e4ff25c964c7bd3923d333d177aa4f7fb736b019f26c7cb41"}, +] + +[[package]] +name = "attrs" +version = "25.3.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3"}, + {file = "attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b"}, +] + +[package.extras] +benchmark = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +cov = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +dev = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier"] +tests = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\""] [[package]] name = "backoff" @@ -6,6 +228,7 @@ version = "2.2.1" description = "Function decoration for backoff and retry" optional = false python-versions = ">=3.7,<4.0" +groups = ["main"] files = [ {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, @@ -17,6 +240,7 @@ version = "22.12.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, @@ -48,119 +272,127 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "certifi" -version = "2023.5.7" +version = "2025.8.3" description = "Python package for providing Mozilla's CA Bundle." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +groups = ["main"] files = [ - {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, - {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, + {file = "certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5"}, + {file = "certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407"}, ] [[package]] name = "cfgv" -version = "3.3.1" +version = "3.4.0" description = "Validate configuration and produce human readable error messages." optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, - {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, + {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, + {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, ] [[package]] name = "charset-normalizer" -version = "3.1.0" +version = "3.4.3" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false -python-versions = ">=3.7.0" +python-versions = ">=3.7" +groups = ["main"] files = [ - {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, - {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fb7f67a1bfa6e40b438170ebdc8158b78dc465a5a67b6dde178a46987b244a72"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc9370a2da1ac13f0153780040f465839e6cccb4a1e44810124b4e22483c93fe"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:07a0eae9e2787b586e129fdcbe1af6997f8d0e5abaa0bc98c0e20e124d67e601"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:74d77e25adda8581ffc1c720f1c81ca082921329452eba58b16233ab1842141c"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0e909868420b7049dafd3a31d45125b31143eec59235311fc4c57ea26a4acd2"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c6f162aabe9a91a309510d74eeb6507fab5fff92337a15acbe77753d88d9dcf0"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4ca4c094de7771a98d7fbd67d9e5dbf1eb73efa4f744a730437d8a3a5cf994f0"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:02425242e96bcf29a49711b0ca9f37e451da7c70562bc10e8ed992a5a7a25cc0"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:78deba4d8f9590fe4dae384aeff04082510a709957e968753ff3c48399f6f92a"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-win32.whl", hash = "sha256:d79c198e27580c8e958906f803e63cddb77653731be08851c7df0b1a14a8fc0f"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:c6e490913a46fa054e03699c70019ab869e990270597018cef1d8562132c2669"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b256ee2e749283ef3ddcff51a675ff43798d92d746d1a6e4631bf8c707d22d0b"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13faeacfe61784e2559e690fc53fa4c5ae97c6fcedb8eb6fb8d0a15b475d2c64"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:00237675befef519d9af72169d8604a067d92755e84fe76492fef5441db05b91"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:585f3b2a80fbd26b048a0be90c5aae8f06605d3c92615911c3a2b03a8a3b796f"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e78314bdc32fa80696f72fa16dc61168fda4d6a0c014e0380f9d02f0e5d8a07"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:96b2b3d1a83ad55310de8c7b4a2d04d9277d5591f40761274856635acc5fcb30"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:939578d9d8fd4299220161fdd76e86c6a251987476f5243e8864a7844476ba14"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fd10de089bcdcd1be95a2f73dbe6254798ec1bda9f450d5828c96f93e2536b9c"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1e8ac75d72fa3775e0b7cb7e4629cec13b7514d928d15ef8ea06bca03ef01cae"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-win32.whl", hash = "sha256:6cf8fd4c04756b6b60146d98cd8a77d0cdae0e1ca20329da2ac85eed779b6849"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:31a9a6f775f9bcd865d88ee350f0ffb0e25936a7f930ca98995c05abf1faf21c"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-win32.whl", hash = "sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-win32.whl", hash = "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-win32.whl", hash = "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0f2be7e0cf7754b9a30eb01f4295cc3d4358a479843b31f328afd210e2c7598c"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c60e092517a73c632ec38e290eba714e9627abe9d301c8c8a12ec32c314a2a4b"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:252098c8c7a873e17dd696ed98bbe91dbacd571da4b87df3736768efa7a792e4"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3653fad4fe3ed447a596ae8638b437f827234f01a8cd801842e43f3d0a6b281b"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8999f965f922ae054125286faf9f11bc6932184b93011d138925a1773830bbe9"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d95bfb53c211b57198bb91c46dd5a2d8018b3af446583aab40074bf7988401cb"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:5b413b0b1bfd94dbf4023ad6945889f374cd24e3f62de58d6bb102c4d9ae534a"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:b5e3b2d152e74e100a9e9573837aba24aab611d39428ded46f4e4022ea7d1942"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a2d08ac246bb48479170408d6c19f6385fa743e7157d716e144cad849b2dd94b"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-win32.whl", hash = "sha256:ec557499516fc90fd374bf2e32349a2887a876fbf162c160e3c01b6849eaf557"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:5d8d01eac18c423815ed4f4a2ec3b439d654e55ee4ad610e153cf02faf67ea40"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:70bfc5f2c318afece2f5838ea5e4c3febada0be750fcf4775641052bbba14d05"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23b6b24d74478dc833444cbd927c338349d6ae852ba53a0d02a2de1fce45b96e"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:34a7f768e3f985abdb42841e20e17b330ad3aaf4bb7e7aeeb73db2e70f077b99"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fb731e5deb0c7ef82d698b0f4c5bb724633ee2a489401594c5c88b02e6cb15f7"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:257f26fed7d7ff59921b78244f3cd93ed2af1800ff048c33f624c87475819dd7"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1ef99f0456d3d46a50945c98de1774da86f8e992ab5c77865ea8b8195341fc19"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:2c322db9c8c89009a990ef07c3bcc9f011a3269bc06782f916cd3d9eed7c9312"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:511729f456829ef86ac41ca78c63a5cb55240ed23b4b737faca0eb1abb1c41bc"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:88ab34806dea0671532d3f82d82b85e8fc23d7b2dd12fa837978dad9bb392a34"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-win32.whl", hash = "sha256:16a8770207946ac75703458e2c743631c79c59c5890c80011d536248f8eaa432"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:d22dbedd33326a4a5190dd4fe9e9e693ef12160c77382d9e87919bce54f3d4ca"}, + {file = "charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a"}, + {file = "charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14"}, ] [[package]] name = "click" -version = "8.1.3" +version = "8.1.8" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, + {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, + {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, ] [package.dependencies] @@ -168,19 +400,20 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} [[package]] name = "codespell" -version = "2.2.5" -description = "Codespell" +version = "2.4.1" +description = "Fix common misspellings in text files" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "codespell-2.2.5-py3-none-any.whl", hash = "sha256:efa037f54b73c84f7bd14ce8e853d5f822cdd6386ef0ff32e957a3919435b9ec"}, - {file = "codespell-2.2.5.tar.gz", hash = "sha256:6d9faddf6eedb692bf80c9a94ec13ab4f5fb585aabae5f3750727148d7b5be56"}, + {file = "codespell-2.4.1-py3-none-any.whl", hash = "sha256:3dadafa67df7e4a3dbf51e0d7315061b80d265f9552ebd699b3dd6834b47e425"}, + {file = "codespell-2.4.1.tar.gz", hash = "sha256:299fcdcb09d23e81e35a671bbe746d5ad7e8385972e65dbb833a2eaac33c01e5"}, ] [package.extras] -dev = ["Pygments", "build", "chardet", "pytest", "pytest-cov", "pytest-dependency", "ruff", "tomli"] +dev = ["Pygments", "build", "chardet", "pre-commit", "pytest", "pytest-cov", "pytest-dependency", "ruff", "tomli", "twine"] hard-encoding-detection = ["chardet"] -toml = ["tomli"] +toml = ["tomli ; python_version < \"3.11\""] types = ["chardet (>=5.1.0)", "mypy", "pytest", "pytest-cov", "pytest-dependency"] [[package]] @@ -189,10 +422,12 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main", "dev"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +markers = {main = "platform_system == \"Windows\"", dev = "platform_system == \"Windows\" or sys_platform == \"win32\""} [[package]] name = "coverage" @@ -200,6 +435,7 @@ version = "6.5.0" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "coverage-6.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef8674b0ee8cc11e2d574e3e2998aea5df5ab242e012286824ea3c6970580e53"}, {file = "coverage-6.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:784f53ebc9f3fd0e2a3f6a78b2be1bd1f5575d7863e10c6e12504f240fd06660"}, @@ -254,7 +490,7 @@ files = [ ] [package.extras] -toml = ["tomli"] +toml = ["tomli ; python_full_version <= \"3.11.0a6\""] [[package]] name = "dead" @@ -262,6 +498,7 @@ version = "1.5.2" description = "dead simple python dead code detection" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "dead-1.5.2-py2.py3-none-any.whl", hash = "sha256:4e97c2e4f4c4751b908b56831ab52a34d247570f6ef650c8a34b8b51950540bb"}, {file = "dead-1.5.2.tar.gz", hash = "sha256:06d82da0adcac7821d45b147c019b3852644f9a23493c0b1578f1c8a7e4e73fd"}, @@ -272,72 +509,198 @@ identify = "*" [[package]] name = "distlib" -version = "0.3.6" +version = "0.4.0" description = "Distribution utilities" optional = false python-versions = "*" +groups = ["dev"] files = [ - {file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"}, - {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"}, + {file = "distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16"}, + {file = "distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d"}, ] [[package]] -name = "dparse" -version = "0.6.2" -description = "A parser for Python dependency files" +name = "exceptiongroup" +version = "1.3.0" +description = "Backport of PEP 654 (exception groups)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" +groups = ["main", "dev"] +markers = "python_version < \"3.11\"" files = [ - {file = "dparse-0.6.2-py3-none-any.whl", hash = "sha256:8097076f1dd26c377f30d4745e6ec18fef42f3bf493933b842ac5bafad8c345f"}, - {file = "dparse-0.6.2.tar.gz", hash = "sha256:d45255bda21f998bc7ddf2afd5e62505ba6134756ba2d42a84c56b0826614dfe"}, + {file = "exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10"}, + {file = "exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88"}, ] [package.dependencies] -packaging = "*" -toml = "*" +typing-extensions = {version = ">=4.6.0", markers = "python_version < \"3.13\""} [package.extras] -conda = ["pyyaml"] -pipenv = ["pipenv"] +test = ["pytest (>=6)"] [[package]] -name = "exceptiongroup" -version = "1.1.1" -description = "Backport of PEP 654 (exception groups)" +name = "fastapi" +version = "0.116.1" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, - {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, + {file = "fastapi-0.116.1-py3-none-any.whl", hash = "sha256:c46ac7c312df840f0c9e220f7964bada936781bc4e2e6eb71f1c4d7553786565"}, + {file = "fastapi-0.116.1.tar.gz", hash = "sha256:ed52cbf946abfd70c5a0dccb24673f0670deeb517a88b3544d03c2a6bf283143"}, ] +[package.dependencies] +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" +starlette = ">=0.40.0,<0.48.0" +typing-extensions = ">=4.8.0" + [package.extras] -test = ["pytest (>=6)"] +all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=3.1.5)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] +standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "httpx (>=0.23.0)", "jinja2 (>=3.1.5)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"] +standard-no-fastapi-cloud-cli = ["email-validator (>=2.0.0)", "fastapi-cli[standard-no-fastapi-cloud-cli] (>=0.0.8)", "httpx (>=0.23.0)", "jinja2 (>=3.1.5)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"] [[package]] name = "filelock" -version = "3.12.2" +version = "3.16.1" description = "A platform independent file lock." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "filelock-3.12.2-py3-none-any.whl", hash = "sha256:cbb791cdea2a72f23da6ac5b5269ab0a0d161e9ef0100e653b69049a7706d1ec"}, - {file = "filelock-3.12.2.tar.gz", hash = "sha256:002740518d8aa59a26b0c76e10fb8c6e15eae825d34b6fdf670333fd7b938d81"}, + {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, + {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, ] [package.extras] -docs = ["furo (>=2023.5.20)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] +docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4.1)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"] +typing = ["typing-extensions (>=4.12.2) ; python_version < \"3.11\""] + +[[package]] +name = "frozenlist" +version = "1.5.0" +description = "A list-like structure which implements collections.abc.MutableSequence" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a"}, + {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb"}, + {file = "frozenlist-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:15538c0cbf0e4fa11d1e3a71f823524b0c46299aed6e10ebb4c2089abd8c3bec"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e79225373c317ff1e35f210dd5f1344ff31066ba8067c307ab60254cd3a78ad5"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9272fa73ca71266702c4c3e2d4a28553ea03418e591e377a03b8e3659d94fa76"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:498524025a5b8ba81695761d78c8dd7382ac0b052f34e66939c42df860b8ff17"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92b5278ed9d50fe610185ecd23c55d8b307d75ca18e94c0e7de328089ac5dcba"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f3c8c1dacd037df16e85227bac13cca58c30da836c6f936ba1df0c05d046d8d"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f2ac49a9bedb996086057b75bf93538240538c6d9b38e57c82d51f75a73409d2"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e66cc454f97053b79c2ab09c17fbe3c825ea6b4de20baf1be28919460dd7877f"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5a3ba5f9a0dfed20337d3e966dc359784c9f96503674c2faf015f7fe8e96798c"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6321899477db90bdeb9299ac3627a6a53c7399c8cd58d25da094007402b039ab"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:76e4753701248476e6286f2ef492af900ea67d9706a0155335a40ea21bf3b2f5"}, + {file = "frozenlist-1.5.0-cp310-cp310-win32.whl", hash = "sha256:977701c081c0241d0955c9586ffdd9ce44f7a7795df39b9151cd9a6fd0ce4cfb"}, + {file = "frozenlist-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:189f03b53e64144f90990d29a27ec4f7997d91ed3d01b51fa39d2dbe77540fd4"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf"}, + {file = "frozenlist-1.5.0-cp311-cp311-win32.whl", hash = "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942"}, + {file = "frozenlist-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f"}, + {file = "frozenlist-1.5.0-cp312-cp312-win32.whl", hash = "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8"}, + {file = "frozenlist-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03"}, + {file = "frozenlist-1.5.0-cp313-cp313-win32.whl", hash = "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c"}, + {file = "frozenlist-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dd94994fc91a6177bfaafd7d9fd951bc8689b0a98168aa26b5f543868548d3ca"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0da8bbec082bf6bf18345b180958775363588678f64998c2b7609e34719b10"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73f2e31ea8dd7df61a359b731716018c2be196e5bb3b74ddba107f694fbd7604"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:828afae9f17e6de596825cf4228ff28fbdf6065974e5ac1410cecc22f699d2b3"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1577515d35ed5649d52ab4319db757bb881ce3b2b796d7283e6634d99ace307"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2150cc6305a2c2ab33299453e2968611dacb970d2283a14955923062c8d00b10"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a72b7a6e3cd2725eff67cd64c8f13335ee18fc3c7befc05aed043d24c7b9ccb9"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c16d2fa63e0800723139137d667e1056bee1a1cf7965153d2d104b62855e9b99"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:17dcc32fc7bda7ce5875435003220a457bcfa34ab7924a49a1c19f55b6ee185c"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:97160e245ea33d8609cd2b8fd997c850b56db147a304a262abc2b3be021a9171"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f1e6540b7fa044eee0bb5111ada694cf3dc15f2b0347ca125ee9ca984d5e9e6e"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:91d6c171862df0a6c61479d9724f22efb6109111017c87567cfeb7b5d1449fdf"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c1fac3e2ace2eb1052e9f7c7db480818371134410e1f5c55d65e8f3ac6d1407e"}, + {file = "frozenlist-1.5.0-cp38-cp38-win32.whl", hash = "sha256:b97f7b575ab4a8af9b7bc1d2ef7f29d3afee2226bd03ca3875c16451ad5a7723"}, + {file = "frozenlist-1.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:374ca2dabdccad8e2a76d40b1d037f5bd16824933bf7bcea3e59c891fd4a0923"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9bbcdfaf4af7ce002694a4e10a0159d5a8d20056a12b05b45cea944a4953f972"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1893f948bf6681733aaccf36c5232c231e3b5166d607c5fa77773611df6dc336"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2b5e23253bb709ef57a8e95e6ae48daa9ac5f265637529e4ce6b003a37b2621f"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f253985bb515ecd89629db13cb58d702035ecd8cfbca7d7a7e29a0e6d39af5f"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04a5c6babd5e8fb7d3c871dc8b321166b80e41b637c31a995ed844a6139942b6"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fe0f1c29ba24ba6ff6abf688cb0b7cf1efab6b6aa6adc55441773c252f7411"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:226d72559fa19babe2ccd920273e767c96a49b9d3d38badd7c91a0fdeda8ea08"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b731db116ab3aedec558573c1a5eec78822b32292fe4f2f0345b7f697745c2"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:366d8f93e3edfe5a918c874702f78faac300209a4d5bf38352b2c1bdc07a766d"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1b96af8c582b94d381a1c1f51ffaedeb77c821c690ea5f01da3d70a487dd0a9b"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c03eff4a41bd4e38415cbed054bbaff4a075b093e2394b6915dca34a40d1e38b"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:50cf5e7ee9b98f22bdecbabf3800ae78ddcc26e4a435515fc72d97903e8488e0"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e76bfbc72353269c44e0bc2cfe171900fbf7f722ad74c9a7b638052afe6a00c"}, + {file = "frozenlist-1.5.0-cp39-cp39-win32.whl", hash = "sha256:666534d15ba8f0fda3f53969117383d5dc021266b3c1a42c9ec4855e4b58b9d3"}, + {file = "frozenlist-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:5c28f4b5dbef8a0d8aad0d4de24d1e9e981728628afaf4ea0792f5d0939372f0"}, + {file = "frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3"}, + {file = "frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817"}, +] + +[[package]] +name = "h11" +version = "0.16.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"}, + {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, +] [[package]] name = "identify" -version = "2.5.24" +version = "2.6.1" description = "File identification library for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "identify-2.5.24-py2.py3-none-any.whl", hash = "sha256:986dbfb38b1140e763e413e6feb44cd731faf72d1909543178aa79b0e258265d"}, - {file = "identify-2.5.24.tar.gz", hash = "sha256:0aac67d5b4812498056d28a9a512a483f5085cc28640b02b258a59dac34301d4"}, + {file = "identify-2.6.1-py2.py3-none-any.whl", hash = "sha256:53863bcac7caf8d2ed85bd20312ea5dcfc22226800f6d6881f232d861db5a8f0"}, + {file = "identify-2.6.1.tar.gz", hash = "sha256:91478c5fb7c3aac5ff7bf9b4344f803843dc586832d5f110d672b19aa1984c98"}, ] [package.extras] @@ -345,24 +708,29 @@ license = ["ukkonen"] [[package]] name = "idna" -version = "3.4" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" +groups = ["main"] files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "iniconfig" -version = "2.0.0" +version = "2.1.0" description = "brain-dead simple config-ini parsing" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, + {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, + {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, ] [[package]] @@ -371,6 +739,7 @@ version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, @@ -395,20 +764,127 @@ version = "0.1.2" description = "Markdown URL utilities" optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, ] +[[package]] +name = "multidict" +version = "6.1.0" +description = "multidict implementation" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7"}, + {file = "multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0"}, + {file = "multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753"}, + {file = "multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80"}, + {file = "multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3"}, + {file = "multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133"}, + {file = "multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6"}, + {file = "multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81"}, + {file = "multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:db7457bac39421addd0c8449933ac32d8042aae84a14911a757ae6ca3eef1392"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d094ddec350a2fb899fec68d8353c78233debde9b7d8b4beeafa70825f1c281a"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5845c1fd4866bb5dd3125d89b90e57ed3138241540897de748cdf19de8a2fca2"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9079dfc6a70abe341f521f78405b8949f96db48da98aeb43f9907f342f627cdc"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3914f5aaa0f36d5d60e8ece6a308ee1c9784cd75ec8151062614657a114c4478"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c08be4f460903e5a9d0f76818db3250f12e9c344e79314d1d570fc69d7f4eae4"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d093be959277cb7dee84b801eb1af388b6ad3ca6a6b6bf1ed7585895789d027d"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3702ea6872c5a2a4eeefa6ffd36b042e9773f05b1f37ae3ef7264b1163c2dcf6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2090f6a85cafc5b2db085124d752757c9d251548cedabe9bd31afe6363e0aff2"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f67f217af4b1ff66c68a87318012de788dd95fcfeb24cc889011f4e1c7454dfd"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:189f652a87e876098bbc67b4da1049afb5f5dfbaa310dd67c594b01c10388db6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:6bb5992037f7a9eff7991ebe4273ea7f51f1c1c511e6a2ce511d0e7bdb754492"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f4c2b9e770c4e393876e35a7046879d195cd123b4f116d299d442b335bcd"}, + {file = "multidict-6.1.0-cp38-cp38-win32.whl", hash = "sha256:e27bbb6d14416713a8bd7aaa1313c0fc8d44ee48d74497a0ff4c3a1b6ccb5167"}, + {file = "multidict-6.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:22f3105d4fb15c8f57ff3959a58fcab6ce36814486500cd7485651230ad4d4ef"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43"}, + {file = "multidict-6.1.0-cp39-cp39-win32.whl", hash = "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada"}, + {file = "multidict-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a"}, + {file = "multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506"}, + {file = "multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.11\""} + [[package]] name = "mwoauth" -version = "0.3.8" +version = "0.4.0" description = "A generic MediaWiki OAuth handshake helper." optional = false python-versions = "*" +groups = ["main"] files = [ - {file = "mwoauth-0.3.8-py3-none-any.whl", hash = "sha256:0fe65bc42aa78f29da33df4c851d12e3b6c41820772bb51b18945f7ea710dca2"}, - {file = "mwoauth-0.3.8.tar.gz", hash = "sha256:08daf4edabaa0f95a845f98e5707de7316a8383a9625f20ae768b035991c36ac"}, + {file = "mwoauth-0.4.0-py3-none-any.whl", hash = "sha256:fed9bc7d6bbabb5f691b918af0ac844e13c9b75d5fa51a898f36d54d798b5fe1"}, + {file = "mwoauth-0.4.0.tar.gz", hash = "sha256:22e3403e748e70146f8eccc1430fe542c9f9c4ff677eff424a52e644f6d8f7c5"}, ] [package.dependencies] @@ -416,91 +892,104 @@ oauthlib = "*" PyJWT = ">=1.0.1" requests = "*" requests-oauthlib = "*" -six = "*" [package.extras] flask = ["flask"] [[package]] name = "mypy" -version = "1.4.0" +version = "1.14.1" description = "Optional static typing for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "mypy-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3af348e0925a59213244f28c7c0c3a2c2088b4ba2fe9d6c8d4fbb0aba0b7d05"}, - {file = "mypy-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0b2e0da7ff9dd8d2066d093d35a169305fc4e38db378281fce096768a3dbdbf"}, - {file = "mypy-1.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210fe0f39ec5be45dd9d0de253cb79245f0a6f27631d62e0c9c7988be7152965"}, - {file = "mypy-1.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f7a5971490fd4a5a436e143105a1f78fa8b3fe95b30fff2a77542b4f3227a01f"}, - {file = "mypy-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:50f65f0e9985f1e50040e603baebab83efed9eb37e15a22a4246fa7cd660f981"}, - {file = "mypy-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b1b5c875fcf3e7217a3de7f708166f641ca154b589664c44a6fd6d9f17d9e7e"}, - {file = "mypy-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b4c734d947e761c7ceb1f09a98359dd5666460acbc39f7d0a6b6beec373c5840"}, - {file = "mypy-1.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5984a8d13d35624e3b235a793c814433d810acba9eeefe665cdfed3d08bc3af"}, - {file = "mypy-1.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0f98973e39e4a98709546a9afd82e1ffcc50c6ec9ce6f7870f33ebbf0bd4f26d"}, - {file = "mypy-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:19d42b08c7532d736a7e0fb29525855e355fa51fd6aef4f9bbc80749ff64b1a2"}, - {file = "mypy-1.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6ba9a69172abaa73910643744d3848877d6aac4a20c41742027dcfd8d78f05d9"}, - {file = "mypy-1.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a34eed094c16cad0f6b0d889811592c7a9b7acf10d10a7356349e325d8704b4f"}, - {file = "mypy-1.4.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:53c2a1fed81e05ded10a4557fe12bae05b9ecf9153f162c662a71d924d504135"}, - {file = "mypy-1.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bba57b4d2328740749f676807fcf3036e9de723530781405cc5a5e41fc6e20de"}, - {file = "mypy-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:653863c75f0dbb687d92eb0d4bd9fe7047d096987ecac93bb7b1bc336de48ebd"}, - {file = "mypy-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7461469e163f87a087a5e7aa224102a30f037c11a096a0ceeb721cb0dce274c8"}, - {file = "mypy-1.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cf0ca95e4b8adeaf07815a78b4096b65adf64ea7871b39a2116c19497fcd0dd"}, - {file = "mypy-1.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:94a81b9354545123feb1a99b960faeff9e1fa204fce47e0042335b473d71530d"}, - {file = "mypy-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:67242d5b28ed0fa88edd8f880aed24da481929467fdbca6487167cb5e3fd31ff"}, - {file = "mypy-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3f2b353eebef669529d9bd5ae3566905a685ae98b3af3aad7476d0d519714758"}, - {file = "mypy-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:62bf18d97c6b089f77f0067b4e321db089d8520cdeefc6ae3ec0f873621c22e5"}, - {file = "mypy-1.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca33ab70a4aaa75bb01086a0b04f0ba8441e51e06fc57e28585176b08cad533b"}, - {file = "mypy-1.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5a0ee54c2cb0f957f8a6f41794d68f1a7e32b9968675ade5846f538504856d42"}, - {file = "mypy-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:6c34d43e3d54ad05024576aef28081d9d0580f6fa7f131255f54020eb12f5352"}, - {file = "mypy-1.4.0-py3-none-any.whl", hash = "sha256:f051ca656be0c179c735a4c3193f307d34c92fdc4908d44fd4516fbe8b10567d"}, - {file = "mypy-1.4.0.tar.gz", hash = "sha256:de1e7e68148a213036276d1f5303b3836ad9a774188961eb2684eddff593b042"}, + {file = "mypy-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52686e37cf13d559f668aa398dd7ddf1f92c5d613e4f8cb262be2fb4fedb0fcb"}, + {file = "mypy-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fb545ca340537d4b45d3eecdb3def05e913299ca72c290326be19b3804b39c0"}, + {file = "mypy-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90716d8b2d1f4cd503309788e51366f07c56635a3309b0f6a32547eaaa36a64d"}, + {file = "mypy-1.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ae753f5c9fef278bcf12e1a564351764f2a6da579d4a81347e1d5a15819997b"}, + {file = "mypy-1.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e0fe0f5feaafcb04505bcf439e991c6d8f1bf8b15f12b05feeed96e9e7bf1427"}, + {file = "mypy-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:7d54bd85b925e501c555a3227f3ec0cfc54ee8b6930bd6141ec872d1c572f81f"}, + {file = "mypy-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f995e511de847791c3b11ed90084a7a0aafdc074ab88c5a9711622fe4751138c"}, + {file = "mypy-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d64169ec3b8461311f8ce2fd2eb5d33e2d0f2c7b49116259c51d0d96edee48d1"}, + {file = "mypy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba24549de7b89b6381b91fbc068d798192b1b5201987070319889e93038967a8"}, + {file = "mypy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:183cf0a45457d28ff9d758730cd0210419ac27d4d3f285beda038c9083363b1f"}, + {file = "mypy-1.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f2a0ecc86378f45347f586e4163d1769dd81c5a223d577fe351f26b179e148b1"}, + {file = "mypy-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:ad3301ebebec9e8ee7135d8e3109ca76c23752bac1e717bc84cd3836b4bf3eae"}, + {file = "mypy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:30ff5ef8519bbc2e18b3b54521ec319513a26f1bba19a7582e7b1f58a6e69f14"}, + {file = "mypy-1.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb9f255c18052343c70234907e2e532bc7e55a62565d64536dbc7706a20b78b9"}, + {file = "mypy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b4e3413e0bddea671012b063e27591b953d653209e7a4fa5e48759cda77ca11"}, + {file = "mypy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:553c293b1fbdebb6c3c4030589dab9fafb6dfa768995a453d8a5d3b23784af2e"}, + {file = "mypy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fad79bfe3b65fe6a1efaed97b445c3d37f7be9fdc348bdb2d7cac75579607c89"}, + {file = "mypy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:8fa2220e54d2946e94ab6dbb3ba0a992795bd68b16dc852db33028df2b00191b"}, + {file = "mypy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:92c3ed5afb06c3a8e188cb5da4984cab9ec9a77ba956ee419c68a388b4595255"}, + {file = "mypy-1.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dbec574648b3e25f43d23577309b16534431db4ddc09fda50841f1e34e64ed34"}, + {file = "mypy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8c6d94b16d62eb3e947281aa7347d78236688e21081f11de976376cf010eb31a"}, + {file = "mypy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d4b19b03fdf54f3c5b2fa474c56b4c13c9dbfb9a2db4370ede7ec11a2c5927d9"}, + {file = "mypy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0c911fde686394753fff899c409fd4e16e9b294c24bfd5e1ea4675deae1ac6fd"}, + {file = "mypy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8b21525cb51671219f5307be85f7e646a153e5acc656e5cebf64bfa076c50107"}, + {file = "mypy-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7084fb8f1128c76cd9cf68fe5971b37072598e7c31b2f9f95586b65c741a9d31"}, + {file = "mypy-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f845a00b4f420f693f870eaee5f3e2692fa84cc8514496114649cfa8fd5e2c6"}, + {file = "mypy-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44bf464499f0e3a2d14d58b54674dee25c031703b2ffc35064bd0df2e0fac319"}, + {file = "mypy-1.14.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c99f27732c0b7dc847adb21c9d47ce57eb48fa33a17bc6d7d5c5e9f9e7ae5bac"}, + {file = "mypy-1.14.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:bce23c7377b43602baa0bd22ea3265c49b9ff0b76eb315d6c34721af4cdf1d9b"}, + {file = "mypy-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:8edc07eeade7ebc771ff9cf6b211b9a7d93687ff892150cb5692e4f4272b0837"}, + {file = "mypy-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3888a1816d69f7ab92092f785a462944b3ca16d7c470d564165fe703b0970c35"}, + {file = "mypy-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:46c756a444117c43ee984bd055db99e498bc613a70bbbc120272bd13ca579fbc"}, + {file = "mypy-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:27fc248022907e72abfd8e22ab1f10e903915ff69961174784a3900a8cba9ad9"}, + {file = "mypy-1.14.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:499d6a72fb7e5de92218db961f1a66d5f11783f9ae549d214617edab5d4dbdbb"}, + {file = "mypy-1.14.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:57961db9795eb566dc1d1b4e9139ebc4c6b0cb6e7254ecde69d1552bf7613f60"}, + {file = "mypy-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:07ba89fdcc9451f2ebb02853deb6aaaa3d2239a236669a63ab3801bbf923ef5c"}, + {file = "mypy-1.14.1-py3-none-any.whl", hash = "sha256:b66a60cc4073aeb8ae00057f9c1f64d49e90f918fbcef9a977eb121da8b8f1d1"}, + {file = "mypy-1.14.1.tar.gz", hash = "sha256:7ec88144fe9b510e8475ec2f5f251992690fcf89ccb4500b214b4226abcd32d6"}, ] [package.dependencies] -mypy-extensions = ">=1.0.0" +mypy_extensions = ">=1.0.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=3.10" +typing_extensions = ">=4.6.0" [package.extras] dmypy = ["psutil (>=4.0)"] +faster-cache = ["orjson"] install-types = ["pip"] -python2 = ["typed-ast (>=1.4.0,<2)"] +mypyc = ["setuptools (>=50)"] reports = ["lxml"] [[package]] name = "mypy-extensions" -version = "1.0.0" +version = "1.1.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, + {file = "mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505"}, + {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"}, ] [[package]] name = "nodeenv" -version = "1.8.0" +version = "1.9.1" description = "Node.js virtual environment builder" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["dev"] files = [ - {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, - {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, + {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, + {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, ] -[package.dependencies] -setuptools = "*" - [[package]] name = "oauthlib" -version = "3.2.2" +version = "3.3.1" description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, - {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, + {file = "oauthlib-3.3.1-py3-none-any.whl", hash = "sha256:88119c938d2b8fb88561af5f6ee0eec8cc8d552b7bb1f712743136eb7523b7a1"}, + {file = "oauthlib-3.3.1.tar.gz", hash = "sha256:0f0f8aa759826a193cf66c12ea1af1637f87b9b4622d46e866952bb022e538c9"}, ] [package.extras] @@ -510,53 +999,55 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "packaging" -version = "21.3" +version = "25.0" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, - {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, + {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, + {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, ] -[package.dependencies] -pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" - [[package]] name = "pathspec" -version = "0.11.1" +version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, - {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] [[package]] name = "platformdirs" -version = "3.8.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +version = "4.3.6" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "platformdirs-3.8.0-py3-none-any.whl", hash = "sha256:ca9ed98ce73076ba72e092b23d3c93ea6c4e186b3f1c3dad6edd98ff6ffcca2e"}, - {file = "platformdirs-3.8.0.tar.gz", hash = "sha256:b0cabcb11063d21a0b261d557acb0a9d2126350e63b70cdf7db6347baea456dc"}, + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, ] [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.11.2)"] [[package]] name = "pluggy" -version = "1.2.0" +version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, - {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, ] [package.extras] @@ -569,6 +1060,7 @@ version = "2.21.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "pre_commit-2.21.0-py2.py3-none-any.whl", hash = "sha256:e2f91727039fc39a92f58a588a25b87f936de6567eed4f0e673e0507edc75bad"}, {file = "pre_commit-2.21.0.tar.gz", hash = "sha256:31ef31af7e474a8d8995027fefdfcf509b5c913ff31f2015b4ec4beb26a6f658"}, @@ -581,112 +1073,291 @@ nodeenv = ">=0.11.1" pyyaml = ">=5.1" virtualenv = ">=20.10.0" +[[package]] +name = "propcache" +version = "0.2.0" +description = "Accelerated property cache" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "propcache-0.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c5869b8fd70b81835a6f187c5fdbe67917a04d7e52b6e7cc4e5fe39d55c39d58"}, + {file = "propcache-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:952e0d9d07609d9c5be361f33b0d6d650cd2bae393aabb11d9b719364521984b"}, + {file = "propcache-0.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:33ac8f098df0585c0b53009f039dfd913b38c1d2edafed0cedcc0c32a05aa110"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97e48e8875e6c13909c800fa344cd54cc4b2b0db1d5f911f840458a500fde2c2"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388f3217649d6d59292b722d940d4d2e1e6a7003259eb835724092a1cca0203a"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f571aea50ba5623c308aa146eb650eebf7dbe0fd8c5d946e28343cb3b5aad577"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3dfafb44f7bb35c0c06eda6b2ab4bfd58f02729e7c4045e179f9a861b07c9850"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3ebe9a75be7ab0b7da2464a77bb27febcb4fab46a34f9288f39d74833db7f61"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d2f0d0f976985f85dfb5f3d685697ef769faa6b71993b46b295cdbbd6be8cc37"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a3dc1a4b165283bd865e8f8cb5f0c64c05001e0718ed06250d8cac9bec115b48"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9e0f07b42d2a50c7dd2d8675d50f7343d998c64008f1da5fef888396b7f84630"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e63e3e1e0271f374ed489ff5ee73d4b6e7c60710e1f76af5f0e1a6117cd26394"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:56bb5c98f058a41bb58eead194b4db8c05b088c93d94d5161728515bd52b052b"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7665f04d0c7f26ff8bb534e1c65068409bf4687aa2534faf7104d7182debb336"}, + {file = "propcache-0.2.0-cp310-cp310-win32.whl", hash = "sha256:7cf18abf9764746b9c8704774d8b06714bcb0a63641518a3a89c7f85cc02c2ad"}, + {file = "propcache-0.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:cfac69017ef97db2438efb854edf24f5a29fd09a536ff3a992b75990720cdc99"}, + {file = "propcache-0.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:63f13bf09cc3336eb04a837490b8f332e0db41da66995c9fd1ba04552e516354"}, + {file = "propcache-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608cce1da6f2672a56b24a015b42db4ac612ee709f3d29f27a00c943d9e851de"}, + {file = "propcache-0.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:466c219deee4536fbc83c08d09115249db301550625c7fef1c5563a584c9bc87"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc2db02409338bf36590aa985a461b2c96fce91f8e7e0f14c50c5fcc4f229016"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a6ed8db0a556343d566a5c124ee483ae113acc9a557a807d439bcecc44e7dfbb"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91997d9cb4a325b60d4e3f20967f8eb08dfcb32b22554d5ef78e6fd1dda743a2"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c7dde9e533c0a49d802b4f3f218fa9ad0a1ce21f2c2eb80d5216565202acab4"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffcad6c564fe6b9b8916c1aefbb37a362deebf9394bd2974e9d84232e3e08504"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:97a58a28bcf63284e8b4d7b460cbee1edaab24634e82059c7b8c09e65284f178"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:945db8ee295d3af9dbdbb698cce9bbc5c59b5c3fe328bbc4387f59a8a35f998d"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39e104da444a34830751715f45ef9fc537475ba21b7f1f5b0f4d71a3b60d7fe2"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c5ecca8f9bab618340c8e848d340baf68bcd8ad90a8ecd7a4524a81c1764b3db"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c436130cc779806bdf5d5fae0d848713105472b8566b75ff70048c47d3961c5b"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:191db28dc6dcd29d1a3e063c3be0b40688ed76434622c53a284e5427565bbd9b"}, + {file = "propcache-0.2.0-cp311-cp311-win32.whl", hash = "sha256:5f2564ec89058ee7c7989a7b719115bdfe2a2fb8e7a4543b8d1c0cc4cf6478c1"}, + {file = "propcache-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e2e54267980349b723cff366d1e29b138b9a60fa376664a157a342689553f71"}, + {file = "propcache-0.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ee7606193fb267be4b2e3b32714f2d58cad27217638db98a60f9efb5efeccc2"}, + {file = "propcache-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:91ee8fc02ca52e24bcb77b234f22afc03288e1dafbb1f88fe24db308910c4ac7"}, + {file = "propcache-0.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e900bad2a8456d00a113cad8c13343f3b1f327534e3589acc2219729237a2e8"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f52a68c21363c45297aca15561812d542f8fc683c85201df0bebe209e349f793"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e41d67757ff4fbc8ef2af99b338bfb955010444b92929e9e55a6d4dcc3c4f09"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a64e32f8bd94c105cc27f42d3b658902b5bcc947ece3c8fe7bc1b05982f60e89"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55346705687dbd7ef0d77883ab4f6fabc48232f587925bdaf95219bae072491e"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00181262b17e517df2cd85656fcd6b4e70946fe62cd625b9d74ac9977b64d8d9"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6994984550eaf25dd7fc7bd1b700ff45c894149341725bb4edc67f0ffa94efa4"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:56295eb1e5f3aecd516d91b00cfd8bf3a13991de5a479df9e27dd569ea23959c"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:439e76255daa0f8151d3cb325f6dd4a3e93043e6403e6491813bcaaaa8733887"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f6475a1b2ecb310c98c28d271a30df74f9dd436ee46d09236a6b750a7599ce57"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3444cdba6628accf384e349014084b1cacd866fbb88433cd9d279d90a54e0b23"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4a9d9b4d0a9b38d1c391bb4ad24aa65f306c6f01b512e10a8a34a2dc5675d348"}, + {file = "propcache-0.2.0-cp312-cp312-win32.whl", hash = "sha256:69d3a98eebae99a420d4b28756c8ce6ea5a29291baf2dc9ff9414b42676f61d5"}, + {file = "propcache-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:ad9c9b99b05f163109466638bd30ada1722abb01bbb85c739c50b6dc11f92dc3"}, + {file = "propcache-0.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ecddc221a077a8132cf7c747d5352a15ed763b674c0448d811f408bf803d9ad7"}, + {file = "propcache-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0e53cb83fdd61cbd67202735e6a6687a7b491c8742dfc39c9e01e80354956763"}, + {file = "propcache-0.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92fe151145a990c22cbccf9ae15cae8ae9eddabfc949a219c9f667877e40853d"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a21ef516d36909931a2967621eecb256018aeb11fc48656e3257e73e2e247a"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f88a4095e913f98988f5b338c1d4d5d07dbb0b6bad19892fd447484e483ba6b"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a5b3bb545ead161be780ee85a2b54fdf7092815995661947812dde94a40f6fb"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67aeb72e0f482709991aa91345a831d0b707d16b0257e8ef88a2ad246a7280bf"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c997f8c44ec9b9b0bcbf2d422cc00a1d9b9c681f56efa6ca149a941e5560da2"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a66df3d4992bc1d725b9aa803e8c5a66c010c65c741ad901e260ece77f58d2f"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3ebbcf2a07621f29638799828b8d8668c421bfb94c6cb04269130d8de4fb7136"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1235c01ddaa80da8235741e80815ce381c5267f96cc49b1477fdcf8c047ef325"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3947483a381259c06921612550867b37d22e1df6d6d7e8361264b6d037595f44"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d5bed7f9805cc29c780f3aee05de3262ee7ce1f47083cfe9f77471e9d6777e83"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4a91d44379f45f5e540971d41e4626dacd7f01004826a18cb048e7da7e96544"}, + {file = "propcache-0.2.0-cp313-cp313-win32.whl", hash = "sha256:f902804113e032e2cdf8c71015651c97af6418363bea8d78dc0911d56c335032"}, + {file = "propcache-0.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:8f188cfcc64fb1266f4684206c9de0e80f54622c3f22a910cbd200478aeae61e"}, + {file = "propcache-0.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:53d1bd3f979ed529f0805dd35ddaca330f80a9a6d90bc0121d2ff398f8ed8861"}, + {file = "propcache-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:83928404adf8fb3d26793665633ea79b7361efa0287dfbd372a7e74311d51ee6"}, + {file = "propcache-0.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:77a86c261679ea5f3896ec060be9dc8e365788248cc1e049632a1be682442063"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:218db2a3c297a3768c11a34812e63b3ac1c3234c3a086def9c0fee50d35add1f"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7735e82e3498c27bcb2d17cb65d62c14f1100b71723b68362872bca7d0913d90"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:20a617c776f520c3875cf4511e0d1db847a076d720714ae35ffe0df3e440be68"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67b69535c870670c9f9b14a75d28baa32221d06f6b6fa6f77a0a13c5a7b0a5b9"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4569158070180c3855e9c0791c56be3ceeb192defa2cdf6a3f39e54319e56b89"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:db47514ffdbd91ccdc7e6f8407aac4ee94cc871b15b577c1c324236b013ddd04"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:2a60ad3e2553a74168d275a0ef35e8c0a965448ffbc3b300ab3a5bb9956c2162"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:662dd62358bdeaca0aee5761de8727cfd6861432e3bb828dc2a693aa0471a563"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:25a1f88b471b3bc911d18b935ecb7115dff3a192b6fef46f0bfaf71ff4f12418"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:f60f0ac7005b9f5a6091009b09a419ace1610e163fa5deaba5ce3484341840e7"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:74acd6e291f885678631b7ebc85d2d4aec458dd849b8c841b57ef04047833bed"}, + {file = "propcache-0.2.0-cp38-cp38-win32.whl", hash = "sha256:d9b6ddac6408194e934002a69bcaadbc88c10b5f38fb9307779d1c629181815d"}, + {file = "propcache-0.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:676135dcf3262c9c5081cc8f19ad55c8a64e3f7282a21266d05544450bffc3a5"}, + {file = "propcache-0.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:25c8d773a62ce0451b020c7b29a35cfbc05de8b291163a7a0f3b7904f27253e6"}, + {file = "propcache-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:375a12d7556d462dc64d70475a9ee5982465fbb3d2b364f16b86ba9135793638"}, + {file = "propcache-0.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1ec43d76b9677637a89d6ab86e1fef70d739217fefa208c65352ecf0282be957"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f45eec587dafd4b2d41ac189c2156461ebd0c1082d2fe7013571598abb8505d1"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc092ba439d91df90aea38168e11f75c655880c12782facf5cf9c00f3d42b562"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa1076244f54bb76e65e22cb6910365779d5c3d71d1f18b275f1dfc7b0d71b4d"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:682a7c79a2fbf40f5dbb1eb6bfe2cd865376deeac65acf9beb607505dced9e12"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e40876731f99b6f3c897b66b803c9e1c07a989b366c6b5b475fafd1f7ba3fb8"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:363ea8cd3c5cb6679f1c2f5f1f9669587361c062e4899fce56758efa928728f8"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:140fbf08ab3588b3468932974a9331aff43c0ab8a2ec2c608b6d7d1756dbb6cb"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e70fac33e8b4ac63dfc4c956fd7d85a0b1139adcfc0d964ce288b7c527537fea"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b33d7a286c0dc1a15f5fc864cc48ae92a846df287ceac2dd499926c3801054a6"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:f6d5749fdd33d90e34c2efb174c7e236829147a2713334d708746e94c4bde40d"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22aa8f2272d81d9317ff5756bb108021a056805ce63dd3630e27d042c8092798"}, + {file = "propcache-0.2.0-cp39-cp39-win32.whl", hash = "sha256:73e4b40ea0eda421b115248d7e79b59214411109a5bc47d0d48e4c73e3b8fcf9"}, + {file = "propcache-0.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:9517d5e9e0731957468c29dbfd0f976736a0e55afaea843726e887f36fe017df"}, + {file = "propcache-0.2.0-py3-none-any.whl", hash = "sha256:2ccc28197af5313706511fab3a8b66dcd6da067a1331372c82ea1cb74285e036"}, + {file = "propcache-0.2.0.tar.gz", hash = "sha256:df81779732feb9d01e5d513fad0122efb3d53bbc75f61b2a4f29a020bc985e70"}, +] + [[package]] name = "pydantic" -version = "1.10.9" -description = "Data validation and settings management using python type hints" +version = "2.10.6" +description = "Data validation using Python type hints" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "pydantic-1.10.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e692dec4a40bfb40ca530e07805b1208c1de071a18d26af4a2a0d79015b352ca"}, - {file = "pydantic-1.10.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c52eb595db83e189419bf337b59154bdcca642ee4b2a09e5d7797e41ace783f"}, - {file = "pydantic-1.10.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:939328fd539b8d0edf244327398a667b6b140afd3bf7e347cf9813c736211896"}, - {file = "pydantic-1.10.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b48d3d634bca23b172f47f2335c617d3fcb4b3ba18481c96b7943a4c634f5c8d"}, - {file = "pydantic-1.10.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f0b7628fb8efe60fe66fd4adadd7ad2304014770cdc1f4934db41fe46cc8825f"}, - {file = "pydantic-1.10.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e1aa5c2410769ca28aa9a7841b80d9d9a1c5f223928ca8bec7e7c9a34d26b1d4"}, - {file = "pydantic-1.10.9-cp310-cp310-win_amd64.whl", hash = "sha256:eec39224b2b2e861259d6f3c8b6290d4e0fbdce147adb797484a42278a1a486f"}, - {file = "pydantic-1.10.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d111a21bbbfd85c17248130deac02bbd9b5e20b303338e0dbe0faa78330e37e0"}, - {file = "pydantic-1.10.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e9aec8627a1a6823fc62fb96480abe3eb10168fd0d859ee3d3b395105ae19a7"}, - {file = "pydantic-1.10.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07293ab08e7b4d3c9d7de4949a0ea571f11e4557d19ea24dd3ae0c524c0c334d"}, - {file = "pydantic-1.10.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ee829b86ce984261d99ff2fd6e88f2230068d96c2a582f29583ed602ef3fc2c"}, - {file = "pydantic-1.10.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4b466a23009ff5cdd7076eb56aca537c745ca491293cc38e72bf1e0e00de5b91"}, - {file = "pydantic-1.10.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7847ca62e581e6088d9000f3c497267868ca2fa89432714e21a4fb33a04d52e8"}, - {file = "pydantic-1.10.9-cp311-cp311-win_amd64.whl", hash = "sha256:7845b31959468bc5b78d7b95ec52fe5be32b55d0d09983a877cca6aedc51068f"}, - {file = "pydantic-1.10.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:517a681919bf880ce1dac7e5bc0c3af1e58ba118fd774da2ffcd93c5f96eaece"}, - {file = "pydantic-1.10.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67195274fd27780f15c4c372f4ba9a5c02dad6d50647b917b6a92bf00b3d301a"}, - {file = "pydantic-1.10.9-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2196c06484da2b3fded1ab6dbe182bdabeb09f6318b7fdc412609ee2b564c49a"}, - {file = "pydantic-1.10.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6257bb45ad78abacda13f15bde5886efd6bf549dd71085e64b8dcf9919c38b60"}, - {file = "pydantic-1.10.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3283b574b01e8dbc982080d8287c968489d25329a463b29a90d4157de4f2baaf"}, - {file = "pydantic-1.10.9-cp37-cp37m-win_amd64.whl", hash = "sha256:5f8bbaf4013b9a50e8100333cc4e3fa2f81214033e05ac5aa44fa24a98670a29"}, - {file = "pydantic-1.10.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9cd67fb763248cbe38f0593cd8611bfe4b8ad82acb3bdf2b0898c23415a1f82"}, - {file = "pydantic-1.10.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f50e1764ce9353be67267e7fd0da08349397c7db17a562ad036aa7c8f4adfdb6"}, - {file = "pydantic-1.10.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73ef93e5e1d3c8e83f1ff2e7fdd026d9e063c7e089394869a6e2985696693766"}, - {file = "pydantic-1.10.9-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:128d9453d92e6e81e881dd7e2484e08d8b164da5507f62d06ceecf84bf2e21d3"}, - {file = "pydantic-1.10.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ad428e92ab68798d9326bb3e5515bc927444a3d71a93b4a2ca02a8a5d795c572"}, - {file = "pydantic-1.10.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fab81a92f42d6d525dd47ced310b0c3e10c416bbfae5d59523e63ea22f82b31e"}, - {file = "pydantic-1.10.9-cp38-cp38-win_amd64.whl", hash = "sha256:963671eda0b6ba6926d8fc759e3e10335e1dc1b71ff2a43ed2efd6996634dafb"}, - {file = "pydantic-1.10.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:970b1bdc6243ef663ba5c7e36ac9ab1f2bfecb8ad297c9824b542d41a750b298"}, - {file = "pydantic-1.10.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7e1d5290044f620f80cf1c969c542a5468f3656de47b41aa78100c5baa2b8276"}, - {file = "pydantic-1.10.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83fcff3c7df7adff880622a98022626f4f6dbce6639a88a15a3ce0f96466cb60"}, - {file = "pydantic-1.10.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0da48717dc9495d3a8f215e0d012599db6b8092db02acac5e0d58a65248ec5bc"}, - {file = "pydantic-1.10.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0a2aabdc73c2a5960e87c3ffebca6ccde88665616d1fd6d3db3178ef427b267a"}, - {file = "pydantic-1.10.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9863b9420d99dfa9c064042304868e8ba08e89081428a1c471858aa2af6f57c4"}, - {file = "pydantic-1.10.9-cp39-cp39-win_amd64.whl", hash = "sha256:e7c9900b43ac14110efa977be3da28931ffc74c27e96ee89fbcaaf0b0fe338e1"}, - {file = "pydantic-1.10.9-py3-none-any.whl", hash = "sha256:6cafde02f6699ce4ff643417d1a9223716ec25e228ddc3b436fe7e2d25a1f305"}, - {file = "pydantic-1.10.9.tar.gz", hash = "sha256:95c70da2cd3b6ddf3b9645ecaa8d98f3d80c606624b6d245558d202cd23ea3be"}, + {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"}, + {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"}, ] [package.dependencies] -typing-extensions = ">=4.2.0" +annotated-types = ">=0.6.0" +pydantic-core = "2.27.2" +typing-extensions = ">=4.12.2" [package.extras] -dotenv = ["python-dotenv (>=0.10.4)"] -email = ["email-validator (>=1.0.3)"] +email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows\""] [[package]] -name = "pygments" -version = "2.15.1" -description = "Pygments is a syntax highlighting package written in Python." +name = "pydantic-core" +version = "2.27.2" +description = "Core functionality for Pydantic validation and serialization" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, - {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, + {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"}, + {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236"}, + {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962"}, + {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9"}, + {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af"}, + {file = "pydantic_core-2.27.2-cp310-cp310-win32.whl", hash = "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4"}, + {file = "pydantic_core-2.27.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31"}, + {file = "pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc"}, + {file = "pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d"}, + {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b"}, + {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474"}, + {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6"}, + {file = "pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c"}, + {file = "pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc"}, + {file = "pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4"}, + {file = "pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0"}, + {file = "pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4"}, + {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3"}, + {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4"}, + {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57"}, + {file = "pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc"}, + {file = "pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9"}, + {file = "pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b"}, + {file = "pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b"}, + {file = "pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4"}, + {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27"}, + {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee"}, + {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1"}, + {file = "pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130"}, + {file = "pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee"}, + {file = "pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b"}, + {file = "pydantic_core-2.27.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d3e8d504bdd3f10835468f29008d72fc8359d95c9c415ce6e767203db6127506"}, + {file = "pydantic_core-2.27.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:521eb9b7f036c9b6187f0b47318ab0d7ca14bd87f776240b90b21c1f4f149320"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85210c4d99a0114f5a9481b44560d7d1e35e32cc5634c656bc48e590b669b145"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d716e2e30c6f140d7560ef1538953a5cd1a87264c737643d481f2779fc247fe1"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f66d89ba397d92f840f8654756196d93804278457b5fbede59598a1f9f90b228"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:669e193c1c576a58f132e3158f9dfa9662969edb1a250c54d8fa52590045f046"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdbe7629b996647b99c01b37f11170a57ae675375b14b8c13b8518b8320ced5"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d262606bf386a5ba0b0af3b97f37c83d7011439e3dc1a9298f21efb292e42f1a"}, + {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cabb9bcb7e0d97f74df8646f34fc76fbf793b7f6dc2438517d7a9e50eee4f14d"}, + {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:d2d63f1215638d28221f664596b1ccb3944f6e25dd18cd3b86b0a4c408d5ebb9"}, + {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bca101c00bff0adb45a833f8451b9105d9df18accb8743b08107d7ada14bd7da"}, + {file = "pydantic_core-2.27.2-cp38-cp38-win32.whl", hash = "sha256:f6f8e111843bbb0dee4cb6594cdc73e79b3329b526037ec242a3e49012495b3b"}, + {file = "pydantic_core-2.27.2-cp38-cp38-win_amd64.whl", hash = "sha256:fd1aea04935a508f62e0d0ef1f5ae968774a32afc306fb8545e06f5ff5cdf3ad"}, + {file = "pydantic_core-2.27.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c10eb4f1659290b523af58fa7cffb452a61ad6ae5613404519aee4bfbf1df993"}, + {file = "pydantic_core-2.27.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef592d4bad47296fb11f96cd7dc898b92e795032b4894dfb4076cfccd43a9308"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c61709a844acc6bf0b7dce7daae75195a10aac96a596ea1b776996414791ede4"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c5f762659e47fdb7b16956c71598292f60a03aa92f8b6351504359dbdba6cf"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c9775e339e42e79ec99c441d9730fccf07414af63eac2f0e48e08fd38a64d76"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57762139821c31847cfb2df63c12f725788bd9f04bc2fb392790959b8f70f118"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d1e85068e818c73e048fe28cfc769040bb1f475524f4745a5dc621f75ac7630"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:097830ed52fd9e427942ff3b9bc17fab52913b2f50f2880dc4a5611446606a54"}, + {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:044a50963a614ecfae59bb1eaf7ea7efc4bc62f49ed594e18fa1e5d953c40e9f"}, + {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:4e0b4220ba5b40d727c7f879eac379b822eee5d8fff418e9d3381ee45b3b0362"}, + {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5e4f4bb20d75e9325cc9696c6802657b58bc1dbbe3022f32cc2b2b632c3fbb96"}, + {file = "pydantic_core-2.27.2-cp39-cp39-win32.whl", hash = "sha256:cca63613e90d001b9f2f9a9ceb276c308bfa2a43fafb75c8031c4f66039e8c6e"}, + {file = "pydantic_core-2.27.2-cp39-cp39-win_amd64.whl", hash = "sha256:77d1bca19b0f7021b3a982e6f903dcd5b2b06076def36a652e3907f596e29f67"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c33939a82924da9ed65dab5a65d427205a73181d8098e79b6b426bdf8ad4e656"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:00bad2484fa6bda1e216e7345a798bd37c68fb2d97558edd584942aa41b7d278"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c817e2b40aba42bac6f457498dacabc568c3b7a986fc9ba7c8d9d260b71485fb"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:251136cdad0cb722e93732cb45ca5299fb56e1344a833640bf93b2803f8d1bfd"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d2088237af596f0a524d3afc39ab3b036e8adb054ee57cbb1dcf8e09da5b29cc"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d4041c0b966a84b4ae7a09832eb691a35aec90910cd2dbe7a208de59be77965b"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:8083d4e875ebe0b864ffef72a4304827015cff328a1be6e22cc850753bfb122b"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f141ee28a0ad2123b6611b6ceff018039df17f32ada8b534e6aa039545a3efb2"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35"}, + {file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"}, ] -[package.extras] -plugins = ["importlib-metadata"] +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] -name = "pyjwt" -version = "2.8.0" -description = "JSON Web Token implementation in Python" +name = "pygments" +version = "2.19.2" +description = "Pygments is a syntax highlighting package written in Python." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["main", "dev"] files = [ - {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, - {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, + {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, + {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, ] [package.extras] -crypto = ["cryptography (>=3.4.0)"] -dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] -docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] -tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] +windows-terminal = ["colorama (>=0.4.6)"] [[package]] -name = "pyparsing" -version = "3.1.0" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" +name = "pyjwt" +version = "2.9.0" +description = "JSON Web Token implementation in Python" optional = false -python-versions = ">=3.6.8" +python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "pyparsing-3.1.0-py3-none-any.whl", hash = "sha256:d554a96d1a7d3ddaf7183104485bc19fd80543ad6ac5bdb6426719d766fb06c1"}, - {file = "pyparsing-3.1.0.tar.gz", hash = "sha256:edb662d6fe322d6e990b1594b5feaeadf806803359e3d4d42f11e295e588f0ea"}, + {file = "PyJWT-2.9.0-py3-none-any.whl", hash = "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850"}, + {file = "pyjwt-2.9.0.tar.gz", hash = "sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c"}, ] [package.extras] -diagrams = ["jinja2", "railroad-diagrams"] +crypto = ["cryptography (>=3.4.0)"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] +tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pytest" -version = "7.3.2" +version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ - {file = "pytest-7.3.2-py3-none-any.whl", hash = "sha256:cdcbd012c9312258922f8cd3f1b62a6580fdced17db6014896053d47cddf9295"}, - {file = "pytest-7.3.2.tar.gz", hash = "sha256:ee990a3cc55ba808b80795a79944756f315c67c12b56abd3ac993a7b8c17030b"}, + {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, + {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, ] [package.dependencies] @@ -702,67 +1373,82 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no [[package]] name = "pyyaml" -version = "6.0" +version = "6.0.2" description = "YAML parser and emitter for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, - {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, - {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] [[package]] name = "requests" -version = "2.31.0" +version = "2.32.4" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c"}, + {file = "requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422"}, ] [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" +charset_normalizer = ">=2,<4" idna = ">=2.5,<4" urllib3 = ">=1.21.1,<3" @@ -772,13 +1458,14 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "requests-oauthlib" -version = "1.3.1" +version = "2.0.0" description = "OAuthlib authentication support for Requests." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.4" +groups = ["main"] files = [ - {file = "requests-oauthlib-1.3.1.tar.gz", hash = "sha256:75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a"}, - {file = "requests_oauthlib-1.3.1-py2.py3-none-any.whl", hash = "sha256:2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5"}, + {file = "requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9"}, + {file = "requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36"}, ] [package.dependencies] @@ -790,92 +1477,31 @@ rsa = ["oauthlib[signedtoken] (>=3.0.0)"] [[package]] name = "rich" -version = "13.4.2" +version = "13.9.4" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false -python-versions = ">=3.7.0" +python-versions = ">=3.8.0" +groups = ["main", "dev"] files = [ - {file = "rich-13.4.2-py3-none-any.whl", hash = "sha256:8f87bc7ee54675732fa66a05ebfe489e27264caeeff3728c945d25971b6485ec"}, - {file = "rich-13.4.2.tar.gz", hash = "sha256:d653d6bccede5844304c605d5aac802c7cf9621efd700b46c7ec2b51ea914898"}, + {file = "rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"}, + {file = "rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098"}, ] [package.dependencies] markdown-it-py = ">=2.2.0" pygments = ">=2.13.0,<3.0.0" -typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.9\""} +typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.11\""} [package.extras] jupyter = ["ipywidgets (>=7.5.1,<9)"] -[[package]] -name = "ruamel-yaml" -version = "0.17.32" -description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" -optional = false -python-versions = ">=3" -files = [ - {file = "ruamel.yaml-0.17.32-py3-none-any.whl", hash = "sha256:23cd2ed620231677564646b0c6a89d138b6822a0d78656df7abda5879ec4f447"}, - {file = "ruamel.yaml-0.17.32.tar.gz", hash = "sha256:ec939063761914e14542972a5cba6d33c23b0859ab6342f61cf070cfc600efc2"}, -] - -[package.dependencies] -"ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.12\""} - -[package.extras] -docs = ["ryd"] -jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] - -[[package]] -name = "ruamel-yaml-clib" -version = "0.2.7" -description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" -optional = false -python-versions = ">=3.5" -files = [ - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d5859983f26d8cd7bb5c287ef452e8aacc86501487634573d260968f753e1d71"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:debc87a9516b237d0466a711b18b6ebeb17ba9f391eb7f91c649c5c4ec5006c7"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:df5828871e6648db72d1c19b4bd24819b80a755c4541d3409f0f7acd0f335c80"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:efa08d63ef03d079dcae1dfe334f6c8847ba8b645d08df286358b1f5293d24ab"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-win32.whl", hash = "sha256:763d65baa3b952479c4e972669f679fe490eee058d5aa85da483ebae2009d231"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:d000f258cf42fec2b1bbf2863c61d7b8918d31ffee905da62dede869254d3b8a"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:045e0626baf1c52e5527bd5db361bc83180faaba2ff586e763d3d5982a876a9e"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-macosx_12_6_arm64.whl", hash = "sha256:721bc4ba4525f53f6a611ec0967bdcee61b31df5a56801281027a3a6d1c2daf5"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:41d0f1fa4c6830176eef5b276af04c89320ea616655d01327d5ce65e50575c94"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-win32.whl", hash = "sha256:f6d3d39611ac2e4f62c3128a9eed45f19a6608670c5a2f4f07f24e8de3441d38"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:da538167284de58a52109a9b89b8f6a53ff8437dd6dc26d33b57bf6699153122"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4b3a93bb9bc662fc1f99c5c3ea8e623d8b23ad22f861eb6fce9377ac07ad6072"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-macosx_12_0_arm64.whl", hash = "sha256:a234a20ae07e8469da311e182e70ef6b199d0fbeb6c6cc2901204dd87fb867e8"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:15910ef4f3e537eea7fe45f8a5d19997479940d9196f357152a09031c5be59f3"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:370445fd795706fd291ab00c9df38a0caed0f17a6fb46b0f607668ecb16ce763"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-win32.whl", hash = "sha256:ecdf1a604009bd35c674b9225a8fa609e0282d9b896c03dd441a91e5f53b534e"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-win_amd64.whl", hash = "sha256:f34019dced51047d6f70cb9383b2ae2853b7fc4dce65129a5acd49f4f9256646"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2aa261c29a5545adfef9296b7e33941f46aa5bbd21164228e833412af4c9c75f"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f01da5790e95815eb5a8a138508c01c758e5f5bc0ce4286c4f7028b8dd7ac3d0"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:40d030e2329ce5286d6b231b8726959ebbe0404c92f0a578c0e2482182e38282"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c3ca1fbba4ae962521e5eb66d72998b51f0f4d0f608d3c0347a48e1af262efa7"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-win32.whl", hash = "sha256:7bdb4c06b063f6fd55e472e201317a3bb6cdeeee5d5a38512ea5c01e1acbdd93"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:be2a7ad8fd8f7442b24323d24ba0b56c51219513cfa45b9ada3b87b76c374d4b"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91a789b4aa0097b78c93e3dc4b40040ba55bef518f84a40d4442f713b4094acb"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:99e77daab5d13a48a4054803d052ff40780278240a902b880dd37a51ba01a307"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:3243f48ecd450eddadc2d11b5feb08aca941b5cd98c9b1db14b2fd128be8c697"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8831a2cedcd0f0927f788c5bdf6567d9dc9cc235646a434986a852af1cb54b4b"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-win32.whl", hash = "sha256:3110a99e0f94a4a3470ff67fc20d3f96c25b13d24c6980ff841e82bafe827cac"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:92460ce908546ab69770b2e576e4f99fbb4ce6ab4b245345a3869a0a0410488f"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5bc0667c1eb8f83a3752b71b9c4ba55ef7c7058ae57022dd9b29065186a113d9"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:4a4d8d417868d68b979076a9be6a38c676eca060785abaa6709c7b31593c35d1"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bf9a6bc4a0221538b1a7de3ed7bca4c93c02346853f44e1cd764be0023cd3640"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:a7b301ff08055d73223058b5c46c55638917f04d21577c95e00e0c4d79201a6b"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-win32.whl", hash = "sha256:d5e51e2901ec2366b79f16c2299a03e74ba4531ddcfacc1416639c557aef0ad8"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:184faeaec61dbaa3cace407cffc5819f7b977e75360e8d5ca19461cd851a5fc5"}, - {file = "ruamel.yaml.clib-0.2.7.tar.gz", hash = "sha256:1f08fd5a2bea9c4180db71678e850b995d2a5f4537be0e94557668cf0f5f9497"}, -] - [[package]] name = "ruff" version = "0.0.263" description = "An extremely fast Python linter, written in Rust." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "ruff-0.0.263-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:ee6c7a77f142c427fa73e1f5f603fc1a39413a36fe6966ed0fc55e97f6921d9c"}, {file = "ruff-0.0.263-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:c3b7d4b365207f3e4c40d235127091478e595b31e35b6cd57d940920cdfae68b"}, @@ -897,261 +1523,399 @@ files = [ ] [[package]] -name = "safety" -version = "2.3.5" -description = "Checks installed dependencies for known vulnerabilities and licenses." -optional = false -python-versions = "*" -files = [ - {file = "safety-2.3.5-py3-none-any.whl", hash = "sha256:2227fcac1b22b53c1615af78872b48348661691450aa25d6704a5504dbd1f7e2"}, - {file = "safety-2.3.5.tar.gz", hash = "sha256:a60c11f8952f412cbb165d70cb1f673a3b43a2ba9a93ce11f97e6a4de834aa3a"}, -] - -[package.dependencies] -Click = ">=8.0.2" -dparse = ">=0.6.2" -packaging = ">=21.0,<22.0" -requests = "*" -"ruamel.yaml" = ">=0.17.21" -setuptools = ">=19.3" - -[package.extras] -github = ["jinja2 (>=3.1.0)", "pygithub (>=1.43.3)"] -gitlab = ["python-gitlab (>=1.3.0)"] - -[[package]] -name = "setuptools" -version = "68.0.0" -description = "Easily download, build, install, upgrade, and uninstall Python packages" +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ - {file = "setuptools-68.0.0-py3-none-any.whl", hash = "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f"}, - {file = "setuptools-68.0.0.tar.gz", hash = "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235"}, + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, ] -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] - [[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" +name = "starlette" +version = "0.44.0" +description = "The little ASGI library that shines." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, + {file = "starlette-0.44.0-py3-none-any.whl", hash = "sha256:19edeb75844c16dcd4f9dd72f22f9108c1539f3fc9c4c88885654fef64f85aea"}, + {file = "starlette-0.44.0.tar.gz", hash = "sha256:e35166950a3ccccc701962fe0711db0bc14f2ecd37c6f9fe5e3eae0cbaea8715"}, ] -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] +[package.dependencies] +anyio = ">=3.4.0,<5" +typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} + +[package.extras] +full = ["httpx (>=0.27.0,<0.29.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.18)", "pyyaml"] [[package]] name = "tomli" -version = "2.0.1" +version = "2.2.1" description = "A lil' TOML parser" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, + {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, + {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, + {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, + {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, + {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, + {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, + {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, + {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, ] [[package]] name = "types-python-dateutil" -version = "2.8.19.13" +version = "2.9.0.20241206" description = "Typing stubs for python-dateutil" optional = false -python-versions = "*" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "types-python-dateutil-2.8.19.13.tar.gz", hash = "sha256:09a0275f95ee31ce68196710ed2c3d1b9dc42e0b61cc43acc369a42cb939134f"}, - {file = "types_python_dateutil-2.8.19.13-py3-none-any.whl", hash = "sha256:0b0e7c68e7043b0354b26a1e0225cb1baea7abb1b324d02b50e2d08f1221043f"}, + {file = "types_python_dateutil-2.9.0.20241206-py3-none-any.whl", hash = "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53"}, + {file = "types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb"}, ] [[package]] name = "types-requests" -version = "2.31.0.1" +version = "2.32.0.20241016" description = "Typing stubs for requests" optional = false -python-versions = "*" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "types-requests-2.31.0.1.tar.gz", hash = "sha256:3de667cffa123ce698591de0ad7db034a5317457a596eb0b4944e5a9d9e8d1ac"}, - {file = "types_requests-2.31.0.1-py3-none-any.whl", hash = "sha256:afb06ef8f25ba83d59a1d424bd7a5a939082f94b94e90ab5e6116bd2559deaa3"}, + {file = "types-requests-2.32.0.20241016.tar.gz", hash = "sha256:0d9cad2f27515d0e3e3da7134a1b6f28fb97129d86b867f24d9c726452634d95"}, + {file = "types_requests-2.32.0.20241016-py3-none-any.whl", hash = "sha256:4195d62d6d3e043a4eaaf08ff8a62184584d2e8684e9d2aa178c7915a7da3747"}, ] [package.dependencies] -types-urllib3 = "*" - -[[package]] -name = "types-urllib3" -version = "1.26.25.13" -description = "Typing stubs for urllib3" -optional = false -python-versions = "*" -files = [ - {file = "types-urllib3-1.26.25.13.tar.gz", hash = "sha256:3300538c9dc11dad32eae4827ac313f5d986b8b21494801f1bf97a1ac6c03ae5"}, - {file = "types_urllib3-1.26.25.13-py3-none-any.whl", hash = "sha256:5dbd1d2bef14efee43f5318b5d36d805a489f6600252bb53626d4bfafd95e27c"}, -] +urllib3 = ">=2" [[package]] name = "typing-extensions" -version = "4.6.3" -description = "Backported and Experimental Type Hints for Python 3.7+" +version = "4.13.2" +description = "Backported and Experimental Type Hints for Python 3.8+" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["main", "dev"] files = [ - {file = "typing_extensions-4.6.3-py3-none-any.whl", hash = "sha256:88a4153d8505aabbb4e13aacb7c486c2b4a33ca3b3f807914a9b4c844c471c26"}, - {file = "typing_extensions-4.6.3.tar.gz", hash = "sha256:d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5"}, + {file = "typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c"}, + {file = "typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef"}, ] [[package]] name = "ujson" -version = "5.7.0" +version = "5.10.0" description = "Ultra fast JSON encoder and decoder for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "ujson-5.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5eba5e69e4361ac3a311cf44fa71bc619361b6e0626768a494771aacd1c2f09b"}, - {file = "ujson-5.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aae4d9e1b4c7b61780f0a006c897a4a1904f862fdab1abb3ea8f45bd11aa58f3"}, - {file = "ujson-5.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2e43ccdba1cb5c6d3448eadf6fc0dae7be6c77e357a3abc968d1b44e265866d"}, - {file = "ujson-5.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54384ce4920a6d35fa9ea8e580bc6d359e3eb961fa7e43f46c78e3ed162d56ff"}, - {file = "ujson-5.7.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24ad1aa7fc4e4caa41d3d343512ce68e41411fb92adf7f434a4d4b3749dc8f58"}, - {file = "ujson-5.7.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:afff311e9f065a8f03c3753db7011bae7beb73a66189c7ea5fcb0456b7041ea4"}, - {file = "ujson-5.7.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e80f0d03e7e8646fc3d79ed2d875cebd4c83846e129737fdc4c2532dbd43d9e"}, - {file = "ujson-5.7.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:137831d8a0db302fb6828ee21c67ad63ac537bddc4376e1aab1c8573756ee21c"}, - {file = "ujson-5.7.0-cp310-cp310-win32.whl", hash = "sha256:7df3fd35ebc14dafeea031038a99232b32f53fa4c3ecddb8bed132a43eefb8ad"}, - {file = "ujson-5.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:af4639f684f425177d09ae409c07602c4096a6287027469157bfb6f83e01448b"}, - {file = "ujson-5.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9b0f2680ce8a70f77f5d70aaf3f013d53e6af6d7058727a35d8ceb4a71cdd4e9"}, - {file = "ujson-5.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:67a19fd8e7d8cc58a169bea99fed5666023adf707a536d8f7b0a3c51dd498abf"}, - {file = "ujson-5.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6abb8e6d8f1ae72f0ed18287245f5b6d40094e2656d1eab6d99d666361514074"}, - {file = "ujson-5.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8cd622c069368d5074bd93817b31bdb02f8d818e57c29e206f10a1f9c6337dd"}, - {file = "ujson-5.7.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14f9082669f90e18e64792b3fd0bf19f2b15e7fe467534a35ea4b53f3bf4b755"}, - {file = "ujson-5.7.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d7ff6ebb43bc81b057724e89550b13c9a30eda0f29c2f506f8b009895438f5a6"}, - {file = "ujson-5.7.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f7f241488879d91a136b299e0c4ce091996c684a53775e63bb442d1a8e9ae22a"}, - {file = "ujson-5.7.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5593263a7fcfb934107444bcfba9dde8145b282de0ee9f61e285e59a916dda0f"}, - {file = "ujson-5.7.0-cp311-cp311-win32.whl", hash = "sha256:26c2b32b489c393106e9cb68d0a02e1a7b9d05a07429d875c46b94ee8405bdb7"}, - {file = "ujson-5.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:ed24406454bb5a31df18f0a423ae14beb27b28cdfa34f6268e7ebddf23da807e"}, - {file = "ujson-5.7.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:18679484e3bf9926342b1c43a3bd640f93a9eeeba19ef3d21993af7b0c44785d"}, - {file = "ujson-5.7.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ee295761e1c6c30400641f0a20d381633d7622633cdf83a194f3c876a0e4b7e"}, - {file = "ujson-5.7.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b738282e12a05f400b291966630a98d622da0938caa4bc93cf65adb5f4281c60"}, - {file = "ujson-5.7.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00343501dbaa5172e78ef0e37f9ebd08040110e11c12420ff7c1f9f0332d939e"}, - {file = "ujson-5.7.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c0d1f7c3908357ee100aa64c4d1cf91edf99c40ac0069422a4fd5fd23b263263"}, - {file = "ujson-5.7.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a5d2f44331cf04689eafac7a6596c71d6657967c07ac700b0ae1c921178645da"}, - {file = "ujson-5.7.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:16b2254a77b310f118717715259a196662baa6b1f63b1a642d12ab1ff998c3d7"}, - {file = "ujson-5.7.0-cp37-cp37m-win32.whl", hash = "sha256:6faf46fa100b2b89e4db47206cf8a1ffb41542cdd34dde615b2fc2288954f194"}, - {file = "ujson-5.7.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ff0004c3f5a9a6574689a553d1b7819d1a496b4f005a7451f339dc2d9f4cf98c"}, - {file = "ujson-5.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:75204a1dd7ec6158c8db85a2f14a68d2143503f4bafb9a00b63fe09d35762a5e"}, - {file = "ujson-5.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7312731c7826e6c99cdd3ac503cd9acd300598e7a80bcf41f604fee5f49f566c"}, - {file = "ujson-5.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b9dc5a90e2149643df7f23634fe202fed5ebc787a2a1be95cf23632b4d90651"}, - {file = "ujson-5.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6a6961fc48821d84b1198a09516e396d56551e910d489692126e90bf4887d29"}, - {file = "ujson-5.7.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b01a9af52a0d5c46b2c68e3f258fdef2eacaa0ce6ae3e9eb97983f5b1166edb6"}, - {file = "ujson-5.7.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7316d3edeba8a403686cdcad4af737b8415493101e7462a70ff73dd0609eafc"}, - {file = "ujson-5.7.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4ee997799a23227e2319a3f8817ce0b058923dbd31904761b788dc8f53bd3e30"}, - {file = "ujson-5.7.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dda9aa4c33435147262cd2ea87c6b7a1ca83ba9b3933ff7df34e69fee9fced0c"}, - {file = "ujson-5.7.0-cp38-cp38-win32.whl", hash = "sha256:bea8d30e362180aafecabbdcbe0e1f0b32c9fa9e39c38e4af037b9d3ca36f50c"}, - {file = "ujson-5.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:c96e3b872bf883090ddf32cc41957edf819c5336ab0007d0cf3854e61841726d"}, - {file = "ujson-5.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6411aea4c94a8e93c2baac096fbf697af35ba2b2ed410b8b360b3c0957a952d3"}, - {file = "ujson-5.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d3b3499c55911f70d4e074c626acdb79a56f54262c3c83325ffb210fb03e44d"}, - {file = "ujson-5.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:341f891d45dd3814d31764626c55d7ab3fd21af61fbc99d070e9c10c1190680b"}, - {file = "ujson-5.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f242eec917bafdc3f73a1021617db85f9958df80f267db69c76d766058f7b19"}, - {file = "ujson-5.7.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3af9f9f22a67a8c9466a32115d9073c72a33ae627b11de6f592df0ee09b98b6"}, - {file = "ujson-5.7.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4a3d794afbf134df3056a813e5c8a935208cddeae975bd4bc0ef7e89c52f0ce0"}, - {file = "ujson-5.7.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:800bf998e78dae655008dd10b22ca8dc93bdcfcc82f620d754a411592da4bbf2"}, - {file = "ujson-5.7.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b5ac3d5c5825e30b438ea92845380e812a476d6c2a1872b76026f2e9d8060fc2"}, - {file = "ujson-5.7.0-cp39-cp39-win32.whl", hash = "sha256:cd90027e6d93e8982f7d0d23acf88c896d18deff1903dd96140613389b25c0dd"}, - {file = "ujson-5.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:523ee146cdb2122bbd827f4dcc2a8e66607b3f665186bce9e4f78c9710b6d8ab"}, - {file = "ujson-5.7.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e87cec407ec004cf1b04c0ed7219a68c12860123dfb8902ef880d3d87a71c172"}, - {file = "ujson-5.7.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bab10165db6a7994e67001733f7f2caf3400b3e11538409d8756bc9b1c64f7e8"}, - {file = "ujson-5.7.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b522be14a28e6ac1cf818599aeff1004a28b42df4ed4d7bc819887b9dac915fc"}, - {file = "ujson-5.7.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7592f40175c723c032cdbe9fe5165b3b5903604f774ab0849363386e99e1f253"}, - {file = "ujson-5.7.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ed22f9665327a981f288a4f758a432824dc0314e4195a0eaeb0da56a477da94d"}, - {file = "ujson-5.7.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:adf445a49d9a97a5a4c9bb1d652a1528de09dd1c48b29f79f3d66cea9f826bf6"}, - {file = "ujson-5.7.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64772a53f3c4b6122ed930ae145184ebaed38534c60f3d859d8c3f00911eb122"}, - {file = "ujson-5.7.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35209cb2c13fcb9d76d249286105b4897b75a5e7f0efb0c0f4b90f222ce48910"}, - {file = "ujson-5.7.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90712dfc775b2c7a07d4d8e059dd58636bd6ff1776d79857776152e693bddea6"}, - {file = "ujson-5.7.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:0e4e8981c6e7e9e637e637ad8ffe948a09e5434bc5f52ecbb82b4b4cfc092bfb"}, - {file = "ujson-5.7.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:581c945b811a3d67c27566539bfcb9705ea09cb27c4be0002f7a553c8886b817"}, - {file = "ujson-5.7.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d36a807a24c7d44f71686685ae6fbc8793d784bca1adf4c89f5f780b835b6243"}, - {file = "ujson-5.7.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b4257307e3662aa65e2644a277ca68783c5d51190ed9c49efebdd3cbfd5fa44"}, - {file = "ujson-5.7.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea7423d8a2f9e160c5e011119741682414c5b8dce4ae56590a966316a07a4618"}, - {file = "ujson-5.7.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4c592eb91a5968058a561d358d0fef59099ed152cfb3e1cd14eee51a7a93879e"}, - {file = "ujson-5.7.0.tar.gz", hash = "sha256:e788e5d5dcae8f6118ac9b45d0b891a0d55f7ac480eddcb7f07263f2bcf37b23"}, + {file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"}, + {file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22cffecf73391e8abd65ef5f4e4dd523162a3399d5e84faa6aebbf9583df86d6"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26b0e2d2366543c1bb4fbd457446f00b0187a2bddf93148ac2da07a53fe51569"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:caf270c6dba1be7a41125cd1e4fc7ba384bf564650beef0df2dd21a00b7f5770"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a245d59f2ffe750446292b0094244df163c3dc96b3ce152a2c837a44e7cda9d1"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:94a87f6e151c5f483d7d54ceef83b45d3a9cca7a9cb453dbdbb3f5a6f64033f5"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:29b443c4c0a113bcbb792c88bea67b675c7ca3ca80c3474784e08bba01c18d51"}, + {file = "ujson-5.10.0-cp310-cp310-win32.whl", hash = "sha256:c18610b9ccd2874950faf474692deee4223a994251bc0a083c114671b64e6518"}, + {file = "ujson-5.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:924f7318c31874d6bb44d9ee1900167ca32aa9b69389b98ecbde34c1698a250f"}, + {file = "ujson-5.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a5b366812c90e69d0f379a53648be10a5db38f9d4ad212b60af00bd4048d0f00"}, + {file = "ujson-5.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:502bf475781e8167f0f9d0e41cd32879d120a524b22358e7f205294224c71126"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b91b5d0d9d283e085e821651184a647699430705b15bf274c7896f23fe9c9d8"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:129e39af3a6d85b9c26d5577169c21d53821d8cf68e079060602e861c6e5da1b"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f77b74475c462cb8b88680471193064d3e715c7c6074b1c8c412cb526466efe9"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7ec0ca8c415e81aa4123501fee7f761abf4b7f386aad348501a26940beb1860f"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab13a2a9e0b2865a6c6db9271f4b46af1c7476bfd51af1f64585e919b7c07fd4"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:57aaf98b92d72fc70886b5a0e1a1ca52c2320377360341715dd3933a18e827b1"}, + {file = "ujson-5.10.0-cp311-cp311-win32.whl", hash = "sha256:2987713a490ceb27edff77fb184ed09acdc565db700ee852823c3dc3cffe455f"}, + {file = "ujson-5.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:f00ea7e00447918ee0eff2422c4add4c5752b1b60e88fcb3c067d4a21049a720"}, + {file = "ujson-5.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98ba15d8cbc481ce55695beee9f063189dce91a4b08bc1d03e7f0152cd4bbdd5"}, + {file = "ujson-5.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9d2edbf1556e4f56e50fab7d8ff993dbad7f54bac68eacdd27a8f55f433578e"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6627029ae4f52d0e1a2451768c2c37c0c814ffc04f796eb36244cf16b8e57043"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ccb77b3e40b151e20519c6ae6d89bfe3f4c14e8e210d910287f778368bb3d1"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3caf9cd64abfeb11a3b661329085c5e167abbe15256b3b68cb5d914ba7396f3"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6e32abdce572e3a8c3d02c886c704a38a1b015a1fb858004e03d20ca7cecbb21"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a65b6af4d903103ee7b6f4f5b85f1bfd0c90ba4eeac6421aae436c9988aa64a2"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:604a046d966457b6cdcacc5aa2ec5314f0e8c42bae52842c1e6fa02ea4bda42e"}, + {file = "ujson-5.10.0-cp312-cp312-win32.whl", hash = "sha256:6dea1c8b4fc921bf78a8ff00bbd2bfe166345f5536c510671bccececb187c80e"}, + {file = "ujson-5.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc"}, + {file = "ujson-5.10.0-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:618efd84dc1acbd6bff8eaa736bb6c074bfa8b8a98f55b61c38d4ca2c1f7f287"}, + {file = "ujson-5.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38d5d36b4aedfe81dfe251f76c0467399d575d1395a1755de391e58985ab1c2e"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67079b1f9fb29ed9a2914acf4ef6c02844b3153913eb735d4bf287ee1db6e557"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7d0e0ceeb8fe2468c70ec0c37b439dd554e2aa539a8a56365fd761edb418988"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59e02cd37bc7c44d587a0ba45347cc815fb7a5fe48de16bf05caa5f7d0d2e816"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a890b706b64e0065f02577bf6d8ca3b66c11a5e81fb75d757233a38c07a1f20"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:621e34b4632c740ecb491efc7f1fcb4f74b48ddb55e65221995e74e2d00bbff0"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9500e61fce0cfc86168b248104e954fead61f9be213087153d272e817ec7b4f"}, + {file = "ujson-5.10.0-cp313-cp313-win32.whl", hash = "sha256:4c4fc16f11ac1612f05b6f5781b384716719547e142cfd67b65d035bd85af165"}, + {file = "ujson-5.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539"}, + {file = "ujson-5.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a984a3131da7f07563057db1c3020b1350a3e27a8ec46ccbfbf21e5928a43050"}, + {file = "ujson-5.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73814cd1b9db6fc3270e9d8fe3b19f9f89e78ee9d71e8bd6c9a626aeaeaf16bd"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61e1591ed9376e5eddda202ec229eddc56c612b61ac6ad07f96b91460bb6c2fb"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2c75269f8205b2690db4572a4a36fe47cd1338e4368bc73a7a0e48789e2e35a"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7223f41e5bf1f919cd8d073e35b229295aa8e0f7b5de07ed1c8fddac63a6bc5d"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d4dc2fd6b3067c0782e7002ac3b38cf48608ee6366ff176bbd02cf969c9c20fe"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:232cc85f8ee3c454c115455195a205074a56ff42608fd6b942aa4c378ac14dd7"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cc6139531f13148055d691e442e4bc6601f6dba1e6d521b1585d4788ab0bfad4"}, + {file = "ujson-5.10.0-cp38-cp38-win32.whl", hash = "sha256:e7ce306a42b6b93ca47ac4a3b96683ca554f6d35dd8adc5acfcd55096c8dfcb8"}, + {file = "ujson-5.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:e82d4bb2138ab05e18f089a83b6564fee28048771eb63cdecf4b9b549de8a2cc"}, + {file = "ujson-5.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dfef2814c6b3291c3c5f10065f745a1307d86019dbd7ea50e83504950136ed5b"}, + {file = "ujson-5.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4734ee0745d5928d0ba3a213647f1c4a74a2a28edc6d27b2d6d5bd9fa4319e27"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47ebb01bd865fdea43da56254a3930a413f0c5590372a1241514abae8aa7c76"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dee5e97c2496874acbf1d3e37b521dd1f307349ed955e62d1d2f05382bc36dd5"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7490655a2272a2d0b072ef16b0b58ee462f4973a8f6bbe64917ce5e0a256f9c0"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba17799fcddaddf5c1f75a4ba3fd6441f6a4f1e9173f8a786b42450851bd74f1"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2aff2985cef314f21d0fecc56027505804bc78802c0121343874741650a4d3d1"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ad88ac75c432674d05b61184178635d44901eb749786c8eb08c102330e6e8996"}, + {file = "ujson-5.10.0-cp39-cp39-win32.whl", hash = "sha256:2544912a71da4ff8c4f7ab5606f947d7299971bdd25a45e008e467ca638d13c9"}, + {file = "ujson-5.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:3ff201d62b1b177a46f113bb43ad300b424b7847f9c5d38b1b4ad8f75d4a282a"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5b6fee72fa77dc172a28f21693f64d93166534c263adb3f96c413ccc85ef6e64"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:61d0af13a9af01d9f26d2331ce49bb5ac1fb9c814964018ac8df605b5422dcb3"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecb24f0bdd899d368b715c9e6664166cf694d1e57be73f17759573a6986dd95a"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbd8fd427f57a03cff3ad6574b5e299131585d9727c8c366da4624a9069ed746"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beeaf1c48e32f07d8820c705ff8e645f8afa690cca1544adba4ebfa067efdc88"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:baed37ea46d756aca2955e99525cc02d9181de67f25515c468856c38d52b5f3b"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7663960f08cd5a2bb152f5ee3992e1af7690a64c0e26d31ba7b3ff5b2ee66337"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:d8640fb4072d36b08e95a3a380ba65779d356b2fee8696afeb7794cf0902d0a1"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78778a3aa7aafb11e7ddca4e29f46bc5139131037ad628cc10936764282d6753"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0111b27f2d5c820e7f2dbad7d48e3338c824e7ac4d2a12da3dc6061cc39c8e6"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:c66962ca7565605b355a9ed478292da628b8f18c0f2793021ca4425abf8b01e5"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ba43cc34cce49cf2d4bc76401a754a81202d8aa926d0e2b79f0ee258cb15d3a4"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ac56eb983edce27e7f51d05bc8dd820586c6e6be1c5216a6809b0c668bb312b8"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44bd4b23a0e723bf8b10628288c2c7c335161d6840013d4d5de20e48551773b"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c10f4654e5326ec14a46bcdeb2b685d4ada6911050aa8baaf3501e57024b804"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0de4971a89a762398006e844ae394bd46991f7c385d7a6a3b93ba229e6dac17e"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e1402f0564a97d2a52310ae10a64d25bcef94f8dd643fcf5d310219d915484f7"}, + {file = "ujson-5.10.0.tar.gz", hash = "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1"}, ] [[package]] name = "urllib3" -version = "2.0.3" +version = "2.2.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["main", "dev"] files = [ - {file = "urllib3-2.0.3-py3-none-any.whl", hash = "sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1"}, - {file = "urllib3-2.0.3.tar.gz", hash = "sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825"}, + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] +h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] +[[package]] +name = "uvicorn" +version = "0.35.0" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "uvicorn-0.35.0-py3-none-any.whl", hash = "sha256:197535216b25ff9b785e29a0b79199f55222193d47f820816e7da751e9bc8d4a"}, + {file = "uvicorn-0.35.0.tar.gz", hash = "sha256:bc662f087f7cf2ce11a1d7fd70b90c9f98ef2e2831556dd078d131b96cc94a01"}, +] + +[package.dependencies] +click = ">=7.0" +h11 = ">=0.8" +typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} + +[package.extras] +standard = ["colorama (>=0.4) ; sys_platform == \"win32\"", "httptools (>=0.6.3)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.15.1) ; sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\"", "watchfiles (>=0.13)", "websockets (>=10.4)"] + [[package]] name = "virtualenv" -version = "20.23.1" +version = "20.34.0" description = "Virtual Python Environment builder" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "virtualenv-20.23.1-py3-none-any.whl", hash = "sha256:34da10f14fea9be20e0fd7f04aba9732f84e593dac291b757ce42e3368a39419"}, - {file = "virtualenv-20.23.1.tar.gz", hash = "sha256:8ff19a38c1021c742148edc4f81cb43d7f8c6816d2ede2ab72af5b84c749ade1"}, + {file = "virtualenv-20.34.0-py3-none-any.whl", hash = "sha256:341f5afa7eee943e4984a9207c025feedd768baff6753cd660c857ceb3e36026"}, + {file = "virtualenv-20.34.0.tar.gz", hash = "sha256:44815b2c9dee7ed86e387b842a84f20b93f7f417f95886ca1996a72a4138eb1a"}, ] [package.dependencies] -distlib = ">=0.3.6,<1" -filelock = ">=3.12,<4" -platformdirs = ">=3.5.1,<4" +distlib = ">=0.3.7,<1" +filelock = ">=3.12.2,<4" +platformdirs = ">=3.9.1,<5" +typing-extensions = {version = ">=4.13.2", markers = "python_version < \"3.11\""} [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] -test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.3.1)", "pytest-env (>=0.8.1)", "pytest-freezer (>=0.4.6)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=67.8)", "time-machine (>=2.9)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8) ; platform_python_implementation == \"PyPy\" or platform_python_implementation == \"GraalVM\" or platform_python_implementation == \"CPython\" and sys_platform == \"win32\" and python_version >= \"3.13\"", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10) ; platform_python_implementation == \"CPython\""] [[package]] name = "wikibaseintegrator" -version = "0.12.4" +version = "0.12.8" description = "Python package for reading from and writing to a Wikibase instance" optional = false -python-versions = "<3.13,>=3.7" +python-versions = "<4.0,>=3.8" +groups = ["main"] files = [ - {file = "wikibaseintegrator-0.12.4-py3-none-any.whl", hash = "sha256:789c0b31e3b4712b71821efba25c1e80a382e24a4e3116476afab615ca2c80c2"}, - {file = "wikibaseintegrator-0.12.4.tar.gz", hash = "sha256:ebcc7cd5300a0153b771184eb9020627f70d5d2060d033b505d5f7a4e87cdf71"}, + {file = "wikibaseintegrator-0.12.8-py3-none-any.whl", hash = "sha256:8817cfc6d8943896128828ffd9e831d023024b05836c05c1b11108efb1d442fb"}, + {file = "wikibaseintegrator-0.12.8.tar.gz", hash = "sha256:9b8b22b141b1afbf1357fd473315b4260b7b4254f6235b82a741ced02ef3a061"}, ] [package.dependencies] -backoff = ">=1.11.1,<2.3.0" -mwoauth = ">=0.3.8,<0.4.0" -oauthlib = ">=3.2.0,<3.3.0" -requests = ">=2.27.1,<2.32.0" -requests-oauthlib = ">=1.3.1,<1.4.0" -ujson = ">=5.4,<5.8" +backoff = ">=2.2.1,<3.0.0" +mwoauth = ">=0.4.0,<0.5.0" +oauthlib = ">=3.2.2,<4.0.0" +requests = ">=2.31.0,<3.0.0" +requests-oauthlib = ">=2.0.0,<3.0.0" +ujson = ">=5.9.0,<6.0.0" -[package.extras] -coverage = ["pytest-cov"] -dev = ["codespell", "flynt", "mypy", "pylint", "pylint-exit", "pytest"] -docs = ["Sphinx (>=4.5,<7.1)", "m2r2 (>=0.3.2,<0.4.0)", "readthedocs-sphinx-ext (>=2.1.5,<2.3.0)", "sphinx-autodoc-typehints (>=1.18.1,<1.24.0)", "sphinx-github-changelog (>=1.2.0,<1.3.0)", "sphinx-rtd-theme (>=1.0,<1.3)"] -notebooks = ["jupyter"] +[[package]] +name = "yarl" +version = "1.15.2" +description = "Yet another URL library" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "yarl-1.15.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e4ee8b8639070ff246ad3649294336b06db37a94bdea0d09ea491603e0be73b8"}, + {file = "yarl-1.15.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a7cf963a357c5f00cb55b1955df8bbe68d2f2f65de065160a1c26b85a1e44172"}, + {file = "yarl-1.15.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:43ebdcc120e2ca679dba01a779333a8ea76b50547b55e812b8b92818d604662c"}, + {file = "yarl-1.15.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3433da95b51a75692dcf6cc8117a31410447c75a9a8187888f02ad45c0a86c50"}, + {file = "yarl-1.15.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38d0124fa992dbacd0c48b1b755d3ee0a9f924f427f95b0ef376556a24debf01"}, + {file = "yarl-1.15.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ded1b1803151dd0f20a8945508786d57c2f97a50289b16f2629f85433e546d47"}, + {file = "yarl-1.15.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ace4cad790f3bf872c082366c9edd7f8f8f77afe3992b134cfc810332206884f"}, + {file = "yarl-1.15.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c77494a2f2282d9bbbbcab7c227a4d1b4bb829875c96251f66fb5f3bae4fb053"}, + {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b7f227ca6db5a9fda0a2b935a2ea34a7267589ffc63c8045f0e4edb8d8dcf956"}, + {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:31561a5b4d8dbef1559b3600b045607cf804bae040f64b5f5bca77da38084a8a"}, + {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3e52474256a7db9dcf3c5f4ca0b300fdea6c21cca0148c8891d03a025649d935"}, + {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0e1af74a9529a1137c67c887ed9cde62cff53aa4d84a3adbec329f9ec47a3936"}, + {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:15c87339490100c63472a76d87fe7097a0835c705eb5ae79fd96e343473629ed"}, + {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:74abb8709ea54cc483c4fb57fb17bb66f8e0f04438cff6ded322074dbd17c7ec"}, + {file = "yarl-1.15.2-cp310-cp310-win32.whl", hash = "sha256:ffd591e22b22f9cb48e472529db6a47203c41c2c5911ff0a52e85723196c0d75"}, + {file = "yarl-1.15.2-cp310-cp310-win_amd64.whl", hash = "sha256:1695497bb2a02a6de60064c9f077a4ae9c25c73624e0d43e3aa9d16d983073c2"}, + {file = "yarl-1.15.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9fcda20b2de7042cc35cf911702fa3d8311bd40055a14446c1e62403684afdc5"}, + {file = "yarl-1.15.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0545de8c688fbbf3088f9e8b801157923be4bf8e7b03e97c2ecd4dfa39e48e0e"}, + {file = "yarl-1.15.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fbda058a9a68bec347962595f50546a8a4a34fd7b0654a7b9697917dc2bf810d"}, + {file = "yarl-1.15.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1ac2bc069f4a458634c26b101c2341b18da85cb96afe0015990507efec2e417"}, + {file = "yarl-1.15.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd126498171f752dd85737ab1544329a4520c53eed3997f9b08aefbafb1cc53b"}, + {file = "yarl-1.15.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3db817b4e95eb05c362e3b45dafe7144b18603e1211f4a5b36eb9522ecc62bcf"}, + {file = "yarl-1.15.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:076b1ed2ac819933895b1a000904f62d615fe4533a5cf3e052ff9a1da560575c"}, + {file = "yarl-1.15.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f8cfd847e6b9ecf9f2f2531c8427035f291ec286c0a4944b0a9fce58c6446046"}, + {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:32b66be100ac5739065496c74c4b7f3015cef792c3174982809274d7e51b3e04"}, + {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:34a2d76a1984cac04ff8b1bfc939ec9dc0914821264d4a9c8fd0ed6aa8d4cfd2"}, + {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0afad2cd484908f472c8fe2e8ef499facee54a0a6978be0e0cff67b1254fd747"}, + {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c68e820879ff39992c7f148113b46efcd6ec765a4865581f2902b3c43a5f4bbb"}, + {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:98f68df80ec6ca3015186b2677c208c096d646ef37bbf8b49764ab4a38183931"}, + {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c56ec1eacd0a5d35b8a29f468659c47f4fe61b2cab948ca756c39b7617f0aa5"}, + {file = "yarl-1.15.2-cp311-cp311-win32.whl", hash = "sha256:eedc3f247ee7b3808ea07205f3e7d7879bc19ad3e6222195cd5fbf9988853e4d"}, + {file = "yarl-1.15.2-cp311-cp311-win_amd64.whl", hash = "sha256:0ccaa1bc98751fbfcf53dc8dfdb90d96e98838010fc254180dd6707a6e8bb179"}, + {file = "yarl-1.15.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:82d5161e8cb8f36ec778fd7ac4d740415d84030f5b9ef8fe4da54784a1f46c94"}, + {file = "yarl-1.15.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fa2bea05ff0a8fb4d8124498e00e02398f06d23cdadd0fe027d84a3f7afde31e"}, + {file = "yarl-1.15.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:99e12d2bf587b44deb74e0d6170fec37adb489964dbca656ec41a7cd8f2ff178"}, + {file = "yarl-1.15.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:243fbbbf003754fe41b5bdf10ce1e7f80bcc70732b5b54222c124d6b4c2ab31c"}, + {file = "yarl-1.15.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:856b7f1a7b98a8c31823285786bd566cf06226ac4f38b3ef462f593c608a9bd6"}, + {file = "yarl-1.15.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:553dad9af802a9ad1a6525e7528152a015b85fb8dbf764ebfc755c695f488367"}, + {file = "yarl-1.15.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30c3ff305f6e06650a761c4393666f77384f1cc6c5c0251965d6bfa5fbc88f7f"}, + {file = "yarl-1.15.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:353665775be69bbfc6d54c8d134bfc533e332149faeddd631b0bc79df0897f46"}, + {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f4fe99ce44128c71233d0d72152db31ca119711dfc5f2c82385ad611d8d7f897"}, + {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:9c1e3ff4b89cdd2e1a24c214f141e848b9e0451f08d7d4963cb4108d4d798f1f"}, + {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:711bdfae4e699a6d4f371137cbe9e740dc958530cb920eb6f43ff9551e17cfbc"}, + {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4388c72174868884f76affcdd3656544c426407e0043c89b684d22fb265e04a5"}, + {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f0e1844ad47c7bd5d6fa784f1d4accc5f4168b48999303a868fe0f8597bde715"}, + {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a5cafb02cf097a82d74403f7e0b6b9df3ffbfe8edf9415ea816314711764a27b"}, + {file = "yarl-1.15.2-cp312-cp312-win32.whl", hash = "sha256:156ececdf636143f508770bf8a3a0498de64da5abd890c7dbb42ca9e3b6c05b8"}, + {file = "yarl-1.15.2-cp312-cp312-win_amd64.whl", hash = "sha256:435aca062444a7f0c884861d2e3ea79883bd1cd19d0a381928b69ae1b85bc51d"}, + {file = "yarl-1.15.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:416f2e3beaeae81e2f7a45dc711258be5bdc79c940a9a270b266c0bec038fb84"}, + {file = "yarl-1.15.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:173563f3696124372831007e3d4b9821746964a95968628f7075d9231ac6bb33"}, + {file = "yarl-1.15.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9ce2e0f6123a60bd1a7f5ae3b2c49b240c12c132847f17aa990b841a417598a2"}, + {file = "yarl-1.15.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eaea112aed589131f73d50d570a6864728bd7c0c66ef6c9154ed7b59f24da611"}, + {file = "yarl-1.15.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4ca3b9f370f218cc2a0309542cab8d0acdfd66667e7c37d04d617012485f904"}, + {file = "yarl-1.15.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23ec1d3c31882b2a8a69c801ef58ebf7bae2553211ebbddf04235be275a38548"}, + {file = "yarl-1.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75119badf45f7183e10e348edff5a76a94dc19ba9287d94001ff05e81475967b"}, + {file = "yarl-1.15.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78e6fdc976ec966b99e4daa3812fac0274cc28cd2b24b0d92462e2e5ef90d368"}, + {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8657d3f37f781d987037f9cc20bbc8b40425fa14380c87da0cb8dfce7c92d0fb"}, + {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:93bed8a8084544c6efe8856c362af08a23e959340c87a95687fdbe9c9f280c8b"}, + {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:69d5856d526802cbda768d3e6246cd0d77450fa2a4bc2ea0ea14f0d972c2894b"}, + {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ccad2800dfdff34392448c4bf834be124f10a5bc102f254521d931c1c53c455a"}, + {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:a880372e2e5dbb9258a4e8ff43f13888039abb9dd6d515f28611c54361bc5644"}, + {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c998d0558805860503bc3a595994895ca0f7835e00668dadc673bbf7f5fbfcbe"}, + {file = "yarl-1.15.2-cp313-cp313-win32.whl", hash = "sha256:533a28754e7f7439f217550a497bb026c54072dbe16402b183fdbca2431935a9"}, + {file = "yarl-1.15.2-cp313-cp313-win_amd64.whl", hash = "sha256:5838f2b79dc8f96fdc44077c9e4e2e33d7089b10788464609df788eb97d03aad"}, + {file = "yarl-1.15.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fbbb63bed5fcd70cd3dd23a087cd78e4675fb5a2963b8af53f945cbbca79ae16"}, + {file = "yarl-1.15.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e2e93b88ecc8f74074012e18d679fb2e9c746f2a56f79cd5e2b1afcf2a8a786b"}, + {file = "yarl-1.15.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af8ff8d7dc07ce873f643de6dfbcd45dc3db2c87462e5c387267197f59e6d776"}, + {file = "yarl-1.15.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66f629632220a4e7858b58e4857927dd01a850a4cef2fb4044c8662787165cf7"}, + {file = "yarl-1.15.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:833547179c31f9bec39b49601d282d6f0ea1633620701288934c5f66d88c3e50"}, + {file = "yarl-1.15.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2aa738e0282be54eede1e3f36b81f1e46aee7ec7602aa563e81e0e8d7b67963f"}, + {file = "yarl-1.15.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a13a07532e8e1c4a5a3afff0ca4553da23409fad65def1b71186fb867eeae8d"}, + {file = "yarl-1.15.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c45817e3e6972109d1a2c65091504a537e257bc3c885b4e78a95baa96df6a3f8"}, + {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:670eb11325ed3a6209339974b276811867defe52f4188fe18dc49855774fa9cf"}, + {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:d417a4f6943112fae3924bae2af7112562285848d9bcee737fc4ff7cbd450e6c"}, + {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bc8936d06cd53fddd4892677d65e98af514c8d78c79864f418bbf78a4a2edde4"}, + {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:954dde77c404084c2544e572f342aef384240b3e434e06cecc71597e95fd1ce7"}, + {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:5bc0df728e4def5e15a754521e8882ba5a5121bd6b5a3a0ff7efda5d6558ab3d"}, + {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:b71862a652f50babab4a43a487f157d26b464b1dedbcc0afda02fd64f3809d04"}, + {file = "yarl-1.15.2-cp38-cp38-win32.whl", hash = "sha256:63eab904f8630aed5a68f2d0aeab565dcfc595dc1bf0b91b71d9ddd43dea3aea"}, + {file = "yarl-1.15.2-cp38-cp38-win_amd64.whl", hash = "sha256:2cf441c4b6e538ba0d2591574f95d3fdd33f1efafa864faa077d9636ecc0c4e9"}, + {file = "yarl-1.15.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a32d58f4b521bb98b2c0aa9da407f8bd57ca81f34362bcb090e4a79e9924fefc"}, + {file = "yarl-1.15.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:766dcc00b943c089349d4060b935c76281f6be225e39994c2ccec3a2a36ad627"}, + {file = "yarl-1.15.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bed1b5dbf90bad3bfc19439258c97873eab453c71d8b6869c136346acfe497e7"}, + {file = "yarl-1.15.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed20a4bdc635f36cb19e630bfc644181dd075839b6fc84cac51c0f381ac472e2"}, + {file = "yarl-1.15.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d538df442c0d9665664ab6dd5fccd0110fa3b364914f9c85b3ef9b7b2e157980"}, + {file = "yarl-1.15.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c6cf1d92edf936ceedc7afa61b07e9d78a27b15244aa46bbcd534c7458ee1b"}, + {file = "yarl-1.15.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce44217ad99ffad8027d2fde0269ae368c86db66ea0571c62a000798d69401fb"}, + {file = "yarl-1.15.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47a6000a7e833ebfe5886b56a31cb2ff12120b1efd4578a6fcc38df16cc77bd"}, + {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e52f77a0cd246086afde8815039f3e16f8d2be51786c0a39b57104c563c5cbb0"}, + {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:f9ca0e6ce7774dc7830dc0cc4bb6b3eec769db667f230e7c770a628c1aa5681b"}, + {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:136f9db0f53c0206db38b8cd0c985c78ded5fd596c9a86ce5c0b92afb91c3a19"}, + {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:173866d9f7409c0fb514cf6e78952e65816600cb888c68b37b41147349fe0057"}, + {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:6e840553c9c494a35e449a987ca2c4f8372668ee954a03a9a9685075228e5036"}, + {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:458c0c65802d816a6b955cf3603186de79e8fdb46d4f19abaec4ef0a906f50a7"}, + {file = "yarl-1.15.2-cp39-cp39-win32.whl", hash = "sha256:5b48388ded01f6f2429a8c55012bdbd1c2a0c3735b3e73e221649e524c34a58d"}, + {file = "yarl-1.15.2-cp39-cp39-win_amd64.whl", hash = "sha256:81dadafb3aa124f86dc267a2168f71bbd2bfb163663661ab0038f6e4b8edb810"}, + {file = "yarl-1.15.2-py3-none-any.whl", hash = "sha256:0d3105efab7c5c091609abacad33afff33bdff0035bece164c98bcf5a85ef90a"}, + {file = "yarl-1.15.2.tar.gz", hash = "sha256:a39c36f4218a5bb668b4f06874d676d35a035ee668e6e7e3538835c703634b84"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" +propcache = ">=0.2.0" [metadata] -lock-version = "2.0" -python-versions = ">=3.8,<=3.12" -content-hash = "047e2982cc30bdfaefb533c38d4c181112a8e06c7693d1ff4a46633f7d4955b3" +lock-version = "2.1" +python-versions = ">=3.9,<4.0" +content-hash = "bc6e0009842ac2a359749ed8564a0a737445ddc848dfa36b9b9bffb81eadb19d" diff --git a/pyproject.toml b/pyproject.toml index acd6d2b..a1a3456 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [tool.poetry] -name = "Entityshape" +name = "EntityValidator" version = "0.2.0" description = "Python library to validate Wikidata items." authors = ["Mark Tully aka Teester", "Dennis Priskorn <68460690+dpriskorn@users.noreply.github.com>"] @@ -11,14 +11,19 @@ classifiers = [ "Topic :: Software Development :: Libraries :: Python Modules" ] packages = [ - { include = "entityshape" }, + { include = "entityvalidator" }, ] [tool.poetry.dependencies] -pydantic = "^1.10.9" -python = ">=3.8,<=3.12" +pydantic = "^2.4.2" +python = ">=3.9,<4.0" requests = "^2.28.1" wikibaseintegrator = "^0.12.4" +aiohttp = "^3.8.6" +asyncio = "^3.4.3" +rich = "^13.6.0" +fastapi = "^0.116.1" +uvicorn = "^0.35.0" [tool.poetry.group.dev.dependencies] rich = "^13.4.2" @@ -30,7 +35,7 @@ mypy = "^1.1.1" pre-commit = "^2.20.0" pytest = "^7.1.3" ruff = "^0.0.263" -safety = "^2.2.0" +# safety = "^2.2.0" tomli = "^2.0.1" types-python-dateutil = "^2.8.19.2" types-requests = "^2.28.11.2" @@ -89,6 +94,7 @@ select = [ ignore = [ "A003", "ARG002", + "B008", # Query() "DTZ003", "EXE002", "F401", @@ -112,6 +118,11 @@ ignore = [ "S501", "PLR0913", ] +# Exclude files we did not author +exclude = [ + "entityvalidator/models/shape.py", + "entityvalidator/models/compareshape.py", +] line-length = 160 target-version = "py38" @@ -123,8 +134,11 @@ max-complexity = 11 [tool.ruff.per-file-ignores] "tests/*" = ["PT009", "PT018", "RUF001", "RUF003", "S101", "ISC001"] -"entityshape/models/compareshape.py" = ["SIM114"] +# "entityvalidator/models/compareshape.py" = ["SIM114"] [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" + +[tool.mypy] +ignore_missing_imports = true diff --git a/pytest.ini b/pytest.ini index 5ae9c38..c06f3bb 100644 --- a/pytest.ini +++ b/pytest.ini @@ -1,3 +1,3 @@ [pytest] log_cli = 1 -log_cli_level = WARNING +log_cli_level = INFO diff --git a/tests/test_entity.py b/tests/test_entity.py new file mode 100644 index 0000000..330b805 --- /dev/null +++ b/tests/test_entity.py @@ -0,0 +1,17 @@ +from unittest import TestCase + +from entityvalidator import Entity, EntityIdError + + +class TestEntity(TestCase): + def test_get_result_invalid_entity_id(self): + e = Entity( + eid="E1", + entity_id="qqqqQ1", + entity_data={}, + entity_schema_data={}, + ) + with self.assertRaises(EntityIdError): + e.check_and_validate() + # print(e.result) + # assert e.result != {} diff --git a/tests/test_entityshape.py b/tests/test_entityshape.py index 71c620f..ebaa7f2 100644 --- a/tests/test_entityshape.py +++ b/tests/test_entityshape.py @@ -1,52 +1,33 @@ +import asyncio +import time from unittest import TestCase -# from rich.console import Console -from entityshape import EidError, EntityShape, LangError, QidError, Result - +from entityvalidator import EntityValidator, WikibaseEntitySchemaDownloadError -class TestEntityShape(TestCase): - def test_get_result_invalid_eid(self): - e = EntityShape(eid="eeeE1", lang="en", entity_id="Q1") - with self.assertRaises(EidError): - e.validate_and_get_result() - # print(e.result) - # assert e.result != {} +# from rich.console import Console - def test_get_result_invalid_lang(self): - """The API does not seem to check whether the lang code is valid or not""" - e = EntityShape(eid="E376", lang="", entity_id="Q119853967") - with self.assertRaises(LangError): - e.validate_and_get_result() - # assert e.result.is_valid is True - # print(e.result) - # assert e.result != {} - def test_get_result_invalid_entity_id(self): - e = EntityShape(eid="E1", lang="en", entity_id="qqqqQ1") - with self.assertRaises(QidError): - e.validate_and_get_result() - # print(e.result) - # assert e.result != {} +class TestEntityValidator(TestCase): # TODO this fails because of ? # def test_get_result_valid(self): - # e = EntityShape(eid="E376", lang="en", qid="Q96308969") + # e = EntityValidator(eid="E376", lang="en", qid="Q96308969") # e.get_result() # print(e.result) # assert isinstance(e.result, Result) # assert e.result.is_valid is True - def test_get_result_invalid_missing_operator(self): - e = EntityShape(eid="E376", lang="en", entity_id="Q96308969") - e.validate_and_get_result() - # print(e.result) - assert isinstance(e.result, Result) - assert e.result.is_valid is False - assert e.result.required_properties_that_are_missing == {"P137"} + # def test_get_result_invalid_missing_operator(self): + # e = EntityValidator(eid="E376", lang="en", entity_id="Q96308969") + # e.validate_and_get_result() + # # print(e.result) + # assert isinstance(e.result, Result) + # assert e.result.is_valid is False + # assert e.result.required_properties_that_are_missing == {"P137"} # this fails because of https://github.com/dpriskorn/entityshape/issues/2 # def test_get_result_invalid_wrong_schema(self): - # e = EntityShape(eid="E375", lang="en", entity_id="Q119853967") + # e = EntityValidator(eid="E375", lang="en", entity_id="Q119853967") # e.get_result() # print(e.result) # assert isinstance(e.result, Result) @@ -54,72 +35,130 @@ def test_get_result_invalid_missing_operator(self): # assert e.result.required_properties_that_are_missing == {"P2043"} # assert e.result.properties_that_are_not_allowed == {"P912", "P625", "P276"} - def test_get_result_missing_statement_response(self): - e = EntityShape(eid="E395", lang="en", entity_id="Q4802448") - e.validate_and_get_result() - # print(e.compare_shape_result) - # console = Console() - # console.print(e.result) - assert isinstance(e.result, Result) - assert e.result.is_valid is False - assert e.result.properties_without_enough_correct_statements == {"P39"} + # def test_get_result_missing_statement_response(self): + # e = EntityValidator(eid="E395", lang="en", entity_id="Q4802448") + # e.validate_and_get_result() + # # print(e.compare_shape_result) + # # console = Console() + # # console.print(e.result) + # assert isinstance(e.result, Result) + # assert e.result.is_valid is False + # assert e.result.properties_without_enough_correct_statements == {"P39"} + # + # def test_get_result_weird_statement_response_party_person(self): + # e = EntityValidator(eid="E395", lang="en", entity_id="Q20727") + # e.validate_and_get_result() + # assert isinstance(e.result, Result) + # assert e.result.is_valid is True + # + # def test_lexeme(self): + # # wbi_config['USER_AGENT'] = 'WikibaseIntegrator in PAWS by So9q' + # # wbi = WikibaseIntegrator() + # # # This query was build in a few seconds using https://query.wikidata.org/querybuilder/?uselang=en :) + # # results = execute_sparql_query(""" + # # SELECT ?lexemeId ?lemma WHERE { + # # ?lexemeId dct:language wd:Q9027; + # # wikibase:lexicalCategory wd:Q1084; + # # wikibase:lemma ?lemma. + # # } + # # limit 10 + # # """) + # # bindings = results["results"]["bindings"] + # # print(f"Found {len(bindings)} results") + # # count = 1 + # # for result in bindings: + # # print(result) + # # # Get the entity id from the URI + # # entity_id = result["lexemeId"]["value"].split("/")[-1] + # # print(f"Working on: {entity_id}") + # # entity = wbi.lexeme.get(entity_id) + # e = EntityValidator(entity_id="L41172", eid="E34", lang="en") + # e.validate_and_get_result() + # print(e.result) + # # try: + # # result = e.validate_and_get_result() + # # # Ignore the invalid shelters missing an operator P137 + # # if result.is_valid is False and result.required_properties_that_are_missing == {"P137"}: + # # print("Skipping item only missing an operator") + # # # Ignore the invalid items with too many P625 + # # elif result.is_valid is False and result.properties_with_too_many_statements == {"P625"}: + # # print("Skipping item that only invalidates because it has a coordinate") + # # elif result.is_valid is True: + # # print("Skipping valid item - they are boring!") + # # else: + # # print(repr(result) + f"\nSee {entity.get_entity_url()}") + # # except KeyError: + # # print( + # # f"Got a keyerror for the entity {entity_id}, this is a known bug with entityshape, see https://github.com/dpriskorn/entityshape/issues/2") + # + # def test_labels_from_custom_wikibase_valid_qid(self): + # eid = "E1" # see https://furry.wikibase.cloud/wiki/EntitySchema:E1 + # wikibase_url = "https://furry.wikibase.cloud" + # mediawiki_api_url = "https://furry.wikibase.cloud/w/api.php" + # e = EntityValidator( + # entity_id="Q3", + # eid=eid, + # lang="en", + # mediawiki_api_url=mediawiki_api_url, + # wikibase_url=wikibase_url, + # ) + # e.validate_and_get_result() + # print(e.result) + + def test__download_json(self): + es = EntityValidator(eid="E395", entity_ids=["Q20727"]) + # es.__download_json__() + loop = asyncio.get_event_loop() + loop.run_until_complete(es.__download_json__()) + assert len(es.entities) == 1 + # test that we got any json data back + assert es.entities[0].entity_data != {} - def test_get_result_weird_statement_response_party_person(self): - e = EntityShape(eid="E395", lang="en", entity_id="Q20727") - e.validate_and_get_result() - assert isinstance(e.result, Result) - assert e.result.is_valid is True + def test_download_and_validate_one_item(self): + es = EntityValidator(eid="E395", entity_ids=["Q20727"]) + es.__download_and_validate__() + assert len(es.entities) == 1 + assert es.entities[0].entity_data != {} + result = es.entities[0].result + assert result.analyzed is True + assert result.is_valid is True + # print(es.entities[0].result) + # assert es.entities[0].result == Result() - def test_lexeme(self): - # wbi_config['USER_AGENT'] = 'WikibaseIntegrator in PAWS by So9q' - # wbi = WikibaseIntegrator() - # # This query was build in a few seconds using https://query.wikidata.org/querybuilder/?uselang=en :) - # results = execute_sparql_query(""" - # SELECT ?lexemeId ?lemma WHERE { - # ?lexemeId dct:language wd:Q9027; - # wikibase:lexicalCategory wd:Q1084; - # wikibase:lemma ?lemma. - # } - # limit 10 - # """) - # bindings = results["results"]["bindings"] - # print(f"Found {len(bindings)} results") - # count = 1 - # for result in bindings: - # print(result) - # # Get the entity id from the URI - # entity_id = result["lexemeId"]["value"].split("/")[-1] - # print(f"Working on: {entity_id}") - # entity = wbi.lexeme.get(entity_id) - e = EntityShape(entity_id="L41172", eid="E34", lang="en") - e.validate_and_get_result() - print(e.result) - # try: - # result = e.validate_and_get_result() - # # Ignore the invalid shelters missing an operator P137 - # if result.is_valid is False and result.required_properties_that_are_missing == {"P137"}: - # print("Skipping item only missing an operator") - # # Ignore the invalid items with too many P625 - # elif result.is_valid is False and result.properties_with_too_many_statements == {"P625"}: - # print("Skipping item that only invalidates because it has a coordinate") - # elif result.is_valid is True: - # print("Skipping valid item - they are boring!") - # else: - # print(repr(result) + f"\nSee {entity.get_entity_url()}") - # except KeyError: - # print( - # f"Got a keyerror for the entity {entity_id}, this is a known bug with entityshape, see https://github.com/dpriskorn/entityshape/issues/2") + def test_download_and_validate_ten_items(self): + entity_ids = [ + "Q115097016", + "Q115097023", + "Q115097021", + "Q115097029", + "Q115097038", + "Q115097037", + "Q115097040", + "Q115097051", + "Q115097057", + "Q115097060", + ] - def test_labels_from_custom_wikibase_valid_qid(self): - eid = "E1" # see https://furry.wikibase.cloud/wiki/EntitySchema:E1 - wikibase_url = "https://furry.wikibase.cloud" - mediawiki_api_url = "https://furry.wikibase.cloud/w/api.php" - e = EntityShape( - entity_id="Q3", - eid=eid, - lang="en", - mediawiki_api_url=mediawiki_api_url, - wikibase_url=wikibase_url, - ) - e.validate_and_get_result() - print(e.result) + start_time = time.time() # Record the start time + es = EntityValidator(eid="E375", entity_ids=entity_ids) + es.__download_and_validate__() + end_time = time.time() # Record the end time + + execution_time = end_time - start_time + print(f"Test execution time: {execution_time} seconds") + + assert len(es.entities) == 10 + # for entity in es.entities: + # print(entity.result) + # print(entity.result.model_dump()) + # assert es.entities[0].entity_data != {} + # result = es.entities[0].result + # assert result.analyzed is True + # assert result.is_valid is True + # print(es.entities[0].result) + # assert es.entities[0].result == Result() + + def test_get_result_invalid_eid(self): + es = EntityValidator(eid="eeeE1", entity_ids=["Q1"]) + with self.assertRaises(WikibaseEntitySchemaDownloadError): + es.__download_schema__() diff --git a/tests/test_result.py b/tests/test_result.py index 4957dd6..bdb0d48 100644 --- a/tests/test_result.py +++ b/tests/test_result.py @@ -1,1218 +1,1218 @@ -from typing import Any, Dict -from unittest import TestCase - -from entityshape import Result - -hiking_path_with_1_missing_required_property: Dict[Any, Any] = { - "error": "", - "general": {}, - "name": "hiking path", - "properties": { - "P10467": { - "name": "naturkartan.se ID", - "necessity": "optional", - "response": "missing", - }, - "P112": { - "name": "founded by", - "necessity": "optional", - "response": "missing", - }, - "P131": { - "name": "located in the administrative territorial entity", - "necessity": "required", - "response": "present", - }, - "P1343": { - "name": "described by source", - "necessity": "optional", - "response": "missing", - }, - "P137": { - "name": "operator", - "necessity": "optional", - "response": "missing", - }, - "P138": { - "name": "named after", - "necessity": "optional", - "response": "missing", - }, - "P1427": { - "name": "start point", - "necessity": "optional", - "response": "missing", - }, - "P1444": { - "name": "destination point", - "necessity": "optional", - "response": "missing", - }, - "P15": { - "name": "route map", - "necessity": "optional", - "response": "missing", - }, - "P1545": { - "name": "series ordinal", - "necessity": "optional", - "response": "missing", - }, - "P1552": { - "name": "has quality", - "necessity": "optional", - "response": "missing", - }, - "P1589": { - "name": "lowest point", - "necessity": "optional", - "response": "missing", - }, - "P17": {"name": "country", "necessity": "required", "response": "present"}, - "P18": {"name": "image", "necessity": "optional", "response": "missing"}, - "P1997": { - "name": "Facebook Places ID", - "necessity": "optional", - "response": "missing", - }, - "P2043": {"name": "length", "necessity": "required", "response": "missing"}, - "P206": { - "name": "located in or next to body of water", - "necessity": "optional", - "response": "missing", - }, - "P214": {"name": "VIAF ID", "necessity": "optional", "response": "missing"}, - "P2347": {"name": "YSO ID", "necessity": "optional", "response": "missing"}, - "P242": { - "name": "locator map image", - "necessity": "optional", - "response": "missing", - }, - "P2671": { - "name": "Google Knowledge Graph ID", - "necessity": "optional", - "response": "missing", - }, - "P2789": { - "name": "connects with", - "necessity": "optional", - "response": "missing", - }, - "P30": { - "name": "continent", - "necessity": "optional", - "response": "missing", - }, - "P3018": { - "name": "located in protected area", - "necessity": "optional", - "response": "missing", - }, - "P31": { - "name": "instance of", - "necessity": "optional", - "response": "correct", - }, - "P3173": { - "name": "offers view on", - "necessity": "optional", - "response": "missing", - }, - "P361": {"name": "part of", "necessity": "optional", "response": "missing"}, - "P373": { - "name": "Commons category", - "necessity": "optional", - "response": "missing", - }, - "P402": { - "name": "OpenStreetMap relation ID", - "necessity": "optional", - "response": "missing", - }, - "P4552": { - "name": "mountain range", - "necessity": "optional", - "response": "missing", - }, - "P527": { - "name": "has part(s)", - "necessity": "optional", - "response": "missing", - }, - "P559": { - "name": "terminus", - "necessity": "optional", - "response": "missing", - }, - "P571": { - "name": "inception", - "necessity": "optional", - "response": "missing", - }, - "P609": { - "name": "terminus location", - "necessity": "optional", - "response": "missing", - }, - "P610": { - "name": "highest point", - "necessity": "optional", - "response": "missing", - }, - "P6104": { - "name": "maintained by WikiProject", - "necessity": "optional", - "response": "missing", - }, - "P625": { - "name": "coordinate location", - "necessity": "absent", - "response": "missing", - }, - "P646": { - "name": "Freebase ID", - "necessity": "optional", - "response": "missing", - }, - "P691": { - "name": "NL CR AUT ID", - "necessity": "optional", - "response": "missing", - }, - "P706": { - "name": "located in/on physical feature", - "necessity": "optional", - "response": "missing", - }, - "P7127": { - "name": "AllTrails trail ID", - "necessity": "optional", - "response": "missing", - }, - "P7252": { - "name": "degree of difficulty", - "necessity": "optional", - "response": "missing", - }, - "P856": { - "name": "official website", - "necessity": "optional", - "response": "missing", - }, - "P910": { - "name": "topic's main category", - "necessity": "optional", - "response": "missing", - }, - "P973": { - "name": "described at URL", - "necessity": "optional", - "response": "present", - }, - }, - "schema": "E375", - "statements": { - "Q119845590$11794598-A67C-4978-8D1D-359B90E5EE15": { - "necessity": "optional", - "property": "P973", - "response": "allowed", - }, - "Q119845590$1CEFCE58-826A-4243-A9D2-CF47BF9F493E": { - "necessity": "required", - "property": "P131", - "response": "allowed", - }, - "Q119845590$72CEF06C-C5AE-40DE-AB61-D530914AFD4E": { - "necessity": "optional", - "property": "P31", - "response": "correct", - }, - "Q119845590$9C7FBBB4-7302-423F-AF51-C46A07F680CD": { - "necessity": "required", - "property": "P131", - "response": "allowed", - }, - "Q119845590$D036FE30-1DFD-461A-8AA2-AA0CB977E22D": { - "necessity": "required", - "property": "P17", - "response": "allowed", - }, - }, - "validity": {}, -} # P2043 length is missing -campsite_missing_correct_p31: Dict[Any, Any] = { - "error": "", - "general": {}, - "name": "campsite", - "properties": { - "P10467": { - "name": "naturkartan.se ID", - "necessity": "optional", - "response": "missing", - }, - "P11177": { - "name": "Camp Wild ID", - "necessity": "optional", - "response": "missing", - }, - "P131": { - "name": "located in the administrative territorial entity", - "necessity": "required", - "response": "present", - }, - "P137": { - "name": "operator", - "necessity": "required", - "response": "present", - }, - "P138": { - "name": "named after", - "necessity": "optional", - "response": "missing", - }, - "P1448": { - "name": "official name", - "necessity": "optional", - "response": "missing", - }, - "P17": {"name": "country", "necessity": "required", "response": "present"}, - "P18": {"name": "image", "necessity": "optional", "response": "missing"}, - "P206": { - "name": "located in or next to body of water", - "necessity": "optional", - "response": "missing", - }, - "P242": { - "name": "locator map image", - "necessity": "optional", - "response": "missing", - }, - "P2670": { - "name": "has part(s) of the class", - "necessity": "optional", - "response": "missing", - }, - "P276": { - "name": "location", - "necessity": "optional", - "response": "present", - }, - "P30": { - "name": "continent", - "necessity": "optional", - "response": "missing", - }, - "P3018": { - "name": "located in protected area", - "necessity": "optional", - "response": "missing", - }, - "P31": { - "name": "instance of", - "necessity": "required", - "response": "not enough correct statements", - }, - "P3173": { - "name": "offers view on", - "necessity": "optional", - "response": "missing", - }, - "P373": { - "name": "Commons category", - "necessity": "optional", - "response": "missing", - }, - "P402": { - "name": "OpenStreetMap relation ID", - "necessity": "optional", - "response": "missing", - }, - "P4552": { - "name": "mountain range", - "necessity": "optional", - "response": "missing", - }, - "P527": { - "name": "has part(s)", - "necessity": "optional", - "response": "missing", - }, - "P571": { - "name": "inception", - "necessity": "optional", - "response": "missing", - }, - "P5775": { - "name": "image of interior", - "necessity": "absent", - "response": "missing", - }, - "P625": { - "name": "coordinate location", - "necessity": "required", - "response": "present", - }, - "P706": { - "name": "located in/on physical feature", - "necessity": "optional", - "response": "missing", - }, - "P7418": { - "name": "image of frontside", - "necessity": "optional", - "response": "missing", - }, - "P8517": {"name": "view", "necessity": "optional", "response": "missing"}, - "P856": { - "name": "official website", - "necessity": "optional", - "response": "missing", - }, - "P912": { - "name": "has facility", - "necessity": "optional", - "response": "missing", - }, - "P9676": { - "name": "Vindskyddskartan.se ID", - "necessity": "optional", - "response": "missing", - }, - "P973": { - "name": "described at URL", - "necessity": "optional", - "response": "present", - }, - }, - "schema": "E376", - "statements": { - "Q119853974$20823AE2-6F1A-43FB-9C9C-A6C2CC772446": { - "necessity": "required", - "property": "P137", - "response": "allowed", - }, - "Q119853974$3F1F91A9-693C-41AA-A5C7-54E711D83594": { - "necessity": "required", - "property": "P17", - "response": "allowed", - }, - "Q119853974$4A29484F-6C84-4B5A-B9E9-25344162CFCB": { - "necessity": "required", - "property": "P625", - "response": "allowed", - }, - "Q119853974$4BCAA6A7-8857-4056-B286-7B646A2D72C9": { - "necessity": "required", - "property": "P131", - "response": "allowed", - }, - "Q119853974$8E8612BE-78F7-463A-8E35-96F53277E3B4": { - "necessity": "optional", - "property": "P276", - "response": "allowed", - }, - "Q119853974$AA270DBF-B117-45DD-AF68-8F1A7AFC56F1": { - "necessity": "required", - "property": "P31", - "response": "allowed", - }, - "Q119853974$C25AF244-F0D9-4E19-8126-42092C0FA4FB": { - "necessity": "optional", - "property": "P973", - "response": "allowed", - }, - "Q119853974$CD71CE83-F045-486B-873F-F7A8FB437E2A": { - "necessity": "required", - "property": "P131", - "response": "allowed", - }, - }, - "validity": {}, -} -campsite_not_allowed_p625: Dict[Any, Any] = { - "error": "", - "general": {}, - "name": "hiking path", - "properties": { - "P10467": { - "name": "naturkartan.se ID", - "necessity": "optional", - "response": "missing", - }, - "P112": { - "name": "founded by", - "necessity": "optional", - "response": "missing", - }, - "P131": { - "name": "located in the administrative territorial entity", - "necessity": "required", - "response": "present", - }, - "P1343": { - "name": "described by source", - "necessity": "optional", - "response": "missing", - }, - "P137": { - "name": "operator", - "necessity": "optional", - "response": "present", - }, - "P138": { - "name": "named after", - "necessity": "optional", - "response": "missing", - }, - "P1427": { - "name": "start point", - "necessity": "optional", - "response": "missing", - }, - "P1444": { - "name": "destination point", - "necessity": "optional", - "response": "missing", - }, - "P15": { - "name": "route map", - "necessity": "optional", - "response": "missing", - }, - "P1545": { - "name": "series ordinal", - "necessity": "optional", - "response": "missing", - }, - "P1552": { - "name": "has quality", - "necessity": "optional", - "response": "missing", - }, - "P1589": { - "name": "lowest point", - "necessity": "optional", - "response": "missing", - }, - "P17": {"name": "country", "necessity": "required", "response": "present"}, - "P18": {"name": "image", "necessity": "optional", "response": "missing"}, - "P1997": { - "name": "Facebook Places ID", - "necessity": "optional", - "response": "missing", - }, - "P2043": {"name": "length", "necessity": "required", "response": "missing"}, - "P206": { - "name": "located in or next to body of water", - "necessity": "optional", - "response": "missing", - }, - "P214": {"name": "VIAF ID", "necessity": "optional", "response": "missing"}, - "P2347": {"name": "YSO ID", "necessity": "optional", "response": "missing"}, - "P242": { - "name": "locator map image", - "necessity": "optional", - "response": "missing", - }, - "P2671": { - "name": "Google Knowledge Graph ID", - "necessity": "optional", - "response": "missing", - }, - "P276": {"name": "location", "necessity": "absent"}, - "P2789": { - "name": "connects with", - "necessity": "optional", - "response": "missing", - }, - "P30": { - "name": "continent", - "necessity": "optional", - "response": "missing", - }, - "P3018": { - "name": "located in protected area", - "necessity": "optional", - "response": "missing", - }, - "P31": { - "name": "instance of", - "necessity": "optional", - "response": "present", - }, - "P3173": { - "name": "offers view on", - "necessity": "optional", - "response": "missing", - }, - "P361": {"name": "part of", "necessity": "optional", "response": "missing"}, - "P373": { - "name": "Commons category", - "necessity": "optional", - "response": "missing", - }, - "P402": { - "name": "OpenStreetMap relation ID", - "necessity": "optional", - "response": "missing", - }, - "P4552": { - "name": "mountain range", - "necessity": "optional", - "response": "missing", - }, - "P527": { - "name": "has part(s)", - "necessity": "optional", - "response": "present", - }, - "P559": { - "name": "terminus", - "necessity": "optional", - "response": "missing", - }, - "P571": { - "name": "inception", - "necessity": "optional", - "response": "missing", - }, - "P609": { - "name": "terminus location", - "necessity": "optional", - "response": "missing", - }, - "P610": { - "name": "highest point", - "necessity": "optional", - "response": "missing", - }, - "P6104": { - "name": "maintained by WikiProject", - "necessity": "optional", - "response": "missing", - }, - "P625": { - "name": "coordinate location", - "necessity": "absent", - "response": "too many statements", - }, - "P646": { - "name": "Freebase ID", - "necessity": "optional", - "response": "missing", - }, - "P691": { - "name": "NL CR AUT ID", - "necessity": "optional", - "response": "missing", - }, - "P706": { - "name": "located in/on physical feature", - "necessity": "optional", - "response": "missing", - }, - "P7127": { - "name": "AllTrails trail ID", - "necessity": "optional", - "response": "missing", - }, - "P7252": { - "name": "degree of difficulty", - "necessity": "optional", - "response": "missing", - }, - "P856": { - "name": "official website", - "necessity": "optional", - "response": "missing", - }, - "P910": { - "name": "topic's main category", - "necessity": "optional", - "response": "missing", - }, - "P912": {"name": "has facility", "necessity": "absent"}, - "P973": { - "name": "described at URL", - "necessity": "optional", - "response": "present", - }, - }, - "schema": "E375", - "statements": { - "Q119853967$36193CA1-6DF5-4DAC-910E-0319812671FB": { - "necessity": "required", - "property": "P131", - "response": "allowed", - }, - "Q119853967$43477af1-49e1-e0fd-8672-fbad6c66dd96": { - "necessity": "optional", - "property": "P527", - "response": "allowed", - }, - "Q119853967$5C65C2A6-DA72-4C71-83E2-0C626C906506": { - "property": "P276", - "response": "not in schema", - }, - "Q119853967$5DF7E848-400D-4AEE-B2AD-A06D92ACA2DD": { - "necessity": "absent", - "property": "P625", - "response": "allowed", - }, - "Q119853967$736c7261-4e8c-e754-e817-e8b253ae5e7b": { - "property": "P912", - "response": "not in schema", - }, - "Q119853967$7A4E524F-12CE-40C1-B709-4876A2C465D6": { - "necessity": "optional", - "property": "P137", - "response": "allowed", - }, - "Q119853967$7F83F435-83AC-4210-A717-ED3DE033319D": { - "necessity": "required", - "property": "P17", - "response": "allowed", - }, - "Q119853967$874d280c-427c-8c9d-8ccb-3bd107e7d6a4": { - "necessity": "optional", - "property": "P527", - "response": "allowed", - }, - "Q119853967$C30A3085-F06D-4834-A887-CDDBC314EE7F": { - "necessity": "required", - "property": "P131", - "response": "allowed", - }, - "Q119853967$C98E6C4A-98F8-47EA-8791-C4C85262FC9B": { - "necessity": "optional", - "property": "P973", - "response": "allowed", - }, - "Q119853967$D8462BF0-2599-4F62-8147-E84465529B19": { - "necessity": "optional", - "property": "P31", - "response": "allowed", - }, - }, - "validity": {}, -} -party_member_missing_p37: Dict[Any, Any] = { - "general": {}, - "properties": { - "P21": { - "name": "sex or gender", - "necessity": "required", - "response": "correct", - }, - "P31": {"name": "instance of", "necessity": "required", "response": "correct"}, - "P102": { - "name": "member of political party", - "necessity": "required", - "response": "present", - }, - "P569": { - "name": "date of birth", - "necessity": "required", - "response": "present", - }, - "P570": { - "name": "date of death", - "necessity": "optional", - "response": "present", - }, - "P27": { - "name": "country of citizenship", - "necessity": "required", - "response": "correct", - }, - "P106": {"name": "occupation", "necessity": "required", "response": "correct"}, - "P735": {"name": "given name", "necessity": "required", "response": "present"}, - "P18": {"name": "image", "necessity": "required", "response": "present"}, - "P1343": { - "name": "described by source", - "necessity": "required", - "response": "present", - }, - "P39": { - "name": "position held", - "necessity": "optional", - "response": "not enough correct statements", - }, - "P119": { - "name": "place of burial", - "necessity": "optional", - "response": "present", - }, - "P1412": { - "name": "languages spoken, written or signed", - "necessity": "required", - "response": "correct", - }, - "P937": { - "name": "work location", - "necessity": "required", - "response": "correct", - }, - "P1559": {"name": "name in native language", "necessity": "absent"}, - "P3222": {"name": "NE.se ID", "necessity": "absent"}, - "P19": { - "name": "place of birth", - "necessity": "required", - "response": "present", - }, - "P20": { - "name": "place of death", - "necessity": "optional", - "response": "present", - }, - "P734": {"name": "family name", "necessity": "required", "response": "present"}, - "P373": { - "name": "Commons category", - "necessity": "required", - "response": "present", - }, - "P4602": {"name": "date of burial or cremation", "necessity": "absent"}, - "P646": {"name": "Freebase ID", "necessity": "absent"}, - "P4819": { - "name": "Swedish Portrait Archive ID", - "necessity": "required", - "response": "present", - }, - "P3368": {"name": "Prabook ID", "necessity": "absent"}, - "P2600": { - "name": "Geni.com profile ID", - "necessity": "optional", - "response": "present", - }, - "P2561": {"name": "name", "necessity": "absent"}, - "P551": {"name": "residence", "necessity": "optional", "response": "present"}, - "P509": { - "name": "cause of death", - "necessity": "optional", - "response": "present", - }, - "P535": { - "name": "Find a Grave memorial ID", - "necessity": "optional", - "response": "present", - }, - "P109": {"name": "signature", "necessity": "optional", "response": "present"}, - "P1442": { - "name": "image of grave", - "necessity": "optional", - "response": "present", - }, - "P1196": { - "name": "manner of death", - "necessity": "optional", - "response": "missing", - }, - "P3373": {"name": "sibling", "necessity": "optional", "response": "missing"}, - "P22": {"name": "father", "necessity": "optional", "response": "missing"}, - "P25": {"name": "mother", "necessity": "optional", "response": "missing"}, - "P40": {"name": "child", "necessity": "optional", "response": "missing"}, - "P97": {"name": "noble title", "necessity": "optional", "response": "missing"}, - "P5056": { - "name": "patronym or matronym for this person", - "necessity": "optional", - "response": "missing", - }, - "P512": { - "name": "academic degree", - "necessity": "optional", - "response": "missing", - }, - "P69": {"name": "educated at", "necessity": "optional", "response": "missing"}, - "P2949": { - "name": "WikiTree person ID", - "necessity": "optional", - "response": "missing", - }, - "P9713": { - "name": "Swedish National Archive agent ID", - "necessity": "optional", - "response": "missing", - }, - "P485": {"name": "archives at", "necessity": "optional", "response": "missing"}, - "P9495": { - "name": "National Historical Museums of Sweden ID", - "necessity": "optional", - "response": "missing", - }, - "P5101": { - "name": "Swedish Literature Bank Author ID", - "necessity": "optional", - "response": "missing", - }, - "P3217": { - "name": "Dictionary of Swedish National Biography ID", - "necessity": "optional", - "response": "missing", - }, - "P4963": { - "name": "Svenskt kvinnobiografiskt lexikon ID", - "necessity": "optional", - "response": "missing", - }, - "P6821": { - "name": "Uppsala University Alvin ID", - "necessity": "optional", - "response": "missing", - }, - "P5587": {"name": "Libris-URI", "necessity": "optional", "response": "missing"}, - "P7847": { - "name": "DigitaltMuseum ID", - "necessity": "optional", - "response": "missing", - }, - "P1248": { - "name": "KulturNav-ID", - "necessity": "optional", - "response": "missing", - }, - "P5259": { - "name": "Swedish Gravestone ID", - "necessity": "optional", - "response": "missing", - }, - "P3618": { - "name": "base salary", - "necessity": "optional", - "response": "missing", - }, - }, - "statements": { - "q4802448$2B153142-5757-45BD-BB8E-EDBD6C505394": { - "property": "P21", - "necessity": "required", - "response": "correct", - }, - "Q4802448$6F4E8AEC-14A1-4AD0-AF79-AC26414E154C": { - "property": "P31", - "necessity": "required", - "response": "correct", - }, - "Q4802448$0484EB04-FF7F-4E06-8E30-EC45D00D5E6B": { - "property": "P102", - "necessity": "required", - "response": "allowed", - }, - "Q4802448$CE9C69A0-A0D2-498E-8159-3A4144412F64": { - "property": "P569", - "necessity": "required", - "response": "allowed", - }, - "Q4802448$396CFEEE-BDB5-40C3-85D4-A30C9CF6DB56": { - "property": "P570", - "necessity": "optional", - "response": "allowed", - }, - "Q4802448$FFB1A0F8-D15F-41F0-958E-1B43F631558A": { - "property": "P27", - "necessity": "required", - "response": "correct", - }, - "Q4802448$D26A0B14-EA5B-4A9A-A5C0-5A20FD912612": { - "property": "P106", - "necessity": "required", - "response": "correct", - }, - "Q4802448$0B0473FD-7EF8-421D-9C85-C4D2D95F3FA2": { - "property": "P106", - "necessity": "required", - "response": "allowed", - }, - "Q4802448$4DBC9F21-F384-4DCB-B040-A6E5FA45D9D8": { - "property": "P735", - "necessity": "required", - "response": "allowed", - }, - "Q4802448$0277dd51-445e-5014-d5bf-2cffc1eb8e96": { - "property": "P735", - "necessity": "required", - "response": "allowed", - }, - "Q4802448$c5afc898-4b44-1e0f-370b-0952661b2263": { - "property": "P735", - "necessity": "required", - "response": "allowed", - }, - "Q4802448$F2F3B54D-1B41-4760-A129-98F292C4FEA8": { - "property": "P18", - "necessity": "required", - "response": "allowed", - }, - "Q4802448$D767380D-21DD-411B-B742-0FC06FCFAB5A": { - "property": "P1343", - "necessity": "required", - "response": "allowed", - }, - "Q4802448$584F3970-E62D-4F31-A925-2B7D9B3F9420": { - "property": "P1343", - "necessity": "required", - "response": "allowed", - }, - "Q4802448$ed53e939-46b3-9361-db57-9505ebc69970": { - "property": "P1343", - "necessity": "required", - "response": "allowed", - }, - "Q4802448$C2F6DC9B-9E34-436F-92BA-FBAF35678CA0": { - "property": "P39", - "necessity": "optional", - "response": "missing", - }, - "Q4802448$95649645-9282-47BF-B7CE-9F795A2562C0": { - "property": "P119", - "necessity": "optional", - "response": "allowed", - }, - "Q4802448$51FCEBB3-4FB8-4EFB-95B7-0AA89B2F6137": { - "property": "P1412", - "necessity": "required", - "response": "correct", - }, - "Q4802448$7D198758-266A-401A-9AC1-6D6FA5E83FD4": { - "property": "P937", - "necessity": "required", - "response": "correct", - }, - "Q4802448$15A1D0F3-4843-4F01-A4ED-B412AF8D08A5": { - "property": "P1559", - "response": "not in schema", - }, - "Q4802448$2C5BE492-0778-484F-8B9E-4FE2CFA57756": { - "property": "P3222", - "response": "not in schema", - }, - "Q4802448$6ac93515-48dc-1964-cacf-e06c6c4be798": { - "property": "P19", - "necessity": "required", - "response": "allowed", - }, - "Q4802448$cf60fb00-4bf4-bfea-6b42-ace7fc8dc36d": { - "property": "P20", - "necessity": "optional", - "response": "allowed", - }, - "Q4802448$0cb0962d-4d3a-4fdf-d784-d803348586bb": { - "property": "P20", - "necessity": "optional", - "response": "allowed", - }, - "Q4802448$06F15D7F-E0CC-4704-BE7D-F1134E051485": { - "property": "P734", - "necessity": "required", - "response": "allowed", - }, - "Q4802448$04950009-6DAF-42C1-89E2-7093B26DF80C": { - "property": "P373", - "necessity": "required", - "response": "allowed", - }, - "Q4802448$22AA2038-D33F-4DA3-B725-C0A162A9A39D": { - "property": "P4602", - "response": "not in schema", - }, - "Q4802448$FE68BD20-0633-4D7C-9BBB-1A65C60FAD73": { - "property": "P646", - "response": "not in schema", - }, - "Q4802448$501fe9ac-4706-a3f6-224b-3c7da9ac8131": { - "property": "P4819", - "necessity": "required", - "response": "allowed", - }, - "Q4802448$bea3ccd9-4d8f-30c2-684b-e8590cfb7bf0": { - "property": "P4819", - "necessity": "required", - "response": "allowed", - }, - "Q4802448$BA25471E-6D65-4040-B541-04CBB60D8089": { - "property": "P3368", - "response": "not in schema", - }, - "Q4802448$7EB5C10C-AF05-4CD2-9ECE-38C56FB0D72E": { - "property": "P2600", - "necessity": "optional", - "response": "allowed", - }, - "Q4802448$FDE6987A-301E-4E67-B8E0-C035FA45FC63": { - "property": "P2561", - "response": "not in schema", - }, - "Q4802448$db6affac-431e-5f76-6890-b29f00e90397": { - "property": "P551", - "necessity": "optional", - "response": "allowed", - }, - "Q4802448$315e1e37-401d-1460-c876-f31c1071f6ed": { - "property": "P509", - "necessity": "optional", - "response": "allowed", - }, - "Q4802448$8d6aa8d9-4a97-40bc-21fa-f47dbb1ce697": { - "property": "P535", - "necessity": "optional", - "response": "allowed", - }, - "Q4802448$44d2c513-45d2-ebad-2181-32ffea9cf717": { - "property": "P109", - "necessity": "optional", - "response": "allowed", - }, - "Q4802448$103E30B9-C4F0-48DC-9145-8F00F3DB16DF": { - "property": "P1442", - "necessity": "optional", - "response": "allowed", - }, - }, -} -furrywikibase_convention_with_1_missing_required_property: Dict[Any, Any] = { - "error": "", - "general": {}, - "name": "ConFuzzled 2019", - "properties": { - "P1": { - "name": "instance of", - "necessity": "required", - "response": "missing", - } - }, - "schema": "E1", - "statements": {}, - "validity": {}, -} # P1 instance of is missing (this is fabricated for test purposes) - - -class TestResult(TestCase): - def setUp(self) -> None: - self.hiking_path_with_1_missing_required_property_result = Result( - **hiking_path_with_1_missing_required_property - ) - self.hiking_path_with_1_missing_required_property_result.analyze() - self.campsite_missing_correct_p31_result = Result( - **campsite_missing_correct_p31 - ) - self.campsite_missing_correct_p31_result.analyze() - self.campsite_not_allowed_p625_result = Result(**campsite_not_allowed_p625) - self.campsite_not_allowed_p625_result.analyze() - self.party_member_missing_p37_result = Result(**party_member_missing_p37) - self.party_member_missing_p37_result.analyze() - self.furrywikibase_convention_with_1_missing_required_property_result = Result( - **furrywikibase_convention_with_1_missing_required_property - ) - self.furrywikibase_convention_with_1_missing_required_property_result.analyze() - - def test___find_properties_with_too_many_statements__zero(self): - assert ( - len( - self.hiking_path_with_1_missing_required_property_result.properties_with_too_many_statements - ) - == 0 - ) - - def test__find_required_properties__three(self): - assert ( - len( - self.hiking_path_with_1_missing_required_property_result.required_properties - ) - == 3 - ) - - def test__find_missing_properties__(self): - assert ( - len( - self.hiking_path_with_1_missing_required_property_result.missing_properties - ) - == 41 - ) - - def test__find_required_properties_that_are_missing__(self): - assert ( - len( - self.hiking_path_with_1_missing_required_property_result.required_properties_that_are_missing - ) - == 1 - ) - - def test__find_optional_properties_that_are_missing__(self): - assert ( - len( - self.hiking_path_with_1_missing_required_property_result.optional_properties_that_are_missing - ) - == 40 - ) - - def test____find_incorrect_statements__(self): - assert ( - len( - self.hiking_path_with_1_missing_required_property_result.incorrect_statements - ) - == 0 - ) - - def test__find_properties_with_not_enough_correct_statements__(self): - assert ( - len( - self.campsite_missing_correct_p31_result.properties_without_enough_correct_statements - ) - == 1 - ) - assert ( - self.party_member_missing_p37_result.properties_without_enough_correct_statements - == {"P39"} - ) - - def test__find_statements_with_property_that_is_not_allowed__(self): - assert ( - len( - self.campsite_not_allowed_p625_result.statements_with_property_that_is_not_allowed - ) - == 1 - ) - - def test__repr__hiking_path_with_1_missing_required_property_result(self): - assert ( - repr(self.hiking_path_with_1_missing_required_property_result) - == "Valid: False\nRequired properties that are missing: length (P2043)" - ) - - def test__repr__campsite_not_allowed_p625_result(self): - assert repr(self.campsite_not_allowed_p625_result) == ( - "Valid: False\n" - "Properties with too many statements: coordinate location (P625)\n" - "Required properties that are missing: length (P2043)" - ) - - def test__repr__party_member_missing_p37_result(self): - assert repr(self.party_member_missing_p37_result) == ( - "Valid: False\n" - "Properties without enough correct statements: position held (P39)" - ) - - def test__repr__campsite_missing_correct_p31_result(self): - assert ( - repr(self.campsite_missing_correct_p31_result) - == "Valid: False\nProperties without enough correct statements: instance of (P31)" - ) - - def test_danish_labels_in_result_output(self): - self.party_member_missing_p37_result.lang = "da" - assert repr(self.party_member_missing_p37_result) == ( - "Valid: False\nProperties without enough " - "correct statements: embede (P39)" - ) - - def test_furrywikibase_convention_missing_p1(self): - - self.furrywikibase_convention_with_1_missing_required_property_result.wikibase_url = ( - "https://furry.wikibase.cloud" - ) - self.furrywikibase_convention_with_1_missing_required_property_result.mediawiki_api_url = ( - "https://furry.wikibase.cloud/w/api.php" - ) - assert ( - repr(self.furrywikibase_convention_with_1_missing_required_property_result) - == "Valid: False\nRequired properties that are missing: instance of (P1)" - ) +# from typing import Any +# from unittest import TestCase +# +# from entityvalidator.models.result import Result +# +# hiking_path_with_1_missing_required_property: dict[Any, Any] = { +# "error": "", +# "general": {}, +# "name": "hiking path", +# "properties": { +# "P10467": { +# "name": "naturkartan.se ID", +# "necessity": "optional", +# "response": "missing", +# }, +# "P112": { +# "name": "founded by", +# "necessity": "optional", +# "response": "missing", +# }, +# "P131": { +# "name": "located in the administrative territorial entity", +# "necessity": "required", +# "response": "present", +# }, +# "P1343": { +# "name": "described by source", +# "necessity": "optional", +# "response": "missing", +# }, +# "P137": { +# "name": "operator", +# "necessity": "optional", +# "response": "missing", +# }, +# "P138": { +# "name": "named after", +# "necessity": "optional", +# "response": "missing", +# }, +# "P1427": { +# "name": "start point", +# "necessity": "optional", +# "response": "missing", +# }, +# "P1444": { +# "name": "destination point", +# "necessity": "optional", +# "response": "missing", +# }, +# "P15": { +# "name": "route map", +# "necessity": "optional", +# "response": "missing", +# }, +# "P1545": { +# "name": "series ordinal", +# "necessity": "optional", +# "response": "missing", +# }, +# "P1552": { +# "name": "has quality", +# "necessity": "optional", +# "response": "missing", +# }, +# "P1589": { +# "name": "lowest point", +# "necessity": "optional", +# "response": "missing", +# }, +# "P17": {"name": "country", "necessity": "required", "response": "present"}, +# "P18": {"name": "image", "necessity": "optional", "response": "missing"}, +# "P1997": { +# "name": "Facebook Places ID", +# "necessity": "optional", +# "response": "missing", +# }, +# "P2043": {"name": "length", "necessity": "required", "response": "missing"}, +# "P206": { +# "name": "located in or next to body of water", +# "necessity": "optional", +# "response": "missing", +# }, +# "P214": {"name": "VIAF ID", "necessity": "optional", "response": "missing"}, +# "P2347": {"name": "YSO ID", "necessity": "optional", "response": "missing"}, +# "P242": { +# "name": "locator map image", +# "necessity": "optional", +# "response": "missing", +# }, +# "P2671": { +# "name": "Google Knowledge Graph ID", +# "necessity": "optional", +# "response": "missing", +# }, +# "P2789": { +# "name": "connects with", +# "necessity": "optional", +# "response": "missing", +# }, +# "P30": { +# "name": "continent", +# "necessity": "optional", +# "response": "missing", +# }, +# "P3018": { +# "name": "located in protected area", +# "necessity": "optional", +# "response": "missing", +# }, +# "P31": { +# "name": "instance of", +# "necessity": "optional", +# "response": "correct", +# }, +# "P3173": { +# "name": "offers view on", +# "necessity": "optional", +# "response": "missing", +# }, +# "P361": {"name": "part of", "necessity": "optional", "response": "missing"}, +# "P373": { +# "name": "Commons category", +# "necessity": "optional", +# "response": "missing", +# }, +# "P402": { +# "name": "OpenStreetMap relation ID", +# "necessity": "optional", +# "response": "missing", +# }, +# "P4552": { +# "name": "mountain range", +# "necessity": "optional", +# "response": "missing", +# }, +# "P527": { +# "name": "has part(s)", +# "necessity": "optional", +# "response": "missing", +# }, +# "P559": { +# "name": "terminus", +# "necessity": "optional", +# "response": "missing", +# }, +# "P571": { +# "name": "inception", +# "necessity": "optional", +# "response": "missing", +# }, +# "P609": { +# "name": "terminus location", +# "necessity": "optional", +# "response": "missing", +# }, +# "P610": { +# "name": "highest point", +# "necessity": "optional", +# "response": "missing", +# }, +# "P6104": { +# "name": "maintained by WikiProject", +# "necessity": "optional", +# "response": "missing", +# }, +# "P625": { +# "name": "coordinate location", +# "necessity": "absent", +# "response": "missing", +# }, +# "P646": { +# "name": "Freebase ID", +# "necessity": "optional", +# "response": "missing", +# }, +# "P691": { +# "name": "NL CR AUT ID", +# "necessity": "optional", +# "response": "missing", +# }, +# "P706": { +# "name": "located in/on physical feature", +# "necessity": "optional", +# "response": "missing", +# }, +# "P7127": { +# "name": "AllTrails trail ID", +# "necessity": "optional", +# "response": "missing", +# }, +# "P7252": { +# "name": "degree of difficulty", +# "necessity": "optional", +# "response": "missing", +# }, +# "P856": { +# "name": "official website", +# "necessity": "optional", +# "response": "missing", +# }, +# "P910": { +# "name": "topic's main category", +# "necessity": "optional", +# "response": "missing", +# }, +# "P973": { +# "name": "described at URL", +# "necessity": "optional", +# "response": "present", +# }, +# }, +# "schema": "E375", +# "statements": { +# "Q119845590$11794598-A67C-4978-8D1D-359B90E5EE15": { +# "necessity": "optional", +# "property": "P973", +# "response": "allowed", +# }, +# "Q119845590$1CEFCE58-826A-4243-A9D2-CF47BF9F493E": { +# "necessity": "required", +# "property": "P131", +# "response": "allowed", +# }, +# "Q119845590$72CEF06C-C5AE-40DE-AB61-D530914AFD4E": { +# "necessity": "optional", +# "property": "P31", +# "response": "correct", +# }, +# "Q119845590$9C7FBBB4-7302-423F-AF51-C46A07F680CD": { +# "necessity": "required", +# "property": "P131", +# "response": "allowed", +# }, +# "Q119845590$D036FE30-1DFD-461A-8AA2-AA0CB977E22D": { +# "necessity": "required", +# "property": "P17", +# "response": "allowed", +# }, +# }, +# "validity": {}, +# } # P2043 length is missing +# campsite_missing_correct_p31: dict[Any, Any] = { +# "error": "", +# "general": {}, +# "name": "campsite", +# "properties": { +# "P10467": { +# "name": "naturkartan.se ID", +# "necessity": "optional", +# "response": "missing", +# }, +# "P11177": { +# "name": "Camp Wild ID", +# "necessity": "optional", +# "response": "missing", +# }, +# "P131": { +# "name": "located in the administrative territorial entity", +# "necessity": "required", +# "response": "present", +# }, +# "P137": { +# "name": "operator", +# "necessity": "required", +# "response": "present", +# }, +# "P138": { +# "name": "named after", +# "necessity": "optional", +# "response": "missing", +# }, +# "P1448": { +# "name": "official name", +# "necessity": "optional", +# "response": "missing", +# }, +# "P17": {"name": "country", "necessity": "required", "response": "present"}, +# "P18": {"name": "image", "necessity": "optional", "response": "missing"}, +# "P206": { +# "name": "located in or next to body of water", +# "necessity": "optional", +# "response": "missing", +# }, +# "P242": { +# "name": "locator map image", +# "necessity": "optional", +# "response": "missing", +# }, +# "P2670": { +# "name": "has part(s) of the class", +# "necessity": "optional", +# "response": "missing", +# }, +# "P276": { +# "name": "location", +# "necessity": "optional", +# "response": "present", +# }, +# "P30": { +# "name": "continent", +# "necessity": "optional", +# "response": "missing", +# }, +# "P3018": { +# "name": "located in protected area", +# "necessity": "optional", +# "response": "missing", +# }, +# "P31": { +# "name": "instance of", +# "necessity": "required", +# "response": "not enough correct statements", +# }, +# "P3173": { +# "name": "offers view on", +# "necessity": "optional", +# "response": "missing", +# }, +# "P373": { +# "name": "Commons category", +# "necessity": "optional", +# "response": "missing", +# }, +# "P402": { +# "name": "OpenStreetMap relation ID", +# "necessity": "optional", +# "response": "missing", +# }, +# "P4552": { +# "name": "mountain range", +# "necessity": "optional", +# "response": "missing", +# }, +# "P527": { +# "name": "has part(s)", +# "necessity": "optional", +# "response": "missing", +# }, +# "P571": { +# "name": "inception", +# "necessity": "optional", +# "response": "missing", +# }, +# "P5775": { +# "name": "image of interior", +# "necessity": "absent", +# "response": "missing", +# }, +# "P625": { +# "name": "coordinate location", +# "necessity": "required", +# "response": "present", +# }, +# "P706": { +# "name": "located in/on physical feature", +# "necessity": "optional", +# "response": "missing", +# }, +# "P7418": { +# "name": "image of frontside", +# "necessity": "optional", +# "response": "missing", +# }, +# "P8517": {"name": "view", "necessity": "optional", "response": "missing"}, +# "P856": { +# "name": "official website", +# "necessity": "optional", +# "response": "missing", +# }, +# "P912": { +# "name": "has facility", +# "necessity": "optional", +# "response": "missing", +# }, +# "P9676": { +# "name": "Vindskyddskartan.se ID", +# "necessity": "optional", +# "response": "missing", +# }, +# "P973": { +# "name": "described at URL", +# "necessity": "optional", +# "response": "present", +# }, +# }, +# "schema": "E376", +# "statements": { +# "Q119853974$20823AE2-6F1A-43FB-9C9C-A6C2CC772446": { +# "necessity": "required", +# "property": "P137", +# "response": "allowed", +# }, +# "Q119853974$3F1F91A9-693C-41AA-A5C7-54E711D83594": { +# "necessity": "required", +# "property": "P17", +# "response": "allowed", +# }, +# "Q119853974$4A29484F-6C84-4B5A-B9E9-25344162CFCB": { +# "necessity": "required", +# "property": "P625", +# "response": "allowed", +# }, +# "Q119853974$4BCAA6A7-8857-4056-B286-7B646A2D72C9": { +# "necessity": "required", +# "property": "P131", +# "response": "allowed", +# }, +# "Q119853974$8E8612BE-78F7-463A-8E35-96F53277E3B4": { +# "necessity": "optional", +# "property": "P276", +# "response": "allowed", +# }, +# "Q119853974$AA270DBF-B117-45DD-AF68-8F1A7AFC56F1": { +# "necessity": "required", +# "property": "P31", +# "response": "allowed", +# }, +# "Q119853974$C25AF244-F0D9-4E19-8126-42092C0FA4FB": { +# "necessity": "optional", +# "property": "P973", +# "response": "allowed", +# }, +# "Q119853974$CD71CE83-F045-486B-873F-F7A8FB437E2A": { +# "necessity": "required", +# "property": "P131", +# "response": "allowed", +# }, +# }, +# "validity": {}, +# } +# campsite_not_allowed_p625: dict[Any, Any] = { +# "error": "", +# "general": {}, +# "name": "hiking path", +# "properties": { +# "P10467": { +# "name": "naturkartan.se ID", +# "necessity": "optional", +# "response": "missing", +# }, +# "P112": { +# "name": "founded by", +# "necessity": "optional", +# "response": "missing", +# }, +# "P131": { +# "name": "located in the administrative territorial entity", +# "necessity": "required", +# "response": "present", +# }, +# "P1343": { +# "name": "described by source", +# "necessity": "optional", +# "response": "missing", +# }, +# "P137": { +# "name": "operator", +# "necessity": "optional", +# "response": "present", +# }, +# "P138": { +# "name": "named after", +# "necessity": "optional", +# "response": "missing", +# }, +# "P1427": { +# "name": "start point", +# "necessity": "optional", +# "response": "missing", +# }, +# "P1444": { +# "name": "destination point", +# "necessity": "optional", +# "response": "missing", +# }, +# "P15": { +# "name": "route map", +# "necessity": "optional", +# "response": "missing", +# }, +# "P1545": { +# "name": "series ordinal", +# "necessity": "optional", +# "response": "missing", +# }, +# "P1552": { +# "name": "has quality", +# "necessity": "optional", +# "response": "missing", +# }, +# "P1589": { +# "name": "lowest point", +# "necessity": "optional", +# "response": "missing", +# }, +# "P17": {"name": "country", "necessity": "required", "response": "present"}, +# "P18": {"name": "image", "necessity": "optional", "response": "missing"}, +# "P1997": { +# "name": "Facebook Places ID", +# "necessity": "optional", +# "response": "missing", +# }, +# "P2043": {"name": "length", "necessity": "required", "response": "missing"}, +# "P206": { +# "name": "located in or next to body of water", +# "necessity": "optional", +# "response": "missing", +# }, +# "P214": {"name": "VIAF ID", "necessity": "optional", "response": "missing"}, +# "P2347": {"name": "YSO ID", "necessity": "optional", "response": "missing"}, +# "P242": { +# "name": "locator map image", +# "necessity": "optional", +# "response": "missing", +# }, +# "P2671": { +# "name": "Google Knowledge Graph ID", +# "necessity": "optional", +# "response": "missing", +# }, +# "P276": {"name": "location", "necessity": "absent"}, +# "P2789": { +# "name": "connects with", +# "necessity": "optional", +# "response": "missing", +# }, +# "P30": { +# "name": "continent", +# "necessity": "optional", +# "response": "missing", +# }, +# "P3018": { +# "name": "located in protected area", +# "necessity": "optional", +# "response": "missing", +# }, +# "P31": { +# "name": "instance of", +# "necessity": "optional", +# "response": "present", +# }, +# "P3173": { +# "name": "offers view on", +# "necessity": "optional", +# "response": "missing", +# }, +# "P361": {"name": "part of", "necessity": "optional", "response": "missing"}, +# "P373": { +# "name": "Commons category", +# "necessity": "optional", +# "response": "missing", +# }, +# "P402": { +# "name": "OpenStreetMap relation ID", +# "necessity": "optional", +# "response": "missing", +# }, +# "P4552": { +# "name": "mountain range", +# "necessity": "optional", +# "response": "missing", +# }, +# "P527": { +# "name": "has part(s)", +# "necessity": "optional", +# "response": "present", +# }, +# "P559": { +# "name": "terminus", +# "necessity": "optional", +# "response": "missing", +# }, +# "P571": { +# "name": "inception", +# "necessity": "optional", +# "response": "missing", +# }, +# "P609": { +# "name": "terminus location", +# "necessity": "optional", +# "response": "missing", +# }, +# "P610": { +# "name": "highest point", +# "necessity": "optional", +# "response": "missing", +# }, +# "P6104": { +# "name": "maintained by WikiProject", +# "necessity": "optional", +# "response": "missing", +# }, +# "P625": { +# "name": "coordinate location", +# "necessity": "absent", +# "response": "too many statements", +# }, +# "P646": { +# "name": "Freebase ID", +# "necessity": "optional", +# "response": "missing", +# }, +# "P691": { +# "name": "NL CR AUT ID", +# "necessity": "optional", +# "response": "missing", +# }, +# "P706": { +# "name": "located in/on physical feature", +# "necessity": "optional", +# "response": "missing", +# }, +# "P7127": { +# "name": "AllTrails trail ID", +# "necessity": "optional", +# "response": "missing", +# }, +# "P7252": { +# "name": "degree of difficulty", +# "necessity": "optional", +# "response": "missing", +# }, +# "P856": { +# "name": "official website", +# "necessity": "optional", +# "response": "missing", +# }, +# "P910": { +# "name": "topic's main category", +# "necessity": "optional", +# "response": "missing", +# }, +# "P912": {"name": "has facility", "necessity": "absent"}, +# "P973": { +# "name": "described at URL", +# "necessity": "optional", +# "response": "present", +# }, +# }, +# "schema": "E375", +# "statements": { +# "Q119853967$36193CA1-6DF5-4DAC-910E-0319812671FB": { +# "necessity": "required", +# "property": "P131", +# "response": "allowed", +# }, +# "Q119853967$43477af1-49e1-e0fd-8672-fbad6c66dd96": { +# "necessity": "optional", +# "property": "P527", +# "response": "allowed", +# }, +# "Q119853967$5C65C2A6-DA72-4C71-83E2-0C626C906506": { +# "property": "P276", +# "response": "not in schema", +# }, +# "Q119853967$5DF7E848-400D-4AEE-B2AD-A06D92ACA2DD": { +# "necessity": "absent", +# "property": "P625", +# "response": "allowed", +# }, +# "Q119853967$736c7261-4e8c-e754-e817-e8b253ae5e7b": { +# "property": "P912", +# "response": "not in schema", +# }, +# "Q119853967$7A4E524F-12CE-40C1-B709-4876A2C465D6": { +# "necessity": "optional", +# "property": "P137", +# "response": "allowed", +# }, +# "Q119853967$7F83F435-83AC-4210-A717-ED3DE033319D": { +# "necessity": "required", +# "property": "P17", +# "response": "allowed", +# }, +# "Q119853967$874d280c-427c-8c9d-8ccb-3bd107e7d6a4": { +# "necessity": "optional", +# "property": "P527", +# "response": "allowed", +# }, +# "Q119853967$C30A3085-F06D-4834-A887-CDDBC314EE7F": { +# "necessity": "required", +# "property": "P131", +# "response": "allowed", +# }, +# "Q119853967$C98E6C4A-98F8-47EA-8791-C4C85262FC9B": { +# "necessity": "optional", +# "property": "P973", +# "response": "allowed", +# }, +# "Q119853967$D8462BF0-2599-4F62-8147-E84465529B19": { +# "necessity": "optional", +# "property": "P31", +# "response": "allowed", +# }, +# }, +# "validity": {}, +# } +# party_member_missing_p37: dict[Any, Any] = { +# "general": {}, +# "properties": { +# "P21": { +# "name": "sex or gender", +# "necessity": "required", +# "response": "correct", +# }, +# "P31": {"name": "instance of", "necessity": "required", "response": "correct"}, +# "P102": { +# "name": "member of political party", +# "necessity": "required", +# "response": "present", +# }, +# "P569": { +# "name": "date of birth", +# "necessity": "required", +# "response": "present", +# }, +# "P570": { +# "name": "date of death", +# "necessity": "optional", +# "response": "present", +# }, +# "P27": { +# "name": "country of citizenship", +# "necessity": "required", +# "response": "correct", +# }, +# "P106": {"name": "occupation", "necessity": "required", "response": "correct"}, +# "P735": {"name": "given name", "necessity": "required", "response": "present"}, +# "P18": {"name": "image", "necessity": "required", "response": "present"}, +# "P1343": { +# "name": "described by source", +# "necessity": "required", +# "response": "present", +# }, +# "P39": { +# "name": "position held", +# "necessity": "optional", +# "response": "not enough correct statements", +# }, +# "P119": { +# "name": "place of burial", +# "necessity": "optional", +# "response": "present", +# }, +# "P1412": { +# "name": "languages spoken, written or signed", +# "necessity": "required", +# "response": "correct", +# }, +# "P937": { +# "name": "work location", +# "necessity": "required", +# "response": "correct", +# }, +# "P1559": {"name": "name in native language", "necessity": "absent"}, +# "P3222": {"name": "NE.se ID", "necessity": "absent"}, +# "P19": { +# "name": "place of birth", +# "necessity": "required", +# "response": "present", +# }, +# "P20": { +# "name": "place of death", +# "necessity": "optional", +# "response": "present", +# }, +# "P734": {"name": "family name", "necessity": "required", "response": "present"}, +# "P373": { +# "name": "Commons category", +# "necessity": "required", +# "response": "present", +# }, +# "P4602": {"name": "date of burial or cremation", "necessity": "absent"}, +# "P646": {"name": "Freebase ID", "necessity": "absent"}, +# "P4819": { +# "name": "Swedish Portrait Archive ID", +# "necessity": "required", +# "response": "present", +# }, +# "P3368": {"name": "Prabook ID", "necessity": "absent"}, +# "P2600": { +# "name": "Geni.com profile ID", +# "necessity": "optional", +# "response": "present", +# }, +# "P2561": {"name": "name", "necessity": "absent"}, +# "P551": {"name": "residence", "necessity": "optional", "response": "present"}, +# "P509": { +# "name": "cause of death", +# "necessity": "optional", +# "response": "present", +# }, +# "P535": { +# "name": "Find a Grave memorial ID", +# "necessity": "optional", +# "response": "present", +# }, +# "P109": {"name": "signature", "necessity": "optional", "response": "present"}, +# "P1442": { +# "name": "image of grave", +# "necessity": "optional", +# "response": "present", +# }, +# "P1196": { +# "name": "manner of death", +# "necessity": "optional", +# "response": "missing", +# }, +# "P3373": {"name": "sibling", "necessity": "optional", "response": "missing"}, +# "P22": {"name": "father", "necessity": "optional", "response": "missing"}, +# "P25": {"name": "mother", "necessity": "optional", "response": "missing"}, +# "P40": {"name": "child", "necessity": "optional", "response": "missing"}, +# "P97": {"name": "noble title", "necessity": "optional", "response": "missing"}, +# "P5056": { +# "name": "patronym or matronym for this person", +# "necessity": "optional", +# "response": "missing", +# }, +# "P512": { +# "name": "academic degree", +# "necessity": "optional", +# "response": "missing", +# }, +# "P69": {"name": "educated at", "necessity": "optional", "response": "missing"}, +# "P2949": { +# "name": "WikiTree person ID", +# "necessity": "optional", +# "response": "missing", +# }, +# "P9713": { +# "name": "Swedish National Archive agent ID", +# "necessity": "optional", +# "response": "missing", +# }, +# "P485": {"name": "archives at", "necessity": "optional", "response": "missing"}, +# "P9495": { +# "name": "National Historical Museums of Sweden ID", +# "necessity": "optional", +# "response": "missing", +# }, +# "P5101": { +# "name": "Swedish Literature Bank Author ID", +# "necessity": "optional", +# "response": "missing", +# }, +# "P3217": { +# "name": "Dictionary of Swedish National Biography ID", +# "necessity": "optional", +# "response": "missing", +# }, +# "P4963": { +# "name": "Svenskt kvinnobiografiskt lexikon ID", +# "necessity": "optional", +# "response": "missing", +# }, +# "P6821": { +# "name": "Uppsala University Alvin ID", +# "necessity": "optional", +# "response": "missing", +# }, +# "P5587": {"name": "Libris-URI", "necessity": "optional", "response": "missing"}, +# "P7847": { +# "name": "DigitaltMuseum ID", +# "necessity": "optional", +# "response": "missing", +# }, +# "P1248": { +# "name": "KulturNav-ID", +# "necessity": "optional", +# "response": "missing", +# }, +# "P5259": { +# "name": "Swedish Gravestone ID", +# "necessity": "optional", +# "response": "missing", +# }, +# "P3618": { +# "name": "base salary", +# "necessity": "optional", +# "response": "missing", +# }, +# }, +# "statements": { +# "q4802448$2B153142-5757-45BD-BB8E-EDBD6C505394": { +# "property": "P21", +# "necessity": "required", +# "response": "correct", +# }, +# "Q4802448$6F4E8AEC-14A1-4AD0-AF79-AC26414E154C": { +# "property": "P31", +# "necessity": "required", +# "response": "correct", +# }, +# "Q4802448$0484EB04-FF7F-4E06-8E30-EC45D00D5E6B": { +# "property": "P102", +# "necessity": "required", +# "response": "allowed", +# }, +# "Q4802448$CE9C69A0-A0D2-498E-8159-3A4144412F64": { +# "property": "P569", +# "necessity": "required", +# "response": "allowed", +# }, +# "Q4802448$396CFEEE-BDB5-40C3-85D4-A30C9CF6DB56": { +# "property": "P570", +# "necessity": "optional", +# "response": "allowed", +# }, +# "Q4802448$FFB1A0F8-D15F-41F0-958E-1B43F631558A": { +# "property": "P27", +# "necessity": "required", +# "response": "correct", +# }, +# "Q4802448$D26A0B14-EA5B-4A9A-A5C0-5A20FD912612": { +# "property": "P106", +# "necessity": "required", +# "response": "correct", +# }, +# "Q4802448$0B0473FD-7EF8-421D-9C85-C4D2D95F3FA2": { +# "property": "P106", +# "necessity": "required", +# "response": "allowed", +# }, +# "Q4802448$4DBC9F21-F384-4DCB-B040-A6E5FA45D9D8": { +# "property": "P735", +# "necessity": "required", +# "response": "allowed", +# }, +# "Q4802448$0277dd51-445e-5014-d5bf-2cffc1eb8e96": { +# "property": "P735", +# "necessity": "required", +# "response": "allowed", +# }, +# "Q4802448$c5afc898-4b44-1e0f-370b-0952661b2263": { +# "property": "P735", +# "necessity": "required", +# "response": "allowed", +# }, +# "Q4802448$F2F3B54D-1B41-4760-A129-98F292C4FEA8": { +# "property": "P18", +# "necessity": "required", +# "response": "allowed", +# }, +# "Q4802448$D767380D-21DD-411B-B742-0FC06FCFAB5A": { +# "property": "P1343", +# "necessity": "required", +# "response": "allowed", +# }, +# "Q4802448$584F3970-E62D-4F31-A925-2B7D9B3F9420": { +# "property": "P1343", +# "necessity": "required", +# "response": "allowed", +# }, +# "Q4802448$ed53e939-46b3-9361-db57-9505ebc69970": { +# "property": "P1343", +# "necessity": "required", +# "response": "allowed", +# }, +# "Q4802448$C2F6DC9B-9E34-436F-92BA-FBAF35678CA0": { +# "property": "P39", +# "necessity": "optional", +# "response": "missing", +# }, +# "Q4802448$95649645-9282-47BF-B7CE-9F795A2562C0": { +# "property": "P119", +# "necessity": "optional", +# "response": "allowed", +# }, +# "Q4802448$51FCEBB3-4FB8-4EFB-95B7-0AA89B2F6137": { +# "property": "P1412", +# "necessity": "required", +# "response": "correct", +# }, +# "Q4802448$7D198758-266A-401A-9AC1-6D6FA5E83FD4": { +# "property": "P937", +# "necessity": "required", +# "response": "correct", +# }, +# "Q4802448$15A1D0F3-4843-4F01-A4ED-B412AF8D08A5": { +# "property": "P1559", +# "response": "not in schema", +# }, +# "Q4802448$2C5BE492-0778-484F-8B9E-4FE2CFA57756": { +# "property": "P3222", +# "response": "not in schema", +# }, +# "Q4802448$6ac93515-48dc-1964-cacf-e06c6c4be798": { +# "property": "P19", +# "necessity": "required", +# "response": "allowed", +# }, +# "Q4802448$cf60fb00-4bf4-bfea-6b42-ace7fc8dc36d": { +# "property": "P20", +# "necessity": "optional", +# "response": "allowed", +# }, +# "Q4802448$0cb0962d-4d3a-4fdf-d784-d803348586bb": { +# "property": "P20", +# "necessity": "optional", +# "response": "allowed", +# }, +# "Q4802448$06F15D7F-E0CC-4704-BE7D-F1134E051485": { +# "property": "P734", +# "necessity": "required", +# "response": "allowed", +# }, +# "Q4802448$04950009-6DAF-42C1-89E2-7093B26DF80C": { +# "property": "P373", +# "necessity": "required", +# "response": "allowed", +# }, +# "Q4802448$22AA2038-D33F-4DA3-B725-C0A162A9A39D": { +# "property": "P4602", +# "response": "not in schema", +# }, +# "Q4802448$FE68BD20-0633-4D7C-9BBB-1A65C60FAD73": { +# "property": "P646", +# "response": "not in schema", +# }, +# "Q4802448$501fe9ac-4706-a3f6-224b-3c7da9ac8131": { +# "property": "P4819", +# "necessity": "required", +# "response": "allowed", +# }, +# "Q4802448$bea3ccd9-4d8f-30c2-684b-e8590cfb7bf0": { +# "property": "P4819", +# "necessity": "required", +# "response": "allowed", +# }, +# "Q4802448$BA25471E-6D65-4040-B541-04CBB60D8089": { +# "property": "P3368", +# "response": "not in schema", +# }, +# "Q4802448$7EB5C10C-AF05-4CD2-9ECE-38C56FB0D72E": { +# "property": "P2600", +# "necessity": "optional", +# "response": "allowed", +# }, +# "Q4802448$FDE6987A-301E-4E67-B8E0-C035FA45FC63": { +# "property": "P2561", +# "response": "not in schema", +# }, +# "Q4802448$db6affac-431e-5f76-6890-b29f00e90397": { +# "property": "P551", +# "necessity": "optional", +# "response": "allowed", +# }, +# "Q4802448$315e1e37-401d-1460-c876-f31c1071f6ed": { +# "property": "P509", +# "necessity": "optional", +# "response": "allowed", +# }, +# "Q4802448$8d6aa8d9-4a97-40bc-21fa-f47dbb1ce697": { +# "property": "P535", +# "necessity": "optional", +# "response": "allowed", +# }, +# "Q4802448$44d2c513-45d2-ebad-2181-32ffea9cf717": { +# "property": "P109", +# "necessity": "optional", +# "response": "allowed", +# }, +# "Q4802448$103E30B9-C4F0-48DC-9145-8F00F3DB16DF": { +# "property": "P1442", +# "necessity": "optional", +# "response": "allowed", +# }, +# }, +# } +# furrywikibase_convention_with_1_missing_required_property: dict[Any, Any] = { +# "error": "", +# "general": {}, +# "name": "ConFuzzled 2019", +# "properties": { +# "P1": { +# "name": "instance of", +# "necessity": "required", +# "response": "missing", +# } +# }, +# "schema": "E1", +# "statements": {}, +# "validity": {}, +# } # P1 instance of is missing (this is fabricated for test purposes) +# +# +# class TestResult(TestCase): +# def setUp(self) -> None: +# self.hiking_path_with_1_missing_required_property_result = Result( +# **hiking_path_with_1_missing_required_property +# ) +# self.hiking_path_with_1_missing_required_property_result.analyze() +# self.campsite_missing_correct_p31_result = Result( +# **campsite_missing_correct_p31 +# ) +# self.campsite_missing_correct_p31_result.analyze() +# self.campsite_not_allowed_p625_result = Result(**campsite_not_allowed_p625) +# self.campsite_not_allowed_p625_result.analyze() +# self.party_member_missing_p37_result = Result(**party_member_missing_p37) +# self.party_member_missing_p37_result.analyze() +# self.furrywikibase_convention_with_1_missing_required_property_result = Result( +# **furrywikibase_convention_with_1_missing_required_property +# ) +# self.furrywikibase_convention_with_1_missing_required_property_result.analyze() +# +# def test___find_properties_with_too_many_statements__zero(self): +# assert ( +# len( +# self.hiking_path_with_1_missing_required_property_result.properties_with_too_many_statements +# ) +# == 0 +# ) +# +# def test__find_required_properties__three(self): +# assert ( +# len( +# self.hiking_path_with_1_missing_required_property_result.required_properties +# ) +# == 3 +# ) +# +# def test__find_missing_properties__(self): +# assert ( +# len( +# self.hiking_path_with_1_missing_required_property_result.missing_properties +# ) +# == 41 +# ) +# +# def test__find_required_properties_that_are_missing__(self): +# assert ( +# len( +# self.hiking_path_with_1_missing_required_property_result.required_properties_that_are_missing +# ) +# == 1 +# ) +# +# def test__find_optional_properties_that_are_missing__(self): +# assert ( +# len( +# self.hiking_path_with_1_missing_required_property_result.optional_properties_that_are_missing +# ) +# == 40 +# ) +# +# def test____find_incorrect_statements__(self): +# assert ( +# len( +# self.hiking_path_with_1_missing_required_property_result.incorrect_statements +# ) +# == 0 +# ) +# +# def test__find_properties_with_not_enough_correct_statements__(self): +# assert ( +# len( +# self.campsite_missing_correct_p31_result.properties_without_enough_correct_statements +# ) +# == 1 +# ) +# assert ( +# self.party_member_missing_p37_result.properties_without_enough_correct_statements +# == {"P39"} +# ) +# +# def test__find_statements_with_property_that_is_not_allowed__(self): +# assert ( +# len( +# self.campsite_not_allowed_p625_result.statements_with_property_that_is_not_allowed +# ) +# == 1 +# ) +# +# def test__repr__hiking_path_with_1_missing_required_property_result(self): +# assert ( +# repr(self.hiking_path_with_1_missing_required_property_result) +# == "Valid: False\nRequired properties that are missing: length (P2043)" +# ) +# +# def test__repr__campsite_not_allowed_p625_result(self): +# assert repr(self.campsite_not_allowed_p625_result) == ( +# "Valid: False\n" +# "Properties with too many statements: coordinate location (P625)\n" +# "Required properties that are missing: length (P2043)" +# ) +# +# def test__repr__party_member_missing_p37_result(self): +# assert repr(self.party_member_missing_p37_result) == ( +# "Valid: False\n" +# "Properties without enough correct statements: position held (P39)" +# ) +# +# def test__repr__campsite_missing_correct_p31_result(self): +# assert ( +# repr(self.campsite_missing_correct_p31_result) +# == "Valid: False\nProperties without enough correct statements: instance of (P31)" +# ) +# +# def test_danish_labels_in_result_output(self): +# self.party_member_missing_p37_result.lang = "da" +# assert repr(self.party_member_missing_p37_result) == ( +# "Valid: False\nProperties without enough " +# "correct statements: embede (P39)" +# ) +# +# def test_furrywikibase_convention_missing_p1(self): +# +# self.furrywikibase_convention_with_1_missing_required_property_result.wikibase_url = ( +# "https://furry.wikibase.cloud" +# ) +# self.furrywikibase_convention_with_1_missing_required_property_result.mediawiki_api_url = ( +# "https://furry.wikibase.cloud/w/api.php" +# ) +# assert ( +# repr(self.furrywikibase_convention_with_1_missing_required_property_result) +# == "Valid: False\nRequired properties that are missing: instance of (P1)" +# )