From 64839f8af3531bc952577ed8fa1deebe6e5c6840 Mon Sep 17 00:00:00 2001 From: Juanje Mendoza Date: Mon, 2 Feb 2026 15:44:58 +0100 Subject: [PATCH 01/27] Google compliant optioni with -gc. Reference, Logos. Fixes #775, #594, #564, #563, #555, #597, #725, #610 555 Solved in previous commits 725 dockerile parse solved previosly. 610 type in documentation solved previously --- README.md | 7 +- src/somef/__main__.py | 6 + src/somef/export/google_codemeta_export.py | 171 ++++++ src/somef/export/json_export.py | 19 +- src/somef/header_analysis.py | 50 ++ src/somef/regular_expressions.py | 117 +++- src/somef/somef_cli.py | 20 +- src/somef/test/test_data/README-agora.md | 511 ++++++++++++++++++ src/somef/test/test_data/README-csl-editor.md | 57 ++ src/somef/test/test_data/README-tpronk.md | 75 +++ .../test/test_google_compliant_export.py | 50 ++ src/somef/test/test_header_analysis.py | 28 + src/somef/test/test_regular_expressions.py | 33 ++ 13 files changed, 1113 insertions(+), 31 deletions(-) create mode 100644 src/somef/export/google_codemeta_export.py create mode 100644 src/somef/test/test_data/README-agora.md create mode 100644 src/somef/test/test_data/README-csl-editor.md create mode 100644 src/somef/test/test_data/README-tpronk.md create mode 100644 src/somef/test/test_google_compliant_export.py diff --git a/README.md b/README.md index 4d8ad839..893ac8db 100644 --- a/README.md +++ b/README.md @@ -294,13 +294,16 @@ Options: Output: [required_any] -o, --output PATH Path to the output file. If supplied, the output will be in JSON - -c, --codemeta_out PATH Path to an output codemeta file -g, --graph_out PATH Path to the output Knowledge Graph export file. If supplied, the output will be a Knowledge Graph, in the format given in the --format option chosen (turtle, json-ld) - + -gc, --google_codemeta_out PATH Path to a Google-compliant Codemeta JSON-LD + file. This output transforms the standard + Codemeta to follow Google’s expected JSON-LD + structure. + -f, --graph_format [turtle|json-ld] If the --graph_out option is given, this is the format that the graph will be stored in diff --git a/src/somef/__main__.py b/src/somef/__main__.py index 9df797cb..b691c141 100644 --- a/src/somef/__main__.py +++ b/src/somef/__main__.py @@ -114,6 +114,12 @@ def configure(auto, base_uri): type=click.Path(), help="Path to an output codemeta file" ) +@optgroup.option( + "--google_codemeta_out", + "-gc", + type=click.Path(), + help="Path to an output Google-compliant codemeta file" +) @optgroup.option( "--graph_out", "-g", diff --git a/src/somef/export/google_codemeta_export.py b/src/somef/export/google_codemeta_export.py new file mode 100644 index 00000000..e420d6b8 --- /dev/null +++ b/src/somef/export/google_codemeta_export.py @@ -0,0 +1,171 @@ +import json +import copy +from . import json_export + + +def save_google_codemeta_output(repo_data, output_path, pretty=False, requirements_mode="all"): + """ + Generate a Google-compliant Codemeta JSON-LD file from repo_data. + """ + + # Generate base codemeta using SOMEF. It is basically a codemeta file with a few changes. + # This way we have the core in the codemeta export and changes about content go just in the first method. + + json_export.save_codemeta_output( + repo_data, + output_path, + pretty=pretty, + requirements_mode=requirements_mode + ) + + # Load the generated codemeta + with open(output_path, "r") as f: + codemeta = json.load(f) + + # Apply google-compliant transformations + codemeta = make_google_compliant(codemeta) + + # Overwrite the same file (no tmp file) + with open(output_path, "w") as f: + if pretty: + json.dump(codemeta, f, indent=2, sort_keys=True) + else: + json.dump(codemeta, f) + + +SCHEMA_ORG_PROPERTIES = { + "@type", + "name", + "description", + "author", + "keywords", + "license", + "url", + "identifier", + "programmingLanguage", + "releaseNotes", + "releaseDate" + } + +def make_google_compliant(codemeta): + codemeta = copy.deepcopy(codemeta) + + # context is different from codemeta + codemeta["@context"] = { + "@vocab": "https://schema.org/", + "codemeta": "https://w3id.org/codemeta/3.0/" + } + + # Some categories must be in a @list even if only one value is present. Required order + for prop in ["author", "contributor", "editor"]: + if prop in codemeta: + codemeta[prop] = wrap_list(codemeta[prop]) + + # referencePublication.author is also a list + if "referencePublication" in codemeta: + for pub in codemeta["referencePublication"]: + if "author" in pub: + pub["author"] = wrap_list(pub["author"]) + + if isinstance(codemeta.get("softwareRequirements"), list): + codemeta["softwareRequirements"] = [ + r for r in codemeta["softwareRequirements"] if isinstance(r, dict) + ] + + if isinstance(codemeta.get("developmentStatus"), str): + codemeta["developmentStatus"] = codemeta["developmentStatus"].capitalize() + + codemeta = prefix_all_codemeta_properties(codemeta) + for key, value in codemeta.items(): + codemeta[key] = normalize_value(value, key) + + # No mappings. No normalizations. No cleaning. + # The PR only requires @context and @list wrapping. + + return codemeta + + +# ------------------------------------------------------------ +# UTILITIES +# ------------------------------------------------------------ + +def wrap_list(value): + """ + Always wrap lists in @list, even if only one element. + """ + if isinstance(value, list): + return {"@list": value} + return value + +def prefix_all_codemeta_properties(codemeta): + """ Add codemeta: prefix to all properties that are NOT in Schema.org. """ + new = {} + + for key, value in codemeta.items(): + if key in SCHEMA_ORG_PROPERTIES or key == "@context": + new[key] = value + else: + new[f"codemeta:{key}"] = value + + return new + +def normalize_value(value, key=None): + """ + Minimal normalization: + - Only normalize keywords (CSV -> list) + - Only filter softwareRequirements (remove strings) + - Do NOT touch any other property + """ + + # keywords: convert CSV to list + if key == "keywords" and isinstance(value, str): + parts = [p.strip() for p in value.split(",") if p.strip()] + return parts + + # softwareRequirements: keep only dicts + if key == "softwareRequirements" and isinstance(value, list): + return [v for v in value if isinstance(v, dict)] + + return value + + +# def apply_schemaorg_mappings(c): +# """ +# Apply mappings from Codemeta to Schema.org for Google compliance. +# """ + +# # referencePublication -> citation +# if "referencePublication" in c: +# c["citation"] = c.pop("referencePublication") + +# # buildInstructions -> installUrl (if URL) or softwareHelp +# if "buildInstructions" in c: +# bi = c.pop("buildInstructions") +# if isinstance(bi, list) and len(bi) == 1 and is_url(bi[0]): +# c["installUrl"] = bi[0] +# else: +# c.setdefault("softwareHelp", []) +# c["softwareHelp"].append({"@type": "CreativeWork", "text": bi}) + +# # continuousIntegration -> softwareHelp +# if "continuousIntegration" in c: +# ci = c.pop("continuousIntegration") +# c.setdefault("softwareHelp", []) +# c["softwareHelp"].append({"@type": "CreativeWork", "url": ci}) + +# # readme -> softwareHelp +# if "readme" in c: +# rd = c.pop("readme") +# c.setdefault("softwareHelp", []) +# c["softwareHelp"].append({"@type": "CreativeWork", "url": rd}) + +# # developmentStatus normalization +# if "developmentStatus" in c: +# status = c["developmentStatus"] +# if isinstance(status, str): +# c["developmentStatus"] = status.capitalize() + +# return c + + + diff --git a/src/somef/export/json_export.py b/src/somef/export/json_export.py index 547344cb..848ea608 100644 --- a/src/somef/export/json_export.py +++ b/src/somef/export/json_export.py @@ -116,7 +116,7 @@ def format_date(date_string): codemeta_output = { "@context": "https://w3id.org/codemeta/3.0", - "@type": "SoftwareSourceCode" + "@type": ["SoftwareSourceCode", "SoftwareApplication"] } if constants.CAT_LICENSE in repo_data: # We mix the name of the license from github API with the URL of the file (if found) @@ -154,7 +154,8 @@ def format_date(date_string): l_result["url"] = l[constants.PROP_RESULT][constants.PROP_URL] if constants.PROP_SPDX_ID in l[constants.PROP_RESULT].keys(): l_result["identifier"] = constants.SPDX_BASE + l[constants.PROP_RESULT][constants.PROP_SPDX_ID] - l_result["spdx_id"] = l[constants.PROP_RESULT][constants.PROP_SPDX_ID] + # spdx_id does not exist in codemeta + # l_result["spdx_id"] = l[constants.PROP_RESULT][constants.PROP_SPDX_ID] codemeta_output[constants.CAT_CODEMETA_LICENSE] = l_result if code_repository is not None: @@ -213,6 +214,9 @@ def format_date(date_string): key = f"{name.strip()}|{version.strip() if version else ''}" if key not in seen_structured: entry = {"name": name.strip()} + req_type = x[constants.PROP_RESULT].get("type") + if req_type: + entry["@type"] = map_requirement_type(req_type) if version: entry["version"] = version.strip() code_parser_requirements.append(entry) @@ -616,3 +620,14 @@ def extract_doi(url: str) -> str: match = re.search(constants.REGEXP_ALL_DOIS, url, re.IGNORECASE) return match.group(0).lower() if match else "" + +def map_requirement_type(t): + t = t.lower() + if "application" in t: + return "SoftwareApplication" + if "source" in t: + return "SoftwareSourceCode" + if "system" in t: + return "SoftwareSystem" + return "SoftwareApplication" + diff --git a/src/somef/header_analysis.py b/src/somef/header_analysis.py index 4a4088dd..26b492f2 100644 --- a/src/somef/header_analysis.py +++ b/src/somef/header_analysis.py @@ -276,13 +276,63 @@ def tokenize_header(text) -> Iterable[str]: def label_text(text: str) -> List[str]: labels: List[str] = [] + + if isinstance(text, list): + text = " ".join(text) + else: + text = str(text) + for token in tokenize_header(text): synsets = get_synsets(token) if synsets: grp = match_group(synsets) + # Skip if the header matches a known false positive for this group + + # if isinstance(text, list): + # text = " ".join(text) + + if is_false_positive_header(text, grp): + # print(f"Skipping false positive header '{text}' for category '{grp}'") + continue if grp and grp not in labels: labels.append(grp) return labels + +def is_false_positive_header(text: str, category: str) -> bool: + """ + Checks if a header is a known false positive for a given category. + + Prevents headers like 'Reference implementation' from being classified as + bibliographic citations (CAT_CITATION) while allowing legitimate ones like 'References'. + + Args: + text (str): The header text to check. + category (str): The category being considered (e.g., CAT_CITATION). + + Returns: + bool: True if the header is a known false positive for the category. + """ + + text_lower = text.lower() + + # false positives for bibliographic citations + if category == constants.CAT_CITATION: + negative_patterns = [ + "reference implementation", + "reference architecture", + "reference model", + "reference design", + "reference to this repository", + "reference to this library", + "reference in your project", + "node references" + # add more patterns here in the future + ] + return any(pat in text_lower for pat in negative_patterns) + + # Do the same to other categories if needed + + return False # def extract_categories(repo_data, repository_metadata: Result): # """ # Function that adds category information extracted using header information diff --git a/src/somef/regular_expressions.py b/src/somef/regular_expressions.py index 6bfe346a..8702b5bc 100644 --- a/src/somef/regular_expressions.py +++ b/src/somef/regular_expressions.py @@ -328,7 +328,8 @@ def extract_images(unfiltered_text, repo_url, local_repo, repository_metadata: R ------- A Result object with the logos and images from the given text """ - logo = "" + # logo = "" + logos = [] images = [] repo_name = "" if repo_url is not None and repo_url != "": @@ -341,20 +342,30 @@ def extract_images(unfiltered_text, repo_url, local_repo, repository_metadata: R img_html = [_.start() for _ in re.finditer(" 0 or img.find("/badge") >= 0 or img.find("/travis-ci.") >= 0 \ or img.find("img.shields.io") >= 0: - pass - elif logo == "" and repo_url is not None: - start = img.rindex("/") + # pass + continue + elif repo_url is not None: + + start = img.rindex("/") if "/" in img else 0 + # start = img.rindex("/") if img.find(repo_name, start) > 0: - logo = rename_github_image(img, repo_url, local_repo, def_branch) + logos.append(rename_github_image(img, repo_url, local_repo, def_branch)) elif get_alt_text_md(html_text, img) == repo_name or get_alt_text_md(html_text, img).upper() == "LOGO": - logo = rename_github_image(img, repo_url, local_repo, def_branch) + logos.append(rename_github_image(img, repo_url, local_repo, def_branch)) else: - start = img.rindex("/") - if img.upper().find("LOGO", start) > 0: - logo = rename_github_image(img, repo_url, local_repo, def_branch) + if "/" in img: + start = img.rindex("/") + else: + start = 0 + # start = img.rindex("/") + # if img.upper().find("LOGO", start) >= 0: + if filename_upper.startswith("LOGO"): + logos.append(rename_github_image(img, repo_url, local_repo, def_branch)) else: images.append(rename_github_image(img, repo_url, local_repo, def_branch)) else: @@ -364,40 +375,100 @@ def extract_images(unfiltered_text, repo_url, local_repo, repository_metadata: R init = html_text.find("src=\"", index_img) end = html_text.find("\"", init + 5) img = html_text[init + 5:end] + filename = img.split("/")[-1] + filename_upper = filename.upper() + # if the image contains jitpack.io, the element is not processed if img.find("jitpack.io") > 0 or img.find("/badge") >= 0 or img.find("/travis-ci.") >= 0 \ or img.find("img.shields.io") >= 0: - pass - elif logo == "" and repo_url is not None: + # pass + continue + elif repo_url is not None: start = 0 if img.find("/") > 0: start = img.rindex("/") image_name = img[start:] - if image_name.find(repo_name) > 0 or image_name.upper().find("LOGO") > 0: - logo = rename_github_image(img, repo_url, local_repo, def_branch) + # if image_name.find(repo_name) > 0 or image_name.upper().find("LOGO") >= 0: + # if image_name.find(repo_name) > 0 or filename_upper.startswith("LOGO"): + if image_name.find(repo_name) > 0 or "LOGO" in filename_upper: + logos.append(rename_github_image(img, repo_url, local_repo, def_branch)) elif get_alt_text_img(html_text, index_img) == repo_name or get_alt_text_img(html_text, index_img).upper() == "LOGO": - logo = rename_github_image(img, repo_url, local_repo, def_branch) + logos.append(rename_github_image(img, repo_url, local_repo, def_branch)) else: images.append(rename_github_image(img, repo_url, local_repo, def_branch)) else: - start = img.rindex("/") - if img.upper().find("LOGO", start) > 0: - logo = rename_github_image(img, repo_url, local_repo, def_branch) + if "/" in img: + start = img.rindex("/") + else: + start = 0 + # start = img.rindex("/") + # if img.upper().find("LOGO", start) >= 0: + # if filename_upper.startswith("LOGO"): + if "LOGO" in filename_upper: + logos.append(rename_github_image(img, repo_url, local_repo, def_branch)) else: images.append(rename_github_image(img, repo_url, local_repo, def_branch)) - if logo != "": + + # final decission. Choose better logo following some priorities + # Priorities + logo_plus_name = [] + logo_only = [] + name_only = [] + + # If repo_name is empty, disable repo-name-based matching + if not repo_name: + repo_name = None + + for logo in logos: + fname = logo.lower() + + # Priority 1: logo + repo name + if repo_name and "logo" in fname and repo_name.lower() in fname: + logo_plus_name.append(logo) + + # Priority 3: only repo name (but not logo) + elif repo_name and repo_name.lower() in fname: + name_only.append(logo) + + # Priority 2: only "logo" (but not repo name) + elif "logo" in fname: + logo_only.append(logo) + + # Apply priorities + if logo_plus_name: + final_logos = [logo_plus_name[0]] + discarded = [l for l in logos if l not in final_logos] + + elif name_only: + final_logos = [name_only[0]] + discarded = [l for l in logos if l not in final_logos] + + elif logo_only: + final_logos = logo_only + discarded = [l for l in logos if l not in final_logos] + + else: + final_logos = [] + discarded = logos + + images.extend(discarded) + + + for logo in final_logos: + repository_metadata.add_result(constants.CAT_LOGO, { constants.PROP_TYPE: constants.URL, constants.PROP_VALUE: logo }, 1, constants.TECHNIQUE_REGULAR_EXPRESSION, readme_source) for image in images: - repository_metadata.add_result(constants.CAT_IMAGE, - { - constants.PROP_TYPE: constants.URL, - constants.PROP_VALUE: image - }, 1, constants.TECHNIQUE_REGULAR_EXPRESSION, readme_source) + if image not in final_logos: + repository_metadata.add_result(constants.CAT_IMAGE, + { + constants.PROP_TYPE: constants.URL, + constants.PROP_VALUE: image + }, 1, constants.TECHNIQUE_REGULAR_EXPRESSION, readme_source) return repository_metadata diff --git a/src/somef/somef_cli.py b/src/somef/somef_cli.py index 864d03fd..b5f8010d 100644 --- a/src/somef/somef_cli.py +++ b/src/somef/somef_cli.py @@ -15,6 +15,7 @@ from .parser import mardown_parser, create_excerpts from .export.turtle_export import DataGraph from .export import json_export +from .export import google_codemeta_export from .extract_software_type import check_repository_type from urllib.parse import urlparse, quote @@ -153,13 +154,13 @@ def cli_get_data(threshold, ignore_classifiers, repo_url=None, doc_src=None, loc readme_text_unmarked = markdown_utils.unmark(readme_text) logging.info("readme text unmarked successfully.") if not ignore_classifiers and readme_unfiltered_text != '': - logging.info("--> suppervised classification") + logging.info("Supervised classification") repository_metadata = supervised_classification.run_category_classification(readme_unfiltered_text, threshold, repository_metadata) - logging.info("--> create excerpts") + logging.info("Create excerpts") excerpts = create_excerpts.create_excerpts(string_list) - logging.info("--> extract text excerpts headers") + logging.info("Extract text excerpts headers") excerpts_headers = mardown_parser.extract_text_excerpts_header(readme_unfiltered_text) header_parents = mardown_parser.extract_headers_parents(readme_unfiltered_text) score_dict = supervised_classification.run_classifiers(excerpts, file_paths) @@ -228,6 +229,7 @@ def run_cli(*, graph_out=None, graph_format="turtle", codemeta_out=None, + google_codemeta_out=None, pretty=False, missing=False, keep_tmp=None, @@ -276,6 +278,15 @@ def run_cli(*, codemeta_out = codemeta_out.replace(".json", "") codemeta_out = codemeta_out + "_" + encoded_url + ".json" json_export.save_codemeta_output(repo_data.results, codemeta_out, pretty=pretty, requirements_mode= requirements_mode) + if google_codemeta_out is not None: + gc_out = google_codemeta_out.replace(".json", "") + gc_out = gc_out + "_" + encoded_url + ".json" + google_codemeta_export.save_google_codemeta_output( + repo_data.results, + gc_out, + pretty=pretty, + requirements_mode=requirements_mode + ) except: logging.error("Error when processing repo: " + repo_url) else: @@ -297,7 +308,8 @@ def run_cli(*, json_export.save_json_output(repo_data.results, output, missing, pretty=pretty) if codemeta_out is not None: json_export.save_codemeta_output(repo_data.results, codemeta_out, pretty=pretty, requirements_mode=requirements_mode) - + if google_codemeta_out is not None: + google_codemeta_export.save_google_codemeta_output(repo_data.results, google_codemeta_out, pretty=pretty, requirements_mode=requirements_mode) if graph_out is not None: logging.info("Generating triples...") data_graph = DataGraph() diff --git a/src/somef/test/test_data/README-agora.md b/src/somef/test/test_data/README-agora.md new file mode 100644 index 00000000..f87aba4a --- /dev/null +++ b/src/somef/test/test_data/README-agora.md @@ -0,0 +1,511 @@ +# agora-py + + +**agora-py** is a Python library that supports *Web-scale Ontology-driven Access to Distributed Linked Data*. + +Currently, there is a huge number of *dereferenciable* Linked Data resources that are not being properly consumed neither explored. +That is, the absolute majority of approaches for consuming Linked Data either ignore or inhibit such virtue, +underutilizing the Web as a platform. +Agora (agora-py) aims to be a tool that enables Linked Data consumers to live-query the Web of Data in a unified and explorative way: +* Driven by known vocabularies; +* Constrained by + * the scope of the given query, + * a set of seed resources whose URIs and types are known. + +Although Agora is designed as well to be deployed as a microservices infrastructure, +it can be fully used as a Python middleware, without the need for any other external dependency than the Web of Data. + +## Install + +agora-py is still not uploaded to PyPi, however the current repository +can be passed as source for pip: + +``` +$ pip install git+https://github.com/oeg-upm/agora-py.git +``` + +## Getting Started + +Before issuing the first query, Agora needs to know the following: +1. The vocabulary that will drive the exploration; +2. One seed resource whose URI and type (any Class in the vocabulary) is known. + +### Register vocabularies + +**agora-py** requires to be provided with the vocabularies (RDFS, OWL) that will be used +to drive the exploration of Linked Data resources. + +```python +from agora import Agora + +a = Agora() + +# movies.ttl is in path agora/examples/movies/movies.ttl +with open('movies.ttl') as f: + a.fountain.add_vocabulary(f.read()) + +print a.fountain.types + +``` + +### Declare seeds + +Once Agora is provided with a vocabulary that defines at least one Class, seed +resources can be declared as follows: + +```python +from agora import Agora + +a = Agora() +with open('movies.ttl') as f: + a.fountain.add_vocabulary(f.read()) + +a.fountain.add_seed('http://dbpedia.org/resource/Blade_Runner', 'dbpedia-owl:Film') +a.fountain.add_seed('http://dbpedia.org/resource/Braveheart', 'dbpedia-owl:Film') +print a.fountain.seeds + +``` + +### Query the Web + +Agora enables Linked Data consumers to live-query the Web of Data using +SPARQL. The given queries (in fact, their BGP and filters) together with the registered +vocabularies and provided seeds, define the scope of the link-traversal exploration. + +```python +from agora import Agora + +a = Agora() +with open('movies.ttl') as f: + a.fountain.add_vocabulary(f.read()) + +a.fountain.add_seed('http://dbpedia.org/resource/Blade_Runner', 'dbpedia-owl:Film') +a.fountain.add_seed('http://dbpedia.org/resource/Braveheart', 'dbpedia-owl:Film') + +query = """SELECT DISTINCT ?name ?actor WHERE { + [] foaf:name ?name ; + dbpedia-owl:starring [ + dbp:birthName ?actor + ] + }""" + +for row in a.query(query): + print row +``` + +## Background + +### Linked Data + +The Linked Data principles [^1] enable the creation of the Web of Data: + +1. Use URIs as names for things. +2. Use HTTP URIs so that people can look up those things. +3. When someone looks up a URI, provide useful information, using the standards (RDF, SPARQL). +4. Include links to other URIs (within this information) so that they can discover more things. + +#### Consuming Linked Data on the Web [^2] + +| | data warehousing | search engines | query federation | link traversal | [linked data fragments][ldf] | +|-----------------------------|------------------------|----------------|--------------------|---------------------------------|-----------------------| +| Universe of discourse (UoD) | loaded data | Web of Data | known data sources | Web of Data | known data sources | +| Required source interface | mainly RDF dumps | arbitrary | SPARQL endpoints | **Linked Data (look up) interface** | LDF servers | +| Access to original data | no | no | yes | yes | yes | +| Supporting data structures | indices and statistics | crawled index | statistics | - | ? | +| Response and throughput | fast / fast | fast / fast | slow / medium | medium / slow | medium / slow | +| Recall (w.r.t. UoD) | 100% | <100% | 100% | <100% | 100% | +| Precision | 100% | <100% | 100% | 100% | 100% | +| Up-to-dateness | low | medium | high | high | high | + +#### What about Linked Data principles 2 and 3? +Only link traversal leverages available Linked Data (look-up) interfaces. A URI should not just serve as a global identifier, but also as provider of a structured data representation of the identified entity. The absolute majority of implemented solutions ignore both principles. + +Why do not we rely on these HTTP look-up interfaces to directly consume Linked Data? Is it really necessary to give them up in favor of using SPARQL endpoints or any other (non-LD) interface to efficiently access and query Linked Data? + +### Web of Data + +#### Benefits +The three main benefits of the Web of Data are: + +* Feasibility to perform live-querying over a dataspace that integrates a large number of interlinked datasets as if it was a huge multidatabase system. +* Data sources may be considerably lighter, scalable and maintanable than (reliable) SPARQL endpoints. They can be interfaced as just RESTful APIs that provide RDF by dereferencing known resources. +* Enables freshness and serendipitous discovery of data sources and results. + +#### Problems +Some problems of (live-)querying the Web of Data: + +* Not any approach for executing queries that range over all Linked Data on the Web can guarantee complete query results. +* Its openness and growth introduces data integration issues such as coreferencing and schema heterogeneity. +* Looking up certain URIs may result in the retrieval of an unforeseeable large set of RDF triples. +* Response times may vary significantly between different servers. Look-ups may take unexpectedly long or may not be answered at all. +* Restrictions on clients such as sercing only a limited number of requests per second (rate limits). + +### Workload distribution + +Can we minimize server resource usage while still enabling clients to query data sources efficiently? + +

+ +

+ +## Approach +### Ontology-driven link traversal +Link traversal is focused on querying the whole Web of Data without any prior knowledge about the vocabularies that are being used to describe the data. + +Ontology-driven link traversal is less ambitious and aims only at querying the sub-dataspace that is described following the previously known vocabularies. In practice, it is only interested in those resources that are described so that they can be correctly interpreted, explored and consumed without extra effort. + +Assuming that data are linked using the properties specified in the selected vocabularies, we can extract and exploit the underlying cabigational paths to easily access reachable and query-relevant fragments of data. + +

+ +

+ +A set of known seeds of any type can be used as starting points of such navigational paths, so that they do not need to be explicitly included in queries. Using those seeds facilitates the selection fo data sources based on different criteria: reliability, security, etc. + +Given a graph pattern from a conjuctive query, an executable search plan describing the shortest paths from known seeds can be provided. + +

+ +

+ +## Concept +The *gathering place* for Distributed Linked Data. + +The Agora was a central space or square in ancient Greek city-states. The literal meaning of the word is "gathering place" or "assembly". + +The agora was the centre of athletic, artistic, spiritual and political life of the city. + +

+ +

+ +## How it works +The simplest Agora Engine is composed by a Fountain and a Planner. + +

+ +

+ +### Fountain +The Fountain is the *place* where all navigational paths found in known vocabularies are exposed, taking into account a number of heterogeneous seeds to be later on proposed as starting points for search plans. + +#### Path extraction from vocabularies +The Fountain queries the given vocabularies in order to create the underlying link graph. Basically, it tries to find out the domain and range of all properties in the vocabulary with the aim of identifying the set of nodes and edges that make up such link graph. In the end, (a subset of) concepts and properties in the ontology become the nodes and edges of the link graph, respectively. + +##### Vocabulary registration +The Fountain accepts vocabularies for registration in two different formats: Turtle and RDF/XML. In order to identify the only ontology that should be described in the submitted content, the Fountain parses it and queries the resulting graph with: + +```sql +SELECT ?o WHERE { + ?o a owl:Ontology FILTER (isURI(?o)) +} +``` + +Having the result set, the following restrictions are applied: + +* The **size** of the result set must be 1. That is, vocabularies have to be registered one at a time. +* There must be a **declared prefix** that is equal to the URI binded by `?o`. The name of such prefix will be considered by Agora as the **identifier** of the vocabulary. + +For example, the following block is declaring the ontology ``, which will be identified by Agora as *onto*. + +```text +@prefix rdf: . +@prefix owl: . +@prefix onto: . + + rdf:type owl:Ontology . + +onto:Concept a owl:Class . +``` + +Onwards, when referring to a concept or property that belongs to that ontology, Agora will impose to do it prefixed (`onto:Concept`); otherwise (``), it won't understand us. + +##### Node extraction +The nodes of the link graph are created from all those concepts described in a given ontology that belong to the result set of the following query: + +```sql +SELECT DISTINCT ?c WHERE { + { + ?p a owl:ObjectProperty . + { + { ?p rdfs:range ?c } + UNION + { ?p rdfs:domain ?c } + } + } + UNION + { + ?p a owl:DatatypeProperty . + ?p rdfs:domain ?c . + } + UNION + { ?c a owl:Class } + UNION + { ?c a rdfs:Class } + UNION + { [] rdfs:subClassOf ?c } + UNION + { ?c rdfs:subClassOf [] } + UNION + { + ?r a owl:Restriction ; + owl:onProperty ?p . + { + ?p a owl:ObjectProperty . + { ?r owl:allValuesFrom ?c } + UNION + { ?r owl:someValuesFrom ?c } + } + UNION + { ?r owl:onClass ?c } + } + FILTER(isURI(?c)) +} +``` + +Thus, there are some rules that must be taken into account in order to let the Fountain *detect* nodes in ontologies. That is, nodes are all URIs that match at least one of the following: + +* It is a class, either an `owl:Class` or a `rdfs:Class`. +* It has at least one subclass in the ontology or it is the superclass of any other. +* It belongs to the domain of a datatype property. +* Given an object property, + * it is a class that belongs to its range or/and domain. + * there may be a set of things for which such property may have values of it. + +It is important to note that no automatic reasoning is performed in this process. All required information must be materialized in the ontology description that is being submitted. Furthermore, existing conflicts and/or inconsistencies in definitions will not be treated; neither a warning nor an error message will be generated. + +##### Edge extraction +Similarly to the process of node extraction, the detection of *valid* edges for the link graph in an ontology is built on the following query: + +```sql +SELECT DISTINCT ?p WHERE { + { ?p a rdf:Property } + UNION + { ?p a owl:ObjectProperty } + UNION + { ?p a owl:DatatypeProperty } + UNION + { + [] a owl:Restriction ; + owl:onProperty ?p . + } + FILTER(isURI(?p)) +} +``` + +The result set of the corresponding query is composed of all the URIs that have been described in such a way that they can be considered as edges. The corresponding matching rules for edges are: + +* It is a `rdf:Property`, an `owl:ObjectProperty` or an `owl:DatatypeProperty`. +* There is some restriction on it as a property. + +##### Node properties + +Once the Fountain has identified all nodes from the vocabularies, it is prepared to search for the incoming (references) and outgoing (properties) edges for each of them. To do so, it creates and keeps a tuple map that puts nodes and their properties together: + +```sql +SELECT DISTINCT ?c ?p WHERE { + { ?c rdfs:subClassOf [ owl:onProperty ?p ] } + UNION + { ?p rdfs:domain ?c } + FILTER (isURI(?p) && isURI(?c)) +} +``` + +Given a node *n*, its properties are all those URIs that fulfill the following conditions: + +* *n* belongs to its domain. +* *n* has a constraint on it. + +Having such map in memory, it is trivial to filter the properties of each node (fixing a value for *n*). + +##### Node references + +The process to obtain the incoming edges of all nodes is identical to that of properties. Here, the corresponding query that results in the required tuple map is the following: + +```sql +SELECT ?c ?p WHERE { + { + ?r owl:onProperty ?p. + { ?r owl:someValuesFrom ?c } + UNION + { ?r owl:allValuesFrom ?c } + UNION + { ?r owl:onClass ?c } + } + UNION + { ?p rdfs:range ?c } + FILTER (isURI(?p) && isURI(?c)) +} +``` + +Given a node *n*, its references are all those URIs that fulfill the following conditions: + +* *n* belongs to its range. +* There is a restriction that specifies that any of its values may be of the type represented by *n*. + +##### Edge domain + +The domain of an edge *e* is composed by all those nodes for which *e* is a property. + +```sql +SELECT DISTINCT ?e ?c WHERE { + { ?p rdfs:domain ?c } + UNION + { ?c rdfs:subClassOf [ owl:onProperty ?e ] } + FILTER (isURI(?e) && isURI(?c)) +} +``` + +##### Edge range + +The range of an edge *e* is composed by: + +* All those nodes for which *e* is a reference. +* Datatype URIs that appear in a data-range restriction of *e* for a certain node. + +```sql +SELECT DISTINCT ?e ?r WHERE { + {?e rdfs:range ?r} + UNION + { + ?d owl:onProperty ?e. + { ?d owl:allValuesFrom ?r } + UNION + { ?d owl:someValuesFrom ?r } + UNION + { ?d owl:onClass ?r } + UNION + { ?d owl:onDataRange ?r } + } + FILTER(isURI(?e) && isURI(?r)) +} +``` + +##### Edge constraints +TBD + + +##### Example + +

+ +

+ +### Planner +Planners follow the claim *"I do not know the answer, but I can tell you where and how you can find it"*. They are given graph patterns and leverage the Fountain to compose search plans that specify how to get all relevant data. + +#### Following search plans +Planners use RDF to represent self-contained search plans for a given graph pattern. +``` +Graph pattern = { + ?s atmos:monitors ?c . + ?c rdfs:label ?comp . + ?s core:hasValue ?v . + ?v core:literalValue ?lv . + ?v core:timeStamp ?t +} + +@prefix agora: . +@prefix atmos: . +@prefix core: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix schema: . +@prefix wot: . +@prefix xml: . +@prefix xsd: . + +[] a agora:SearchTree ; + agora:fromType atmos:ObservationContainer ; + agora:hasSeed ; + agora:length 13 ; + agora:next [ agora:expectedType atmos:ObservationContainer ; + agora:next [ agora:byPattern _:tp_0 ; + agora:expectedType atmos:Observation ; + agora:next [ agora:byPattern _:tp_2 ; + agora:expectedType atmos:ChemicalCompound ] ; + agora:onProperty atmos:monitors ], + [ agora:byPattern _:tp_3 ; + agora:expectedType atmos:Observation ; + agora:next [ agora:byPattern _:tp_1 ; + agora:expectedType core:Value ], + [ agora:byPattern _:tp_4 ; + agora:expectedType core:Value ] ; + agora:onProperty core:hasValue ] ; + agora:onProperty atmos:contains ] . + +[] a agora:SearchSpace ; + agora:definedBy _:tp_0, + _:tp_1, + _:tp_2, + _:tp_3, + _:tp_4 . + +_:var_comp a agora:Variable ; + rdfs:label "?comp"^^xsd:string . + +_:var_lv a agora:Variable ; + rdfs:label "?lv"^^xsd:string . + +_:var_t a agora:Variable ; + rdfs:label "?t"^^xsd:string . + +_:var_c a agora:Variable ; + rdfs:label "?c"^^xsd:string . + +_:var_s a agora:Variable ; + rdfs:label "?s"^^xsd:string . + +_:tp_0 a agora:TriplePattern ; + rdfs:label "tp_0" ; + agora:object _:var_c ; + agora:predicate atmos:monitors ; + agora:subject _:var_s . + +_:tp_1 a agora:TriplePattern ; + rdfs:label "tp_1" ; + agora:object _:var_lv ; + agora:predicate core:literalValue ; + agora:subject _:var_v . + +_:tp_2 a agora:TriplePattern ; + rdfs:label "tp_2" ; + agora:object _:var_comp ; + agora:predicate rdfs:label ; + agora:subject _:var_c . + +_:tp_3 a agora:TriplePattern ; + rdfs:label "tp_3" ; + agora:object _:var_v ; + agora:predicate core:hasValue ; + agora:subject _:var_s . + +_:tp_4 a agora:TriplePattern ; + rdfs:label "tp_4" ; + agora:object _:var_t ; + agora:predicate core:timeStamp ; + agora:subject _:var_v . + +_:var_v a agora:Variable ; + rdfs:label "?v"^^xsd:string . +``` + +## References + +[ldf]: + +[^1]: Tim Berners-Lee. Linked data-design issues (2006) http://www.w3.org/DesignIssues/LinkedData.html + +[^2]: Hartig et al. A Database Perspective on Consuming Linked Data on the Web (2010) + +[^3]: Olaf Hartig. An Overview on Execution Strategies for Linked Data Queries (2013) + +[^4]: Olaf Hartig. SQUIN: A Traversal Based Query Execution System for the Web of Linked Data (2013) + +[^5]: Olaf Hartig. SPARQL for a Web of Linked Data: Semantics and Computability (2012) + +[^6]: Bouquet et al. Querying the Web of Data: A Formal Approach (2009) + +## License +agora-py is distributed under the Apache License, version 2.0. \ No newline at end of file diff --git a/src/somef/test/test_data/README-csl-editor.md b/src/somef/test/test_data/README-csl-editor.md new file mode 100644 index 00000000..796938f7 --- /dev/null +++ b/src/somef/test/test_data/README-csl-editor.md @@ -0,0 +1,57 @@ +# Reference implementation of the cslEdit library for searching and editing .csl (Citation Style Language) files + +This web application allows users of CSL based reference managers to search for citation styles and edit them. It's still an alpha version, but the Visual Editor supports all the features of independent CSL styles (AFAIK) and it should be possible to do real work with it. + +It is an implementation of the [CSL editor library](https://github.com/citation-style-editor/csl-editor). + +Play with it here: [Citation Style Editor](http://editor.citationstyles.org) + +## Prerequisites + +- bash (on Windows, I recommend git bash included with [msysgit](http://code.google.com/p/msysgit/downloads/list)) +- git +- [Jekyll](https://github.com/mojombo/jekyll/wiki/install) +- Node.js 0.8.4 or later +- Java runtime (optional - for running trang to convert the CSL schema) +- Mail server (for sending feedback emails) + +## To Setup Development Version + +- Run `git clone --recursive https://github.com/citation-style-editor/csl-editor-demo-site.git csl-demo` to checkout the repo. + +- In the repo directory, run `jekyll serve` (optional: add `--watch` to automatically rebuild when source changes). + +- Point your browser to `localhost:5001` to view the site locally. + +- Point your browser to `localhost:5001/cslEditorLib/pages/unitTests.html` to run the unit tests + +## To Deploy + +This process creates a static HTML site with concatenated javascript files and cache busters on the URLs, and optionally pushes to the `gh-pages` branch, currently served by github at [http://editor.citationstyles.org](http://editor.citationstyles.org). + +- Run `git clone --recursive https://github.com/citation-style-editor/csl-editor-demo-site.git csl-demo` to checkout the repo. + +- From the repo directory, run `./deploy.sh $BUILD_DIR $GH_PAGES_REPO_DIR`, where: + - `$BUILD_DIR` is the name of the directory you wish to deploy to, relative to the parent of the current directory. **All current contents of** `$BUILD_DIR` **will be removed!** + - `$GH_PAGES_REPO_DIR` (optional) is the name of a checked out `csl-editor-demo-site` repo directory, again relative to the parent of the current directory, which will be used to copy the built version and push the result to the `gh-pages` branch in github, which will automatically update the site at [editor.citationstyles.org](http://editor.citationstyles.org), the domain given in the CNAME file. + +- Point your browser to `http://editor.citationstyles.org/cslEditorLib/pages/unitTests.html` to run the unit tests + +- Point your browser to `http://editor.citationstyles.org` to view the deployed site + +## Customising the editor to integrate with your website or application + +Create a fork of this `csl-editor-demo-site` repository and feel free to alter everything for your own needs _except_ for the core library within the `cslEditorLib` git submodule. + +Customisable features include: + +- Load/Save functions, see `src/visualEditorPage.js` +- Navigation bar and feedback widget, see `html/navigation.html` + +You can override these without touching `cslEditorLib`. + +## Customising the core library + +See documentation for the core library code and it's API at the [CSLEditorLib wiki](https://github.com/citation-style-editor/csl-editor/wiki). + +If you fix bugs or otherwise improve the core [cslEditorLib](https://github.com/citation-style-editor/csl-editor) library, ensure the changes are not specific to your implementation and please issue a [pull request](https://github.com/citation-style-editor/csl-editor/pulls) so that everyone can benefit. Thanks! diff --git a/src/somef/test/test_data/README-tpronk.md b/src/somef/test/test_data/README-tpronk.md new file mode 100644 index 00000000..63d4c193 --- /dev/null +++ b/src/somef/test/test_data/README-tpronk.md @@ -0,0 +1,75 @@ +# somef-demo-repo +This repo aims to provide values for each metadata field that SOMEF (v0.9.4) can extract. + +# Acknowledgements +This demonstration repo was created during the maSMP hackathon at [ZB MED](https://www.zbmed.de/en) sponsored by [NFDI4DataScience](https://www.nfdi4datascience.de). NFDI4DataScience is a consortium funded by the German Research Foundation (DFG), project number 460234259. + +# Citation +Please cite this repo as Pronk, T. (2023). *somef-demo-repo: This repo aims to provide values for each metadata field that SOMEF (v0.9.4) can extract* (Version 0.0.1) [Computer software]. https://github.com/tpronk/somef-demo-repo + +# Contact +Contact person responsible for maintaining a software component + +# Contributors +Here could be a list of contributors to this software component + +# Documentation +Where to find additional documentation about a software component. + +# Download +Download instructions included in the repository. + +# Executable notebook +Here you find a non-functioning executable notebook in Jupyter on top of Binder: https://mybinder.org/dummy-notebook + +# FAQ +Frequently asked questions about a software component + +# Identifier +Copied from the [deeprank2 repo](https://github.com/DeepRank/deeprank2) +[![DOI](https://zenodo.org/badge/450496579.svg)](https://zenodo.org/badge/latestdoi/450496579) + +# Image +Images used to illustrate the software component. +![logo1.png](logo1.png) +Image different from logo +![system diagram](diagram.png) + +# Installation instructions +A set of instructions that indicate how to install a target repository + +# Invocation +Execution command(s) needed to run a scientific software component. Copied from [https://github.com/MPDL/unibiAPC/](https://github.com/MPDL/unibiAPC/) + +```{r, echo=FALSE, results='asis', message = FALSE}\nmy_apc %>% select(institution, euro) %>% \n group_by(institution) %>% \n ezsummary::ezsummary(n = TRUE, digits= 0, median = TRUE,\n extra = c(\n sum = \"sum(., na.rm = TRUE)\",\n min = \"min(., na.rm = TRUE)\",\n max = \"max(., na.rm = TRUE)\"\n )) %>%\n mutate_all(format, big.mark=',') %>%\n ezsummary::ezmarkup('...[. (.)]..[. - .]') %>%\n#> get rid of blanks\n mutate(`mean (sd)` = gsub(\"\\\\( \", \"(\", .$`mean (sd)`)) %>% \n select(institution, n, sum, `mean (sd)`, median, `min - max`) %>%\n arrange(desc(n)) %>%\n knitr::kable(col.names = c(\"Institution\", \"Articles\", \"Spending total (in \u20ac)\", \"Mean (SD)\", \"Median\", \"Minimum - Maximum\"), align = c(\"l\",\"r\", \"r\", \"r\", \"r\", \"r\"))\n``` + +# Logo +Main logo used to represent the target software component. +![logo2.png](logo_directory/logo2.png) + +# Package distribution +[![Latest PyPI version](https://img.shields.io/pypi/v/mapeathor?style=flat)](https://pypi.python.org/pypi/mapeathor) + +# Related documentation +For instructions on using OBA to create your API server, go to the [documentation](https://oba.readthedocs.io/en/latest/) + +# Related papers +[Yulun Zhang](http://yulunzhang.com/), [Yapeng Tian](http://yapengtian.org/), [Yu Kong](http://www1.ece.neu.edu/~yukong/), [Bineng Zhong](https://scholar.google.de/citations?user=hvRBydsAAAAJ&hl=en), and [Yun Fu](http://www1.ece.neu.edu/~yunfu/), "Residual Dense Network for Image Super-Resolution", CVPR 2018 (spotlight), [[arXiv]](https://arxiv.org/abs/1802.08797) + +# Repository status +[![Project Status: Active - The project has reached a stable, usable state and is being actively developed.](https://www.repostatus.org/badges/latest/active.svg)](https://www.repostatus.org/#active) + +# Requirements +Pre-requisites and dependencies needed to execute a software component. + +# Run +There is no code in this repo that can be run. + +# Support +Guidelines and links of where to obtain support for a software component + +# Support channels +[![Gitter chat](https://badges.gitter.im/gitterHQ/gitter.png)](https://gitter.im/OpenGeoscience/geonotebook) + +# Usage examples +Assumptions and considerations recorded by the authors when executing a software component, or examples on how to use it. \ No newline at end of file diff --git a/src/somef/test/test_google_compliant_export.py b/src/somef/test/test_google_compliant_export.py new file mode 100644 index 00000000..a890e711 --- /dev/null +++ b/src/somef/test/test_google_compliant_export.py @@ -0,0 +1,50 @@ +import os +import unittest +import json +from pathlib import Path +from .. import somef_cli +from ..parser import pom_xml_parser +from ..export import json_export + +test_data_path = str(Path(__file__).parent / "test_data") + os.path.sep +test_data_repositories = str(Path(__file__).parent / "test_data" / "repositories") + os.path.sep +test_data_api_json = str(Path(__file__).parent / "test_data" / "api_responses") + os.path.sep + +class TestGoogleCompliantExport(unittest.TestCase): + + + def test_google_compliant_version(self): + """Checks if codemeta version is v3""" + somef_cli.run_cli(threshold=0.8, + ignore_classifiers=False, + repo_url=None, + doc_src=test_data_path + "README-widoco.md", + in_file=None, + output=None, + graph_out=None, + graph_format=None, + google_codemeta_out=test_data_path + "test_google_compliant.json", + codemeta_out=None, + pretty=True, + missing=True) + + + json_file_path = test_data_path + "test_google_compliant.json" + assert os.path.exists(json_file_path), f"File {json_file_path} doesn't exist." + + text_file = open(test_data_path + "test_google_compliant.json", "r") + data = data = json.load(text_file) + text_file.close() + + assert "@context" in data, "JSON-LD must contain @context" + assert data["@context"].get("@vocab") == "https://schema.org/", "Context @vocab must be https://schema.org/" + assert data["@context"].get("codemeta") == "https://w3id.org/codemeta/3.0/", "Context must define codemeta prefix" + + + assert "codemeta:referencePublication" in data, "JSON must contain codemeta:referencePublication" + refpub = data["codemeta:referencePublication"] + assert isinstance(refpub, list), "referencePublication must be a list" + assert refpub[0].get("@type") == "ScholarlyArticle", "referencePublication entries must be ScholarlyArticle" + + + os.remove(json_file_path) \ No newline at end of file diff --git a/src/somef/test/test_header_analysis.py b/src/somef/test/test_header_analysis.py index 6ba09825..6df7e4eb 100644 --- a/src/somef/test/test_header_analysis.py +++ b/src/somef/test/test_header_analysis.py @@ -106,3 +106,31 @@ def test_issue_465(self): json_test, results = extract_categories(file_text, Result()) reqs = json_test.results[constants.CAT_REQUIREMENTS][0][constants.PROP_RESULT][constants.PROP_VALUE] assert reqs.replace('\n', '') == "Python 2.7 and 3.4+" + + def test_issue_594(self): + """ + Test that ensures sentences containing the word 'reference' in the README + are not incorrectly classified as citations when they are not bibliographic + references. + """ + with open(test_data_path + "README-csl-editor.md", "r") as data_file: + file_text = data_file.read() + json_test, results = extract_categories(file_text, Result()) + assert constants.CAT_CITATION not in json_test.results + + def test_issue_564(self): + """ + Test that ensures sentences containing the word 'reference' in the README + are not incorrectly classified as citations when they are not bibliographic + references. Similar to issue 594 but for a different file. + """ + with open(test_data_path + "README-agora.md", "r") as data_file: + file_text = data_file.read() + json_test, results = extract_categories(file_text, Result()) + + assert constants.CAT_CITATION in json_test.results + citations = json_test.results[constants.CAT_CITATION] + assert len(citations) == 1 + citation_text = citations[0][constants.PROP_RESULT][constants.PROP_VALUE] + assert "Tim Berners-Lee" in citation_text + diff --git a/src/somef/test/test_regular_expressions.py b/src/somef/test/test_regular_expressions.py index ea801af4..cc8daaa5 100644 --- a/src/somef/test/test_regular_expressions.py +++ b/src/somef/test/test_regular_expressions.py @@ -503,3 +503,36 @@ def test_readme_rst_readthedocs(self): assert expected_doc_url in documentation_values, f"Expected url documentation {expected_doc_url} not found in documentation" + def test_issue_563(self): + """Test designed to check if logos are detected correctly. UCM logo was incorrectly detected before.""" + repo_url = "https://github.com/oeg-upm/TINTO" + with open(test_data_path + "README-TINTO.md", "r") as data_file: + test_text = data_file.read() + results = regular_expressions.extract_images(test_text, repo_url, None, Result(), + test_data_path + "README-TINTO.md", "main") + logo = results.results[constants.CAT_LOGO] + assert (logo[0][constants.PROP_RESULT][ + constants.PROP_VALUE] == "https://raw.githubusercontent.com/oeg-upm/TINTO/main/imgs/logo.svg") + + + def test_issue_597(self): + """Check if correctly extracts multiple logos and regular images.""" + + with open(test_data_path + "README-tpronk.md", "r") as data_file: + test_text = data_file.read() + results = regular_expressions.extract_images(test_text, None, None, Result(), + test_data_path + "README-tpronk.md", "main") + + logos = results.results[constants.CAT_LOGO] + print(logos) + assert len(logos) == 2, f"Expected 2 logos, found {len(logos)}" + logo_values = {entry["result"][constants.PROP_VALUE] for entry in logos} + assert any("logo1.png" in v for v in logo_values), "logo1.png not detected as logo" + assert any("logo_directory/logo2.png" in v for v in logo_values), "logo2.png not detected as logo" + + + images = results.results[constants.CAT_IMAGE] + assert len(images) == 1, f"Expected 1 regular image, found {len(images)}" + image_values = {entry["result"][constants.PROP_VALUE] for entry in images} + assert any("diagram.png" in v for v in image_values), "diagram.png not detected as regular image" + From 83d289b389d376962d2ff8c51fc18bfb56b5b421 Mon Sep 17 00:00:00 2001 From: Juanje Mendoza Date: Mon, 2 Feb 2026 16:24:36 +0100 Subject: [PATCH 02/27] poetry lock --- poetry.lock | 1702 ++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 1217 insertions(+), 485 deletions(-) diff --git a/poetry.lock b/poetry.lock index 4be073bb..0cf0bcdd 100644 --- a/poetry.lock +++ b/poetry.lock @@ -26,18 +26,18 @@ files = [ [[package]] name = "beautifulsoup4" -version = "4.14.2" +version = "4.14.3" description = "Screen-scraping library" optional = false python-versions = ">=3.7.0" groups = ["main"] files = [ - {file = "beautifulsoup4-4.14.2-py3-none-any.whl", hash = "sha256:5ef6fa3a8cbece8488d66985560f97ed091e22bbc4e9c2338508a9d5de6d4515"}, - {file = "beautifulsoup4-4.14.2.tar.gz", hash = "sha256:2a98ab9f944a11acee9cc848508ec28d9228abfd522ef0fad6a02a72e0ded69e"}, + {file = "beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb"}, + {file = "beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86"}, ] [package.dependencies] -soupsieve = ">1.2" +soupsieve = ">=1.6.1" typing-extensions = ">=4.0.0" [package.extras] @@ -49,13 +49,13 @@ lxml = ["lxml"] [[package]] name = "bibtexparser" -version = "1.4.3" +version = "1.4.4" description = "Bibtex parser for python 3" optional = false python-versions = "*" groups = ["main"] files = [ - {file = "bibtexparser-1.4.3.tar.gz", hash = "sha256:a9c7ded64bc137720e4df0b1b7f12734edc1361185f1c9097048ff7c35af2b8f"}, + {file = "bibtexparser-1.4.4.tar.gz", hash = "sha256:093b6c824f7a71d3a748867c4057b71f77c55b8dbc07efc993b781771520d8fb"}, ] [package.dependencies] @@ -77,14 +77,14 @@ beautifulsoup4 = "*" [[package]] name = "certifi" -version = "2025.10.5" +version = "2026.1.4" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" groups = ["main"] files = [ - {file = "certifi-2025.10.5-py3-none-any.whl", hash = "sha256:0f212c2744a9bb6de0c56639a6f68afe01ecd92d91f14ae897c4fe7bbeeef0de"}, - {file = "certifi-2025.10.5.tar.gz", hash = "sha256:47c09d31ccf2acf0be3f701ea53595ee7e0b8fa08801c6624be771df09ae7b43"}, + {file = "certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c"}, + {file = "certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120"}, ] [[package]] @@ -101,91 +101,125 @@ files = [ [[package]] name = "charset-normalizer" -version = "3.4.3" +version = "3.4.4" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" groups = ["main"] files = [ - {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"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ce8a0633f41a967713a59c4139d29110c07e826d131a316b50ce11b1d79b4f84"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaabd426fe94daf8fd157c32e571c85cb12e66692f15516a83a03264b08d06c3"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c4ef880e27901b6cc782f1b95f82da9313c0eb95c3af699103088fa0ac3ce9ac"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2aaba3b0819274cc41757a1da876f810a3e4d7b6eb25699253a4effef9e8e4af"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:778d2e08eda00f4256d7f672ca9fef386071c9202f5e4607920b86d7803387f2"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f155a433c2ec037d4e8df17d18922c3a0d9b3232a396690f17175d2946f0218d"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a8bf8d0f749c5757af2142fe7903a9df1d2e8aa3841559b2bad34b08d0e2bcf3"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:194f08cbb32dc406d6e1aea671a68be0823673db2832b38405deba2fb0d88f63"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:6aee717dcfead04c6eb1ce3bd29ac1e22663cdea57f943c87d1eab9a025438d7"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cd4b7ca9984e5e7985c12bc60a6f173f3c958eae74f3ef6624bb6b26e2abbae4"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_riscv64.whl", hash = "sha256:b7cf1017d601aa35e6bb650b6ad28652c9cd78ee6caff19f3c28d03e1c80acbf"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e912091979546adf63357d7e2ccff9b44f026c075aeaf25a52d0e95ad2281074"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5cb4d72eea50c8868f5288b7f7f33ed276118325c1dfd3957089f6b519e1382a"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-win32.whl", hash = "sha256:837c2ce8c5a65a2035be9b3569c684358dfbf109fd3b6969630a87535495ceaa"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:44c2a8734b333e0578090c4cd6b16f275e07aa6614ca8715e6c038e865e70576"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a9768c477b9d7bd54bc0c86dbaebdec6f03306675526c9927c0e8a04e8f94af9"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bee1e43c28aa63cb16e5c14e582580546b08e535299b8b6158a7c9c768a1f3d"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fd44c878ea55ba351104cb93cc85e74916eb8fa440ca7903e57575e97394f608"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f04b14ffe5fdc8c4933862d8306109a2c51e0704acfa35d51598eb45a1e89fc"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cd09d08005f958f370f539f186d10aec3377d55b9eeb0d796025d4886119d76e"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4fe7859a4e3e8457458e2ff592f15ccb02f3da787fcd31e0183879c3ad4692a1"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa09f53c465e532f4d3db095e0c55b615f010ad81803d383195b6b5ca6cbf5f3"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7fa17817dc5625de8a027cb8b26d9fefa3ea28c8253929b8d6649e705d2835b6"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5947809c8a2417be3267efc979c47d76a079758166f7d43ef5ae8e9f92751f88"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4902828217069c3c5c71094537a8e623f5d097858ac6ca8252f7b4d10b7560f1"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:7c308f7e26e4363d79df40ca5b2be1c6ba9f02bdbccfed5abddb7859a6ce72cf"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2c9d3c380143a1fedbff95a312aa798578371eb29da42106a29019368a475318"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb01158d8b88ee68f15949894ccc6712278243d95f344770fa7593fa2d94410c"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-win32.whl", hash = "sha256:2677acec1a2f8ef614c6888b5b4ae4060cc184174a938ed4e8ef690e15d3e505"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:f8e160feb2aed042cd657a72acc0b481212ed28b1b9a95c0cee1621b524e1966"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-win_arm64.whl", hash = "sha256:b5d84d37db046c5ca74ee7bb47dd6cbc13f80665fdde3e8040bdd3fb015ecb50"}, + {file = "charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f"}, + {file = "charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a"}, ] [[package]] @@ -195,6 +229,7 @@ description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" groups = ["main"] +markers = "python_version < \"3.11\"" files = [ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, @@ -203,16 +238,32 @@ files = [ [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} +[[package]] +name = "click" +version = "8.3.1" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.10" +groups = ["main"] +markers = "python_version >= \"3.11\"" +files = [ + {file = "click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6"}, + {file = "click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + [[package]] name = "click-option-group" -version = "0.5.8" +version = "0.5.9" description = "Option groups missing in Click" optional = false python-versions = ">=3.7" groups = ["main"] files = [ - {file = "click_option_group-0.5.8-py3-none-any.whl", hash = "sha256:959065a45ccf58fcc48ec22f18fb50c1e59494612f0a1c13c4e714554434b502"}, - {file = "click_option_group-0.5.8.tar.gz", hash = "sha256:7dc8d534a066382be748b20dd65270e59e0393bc765a7744df86b059d4e00e62"}, + {file = "click_option_group-0.5.9-py3-none-any.whl", hash = "sha256:ad2599248bd373e2e19bec5407967c3eec1d0d4fc4a5e77b08a0481e75991080"}, + {file = "click_option_group-0.5.9.tar.gz", hash = "sha256:f94ed2bc4cf69052e0f29592bd1e771a1789bd7bfc482dd0bc482134aff95823"}, ] [package.dependencies] @@ -448,43 +499,53 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "duckdb" -version = "1.4.1" +version = "1.4.4" description = "DuckDB in-process database" optional = false python-versions = ">=3.9.0" groups = ["main"] files = [ - {file = "duckdb-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:296b4fff3908fb4c47b0aa1d77bd1933375e75401009d2dc81af8e7a0b8a05b4"}, - {file = "duckdb-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0b4182800092115feee5d71a8691efb283d3c9f5eb0b36362b308ef007a12222"}, - {file = "duckdb-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:67cc3b6c7f7ba07a69e9331b8ccea7a60cbcd4204bb473e5da9b71588bd2eca9"}, - {file = "duckdb-1.4.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0cef0cee7030b561640cb9af718f8841b19cdd2aa020d53561057b5743bea90b"}, - {file = "duckdb-1.4.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2bf93347f37a46bacce6ac859d651dbf5731e2c94a64ab358300425b09e3de23"}, - {file = "duckdb-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:2e60d2361f978908a3d96eebaf1f4b346f283afcc467351aae50ea45ca293a2b"}, - {file = "duckdb-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:605d563c1d5203ca992497cd33fb386ac3d533deca970f9dcf539f62a34e22a9"}, - {file = "duckdb-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d3305c7c4b70336171de7adfdb50431f23671c000f11839b580c4201d9ce6ef5"}, - {file = "duckdb-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a063d6febbe34b32f1ad2e68822db4d0e4b1102036f49aaeeb22b844427a75df"}, - {file = "duckdb-1.4.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1ffcaaf74f7d1df3684b54685cbf8d3ce732781c541def8e1ced304859733ae"}, - {file = "duckdb-1.4.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:685d3d1599dc08160e0fa0cf09e93ac4ff8b8ed399cb69f8b5391cd46b5b207c"}, - {file = "duckdb-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:78f1d28a15ae73bd449c43f80233732adffa49be1840a32de8f1a6bb5b286764"}, - {file = "duckdb-1.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:cd1765a7d180b7482874586859fc23bc9969d7d6c96ced83b245e6c6f49cde7f"}, - {file = "duckdb-1.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8ed7a86725185470953410823762956606693c0813bb64e09c7d44dbd9253a64"}, - {file = "duckdb-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8a189bdfc64cfb9cc1adfbe4f2dcfde0a4992ec08505ad8ce33c886e4813f0bf"}, - {file = "duckdb-1.4.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a9090089b6486f7319c92acdeed8acda022d4374032d78a465956f50fc52fabf"}, - {file = "duckdb-1.4.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:142552ea3e768048e0e8c832077a545ca07792631c59edaee925e3e67401c2a0"}, - {file = "duckdb-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:567f3b3a785a9e8650612461893c49ca799661d2345a6024dda48324ece89ded"}, - {file = "duckdb-1.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:46496a2518752ae0c6c5d75d4cdecf56ea23dd098746391176dd8e42cf157791"}, - {file = "duckdb-1.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1c65ae7e9b541cea07d8075343bcfebdecc29a3c0481aa6078ee63d51951cfcd"}, - {file = "duckdb-1.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:598d1a314e34b65d9399ddd066ccce1eeab6a60a2ef5885a84ce5ed62dbaf729"}, - {file = "duckdb-1.4.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e2f16b8def782d484a9f035fc422bb6f06941ed0054b4511ddcdc514a7fb6a75"}, - {file = "duckdb-1.4.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a5a7d0aed068a5c33622a8848857947cab5cfb3f2a315b1251849bac2c74c492"}, - {file = "duckdb-1.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:280fd663dacdd12bb3c3bf41f3e5b2e5b95e00b88120afabb8b8befa5f335c6f"}, - {file = "duckdb-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:04a31b3cf84d77ef02c9914567b5d63a43fc791b144655ee99581cd9f4949e63"}, - {file = "duckdb-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c01c5f9d0657a26938d640aa8d8effa91cacf66195ed4787824e6d5537bcaf21"}, - {file = "duckdb-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:80c12239abb2a063abcd75dc052e9884b41060615735a532a6e3e8390eee7f70"}, - {file = "duckdb-1.4.1-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4b96d16a10256d05d818b34903243681764b6afc98f7d50b1ae60d23aa1f1f9e"}, - {file = "duckdb-1.4.1-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8aa4a4298a6a627599f6606c7bedfe77309c1fb05a606af48e0e72333861ef4"}, - {file = "duckdb-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:09d152dd4ab24a5984cd289b553e142980b3f029292cdda29e34303c75138de6"}, - {file = "duckdb-1.4.1.tar.gz", hash = "sha256:f903882f045d057ebccad12ac69975952832edfe133697694854bb784b8d6c76"}, + {file = "duckdb-1.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e870a441cb1c41d556205deb665749f26347ed13b3a247b53714f5d589596977"}, + {file = "duckdb-1.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:49123b579e4a6323e65139210cd72dddc593a72d840211556b60f9703bda8526"}, + {file = "duckdb-1.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5e1933fac5293fea5926b0ee75a55b8cfe7f516d867310a5b251831ab61fe62b"}, + {file = "duckdb-1.4.4-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:707530f6637e91dc4b8125260595299ec9dd157c09f5d16c4186c5988bfbd09a"}, + {file = "duckdb-1.4.4-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:453b115f4777467f35103d8081770ac2f223fb5799178db5b06186e3ab51d1f2"}, + {file = "duckdb-1.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a3c8542db7ffb128aceb7f3b35502ebaddcd4f73f1227569306cc34bad06680c"}, + {file = "duckdb-1.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5ba684f498d4e924c7e8f30dd157da8da34c8479746c5011b6c0e037e9c60ad2"}, + {file = "duckdb-1.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5536eb952a8aa6ae56469362e344d4e6403cc945a80bc8c5c2ebdd85d85eb64b"}, + {file = "duckdb-1.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:47dd4162da6a2be59a0aef640eb08d6360df1cf83c317dcc127836daaf3b7f7c"}, + {file = "duckdb-1.4.4-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6cb357cfa3403910e79e2eb46c8e445bb1ee2fd62e9e9588c6b999df4256abc1"}, + {file = "duckdb-1.4.4-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c25d5b0febda02b7944e94fdae95aecf952797afc8cb920f677b46a7c251955"}, + {file = "duckdb-1.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:6703dd1bb650025b3771552333d305d62ddd7ff182de121483d4e042ea6e2e00"}, + {file = "duckdb-1.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:bf138201f56e5d6fc276a25138341b3523e2f84733613fc43f02c54465619a95"}, + {file = "duckdb-1.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ddcfd9c6ff234da603a1edd5fd8ae6107f4d042f74951b65f91bc5e2643856b3"}, + {file = "duckdb-1.4.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6792ca647216bd5c4ff16396e4591cfa9b4a72e5ad7cdd312cec6d67e8431a7c"}, + {file = "duckdb-1.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1f8d55843cc940e36261689054f7dfb6ce35b1f5b0953b0d355b6adb654b0d52"}, + {file = "duckdb-1.4.4-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c65d15c440c31e06baaebfd2c06d71ce877e132779d309f1edf0a85d23c07e92"}, + {file = "duckdb-1.4.4-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b297eff642503fd435a9de5a9cb7db4eccb6f61d61a55b30d2636023f149855f"}, + {file = "duckdb-1.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:d525de5f282b03aa8be6db86b1abffdceae5f1055113a03d5b50cd2fb8cf2ef8"}, + {file = "duckdb-1.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:50f2eb173c573811b44aba51176da7a4e5c487113982be6a6a1c37337ec5fa57"}, + {file = "duckdb-1.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:337f8b24e89bc2e12dadcfe87b4eb1c00fd920f68ab07bc9b70960d6523b8bc3"}, + {file = "duckdb-1.4.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0509b39ea7af8cff0198a99d206dca753c62844adab54e545984c2e2c1381616"}, + {file = "duckdb-1.4.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fb94de6d023de9d79b7edc1ae07ee1d0b4f5fa8a9dcec799650b5befdf7aafec"}, + {file = "duckdb-1.4.4-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0d636ceda422e7babd5e2f7275f6a0d1a3405e6a01873f00d38b72118d30c10b"}, + {file = "duckdb-1.4.4-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7df7351328ffb812a4a289732f500d621e7de9942a3a2c9b6d4afcf4c0e72526"}, + {file = "duckdb-1.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:6fb1225a9ea5877421481d59a6c556a9532c32c16c7ae6ca8d127e2b878c9389"}, + {file = "duckdb-1.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:f28a18cc790217e5b347bb91b2cab27aafc557c58d3d8382e04b4fe55d0c3f66"}, + {file = "duckdb-1.4.4-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:25874f8b1355e96178079e37312c3ba6d61a2354f51319dae860cf21335c3a20"}, + {file = "duckdb-1.4.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:452c5b5d6c349dc5d1154eb2062ee547296fcbd0c20e9df1ed00b5e1809089da"}, + {file = "duckdb-1.4.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8e5c2d8a0452df55e092959c0bfc8ab8897ac3ea0f754cb3b0ab3e165cd79aff"}, + {file = "duckdb-1.4.4-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1af6e76fe8bd24875dc56dd8e38300d64dc708cd2e772f67b9fbc635cc3066a3"}, + {file = "duckdb-1.4.4-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0440f59e0cd9936a9ebfcf7a13312eda480c79214ffed3878d75947fc3b7d6d"}, + {file = "duckdb-1.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:59c8d76016dde854beab844935b1ec31de358d4053e792988108e995b18c08e7"}, + {file = "duckdb-1.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:53cd6423136ab44383ec9955aefe7599b3fb3dd1fe006161e6396d8167e0e0d4"}, + {file = "duckdb-1.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8097201bc5fd0779d7fcc2f3f4736c349197235f4cb7171622936343a1aa8dbf"}, + {file = "duckdb-1.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cd1be3d48577f5b40eb9706c6b2ae10edfe18e78eb28e31a3b922dcff1183597"}, + {file = "duckdb-1.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e041f2fbd6888da090eca96ac167a7eb62d02f778385dd9155ed859f1c6b6dc8"}, + {file = "duckdb-1.4.4-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7eec0bf271ac622e57b7f6554a27a6e7d1dd2f43d1871f7962c74bcbbede15ba"}, + {file = "duckdb-1.4.4-cp39-cp39-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5cdc4126ec925edf3112bc656ac9ed23745294b854935fa7a643a216e4455af6"}, + {file = "duckdb-1.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:c9566a4ed834ec7999db5849f53da0a7ee83d86830c33f471bf0211a1148ca12"}, + {file = "duckdb-1.4.4.tar.gz", hash = "sha256:8bba52fd2acb67668a4615ee17ee51814124223de836d9e2fdcbc4c9021b3d3c"}, ] [package.extras] @@ -507,15 +568,15 @@ dev = ["Sphinx", "coverage", "flake8", "lxml", "lxml-stubs", "memory-profiler", [[package]] name = "exceptiongroup" -version = "1.3.0" +version = "1.3.1" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" groups = ["main"] markers = "python_version < \"3.11\"" files = [ - {file = "exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10"}, - {file = "exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88"}, + {file = "exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598"}, + {file = "exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219"}, ] [package.dependencies] @@ -526,54 +587,53 @@ test = ["pytest (>=6)"] [[package]] name = "falcon" -version = "4.1.0" +version = "4.2.0" description = "The ultra-reliable, fast ASGI+WSGI framework for building data plane APIs at scale." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "falcon-4.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c4aa85dbf9af10ee0d48f6c409551d7c7226953b2479a24eaad42d39c05bd4b2"}, - {file = "falcon-4.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:71ca6b380ddd09458127ddd5af73f302aad6de8da5690b610c9165209f5766bc"}, - {file = "falcon-4.1.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a294092ff27ac6038a36169e99175af86ea03c5e054d60c5d219fab36ad6cec7"}, - {file = "falcon-4.1.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:033b74c3e512441cef122cd7d9caa61571bf9cfef1cc60dc2c2c1c23bcf14727"}, - {file = "falcon-4.1.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a2a8324259cd47c1fe21f352a4b34b97ca29c064813115a1dddb8d95168ed154"}, - {file = "falcon-4.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:758fcf3416842b8b431429873accbee34e92206600358a02e8d418e7a968983e"}, - {file = "falcon-4.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f783cfb370ed8ccaf658b0b6c766dad3ad945f1eaf27ee1f5016706618ac6f3c"}, - {file = "falcon-4.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:600183fecbd121fbe55590645618ae1af12e02a4ca6ac035d6857b628cbee5ca"}, - {file = "falcon-4.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a2105cd03cd7accad2f2a4b875a9f588d37293e9c202929762ea94e446bfb6ee"}, - {file = "falcon-4.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:589e9a1cde0f84c9cb25327f6431a017a1b17e9d2c42b4b927e0ffbde6e42315"}, - {file = "falcon-4.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c41a3f208e28d2ff59beaaa503900c57a4d59ab17ddb3946efbad0817a314936"}, - {file = "falcon-4.1.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:43aed2194c804b64aeaf331384e2ef2ff69f29047cca65fb71e47d56f44c646f"}, - {file = "falcon-4.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fdad618359822f577c3ae9db73107b511e22d55715ffd4543a5096559bf1f18f"}, - {file = "falcon-4.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eea2063c49e3b327a545dadb9e445e00bf44edbfd492b92f81de582e3ce461ca"}, - {file = "falcon-4.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6e88c8a4f7bf125068d8f34bda094443ce7a2dd9bfef05c0da97a8eb5a8cb568"}, - {file = "falcon-4.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cda1a53580014f35f1314d66c74205f79e4cfb620dd1b952f581b81415477c60"}, - {file = "falcon-4.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:971def6f088f433092538a8409431c7001ed4eb4a6c908d5bb932111749e36e9"}, - {file = "falcon-4.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76a6af9f8142b7e10cee1b835b5548d73b6c65f2a1dc71aa75786bb61f3db5aa"}, - {file = "falcon-4.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:85cf8446d54625e67b219a29ba1cd1d72a28166973c4ead07086a0a0991be161"}, - {file = "falcon-4.1.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:41368d586b58d68bb39c672654baef0dcbc130b371e2c59e093f2699892637f2"}, - {file = "falcon-4.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cece1561c6766b733136306c07a4198a1b760583651fd45bd071378d353b0fae"}, - {file = "falcon-4.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:27c27f7144d2c705a47c17de3e19b58d0d64bafc17006cbf57064c5a56c4c0f2"}, - {file = "falcon-4.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ef8a4c30da27ae8707c1994d4b2728492e7e173c04e79dac49f22711db285bc"}, - {file = "falcon-4.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:6060146aad636931fdc88275740343e336fdb40c67b3ab43c40d48cb30964891"}, - {file = "falcon-4.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8ea3954305fcf7ebc1aac90f36c01d26ce12b77b059281166b95a553b3cc9d45"}, - {file = "falcon-4.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:84063a5242696c4cd9040ca53d178604445e8ce8b0a112c9461465554784644b"}, - {file = "falcon-4.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b3dbb2648f8d0670f48d5cdfa0b2b1decba6d1e505679291ffeaa5c4cb7e15df"}, - {file = "falcon-4.1.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b0c7cc2a2b3a715086a3b7877f6a6ddfcac7261c15ceb671c6a09f442b06ef66"}, - {file = "falcon-4.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccc7302a0056f8a03b98c9aa9acb96ad4cae4aabf3aa857f0c9f1871b58ae799"}, - {file = "falcon-4.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:06e554c1448fbad75de4747247d02a29a944b666f44279928efcac1324e941b4"}, - {file = "falcon-4.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a01511d6ef24eeb228b4bd47ba05e8e74f50834b5530223e834be84c0eae506"}, - {file = "falcon-4.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e3fefde1f590fff4ccd404dd932f10c9b91b42a1735e8205aa7551432a5e870a"}, - {file = "falcon-4.1.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:91e4dacdfc5681c13294d42caf951a2837a17b413539d3c71f21650ddf6b0b27"}, - {file = "falcon-4.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:214b437c03f9d0273f5b6f2e139e7d83b3f8748925d495ae9826e739608f6155"}, - {file = "falcon-4.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d569fde899c813a229108c689aa3bd88511db49d904dd35fc111949267d2ecd1"}, - {file = "falcon-4.1.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c38afcbb1b475974572859c6cc48fbdcda9a5d4094d06fd0ce54f321b3490975"}, - {file = "falcon-4.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:903501f334d5135e6c74e11141a94f1dd0fbf80344b3dc96b57e8a1a3c5a62cb"}, - {file = "falcon-4.1.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:90cc61a36d3e0375042b3c6a28ead19e969f8ba238beed17a887784625b9ee78"}, - {file = "falcon-4.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:aa12c4422ba789fdeb90f66f39fb5f9a359b5ddb4ff2c8d51d2e1f59277af7b9"}, - {file = "falcon-4.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:25be29328b39e384bd7fdd0cc46c0e86f232fcf37d9e3fb7033200df92cf1940"}, - {file = "falcon-4.1.0-py3-none-any.whl", hash = "sha256:07cb9690525fd69ca48bcf52dca8f32cff823564e89f3d0a04a2674c4c598176"}, - {file = "falcon-4.1.0.tar.gz", hash = "sha256:dbc3fa642b43e7662f121d0a7b5d7ea42a1a31fb22ae63572c42ee3ecd1f79d0"}, + {file = "falcon-4.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8b179c9de6aa29eaa2ab49cac94eb304f279b66c7073be915cef5d6ae1f8b69d"}, + {file = "falcon-4.2.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd6b0c04c5e8ee56ec3acec2c8603cfcc39658d7793ea86ecf058b094840c222"}, + {file = "falcon-4.2.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:05cd6dcf4cae4ad1cbbe6a11c9d63b35bb6f35422f778a292bc13f91f2504ad5"}, + {file = "falcon-4.2.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d045396a6d40f5d1bbe3eaf59496a382840db1c8841fe38ba8d45018fd3a184b"}, + {file = "falcon-4.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bd62565115df5b8b0780713979c285f3d84d4300f8d1c367b0678315eac6db63"}, + {file = "falcon-4.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9a0e2de9bd9a9b7d8644e44e49f26675fa753665b6a2ab3e9539c64bc636e398"}, + {file = "falcon-4.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:03c80035378b8b03375f7a7debd11d3b33cdb5b732d882e65b580afe9f937832"}, + {file = "falcon-4.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2faf74b996ad36fed2981a479f1d1d5e2f01b36f648746197285f38002022ad4"}, + {file = "falcon-4.2.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea18a598686b6a84cb59ce9afdd518f6bd5e79d9301290636645b5c81277621"}, + {file = "falcon-4.2.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:99ea076c290d092d052d4ec132238bbe5c414bee30b42621f814133ad62aad93"}, + {file = "falcon-4.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4e146967a4ff16c1a8f84971f5d2af81ba0b4ef13caf583e8094aa5ec9511d80"}, + {file = "falcon-4.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f159b8334686716d61f7e5c82c897f2d21013f38904fe3aafe7d83c5fbd98a4d"}, + {file = "falcon-4.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9c93dd7770e3b1cc5f0bc08f23ec954ae00d1b408f7255efa806697fdf38b345"}, + {file = "falcon-4.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:429974363bbb9ed4e98401c71be54f319559695e499238a51905895371c40fa7"}, + {file = "falcon-4.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:05832f66d54e178ae1df1dffe25c80a076448dc261cf6c50b271051b6cf56f0e"}, + {file = "falcon-4.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f7d454888ed6238f6d00406bfedf976b05157e001fc6a18a473ec1e2be35e6c"}, + {file = "falcon-4.2.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:353c69fe78b23dfa4fbe0ae78aa7d1ec2fe1c9db3c46b5a3e20d8f731b483b65"}, + {file = "falcon-4.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:66db3bd0e51723b299e31746a6c28c063ee0048988d9ef2f1d05245fd97bebf8"}, + {file = "falcon-4.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5d89a61285b49fb503c30cb11203694aba6d3e0f2e7cc5cad3676ce221d3a514"}, + {file = "falcon-4.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:02d3b1fb18393ed55315e04533eefd3f86d85d294212bf49895c5768007e58c9"}, + {file = "falcon-4.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:d3c9882f8bf98bd2bf0ab2a9378c108dfba33a41625cfe2f8106e060258b52ef"}, + {file = "falcon-4.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:00363f9d9273a1281ca7aa1d9dbecea09c172e7bb08e0acefa0a0234a3f94593"}, + {file = "falcon-4.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cd2059695f107e867fd12141d05771d5c6cbecc30a135f7d91ef06bfea94f05e"}, + {file = "falcon-4.2.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e0b1f69a97b3406feba07f41dde177b4c3dfa7046f6b977d4554772dc26252e7"}, + {file = "falcon-4.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4a54fa6c5f8a428a2e9b7ff7b936c566fe7bdcc50f965cea37fee9523eab1b74"}, + {file = "falcon-4.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:801e2c77c72b1777d09be7a72163b38209f5f9e42930bfe3dfdf027e7d84d035"}, + {file = "falcon-4.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f998402bf889cdd23cde29e7421469cdf2ef95afc71b2cdef7ed4957d0cd97f6"}, + {file = "falcon-4.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:584d000e9ffae5044f5fe6bf74d399edebb54926bb4a133d3caf03e529b8c616"}, + {file = "falcon-4.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ae9304c60b5fe84ffb35e91e1a1f071543a303edb252999800531ea01133c0d4"}, + {file = "falcon-4.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:16533a0ade619cc8e7f670330d4c12fa0bff74de88bfb29f3d3cf1b2023d31b8"}, + {file = "falcon-4.2.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1f3ddffc958d4e625281a321164c77ebbf537c0f2f5290b06ee1144b90386a5f"}, + {file = "falcon-4.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0c501f8206b9bf361826bfe8f108c7368afcae64df3ed38589b9becefdfad63"}, + {file = "falcon-4.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:402f38101b434415ecff72e5aa440c4f71ab45a879f455ab7d5655050e8ed218"}, + {file = "falcon-4.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2ca9194a3e8a9eace3bc0efaef50b4244beabd75cdd716611e244646efc6828a"}, + {file = "falcon-4.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:e0bd6384952b9e12d3ae84675df4862bdbaa1111cd52db17d70cdf60f8abe4b6"}, + {file = "falcon-4.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de67c7ed58a124f9f04337d254ec9db0e9fa0772d25f1c8f260c1c47878dc556"}, + {file = "falcon-4.2.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd8c19241aa66ecf494cd16d1cdc71de2cfbb3f76cafb7176e92708786001340"}, + {file = "falcon-4.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:aef6cd21a6e1b51c79038ff2e0b30746a68c7710307e5f5f0839338d7129577c"}, + {file = "falcon-4.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c132bb94351bddde993aad5147f9f3d9a942e2d93aece9d693723fb96fc8f51"}, + {file = "falcon-4.2.0-py3-none-any.whl", hash = "sha256:1d64afeca0dc03e7bed0202681dab4844544d8f6855c23e13f11a6eb10ac50ff"}, + {file = "falcon-4.2.0.tar.gz", hash = "sha256:c13e86e49696d6655411fe09473c34997e49ff45e8cdf7576297b0ca71ceac3d"}, ] [package.extras] @@ -596,95 +656,170 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc [[package]] name = "fonttools" -version = "4.60.1" +version = "4.60.2" description = "Tools to manipulate font files" optional = false python-versions = ">=3.9" groups = ["main"] +markers = "python_version < \"3.11\"" files = [ - {file = "fonttools-4.60.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9a52f254ce051e196b8fe2af4634c2d2f02c981756c6464dc192f1b6050b4e28"}, - {file = "fonttools-4.60.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c7420a2696a44650120cdd269a5d2e56a477e2bfa9d95e86229059beb1c19e15"}, - {file = "fonttools-4.60.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee0c0b3b35b34f782afc673d503167157094a16f442ace7c6c5e0ca80b08f50c"}, - {file = "fonttools-4.60.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:282dafa55f9659e8999110bd8ed422ebe1c8aecd0dc396550b038e6c9a08b8ea"}, - {file = "fonttools-4.60.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4ba4bd646e86de16160f0fb72e31c3b9b7d0721c3e5b26b9fa2fc931dfdb2652"}, - {file = "fonttools-4.60.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0b0835ed15dd5b40d726bb61c846a688f5b4ce2208ec68779bc81860adb5851a"}, - {file = "fonttools-4.60.1-cp310-cp310-win32.whl", hash = "sha256:1525796c3ffe27bb6268ed2a1bb0dcf214d561dfaf04728abf01489eb5339dce"}, - {file = "fonttools-4.60.1-cp310-cp310-win_amd64.whl", hash = "sha256:268ecda8ca6cb5c4f044b1fb9b3b376e8cd1b361cef275082429dc4174907038"}, - {file = "fonttools-4.60.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7b4c32e232a71f63a5d00259ca3d88345ce2a43295bb049d21061f338124246f"}, - {file = "fonttools-4.60.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3630e86c484263eaac71d117085d509cbcf7b18f677906824e4bace598fb70d2"}, - {file = "fonttools-4.60.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5c1015318e4fec75dd4943ad5f6a206d9727adf97410d58b7e32ab644a807914"}, - {file = "fonttools-4.60.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e6c58beb17380f7c2ea181ea11e7db8c0ceb474c9dd45f48e71e2cb577d146a1"}, - {file = "fonttools-4.60.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec3681a0cb34c255d76dd9d865a55f260164adb9fa02628415cdc2d43ee2c05d"}, - {file = "fonttools-4.60.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f4b5c37a5f40e4d733d3bbaaef082149bee5a5ea3156a785ff64d949bd1353fa"}, - {file = "fonttools-4.60.1-cp311-cp311-win32.whl", hash = "sha256:398447f3d8c0c786cbf1209711e79080a40761eb44b27cdafffb48f52bcec258"}, - {file = "fonttools-4.60.1-cp311-cp311-win_amd64.whl", hash = "sha256:d066ea419f719ed87bc2c99a4a4bfd77c2e5949cb724588b9dd58f3fd90b92bf"}, - {file = "fonttools-4.60.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7b0c6d57ab00dae9529f3faf187f2254ea0aa1e04215cf2f1a8ec277c96661bc"}, - {file = "fonttools-4.60.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:839565cbf14645952d933853e8ade66a463684ed6ed6c9345d0faf1f0e868877"}, - {file = "fonttools-4.60.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8177ec9676ea6e1793c8a084a90b65a9f778771998eb919d05db6d4b1c0b114c"}, - {file = "fonttools-4.60.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:996a4d1834524adbb423385d5a629b868ef9d774670856c63c9a0408a3063401"}, - {file = "fonttools-4.60.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a46b2f450bc79e06ef3b6394f0c68660529ed51692606ad7f953fc2e448bc903"}, - {file = "fonttools-4.60.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6ec722ee589e89a89f5b7574f5c45604030aa6ae24cb2c751e2707193b466fed"}, - {file = "fonttools-4.60.1-cp312-cp312-win32.whl", hash = "sha256:b2cf105cee600d2de04ca3cfa1f74f1127f8455b71dbad02b9da6ec266e116d6"}, - {file = "fonttools-4.60.1-cp312-cp312-win_amd64.whl", hash = "sha256:992775c9fbe2cf794786fa0ffca7f09f564ba3499b8fe9f2f80bd7197db60383"}, - {file = "fonttools-4.60.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6f68576bb4bbf6060c7ab047b1574a1ebe5c50a17de62830079967b211059ebb"}, - {file = "fonttools-4.60.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:eedacb5c5d22b7097482fa834bda0dafa3d914a4e829ec83cdea2a01f8c813c4"}, - {file = "fonttools-4.60.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b33a7884fabd72bdf5f910d0cf46be50dce86a0362a65cfc746a4168c67eb96c"}, - {file = "fonttools-4.60.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2409d5fb7b55fd70f715e6d34e7a6e4f7511b8ad29a49d6df225ee76da76dd77"}, - {file = "fonttools-4.60.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c8651e0d4b3bdeda6602b85fdc2abbefc1b41e573ecb37b6779c4ca50753a199"}, - {file = "fonttools-4.60.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:145daa14bf24824b677b9357c5e44fd8895c2a8f53596e1b9ea3496081dc692c"}, - {file = "fonttools-4.60.1-cp313-cp313-win32.whl", hash = "sha256:2299df884c11162617a66b7c316957d74a18e3758c0274762d2cc87df7bc0272"}, - {file = "fonttools-4.60.1-cp313-cp313-win_amd64.whl", hash = "sha256:a3db56f153bd4c5c2b619ab02c5db5192e222150ce5a1bc10f16164714bc39ac"}, - {file = "fonttools-4.60.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:a884aef09d45ba1206712c7dbda5829562d3fea7726935d3289d343232ecb0d3"}, - {file = "fonttools-4.60.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8a44788d9d91df72d1a5eac49b31aeb887a5f4aab761b4cffc4196c74907ea85"}, - {file = "fonttools-4.60.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e852d9dda9f93ad3651ae1e3bb770eac544ec93c3807888798eccddf84596537"}, - {file = "fonttools-4.60.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:154cb6ee417e417bf5f7c42fe25858c9140c26f647c7347c06f0cc2d47eff003"}, - {file = "fonttools-4.60.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:5664fd1a9ea7f244487ac8f10340c4e37664675e8667d6fee420766e0fb3cf08"}, - {file = "fonttools-4.60.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:583b7f8e3c49486e4d489ad1deacfb8d5be54a8ef34d6df824f6a171f8511d99"}, - {file = "fonttools-4.60.1-cp314-cp314-win32.whl", hash = "sha256:66929e2ea2810c6533a5184f938502cfdaea4bc3efb7130d8cc02e1c1b4108d6"}, - {file = "fonttools-4.60.1-cp314-cp314-win_amd64.whl", hash = "sha256:f3d5be054c461d6a2268831f04091dc82753176f6ea06dc6047a5e168265a987"}, - {file = "fonttools-4.60.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:b6379e7546ba4ae4b18f8ae2b9bc5960936007a1c0e30b342f662577e8bc3299"}, - {file = "fonttools-4.60.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9d0ced62b59e0430b3690dbc5373df1c2aa7585e9a8ce38eff87f0fd993c5b01"}, - {file = "fonttools-4.60.1-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:875cb7764708b3132637f6c5fb385b16eeba0f7ac9fa45a69d35e09b47045801"}, - {file = "fonttools-4.60.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a184b2ea57b13680ab6d5fbde99ccef152c95c06746cb7718c583abd8f945ccc"}, - {file = "fonttools-4.60.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:026290e4ec76583881763fac284aca67365e0be9f13a7fb137257096114cb3bc"}, - {file = "fonttools-4.60.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f0e8817c7d1a0c2eedebf57ef9a9896f3ea23324769a9a2061a80fe8852705ed"}, - {file = "fonttools-4.60.1-cp314-cp314t-win32.whl", hash = "sha256:1410155d0e764a4615774e5c2c6fc516259fe3eca5882f034eb9bfdbee056259"}, - {file = "fonttools-4.60.1-cp314-cp314t-win_amd64.whl", hash = "sha256:022beaea4b73a70295b688f817ddc24ed3e3418b5036ffcd5658141184ef0d0c"}, - {file = "fonttools-4.60.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:122e1a8ada290423c493491d002f622b1992b1ab0b488c68e31c413390dc7eb2"}, - {file = "fonttools-4.60.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a140761c4ff63d0cb9256ac752f230460ee225ccef4ad8f68affc723c88e2036"}, - {file = "fonttools-4.60.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0eae96373e4b7c9e45d099d7a523444e3554360927225c1cdae221a58a45b856"}, - {file = "fonttools-4.60.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:596ecaca36367027d525b3b426d8a8208169d09edcf8c7506aceb3a38bfb55c7"}, - {file = "fonttools-4.60.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2ee06fc57512144d8b0445194c2da9f190f61ad51e230f14836286470c99f854"}, - {file = "fonttools-4.60.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b42d86938e8dda1cd9a1a87a6d82f1818eaf933348429653559a458d027446da"}, - {file = "fonttools-4.60.1-cp39-cp39-win32.whl", hash = "sha256:8b4eb332f9501cb1cd3d4d099374a1e1306783ff95489a1026bde9eb02ccc34a"}, - {file = "fonttools-4.60.1-cp39-cp39-win_amd64.whl", hash = "sha256:7473a8ed9ed09aeaa191301244a5a9dbe46fe0bf54f9d6cd21d83044c3321217"}, - {file = "fonttools-4.60.1-py3-none-any.whl", hash = "sha256:906306ac7afe2156fcf0042173d6ebbb05416af70f6b370967b47f8f00103bbb"}, - {file = "fonttools-4.60.1.tar.gz", hash = "sha256:ef00af0439ebfee806b25f24c8f92109157ff3fac5731dc7867957812e87b8d9"}, + {file = "fonttools-4.60.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4e36fadcf7e8ca6e34d490eef86ed638d6fd9c55d2f514b05687622cfc4a7050"}, + {file = "fonttools-4.60.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6e500fc9c04bee749ceabfc20cb4903f6981c2139050d85720ea7ada61b75d5c"}, + {file = "fonttools-4.60.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22efea5e784e1d1cd8d7b856c198e360a979383ebc6dea4604743b56da1cbc34"}, + {file = "fonttools-4.60.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:677aa92d84d335e4d301d8ba04afca6f575316bc647b6782cb0921943fcb6343"}, + {file = "fonttools-4.60.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:edd49d3defbf35476e78b61ff737ff5efea811acff68d44233a95a5a48252334"}, + {file = "fonttools-4.60.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:126839492b69cecc5baf2bddcde60caab2ffafd867bbae2a88463fce6078ca3a"}, + {file = "fonttools-4.60.2-cp310-cp310-win32.whl", hash = "sha256:ffcab6f5537136046ca902ed2491ab081ba271b07591b916289b7c27ff845f96"}, + {file = "fonttools-4.60.2-cp310-cp310-win_amd64.whl", hash = "sha256:9c68b287c7ffcd29dd83b5f961004b2a54a862a88825d52ea219c6220309ba45"}, + {file = "fonttools-4.60.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a2aed0a7931401b3875265717a24c726f87ecfedbb7b3426c2ca4d2812e281ae"}, + {file = "fonttools-4.60.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dea6868e9d2b816c9076cfea77754686f3c19149873bdbc5acde437631c15df1"}, + {file = "fonttools-4.60.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2fa27f34950aa1fe0f0b1abe25eed04770a3b3b34ad94e5ace82cc341589678a"}, + {file = "fonttools-4.60.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:13a53d479d187b09bfaa4a35ffcbc334fc494ff355f0a587386099cb66674f1e"}, + {file = "fonttools-4.60.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fac5e921d3bd0ca3bb8517dced2784f0742bc8ca28579a68b139f04ea323a779"}, + {file = "fonttools-4.60.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:648f4f9186fd7f1f3cd57dbf00d67a583720d5011feca67a5e88b3a491952cfb"}, + {file = "fonttools-4.60.2-cp311-cp311-win32.whl", hash = "sha256:3274e15fad871bead5453d5ce02658f6d0c7bc7e7021e2a5b8b04e2f9e40da1a"}, + {file = "fonttools-4.60.2-cp311-cp311-win_amd64.whl", hash = "sha256:91d058d5a483a1525b367803abb69de0923fbd45e1f82ebd000f5c8aa65bc78e"}, + {file = "fonttools-4.60.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e0164b7609d2b5c5dd4e044b8085b7bd7ca7363ef8c269a4ab5b5d4885a426b2"}, + {file = "fonttools-4.60.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1dd3d9574fc595c1e97faccae0f264dc88784ddf7fbf54c939528378bacc0033"}, + {file = "fonttools-4.60.2-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:98d0719f1b11c2817307d2da2e94296a3b2a3503f8d6252a101dca3ee663b917"}, + {file = "fonttools-4.60.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9d3ea26957dd07209f207b4fff64c702efe5496de153a54d3b91007ec28904dd"}, + {file = "fonttools-4.60.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1ee301273b0850f3a515299f212898f37421f42ff9adfc341702582ca5073c13"}, + {file = "fonttools-4.60.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c6eb4694cc3b9c03b7c01d65a9cf35b577f21aa6abdbeeb08d3114b842a58153"}, + {file = "fonttools-4.60.2-cp312-cp312-win32.whl", hash = "sha256:57f07b616c69c244cc1a5a51072eeef07dddda5ebef9ca5c6e9cf6d59ae65b70"}, + {file = "fonttools-4.60.2-cp312-cp312-win_amd64.whl", hash = "sha256:310035802392f1fe5a7cf43d76f6ff4a24c919e4c72c0352e7b8176e2584b8a0"}, + {file = "fonttools-4.60.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2bb5fd231e56ccd7403212636dcccffc96c5ae0d6f9e4721fa0a32cb2e3ca432"}, + {file = "fonttools-4.60.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:536b5fab7b6fec78ccf59b5c59489189d9d0a8b0d3a77ed1858be59afb096696"}, + {file = "fonttools-4.60.2-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6b9288fc38252ac86a9570f19313ecbc9ff678982e0f27c757a85f1f284d3400"}, + {file = "fonttools-4.60.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:93fcb420791d839ef592eada2b69997c445d0ce9c969b5190f2e16828ec10607"}, + {file = "fonttools-4.60.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7916a381b094db4052ac284255186aebf74c5440248b78860cb41e300036f598"}, + {file = "fonttools-4.60.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:58c8c393d5e16b15662cfc2d988491940458aa87894c662154f50c7b49440bef"}, + {file = "fonttools-4.60.2-cp313-cp313-win32.whl", hash = "sha256:19c6e0afd8b02008caa0aa08ab896dfce5d0bcb510c49b2c499541d5cb95a963"}, + {file = "fonttools-4.60.2-cp313-cp313-win_amd64.whl", hash = "sha256:6a500dc59e11b2338c2dba1f8cf11a4ae8be35ec24af8b2628b8759a61457b76"}, + {file = "fonttools-4.60.2-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:9387c532acbe323bbf2a920f132bce3c408a609d5f9dcfc6532fbc7e37f8ccbb"}, + {file = "fonttools-4.60.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e6f1c824185b5b8fb681297f315f26ae55abb0d560c2579242feea8236b1cfef"}, + {file = "fonttools-4.60.2-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:55a3129d1e4030b1a30260f1b32fe76781b585fb2111d04a988e141c09eb6403"}, + {file = "fonttools-4.60.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b196e63753abc33b3b97a6fd6de4b7c4fef5552c0a5ba5e562be214d1e9668e0"}, + {file = "fonttools-4.60.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:de76c8d740fb55745f3b154f0470c56db92ae3be27af8ad6c2e88f1458260c9a"}, + {file = "fonttools-4.60.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6ba6303225c95998c9fda2d410aa792c3d2c1390a09df58d194b03e17583fa25"}, + {file = "fonttools-4.60.2-cp314-cp314-win32.whl", hash = "sha256:0a89728ce10d7c816fedaa5380c06d2793e7a8a634d7ce16810e536c22047384"}, + {file = "fonttools-4.60.2-cp314-cp314-win_amd64.whl", hash = "sha256:fa8446e6ab8bd778b82cb1077058a2addba86f30de27ab9cc18ed32b34bc8667"}, + {file = "fonttools-4.60.2-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:4063bc81ac5a4137642865cb63dd270e37b3cd1f55a07c0d6e41d072699ccca2"}, + {file = "fonttools-4.60.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:ebfdb66fa69732ed604ab8e2a0431e6deff35e933a11d73418cbc7823d03b8e1"}, + {file = "fonttools-4.60.2-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:50b10b3b1a72d1d54c61b0e59239e1a94c0958f4a06a1febf97ce75388dd91a4"}, + {file = "fonttools-4.60.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:beae16891a13b4a2ddec9b39b4de76092a3025e4d1c82362e3042b62295d5e4d"}, + {file = "fonttools-4.60.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:522f017fdb3766fd5d2d321774ef351cc6ce88ad4e6ac9efe643e4a2b9d528db"}, + {file = "fonttools-4.60.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:82cceceaf9c09a965a75b84a4b240dd3768e596ffb65ef53852681606fe7c9ba"}, + {file = "fonttools-4.60.2-cp314-cp314t-win32.whl", hash = "sha256:bbfbc918a75437fe7e6d64d1b1e1f713237df1cf00f3a36dedae910b2ba01cee"}, + {file = "fonttools-4.60.2-cp314-cp314t-win_amd64.whl", hash = "sha256:0e5cd9b0830f6550d58c84f3ab151a9892b50c4f9d538c5603c0ce6fff2eb3f1"}, + {file = "fonttools-4.60.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a3c75b8b42f7f93906bdba9eb1197bb76aecbe9a0a7cf6feec75f7605b5e8008"}, + {file = "fonttools-4.60.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0f86c8c37bc0ec0b9c141d5e90c717ff614e93c187f06d80f18c7057097f71bc"}, + {file = "fonttools-4.60.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fe905403fe59683b0e9a45f234af2866834376b8821f34633b1c76fb731b6311"}, + {file = "fonttools-4.60.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:38ce703b60a906e421e12d9e3a7f064883f5e61bb23e8961f4be33cfe578500b"}, + {file = "fonttools-4.60.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9e810c06f3e79185cecf120e58b343ea5a89b54dd695fd644446bcf8c026da5e"}, + {file = "fonttools-4.60.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:38faec8cc1d12122599814d15a402183f5123fb7608dac956121e7c6742aebc5"}, + {file = "fonttools-4.60.2-cp39-cp39-win32.whl", hash = "sha256:80a45cf7bf659acb7b36578f300231873daba67bd3ca8cce181c73f861f14a37"}, + {file = "fonttools-4.60.2-cp39-cp39-win_amd64.whl", hash = "sha256:c355d5972071938e1b1e0f5a1df001f68ecf1a62f34a3407dc8e0beccf052501"}, + {file = "fonttools-4.60.2-py3-none-any.whl", hash = "sha256:73cf92eeda67cf6ff10c8af56fc8f4f07c1647d989a979be9e388a49be26552a"}, + {file = "fonttools-4.60.2.tar.gz", hash = "sha256:d29552e6b155ebfc685b0aecf8d429cb76c14ab734c22ef5d3dea6fdf800c92c"}, ] [package.extras] -all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0) ; python_version <= \"3.12\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.45.0)", "unicodedata2 (>=17.0.0) ; python_version <= \"3.14\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] interpolatable = ["munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\""] lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] -repacker = ["uharfbuzz (>=0.23.0)"] +repacker = ["uharfbuzz (>=0.45.0)"] symfont = ["sympy"] type1 = ["xattr ; sys_platform == \"darwin\""] -unicode = ["unicodedata2 (>=15.1.0) ; python_version <= \"3.12\""] +unicode = ["unicodedata2 (>=17.0.0) ; python_version <= \"3.14\""] +woff = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "zopfli (>=0.1.4)"] + +[[package]] +name = "fonttools" +version = "4.61.1" +description = "Tools to manipulate font files" +optional = false +python-versions = ">=3.10" +groups = ["main"] +markers = "python_version >= \"3.11\"" +files = [ + {file = "fonttools-4.61.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c7db70d57e5e1089a274cbb2b1fd635c9a24de809a231b154965d415d6c6d24"}, + {file = "fonttools-4.61.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5fe9fd43882620017add5eabb781ebfbc6998ee49b35bd7f8f79af1f9f99a958"}, + {file = "fonttools-4.61.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8db08051fc9e7d8bc622f2112511b8107d8f27cd89e2f64ec45e9825e8288da"}, + {file = "fonttools-4.61.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a76d4cb80f41ba94a6691264be76435e5f72f2cb3cab0b092a6212855f71c2f6"}, + {file = "fonttools-4.61.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a13fc8aeb24bad755eea8f7f9d409438eb94e82cf86b08fe77a03fbc8f6a96b1"}, + {file = "fonttools-4.61.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b846a1fcf8beadeb9ea4f44ec5bdde393e2f1569e17d700bfc49cd69bde75881"}, + {file = "fonttools-4.61.1-cp310-cp310-win32.whl", hash = "sha256:78a7d3ab09dc47ac1a363a493e6112d8cabed7ba7caad5f54dbe2f08676d1b47"}, + {file = "fonttools-4.61.1-cp310-cp310-win_amd64.whl", hash = "sha256:eff1ac3cc66c2ac7cda1e64b4e2f3ffef474b7335f92fc3833fc632d595fcee6"}, + {file = "fonttools-4.61.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c6604b735bb12fef8e0efd5578c9fb5d3d8532d5001ea13a19cddf295673ee09"}, + {file = "fonttools-4.61.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5ce02f38a754f207f2f06557523cd39a06438ba3aafc0639c477ac409fc64e37"}, + {file = "fonttools-4.61.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77efb033d8d7ff233385f30c62c7c79271c8885d5c9657d967ede124671bbdfb"}, + {file = "fonttools-4.61.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:75c1a6dfac6abd407634420c93864a1e274ebc1c7531346d9254c0d8f6ca00f9"}, + {file = "fonttools-4.61.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0de30bfe7745c0d1ffa2b0b7048fb7123ad0d71107e10ee090fa0b16b9452e87"}, + {file = "fonttools-4.61.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58b0ee0ab5b1fc9921eccfe11d1435added19d6494dde14e323f25ad2bc30c56"}, + {file = "fonttools-4.61.1-cp311-cp311-win32.whl", hash = "sha256:f79b168428351d11e10c5aeb61a74e1851ec221081299f4cf56036a95431c43a"}, + {file = "fonttools-4.61.1-cp311-cp311-win_amd64.whl", hash = "sha256:fe2efccb324948a11dd09d22136fe2ac8a97d6c1347cf0b58a911dcd529f66b7"}, + {file = "fonttools-4.61.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f3cb4a569029b9f291f88aafc927dd53683757e640081ca8c412781ea144565e"}, + {file = "fonttools-4.61.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41a7170d042e8c0024703ed13b71893519a1a6d6e18e933e3ec7507a2c26a4b2"}, + {file = "fonttools-4.61.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10d88e55330e092940584774ee5e8a6971b01fc2f4d3466a1d6c158230880796"}, + {file = "fonttools-4.61.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:15acc09befd16a0fb8a8f62bc147e1a82817542d72184acca9ce6e0aeda9fa6d"}, + {file = "fonttools-4.61.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e6bcdf33aec38d16508ce61fd81838f24c83c90a1d1b8c68982857038673d6b8"}, + {file = "fonttools-4.61.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5fade934607a523614726119164ff621e8c30e8fa1ffffbbd358662056ba69f0"}, + {file = "fonttools-4.61.1-cp312-cp312-win32.whl", hash = "sha256:75da8f28eff26defba42c52986de97b22106cb8f26515b7c22443ebc9c2d3261"}, + {file = "fonttools-4.61.1-cp312-cp312-win_amd64.whl", hash = "sha256:497c31ce314219888c0e2fce5ad9178ca83fe5230b01a5006726cdf3ac9f24d9"}, + {file = "fonttools-4.61.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c56c488ab471628ff3bfa80964372fc13504ece601e0d97a78ee74126b2045c"}, + {file = "fonttools-4.61.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc492779501fa723b04d0ab1f5be046797fee17d27700476edc7ee9ae535a61e"}, + {file = "fonttools-4.61.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:64102ca87e84261419c3747a0d20f396eb024bdbeb04c2bfb37e2891f5fadcb5"}, + {file = "fonttools-4.61.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c1b526c8d3f615a7b1867f38a9410849c8f4aef078535742198e942fba0e9bd"}, + {file = "fonttools-4.61.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:41ed4b5ec103bd306bb68f81dc166e77409e5209443e5773cb4ed837bcc9b0d3"}, + {file = "fonttools-4.61.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b501c862d4901792adaec7c25b1ecc749e2662543f68bb194c42ba18d6eec98d"}, + {file = "fonttools-4.61.1-cp313-cp313-win32.whl", hash = "sha256:4d7092bb38c53bbc78e9255a59158b150bcdc115a1e3b3ce0b5f267dc35dd63c"}, + {file = "fonttools-4.61.1-cp313-cp313-win_amd64.whl", hash = "sha256:21e7c8d76f62ab13c9472ccf74515ca5b9a761d1bde3265152a6dc58700d895b"}, + {file = "fonttools-4.61.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fff4f534200a04b4a36e7ae3cb74493afe807b517a09e99cb4faa89a34ed6ecd"}, + {file = "fonttools-4.61.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d9203500f7c63545b4ce3799319fe4d9feb1a1b89b28d3cb5abd11b9dd64147e"}, + {file = "fonttools-4.61.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fa646ecec9528bef693415c79a86e733c70a4965dd938e9a226b0fc64c9d2e6c"}, + {file = "fonttools-4.61.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11f35ad7805edba3aac1a3710d104592df59f4b957e30108ae0ba6c10b11dd75"}, + {file = "fonttools-4.61.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b931ae8f62db78861b0ff1ac017851764602288575d65b8e8ff1963fed419063"}, + {file = "fonttools-4.61.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b148b56f5de675ee16d45e769e69f87623a4944f7443850bf9a9376e628a89d2"}, + {file = "fonttools-4.61.1-cp314-cp314-win32.whl", hash = "sha256:9b666a475a65f4e839d3d10473fad6d47e0a9db14a2f4a224029c5bfde58ad2c"}, + {file = "fonttools-4.61.1-cp314-cp314-win_amd64.whl", hash = "sha256:4f5686e1fe5fce75d82d93c47a438a25bf0d1319d2843a926f741140b2b16e0c"}, + {file = "fonttools-4.61.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:e76ce097e3c57c4bcb67c5aa24a0ecdbd9f74ea9219997a707a4061fbe2707aa"}, + {file = "fonttools-4.61.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:9cfef3ab326780c04d6646f68d4b4742aae222e8b8ea1d627c74e38afcbc9d91"}, + {file = "fonttools-4.61.1-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a75c301f96db737e1c5ed5fd7d77d9c34466de16095a266509e13da09751bd19"}, + {file = "fonttools-4.61.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:91669ccac46bbc1d09e9273546181919064e8df73488ea087dcac3e2968df9ba"}, + {file = "fonttools-4.61.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c33ab3ca9d3ccd581d58e989d67554e42d8d4ded94ab3ade3508455fe70e65f7"}, + {file = "fonttools-4.61.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:664c5a68ec406f6b1547946683008576ef8b38275608e1cee6c061828171c118"}, + {file = "fonttools-4.61.1-cp314-cp314t-win32.whl", hash = "sha256:aed04cabe26f30c1647ef0e8fbb207516fd40fe9472e9439695f5c6998e60ac5"}, + {file = "fonttools-4.61.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2180f14c141d2f0f3da43f3a81bc8aa4684860f6b0e6f9e165a4831f24e6a23b"}, + {file = "fonttools-4.61.1-py3-none-any.whl", hash = "sha256:17d2bf5d541add43822bcf0c43d7d847b160c9bb01d15d5007d84e2217aaa371"}, + {file = "fonttools-4.61.1.tar.gz", hash = "sha256:6675329885c44657f826ef01d9e4fb33b9158e9d93c537d84ad8399539bc6f69"}, +] + +[package.extras] +all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.45.0)", "unicodedata2 (>=17.0.0) ; python_version <= \"3.14\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\""] +lxml = ["lxml (>=4.0)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.45.0)"] +symfont = ["sympy"] +type1 = ["xattr ; sys_platform == \"darwin\""] +unicode = ["unicodedata2 (>=17.0.0) ; python_version <= \"3.14\""] woff = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "zopfli (>=0.1.4)"] [[package]] name = "idna" -version = "3.10" +version = "3.11" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" groups = ["main"] files = [ - {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, - {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, + {file = "idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea"}, + {file = "idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902"}, ] [package.extras] @@ -717,15 +852,15 @@ tests = ["black (>=23.3.0)", "flake8 (>=3.8.2)", "keras (>=2.4.3)", "mypy (>=1.3 [[package]] name = "importlib-metadata" -version = "8.7.0" +version = "8.7.1" description = "Read metadata from Python packages" optional = false python-versions = ">=3.9" groups = ["main"] markers = "python_version == \"3.9\"" files = [ - {file = "importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd"}, - {file = "importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000"}, + {file = "importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151"}, + {file = "importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb"}, ] [package.dependencies] @@ -735,10 +870,10 @@ zipp = ">=3.20" check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -enabler = ["pytest-enabler (>=2.2)"] +enabler = ["pytest-enabler (>=3.4)"] perf = ["ipython"] -test = ["flufl.flake8", "importlib_resources (>=1.3) ; python_version < \"3.9\"", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] -type = ["pytest-mypy"] +test = ["flufl.flake8", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +type = ["mypy (<1.19) ; platform_python_implementation == \"PyPy\"", "pytest-mypy (>=1.0.1)"] [[package]] name = "importlib-resources" @@ -795,11 +930,25 @@ description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.8" groups = ["main"] +markers = "python_version < \"3.11\"" files = [ {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, ] +[[package]] +name = "iniconfig" +version = "2.3.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.10" +groups = ["main"] +markers = "python_version >= \"3.11\"" +files = [ + {file = "iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12"}, + {file = "iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730"}, +] + [[package]] name = "isodate" version = "0.7.2" @@ -815,14 +964,14 @@ files = [ [[package]] name = "joblib" -version = "1.5.2" +version = "1.5.3" description = "Lightweight pipelining with Python functions" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "joblib-1.5.2-py3-none-any.whl", hash = "sha256:4e1f0bdbb987e6d843c70cf43714cb276623def372df3c22fe5266b2670bc241"}, - {file = "joblib-1.5.2.tar.gz", hash = "sha256:3faa5c39054b2f03ca547da9b2f52fde67c06240c31853f306aea97f13647b55"}, + {file = "joblib-1.5.3-py3-none-any.whl", hash = "sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713"}, + {file = "joblib-1.5.3.tar.gz", hash = "sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3"}, ] [[package]] @@ -844,6 +993,7 @@ description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.9" groups = ["main"] +markers = "python_version < \"3.11\"" files = [ {file = "jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63"}, {file = "jsonschema-4.25.1.tar.gz", hash = "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85"}, @@ -859,6 +1009,29 @@ rpds-py = ">=0.7.1" format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "rfc3987-syntax (>=1.1.0)", "uri-template", "webcolors (>=24.6.0)"] +[[package]] +name = "jsonschema" +version = "4.26.0" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.10" +groups = ["main"] +markers = "python_version >= \"3.11\"" +files = [ + {file = "jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce"}, + {file = "jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" +rpds-py = ">=0.25.0" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "rfc3987-syntax (>=1.1.0)", "uri-template", "webcolors (>=24.6.0)"] + [[package]] name = "jsonschema-specifications" version = "2025.9.1" @@ -881,6 +1054,7 @@ description = "Jupyter core package. A base package on which Jupyter projects re optional = false python-versions = ">=3.8" groups = ["main"] +markers = "python_version < \"3.11\"" files = [ {file = "jupyter_core-5.8.1-py3-none-any.whl", hash = "sha256:c28d268fc90fb53f1338ded2eb410704c5449a358406e8a948b75706e24863d0"}, {file = "jupyter_core-5.8.1.tar.gz", hash = "sha256:0a5f9706f70e64786b75acba995988915ebd4601c8a52e534a40b51c95f59941"}, @@ -895,6 +1069,27 @@ traitlets = ">=5.3" docs = ["intersphinx-registry", "myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-spelling", "traitlets"] test = ["ipykernel", "pre-commit", "pytest (<9)", "pytest-cov", "pytest-timeout"] +[[package]] +name = "jupyter-core" +version = "5.9.1" +description = "Jupyter core package. A base package on which Jupyter projects rely." +optional = false +python-versions = ">=3.10" +groups = ["main"] +markers = "python_version >= \"3.11\"" +files = [ + {file = "jupyter_core-5.9.1-py3-none-any.whl", hash = "sha256:ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407"}, + {file = "jupyter_core-5.9.1.tar.gz", hash = "sha256:4d09aaff303b9566c3ce657f580bd089ff5c91f5f89cf7d8846c3cdf465b5508"}, +] + +[package.dependencies] +platformdirs = ">=2.5" +traitlets = ">=5.3" + +[package.extras] +docs = ["intersphinx-registry", "myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-spelling", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest (<9)", "pytest-cov", "pytest-timeout"] + [[package]] name = "kiwisolver" version = "1.4.7" @@ -1288,6 +1483,7 @@ description = "Python implementation of John Gruber's Markdown." optional = false python-versions = ">=3.9" groups = ["main"] +markers = "python_version < \"3.11\"" files = [ {file = "markdown-3.9-py3-none-any.whl", hash = "sha256:9f4d91ed810864ea88a6f32c07ba8bee1346c0cc1f6b1f9f6c822f2a9667d280"}, {file = "markdown-3.9.tar.gz", hash = "sha256:d2900fe1782bd33bdbbd56859defef70c2e78fc46668f8eb9df3128138f2cb6a"}, @@ -1300,6 +1496,23 @@ importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} docs = ["mdx_gh_links (>=0.2)", "mkdocs (>=1.6)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] testing = ["coverage", "pyyaml"] +[[package]] +name = "markdown" +version = "3.10.1" +description = "Python implementation of John Gruber's Markdown." +optional = false +python-versions = ">=3.10" +groups = ["main"] +markers = "python_version >= \"3.11\"" +files = [ + {file = "markdown-3.10.1-py3-none-any.whl", hash = "sha256:867d788939fe33e4b736426f5b9f651ad0c0ae0ecf89df0ca5d1176c70812fe3"}, + {file = "markdown-3.10.1.tar.gz", hash = "sha256:1c19c10bd5c14ac948c53d0d762a04e2fa35a6d58a6b7b1e6bfcbe6fefc0001a"}, +] + +[package.extras] +docs = ["mdx_gh_links (>=0.2)", "mkdocs (>=1.6)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python] (>=0.28.3)"] +testing = ["coverage", "pyyaml"] + [[package]] name = "markdown-it-py" version = "3.0.0" @@ -1332,6 +1545,7 @@ description = "Python plotting package" optional = false python-versions = ">=3.9" groups = ["main"] +markers = "python_version < \"3.11\"" files = [ {file = "matplotlib-3.9.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c5fdd7abfb706dfa8d307af64a87f1a862879ec3cd8d0ec8637458f0885b9c50"}, {file = "matplotlib-3.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d89bc4e85e40a71d1477780366c27fb7c6494d293e1617788986f74e2a03d7ff"}, @@ -1391,6 +1605,86 @@ python-dateutil = ">=2.7" [package.extras] dev = ["meson-python (>=0.13.1,<0.17.0)", "numpy (>=1.25)", "pybind11 (>=2.6,!=2.13.3)", "setuptools (>=64)", "setuptools_scm (>=7)"] +[[package]] +name = "matplotlib" +version = "3.10.8" +description = "Python plotting package" +optional = false +python-versions = ">=3.10" +groups = ["main"] +markers = "python_version >= \"3.11\"" +files = [ + {file = "matplotlib-3.10.8-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:00270d217d6b20d14b584c521f810d60c5c78406dc289859776550df837dcda7"}, + {file = "matplotlib-3.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37b3c1cc42aa184b3f738cfa18c1c1d72fd496d85467a6cf7b807936d39aa656"}, + {file = "matplotlib-3.10.8-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ee40c27c795bda6a5292e9cff9890189d32f7e3a0bf04e0e3c9430c4a00c37df"}, + {file = "matplotlib-3.10.8-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a48f2b74020919552ea25d222d5cc6af9ca3f4eb43a93e14d068457f545c2a17"}, + {file = "matplotlib-3.10.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f254d118d14a7f99d616271d6c3c27922c092dac11112670b157798b89bf4933"}, + {file = "matplotlib-3.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:f9b587c9c7274c1613a30afabf65a272114cd6cdbe67b3406f818c79d7ab2e2a"}, + {file = "matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6be43b667360fef5c754dda5d25a32e6307a03c204f3c0fc5468b78fa87b4160"}, + {file = "matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2b336e2d91a3d7006864e0990c83b216fcdca64b5a6484912902cef87313d78"}, + {file = "matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:efb30e3baaea72ce5928e32bab719ab4770099079d66726a62b11b1ef7273be4"}, + {file = "matplotlib-3.10.8-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d56a1efd5bfd61486c8bc968fa18734464556f0fb8e51690f4ac25d85cbbbbc2"}, + {file = "matplotlib-3.10.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238b7ce5717600615c895050239ec955d91f321c209dd110db988500558e70d6"}, + {file = "matplotlib-3.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:18821ace09c763ec93aef5eeff087ee493a24051936d7b9ebcad9662f66501f9"}, + {file = "matplotlib-3.10.8-cp311-cp311-win_arm64.whl", hash = "sha256:bab485bcf8b1c7d2060b4fcb6fc368a9e6f4cd754c9c2fea281f4be21df394a2"}, + {file = "matplotlib-3.10.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:64fcc24778ca0404ce0cb7b6b77ae1f4c7231cdd60e6778f999ee05cbd581b9a"}, + {file = "matplotlib-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b9a5ca4ac220a0cdd1ba6bcba3608547117d30468fefce49bb26f55c1a3d5c58"}, + {file = "matplotlib-3.10.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ab4aabc72de4ff77b3ec33a6d78a68227bf1123465887f9905ba79184a1cc04"}, + {file = "matplotlib-3.10.8-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24d50994d8c5816ddc35411e50a86ab05f575e2530c02752e02538122613371f"}, + {file = "matplotlib-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:99eefd13c0dc3b3c1b4d561c1169e65fe47aab7b8158754d7c084088e2329466"}, + {file = "matplotlib-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:dd80ecb295460a5d9d260df63c43f4afbdd832d725a531f008dad1664f458adf"}, + {file = "matplotlib-3.10.8-cp312-cp312-win_arm64.whl", hash = "sha256:3c624e43ed56313651bc18a47f838b60d7b8032ed348911c54906b130b20071b"}, + {file = "matplotlib-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3f2e409836d7f5ac2f1c013110a4d50b9f7edc26328c108915f9075d7d7a91b6"}, + {file = "matplotlib-3.10.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56271f3dac49a88d7fca5060f004d9d22b865f743a12a23b1e937a0be4818ee1"}, + {file = "matplotlib-3.10.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a0a7f52498f72f13d4a25ea70f35f4cb60642b466cbb0a9be951b5bc3f45a486"}, + {file = "matplotlib-3.10.8-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:646d95230efb9ca614a7a594d4fcacde0ac61d25e37dd51710b36477594963ce"}, + {file = "matplotlib-3.10.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f89c151aab2e2e23cb3fe0acad1e8b82841fd265379c4cecd0f3fcb34c15e0f6"}, + {file = "matplotlib-3.10.8-cp313-cp313-win_amd64.whl", hash = "sha256:e8ea3e2d4066083e264e75c829078f9e149fa119d27e19acd503de65e0b13149"}, + {file = "matplotlib-3.10.8-cp313-cp313-win_arm64.whl", hash = "sha256:c108a1d6fa78a50646029cb6d49808ff0fc1330fda87fa6f6250c6b5369b6645"}, + {file = "matplotlib-3.10.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ad3d9833a64cf48cc4300f2b406c3d0f4f4724a91c0bd5640678a6ba7c102077"}, + {file = "matplotlib-3.10.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:eb3823f11823deade26ce3b9f40dcb4a213da7a670013929f31d5f5ed1055b22"}, + {file = "matplotlib-3.10.8-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d9050fee89a89ed57b4fb2c1bfac9a3d0c57a0d55aed95949eedbc42070fea39"}, + {file = "matplotlib-3.10.8-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b44d07310e404ba95f8c25aa5536f154c0a8ec473303535949e52eb71d0a1565"}, + {file = "matplotlib-3.10.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0a33deb84c15ede243aead39f77e990469fff93ad1521163305095b77b72ce4a"}, + {file = "matplotlib-3.10.8-cp313-cp313t-win_amd64.whl", hash = "sha256:3a48a78d2786784cc2413e57397981fb45c79e968d99656706018d6e62e57958"}, + {file = "matplotlib-3.10.8-cp313-cp313t-win_arm64.whl", hash = "sha256:15d30132718972c2c074cd14638c7f4592bd98719e2308bccea40e0538bc0cb5"}, + {file = "matplotlib-3.10.8-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b53285e65d4fa4c86399979e956235deb900be5baa7fc1218ea67fbfaeaadd6f"}, + {file = "matplotlib-3.10.8-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32f8dce744be5569bebe789e46727946041199030db8aeb2954d26013a0eb26b"}, + {file = "matplotlib-3.10.8-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4cf267add95b1c88300d96ca837833d4112756045364f5c734a2276038dae27d"}, + {file = "matplotlib-3.10.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2cf5bd12cecf46908f286d7838b2abc6c91cda506c0445b8223a7c19a00df008"}, + {file = "matplotlib-3.10.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:41703cc95688f2516b480f7f339d8851a6035f18e100ee6a32bc0b8536a12a9c"}, + {file = "matplotlib-3.10.8-cp314-cp314-win_amd64.whl", hash = "sha256:83d282364ea9f3e52363da262ce32a09dfe241e4080dcedda3c0db059d3c1f11"}, + {file = "matplotlib-3.10.8-cp314-cp314-win_arm64.whl", hash = "sha256:2c1998e92cd5999e295a731bcb2911c75f597d937341f3030cc24ef2733d78a8"}, + {file = "matplotlib-3.10.8-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b5a2b97dbdc7d4f353ebf343744f1d1f1cca8aa8bfddb4262fcf4306c3761d50"}, + {file = "matplotlib-3.10.8-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3f5c3e4da343bba819f0234186b9004faba952cc420fbc522dc4e103c1985908"}, + {file = "matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f62550b9a30afde8c1c3ae450e5eb547d579dd69b25c2fc7a1c67f934c1717a"}, + {file = "matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:495672de149445ec1b772ff2c9ede9b769e3cb4f0d0aa7fa730d7f59e2d4e1c1"}, + {file = "matplotlib-3.10.8-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:595ba4d8fe983b88f0eec8c26a241e16d6376fe1979086232f481f8f3f67494c"}, + {file = "matplotlib-3.10.8-cp314-cp314t-win_amd64.whl", hash = "sha256:25d380fe8b1dc32cf8f0b1b448470a77afb195438bafdf1d858bfb876f3edf7b"}, + {file = "matplotlib-3.10.8-cp314-cp314t-win_arm64.whl", hash = "sha256:113bb52413ea508ce954a02c10ffd0d565f9c3bc7f2eddc27dfe1731e71c7b5f"}, + {file = "matplotlib-3.10.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f97aeb209c3d2511443f8797e3e5a569aebb040d4f8bc79aa3ee78a8fb9e3dd8"}, + {file = "matplotlib-3.10.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fb061f596dad3a0f52b60dc6a5dec4a0c300dec41e058a7efe09256188d170b7"}, + {file = "matplotlib-3.10.8-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:12d90df9183093fcd479f4172ac26b322b1248b15729cb57f42f71f24c7e37a3"}, + {file = "matplotlib-3.10.8-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6da7c2ce169267d0d066adcf63758f0604aa6c3eebf67458930f9d9b79ad1db1"}, + {file = "matplotlib-3.10.8-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9153c3292705be9f9c64498a8872118540c3f4123d1a1c840172edf262c8be4a"}, + {file = "matplotlib-3.10.8-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ae029229a57cd1e8fe542485f27e7ca7b23aa9e8944ddb4985d0bc444f1eca2"}, + {file = "matplotlib-3.10.8.tar.gz", hash = "sha256:2299372c19d56bcd35cf05a2738308758d32b9eaed2371898d8f5bd33f084aa3"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +kiwisolver = ">=1.3.1" +numpy = ">=1.23" +packaging = ">=20.0" +pillow = ">=8" +pyparsing = ">=3" +python-dateutil = ">=2.7" + +[package.extras] +dev = ["meson-python (>=0.13.1,<0.17.0)", "pybind11 (>=2.13.2,!=2.13.3)", "setuptools (>=64)", "setuptools_scm (>=7)"] + [[package]] name = "mdurl" version = "0.1.2" @@ -1417,30 +1711,33 @@ files = [ [[package]] name = "morph-kgc" -version = "2.9.0" +version = "2.10.0" description = "Powerful [R2]RML engine to create RDF knowledge graphs from heterogeneous data sources." optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "morph_kgc-2.9.0-py3-none-any.whl", hash = "sha256:28e7fe8b2bd26cc29c3ade88a0032b5562274ac61a1b1ef6e9fc41cfc97791d0"}, - {file = "morph_kgc-2.9.0.tar.gz", hash = "sha256:39d06525b74449b7377372c702456063b9886676c0466f14ed489ef8a9f65952"}, + {file = "morph_kgc-2.10.0-py3-none-any.whl", hash = "sha256:8ce01d8db014a3cbe9d2e77f61c543ea8d19a7f9ec7cd6ad4abf203bd9ce9ba7"}, + {file = "morph_kgc-2.10.0.tar.gz", hash = "sha256:a8d01d4c2118821ed46490bc6445d0d06f0f5dd23e29eeeee1da64ea99e1a124"}, ] [package.dependencies] duckdb = ">=1.0.0,<2.0.0" elementpath = ">=4.0.0,<5.0.0" falcon = ">=3.0.0,<5.0.0" -jsonpath-python = ">=1.0.6,<2.0.0" +jsonpath-python = "1.0.6" pandas = ">=2.1.0,<3.0.0" pyoxigraph = ">=0.3.0,<0.4.0" -rdflib = ">=6.1.1,<8.0.0" +rdflib = ">=6.1.1,<7.3.0" ruamel-yaml = ">=0.18.0,<0.19.0" [package.extras] -all = ["cryptography (>=42.0.0,<43.0.0)", "databricks-sqlalchemy (>=2.0.4,<3.0.0)", "kafka-python (>=2.0.2,<3.0.0)", "kuzu (>=0.4.2,<2.0.0)", "neo4j (>=5.20.0,<6.0.0)", "odfpy (>=1.4.1,<2.0.0)", "openpyxl (>=3.0.0,<4.0.0)", "oracledb (>=2.5.0,<9.0.0)", "psycopg[binary] (>=3.0.0,<4.0.0)", "pyarrow (>=14.0.0,<16.0.0)", "pymssql (>=2.2.7,<3.0.0)", "pymysql (>=1.1.0,<2.0.0)", "pyreadstat (>=1.2.0,<2.0.0)", "snowflake-sqlalchemy (>=1.7.3,<2.0.0)", "sql-metadata (>=2.6.0,<3.0.0)", "sqlalchemy (>=2.0.0,<3.0.0)"] +all = ["cryptography (>=42.0.0,<43.0.0)", "databricks-sqlalchemy (>=2.0.4,<3.0.0)", "geopandas (>=1.0.0,<2.0.0)", "kafka-python (>=2.0.2,<3.0.0)", "kuzu (>=0.4.2,<2.0.0)", "neo4j (>=5.20.0,<6.0.0)", "odfpy (>=1.4.1,<2.0.0)", "openpyxl (>=3.0.0,<4.0.0)", "oracledb (>=2.5.0,<9.0.0)", "psycopg[binary] (>=3.0.0,<4.0.0)", "pyarrow (>=14.0.0,<16.0.0)", "pyjelly (>=0.6.2)", "pymssql (>=2.2.7,<3.0.0)", "pymysql (>=1.1.0,<2.0.0)", "pyreadstat (>=1.2.0,<2.0.0)", "requests (>=2.0.0,<3.0.0)", "snowflake-sqlalchemy (>=1.7.3,<2.0.0)", "sql-metadata (>=2.6.0,<3.0.0)", "sqlalchemy (>=2.0.0,<3.0.0)"] databricks = ["databricks-sqlalchemy (>=2.0.4,<3.0.0)"] excel = ["odfpy (>=1.4.1,<2.0.0)", "openpyxl (>=3.0.0,<4.0.0)"] +geoparquet = ["geopandas (>=1.0.0,<2.0.0)"] +http = ["requests (>=2.0.0,<3.0.0)"] +jelly = ["pyjelly (>=0.6.2)"] kafka = ["kafka-python (>=2.0.2,<3.0.0)"] kuzu = ["kuzu (>=0.4.2,<2.0.0)"] mssql = ["pymssql (>=2.2.7,<3.0.0)", "sql-metadata (>=2.6.0,<3.0.0)", "sqlalchemy (>=2.0.0,<3.0.0)"] @@ -1452,7 +1749,7 @@ snowflake = ["snowflake-sqlalchemy (>=1.7.3,<2.0.0)"] spss = ["pyreadstat (>=1.2.0,<2.0.0)"] sqlite = ["sql-metadata (>=2.6.0,<3.0.0)", "sqlalchemy (>=2.0.0,<3.0.0)"] tabular = ["pyarrow (>=14.0.0,<16.0.0)"] -test = ["odfpy (>=1.4.1,<2.0.0)", "openpyxl (>=3.0.0,<4.0.0)", "pyarrow (>=14.0.0,<20.0.0)", "pytest (>=8.0.0,<9.0.0)", "sql-metadata (>=2.6.0,<3.0.0)", "sqlalchemy (>=2.0.0,<3.0.0)"] +test = ["geopandas (>=1.0.0,<2.0.0)", "odfpy (>=1.4.1,<2.0.0)", "openpyxl (>=3.0.0,<4.0.0)", "pyarrow (>=14.0.0,<20.0.0)", "pytest (>=8.0.0,<9.0.0)", "sql-metadata (>=2.6.0,<3.0.0)", "sqlalchemy (>=2.0.0,<3.0.0)"] [[package]] name = "nbformat" @@ -1550,27 +1847,27 @@ files = [ [[package]] name = "nvidia-nccl-cu12" -version = "2.28.3" +version = "2.29.2" description = "NVIDIA Collective Communication Library (NCCL) Runtime" optional = false python-versions = ">=3" groups = ["main"] markers = "platform_system == \"Linux\" and platform_machine != \"aarch64\"" files = [ - {file = "nvidia_nccl_cu12-2.28.3-py3-none-manylinux_2_18_aarch64.whl", hash = "sha256:85144f2197e81148e18f3ffd28a30d78b5046844877630d2710a1b22669a6e46"}, - {file = "nvidia_nccl_cu12-2.28.3-py3-none-manylinux_2_18_x86_64.whl", hash = "sha256:79cf0412094e4a552889e5cb7757d92c010ead557ec722c5eebe6a94b1d8681c"}, + {file = "nvidia_nccl_cu12-2.29.2-py3-none-manylinux_2_18_aarch64.whl", hash = "sha256:0712e55c067965c6093cc793a9bbcc5f37b5b47248e9ebf8ae3af06867757587"}, + {file = "nvidia_nccl_cu12-2.29.2-py3-none-manylinux_2_18_x86_64.whl", hash = "sha256:3a9a0bf4142126e0d0ed99ec202579bef8d007601f9fab75af60b10324666b12"}, ] [[package]] name = "packaging" -version = "25.0" +version = "26.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, - {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, + {file = "packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529"}, + {file = "packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4"}, ] [[package]] @@ -1680,6 +1977,7 @@ description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.9" groups = ["main"] +markers = "python_version < \"3.11\"" files = [ {file = "pillow-11.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b9c17fd4ace828b3003dfd1e30bff24863e0eb59b535e8f80194d9cc7ecf860"}, {file = "pillow-11.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:65dc69160114cdd0ca0f35cb434633c75e8e7fad4cf855177a05bf38678f73ad"}, @@ -1798,6 +2096,116 @@ tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "ole typing = ["typing-extensions ; python_version < \"3.10\""] xmp = ["defusedxml"] +[[package]] +name = "pillow" +version = "12.1.0" +description = "Python Imaging Library (fork)" +optional = false +python-versions = ">=3.10" +groups = ["main"] +markers = "python_version >= \"3.11\"" +files = [ + {file = "pillow-12.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:fb125d860738a09d363a88daa0f59c4533529a90e564785e20fe875b200b6dbd"}, + {file = "pillow-12.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cad302dc10fac357d3467a74a9561c90609768a6f73a1923b0fd851b6486f8b0"}, + {file = "pillow-12.1.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a40905599d8079e09f25027423aed94f2823adaf2868940de991e53a449e14a8"}, + {file = "pillow-12.1.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:92a7fe4225365c5e3a8e598982269c6d6698d3e783b3b1ae979e7819f9cd55c1"}, + {file = "pillow-12.1.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f10c98f49227ed8383d28174ee95155a675c4ed7f85e2e573b04414f7e371bda"}, + {file = "pillow-12.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8637e29d13f478bc4f153d8daa9ffb16455f0a6cb287da1b432fdad2bfbd66c7"}, + {file = "pillow-12.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:21e686a21078b0f9cb8c8a961d99e6a4ddb88e0fc5ea6e130172ddddc2e5221a"}, + {file = "pillow-12.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2415373395a831f53933c23ce051021e79c8cd7979822d8cc478547a3f4da8ef"}, + {file = "pillow-12.1.0-cp310-cp310-win32.whl", hash = "sha256:e75d3dba8fc1ddfec0cd752108f93b83b4f8d6ab40e524a95d35f016b9683b09"}, + {file = "pillow-12.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:64efdf00c09e31efd754448a383ea241f55a994fd079866b92d2bbff598aad91"}, + {file = "pillow-12.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:f188028b5af6b8fb2e9a76ac0f841a575bd1bd396e46ef0840d9b88a48fdbcea"}, + {file = "pillow-12.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:a83e0850cb8f5ac975291ebfc4170ba481f41a28065277f7f735c202cd8e0af3"}, + {file = "pillow-12.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b6e53e82ec2db0717eabb276aa56cf4e500c9a7cec2c2e189b55c24f65a3e8c0"}, + {file = "pillow-12.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:40a8e3b9e8773876d6e30daed22f016509e3987bab61b3b7fe309d7019a87451"}, + {file = "pillow-12.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:800429ac32c9b72909c671aaf17ecd13110f823ddb7db4dfef412a5587c2c24e"}, + {file = "pillow-12.1.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b022eaaf709541b391ee069f0022ee5b36c709df71986e3f7be312e46f42c84"}, + {file = "pillow-12.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f345e7bc9d7f368887c712aa5054558bad44d2a301ddf9248599f4161abc7c0"}, + {file = "pillow-12.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d70347c8a5b7ccd803ec0c85c8709f036e6348f1e6a5bf048ecd9c64d3550b8b"}, + {file = "pillow-12.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1fcc52d86ce7a34fd17cb04e87cfdb164648a3662a6f20565910a99653d66c18"}, + {file = "pillow-12.1.0-cp311-cp311-win32.whl", hash = "sha256:3ffaa2f0659e2f740473bcf03c702c39a8d4b2b7ffc629052028764324842c64"}, + {file = "pillow-12.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:806f3987ffe10e867bab0ddad45df1148a2b98221798457fa097ad85d6e8bc75"}, + {file = "pillow-12.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:9f5fefaca968e700ad1a4a9de98bf0869a94e397fe3524c4c9450c1445252304"}, + {file = "pillow-12.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a332ac4ccb84b6dde65dbace8431f3af08874bf9770719d32a635c4ef411b18b"}, + {file = "pillow-12.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:907bfa8a9cb790748a9aa4513e37c88c59660da3bcfffbd24a7d9e6abf224551"}, + {file = "pillow-12.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:efdc140e7b63b8f739d09a99033aa430accce485ff78e6d311973a67b6bf3208"}, + {file = "pillow-12.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bef9768cab184e7ae6e559c032e95ba8d07b3023c289f79a2bd36e8bf85605a5"}, + {file = "pillow-12.1.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:742aea052cf5ab5034a53c3846165bc3ce88d7c38e954120db0ab867ca242661"}, + {file = "pillow-12.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a6dfc2af5b082b635af6e08e0d1f9f1c4e04d17d4e2ca0ef96131e85eda6eb17"}, + {file = "pillow-12.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:609e89d9f90b581c8d16358c9087df76024cf058fa693dd3e1e1620823f39670"}, + {file = "pillow-12.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:43b4899cfd091a9693a1278c4982f3e50f7fb7cff5153b05174b4afc9593b616"}, + {file = "pillow-12.1.0-cp312-cp312-win32.whl", hash = "sha256:aa0c9cc0b82b14766a99fbe6084409972266e82f459821cd26997a488a7261a7"}, + {file = "pillow-12.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:d70534cea9e7966169ad29a903b99fc507e932069a881d0965a1a84bb57f6c6d"}, + {file = "pillow-12.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:65b80c1ee7e14a87d6a068dd3b0aea268ffcabfe0498d38661b00c5b4b22e74c"}, + {file = "pillow-12.1.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:7b5dd7cbae20285cdb597b10eb5a2c13aa9de6cde9bb64a3c1317427b1db1ae1"}, + {file = "pillow-12.1.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:29a4cef9cb672363926f0470afc516dbf7305a14d8c54f7abbb5c199cd8f8179"}, + {file = "pillow-12.1.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:681088909d7e8fa9e31b9799aaa59ba5234c58e5e4f1951b4c4d1082a2e980e0"}, + {file = "pillow-12.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:983976c2ab753166dc66d36af6e8ec15bb511e4a25856e2227e5f7e00a160587"}, + {file = "pillow-12.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:db44d5c160a90df2d24a24760bbd37607d53da0b34fb546c4c232af7192298ac"}, + {file = "pillow-12.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6b7a9d1db5dad90e2991645874f708e87d9a3c370c243c2d7684d28f7e133e6b"}, + {file = "pillow-12.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6258f3260986990ba2fa8a874f8b6e808cf5abb51a94015ca3dc3c68aa4f30ea"}, + {file = "pillow-12.1.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e115c15e3bc727b1ca3e641a909f77f8ca72a64fff150f666fcc85e57701c26c"}, + {file = "pillow-12.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6741e6f3074a35e47c77b23a4e4f2d90db3ed905cb1c5e6e0d49bff2045632bc"}, + {file = "pillow-12.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:935b9d1aed48fcfb3f838caac506f38e29621b44ccc4f8a64d575cb1b2a88644"}, + {file = "pillow-12.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5fee4c04aad8932da9f8f710af2c1a15a83582cfb884152a9caa79d4efcdbf9c"}, + {file = "pillow-12.1.0-cp313-cp313-win32.whl", hash = "sha256:a786bf667724d84aa29b5db1c61b7bfdde380202aaca12c3461afd6b71743171"}, + {file = "pillow-12.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:461f9dfdafa394c59cd6d818bdfdbab4028b83b02caadaff0ffd433faf4c9a7a"}, + {file = "pillow-12.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:9212d6b86917a2300669511ed094a9406888362e085f2431a7da985a6b124f45"}, + {file = "pillow-12.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:00162e9ca6d22b7c3ee8e61faa3c3253cd19b6a37f126cad04f2f88b306f557d"}, + {file = "pillow-12.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7d6daa89a00b58c37cb1747ec9fb7ac3bc5ffd5949f5888657dfddde6d1312e0"}, + {file = "pillow-12.1.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e2479c7f02f9d505682dc47df8c0ea1fc5e264c4d1629a5d63fe3e2334b89554"}, + {file = "pillow-12.1.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f188d580bd870cda1e15183790d1cc2fa78f666e76077d103edf048eed9c356e"}, + {file = "pillow-12.1.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0fde7ec5538ab5095cc02df38ee99b0443ff0e1c847a045554cf5f9af1f4aa82"}, + {file = "pillow-12.1.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ed07dca4a8464bada6139ab38f5382f83e5f111698caf3191cb8dbf27d908b4"}, + {file = "pillow-12.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f45bd71d1fa5e5749587613037b172e0b3b23159d1c00ef2fc920da6f470e6f0"}, + {file = "pillow-12.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:277518bf4fe74aa91489e1b20577473b19ee70fb97c374aa50830b279f25841b"}, + {file = "pillow-12.1.0-cp313-cp313t-win32.whl", hash = "sha256:7315f9137087c4e0ee73a761b163fc9aa3b19f5f606a7fc08d83fd3e4379af65"}, + {file = "pillow-12.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:0ddedfaa8b5f0b4ffbc2fa87b556dc59f6bb4ecb14a53b33f9189713ae8053c0"}, + {file = "pillow-12.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:80941e6d573197a0c28f394753de529bb436b1ca990ed6e765cf42426abc39f8"}, + {file = "pillow-12.1.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:5cb7bc1966d031aec37ddb9dcf15c2da5b2e9f7cc3ca7c54473a20a927e1eb91"}, + {file = "pillow-12.1.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:97e9993d5ed946aba26baf9c1e8cf18adbab584b99f452ee72f7ee8acb882796"}, + {file = "pillow-12.1.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:414b9a78e14ffeb98128863314e62c3f24b8a86081066625700b7985b3f529bd"}, + {file = "pillow-12.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e6bdb408f7c9dd2a5ff2b14a3b0bb6d4deb29fb9961e6eb3ae2031ae9a5cec13"}, + {file = "pillow-12.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3413c2ae377550f5487991d444428f1a8ae92784aac79caa8b1e3b89b175f77e"}, + {file = "pillow-12.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e5dcbe95016e88437ecf33544ba5db21ef1b8dd6e1b434a2cb2a3d605299e643"}, + {file = "pillow-12.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d0a7735df32ccbcc98b98a1ac785cc4b19b580be1bdf0aeb5c03223220ea09d5"}, + {file = "pillow-12.1.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c27407a2d1b96774cbc4a7594129cc027339fd800cd081e44497722ea1179de"}, + {file = "pillow-12.1.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15c794d74303828eaa957ff8070846d0efe8c630901a1c753fdc63850e19ecd9"}, + {file = "pillow-12.1.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c990547452ee2800d8506c4150280757f88532f3de2a58e3022e9b179107862a"}, + {file = "pillow-12.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b63e13dd27da389ed9475b3d28510f0f954bca0041e8e551b2a4eb1eab56a39a"}, + {file = "pillow-12.1.0-cp314-cp314-win32.whl", hash = "sha256:1a949604f73eb07a8adab38c4fe50791f9919344398bdc8ac6b307f755fc7030"}, + {file = "pillow-12.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:4f9f6a650743f0ddee5593ac9e954ba1bdbc5e150bc066586d4f26127853ab94"}, + {file = "pillow-12.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:808b99604f7873c800c4840f55ff389936ef1948e4e87645eaf3fccbc8477ac4"}, + {file = "pillow-12.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:bc11908616c8a283cf7d664f77411a5ed2a02009b0097ff8abbba5e79128ccf2"}, + {file = "pillow-12.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:896866d2d436563fa2a43a9d72f417874f16b5545955c54a64941e87c1376c61"}, + {file = "pillow-12.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8e178e3e99d3c0ea8fc64b88447f7cac8ccf058af422a6cedc690d0eadd98c51"}, + {file = "pillow-12.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:079af2fb0c599c2ec144ba2c02766d1b55498e373b3ac64687e43849fbbef5bc"}, + {file = "pillow-12.1.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bdec5e43377761c5dbca620efb69a77f6855c5a379e32ac5b158f54c84212b14"}, + {file = "pillow-12.1.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:565c986f4b45c020f5421a4cea13ef294dde9509a8577f29b2fc5edc7587fff8"}, + {file = "pillow-12.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:43aca0a55ce1eefc0aefa6253661cb54571857b1a7b2964bd8a1e3ef4b729924"}, + {file = "pillow-12.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0deedf2ea233722476b3a81e8cdfbad786f7adbed5d848469fa59fe52396e4ef"}, + {file = "pillow-12.1.0-cp314-cp314t-win32.whl", hash = "sha256:b17fbdbe01c196e7e159aacb889e091f28e61020a8abeac07b68079b6e626988"}, + {file = "pillow-12.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27b9baecb428899db6c0de572d6d305cfaf38ca1596b5c0542a5182e3e74e8c6"}, + {file = "pillow-12.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:f61333d817698bdcdd0f9d7793e365ac3d2a21c1f1eb02b32ad6aefb8d8ea831"}, + {file = "pillow-12.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ca94b6aac0d7af2a10ba08c0f888b3d5114439b6b3ef39968378723622fed377"}, + {file = "pillow-12.1.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:351889afef0f485b84078ea40fe33727a0492b9af3904661b0abbafee0355b72"}, + {file = "pillow-12.1.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb0984b30e973f7e2884362b7d23d0a348c7143ee559f38ef3eaab640144204c"}, + {file = "pillow-12.1.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:84cabc7095dd535ca934d57e9ce2a72ffd216e435a84acb06b2277b1de2689bd"}, + {file = "pillow-12.1.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53d8b764726d3af1a138dd353116f774e3862ec7e3794e0c8781e30db0f35dfc"}, + {file = "pillow-12.1.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5da841d81b1a05ef940a8567da92decaa15bc4d7dedb540a8c219ad83d91808a"}, + {file = "pillow-12.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:75af0b4c229ac519b155028fa1be632d812a519abba9b46b20e50c6caa184f19"}, + {file = "pillow-12.1.0.tar.gz", hash = "sha256:5c5ae0a06e9ea030ab786b0251b32c7e4ce10e58d983c0d5c56029455180b5b9"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=8.2)", "sphinx-autobuild", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +test-arrow = ["arro3-compute", "arro3-core", "nanoarrow", "pyarrow"] +tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma (>=5)", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "trove-classifiers (>=2024.10.12)"] +xmp = ["defusedxml"] + [[package]] name = "platformdirs" version = "4.4.0" @@ -1805,6 +2213,7 @@ description = "A small Python package for determining appropriate platform-speci optional = false python-versions = ">=3.9" groups = ["main"] +markers = "python_version < \"3.11\"" files = [ {file = "platformdirs-4.4.0-py3-none-any.whl", hash = "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85"}, {file = "platformdirs-4.4.0.tar.gz", hash = "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf"}, @@ -1815,6 +2224,24 @@ docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.1.3)", "sphinx-a test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.4)", "pytest-cov (>=6)", "pytest-mock (>=3.14)"] type = ["mypy (>=1.14.1)"] +[[package]] +name = "platformdirs" +version = "4.5.1" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." +optional = false +python-versions = ">=3.10" +groups = ["main"] +markers = "python_version >= \"3.11\"" +files = [ + {file = "platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31"}, + {file = "platformdirs-4.5.1.tar.gz", hash = "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda"}, +] + +[package.extras] +docs = ["furo (>=2025.9.25)", "proselint (>=0.14)", "sphinx (>=8.2.3)", "sphinx-autodoc-typehints (>=3.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.4.2)", "pytest-cov (>=7)", "pytest-mock (>=3.15.1)"] +type = ["mypy (>=1.18.2)"] + [[package]] name = "pluggy" version = "1.6.0" @@ -1838,6 +2265,7 @@ description = "pyahocorasick is a fast and memory efficient library for exact or optional = false python-versions = ">=3.9" groups = ["main"] +markers = "python_version < \"3.11\"" files = [ {file = "pyahocorasick-2.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:779f1bb63644655d6001f5b1c5f864ec1284cf1b622ac24774f8444ab92f4f84"}, {file = "pyahocorasick-2.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6e9e082ffc2b240017357aeccaedc7aaccba530cb9e64945e23e999ef98b19c5"}, @@ -1870,6 +2298,46 @@ files = [ [package.extras] testing = ["pytest", "setuptools", "twine", "wheel"] +[[package]] +name = "pyahocorasick" +version = "2.3.0" +description = "pyahocorasick is a fast and memory efficient library for exact or approximate multi-pattern string search. With the ``ahocorasick.Automaton`` class, you can find multiple key string occurrences at once in some input text. You can use it as a plain dict-like Trie or convert a Trie to an automaton for efficient Aho-Corasick search. And pickle to disk for easy reuse of large automatons. Implemented in C and tested on Python 3.6+. Works on Linux, macOS and Windows. BSD-3-Cause license." +optional = false +python-versions = ">=3.10" +groups = ["main"] +markers = "python_version >= \"3.11\"" +files = [ + {file = "pyahocorasick-2.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d16b9ab607814968d047e26871653992240f0128ffc5d142922929afaea3bcdf"}, + {file = "pyahocorasick-2.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c1138b8f802e8f9aefd74c73314593a3e470cc5547fc4fe1d381426f31e2a264"}, + {file = "pyahocorasick-2.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cf22b22278c2352b9c2ace3d44842b9bfc2c220accbd744bbec3204b9d78f3c3"}, + {file = "pyahocorasick-2.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:668dae5f54a20ac94521c30290beadb6b941cda9aaed4ef939fd16a393c65871"}, + {file = "pyahocorasick-2.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:265e71e2635a7ddd2019a5d9f1815642c9e6d24081dcc6d728d9040d9702739f"}, + {file = "pyahocorasick-2.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3f15f8cd42e6d8164f5621e2acd768a58854740f1796a1649f91485505da4776"}, + {file = "pyahocorasick-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8a1cbd603d471e118a60f780f2b4d83a35975d71a1745419854e722dfa7fadfc"}, + {file = "pyahocorasick-2.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:41ec7f66d2fd5452d9d5e2f4ca919401981b0f52e7f1b0c2a9b7b30163ea86ea"}, + {file = "pyahocorasick-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2fb0b6fedec6558e7c8cd9397131325b03db72b2683b7abede3a37ae87150ae6"}, + {file = "pyahocorasick-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:0eae7c9fb67109649d653c20e163ae2ac33686ff266718c3bf12392cde8a42b6"}, + {file = "pyahocorasick-2.3.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7abfe09f6dca8656cc3d1122b25ea0caf272916c18a6e5a6a45ae74aa325a7fe"}, + {file = "pyahocorasick-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e7917f513aef244465e2e6a0ae1b5690e971dc336a7b15f68de2f03869d68302"}, + {file = "pyahocorasick-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dc9423ffaae542cfaeed516045576968a5ce6203a6f03d0034fcedbcabcb48cd"}, + {file = "pyahocorasick-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c0c42322518c99c49623a1784d27ae73a2765251955808e2edd64fd151e6fa57"}, + {file = "pyahocorasick-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:b417241fb8483a2b269502cdca5c69bd71579c11adb982663d61466936086fff"}, + {file = "pyahocorasick-2.3.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a0ed6066cc97e1277801f64f7633d85db4778801b3e775e0addf2e300e2e25bc"}, + {file = "pyahocorasick-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6623f2b395f2c32a5e65b780254eaca5ab8defa4f7819ebcdd68f1c98a761e25"}, + {file = "pyahocorasick-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28306dd19224b572f82d46d4831d6240770237e7188e9f9f3b267592f31af211"}, + {file = "pyahocorasick-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:05777c88934df56044927aef1239917d7bbfebe4460ff953924c9d177f574098"}, + {file = "pyahocorasick-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:52116146fea2331bc0714fef229648f05d8f2451f08d29389eb9833ebddcfc72"}, + {file = "pyahocorasick-2.3.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:d4cca977f05a18c926a1d0dca05916825dd8923100e47e44d0735d8a949cc9d4"}, + {file = "pyahocorasick-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cc53e4fe83fae539ceae2252e289fe0875db6aec12d07444368903e4dd074291"}, + {file = "pyahocorasick-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0326076ee2049822ca434529baf2c0b0d31886892d4ebfcfa5f0f64d307c6f0"}, + {file = "pyahocorasick-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9dee08a895eaa39712b65d2efe88b8aa642e07c1bd621a8f9056beb7001f1539"}, + {file = "pyahocorasick-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:0c6d9379ddf58cad4abd661795b4b975ba9b542227e78de6ded80757c3ac599d"}, + {file = "pyahocorasick-2.3.0.tar.gz", hash = "sha256:2960f5838bbcca4d7765c40478ec56f938e3f161946ff84f00c06d2b3a0ba9dd"}, +] + +[package.extras] +testing = ["pytest", "setuptools", "twine", "wheel"] + [[package]] name = "pyoxigraph" version = "0.3.22" @@ -1919,14 +2387,14 @@ files = [ [[package]] name = "pyparsing" -version = "3.2.5" +version = "3.3.2" description = "pyparsing - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "pyparsing-3.2.5-py3-none-any.whl", hash = "sha256:e38a4f02064cf41fe6593d328d0512495ad1f3d8a91c4f73fc401b3079a59a5e"}, - {file = "pyparsing-3.2.5.tar.gz", hash = "sha256:2df8d5b7b2802ef88e8d016a2eb9c7aeaa923529cd251ed0fe4608275d4105b6"}, + {file = "pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d"}, + {file = "pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc"}, ] [package.extras] @@ -1989,7 +2457,7 @@ description = "Python for Window Extensions" optional = false python-versions = "*" groups = ["main"] -markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\"" +markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\" and python_version < \"3.11\"" files = [ {file = "pywin32-311-cp310-cp310-win32.whl", hash = "sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3"}, {file = "pywin32-311-cp310-cp310-win_amd64.whl", hash = "sha256:797c2772017851984b97180b0bebe4b620bb86328e8a884bb626156295a63b3b"}, @@ -2126,6 +2594,7 @@ description = "JSON Referencing + Python" optional = false python-versions = ">=3.9" groups = ["main"] +markers = "python_version < \"3.11\"" files = [ {file = "referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"}, {file = "referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa"}, @@ -2136,129 +2605,163 @@ attrs = ">=22.2.0" rpds-py = ">=0.7.0" typing-extensions = {version = ">=4.4.0", markers = "python_version < \"3.13\""} +[[package]] +name = "referencing" +version = "0.37.0" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.10" +groups = ["main"] +markers = "python_version >= \"3.11\"" +files = [ + {file = "referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231"}, + {file = "referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" +typing-extensions = {version = ">=4.4.0", markers = "python_version < \"3.13\""} + [[package]] name = "regex" -version = "2025.9.18" +version = "2026.1.15" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "regex-2025.9.18-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:12296202480c201c98a84aecc4d210592b2f55e200a1d193235c4db92b9f6788"}, - {file = "regex-2025.9.18-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:220381f1464a581f2ea988f2220cf2a67927adcef107d47d6897ba5a2f6d51a4"}, - {file = "regex-2025.9.18-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:87f681bfca84ebd265278b5daa1dcb57f4db315da3b5d044add7c30c10442e61"}, - {file = "regex-2025.9.18-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:34d674cbba70c9398074c8a1fcc1a79739d65d1105de2a3c695e2b05ea728251"}, - {file = "regex-2025.9.18-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:385c9b769655cb65ea40b6eea6ff763cbb6d69b3ffef0b0db8208e1833d4e746"}, - {file = "regex-2025.9.18-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8900b3208e022570ae34328712bef6696de0804c122933414014bae791437ab2"}, - {file = "regex-2025.9.18-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c204e93bf32cd7a77151d44b05eb36f469d0898e3fba141c026a26b79d9914a0"}, - {file = "regex-2025.9.18-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3acc471d1dd7e5ff82e6cacb3b286750decd949ecd4ae258696d04f019817ef8"}, - {file = "regex-2025.9.18-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6479d5555122433728760e5f29edb4c2b79655a8deb681a141beb5c8a025baea"}, - {file = "regex-2025.9.18-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:431bd2a8726b000eb6f12429c9b438a24062a535d06783a93d2bcbad3698f8a8"}, - {file = "regex-2025.9.18-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0cc3521060162d02bd36927e20690129200e5ac9d2c6d32b70368870b122db25"}, - {file = "regex-2025.9.18-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a021217b01be2d51632ce056d7a837d3fa37c543ede36e39d14063176a26ae29"}, - {file = "regex-2025.9.18-cp310-cp310-win32.whl", hash = "sha256:4a12a06c268a629cb67cc1d009b7bb0be43e289d00d5111f86a2efd3b1949444"}, - {file = "regex-2025.9.18-cp310-cp310-win_amd64.whl", hash = "sha256:47acd811589301298c49db2c56bde4f9308d6396da92daf99cba781fa74aa450"}, - {file = "regex-2025.9.18-cp310-cp310-win_arm64.whl", hash = "sha256:16bd2944e77522275e5ee36f867e19995bcaa533dcb516753a26726ac7285442"}, - {file = "regex-2025.9.18-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:51076980cd08cd13c88eb7365427ae27f0d94e7cebe9ceb2bb9ffdae8fc4d82a"}, - {file = "regex-2025.9.18-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:828446870bd7dee4e0cbeed767f07961aa07f0ea3129f38b3ccecebc9742e0b8"}, - {file = "regex-2025.9.18-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c28821d5637866479ec4cc23b8c990f5bc6dd24e5e4384ba4a11d38a526e1414"}, - {file = "regex-2025.9.18-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:726177ade8e481db669e76bf99de0b278783be8acd11cef71165327abd1f170a"}, - {file = "regex-2025.9.18-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f5cca697da89b9f8ea44115ce3130f6c54c22f541943ac8e9900461edc2b8bd4"}, - {file = "regex-2025.9.18-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:dfbde38f38004703c35666a1e1c088b778e35d55348da2b7b278914491698d6a"}, - {file = "regex-2025.9.18-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f2f422214a03fab16bfa495cfec72bee4aaa5731843b771860a471282f1bf74f"}, - {file = "regex-2025.9.18-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a295916890f4df0902e4286bc7223ee7f9e925daa6dcdec4192364255b70561a"}, - {file = "regex-2025.9.18-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:5db95ff632dbabc8c38c4e82bf545ab78d902e81160e6e455598014f0abe66b9"}, - {file = "regex-2025.9.18-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fb967eb441b0f15ae610b7069bdb760b929f267efbf522e814bbbfffdf125ce2"}, - {file = "regex-2025.9.18-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f04d2f20da4053d96c08f7fde6e1419b7ec9dbcee89c96e3d731fca77f411b95"}, - {file = "regex-2025.9.18-cp311-cp311-win32.whl", hash = "sha256:895197241fccf18c0cea7550c80e75f185b8bd55b6924fcae269a1a92c614a07"}, - {file = "regex-2025.9.18-cp311-cp311-win_amd64.whl", hash = "sha256:7e2b414deae99166e22c005e154a5513ac31493db178d8aec92b3269c9cce8c9"}, - {file = "regex-2025.9.18-cp311-cp311-win_arm64.whl", hash = "sha256:fb137ec7c5c54f34a25ff9b31f6b7b0c2757be80176435bf367111e3f71d72df"}, - {file = "regex-2025.9.18-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:436e1b31d7efd4dcd52091d076482031c611dde58bf9c46ca6d0a26e33053a7e"}, - {file = "regex-2025.9.18-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c190af81e5576b9c5fdc708f781a52ff20f8b96386c6e2e0557a78402b029f4a"}, - {file = "regex-2025.9.18-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e4121f1ce2b2b5eec4b397cc1b277686e577e658d8f5870b7eb2d726bd2300ab"}, - {file = "regex-2025.9.18-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:300e25dbbf8299d87205e821a201057f2ef9aa3deb29caa01cd2cac669e508d5"}, - {file = "regex-2025.9.18-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7b47fcf9f5316c0bdaf449e879407e1b9937a23c3b369135ca94ebc8d74b1742"}, - {file = "regex-2025.9.18-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:57a161bd3acaa4b513220b49949b07e252165e6b6dc910ee7617a37ff4f5b425"}, - {file = "regex-2025.9.18-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f130c3a7845ba42de42f380fff3c8aebe89a810747d91bcf56d40a069f15352"}, - {file = "regex-2025.9.18-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5f96fa342b6f54dcba928dd452e8d8cb9f0d63e711d1721cd765bb9f73bb048d"}, - {file = "regex-2025.9.18-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0f0d676522d68c207828dcd01fb6f214f63f238c283d9f01d85fc664c7c85b56"}, - {file = "regex-2025.9.18-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:40532bff8a1a0621e7903ae57fce88feb2e8a9a9116d341701302c9302aef06e"}, - {file = "regex-2025.9.18-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:039f11b618ce8d71a1c364fdee37da1012f5a3e79b1b2819a9f389cd82fd6282"}, - {file = "regex-2025.9.18-cp312-cp312-win32.whl", hash = "sha256:e1dd06f981eb226edf87c55d523131ade7285137fbde837c34dc9d1bf309f459"}, - {file = "regex-2025.9.18-cp312-cp312-win_amd64.whl", hash = "sha256:3d86b5247bf25fa3715e385aa9ff272c307e0636ce0c9595f64568b41f0a9c77"}, - {file = "regex-2025.9.18-cp312-cp312-win_arm64.whl", hash = "sha256:032720248cbeeae6444c269b78cb15664458b7bb9ed02401d3da59fe4d68c3a5"}, - {file = "regex-2025.9.18-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2a40f929cd907c7e8ac7566ac76225a77701a6221bca937bdb70d56cb61f57b2"}, - {file = "regex-2025.9.18-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c90471671c2cdf914e58b6af62420ea9ecd06d1554d7474d50133ff26ae88feb"}, - {file = "regex-2025.9.18-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a351aff9e07a2dabb5022ead6380cff17a4f10e4feb15f9100ee56c4d6d06af"}, - {file = "regex-2025.9.18-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bc4b8e9d16e20ddfe16430c23468a8707ccad3365b06d4536142e71823f3ca29"}, - {file = "regex-2025.9.18-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4b8cdbddf2db1c5e80338ba2daa3cfa3dec73a46fff2a7dda087c8efbf12d62f"}, - {file = "regex-2025.9.18-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a276937d9d75085b2c91fb48244349c6954f05ee97bba0963ce24a9d915b8b68"}, - {file = "regex-2025.9.18-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:92a8e375ccdc1256401c90e9dc02b8642894443d549ff5e25e36d7cf8a80c783"}, - {file = "regex-2025.9.18-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0dc6893b1f502d73037cf807a321cdc9be29ef3d6219f7970f842475873712ac"}, - {file = "regex-2025.9.18-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a61e85bfc63d232ac14b015af1261f826260c8deb19401c0597dbb87a864361e"}, - {file = "regex-2025.9.18-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:1ef86a9ebc53f379d921fb9a7e42b92059ad3ee800fcd9e0fe6181090e9f6c23"}, - {file = "regex-2025.9.18-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d3bc882119764ba3a119fbf2bd4f1b47bc56c1da5d42df4ed54ae1e8e66fdf8f"}, - {file = "regex-2025.9.18-cp313-cp313-win32.whl", hash = "sha256:3810a65675845c3bdfa58c3c7d88624356dd6ee2fc186628295e0969005f928d"}, - {file = "regex-2025.9.18-cp313-cp313-win_amd64.whl", hash = "sha256:16eaf74b3c4180ede88f620f299e474913ab6924d5c4b89b3833bc2345d83b3d"}, - {file = "regex-2025.9.18-cp313-cp313-win_arm64.whl", hash = "sha256:4dc98ba7dd66bd1261927a9f49bd5ee2bcb3660f7962f1ec02617280fc00f5eb"}, - {file = "regex-2025.9.18-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:fe5d50572bc885a0a799410a717c42b1a6b50e2f45872e2b40f4f288f9bce8a2"}, - {file = "regex-2025.9.18-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1b9d9a2d6cda6621551ca8cf7a06f103adf72831153f3c0d982386110870c4d3"}, - {file = "regex-2025.9.18-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:13202e4c4ac0ef9a317fff817674b293c8f7e8c68d3190377d8d8b749f566e12"}, - {file = "regex-2025.9.18-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:874ff523b0fecffb090f80ae53dc93538f8db954c8bb5505f05b7787ab3402a0"}, - {file = "regex-2025.9.18-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d13ab0490128f2bb45d596f754148cd750411afc97e813e4b3a61cf278a23bb6"}, - {file = "regex-2025.9.18-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:05440bc172bc4b4b37fb9667e796597419404dbba62e171e1f826d7d2a9ebcef"}, - {file = "regex-2025.9.18-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5514b8e4031fdfaa3d27e92c75719cbe7f379e28cacd939807289bce76d0e35a"}, - {file = "regex-2025.9.18-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:65d3c38c39efce73e0d9dc019697b39903ba25b1ad45ebbd730d2cf32741f40d"}, - {file = "regex-2025.9.18-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ae77e447ebc144d5a26d50055c6ddba1d6ad4a865a560ec7200b8b06bc529368"}, - {file = "regex-2025.9.18-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e3ef8cf53dc8df49d7e28a356cf824e3623764e9833348b655cfed4524ab8a90"}, - {file = "regex-2025.9.18-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9feb29817df349c976da9a0debf775c5c33fc1c8ad7b9f025825da99374770b7"}, - {file = "regex-2025.9.18-cp313-cp313t-win32.whl", hash = "sha256:168be0d2f9b9d13076940b1ed774f98595b4e3c7fc54584bba81b3cc4181742e"}, - {file = "regex-2025.9.18-cp313-cp313t-win_amd64.whl", hash = "sha256:d59ecf3bb549e491c8104fea7313f3563c7b048e01287db0a90485734a70a730"}, - {file = "regex-2025.9.18-cp313-cp313t-win_arm64.whl", hash = "sha256:dbef80defe9fb21310948a2595420b36c6d641d9bea4c991175829b2cc4bc06a"}, - {file = "regex-2025.9.18-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:c6db75b51acf277997f3adcd0ad89045d856190d13359f15ab5dda21581d9129"}, - {file = "regex-2025.9.18-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8f9698b6f6895d6db810e0bda5364f9ceb9e5b11328700a90cae573574f61eea"}, - {file = "regex-2025.9.18-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:29cd86aa7cb13a37d0f0d7c21d8d949fe402ffa0ea697e635afedd97ab4b69f1"}, - {file = "regex-2025.9.18-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7c9f285a071ee55cd9583ba24dde006e53e17780bb309baa8e4289cd472bcc47"}, - {file = "regex-2025.9.18-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5adf266f730431e3be9021d3e5b8d5ee65e563fec2883ea8093944d21863b379"}, - {file = "regex-2025.9.18-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1137cabc0f38807de79e28d3f6e3e3f2cc8cfb26bead754d02e6d1de5f679203"}, - {file = "regex-2025.9.18-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7cc9e5525cada99699ca9223cce2d52e88c52a3d2a0e842bd53de5497c604164"}, - {file = "regex-2025.9.18-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bbb9246568f72dce29bcd433517c2be22c7791784b223a810225af3b50d1aafb"}, - {file = "regex-2025.9.18-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:6a52219a93dd3d92c675383efff6ae18c982e2d7651c792b1e6d121055808743"}, - {file = "regex-2025.9.18-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:ae9b3840c5bd456780e3ddf2f737ab55a79b790f6409182012718a35c6d43282"}, - {file = "regex-2025.9.18-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d488c236ac497c46a5ac2005a952c1a0e22a07be9f10c3e735bc7d1209a34773"}, - {file = "regex-2025.9.18-cp314-cp314-win32.whl", hash = "sha256:0c3506682ea19beefe627a38872d8da65cc01ffa25ed3f2e422dffa1474f0788"}, - {file = "regex-2025.9.18-cp314-cp314-win_amd64.whl", hash = "sha256:57929d0f92bebb2d1a83af372cd0ffba2263f13f376e19b1e4fa32aec4efddc3"}, - {file = "regex-2025.9.18-cp314-cp314-win_arm64.whl", hash = "sha256:6a4b44df31d34fa51aa5c995d3aa3c999cec4d69b9bd414a8be51984d859f06d"}, - {file = "regex-2025.9.18-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:b176326bcd544b5e9b17d6943f807697c0cb7351f6cfb45bf5637c95ff7e6306"}, - {file = "regex-2025.9.18-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:0ffd9e230b826b15b369391bec167baed57c7ce39efc35835448618860995946"}, - {file = "regex-2025.9.18-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ec46332c41add73f2b57e2f5b642f991f6b15e50e9f86285e08ffe3a512ac39f"}, - {file = "regex-2025.9.18-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b80fa342ed1ea095168a3f116637bd1030d39c9ff38dc04e54ef7c521e01fc95"}, - {file = "regex-2025.9.18-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f4d97071c0ba40f0cf2a93ed76e660654c399a0a04ab7d85472239460f3da84b"}, - {file = "regex-2025.9.18-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0ac936537ad87cef9e0e66c5144484206c1354224ee811ab1519a32373e411f3"}, - {file = "regex-2025.9.18-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dec57f96d4def58c422d212d414efe28218d58537b5445cf0c33afb1b4768571"}, - {file = "regex-2025.9.18-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:48317233294648bf7cd068857f248e3a57222259a5304d32c7552e2284a1b2ad"}, - {file = "regex-2025.9.18-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:274687e62ea3cf54846a9b25fc48a04459de50af30a7bd0b61a9e38015983494"}, - {file = "regex-2025.9.18-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:a78722c86a3e7e6aadf9579e3b0ad78d955f2d1f1a8ca4f67d7ca258e8719d4b"}, - {file = "regex-2025.9.18-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:06104cd203cdef3ade989a1c45b6215bf42f8b9dd705ecc220c173233f7cba41"}, - {file = "regex-2025.9.18-cp314-cp314t-win32.whl", hash = "sha256:2e1eddc06eeaffd249c0adb6fafc19e2118e6308c60df9db27919e96b5656096"}, - {file = "regex-2025.9.18-cp314-cp314t-win_amd64.whl", hash = "sha256:8620d247fb8c0683ade51217b459cb4a1081c0405a3072235ba43a40d355c09a"}, - {file = "regex-2025.9.18-cp314-cp314t-win_arm64.whl", hash = "sha256:b7531a8ef61de2c647cdf68b3229b071e46ec326b3138b2180acb4275f470b01"}, - {file = "regex-2025.9.18-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3dbcfcaa18e9480669030d07371713c10b4f1a41f791ffa5cb1a99f24e777f40"}, - {file = "regex-2025.9.18-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1e85f73ef7095f0380208269055ae20524bfde3f27c5384126ddccf20382a638"}, - {file = "regex-2025.9.18-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9098e29b3ea4ffffeade423f6779665e2a4f8db64e699c0ed737ef0db6ba7b12"}, - {file = "regex-2025.9.18-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90b6b7a2d0f45b7ecaaee1aec6b362184d6596ba2092dd583ffba1b78dd0231c"}, - {file = "regex-2025.9.18-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c81b892af4a38286101502eae7aec69f7cd749a893d9987a92776954f3943408"}, - {file = "regex-2025.9.18-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3b524d010973f2e1929aeb635418d468d869a5f77b52084d9f74c272189c251d"}, - {file = "regex-2025.9.18-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6b498437c026a3d5d0be0020023ff76d70ae4d77118e92f6f26c9d0423452446"}, - {file = "regex-2025.9.18-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0716e4d6e58853d83f6563f3cf25c281ff46cf7107e5f11879e32cb0b59797d9"}, - {file = "regex-2025.9.18-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:065b6956749379d41db2625f880b637d4acc14c0a4de0d25d609a62850e96d36"}, - {file = "regex-2025.9.18-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:d4a691494439287c08ddb9b5793da605ee80299dd31e95fa3f323fac3c33d9d4"}, - {file = "regex-2025.9.18-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ef8d10cc0989565bcbe45fb4439f044594d5c2b8919d3d229ea2c4238f1d55b0"}, - {file = "regex-2025.9.18-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4baeb1b16735ac969a7eeecc216f1f8b7caf60431f38a2671ae601f716a32d25"}, - {file = "regex-2025.9.18-cp39-cp39-win32.whl", hash = "sha256:8e5f41ad24a1e0b5dfcf4c4e5d9f5bd54c895feb5708dd0c1d0d35693b24d478"}, - {file = "regex-2025.9.18-cp39-cp39-win_amd64.whl", hash = "sha256:50e8290707f2fb8e314ab3831e594da71e062f1d623b05266f8cfe4db4949afd"}, - {file = "regex-2025.9.18-cp39-cp39-win_arm64.whl", hash = "sha256:039a9d7195fd88c943d7c777d4941e8ef736731947becce773c31a1009cb3c35"}, - {file = "regex-2025.9.18.tar.gz", hash = "sha256:c5ba23274c61c6fef447ba6a39333297d0c247f53059dba0bca415cac511edc4"}, + {file = "regex-2026.1.15-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4e3dd93c8f9abe8aa4b6c652016da9a3afa190df5ad822907efe6b206c09896e"}, + {file = "regex-2026.1.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:97499ff7862e868b1977107873dd1a06e151467129159a6ffd07b66706ba3a9f"}, + {file = "regex-2026.1.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0bda75ebcac38d884240914c6c43d8ab5fb82e74cde6da94b43b17c411aa4c2b"}, + {file = "regex-2026.1.15-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7dcc02368585334f5bc81fc73a2a6a0bbade60e7d83da21cead622faf408f32c"}, + {file = "regex-2026.1.15-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:693b465171707bbe882a7a05de5e866f33c76aa449750bee94a8d90463533cc9"}, + {file = "regex-2026.1.15-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b0d190e6f013ea938623a58706d1469a62103fb2a241ce2873a9906e0386582c"}, + {file = "regex-2026.1.15-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ff818702440a5878a81886f127b80127f5d50563753a28211482867f8318106"}, + {file = "regex-2026.1.15-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f052d1be37ef35a54e394de66136e30fa1191fab64f71fc06ac7bc98c9a84618"}, + {file = "regex-2026.1.15-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6bfc31a37fd1592f0c4fc4bfc674b5c42e52efe45b4b7a6a14f334cca4bcebe4"}, + {file = "regex-2026.1.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3d6ce5ae80066b319ae3bc62fd55a557c9491baa5efd0d355f0de08c4ba54e79"}, + {file = "regex-2026.1.15-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1704d204bd42b6bb80167df0e4554f35c255b579ba99616def38f69e14a5ccb9"}, + {file = "regex-2026.1.15-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:e3174a5ed4171570dc8318afada56373aa9289eb6dc0d96cceb48e7358b0e220"}, + {file = "regex-2026.1.15-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:87adf5bd6d72e3e17c9cb59ac4096b1faaf84b7eb3037a5ffa61c4b4370f0f13"}, + {file = "regex-2026.1.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e85dc94595f4d766bd7d872a9de5ede1ca8d3063f3bdf1e2c725f5eb411159e3"}, + {file = "regex-2026.1.15-cp310-cp310-win32.whl", hash = "sha256:21ca32c28c30d5d65fc9886ff576fc9b59bbca08933e844fa2363e530f4c8218"}, + {file = "regex-2026.1.15-cp310-cp310-win_amd64.whl", hash = "sha256:3038a62fc7d6e5547b8915a3d927a0fbeef84cdbe0b1deb8c99bbd4a8961b52a"}, + {file = "regex-2026.1.15-cp310-cp310-win_arm64.whl", hash = "sha256:505831646c945e3e63552cc1b1b9b514f0e93232972a2d5bedbcc32f15bc82e3"}, + {file = "regex-2026.1.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ae6020fb311f68d753b7efa9d4b9a5d47a5d6466ea0d5e3b5a471a960ea6e4a"}, + {file = "regex-2026.1.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:eddf73f41225942c1f994914742afa53dc0d01a6e20fe14b878a1b1edc74151f"}, + {file = "regex-2026.1.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e8cd52557603f5c66a548f69421310886b28b7066853089e1a71ee710e1cdc1"}, + {file = "regex-2026.1.15-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5170907244b14303edc5978f522f16c974f32d3aa92109fabc2af52411c9433b"}, + {file = "regex-2026.1.15-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2748c1ec0663580b4510bd89941a31560b4b439a0b428b49472a3d9944d11cd8"}, + {file = "regex-2026.1.15-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2f2775843ca49360508d080eaa87f94fa248e2c946bbcd963bb3aae14f333413"}, + {file = "regex-2026.1.15-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9ea2604370efc9a174c1b5dcc81784fb040044232150f7f33756049edfc9026"}, + {file = "regex-2026.1.15-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0dcd31594264029b57bf16f37fd7248a70b3b764ed9e0839a8f271b2d22c0785"}, + {file = "regex-2026.1.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c08c1f3e34338256732bd6938747daa3c0d5b251e04b6e43b5813e94d503076e"}, + {file = "regex-2026.1.15-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e43a55f378df1e7a4fa3547c88d9a5a9b7113f653a66821bcea4718fe6c58763"}, + {file = "regex-2026.1.15-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:f82110ab962a541737bd0ce87978d4c658f06e7591ba899192e2712a517badbb"}, + {file = "regex-2026.1.15-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:27618391db7bdaf87ac6c92b31e8f0dfb83a9de0075855152b720140bda177a2"}, + {file = "regex-2026.1.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bfb0d6be01fbae8d6655c8ca21b3b72458606c4aec9bbc932db758d47aba6db1"}, + {file = "regex-2026.1.15-cp311-cp311-win32.whl", hash = "sha256:b10e42a6de0e32559a92f2f8dc908478cc0fa02838d7dbe764c44dca3fa13569"}, + {file = "regex-2026.1.15-cp311-cp311-win_amd64.whl", hash = "sha256:e9bf3f0bbdb56633c07d7116ae60a576f846efdd86a8848f8d62b749e1209ca7"}, + {file = "regex-2026.1.15-cp311-cp311-win_arm64.whl", hash = "sha256:41aef6f953283291c4e4e6850607bd71502be67779586a61472beacb315c97ec"}, + {file = "regex-2026.1.15-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4c8fcc5793dde01641a35905d6731ee1548f02b956815f8f1cab89e515a5bdf1"}, + {file = "regex-2026.1.15-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bfd876041a956e6a90ad7cdb3f6a630c07d491280bfeed4544053cd434901681"}, + {file = "regex-2026.1.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9250d087bc92b7d4899ccd5539a1b2334e44eee85d848c4c1aef8e221d3f8c8f"}, + {file = "regex-2026.1.15-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8a154cf6537ebbc110e24dabe53095e714245c272da9c1be05734bdad4a61aa"}, + {file = "regex-2026.1.15-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8050ba2e3ea1d8731a549e83c18d2f0999fbc99a5f6bd06b4c91449f55291804"}, + {file = "regex-2026.1.15-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf065240704cb8951cc04972cf107063917022511273e0969bdb34fc173456c"}, + {file = "regex-2026.1.15-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c32bef3e7aeee75746748643667668ef941d28b003bfc89994ecf09a10f7a1b5"}, + {file = "regex-2026.1.15-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d5eaa4a4c5b1906bd0d2508d68927f15b81821f85092e06f1a34a4254b0e1af3"}, + {file = "regex-2026.1.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:86c1077a3cc60d453d4084d5b9649065f3bf1184e22992bd322e1f081d3117fb"}, + {file = "regex-2026.1.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:2b091aefc05c78d286657cd4db95f2e6313375ff65dcf085e42e4c04d9c8d410"}, + {file = "regex-2026.1.15-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:57e7d17f59f9ebfa9667e6e5a1c0127b96b87cb9cede8335482451ed00788ba4"}, + {file = "regex-2026.1.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:c6c4dcdfff2c08509faa15d36ba7e5ef5fcfab25f1e8f85a0c8f45bc3a30725d"}, + {file = "regex-2026.1.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cf8ff04c642716a7f2048713ddc6278c5fd41faa3b9cab12607c7abecd012c22"}, + {file = "regex-2026.1.15-cp312-cp312-win32.whl", hash = "sha256:82345326b1d8d56afbe41d881fdf62f1926d7264b2fc1537f99ae5da9aad7913"}, + {file = "regex-2026.1.15-cp312-cp312-win_amd64.whl", hash = "sha256:4def140aa6156bc64ee9912383d4038f3fdd18fee03a6f222abd4de6357ce42a"}, + {file = "regex-2026.1.15-cp312-cp312-win_arm64.whl", hash = "sha256:c6c565d9a6e1a8d783c1948937ffc377dd5771e83bd56de8317c450a954d2056"}, + {file = "regex-2026.1.15-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e69d0deeb977ffe7ed3d2e4439360089f9c3f217ada608f0f88ebd67afb6385e"}, + {file = "regex-2026.1.15-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3601ffb5375de85a16f407854d11cca8fe3f5febbe3ac78fb2866bb220c74d10"}, + {file = "regex-2026.1.15-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4c5ef43b5c2d4114eb8ea424bb8c9cec01d5d17f242af88b2448f5ee81caadbc"}, + {file = "regex-2026.1.15-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:968c14d4f03e10b2fd960f1d5168c1f0ac969381d3c1fcc973bc45fb06346599"}, + {file = "regex-2026.1.15-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56a5595d0f892f214609c9f76b41b7428bed439d98dc961efafdd1354d42baae"}, + {file = "regex-2026.1.15-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf650f26087363434c4e560011f8e4e738f6f3e029b85d4904c50135b86cfa5"}, + {file = "regex-2026.1.15-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18388a62989c72ac24de75f1449d0fb0b04dfccd0a1a7c1c43af5eb503d890f6"}, + {file = "regex-2026.1.15-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6d220a2517f5893f55daac983bfa9fe998a7dbcaee4f5d27a88500f8b7873788"}, + {file = "regex-2026.1.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c9c08c2fbc6120e70abff5d7f28ffb4d969e14294fb2143b4b5c7d20e46d1714"}, + {file = "regex-2026.1.15-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7ef7d5d4bd49ec7364315167a4134a015f61e8266c6d446fc116a9ac4456e10d"}, + {file = "regex-2026.1.15-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:6e42844ad64194fa08d5ccb75fe6a459b9b08e6d7296bd704460168d58a388f3"}, + {file = "regex-2026.1.15-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:cfecdaa4b19f9ca534746eb3b55a5195d5c95b88cac32a205e981ec0a22b7d31"}, + {file = "regex-2026.1.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:08df9722d9b87834a3d701f3fca570b2be115654dbfd30179f30ab2f39d606d3"}, + {file = "regex-2026.1.15-cp313-cp313-win32.whl", hash = "sha256:d426616dae0967ca225ab12c22274eb816558f2f99ccb4a1d52ca92e8baf180f"}, + {file = "regex-2026.1.15-cp313-cp313-win_amd64.whl", hash = "sha256:febd38857b09867d3ed3f4f1af7d241c5c50362e25ef43034995b77a50df494e"}, + {file = "regex-2026.1.15-cp313-cp313-win_arm64.whl", hash = "sha256:8e32f7896f83774f91499d239e24cebfadbc07639c1494bb7213983842348337"}, + {file = "regex-2026.1.15-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ec94c04149b6a7b8120f9f44565722c7ae31b7a6d2275569d2eefa76b83da3be"}, + {file = "regex-2026.1.15-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:40c86d8046915bb9aeb15d3f3f15b6fd500b8ea4485b30e1bbc799dab3fe29f8"}, + {file = "regex-2026.1.15-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:726ea4e727aba21643205edad8f2187ec682d3305d790f73b7a51c7587b64bdd"}, + {file = "regex-2026.1.15-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1cb740d044aff31898804e7bf1181cc72c03d11dfd19932b9911ffc19a79070a"}, + {file = "regex-2026.1.15-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:05d75a668e9ea16f832390d22131fe1e8acc8389a694c8febc3e340b0f810b93"}, + {file = "regex-2026.1.15-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d991483606f3dbec93287b9f35596f41aa2e92b7c2ebbb935b63f409e243c9af"}, + {file = "regex-2026.1.15-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:194312a14819d3e44628a44ed6fea6898fdbecb0550089d84c403475138d0a09"}, + {file = "regex-2026.1.15-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fe2fda4110a3d0bc163c2e0664be44657431440722c5c5315c65155cab92f9e5"}, + {file = "regex-2026.1.15-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:124dc36c85d34ef2d9164da41a53c1c8c122cfb1f6e1ec377a1f27ee81deb794"}, + {file = "regex-2026.1.15-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:a1774cd1981cd212506a23a14dba7fdeaee259f5deba2df6229966d9911e767a"}, + {file = "regex-2026.1.15-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:b5f7d8d2867152cdb625e72a530d2ccb48a3d199159144cbdd63870882fb6f80"}, + {file = "regex-2026.1.15-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:492534a0ab925d1db998defc3c302dae3616a2fc3fe2e08db1472348f096ddf2"}, + {file = "regex-2026.1.15-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c661fc820cfb33e166bf2450d3dadbda47c8d8981898adb9b6fe24e5e582ba60"}, + {file = "regex-2026.1.15-cp313-cp313t-win32.whl", hash = "sha256:99ad739c3686085e614bf77a508e26954ff1b8f14da0e3765ff7abbf7799f952"}, + {file = "regex-2026.1.15-cp313-cp313t-win_amd64.whl", hash = "sha256:32655d17905e7ff8ba5c764c43cb124e34a9245e45b83c22e81041e1071aee10"}, + {file = "regex-2026.1.15-cp313-cp313t-win_arm64.whl", hash = "sha256:b2a13dd6a95e95a489ca242319d18fc02e07ceb28fa9ad146385194d95b3c829"}, + {file = "regex-2026.1.15-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:d920392a6b1f353f4aa54328c867fec3320fa50657e25f64abf17af054fc97ac"}, + {file = "regex-2026.1.15-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b5a28980a926fa810dbbed059547b02783952e2efd9c636412345232ddb87ff6"}, + {file = "regex-2026.1.15-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:621f73a07595d83f28952d7bd1e91e9d1ed7625fb7af0064d3516674ec93a2a2"}, + {file = "regex-2026.1.15-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d7d92495f47567a9b1669c51fc8d6d809821849063d168121ef801bbc213846"}, + {file = "regex-2026.1.15-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8dd16fba2758db7a3780a051f245539c4451ca20910f5a5e6ea1c08d06d4a76b"}, + {file = "regex-2026.1.15-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1e1808471fbe44c1a63e5f577a1d5f02fe5d66031dcbdf12f093ffc1305a858e"}, + {file = "regex-2026.1.15-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0751a26ad39d4f2ade8fe16c59b2bf5cb19eb3d2cd543e709e583d559bd9efde"}, + {file = "regex-2026.1.15-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0f0c7684c7f9ca241344ff95a1de964f257a5251968484270e91c25a755532c5"}, + {file = "regex-2026.1.15-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:74f45d170a21df41508cb67165456538425185baaf686281fa210d7e729abc34"}, + {file = "regex-2026.1.15-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f1862739a1ffb50615c0fde6bae6569b5efbe08d98e59ce009f68a336f64da75"}, + {file = "regex-2026.1.15-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:453078802f1b9e2b7303fb79222c054cb18e76f7bdc220f7530fdc85d319f99e"}, + {file = "regex-2026.1.15-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:a30a68e89e5a218b8b23a52292924c1f4b245cb0c68d1cce9aec9bbda6e2c160"}, + {file = "regex-2026.1.15-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9479cae874c81bf610d72b85bb681a94c95722c127b55445285fb0e2c82db8e1"}, + {file = "regex-2026.1.15-cp314-cp314-win32.whl", hash = "sha256:d639a750223132afbfb8f429c60d9d318aeba03281a5f1ab49f877456448dcf1"}, + {file = "regex-2026.1.15-cp314-cp314-win_amd64.whl", hash = "sha256:4161d87f85fa831e31469bfd82c186923070fc970b9de75339b68f0c75b51903"}, + {file = "regex-2026.1.15-cp314-cp314-win_arm64.whl", hash = "sha256:91c5036ebb62663a6b3999bdd2e559fd8456d17e2b485bf509784cd31a8b1705"}, + {file = "regex-2026.1.15-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:ee6854c9000a10938c79238de2379bea30c82e4925a371711af45387df35cab8"}, + {file = "regex-2026.1.15-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2c2b80399a422348ce5de4fe40c418d6299a0fa2803dd61dc0b1a2f28e280fcf"}, + {file = "regex-2026.1.15-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:dca3582bca82596609959ac39e12b7dad98385b4fefccb1151b937383cec547d"}, + {file = "regex-2026.1.15-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef71d476caa6692eea743ae5ea23cde3260677f70122c4d258ca952e5c2d4e84"}, + {file = "regex-2026.1.15-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c243da3436354f4af6c3058a3f81a97d47ea52c9bd874b52fd30274853a1d5df"}, + {file = "regex-2026.1.15-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8355ad842a7c7e9e5e55653eade3b7d1885ba86f124dd8ab1f722f9be6627434"}, + {file = "regex-2026.1.15-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f192a831d9575271a22d804ff1a5355355723f94f31d9eef25f0d45a152fdc1a"}, + {file = "regex-2026.1.15-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:166551807ec20d47ceaeec380081f843e88c8949780cd42c40f18d16168bed10"}, + {file = "regex-2026.1.15-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f9ca1cbdc0fbfe5e6e6f8221ef2309988db5bcede52443aeaee9a4ad555e0dac"}, + {file = "regex-2026.1.15-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b30bcbd1e1221783c721483953d9e4f3ab9c5d165aa709693d3f3946747b1aea"}, + {file = "regex-2026.1.15-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:2a8d7b50c34578d0d3bf7ad58cde9652b7d683691876f83aedc002862a35dc5e"}, + {file = "regex-2026.1.15-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9d787e3310c6a6425eb346be4ff2ccf6eece63017916fd77fe8328c57be83521"}, + {file = "regex-2026.1.15-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:619843841e220adca114118533a574a9cd183ed8a28b85627d2844c500a2b0db"}, + {file = "regex-2026.1.15-cp314-cp314t-win32.whl", hash = "sha256:e90b8db97f6f2c97eb045b51a6b2c5ed69cedd8392459e0642d4199b94fabd7e"}, + {file = "regex-2026.1.15-cp314-cp314t-win_amd64.whl", hash = "sha256:5ef19071f4ac9f0834793af85bd04a920b4407715624e40cb7a0631a11137cdf"}, + {file = "regex-2026.1.15-cp314-cp314t-win_arm64.whl", hash = "sha256:ca89c5e596fc05b015f27561b3793dc2fa0917ea0d7507eebb448efd35274a70"}, + {file = "regex-2026.1.15-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:55b4ea996a8e4458dd7b584a2f89863b1655dd3d17b88b46cbb9becc495a0ec5"}, + {file = "regex-2026.1.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7e1e28be779884189cdd57735e997f282b64fd7ccf6e2eef3e16e57d7a34a815"}, + {file = "regex-2026.1.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0057de9eaef45783ff69fa94ae9f0fd906d629d0bd4c3217048f46d1daa32e9b"}, + {file = "regex-2026.1.15-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc7cd0b2be0f0269283a45c0d8b2c35e149d1319dcb4a43c9c3689fa935c1ee6"}, + {file = "regex-2026.1.15-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8db052bbd981e1666f09e957f3790ed74080c2229007c1dd67afdbf0b469c48b"}, + {file = "regex-2026.1.15-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:343db82cb3712c31ddf720f097ef17c11dab2f67f7a3e7be976c4f82eba4e6df"}, + {file = "regex-2026.1.15-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:55e9d0118d97794367309635df398bdfd7c33b93e2fdfa0b239661cd74b4c14e"}, + {file = "regex-2026.1.15-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:008b185f235acd1e53787333e5690082e4f156c44c87d894f880056089e9bc7c"}, + {file = "regex-2026.1.15-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fd65af65e2aaf9474e468f9e571bd7b189e1df3a61caa59dcbabd0000e4ea839"}, + {file = "regex-2026.1.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f42e68301ff4afee63e365a5fc302b81bb8ba31af625a671d7acb19d10168a8c"}, + {file = "regex-2026.1.15-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:f7792f27d3ee6e0244ea4697d92b825f9a329ab5230a78c1a68bd274e64b5077"}, + {file = "regex-2026.1.15-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:dbaf3c3c37ef190439981648ccbf0c02ed99ae066087dd117fcb616d80b010a4"}, + {file = "regex-2026.1.15-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:adc97a9077c2696501443d8ad3fa1b4fc6d131fc8fd7dfefd1a723f89071cf0a"}, + {file = "regex-2026.1.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:069f56a7bf71d286a6ff932a9e6fb878f151c998ebb2519a9f6d1cee4bffdba3"}, + {file = "regex-2026.1.15-cp39-cp39-win32.whl", hash = "sha256:ea4e6b3566127fda5e007e90a8fd5a4169f0cf0619506ed426db647f19c8454a"}, + {file = "regex-2026.1.15-cp39-cp39-win_amd64.whl", hash = "sha256:cda1ed70d2b264952e88adaa52eea653a33a1b98ac907ae2f86508eb44f65cdc"}, + {file = "regex-2026.1.15-cp39-cp39-win_arm64.whl", hash = "sha256:b325d4714c3c48277bfea1accd94e193ad6ed42b4bad79ad64f3b8f8a31260a5"}, + {file = "regex-2026.1.15.tar.gz", hash = "sha256:164759aa25575cbc0651bef59a0b18353e54300d79ace8084c818ad8ac72b7d5"}, ] [[package]] @@ -2290,6 +2793,7 @@ description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.9" groups = ["main"] +markers = "python_version < \"3.11\"" files = [ {file = "rpds_py-0.27.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:68afeec26d42ab3b47e541b272166a0b4400313946871cba3ed3a4fc0cab1cef"}, {file = "rpds_py-0.27.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74e5b2f7bb6fa38b1b10546d27acbacf2a022a8b5543efb06cfebc72a59c85be"}, @@ -2448,20 +2952,146 @@ files = [ {file = "rpds_py-0.27.1.tar.gz", hash = "sha256:26a1c73171d10b7acccbded82bf6a586ab8203601e565badc74bbbf8bc5a10f8"}, ] +[[package]] +name = "rpds-py" +version = "0.30.0" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.10" +groups = ["main"] +markers = "python_version >= \"3.11\"" +files = [ + {file = "rpds_py-0.30.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:679ae98e00c0e8d68a7fda324e16b90fd5260945b45d3b824c892cec9eea3288"}, + {file = "rpds_py-0.30.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4cc2206b76b4f576934f0ed374b10d7ca5f457858b157ca52064bdfc26b9fc00"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389a2d49eded1896c3d48b0136ead37c48e221b391c052fba3f4055c367f60a6"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:32c8528634e1bf7121f3de08fa85b138f4e0dc47657866630611b03967f041d7"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f207f69853edd6f6700b86efb84999651baf3789e78a466431df1331608e5324"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67b02ec25ba7a9e8fa74c63b6ca44cf5707f2fbfadae3ee8e7494297d56aa9df"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0e95f6819a19965ff420f65578bacb0b00f251fefe2c8b23347c37174271f3"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:a452763cc5198f2f98898eb98f7569649fe5da666c2dc6b5ddb10fde5a574221"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0b65193a413ccc930671c55153a03ee57cecb49e6227204b04fae512eb657a7"}, + {file = "rpds_py-0.30.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:858738e9c32147f78b3ac24dc0edb6610000e56dc0f700fd5f651d0a0f0eb9ff"}, + {file = "rpds_py-0.30.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:da279aa314f00acbb803da1e76fa18666778e8a8f83484fba94526da5de2cba7"}, + {file = "rpds_py-0.30.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7c64d38fb49b6cdeda16ab49e35fe0da2e1e9b34bc38bd78386530f218b37139"}, + {file = "rpds_py-0.30.0-cp310-cp310-win32.whl", hash = "sha256:6de2a32a1665b93233cde140ff8b3467bdb9e2af2b91079f0333a0974d12d464"}, + {file = "rpds_py-0.30.0-cp310-cp310-win_amd64.whl", hash = "sha256:1726859cd0de969f88dc8673bdd954185b9104e05806be64bcd87badbe313169"}, + {file = "rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a2bffea6a4ca9f01b3f8e548302470306689684e61602aa3d141e34da06cf425"}, + {file = "rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:422c3cb9856d80b09d30d2eb255d0754b23e090034e1deb4083f8004bd0761e4"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07ae8a593e1c3c6b82ca3292efbe73c30b61332fd612e05abee07c79359f292f"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12f90dd7557b6bd57f40abe7747e81e0c0b119bef015ea7726e69fe550e394a4"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99b47d6ad9a6da00bec6aabe5a6279ecd3c06a329d4aa4771034a21e335c3a97"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33f559f3104504506a44bb666b93a33f5d33133765b0c216a5bf2f1e1503af89"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:946fe926af6e44f3697abbc305ea168c2c31d3e3ef1058cf68f379bf0335a78d"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:495aeca4b93d465efde585977365187149e75383ad2684f81519f504f5c13038"}, + {file = "rpds_py-0.30.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9a0ca5da0386dee0655b4ccdf46119df60e0f10da268d04fe7cc87886872ba7"}, + {file = "rpds_py-0.30.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8d6d1cc13664ec13c1b84241204ff3b12f9bb82464b8ad6e7a5d3486975c2eed"}, + {file = "rpds_py-0.30.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3896fa1be39912cf0757753826bc8bdc8ca331a28a7c4ae46b7a21280b06bb85"}, + {file = "rpds_py-0.30.0-cp311-cp311-win32.whl", hash = "sha256:55f66022632205940f1827effeff17c4fa7ae1953d2b74a8581baaefb7d16f8c"}, + {file = "rpds_py-0.30.0-cp311-cp311-win_amd64.whl", hash = "sha256:a51033ff701fca756439d641c0ad09a41d9242fa69121c7d8769604a0a629825"}, + {file = "rpds_py-0.30.0-cp311-cp311-win_arm64.whl", hash = "sha256:47b0ef6231c58f506ef0b74d44e330405caa8428e770fec25329ed2cb971a229"}, + {file = "rpds_py-0.30.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a161f20d9a43006833cd7068375a94d035714d73a172b681d8881820600abfad"}, + {file = "rpds_py-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6abc8880d9d036ecaafe709079969f56e876fcf107f7a8e9920ba6d5a3878d05"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca28829ae5f5d569bb62a79512c842a03a12576375d5ece7d2cadf8abe96ec28"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1010ed9524c73b94d15919ca4d41d8780980e1765babf85f9a2f90d247153dd"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8d1736cfb49381ba528cd5baa46f82fdc65c06e843dab24dd70b63d09121b3f"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d948b135c4693daff7bc2dcfc4ec57237a29bd37e60c2fabf5aff2bbacf3e2f1"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47f236970bccb2233267d89173d3ad2703cd36a0e2a6e92d0560d333871a3d23"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:2e6ecb5a5bcacf59c3f912155044479af1d0b6681280048b338b28e364aca1f6"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a8fa71a2e078c527c3e9dc9fc5a98c9db40bcc8a92b4e8858e36d329f8684b51"}, + {file = "rpds_py-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73c67f2db7bc334e518d097c6d1e6fed021bbc9b7d678d6cc433478365d1d5f5"}, + {file = "rpds_py-0.30.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5ba103fb455be00f3b1c2076c9d4264bfcb037c976167a6047ed82f23153f02e"}, + {file = "rpds_py-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee9c752c0364588353e627da8a7e808a66873672bcb5f52890c33fd965b394"}, + {file = "rpds_py-0.30.0-cp312-cp312-win32.whl", hash = "sha256:1ab5b83dbcf55acc8b08fc62b796ef672c457b17dbd7820a11d6c52c06839bdf"}, + {file = "rpds_py-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:a090322ca841abd453d43456ac34db46e8b05fd9b3b4ac0c78bcde8b089f959b"}, + {file = "rpds_py-0.30.0-cp312-cp312-win_arm64.whl", hash = "sha256:669b1805bd639dd2989b281be2cfd951c6121b65e729d9b843e9639ef1fd555e"}, + {file = "rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2"}, + {file = "rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a59119fc6e3f460315fe9d08149f8102aa322299deaa5cab5b40092345c2136"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76fec018282b4ead0364022e3c54b60bf368b9d926877957a8624b58419169b7"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bef75a5525db97318e8cd061542b5a79812d711ea03dbc1f6f8dbb0c5f0d2"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:9cf69cdda1f5968a30a359aba2f7f9aa648a9ce4b580d6826437f2b291cfc86e"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4796a717bf12b9da9d3ad002519a86063dcac8988b030e405704ef7d74d2d9d"}, + {file = "rpds_py-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7"}, + {file = "rpds_py-0.30.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba81a9203d07805435eb06f536d95a266c21e5b2dfbf6517748ca40c98d19e31"}, + {file = "rpds_py-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95"}, + {file = "rpds_py-0.30.0-cp313-cp313-win32.whl", hash = "sha256:b40fb160a2db369a194cb27943582b38f79fc4887291417685f3ad693c5a1d5d"}, + {file = "rpds_py-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15"}, + {file = "rpds_py-0.30.0-cp313-cp313-win_arm64.whl", hash = "sha256:d96c2086587c7c30d44f31f42eae4eac89b60dabbac18c7669be3700f13c3ce1"}, + {file = "rpds_py-0.30.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:eb0b93f2e5c2189ee831ee43f156ed34e2a89a78a66b98cadad955972548be5a"}, + {file = "rpds_py-0.30.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47f9a91efc418b54fb8190a6b4aa7813a23fb79c51f4bb84e418f5476c38b8db"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3587eb9b17f3789ad50824084fa6f81921bbf9a795826570bda82cb3ed91f2"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39c02563fc592411c2c61d26b6c5fe1e51eaa44a75aa2c8735ca88b0d9599daa"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:eb2c4071ab598733724c08221091e8d80e89064cd472819285a9ab0f24bcedb9"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bdfdb946967d816e6adf9a3d8201bfad269c67efe6cefd7093ef959683c8de0"}, + {file = "rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94"}, + {file = "rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:61046904275472a76c8c90c9ccee9013d70a6d0f73eecefd38c1ae7c39045a08"}, + {file = "rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27"}, + {file = "rpds_py-0.30.0-cp313-cp313t-win32.whl", hash = "sha256:3d4a69de7a3e50ffc214ae16d79d8fbb0922972da0356dcf4d0fdca2878559c6"}, + {file = "rpds_py-0.30.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f14fc5df50a716f7ece6a80b6c78bb35ea2ca47c499e422aa4463455dd96d56d"}, + {file = "rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0"}, + {file = "rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f251c812357a3fed308d684a5079ddfb9d933860fc6de89f2b7ab00da481e65f"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac98b175585ecf4c0348fd7b29c3864bda53b805c773cbf7bfdaffc8070c976f"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e62880792319dbeb7eb866547f2e35973289e7d5696c6e295476448f5b63c87"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e7fc54e0900ab35d041b0601431b0a0eb495f0851a0639b6ef90f7741b39a18"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b4dc1a6ff022ff85ecafef7979a2c6eb423430e05f1165d6688234e62ba99a07"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4559c972db3a360808309e06a74628b95eaccbf961c335c8fe0d590cf587456f"}, + {file = "rpds_py-0.30.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0ed177ed9bded28f8deb6ab40c183cd1192aa0de40c12f38be4d59cd33cb5c65"}, + {file = "rpds_py-0.30.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ad1fa8db769b76ea911cb4e10f049d80bf518c104f15b3edb2371cc65375c46f"}, + {file = "rpds_py-0.30.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:46e83c697b1f1c72b50e5ee5adb4353eef7406fb3f2043d64c33f20ad1c2fc53"}, + {file = "rpds_py-0.30.0-cp314-cp314-win32.whl", hash = "sha256:ee454b2a007d57363c2dfd5b6ca4a5d7e2c518938f8ed3b706e37e5d470801ed"}, + {file = "rpds_py-0.30.0-cp314-cp314-win_amd64.whl", hash = "sha256:95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950"}, + {file = "rpds_py-0.30.0-cp314-cp314-win_arm64.whl", hash = "sha256:613aa4771c99f03346e54c3f038e4cc574ac09a3ddfb0e8878487335e96dead6"}, + {file = "rpds_py-0.30.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7e6ecfcb62edfd632e56983964e6884851786443739dbfe3582947e87274f7cb"}, + {file = "rpds_py-0.30.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a1d0bc22a7cdc173fedebb73ef81e07faef93692b8c1ad3733b67e31e1b6e1b8"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d08f00679177226c4cb8c5265012eea897c8ca3b93f429e546600c971bcbae7"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5965af57d5848192c13534f90f9dd16464f3c37aaf166cc1da1cae1fd5a34898"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a4e86e34e9ab6b667c27f3211ca48f73dba7cd3d90f8d5b11be56e5dbc3fb4e"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d3e6b26f2c785d65cc25ef1e5267ccbe1b069c5c21b8cc724efee290554419"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:626a7433c34566535b6e56a1b39a7b17ba961e97ce3b80ec62e6f1312c025551"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:acd7eb3f4471577b9b5a41baf02a978e8bdeb08b4b355273994f8b87032000a8"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe5fa731a1fa8a0a56b0977413f8cacac1768dad38d16b3a296712709476fbd5"}, + {file = "rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:74a3243a411126362712ee1524dfc90c650a503502f135d54d1b352bd01f2404"}, + {file = "rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3e8eeb0544f2eb0d2581774be4c3410356eba189529a6b3e36bbbf9696175856"}, + {file = "rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dbd936cde57abfee19ab3213cf9c26be06d60750e60a8e4dd85d1ab12c8b1f40"}, + {file = "rpds_py-0.30.0-cp314-cp314t-win32.whl", hash = "sha256:dc824125c72246d924f7f796b4f63c1e9dc810c7d9e2355864b3c3a73d59ade0"}, + {file = "rpds_py-0.30.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27f4b0e92de5bfbc6f86e43959e6edd1425c33b5e69aab0984a72047f2bcf1e3"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c2262bdba0ad4fc6fb5545660673925c2d2a5d9e2e0fb603aad545427be0fc58"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ee6af14263f25eedc3bb918a3c04245106a42dfd4f5c2285ea6f997b1fc3f89a"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3adbb8179ce342d235c31ab8ec511e66c73faa27a47e076ccc92421add53e2bb"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:250fa00e9543ac9b97ac258bd37367ff5256666122c2d0f2bc97577c60a1818c"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9854cf4f488b3d57b9aaeb105f06d78e5529d3145b1e4a41750167e8c213c6d3"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:993914b8e560023bc0a8bf742c5f303551992dcb85e247b1e5c7f4a7d145bda5"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58edca431fb9b29950807e301826586e5bbf24163677732429770a697ffe6738"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:dea5b552272a944763b34394d04577cf0f9bd013207bc32323b5a89a53cf9c2f"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ba3af48635eb83d03f6c9735dfb21785303e73d22ad03d489e88adae6eab8877"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:dff13836529b921e22f15cb099751209a60009731a68519630a24d61f0b1b30a"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:1b151685b23929ab7beec71080a8889d4d6d9fa9a983d213f07121205d48e2c4"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac37f9f516c51e5753f27dfdef11a88330f04de2d564be3991384b2f3535d02e"}, + {file = "rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84"}, +] + [[package]] name = "ruamel-yaml" -version = "0.18.15" +version = "0.18.17" 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.8" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "ruamel.yaml-0.18.15-py3-none-any.whl", hash = "sha256:148f6488d698b7a5eded5ea793a025308b25eca97208181b6a026037f391f701"}, - {file = "ruamel.yaml-0.18.15.tar.gz", hash = "sha256:dbfca74b018c4c3fba0b9cc9ee33e53c371194a9000e694995e620490fd40700"}, + {file = "ruamel_yaml-0.18.17-py3-none-any.whl", hash = "sha256:9c8ba9eb3e793efdf924b60d521820869d5bf0cb9c6f1b82d82de8295e290b9d"}, + {file = "ruamel_yaml-0.18.17.tar.gz", hash = "sha256:9091cd6e2d93a3a4b157ddb8fabf348c3de7f1fb1381346d985b6b247dcd8d3c"}, ] [package.dependencies] -"ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.14\""} +"ruamel.yaml.clib" = {version = ">=0.2.15", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.15\""} [package.extras] docs = ["mercurial (>5.7)", "ryd"] @@ -2469,68 +3099,74 @@ jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] [[package]] name = "ruamel-yaml-clib" -version = "0.2.14" +version = "0.2.15" description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" optional = false python-versions = ">=3.9" groups = ["main"] markers = "platform_python_implementation == \"CPython\"" files = [ - {file = "ruamel.yaml.clib-0.2.14-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f8b2acb0ffdd2ce8208accbec2dca4a06937d556fdcaefd6473ba1b5daa7e3c4"}, - {file = "ruamel.yaml.clib-0.2.14-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:aef953f3b8bd0b50bd52a2e52fb54a6a2171a1889d8dea4a5959d46c6624c451"}, - {file = "ruamel.yaml.clib-0.2.14-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:a0ac90efbc7a77b0d796c03c8cc4e62fd710b3f1e4c32947713ef2ef52e09543"}, - {file = "ruamel.yaml.clib-0.2.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9bf6b699223afe6c7fe9f2ef76e0bfa6dd892c21e94ce8c957478987ade76cd8"}, - {file = "ruamel.yaml.clib-0.2.14-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d73a0187718f6eec5b2f729b0f98e4603f7bd9c48aa65d01227d1a5dcdfbe9e8"}, - {file = "ruamel.yaml.clib-0.2.14-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81f6d3b19bc703679a5705c6a16dabdc79823c71d791d73c65949be7f3012c02"}, - {file = "ruamel.yaml.clib-0.2.14-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b28caeaf3e670c08cb7e8de221266df8494c169bd6ed8875493fab45be9607a4"}, - {file = "ruamel.yaml.clib-0.2.14-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:94f3efb718f8f49b031f2071ec7a27dd20cbfe511b4dfd54ecee54c956da2b31"}, - {file = "ruamel.yaml.clib-0.2.14-cp310-cp310-win32.whl", hash = "sha256:27c070cf3888e90d992be75dd47292ff9aa17dafd36492812a6a304a1aedc182"}, - {file = "ruamel.yaml.clib-0.2.14-cp310-cp310-win_amd64.whl", hash = "sha256:4f4a150a737fccae13fb51234d41304ff2222e3b7d4c8e9428ed1a6ab48389b8"}, - {file = "ruamel.yaml.clib-0.2.14-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5bae1a073ca4244620425cd3d3aa9746bde590992b98ee8c7c8be8c597ca0d4e"}, - {file = "ruamel.yaml.clib-0.2.14-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:0a54e5e40a7a691a426c2703b09b0d61a14294d25cfacc00631aa6f9c964df0d"}, - {file = "ruamel.yaml.clib-0.2.14-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:10d9595b6a19778f3269399eff6bab642608e5966183abc2adbe558a42d4efc9"}, - {file = "ruamel.yaml.clib-0.2.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dba72975485f2b87b786075e18a6e5d07dc2b4d8973beb2732b9b2816f1bad70"}, - {file = "ruamel.yaml.clib-0.2.14-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:29757bdb7c142f9595cc1b62ec49a3d1c83fab9cef92db52b0ccebaad4eafb98"}, - {file = "ruamel.yaml.clib-0.2.14-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:557df28dbccf79b152fe2d1b935f6063d9cc431199ea2b0e84892f35c03bb0ee"}, - {file = "ruamel.yaml.clib-0.2.14-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:26a8de280ab0d22b6e3ec745b4a5a07151a0f74aad92dd76ab9c8d8d7087720d"}, - {file = "ruamel.yaml.clib-0.2.14-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e501c096aa3889133d674605ebd018471bc404a59cbc17da3c5924421c54d97c"}, - {file = "ruamel.yaml.clib-0.2.14-cp311-cp311-win32.whl", hash = "sha256:915748cfc25b8cfd81b14d00f4bfdb2ab227a30d6d43459034533f4d1c207a2a"}, - {file = "ruamel.yaml.clib-0.2.14-cp311-cp311-win_amd64.whl", hash = "sha256:4ccba93c1e5a40af45b2f08e4591969fa4697eae951c708f3f83dcbf9f6c6bb1"}, - {file = "ruamel.yaml.clib-0.2.14-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:6aeadc170090ff1889f0d2c3057557f9cd71f975f17535c26a5d37af98f19c27"}, - {file = "ruamel.yaml.clib-0.2.14-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:5e56ac47260c0eed992789fa0b8efe43404a9adb608608631a948cee4fc2b052"}, - {file = "ruamel.yaml.clib-0.2.14-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:a911aa73588d9a8b08d662b9484bc0567949529824a55d3885b77e8dd62a127a"}, - {file = "ruamel.yaml.clib-0.2.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a05ba88adf3d7189a974b2de7a9d56731548d35dc0a822ec3dc669caa7019b29"}, - {file = "ruamel.yaml.clib-0.2.14-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb04c5650de6668b853623eceadcdb1a9f2fee381f5d7b6bc842ee7c239eeec4"}, - {file = "ruamel.yaml.clib-0.2.14-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:df3ec9959241d07bc261f4983d25a1205ff37703faf42b474f15d54d88b4f8c9"}, - {file = "ruamel.yaml.clib-0.2.14-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fbc08c02e9b147a11dfcaa1ac8a83168b699863493e183f7c0c8b12850b7d259"}, - {file = "ruamel.yaml.clib-0.2.14-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c099cafc1834d3c5dac305865d04235f7c21c167c8dd31ebc3d6bbc357e2f023"}, - {file = "ruamel.yaml.clib-0.2.14-cp312-cp312-win32.whl", hash = "sha256:b5b0f7e294700b615a3bcf6d28b26e6da94e8eba63b079f4ec92e9ba6c0d6b54"}, - {file = "ruamel.yaml.clib-0.2.14-cp312-cp312-win_amd64.whl", hash = "sha256:a37f40a859b503304dd740686359fcf541d6fb3ff7fc10f539af7f7150917c68"}, - {file = "ruamel.yaml.clib-0.2.14-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7e4f9da7e7549946e02a6122dcad00b7c1168513acb1f8a726b1aaf504a99d32"}, - {file = "ruamel.yaml.clib-0.2.14-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:dd7546c851e59c06197a7c651335755e74aa383a835878ca86d2c650c07a2f85"}, - {file = "ruamel.yaml.clib-0.2.14-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:1c1acc3a0209ea9042cc3cfc0790edd2eddd431a2ec3f8283d081e4d5018571e"}, - {file = "ruamel.yaml.clib-0.2.14-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2070bf0ad1540d5c77a664de07ebcc45eebd1ddcab71a7a06f26936920692beb"}, - {file = "ruamel.yaml.clib-0.2.14-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd8fe07f49c170e09d76773fb86ad9135e0beee44f36e1576a201b0676d3d1d"}, - {file = "ruamel.yaml.clib-0.2.14-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ff86876889ea478b1381089e55cf9e345707b312beda4986f823e1d95e8c0f59"}, - {file = "ruamel.yaml.clib-0.2.14-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1f118b707eece8cf84ecbc3e3ec94d9db879d85ed608f95870d39b2d2efa5dca"}, - {file = "ruamel.yaml.clib-0.2.14-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b30110b29484adc597df6bd92a37b90e63a8c152ca8136aad100a02f8ba6d1b6"}, - {file = "ruamel.yaml.clib-0.2.14-cp313-cp313-win32.whl", hash = "sha256:f4e97a1cf0b7a30af9e1d9dad10a5671157b9acee790d9e26996391f49b965a2"}, - {file = "ruamel.yaml.clib-0.2.14-cp313-cp313-win_amd64.whl", hash = "sha256:090782b5fb9d98df96509eecdbcaffd037d47389a89492320280d52f91330d78"}, - {file = "ruamel.yaml.clib-0.2.14-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:7df6f6e9d0e33c7b1d435defb185095386c469109de723d514142632a7b9d07f"}, - {file = "ruamel.yaml.clib-0.2.14-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:70eda7703b8126f5e52fcf276e6c0f40b0d314674f896fc58c47b0aef2b9ae83"}, - {file = "ruamel.yaml.clib-0.2.14-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a0cb71ccc6ef9ce36eecb6272c81afdc2f565950cdcec33ae8e6cd8f7fc86f27"}, - {file = "ruamel.yaml.clib-0.2.14-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e7cb9ad1d525d40f7d87b6df7c0ff916a66bc52cb61b66ac1b2a16d0c1b07640"}, - {file = "ruamel.yaml.clib-0.2.14-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:18c041b28f3456ddef1f1951d4492dbebe0f8114157c1b3c981a4611c2020792"}, - {file = "ruamel.yaml.clib-0.2.14-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:d8354515ab62f95a07deaf7f845886cc50e2f345ceab240a3d2d09a9f7d77853"}, - {file = "ruamel.yaml.clib-0.2.14-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:275f938692013a3883edbd848edde6d9f26825d65c9a2eb1db8baa1adc96a05d"}, - {file = "ruamel.yaml.clib-0.2.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16a60d69f4057ad9a92f3444e2367c08490daed6428291aa16cefb445c29b0e9"}, - {file = "ruamel.yaml.clib-0.2.14-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ac5ff9425d8acb8f59ac5b96bcb7fd3d272dc92d96a7c730025928ffcc88a7a"}, - {file = "ruamel.yaml.clib-0.2.14-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e1d1735d97fd8a48473af048739379975651fab186f8a25a9f683534e6904179"}, - {file = "ruamel.yaml.clib-0.2.14-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:83bbd8354f6abb3fdfb922d1ed47ad8d1db3ea72b0523dac8d07cdacfe1c0fcf"}, - {file = "ruamel.yaml.clib-0.2.14-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:808c7190a0fe7ae7014c42f73897cf8e9ef14ff3aa533450e51b1e72ec5239ad"}, - {file = "ruamel.yaml.clib-0.2.14-cp39-cp39-win32.whl", hash = "sha256:6d5472f63a31b042aadf5ed28dd3ef0523da49ac17f0463e10fda9c4a2773352"}, - {file = "ruamel.yaml.clib-0.2.14-cp39-cp39-win_amd64.whl", hash = "sha256:8dd3c2cc49caa7a8d64b67146462aed6723a0495e44bf0aa0a2e94beaa8432f6"}, - {file = "ruamel.yaml.clib-0.2.14.tar.gz", hash = "sha256:803f5044b13602d58ea378576dd75aa759f52116a0232608e8fdada4da33752e"}, + {file = "ruamel_yaml_clib-0.2.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:88eea8baf72f0ccf232c22124d122a7f26e8a24110a0273d9bcddcb0f7e1fa03"}, + {file = "ruamel_yaml_clib-0.2.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9b6f7d74d094d1f3a4e157278da97752f16ee230080ae331fcc219056ca54f77"}, + {file = "ruamel_yaml_clib-0.2.15-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4be366220090d7c3424ac2b71c90d1044ea34fca8c0b88f250064fd06087e614"}, + {file = "ruamel_yaml_clib-0.2.15-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f66f600833af58bea694d5892453f2270695b92200280ee8c625ec5a477eed3"}, + {file = "ruamel_yaml_clib-0.2.15-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da3d6adadcf55a93c214d23941aef4abfd45652110aed6580e814152f385b862"}, + {file = "ruamel_yaml_clib-0.2.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e9fde97ecb7bb9c41261c2ce0da10323e9227555c674989f8d9eb7572fc2098d"}, + {file = "ruamel_yaml_clib-0.2.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:05c70f7f86be6f7bee53794d80050a28ae7e13e4a0087c1839dcdefd68eb36b6"}, + {file = "ruamel_yaml_clib-0.2.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6f1d38cbe622039d111b69e9ca945e7e3efebb30ba998867908773183357f3ed"}, + {file = "ruamel_yaml_clib-0.2.15-cp310-cp310-win32.whl", hash = "sha256:fe239bdfdae2302e93bd6e8264bd9b71290218fff7084a9db250b55caaccf43f"}, + {file = "ruamel_yaml_clib-0.2.15-cp310-cp310-win_amd64.whl", hash = "sha256:468858e5cbde0198337e6a2a78eda8c3fb148bdf4c6498eaf4bc9ba3f8e780bd"}, + {file = "ruamel_yaml_clib-0.2.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c583229f336682b7212a43d2fa32c30e643d3076178fb9f7a6a14dde85a2d8bd"}, + {file = "ruamel_yaml_clib-0.2.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56ea19c157ed8c74b6be51b5fa1c3aff6e289a041575f0556f66e5fb848bb137"}, + {file = "ruamel_yaml_clib-0.2.15-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5fea0932358e18293407feb921d4f4457db837b67ec1837f87074667449f9401"}, + {file = "ruamel_yaml_clib-0.2.15-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef71831bd61fbdb7aa0399d5c4da06bea37107ab5c79ff884cc07f2450910262"}, + {file = "ruamel_yaml_clib-0.2.15-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:617d35dc765715fa86f8c3ccdae1e4229055832c452d4ec20856136acc75053f"}, + {file = "ruamel_yaml_clib-0.2.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b45498cc81a4724a2d42273d6cfc243c0547ad7c6b87b4f774cb7bcc131c98d"}, + {file = "ruamel_yaml_clib-0.2.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:def5663361f6771b18646620fca12968aae730132e104688766cf8a3b1d65922"}, + {file = "ruamel_yaml_clib-0.2.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:014181cdec565c8745b7cbc4de3bf2cc8ced05183d986e6d1200168e5bb59490"}, + {file = "ruamel_yaml_clib-0.2.15-cp311-cp311-win32.whl", hash = "sha256:d290eda8f6ada19e1771b54e5706b8f9807e6bb08e873900d5ba114ced13e02c"}, + {file = "ruamel_yaml_clib-0.2.15-cp311-cp311-win_amd64.whl", hash = "sha256:bdc06ad71173b915167702f55d0f3f027fc61abd975bd308a0968c02db4a4c3e"}, + {file = "ruamel_yaml_clib-0.2.15-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cb15a2e2a90c8475df45c0949793af1ff413acfb0a716b8b94e488ea95ce7cff"}, + {file = "ruamel_yaml_clib-0.2.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:64da03cbe93c1e91af133f5bec37fd24d0d4ba2418eaf970d7166b0a26a148a2"}, + {file = "ruamel_yaml_clib-0.2.15-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f6d3655e95a80325b84c4e14c080b2470fe4f33b6846f288379ce36154993fb1"}, + {file = "ruamel_yaml_clib-0.2.15-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:71845d377c7a47afc6592aacfea738cc8a7e876d586dfba814501d8c53c1ba60"}, + {file = "ruamel_yaml_clib-0.2.15-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11e5499db1ccbc7f4b41f0565e4f799d863ea720e01d3e99fa0b7b5fcd7802c9"}, + {file = "ruamel_yaml_clib-0.2.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4b293a37dc97e2b1e8a1aec62792d1e52027087c8eea4fc7b5abd2bdafdd6642"}, + {file = "ruamel_yaml_clib-0.2.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:512571ad41bba04eac7268fe33f7f4742210ca26a81fe0c75357fa682636c690"}, + {file = "ruamel_yaml_clib-0.2.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e5e9f630c73a490b758bf14d859a39f375e6999aea5ddd2e2e9da89b9953486a"}, + {file = "ruamel_yaml_clib-0.2.15-cp312-cp312-win32.whl", hash = "sha256:f4421ab780c37210a07d138e56dd4b51f8642187cdfb433eb687fe8c11de0144"}, + {file = "ruamel_yaml_clib-0.2.15-cp312-cp312-win_amd64.whl", hash = "sha256:2b216904750889133d9222b7b873c199d48ecbb12912aca78970f84a5aa1a4bc"}, + {file = "ruamel_yaml_clib-0.2.15-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4dcec721fddbb62e60c2801ba08c87010bd6b700054a09998c4d09c08147b8fb"}, + {file = "ruamel_yaml_clib-0.2.15-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:65f48245279f9bb301d1276f9679b82e4c080a1ae25e679f682ac62446fac471"}, + {file = "ruamel_yaml_clib-0.2.15-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:46895c17ead5e22bea5e576f1db7e41cb273e8d062c04a6a49013d9f60996c25"}, + {file = "ruamel_yaml_clib-0.2.15-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3eb199178b08956e5be6288ee0b05b2fb0b5c1f309725ad25d9c6ea7e27f962a"}, + {file = "ruamel_yaml_clib-0.2.15-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d1032919280ebc04a80e4fb1e93f7a738129857eaec9448310e638c8bccefcf"}, + {file = "ruamel_yaml_clib-0.2.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ab0df0648d86a7ecbd9c632e8f8d6b21bb21b5fc9d9e095c796cacf32a728d2d"}, + {file = "ruamel_yaml_clib-0.2.15-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:331fb180858dd8534f0e61aa243b944f25e73a4dae9962bd44c46d1761126bbf"}, + {file = "ruamel_yaml_clib-0.2.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fd4c928ddf6bce586285daa6d90680b9c291cfd045fc40aad34e445d57b1bf51"}, + {file = "ruamel_yaml_clib-0.2.15-cp313-cp313-win32.whl", hash = "sha256:bf0846d629e160223805db9fe8cc7aec16aaa11a07310c50c8c7164efa440aec"}, + {file = "ruamel_yaml_clib-0.2.15-cp313-cp313-win_amd64.whl", hash = "sha256:45702dfbea1420ba3450bb3dd9a80b33f0badd57539c6aac09f42584303e0db6"}, + {file = "ruamel_yaml_clib-0.2.15-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:753faf20b3a5906faf1fc50e4ddb8c074cb9b251e00b14c18b28492f933ac8ef"}, + {file = "ruamel_yaml_clib-0.2.15-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:480894aee0b29752560a9de46c0e5f84a82602f2bc5c6cde8db9a345319acfdf"}, + {file = "ruamel_yaml_clib-0.2.15-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4d3b58ab2454b4747442ac76fab66739c72b1e2bb9bd173d7694b9f9dbc9c000"}, + {file = "ruamel_yaml_clib-0.2.15-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bfd309b316228acecfa30670c3887dcedf9b7a44ea39e2101e75d2654522acd4"}, + {file = "ruamel_yaml_clib-0.2.15-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2812ff359ec1f30129b62372e5f22a52936fac13d5d21e70373dbca5d64bb97c"}, + {file = "ruamel_yaml_clib-0.2.15-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7e74ea87307303ba91073b63e67f2c667e93f05a8c63079ee5b7a5c8d0d7b043"}, + {file = "ruamel_yaml_clib-0.2.15-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:713cd68af9dfbe0bb588e144a61aad8dcc00ef92a82d2e87183ca662d242f524"}, + {file = "ruamel_yaml_clib-0.2.15-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:542d77b72786a35563f97069b9379ce762944e67055bea293480f7734b2c7e5e"}, + {file = "ruamel_yaml_clib-0.2.15-cp314-cp314-win32.whl", hash = "sha256:424ead8cef3939d690c4b5c85ef5b52155a231ff8b252961b6516ed7cf05f6aa"}, + {file = "ruamel_yaml_clib-0.2.15-cp314-cp314-win_amd64.whl", hash = "sha256:ac9b8d5fa4bb7fd2917ab5027f60d4234345fd366fe39aa711d5dca090aa1467"}, + {file = "ruamel_yaml_clib-0.2.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:923816815974425fbb1f1bf57e85eca6e14d8adc313c66db21c094927ad01815"}, + {file = "ruamel_yaml_clib-0.2.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dcc7f3162d3711fd5d52e2267e44636e3e566d1e5675a5f0b30e98f2c4af7974"}, + {file = "ruamel_yaml_clib-0.2.15-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5d3c9210219cbc0f22706f19b154c9a798ff65a6beeafbf77fc9c057ec806f7d"}, + {file = "ruamel_yaml_clib-0.2.15-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bb7b728fd9f405aa00b4a0b17ba3f3b810d0ccc5f77f7373162e9b5f0ff75d5"}, + {file = "ruamel_yaml_clib-0.2.15-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3cb75a3c14f1d6c3c2a94631e362802f70e83e20d1f2b2ef3026c05b415c4900"}, + {file = "ruamel_yaml_clib-0.2.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:badd1d7283f3e5894779a6ea8944cc765138b96804496c91812b2829f70e18a7"}, + {file = "ruamel_yaml_clib-0.2.15-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0ba6604bbc3dfcef844631932d06a1a4dcac3fee904efccf582261948431628a"}, + {file = "ruamel_yaml_clib-0.2.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a8220fd4c6f98485e97aea65e1df76d4fed1678ede1fe1d0eed2957230d287c4"}, + {file = "ruamel_yaml_clib-0.2.15-cp39-cp39-win32.whl", hash = "sha256:04d21dc9c57d9608225da28285900762befbb0165ae48482c15d8d4989d4af14"}, + {file = "ruamel_yaml_clib-0.2.15-cp39-cp39-win_amd64.whl", hash = "sha256:27dc656e84396e6d687f97c6e65fb284d100483628f02d95464fd731743a4afe"}, + {file = "ruamel_yaml_clib-0.2.15.tar.gz", hash = "sha256:46e4cc8c43ef6a94885f72512094e482114a8a706d3c555a34ed4b0d20200600"}, ] [[package]] @@ -2588,6 +3224,7 @@ description = "Fundamental algorithms for scientific computing in Python" optional = false python-versions = ">=3.9" groups = ["main"] +markers = "python_version < \"3.11\"" files = [ {file = "scipy-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:20335853b85e9a49ff7572ab453794298bcf0354d8068c5f6775a0eabf350aca"}, {file = "scipy-1.13.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d605e9c23906d1994f55ace80e0125c587f96c020037ea6aa98d01b4bd2e222f"}, @@ -2624,6 +3261,86 @@ dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pyde doc = ["jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.12.0)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0)", "sphinx-design (>=0.4.0)"] test = ["array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +[[package]] +name = "scipy" +version = "1.17.0" +description = "Fundamental algorithms for scientific computing in Python" +optional = false +python-versions = ">=3.11" +groups = ["main"] +markers = "python_version >= \"3.11\"" +files = [ + {file = "scipy-1.17.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:2abd71643797bd8a106dff97894ff7869eeeb0af0f7a5ce02e4227c6a2e9d6fd"}, + {file = "scipy-1.17.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:ef28d815f4d2686503e5f4f00edc387ae58dfd7a2f42e348bb53359538f01558"}, + {file = "scipy-1.17.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:272a9f16d6bb4667e8b50d25d71eddcc2158a214df1b566319298de0939d2ab7"}, + {file = "scipy-1.17.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:7204fddcbec2fe6598f1c5fdf027e9f259106d05202a959a9f1aecf036adc9f6"}, + {file = "scipy-1.17.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fc02c37a5639ee67d8fb646ffded6d793c06c5622d36b35cfa8fe5ececb8f042"}, + {file = "scipy-1.17.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dac97a27520d66c12a34fd90a4fe65f43766c18c0d6e1c0a80f114d2260080e4"}, + {file = "scipy-1.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ebb7446a39b3ae0fe8f416a9a3fdc6fba3f11c634f680f16a239c5187bc487c0"}, + {file = "scipy-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:474da16199f6af66601a01546144922ce402cb17362e07d82f5a6cf8f963e449"}, + {file = "scipy-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:255c0da161bd7b32a6c898e7891509e8a9289f0b1c6c7d96142ee0d2b114c2ea"}, + {file = "scipy-1.17.0-cp311-cp311-win_arm64.whl", hash = "sha256:85b0ac3ad17fa3be50abd7e69d583d98792d7edc08367e01445a1e2076005379"}, + {file = "scipy-1.17.0-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:0d5018a57c24cb1dd828bcf51d7b10e65986d549f52ef5adb6b4d1ded3e32a57"}, + {file = "scipy-1.17.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:88c22af9e5d5a4f9e027e26772cc7b5922fab8bcc839edb3ae33de404feebd9e"}, + {file = "scipy-1.17.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:f3cd947f20fe17013d401b64e857c6b2da83cae567adbb75b9dcba865abc66d8"}, + {file = "scipy-1.17.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e8c0b331c2c1f531eb51f1b4fc9ba709521a712cce58f1aa627bc007421a5306"}, + {file = "scipy-1.17.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5194c445d0a1c7a6c1a4a4681b6b7c71baad98ff66d96b949097e7513c9d6742"}, + {file = "scipy-1.17.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9eeb9b5f5997f75507814ed9d298ab23f62cf79f5a3ef90031b1ee2506abdb5b"}, + {file = "scipy-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:40052543f7bbe921df4408f46003d6f01c6af109b9e2c8a66dd1cf6cf57f7d5d"}, + {file = "scipy-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0cf46c8013fec9d3694dc572f0b54100c28405d55d3e2cb15e2895b25057996e"}, + {file = "scipy-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:0937a0b0d8d593a198cededd4c439a0ea216a3f36653901ea1f3e4be949056f8"}, + {file = "scipy-1.17.0-cp312-cp312-win_arm64.whl", hash = "sha256:f603d8a5518c7426414d1d8f82e253e454471de682ce5e39c29adb0df1efb86b"}, + {file = "scipy-1.17.0-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:65ec32f3d32dfc48c72df4291345dae4f048749bc8d5203ee0a3f347f96c5ce6"}, + {file = "scipy-1.17.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:1f9586a58039d7229ce77b52f8472c972448cded5736eaf102d5658bbac4c269"}, + {file = "scipy-1.17.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:9fad7d3578c877d606b1150135c2639e9de9cecd3705caa37b66862977cc3e72"}, + {file = "scipy-1.17.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:423ca1f6584fc03936972b5f7c06961670dbba9f234e71676a7c7ccf938a0d61"}, + {file = "scipy-1.17.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fe508b5690e9eaaa9467fc047f833af58f1152ae51a0d0aed67aa5801f4dd7d6"}, + {file = "scipy-1.17.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6680f2dfd4f6182e7d6db161344537da644d1cf85cf293f015c60a17ecf08752"}, + {file = "scipy-1.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eec3842ec9ac9de5917899b277428886042a93db0b227ebbe3a333b64ec7643d"}, + {file = "scipy-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d7425fcafbc09a03731e1bc05581f5fad988e48c6a861f441b7ab729a49a55ea"}, + {file = "scipy-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:87b411e42b425b84777718cc41516b8a7e0795abfa8e8e1d573bf0ef014f0812"}, + {file = "scipy-1.17.0-cp313-cp313-win_arm64.whl", hash = "sha256:357ca001c6e37601066092e7c89cca2f1ce74e2a520ca78d063a6d2201101df2"}, + {file = "scipy-1.17.0-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:ec0827aa4d36cb79ff1b81de898e948a51ac0b9b1c43e4a372c0508c38c0f9a3"}, + {file = "scipy-1.17.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:819fc26862b4b3c73a60d486dbb919202f3d6d98c87cf20c223511429f2d1a97"}, + {file = "scipy-1.17.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:363ad4ae2853d88ebcde3ae6ec46ccca903ea9835ee8ba543f12f575e7b07e4e"}, + {file = "scipy-1.17.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:979c3a0ff8e5ba254d45d59ebd38cde48fce4f10b5125c680c7a4bfe177aab07"}, + {file = "scipy-1.17.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:130d12926ae34399d157de777472bf82e9061c60cc081372b3118edacafe1d00"}, + {file = "scipy-1.17.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e886000eb4919eae3a44f035e63f0fd8b651234117e8f6f29bad1cd26e7bc45"}, + {file = "scipy-1.17.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:13c4096ac6bc31d706018f06a49abe0485f96499deb82066b94d19b02f664209"}, + {file = "scipy-1.17.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cacbaddd91fcffde703934897c5cd2c7cb0371fac195d383f4e1f1c5d3f3bd04"}, + {file = "scipy-1.17.0-cp313-cp313t-win_amd64.whl", hash = "sha256:edce1a1cf66298cccdc48a1bdf8fb10a3bf58e8b58d6c3883dd1530e103f87c0"}, + {file = "scipy-1.17.0-cp313-cp313t-win_arm64.whl", hash = "sha256:30509da9dbec1c2ed8f168b8d8aa853bc6723fede1dbc23c7d43a56f5ab72a67"}, + {file = "scipy-1.17.0-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:c17514d11b78be8f7e6331b983a65a7f5ca1fd037b95e27b280921fe5606286a"}, + {file = "scipy-1.17.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:4e00562e519c09da34c31685f6acc3aa384d4d50604db0f245c14e1b4488bfa2"}, + {file = "scipy-1.17.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:f7df7941d71314e60a481e02d5ebcb3f0185b8d799c70d03d8258f6c80f3d467"}, + {file = "scipy-1.17.0-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:aabf057c632798832f071a8dde013c2e26284043934f53b00489f1773b33527e"}, + {file = "scipy-1.17.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a38c3337e00be6fd8a95b4ed66b5d988bac4ec888fd922c2ea9fe5fb1603dd67"}, + {file = "scipy-1.17.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00fb5f8ec8398ad90215008d8b6009c9db9fa924fd4c7d6be307c6f945f9cd73"}, + {file = "scipy-1.17.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f2a4942b0f5f7c23c7cd641a0ca1955e2ae83dedcff537e3a0259096635e186b"}, + {file = "scipy-1.17.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:dbf133ced83889583156566d2bdf7a07ff89228fe0c0cb727f777de92092ec6b"}, + {file = "scipy-1.17.0-cp314-cp314-win_amd64.whl", hash = "sha256:3625c631a7acd7cfd929e4e31d2582cf00f42fcf06011f59281271746d77e061"}, + {file = "scipy-1.17.0-cp314-cp314-win_arm64.whl", hash = "sha256:9244608d27eafe02b20558523ba57f15c689357c85bdcfe920b1828750aa26eb"}, + {file = "scipy-1.17.0-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:2b531f57e09c946f56ad0b4a3b2abee778789097871fc541e267d2eca081cff1"}, + {file = "scipy-1.17.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:13e861634a2c480bd237deb69333ac79ea1941b94568d4b0efa5db5e263d4fd1"}, + {file = "scipy-1.17.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:eb2651271135154aa24f6481cbae5cc8af1f0dd46e6533fb7b56aa9727b6a232"}, + {file = "scipy-1.17.0-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:c5e8647f60679790c2f5c76be17e2e9247dc6b98ad0d3b065861e082c56e078d"}, + {file = "scipy-1.17.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5fb10d17e649e1446410895639f3385fd2bf4c3c7dfc9bea937bddcbc3d7b9ba"}, + {file = "scipy-1.17.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8547e7c57f932e7354a2319fab613981cde910631979f74c9b542bb167a8b9db"}, + {file = "scipy-1.17.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:33af70d040e8af9d5e7a38b5ed3b772adddd281e3062ff23fec49e49681c38cf"}, + {file = "scipy-1.17.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb55bb97d00f8b7ab95cb64f873eb0bf54d9446264d9f3609130381233483f"}, + {file = "scipy-1.17.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1ff269abf702f6c7e67a4b7aad981d42871a11b9dd83c58d2d2ea624efbd1088"}, + {file = "scipy-1.17.0-cp314-cp314t-win_arm64.whl", hash = "sha256:031121914e295d9791319a1875444d55079885bbae5bdc9c5e0f2ee5f09d34ff"}, + {file = "scipy-1.17.0.tar.gz", hash = "sha256:2591060c8e648d8b96439e111ac41fd8342fdeff1876be2e19dea3fe8930454e"}, +] + +[package.dependencies] +numpy = ">=1.26.4,<2.7" + +[package.extras] +dev = ["click (<8.3.0)", "cython-lint (>=0.12.2)", "mypy (==1.10.0)", "pycodestyle", "ruff (>=0.12.0)", "spin", "types-psutil", "typing_extensions"] +doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.19.1)", "jupytext", "linkify-it-py", "matplotlib (>=3.5)", "myst-nb (>=1.2.0)", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.2.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)", "tabulate"] +test = ["Cython", "array-api-strict (>=2.3.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest (>=8.0.0)", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + [[package]] name = "six" version = "1.17.0" @@ -2638,14 +3355,14 @@ files = [ [[package]] name = "soupsieve" -version = "2.8" +version = "2.8.3" description = "A modern CSS selector implementation for Beautiful Soup." optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "soupsieve-2.8-py3-none-any.whl", hash = "sha256:0cc76456a30e20f5d7f2e14a98a4ae2ee4e5abdc7c5ea0aafe795f344bc7984c"}, - {file = "soupsieve-2.8.tar.gz", hash = "sha256:e2dd4a40a628cb5f28f6d4b0db8800b8f581b65bb380b97de22ba5ca8d72572f"}, + {file = "soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95"}, + {file = "soupsieve-2.8.3.tar.gz", hash = "sha256:3267f1eeea4251fb42728b6dfb746edc9acaffc4a45b27e19450b676586e8349"}, ] [[package]] @@ -2693,56 +3410,71 @@ files = [ [[package]] name = "tomli" -version = "2.2.1" +version = "2.4.0" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {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"}, + {file = "tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867"}, + {file = "tomli-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9"}, + {file = "tomli-2.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:551e321c6ba03b55676970b47cb1b73f14a0a4dce6a3e1a9458fd6d921d72e95"}, + {file = "tomli-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76"}, + {file = "tomli-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b168f2731796b045128c45982d3a4874057626da0e2ef1fdd722848b741361d"}, + {file = "tomli-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:133e93646ec4300d651839d382d63edff11d8978be23da4cc106f5a18b7d0576"}, + {file = "tomli-2.4.0-cp311-cp311-win32.whl", hash = "sha256:b6c78bdf37764092d369722d9946cb65b8767bfa4110f902a1b2542d8d173c8a"}, + {file = "tomli-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:d3d1654e11d724760cdb37a3d7691f0be9db5fbdaef59c9f532aabf87006dbaa"}, + {file = "tomli-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:cae9c19ed12d4e8f3ebf46d1a75090e4c0dc16271c5bce1c833ac168f08fb614"}, + {file = "tomli-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:920b1de295e72887bafa3ad9f7a792f811847d57ea6b1215154030cf131f16b1"}, + {file = "tomli-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6d9a4aee98fac3eab4952ad1d73aee87359452d1c086b5ceb43ed02ddb16b8"}, + {file = "tomli-2.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36b9d05b51e65b254ea6c2585b59d2c4cb91c8a3d91d0ed0f17591a29aaea54a"}, + {file = "tomli-2.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c8a885b370751837c029ef9bc014f27d80840e48bac415f3412e6593bbc18c1"}, + {file = "tomli-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8768715ffc41f0008abe25d808c20c3d990f42b6e2e58305d5da280ae7d1fa3b"}, + {file = "tomli-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b438885858efd5be02a9a133caf5812b8776ee0c969fea02c45e8e3f296ba51"}, + {file = "tomli-2.4.0-cp312-cp312-win32.whl", hash = "sha256:0408e3de5ec77cc7f81960c362543cbbd91ef883e3138e81b729fc3eea5b9729"}, + {file = "tomli-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:685306e2cc7da35be4ee914fd34ab801a6acacb061b6a7abca922aaf9ad368da"}, + {file = "tomli-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:5aa48d7c2356055feef06a43611fc401a07337d5b006be13a30f6c58f869e3c3"}, + {file = "tomli-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84d081fbc252d1b6a982e1870660e7330fb8f90f676f6e78b052ad4e64714bf0"}, + {file = "tomli-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9a08144fa4cba33db5255f9b74f0b89888622109bd2776148f2597447f92a94e"}, + {file = "tomli-2.4.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c73add4bb52a206fd0c0723432db123c0c75c280cbd67174dd9d2db228ebb1b4"}, + {file = "tomli-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fb2945cbe303b1419e2706e711b7113da57b7db31ee378d08712d678a34e51e"}, + {file = "tomli-2.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bbb1b10aa643d973366dc2cb1ad94f99c1726a02343d43cbc011edbfac579e7c"}, + {file = "tomli-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4cbcb367d44a1f0c2be408758b43e1ffb5308abe0ea222897d6bfc8e8281ef2f"}, + {file = "tomli-2.4.0-cp313-cp313-win32.whl", hash = "sha256:7d49c66a7d5e56ac959cb6fc583aff0651094ec071ba9ad43df785abc2320d86"}, + {file = "tomli-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:3cf226acb51d8f1c394c1b310e0e0e61fecdd7adcb78d01e294ac297dd2e7f87"}, + {file = "tomli-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:d20b797a5c1ad80c516e41bc1fb0443ddb5006e9aaa7bda2d71978346aeb9132"}, + {file = "tomli-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:26ab906a1eb794cd4e103691daa23d95c6919cc2fa9160000ac02370cc9dd3f6"}, + {file = "tomli-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:20cedb4ee43278bc4f2fee6cb50daec836959aadaf948db5172e776dd3d993fc"}, + {file = "tomli-2.4.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:39b0b5d1b6dd03684b3fb276407ebed7090bbec989fa55838c98560c01113b66"}, + {file = "tomli-2.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a26d7ff68dfdb9f87a016ecfd1e1c2bacbe3108f4e0f8bcd2228ef9a766c787d"}, + {file = "tomli-2.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:20ffd184fb1df76a66e34bd1b36b4a4641bd2b82954befa32fe8163e79f1a702"}, + {file = "tomli-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75c2f8bbddf170e8effc98f5e9084a8751f8174ea6ccf4fca5398436e0320bc8"}, + {file = "tomli-2.4.0-cp314-cp314-win32.whl", hash = "sha256:31d556d079d72db7c584c0627ff3a24c5d3fb4f730221d3444f3efb1b2514776"}, + {file = "tomli-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:43e685b9b2341681907759cf3a04e14d7104b3580f808cfde1dfdb60ada85475"}, + {file = "tomli-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:3d895d56bd3f82ddd6faaff993c275efc2ff38e52322ea264122d72729dca2b2"}, + {file = "tomli-2.4.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:5b5807f3999fb66776dbce568cc9a828544244a8eb84b84b9bafc080c99597b9"}, + {file = "tomli-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c084ad935abe686bd9c898e62a02a19abfc9760b5a79bc29644463eaf2840cb0"}, + {file = "tomli-2.4.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f2e3955efea4d1cfbcb87bc321e00dc08d2bcb737fd1d5e398af111d86db5df"}, + {file = "tomli-2.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e0fe8a0b8312acf3a88077a0802565cb09ee34107813bba1c7cd591fa6cfc8d"}, + {file = "tomli-2.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:413540dce94673591859c4c6f794dfeaa845e98bf35d72ed59636f869ef9f86f"}, + {file = "tomli-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0dc56fef0e2c1c470aeac5b6ca8cc7b640bb93e92d9803ddaf9ea03e198f5b0b"}, + {file = "tomli-2.4.0-cp314-cp314t-win32.whl", hash = "sha256:d878f2a6707cc9d53a1be1414bbb419e629c3d6e67f69230217bb663e76b5087"}, + {file = "tomli-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2add28aacc7425117ff6364fe9e06a183bb0251b03f986df0e78e974047571fd"}, + {file = "tomli-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2b1e3b80e1d5e52e40e9b924ec43d81570f0e7d09d11081b797bc4692765a3d4"}, + {file = "tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a"}, + {file = "tomli-2.4.0.tar.gz", hash = "sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c"}, ] [[package]] name = "tqdm" -version = "4.67.1" +version = "4.67.2" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" groups = ["main"] files = [ - {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, - {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, + {file = "tqdm-4.67.2-py3-none-any.whl", hash = "sha256:9a12abcbbff58b6036b2167d9d3853042b9d436fe7330f06ae047867f2f8e0a7"}, + {file = "tqdm-4.67.2.tar.gz", hash = "sha256:649aac53964b2cb8dec76a14b405a4c0d13612cb8933aae547dd144eacc99653"}, ] [package.dependencies] @@ -2801,26 +3533,26 @@ files = [ [[package]] name = "tzdata" -version = "2025.2" +version = "2025.3" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" groups = ["main"] files = [ - {file = "tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8"}, - {file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"}, + {file = "tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1"}, + {file = "tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7"}, ] [[package]] name = "urllib3" -version = "2.6.0" +version = "2.6.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "urllib3-2.6.0-py3-none-any.whl", hash = "sha256:c90f7a39f716c572c4e3e58509581ebd83f9b59cced005b7db7ad2d22b0db99f"}, - {file = "urllib3-2.6.0.tar.gz", hash = "sha256:cb9bcef5a4b345d5da5d145dc3e30834f58e8018828cbc724d30b4cb7d4d49f1"}, + {file = "urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4"}, + {file = "urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed"}, ] [package.extras] From fc224f1ff59091a7dbffdbfb09ac69c46359eb57 Mon Sep 17 00:00:00 2001 From: Juanje Mendoza Date: Tue, 3 Feb 2026 10:47:45 +0100 Subject: [PATCH 03/27] messages about invalid token or warnings. Fixes #627 --- src/somef/process_repository.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/somef/process_repository.py b/src/somef/process_repository.py index 2258e008..ad687864 100644 --- a/src/somef/process_repository.py +++ b/src/somef/process_repository.py @@ -81,6 +81,12 @@ def rate_limit_get(*args, backoff_rate=2, initial_backoff=1, size_limit_mb=const stream=use_stream, **kwargs ) + # Detect invalid or insufficient GitHub token + if response.status_code == 401: + raise Exception("Invalid GitHub token. Run `somef configure` to set a valid token.") + if response.status_code == 403: + raise Exception("GitHub token lacks required permissions or scopes.") + date = response.headers.get("Date", "") # Show rate limit information if available if "X-RateLimit-Remaining" in response.headers: From 855513ddaed61fc8ce3d4a61c8e7841b40897f00 Mon Sep 17 00:00:00 2001 From: Juanje Mendoza Date: Thu, 5 Feb 2026 15:57:23 +0100 Subject: [PATCH 04/27] Pase codeowners. New flag additional info -ai. Fixes #723 --- README.md | 7 + docs/output.md | 1 + poetry.lock | 12 +- src/somef/__main__.py | 7 + src/somef/export/json_export.py | 53 +++++- src/somef/parser/codeowners_parser.py | 103 +++++++++++ src/somef/process_files.py | 28 ++- src/somef/process_repository.py | 27 ++- src/somef/somef_cli.py | 38 ++-- src/somef/test/test_JSON_export.py | 34 +++- src/somef/test/test_codemeta_export.py | 35 +++- .../repositories/tensorflow/CODEOWNERS | 18 ++ .../repositories/tensorflow/README.md | 173 ++++++++++++++++++ src/somef/utils/constants.py | 4 + 14 files changed, 491 insertions(+), 49 deletions(-) create mode 100644 src/somef/parser/codeowners_parser.py create mode 100644 src/somef/test/test_data/repositories/tensorflow/CODEOWNERS create mode 100644 src/somef/test/test_data/repositories/tensorflow/README.md diff --git a/README.md b/README.md index 893ac8db..90454f0e 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,7 @@ Given a readme file (or a GitHub/Gitlab repository) SOMEF will extract the follo - **Keywords**: set of terms used to commonly identify a software component - **License**: License and usage terms of a software component - **Logo**: Main logo used to represent the target software component +- **Maintainer**: Individuals or teams responsible for maintaining the software component, extracted from the CODEOWNERS file - **Name**: Name identifying a software component - **Ontologies**: URL and path to the ontology files present in the repository - **Owner**: Name and type of the user or organization in charge of the repository @@ -328,6 +329,12 @@ Options: -v, --requirements_v Export only requirements from structured sources (pom.xml, requirements.txt, etc.) + + -ai, --additional_info SOMEF will extract additional information + from certain files like CODEOWNERS. + This may require extra API + requests and increase execution time + -h, --help Show this message and exit. ``` diff --git a/docs/output.md b/docs/output.md index 7a048796..563ab03d 100644 --- a/docs/output.md +++ b/docs/output.md @@ -98,6 +98,7 @@ SOMEF aims to recognize the following categories (in alphabetical order): - `keywords`: set of terms used to commonly identify a software component - `license`: License and usage terms of a software component - `logo`: Main logo used to represent the target software component. +- `maintainer`': Individuals or teams responsible for maintaining the software component, extracted from the CODEOWNERS file - `name`: Name identifying a software component - `ontologies`: URL and path to the ontology files present in the repository. - `owner`: Name of the user or organization in charge of the repository diff --git a/poetry.lock b/poetry.lock index 0cf0bcdd..84a91f82 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1847,15 +1847,15 @@ files = [ [[package]] name = "nvidia-nccl-cu12" -version = "2.29.2" +version = "2.29.3" description = "NVIDIA Collective Communication Library (NCCL) Runtime" optional = false python-versions = ">=3" groups = ["main"] markers = "platform_system == \"Linux\" and platform_machine != \"aarch64\"" files = [ - {file = "nvidia_nccl_cu12-2.29.2-py3-none-manylinux_2_18_aarch64.whl", hash = "sha256:0712e55c067965c6093cc793a9bbcc5f37b5b47248e9ebf8ae3af06867757587"}, - {file = "nvidia_nccl_cu12-2.29.2-py3-none-manylinux_2_18_x86_64.whl", hash = "sha256:3a9a0bf4142126e0d0ed99ec202579bef8d007601f9fab75af60b10324666b12"}, + {file = "nvidia_nccl_cu12-2.29.3-py3-none-manylinux_2_18_aarch64.whl", hash = "sha256:6351b79dc7d2cc3d654ea1523616b9eeded71fe9c8da66b71eef9a5d1b2adad4"}, + {file = "nvidia_nccl_cu12-2.29.3-py3-none-manylinux_2_18_x86_64.whl", hash = "sha256:35ad42e7d5d722a83c36a3a478e281c20a5646383deaf1b9ed1a9ab7d61bed53"}, ] [[package]] @@ -3467,14 +3467,14 @@ files = [ [[package]] name = "tqdm" -version = "4.67.2" +version = "4.67.3" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" groups = ["main"] files = [ - {file = "tqdm-4.67.2-py3-none-any.whl", hash = "sha256:9a12abcbbff58b6036b2167d9d3853042b9d436fe7330f06ae047867f2f8e0a7"}, - {file = "tqdm-4.67.2.tar.gz", hash = "sha256:649aac53964b2cb8dec76a14b405a4c0d13612cb8933aae547dd144eacc99653"}, + {file = "tqdm-4.67.3-py3-none-any.whl", hash = "sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf"}, + {file = "tqdm-4.67.3.tar.gz", hash = "sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb"}, ] [package.dependencies] diff --git a/src/somef/__main__.py b/src/somef/__main__.py index b691c141..b318b5dd 100644 --- a/src/somef/__main__.py +++ b/src/somef/__main__.py @@ -177,6 +177,13 @@ def configure(auto, base_uri): default=False, help="Export only requirements from structured sources (pom.xml, requirements.txt, etc.)" ) +@click.option( + "--additional_info", + "-ai", + is_flag=True, + default=False, + help="""SOMEF will extract additional information from certain files like CODEOWNERS, etc.""" +) def describe(requirements_v, requirements_all, **kwargs): # import so missing packages get installed when appropriate if requirements_v: diff --git a/src/somef/export/json_export.py b/src/somef/export/json_export.py index 848ea608..bb97ecc6 100644 --- a/src/somef/export/json_export.py +++ b/src/somef/export/json_export.py @@ -297,15 +297,30 @@ def format_date(date_string): codemeta_output[constants.CAT_CODEMETA_BUILDINSTRUCTIONS] = install_links if constants.CAT_OWNER in repo_data: # if user then person, otherwise organization - type_aux = repo_data[constants.CAT_OWNER][0][constants.PROP_RESULT][constants.PROP_TYPE] - if type_aux == "User": - type_aux = "Person" - codemeta_output[constants.CAT_CODEMETA_AUTHOR] = [ - { - "@type": type_aux, - "@id": "https://github.com/" + author_name - } - ] + codemeta_authors = [] + for owner in repo_data[constants.CAT_OWNER]: + result_owner = owner.get("result", {}) + type_aux = repo_data[constants.CAT_OWNER][0][constants.PROP_RESULT][constants.PROP_TYPE] + if type_aux == "User": + type_aux = "Person" + + author_obj = { "@type": type_aux } + + if "name" in result_owner and result_owner["name"]: + author_obj["name"] = result_owner["name"] + if "value" in result_owner and result_owner["value"]: + author_obj["identifier"] = result_owner["value"] + author_obj["@id"] = "https://github.com/" + result_owner["value"] + if "affiliation" in result_owner and result_owner["affiliation"]: + author_obj["affiliation"] = result_owner["affiliation"] + if "email" in result_owner and result_owner["email"]: + author_obj["email"] = result_owner["email"] + + codemeta_authors.append(author_obj) + + if codemeta_authors: + codemeta_output[constants.CAT_CODEMETA_AUTHOR] = codemeta_authors + if constants.CAT_AUTHORS in repo_data: if "author" not in codemeta_output: codemeta_output[constants.CAT_CODEMETA_AUTHOR] = [] @@ -516,7 +531,25 @@ def format_date(date_string): # codemeta_output["identifier"] = repo_data[constants.CAT_IDENTIFIER][0][constants.PROP_RESULT][constants.PROP_VALUE] if constants.CAT_README_URL in repo_data: codemeta_output[constants.CAT_CODEMETA_README] = repo_data[constants.CAT_README_URL][0][constants.PROP_RESULT][constants.PROP_VALUE] - + + if constants.CAT_MAINTAINER in repo_data: + codemeta_maintainers = [] + for maintainer in repo_data[constants.CAT_MAINTAINER]: + result_maint = maintainer.get("result", {}) + maint_obj = { "@type": result_maint.get("type", "Person") } + + if "name" in result_maint and result_maint["name"]: + maint_obj["name"] = result_maint["name"] + if "username" in result_maint and result_maint["username"]: + maint_obj["identifier"] = result_maint["username"] + if "email" in result_maint and result_maint["email"]: + maint_obj["email"] = result_maint["email"] + + codemeta_maintainers.append(maint_obj) + + if codemeta_maintainers: + codemeta_output[constants.CAT_CODEMETA_MAINTAINER] = codemeta_maintainers + if constants.CAT_RUNTIME_PLATFORM in repo_data: runtimes = [] diff --git a/src/somef/parser/codeowners_parser.py b/src/somef/parser/codeowners_parser.py new file mode 100644 index 00000000..108478a4 --- /dev/null +++ b/src/somef/parser/codeowners_parser.py @@ -0,0 +1,103 @@ +import json +import logging +import os +import requests +from pathlib import Path +from ..process_results import Result +from ..utils import constants + +def parse_codeowners_structured(dir_path, filename): + codeowners = [] + + with open(os.path.join(dir_path, filename), "r", encoding="utf-8") as file: + for line in file: + line = line.strip() + if line and not line.startswith("#"): + parts = line.split() + path = parts[0] + owners = [o.lstrip("@") for o in parts[1:]] + codeowners.append({"path": path, "owners": owners}) + + return {"codeowners": codeowners} + + +def parse_codeowners_file(file_path, metadata_result: Result, source, additional_info=None) -> Result: + try: + print(f"Additional info flag: {additional_info}") + if Path(file_path).name.upper() == constants.CODEOWNERS_FILE: + owners = parse_codeowners_structured( + os.path.dirname(file_path), + Path(file_path).name + ) + + metadata_result.add_result( + constants.CAT_HAS_PACKAGE_FILE, + { + "value": source, + "type": constants.URL, + }, + 1, + constants.TECHNIQUE_CODE_CONFIG_PARSER, + source + ) + + added_maintainers = set() + for entry in owners["codeowners"]: + for owner in entry["owners"]: + # print(f"Adding maintainer: {owner}") + + if owner in added_maintainers: + continue + + added_maintainers.add(owner) + + maintainer_data = { + "value": owner, + "username": owner, + "role": "Maintainer", + "type": "Person" + } + + if additional_info: + user_info = enrich_github_user(owner) + if user_info: + if user_info.get("name"): + maintainer_data["name"] = user_info.get("name") + if user_info.get("company"): + maintainer_data["affiliation"] = user_info.get("company") + if user_info.get("email"): + maintainer_data["email"] = user_info.get("email") + + metadata_result.add_result( + constants.CAT_MAINTAINER, + maintainer_data, + 1, + constants.TECHNIQUE_CODE_CONFIG_PARSER, + source + ) + + + except Exception as e: + logging.error(f"Error parsing CODEOWNERS: {e}") + + return metadata_result + +def enrich_github_user(username): + try: + url = f"https://api.github.com/users/{username}" + response = requests.get(url, timeout=5) + + if response.status_code != 200: + return None + + data = response.json() + + return { + "name": data.get("name"), + "company": data.get("company"), + "email": data.get("email") + } + + except Exception: + return None + diff --git a/src/somef/process_files.py b/src/somef/process_files.py index c07ebddc..6cdd9b82 100644 --- a/src/somef/process_files.py +++ b/src/somef/process_files.py @@ -23,13 +23,14 @@ from .parser.cabal_parser import parse_cabal_file from .parser.dockerfile_parser import parse_dockerfile from .parser.publiccode_parser import parse_publiccode_file +from .parser.codeowners_parser import parse_codeowners_file from chardet import detect domain_gitlab = '' def process_repository_files(repo_dir, metadata_result: Result, repo_type, owner="", repo_name="", - repo_default_branch="", ignore_test_folder=True): + repo_default_branch="", ignore_test_folder=True, additional_info=False): """ Method that given a folder, it recognizes whether there are notebooks, dockerfiles, docs, script files or ontologies. @@ -225,6 +226,7 @@ def process_repository_files(repo_dir, metadata_result: Result, repo_type, owner if filename.endswith(".ttl") or filename.endswith(".owl") or filename.endswith(".nt") or filename. \ endswith(".xml"): uri = extract_ontologies.is_file_ontology(os.path.join(repo_dir, file_path)) + if uri is not None: onto_url = get_file_link(repo_type, file_path, owner, repo_name, repo_default_branch, repo_dir, repo_relative_path, filename) @@ -235,7 +237,14 @@ def process_repository_files(repo_dir, metadata_result: Result, repo_type, owner }, 1, constants.TECHNIQUE_FILE_EXPLORATION ) if filename.upper() == constants.CODEOWNERS_FILE: - codeowners_json = parse_codeowners_structured(dir_path,filename) + # codeowners_json = parse_codeowners_structured(dir_path,filename) + print("Processing CODEOWNERS file...") + codeowner_file_url = get_file_link(repo_type, file_path, owner, repo_name, repo_default_branch, + repo_dir, + repo_relative_path, filename) + + metadata_result = parse_codeowners_file(os.path.join(dir_path, filename), metadata_result, codeowner_file_url, additional_info) + parsed_build_files.add(filename.lower()) if filename.lower() == "codemeta.json": if filename.lower() in parsed_build_files and repo_relative_path != ".": @@ -245,7 +254,7 @@ def process_repository_files(repo_dir, metadata_result: Result, repo_type, owner codemeta_file_url = get_file_link(repo_type, file_path, owner, repo_name, repo_default_branch, repo_dir, repo_relative_path, filename) metadata_result = parse_codemeta_json_file(os.path.join(dir_path, filename), metadata_result, codemeta_file_url) parsed_build_files.add(filename.lower()) - # TO DO: Code owners not fully implemented yet + if filename.lower() == "pom.xml" or filename.lower() == "package.json" or \ filename.lower() == "pyproject.toml" or filename.lower() == "setup.py" or filename.endswith(".gemspec") or \ @@ -647,19 +656,6 @@ def extract_gitlab_domain(metadata_result, repo_type): return domain return None -def parse_codeowners_structured(dir_path, filename): - codeowners = [] - - with open(os.path.join(dir_path, filename), "r", encoding="utf-8") as file: - for line in file: - line = line.strip() - if line and not line.startswith("#"): - parts = line.split() - path = parts[0] - owners = parts[1:] - codeowners.append({"path": path, "owners": owners}) - - return {"codeowners": codeowners} def clean_text(text): cleaned_lines = [] diff --git a/src/somef/process_repository.py b/src/somef/process_repository.py index ad687864..8024f6fe 100644 --- a/src/somef/process_repository.py +++ b/src/somef/process_repository.py @@ -11,6 +11,7 @@ from . import configuration from .process_results import Result from .regular_expressions import detect_license_spdx +from .parser.codeowners_parser import enrich_github_user # Constructs a template HTTP header, which: # - has a key for the authorization token if passed via the authorization argument, otherwise @@ -484,7 +485,7 @@ def download_readme(owner, repo_name, default_branch, repo_type, authorization): def load_online_repository_metadata(repository_metadata: Result, repository_url, ignore_api_metadata=False, - repo_type=constants.RepositoryType.GITHUB, authorization=None): + repo_type=constants.RepositoryType.GITHUB, authorization=None, additional_info=False): """ Function uses the repository_url provided to load required information from GitHub or Gitlab. Information kept from the repository is written in keep_keys. @@ -495,6 +496,7 @@ def load_online_repository_metadata(repository_metadata: Result, repository_url, @param ignore_api_metadata: true if you do not want to do an additional request to the target API @param repository_url: target repository URL. @param authorization: GitHub authorization token + @param additional_info: flag to indicate if additional should be extracted from certain files as codeowners. More request. Returns ------- @@ -578,10 +580,22 @@ def load_online_repository_metadata(repository_metadata: Result, repository_url, for category, value in filtered_resp.items(): value_type = constants.STRING + maintainer_data = {} if category in constants.all_categories: if category == constants.CAT_ISSUE_TRACKER: value = value.replace("{/number}", "") if category == constants.CAT_OWNER: + if additional_info: + print("Enriching owner information from codeowners...") + user_info = enrich_github_user(owner) + if user_info: + if user_info.get("name"): + maintainer_data["name"] = user_info.get("name") + if user_info.get("company"): + maintainer_data["affiliation"] = user_info.get("company") + if user_info.get("email"): + maintainer_data["email"] = user_info.get("email") + value_type = filtered_resp[constants.AGENT_TYPE] if category == constants.CAT_KEYWORDS: # we concatenate all keywords in a list, as the return value is always a single object @@ -603,6 +617,17 @@ def load_online_repository_metadata(repository_metadata: Result, repository_url, } if "spdx_id" in value.keys(): result[constants.PROP_SPDX_ID] = value["spdx_id"] + elif category == constants.CAT_OWNER: + result = { + constants.PROP_VALUE: value, + constants.PROP_TYPE: value_type + } + if maintainer_data.get("name"): + result[constants.PROP_NAME] = maintainer_data["name"] + if maintainer_data.get("affiliation"): + result[constants.PROP_AFFILIATION] = maintainer_data["affiliation"] + if maintainer_data.get("email"): + result[constants.PROP_EMAIL] = maintainer_data["email"] else: result = { constants.PROP_VALUE: value, diff --git a/src/somef/somef_cli.py b/src/somef/somef_cli.py index b5f8010d..75db1ed1 100644 --- a/src/somef/somef_cli.py +++ b/src/somef/somef_cli.py @@ -21,7 +21,7 @@ def cli_get_data(threshold, ignore_classifiers, repo_url=None, doc_src=None, local_repo=None, ignore_github_metadata=False, readme_only=False, keep_tmp=None, authorization=None, - ignore_test_folder=True,requirements_mode='all') -> Result: + ignore_test_folder=True,requirements_mode='all', additional_info=False) -> Result: """ Main function to get the data through the command line Parameters @@ -37,7 +37,7 @@ def cli_get_data(threshold, ignore_classifiers, repo_url=None, doc_src=None, loc @param authorization: GitHub authorization token @param ignore_test_folder: Ignore contents of test folders @param requiriments_mode: flag to indicate what requirements show in codemeta - + @param additional_info: flag to indicate if additional should be extracted from certain files as codeowners. More request. Returns ------- @return: Dictionary with the results found by SOMEF, formatted as a Result object. @@ -46,6 +46,7 @@ def cli_get_data(threshold, ignore_classifiers, repo_url=None, doc_src=None, loc logging.basicConfig(level=logging.DEBUG, format='%(asctime)s-%(levelname)s-%(message)s', datefmt='%d-%b-%y %H:%M:%S', force=True) logging.getLogger("bibtexparser").setLevel(logging.ERROR) + logging.getLogger("urllib3").setLevel(logging.WARNING) file_paths = configuration.get_configuration_file() repo_type = constants.RepositoryType.GITHUB @@ -75,12 +76,14 @@ def cli_get_data(threshold, ignore_classifiers, repo_url=None, doc_src=None, loc print(f"DEBUG: {servidor} is_gitlab = {bGitLab}") if bGitLab: repo_type = constants.RepositoryType.GITLAB + repository_metadata, owner, repo_name, def_branch = process_repository.load_online_repository_metadata( repository_metadata, repo_url, ignore_github_metadata, repo_type, - authorization + authorization, + additional_info ) # download files and obtain path to download folder @@ -95,10 +98,12 @@ def cli_get_data(threshold, ignore_classifiers, repo_url=None, doc_src=None, loc if local_folder is not None: readme_text, full_repository_metadata = process_files.process_repository_files(local_folder, repository_metadata, - repo_type, owner, + repo_type, + owner, repo_name, def_branch, - ignore_test_folder) + ignore_test_folder, + additional_info) repository_metadata = check_repository_type(local_folder, repo_name, full_repository_metadata) else: logging.error("Error processing the target repository") @@ -111,10 +116,12 @@ def cli_get_data(threshold, ignore_classifiers, repo_url=None, doc_src=None, loc if local_folder is not None: readme_text, full_repository_metadata = process_files.process_repository_files(local_folder, repository_metadata, - repo_type, owner, + repo_type, + owner, repo_name, def_branch, - ignore_test_folder) + ignore_test_folder, + additional_info) repository_metadata = check_repository_type(local_folder, repo_name, full_repository_metadata) else: @@ -131,7 +138,8 @@ def cli_get_data(threshold, ignore_classifiers, repo_url=None, doc_src=None, loc readme_text, full_repository_metadata = process_files.process_repository_files(local_repo, repository_metadata, repo_type, - ignore_test_folder) + ignore_test_folder = ignore_test_folder, + additional_info = additional_info) if readme_text == "": logging.warning("Warning: README document does not exist in the local repository") except process_repository.GithubUrlError: @@ -172,6 +180,9 @@ def cli_get_data(threshold, ignore_classifiers, repo_url=None, doc_src=None, loc readme_source = readme_source[constants.PROP_RESULT][constants.PROP_VALUE] except: readme_source = "README.md" + + + print("Extracting regular expressions...") repository_metadata = regular_expressions.extract_bibtex(readme_unfiltered_text, repository_metadata, readme_source) repository_metadata = regular_expressions.extract_doi_badges(readme_unfiltered_text, repository_metadata, @@ -234,7 +245,8 @@ def run_cli(*, missing=False, keep_tmp=None, ignore_test_folder=True, - requirements_mode="all" + requirements_mode="all", + additional_info=False ): """Function to run all the required components of the cli for a repository""" # check if it is a valid url @@ -268,7 +280,7 @@ def run_cli(*, encoded_url = encoded_url.replace(".","") #removing dots just in case repo_data = cli_get_data(threshold=threshold, ignore_classifiers=ignore_classifiers, repo_url=repo_url, ignore_github_metadata=ignore_github_metadata, readme_only=readme_only, - keep_tmp=keep_tmp, ignore_test_folder=ignore_test_folder, requirements_mode=requirements_mode) + keep_tmp=keep_tmp, ignore_test_folder=ignore_test_folder, requirements_mode=requirements_mode, additional_info=additional_info) if output is not None: output = output.replace(".json","") @@ -296,13 +308,13 @@ def run_cli(*, if repo_url: repo_data = cli_get_data(threshold=threshold, ignore_classifiers=ignore_classifiers, repo_url=repo_url, ignore_github_metadata=ignore_github_metadata, readme_only=readme_only, - keep_tmp=keep_tmp, ignore_test_folder=ignore_test_folder) + keep_tmp=keep_tmp, ignore_test_folder=ignore_test_folder, additional_info=additional_info) elif local_repo: repo_data = cli_get_data(threshold=threshold, ignore_classifiers=ignore_classifiers, - local_repo=local_repo, keep_tmp=keep_tmp, ignore_test_folder=ignore_test_folder) + local_repo=local_repo, keep_tmp=keep_tmp, ignore_test_folder=ignore_test_folder, additional_info=additional_info) else: repo_data = cli_get_data(threshold=threshold, ignore_classifiers=ignore_classifiers, - doc_src=doc_src, keep_tmp=keep_tmp, ignore_test_folder=ignore_test_folder) + doc_src=doc_src, keep_tmp=keep_tmp, ignore_test_folder=ignore_test_folder, additional_info=additional_info) if output is not None: json_export.save_json_output(repo_data.results, output, missing, pretty=pretty) diff --git a/src/somef/test/test_JSON_export.py b/src/somef/test/test_JSON_export.py index befc47f2..16d6eb69 100644 --- a/src/somef/test/test_JSON_export.py +++ b/src/somef/test/test_JSON_export.py @@ -306,8 +306,7 @@ def test_issue_580(self): found = False homepage_entries = data.get("homepage", []) - print('---------------------------') - print(homepage_entries) + for item in homepage_entries: technique = item.get("technique") result = item.get("result", {}) @@ -470,4 +469,35 @@ def test_issue_859(self): os.remove(test_data_path + "test-859.json") + def test_issue_723(self): + """Checks if we exract the maintainers in the Codemeta output from the CODEOWNERS file. + But without -ai flag because requiere real requests to GitHub API and we want to avoid that in the tests. + """ + somef_cli.run_cli(threshold=0.8, + ignore_classifiers=False, + repo_url=None, + local_repo=test_data_repositories + "tensorflow", + doc_src=None, + in_file=None, + output=test_data_path + "test_issue_723.json", + graph_out=None, + graph_format="turtle", + codemeta_out=None, + pretty=True, + missing=False, + readme_only=False) + + text_file = open(test_data_path + "test_issue_723.json", "r") + data = text_file.read() + text_file.close() + json_content = json.loads(data) + + maintainers= json_content.get("maintainer", []) + assert len(maintainers) == 10, f"Expected 10 maintainers, found {len(maintainers)}" + usernames = [m.get("result", {}).get("username") for m in maintainers] + assert "qqfish" in usernames, "Expected maintainer 'qqfish' not found" + assert "penpornk" in usernames, "Expected maintainer 'penpornk' not found" + + os.remove(test_data_path + "test_issue_723.json") + \ No newline at end of file diff --git a/src/somef/test/test_codemeta_export.py b/src/somef/test/test_codemeta_export.py index 2277acaa..12e02315 100644 --- a/src/somef/test/test_codemeta_export.py +++ b/src/somef/test/test_codemeta_export.py @@ -210,9 +210,10 @@ def test_author_in_reference_publication(self): with open(test_data_path + "test_authors_reference.json", "r") as text_file: data = json.load(text_file) + expected_family_name = "Garijo" expected_given_name = "Daniel" - + found = any( any( author.get("familyName") == expected_family_name and author.get("givenName") == expected_given_name @@ -518,6 +519,38 @@ def test_issue_417(self): os.remove(test_data_path + "test-417.json-ld") + def test_issue_723_codemeta(self): + """ + Check that we extract the maintainers in the Codemeta output from the CODEOWNERS file. But without -ai flag + """ + + somef_cli.run_cli(threshold=0.9, + ignore_classifiers=False, + repo_url=None, + doc_src=None, + local_repo=test_data_repositories + "tensorflow", + in_file=None, + output=None, + graph_out=None, + graph_format="turtle", + codemeta_out= test_data_path + 'test_codemeta_codeowners.json', + pretty=True, + missing=False) + + json_file_path = test_data_path + "test_codemeta_codeowners.json" + text_file = open(json_file_path, "r") + data = text_file.read() + json_content = json.loads(data) + text_file.close() + + maintainers= json_content.get("maintainer", []) + assert len(maintainers) == 10, f"Expected 10 maintainers, found {len(maintainers)}" + identifiers = [m.get("identifier") for m in maintainers] + assert "qqfish" in identifiers, "Expected maintainer 'qqfish' not found" + assert "penpornk" in identifiers, "Expected maintainer 'penpornk' not found" + + os.remove(json_file_path) + @classmethod def tearDownClass(cls): """delete temp file JSON just if all the test pass""" diff --git a/src/somef/test/test_data/repositories/tensorflow/CODEOWNERS b/src/somef/test/test_data/repositories/tensorflow/CODEOWNERS new file mode 100644 index 00000000..0603a9c1 --- /dev/null +++ b/src/somef/test/test_data/repositories/tensorflow/CODEOWNERS @@ -0,0 +1,18 @@ +# Where component owners are known, add them here. + +/tensorflow/c/eager @qqfish +/tensorflow/core/common_runtime/eager @qqfish +/tenosrflow/core/debug @caisq +/tensorflow/core/kernels/mkl/ @penpornk +/tensorflow/core/kernels/sparse/ @penpornk +/tensorflow/core/nccl/ @azaks2 @chsigg +/tensorflow/python/autograph/ @mdanatg +/tensorflow/python/debug @caisq +/tensorflow/python/eager @rohan100jain +/tensorflow/tools/docs/ @markdaoust +/tensorflow/compiler/mlir/ @aminim +/tensorflow/core/ir/ @aminim +/tensorflow/core/transforms/ @aminim + + +/third_party/systemlibs/ @perfinion \ No newline at end of file diff --git a/src/somef/test/test_data/repositories/tensorflow/README.md b/src/somef/test/test_data/repositories/tensorflow/README.md new file mode 100644 index 00000000..18bdc6dd --- /dev/null +++ b/src/somef/test/test_data/repositories/tensorflow/README.md @@ -0,0 +1,173 @@ +
+ +
+ +[![Python](https://img.shields.io/pypi/pyversions/tensorflow.svg)](https://badge.fury.io/py/tensorflow) +[![PyPI](https://badge.fury.io/py/tensorflow.svg)](https://badge.fury.io/py/tensorflow) +[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.4724125.svg)](https://doi.org/10.5281/zenodo.4724125) +[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/1486/badge)](https://bestpractices.coreinfrastructure.org/projects/1486) +[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/tensorflow/tensorflow/badge)](https://securityscorecards.dev/viewer/?uri=github.com/tensorflow/tensorflow) +[![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/tensorflow.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:tensorflow) +[![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/tensorflow-py.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:tensorflow-py) +[![OSSRank](https://shields.io/endpoint?url=https://ossrank.com/shield/44)](https://ossrank.com/p/44) +[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-v1.4%20adopted-ff69b4.svg)](CODE_OF_CONDUCT.md) + +**`Documentation`** | +------------------- | +[![Documentation](https://img.shields.io/badge/api-reference-blue.svg)](https://www.tensorflow.org/api_docs/) | + +[TensorFlow](https://www.tensorflow.org/) is an end-to-end open source platform +for machine learning. It has a comprehensive, flexible ecosystem of +[tools](https://www.tensorflow.org/resources/tools), +[libraries](https://www.tensorflow.org/resources/libraries-extensions), and +[community](https://www.tensorflow.org/community) resources that lets +researchers push the state-of-the-art in ML and developers easily build and +deploy ML-powered applications. + +TensorFlow was originally developed by researchers and engineers working within +the Machine Intelligence team at Google Brain to conduct research in machine +learning and neural networks. However, the framework is versatile enough to be +used in other areas as well. + +TensorFlow provides stable [Python](https://www.tensorflow.org/api_docs/python) +and [C++](https://www.tensorflow.org/api_docs/cc) APIs, as well as a +non-guaranteed backward compatible API for +[other languages](https://www.tensorflow.org/api_docs). + +Keep up-to-date with release announcements and security updates by subscribing +to +[announce@tensorflow.org](https://groups.google.com/a/tensorflow.org/forum/#!forum/announce). +See all the [mailing lists](https://www.tensorflow.org/community/forums). + +## Install + +See the [TensorFlow install guide](https://www.tensorflow.org/install) for the +[pip package](https://www.tensorflow.org/install/pip), to +[enable GPU support](https://www.tensorflow.org/install/gpu), use a +[Docker container](https://www.tensorflow.org/install/docker), and +[build from source](https://www.tensorflow.org/install/source). + +To install the current release, which includes support for +[CUDA-enabled GPU cards](https://www.tensorflow.org/install/gpu) *(Ubuntu and +Windows)*: + +``` +$ pip install tensorflow +``` + +Other devices (DirectX and MacOS-metal) are supported using +[Device Plugins](https://www.tensorflow.org/install/gpu_plugins#available_devices). + +A smaller CPU-only package is also available: + +``` +$ pip install tensorflow-cpu +``` + +To update TensorFlow to the latest version, add `--upgrade` flag to the above +commands. + +*Nightly binaries are available for testing using the +[tf-nightly](https://pypi.python.org/pypi/tf-nightly) and +[tf-nightly-cpu](https://pypi.python.org/pypi/tf-nightly-cpu) packages on PyPI.* + +#### *Try your first TensorFlow program* + +```shell +$ python +``` + +```python +>>> import tensorflow as tf +>>> tf.add(1, 2).numpy() +3 +>>> hello = tf.constant('Hello, TensorFlow!') +>>> hello.numpy() +b'Hello, TensorFlow!' +``` + +For more examples, see the +[TensorFlow Tutorials](https://www.tensorflow.org/tutorials/). + +## Contribution guidelines + +**If you want to contribute to TensorFlow, be sure to review the +[Contribution Guidelines](CONTRIBUTING.md). This project adheres to TensorFlow's +[Code of Conduct](CODE_OF_CONDUCT.md). By participating, you are expected to +uphold this code.** + +**We use [GitHub Issues](https://github.com/tensorflow/tensorflow/issues) for +tracking requests and bugs, please see +[TensorFlow Forum](https://discuss.tensorflow.org/) for general questions and +discussion, and please direct specific questions to +[Stack Overflow](https://stackoverflow.com/questions/tagged/tensorflow).** + +The TensorFlow project strives to abide by generally accepted best practices in +open-source software development. + +## Patching guidelines + +Follow these steps to patch a specific version of TensorFlow, for example, to +apply fixes to bugs or security vulnerabilities: + +* Clone the TensorFlow repository and switch to the appropriate branch for + your desired version—for example, `r2.8` for version 2.8. +* Apply the desired changes (i.e., cherry-pick them) and resolve any code + conflicts. +* Run TensorFlow tests and ensure they pass. +* [Build](https://www.tensorflow.org/install/source) the TensorFlow pip + package from source. + +## Continuous build status + +You can find more community-supported platforms and configurations in the +[TensorFlow SIG Build Community Builds Table](https://github.com/tensorflow/build#community-supported-tensorflow-builds). + +### Official Builds + +Build Type | Status | Artifacts +----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- +**Linux CPU** | [![Status](https://storage.googleapis.com/tensorflow-kokoro-build-badges/ubuntu-cc.svg)](https://storage.googleapis.com/tensorflow-kokoro-build-badges/ubuntu-cc.html) | [PyPI](https://pypi.org/project/tf-nightly/) +**Linux GPU** | [![Status](https://storage.googleapis.com/tensorflow-kokoro-build-badges/ubuntu-gpu-py3.svg)](https://storage.googleapis.com/tensorflow-kokoro-build-badges/ubuntu-gpu-py3.html) | [PyPI](https://pypi.org/project/tf-nightly-gpu/) +**Linux XLA** | [![Status](https://storage.googleapis.com/tensorflow-kokoro-build-badges/ubuntu-xla.svg)](https://storage.googleapis.com/tensorflow-kokoro-build-badges/ubuntu-xla.html) | TBA +**macOS** | [![Status](https://storage.googleapis.com/tensorflow-kokoro-build-badges/macos-py2-cc.svg)](https://storage.googleapis.com/tensorflow-kokoro-build-badges/macos-py2-cc.html) | [PyPI](https://pypi.org/project/tf-nightly/) +**Windows CPU** | [![Status](https://storage.googleapis.com/tensorflow-kokoro-build-badges/windows-cpu.svg)](https://storage.googleapis.com/tensorflow-kokoro-build-badges/windows-cpu.html) | [PyPI](https://pypi.org/project/tf-nightly/) +**Windows GPU** | [![Status](https://storage.googleapis.com/tensorflow-kokoro-build-badges/windows-gpu.svg)](https://storage.googleapis.com/tensorflow-kokoro-build-badges/windows-gpu.html) | [PyPI](https://pypi.org/project/tf-nightly-gpu/) +**Android** | [![Status](https://storage.googleapis.com/tensorflow-kokoro-build-badges/android.svg)](https://storage.googleapis.com/tensorflow-kokoro-build-badges/android.html) | [Download](https://bintray.com/google/tensorflow/tensorflow/_latestVersion) +**Raspberry Pi 0 and 1** | [![Status](https://storage.googleapis.com/tensorflow-kokoro-build-badges/rpi01-py3.svg)](https://storage.googleapis.com/tensorflow-kokoro-build-badges/rpi01-py3.html) | [Py3](https://storage.googleapis.com/tensorflow-nightly/tensorflow-1.10.0-cp34-none-linux_armv6l.whl) +**Raspberry Pi 2 and 3** | [![Status](https://storage.googleapis.com/tensorflow-kokoro-build-badges/rpi23-py3.svg)](https://storage.googleapis.com/tensorflow-kokoro-build-badges/rpi23-py3.html) | [Py3](https://storage.googleapis.com/tensorflow-nightly/tensorflow-1.10.0-cp34-none-linux_armv7l.whl) +**Libtensorflow MacOS CPU** | Status Temporarily Unavailable | [Nightly Binary](https://storage.googleapis.com/libtensorflow-nightly/prod/tensorflow/release/macos/latest/macos_cpu_libtensorflow_binaries.tar.gz) [Official GCS](https://storage.googleapis.com/tensorflow/) +**Libtensorflow Linux CPU** | Status Temporarily Unavailable | [Nightly Binary](https://storage.googleapis.com/libtensorflow-nightly/prod/tensorflow/release/ubuntu_16/latest/cpu/ubuntu_cpu_libtensorflow_binaries.tar.gz) [Official GCS](https://storage.googleapis.com/tensorflow/) +**Libtensorflow Linux GPU** | Status Temporarily Unavailable | [Nightly Binary](https://storage.googleapis.com/libtensorflow-nightly/prod/tensorflow/release/ubuntu_16/latest/gpu/ubuntu_gpu_libtensorflow_binaries.tar.gz) [Official GCS](https://storage.googleapis.com/tensorflow/) +**Libtensorflow Windows CPU** | Status Temporarily Unavailable | [Nightly Binary](https://storage.googleapis.com/libtensorflow-nightly/prod/tensorflow/release/windows/latest/cpu/windows_cpu_libtensorflow_binaries.tar.gz) [Official GCS](https://storage.googleapis.com/tensorflow/) +**Libtensorflow Windows GPU** | Status Temporarily Unavailable | [Nightly Binary](https://storage.googleapis.com/libtensorflow-nightly/prod/tensorflow/release/windows/latest/gpu/windows_gpu_libtensorflow_binaries.tar.gz) [Official GCS](https://storage.googleapis.com/tensorflow/) + +## Resources + +* [TensorFlow.org](https://www.tensorflow.org) +* [TensorFlow Tutorials](https://www.tensorflow.org/tutorials/) +* [TensorFlow Official Models](https://github.com/tensorflow/models/tree/master/official) +* [TensorFlow Examples](https://github.com/tensorflow/examples) +* [TensorFlow Codelabs](https://codelabs.developers.google.com/?cat=TensorFlow) +* [TensorFlow Blog](https://blog.tensorflow.org) +* [Learn ML with TensorFlow](https://www.tensorflow.org/resources/learn-ml) +* [TensorFlow Twitter](https://twitter.com/tensorflow) +* [TensorFlow YouTube](https://www.youtube.com/channel/UC0rqucBdTuFTjJiefW5t-IQ) +* [TensorFlow model optimization roadmap](https://www.tensorflow.org/model_optimization/guide/roadmap) +* [TensorFlow White Papers](https://www.tensorflow.org/about/bib) +* [TensorBoard Visualization Toolkit](https://github.com/tensorflow/tensorboard) +* [TensorFlow Code Search](https://cs.opensource.google/tensorflow/tensorflow) + +Learn more about the +[TensorFlow Community](https://www.tensorflow.org/community) and how to +[Contribute](https://www.tensorflow.org/community/contribute). + +## Courses + +* [Coursera](https://www.coursera.org/search?query=TensorFlow) +* [Udacity](https://www.udacity.com/courses/all?search=TensorFlow) +* [Edx](https://www.edx.org/search?q=TensorFlow) + +## License + +[Apache License 2.0](LICENSE) \ No newline at end of file diff --git a/src/somef/utils/constants.py b/src/somef/utils/constants.py index 1829bc80..3dd5aa13 100644 --- a/src/somef/utils/constants.py +++ b/src/somef/utils/constants.py @@ -161,6 +161,7 @@ CAT_KEYWORDS = "keywords" CAT_LICENSE = "license" CAT_LOGO = "logo" +CAT_MAINTAINER = "maintainer" CAT_NAME = "name" CAT_ONTOLOGIES = "ontologies" CAT_OWNER = "owner" @@ -235,6 +236,7 @@ PROP_VALUE = "value" # For Result types PROP_AUTHOR = "author" +PROP_AFFILIATION = "affiliation" PROP_BROWSER_URL = "browser_download_url" PROP_CONTENT_TYPE = "content_type" PROP_DOI = "doi" @@ -243,6 +245,7 @@ PROP_DATE_CREATED_AT = "created_at" PROP_DATE_PUBLISHED = "date_published" PROP_DATE_UPDATED = "date_updated" +PROP_EMAIL = "email" PROP_HTML_URL = "html_url" PROP_NAME = "name" PROP_ORIGINAL_HEADER = "original_header" @@ -446,6 +449,7 @@ class RepositoryType(Enum): CAT_CODEMETA_KEYWORDS = "keywords" CAT_CODEMETA_LICENSE = "license" CAT_CODEMETA_LOGO = "logo" +CAT_CODEMETA_MAINTAINER = "maintainer" CAT_CODEMETA_NAME = "name" CAT_CODEMETA_PROGRAMMINGLANGUAGE = "programmingLanguage" CAT_CODEMETA_README = "readme" From 9a65480c5bb5133fdb7226358fb03e476f97e7df Mon Sep 17 00:00:00 2001 From: Juanje Mendoza Date: Fri, 6 Feb 2026 15:38:55 +0100 Subject: [PATCH 05/27] parser, docs and test for conda environment --- docs/condaenvironment.md | 49 ++++ docs/supported_metadata_files.md | 2 + src/somef/parser/conda_environment_parser.py | 84 +++++++ src/somef/process_files.py | 6 + .../test/test_conda_environment_parser.py | 57 +++++ .../repositories/stable-diffusion/README.md | 214 ++++++++++++++++++ .../stable-diffusion/environment.yaml | 31 +++ 7 files changed, 443 insertions(+) create mode 100644 docs/condaenvironment.md create mode 100644 src/somef/parser/conda_environment_parser.py create mode 100644 src/somef/test/test_conda_environment_parser.py create mode 100644 src/somef/test/test_data/repositories/stable-diffusion/README.md create mode 100644 src/somef/test/test_data/repositories/stable-diffusion/environment.yaml diff --git a/docs/condaenvironment.md b/docs/condaenvironment.md new file mode 100644 index 00000000..99a74dc4 --- /dev/null +++ b/docs/condaenvironment.md @@ -0,0 +1,49 @@ +# Metadata extracted from a Conda `environment.yml` file + +The following metadata fields can be extracted from a Conda `environment.yml` or `environment.yaml` file. +This file format is part of the Conda environment specification and is commonly used to declare software dependencies for reproducible environments. + +Only dependency information is mapped, since it is the only part of the Conda environment specification that corresponds to CodeMeta could be `softwareRequirements`. + +--- + +## Extracted metadata fields + +| Software metadata category | SOMEF metadata JSON path | ENVIRONMENT.YML metadata file field | +|-----------------------------|---------------------------------------|------------------------------| +| has_package_file | has_package_file[i].result.value | URL of the `environment.yml` file | +| requirements - value | requirements[i].result.value | dependenciees | +| requirements - name | requirements[i].result.name | dependencies extract name | +| requirements - version | requirements[i].result.version | dependencies extract version | +| requirements - dependency type | requirements[i].result.dependency_type | conda if depedencies or pip if dependencie/pip *(1)* | + + +--- + + +*(1)* +- Example of a dependency conda and a dependency pip: +``` +name: ldm +dependencies: + - python=3.8.5 + - pip: + - albumentations==0.4.3 +``` +- Result: +``` + "result": { + "value": "python=3.8.5", + "name": "python", + "version": "3.8.5", + "type": "Software_application", + "dependency_type": "conda" + }, + "result": { + "value": "albumentations==0.4.3", + "name": "albumentations", + "version": "0.4.3", + "type": "Software_application", + "dependency_type": "pip" + }, + diff --git a/docs/supported_metadata_files.md b/docs/supported_metadata_files.md index 36c8700d..3d74bc73 100644 --- a/docs/supported_metadata_files.md +++ b/docs/supported_metadata_files.md @@ -26,6 +26,8 @@ SOMEF can extract metadata from a wide range of files commonly found in software | `*.cabal` | Haskell | Manifest file serving as the package descriptor for Haskell projects.|
[🔍](./cabal.md)
| [📄](https://cabal.readthedocs.io/en/3.10/cabal-package.html)| |[Example](https://github.com/haskell/cabal/blob/master/Cabal/Cabal.cabal) | | `dockerfile` | Dockerfile | Build specification file for container images that can include software metadata via LABEL instructions (OCI specification).|
[🔍](./dockerfiledoc.md)
| [📄](https://docs.docker.com/reference/dockerfile/)| |[Example](https://github.com/FairwindsOps/nova/blob/master/Dockerfile) | | `publiccode.yml` | YAML | YAML metadata file for public sector software projects|
[🔍](./publiccode.md)
| [📄](https://yml.publiccode.tools//)| |[Example](https://github.com/maykinmedia/objects-api/blob/master/publiccode.yaml) | +| `environment.yml` | YAML | Conda environment specification file declaring software dependencies for reproducible environments|
[🔍](./codaenvironment.md)
| | |[Example](https://github.com/CompVis/stable-diffusion/blob/main/environment.yaml) | + > **Note:** The general principles behind metadata mapping in SOMEF are based on the [CodeMeta crosswalk](https://github.com/codemeta/codemeta/blob/master/crosswalk.csv) and the [CodeMeta JSON-LD context](https://github.com/codemeta/codemeta/blob/master/codemeta.jsonld). > However, each supported file type may have specific characteristics and field interpretations. diff --git a/src/somef/parser/conda_environment_parser.py b/src/somef/parser/conda_environment_parser.py new file mode 100644 index 00000000..5a0cae9b --- /dev/null +++ b/src/somef/parser/conda_environment_parser.py @@ -0,0 +1,84 @@ +import json +import yaml +import logging +from pathlib import Path +from ..process_results import Result +from ..utils import constants +import re + +def parse_conda_environment_file(file_path, metadata_result: Result, source): + + try: + with open(file_path, "r", encoding="utf-8") as f: + data = yaml.safe_load(f) + except Exception as e: + logging.warning(f"Could not parse environment.yml {file_path}: {e}") + return metadata_result + + # Validación mínima + if not isinstance(data, dict) or "dependencies" not in data: + return metadata_result + + if Path(file_path).name.lower() in {"environment.yml", "environment.yaml"}: + metadata_result.add_result( + constants.CAT_HAS_PACKAGE_FILE, + { + "value": source, + "type": constants.URL, + }, + 1, + constants.TECHNIQUE_CODE_CONFIG_PARSER, + source + ) + + name = data.get("name") + # not sure about this channels. I doubt they are relevant for the metadata in somef. + channels = data.get("channels", []) + dependencies = data.get("dependencies", []) + + conda_deps = [] + pip_deps = [] + + for dep in dependencies: + if isinstance(dep, str): + conda_deps.append(dep) + elif isinstance(dep, dict) and "pip" in dep: + pip_deps.extend(dep["pip"]) + + # conda dependencies + for dep in conda_deps: + metadata_result.add_result( + constants.CAT_REQUIREMENTS, + { + "value": dep, + "name": dep.split("=")[0], + "version": dep.split("=")[1] if "=" in dep else "", + "type": constants.SOFTWARE_APPLICATION, + "dependency_type": "conda" + }, + 1, + constants.TECHNIQUE_CODE_CONFIG_PARSER, + source + ) + + # pip dependdencies + for dep in pip_deps: + name = dep.split("==")[0] if "==" in dep else dep + version = dep.split("==")[1] if "==" in dep else "" + + metadata_result.add_result( + constants.CAT_REQUIREMENTS, + { + "value": dep, + "name": name, + "version": version, + "type": constants.SOFTWARE_APPLICATION, + "dependency_type": "pip" + }, + 1, + constants.TECHNIQUE_CODE_CONFIG_PARSER, + source + ) + + + return metadata_result diff --git a/src/somef/process_files.py b/src/somef/process_files.py index 6cdd9b82..5a0b5425 100644 --- a/src/somef/process_files.py +++ b/src/somef/process_files.py @@ -24,6 +24,7 @@ from .parser.dockerfile_parser import parse_dockerfile from .parser.publiccode_parser import parse_publiccode_file from .parser.codeowners_parser import parse_codeowners_file +from .parser.conda_environment_parser import parse_conda_environment_file from chardet import detect @@ -259,6 +260,7 @@ def process_repository_files(repo_dir, metadata_result: Result, repo_type, owner if filename.lower() == "pom.xml" or filename.lower() == "package.json" or \ filename.lower() == "pyproject.toml" or filename.lower() == "setup.py" or filename.endswith(".gemspec") or \ filename.lower() == "requirements.txt" or filename.lower() == "bower.json" or filename == "DESCRIPTION" or \ + (filename.lower() == "environment.yml" or filename.lower() == "environment.yaml") or \ (filename.lower() == "cargo.toml" and repo_relative_path == ".") or (filename.lower() == "composer.json" and repo_relative_path == ".") or \ (filename == "Project.toml" or (filename.lower()== "publiccode.yml" or filename.lower()== "publiccode.yaml") and repo_relative_path == "."): if filename.lower() in parsed_build_files and repo_relative_path != ".": @@ -300,6 +302,10 @@ def process_repository_files(repo_dir, metadata_result: Result, repo_type, owner metadata_result = parse_cabal_file(os.path.join(dir_path, filename), metadata_result, build_file_url) if filename.lower() == "publiccode.yml" or filename.lower() == "publiccode.yaml": metadata_result = parse_publiccode_file(os.path.join(dir_path, filename), metadata_result, build_file_url) + if filename.lower() == "environment.yml" or filename.lower() == "environment.yaml": + print("Processing conda environment file...") + metadata_result = parse_conda_environment_file(os.path.join(dir_path, filename), metadata_result, build_file_url) + parsed_build_files.add(filename.lower()) # if repo_type == constants.RepositoryType.GITLAB: diff --git a/src/somef/test/test_conda_environment_parser.py b/src/somef/test/test_conda_environment_parser.py new file mode 100644 index 00000000..9d57c2b3 --- /dev/null +++ b/src/somef/test/test_conda_environment_parser.py @@ -0,0 +1,57 @@ +import json +import os +import unittest +from pathlib import Path +from .. import somef_cli +from ..utils import constants + +test_data_path = str(Path(__file__).parent / "test_data") + os.path.sep +test_data_repositories = str(Path(__file__).parent / "test_data" / "repositories") + os.path.sep +test_data_api_json = str(Path(__file__).parent / "test_data" / "api_responses") + os.path.sep + +class TestCondaEnvironmentParser(unittest.TestCase): + + def test_issue_489(self): + + somef_cli.run_cli(threshold=0.8, + ignore_classifiers=False, + repo_url=None, + local_repo=test_data_repositories + "stable-diffusion", + doc_src=None, + in_file=None, + output=test_data_path + "test_issue_489.json", + graph_out=None, + graph_format="turtle", + codemeta_out=None, + pretty=True, + missing=False, + readme_only=False) + + text_file = open(test_data_path + "test_issue_489.json", "r") + data = text_file.read() + text_file.close() + json_content = json.loads(data) + + requeriments= json_content.get("requirements", []) + + assert len(requeriments) == 26, f"Expected 26 requeriments, found {len(requeriments)}" + python_reqs = [ + r for r in requeriments + if r["result"].get("name") == "python" + ] + + assert python_reqs, "Expected python dependency not found" + assert python_reqs[0]["result"]["dependency_type"] == "conda" + assert python_reqs[0]["result"]["version"] == "3.8.5" + + albumentations_reqs = [ + r for r in requeriments + if r["result"].get("name") == "albumentations" + ] + assert albumentations_reqs, "Expected albumentations dependency not found" + assert albumentations_reqs[0]["result"]["dependency_type"] == "pip" + assert albumentations_reqs[0]["result"]["version"] == "0.4.3" + + os.remove(test_data_path + "test_issue_489.json") + + \ No newline at end of file diff --git a/src/somef/test/test_data/repositories/stable-diffusion/README.md b/src/somef/test/test_data/repositories/stable-diffusion/README.md new file mode 100644 index 00000000..6cd49fb1 --- /dev/null +++ b/src/somef/test/test_data/repositories/stable-diffusion/README.md @@ -0,0 +1,214 @@ +# Stable Diffusion +*Stable Diffusion was made possible thanks to a collaboration with [Stability AI](https://stability.ai/) and [Runway](https://runwayml.com/) and builds upon our previous work:* + +[**High-Resolution Image Synthesis with Latent Diffusion Models**](https://ommer-lab.com/research/latent-diffusion-models/)
+[Robin Rombach](https://github.com/rromb)\*, +[Andreas Blattmann](https://github.com/ablattmann)\*, +[Dominik Lorenz](https://github.com/qp-qp)\, +[Patrick Esser](https://github.com/pesser), +[Björn Ommer](https://hci.iwr.uni-heidelberg.de/Staff/bommer)
+_[CVPR '22 Oral](https://openaccess.thecvf.com/content/CVPR2022/html/Rombach_High-Resolution_Image_Synthesis_With_Latent_Diffusion_Models_CVPR_2022_paper.html) | +[GitHub](https://github.com/CompVis/latent-diffusion) | [arXiv](https://arxiv.org/abs/2112.10752) | [Project page](https://ommer-lab.com/research/latent-diffusion-models/)_ + +![txt2img-stable2](assets/stable-samples/txt2img/merged-0006.png) +[Stable Diffusion](#stable-diffusion-v1) is a latent text-to-image diffusion +model. +Thanks to a generous compute donation from [Stability AI](https://stability.ai/) and support from [LAION](https://laion.ai/), we were able to train a Latent Diffusion Model on 512x512 images from a subset of the [LAION-5B](https://laion.ai/blog/laion-5b/) database. +Similar to Google's [Imagen](https://arxiv.org/abs/2205.11487), +this model uses a frozen CLIP ViT-L/14 text encoder to condition the model on text prompts. +With its 860M UNet and 123M text encoder, the model is relatively lightweight and runs on a GPU with at least 10GB VRAM. +See [this section](#stable-diffusion-v1) below and the [model card](https://huggingface.co/CompVis/stable-diffusion). + + +## Requirements +A suitable [conda](https://conda.io/) environment named `ldm` can be created +and activated with: + +``` +conda env create -f environment.yaml +conda activate ldm +``` + +You can also update an existing [latent diffusion](https://github.com/CompVis/latent-diffusion) environment by running + +``` +conda install pytorch torchvision -c pytorch +pip install transformers==4.19.2 diffusers invisible-watermark +pip install -e . +``` + + +## Stable Diffusion v1 + +Stable Diffusion v1 refers to a specific configuration of the model +architecture that uses a downsampling-factor 8 autoencoder with an 860M UNet +and CLIP ViT-L/14 text encoder for the diffusion model. The model was pretrained on 256x256 images and +then finetuned on 512x512 images. + +*Note: Stable Diffusion v1 is a general text-to-image diffusion model and therefore mirrors biases and (mis-)conceptions that are present +in its training data. +Details on the training procedure and data, as well as the intended use of the model can be found in the corresponding [model card](Stable_Diffusion_v1_Model_Card.md).* + +The weights are available via [the CompVis organization at Hugging Face](https://huggingface.co/CompVis) under [a license which contains specific use-based restrictions to prevent misuse and harm as informed by the model card, but otherwise remains permissive](LICENSE). While commercial use is permitted under the terms of the license, **we do not recommend using the provided weights for services or products without additional safety mechanisms and considerations**, since there are [known limitations and biases](Stable_Diffusion_v1_Model_Card.md#limitations-and-bias) of the weights, and research on safe and ethical deployment of general text-to-image models is an ongoing effort. **The weights are research artifacts and should be treated as such.** + +[The CreativeML OpenRAIL M license](LICENSE) is an [Open RAIL M license](https://www.licenses.ai/blog/2022/8/18/naming-convention-of-responsible-ai-licenses), adapted from the work that [BigScience](https://bigscience.huggingface.co/) and [the RAIL Initiative](https://www.licenses.ai/) are jointly carrying in the area of responsible AI licensing. See also [the article about the BLOOM Open RAIL license](https://bigscience.huggingface.co/blog/the-bigscience-rail-license) on which our license is based. + +### Weights + +We currently provide the following checkpoints: + +- `sd-v1-1.ckpt`: 237k steps at resolution `256x256` on [laion2B-en](https://huggingface.co/datasets/laion/laion2B-en). + 194k steps at resolution `512x512` on [laion-high-resolution](https://huggingface.co/datasets/laion/laion-high-resolution) (170M examples from LAION-5B with resolution `>= 1024x1024`). +- `sd-v1-2.ckpt`: Resumed from `sd-v1-1.ckpt`. + 515k steps at resolution `512x512` on [laion-aesthetics v2 5+](https://laion.ai/blog/laion-aesthetics/) (a subset of laion2B-en with estimated aesthetics score `> 5.0`, and additionally +filtered to images with an original size `>= 512x512`, and an estimated watermark probability `< 0.5`. The watermark estimate is from the [LAION-5B](https://laion.ai/blog/laion-5b/) metadata, the aesthetics score is estimated using the [LAION-Aesthetics Predictor V2](https://github.com/christophschuhmann/improved-aesthetic-predictor)). +- `sd-v1-3.ckpt`: Resumed from `sd-v1-2.ckpt`. 195k steps at resolution `512x512` on "laion-aesthetics v2 5+" and 10\% dropping of the text-conditioning to improve [classifier-free guidance sampling](https://arxiv.org/abs/2207.12598). +- `sd-v1-4.ckpt`: Resumed from `sd-v1-2.ckpt`. 225k steps at resolution `512x512` on "laion-aesthetics v2 5+" and 10\% dropping of the text-conditioning to improve [classifier-free guidance sampling](https://arxiv.org/abs/2207.12598). + +Evaluations with different classifier-free guidance scales (1.5, 2.0, 3.0, 4.0, +5.0, 6.0, 7.0, 8.0) and 50 PLMS sampling +steps show the relative improvements of the checkpoints: +![sd evaluation results](assets/v1-variants-scores.jpg) + + + +### Text-to-Image with Stable Diffusion +![txt2img-stable2](assets/stable-samples/txt2img/merged-0005.png) +![txt2img-stable2](assets/stable-samples/txt2img/merged-0007.png) + +Stable Diffusion is a latent diffusion model conditioned on the (non-pooled) text embeddings of a CLIP ViT-L/14 text encoder. +We provide a [reference script for sampling](#reference-sampling-script), but +there also exists a [diffusers integration](#diffusers-integration), which we +expect to see more active community development. + +#### Reference Sampling Script + +We provide a reference sampling script, which incorporates + +- a [Safety Checker Module](https://github.com/CompVis/stable-diffusion/pull/36), + to reduce the probability of explicit outputs, +- an [invisible watermarking](https://github.com/ShieldMnt/invisible-watermark) + of the outputs, to help viewers [identify the images as machine-generated](scripts/tests/test_watermark.py). + +After [obtaining the `stable-diffusion-v1-*-original` weights](#weights), link them +``` +mkdir -p models/ldm/stable-diffusion-v1/ +ln -s models/ldm/stable-diffusion-v1/model.ckpt +``` +and sample with +``` +python scripts/txt2img.py --prompt "a photograph of an astronaut riding a horse" --plms +``` + +By default, this uses a guidance scale of `--scale 7.5`, [Katherine Crowson's implementation](https://github.com/CompVis/latent-diffusion/pull/51) of the [PLMS](https://arxiv.org/abs/2202.09778) sampler, +and renders images of size 512x512 (which it was trained on) in 50 steps. All supported arguments are listed below (type `python scripts/txt2img.py --help`). + + +```commandline +usage: txt2img.py [-h] [--prompt [PROMPT]] [--outdir [OUTDIR]] [--skip_grid] [--skip_save] [--ddim_steps DDIM_STEPS] [--plms] [--laion400m] [--fixed_code] [--ddim_eta DDIM_ETA] + [--n_iter N_ITER] [--H H] [--W W] [--C C] [--f F] [--n_samples N_SAMPLES] [--n_rows N_ROWS] [--scale SCALE] [--from-file FROM_FILE] [--config CONFIG] [--ckpt CKPT] + [--seed SEED] [--precision {full,autocast}] + +optional arguments: + -h, --help show this help message and exit + --prompt [PROMPT] the prompt to render + --outdir [OUTDIR] dir to write results to + --skip_grid do not save a grid, only individual samples. Helpful when evaluating lots of samples + --skip_save do not save individual samples. For speed measurements. + --ddim_steps DDIM_STEPS + number of ddim sampling steps + --plms use plms sampling + --laion400m uses the LAION400M model + --fixed_code if enabled, uses the same starting code across samples + --ddim_eta DDIM_ETA ddim eta (eta=0.0 corresponds to deterministic sampling + --n_iter N_ITER sample this often + --H H image height, in pixel space + --W W image width, in pixel space + --C C latent channels + --f F downsampling factor + --n_samples N_SAMPLES + how many samples to produce for each given prompt. A.k.a. batch size + --n_rows N_ROWS rows in the grid (default: n_samples) + --scale SCALE unconditional guidance scale: eps = eps(x, empty) + scale * (eps(x, cond) - eps(x, empty)) + --from-file FROM_FILE + if specified, load prompts from this file + --config CONFIG path to config which constructs model + --ckpt CKPT path to checkpoint of model + --seed SEED the seed (for reproducible sampling) + --precision {full,autocast} + evaluate at this precision +``` +Note: The inference config for all v1 versions is designed to be used with EMA-only checkpoints. +For this reason `use_ema=False` is set in the configuration, otherwise the code will try to switch from +non-EMA to EMA weights. If you want to examine the effect of EMA vs no EMA, we provide "full" checkpoints +which contain both types of weights. For these, `use_ema=False` will load and use the non-EMA weights. + + +#### Diffusers Integration + +A simple way to download and sample Stable Diffusion is by using the [diffusers library](https://github.com/huggingface/diffusers/tree/main#new--stable-diffusion-is-now-fully-compatible-with-diffusers): +```py +# make sure you're logged in with `huggingface-cli login` +from torch import autocast +from diffusers import StableDiffusionPipeline + +pipe = StableDiffusionPipeline.from_pretrained( + "CompVis/stable-diffusion-v1-4", + use_auth_token=True +).to("cuda") + +prompt = "a photo of an astronaut riding a horse on mars" +with autocast("cuda"): + image = pipe(prompt)["sample"][0] + +image.save("astronaut_rides_horse.png") +``` + + +### Image Modification with Stable Diffusion + +By using a diffusion-denoising mechanism as first proposed by [SDEdit](https://arxiv.org/abs/2108.01073), the model can be used for different +tasks such as text-guided image-to-image translation and upscaling. Similar to the txt2img sampling script, +we provide a script to perform image modification with Stable Diffusion. + +The following describes an example where a rough sketch made in [Pinta](https://www.pinta-project.com/) is converted into a detailed artwork. +``` +python scripts/img2img.py --prompt "A fantasy landscape, trending on artstation" --init-img --strength 0.8 +``` +Here, strength is a value between 0.0 and 1.0, that controls the amount of noise that is added to the input image. +Values that approach 1.0 allow for lots of variations but will also produce images that are not semantically consistent with the input. See the following example. + +**Input** + +![sketch-in](assets/stable-samples/img2img/sketch-mountains-input.jpg) + +**Outputs** + +![out3](assets/stable-samples/img2img/mountains-3.png) +![out2](assets/stable-samples/img2img/mountains-2.png) + +This procedure can, for example, also be used to upscale samples from the base model. + + +## Comments + +- Our codebase for the diffusion models builds heavily on [OpenAI's ADM codebase](https://github.com/openai/guided-diffusion) +and [https://github.com/lucidrains/denoising-diffusion-pytorch](https://github.com/lucidrains/denoising-diffusion-pytorch). +Thanks for open-sourcing! + +- The implementation of the transformer encoder is from [x-transformers](https://github.com/lucidrains/x-transformers) by [lucidrains](https://github.com/lucidrains?tab=repositories). + + +## BibTeX + +``` +@misc{rombach2021highresolution, + title={High-Resolution Image Synthesis with Latent Diffusion Models}, + author={Robin Rombach and Andreas Blattmann and Dominik Lorenz and Patrick Esser and Björn Ommer}, + year={2021}, + eprint={2112.10752}, + archivePrefix={arXiv}, + primaryClass={cs.CV} +} +``` + diff --git a/src/somef/test/test_data/repositories/stable-diffusion/environment.yaml b/src/somef/test/test_data/repositories/stable-diffusion/environment.yaml new file mode 100644 index 00000000..f040d637 --- /dev/null +++ b/src/somef/test/test_data/repositories/stable-diffusion/environment.yaml @@ -0,0 +1,31 @@ +name: ldm +channels: + - pytorch + - defaults +dependencies: + - python=3.8.5 + - pip=20.3 + - cudatoolkit=11.3 + - pytorch=1.11.0 + - torchvision=0.12.0 + - numpy=1.19.2 + - pip: + - albumentations==0.4.3 + - diffusers + - opencv-python==4.1.2.30 + - pudb==2019.2 + - invisible-watermark + - imageio==2.9.0 + - imageio-ffmpeg==0.4.2 + - pytorch-lightning==1.4.2 + - omegaconf==2.1.1 + - test-tube>=0.7.5 + - streamlit>=0.73.1 + - einops==0.3.0 + - torch-fidelity==0.3.0 + - transformers==4.19.2 + - torchmetrics==0.6.0 + - kornia==0.6 + - -e git+https://github.com/CompVis/taming-transformers.git@master#egg=taming-transformers + - -e git+https://github.com/openai/CLIP.git@main#egg=clip + - -e . \ No newline at end of file From 8133a77268fe9babc386f9a9ce49a898cce1df84 Mon Sep 17 00:00:00 2001 From: Juanje Mendoza Date: Fri, 6 Feb 2026 15:46:08 +0100 Subject: [PATCH 06/27] small corrections in conda environment md. Fixes #489 --- docs/condaenvironment.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/condaenvironment.md b/docs/condaenvironment.md index 99a74dc4..40e50e6b 100644 --- a/docs/condaenvironment.md +++ b/docs/condaenvironment.md @@ -1,5 +1,3 @@ -# Metadata extracted from a Conda `environment.yml` file - The following metadata fields can be extracted from a Conda `environment.yml` or `environment.yaml` file. This file format is part of the Conda environment specification and is commonly used to declare software dependencies for reproducible environments. @@ -12,10 +10,10 @@ Only dependency information is mapped, since it is the only part of the Conda en | Software metadata category | SOMEF metadata JSON path | ENVIRONMENT.YML metadata file field | |-----------------------------|---------------------------------------|------------------------------| | has_package_file | has_package_file[i].result.value | URL of the `environment.yml` file | -| requirements - value | requirements[i].result.value | dependenciees | +| requirements - value | requirements[i].result.value | dependencies | | requirements - name | requirements[i].result.name | dependencies extract name | | requirements - version | requirements[i].result.version | dependencies extract version | -| requirements - dependency type | requirements[i].result.dependency_type | conda if depedencies or pip if dependencie/pip *(1)* | +| requirements - dependency type | requirements[i].result.dependency_type | conda if dependencies or pip if dependencies/pip *(1)* | --- From 26931796089588500fe6675681c1fa1a2ddd3a48 Mon Sep 17 00:00:00 2001 From: Juanje Mendoza Date: Mon, 9 Feb 2026 09:44:11 +0100 Subject: [PATCH 07/27] scikit learn to 1.5. Pyproject.toml and poetry.lock. Fixes #692 --- poetry.lock | 72 ++++++++++++++++++++++++-------------------------- pyproject.toml | 2 +- 2 files changed, 36 insertions(+), 38 deletions(-) diff --git a/poetry.lock b/poetry.lock index 84a91f82..d79e7b81 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3171,51 +3171,49 @@ files = [ [[package]] name = "scikit-learn" -version = "1.3.2" +version = "1.5.0" description = "A set of python modules for machine learning and data mining" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "scikit-learn-1.3.2.tar.gz", hash = "sha256:a2f54c76accc15a34bfb9066e6c7a56c1e7235dda5762b990792330b52ccfb05"}, - {file = "scikit_learn-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e326c0eb5cf4d6ba40f93776a20e9a7a69524c4db0757e7ce24ba222471ee8a1"}, - {file = "scikit_learn-1.3.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:535805c2a01ccb40ca4ab7d081d771aea67e535153e35a1fd99418fcedd1648a"}, - {file = "scikit_learn-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1215e5e58e9880b554b01187b8c9390bf4dc4692eedeaf542d3273f4785e342c"}, - {file = "scikit_learn-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ee107923a623b9f517754ea2f69ea3b62fc898a3641766cb7deb2f2ce450161"}, - {file = "scikit_learn-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:35a22e8015048c628ad099da9df5ab3004cdbf81edc75b396fd0cff8699ac58c"}, - {file = "scikit_learn-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6fb6bc98f234fda43163ddbe36df8bcde1d13ee176c6dc9b92bb7d3fc842eb66"}, - {file = "scikit_learn-1.3.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:18424efee518a1cde7b0b53a422cde2f6625197de6af36da0b57ec502f126157"}, - {file = "scikit_learn-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3271552a5eb16f208a6f7f617b8cc6d1f137b52c8a1ef8edf547db0259b2c9fb"}, - {file = "scikit_learn-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc4144a5004a676d5022b798d9e573b05139e77f271253a4703eed295bde0433"}, - {file = "scikit_learn-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:67f37d708f042a9b8d59551cf94d30431e01374e00dc2645fa186059c6c5d78b"}, - {file = "scikit_learn-1.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8db94cd8a2e038b37a80a04df8783e09caac77cbe052146432e67800e430c028"}, - {file = "scikit_learn-1.3.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:61a6efd384258789aa89415a410dcdb39a50e19d3d8410bd29be365bcdd512d5"}, - {file = "scikit_learn-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb06f8dce3f5ddc5dee1715a9b9f19f20d295bed8e3cd4fa51e1d050347de525"}, - {file = "scikit_learn-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b2de18d86f630d68fe1f87af690d451388bb186480afc719e5f770590c2ef6c"}, - {file = "scikit_learn-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:0402638c9a7c219ee52c94cbebc8fcb5eb9fe9c773717965c1f4185588ad3107"}, - {file = "scikit_learn-1.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a19f90f95ba93c1a7f7924906d0576a84da7f3b2282ac3bfb7a08a32801add93"}, - {file = "scikit_learn-1.3.2-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:b8692e395a03a60cd927125eef3a8e3424d86dde9b2370d544f0ea35f78a8073"}, - {file = "scikit_learn-1.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15e1e94cc23d04d39da797ee34236ce2375ddea158b10bee3c343647d615581d"}, - {file = "scikit_learn-1.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:785a2213086b7b1abf037aeadbbd6d67159feb3e30263434139c98425e3dcfcf"}, - {file = "scikit_learn-1.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:64381066f8aa63c2710e6b56edc9f0894cc7bf59bd71b8ce5613a4559b6145e0"}, - {file = "scikit_learn-1.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6c43290337f7a4b969d207e620658372ba3c1ffb611f8bc2b6f031dc5c6d1d03"}, - {file = "scikit_learn-1.3.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:dc9002fc200bed597d5d34e90c752b74df516d592db162f756cc52836b38fe0e"}, - {file = "scikit_learn-1.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d08ada33e955c54355d909b9c06a4789a729977f165b8bae6f225ff0a60ec4a"}, - {file = "scikit_learn-1.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:763f0ae4b79b0ff9cca0bf3716bcc9915bdacff3cebea15ec79652d1cc4fa5c9"}, - {file = "scikit_learn-1.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:ed932ea780517b00dae7431e031faae6b49b20eb6950918eb83bd043237950e0"}, + {file = "scikit_learn-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:12e40ac48555e6b551f0a0a5743cc94cc5a765c9513fe708e01f0aa001da2801"}, + {file = "scikit_learn-1.5.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f405c4dae288f5f6553b10c4ac9ea7754d5180ec11e296464adb5d6ac68b6ef5"}, + {file = "scikit_learn-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df8ccabbf583315f13160a4bb06037bde99ea7d8211a69787a6b7c5d4ebb6fc3"}, + {file = "scikit_learn-1.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c75ea812cd83b1385bbfa94ae971f0d80adb338a9523f6bbcb5e0b0381151d4"}, + {file = "scikit_learn-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:a90c5da84829a0b9b4bf00daf62754b2be741e66b5946911f5bdfaa869fcedd6"}, + {file = "scikit_learn-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a65af2d8a6cce4e163a7951a4cfbfa7fceb2d5c013a4b593686c7f16445cf9d"}, + {file = "scikit_learn-1.5.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:4c0c56c3005f2ec1db3787aeaabefa96256580678cec783986836fc64f8ff622"}, + {file = "scikit_learn-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f77547165c00625551e5c250cefa3f03f2fc92c5e18668abd90bfc4be2e0bff"}, + {file = "scikit_learn-1.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:118a8d229a41158c9f90093e46b3737120a165181a1b58c03461447aa4657415"}, + {file = "scikit_learn-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:a03b09f9f7f09ffe8c5efffe2e9de1196c696d811be6798ad5eddf323c6f4d40"}, + {file = "scikit_learn-1.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:460806030c666addee1f074788b3978329a5bfdc9b7d63e7aad3f6d45c67a210"}, + {file = "scikit_learn-1.5.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:1b94d6440603752b27842eda97f6395f570941857456c606eb1d638efdb38184"}, + {file = "scikit_learn-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d82c2e573f0f2f2f0be897e7a31fcf4e73869247738ab8c3ce7245549af58ab8"}, + {file = "scikit_learn-1.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3a10e1d9e834e84d05e468ec501a356226338778769317ee0b84043c0d8fb06"}, + {file = "scikit_learn-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:855fc5fa8ed9e4f08291203af3d3e5fbdc4737bd617a371559aaa2088166046e"}, + {file = "scikit_learn-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:40fb7d4a9a2db07e6e0cae4dc7bdbb8fada17043bac24104d8165e10e4cff1a2"}, + {file = "scikit_learn-1.5.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:47132440050b1c5beb95f8ba0b2402bbd9057ce96ec0ba86f2f445dd4f34df67"}, + {file = "scikit_learn-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:174beb56e3e881c90424e21f576fa69c4ffcf5174632a79ab4461c4c960315ac"}, + {file = "scikit_learn-1.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261fe334ca48f09ed64b8fae13f9b46cc43ac5f580c4a605cbb0a517456c8f71"}, + {file = "scikit_learn-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:057b991ac64b3e75c9c04b5f9395eaf19a6179244c089afdebaad98264bff37c"}, + {file = "scikit_learn-1.5.0.tar.gz", hash = "sha256:789e3db01c750ed6d496fa2db7d50637857b451e57bcae863bff707c1247bef7"}, ] [package.dependencies] -joblib = ">=1.1.1" -numpy = ">=1.17.3,<2.0" -scipy = ">=1.5.0" -threadpoolctl = ">=2.0.0" +joblib = ">=1.2.0" +numpy = ">=1.19.5" +scipy = ">=1.6.0" +threadpoolctl = ">=3.1.0" [package.extras] -benchmark = ["matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "pandas (>=1.0.5)"] -docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)", "sphinx (>=6.0.0)", "sphinx-copybutton (>=0.5.2)", "sphinx-gallery (>=0.10.1)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] -examples = ["matplotlib (>=3.1.3)", "pandas (>=1.0.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)"] -tests = ["black (>=23.3.0)", "matplotlib (>=3.1.3)", "mypy (>=1.3)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.0.272)", "scikit-image (>=0.16.2)"] +benchmark = ["matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "pandas (>=1.1.5)"] +build = ["cython (>=3.0.10)", "meson-python (>=0.15.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "polars (>=0.20.23)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=6.0.0)", "sphinx-copybutton (>=0.5.2)", "sphinx-gallery (>=0.15.0)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] +examples = ["matplotlib (>=3.3.4)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)"] +install = ["joblib (>=1.2.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)", "threadpoolctl (>=3.1.0)"] +maintenance = ["conda-lock (==2.5.6)"] +tests = ["black (>=24.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.9)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.20.23)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.2.1)", "scikit-image (>=0.17.2)"] [[package]] name = "scipy" @@ -3639,4 +3637,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" python-versions = ">=3.9,<=3.13" -content-hash = "b53a2bfce034a8834f3f837e3c1c34064cd2b3f4ef46dcc806c41382192c5faa" +content-hash = "71feb732b8828f64661ff0f0703fd91a1eeff39752dfb482ef81c30891412d2f" diff --git a/pyproject.toml b/pyproject.toml index 39348d37..8141235c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,7 +41,7 @@ homepage = "https://github.com/KnowledgeCaptureAndDiscovery/somef" nbformat = "^5.9.2" markdown = "^3.5.2" requests = "^2.31.0" - scikit-learn = "1.3.2" + scikit-learn = "1.5.0" pyyaml = "^6.0.2" lxml = "^5.1.0" tomli = "^2.0.1" From 3d3bd1fb9f363e46402b267886f116094a66ab0a Mon Sep 17 00:00:00 2001 From: Juanje Mendoza Date: Mon, 9 Feb 2026 10:17:27 +0100 Subject: [PATCH 08/27] After upgrading scikit-learn to 1.5, the test was updated to avoid fails in result ordering. --- src/somef/test/test_supervised_classification.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/somef/test/test_supervised_classification.py b/src/somef/test/test_supervised_classification.py index 284daae1..357ee704 100644 --- a/src/somef/test/test_supervised_classification.py +++ b/src/somef/test/test_supervised_classification.py @@ -17,8 +17,14 @@ def test_run_category_classification(self): text = data_file.read() result = supervised_classification.run_category_classification(text, 0.8, Result()) # self.assertEqual(len(result.results[constants.CAT_APPLICATION_DOMAIN]), 1) - cat_result = result.results[constants.CAT_APPLICATION_DOMAIN][0] - self.assertEqual(cat_result[constants.PROP_RESULT]['value'], "Semantic web") + # cat_result = result.results[constants.CAT_APPLICATION_DOMAIN][0] + # self.assertEqual(cat_result[constants.PROP_RESULT]['value'], "Semantic web") + values = [ + r[constants.PROP_RESULT]['value'] + for r in result.results[constants.CAT_APPLICATION_DOMAIN] + ] + assert "Semantic web" in values + def test_threshold_old_vs_new(self): """This test shows the difference between the old and new code using a fake model: the old code adds a result, the new code doesn’t.""" From d5212eca016d5a1e85b1515b56f61590410b7c11 Mon Sep 17 00:00:00 2001 From: Juanje Mendoza Date: Wed, 11 Feb 2026 11:49:44 +0100 Subject: [PATCH 09/27] removing duplicate information. Fixes #833 --- src/somef/export/json_export.py | 139 ++++++- src/somef/somef_cli.py | 22 +- src/somef/test/test_JSON_export.py | 85 ++++- .../repositories/somef_repo/README.md | 361 ++++++++++++++++++ 4 files changed, 598 insertions(+), 9 deletions(-) create mode 100644 src/somef/test/test_data/repositories/somef_repo/README.md diff --git a/src/somef/export/json_export.py b/src/somef/export/json_export.py index bb97ecc6..07047303 100644 --- a/src/somef/export/json_export.py +++ b/src/somef/export/json_export.py @@ -1,11 +1,13 @@ import json import re from datetime import datetime +from urllib.parse import urlparse, urlunparse +from typing import List, Dict import yaml from dateutil import parser as date_parser from ..utils import constants from ..regular_expressions import detect_license_spdx,extract_scholarly_article_natural, extract_scholarly_article_properties -from typing import List, Dict + def save_json_output(repo_data, out_path, missing, pretty=False): """ @@ -320,7 +322,7 @@ def format_date(date_string): if codemeta_authors: codemeta_output[constants.CAT_CODEMETA_AUTHOR] = codemeta_authors - + if constants.CAT_AUTHORS in repo_data: if "author" not in codemeta_output: codemeta_output[constants.CAT_CODEMETA_AUTHOR] = [] @@ -328,6 +330,7 @@ def format_date(date_string): # print('-------AUTHORES') # print(repo_data[constants.CAT_AUTHORS]) for author in repo_data[constants.CAT_AUTHORS]: + print(author) value_author = author[constants.PROP_RESULT].get(constants.PROP_VALUE) name_author = author[constants.PROP_RESULT].get(constants.PROP_NAME) if value_author and re.search(constants.REGEXP_LTD_INC, value_author, re.IGNORECASE): @@ -664,3 +667,135 @@ def map_requirement_type(t): return "SoftwareSystem" return "SoftwareApplication" + +""" +This part of code implements the post processing and unification logic applied to the +raw JSON extracted by SOMEF. Different extractors may produce duplicated or +slightly divergent entries for the same underlying resource (e.g., documentation +URLs, identifiers, authors). The functions below normalize values, detect +equivalent items, and merge them while preserving all available information. + +Key ideas: +- Canonicalize simple URL values to avoid redundant entries. +- Never canonicalize structured objects (e.g., Release, Agent). +- Merge complementary fields extracted by different techniques. +- Combine techniques and sources without losing provenance. +""" + +def canonicalize_value(value, value_type): + """Canonicalization for SOMEF: + - If URL points to a file (has extension), keep full path (no unification) + - Otherwise, unify to scheme://domain (documentation, badges, pages) + - Always remove query, fragment, trailing slash + """ + if value_type == "Release": + return value + + if value_type == "Url": + parsed = urlparse(value) + + # Remove query and fragment + path = parsed.path.rstrip('/') + + # Detect if last segment has a file extension + last_segment = path.split('/')[-1] + if '.' in last_segment: + # It's a file → do NOT unify + clean_path = path + return urlunparse((parsed.scheme, parsed.netloc, clean_path, '', '', '')) + + # It's a directory/page → unify to domain + return f"{parsed.scheme}://{parsed.netloc}" + + if isinstance(value, str): + return value.strip() + + return value + + +def normalize_type(result): + value = result.get("value", "") + rtype = result.get("type", "") + + # Only normalize if the object ONLY has type + value + # (i.e., it's a simple URL, not a structured object like Release) + if isinstance(value, str) and value.startswith("http"): + if set(result.keys()) <= {"type", "value"}: + return "Url" + + return rtype + + +def choose_more_general(a, b): + """ + If both values are strings and one contains the other, return the shorter one. + Otherwise, return 'a'. + """ + if isinstance(a, str) and isinstance(b, str): + if a in b: + return a + if b in a: + return b + return a + + +def unify_results(repo_data: dict) -> dict: + print("Unifying results...") + unified_data = {} + + for category, items in repo_data.items(): + if not isinstance(items, list): + unified_data[category] = items + continue + + seen = {} + + for item in items: + result = item.get("result", {}) + normalized_type = normalize_type(result) + result["type"] = normalized_type + value = result.get("value") + value_type = result.get("type") + + canonical = canonicalize_value(value, value_type) + + key = str(canonical) + + if key in seen: + existing = seen[key] + + # If types match, merge normally + existing["result"]["value"] = choose_more_general( + existing["result"]["value"], value + ) + + # merge other result fields because different techniques might have extracted different information + # (e.g., email in authors extracted by file exploration or code parser. + for field, new_val in result.items(): + if field in ("value", "type"): + continue + old_val = existing["result"].get(field) + if old_val in (None, "", []): + existing["result"][field] = new_val + + # join techniques + t1 = existing.get("technique", []) + t2 = item.get("technique", []) + if not isinstance(t1, list): t1 = [t1] + if not isinstance(t2, list): t2 = [t2] + existing["technique"] = list(set(t1 + t2)) + + # join sources + s1 = existing.get("source", []) + s2 = item.get("source", []) + if s1 and not isinstance(s1, list): s1 = [s1] + if s2 and not isinstance(s2, list): s2 = [s2] + if s1 or s2: + existing["source"] = list(set(s1 + s2)) + + else: + seen[key] = item + + unified_data[category] = list(seen.values()) + + return unified_data diff --git a/src/somef/somef_cli.py b/src/somef/somef_cli.py index 75db1ed1..466877c8 100644 --- a/src/somef/somef_cli.py +++ b/src/somef/somef_cli.py @@ -282,19 +282,24 @@ def run_cli(*, ignore_github_metadata=ignore_github_metadata, readme_only=readme_only, keep_tmp=keep_tmp, ignore_test_folder=ignore_test_folder, requirements_mode=requirements_mode, additional_info=additional_info) + if hasattr(repo_data, "get_json"): + repo_data = repo_data.get_json() + + repo_data = json_export.unify_results(repo_data.results) + if output is not None: output = output.replace(".json","") output = output + "_" + encoded_url + ".json" - json_export.save_json_output(repo_data.results, output, missing, pretty=pretty) + json_export.save_json_output(repo_data, output, missing, pretty=pretty) if codemeta_out is not None: codemeta_out = codemeta_out.replace(".json", "") codemeta_out = codemeta_out + "_" + encoded_url + ".json" - json_export.save_codemeta_output(repo_data.results, codemeta_out, pretty=pretty, requirements_mode= requirements_mode) + json_export.save_codemeta_output(repo_data, codemeta_out, pretty=pretty, requirements_mode= requirements_mode) if google_codemeta_out is not None: gc_out = google_codemeta_out.replace(".json", "") gc_out = gc_out + "_" + encoded_url + ".json" google_codemeta_export.save_google_codemeta_output( - repo_data.results, + repo_data, gc_out, pretty=pretty, requirements_mode=requirements_mode @@ -315,13 +320,18 @@ def run_cli(*, else: repo_data = cli_get_data(threshold=threshold, ignore_classifiers=ignore_classifiers, doc_src=doc_src, keep_tmp=keep_tmp, ignore_test_folder=ignore_test_folder, additional_info=additional_info) + + if hasattr(repo_data, "get_json"): + repo_data = repo_data.get_json() + + repo_data = json_export.unify_results(repo_data.results) if output is not None: - json_export.save_json_output(repo_data.results, output, missing, pretty=pretty) + json_export.save_json_output(repo_data, output, missing, pretty=pretty) if codemeta_out is not None: - json_export.save_codemeta_output(repo_data.results, codemeta_out, pretty=pretty, requirements_mode=requirements_mode) + json_export.save_codemeta_output(repo_data, codemeta_out, pretty=pretty, requirements_mode=requirements_mode) if google_codemeta_out is not None: - google_codemeta_export.save_google_codemeta_output(repo_data.results, google_codemeta_out, pretty=pretty, requirements_mode=requirements_mode) + google_codemeta_export.save_google_codemeta_output(repo_data, google_codemeta_out, pretty=pretty, requirements_mode=requirements_mode) if graph_out is not None: logging.info("Generating triples...") data_graph = DataGraph() diff --git a/src/somef/test/test_JSON_export.py b/src/somef/test/test_JSON_export.py index 16d6eb69..f2b569e3 100644 --- a/src/somef/test/test_JSON_export.py +++ b/src/somef/test/test_JSON_export.py @@ -203,6 +203,7 @@ def test_issue_745(self): data = text_file.read() text_file.close() json_content = json.loads(data) + licenses = json_content["license"] # print('---------------------------') @@ -500,4 +501,86 @@ def test_issue_723(self): os.remove(test_data_path + "test_issue_723.json") - \ No newline at end of file + + def test_unify_json(self): + """ + Checks that duplicated requirement entries extracted by different techniques + are unified into a single item, preserving all complementary information + (techniques, sources, and result fields). + """ + + output_path = test_data_path + 'test_widoco_unify.json' + + somef_cli.run_cli( threshold=0.8, + local_repo=test_data_repositories + "widoco", + doc_src=None, + in_file=None, + output=output_path, + graph_out=None, + graph_format="turtle", + codemeta_out=None, + pretty=True, + missing=False, + readme_only=False) + + + with open(output_path, "r") as f: + json_content = json.load(f) + + requirements = json_content.get(constants.CAT_REQUIREMENTS, []) + + unified_reqs = [ r for r in requirements if "You will need Java 1.8" in r["result"].get("value", "") ] + assert unified_reqs, "There should be at least one unified Java requirement entry" + + req = unified_reqs[0] + assert set(req["technique"]) == {"code_parser", "header_analysis"},"Techniques should be merged from both extractors" + + os.remove(test_data_path + "test_widoco_unify.json") + + + def test_unify_json_2(self): + """ + Checks that duplicated requirement entries extracted by different techniques + are unified into a single item, preserving all complementary information + (techniques, sources, and result fields). + """ + + output_path = test_data_path + 'test_somef_unify.json' + + somef_cli.run_cli( threshold=0.8, + local_repo=test_data_repositories + "somef_repo", + doc_src=None, + in_file=None, + output=output_path, + graph_out=None, + graph_format="turtle", + codemeta_out=None, + pretty=True, + missing=False, + readme_only=False) + + + with open(output_path, "r") as f: + json_content = json.load(f) + + documentation = json_content.get(constants.CAT_DOCUMENTATION, []) + + rtd_items = [ + d for d in documentation + if d["result"].get("type") == "Url" + and d["result"].get("format") == "readthedocs" + ] + + assert len(rtd_items) == 1, "There should be exactly one unified ReadTheDocs documentation entry" + + rtd = rtd_items[0] + + assert rtd["result"]["value"] == "https://somef.readthedocs.io/", "The unified ReadTheDocs URL must be canonical" + + for d in documentation: + if d["result"].get("type") == "Url": + val = d["result"].get("value", "") + assert val == "https://somef.readthedocs.io/", f"Unexpected non canonical ReadTheDocs URL found: {val}" + + + os.remove(test_data_path + "test_somef_unify.json") \ No newline at end of file diff --git a/src/somef/test/test_data/repositories/somef_repo/README.md b/src/somef/test/test_data/repositories/somef_repo/README.md new file mode 100644 index 00000000..a4a35a52 --- /dev/null +++ b/src/somef/test/test_data/repositories/somef_repo/README.md @@ -0,0 +1,361 @@ +# Software Metadata Extraction Framework (SOMEF) + +[![Documentation Status](https://readthedocs.org/projects/somef/badge/?version=latest)](https://somef.readthedocs.io/en/latest/?badge=latest) +[![Python](https://img.shields.io/pypi/pyversions/somef.svg?style=plastic)](https://badge.fury.io/py/somef) [![PyPI](https://badge.fury.io/py/somef.svg)](https://badge.fury.io/py/somef) [![DOI](https://zenodo.org/badge/190487675.svg)](https://zenodo.org/badge/latestdoi/190487675) [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/KnowledgeCaptureAndDiscovery/somef/HEAD?filepath=notebook%2FSOMEF%20Usage%20Example.ipynb) [![Project Status: Active – The project has reached a stable, usable state and is being actively developed.](https://www.repostatus.org/badges/latest/active.svg)](https://www.repostatus.org/#active) + +logo + +A command line interface for automatically extracting relevant metadata from code repositories (readme, configuration files, documentation, etc.). + +**Demo:** See a [demo running somef as a service](https://somef.linkeddata.es), through the [SOMEF-Vider tool](https://github.com/SoftwareUnderstanding/SOMEF-Vider/). + +**Authors:** Daniel Garijo, Allen Mao, Miguel Ángel García Delgado, Haripriya Dharmala, Vedant Diwanji, Jiaying Wang, Aidan Kelley, Jenifer Tabita Ciuciu-Kiss, Luca Angheluta and Juanje Mendoza. + +## Features + +Given a readme file (or a GitHub/Gitlab repository) SOMEF will extract the following categories (if present), listed in alphabetical order: + +- **Acknowledgement**: Text acknowledging funding sources or contributors +- **Application domain**: The application domain of the repository. Current supported domains include: Astrophysics, Audio, Computer vision, Graphs, Natural language processing, Reinforcement learning, Semantc web, Sequential. Domains are not mutually exclusive. These domains have been extracted from [awesome lists](https://github.com/topics/awesome-list) and [Papers with code](https://paperswithcode.com/). Find more information in our [documentation](https://somef.readthedocs.io/en/latest/) +- **Authors**: Person(s) or organization(s) responsible for the project. We recognize the following properties: + - Name: name of the author (including last name) + - Given name: First name of an author + - Family name: Last name of an author + - Email: email of author + - URL: website or ORCID associated with the author +- **Build file**: Build file(s) of the project. For example, files used to create a Docker image for the target software, package files, etc. +- **Citation**: Preferred citation as the authors have stated in their readme file. SOMEF recognizes Bibtex, Citation File Format files and other means by which authors cite their papers (e.g., by in-text citation). We aim to recognize the following properties: + - Title: Title of the publication + - Author: list of author names in the publication + - URL: URL of the publication + - DOI: Digital object identifier of the publication + - Date published +- **Code of conduct**: Link to the code of conduct of the project +- **Code repository**: Link to the GitHub/GitLab repository used for the extraction +- **Contact**: Contact person responsible for maintaining a software component +- **Continuous integration**: Link to continuous integration service(s) +- **Contribution guidelines**: Text indicating how to contribute to this code repository +- **Contributors**: Contributors to a software component +- **Creation date**: Date when the repository was created +- **Date updated**: Date of last release. +- **Description**: A description of what the software does +- **Documentation**: Where to find additional documentation about a software component +- **Download URL**: URL where to download the target software (typically the installer, package or a tarball to a stable version) +- **Executable examples**: Jupyter notebooks ready for execution (e.g., files, or through myBinder/colab links) +- **FAQ**: Frequently asked questions about a software component +- **Forks count**: Number of forks of the project +- **Forks url**: Links to forks made of the project +- **Full name**: Name + owner (owner/name) +- **Full title**: If the repository is a short name, we will attempt to extract the longer version of the repository name +- **Identifier**: Identifier associated with the software (if any), such as Digital Object Identifiers and Software Heritage identifiers (SWH). DOIs associated with publications will also be detected. +- **Images**: Images used to illustrate the software component +- **Installation instructions**: A set of instructions that indicate how to install a target repository +- **Invocation**: Execution command(s) needed to run a scientific software component +- **Issue tracker**: Link where to open issues for the target repository +- **Keywords**: set of terms used to commonly identify a software component +- **License**: License and usage terms of a software component +- **Logo**: Main logo used to represent the target software component +- **Name**: Name identifying a software component +- **Ontologies**: URL and path to the ontology files present in the repository +- **Owner**: Name and type of the user or organization in charge of the repository +- **Package distribution**: Links to package sites like pypi in case the repository has a package available. +- **Package files**: Links to package files used to wrap the project in a package. +- **Programming languages**: Languages used in the repository +- **Related papers**: URL to possible related papers within the repository stated within the readme file (from Arxiv) +- **Releases** (GitHub only): Pointer to the available versions of a software component. For each release, somef will track the following properties: + - Description: Release notes + - Author: Agent responsible of creating the release + - Name: Name of the release + - Tag: version number of the release + - Date of publication + - Date of creation + - Link to the html page of the release + - Id of the release + - Link to the tarball zip and code of the release +- **Repository status**: Repository status as it is described in [repostatus.org](https://www.repostatus.org/). +- **Requirements**: Pre-requisites and dependencies needed to execute a software component +- **Run**: Running instructions of a software component. It may be wider than the `invocation` category, as it may include several steps and explanations. +- **Runtime platform**: specifies runtime platform or script interpreter dependencies required to run the project.. +- **Script files**: Bash script files contained in the repository +- **Stargazers count**: Total number of stargazers of the project +- **Support**: Guidelines and links of where to obtain support for a software component +- **Support channels**: Help channels one can use to get support about the target software component +- **Type**: type of software (command line application, notebook, ontology, scientific workflow, etc.) +- **Usage examples**: Assumptions and considerations recorded by the authors when executing a software component, or examples on how to use it +- **Workflows**: URL and path to the computational workflow files present in the repository + +We use different supervised classifiers, header analysis, regular expressions, the GitHub/Gitlab API to retrieve all these fields (more than one technique may be used for each field) and language specific metadata parsers (e.g., for package files). Each extraction records its provenance, with the confidence and technique used on each step. For more information check the [output format description](https://somef.readthedocs.io/en/latest/output/) + +## Documentation + +See full documentation at [https://somef.readthedocs.io/en/latest/](https://somef.readthedocs.io/en/latest/) + +## Cite SOMEF: + +Journal publication (preferred): + +``` +@article{10.1162/qss_a_00167, + author = {Kelley, Aidan and Garijo, Daniel}, + title = "{A Framework for Creating Knowledge Graphs of Scientific Software Metadata}", + journal = {Quantitative Science Studies}, + pages = {1-37}, + year = {2021}, + month = {11}, + issn = {2641-3337}, + doi = {10.1162/qss_a_00167}, + url = {https://doi.org/10.1162/qss_a_00167}, + eprint = {https://direct.mit.edu/qss/article-pdf/doi/10.1162/qss\_a\_00167/1971225/qss\_a\_00167.pdf}, +} +``` + +Conference publication (first): + +``` +@INPROCEEDINGS{9006447, +author={A. {Mao} and D. {Garijo} and S. {Fakhraei}}, +booktitle={2019 IEEE International Conference on Big Data (Big Data)}, +title={SoMEF: A Framework for Capturing Scientific Software Metadata from its Documentation}, +year={2019}, +doi={10.1109/BigData47090.2019.9006447}, +url={http://dgarijo.com/papers/SoMEF.pdf}, +pages={3032-3037} +} +``` + +## Requirements + +- Python 3.9 or Python 3.10 (default version support) + +SOMEF has been tested on Unix, MacOS and Windows Microsoft operating systems. + +If you face any issues when installing SOMEF, please make sure you have installed the following packages: `build-essential`, `libssl-dev`, `libffi-dev` and `python3-dev`. + +## Install from Pypi + +SOMEF [is available in Pypi!](https://pypi.org/project/somef/) To install it just type: + +``` +pip install somef +``` + +## Install from GitHub + +To run SOMEF, please follow the next steps: + +Clone this GitHub repository + +``` +git clone https://github.com/KnowledgeCaptureAndDiscovery/somef.git +``` + +We use [Poetry](https://python-poetry.org/) to ensure library compatibility. It can be installed as follows: + +``` +curl -sSL https://install.python-poetry.org | python3 - +``` + +This option is recommended over installing Poetry with pip install. + +Now Poetry will handle the installation of SOMEF and all its dependencies configured in the `toml` file. + +To test the correct installation of poetry run (poetry version `> 2.0.0`): + +``` +poetry --version +``` + +Install somef and all their dependencies. + +``` +cd /somef +poetry install +``` + +Now we need to access our virtual environment, to do so you can run the following command: + +```bash +poetry env activate +``` +If the environment is not active, paste the command shown when `poetry env activate` is run, typically something like the command below: + +```bash +source /path_to_env/ENV_NAME/bin/activate +``` + +To learn more about poetry environment management, visit their official documentation [here](https://python-poetry.org/docs/managing-environments/). + +Test the SOMEF installation run: + +```bash +somef --help +``` + +If everything goes fine, you should see: + +```bash +Usage: somef [OPTIONS] COMMAND [ARGS]... + +Options: + -h, --help Show this message and exit. + +Commands: + configure Configure credentials + describe Running the Command Line Interface + version Show somef version. +``` + +## Installing through Docker + +We provide a Docker image with SOMEF already installed. To run through Docker, you may build the Dockerfile provided in the repository by running: + +```bash +docker build -t somef . +``` + +Or just use the Docker image already built in [DockerHub](https://hub.docker.com/r/kcapd/somef): + +```bash +docker pull kcapd/somef +``` + +Then, to run your image just type: + +```bash +docker run --rm -it kcapd/somef +``` + +And you will be ready to use SOMEF (see section below). If you want to have access to the results we recommend [mounting a volume](https://docs.docker.com/storage/volumes/). For example, the following command will mount the current directory as the `out` folder in the Docker image: + +```bash +docker run -it --rm -v $PWD/:/out kcapd/somef +``` + +If you move any files produced by somef into `/out`, then you will be able to see them in your current directory. + +## Configure + +Before running SOMEF for the first time, you must **configure** it appropriately (you only need to do this once). Run: + +```bash +somef configure +``` + +And you will be asked to provide the following: + +- A GitHub authentication token [**optional, leave blank if not used**], which SOMEF uses to retrieve metadata from GitHub. If you don't include an authentication token, you can still use SOMEF. However, you may be limited to a series of requests per hour. For more information, see [https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line](https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line) +- The path to the trained classifiers (pickle files). If you have your own classifiers, you can provide them here. Otherwise, you can leave it blank + +If you want somef to be automatically configured (without GitHUb authentication key and using the default classifiers) just type: + +```bash +somef configure -a +``` + +For showing help about the available options, run: + +```bash +somef configure --help +``` + +Which displays: + +```bash +Usage: somef configure [OPTIONS] + + Configure GitHub credentials and classifiers file path + +Options: + -a, --auto Automatically configure SOMEF + -h, --help Show this message and exit. +``` + +### Updating SOMEF + +If you update SOMEF to a newer version, we recommend you `configure` again the library (by running `somef configure`). The rationale is that different versions may rely on classifiers which may be stored in a different path. + +## Usage + +```bash +$ somef describe --help + SOMEF Command Line Interface +Usage: somef describe [OPTIONS] + + Running the Command Line Interface + +Options: + -t, --threshold FLOAT Threshold to classify the text [required] + Input: [mutually_exclusive, required] + -r, --repo_url URL Github/Gitlab Repository URL + -d, --doc_src PATH Path to the README file source + -i, --in_file PATH A file of newline separated links to GitHub/ + Gitlab repositories + + Output: [required_any] + -o, --output PATH Path to the output file. If supplied, the + output will be in JSON + + -c, --codemeta_out PATH Path to an output codemeta file + -g, --graph_out PATH Path to the output Knowledge Graph export + file. If supplied, the output will be a + Knowledge Graph, in the format given in the + --format option chosen (turtle, json-ld) + + -f, --graph_format [turtle|json-ld] + If the --graph_out option is given, this is + the format that the graph will be stored in + + -p, --pretty Pretty print the JSON output file so that it + is easy to compare to another JSON output + file. + + -m, --missing The JSON will include a field + somef_missing_categories to report with the + missing metadata fields that SOMEF was not + able to find. + + -kt, --keep_tmp PATH SOMEF will NOT delete the temporary folder + where files are stored for analysis. Files + will be stored at the + desired path + + -all, --requirements_all Export all detected requirements, including + text and libraries (default). + + -v, --requirements_v Export only requirements from structured + sources (pom.xml, requirements.txt, etc.) + + -h, --help Show this message and exit. +``` + +## Usage example: + +The following command extracts all metadata available from [https://github.com/dgarijo/Widoco/](https://github.com/dgarijo/Widoco/). + +```bash +somef describe -r https://github.com/dgarijo/Widoco/ -o test.json -t 0.8 +``` + +Try SOMEF in Binder with our sample notebook: [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/KnowledgeCaptureAndDiscovery/somef/HEAD?filepath=notebook%2FSOMEF%20Usage%20Example.ipynb) + +## Contribute: + +If you want to contribute with a pull request, please do so by submitting it to the `dev` branch. + +## Next features: + +To see upcoming features, please have a look at our [open issues](https://github.com/KnowledgeCaptureAndDiscovery/somef/issues) and [milestones](https://github.com/KnowledgeCaptureAndDiscovery/somef/milestones) + +## Extending SOMEF categories: + +To run a classifier with an additional category or remove an existing one, a corresponding path entry in the config.json should be provided and the category type should be added/removed in the category variable in `cli.py`. + +## Metadata Support + +SOMEF supports the extraction and analysis of metadata in package files of several programming languages. Current support includes: `setup.py` and `pyproject.toml` for Python, `pom.xml` for Java, `.gemspec` for Ruby, `DESCRIPTION` for R, `bower.json` for JavaScript, HTML or CSS, `.cabal` for Haskell, `cargo.toml` for RUST, `composer` for PHP, `.juliaProject.toml` for Julia , `AUTHORS`, `codemeta.json`, and `citation.cff` +This includes identifying dependencies, runtime requirements, and development tools specified in project configuration files. + +## Limitations + +SOMEF is designed to work primarily with repositories written in English. +Repositories in other languages may not be processed as effectively, and results could be incomplete or less accurate. \ No newline at end of file From 362ca3acbf8d2d74606034cc60c6ad4e968188d7 Mon Sep 17 00:00:00 2001 From: Juanje Mendoza Date: Wed, 11 Feb 2026 15:30:47 +0100 Subject: [PATCH 10/27] try test failed in last PR. --- src/somef/test/test_JSON_export.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/somef/test/test_JSON_export.py b/src/somef/test/test_JSON_export.py index f2b569e3..6244eba6 100644 --- a/src/somef/test/test_JSON_export.py +++ b/src/somef/test/test_JSON_export.py @@ -512,7 +512,7 @@ def test_unify_json(self): output_path = test_data_path + 'test_widoco_unify.json' somef_cli.run_cli( threshold=0.8, - local_repo=test_data_repositories + "widoco", + local_repo=test_data_repositories + "Widoco", doc_src=None, in_file=None, output=output_path, @@ -528,6 +528,7 @@ def test_unify_json(self): json_content = json.load(f) requirements = json_content.get(constants.CAT_REQUIREMENTS, []) + print(json.dumps(requirements, indent=2)) unified_reqs = [ r for r in requirements if "You will need Java 1.8" in r["result"].get("value", "") ] assert unified_reqs, "There should be at least one unified Java requirement entry" From 5be314f798e2cbfc3075ccd87c00eb373c1ff83a Mon Sep 17 00:00:00 2001 From: Juanje Mendoza Date: Fri, 20 Feb 2026 09:46:05 +0100 Subject: [PATCH 11/27] codemeta keywords as array instead of string --- src/somef/export/json_export.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/somef/export/json_export.py b/src/somef/export/json_export.py index 07047303..76ac0020 100644 --- a/src/somef/export/json_export.py +++ b/src/somef/export/json_export.py @@ -178,7 +178,14 @@ def format_date(date_string): if constants.CAT_LOGO in repo_data: codemeta_output[constants.CAT_CODEMETA_LOGO] = repo_data[constants.CAT_LOGO][0][constants.PROP_RESULT][constants.PROP_VALUE] if constants.CAT_KEYWORDS in repo_data: - codemeta_output[constants.CAT_CODEMETA_KEYWORDS] = repo_data[constants.CAT_KEYWORDS][0][constants.PROP_RESULT][constants.PROP_VALUE] + # codemeta_output[constants.CAT_CODEMETA_KEYWORDS] = repo_data[constants.CAT_KEYWORDS][0][constants.PROP_RESULT][constants.PROP_VALUE] + codemeta_output[constants.CAT_CODEMETA_KEYWORDS] = [] + + for key in repo_data[constants.CAT_KEYWORDS]: + key_value = key[constants.PROP_RESULT][constants.PROP_VALUE] + if key_value not in codemeta_output[constants.CAT_CODEMETA_KEYWORDS]: + codemeta_output[constants.CAT_CODEMETA_KEYWORDS].append(key_value) + if constants.CAT_PROGRAMMING_LANGUAGES in repo_data: # Calculate the total code size of all the programming languages codemeta_output[constants.CAT_CODEMETA_PROGRAMMINGLANGUAGE] = [] @@ -330,7 +337,6 @@ def format_date(date_string): # print('-------AUTHORES') # print(repo_data[constants.CAT_AUTHORS]) for author in repo_data[constants.CAT_AUTHORS]: - print(author) value_author = author[constants.PROP_RESULT].get(constants.PROP_VALUE) name_author = author[constants.PROP_RESULT].get(constants.PROP_NAME) if value_author and re.search(constants.REGEXP_LTD_INC, value_author, re.IGNORECASE): From 3597acb66f853e1e45373e38893cf70f761faf73 Mon Sep 17 00:00:00 2001 From: Juanje Mendoza Date: Tue, 24 Feb 2026 09:12:11 +0100 Subject: [PATCH 12/27] solve problem merging structured and non structured requirements in codemeta. Fixes #891 --- src/somef/export/json_export.py | 26 ++++- src/somef/parser/conda_environment_parser.py | 42 ++++--- src/somef/test/test_codemeta_export.py | 104 +++++++++++++++++- .../repositories/somef_repo/pyproject.toml | 55 +++++++++ 4 files changed, 203 insertions(+), 24 deletions(-) create mode 100644 src/somef/test/test_data/repositories/somef_repo/pyproject.toml diff --git a/src/somef/export/json_export.py b/src/somef/export/json_export.py index 76ac0020..28fe2f30 100644 --- a/src/somef/export/json_export.py +++ b/src/somef/export/json_export.py @@ -210,7 +210,7 @@ def format_date(date_string): codemeta_output[constants.CAT_CODEMETA_PROGRAMMINGLANGUAGE].append(value) if constants.CAT_REQUIREMENTS in repo_data: - structured_sources = ["pom.xml", "requirements.txt", "setup.py", "environment.yml"] + structured_sources = ["pom.xml", "requirements.txt", "setup.py", "environment.yml", "pyproject.toml"] code_parser_requirements = [] seen_structured = set() @@ -220,7 +220,10 @@ def format_date(date_string): if any(src in source for src in structured_sources): name = x[constants.PROP_RESULT].get(constants.PROP_NAME) or x[constants.PROP_RESULT].get(constants.PROP_VALUE) version = x[constants.PROP_RESULT].get(constants.PROP_VERSION) - key = f"{name.strip()}|{version.strip() if version else ''}" + # key = f"{name.strip()}|{version.strip() if version else ''}" + + key = name.strip().lower() + if key not in seen_structured: entry = {"name": name.strip()} req_type = x[constants.PROP_RESULT].get("type") @@ -239,16 +242,31 @@ def format_date(date_string): and x.get("source") is not None and any(src in x["source"] for src in structured_sources) ): - value = x[constants.PROP_RESULT].get(constants.PROP_VALUE, "").strip().replace("\n", " ") + result = x.get(constants.PROP_RESULT, {}) + req_type = result.get("type", "") + if req_type in ("Url", "Text_excerpt"): + continue + + value = result.get(constants.PROP_VALUE, "").strip().replace("\n", " ") + # value = x[constants.PROP_RESULT].get(constants.PROP_VALUE, "").strip().replace("\n", " ") normalized = " ".join(value.split()) if normalized not in seen_text: other_requirements.append(value) seen_text.add(normalized) + # if requirements_mode == "v": + # codemeta_output[constants.CAT_CODEMETA_SOFTWAREREQUIREMENTS] = code_parser_requirements + # else: + # codemeta_output[constants.CAT_CODEMETA_SOFTWAREREQUIREMENTS] = code_parser_requirements + other_requirements + if requirements_mode == "v": codemeta_output[constants.CAT_CODEMETA_SOFTWAREREQUIREMENTS] = code_parser_requirements else: - codemeta_output[constants.CAT_CODEMETA_SOFTWAREREQUIREMENTS] = code_parser_requirements + other_requirements + if code_parser_requirements: + codemeta_output[constants.CAT_CODEMETA_SOFTWAREREQUIREMENTS] = code_parser_requirements + else: + codemeta_output[constants.CAT_CODEMETA_SOFTWAREREQUIREMENTS] = other_requirements + if constants.CAT_CONTINUOUS_INTEGRATION in repo_data: codemeta_output[constants.CAT_CODEMETA_CONTINUOUSINTEGRATION] = repo_data[constants.CAT_CONTINUOUS_INTEGRATION][0][constants.PROP_RESULT][constants.PROP_VALUE] diff --git a/src/somef/parser/conda_environment_parser.py b/src/somef/parser/conda_environment_parser.py index 5a0cae9b..1a21a28e 100644 --- a/src/somef/parser/conda_environment_parser.py +++ b/src/somef/parser/conda_environment_parser.py @@ -47,38 +47,44 @@ def parse_conda_environment_file(file_path, metadata_result: Result, source): # conda dependencies for dep in conda_deps: + dep_dict = { + "value": dep, + "name": re.split(r"[=<>!]", dep)[0], + "type": constants.SOFTWARE_APPLICATION, + "dependency_type": "conda" + } + + match = re.search(r"[=<>!]+(.+)", dep) + if match: + dep_dict["version"] = match.group(1) + metadata_result.add_result( constants.CAT_REQUIREMENTS, - { - "value": dep, - "name": dep.split("=")[0], - "version": dep.split("=")[1] if "=" in dep else "", - "type": constants.SOFTWARE_APPLICATION, - "dependency_type": "conda" - }, + dep_dict, 1, constants.TECHNIQUE_CODE_CONFIG_PARSER, source ) - # pip dependdencies for dep in pip_deps: - name = dep.split("==")[0] if "==" in dep else dep - version = dep.split("==")[1] if "==" in dep else "" + + dep_dict = { + "value": dep, + "name": re.split(r"[=<>!~]", dep)[0], + "type": constants.SOFTWARE_APPLICATION, + "dependency_type": "pip" + } + + match = re.search(r"[=<>!~]+(.+)", dep) + if match: + dep_dict["version"] = match.group(1) metadata_result.add_result( constants.CAT_REQUIREMENTS, - { - "value": dep, - "name": name, - "version": version, - "type": constants.SOFTWARE_APPLICATION, - "dependency_type": "pip" - }, + dep_dict, 1, constants.TECHNIQUE_CODE_CONFIG_PARSER, source ) - return metadata_result diff --git a/src/somef/test/test_codemeta_export.py b/src/somef/test/test_codemeta_export.py index 12e02315..82576799 100644 --- a/src/somef/test/test_codemeta_export.py +++ b/src/somef/test/test_codemeta_export.py @@ -213,7 +213,7 @@ def test_author_in_reference_publication(self): expected_family_name = "Garijo" expected_given_name = "Daniel" - + found = any( any( author.get("familyName") == expected_family_name and author.get("givenName") == expected_given_name @@ -333,7 +333,6 @@ def test_requirements_mode(self): json_content = json.load(f) requirements = json_content.get("softwareRequirements", []) - assert all(isinstance(req, dict) and "name" in req for req in requirements), \ f"Expected only structured requirements, found: {requirements}" @@ -476,6 +475,7 @@ def test_issue_832_join_authors(self): text_file.close() authors = json_content.get("author", []) + assert len(authors) == 9, f"Expected 9 author, found {len(authors)}" assert authors[0].get("name") == "Robert Huber", "Second author must be Robert Huber" assert authors[1].get("email") == "anusuriya.devaraju@googlemail.com", \ @@ -551,6 +551,106 @@ def test_issue_723_codemeta(self): os.remove(json_file_path) + + def test_issue_891(self): + + """ + Checks that the CodeMeta export include just structured requirements extracted by code parsers, excluding any textual + entries coming from readme, codemeta.json or other non structured sources. + """ + + output_path = test_data_path + 'test_codemeta_issue_891.json' + + somef_cli.run_cli(threshold=0.9, + ignore_classifiers=False, + repo_url=None, + doc_src=None, + local_repo=test_data_repositories + "somef_repo", + in_file=None, + output=None, + graph_out=None, + graph_format="turtle", + codemeta_out= output_path, + pretty=True, + missing=False) + + with open(output_path, "r") as f: + json_content = json.load(f) + + requirements = json_content.get("softwareRequirements", []) + assert all(isinstance(req, dict) and "name" in req for req in requirements), \ + f"Expected only structured requirement objects, found: {requirements}" + + req_dict = {req["name"]: req for req in requirements} + assert "python" in req_dict, "Missing expected requirement: python" + assert req_dict["python"].get("version") == ">=3.9,<=3.13" + + os.remove(output_path) + + # def test_codemeta_local(self): + + # """ + # codemeta local + # """ + + # pom_xml_parser.processed_pom = False + + # output_path = test_data_path + 'test_urban_pfr.json' + # if os.path.exists(output_path): + # os.remove(output_path) + + # somef_cli.run_cli(threshold=0.9, + # ignore_classifiers=False, + # repo_url=None, + # doc_src=None, + # local_repo=test_data_repositories + "urban_pfr_toolbox_hamburg", + # in_file=None, + # output=None, + # graph_out=None, + # graph_format="turtle", + # codemeta_out= output_path, + # pretty=True, + # missing=False, + # readme_only=False) + + # with open(output_path, "r") as f: + # json_content = json.load(f) + + # runtime = json_content.get("runtimePlatform", []) + # assert runtime == "Java: 1.8", f"It was expected 'Java: 1.8' but it was '{runtime}'" + # os.remove(output_path) + + + # def test_codemeta_local_2(self): + + # """ + # codemeta local + # """ + + # pom_xml_parser.processed_pom = False + + # output_path = test_data_path + 'test_json_urban_pfr.json' + # if os.path.exists(output_path): + # os.remove(output_path) + + # somef_cli.run_cli(threshold=0.9, + # ignore_classifiers=False, + # repo_url=None, + # doc_src=None, + # local_repo=test_data_repositories + "urban_pfr_toolbox_hamburg", + # in_file=None, + # output=output_path, + # graph_out=None, + # graph_format="turtle", + # codemeta_out= None, + # pretty=True, + # missing=False, + # readme_only=False) + + # with open(output_path, "r") as f: + # json_content = json.load(f) + + @classmethod def tearDownClass(cls): """delete temp file JSON just if all the test pass""" diff --git a/src/somef/test/test_data/repositories/somef_repo/pyproject.toml b/src/somef/test/test_data/repositories/somef_repo/pyproject.toml new file mode 100644 index 00000000..98dc3281 --- /dev/null +++ b/src/somef/test/test_data/repositories/somef_repo/pyproject.toml @@ -0,0 +1,55 @@ +[tool.poetry] +name = "somef" +version = "0.9.13" +description = "SOftware Metadata Extraction Framework: A tool for automatically extracting relevant software metadata from a source code repository (README, package files, etc)." +authors = ["Daniel Garijo "] +readme = "README.md" +packages = [ + { include = "somef", from = "src" } +] +classifiers = [ + "Programming Language :: Python :: 3.10", + "Operating System :: OS Independent", + "License :: OSI Approved :: MIT License", + "Topic :: Software Development :: Libraries :: Python Modules" + ] + +[tool.poetry.urls] +homepage = "https://github.com/KnowledgeCaptureAndDiscovery/somef" + +[tool.poetry.dependencies] + python = ">=3.9,<=3.13" + bs4 = "^0.0.1" + click = "^8.1.7" + click-option-group = "^0.5.6" + matplotlib = "^3.8.2" + nltk = "^3.9.0" + numpy = "^1.26.3" + pandas = "^2.1.4" + rdflib = "^7.0.0" + textblob = "^0.17.1" + validators = "^0.22.0" + xgboost = "^2.0.3" + scipy = "^1.11.4" + inflect = "^7.0.0" + contractions = "^0.1.73" + chardet = "^5.2.0" + imbalanced-learn = "^0.11.0" + pytest = "^7.4.4" + morph-kgc = "^2.6.4" + bibtexparser = "^1.4.1" + nbformat = "^5.9.2" + markdown = "^3.5.2" + requests = "^2.31.0" + scikit-learn = "1.3.2" + pyyaml = "^6.0.2" + lxml = "^5.1.0" + tomli = "^2.0.1" + markdown-it-py = "^3.0" + +[tool.poetry.scripts] +somef = "somef.__main__:cli" + +[build-system] +requires = ["poetry-core>=1.1.10"] +build-backend = "poetry.core.masonry.api" \ No newline at end of file From 66cddc860d181fd1beadedf94edffd686451c38b Mon Sep 17 00:00:00 2001 From: Juanje Mendoza Date: Wed, 25 Feb 2026 15:48:23 +0100 Subject: [PATCH 13/27] describe with local repo. Solve problem with li folders. Fixes #894 --- README.md | 1 + src/somef/process_files.py | 5 + .../lib/python/pip-24.2.dist-info/AUTHORS.txt | 796 ++++++++++++++++++ src/somef/test/test_process_repository.py | 21 +- 4 files changed, 822 insertions(+), 1 deletion(-) create mode 100644 src/somef/test/test_data/repositories/somef_repo/lib/python/pip-24.2.dist-info/AUTHORS.txt diff --git a/README.md b/README.md index 90454f0e..f72b9a33 100644 --- a/README.md +++ b/README.md @@ -291,6 +291,7 @@ Options: -d, --doc_src PATH Path to the README file source -i, --in_file PATH A file of newline separated links to GitHub/ Gitlab repositories + -l, --local_repo PATH Path to the local repository source. No APIs will be used Output: [required_any] -o, --output PATH Path to the output file. If supplied, the diff --git a/src/somef/process_files.py b/src/somef/process_files.py index 5a0b5425..98b9503a 100644 --- a/src/somef/process_files.py +++ b/src/somef/process_files.py @@ -56,12 +56,17 @@ def process_repository_files(repo_dir, metadata_result: Result, repo_type, owner text = "" readmeMD_proccesed = False + is_local_repo = (owner == "" and repo_name == "") + try: parsed_build_files = set() for dir_path, dir_names, filenames in os.walk(repo_dir): dir_names[:] = [d for d in dir_names if d.lower() not in constants.IGNORED_DIRS] + if is_local_repo: + dir_names[:] = [d for d in dir_names if d.lower() != "lib"] + repo_relative_path = os.path.relpath(dir_path, repo_dir) current_dir = os.path.basename(repo_relative_path).lower() # if this is a test folder, we ignore it (except for the root repo) diff --git a/src/somef/test/test_data/repositories/somef_repo/lib/python/pip-24.2.dist-info/AUTHORS.txt b/src/somef/test/test_data/repositories/somef_repo/lib/python/pip-24.2.dist-info/AUTHORS.txt new file mode 100644 index 00000000..dda2ac30 --- /dev/null +++ b/src/somef/test/test_data/repositories/somef_repo/lib/python/pip-24.2.dist-info/AUTHORS.txt @@ -0,0 +1,796 @@ +@Switch01 +A_Rog +Aakanksha Agrawal +Abhinav Sagar +ABHYUDAY PRATAP SINGH +abs51295 +AceGentile +Adam Chainz +Adam Tse +Adam Wentz +admin +Adolfo Ochagavía +Adrien Morison +Agus +ahayrapetyan +Ahilya +AinsworthK +Akash Srivastava +Alan Yee +Albert Tugushev +Albert-Guan +albertg +Alberto Sottile +Aleks Bunin +Ales Erjavec +Alethea Flowers +Alex Gaynor +Alex Grönholm +Alex Hedges +Alex Loosley +Alex Morega +Alex Stachowiak +Alexander Shtyrov +Alexandre Conrad +Alexey Popravka +Aleš Erjavec +Alli +Ami Fischman +Ananya Maiti +Anatoly Techtonik +Anders Kaseorg +Andre Aguiar +Andreas Lutro +Andrei Geacar +Andrew Gaul +Andrew Shymanel +Andrey Bienkowski +Andrey Bulgakov +Andrés Delfino +Andy Freeland +Andy Kluger +Ani Hayrapetyan +Aniruddha Basak +Anish Tambe +Anrs Hu +Anthony Sottile +Antoine Musso +Anton Ovchinnikov +Anton Patrushev +Antonio Alvarado Hernandez +Antony Lee +Antti Kaihola +Anubhav Patel +Anudit Nagar +Anuj Godase +AQNOUCH Mohammed +AraHaan +arena +arenasys +Arindam Choudhury +Armin Ronacher +Arnon Yaari +Artem +Arun Babu Neelicattu +Ashley Manton +Ashwin Ramaswami +atse +Atsushi Odagiri +Avinash Karhana +Avner Cohen +Awit (Ah-Wit) Ghirmai +Baptiste Mispelon +Barney Gale +barneygale +Bartek Ogryczak +Bastian Venthur +Ben Bodenmiller +Ben Darnell +Ben Hoyt +Ben Mares +Ben Rosser +Bence Nagy +Benjamin Peterson +Benjamin VanEvery +Benoit Pierre +Berker Peksag +Bernard +Bernard Tyers +Bernardo B. Marques +Bernhard M. Wiedemann +Bertil Hatt +Bhavam Vidyarthi +Blazej Michalik +Bogdan Opanchuk +BorisZZZ +Brad Erickson +Bradley Ayers +Branch Vincent +Brandon L. Reiss +Brandt Bucher +Brannon Dorsey +Brett Randall +Brett Rosen +Brian Cristante +Brian Rosner +briantracy +BrownTruck +Bruno Oliveira +Bruno Renié +Bruno S +Bstrdsmkr +Buck Golemon +burrows +Bussonnier Matthias +bwoodsend +c22 +Caleb Martinez +Calvin Smith +Carl Meyer +Carlos Liam +Carol Willing +Carter Thayer +Cass +Chandrasekhar Atina +Charlie Marsh +Chih-Hsuan Yen +Chris Brinker +Chris Hunt +Chris Jerdonek +Chris Kuehl +Chris Markiewicz +Chris McDonough +Chris Pawley +Chris Pryer +Chris Wolfe +Christian Clauss +Christian Heimes +Christian Oudard +Christoph Reiter +Christopher Hunt +Christopher Snyder +chrysle +cjc7373 +Clark Boylan +Claudio Jolowicz +Clay McClure +Cody +Cody Soyland +Colin Watson +Collin Anderson +Connor Osborn +Cooper Lees +Cooper Ry Lees +Cory Benfield +Cory Wright +Craig Kerstiens +Cristian Sorinel +Cristina +Cristina Muñoz +ctg123 +Curtis Doty +cytolentino +Daan De Meyer +Dale +Damian +Damian Quiroga +Damian Shaw +Dan Black +Dan Savilonis +Dan Sully +Dane Hillard +daniel +Daniel Collins +Daniel Hahler +Daniel Holth +Daniel Jost +Daniel Katz +Daniel Shaulov +Daniele Esposti +Daniele Nicolodi +Daniele Procida +Daniil Konovalenko +Danny Hermes +Danny McClanahan +Darren Kavanagh +Dav Clark +Dave Abrahams +Dave Jones +David Aguilar +David Black +David Bordeynik +David Caro +David D Lowe +David Evans +David Hewitt +David Linke +David Poggi +David Poznik +David Pursehouse +David Runge +David Tucker +David Wales +Davidovich +ddelange +Deepak Sharma +Deepyaman Datta +Denise Yu +dependabot[bot] +derwolfe +Desetude +Devesh Kumar Singh +devsagul +Diego Caraballo +Diego Ramirez +DiegoCaraballo +Dimitri Merejkowsky +Dimitri Papadopoulos +Dirk Stolle +Dmitry Gladkov +Dmitry Volodin +Domen Kožar +Dominic Davis-Foster +Donald Stufft +Dongweiming +doron zarhi +Dos Moonen +Douglas Thor +DrFeathers +Dustin Ingram +Dustin Rodrigues +Dwayne Bailey +Ed Morley +Edgar Ramírez +Edgar Ramírez Mondragón +Ee Durbin +Efflam Lemaillet +efflamlemaillet +Eitan Adler +ekristina +elainechan +Eli Schwartz +Elisha Hollander +Ellen Marie Dash +Emil Burzo +Emil Styrke +Emmanuel Arias +Endoh Takanao +enoch +Erdinc Mutlu +Eric Cousineau +Eric Gillingham +Eric Hanchrow +Eric Hopper +Erik M. Bray +Erik Rose +Erwin Janssen +Eugene Vereshchagin +everdimension +Federico +Felipe Peter +Felix Yan +fiber-space +Filip Kokosiński +Filipe Laíns +Finn Womack +finnagin +Flavio Amurrio +Florian Briand +Florian Rathgeber +Francesco +Francesco Montesano +Fredrik Orderud +Frost Ming +Gabriel Curio +Gabriel de Perthuis +Garry Polley +gavin +gdanielson +Geoffrey Sneddon +George Song +Georgi Valkov +Georgy Pchelkin +ghost +Giftlin Rajaiah +gizmoguy1 +gkdoc +Godefroid Chapelle +Gopinath M +GOTO Hayato +gousaiyang +gpiks +Greg Roodt +Greg Ward +Guilherme Espada +Guillaume Seguin +gutsytechster +Guy Rozendorn +Guy Tuval +gzpan123 +Hanjun Kim +Hari Charan +Harsh Vardhan +harupy +Harutaka Kawamura +hauntsaninja +Henrich Hartzer +Henry Schreiner +Herbert Pfennig +Holly Stotelmyer +Honnix +Hsiaoming Yang +Hugo Lopes Tavares +Hugo van Kemenade +Hugues Bruant +Hynek Schlawack +Ian Bicking +Ian Cordasco +Ian Lee +Ian Stapleton Cordasco +Ian Wienand +Igor Kuzmitshov +Igor Sobreira +Ikko Ashimine +Ilan Schnell +Illia Volochii +Ilya Baryshev +Inada Naoki +Ionel Cristian Mărieș +Ionel Maries Cristian +Itamar Turner-Trauring +Ivan Pozdeev +J. Nick Koston +Jacob Kim +Jacob Walls +Jaime Sanz +jakirkham +Jakub Kuczys +Jakub Stasiak +Jakub Vysoky +Jakub Wilk +James Cleveland +James Curtin +James Firth +James Gerity +James Polley +Jan Pokorný +Jannis Leidel +Jarek Potiuk +jarondl +Jason Curtis +Jason R. Coombs +JasonMo +JasonMo1 +Jay Graves +Jean Abou Samra +Jean-Christophe Fillion-Robin +Jeff Barber +Jeff Dairiki +Jeff Widman +Jelmer Vernooij +jenix21 +Jeremy Fleischman +Jeremy Stanley +Jeremy Zafran +Jesse Rittner +Jiashuo Li +Jim Fisher +Jim Garrison +Jinzhe Zeng +Jiun Bae +Jivan Amara +Joe Bylund +Joe Michelini +John Paton +John Sirois +John T. Wodder II +John-Scott Atlakson +johnthagen +Jon Banafato +Jon Dufresne +Jon Parise +Jonas Nockert +Jonathan Herbert +Joonatan Partanen +Joost Molenaar +Jorge Niedbalski +Joseph Bylund +Joseph Long +Josh Bronson +Josh Cannon +Josh Hansen +Josh Schneier +Joshua +Juan Luis Cano Rodríguez +Juanjo Bazán +Judah Rand +Julian Berman +Julian Gethmann +Julien Demoor +Jussi Kukkonen +jwg4 +Jyrki Pulliainen +Kai Chen +Kai Mueller +Kamal Bin Mustafa +kasium +kaustav haldar +keanemind +Keith Maxwell +Kelsey Hightower +Kenneth Belitzky +Kenneth Reitz +Kevin Burke +Kevin Carter +Kevin Frommelt +Kevin R Patterson +Kexuan Sun +Kit Randel +Klaas van Schelven +KOLANICH +konstin +kpinc +Krishna Oza +Kumar McMillan +Kuntal Majumder +Kurt McKee +Kyle Persohn +lakshmanaram +Laszlo Kiss-Kollar +Laurent Bristiel +Laurent LAPORTE +Laurie O +Laurie Opperman +layday +Leon Sasson +Lev Givon +Lincoln de Sousa +Lipis +lorddavidiii +Loren Carvalho +Lucas Cimon +Ludovic Gasc +Luis Medel +Lukas Geiger +Lukas Juhrich +Luke Macken +Luo Jiebin +luojiebin +luz.paz +László Kiss Kollár +M00nL1ght +Marc Abramowitz +Marc Tamlyn +Marcus Smith +Mariatta +Mark Kohler +Mark McLoughlin +Mark Williams +Markus Hametner +Martey Dodoo +Martin Fischer +Martin Häcker +Martin Pavlasek +Masaki +Masklinn +Matej Stuchlik +Mathew Jennings +Mathieu Bridon +Mathieu Kniewallner +Matt Bacchi +Matt Good +Matt Maker +Matt Robenolt +Matt Wozniski +matthew +Matthew Einhorn +Matthew Feickert +Matthew Gilliard +Matthew Hughes +Matthew Iversen +Matthew Treinish +Matthew Trumbell +Matthew Willson +Matthias Bussonnier +mattip +Maurits van Rees +Max W Chase +Maxim Kurnikov +Maxime Rouyrre +mayeut +mbaluna +mdebi +memoselyk +meowmeowcat +Michael +Michael Aquilina +Michael E. Karpeles +Michael Klich +Michael Mintz +Michael Williamson +michaelpacer +Michał Górny +Mickaël Schoentgen +Miguel Araujo Perez +Mihir Singh +Mike +Mike Hendricks +Min RK +MinRK +Miro Hrončok +Monica Baluna +montefra +Monty Taylor +morotti +mrKazzila +Muha Ajjan +Nadav Wexler +Nahuel Ambrosini +Nate Coraor +Nate Prewitt +Nathan Houghton +Nathaniel J. Smith +Nehal J Wani +Neil Botelho +Nguyễn Gia Phong +Nicholas Serra +Nick Coghlan +Nick Stenning +Nick Timkovich +Nicolas Bock +Nicole Harris +Nikhil Benesch +Nikhil Ladha +Nikita Chepanov +Nikolay Korolev +Nipunn Koorapati +Nitesh Sharma +Niyas Sait +Noah +Noah Gorny +Nowell Strite +NtaleGrey +nvdv +OBITORASU +Ofek Lev +ofrinevo +Oliver Freund +Oliver Jeeves +Oliver Mannion +Oliver Tonnhofer +Olivier Girardot +Olivier Grisel +Ollie Rutherfurd +OMOTO Kenji +Omry Yadan +onlinejudge95 +Oren Held +Oscar Benjamin +Oz N Tiram +Pachwenko +Patrick Dubroy +Patrick Jenkins +Patrick Lawson +patricktokeeffe +Patrik Kopkan +Paul Ganssle +Paul Kehrer +Paul Moore +Paul Nasrat +Paul Oswald +Paul van der Linden +Paulus Schoutsen +Pavel Safronov +Pavithra Eswaramoorthy +Pawel Jasinski +Paweł Szramowski +Pekka Klärck +Peter Gessler +Peter Lisák +Peter Shen +Peter Waller +Petr Viktorin +petr-tik +Phaneendra Chiruvella +Phil Elson +Phil Freo +Phil Pennock +Phil Whelan +Philip Jägenstedt +Philip Molloy +Philippe Ombredanne +Pi Delport +Pierre-Yves Rofes +Pieter Degroote +pip +Prabakaran Kumaresshan +Prabhjyotsing Surjit Singh Sodhi +Prabhu Marappan +Pradyun Gedam +Prashant Sharma +Pratik Mallya +pre-commit-ci[bot] +Preet Thakkar +Preston Holmes +Przemek Wrzos +Pulkit Goyal +q0w +Qiangning Hong +Qiming Xu +Quentin Lee +Quentin Pradet +R. David Murray +Rafael Caricio +Ralf Schmitt +Ran Benita +Razzi Abuissa +rdb +Reece Dunham +Remi Rampin +Rene Dudfield +Riccardo Magliocchetti +Riccardo Schirone +Richard Jones +Richard Si +Ricky Ng-Adam +Rishi +rmorotti +RobberPhex +Robert Collins +Robert McGibbon +Robert Pollak +Robert T. McGibbon +robin elisha robinson +Roey Berman +Rohan Jain +Roman Bogorodskiy +Roman Donchenko +Romuald Brunet +ronaudinho +Ronny Pfannschmidt +Rory McCann +Ross Brattain +Roy Wellington Ⅳ +Ruairidh MacLeod +Russell Keith-Magee +Ryan Shepherd +Ryan Wooden +ryneeverett +S. Guliaev +Sachi King +Salvatore Rinchiera +sandeepkiran-js +Sander Van Balen +Savio Jomton +schlamar +Scott Kitterman +Sean +seanj +Sebastian Jordan +Sebastian Schaetz +Segev Finer +SeongSoo Cho +Sergey Vasilyev +Seth Michael Larson +Seth Woodworth +Shahar Epstein +Shantanu +shenxianpeng +shireenrao +Shivansh-007 +Shixian Sheng +Shlomi Fish +Shovan Maity +Simeon Visser +Simon Cross +Simon Pichugin +sinoroc +sinscary +snook92 +socketubs +Sorin Sbarnea +Srinivas Nyayapati +Stavros Korokithakis +Stefan Scherfke +Stefano Rivera +Stephan Erb +Stephen Rosen +stepshal +Steve (Gadget) Barnes +Steve Barnes +Steve Dower +Steve Kowalik +Steven Myint +Steven Silvester +stonebig +studioj +Stéphane Bidoul +Stéphane Bidoul (ACSONE) +Stéphane Klein +Sumana Harihareswara +Surbhi Sharma +Sviatoslav Sydorenko +Sviatoslav Sydorenko (Святослав Сидоренко) +Swat009 +Sylvain +Takayuki SHIMIZUKAWA +Taneli Hukkinen +tbeswick +Thiago +Thijs Triemstra +Thomas Fenzl +Thomas Grainger +Thomas Guettler +Thomas Johansson +Thomas Kluyver +Thomas Smith +Thomas VINCENT +Tim D. Smith +Tim Gates +Tim Harder +Tim Heap +tim smith +tinruufu +Tobias Hermann +Tom Forbes +Tom Freudenheim +Tom V +Tomas Hrnciar +Tomas Orsava +Tomer Chachamu +Tommi Enenkel | AnB +Tomáš Hrnčiar +Tony Beswick +Tony Narlock +Tony Zhaocheng Tan +TonyBeswick +toonarmycaptain +Toshio Kuratomi +toxinu +Travis Swicegood +Tushar Sadhwani +Tzu-ping Chung +Valentin Haenel +Victor Stinner +victorvpaulo +Vikram - Google +Viktor Szépe +Ville Skyttä +Vinay Sajip +Vincent Philippon +Vinicyus Macedo +Vipul Kumar +Vitaly Babiy +Vladimir Fokow +Vladimir Rutsky +W. Trevor King +Wil Tan +Wilfred Hughes +William Edwards +William ML Leslie +William T Olson +William Woodruff +Wilson Mo +wim glenn +Winson Luk +Wolfgang Maier +Wu Zhenyu +XAMES3 +Xavier Fernandez +Xianpeng Shen +xoviat +xtreak +YAMAMOTO Takashi +Yen Chi Hsuan +Yeray Diaz Diaz +Yoval P +Yu Jian +Yuan Jing Vincent Yan +Yusuke Hayashi +Zearin +Zhiping Deng +ziebam +Zvezdan Petkovic +Łukasz Langa +Роман Донченко +Семён Марьясин diff --git a/src/somef/test/test_process_repository.py b/src/somef/test/test_process_repository.py index dbe477a9..948df9e3 100644 --- a/src/somef/test/test_process_repository.py +++ b/src/somef/test/test_process_repository.py @@ -1,6 +1,7 @@ import os import tempfile import unittest +import json from pathlib import Path from .. import process_repository, process_files, somef_cli @@ -207,4 +208,22 @@ def test_issue_611(self): github_data = Result() text, github_data = process_files.process_repository_files(test_data_repositories + "termlex-main", github_data, constants.RepositoryType.LOCAL) - assert len(github_data.results[constants.CAT_ONTOLOGIES]) >= 1 \ No newline at end of file + assert len(github_data.results[constants.CAT_ONTOLOGIES]) >= 1 + + def test_issue_894(self): + """ + Test that the 'lib' folder is ignored for local repositories. Any author from lib/authors.txt shoulb be found. + """ + + metadata = Result() + + repo_path = test_data_repositories + "somef_repo" + + readme_text, full_metadata = process_files.process_repository_files( repo_path, metadata, constants.RepositoryType.LOCAL, ignore_test_folder=True, additional_info=False) + + authors = full_metadata.results.get(constants.CAT_AUTHORS, []) + + for entry in authors: + source = entry.get("source", "").lower() + assert "lib/" not in source, f"Author extracted from ignored folder: {source}" + assert "authors.txt" not in source, f"'authors.txt' inside lib/ was incorrectly processed" \ No newline at end of file From c2dfcb9001e6fd442f44b17383d2cf2a815387fc Mon Sep 17 00:00:00 2001 From: Juanje Mendoza Date: Thu, 26 Feb 2026 09:43:59 +0100 Subject: [PATCH 14/27] solve bugs with readmes without no parseable content. Fixes #897 --- src/somef/parser/mardown_parser.py | 7 ++++++- src/somef/test/test_data/README-almost-empty.md | 1 + src/somef/test/test_parser_somef.py | 13 ++++++++++++- 3 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 src/somef/test/test_data/README-almost-empty.md diff --git a/src/somef/parser/mardown_parser.py b/src/somef/parser/mardown_parser.py index 1c0fb832..5b96b0b4 100644 --- a/src/somef/parser/mardown_parser.py +++ b/src/somef/parser/mardown_parser.py @@ -51,9 +51,14 @@ def extract_content_per_header(original_text, headers): output = {} limit = len(keys) index = 0 - top = keys[0] bottom = None none_header_content = None + + if not keys: + return [], original_text + + top = keys[0] + text_tokenized = original_text.split('\n') if len(text_tokenized) == 1: return text_tokenized[0] diff --git a/src/somef/test/test_data/README-almost-empty.md b/src/somef/test/test_data/README-almost-empty.md new file mode 100644 index 00000000..97583930 --- /dev/null +++ b/src/somef/test/test_data/README-almost-empty.md @@ -0,0 +1 @@ +![badge](https://img.shields.io/badge/test-ok-green) \ No newline at end of file diff --git a/src/somef/test/test_parser_somef.py b/src/somef/test/test_parser_somef.py index 0ed2c2bb..bebf779a 100644 --- a/src/somef/test/test_parser_somef.py +++ b/src/somef/test/test_parser_somef.py @@ -71,4 +71,15 @@ def test_issue_431(self): second_header = '''

WIzard for DOCumenting Ontologies (WIDOCO)

''' print(is_header(first_header)) print(is_header(second_header)) - assert (not is_header(first_header) and is_header(second_header)) \ No newline at end of file + assert (not is_header(first_header) and is_header(second_header)) + + def test_extract_empty_headers(self): + """Test to check if the markdown parser detects the right text blocks""" + with open(test_data_path + "README-almost-empty.md", "r") as data_file: + text = data_file.read() + + headers = extract_headers(text) + assert headers == {} + content, non_header_content = extract_content_per_header(text, headers) + assert content == [] + assert non_header_content.strip() == text.strip() \ No newline at end of file From 0b81ff42e3067596de27b3109f2d4570338cdb2a Mon Sep 17 00:00:00 2001 From: Juanje Mendoza Date: Thu, 26 Feb 2026 10:23:38 +0100 Subject: [PATCH 15/27] again bug with no headers. --- src/somef/parser/mardown_parser.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/somef/parser/mardown_parser.py b/src/somef/parser/mardown_parser.py index 5b96b0b4..d1139e24 100644 --- a/src/somef/parser/mardown_parser.py +++ b/src/somef/parser/mardown_parser.py @@ -53,12 +53,10 @@ def extract_content_per_header(original_text, headers): index = 0 bottom = None none_header_content = None - if not keys: return [], original_text top = keys[0] - text_tokenized = original_text.split('\n') if len(text_tokenized) == 1: return text_tokenized[0] From 903e0ab61d493ea5d8aa99b5a14c4d2e8278b439 Mon Sep 17 00:00:00 2001 From: Juanje Mendoza Date: Thu, 26 Feb 2026 13:11:42 +0100 Subject: [PATCH 16/27] Regenerate poetry.lock after merge --- poetry.lock | 2542 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2542 insertions(+) create mode 100644 poetry.lock diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 00000000..dcb57da7 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,2542 @@ +# This file is automatically @generated by Poetry 2.1.4 and should not be changed by hand. + +[[package]] +name = "anyascii" +version = "0.3.3" +description = "Unicode to ASCII transliteration" +optional = false +python-versions = ">=3.3" +groups = ["main"] +files = [ + {file = "anyascii-0.3.3-py3-none-any.whl", hash = "sha256:f5ab5e53c8781a36b5a40e1296a0eeda2f48c649ef10c3921c1381b1d00dee7a"}, + {file = "anyascii-0.3.3.tar.gz", hash = "sha256:c94e9dd9d47b3d9494eca305fef9447d00b4bf1a32aff85aa746fa3ec7fb95c3"}, +] + +[[package]] +name = "attrs" +version = "25.4.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373"}, + {file = "attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11"}, +] + +[[package]] +name = "beautifulsoup4" +version = "4.14.3" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.7.0" +groups = ["main"] +files = [ + {file = "beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb"}, + {file = "beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86"}, +] + +[package.dependencies] +soupsieve = ">=1.6.1" +typing-extensions = ">=4.0.0" + +[package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "bibtexparser" +version = "1.4.4" +description = "Bibtex parser for python 3" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "bibtexparser-1.4.4.tar.gz", hash = "sha256:093b6c824f7a71d3a748867c4057b71f77c55b8dbc07efc993b781771520d8fb"}, +] + +[package.dependencies] +pyparsing = ">=2.0.3" + +[[package]] +name = "bs4" +version = "0.0.1" +description = "Dummy package for Beautiful Soup" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "bs4-0.0.1.tar.gz", hash = "sha256:36ecea1fd7cc5c0c6e4a1ff075df26d50da647b75376626cc186e2212886dd3a"}, +] + +[package.dependencies] +beautifulsoup4 = "*" + +[[package]] +name = "certifi" +version = "2026.2.25" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa"}, + {file = "certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7"}, +] + +[[package]] +name = "chardet" +version = "5.2.0" +description = "Universal encoding detector for Python 3" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970"}, + {file = "chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.4" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ce8a0633f41a967713a59c4139d29110c07e826d131a316b50ce11b1d79b4f84"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaabd426fe94daf8fd157c32e571c85cb12e66692f15516a83a03264b08d06c3"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c4ef880e27901b6cc782f1b95f82da9313c0eb95c3af699103088fa0ac3ce9ac"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2aaba3b0819274cc41757a1da876f810a3e4d7b6eb25699253a4effef9e8e4af"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:778d2e08eda00f4256d7f672ca9fef386071c9202f5e4607920b86d7803387f2"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f155a433c2ec037d4e8df17d18922c3a0d9b3232a396690f17175d2946f0218d"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a8bf8d0f749c5757af2142fe7903a9df1d2e8aa3841559b2bad34b08d0e2bcf3"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:194f08cbb32dc406d6e1aea671a68be0823673db2832b38405deba2fb0d88f63"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:6aee717dcfead04c6eb1ce3bd29ac1e22663cdea57f943c87d1eab9a025438d7"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cd4b7ca9984e5e7985c12bc60a6f173f3c958eae74f3ef6624bb6b26e2abbae4"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_riscv64.whl", hash = "sha256:b7cf1017d601aa35e6bb650b6ad28652c9cd78ee6caff19f3c28d03e1c80acbf"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e912091979546adf63357d7e2ccff9b44f026c075aeaf25a52d0e95ad2281074"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5cb4d72eea50c8868f5288b7f7f33ed276118325c1dfd3957089f6b519e1382a"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-win32.whl", hash = "sha256:837c2ce8c5a65a2035be9b3569c684358dfbf109fd3b6969630a87535495ceaa"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:44c2a8734b333e0578090c4cd6b16f275e07aa6614ca8715e6c038e865e70576"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a9768c477b9d7bd54bc0c86dbaebdec6f03306675526c9927c0e8a04e8f94af9"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bee1e43c28aa63cb16e5c14e582580546b08e535299b8b6158a7c9c768a1f3d"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fd44c878ea55ba351104cb93cc85e74916eb8fa440ca7903e57575e97394f608"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f04b14ffe5fdc8c4933862d8306109a2c51e0704acfa35d51598eb45a1e89fc"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cd09d08005f958f370f539f186d10aec3377d55b9eeb0d796025d4886119d76e"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4fe7859a4e3e8457458e2ff592f15ccb02f3da787fcd31e0183879c3ad4692a1"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa09f53c465e532f4d3db095e0c55b615f010ad81803d383195b6b5ca6cbf5f3"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7fa17817dc5625de8a027cb8b26d9fefa3ea28c8253929b8d6649e705d2835b6"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5947809c8a2417be3267efc979c47d76a079758166f7d43ef5ae8e9f92751f88"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4902828217069c3c5c71094537a8e623f5d097858ac6ca8252f7b4d10b7560f1"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:7c308f7e26e4363d79df40ca5b2be1c6ba9f02bdbccfed5abddb7859a6ce72cf"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2c9d3c380143a1fedbff95a312aa798578371eb29da42106a29019368a475318"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb01158d8b88ee68f15949894ccc6712278243d95f344770fa7593fa2d94410c"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-win32.whl", hash = "sha256:2677acec1a2f8ef614c6888b5b4ae4060cc184174a938ed4e8ef690e15d3e505"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:f8e160feb2aed042cd657a72acc0b481212ed28b1b9a95c0cee1621b524e1966"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-win_arm64.whl", hash = "sha256:b5d84d37db046c5ca74ee7bb47dd6cbc13f80665fdde3e8040bdd3fb015ecb50"}, + {file = "charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f"}, + {file = "charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a"}, +] + +[[package]] +name = "click" +version = "8.3.1" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6"}, + {file = "click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "click-option-group" +version = "0.5.9" +description = "Option groups missing in Click" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "click_option_group-0.5.9-py3-none-any.whl", hash = "sha256:ad2599248bd373e2e19bec5407967c3eec1d0d4fc4a5e77b08a0481e75991080"}, + {file = "click_option_group-0.5.9.tar.gz", hash = "sha256:f94ed2bc4cf69052e0f29592bd1e771a1789bd7bfc482dd0bc482134aff95823"}, +] + +[package.dependencies] +click = ">=7.0" + +[package.extras] +dev = ["pre-commit", "pytest"] +docs = ["m2r2", "pallets-sphinx-themes", "sphinx"] +test = ["pytest"] +test-cov = ["pytest", "pytest-cov"] + +[[package]] +name = "colorama" +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"] +markers = "platform_system == \"Windows\" or sys_platform == \"win32\"" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "contourpy" +version = "1.3.3" +description = "Python library for calculating contours of 2D quadrilateral grids" +optional = false +python-versions = ">=3.11" +groups = ["main"] +files = [ + {file = "contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1"}, + {file = "contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381"}, + {file = "contourpy-1.3.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:929ddf8c4c7f348e4c0a5a3a714b5c8542ffaa8c22954862a46ca1813b667ee7"}, + {file = "contourpy-1.3.3-cp311-cp311-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e999574eddae35f1312c2b4b717b7885d4edd6cb46700e04f7f02db454e67c1"}, + {file = "contourpy-1.3.3-cp311-cp311-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf67e0e3f482cb69779dd3061b534eb35ac9b17f163d851e2a547d56dba0a3a"}, + {file = "contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db"}, + {file = "contourpy-1.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:598c3aaece21c503615fd59c92a3598b428b2f01bfb4b8ca9c4edeecc2438620"}, + {file = "contourpy-1.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:322ab1c99b008dad206d406bb61d014cf0174df491ae9d9d0fac6a6fda4f977f"}, + {file = "contourpy-1.3.3-cp311-cp311-win32.whl", hash = "sha256:fd907ae12cd483cd83e414b12941c632a969171bf90fc937d0c9f268a31cafff"}, + {file = "contourpy-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42"}, + {file = "contourpy-1.3.3-cp311-cp311-win_arm64.whl", hash = "sha256:15ff10bfada4bf92ec8b31c62bf7c1834c244019b4a33095a68000d7075df470"}, + {file = "contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb"}, + {file = "contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6"}, + {file = "contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7"}, + {file = "contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8"}, + {file = "contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea"}, + {file = "contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1"}, + {file = "contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7"}, + {file = "contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411"}, + {file = "contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69"}, + {file = "contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b"}, + {file = "contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc"}, + {file = "contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5"}, + {file = "contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1"}, + {file = "contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286"}, + {file = "contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5"}, + {file = "contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67"}, + {file = "contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9"}, + {file = "contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659"}, + {file = "contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7"}, + {file = "contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d"}, + {file = "contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263"}, + {file = "contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9"}, + {file = "contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d"}, + {file = "contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216"}, + {file = "contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae"}, + {file = "contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20"}, + {file = "contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99"}, + {file = "contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b"}, + {file = "contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a"}, + {file = "contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e"}, + {file = "contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3"}, + {file = "contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8"}, + {file = "contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301"}, + {file = "contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a"}, + {file = "contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77"}, + {file = "contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5"}, + {file = "contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4"}, + {file = "contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36"}, + {file = "contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3"}, + {file = "contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b"}, + {file = "contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36"}, + {file = "contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d"}, + {file = "contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd"}, + {file = "contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339"}, + {file = "contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772"}, + {file = "contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77"}, + {file = "contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13"}, + {file = "contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe"}, + {file = "contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f"}, + {file = "contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0"}, + {file = "contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4"}, + {file = "contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f"}, + {file = "contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae"}, + {file = "contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc"}, + {file = "contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b"}, + {file = "contourpy-1.3.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd5dfcaeb10f7b7f9dc8941717c6c2ade08f587be2226222c12b25f0483ed497"}, + {file = "contourpy-1.3.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0c1fc238306b35f246d61a1d416a627348b5cf0648648a031e14bb8705fcdfe8"}, + {file = "contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70f9aad7de812d6541d29d2bbf8feb22ff7e1c299523db288004e3157ff4674e"}, + {file = "contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ed3657edf08512fc3fe81b510e35c2012fbd3081d2e26160f27ca28affec989"}, + {file = "contourpy-1.3.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:3d1a3799d62d45c18bafd41c5fa05120b96a28079f2393af559b843d1a966a77"}, + {file = "contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880"}, +] + +[package.dependencies] +numpy = ">=1.25" + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["bokeh", "contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.17.0)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "wurlitzer"] + +[[package]] +name = "contractions" +version = "0.1.73" +description = "Fixes contractions such as `you're` to you `are`" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "contractions-0.1.73-py2.py3-none-any.whl", hash = "sha256:398cee3b69c37307a50dce4930d961a0f42b48fdae9562df73bed5683008d3bc"}, +] + +[package.dependencies] +textsearch = ">=0.0.21" + +[[package]] +name = "cycler" +version = "0.12.1" +description = "Composable style cycles" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, +] + +[package.extras] +docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] +tests = ["pytest", "pytest-cov", "pytest-xdist"] + +[[package]] +name = "duckdb" +version = "1.4.4" +description = "DuckDB in-process database" +optional = false +python-versions = ">=3.9.0" +groups = ["main"] +files = [ + {file = "duckdb-1.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e870a441cb1c41d556205deb665749f26347ed13b3a247b53714f5d589596977"}, + {file = "duckdb-1.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:49123b579e4a6323e65139210cd72dddc593a72d840211556b60f9703bda8526"}, + {file = "duckdb-1.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5e1933fac5293fea5926b0ee75a55b8cfe7f516d867310a5b251831ab61fe62b"}, + {file = "duckdb-1.4.4-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:707530f6637e91dc4b8125260595299ec9dd157c09f5d16c4186c5988bfbd09a"}, + {file = "duckdb-1.4.4-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:453b115f4777467f35103d8081770ac2f223fb5799178db5b06186e3ab51d1f2"}, + {file = "duckdb-1.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a3c8542db7ffb128aceb7f3b35502ebaddcd4f73f1227569306cc34bad06680c"}, + {file = "duckdb-1.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5ba684f498d4e924c7e8f30dd157da8da34c8479746c5011b6c0e037e9c60ad2"}, + {file = "duckdb-1.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5536eb952a8aa6ae56469362e344d4e6403cc945a80bc8c5c2ebdd85d85eb64b"}, + {file = "duckdb-1.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:47dd4162da6a2be59a0aef640eb08d6360df1cf83c317dcc127836daaf3b7f7c"}, + {file = "duckdb-1.4.4-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6cb357cfa3403910e79e2eb46c8e445bb1ee2fd62e9e9588c6b999df4256abc1"}, + {file = "duckdb-1.4.4-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c25d5b0febda02b7944e94fdae95aecf952797afc8cb920f677b46a7c251955"}, + {file = "duckdb-1.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:6703dd1bb650025b3771552333d305d62ddd7ff182de121483d4e042ea6e2e00"}, + {file = "duckdb-1.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:bf138201f56e5d6fc276a25138341b3523e2f84733613fc43f02c54465619a95"}, + {file = "duckdb-1.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ddcfd9c6ff234da603a1edd5fd8ae6107f4d042f74951b65f91bc5e2643856b3"}, + {file = "duckdb-1.4.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6792ca647216bd5c4ff16396e4591cfa9b4a72e5ad7cdd312cec6d67e8431a7c"}, + {file = "duckdb-1.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1f8d55843cc940e36261689054f7dfb6ce35b1f5b0953b0d355b6adb654b0d52"}, + {file = "duckdb-1.4.4-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c65d15c440c31e06baaebfd2c06d71ce877e132779d309f1edf0a85d23c07e92"}, + {file = "duckdb-1.4.4-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b297eff642503fd435a9de5a9cb7db4eccb6f61d61a55b30d2636023f149855f"}, + {file = "duckdb-1.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:d525de5f282b03aa8be6db86b1abffdceae5f1055113a03d5b50cd2fb8cf2ef8"}, + {file = "duckdb-1.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:50f2eb173c573811b44aba51176da7a4e5c487113982be6a6a1c37337ec5fa57"}, + {file = "duckdb-1.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:337f8b24e89bc2e12dadcfe87b4eb1c00fd920f68ab07bc9b70960d6523b8bc3"}, + {file = "duckdb-1.4.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0509b39ea7af8cff0198a99d206dca753c62844adab54e545984c2e2c1381616"}, + {file = "duckdb-1.4.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fb94de6d023de9d79b7edc1ae07ee1d0b4f5fa8a9dcec799650b5befdf7aafec"}, + {file = "duckdb-1.4.4-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0d636ceda422e7babd5e2f7275f6a0d1a3405e6a01873f00d38b72118d30c10b"}, + {file = "duckdb-1.4.4-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7df7351328ffb812a4a289732f500d621e7de9942a3a2c9b6d4afcf4c0e72526"}, + {file = "duckdb-1.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:6fb1225a9ea5877421481d59a6c556a9532c32c16c7ae6ca8d127e2b878c9389"}, + {file = "duckdb-1.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:f28a18cc790217e5b347bb91b2cab27aafc557c58d3d8382e04b4fe55d0c3f66"}, + {file = "duckdb-1.4.4-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:25874f8b1355e96178079e37312c3ba6d61a2354f51319dae860cf21335c3a20"}, + {file = "duckdb-1.4.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:452c5b5d6c349dc5d1154eb2062ee547296fcbd0c20e9df1ed00b5e1809089da"}, + {file = "duckdb-1.4.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8e5c2d8a0452df55e092959c0bfc8ab8897ac3ea0f754cb3b0ab3e165cd79aff"}, + {file = "duckdb-1.4.4-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1af6e76fe8bd24875dc56dd8e38300d64dc708cd2e772f67b9fbc635cc3066a3"}, + {file = "duckdb-1.4.4-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0440f59e0cd9936a9ebfcf7a13312eda480c79214ffed3878d75947fc3b7d6d"}, + {file = "duckdb-1.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:59c8d76016dde854beab844935b1ec31de358d4053e792988108e995b18c08e7"}, + {file = "duckdb-1.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:53cd6423136ab44383ec9955aefe7599b3fb3dd1fe006161e6396d8167e0e0d4"}, + {file = "duckdb-1.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8097201bc5fd0779d7fcc2f3f4736c349197235f4cb7171622936343a1aa8dbf"}, + {file = "duckdb-1.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cd1be3d48577f5b40eb9706c6b2ae10edfe18e78eb28e31a3b922dcff1183597"}, + {file = "duckdb-1.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e041f2fbd6888da090eca96ac167a7eb62d02f778385dd9155ed859f1c6b6dc8"}, + {file = "duckdb-1.4.4-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7eec0bf271ac622e57b7f6554a27a6e7d1dd2f43d1871f7962c74bcbbede15ba"}, + {file = "duckdb-1.4.4-cp39-cp39-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5cdc4126ec925edf3112bc656ac9ed23745294b854935fa7a643a216e4455af6"}, + {file = "duckdb-1.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:c9566a4ed834ec7999db5849f53da0a7ee83d86830c33f471bf0211a1148ca12"}, + {file = "duckdb-1.4.4.tar.gz", hash = "sha256:8bba52fd2acb67668a4615ee17ee51814124223de836d9e2fdcbc4c9021b3d3c"}, +] + +[package.extras] +all = ["adbc-driver-manager", "fsspec", "ipython", "numpy", "pandas", "pyarrow"] + +[[package]] +name = "elementpath" +version = "4.8.0" +description = "XPath 1.0/2.0/3.0/3.1 parsers and selectors for ElementTree and lxml" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "elementpath-4.8.0-py3-none-any.whl", hash = "sha256:5393191f84969bcf8033b05ec4593ef940e58622ea13cefe60ecefbbf09d58d9"}, + {file = "elementpath-4.8.0.tar.gz", hash = "sha256:5822a2560d99e2633d95f78694c7ff9646adaa187db520da200a8e9479dc46ae"}, +] + +[package.extras] +dev = ["Sphinx", "coverage", "flake8", "lxml", "lxml-stubs", "memory-profiler", "memray", "mypy", "tox", "xmlschema (>=3.3.2)"] + +[[package]] +name = "falcon" +version = "4.2.0" +description = "The ultra-reliable, fast ASGI+WSGI framework for building data plane APIs at scale." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "falcon-4.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8b179c9de6aa29eaa2ab49cac94eb304f279b66c7073be915cef5d6ae1f8b69d"}, + {file = "falcon-4.2.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd6b0c04c5e8ee56ec3acec2c8603cfcc39658d7793ea86ecf058b094840c222"}, + {file = "falcon-4.2.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:05cd6dcf4cae4ad1cbbe6a11c9d63b35bb6f35422f778a292bc13f91f2504ad5"}, + {file = "falcon-4.2.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d045396a6d40f5d1bbe3eaf59496a382840db1c8841fe38ba8d45018fd3a184b"}, + {file = "falcon-4.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bd62565115df5b8b0780713979c285f3d84d4300f8d1c367b0678315eac6db63"}, + {file = "falcon-4.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9a0e2de9bd9a9b7d8644e44e49f26675fa753665b6a2ab3e9539c64bc636e398"}, + {file = "falcon-4.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:03c80035378b8b03375f7a7debd11d3b33cdb5b732d882e65b580afe9f937832"}, + {file = "falcon-4.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2faf74b996ad36fed2981a479f1d1d5e2f01b36f648746197285f38002022ad4"}, + {file = "falcon-4.2.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea18a598686b6a84cb59ce9afdd518f6bd5e79d9301290636645b5c81277621"}, + {file = "falcon-4.2.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:99ea076c290d092d052d4ec132238bbe5c414bee30b42621f814133ad62aad93"}, + {file = "falcon-4.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4e146967a4ff16c1a8f84971f5d2af81ba0b4ef13caf583e8094aa5ec9511d80"}, + {file = "falcon-4.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f159b8334686716d61f7e5c82c897f2d21013f38904fe3aafe7d83c5fbd98a4d"}, + {file = "falcon-4.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9c93dd7770e3b1cc5f0bc08f23ec954ae00d1b408f7255efa806697fdf38b345"}, + {file = "falcon-4.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:429974363bbb9ed4e98401c71be54f319559695e499238a51905895371c40fa7"}, + {file = "falcon-4.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:05832f66d54e178ae1df1dffe25c80a076448dc261cf6c50b271051b6cf56f0e"}, + {file = "falcon-4.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f7d454888ed6238f6d00406bfedf976b05157e001fc6a18a473ec1e2be35e6c"}, + {file = "falcon-4.2.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:353c69fe78b23dfa4fbe0ae78aa7d1ec2fe1c9db3c46b5a3e20d8f731b483b65"}, + {file = "falcon-4.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:66db3bd0e51723b299e31746a6c28c063ee0048988d9ef2f1d05245fd97bebf8"}, + {file = "falcon-4.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5d89a61285b49fb503c30cb11203694aba6d3e0f2e7cc5cad3676ce221d3a514"}, + {file = "falcon-4.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:02d3b1fb18393ed55315e04533eefd3f86d85d294212bf49895c5768007e58c9"}, + {file = "falcon-4.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:d3c9882f8bf98bd2bf0ab2a9378c108dfba33a41625cfe2f8106e060258b52ef"}, + {file = "falcon-4.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:00363f9d9273a1281ca7aa1d9dbecea09c172e7bb08e0acefa0a0234a3f94593"}, + {file = "falcon-4.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cd2059695f107e867fd12141d05771d5c6cbecc30a135f7d91ef06bfea94f05e"}, + {file = "falcon-4.2.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e0b1f69a97b3406feba07f41dde177b4c3dfa7046f6b977d4554772dc26252e7"}, + {file = "falcon-4.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4a54fa6c5f8a428a2e9b7ff7b936c566fe7bdcc50f965cea37fee9523eab1b74"}, + {file = "falcon-4.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:801e2c77c72b1777d09be7a72163b38209f5f9e42930bfe3dfdf027e7d84d035"}, + {file = "falcon-4.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f998402bf889cdd23cde29e7421469cdf2ef95afc71b2cdef7ed4957d0cd97f6"}, + {file = "falcon-4.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:584d000e9ffae5044f5fe6bf74d399edebb54926bb4a133d3caf03e529b8c616"}, + {file = "falcon-4.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ae9304c60b5fe84ffb35e91e1a1f071543a303edb252999800531ea01133c0d4"}, + {file = "falcon-4.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:16533a0ade619cc8e7f670330d4c12fa0bff74de88bfb29f3d3cf1b2023d31b8"}, + {file = "falcon-4.2.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1f3ddffc958d4e625281a321164c77ebbf537c0f2f5290b06ee1144b90386a5f"}, + {file = "falcon-4.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0c501f8206b9bf361826bfe8f108c7368afcae64df3ed38589b9becefdfad63"}, + {file = "falcon-4.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:402f38101b434415ecff72e5aa440c4f71ab45a879f455ab7d5655050e8ed218"}, + {file = "falcon-4.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2ca9194a3e8a9eace3bc0efaef50b4244beabd75cdd716611e244646efc6828a"}, + {file = "falcon-4.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:e0bd6384952b9e12d3ae84675df4862bdbaa1111cd52db17d70cdf60f8abe4b6"}, + {file = "falcon-4.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de67c7ed58a124f9f04337d254ec9db0e9fa0772d25f1c8f260c1c47878dc556"}, + {file = "falcon-4.2.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd8c19241aa66ecf494cd16d1cdc71de2cfbb3f76cafb7176e92708786001340"}, + {file = "falcon-4.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:aef6cd21a6e1b51c79038ff2e0b30746a68c7710307e5f5f0839338d7129577c"}, + {file = "falcon-4.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c132bb94351bddde993aad5147f9f3d9a942e2d93aece9d693723fb96fc8f51"}, + {file = "falcon-4.2.0-py3-none-any.whl", hash = "sha256:1d64afeca0dc03e7bed0202681dab4844544d8f6855c23e13f11a6eb10ac50ff"}, + {file = "falcon-4.2.0.tar.gz", hash = "sha256:c13e86e49696d6655411fe09473c34997e49ff45e8cdf7576297b0ca71ceac3d"}, +] + +[package.extras] +test = ["pytest"] + +[[package]] +name = "fastjsonschema" +version = "2.21.2" +description = "Fastest Python implementation of JSON schema" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463"}, + {file = "fastjsonschema-2.21.2.tar.gz", hash = "sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de"}, +] + +[package.extras] +devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] + +[[package]] +name = "fonttools" +version = "4.61.1" +description = "Tools to manipulate font files" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "fonttools-4.61.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c7db70d57e5e1089a274cbb2b1fd635c9a24de809a231b154965d415d6c6d24"}, + {file = "fonttools-4.61.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5fe9fd43882620017add5eabb781ebfbc6998ee49b35bd7f8f79af1f9f99a958"}, + {file = "fonttools-4.61.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8db08051fc9e7d8bc622f2112511b8107d8f27cd89e2f64ec45e9825e8288da"}, + {file = "fonttools-4.61.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a76d4cb80f41ba94a6691264be76435e5f72f2cb3cab0b092a6212855f71c2f6"}, + {file = "fonttools-4.61.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a13fc8aeb24bad755eea8f7f9d409438eb94e82cf86b08fe77a03fbc8f6a96b1"}, + {file = "fonttools-4.61.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b846a1fcf8beadeb9ea4f44ec5bdde393e2f1569e17d700bfc49cd69bde75881"}, + {file = "fonttools-4.61.1-cp310-cp310-win32.whl", hash = "sha256:78a7d3ab09dc47ac1a363a493e6112d8cabed7ba7caad5f54dbe2f08676d1b47"}, + {file = "fonttools-4.61.1-cp310-cp310-win_amd64.whl", hash = "sha256:eff1ac3cc66c2ac7cda1e64b4e2f3ffef474b7335f92fc3833fc632d595fcee6"}, + {file = "fonttools-4.61.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c6604b735bb12fef8e0efd5578c9fb5d3d8532d5001ea13a19cddf295673ee09"}, + {file = "fonttools-4.61.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5ce02f38a754f207f2f06557523cd39a06438ba3aafc0639c477ac409fc64e37"}, + {file = "fonttools-4.61.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77efb033d8d7ff233385f30c62c7c79271c8885d5c9657d967ede124671bbdfb"}, + {file = "fonttools-4.61.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:75c1a6dfac6abd407634420c93864a1e274ebc1c7531346d9254c0d8f6ca00f9"}, + {file = "fonttools-4.61.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0de30bfe7745c0d1ffa2b0b7048fb7123ad0d71107e10ee090fa0b16b9452e87"}, + {file = "fonttools-4.61.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58b0ee0ab5b1fc9921eccfe11d1435added19d6494dde14e323f25ad2bc30c56"}, + {file = "fonttools-4.61.1-cp311-cp311-win32.whl", hash = "sha256:f79b168428351d11e10c5aeb61a74e1851ec221081299f4cf56036a95431c43a"}, + {file = "fonttools-4.61.1-cp311-cp311-win_amd64.whl", hash = "sha256:fe2efccb324948a11dd09d22136fe2ac8a97d6c1347cf0b58a911dcd529f66b7"}, + {file = "fonttools-4.61.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f3cb4a569029b9f291f88aafc927dd53683757e640081ca8c412781ea144565e"}, + {file = "fonttools-4.61.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41a7170d042e8c0024703ed13b71893519a1a6d6e18e933e3ec7507a2c26a4b2"}, + {file = "fonttools-4.61.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10d88e55330e092940584774ee5e8a6971b01fc2f4d3466a1d6c158230880796"}, + {file = "fonttools-4.61.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:15acc09befd16a0fb8a8f62bc147e1a82817542d72184acca9ce6e0aeda9fa6d"}, + {file = "fonttools-4.61.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e6bcdf33aec38d16508ce61fd81838f24c83c90a1d1b8c68982857038673d6b8"}, + {file = "fonttools-4.61.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5fade934607a523614726119164ff621e8c30e8fa1ffffbbd358662056ba69f0"}, + {file = "fonttools-4.61.1-cp312-cp312-win32.whl", hash = "sha256:75da8f28eff26defba42c52986de97b22106cb8f26515b7c22443ebc9c2d3261"}, + {file = "fonttools-4.61.1-cp312-cp312-win_amd64.whl", hash = "sha256:497c31ce314219888c0e2fce5ad9178ca83fe5230b01a5006726cdf3ac9f24d9"}, + {file = "fonttools-4.61.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c56c488ab471628ff3bfa80964372fc13504ece601e0d97a78ee74126b2045c"}, + {file = "fonttools-4.61.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc492779501fa723b04d0ab1f5be046797fee17d27700476edc7ee9ae535a61e"}, + {file = "fonttools-4.61.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:64102ca87e84261419c3747a0d20f396eb024bdbeb04c2bfb37e2891f5fadcb5"}, + {file = "fonttools-4.61.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c1b526c8d3f615a7b1867f38a9410849c8f4aef078535742198e942fba0e9bd"}, + {file = "fonttools-4.61.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:41ed4b5ec103bd306bb68f81dc166e77409e5209443e5773cb4ed837bcc9b0d3"}, + {file = "fonttools-4.61.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b501c862d4901792adaec7c25b1ecc749e2662543f68bb194c42ba18d6eec98d"}, + {file = "fonttools-4.61.1-cp313-cp313-win32.whl", hash = "sha256:4d7092bb38c53bbc78e9255a59158b150bcdc115a1e3b3ce0b5f267dc35dd63c"}, + {file = "fonttools-4.61.1-cp313-cp313-win_amd64.whl", hash = "sha256:21e7c8d76f62ab13c9472ccf74515ca5b9a761d1bde3265152a6dc58700d895b"}, + {file = "fonttools-4.61.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fff4f534200a04b4a36e7ae3cb74493afe807b517a09e99cb4faa89a34ed6ecd"}, + {file = "fonttools-4.61.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d9203500f7c63545b4ce3799319fe4d9feb1a1b89b28d3cb5abd11b9dd64147e"}, + {file = "fonttools-4.61.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fa646ecec9528bef693415c79a86e733c70a4965dd938e9a226b0fc64c9d2e6c"}, + {file = "fonttools-4.61.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11f35ad7805edba3aac1a3710d104592df59f4b957e30108ae0ba6c10b11dd75"}, + {file = "fonttools-4.61.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b931ae8f62db78861b0ff1ac017851764602288575d65b8e8ff1963fed419063"}, + {file = "fonttools-4.61.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b148b56f5de675ee16d45e769e69f87623a4944f7443850bf9a9376e628a89d2"}, + {file = "fonttools-4.61.1-cp314-cp314-win32.whl", hash = "sha256:9b666a475a65f4e839d3d10473fad6d47e0a9db14a2f4a224029c5bfde58ad2c"}, + {file = "fonttools-4.61.1-cp314-cp314-win_amd64.whl", hash = "sha256:4f5686e1fe5fce75d82d93c47a438a25bf0d1319d2843a926f741140b2b16e0c"}, + {file = "fonttools-4.61.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:e76ce097e3c57c4bcb67c5aa24a0ecdbd9f74ea9219997a707a4061fbe2707aa"}, + {file = "fonttools-4.61.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:9cfef3ab326780c04d6646f68d4b4742aae222e8b8ea1d627c74e38afcbc9d91"}, + {file = "fonttools-4.61.1-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a75c301f96db737e1c5ed5fd7d77d9c34466de16095a266509e13da09751bd19"}, + {file = "fonttools-4.61.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:91669ccac46bbc1d09e9273546181919064e8df73488ea087dcac3e2968df9ba"}, + {file = "fonttools-4.61.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c33ab3ca9d3ccd581d58e989d67554e42d8d4ded94ab3ade3508455fe70e65f7"}, + {file = "fonttools-4.61.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:664c5a68ec406f6b1547946683008576ef8b38275608e1cee6c061828171c118"}, + {file = "fonttools-4.61.1-cp314-cp314t-win32.whl", hash = "sha256:aed04cabe26f30c1647ef0e8fbb207516fd40fe9472e9439695f5c6998e60ac5"}, + {file = "fonttools-4.61.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2180f14c141d2f0f3da43f3a81bc8aa4684860f6b0e6f9e165a4831f24e6a23b"}, + {file = "fonttools-4.61.1-py3-none-any.whl", hash = "sha256:17d2bf5d541add43822bcf0c43d7d847b160c9bb01d15d5007d84e2217aaa371"}, + {file = "fonttools-4.61.1.tar.gz", hash = "sha256:6675329885c44657f826ef01d9e4fb33b9158e9d93c537d84ad8399539bc6f69"}, +] + +[package.extras] +all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.45.0)", "unicodedata2 (>=17.0.0) ; python_version <= \"3.14\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\""] +lxml = ["lxml (>=4.0)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.45.0)"] +symfont = ["sympy"] +type1 = ["xattr ; sys_platform == \"darwin\""] +unicode = ["unicodedata2 (>=17.0.0) ; python_version <= \"3.14\""] +woff = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "zopfli (>=0.1.4)"] + +[[package]] +name = "idna" +version = "3.11" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea"}, + {file = "idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902"}, +] + +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + +[[package]] +name = "imbalanced-learn" +version = "0.12.4" +description = "Toolbox for imbalanced dataset in machine learning." +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "imbalanced-learn-0.12.4.tar.gz", hash = "sha256:8153ba385d296b07d97e0901a2624a86c06b48c94c2f92da3a5354827697b7a3"}, + {file = "imbalanced_learn-0.12.4-py3-none-any.whl", hash = "sha256:d47fc599160d3ea882e712a3a6b02bdd353c1a6436d8d68d41b1922e6ee4a703"}, +] + +[package.dependencies] +joblib = ">=1.1.1" +numpy = ">=1.17.3" +scikit-learn = ">=1.0.2" +scipy = ">=1.5.0" +threadpoolctl = ">=2.0.0" + +[package.extras] +docs = ["keras (>=2.4.3)", "matplotlib (>=3.1.2)", "memory-profiler (>=0.57.0)", "numpydoc (>=1.5.0)", "pandas (>=1.0.5)", "pydata-sphinx-theme (>=0.13.3)", "seaborn (>=0.9.0)", "sphinx (>=6.0.0)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.5.0)", "sphinx-gallery (>=0.13.0)", "sphinxcontrib-bibtex (>=2.4.1)", "tensorflow (>=2.4.3)"] +examples = ["keras (>=2.4.3)", "matplotlib (>=3.1.2)", "pandas (>=1.0.5)", "seaborn (>=0.9.0)", "tensorflow (>=2.4.3)"] +optional = ["keras (>=2.4.3)", "pandas (>=1.0.5)", "tensorflow (>=2.4.3)"] +tests = ["black (>=23.3.0)", "flake8 (>=3.8.2)", "keras (>=2.4.3)", "mypy (>=1.3.0)", "pandas (>=1.0.5)", "pytest (>=5.0.1)", "pytest-cov (>=2.9.0)", "tensorflow (>=2.4.3)"] + +[[package]] +name = "inflect" +version = "7.5.0" +description = "Correctly generate plurals, singular nouns, ordinals, indefinite articles" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "inflect-7.5.0-py3-none-any.whl", hash = "sha256:2aea70e5e70c35d8350b8097396ec155ffd68def678c7ff97f51aa69c1d92344"}, + {file = "inflect-7.5.0.tar.gz", hash = "sha256:faf19801c3742ed5a05a8ce388e0d8fe1a07f8d095c82201eb904f5d27ad571f"}, +] + +[package.dependencies] +more_itertools = ">=8.5.0" +typeguard = ">=4.0.1" + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["pygments", "pytest (>=6,!=8.1.*)"] +type = ["pytest-mypy"] + +[[package]] +name = "iniconfig" +version = "2.3.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12"}, + {file = "iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730"}, +] + +[[package]] +name = "joblib" +version = "1.5.3" +description = "Lightweight pipelining with Python functions" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "joblib-1.5.3-py3-none-any.whl", hash = "sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713"}, + {file = "joblib-1.5.3.tar.gz", hash = "sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3"}, +] + +[[package]] +name = "jsonpath-python" +version = "1.0.6" +description = "A more powerful JSONPath implementation in modern python" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "jsonpath-python-1.0.6.tar.gz", hash = "sha256:dd5be4a72d8a2995c3f583cf82bf3cd1a9544cfdabf2d22595b67aff07349666"}, + {file = "jsonpath_python-1.0.6-py3-none-any.whl", hash = "sha256:1e3b78df579f5efc23565293612decee04214609208a2335884b3ee3f786b575"}, +] + +[[package]] +name = "jsonschema" +version = "4.26.0" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce"}, + {file = "jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" +rpds-py = ">=0.25.0" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "rfc3987-syntax (>=1.1.0)", "uri-template", "webcolors (>=24.6.0)"] + +[[package]] +name = "jsonschema-specifications" +version = "2025.9.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe"}, + {file = "jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d"}, +] + +[package.dependencies] +referencing = ">=0.31.0" + +[[package]] +name = "jupyter-core" +version = "5.9.1" +description = "Jupyter core package. A base package on which Jupyter projects rely." +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "jupyter_core-5.9.1-py3-none-any.whl", hash = "sha256:ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407"}, + {file = "jupyter_core-5.9.1.tar.gz", hash = "sha256:4d09aaff303b9566c3ce657f580bd089ff5c91f5f89cf7d8846c3cdf465b5508"}, +] + +[package.dependencies] +platformdirs = ">=2.5" +traitlets = ">=5.3" + +[package.extras] +docs = ["intersphinx-registry", "myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-spelling", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest (<9)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "kiwisolver" +version = "1.4.9" +description = "A fast implementation of the Cassowary constraint solver" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "kiwisolver-1.4.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b4b4d74bda2b8ebf4da5bd42af11d02d04428b2c32846e4c2c93219df8a7987b"}, + {file = "kiwisolver-1.4.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fb3b8132019ea572f4611d770991000d7f58127560c4889729248eb5852a102f"}, + {file = "kiwisolver-1.4.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84fd60810829c27ae375114cd379da1fa65e6918e1da405f356a775d49a62bcf"}, + {file = "kiwisolver-1.4.9-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b78efa4c6e804ecdf727e580dbb9cba85624d2e1c6b5cb059c66290063bd99a9"}, + {file = "kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4efec7bcf21671db6a3294ff301d2fc861c31faa3c8740d1a94689234d1b415"}, + {file = "kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:90f47e70293fc3688b71271100a1a5453aa9944a81d27ff779c108372cf5567b"}, + {file = "kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8fdca1def57a2e88ef339de1737a1449d6dbf5fab184c54a1fca01d541317154"}, + {file = "kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9cf554f21be770f5111a1690d42313e140355e687e05cf82cb23d0a721a64a48"}, + {file = "kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fc1795ac5cd0510207482c3d1d3ed781143383b8cfd36f5c645f3897ce066220"}, + {file = "kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ccd09f20ccdbbd341b21a67ab50a119b64a403b09288c27481575105283c1586"}, + {file = "kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:540c7c72324d864406a009d72f5d6856f49693db95d1fbb46cf86febef873634"}, + {file = "kiwisolver-1.4.9-cp310-cp310-win_amd64.whl", hash = "sha256:ede8c6d533bc6601a47ad4046080d36b8fc99f81e6f1c17b0ac3c2dc91ac7611"}, + {file = "kiwisolver-1.4.9-cp310-cp310-win_arm64.whl", hash = "sha256:7b4da0d01ac866a57dd61ac258c5607b4cd677f63abaec7b148354d2b2cdd536"}, + {file = "kiwisolver-1.4.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eb14a5da6dc7642b0f3a18f13654847cd8b7a2550e2645a5bda677862b03ba16"}, + {file = "kiwisolver-1.4.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:39a219e1c81ae3b103643d2aedb90f1ef22650deb266ff12a19e7773f3e5f089"}, + {file = "kiwisolver-1.4.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2405a7d98604b87f3fc28b1716783534b1b4b8510d8142adca34ee0bc3c87543"}, + {file = "kiwisolver-1.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dc1ae486f9abcef254b5618dfb4113dd49f94c68e3e027d03cf0143f3f772b61"}, + {file = "kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a1f570ce4d62d718dce3f179ee78dac3b545ac16c0c04bb363b7607a949c0d1"}, + {file = "kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb27e7b78d716c591e88e0a09a2139c6577865d7f2e152488c2cc6257f460872"}, + {file = "kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:15163165efc2f627eb9687ea5f3a28137217d217ac4024893d753f46bce9de26"}, + {file = "kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bdee92c56a71d2b24c33a7d4c2856bd6419d017e08caa7802d2963870e315028"}, + {file = "kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:412f287c55a6f54b0650bd9b6dce5aceddb95864a1a90c87af16979d37c89771"}, + {file = "kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2c93f00dcba2eea70af2be5f11a830a742fe6b579a1d4e00f47760ef13be247a"}, + {file = "kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f117e1a089d9411663a3207ba874f31be9ac8eaa5b533787024dc07aeb74f464"}, + {file = "kiwisolver-1.4.9-cp311-cp311-win_amd64.whl", hash = "sha256:be6a04e6c79819c9a8c2373317d19a96048e5a3f90bec587787e86a1153883c2"}, + {file = "kiwisolver-1.4.9-cp311-cp311-win_arm64.whl", hash = "sha256:0ae37737256ba2de764ddc12aed4956460277f00c4996d51a197e72f62f5eec7"}, + {file = "kiwisolver-1.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ac5a486ac389dddcc5bef4f365b6ae3ffff2c433324fb38dd35e3fab7c957999"}, + {file = "kiwisolver-1.4.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f2ba92255faa7309d06fe44c3a4a97efe1c8d640c2a79a5ef728b685762a6fd2"}, + {file = "kiwisolver-1.4.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a2899935e724dd1074cb568ce7ac0dce28b2cd6ab539c8e001a8578eb106d14"}, + {file = "kiwisolver-1.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f6008a4919fdbc0b0097089f67a1eb55d950ed7e90ce2cc3e640abadd2757a04"}, + {file = "kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:67bb8b474b4181770f926f7b7d2f8c0248cbcb78b660fdd41a47054b28d2a752"}, + {file = "kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2327a4a30d3ee07d2fbe2e7933e8a37c591663b96ce42a00bc67461a87d7df77"}, + {file = "kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a08b491ec91b1d5053ac177afe5290adacf1f0f6307d771ccac5de30592d198"}, + {file = "kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8fc5c867c22b828001b6a38d2eaeb88160bf5783c6cb4a5e440efc981ce286d"}, + {file = "kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3b3115b2581ea35bb6d1f24a4c90af37e5d9b49dcff267eeed14c3893c5b86ab"}, + {file = "kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858e4c22fb075920b96a291928cb7dea5644e94c0ee4fcd5af7e865655e4ccf2"}, + {file = "kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ed0fecd28cc62c54b262e3736f8bb2512d8dcfdc2bcf08be5f47f96bf405b145"}, + {file = "kiwisolver-1.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:f68208a520c3d86ea51acf688a3e3002615a7f0238002cccc17affecc86a8a54"}, + {file = "kiwisolver-1.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:2c1a4f57df73965f3f14df20b80ee29e6a7930a57d2d9e8491a25f676e197c60"}, + {file = "kiwisolver-1.4.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a5d0432ccf1c7ab14f9949eec60c5d1f924f17c037e9f8b33352fa05799359b8"}, + {file = "kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efb3a45b35622bb6c16dbfab491a8f5a391fe0e9d45ef32f4df85658232ca0e2"}, + {file = "kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a12cf6398e8a0a001a059747a1cbf24705e18fe413bc22de7b3d15c67cffe3f"}, + {file = "kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b67e6efbf68e077dd71d1a6b37e43e1a99d0bff1a3d51867d45ee8908b931098"}, + {file = "kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5656aa670507437af0207645273ccdfee4f14bacd7f7c67a4306d0dcaeaf6eed"}, + {file = "kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bfc08add558155345129c7803b3671cf195e6a56e7a12f3dde7c57d9b417f525"}, + {file = "kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:40092754720b174e6ccf9e845d0d8c7d8e12c3d71e7fc35f55f3813e96376f78"}, + {file = "kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:497d05f29a1300d14e02e6441cf0f5ee81c1ff5a304b0d9fb77423974684e08b"}, + {file = "kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdd1a81a1860476eb41ac4bc1e07b3f07259e6d55bbf739b79c8aaedcf512799"}, + {file = "kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e6b93f13371d341afee3be9f7c5964e3fe61d5fa30f6a30eb49856935dfe4fc3"}, + {file = "kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d75aa530ccfaa593da12834b86a0724f58bff12706659baa9227c2ccaa06264c"}, + {file = "kiwisolver-1.4.9-cp313-cp313-win_amd64.whl", hash = "sha256:dd0a578400839256df88c16abddf9ba14813ec5f21362e1fe65022e00c883d4d"}, + {file = "kiwisolver-1.4.9-cp313-cp313-win_arm64.whl", hash = "sha256:d4188e73af84ca82468f09cadc5ac4db578109e52acb4518d8154698d3a87ca2"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:5a0f2724dfd4e3b3ac5a82436a8e6fd16baa7d507117e4279b660fe8ca38a3a1"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1b11d6a633e4ed84fc0ddafd4ebfd8ea49b3f25082c04ad12b8315c11d504dc1"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61874cdb0a36016354853593cffc38e56fc9ca5aa97d2c05d3dcf6922cd55a11"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:60c439763a969a6af93b4881db0eed8fadf93ee98e18cbc35bc8da868d0c4f0c"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92a2f997387a1b79a75e7803aa7ded2cfbe2823852ccf1ba3bcf613b62ae3197"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a31d512c812daea6d8b3be3b2bfcbeb091dbb09177706569bcfc6240dcf8b41c"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:52a15b0f35dad39862d376df10c5230155243a2c1a436e39eb55623ccbd68185"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a30fd6fdef1430fd9e1ba7b3398b5ee4e2887783917a687d86ba69985fb08748"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cc9617b46837c6468197b5945e196ee9ca43057bb7d9d1ae688101e4e1dddf64"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:0ab74e19f6a2b027ea4f845a78827969af45ce790e6cb3e1ebab71bdf9f215ff"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dba5ee5d3981160c28d5490f0d1b7ed730c22470ff7f6cc26cfcfaacb9896a07"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-win_arm64.whl", hash = "sha256:0749fd8f4218ad2e851e11cc4dc05c7cbc0cbc4267bdfdb31782e65aace4ee9c"}, + {file = "kiwisolver-1.4.9-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:9928fe1eb816d11ae170885a74d074f57af3a0d65777ca47e9aeb854a1fba386"}, + {file = "kiwisolver-1.4.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d0005b053977e7b43388ddec89fa567f43d4f6d5c2c0affe57de5ebf290dc552"}, + {file = "kiwisolver-1.4.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2635d352d67458b66fd0667c14cb1d4145e9560d503219034a18a87e971ce4f3"}, + {file = "kiwisolver-1.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:767c23ad1c58c9e827b649a9ab7809fd5fd9db266a9cf02b0e926ddc2c680d58"}, + {file = "kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72d0eb9fba308b8311685c2268cf7d0a0639a6cd027d8128659f72bdd8a024b4"}, + {file = "kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f68e4f3eeca8fb22cc3d731f9715a13b652795ef657a13df1ad0c7dc0e9731df"}, + {file = "kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d84cd4061ae292d8ac367b2c3fa3aad11cb8625a95d135fe93f286f914f3f5a6"}, + {file = "kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a60ea74330b91bd22a29638940d115df9dc00af5035a9a2a6ad9399ffb4ceca5"}, + {file = "kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ce6a3a4e106cf35c2d9c4fa17c05ce0b180db622736845d4315519397a77beaf"}, + {file = "kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:77937e5e2a38a7b48eef0585114fe7930346993a88060d0bf886086d2aa49ef5"}, + {file = "kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:24c175051354f4a28c5d6a31c93906dc653e2bf234e8a4bbfb964892078898ce"}, + {file = "kiwisolver-1.4.9-cp314-cp314-win_amd64.whl", hash = "sha256:0763515d4df10edf6d06a3c19734e2566368980d21ebec439f33f9eb936c07b7"}, + {file = "kiwisolver-1.4.9-cp314-cp314-win_arm64.whl", hash = "sha256:0e4e2bf29574a6a7b7f6cb5fa69293b9f96c928949ac4a53ba3f525dffb87f9c"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d976bbb382b202f71c67f77b0ac11244021cfa3f7dfd9e562eefcea2df711548"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2489e4e5d7ef9a1c300a5e0196e43d9c739f066ef23270607d45aba368b91f2d"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e2ea9f7ab7fbf18fffb1b5434ce7c69a07582f7acc7717720f1d69f3e806f90c"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b34e51affded8faee0dfdb705416153819d8ea9250bbbf7ea1b249bdeb5f1122"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8aacd3d4b33b772542b2e01beb50187536967b514b00003bdda7589722d2a64"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7cf974dd4e35fa315563ac99d6287a1024e4dc2077b8a7d7cd3d2fb65d283134"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:85bd218b5ecfbee8c8a82e121802dcb519a86044c9c3b2e4aef02fa05c6da370"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0856e241c2d3df4efef7c04a1e46b1936b6120c9bcf36dd216e3acd84bc4fb21"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9af39d6551f97d31a4deebeac6f45b156f9755ddc59c07b402c148f5dbb6482a"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:bb4ae2b57fc1d8cbd1cf7b1d9913803681ffa903e7488012be5b76dedf49297f"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:aedff62918805fb62d43a4aa2ecd4482c380dc76cd31bd7c8878588a61bd0369"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-win_amd64.whl", hash = "sha256:1fa333e8b2ce4d9660f2cda9c0e1b6bafcfb2457a9d259faa82289e73ec24891"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-win_arm64.whl", hash = "sha256:4a48a2ce79d65d363597ef7b567ce3d14d68783d2b2263d98db3d9477805ba32"}, + {file = "kiwisolver-1.4.9-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4d1d9e582ad4d63062d34077a9a1e9f3c34088a2ec5135b1f7190c07cf366527"}, + {file = "kiwisolver-1.4.9-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:deed0c7258ceb4c44ad5ec7d9918f9f14fd05b2be86378d86cf50e63d1e7b771"}, + {file = "kiwisolver-1.4.9-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0a590506f303f512dff6b7f75fd2fd18e16943efee932008fe7140e5fa91d80e"}, + {file = "kiwisolver-1.4.9-pp310-pypy310_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e09c2279a4d01f099f52d5c4b3d9e208e91edcbd1a175c9662a8b16e000fece9"}, + {file = "kiwisolver-1.4.9-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c9e7cdf45d594ee04d5be1b24dd9d49f3d1590959b2271fb30b5ca2b262c00fb"}, + {file = "kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:720e05574713db64c356e86732c0f3c5252818d05f9df320f0ad8380641acea5"}, + {file = "kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:17680d737d5335b552994a2008fab4c851bcd7de33094a82067ef3a576ff02fa"}, + {file = "kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:85b5352f94e490c028926ea567fc569c52ec79ce131dadb968d3853e809518c2"}, + {file = "kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:464415881e4801295659462c49461a24fb107c140de781d55518c4b80cb6790f"}, + {file = "kiwisolver-1.4.9-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:fb940820c63a9590d31d88b815e7a3aa5915cad3ce735ab45f0c730b39547de1"}, + {file = "kiwisolver-1.4.9.tar.gz", hash = "sha256:c3b22c26c6fd6811b0ae8363b95ca8ce4ea3c202d3d0975b2914310ceb1bcc4d"}, +] + +[[package]] +name = "lxml" +version = "5.4.0" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "lxml-5.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e7bc6df34d42322c5289e37e9971d6ed114e3776b45fa879f734bded9d1fea9c"}, + {file = "lxml-5.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6854f8bd8a1536f8a1d9a3655e6354faa6406621cf857dc27b681b69860645c7"}, + {file = "lxml-5.4.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:696ea9e87442467819ac22394ca36cb3d01848dad1be6fac3fb612d3bd5a12cf"}, + {file = "lxml-5.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ef80aeac414f33c24b3815ecd560cee272786c3adfa5f31316d8b349bfade28"}, + {file = "lxml-5.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b9c2754cef6963f3408ab381ea55f47dabc6f78f4b8ebb0f0b25cf1ac1f7609"}, + {file = "lxml-5.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7a62cc23d754bb449d63ff35334acc9f5c02e6dae830d78dab4dd12b78a524f4"}, + {file = "lxml-5.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f82125bc7203c5ae8633a7d5d20bcfdff0ba33e436e4ab0abc026a53a8960b7"}, + {file = "lxml-5.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:b67319b4aef1a6c56576ff544b67a2a6fbd7eaee485b241cabf53115e8908b8f"}, + {file = "lxml-5.4.0-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:a8ef956fce64c8551221f395ba21d0724fed6b9b6242ca4f2f7beb4ce2f41997"}, + {file = "lxml-5.4.0-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:0a01ce7d8479dce84fc03324e3b0c9c90b1ece9a9bb6a1b6c9025e7e4520e78c"}, + {file = "lxml-5.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:91505d3ddebf268bb1588eb0f63821f738d20e1e7f05d3c647a5ca900288760b"}, + {file = "lxml-5.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a3bcdde35d82ff385f4ede021df801b5c4a5bcdfb61ea87caabcebfc4945dc1b"}, + {file = "lxml-5.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:aea7c06667b987787c7d1f5e1dfcd70419b711cdb47d6b4bb4ad4b76777a0563"}, + {file = "lxml-5.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:a7fb111eef4d05909b82152721a59c1b14d0f365e2be4c742a473c5d7372f4f5"}, + {file = "lxml-5.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:43d549b876ce64aa18b2328faff70f5877f8c6dede415f80a2f799d31644d776"}, + {file = "lxml-5.4.0-cp310-cp310-win32.whl", hash = "sha256:75133890e40d229d6c5837b0312abbe5bac1c342452cf0e12523477cd3aa21e7"}, + {file = "lxml-5.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:de5b4e1088523e2b6f730d0509a9a813355b7f5659d70eb4f319c76beea2e250"}, + {file = "lxml-5.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:98a3912194c079ef37e716ed228ae0dcb960992100461b704aea4e93af6b0bb9"}, + {file = "lxml-5.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0ea0252b51d296a75f6118ed0d8696888e7403408ad42345d7dfd0d1e93309a7"}, + {file = "lxml-5.4.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b92b69441d1bd39f4940f9eadfa417a25862242ca2c396b406f9272ef09cdcaa"}, + {file = "lxml-5.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20e16c08254b9b6466526bc1828d9370ee6c0d60a4b64836bc3ac2917d1e16df"}, + {file = "lxml-5.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7605c1c32c3d6e8c990dd28a0970a3cbbf1429d5b92279e37fda05fb0c92190e"}, + {file = "lxml-5.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ecf4c4b83f1ab3d5a7ace10bafcb6f11df6156857a3c418244cef41ca9fa3e44"}, + {file = "lxml-5.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cef4feae82709eed352cd7e97ae062ef6ae9c7b5dbe3663f104cd2c0e8d94ba"}, + {file = "lxml-5.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:df53330a3bff250f10472ce96a9af28628ff1f4efc51ccba351a8820bca2a8ba"}, + {file = "lxml-5.4.0-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:aefe1a7cb852fa61150fcb21a8c8fcea7b58c4cb11fbe59c97a0a4b31cae3c8c"}, + {file = "lxml-5.4.0-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:ef5a7178fcc73b7d8c07229e89f8eb45b2908a9238eb90dcfc46571ccf0383b8"}, + {file = "lxml-5.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d2ed1b3cb9ff1c10e6e8b00941bb2e5bb568b307bfc6b17dffbbe8be5eecba86"}, + {file = "lxml-5.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:72ac9762a9f8ce74c9eed4a4e74306f2f18613a6b71fa065495a67ac227b3056"}, + {file = "lxml-5.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f5cb182f6396706dc6cc1896dd02b1c889d644c081b0cdec38747573db88a7d7"}, + {file = "lxml-5.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:3a3178b4873df8ef9457a4875703488eb1622632a9cee6d76464b60e90adbfcd"}, + {file = "lxml-5.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e094ec83694b59d263802ed03a8384594fcce477ce484b0cbcd0008a211ca751"}, + {file = "lxml-5.4.0-cp311-cp311-win32.whl", hash = "sha256:4329422de653cdb2b72afa39b0aa04252fca9071550044904b2e7036d9d97fe4"}, + {file = "lxml-5.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:fd3be6481ef54b8cfd0e1e953323b7aa9d9789b94842d0e5b142ef4bb7999539"}, + {file = "lxml-5.4.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b5aff6f3e818e6bdbbb38e5967520f174b18f539c2b9de867b1e7fde6f8d95a4"}, + {file = "lxml-5.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:942a5d73f739ad7c452bf739a62a0f83e2578afd6b8e5406308731f4ce78b16d"}, + {file = "lxml-5.4.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:460508a4b07364d6abf53acaa0a90b6d370fafde5693ef37602566613a9b0779"}, + {file = "lxml-5.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:529024ab3a505fed78fe3cc5ddc079464e709f6c892733e3f5842007cec8ac6e"}, + {file = "lxml-5.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ca56ebc2c474e8f3d5761debfd9283b8b18c76c4fc0967b74aeafba1f5647f9"}, + {file = "lxml-5.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a81e1196f0a5b4167a8dafe3a66aa67c4addac1b22dc47947abd5d5c7a3f24b5"}, + {file = "lxml-5.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00b8686694423ddae324cf614e1b9659c2edb754de617703c3d29ff568448df5"}, + {file = "lxml-5.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:c5681160758d3f6ac5b4fea370495c48aac0989d6a0f01bb9a72ad8ef5ab75c4"}, + {file = "lxml-5.4.0-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:2dc191e60425ad70e75a68c9fd90ab284df64d9cd410ba8d2b641c0c45bc006e"}, + {file = "lxml-5.4.0-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:67f779374c6b9753ae0a0195a892a1c234ce8416e4448fe1e9f34746482070a7"}, + {file = "lxml-5.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:79d5bfa9c1b455336f52343130b2067164040604e41f6dc4d8313867ed540079"}, + {file = "lxml-5.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3d3c30ba1c9b48c68489dc1829a6eede9873f52edca1dda900066542528d6b20"}, + {file = "lxml-5.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1af80c6316ae68aded77e91cd9d80648f7dd40406cef73df841aa3c36f6907c8"}, + {file = "lxml-5.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4d885698f5019abe0de3d352caf9466d5de2baded00a06ef3f1216c1a58ae78f"}, + {file = "lxml-5.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aea53d51859b6c64e7c51d522c03cc2c48b9b5d6172126854cc7f01aa11f52bc"}, + {file = "lxml-5.4.0-cp312-cp312-win32.whl", hash = "sha256:d90b729fd2732df28130c064aac9bb8aff14ba20baa4aee7bd0795ff1187545f"}, + {file = "lxml-5.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1dc4ca99e89c335a7ed47d38964abcb36c5910790f9bd106f2a8fa2ee0b909d2"}, + {file = "lxml-5.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:773e27b62920199c6197130632c18fb7ead3257fce1ffb7d286912e56ddb79e0"}, + {file = "lxml-5.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ce9c671845de9699904b1e9df95acfe8dfc183f2310f163cdaa91a3535af95de"}, + {file = "lxml-5.4.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9454b8d8200ec99a224df8854786262b1bd6461f4280064c807303c642c05e76"}, + {file = "lxml-5.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cccd007d5c95279e529c146d095f1d39ac05139de26c098166c4beb9374b0f4d"}, + {file = "lxml-5.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0fce1294a0497edb034cb416ad3e77ecc89b313cff7adbee5334e4dc0d11f422"}, + {file = "lxml-5.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24974f774f3a78ac12b95e3a20ef0931795ff04dbb16db81a90c37f589819551"}, + {file = "lxml-5.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:497cab4d8254c2a90bf988f162ace2ddbfdd806fce3bda3f581b9d24c852e03c"}, + {file = "lxml-5.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:e794f698ae4c5084414efea0f5cc9f4ac562ec02d66e1484ff822ef97c2cadff"}, + {file = "lxml-5.4.0-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:2c62891b1ea3094bb12097822b3d44b93fc6c325f2043c4d2736a8ff09e65f60"}, + {file = "lxml-5.4.0-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:142accb3e4d1edae4b392bd165a9abdee8a3c432a2cca193df995bc3886249c8"}, + {file = "lxml-5.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1a42b3a19346e5601d1b8296ff6ef3d76038058f311902edd574461e9c036982"}, + {file = "lxml-5.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4291d3c409a17febf817259cb37bc62cb7eb398bcc95c1356947e2871911ae61"}, + {file = "lxml-5.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4f5322cf38fe0e21c2d73901abf68e6329dc02a4994e483adbcf92b568a09a54"}, + {file = "lxml-5.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0be91891bdb06ebe65122aa6bf3fc94489960cf7e03033c6f83a90863b23c58b"}, + {file = "lxml-5.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:15a665ad90054a3d4f397bc40f73948d48e36e4c09f9bcffc7d90c87410e478a"}, + {file = "lxml-5.4.0-cp313-cp313-win32.whl", hash = "sha256:d5663bc1b471c79f5c833cffbc9b87d7bf13f87e055a5c86c363ccd2348d7e82"}, + {file = "lxml-5.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:bcb7a1096b4b6b24ce1ac24d4942ad98f983cd3810f9711bcd0293f43a9d8b9f"}, + {file = "lxml-5.4.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:7be701c24e7f843e6788353c055d806e8bd8466b52907bafe5d13ec6a6dbaecd"}, + {file = "lxml-5.4.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb54f7c6bafaa808f27166569b1511fc42701a7713858dddc08afdde9746849e"}, + {file = "lxml-5.4.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97dac543661e84a284502e0cf8a67b5c711b0ad5fb661d1bd505c02f8cf716d7"}, + {file = "lxml-5.4.0-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:c70e93fba207106cb16bf852e421c37bbded92acd5964390aad07cb50d60f5cf"}, + {file = "lxml-5.4.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9c886b481aefdf818ad44846145f6eaf373a20d200b5ce1a5c8e1bc2d8745410"}, + {file = "lxml-5.4.0-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:fa0e294046de09acd6146be0ed6727d1f42ded4ce3ea1e9a19c11b6774eea27c"}, + {file = "lxml-5.4.0-cp36-cp36m-win32.whl", hash = "sha256:61c7bbf432f09ee44b1ccaa24896d21075e533cd01477966a5ff5a71d88b2f56"}, + {file = "lxml-5.4.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7ce1a171ec325192c6a636b64c94418e71a1964f56d002cc28122fceff0b6121"}, + {file = "lxml-5.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:795f61bcaf8770e1b37eec24edf9771b307df3af74d1d6f27d812e15a9ff3872"}, + {file = "lxml-5.4.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:29f451a4b614a7b5b6c2e043d7b64a15bd8304d7e767055e8ab68387a8cacf4e"}, + {file = "lxml-5.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:891f7f991a68d20c75cb13c5c9142b2a3f9eb161f1f12a9489c82172d1f133c0"}, + {file = "lxml-5.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4aa412a82e460571fad592d0f93ce9935a20090029ba08eca05c614f99b0cc92"}, + {file = "lxml-5.4.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:ac7ba71f9561cd7d7b55e1ea5511543c0282e2b6450f122672a2694621d63b7e"}, + {file = "lxml-5.4.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:c5d32f5284012deaccd37da1e2cd42f081feaa76981f0eaa474351b68df813c5"}, + {file = "lxml-5.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:ce31158630a6ac85bddd6b830cffd46085ff90498b397bd0a259f59d27a12188"}, + {file = "lxml-5.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:31e63621e073e04697c1b2d23fcb89991790eef370ec37ce4d5d469f40924ed6"}, + {file = "lxml-5.4.0-cp37-cp37m-win32.whl", hash = "sha256:be2ba4c3c5b7900246a8f866580700ef0d538f2ca32535e991027bdaba944063"}, + {file = "lxml-5.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:09846782b1ef650b321484ad429217f5154da4d6e786636c38e434fa32e94e49"}, + {file = "lxml-5.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eaf24066ad0b30917186420d51e2e3edf4b0e2ea68d8cd885b14dc8afdcf6556"}, + {file = "lxml-5.4.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b31a3a77501d86d8ade128abb01082724c0dfd9524f542f2f07d693c9f1175f"}, + {file = "lxml-5.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e108352e203c7afd0eb91d782582f00a0b16a948d204d4dec8565024fafeea5"}, + {file = "lxml-5.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a11a96c3b3f7551c8a8109aa65e8594e551d5a84c76bf950da33d0fb6dfafab7"}, + {file = "lxml-5.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:ca755eebf0d9e62d6cb013f1261e510317a41bf4650f22963474a663fdfe02aa"}, + {file = "lxml-5.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:4cd915c0fb1bed47b5e6d6edd424ac25856252f09120e3e8ba5154b6b921860e"}, + {file = "lxml-5.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:226046e386556a45ebc787871d6d2467b32c37ce76c2680f5c608e25823ffc84"}, + {file = "lxml-5.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:b108134b9667bcd71236c5a02aad5ddd073e372fb5d48ea74853e009fe38acb6"}, + {file = "lxml-5.4.0-cp38-cp38-win32.whl", hash = "sha256:1320091caa89805df7dcb9e908add28166113dcd062590668514dbd510798c88"}, + {file = "lxml-5.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:073eb6dcdf1f587d9b88c8c93528b57eccda40209cf9be549d469b942b41d70b"}, + {file = "lxml-5.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bda3ea44c39eb74e2488297bb39d47186ed01342f0022c8ff407c250ac3f498e"}, + {file = "lxml-5.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9ceaf423b50ecfc23ca00b7f50b64baba85fb3fb91c53e2c9d00bc86150c7e40"}, + {file = "lxml-5.4.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:664cdc733bc87449fe781dbb1f309090966c11cc0c0cd7b84af956a02a8a4729"}, + {file = "lxml-5.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67ed8a40665b84d161bae3181aa2763beea3747f748bca5874b4af4d75998f87"}, + {file = "lxml-5.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b4a3bd174cc9cdaa1afbc4620c049038b441d6ba07629d89a83b408e54c35cd"}, + {file = "lxml-5.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:b0989737a3ba6cf2a16efb857fb0dfa20bc5c542737fddb6d893fde48be45433"}, + {file = "lxml-5.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:dc0af80267edc68adf85f2a5d9be1cdf062f973db6790c1d065e45025fa26140"}, + {file = "lxml-5.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:639978bccb04c42677db43c79bdaa23785dc7f9b83bfd87570da8207872f1ce5"}, + {file = "lxml-5.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5a99d86351f9c15e4a901fc56404b485b1462039db59288b203f8c629260a142"}, + {file = "lxml-5.4.0-cp39-cp39-win32.whl", hash = "sha256:3e6d5557989cdc3ebb5302bbdc42b439733a841891762ded9514e74f60319ad6"}, + {file = "lxml-5.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:a8c9b7f16b63e65bbba889acb436a1034a82d34fa09752d754f88d708eca80e1"}, + {file = "lxml-5.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1b717b00a71b901b4667226bba282dd462c42ccf618ade12f9ba3674e1fabc55"}, + {file = "lxml-5.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27a9ded0f0b52098ff89dd4c418325b987feed2ea5cc86e8860b0f844285d740"}, + {file = "lxml-5.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b7ce10634113651d6f383aa712a194179dcd496bd8c41e191cec2099fa09de5"}, + {file = "lxml-5.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:53370c26500d22b45182f98847243efb518d268374a9570409d2e2276232fd37"}, + {file = "lxml-5.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c6364038c519dffdbe07e3cf42e6a7f8b90c275d4d1617a69bb59734c1a2d571"}, + {file = "lxml-5.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b12cb6527599808ada9eb2cd6e0e7d3d8f13fe7bbb01c6311255a15ded4c7ab4"}, + {file = "lxml-5.4.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5f11a1526ebd0dee85e7b1e39e39a0cc0d9d03fb527f56d8457f6df48a10dc0c"}, + {file = "lxml-5.4.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48b4afaf38bf79109bb060d9016fad014a9a48fb244e11b94f74ae366a64d252"}, + {file = "lxml-5.4.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de6f6bb8a7840c7bf216fb83eec4e2f79f7325eca8858167b68708b929ab2172"}, + {file = "lxml-5.4.0-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5cca36a194a4eb4e2ed6be36923d3cffd03dcdf477515dea687185506583d4c9"}, + {file = "lxml-5.4.0-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b7c86884ad23d61b025989d99bfdd92a7351de956e01c61307cb87035960bcb1"}, + {file = "lxml-5.4.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:53d9469ab5460402c19553b56c3648746774ecd0681b1b27ea74d5d8a3ef5590"}, + {file = "lxml-5.4.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:56dbdbab0551532bb26c19c914848d7251d73edb507c3079d6805fa8bba5b706"}, + {file = "lxml-5.4.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14479c2ad1cb08b62bb941ba8e0e05938524ee3c3114644df905d2331c76cd57"}, + {file = "lxml-5.4.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32697d2ea994e0db19c1df9e40275ffe84973e4232b5c274f47e7c1ec9763cdd"}, + {file = "lxml-5.4.0-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:24f6df5f24fc3385f622c0c9d63fe34604893bc1a5bdbb2dbf5870f85f9a404a"}, + {file = "lxml-5.4.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:151d6c40bc9db11e960619d2bf2ec5829f0aaffb10b41dcf6ad2ce0f3c0b2325"}, + {file = "lxml-5.4.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4025bf2884ac4370a3243c5aa8d66d3cb9e15d3ddd0af2d796eccc5f0244390e"}, + {file = "lxml-5.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:9459e6892f59ecea2e2584ee1058f5d8f629446eab52ba2305ae13a32a059530"}, + {file = "lxml-5.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47fb24cc0f052f0576ea382872b3fc7e1f7e3028e53299ea751839418ade92a6"}, + {file = "lxml-5.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50441c9de951a153c698b9b99992e806b71c1f36d14b154592580ff4a9d0d877"}, + {file = "lxml-5.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:ab339536aa798b1e17750733663d272038bf28069761d5be57cb4a9b0137b4f8"}, + {file = "lxml-5.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9776af1aad5a4b4a1317242ee2bea51da54b2a7b7b48674be736d463c999f37d"}, + {file = "lxml-5.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:63e7968ff83da2eb6fdda967483a7a023aa497d85ad8f05c3ad9b1f2e8c84987"}, + {file = "lxml-5.4.0.tar.gz", hash = "sha256:d12832e1dbea4be280b22fd0ea7c9b87f0d8fc51ba06e92dc62d52f804f78ebd"}, +] + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html-clean = ["lxml_html_clean"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] +source = ["Cython (>=3.0.11,<3.1.0)"] + +[[package]] +name = "markdown" +version = "3.10.2" +description = "Python implementation of John Gruber's Markdown." +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "markdown-3.10.2-py3-none-any.whl", hash = "sha256:e91464b71ae3ee7afd3017d9f358ef0baf158fd9a298db92f1d4761133824c36"}, + {file = "markdown-3.10.2.tar.gz", hash = "sha256:994d51325d25ad8aa7ce4ebaec003febcce822c3f8c911e3b17c52f7f589f950"}, +] + +[package.extras] +docs = ["mdx_gh_links (>=0.2)", "mkdocs (>=1.6)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python] (>=0.28.3)"] +testing = ["coverage", "pyyaml"] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +groups = ["main"] +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"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "matplotlib" +version = "3.10.8" +description = "Python plotting package" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "matplotlib-3.10.8-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:00270d217d6b20d14b584c521f810d60c5c78406dc289859776550df837dcda7"}, + {file = "matplotlib-3.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37b3c1cc42aa184b3f738cfa18c1c1d72fd496d85467a6cf7b807936d39aa656"}, + {file = "matplotlib-3.10.8-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ee40c27c795bda6a5292e9cff9890189d32f7e3a0bf04e0e3c9430c4a00c37df"}, + {file = "matplotlib-3.10.8-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a48f2b74020919552ea25d222d5cc6af9ca3f4eb43a93e14d068457f545c2a17"}, + {file = "matplotlib-3.10.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f254d118d14a7f99d616271d6c3c27922c092dac11112670b157798b89bf4933"}, + {file = "matplotlib-3.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:f9b587c9c7274c1613a30afabf65a272114cd6cdbe67b3406f818c79d7ab2e2a"}, + {file = "matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6be43b667360fef5c754dda5d25a32e6307a03c204f3c0fc5468b78fa87b4160"}, + {file = "matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2b336e2d91a3d7006864e0990c83b216fcdca64b5a6484912902cef87313d78"}, + {file = "matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:efb30e3baaea72ce5928e32bab719ab4770099079d66726a62b11b1ef7273be4"}, + {file = "matplotlib-3.10.8-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d56a1efd5bfd61486c8bc968fa18734464556f0fb8e51690f4ac25d85cbbbbc2"}, + {file = "matplotlib-3.10.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238b7ce5717600615c895050239ec955d91f321c209dd110db988500558e70d6"}, + {file = "matplotlib-3.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:18821ace09c763ec93aef5eeff087ee493a24051936d7b9ebcad9662f66501f9"}, + {file = "matplotlib-3.10.8-cp311-cp311-win_arm64.whl", hash = "sha256:bab485bcf8b1c7d2060b4fcb6fc368a9e6f4cd754c9c2fea281f4be21df394a2"}, + {file = "matplotlib-3.10.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:64fcc24778ca0404ce0cb7b6b77ae1f4c7231cdd60e6778f999ee05cbd581b9a"}, + {file = "matplotlib-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b9a5ca4ac220a0cdd1ba6bcba3608547117d30468fefce49bb26f55c1a3d5c58"}, + {file = "matplotlib-3.10.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ab4aabc72de4ff77b3ec33a6d78a68227bf1123465887f9905ba79184a1cc04"}, + {file = "matplotlib-3.10.8-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24d50994d8c5816ddc35411e50a86ab05f575e2530c02752e02538122613371f"}, + {file = "matplotlib-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:99eefd13c0dc3b3c1b4d561c1169e65fe47aab7b8158754d7c084088e2329466"}, + {file = "matplotlib-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:dd80ecb295460a5d9d260df63c43f4afbdd832d725a531f008dad1664f458adf"}, + {file = "matplotlib-3.10.8-cp312-cp312-win_arm64.whl", hash = "sha256:3c624e43ed56313651bc18a47f838b60d7b8032ed348911c54906b130b20071b"}, + {file = "matplotlib-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3f2e409836d7f5ac2f1c013110a4d50b9f7edc26328c108915f9075d7d7a91b6"}, + {file = "matplotlib-3.10.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56271f3dac49a88d7fca5060f004d9d22b865f743a12a23b1e937a0be4818ee1"}, + {file = "matplotlib-3.10.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a0a7f52498f72f13d4a25ea70f35f4cb60642b466cbb0a9be951b5bc3f45a486"}, + {file = "matplotlib-3.10.8-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:646d95230efb9ca614a7a594d4fcacde0ac61d25e37dd51710b36477594963ce"}, + {file = "matplotlib-3.10.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f89c151aab2e2e23cb3fe0acad1e8b82841fd265379c4cecd0f3fcb34c15e0f6"}, + {file = "matplotlib-3.10.8-cp313-cp313-win_amd64.whl", hash = "sha256:e8ea3e2d4066083e264e75c829078f9e149fa119d27e19acd503de65e0b13149"}, + {file = "matplotlib-3.10.8-cp313-cp313-win_arm64.whl", hash = "sha256:c108a1d6fa78a50646029cb6d49808ff0fc1330fda87fa6f6250c6b5369b6645"}, + {file = "matplotlib-3.10.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ad3d9833a64cf48cc4300f2b406c3d0f4f4724a91c0bd5640678a6ba7c102077"}, + {file = "matplotlib-3.10.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:eb3823f11823deade26ce3b9f40dcb4a213da7a670013929f31d5f5ed1055b22"}, + {file = "matplotlib-3.10.8-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d9050fee89a89ed57b4fb2c1bfac9a3d0c57a0d55aed95949eedbc42070fea39"}, + {file = "matplotlib-3.10.8-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b44d07310e404ba95f8c25aa5536f154c0a8ec473303535949e52eb71d0a1565"}, + {file = "matplotlib-3.10.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0a33deb84c15ede243aead39f77e990469fff93ad1521163305095b77b72ce4a"}, + {file = "matplotlib-3.10.8-cp313-cp313t-win_amd64.whl", hash = "sha256:3a48a78d2786784cc2413e57397981fb45c79e968d99656706018d6e62e57958"}, + {file = "matplotlib-3.10.8-cp313-cp313t-win_arm64.whl", hash = "sha256:15d30132718972c2c074cd14638c7f4592bd98719e2308bccea40e0538bc0cb5"}, + {file = "matplotlib-3.10.8-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b53285e65d4fa4c86399979e956235deb900be5baa7fc1218ea67fbfaeaadd6f"}, + {file = "matplotlib-3.10.8-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32f8dce744be5569bebe789e46727946041199030db8aeb2954d26013a0eb26b"}, + {file = "matplotlib-3.10.8-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4cf267add95b1c88300d96ca837833d4112756045364f5c734a2276038dae27d"}, + {file = "matplotlib-3.10.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2cf5bd12cecf46908f286d7838b2abc6c91cda506c0445b8223a7c19a00df008"}, + {file = "matplotlib-3.10.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:41703cc95688f2516b480f7f339d8851a6035f18e100ee6a32bc0b8536a12a9c"}, + {file = "matplotlib-3.10.8-cp314-cp314-win_amd64.whl", hash = "sha256:83d282364ea9f3e52363da262ce32a09dfe241e4080dcedda3c0db059d3c1f11"}, + {file = "matplotlib-3.10.8-cp314-cp314-win_arm64.whl", hash = "sha256:2c1998e92cd5999e295a731bcb2911c75f597d937341f3030cc24ef2733d78a8"}, + {file = "matplotlib-3.10.8-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b5a2b97dbdc7d4f353ebf343744f1d1f1cca8aa8bfddb4262fcf4306c3761d50"}, + {file = "matplotlib-3.10.8-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3f5c3e4da343bba819f0234186b9004faba952cc420fbc522dc4e103c1985908"}, + {file = "matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f62550b9a30afde8c1c3ae450e5eb547d579dd69b25c2fc7a1c67f934c1717a"}, + {file = "matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:495672de149445ec1b772ff2c9ede9b769e3cb4f0d0aa7fa730d7f59e2d4e1c1"}, + {file = "matplotlib-3.10.8-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:595ba4d8fe983b88f0eec8c26a241e16d6376fe1979086232f481f8f3f67494c"}, + {file = "matplotlib-3.10.8-cp314-cp314t-win_amd64.whl", hash = "sha256:25d380fe8b1dc32cf8f0b1b448470a77afb195438bafdf1d858bfb876f3edf7b"}, + {file = "matplotlib-3.10.8-cp314-cp314t-win_arm64.whl", hash = "sha256:113bb52413ea508ce954a02c10ffd0d565f9c3bc7f2eddc27dfe1731e71c7b5f"}, + {file = "matplotlib-3.10.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f97aeb209c3d2511443f8797e3e5a569aebb040d4f8bc79aa3ee78a8fb9e3dd8"}, + {file = "matplotlib-3.10.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fb061f596dad3a0f52b60dc6a5dec4a0c300dec41e058a7efe09256188d170b7"}, + {file = "matplotlib-3.10.8-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:12d90df9183093fcd479f4172ac26b322b1248b15729cb57f42f71f24c7e37a3"}, + {file = "matplotlib-3.10.8-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6da7c2ce169267d0d066adcf63758f0604aa6c3eebf67458930f9d9b79ad1db1"}, + {file = "matplotlib-3.10.8-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9153c3292705be9f9c64498a8872118540c3f4123d1a1c840172edf262c8be4a"}, + {file = "matplotlib-3.10.8-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ae029229a57cd1e8fe542485f27e7ca7b23aa9e8944ddb4985d0bc444f1eca2"}, + {file = "matplotlib-3.10.8.tar.gz", hash = "sha256:2299372c19d56bcd35cf05a2738308758d32b9eaed2371898d8f5bd33f084aa3"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +kiwisolver = ">=1.3.1" +numpy = ">=1.23" +packaging = ">=20.0" +pillow = ">=8" +pyparsing = ">=3" +python-dateutil = ">=2.7" + +[package.extras] +dev = ["meson-python (>=0.13.1,<0.17.0)", "pybind11 (>=2.13.2,!=2.13.3)", "setuptools (>=64)", "setuptools_scm (>=7)"] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +groups = ["main"] +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 = "more-itertools" +version = "10.8.0" +description = "More routines for operating on iterables, beyond itertools" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "more_itertools-10.8.0-py3-none-any.whl", hash = "sha256:52d4362373dcf7c52546bc4af9a86ee7c4579df9a8dc268be0a2f949d376cc9b"}, + {file = "more_itertools-10.8.0.tar.gz", hash = "sha256:f638ddf8a1a0d134181275fb5d58b086ead7c6a72429ad725c67503f13ba30bd"}, +] + +[[package]] +name = "morph-kgc" +version = "2.10.0" +description = "Powerful [R2]RML engine to create RDF knowledge graphs from heterogeneous data sources." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "morph_kgc-2.10.0-py3-none-any.whl", hash = "sha256:8ce01d8db014a3cbe9d2e77f61c543ea8d19a7f9ec7cd6ad4abf203bd9ce9ba7"}, + {file = "morph_kgc-2.10.0.tar.gz", hash = "sha256:a8d01d4c2118821ed46490bc6445d0d06f0f5dd23e29eeeee1da64ea99e1a124"}, +] + +[package.dependencies] +duckdb = ">=1.0.0,<2.0.0" +elementpath = ">=4.0.0,<5.0.0" +falcon = ">=3.0.0,<5.0.0" +jsonpath-python = "1.0.6" +pandas = ">=2.1.0,<3.0.0" +pyoxigraph = ">=0.3.0,<0.4.0" +rdflib = ">=6.1.1,<7.3.0" +ruamel-yaml = ">=0.18.0,<0.19.0" + +[package.extras] +all = ["cryptography (>=42.0.0,<43.0.0)", "databricks-sqlalchemy (>=2.0.4,<3.0.0)", "geopandas (>=1.0.0,<2.0.0)", "kafka-python (>=2.0.2,<3.0.0)", "kuzu (>=0.4.2,<2.0.0)", "neo4j (>=5.20.0,<6.0.0)", "odfpy (>=1.4.1,<2.0.0)", "openpyxl (>=3.0.0,<4.0.0)", "oracledb (>=2.5.0,<9.0.0)", "psycopg[binary] (>=3.0.0,<4.0.0)", "pyarrow (>=14.0.0,<16.0.0)", "pyjelly (>=0.6.2)", "pymssql (>=2.2.7,<3.0.0)", "pymysql (>=1.1.0,<2.0.0)", "pyreadstat (>=1.2.0,<2.0.0)", "requests (>=2.0.0,<3.0.0)", "snowflake-sqlalchemy (>=1.7.3,<2.0.0)", "sql-metadata (>=2.6.0,<3.0.0)", "sqlalchemy (>=2.0.0,<3.0.0)"] +databricks = ["databricks-sqlalchemy (>=2.0.4,<3.0.0)"] +excel = ["odfpy (>=1.4.1,<2.0.0)", "openpyxl (>=3.0.0,<4.0.0)"] +geoparquet = ["geopandas (>=1.0.0,<2.0.0)"] +http = ["requests (>=2.0.0,<3.0.0)"] +jelly = ["pyjelly (>=0.6.2)"] +kafka = ["kafka-python (>=2.0.2,<3.0.0)"] +kuzu = ["kuzu (>=0.4.2,<2.0.0)"] +mssql = ["pymssql (>=2.2.7,<3.0.0)", "sql-metadata (>=2.6.0,<3.0.0)", "sqlalchemy (>=2.0.0,<3.0.0)"] +mysql = ["cryptography (>=42.0.0,<43.0.0)", "pymysql (>=1.1.0,<2.0.0)", "sql-metadata (>=2.6.0,<3.0.0)", "sqlalchemy (>=2.0.0,<3.0.0)"] +neo4j = ["neo4j (>=5.20.0,<6.0.0)"] +oracle = ["oracledb (>=2.5.0,<9.0.0)", "sql-metadata (>=2.6.0,<3.0.0)", "sqlalchemy (>=2.0.0,<3.0.0)"] +postgresql = ["psycopg[binary] (>=3.0.0,<4.0.0)", "sql-metadata (>=2.6.0,<3.0.0)", "sqlalchemy (>=2.0.0,<3.0.0)"] +snowflake = ["snowflake-sqlalchemy (>=1.7.3,<2.0.0)"] +spss = ["pyreadstat (>=1.2.0,<2.0.0)"] +sqlite = ["sql-metadata (>=2.6.0,<3.0.0)", "sqlalchemy (>=2.0.0,<3.0.0)"] +tabular = ["pyarrow (>=14.0.0,<16.0.0)"] +test = ["geopandas (>=1.0.0,<2.0.0)", "odfpy (>=1.4.1,<2.0.0)", "openpyxl (>=3.0.0,<4.0.0)", "pyarrow (>=14.0.0,<20.0.0)", "pytest (>=8.0.0,<9.0.0)", "sql-metadata (>=2.6.0,<3.0.0)", "sqlalchemy (>=2.0.0,<3.0.0)"] + +[[package]] +name = "nbformat" +version = "5.10.4" +description = "The Jupyter Notebook format" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b"}, + {file = "nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a"}, +] + +[package.dependencies] +fastjsonschema = ">=2.15" +jsonschema = ">=2.6" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +traitlets = ">=5.1" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["pep440", "pre-commit", "pytest", "testpath"] + +[[package]] +name = "nltk" +version = "3.9.3" +description = "Natural Language Toolkit" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "nltk-3.9.3-py3-none-any.whl", hash = "sha256:60b3db6e9995b3dd976b1f0fa7dec22069b2677e759c28eb69b62ddd44870522"}, + {file = "nltk-3.9.3.tar.gz", hash = "sha256:cb5945d6424a98d694c2b9a0264519fab4363711065a46aa0ae7a2195b92e71f"}, +] + +[package.dependencies] +click = "*" +joblib = "*" +regex = ">=2021.8.3" +tqdm = "*" + +[package.extras] +all = ["matplotlib", "numpy", "pyparsing", "python-crfsuite", "requests", "scikit-learn", "scipy", "twython"] +corenlp = ["requests"] +machine-learning = ["numpy", "python-crfsuite", "scikit-learn", "scipy"] +plot = ["matplotlib"] +tgrep = ["pyparsing"] +twitter = ["twython"] + +[[package]] +name = "numpy" +version = "1.26.4" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, +] + +[[package]] +name = "nvidia-nccl-cu12" +version = "2.29.3" +description = "NVIDIA Collective Communication Library (NCCL) Runtime" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine != \"aarch64\"" +files = [ + {file = "nvidia_nccl_cu12-2.29.3-py3-none-manylinux_2_18_aarch64.whl", hash = "sha256:6351b79dc7d2cc3d654ea1523616b9eeded71fe9c8da66b71eef9a5d1b2adad4"}, + {file = "nvidia_nccl_cu12-2.29.3-py3-none-manylinux_2_18_x86_64.whl", hash = "sha256:35ad42e7d5d722a83c36a3a478e281c20a5646383deaf1b9ed1a9ab7d61bed53"}, +] + +[[package]] +name = "packaging" +version = "26.0" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529"}, + {file = "packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4"}, +] + +[[package]] +name = "pandas" +version = "2.3.3" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pandas-2.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c"}, + {file = "pandas-2.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a"}, + {file = "pandas-2.3.3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5caf26f64126b6c7aec964f74266f435afef1c1b13da3b0636c7518a1fa3e2b1"}, + {file = "pandas-2.3.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd7478f1463441ae4ca7308a70e90b33470fa593429f9d4c578dd00d1fa78838"}, + {file = "pandas-2.3.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4793891684806ae50d1288c9bae9330293ab4e083ccd1c5e383c34549c6e4250"}, + {file = "pandas-2.3.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:28083c648d9a99a5dd035ec125d42439c6c1c525098c58af0fc38dd1a7a1b3d4"}, + {file = "pandas-2.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:503cf027cf9940d2ceaa1a93cfb5f8c8c7e6e90720a2850378f0b3f3b1e06826"}, + {file = "pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523"}, + {file = "pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45"}, + {file = "pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66"}, + {file = "pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b"}, + {file = "pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791"}, + {file = "pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151"}, + {file = "pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c"}, + {file = "pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53"}, + {file = "pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35"}, + {file = "pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908"}, + {file = "pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89"}, + {file = "pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98"}, + {file = "pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084"}, + {file = "pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b"}, + {file = "pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713"}, + {file = "pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8"}, + {file = "pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d"}, + {file = "pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac"}, + {file = "pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c"}, + {file = "pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493"}, + {file = "pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee"}, + {file = "pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5"}, + {file = "pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21"}, + {file = "pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78"}, + {file = "pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110"}, + {file = "pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86"}, + {file = "pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc"}, + {file = "pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0"}, + {file = "pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593"}, + {file = "pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c"}, + {file = "pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b"}, + {file = "pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6"}, + {file = "pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3"}, + {file = "pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5"}, + {file = "pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec"}, + {file = "pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7"}, + {file = "pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450"}, + {file = "pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5"}, + {file = "pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788"}, + {file = "pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87"}, + {file = "pandas-2.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c503ba5216814e295f40711470446bc3fd00f0faea8a086cbc688808e26f92a2"}, + {file = "pandas-2.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a637c5cdfa04b6d6e2ecedcb81fc52ffb0fd78ce2ebccc9ea964df9f658de8c8"}, + {file = "pandas-2.3.3-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:854d00d556406bffe66a4c0802f334c9ad5a96b4f1f868adf036a21b11ef13ff"}, + {file = "pandas-2.3.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf1f8a81d04ca90e32a0aceb819d34dbd378a98bf923b6398b9a3ec0bf44de29"}, + {file = "pandas-2.3.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:23ebd657a4d38268c7dfbdf089fbc31ea709d82e4923c5ffd4fbd5747133ce73"}, + {file = "pandas-2.3.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5554c929ccc317d41a5e3d1234f3be588248e61f08a74dd17c9eabb535777dc9"}, + {file = "pandas-2.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:d3e28b3e83862ccf4d85ff19cf8c20b2ae7e503881711ff2d534dc8f761131aa"}, + {file = "pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.23.2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, +] +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.7" + +[package.extras] +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] +aws = ["s3fs (>=2022.11.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] +compression = ["zstandard (>=0.19.0)"] +computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] +feather = ["pyarrow (>=10.0.1)"] +fss = ["fsspec (>=2022.11.0)"] +gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] +hdf5 = ["tables (>=3.8.0)"] +html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] +mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=10.0.1)"] +performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] +plot = ["matplotlib (>=3.6.3)"] +postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +pyarrow = ["pyarrow (>=10.0.1)"] +spss = ["pyreadstat (>=1.2.0)"] +sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.9.2)"] + +[[package]] +name = "pillow" +version = "12.1.1" +description = "Python Imaging Library (fork)" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "pillow-12.1.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1f1625b72740fdda5d77b4def688eb8fd6490975d06b909fd19f13f391e077e0"}, + {file = "pillow-12.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:178aa072084bd88ec759052feca8e56cbb14a60b39322b99a049e58090479713"}, + {file = "pillow-12.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b66e95d05ba806247aaa1561f080abc7975daf715c30780ff92a20e4ec546e1b"}, + {file = "pillow-12.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:89c7e895002bbe49cdc5426150377cbbc04767d7547ed145473f496dfa40408b"}, + {file = "pillow-12.1.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a5cbdcddad0af3da87cb16b60d23648bc3b51967eb07223e9fed77a82b457c4"}, + {file = "pillow-12.1.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9f51079765661884a486727f0729d29054242f74b46186026582b4e4769918e4"}, + {file = "pillow-12.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:99c1506ea77c11531d75e3a412832a13a71c7ebc8192ab9e4b2e355555920e3e"}, + {file = "pillow-12.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:36341d06738a9f66c8287cf8b876d24b18db9bd8740fa0672c74e259ad408cff"}, + {file = "pillow-12.1.1-cp310-cp310-win32.whl", hash = "sha256:6c52f062424c523d6c4db85518774cc3d50f5539dd6eed32b8f6229b26f24d40"}, + {file = "pillow-12.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:c6008de247150668a705a6338156efb92334113421ceecf7438a12c9a12dab23"}, + {file = "pillow-12.1.1-cp310-cp310-win_arm64.whl", hash = "sha256:1a9b0ee305220b392e1124a764ee4265bd063e54a751a6b62eff69992f457fa9"}, + {file = "pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e879bb6cd5c73848ef3b2b48b8af9ff08c5b71ecda8048b7dd22d8a33f60be32"}, + {file = "pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:365b10bb9417dd4498c0e3b128018c4a624dc11c7b97d8cc54effe3b096f4c38"}, + {file = "pillow-12.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d4ce8e329c93845720cd2014659ca67eac35f6433fd3050393d85f3ecef0dad5"}, + {file = "pillow-12.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc354a04072b765eccf2204f588a7a532c9511e8b9c7f900e1b64e3e33487090"}, + {file = "pillow-12.1.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e7976bf1910a8116b523b9f9f58bf410f3e8aa330cd9a2bb2953f9266ab49af"}, + {file = "pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:597bd9c8419bc7c6af5604e55847789b69123bbe25d65cc6ad3012b4f3c98d8b"}, + {file = "pillow-12.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2c1fc0f2ca5f96a3c8407e41cca26a16e46b21060fe6d5b099d2cb01412222f5"}, + {file = "pillow-12.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:578510d88c6229d735855e1f278aa305270438d36a05031dfaae5067cc8eb04d"}, + {file = "pillow-12.1.1-cp311-cp311-win32.whl", hash = "sha256:7311c0a0dcadb89b36b7025dfd8326ecfa36964e29913074d47382706e516a7c"}, + {file = "pillow-12.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:fbfa2a7c10cc2623f412753cddf391c7f971c52ca40a3f65dc5039b2939e8563"}, + {file = "pillow-12.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:b81b5e3511211631b3f672a595e3221252c90af017e399056d0faabb9538aa80"}, + {file = "pillow-12.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab323b787d6e18b3d91a72fc99b1a2c28651e4358749842b8f8dfacd28ef2052"}, + {file = "pillow-12.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:adebb5bee0f0af4909c30db0d890c773d1a92ffe83da908e2e9e720f8edf3984"}, + {file = "pillow-12.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb66b7cc26f50977108790e2456b7921e773f23db5630261102233eb355a3b79"}, + {file = "pillow-12.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aee2810642b2898bb187ced9b349e95d2a7272930796e022efaf12e99dccd293"}, + {file = "pillow-12.1.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a0b1cd6232e2b618adcc54d9882e4e662a089d5768cd188f7c245b4c8c44a397"}, + {file = "pillow-12.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7aac39bcf8d4770d089588a2e1dd111cbaa42df5a94be3114222057d68336bd0"}, + {file = "pillow-12.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ab174cd7d29a62dd139c44bf74b698039328f45cb03b4596c43473a46656b2f3"}, + {file = "pillow-12.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:339ffdcb7cbeaa08221cd401d517d4b1fe7a9ed5d400e4a8039719238620ca35"}, + {file = "pillow-12.1.1-cp312-cp312-win32.whl", hash = "sha256:5d1f9575a12bed9e9eedd9a4972834b08c97a352bd17955ccdebfeca5913fa0a"}, + {file = "pillow-12.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:21329ec8c96c6e979cd0dfd29406c40c1d52521a90544463057d2aaa937d66a6"}, + {file = "pillow-12.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:af9a332e572978f0218686636610555ae3defd1633597be015ed50289a03c523"}, + {file = "pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:d242e8ac078781f1de88bf823d70c1a9b3c7950a44cdf4b7c012e22ccbcd8e4e"}, + {file = "pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:02f84dfad02693676692746df05b89cf25597560db2857363a208e393429f5e9"}, + {file = "pillow-12.1.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:e65498daf4b583091ccbb2556c7000abf0f3349fcd57ef7adc9a84a394ed29f6"}, + {file = "pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c6db3b84c87d48d0088943bf33440e0c42370b99b1c2a7989216f7b42eede60"}, + {file = "pillow-12.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b7e5304e34942bf62e15184219a7b5ad4ff7f3bb5cca4d984f37df1a0e1aee2"}, + {file = "pillow-12.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:18e5bddd742a44b7e6b1e773ab5db102bd7a94c32555ba656e76d319d19c3850"}, + {file = "pillow-12.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc44ef1f3de4f45b50ccf9136999d71abb99dca7706bc75d222ed350b9fd2289"}, + {file = "pillow-12.1.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a8eb7ed8d4198bccbd07058416eeec51686b498e784eda166395a23eb99138e"}, + {file = "pillow-12.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47b94983da0c642de92ced1702c5b6c292a84bd3a8e1d1702ff923f183594717"}, + {file = "pillow-12.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:518a48c2aab7ce596d3bf79d0e275661b846e86e4d0e7dec34712c30fe07f02a"}, + {file = "pillow-12.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a550ae29b95c6dc13cf69e2c9dc5747f814c54eeb2e32d683e5e93af56caa029"}, + {file = "pillow-12.1.1-cp313-cp313-win32.whl", hash = "sha256:a003d7422449f6d1e3a34e3dd4110c22148336918ddbfc6a32581cd54b2e0b2b"}, + {file = "pillow-12.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:344cf1e3dab3be4b1fa08e449323d98a2a3f819ad20f4b22e77a0ede31f0faa1"}, + {file = "pillow-12.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:5c0dd1636633e7e6a0afe7bf6a51a14992b7f8e60de5789018ebbdfae55b040a"}, + {file = "pillow-12.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0330d233c1a0ead844fc097a7d16c0abff4c12e856c0b325f231820fee1f39da"}, + {file = "pillow-12.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5dae5f21afb91322f2ff791895ddd8889e5e947ff59f71b46041c8ce6db790bc"}, + {file = "pillow-12.1.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2e0c664be47252947d870ac0d327fea7e63985a08794758aa8af5b6cb6ec0c9c"}, + {file = "pillow-12.1.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:691ab2ac363b8217f7d31b3497108fb1f50faab2f75dfb03284ec2f217e87bf8"}, + {file = "pillow-12.1.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9e8064fb1cc019296958595f6db671fba95209e3ceb0c4734c9baf97de04b20"}, + {file = "pillow-12.1.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:472a8d7ded663e6162dafdf20015c486a7009483ca671cece7a9279b512fcb13"}, + {file = "pillow-12.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:89b54027a766529136a06cfebeecb3a04900397a3590fd252160b888479517bf"}, + {file = "pillow-12.1.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:86172b0831b82ce4f7877f280055892b31179e1576aa00d0df3bb1bbf8c3e524"}, + {file = "pillow-12.1.1-cp313-cp313t-win32.whl", hash = "sha256:44ce27545b6efcf0fdbdceb31c9a5bdea9333e664cda58a7e674bb74608b3986"}, + {file = "pillow-12.1.1-cp313-cp313t-win_amd64.whl", hash = "sha256:a285e3eb7a5a45a2ff504e31f4a8d1b12ef62e84e5411c6804a42197c1cf586c"}, + {file = "pillow-12.1.1-cp313-cp313t-win_arm64.whl", hash = "sha256:cc7d296b5ea4d29e6570dabeaed58d31c3fea35a633a69679fb03d7664f43fb3"}, + {file = "pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:417423db963cb4be8bac3fc1204fe61610f6abeed1580a7a2cbb2fbda20f12af"}, + {file = "pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:b957b71c6b2387610f556a7eb0828afbe40b4a98036fc0d2acfa5a44a0c2036f"}, + {file = "pillow-12.1.1-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:097690ba1f2efdeb165a20469d59d8bb03c55fb6621eb2041a060ae8ea3e9642"}, + {file = "pillow-12.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2815a87ab27848db0321fb78c7f0b2c8649dee134b7f2b80c6a45c6831d75ccd"}, + {file = "pillow-12.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f7ed2c6543bad5a7d5530eb9e78c53132f93dfa44a28492db88b41cdab885202"}, + {file = "pillow-12.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:652a2c9ccfb556235b2b501a3a7cf3742148cd22e04b5625c5fe057ea3e3191f"}, + {file = "pillow-12.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d6e4571eedf43af33d0fc233a382a76e849badbccdf1ac438841308652a08e1f"}, + {file = "pillow-12.1.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b574c51cf7d5d62e9be37ba446224b59a2da26dc4c1bb2ecbe936a4fb1a7cb7f"}, + {file = "pillow-12.1.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a37691702ed687799de29a518d63d4682d9016932db66d4e90c345831b02fb4e"}, + {file = "pillow-12.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f95c00d5d6700b2b890479664a06e754974848afaae5e21beb4d83c106923fd0"}, + {file = "pillow-12.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:559b38da23606e68681337ad74622c4dbba02254fc9cb4488a305dd5975c7eeb"}, + {file = "pillow-12.1.1-cp314-cp314-win32.whl", hash = "sha256:03edcc34d688572014ff223c125a3f77fb08091e4607e7745002fc214070b35f"}, + {file = "pillow-12.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:50480dcd74fa63b8e78235957d302d98d98d82ccbfac4c7e12108ba9ecbdba15"}, + {file = "pillow-12.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:5cb1785d97b0c3d1d1a16bc1d710c4a0049daefc4935f3a8f31f827f4d3d2e7f"}, + {file = "pillow-12.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1f90cff8aa76835cba5769f0b3121a22bd4eb9e6884cfe338216e557a9a548b8"}, + {file = "pillow-12.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1f1be78ce9466a7ee64bfda57bdba0f7cc499d9794d518b854816c41bf0aa4e9"}, + {file = "pillow-12.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:42fc1f4677106188ad9a55562bbade416f8b55456f522430fadab3cef7cd4e60"}, + {file = "pillow-12.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98edb152429ab62a1818039744d8fbb3ccab98a7c29fc3d5fcef158f3f1f68b7"}, + {file = "pillow-12.1.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d470ab1178551dd17fdba0fef463359c41aaa613cdcd7ff8373f54be629f9f8f"}, + {file = "pillow-12.1.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6408a7b064595afcab0a49393a413732a35788f2a5092fdc6266952ed67de586"}, + {file = "pillow-12.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5d8c41325b382c07799a3682c1c258469ea2ff97103c53717b7893862d0c98ce"}, + {file = "pillow-12.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c7697918b5be27424e9ce568193efd13d925c4481dd364e43f5dff72d33e10f8"}, + {file = "pillow-12.1.1-cp314-cp314t-win32.whl", hash = "sha256:d2912fd8114fc5545aa3a4b5576512f64c55a03f3ebcca4c10194d593d43ea36"}, + {file = "pillow-12.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:4ceb838d4bd9dab43e06c363cab2eebf63846d6a4aeaea283bbdfd8f1a8ed58b"}, + {file = "pillow-12.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:7b03048319bfc6170e93bd60728a1af51d3dd7704935feb228c4d4faab35d334"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:600fd103672b925fe62ed08e0d874ea34d692474df6f4bf7ebe148b30f89f39f"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:665e1b916b043cef294bc54d47bf02d87e13f769bc4bc5fa225a24b3a6c5aca9"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:495c302af3aad1ca67420ddd5c7bd480c8867ad173528767d906428057a11f0e"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8fd420ef0c52c88b5a035a0886f367748c72147b2b8f384c9d12656678dfdfa9"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f975aa7ef9684ce7e2c18a3aa8f8e2106ce1e46b94ab713d156b2898811651d3"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8089c852a56c2966cf18835db62d9b34fef7ba74c726ad943928d494fa7f4735"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:cb9bb857b2d057c6dfc72ac5f3b44836924ba15721882ef103cecb40d002d80e"}, + {file = "pillow-12.1.1.tar.gz", hash = "sha256:9ad8fa5937ab05218e2b6a4cff30295ad35afd2f83ac592e68c0d871bb0fdbc4"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=8.2)", "sphinx-autobuild", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +test-arrow = ["arro3-compute", "arro3-core", "nanoarrow", "pyarrow"] +tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma (>=5)", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "trove-classifiers (>=2024.10.12)"] +xmp = ["defusedxml"] + +[[package]] +name = "platformdirs" +version = "4.9.2" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "platformdirs-4.9.2-py3-none-any.whl", hash = "sha256:9170634f126f8efdae22fb58ae8a0eaa86f38365bc57897a6c4f781d1f5875bd"}, + {file = "platformdirs-4.9.2.tar.gz", hash = "sha256:9a33809944b9db043ad67ca0db94b14bf452cc6aeaac46a88ea55b26e2e9d291"}, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"}, + {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["coverage", "pytest", "pytest-benchmark"] + +[[package]] +name = "pyahocorasick" +version = "2.3.0" +description = "pyahocorasick is a fast and memory efficient library for exact or approximate multi-pattern string search. With the ``ahocorasick.Automaton`` class, you can find multiple key string occurrences at once in some input text. You can use it as a plain dict-like Trie or convert a Trie to an automaton for efficient Aho-Corasick search. And pickle to disk for easy reuse of large automatons. Implemented in C and tested on Python 3.6+. Works on Linux, macOS and Windows. BSD-3-Cause license." +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "pyahocorasick-2.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d16b9ab607814968d047e26871653992240f0128ffc5d142922929afaea3bcdf"}, + {file = "pyahocorasick-2.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c1138b8f802e8f9aefd74c73314593a3e470cc5547fc4fe1d381426f31e2a264"}, + {file = "pyahocorasick-2.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cf22b22278c2352b9c2ace3d44842b9bfc2c220accbd744bbec3204b9d78f3c3"}, + {file = "pyahocorasick-2.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:668dae5f54a20ac94521c30290beadb6b941cda9aaed4ef939fd16a393c65871"}, + {file = "pyahocorasick-2.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:265e71e2635a7ddd2019a5d9f1815642c9e6d24081dcc6d728d9040d9702739f"}, + {file = "pyahocorasick-2.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3f15f8cd42e6d8164f5621e2acd768a58854740f1796a1649f91485505da4776"}, + {file = "pyahocorasick-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8a1cbd603d471e118a60f780f2b4d83a35975d71a1745419854e722dfa7fadfc"}, + {file = "pyahocorasick-2.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:41ec7f66d2fd5452d9d5e2f4ca919401981b0f52e7f1b0c2a9b7b30163ea86ea"}, + {file = "pyahocorasick-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2fb0b6fedec6558e7c8cd9397131325b03db72b2683b7abede3a37ae87150ae6"}, + {file = "pyahocorasick-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:0eae7c9fb67109649d653c20e163ae2ac33686ff266718c3bf12392cde8a42b6"}, + {file = "pyahocorasick-2.3.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7abfe09f6dca8656cc3d1122b25ea0caf272916c18a6e5a6a45ae74aa325a7fe"}, + {file = "pyahocorasick-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e7917f513aef244465e2e6a0ae1b5690e971dc336a7b15f68de2f03869d68302"}, + {file = "pyahocorasick-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dc9423ffaae542cfaeed516045576968a5ce6203a6f03d0034fcedbcabcb48cd"}, + {file = "pyahocorasick-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c0c42322518c99c49623a1784d27ae73a2765251955808e2edd64fd151e6fa57"}, + {file = "pyahocorasick-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:b417241fb8483a2b269502cdca5c69bd71579c11adb982663d61466936086fff"}, + {file = "pyahocorasick-2.3.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a0ed6066cc97e1277801f64f7633d85db4778801b3e775e0addf2e300e2e25bc"}, + {file = "pyahocorasick-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6623f2b395f2c32a5e65b780254eaca5ab8defa4f7819ebcdd68f1c98a761e25"}, + {file = "pyahocorasick-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28306dd19224b572f82d46d4831d6240770237e7188e9f9f3b267592f31af211"}, + {file = "pyahocorasick-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:05777c88934df56044927aef1239917d7bbfebe4460ff953924c9d177f574098"}, + {file = "pyahocorasick-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:52116146fea2331bc0714fef229648f05d8f2451f08d29389eb9833ebddcfc72"}, + {file = "pyahocorasick-2.3.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:d4cca977f05a18c926a1d0dca05916825dd8923100e47e44d0735d8a949cc9d4"}, + {file = "pyahocorasick-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cc53e4fe83fae539ceae2252e289fe0875db6aec12d07444368903e4dd074291"}, + {file = "pyahocorasick-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0326076ee2049822ca434529baf2c0b0d31886892d4ebfcfa5f0f64d307c6f0"}, + {file = "pyahocorasick-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9dee08a895eaa39712b65d2efe88b8aa642e07c1bd621a8f9056beb7001f1539"}, + {file = "pyahocorasick-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:0c6d9379ddf58cad4abd661795b4b975ba9b542227e78de6ded80757c3ac599d"}, + {file = "pyahocorasick-2.3.0.tar.gz", hash = "sha256:2960f5838bbcca4d7765c40478ec56f938e3f161946ff84f00c06d2b3a0ba9dd"}, +] + +[package.extras] +testing = ["pytest", "setuptools", "twine", "wheel"] + +[[package]] +name = "pyoxigraph" +version = "0.3.22" +description = "Python bindings of Oxigraph, a SPARQL database and RDF toolkit" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "pyoxigraph-0.3.22-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49609d3c8d6637193872181e8f9d8b85ae304b3d944b1d50a2e363bd4d3ad878"}, + {file = "pyoxigraph-0.3.22-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb0a0f2bd4348e9b92fbb92c71f449b7e42f6ac6fb67ce5797cbd8ab3b673c86"}, + {file = "pyoxigraph-0.3.22-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5e9cd5931488feb3bdd189094a746d2d0c05c5364a2d93a1b748d2bb91145ab8"}, + {file = "pyoxigraph-0.3.22-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:95c43d3da6d43460368f0a5f4b497412b0d6509e55eb12245b0f173248118656"}, + {file = "pyoxigraph-0.3.22-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9d466025962895e67a7c4a4ba303fe23a911f99d2158f5f53eb50f56949125f"}, + {file = "pyoxigraph-0.3.22-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90dc1e4010e2011c5440b7a3832153a14f52257e12a90a0d7fc6ed16e88a7961"}, + {file = "pyoxigraph-0.3.22-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:10c02f543fa83338e93308cad7868137ccadffc3330827deebac715333070091"}, + {file = "pyoxigraph-0.3.22-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:469039b1ed6a31fef59b8b6c2ef5c836dd147944aa7120b4f4e6db4fd5abf60a"}, + {file = "pyoxigraph-0.3.22-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2baadd8dba65ff91bdcdf85e57d928806d94612b85da58d64526f0f1d5cd4df"}, + {file = "pyoxigraph-0.3.22-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f7e217e82e541f7df4697705c7cbfbd62e019c50786669647cb261445d75215"}, + {file = "pyoxigraph-0.3.22-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:963bc825e34d7238bffb942572ac0e59a6512e7d33ec8f898f495964a8dac1de"}, + {file = "pyoxigraph-0.3.22-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c99cd7d305a5f154d6fa7eca3a93b153ac94ad2a4aff6c404ec56db38d538ea4"}, + {file = "pyoxigraph-0.3.22-cp37-abi3-macosx_10_14_x86_64.macosx_11_0_arm64.macosx_10_14_universal2.whl", hash = "sha256:32d5630c9fb3d7b819a25401b3afdbd01dbfc9624b1519d41216622fe3af52e6"}, + {file = "pyoxigraph-0.3.22-cp37-abi3-macosx_10_14_x86_64.whl", hash = "sha256:6368f24bc236a6055171f4a80cb63b9ad76fcbdbcb4a3ef981eb6d86d8975c11"}, + {file = "pyoxigraph-0.3.22-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:821e1103cf1e8f12d0738cf1b2625c8374758e33075ca67161ead3669f53e4cb"}, + {file = "pyoxigraph-0.3.22-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630f1090d67d1199c86f358094289816e0c00a21000164cfe06499c8689f8b9e"}, + {file = "pyoxigraph-0.3.22-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1aca511243209005da32470bbfec9e023ac31095bbeaa8cedabe0a652adce38c"}, + {file = "pyoxigraph-0.3.22-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ab329df388865afa9a934f1eac2e75264b220962a21bbcded6cb7ead96d1f1dd"}, + {file = "pyoxigraph-0.3.22-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:60b7f13331b91827e2edfa8633ffb7e3bfc8630b708578fb0bc8d43c76754f20"}, + {file = "pyoxigraph-0.3.22-cp37-abi3-win_amd64.whl", hash = "sha256:9a4ffd8ce28c3e8ce888662e0d9e9155e5226ecd8cd967f3c46391cf266c4c1d"}, + {file = "pyoxigraph-0.3.22-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4b8fde463e507c394f5b165a7a2571fd74028a8b343c161d81f63eb83a7d7c7"}, + {file = "pyoxigraph-0.3.22-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6ad3d8037af4ab5b1de75999fd2ba1b93becf24a9ee5e46ea0ee20a4efe270b"}, + {file = "pyoxigraph-0.3.22-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:26c229a061372b5c52f2b85f30fae028a69a8ba71654b402cc4099264d04ca58"}, + {file = "pyoxigraph-0.3.22-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9211b2a9d9f13875aec4acede8e1395ff617d64ac7cff0f80cbaf4c08fc8b648"}, + {file = "pyoxigraph-0.3.22-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00645cb370ebafc79cfecd08c5ac4656469af9ec450cb9207d94f6939e26ba0e"}, + {file = "pyoxigraph-0.3.22-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6d55de26adabe7d6fece9e1dad4556d648c4166ee79d65e4f7c64acd898656e"}, + {file = "pyoxigraph-0.3.22-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1427e62704bce0a1bc03661efd4d6a7c85cf548824e5e48b17efb4509bd034ad"}, + {file = "pyoxigraph-0.3.22-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e2bebace02e29d1cf3bc324815058f50b2ff59980a02193280a89c905d8437ab"}, + {file = "pyoxigraph-0.3.22-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e363d0b788f870b1008bb75e41a31b01a6277d9a7cc028ed6534a23bba69e60"}, + {file = "pyoxigraph-0.3.22-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0508eb4515ce1b3c7548d3f9382c1b366f6602c2e01e9e036c20e730d8fece47"}, + {file = "pyoxigraph-0.3.22-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:db64bdef54d5d1c0d51bec08d811cd1ff86c7608e24b9362523ff94fb3b46117"}, + {file = "pyoxigraph-0.3.22-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:33ca01c1727e079af3335883d75e5390619e7d2ece813c8065ba1cbcd71d17a3"}, + {file = "pyoxigraph-0.3.22-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55322d5b9b852c4813c293575aa5e676cec19c617d0aad5ae7ce47c49b113f0b"}, + {file = "pyoxigraph-0.3.22-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3397138f3a6d2c3299250ebde2bca7c95a25b58b29009eb0b29c2f5d1438d954"}, + {file = "pyoxigraph-0.3.22-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1031f91a0e75c6cd3ae9008f2d5bcdd7b2832bc1354f40dcab04ef7957f1140b"}, + {file = "pyoxigraph-0.3.22-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16f44f28fff015d310840c9744cdaaa31f6c1a548918c2316873f10bba76e17f"}, + {file = "pyoxigraph-0.3.22.tar.gz", hash = "sha256:430b18cb3cec37b8c71cee0f70ea10601b9e479f1b8c364861660ae9f8629fd9"}, +] + +[[package]] +name = "pyparsing" +version = "3.3.2" +description = "pyparsing - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d"}, + {file = "pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "pytest" +version = "7.4.4" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, + {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pytz" +version = "2025.2" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00"}, + {file = "pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "PyYAML-6.0.3-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f"}, + {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4"}, + {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efd7b85f94a6f21e4932043973a7ba2613b059c4a000551892ac9f1d11f5baf3"}, + {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6"}, + {file = "PyYAML-6.0.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6344df0d5755a2c9a276d4473ae6b90647e216ab4757f8426893b5dd2ac3f369"}, + {file = "PyYAML-6.0.3-cp38-cp38-win32.whl", hash = "sha256:3ff07ec89bae51176c0549bc4c63aa6202991da2d9a6129d7aef7f1407d3f295"}, + {file = "PyYAML-6.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:5cf4e27da7e3fbed4d6c3d8e797387aaad68102272f8f9752883bc32d61cb87b"}, + {file = "pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b"}, + {file = "pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b"}, + {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0"}, + {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69"}, + {file = "pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e"}, + {file = "pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c"}, + {file = "pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e"}, + {file = "pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d"}, + {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a"}, + {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4"}, + {file = "pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b"}, + {file = "pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf"}, + {file = "pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196"}, + {file = "pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc"}, + {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e"}, + {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea"}, + {file = "pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5"}, + {file = "pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b"}, + {file = "pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd"}, + {file = "pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8"}, + {file = "pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6"}, + {file = "pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6"}, + {file = "pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be"}, + {file = "pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26"}, + {file = "pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c"}, + {file = "pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb"}, + {file = "pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac"}, + {file = "pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5"}, + {file = "pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764"}, + {file = "pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35"}, + {file = "pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac"}, + {file = "pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3"}, + {file = "pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3"}, + {file = "pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c"}, + {file = "pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065"}, + {file = "pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65"}, + {file = "pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9"}, + {file = "pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b"}, + {file = "pyyaml-6.0.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da"}, + {file = "pyyaml-6.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a"}, + {file = "pyyaml-6.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926"}, + {file = "pyyaml-6.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7"}, + {file = "pyyaml-6.0.3-cp39-cp39-win32.whl", hash = "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0"}, + {file = "pyyaml-6.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007"}, + {file = "pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f"}, +] + +[[package]] +name = "rdflib" +version = "7.2.1" +description = "RDFLib is a Python library for working with RDF, a simple yet powerful language for representing information." +optional = false +python-versions = ">=3.8.1" +groups = ["main"] +files = [ + {file = "rdflib-7.2.1-py3-none-any.whl", hash = "sha256:1a175bc1386a167a42fbfaba003bfa05c164a2a3ca3cb9c0c97f9c9638ca6ac2"}, + {file = "rdflib-7.2.1.tar.gz", hash = "sha256:cf9b7fa25234e8925da8b1fb09700f8349b5f0f100e785fb4260e737308292ac"}, +] + +[package.dependencies] +pyparsing = ">=2.1.0,<4" + +[package.extras] +berkeleydb = ["berkeleydb (>=18.1.0,<19.0.0)"] +html = ["html5rdf (>=1.2,<2)"] +lxml = ["lxml (>=4.3,<6.0)"] +networkx = ["networkx (>=2,<4)"] +orjson = ["orjson (>=3.9.14,<4)"] + +[[package]] +name = "referencing" +version = "0.37.0" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231"}, + {file = "referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" +typing-extensions = {version = ">=4.4.0", markers = "python_version < \"3.13\""} + +[[package]] +name = "regex" +version = "2026.2.19" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "regex-2026.2.19-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f5a37a17d110f9d5357a43aa7e3507cb077bf3143d1c549a45c4649e90e40a70"}, + {file = "regex-2026.2.19-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:676c4e6847a83a1d5732b4ed553881ad36f0a8133627bb695a89ecf3571499d3"}, + {file = "regex-2026.2.19-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82336faeecac33297cd42857c3b36f12b91810e3fdd276befdd128f73a2b43fa"}, + {file = "regex-2026.2.19-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:52136f5b71f095cb74b736cc3a1b578030dada2e361ef2f07ca582240b703946"}, + {file = "regex-2026.2.19-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4192464fe3e6cb0ef6751f7d3b16f886d8270d359ed1590dd555539d364f0ff7"}, + {file = "regex-2026.2.19-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e561dd47a85d2660d3d3af4e6cb2da825cf20f121e577147963f875b83d32786"}, + {file = "regex-2026.2.19-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00ec994d7824bf01cd6c7d14c7a6a04d9aeaf7c42a2bc22d2359d715634d539b"}, + {file = "regex-2026.2.19-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2cb00aabd96b345d56a8c2bc328c8d6c4d29935061e05078bf1f02302e12abf5"}, + {file = "regex-2026.2.19-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f374366ed35673ea81b86a8859c457d4fae6ba092b71024857e9e237410c7404"}, + {file = "regex-2026.2.19-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f9417fd853fcd00b7d55167e692966dd12d95ba1a88bf08a62002ccd85030790"}, + {file = "regex-2026.2.19-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:12e86a01594031abf892686fcb309b041bf3de3d13d99eb7e2b02a8f3c687df1"}, + {file = "regex-2026.2.19-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:79014115e6fdf18fd9b32e291d58181bf42d4298642beaa13fd73e69810e4cb6"}, + {file = "regex-2026.2.19-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:31aefac2506967b7dd69af2c58eca3cc8b086d4110b66d6ac6e9026f0ee5b697"}, + {file = "regex-2026.2.19-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:49cef7bb2a491f91a8869c7cdd90babf0a417047ab0bf923cd038ed2eab2ccb8"}, + {file = "regex-2026.2.19-cp310-cp310-win32.whl", hash = "sha256:3a039474986e7a314ace6efb9ce52f5da2bdb80ac4955358723d350ec85c32ad"}, + {file = "regex-2026.2.19-cp310-cp310-win_amd64.whl", hash = "sha256:5b81ff4f9cad99f90c807a00c5882fbcda86d8b3edd94e709fb531fc52cb3d25"}, + {file = "regex-2026.2.19-cp310-cp310-win_arm64.whl", hash = "sha256:a032bc01a4bc73fc3cadba793fce28eb420da39338f47910c59ffcc11a5ba5ef"}, + {file = "regex-2026.2.19-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:93b16a18cadb938f0f2306267161d57eb33081a861cee9ffcd71e60941eb5dfc"}, + {file = "regex-2026.2.19-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:78af1e499cab704131f6f4e2f155b7f54ce396ca2acb6ef21a49507e4752e0be"}, + {file = "regex-2026.2.19-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:eb20c11aa4c3793c9ad04c19a972078cdadb261b8429380364be28e867a843f2"}, + {file = "regex-2026.2.19-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:db5fd91eec71e7b08de10011a2223d0faa20448d4e1380b9daa179fa7bf58906"}, + {file = "regex-2026.2.19-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fdbade8acba71bb45057c2b72f477f0b527c4895f9c83e6cfc30d4a006c21726"}, + {file = "regex-2026.2.19-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:31a5f561eb111d6aae14202e7043fb0b406d3c8dddbbb9e60851725c9b38ab1d"}, + {file = "regex-2026.2.19-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4584a3ee5f257b71e4b693cc9be3a5104249399f4116fe518c3f79b0c6fc7083"}, + {file = "regex-2026.2.19-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:196553ba2a2f47904e5dc272d948a746352e2644005627467e055be19d73b39e"}, + {file = "regex-2026.2.19-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0c10869d18abb759a3317c757746cc913d6324ce128b8bcec99350df10419f18"}, + {file = "regex-2026.2.19-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e689fed279cbe797a6b570bd18ff535b284d057202692c73420cb93cca41aa32"}, + {file = "regex-2026.2.19-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0782bd983f19ac7594039c9277cd6f75c89598c1d72f417e4d30d874105eb0c7"}, + {file = "regex-2026.2.19-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:dbb240c81cfed5d4a67cb86d7676d9f7ec9c3f186310bec37d8a1415210e111e"}, + {file = "regex-2026.2.19-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:80d31c3f1fe7e4c6cd1831cd4478a0609903044dfcdc4660abfe6fb307add7f0"}, + {file = "regex-2026.2.19-cp311-cp311-win32.whl", hash = "sha256:66e6a43225ff1064f8926adbafe0922b370d381c3330edaf9891cade52daa790"}, + {file = "regex-2026.2.19-cp311-cp311-win_amd64.whl", hash = "sha256:59a7a5216485a1896c5800e9feb8ff9213e11967b482633b6195d7da11450013"}, + {file = "regex-2026.2.19-cp311-cp311-win_arm64.whl", hash = "sha256:ec661807ffc14c8d14bb0b8c1bb3d5906e476bc96f98b565b709d03962ee4dd4"}, + {file = "regex-2026.2.19-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c1665138776e4ac1aa75146669236f7a8a696433ec4e525abf092ca9189247cc"}, + {file = "regex-2026.2.19-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d792b84709021945597e05656aac059526df4e0c9ef60a0eaebb306f8fafcaa8"}, + {file = "regex-2026.2.19-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:db970bcce4d63b37b3f9eb8c893f0db980bbf1d404a1d8d2b17aa8189de92c53"}, + {file = "regex-2026.2.19-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:03d706fbe7dfec503c8c3cb76f9352b3e3b53b623672aa49f18a251a6c71b8e6"}, + {file = "regex-2026.2.19-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8dbff048c042beef60aa1848961384572c5afb9e8b290b0f1203a5c42cf5af65"}, + {file = "regex-2026.2.19-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ccaaf9b907ea6b4223d5cbf5fa5dff5f33dc66f4907a25b967b8a81339a6e332"}, + {file = "regex-2026.2.19-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:75472631eee7898e16a8a20998d15106cb31cfde21cdf96ab40b432a7082af06"}, + {file = "regex-2026.2.19-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d89f85a5ccc0cec125c24be75610d433d65295827ebaf0d884cbe56df82d4774"}, + {file = "regex-2026.2.19-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0d9f81806abdca3234c3dd582b8a97492e93de3602c8772013cb4affa12d1668"}, + {file = "regex-2026.2.19-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:9dadc10d1c2bbb1326e572a226d2ec56474ab8aab26fdb8cf19419b372c349a9"}, + {file = "regex-2026.2.19-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:6bc25d7e15f80c9dc7853cbb490b91c1ec7310808b09d56bd278fe03d776f4f6"}, + {file = "regex-2026.2.19-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:965d59792f5037d9138da6fed50ba943162160443b43d4895b182551805aff9c"}, + {file = "regex-2026.2.19-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:38d88c6ed4a09ed61403dbdf515d969ccba34669af3961ceb7311ecd0cef504a"}, + {file = "regex-2026.2.19-cp312-cp312-win32.whl", hash = "sha256:5df947cabab4b643d4791af5e28aecf6bf62e6160e525651a12eba3d03755e6b"}, + {file = "regex-2026.2.19-cp312-cp312-win_amd64.whl", hash = "sha256:4146dc576ea99634ae9c15587d0c43273b4023a10702998edf0fa68ccb60237a"}, + {file = "regex-2026.2.19-cp312-cp312-win_arm64.whl", hash = "sha256:cdc0a80f679353bd68450d2a42996090c30b2e15ca90ded6156c31f1a3b63f3b"}, + {file = "regex-2026.2.19-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8df08decd339e8b3f6a2eb5c05c687fe9d963ae91f352bc57beb05f5b2ac6879"}, + {file = "regex-2026.2.19-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3aa0944f1dc6e92f91f3b306ba7f851e1009398c84bfd370633182ee4fc26a64"}, + {file = "regex-2026.2.19-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c13228fbecb03eadbfd8f521732c5fda09ef761af02e920a3148e18ad0e09968"}, + {file = "regex-2026.2.19-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0d0e72703c60d68b18b27cde7cdb65ed2570ae29fb37231aa3076bfb6b1d1c13"}, + {file = "regex-2026.2.19-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:46e69a4bf552e30e74a8aa73f473c87efcb7f6e8c8ece60d9fd7bf13d5c86f02"}, + {file = "regex-2026.2.19-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8edda06079bd770f7f0cf7f3bba1a0b447b96b4a543c91fe0c142d034c166161"}, + {file = "regex-2026.2.19-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9cbc69eae834afbf634f7c902fc72ff3e993f1c699156dd1af1adab5d06b7fe7"}, + {file = "regex-2026.2.19-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bcf57d30659996ee5c7937999874504c11b5a068edc9515e6a59221cc2744dd1"}, + {file = "regex-2026.2.19-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8e6e77cd92216eb489e21e5652a11b186afe9bdefca8a2db739fd6b205a9e0a4"}, + {file = "regex-2026.2.19-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b9ab8dec42afefa6314ea9b31b188259ffdd93f433d77cad454cd0b8d235ce1c"}, + {file = "regex-2026.2.19-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:294c0fb2e87c6bcc5f577c8f609210f5700b993151913352ed6c6af42f30f95f"}, + {file = "regex-2026.2.19-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:c0924c64b082d4512b923ac016d6e1dcf647a3560b8a4c7e55cbbd13656cb4ed"}, + {file = "regex-2026.2.19-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:790dbf87b0361606cb0d79b393c3e8f4436a14ee56568a7463014565d97da02a"}, + {file = "regex-2026.2.19-cp313-cp313-win32.whl", hash = "sha256:43cdde87006271be6963896ed816733b10967baaf0e271d529c82e93da66675b"}, + {file = "regex-2026.2.19-cp313-cp313-win_amd64.whl", hash = "sha256:127ea69273485348a126ebbf3d6052604d3c7da284f797bba781f364c0947d47"}, + {file = "regex-2026.2.19-cp313-cp313-win_arm64.whl", hash = "sha256:5e56c669535ac59cbf96ca1ece0ef26cb66809990cda4fa45e1e32c3b146599e"}, + {file = "regex-2026.2.19-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:93d881cab5afdc41a005dba1524a40947d6f7a525057aa64aaf16065cf62faa9"}, + {file = "regex-2026.2.19-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:80caaa1ddcc942ec7be18427354f9d58a79cee82dea2a6b3d4fd83302e1240d7"}, + {file = "regex-2026.2.19-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d793c5b4d2b4c668524cd1651404cfc798d40694c759aec997e196fe9729ec60"}, + {file = "regex-2026.2.19-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5100acb20648d9efd3f4e7e91f51187f95f22a741dcd719548a6cf4e1b34b3f"}, + {file = "regex-2026.2.19-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5e3a31e94d10e52a896adaa3adf3621bd526ad2b45b8c2d23d1bbe74c7423007"}, + {file = "regex-2026.2.19-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8497421099b981f67c99eba4154cf0dfd8e47159431427a11cfb6487f7791d9e"}, + {file = "regex-2026.2.19-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1e7a08622f7d51d7a068f7e4052a38739c412a3e74f55817073d2e2418149619"}, + {file = "regex-2026.2.19-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8abe671cf0f15c26b1ad389bf4043b068ce7d3b1c5d9313e12895f57d6738555"}, + {file = "regex-2026.2.19-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5a8f28dd32a4ce9c41758d43b5b9115c1c497b4b1f50c457602c1d571fa98ce1"}, + {file = "regex-2026.2.19-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:654dc41a5ba9b8cc8432b3f1aa8906d8b45f3e9502442a07c2f27f6c63f85db5"}, + {file = "regex-2026.2.19-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:4a02faea614e7fdd6ba8b3bec6c8e79529d356b100381cec76e638f45d12ca04"}, + {file = "regex-2026.2.19-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:d96162140bb819814428800934c7b71b7bffe81fb6da2d6abc1dcca31741eca3"}, + {file = "regex-2026.2.19-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c227f2922153ee42bbeb355fd6d009f8c81d9d7bdd666e2276ce41f53ed9a743"}, + {file = "regex-2026.2.19-cp313-cp313t-win32.whl", hash = "sha256:a178df8ec03011153fbcd2c70cb961bc98cbbd9694b28f706c318bee8927c3db"}, + {file = "regex-2026.2.19-cp313-cp313t-win_amd64.whl", hash = "sha256:2c1693ca6f444d554aa246b592355b5cec030ace5a2729eae1b04ab6e853e768"}, + {file = "regex-2026.2.19-cp313-cp313t-win_arm64.whl", hash = "sha256:c0761d7ae8d65773e01515ebb0b304df1bf37a0a79546caad9cbe79a42c12af7"}, + {file = "regex-2026.2.19-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:03d191a9bcf94d31af56d2575210cb0d0c6a054dbcad2ea9e00aa4c42903b919"}, + {file = "regex-2026.2.19-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:516ee067c6c721d0d0bfb80a2004edbd060fffd07e456d4e1669e38fe82f922e"}, + {file = "regex-2026.2.19-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:997862c619994c4a356cb7c3592502cbd50c2ab98da5f61c5c871f10f22de7e5"}, + {file = "regex-2026.2.19-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:02b9e1b8a7ebe2807cd7bbdf662510c8e43053a23262b9f46ad4fc2dfc9d204e"}, + {file = "regex-2026.2.19-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6c8fb3b19652e425ff24169dad3ee07f99afa7996caa9dfbb3a9106cd726f49a"}, + {file = "regex-2026.2.19-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50f1ee9488dd7a9fda850ec7c68cad7a32fa49fd19733f5403a3f92b451dcf73"}, + {file = "regex-2026.2.19-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ab780092b1424d13200aa5a62996e95f65ee3db8509be366437439cdc0af1a9f"}, + {file = "regex-2026.2.19-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:17648e1a88e72d88641b12635e70e6c71c5136ba14edba29bf8fc6834005a265"}, + {file = "regex-2026.2.19-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2f914ae8c804c8a8a562fe216100bc156bfb51338c1f8d55fe32cf407774359a"}, + {file = "regex-2026.2.19-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c7e121a918bbee3f12ac300ce0a0d2f2c979cf208fb071ed8df5a6323281915c"}, + {file = "regex-2026.2.19-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2fedd459c791da24914ecc474feecd94cf7845efb262ac3134fe27cbd7eda799"}, + {file = "regex-2026.2.19-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:ea8dfc99689240e61fb21b5fc2828f68b90abf7777d057b62d3166b7c1543c4c"}, + {file = "regex-2026.2.19-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9fff45852160960f29e184ec8a5be5ab4063cfd0b168d439d1fc4ac3744bf29e"}, + {file = "regex-2026.2.19-cp314-cp314-win32.whl", hash = "sha256:5390b130cce14a7d1db226a3896273b7b35be10af35e69f1cca843b6e5d2bb2d"}, + {file = "regex-2026.2.19-cp314-cp314-win_amd64.whl", hash = "sha256:e581f75d5c0b15669139ca1c2d3e23a65bb90e3c06ba9d9ea194c377c726a904"}, + {file = "regex-2026.2.19-cp314-cp314-win_arm64.whl", hash = "sha256:7187fdee1be0896c1499a991e9bf7c78e4b56b7863e7405d7bb687888ac10c4b"}, + {file = "regex-2026.2.19-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:5ec1d7c080832fdd4e150c6f5621fe674c70c63b3ae5a4454cebd7796263b175"}, + {file = "regex-2026.2.19-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8457c1bc10ee9b29cdfd897ccda41dce6bde0e9abd514bcfef7bcd05e254d411"}, + {file = "regex-2026.2.19-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:cce8027010d1ffa3eb89a0b19621cdc78ae548ea2b49fea1f7bfb3ea77064c2b"}, + {file = "regex-2026.2.19-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11c138febb40546ff9e026dbbc41dc9fb8b29e61013fa5848ccfe045f5b23b83"}, + {file = "regex-2026.2.19-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:74ff212aa61532246bb3036b3dfea62233414b0154b8bc3676975da78383cac3"}, + {file = "regex-2026.2.19-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d00c95a2b6bfeb3ea1cb68d1751b1dfce2b05adc2a72c488d77a780db06ab867"}, + {file = "regex-2026.2.19-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:311fcccb76af31be4c588d5a17f8f1a059ae8f4b097192896ebffc95612f223a"}, + {file = "regex-2026.2.19-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:77cfd6b5e7c4e8bf7a39d243ea05882acf5e3c7002b0ef4756de6606893b0ecd"}, + {file = "regex-2026.2.19-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6380f29ff212ec922b6efb56100c089251940e0526a0d05aa7c2d9b571ddf2fe"}, + {file = "regex-2026.2.19-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:655f553a1fa3ab8a7fd570eca793408b8d26a80bfd89ed24d116baaf13a38969"}, + {file = "regex-2026.2.19-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:015088b8558502f1f0bccd58754835aa154a7a5b0bd9d4c9b7b96ff4ae9ba876"}, + {file = "regex-2026.2.19-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9e6693b8567a59459b5dda19104c4a4dbbd4a1c78833eacc758796f2cfef1854"}, + {file = "regex-2026.2.19-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4071209fd4376ab5ceec72ad3507e9d3517c59e38a889079b98916477a871868"}, + {file = "regex-2026.2.19-cp314-cp314t-win32.whl", hash = "sha256:2905ff4a97fad42f2d0834d8b1ea3c2f856ec209837e458d71a061a7d05f9f01"}, + {file = "regex-2026.2.19-cp314-cp314t-win_amd64.whl", hash = "sha256:64128549b600987e0f335c2365879895f860a9161f283b14207c800a6ed623d3"}, + {file = "regex-2026.2.19-cp314-cp314t-win_arm64.whl", hash = "sha256:a09ae430e94c049dc6957f6baa35ee3418a3a77f3c12b6e02883bd80a2b679b0"}, + {file = "regex-2026.2.19.tar.gz", hash = "sha256:6fb8cb09b10e38f3ae17cc6dc04a1df77762bd0351b6ba9041438e7cc85ec310"}, +] + +[[package]] +name = "requests" +version = "2.32.5" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6"}, + {file = "requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset_normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "rpds-py" +version = "0.30.0" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "rpds_py-0.30.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:679ae98e00c0e8d68a7fda324e16b90fd5260945b45d3b824c892cec9eea3288"}, + {file = "rpds_py-0.30.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4cc2206b76b4f576934f0ed374b10d7ca5f457858b157ca52064bdfc26b9fc00"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389a2d49eded1896c3d48b0136ead37c48e221b391c052fba3f4055c367f60a6"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:32c8528634e1bf7121f3de08fa85b138f4e0dc47657866630611b03967f041d7"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f207f69853edd6f6700b86efb84999651baf3789e78a466431df1331608e5324"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67b02ec25ba7a9e8fa74c63b6ca44cf5707f2fbfadae3ee8e7494297d56aa9df"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0e95f6819a19965ff420f65578bacb0b00f251fefe2c8b23347c37174271f3"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:a452763cc5198f2f98898eb98f7569649fe5da666c2dc6b5ddb10fde5a574221"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0b65193a413ccc930671c55153a03ee57cecb49e6227204b04fae512eb657a7"}, + {file = "rpds_py-0.30.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:858738e9c32147f78b3ac24dc0edb6610000e56dc0f700fd5f651d0a0f0eb9ff"}, + {file = "rpds_py-0.30.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:da279aa314f00acbb803da1e76fa18666778e8a8f83484fba94526da5de2cba7"}, + {file = "rpds_py-0.30.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7c64d38fb49b6cdeda16ab49e35fe0da2e1e9b34bc38bd78386530f218b37139"}, + {file = "rpds_py-0.30.0-cp310-cp310-win32.whl", hash = "sha256:6de2a32a1665b93233cde140ff8b3467bdb9e2af2b91079f0333a0974d12d464"}, + {file = "rpds_py-0.30.0-cp310-cp310-win_amd64.whl", hash = "sha256:1726859cd0de969f88dc8673bdd954185b9104e05806be64bcd87badbe313169"}, + {file = "rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a2bffea6a4ca9f01b3f8e548302470306689684e61602aa3d141e34da06cf425"}, + {file = "rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:422c3cb9856d80b09d30d2eb255d0754b23e090034e1deb4083f8004bd0761e4"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07ae8a593e1c3c6b82ca3292efbe73c30b61332fd612e05abee07c79359f292f"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12f90dd7557b6bd57f40abe7747e81e0c0b119bef015ea7726e69fe550e394a4"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99b47d6ad9a6da00bec6aabe5a6279ecd3c06a329d4aa4771034a21e335c3a97"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33f559f3104504506a44bb666b93a33f5d33133765b0c216a5bf2f1e1503af89"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:946fe926af6e44f3697abbc305ea168c2c31d3e3ef1058cf68f379bf0335a78d"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:495aeca4b93d465efde585977365187149e75383ad2684f81519f504f5c13038"}, + {file = "rpds_py-0.30.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9a0ca5da0386dee0655b4ccdf46119df60e0f10da268d04fe7cc87886872ba7"}, + {file = "rpds_py-0.30.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8d6d1cc13664ec13c1b84241204ff3b12f9bb82464b8ad6e7a5d3486975c2eed"}, + {file = "rpds_py-0.30.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3896fa1be39912cf0757753826bc8bdc8ca331a28a7c4ae46b7a21280b06bb85"}, + {file = "rpds_py-0.30.0-cp311-cp311-win32.whl", hash = "sha256:55f66022632205940f1827effeff17c4fa7ae1953d2b74a8581baaefb7d16f8c"}, + {file = "rpds_py-0.30.0-cp311-cp311-win_amd64.whl", hash = "sha256:a51033ff701fca756439d641c0ad09a41d9242fa69121c7d8769604a0a629825"}, + {file = "rpds_py-0.30.0-cp311-cp311-win_arm64.whl", hash = "sha256:47b0ef6231c58f506ef0b74d44e330405caa8428e770fec25329ed2cb971a229"}, + {file = "rpds_py-0.30.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a161f20d9a43006833cd7068375a94d035714d73a172b681d8881820600abfad"}, + {file = "rpds_py-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6abc8880d9d036ecaafe709079969f56e876fcf107f7a8e9920ba6d5a3878d05"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca28829ae5f5d569bb62a79512c842a03a12576375d5ece7d2cadf8abe96ec28"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1010ed9524c73b94d15919ca4d41d8780980e1765babf85f9a2f90d247153dd"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8d1736cfb49381ba528cd5baa46f82fdc65c06e843dab24dd70b63d09121b3f"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d948b135c4693daff7bc2dcfc4ec57237a29bd37e60c2fabf5aff2bbacf3e2f1"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47f236970bccb2233267d89173d3ad2703cd36a0e2a6e92d0560d333871a3d23"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:2e6ecb5a5bcacf59c3f912155044479af1d0b6681280048b338b28e364aca1f6"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a8fa71a2e078c527c3e9dc9fc5a98c9db40bcc8a92b4e8858e36d329f8684b51"}, + {file = "rpds_py-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73c67f2db7bc334e518d097c6d1e6fed021bbc9b7d678d6cc433478365d1d5f5"}, + {file = "rpds_py-0.30.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5ba103fb455be00f3b1c2076c9d4264bfcb037c976167a6047ed82f23153f02e"}, + {file = "rpds_py-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee9c752c0364588353e627da8a7e808a66873672bcb5f52890c33fd965b394"}, + {file = "rpds_py-0.30.0-cp312-cp312-win32.whl", hash = "sha256:1ab5b83dbcf55acc8b08fc62b796ef672c457b17dbd7820a11d6c52c06839bdf"}, + {file = "rpds_py-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:a090322ca841abd453d43456ac34db46e8b05fd9b3b4ac0c78bcde8b089f959b"}, + {file = "rpds_py-0.30.0-cp312-cp312-win_arm64.whl", hash = "sha256:669b1805bd639dd2989b281be2cfd951c6121b65e729d9b843e9639ef1fd555e"}, + {file = "rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2"}, + {file = "rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a59119fc6e3f460315fe9d08149f8102aa322299deaa5cab5b40092345c2136"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76fec018282b4ead0364022e3c54b60bf368b9d926877957a8624b58419169b7"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bef75a5525db97318e8cd061542b5a79812d711ea03dbc1f6f8dbb0c5f0d2"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:9cf69cdda1f5968a30a359aba2f7f9aa648a9ce4b580d6826437f2b291cfc86e"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4796a717bf12b9da9d3ad002519a86063dcac8988b030e405704ef7d74d2d9d"}, + {file = "rpds_py-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7"}, + {file = "rpds_py-0.30.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba81a9203d07805435eb06f536d95a266c21e5b2dfbf6517748ca40c98d19e31"}, + {file = "rpds_py-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95"}, + {file = "rpds_py-0.30.0-cp313-cp313-win32.whl", hash = "sha256:b40fb160a2db369a194cb27943582b38f79fc4887291417685f3ad693c5a1d5d"}, + {file = "rpds_py-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15"}, + {file = "rpds_py-0.30.0-cp313-cp313-win_arm64.whl", hash = "sha256:d96c2086587c7c30d44f31f42eae4eac89b60dabbac18c7669be3700f13c3ce1"}, + {file = "rpds_py-0.30.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:eb0b93f2e5c2189ee831ee43f156ed34e2a89a78a66b98cadad955972548be5a"}, + {file = "rpds_py-0.30.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47f9a91efc418b54fb8190a6b4aa7813a23fb79c51f4bb84e418f5476c38b8db"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3587eb9b17f3789ad50824084fa6f81921bbf9a795826570bda82cb3ed91f2"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39c02563fc592411c2c61d26b6c5fe1e51eaa44a75aa2c8735ca88b0d9599daa"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:eb2c4071ab598733724c08221091e8d80e89064cd472819285a9ab0f24bcedb9"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bdfdb946967d816e6adf9a3d8201bfad269c67efe6cefd7093ef959683c8de0"}, + {file = "rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94"}, + {file = "rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:61046904275472a76c8c90c9ccee9013d70a6d0f73eecefd38c1ae7c39045a08"}, + {file = "rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27"}, + {file = "rpds_py-0.30.0-cp313-cp313t-win32.whl", hash = "sha256:3d4a69de7a3e50ffc214ae16d79d8fbb0922972da0356dcf4d0fdca2878559c6"}, + {file = "rpds_py-0.30.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f14fc5df50a716f7ece6a80b6c78bb35ea2ca47c499e422aa4463455dd96d56d"}, + {file = "rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0"}, + {file = "rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f251c812357a3fed308d684a5079ddfb9d933860fc6de89f2b7ab00da481e65f"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac98b175585ecf4c0348fd7b29c3864bda53b805c773cbf7bfdaffc8070c976f"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e62880792319dbeb7eb866547f2e35973289e7d5696c6e295476448f5b63c87"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e7fc54e0900ab35d041b0601431b0a0eb495f0851a0639b6ef90f7741b39a18"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b4dc1a6ff022ff85ecafef7979a2c6eb423430e05f1165d6688234e62ba99a07"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4559c972db3a360808309e06a74628b95eaccbf961c335c8fe0d590cf587456f"}, + {file = "rpds_py-0.30.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0ed177ed9bded28f8deb6ab40c183cd1192aa0de40c12f38be4d59cd33cb5c65"}, + {file = "rpds_py-0.30.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ad1fa8db769b76ea911cb4e10f049d80bf518c104f15b3edb2371cc65375c46f"}, + {file = "rpds_py-0.30.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:46e83c697b1f1c72b50e5ee5adb4353eef7406fb3f2043d64c33f20ad1c2fc53"}, + {file = "rpds_py-0.30.0-cp314-cp314-win32.whl", hash = "sha256:ee454b2a007d57363c2dfd5b6ca4a5d7e2c518938f8ed3b706e37e5d470801ed"}, + {file = "rpds_py-0.30.0-cp314-cp314-win_amd64.whl", hash = "sha256:95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950"}, + {file = "rpds_py-0.30.0-cp314-cp314-win_arm64.whl", hash = "sha256:613aa4771c99f03346e54c3f038e4cc574ac09a3ddfb0e8878487335e96dead6"}, + {file = "rpds_py-0.30.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7e6ecfcb62edfd632e56983964e6884851786443739dbfe3582947e87274f7cb"}, + {file = "rpds_py-0.30.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a1d0bc22a7cdc173fedebb73ef81e07faef93692b8c1ad3733b67e31e1b6e1b8"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d08f00679177226c4cb8c5265012eea897c8ca3b93f429e546600c971bcbae7"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5965af57d5848192c13534f90f9dd16464f3c37aaf166cc1da1cae1fd5a34898"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a4e86e34e9ab6b667c27f3211ca48f73dba7cd3d90f8d5b11be56e5dbc3fb4e"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d3e6b26f2c785d65cc25ef1e5267ccbe1b069c5c21b8cc724efee290554419"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:626a7433c34566535b6e56a1b39a7b17ba961e97ce3b80ec62e6f1312c025551"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:acd7eb3f4471577b9b5a41baf02a978e8bdeb08b4b355273994f8b87032000a8"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe5fa731a1fa8a0a56b0977413f8cacac1768dad38d16b3a296712709476fbd5"}, + {file = "rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:74a3243a411126362712ee1524dfc90c650a503502f135d54d1b352bd01f2404"}, + {file = "rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3e8eeb0544f2eb0d2581774be4c3410356eba189529a6b3e36bbbf9696175856"}, + {file = "rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dbd936cde57abfee19ab3213cf9c26be06d60750e60a8e4dd85d1ab12c8b1f40"}, + {file = "rpds_py-0.30.0-cp314-cp314t-win32.whl", hash = "sha256:dc824125c72246d924f7f796b4f63c1e9dc810c7d9e2355864b3c3a73d59ade0"}, + {file = "rpds_py-0.30.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27f4b0e92de5bfbc6f86e43959e6edd1425c33b5e69aab0984a72047f2bcf1e3"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c2262bdba0ad4fc6fb5545660673925c2d2a5d9e2e0fb603aad545427be0fc58"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ee6af14263f25eedc3bb918a3c04245106a42dfd4f5c2285ea6f997b1fc3f89a"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3adbb8179ce342d235c31ab8ec511e66c73faa27a47e076ccc92421add53e2bb"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:250fa00e9543ac9b97ac258bd37367ff5256666122c2d0f2bc97577c60a1818c"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9854cf4f488b3d57b9aaeb105f06d78e5529d3145b1e4a41750167e8c213c6d3"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:993914b8e560023bc0a8bf742c5f303551992dcb85e247b1e5c7f4a7d145bda5"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58edca431fb9b29950807e301826586e5bbf24163677732429770a697ffe6738"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:dea5b552272a944763b34394d04577cf0f9bd013207bc32323b5a89a53cf9c2f"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ba3af48635eb83d03f6c9735dfb21785303e73d22ad03d489e88adae6eab8877"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:dff13836529b921e22f15cb099751209a60009731a68519630a24d61f0b1b30a"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:1b151685b23929ab7beec71080a8889d4d6d9fa9a983d213f07121205d48e2c4"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac37f9f516c51e5753f27dfdef11a88330f04de2d564be3991384b2f3535d02e"}, + {file = "rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84"}, +] + +[[package]] +name = "ruamel-yaml" +version = "0.18.17" +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.9" +groups = ["main"] +files = [ + {file = "ruamel_yaml-0.18.17-py3-none-any.whl", hash = "sha256:9c8ba9eb3e793efdf924b60d521820869d5bf0cb9c6f1b82d82de8295e290b9d"}, + {file = "ruamel_yaml-0.18.17.tar.gz", hash = "sha256:9091cd6e2d93a3a4b157ddb8fabf348c3de7f1fb1381346d985b6b247dcd8d3c"}, +] + +[package.dependencies] +"ruamel.yaml.clib" = {version = ">=0.2.15", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.15\""} + +[package.extras] +docs = ["mercurial (>5.7)", "ryd"] +jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] + +[[package]] +name = "ruamel-yaml-clib" +version = "0.2.15" +description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" +optional = false +python-versions = ">=3.9" +groups = ["main"] +markers = "platform_python_implementation == \"CPython\"" +files = [ + {file = "ruamel_yaml_clib-0.2.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:88eea8baf72f0ccf232c22124d122a7f26e8a24110a0273d9bcddcb0f7e1fa03"}, + {file = "ruamel_yaml_clib-0.2.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9b6f7d74d094d1f3a4e157278da97752f16ee230080ae331fcc219056ca54f77"}, + {file = "ruamel_yaml_clib-0.2.15-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4be366220090d7c3424ac2b71c90d1044ea34fca8c0b88f250064fd06087e614"}, + {file = "ruamel_yaml_clib-0.2.15-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f66f600833af58bea694d5892453f2270695b92200280ee8c625ec5a477eed3"}, + {file = "ruamel_yaml_clib-0.2.15-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da3d6adadcf55a93c214d23941aef4abfd45652110aed6580e814152f385b862"}, + {file = "ruamel_yaml_clib-0.2.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e9fde97ecb7bb9c41261c2ce0da10323e9227555c674989f8d9eb7572fc2098d"}, + {file = "ruamel_yaml_clib-0.2.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:05c70f7f86be6f7bee53794d80050a28ae7e13e4a0087c1839dcdefd68eb36b6"}, + {file = "ruamel_yaml_clib-0.2.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6f1d38cbe622039d111b69e9ca945e7e3efebb30ba998867908773183357f3ed"}, + {file = "ruamel_yaml_clib-0.2.15-cp310-cp310-win32.whl", hash = "sha256:fe239bdfdae2302e93bd6e8264bd9b71290218fff7084a9db250b55caaccf43f"}, + {file = "ruamel_yaml_clib-0.2.15-cp310-cp310-win_amd64.whl", hash = "sha256:468858e5cbde0198337e6a2a78eda8c3fb148bdf4c6498eaf4bc9ba3f8e780bd"}, + {file = "ruamel_yaml_clib-0.2.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c583229f336682b7212a43d2fa32c30e643d3076178fb9f7a6a14dde85a2d8bd"}, + {file = "ruamel_yaml_clib-0.2.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56ea19c157ed8c74b6be51b5fa1c3aff6e289a041575f0556f66e5fb848bb137"}, + {file = "ruamel_yaml_clib-0.2.15-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5fea0932358e18293407feb921d4f4457db837b67ec1837f87074667449f9401"}, + {file = "ruamel_yaml_clib-0.2.15-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef71831bd61fbdb7aa0399d5c4da06bea37107ab5c79ff884cc07f2450910262"}, + {file = "ruamel_yaml_clib-0.2.15-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:617d35dc765715fa86f8c3ccdae1e4229055832c452d4ec20856136acc75053f"}, + {file = "ruamel_yaml_clib-0.2.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b45498cc81a4724a2d42273d6cfc243c0547ad7c6b87b4f774cb7bcc131c98d"}, + {file = "ruamel_yaml_clib-0.2.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:def5663361f6771b18646620fca12968aae730132e104688766cf8a3b1d65922"}, + {file = "ruamel_yaml_clib-0.2.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:014181cdec565c8745b7cbc4de3bf2cc8ced05183d986e6d1200168e5bb59490"}, + {file = "ruamel_yaml_clib-0.2.15-cp311-cp311-win32.whl", hash = "sha256:d290eda8f6ada19e1771b54e5706b8f9807e6bb08e873900d5ba114ced13e02c"}, + {file = "ruamel_yaml_clib-0.2.15-cp311-cp311-win_amd64.whl", hash = "sha256:bdc06ad71173b915167702f55d0f3f027fc61abd975bd308a0968c02db4a4c3e"}, + {file = "ruamel_yaml_clib-0.2.15-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cb15a2e2a90c8475df45c0949793af1ff413acfb0a716b8b94e488ea95ce7cff"}, + {file = "ruamel_yaml_clib-0.2.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:64da03cbe93c1e91af133f5bec37fd24d0d4ba2418eaf970d7166b0a26a148a2"}, + {file = "ruamel_yaml_clib-0.2.15-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f6d3655e95a80325b84c4e14c080b2470fe4f33b6846f288379ce36154993fb1"}, + {file = "ruamel_yaml_clib-0.2.15-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:71845d377c7a47afc6592aacfea738cc8a7e876d586dfba814501d8c53c1ba60"}, + {file = "ruamel_yaml_clib-0.2.15-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11e5499db1ccbc7f4b41f0565e4f799d863ea720e01d3e99fa0b7b5fcd7802c9"}, + {file = "ruamel_yaml_clib-0.2.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4b293a37dc97e2b1e8a1aec62792d1e52027087c8eea4fc7b5abd2bdafdd6642"}, + {file = "ruamel_yaml_clib-0.2.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:512571ad41bba04eac7268fe33f7f4742210ca26a81fe0c75357fa682636c690"}, + {file = "ruamel_yaml_clib-0.2.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e5e9f630c73a490b758bf14d859a39f375e6999aea5ddd2e2e9da89b9953486a"}, + {file = "ruamel_yaml_clib-0.2.15-cp312-cp312-win32.whl", hash = "sha256:f4421ab780c37210a07d138e56dd4b51f8642187cdfb433eb687fe8c11de0144"}, + {file = "ruamel_yaml_clib-0.2.15-cp312-cp312-win_amd64.whl", hash = "sha256:2b216904750889133d9222b7b873c199d48ecbb12912aca78970f84a5aa1a4bc"}, + {file = "ruamel_yaml_clib-0.2.15-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4dcec721fddbb62e60c2801ba08c87010bd6b700054a09998c4d09c08147b8fb"}, + {file = "ruamel_yaml_clib-0.2.15-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:65f48245279f9bb301d1276f9679b82e4c080a1ae25e679f682ac62446fac471"}, + {file = "ruamel_yaml_clib-0.2.15-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:46895c17ead5e22bea5e576f1db7e41cb273e8d062c04a6a49013d9f60996c25"}, + {file = "ruamel_yaml_clib-0.2.15-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3eb199178b08956e5be6288ee0b05b2fb0b5c1f309725ad25d9c6ea7e27f962a"}, + {file = "ruamel_yaml_clib-0.2.15-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d1032919280ebc04a80e4fb1e93f7a738129857eaec9448310e638c8bccefcf"}, + {file = "ruamel_yaml_clib-0.2.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ab0df0648d86a7ecbd9c632e8f8d6b21bb21b5fc9d9e095c796cacf32a728d2d"}, + {file = "ruamel_yaml_clib-0.2.15-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:331fb180858dd8534f0e61aa243b944f25e73a4dae9962bd44c46d1761126bbf"}, + {file = "ruamel_yaml_clib-0.2.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fd4c928ddf6bce586285daa6d90680b9c291cfd045fc40aad34e445d57b1bf51"}, + {file = "ruamel_yaml_clib-0.2.15-cp313-cp313-win32.whl", hash = "sha256:bf0846d629e160223805db9fe8cc7aec16aaa11a07310c50c8c7164efa440aec"}, + {file = "ruamel_yaml_clib-0.2.15-cp313-cp313-win_amd64.whl", hash = "sha256:45702dfbea1420ba3450bb3dd9a80b33f0badd57539c6aac09f42584303e0db6"}, + {file = "ruamel_yaml_clib-0.2.15-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:753faf20b3a5906faf1fc50e4ddb8c074cb9b251e00b14c18b28492f933ac8ef"}, + {file = "ruamel_yaml_clib-0.2.15-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:480894aee0b29752560a9de46c0e5f84a82602f2bc5c6cde8db9a345319acfdf"}, + {file = "ruamel_yaml_clib-0.2.15-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4d3b58ab2454b4747442ac76fab66739c72b1e2bb9bd173d7694b9f9dbc9c000"}, + {file = "ruamel_yaml_clib-0.2.15-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bfd309b316228acecfa30670c3887dcedf9b7a44ea39e2101e75d2654522acd4"}, + {file = "ruamel_yaml_clib-0.2.15-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2812ff359ec1f30129b62372e5f22a52936fac13d5d21e70373dbca5d64bb97c"}, + {file = "ruamel_yaml_clib-0.2.15-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7e74ea87307303ba91073b63e67f2c667e93f05a8c63079ee5b7a5c8d0d7b043"}, + {file = "ruamel_yaml_clib-0.2.15-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:713cd68af9dfbe0bb588e144a61aad8dcc00ef92a82d2e87183ca662d242f524"}, + {file = "ruamel_yaml_clib-0.2.15-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:542d77b72786a35563f97069b9379ce762944e67055bea293480f7734b2c7e5e"}, + {file = "ruamel_yaml_clib-0.2.15-cp314-cp314-win32.whl", hash = "sha256:424ead8cef3939d690c4b5c85ef5b52155a231ff8b252961b6516ed7cf05f6aa"}, + {file = "ruamel_yaml_clib-0.2.15-cp314-cp314-win_amd64.whl", hash = "sha256:ac9b8d5fa4bb7fd2917ab5027f60d4234345fd366fe39aa711d5dca090aa1467"}, + {file = "ruamel_yaml_clib-0.2.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:923816815974425fbb1f1bf57e85eca6e14d8adc313c66db21c094927ad01815"}, + {file = "ruamel_yaml_clib-0.2.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dcc7f3162d3711fd5d52e2267e44636e3e566d1e5675a5f0b30e98f2c4af7974"}, + {file = "ruamel_yaml_clib-0.2.15-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5d3c9210219cbc0f22706f19b154c9a798ff65a6beeafbf77fc9c057ec806f7d"}, + {file = "ruamel_yaml_clib-0.2.15-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bb7b728fd9f405aa00b4a0b17ba3f3b810d0ccc5f77f7373162e9b5f0ff75d5"}, + {file = "ruamel_yaml_clib-0.2.15-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3cb75a3c14f1d6c3c2a94631e362802f70e83e20d1f2b2ef3026c05b415c4900"}, + {file = "ruamel_yaml_clib-0.2.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:badd1d7283f3e5894779a6ea8944cc765138b96804496c91812b2829f70e18a7"}, + {file = "ruamel_yaml_clib-0.2.15-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0ba6604bbc3dfcef844631932d06a1a4dcac3fee904efccf582261948431628a"}, + {file = "ruamel_yaml_clib-0.2.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a8220fd4c6f98485e97aea65e1df76d4fed1678ede1fe1d0eed2957230d287c4"}, + {file = "ruamel_yaml_clib-0.2.15-cp39-cp39-win32.whl", hash = "sha256:04d21dc9c57d9608225da28285900762befbb0165ae48482c15d8d4989d4af14"}, + {file = "ruamel_yaml_clib-0.2.15-cp39-cp39-win_amd64.whl", hash = "sha256:27dc656e84396e6d687f97c6e65fb284d100483628f02d95464fd731743a4afe"}, + {file = "ruamel_yaml_clib-0.2.15.tar.gz", hash = "sha256:46e4cc8c43ef6a94885f72512094e482114a8a706d3c555a34ed4b0d20200600"}, +] + +[[package]] +name = "scikit-learn" +version = "1.5.0" +description = "A set of python modules for machine learning and data mining" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "scikit_learn-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:12e40ac48555e6b551f0a0a5743cc94cc5a765c9513fe708e01f0aa001da2801"}, + {file = "scikit_learn-1.5.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f405c4dae288f5f6553b10c4ac9ea7754d5180ec11e296464adb5d6ac68b6ef5"}, + {file = "scikit_learn-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df8ccabbf583315f13160a4bb06037bde99ea7d8211a69787a6b7c5d4ebb6fc3"}, + {file = "scikit_learn-1.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c75ea812cd83b1385bbfa94ae971f0d80adb338a9523f6bbcb5e0b0381151d4"}, + {file = "scikit_learn-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:a90c5da84829a0b9b4bf00daf62754b2be741e66b5946911f5bdfaa869fcedd6"}, + {file = "scikit_learn-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a65af2d8a6cce4e163a7951a4cfbfa7fceb2d5c013a4b593686c7f16445cf9d"}, + {file = "scikit_learn-1.5.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:4c0c56c3005f2ec1db3787aeaabefa96256580678cec783986836fc64f8ff622"}, + {file = "scikit_learn-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f77547165c00625551e5c250cefa3f03f2fc92c5e18668abd90bfc4be2e0bff"}, + {file = "scikit_learn-1.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:118a8d229a41158c9f90093e46b3737120a165181a1b58c03461447aa4657415"}, + {file = "scikit_learn-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:a03b09f9f7f09ffe8c5efffe2e9de1196c696d811be6798ad5eddf323c6f4d40"}, + {file = "scikit_learn-1.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:460806030c666addee1f074788b3978329a5bfdc9b7d63e7aad3f6d45c67a210"}, + {file = "scikit_learn-1.5.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:1b94d6440603752b27842eda97f6395f570941857456c606eb1d638efdb38184"}, + {file = "scikit_learn-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d82c2e573f0f2f2f0be897e7a31fcf4e73869247738ab8c3ce7245549af58ab8"}, + {file = "scikit_learn-1.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3a10e1d9e834e84d05e468ec501a356226338778769317ee0b84043c0d8fb06"}, + {file = "scikit_learn-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:855fc5fa8ed9e4f08291203af3d3e5fbdc4737bd617a371559aaa2088166046e"}, + {file = "scikit_learn-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:40fb7d4a9a2db07e6e0cae4dc7bdbb8fada17043bac24104d8165e10e4cff1a2"}, + {file = "scikit_learn-1.5.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:47132440050b1c5beb95f8ba0b2402bbd9057ce96ec0ba86f2f445dd4f34df67"}, + {file = "scikit_learn-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:174beb56e3e881c90424e21f576fa69c4ffcf5174632a79ab4461c4c960315ac"}, + {file = "scikit_learn-1.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261fe334ca48f09ed64b8fae13f9b46cc43ac5f580c4a605cbb0a517456c8f71"}, + {file = "scikit_learn-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:057b991ac64b3e75c9c04b5f9395eaf19a6179244c089afdebaad98264bff37c"}, + {file = "scikit_learn-1.5.0.tar.gz", hash = "sha256:789e3db01c750ed6d496fa2db7d50637857b451e57bcae863bff707c1247bef7"}, +] + +[package.dependencies] +joblib = ">=1.2.0" +numpy = ">=1.19.5" +scipy = ">=1.6.0" +threadpoolctl = ">=3.1.0" + +[package.extras] +benchmark = ["matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "pandas (>=1.1.5)"] +build = ["cython (>=3.0.10)", "meson-python (>=0.15.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "polars (>=0.20.23)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=6.0.0)", "sphinx-copybutton (>=0.5.2)", "sphinx-gallery (>=0.15.0)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] +examples = ["matplotlib (>=3.3.4)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)"] +install = ["joblib (>=1.2.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)", "threadpoolctl (>=3.1.0)"] +maintenance = ["conda-lock (==2.5.6)"] +tests = ["black (>=24.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.9)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.20.23)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.2.1)", "scikit-image (>=0.17.2)"] + +[[package]] +name = "scipy" +version = "1.17.1" +description = "Fundamental algorithms for scientific computing in Python" +optional = false +python-versions = ">=3.11" +groups = ["main"] +files = [ + {file = "scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:1f95b894f13729334fb990162e911c9e5dc1ab390c58aa6cbecb389c5b5e28ec"}, + {file = "scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:e18f12c6b0bc5a592ed23d3f7b891f68fd7f8241d69b7883769eb5d5dfb52696"}, + {file = "scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a3472cfbca0a54177d0faa68f697d8ba4c80bbdc19908c3465556d9f7efce9ee"}, + {file = "scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:766e0dc5a616d026a3a1cffa379af959671729083882f50307e18175797b3dfd"}, + {file = "scipy-1.17.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:744b2bf3640d907b79f3fd7874efe432d1cf171ee721243e350f55234b4cec4c"}, + {file = "scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43af8d1f3bea642559019edfe64e9b11192a8978efbd1539d7bc2aaa23d92de4"}, + {file = "scipy-1.17.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd96a1898c0a47be4520327e01f874acfd61fb48a9420f8aa9f6483412ffa444"}, + {file = "scipy-1.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4eb6c25dd62ee8d5edf68a8e1c171dd71c292fdae95d8aeb3dd7d7de4c364082"}, + {file = "scipy-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:d30e57c72013c2a4fe441c2fcb8e77b14e152ad48b5464858e07e2ad9fbfceff"}, + {file = "scipy-1.17.1-cp311-cp311-win_arm64.whl", hash = "sha256:9ecb4efb1cd6e8c4afea0daa91a87fbddbce1b99d2895d151596716c0b2e859d"}, + {file = "scipy-1.17.1-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:35c3a56d2ef83efc372eaec584314bd0ef2e2f0d2adb21c55e6ad5b344c0dcb8"}, + {file = "scipy-1.17.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:fcb310ddb270a06114bb64bbe53c94926b943f5b7f0842194d585c65eb4edd76"}, + {file = "scipy-1.17.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:cc90d2e9c7e5c7f1a482c9875007c095c3194b1cfedca3c2f3291cdc2bc7c086"}, + {file = "scipy-1.17.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:c80be5ede8f3f8eded4eff73cc99a25c388ce98e555b17d31da05287015ffa5b"}, + {file = "scipy-1.17.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e19ebea31758fac5893a2ac360fedd00116cbb7628e650842a6691ba7ca28a21"}, + {file = "scipy-1.17.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02ae3b274fde71c5e92ac4d54bc06c42d80e399fec704383dcd99b301df37458"}, + {file = "scipy-1.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8a604bae87c6195d8b1045eddece0514d041604b14f2727bbc2b3020172045eb"}, + {file = "scipy-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f590cd684941912d10becc07325a3eeb77886fe981415660d9265c4c418d0bea"}, + {file = "scipy-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:41b71f4a3a4cab9d366cd9065b288efc4d4f3c0b37a91a8e0947fb5bd7f31d87"}, + {file = "scipy-1.17.1-cp312-cp312-win_arm64.whl", hash = "sha256:f4115102802df98b2b0db3cce5cb9b92572633a1197c77b7553e5203f284a5b3"}, + {file = "scipy-1.17.1-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:5e3c5c011904115f88a39308379c17f91546f77c1667cea98739fe0fccea804c"}, + {file = "scipy-1.17.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:6fac755ca3d2c3edcb22f479fceaa241704111414831ddd3bc6056e18516892f"}, + {file = "scipy-1.17.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:7ff200bf9d24f2e4d5dc6ee8c3ac64d739d3a89e2326ba68aaf6c4a2b838fd7d"}, + {file = "scipy-1.17.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4b400bdc6f79fa02a4d86640310dde87a21fba0c979efff5248908c6f15fad1b"}, + {file = "scipy-1.17.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b64ca7d4aee0102a97f3ba22124052b4bd2152522355073580bf4845e2550b6"}, + {file = "scipy-1.17.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:581b2264fc0aa555f3f435a5944da7504ea3a065d7029ad60e7c3d1ae09c5464"}, + {file = "scipy-1.17.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:beeda3d4ae615106d7094f7e7cef6218392e4465cc95d25f900bebabfded0950"}, + {file = "scipy-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6609bc224e9568f65064cfa72edc0f24ee6655b47575954ec6339534b2798369"}, + {file = "scipy-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:37425bc9175607b0268f493d79a292c39f9d001a357bebb6b88fdfaff13f6448"}, + {file = "scipy-1.17.1-cp313-cp313-win_arm64.whl", hash = "sha256:5cf36e801231b6a2059bf354720274b7558746f3b1a4efb43fcf557ccd484a87"}, + {file = "scipy-1.17.1-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:d59c30000a16d8edc7e64152e30220bfbd724c9bbb08368c054e24c651314f0a"}, + {file = "scipy-1.17.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:010f4333c96c9bb1a4516269e33cb5917b08ef2166d5556ca2fd9f082a9e6ea0"}, + {file = "scipy-1.17.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:2ceb2d3e01c5f1d83c4189737a42d9cb2fc38a6eeed225e7515eef71ad301dce"}, + {file = "scipy-1.17.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:844e165636711ef41f80b4103ed234181646b98a53c8f05da12ca5ca289134f6"}, + {file = "scipy-1.17.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:158dd96d2207e21c966063e1635b1063cd7787b627b6f07305315dd73d9c679e"}, + {file = "scipy-1.17.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:74cbb80d93260fe2ffa334efa24cb8f2f0f622a9b9febf8b483c0b865bfb3475"}, + {file = "scipy-1.17.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dbc12c9f3d185f5c737d801da555fb74b3dcfa1a50b66a1a93e09190f41fab50"}, + {file = "scipy-1.17.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:94055a11dfebe37c656e70317e1996dc197e1a15bbcc351bcdd4610e128fe1ca"}, + {file = "scipy-1.17.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e30bdeaa5deed6bc27b4cc490823cd0347d7dae09119b8803ae576ea0ce52e4c"}, + {file = "scipy-1.17.1-cp313-cp313t-win_arm64.whl", hash = "sha256:a720477885a9d2411f94a93d16f9d89bad0f28ca23c3f8daa521e2dcc3f44d49"}, + {file = "scipy-1.17.1-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:a48a72c77a310327f6a3a920092fa2b8fd03d7deaa60f093038f22d98e096717"}, + {file = "scipy-1.17.1-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:45abad819184f07240d8a696117a7aacd39787af9e0b719d00285549ed19a1e9"}, + {file = "scipy-1.17.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:3fd1fcdab3ea951b610dc4cef356d416d5802991e7e32b5254828d342f7b7e0b"}, + {file = "scipy-1.17.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:7bdf2da170b67fdf10bca777614b1c7d96ae3ca5794fd9587dce41eb2966e866"}, + {file = "scipy-1.17.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:adb2642e060a6549c343603a3851ba76ef0b74cc8c079a9a58121c7ec9fe2350"}, + {file = "scipy-1.17.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eee2cfda04c00a857206a4330f0c5e3e56535494e30ca445eb19ec624ae75118"}, + {file = "scipy-1.17.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d2650c1fb97e184d12d8ba010493ee7b322864f7d3d00d3f9bb97d9c21de4068"}, + {file = "scipy-1.17.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:08b900519463543aa604a06bec02461558a6e1cef8fdbb8098f77a48a83c8118"}, + {file = "scipy-1.17.1-cp314-cp314-win_amd64.whl", hash = "sha256:3877ac408e14da24a6196de0ddcace62092bfc12a83823e92e49e40747e52c19"}, + {file = "scipy-1.17.1-cp314-cp314-win_arm64.whl", hash = "sha256:f8885db0bc2bffa59d5c1b72fad7a6a92d3e80e7257f967dd81abb553a90d293"}, + {file = "scipy-1.17.1-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:1cc682cea2ae55524432f3cdff9e9a3be743d52a7443d0cba9017c23c87ae2f6"}, + {file = "scipy-1.17.1-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:2040ad4d1795a0ae89bfc7e8429677f365d45aa9fd5e4587cf1ea737f927b4a1"}, + {file = "scipy-1.17.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:131f5aaea57602008f9822e2115029b55d4b5f7c070287699fe45c661d051e39"}, + {file = "scipy-1.17.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:9cdc1a2fcfd5c52cfb3045feb399f7b3ce822abdde3a193a6b9a60b3cb5854ca"}, + {file = "scipy-1.17.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e3dcd57ab780c741fde8dc68619de988b966db759a3c3152e8e9142c26295ad"}, + {file = "scipy-1.17.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a9956e4d4f4a301ebf6cde39850333a6b6110799d470dbbb1e25326ac447f52a"}, + {file = "scipy-1.17.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:a4328d245944d09fd639771de275701ccadf5f781ba0ff092ad141e017eccda4"}, + {file = "scipy-1.17.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a77cbd07b940d326d39a1d1b37817e2ee4d79cb30e7338f3d0cddffae70fcaa2"}, + {file = "scipy-1.17.1-cp314-cp314t-win_amd64.whl", hash = "sha256:eb092099205ef62cd1782b006658db09e2fed75bffcae7cc0d44052d8aa0f484"}, + {file = "scipy-1.17.1-cp314-cp314t-win_arm64.whl", hash = "sha256:200e1050faffacc162be6a486a984a0497866ec54149a01270adc8a59b7c7d21"}, + {file = "scipy-1.17.1.tar.gz", hash = "sha256:95d8e012d8cb8816c226aef832200b1d45109ed4464303e997c5b13122b297c0"}, +] + +[package.dependencies] +numpy = ">=1.26.4,<2.7" + +[package.extras] +dev = ["click (<8.3.0)", "cython-lint (>=0.12.2)", "mypy (==1.10.0)", "pycodestyle", "ruff (>=0.12.0)", "spin", "types-psutil", "typing_extensions"] +doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.19.1)", "jupytext", "linkify-it-py", "matplotlib (>=3.5)", "myst-nb (>=1.2.0)", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.2.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)", "tabulate"] +test = ["Cython", "array-api-strict (>=2.3.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest (>=8.0.0)", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + +[[package]] +name = "six" +version = "1.17.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] +files = [ + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, +] + +[[package]] +name = "soupsieve" +version = "2.8.3" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95"}, + {file = "soupsieve-2.8.3.tar.gz", hash = "sha256:3267f1eeea4251fb42728b6dfb746edc9acaffc4a45b27e19450b676586e8349"}, +] + +[[package]] +name = "textblob" +version = "0.17.1" +description = "Simple, Pythonic text processing. Sentiment analysis, part-of-speech tagging, noun phrase parsing, and more." +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "textblob-0.17.1-py2.py3-none-any.whl", hash = "sha256:15546d7f309e96a3f542bee42751c8e5ce4d519d3d274ee79df2318141f0b788"}, + {file = "textblob-0.17.1.tar.gz", hash = "sha256:8dc0875dfab1eaf0dc772a9dbc4afaa9ca93d0e35cd62cb792f3a38e067ab68f"}, +] + +[package.dependencies] +nltk = {version = ">=3.1", markers = "python_version >= \"3\""} + +[[package]] +name = "textsearch" +version = "0.0.24" +description = "Find strings/words in text; convenience and C speed" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "textsearch-0.0.24-py2.py3-none-any.whl", hash = "sha256:1bbc4cc36300fbf0bbaa865500f84e907c85f6a48faf37da6e098407b405ed09"}, + {file = "textsearch-0.0.24.tar.gz", hash = "sha256:2d23b5c3116715b65bccc18bc870ecc236ec8480d48cd5f257cc60bf66bb241a"}, +] + +[package.dependencies] +anyascii = "*" +pyahocorasick = "*" + +[[package]] +name = "threadpoolctl" +version = "3.6.0" +description = "threadpoolctl" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb"}, + {file = "threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e"}, +] + +[[package]] +name = "tqdm" +version = "4.67.3" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "tqdm-4.67.3-py3-none-any.whl", hash = "sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf"}, + {file = "tqdm-4.67.3.tar.gz", hash = "sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["nbval", "pytest (>=6)", "pytest-asyncio (>=0.24)", "pytest-cov", "pytest-timeout"] +discord = ["requests"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "traitlets" +version = "5.14.3" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, + {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] + +[[package]] +name = "typeguard" +version = "4.5.1" +description = "Run-time type checker for Python" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "typeguard-4.5.1-py3-none-any.whl", hash = "sha256:44d2bf329d49a244110a090b55f5f91aa82d9a9834ebfd30bcc73651e4a8cc40"}, + {file = "typeguard-4.5.1.tar.gz", hash = "sha256:f6f8ecbbc819c9bc749983cc67c02391e16a9b43b8b27f15dc70ed7c4a007274"}, +] + +[package.dependencies] +typing_extensions = ">=4.14.0" + +[[package]] +name = "typing-extensions" +version = "4.15.0" +description = "Backported and Experimental Type Hints for Python 3.9+" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, + {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, +] + +[[package]] +name = "tzdata" +version = "2025.3" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +groups = ["main"] +files = [ + {file = "tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1"}, + {file = "tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7"}, +] + +[[package]] +name = "urllib3" +version = "2.6.3" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4"}, + {file = "urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed"}, +] + +[package.extras] +brotli = ["brotli (>=1.2.0) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=1.2.0.0) ; platform_python_implementation != \"CPython\""] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""] + +[[package]] +name = "validators" +version = "0.22.0" +description = "Python Data Validation for Humans™" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "validators-0.22.0-py3-none-any.whl", hash = "sha256:61cf7d4a62bbae559f2e54aed3b000cea9ff3e2fdbe463f51179b92c58c9585a"}, + {file = "validators-0.22.0.tar.gz", hash = "sha256:77b2689b172eeeb600d9605ab86194641670cdb73b60afd577142a9397873370"}, +] + +[package.extras] +docs-offline = ["myst-parser (>=2.0.0)", "pypandoc-binary (>=1.11)", "sphinx (>=7.1.1)"] +docs-online = ["mkdocs (>=1.5.2)", "mkdocs-git-revision-date-localized-plugin (>=1.2.0)", "mkdocs-material (>=9.2.6)", "mkdocstrings[python] (>=0.22.0)", "pyaml (>=23.7.0)"] +hooks = ["pre-commit (>=3.3.3)"] +package = ["build (>=1.0.0)", "twine (>=4.0.2)"] +runner = ["tox (>=4.11.1)"] +sast = ["bandit[toml] (>=1.7.5)"] +testing = ["pytest (>=7.4.0)"] +tooling = ["black (>=23.7.0)", "pyright (>=1.1.325)", "ruff (>=0.0.287)"] +tooling-extras = ["pyaml (>=23.7.0)", "pypandoc-binary (>=1.11)", "pytest (>=7.4.0)"] + +[[package]] +name = "xgboost" +version = "2.1.4" +description = "XGBoost Python Package" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "xgboost-2.1.4-py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.macosx_12_0_x86_64.whl", hash = "sha256:78d88da184562deff25c820d943420342014dd55e0f4c017cc4563c2148df5ee"}, + {file = "xgboost-2.1.4-py3-none-macosx_12_0_arm64.whl", hash = "sha256:523db01d4e74b05c61a985028bde88a4dd380eadc97209310621996d7d5d14a7"}, + {file = "xgboost-2.1.4-py3-none-manylinux2014_aarch64.whl", hash = "sha256:57c7e98111aceef4b689d7d2ce738564a1f7fe44237136837a47847b8b33bade"}, + {file = "xgboost-2.1.4-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f1343a512e634822eab30d300bfc00bf777dc869d881cc74854b42173cfcdb14"}, + {file = "xgboost-2.1.4-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:d366097d0db047315736f46af852feaa907f6d7371716af741cdce488ae36d20"}, + {file = "xgboost-2.1.4-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:8df6da72963969ab2bf49a520c3e147b1e15cbeddd3aa0e3e039b3532c739339"}, + {file = "xgboost-2.1.4-py3-none-win_amd64.whl", hash = "sha256:8bbfe4fedc151b83a52edbf0de945fd94358b09a81998f2945ad330fd5f20cd6"}, + {file = "xgboost-2.1.4.tar.gz", hash = "sha256:ab84c4bbedd7fae1a26f61e9dd7897421d5b08454b51c6eb072abc1d346d08d7"}, +] + +[package.dependencies] +numpy = "*" +nvidia-nccl-cu12 = {version = "*", markers = "platform_system == \"Linux\" and platform_machine != \"aarch64\""} +scipy = "*" + +[package.extras] +dask = ["dask", "distributed", "pandas"] +datatable = ["datatable"] +pandas = ["pandas (>=1.2)"] +plotting = ["graphviz", "matplotlib"] +pyspark = ["cloudpickle", "pyspark", "scikit-learn"] +scikit-learn = ["scikit-learn"] + +[metadata] +lock-version = "2.1" +python-versions = ">=3.11,<3.13" +content-hash = "14823857edbe8ca35e0ee2273d41fd5d31ba0244e13b04d005760b86d9c4a7fc" From dfddea7c02099be1a97533d716773e84394b83fd Mon Sep 17 00:00:00 2001 From: Juanje Mendoza Date: Thu, 26 Feb 2026 16:04:40 +0100 Subject: [PATCH 17/27] Actualizo pyproject.toml --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index b5a29eda..f732d005 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,7 +18,7 @@ classifiers = [ homepage = "https://github.com/KnowledgeCaptureAndDiscovery/somef" [tool.poetry.dependencies] - python = ">=3.12,<3.13" + python = ">=3.11,<3.13" bs4 = "^0.0.1" click = "^8.1.7" click-option-group = "^0.5.6" From 05082da55ff00d364676f9e0d2d9936b9cb71c80 Mon Sep 17 00:00:00 2001 From: Juanje Mendoza Date: Thu, 26 Feb 2026 16:14:55 +0100 Subject: [PATCH 18/27] better flag. -ra and --reconcile_authors instead of -ai and --additional_info --- README.md | 2 +- src/somef/__main__.py | 4 ++-- src/somef/parser/codeowners_parser.py | 6 +++--- src/somef/process_files.py | 4 ++-- src/somef/process_repository.py | 6 +++--- src/somef/somef_cli.py | 22 +++++++++++----------- src/somef/test/test_process_repository.py | 2 +- 7 files changed, 23 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index f72b9a33..6592040f 100644 --- a/README.md +++ b/README.md @@ -331,7 +331,7 @@ Options: sources (pom.xml, requirements.txt, etc.) - -ai, --additional_info SOMEF will extract additional information + -ra, --reconcile_authors SOMEF will extract additional information from certain files like CODEOWNERS. This may require extra API requests and increase execution time diff --git a/src/somef/__main__.py b/src/somef/__main__.py index b318b5dd..46ebed8a 100644 --- a/src/somef/__main__.py +++ b/src/somef/__main__.py @@ -178,8 +178,8 @@ def configure(auto, base_uri): help="Export only requirements from structured sources (pom.xml, requirements.txt, etc.)" ) @click.option( - "--additional_info", - "-ai", + "--reconcile_authors", + "-ra", is_flag=True, default=False, help="""SOMEF will extract additional information from certain files like CODEOWNERS, etc.""" diff --git a/src/somef/parser/codeowners_parser.py b/src/somef/parser/codeowners_parser.py index 108478a4..aabd0439 100644 --- a/src/somef/parser/codeowners_parser.py +++ b/src/somef/parser/codeowners_parser.py @@ -21,9 +21,9 @@ def parse_codeowners_structured(dir_path, filename): return {"codeowners": codeowners} -def parse_codeowners_file(file_path, metadata_result: Result, source, additional_info=None) -> Result: +def parse_codeowners_file(file_path, metadata_result: Result, source, reconcile_authors=None) -> Result: try: - print(f"Additional info flag: {additional_info}") + print(f"Additional info flag: {reconcile_authors}") if Path(file_path).name.upper() == constants.CODEOWNERS_FILE: owners = parse_codeowners_structured( os.path.dirname(file_path), @@ -58,7 +58,7 @@ def parse_codeowners_file(file_path, metadata_result: Result, source, additional "type": "Person" } - if additional_info: + if reconcile_authors: user_info = enrich_github_user(owner) if user_info: if user_info.get("name"): diff --git a/src/somef/process_files.py b/src/somef/process_files.py index 98b9503a..8bbd4cf9 100644 --- a/src/somef/process_files.py +++ b/src/somef/process_files.py @@ -31,7 +31,7 @@ domain_gitlab = '' def process_repository_files(repo_dir, metadata_result: Result, repo_type, owner="", repo_name="", - repo_default_branch="", ignore_test_folder=True, additional_info=False): + repo_default_branch="", ignore_test_folder=True, reconcile_authors=False): """ Method that given a folder, it recognizes whether there are notebooks, dockerfiles, docs, script files or ontologies. @@ -249,7 +249,7 @@ def process_repository_files(repo_dir, metadata_result: Result, repo_type, owner repo_dir, repo_relative_path, filename) - metadata_result = parse_codeowners_file(os.path.join(dir_path, filename), metadata_result, codeowner_file_url, additional_info) + metadata_result = parse_codeowners_file(os.path.join(dir_path, filename), metadata_result, codeowner_file_url, reconcile_authors) parsed_build_files.add(filename.lower()) if filename.lower() == "codemeta.json": diff --git a/src/somef/process_repository.py b/src/somef/process_repository.py index 8024f6fe..7cb5b20f 100644 --- a/src/somef/process_repository.py +++ b/src/somef/process_repository.py @@ -485,7 +485,7 @@ def download_readme(owner, repo_name, default_branch, repo_type, authorization): def load_online_repository_metadata(repository_metadata: Result, repository_url, ignore_api_metadata=False, - repo_type=constants.RepositoryType.GITHUB, authorization=None, additional_info=False): + repo_type=constants.RepositoryType.GITHUB, authorization=None, reconcile_authors=False): """ Function uses the repository_url provided to load required information from GitHub or Gitlab. Information kept from the repository is written in keep_keys. @@ -496,7 +496,7 @@ def load_online_repository_metadata(repository_metadata: Result, repository_url, @param ignore_api_metadata: true if you do not want to do an additional request to the target API @param repository_url: target repository URL. @param authorization: GitHub authorization token - @param additional_info: flag to indicate if additional should be extracted from certain files as codeowners. More request. + @param reconcile_authors: flag to indicate if additional should be extracted from certain files as codeowners. More request. Returns ------- @@ -585,7 +585,7 @@ def load_online_repository_metadata(repository_metadata: Result, repository_url, if category == constants.CAT_ISSUE_TRACKER: value = value.replace("{/number}", "") if category == constants.CAT_OWNER: - if additional_info: + if reconcile_authors: print("Enriching owner information from codeowners...") user_info = enrich_github_user(owner) if user_info: diff --git a/src/somef/somef_cli.py b/src/somef/somef_cli.py index 466877c8..cb6eac7d 100644 --- a/src/somef/somef_cli.py +++ b/src/somef/somef_cli.py @@ -21,7 +21,7 @@ def cli_get_data(threshold, ignore_classifiers, repo_url=None, doc_src=None, local_repo=None, ignore_github_metadata=False, readme_only=False, keep_tmp=None, authorization=None, - ignore_test_folder=True,requirements_mode='all', additional_info=False) -> Result: + ignore_test_folder=True,requirements_mode='all', reconcile_authors=False) -> Result: """ Main function to get the data through the command line Parameters @@ -37,7 +37,7 @@ def cli_get_data(threshold, ignore_classifiers, repo_url=None, doc_src=None, loc @param authorization: GitHub authorization token @param ignore_test_folder: Ignore contents of test folders @param requiriments_mode: flag to indicate what requirements show in codemeta - @param additional_info: flag to indicate if additional should be extracted from certain files as codeowners. More request. + @param reconcile_authors: flag to indicate if additional should be extracted from certain files as codeowners. More request. Returns ------- @return: Dictionary with the results found by SOMEF, formatted as a Result object. @@ -83,7 +83,7 @@ def cli_get_data(threshold, ignore_classifiers, repo_url=None, doc_src=None, loc ignore_github_metadata, repo_type, authorization, - additional_info + reconcile_authors ) # download files and obtain path to download folder @@ -103,7 +103,7 @@ def cli_get_data(threshold, ignore_classifiers, repo_url=None, doc_src=None, loc repo_name, def_branch, ignore_test_folder, - additional_info) + reconcile_authors) repository_metadata = check_repository_type(local_folder, repo_name, full_repository_metadata) else: logging.error("Error processing the target repository") @@ -121,7 +121,7 @@ def cli_get_data(threshold, ignore_classifiers, repo_url=None, doc_src=None, loc repo_name, def_branch, ignore_test_folder, - additional_info) + reconcile_authors) repository_metadata = check_repository_type(local_folder, repo_name, full_repository_metadata) else: @@ -139,7 +139,7 @@ def cli_get_data(threshold, ignore_classifiers, repo_url=None, doc_src=None, loc repository_metadata, repo_type, ignore_test_folder = ignore_test_folder, - additional_info = additional_info) + reconcile_authors = reconcile_authors) if readme_text == "": logging.warning("Warning: README document does not exist in the local repository") except process_repository.GithubUrlError: @@ -246,7 +246,7 @@ def run_cli(*, keep_tmp=None, ignore_test_folder=True, requirements_mode="all", - additional_info=False + reconcile_authors=False ): """Function to run all the required components of the cli for a repository""" # check if it is a valid url @@ -280,7 +280,7 @@ def run_cli(*, encoded_url = encoded_url.replace(".","") #removing dots just in case repo_data = cli_get_data(threshold=threshold, ignore_classifiers=ignore_classifiers, repo_url=repo_url, ignore_github_metadata=ignore_github_metadata, readme_only=readme_only, - keep_tmp=keep_tmp, ignore_test_folder=ignore_test_folder, requirements_mode=requirements_mode, additional_info=additional_info) + keep_tmp=keep_tmp, ignore_test_folder=ignore_test_folder, requirements_mode=requirements_mode, reconcile_authors=reconcile_authors) if hasattr(repo_data, "get_json"): repo_data = repo_data.get_json() @@ -313,13 +313,13 @@ def run_cli(*, if repo_url: repo_data = cli_get_data(threshold=threshold, ignore_classifiers=ignore_classifiers, repo_url=repo_url, ignore_github_metadata=ignore_github_metadata, readme_only=readme_only, - keep_tmp=keep_tmp, ignore_test_folder=ignore_test_folder, additional_info=additional_info) + keep_tmp=keep_tmp, ignore_test_folder=ignore_test_folder, reconcile_authors=reconcile_authors) elif local_repo: repo_data = cli_get_data(threshold=threshold, ignore_classifiers=ignore_classifiers, - local_repo=local_repo, keep_tmp=keep_tmp, ignore_test_folder=ignore_test_folder, additional_info=additional_info) + local_repo=local_repo, keep_tmp=keep_tmp, ignore_test_folder=ignore_test_folder, reconcile_authors=reconcile_authors) else: repo_data = cli_get_data(threshold=threshold, ignore_classifiers=ignore_classifiers, - doc_src=doc_src, keep_tmp=keep_tmp, ignore_test_folder=ignore_test_folder, additional_info=additional_info) + doc_src=doc_src, keep_tmp=keep_tmp, ignore_test_folder=ignore_test_folder, reconcile_authors=reconcile_authors) if hasattr(repo_data, "get_json"): repo_data = repo_data.get_json() diff --git a/src/somef/test/test_process_repository.py b/src/somef/test/test_process_repository.py index 948df9e3..ec6258b3 100644 --- a/src/somef/test/test_process_repository.py +++ b/src/somef/test/test_process_repository.py @@ -219,7 +219,7 @@ def test_issue_894(self): repo_path = test_data_repositories + "somef_repo" - readme_text, full_metadata = process_files.process_repository_files( repo_path, metadata, constants.RepositoryType.LOCAL, ignore_test_folder=True, additional_info=False) + readme_text, full_metadata = process_files.process_repository_files( repo_path, metadata, constants.RepositoryType.LOCAL, ignore_test_folder=True, reconcile_authors=False) authors = full_metadata.results.get(constants.CAT_AUTHORS, []) From 05cc81715994eb021060c6d571233d09afc21b76 Mon Sep 17 00:00:00 2001 From: Juanje Mendoza Date: Mon, 2 Mar 2026 09:01:37 +0100 Subject: [PATCH 19/27] rolf test. Action test before PR in python 3.11 and 3.12 --- .github/workflows/action-test-before-PR.yml | 7 +- poetry.lock | 266 ++++++++++-------- pyproject.toml | 2 +- src/somef/parser/python_parser.py | 7 +- src/somef/parser/toml_parser.py | 7 +- src/somef/rolf/models/audio.sav | Bin 797008 -> 0 bytes .../models/audio_SVC_TFIDF_RandomUnder.sav | Bin 0 -> 1736560 bytes src/somef/rolf/models/computer_vision.sav | Bin 10926585 -> 0 bytes .../computer_vision_SVC_TFIDF_RandomUnder.sav | Bin 0 -> 1741740 bytes src/somef/rolf/models/graphs.sav | Bin 135526 -> 0 bytes .../models/graphs_SVC_TFIDF_RandomUnder.sav | Bin 0 -> 1746120 bytes .../models/natural_language_processing.sav | Bin 3367001 -> 0 bytes ...guage_processing_SVC_TFIDF_RandomUnder.sav | Bin 0 -> 1738825 bytes .../rolf/models/reinforcement_learning.sav | Bin 1374883 -> 0 bytes ...rcement_learning_SVC_TFIDF_RandomUnder.sav | Bin 0 -> 1726997 bytes src/somef/rolf/models/semantic_web.sav | Bin 242812 -> 0 bytes .../sequential_SVC_TFIDF_RandomUnder.sav | Bin 0 -> 1713009 bytes src/somef/rolf/models_test/astrophysics.sav | Bin 3831761 -> 0 bytes src/somef/rolf/models_test/rationale.md | 5 - src/somef/rolf/models_test/sequential.sav | Bin 1730721 -> 0 bytes 20 files changed, 159 insertions(+), 135 deletions(-) delete mode 100644 src/somef/rolf/models/audio.sav create mode 100644 src/somef/rolf/models/audio_SVC_TFIDF_RandomUnder.sav delete mode 100644 src/somef/rolf/models/computer_vision.sav create mode 100644 src/somef/rolf/models/computer_vision_SVC_TFIDF_RandomUnder.sav delete mode 100644 src/somef/rolf/models/graphs.sav create mode 100644 src/somef/rolf/models/graphs_SVC_TFIDF_RandomUnder.sav delete mode 100644 src/somef/rolf/models/natural_language_processing.sav create mode 100644 src/somef/rolf/models/natural_language_processing_SVC_TFIDF_RandomUnder.sav delete mode 100644 src/somef/rolf/models/reinforcement_learning.sav create mode 100644 src/somef/rolf/models/reinforcement_learning_SVC_TFIDF_RandomUnder.sav delete mode 100644 src/somef/rolf/models/semantic_web.sav create mode 100644 src/somef/rolf/models/sequential_SVC_TFIDF_RandomUnder.sav delete mode 100644 src/somef/rolf/models_test/astrophysics.sav delete mode 100644 src/somef/rolf/models_test/rationale.md delete mode 100644 src/somef/rolf/models_test/sequential.sav diff --git a/.github/workflows/action-test-before-PR.yml b/.github/workflows/action-test-before-PR.yml index 0b768ea3..64187eb4 100644 --- a/.github/workflows/action-test-before-PR.yml +++ b/.github/workflows/action-test-before-PR.yml @@ -8,6 +8,9 @@ on: jobs: test: runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.11", "3.12"] steps: - name: Checkout code @@ -15,8 +18,8 @@ jobs: - name: Set up Python uses: actions/setup-python@v2 - with: - python-version: "3.11" + with: + python-version: ${{ matrix.python-version }} - name: Install Poetry run: curl -sSL https://install.python-poetry.org | python3 - diff --git a/poetry.lock b/poetry.lock index dcb57da7..0bf8c793 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1601,6 +1601,21 @@ files = [ [package.extras] testing = ["pytest", "setuptools", "twine", "wheel"] +[[package]] +name = "pygments" +version = "2.19.2" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, + {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + [[package]] name = "pyoxigraph" version = "0.3.22" @@ -1665,24 +1680,25 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "7.4.4" +version = "8.4.2" description = "pytest: simple powerful testing with Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, - {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, + {file = "pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79"}, + {file = "pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01"}, ] [package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<2.0" +colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""} +iniconfig = ">=1" +packaging = ">=20" +pluggy = ">=1.5,<2" +pygments = ">=2.7.2" [package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"] [[package]] name = "python-dateutil" @@ -1835,126 +1851,126 @@ typing-extensions = {version = ">=4.4.0", markers = "python_version < \"3.13\""} [[package]] name = "regex" -version = "2026.2.19" +version = "2026.2.28" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.10" groups = ["main"] files = [ - {file = "regex-2026.2.19-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f5a37a17d110f9d5357a43aa7e3507cb077bf3143d1c549a45c4649e90e40a70"}, - {file = "regex-2026.2.19-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:676c4e6847a83a1d5732b4ed553881ad36f0a8133627bb695a89ecf3571499d3"}, - {file = "regex-2026.2.19-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82336faeecac33297cd42857c3b36f12b91810e3fdd276befdd128f73a2b43fa"}, - {file = "regex-2026.2.19-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:52136f5b71f095cb74b736cc3a1b578030dada2e361ef2f07ca582240b703946"}, - {file = "regex-2026.2.19-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4192464fe3e6cb0ef6751f7d3b16f886d8270d359ed1590dd555539d364f0ff7"}, - {file = "regex-2026.2.19-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e561dd47a85d2660d3d3af4e6cb2da825cf20f121e577147963f875b83d32786"}, - {file = "regex-2026.2.19-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00ec994d7824bf01cd6c7d14c7a6a04d9aeaf7c42a2bc22d2359d715634d539b"}, - {file = "regex-2026.2.19-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2cb00aabd96b345d56a8c2bc328c8d6c4d29935061e05078bf1f02302e12abf5"}, - {file = "regex-2026.2.19-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f374366ed35673ea81b86a8859c457d4fae6ba092b71024857e9e237410c7404"}, - {file = "regex-2026.2.19-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f9417fd853fcd00b7d55167e692966dd12d95ba1a88bf08a62002ccd85030790"}, - {file = "regex-2026.2.19-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:12e86a01594031abf892686fcb309b041bf3de3d13d99eb7e2b02a8f3c687df1"}, - {file = "regex-2026.2.19-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:79014115e6fdf18fd9b32e291d58181bf42d4298642beaa13fd73e69810e4cb6"}, - {file = "regex-2026.2.19-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:31aefac2506967b7dd69af2c58eca3cc8b086d4110b66d6ac6e9026f0ee5b697"}, - {file = "regex-2026.2.19-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:49cef7bb2a491f91a8869c7cdd90babf0a417047ab0bf923cd038ed2eab2ccb8"}, - {file = "regex-2026.2.19-cp310-cp310-win32.whl", hash = "sha256:3a039474986e7a314ace6efb9ce52f5da2bdb80ac4955358723d350ec85c32ad"}, - {file = "regex-2026.2.19-cp310-cp310-win_amd64.whl", hash = "sha256:5b81ff4f9cad99f90c807a00c5882fbcda86d8b3edd94e709fb531fc52cb3d25"}, - {file = "regex-2026.2.19-cp310-cp310-win_arm64.whl", hash = "sha256:a032bc01a4bc73fc3cadba793fce28eb420da39338f47910c59ffcc11a5ba5ef"}, - {file = "regex-2026.2.19-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:93b16a18cadb938f0f2306267161d57eb33081a861cee9ffcd71e60941eb5dfc"}, - {file = "regex-2026.2.19-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:78af1e499cab704131f6f4e2f155b7f54ce396ca2acb6ef21a49507e4752e0be"}, - {file = "regex-2026.2.19-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:eb20c11aa4c3793c9ad04c19a972078cdadb261b8429380364be28e867a843f2"}, - {file = "regex-2026.2.19-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:db5fd91eec71e7b08de10011a2223d0faa20448d4e1380b9daa179fa7bf58906"}, - {file = "regex-2026.2.19-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fdbade8acba71bb45057c2b72f477f0b527c4895f9c83e6cfc30d4a006c21726"}, - {file = "regex-2026.2.19-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:31a5f561eb111d6aae14202e7043fb0b406d3c8dddbbb9e60851725c9b38ab1d"}, - {file = "regex-2026.2.19-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4584a3ee5f257b71e4b693cc9be3a5104249399f4116fe518c3f79b0c6fc7083"}, - {file = "regex-2026.2.19-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:196553ba2a2f47904e5dc272d948a746352e2644005627467e055be19d73b39e"}, - {file = "regex-2026.2.19-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0c10869d18abb759a3317c757746cc913d6324ce128b8bcec99350df10419f18"}, - {file = "regex-2026.2.19-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e689fed279cbe797a6b570bd18ff535b284d057202692c73420cb93cca41aa32"}, - {file = "regex-2026.2.19-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0782bd983f19ac7594039c9277cd6f75c89598c1d72f417e4d30d874105eb0c7"}, - {file = "regex-2026.2.19-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:dbb240c81cfed5d4a67cb86d7676d9f7ec9c3f186310bec37d8a1415210e111e"}, - {file = "regex-2026.2.19-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:80d31c3f1fe7e4c6cd1831cd4478a0609903044dfcdc4660abfe6fb307add7f0"}, - {file = "regex-2026.2.19-cp311-cp311-win32.whl", hash = "sha256:66e6a43225ff1064f8926adbafe0922b370d381c3330edaf9891cade52daa790"}, - {file = "regex-2026.2.19-cp311-cp311-win_amd64.whl", hash = "sha256:59a7a5216485a1896c5800e9feb8ff9213e11967b482633b6195d7da11450013"}, - {file = "regex-2026.2.19-cp311-cp311-win_arm64.whl", hash = "sha256:ec661807ffc14c8d14bb0b8c1bb3d5906e476bc96f98b565b709d03962ee4dd4"}, - {file = "regex-2026.2.19-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c1665138776e4ac1aa75146669236f7a8a696433ec4e525abf092ca9189247cc"}, - {file = "regex-2026.2.19-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d792b84709021945597e05656aac059526df4e0c9ef60a0eaebb306f8fafcaa8"}, - {file = "regex-2026.2.19-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:db970bcce4d63b37b3f9eb8c893f0db980bbf1d404a1d8d2b17aa8189de92c53"}, - {file = "regex-2026.2.19-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:03d706fbe7dfec503c8c3cb76f9352b3e3b53b623672aa49f18a251a6c71b8e6"}, - {file = "regex-2026.2.19-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8dbff048c042beef60aa1848961384572c5afb9e8b290b0f1203a5c42cf5af65"}, - {file = "regex-2026.2.19-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ccaaf9b907ea6b4223d5cbf5fa5dff5f33dc66f4907a25b967b8a81339a6e332"}, - {file = "regex-2026.2.19-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:75472631eee7898e16a8a20998d15106cb31cfde21cdf96ab40b432a7082af06"}, - {file = "regex-2026.2.19-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d89f85a5ccc0cec125c24be75610d433d65295827ebaf0d884cbe56df82d4774"}, - {file = "regex-2026.2.19-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0d9f81806abdca3234c3dd582b8a97492e93de3602c8772013cb4affa12d1668"}, - {file = "regex-2026.2.19-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:9dadc10d1c2bbb1326e572a226d2ec56474ab8aab26fdb8cf19419b372c349a9"}, - {file = "regex-2026.2.19-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:6bc25d7e15f80c9dc7853cbb490b91c1ec7310808b09d56bd278fe03d776f4f6"}, - {file = "regex-2026.2.19-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:965d59792f5037d9138da6fed50ba943162160443b43d4895b182551805aff9c"}, - {file = "regex-2026.2.19-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:38d88c6ed4a09ed61403dbdf515d969ccba34669af3961ceb7311ecd0cef504a"}, - {file = "regex-2026.2.19-cp312-cp312-win32.whl", hash = "sha256:5df947cabab4b643d4791af5e28aecf6bf62e6160e525651a12eba3d03755e6b"}, - {file = "regex-2026.2.19-cp312-cp312-win_amd64.whl", hash = "sha256:4146dc576ea99634ae9c15587d0c43273b4023a10702998edf0fa68ccb60237a"}, - {file = "regex-2026.2.19-cp312-cp312-win_arm64.whl", hash = "sha256:cdc0a80f679353bd68450d2a42996090c30b2e15ca90ded6156c31f1a3b63f3b"}, - {file = "regex-2026.2.19-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8df08decd339e8b3f6a2eb5c05c687fe9d963ae91f352bc57beb05f5b2ac6879"}, - {file = "regex-2026.2.19-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3aa0944f1dc6e92f91f3b306ba7f851e1009398c84bfd370633182ee4fc26a64"}, - {file = "regex-2026.2.19-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c13228fbecb03eadbfd8f521732c5fda09ef761af02e920a3148e18ad0e09968"}, - {file = "regex-2026.2.19-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0d0e72703c60d68b18b27cde7cdb65ed2570ae29fb37231aa3076bfb6b1d1c13"}, - {file = "regex-2026.2.19-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:46e69a4bf552e30e74a8aa73f473c87efcb7f6e8c8ece60d9fd7bf13d5c86f02"}, - {file = "regex-2026.2.19-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8edda06079bd770f7f0cf7f3bba1a0b447b96b4a543c91fe0c142d034c166161"}, - {file = "regex-2026.2.19-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9cbc69eae834afbf634f7c902fc72ff3e993f1c699156dd1af1adab5d06b7fe7"}, - {file = "regex-2026.2.19-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bcf57d30659996ee5c7937999874504c11b5a068edc9515e6a59221cc2744dd1"}, - {file = "regex-2026.2.19-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8e6e77cd92216eb489e21e5652a11b186afe9bdefca8a2db739fd6b205a9e0a4"}, - {file = "regex-2026.2.19-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b9ab8dec42afefa6314ea9b31b188259ffdd93f433d77cad454cd0b8d235ce1c"}, - {file = "regex-2026.2.19-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:294c0fb2e87c6bcc5f577c8f609210f5700b993151913352ed6c6af42f30f95f"}, - {file = "regex-2026.2.19-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:c0924c64b082d4512b923ac016d6e1dcf647a3560b8a4c7e55cbbd13656cb4ed"}, - {file = "regex-2026.2.19-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:790dbf87b0361606cb0d79b393c3e8f4436a14ee56568a7463014565d97da02a"}, - {file = "regex-2026.2.19-cp313-cp313-win32.whl", hash = "sha256:43cdde87006271be6963896ed816733b10967baaf0e271d529c82e93da66675b"}, - {file = "regex-2026.2.19-cp313-cp313-win_amd64.whl", hash = "sha256:127ea69273485348a126ebbf3d6052604d3c7da284f797bba781f364c0947d47"}, - {file = "regex-2026.2.19-cp313-cp313-win_arm64.whl", hash = "sha256:5e56c669535ac59cbf96ca1ece0ef26cb66809990cda4fa45e1e32c3b146599e"}, - {file = "regex-2026.2.19-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:93d881cab5afdc41a005dba1524a40947d6f7a525057aa64aaf16065cf62faa9"}, - {file = "regex-2026.2.19-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:80caaa1ddcc942ec7be18427354f9d58a79cee82dea2a6b3d4fd83302e1240d7"}, - {file = "regex-2026.2.19-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d793c5b4d2b4c668524cd1651404cfc798d40694c759aec997e196fe9729ec60"}, - {file = "regex-2026.2.19-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5100acb20648d9efd3f4e7e91f51187f95f22a741dcd719548a6cf4e1b34b3f"}, - {file = "regex-2026.2.19-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5e3a31e94d10e52a896adaa3adf3621bd526ad2b45b8c2d23d1bbe74c7423007"}, - {file = "regex-2026.2.19-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8497421099b981f67c99eba4154cf0dfd8e47159431427a11cfb6487f7791d9e"}, - {file = "regex-2026.2.19-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1e7a08622f7d51d7a068f7e4052a38739c412a3e74f55817073d2e2418149619"}, - {file = "regex-2026.2.19-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8abe671cf0f15c26b1ad389bf4043b068ce7d3b1c5d9313e12895f57d6738555"}, - {file = "regex-2026.2.19-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5a8f28dd32a4ce9c41758d43b5b9115c1c497b4b1f50c457602c1d571fa98ce1"}, - {file = "regex-2026.2.19-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:654dc41a5ba9b8cc8432b3f1aa8906d8b45f3e9502442a07c2f27f6c63f85db5"}, - {file = "regex-2026.2.19-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:4a02faea614e7fdd6ba8b3bec6c8e79529d356b100381cec76e638f45d12ca04"}, - {file = "regex-2026.2.19-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:d96162140bb819814428800934c7b71b7bffe81fb6da2d6abc1dcca31741eca3"}, - {file = "regex-2026.2.19-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c227f2922153ee42bbeb355fd6d009f8c81d9d7bdd666e2276ce41f53ed9a743"}, - {file = "regex-2026.2.19-cp313-cp313t-win32.whl", hash = "sha256:a178df8ec03011153fbcd2c70cb961bc98cbbd9694b28f706c318bee8927c3db"}, - {file = "regex-2026.2.19-cp313-cp313t-win_amd64.whl", hash = "sha256:2c1693ca6f444d554aa246b592355b5cec030ace5a2729eae1b04ab6e853e768"}, - {file = "regex-2026.2.19-cp313-cp313t-win_arm64.whl", hash = "sha256:c0761d7ae8d65773e01515ebb0b304df1bf37a0a79546caad9cbe79a42c12af7"}, - {file = "regex-2026.2.19-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:03d191a9bcf94d31af56d2575210cb0d0c6a054dbcad2ea9e00aa4c42903b919"}, - {file = "regex-2026.2.19-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:516ee067c6c721d0d0bfb80a2004edbd060fffd07e456d4e1669e38fe82f922e"}, - {file = "regex-2026.2.19-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:997862c619994c4a356cb7c3592502cbd50c2ab98da5f61c5c871f10f22de7e5"}, - {file = "regex-2026.2.19-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:02b9e1b8a7ebe2807cd7bbdf662510c8e43053a23262b9f46ad4fc2dfc9d204e"}, - {file = "regex-2026.2.19-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6c8fb3b19652e425ff24169dad3ee07f99afa7996caa9dfbb3a9106cd726f49a"}, - {file = "regex-2026.2.19-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50f1ee9488dd7a9fda850ec7c68cad7a32fa49fd19733f5403a3f92b451dcf73"}, - {file = "regex-2026.2.19-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ab780092b1424d13200aa5a62996e95f65ee3db8509be366437439cdc0af1a9f"}, - {file = "regex-2026.2.19-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:17648e1a88e72d88641b12635e70e6c71c5136ba14edba29bf8fc6834005a265"}, - {file = "regex-2026.2.19-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2f914ae8c804c8a8a562fe216100bc156bfb51338c1f8d55fe32cf407774359a"}, - {file = "regex-2026.2.19-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c7e121a918bbee3f12ac300ce0a0d2f2c979cf208fb071ed8df5a6323281915c"}, - {file = "regex-2026.2.19-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2fedd459c791da24914ecc474feecd94cf7845efb262ac3134fe27cbd7eda799"}, - {file = "regex-2026.2.19-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:ea8dfc99689240e61fb21b5fc2828f68b90abf7777d057b62d3166b7c1543c4c"}, - {file = "regex-2026.2.19-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9fff45852160960f29e184ec8a5be5ab4063cfd0b168d439d1fc4ac3744bf29e"}, - {file = "regex-2026.2.19-cp314-cp314-win32.whl", hash = "sha256:5390b130cce14a7d1db226a3896273b7b35be10af35e69f1cca843b6e5d2bb2d"}, - {file = "regex-2026.2.19-cp314-cp314-win_amd64.whl", hash = "sha256:e581f75d5c0b15669139ca1c2d3e23a65bb90e3c06ba9d9ea194c377c726a904"}, - {file = "regex-2026.2.19-cp314-cp314-win_arm64.whl", hash = "sha256:7187fdee1be0896c1499a991e9bf7c78e4b56b7863e7405d7bb687888ac10c4b"}, - {file = "regex-2026.2.19-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:5ec1d7c080832fdd4e150c6f5621fe674c70c63b3ae5a4454cebd7796263b175"}, - {file = "regex-2026.2.19-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8457c1bc10ee9b29cdfd897ccda41dce6bde0e9abd514bcfef7bcd05e254d411"}, - {file = "regex-2026.2.19-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:cce8027010d1ffa3eb89a0b19621cdc78ae548ea2b49fea1f7bfb3ea77064c2b"}, - {file = "regex-2026.2.19-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11c138febb40546ff9e026dbbc41dc9fb8b29e61013fa5848ccfe045f5b23b83"}, - {file = "regex-2026.2.19-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:74ff212aa61532246bb3036b3dfea62233414b0154b8bc3676975da78383cac3"}, - {file = "regex-2026.2.19-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d00c95a2b6bfeb3ea1cb68d1751b1dfce2b05adc2a72c488d77a780db06ab867"}, - {file = "regex-2026.2.19-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:311fcccb76af31be4c588d5a17f8f1a059ae8f4b097192896ebffc95612f223a"}, - {file = "regex-2026.2.19-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:77cfd6b5e7c4e8bf7a39d243ea05882acf5e3c7002b0ef4756de6606893b0ecd"}, - {file = "regex-2026.2.19-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6380f29ff212ec922b6efb56100c089251940e0526a0d05aa7c2d9b571ddf2fe"}, - {file = "regex-2026.2.19-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:655f553a1fa3ab8a7fd570eca793408b8d26a80bfd89ed24d116baaf13a38969"}, - {file = "regex-2026.2.19-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:015088b8558502f1f0bccd58754835aa154a7a5b0bd9d4c9b7b96ff4ae9ba876"}, - {file = "regex-2026.2.19-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9e6693b8567a59459b5dda19104c4a4dbbd4a1c78833eacc758796f2cfef1854"}, - {file = "regex-2026.2.19-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4071209fd4376ab5ceec72ad3507e9d3517c59e38a889079b98916477a871868"}, - {file = "regex-2026.2.19-cp314-cp314t-win32.whl", hash = "sha256:2905ff4a97fad42f2d0834d8b1ea3c2f856ec209837e458d71a061a7d05f9f01"}, - {file = "regex-2026.2.19-cp314-cp314t-win_amd64.whl", hash = "sha256:64128549b600987e0f335c2365879895f860a9161f283b14207c800a6ed623d3"}, - {file = "regex-2026.2.19-cp314-cp314t-win_arm64.whl", hash = "sha256:a09ae430e94c049dc6957f6baa35ee3418a3a77f3c12b6e02883bd80a2b679b0"}, - {file = "regex-2026.2.19.tar.gz", hash = "sha256:6fb8cb09b10e38f3ae17cc6dc04a1df77762bd0351b6ba9041438e7cc85ec310"}, + {file = "regex-2026.2.28-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fc48c500838be6882b32748f60a15229d2dea96e59ef341eaa96ec83538f498d"}, + {file = "regex-2026.2.28-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2afa673660928d0b63d84353c6c08a8a476ddfc4a47e11742949d182e6863ce8"}, + {file = "regex-2026.2.28-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7ab218076eb0944549e7fe74cf0e2b83a82edb27e81cc87411f76240865e04d5"}, + {file = "regex-2026.2.28-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94d63db12e45a9b9f064bfe4800cefefc7e5f182052e4c1b774d46a40ab1d9bb"}, + {file = "regex-2026.2.28-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:195237dc327858a7721bf8b0bbbef797554bc13563c3591e91cd0767bacbe359"}, + {file = "regex-2026.2.28-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b387a0d092dac157fb026d737dde35ff3e49ef27f285343e7c6401851239df27"}, + {file = "regex-2026.2.28-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3935174fa4d9f70525a4367aaff3cb8bc0548129d114260c29d9dfa4a5b41692"}, + {file = "regex-2026.2.28-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2b2b23587b26496ff5fd40df4278becdf386813ec00dc3533fa43a4cf0e2ad3c"}, + {file = "regex-2026.2.28-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3b24bd7e9d85dc7c6a8bd2aa14ecd234274a0248335a02adeb25448aecdd420d"}, + {file = "regex-2026.2.28-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bd477d5f79920338107f04aa645f094032d9e3030cc55be581df3d1ef61aa318"}, + {file = "regex-2026.2.28-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:b49eb78048c6354f49e91e4b77da21257fecb92256b6d599ae44403cab30b05b"}, + {file = "regex-2026.2.28-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:a25c7701e4f7a70021db9aaf4a4a0a67033c6318752146e03d1b94d32006217e"}, + {file = "regex-2026.2.28-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:9dd450db6458387167e033cfa80887a34c99c81d26da1bf8b0b41bf8c9cac88e"}, + {file = "regex-2026.2.28-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2954379dd20752e82d22accf3ff465311cbb2bac6c1f92c4afd400e1757f7451"}, + {file = "regex-2026.2.28-cp310-cp310-win32.whl", hash = "sha256:1f8b17be5c27a684ea6759983c13506bd77bfc7c0347dff41b18ce5ddd2ee09a"}, + {file = "regex-2026.2.28-cp310-cp310-win_amd64.whl", hash = "sha256:dd8847c4978bc3c7e6c826fb745f5570e518b8459ac2892151ce6627c7bc00d5"}, + {file = "regex-2026.2.28-cp310-cp310-win_arm64.whl", hash = "sha256:73cdcdbba8028167ea81490c7f45280113e41db2c7afb65a276f4711fa3bcbff"}, + {file = "regex-2026.2.28-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e621fb7c8dc147419b28e1702f58a0177ff8308a76fa295c71f3e7827849f5d9"}, + {file = "regex-2026.2.28-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0d5bef2031cbf38757a0b0bc4298bb4824b6332d28edc16b39247228fbdbad97"}, + {file = "regex-2026.2.28-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bcb399ed84eabf4282587ba151f2732ad8168e66f1d3f85b1d038868fe547703"}, + {file = "regex-2026.2.28-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7c1b34dfa72f826f535b20712afa9bb3ba580020e834f3c69866c5bddbf10098"}, + {file = "regex-2026.2.28-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:851fa70df44325e1e4cdb79c5e676e91a78147b1b543db2aec8734d2add30ec2"}, + {file = "regex-2026.2.28-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:516604edd17b1c2c3e579cf4e9b25a53bf8fa6e7cedddf1127804d3e0140ca64"}, + {file = "regex-2026.2.28-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e7ce83654d1ab701cb619285a18a8e5a889c1216d746ddc710c914ca5fd71022"}, + {file = "regex-2026.2.28-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f2791948f7c70bb9335a9102df45e93d428f4b8128020d85920223925d73b9e1"}, + {file = "regex-2026.2.28-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:03a83cc26aa2acda6b8b9dfe748cf9e84cbd390c424a1de34fdcef58961a297a"}, + {file = "regex-2026.2.28-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ec6f5674c5dc836994f50f1186dd1fafde4be0666aae201ae2fcc3d29d8adf27"}, + {file = "regex-2026.2.28-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:50c2fc924749543e0eacc93ada6aeeb3ea5f6715825624baa0dccaec771668ae"}, + {file = "regex-2026.2.28-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:ba55c50f408fb5c346a3a02d2ce0ebc839784e24f7c9684fde328ff063c3cdea"}, + {file = "regex-2026.2.28-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:edb1b1b3a5576c56f08ac46f108c40333f222ebfd5cf63afdfa3aab0791ebe5b"}, + {file = "regex-2026.2.28-cp311-cp311-win32.whl", hash = "sha256:948c12ef30ecedb128903c2c2678b339746eb7c689c5c21957c4a23950c96d15"}, + {file = "regex-2026.2.28-cp311-cp311-win_amd64.whl", hash = "sha256:fd63453f10d29097cc3dc62d070746523973fb5aa1c66d25f8558bebd47fed61"}, + {file = "regex-2026.2.28-cp311-cp311-win_arm64.whl", hash = "sha256:00f2b8d9615aa165fdff0a13f1a92049bfad555ee91e20d246a51aa0b556c60a"}, + {file = "regex-2026.2.28-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fcf26c3c6d0da98fada8ae4ef0aa1c3405a431c0a77eb17306d38a89b02adcd7"}, + {file = "regex-2026.2.28-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:02473c954af35dd2defeb07e44182f5705b30ea3f351a7cbffa9177beb14da5d"}, + {file = "regex-2026.2.28-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9b65d33a17101569f86d9c5966a8b1d7fbf8afdda5a8aa219301b0a80f58cf7d"}, + {file = "regex-2026.2.28-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e71dcecaa113eebcc96622c17692672c2d104b1d71ddf7adeda90da7ddeb26fc"}, + {file = "regex-2026.2.28-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:481df4623fa4969c8b11f3433ed7d5e3dc9cec0f008356c3212b3933fb77e3d8"}, + {file = "regex-2026.2.28-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:64e7c6ad614573e0640f271e811a408d79a9e1fe62a46adb602f598df42a818d"}, + {file = "regex-2026.2.28-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6b08a06976ff4fb0d83077022fde3eca06c55432bb997d8c0495b9a4e9872f4"}, + {file = "regex-2026.2.28-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:864cdd1a2ef5716b0ab468af40139e62ede1b3a53386b375ec0786bb6783fc05"}, + {file = "regex-2026.2.28-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:511f7419f7afab475fd4d639d4aedfc54205bcb0800066753ef68a59f0f330b5"}, + {file = "regex-2026.2.28-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b42f7466e32bf15a961cf09f35fa6323cc72e64d3d2c990b10de1274a5da0a59"}, + {file = "regex-2026.2.28-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:8710d61737b0c0ce6836b1da7109f20d495e49b3809f30e27e9560be67a257bf"}, + {file = "regex-2026.2.28-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4390c365fd2d45278f45afd4673cb90f7285f5701607e3ad4274df08e36140ae"}, + {file = "regex-2026.2.28-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cb3b1db8ff6c7b8bf838ab05583ea15230cb2f678e569ab0e3a24d1e8320940b"}, + {file = "regex-2026.2.28-cp312-cp312-win32.whl", hash = "sha256:f8ed9a5d4612df9d4de15878f0bc6aa7a268afbe5af21a3fdd97fa19516e978c"}, + {file = "regex-2026.2.28-cp312-cp312-win_amd64.whl", hash = "sha256:01d65fd24206c8e1e97e2e31b286c59009636c022eb5d003f52760b0f42155d4"}, + {file = "regex-2026.2.28-cp312-cp312-win_arm64.whl", hash = "sha256:c0b5ccbb8ffb433939d248707d4a8b31993cb76ab1a0187ca886bf50e96df952"}, + {file = "regex-2026.2.28-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6d63a07e5ec8ce7184452cb00c41c37b49e67dc4f73b2955b5b8e782ea970784"}, + {file = "regex-2026.2.28-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e59bc8f30414d283ae8ee1617b13d8112e7135cb92830f0ec3688cb29152585a"}, + {file = "regex-2026.2.28-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:de0cf053139f96219ccfabb4a8dd2d217c8c82cb206c91d9f109f3f552d6b43d"}, + {file = "regex-2026.2.28-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fb4db2f17e6484904f986c5a657cec85574c76b5c5e61c7aae9ffa1bc6224f95"}, + {file = "regex-2026.2.28-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:52b017b35ac2214d0db5f4f90e303634dc44e4aba4bd6235a27f97ecbe5b0472"}, + {file = "regex-2026.2.28-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:69fc560ccbf08a09dc9b52ab69cacfae51e0ed80dc5693078bdc97db2f91ae96"}, + {file = "regex-2026.2.28-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e61eea47230eba62a31f3e8a0e3164d0f37ef9f40529fb2c79361bc6b53d2a92"}, + {file = "regex-2026.2.28-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4f5c0b182ad4269e7381b7c27fdb0408399881f7a92a4624fd5487f2971dfc11"}, + {file = "regex-2026.2.28-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:96f6269a2882fbb0ee76967116b83679dc628e68eaea44e90884b8d53d833881"}, + {file = "regex-2026.2.28-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b5acd4b6a95f37c3c3828e5d053a7d4edaedb85de551db0153754924cb7c83e3"}, + {file = "regex-2026.2.28-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2234059cfe33d9813a3677ef7667999caea9eeaa83fef98eb6ce15c6cf9e0215"}, + {file = "regex-2026.2.28-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:c15af43c72a7fb0c97cbc66fa36a43546eddc5c06a662b64a0cbf30d6ac40944"}, + {file = "regex-2026.2.28-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9185cc63359862a6e80fe97f696e04b0ad9a11c4ac0a4a927f979f611bfe3768"}, + {file = "regex-2026.2.28-cp313-cp313-win32.whl", hash = "sha256:fb66e5245db9652abd7196ace599b04d9c0e4aa7c8f0e2803938377835780081"}, + {file = "regex-2026.2.28-cp313-cp313-win_amd64.whl", hash = "sha256:71a911098be38c859ceb3f9a9ce43f4ed9f4c6720ad8684a066ea246b76ad9ff"}, + {file = "regex-2026.2.28-cp313-cp313-win_arm64.whl", hash = "sha256:39bb5727650b9a0275c6a6690f9bb3fe693a7e6cc5c3155b1240aedf8926423e"}, + {file = "regex-2026.2.28-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:97054c55db06ab020342cc0d35d6f62a465fa7662871190175f1ad6c655c028f"}, + {file = "regex-2026.2.28-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0d25a10811de831c2baa6aef3c0be91622f44dd8d31dd12e69f6398efb15e48b"}, + {file = "regex-2026.2.28-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d6cfe798d8da41bb1862ed6e0cba14003d387c3c0c4a5d45591076ae9f0ce2f8"}, + {file = "regex-2026.2.28-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fd0ce43e71d825b7c0661f9c54d4d74bd97c56c3fd102a8985bcfea48236bacb"}, + {file = "regex-2026.2.28-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:00945d007fd74a9084d2ab79b695b595c6b7ba3698972fadd43e23230c6979c1"}, + {file = "regex-2026.2.28-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bec23c11cbbf09a4df32fe50d57cbdd777bc442269b6e39a1775654f1c95dee2"}, + {file = "regex-2026.2.28-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5cdcc17d935c8f9d3f4db5c2ebe2640c332e3822ad5d23c2f8e0228e6947943a"}, + {file = "regex-2026.2.28-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a448af01e3d8031c89c5d902040b124a5e921a25c4e5e07a861ca591ce429341"}, + {file = "regex-2026.2.28-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:10d28e19bd4888e4abf43bd3925f3c134c52fdf7259219003588a42e24c2aa25"}, + {file = "regex-2026.2.28-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:99985a2c277dcb9ccb63f937451af5d65177af1efdeb8173ac55b61095a0a05c"}, + {file = "regex-2026.2.28-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:e1e7b24cb3ae9953a560c563045d1ba56ee4749fbd05cf21ba571069bd7be81b"}, + {file = "regex-2026.2.28-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:d8511a01d0e4ee1992eb3ba19e09bc1866fe03f05129c3aec3fdc4cbc77aad3f"}, + {file = "regex-2026.2.28-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:aaffaecffcd2479ce87aa1e74076c221700b7c804e48e98e62500ee748f0f550"}, + {file = "regex-2026.2.28-cp313-cp313t-win32.whl", hash = "sha256:ef77bdde9c9eba3f7fa5b58084b29bbcc74bcf55fdbeaa67c102a35b5bd7e7cc"}, + {file = "regex-2026.2.28-cp313-cp313t-win_amd64.whl", hash = "sha256:98adf340100cbe6fbaf8e6dc75e28f2c191b1be50ffefe292fb0e6f6eefdb0d8"}, + {file = "regex-2026.2.28-cp313-cp313t-win_arm64.whl", hash = "sha256:2fb950ac1d88e6b6a9414381f403797b236f9fa17e1eee07683af72b1634207b"}, + {file = "regex-2026.2.28-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:78454178c7df31372ea737996fb7f36b3c2c92cccc641d251e072478afb4babc"}, + {file = "regex-2026.2.28-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:5d10303dd18cedfd4d095543998404df656088240bcfd3cd20a8f95b861f74bd"}, + {file = "regex-2026.2.28-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:19a9c9e0a8f24f39d575a6a854d516b48ffe4cbdcb9de55cb0570a032556ecff"}, + {file = "regex-2026.2.28-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09500be324f49b470d907b3ef8af9afe857f5cca486f853853f7945ddbf75911"}, + {file = "regex-2026.2.28-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fb1c4ff62277d87a7335f2c1ea4e0387b8f2b3ad88a64efd9943906aafad4f33"}, + {file = "regex-2026.2.28-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b8b3f1be1738feadc69f62daa250c933e85c6f34fa378f54a7ff43807c1b9117"}, + {file = "regex-2026.2.28-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc8ed8c3f41c27acb83f7b6a9eb727a73fc6663441890c5cb3426a5f6a91ce7d"}, + {file = "regex-2026.2.28-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa539be029844c0ce1114762d2952ab6cfdd7c7c9bd72e0db26b94c3c36dcc5a"}, + {file = "regex-2026.2.28-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7900157786428a79615a8264dac1f12c9b02957c473c8110c6b1f972dcecaddf"}, + {file = "regex-2026.2.28-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:0b1d2b07614d95fa2bf8a63fd1e98bd8fa2b4848dc91b1efbc8ba219fdd73952"}, + {file = "regex-2026.2.28-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:b389c61aa28a79c2e0527ac36da579869c2e235a5b208a12c5b5318cda2501d8"}, + {file = "regex-2026.2.28-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f467cb602f03fbd1ab1908f68b53c649ce393fde056628dc8c7e634dab6bfc07"}, + {file = "regex-2026.2.28-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e8c8cb2deba42f5ec1ede46374e990f8adc5e6456a57ac1a261b19be6f28e4e6"}, + {file = "regex-2026.2.28-cp314-cp314-win32.whl", hash = "sha256:9036b400b20e4858d56d117108d7813ed07bb7803e3eed766675862131135ca6"}, + {file = "regex-2026.2.28-cp314-cp314-win_amd64.whl", hash = "sha256:1d367257cd86c1cbb97ea94e77b373a0bbc2224976e247f173d19e8f18b4afa7"}, + {file = "regex-2026.2.28-cp314-cp314-win_arm64.whl", hash = "sha256:5e68192bb3a1d6fb2836da24aa494e413ea65853a21505e142e5b1064a595f3d"}, + {file = "regex-2026.2.28-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:a5dac14d0872eeb35260a8e30bac07ddf22adc1e3a0635b52b02e180d17c9c7e"}, + {file = "regex-2026.2.28-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:ec0c608b7a7465ffadb344ed7c987ff2f11ee03f6a130b569aa74d8a70e8333c"}, + {file = "regex-2026.2.28-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c7815afb0ca45456613fdaf60ea9c993715511c8d53a83bc468305cbc0ee23c7"}, + {file = "regex-2026.2.28-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b059e71ec363968671693a78c5053bd9cb2fe410f9b8e4657e88377ebd603a2e"}, + {file = "regex-2026.2.28-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b8cf76f1a29f0e99dcfd7aef1551a9827588aae5a737fe31442021165f1920dc"}, + {file = "regex-2026.2.28-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:180e08a435a0319e6a4821c3468da18dc7001987e1c17ae1335488dfe7518dd8"}, + {file = "regex-2026.2.28-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1e496956106fd59ba6322a8ea17141a27c5040e5ee8f9433ae92d4e5204462a0"}, + {file = "regex-2026.2.28-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bba2b18d70eeb7b79950f12f633beeecd923f7c9ad6f6bae28e59b4cb3ab046b"}, + {file = "regex-2026.2.28-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6db7bfae0f8a2793ff1f7021468ea55e2699d0790eb58ee6ab36ae43aa00bc5b"}, + {file = "regex-2026.2.28-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:d0b02e8b7e5874b48ae0f077ecca61c1a6a9f9895e9c6dfb191b55b242862033"}, + {file = "regex-2026.2.28-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:25b6eb660c5cf4b8c3407a1ed462abba26a926cc9965e164268a3267bcc06a43"}, + {file = "regex-2026.2.28-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:5a932ea8ad5d0430351ff9c76c8db34db0d9f53c1d78f06022a21f4e290c5c18"}, + {file = "regex-2026.2.28-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:1c2c95e1a2b0f89d01e821ff4de1be4b5d73d1f4b0bf679fa27c1ad8d2327f1a"}, + {file = "regex-2026.2.28-cp314-cp314t-win32.whl", hash = "sha256:bbb882061f742eb5d46f2f1bd5304055be0a66b783576de3d7eef1bed4778a6e"}, + {file = "regex-2026.2.28-cp314-cp314t-win_amd64.whl", hash = "sha256:6591f281cb44dc13de9585b552cec6fc6cf47fb2fe7a48892295ee9bc4a612f9"}, + {file = "regex-2026.2.28-cp314-cp314t-win_arm64.whl", hash = "sha256:dee50f1be42222f89767b64b283283ef963189da0dda4a515aa54a5563c62dec"}, + {file = "regex-2026.2.28.tar.gz", hash = "sha256:a729e47d418ea11d03469f321aaf67cdee8954cde3ff2cf8403ab87951ad10f2"}, ] [[package]] @@ -2539,4 +2555,4 @@ scikit-learn = ["scikit-learn"] [metadata] lock-version = "2.1" python-versions = ">=3.11,<3.13" -content-hash = "14823857edbe8ca35e0ee2273d41fd5d31ba0244e13b04d005760b86d9c4a7fc" +content-hash = "f1cfb3d6a2b524b55adf5c7cfd92d7ea8ddc2f2d73026f0ad2f480733f11d51e" diff --git a/pyproject.toml b/pyproject.toml index f732d005..68f87413 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,7 +35,7 @@ homepage = "https://github.com/KnowledgeCaptureAndDiscovery/somef" contractions = "^0.1.73" chardet = "^5.2.0" imbalanced-learn = "^0.12.0" - pytest = "^7.4.4" + pytest = "^8.0.0" morph-kgc = "^2.6.4" bibtexparser = "^1.4.1" nbformat = "^5.9.2" diff --git a/src/somef/parser/python_parser.py b/src/somef/parser/python_parser.py index 63a3f3a5..8f9a2c81 100644 --- a/src/somef/parser/python_parser.py +++ b/src/somef/parser/python_parser.py @@ -1,6 +1,11 @@ import ast import os -import tomli +# for compatibility in python 3.11 projects +try: + import tomllib as tomli +except ModuleNotFoundError: + import tomli + import logging import re from pathlib import Path diff --git a/src/somef/parser/toml_parser.py b/src/somef/parser/toml_parser.py index fb330806..5603eda9 100644 --- a/src/somef/parser/toml_parser.py +++ b/src/somef/parser/toml_parser.py @@ -1,5 +1,10 @@ # -*- coding: utf-8 -*- -import tomli + +# for compatibility in python 3.11 projects +try: + import tomllib as tomli +except ModuleNotFoundError: + import tomli import re import os import logging diff --git a/src/somef/rolf/models/audio.sav b/src/somef/rolf/models/audio.sav deleted file mode 100644 index 173a1647a2aef9a9694f7923393cc937a20454fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 797008 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≈9F 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