diff --git a/site/cds_rdm/config.py b/site/cds_rdm/config.py index 95bcfc82..a4b987b9 100644 --- a/site/cds_rdm/config.py +++ b/site/cds_rdm/config.py @@ -79,3 +79,6 @@ CDS_HARVESTER_PROD_API_URL = "https://repository.cern" """Prod base URL used to resolve a CDSRDM id into parent.id and version id.""" + +CDS_HARVESTER_INSPIRE_API_URL = "https://inspirehep.net/api/literature" +"""Base URL for the INSPIRE literature search API used by the harvester reader.""" diff --git a/site/cds_rdm/inspire_harvester/reader.py b/site/cds_rdm/inspire_harvester/reader.py index 6b62ca3d..e5f884d1 100644 --- a/site/cds_rdm/inspire_harvester/reader.py +++ b/site/cds_rdm/inspire_harvester/reader.py @@ -10,11 +10,14 @@ import requests from flask import current_app -from invenio_vocabularies.datastreams.errors import ReaderError +from invenio_vocabularies.datastreams.errors import IncompleteReadError, ReaderError from invenio_vocabularies.datastreams.readers import BaseReader from cds_rdm.inspire_harvester.transform.resource_types import ALL_DOCUMENT_TYPES +# Cap re-harvest passes so a shifting result set cannot loop forever. +MAX_HARVEST_PASSES = 3 + class InspireHTTPReader(BaseReader): """INSPIRE HTTP Reader.""" @@ -40,40 +43,101 @@ def __init__( super().__init__(origin, mode, *args, **kwargs) + def _build_url(self, q, **params): + """Build an INSPIRE literature search URL.""" + query_params = {"q": q, **params} + base_url = current_app.config["CDS_HARVESTER_INSPIRE_API_URL"] + return f"{base_url}?{urlencode(query_params)}" + + def _get_json(self, url, headers): + """Fetch JSON from INSPIRE or raise ReaderError.""" + current_app.logger.info(f"Querying URL: {url}.") + response = requests.get(url, headers=headers) + if response.status_code != 200: + error_message = ( + f"Error occurred while getting JSON data from INSPIRE. " + f"See URL: {url}. Error message: {response.text}. " + f"Status code: {response.status_code}" + ) + current_app.logger.error(error_message) + raise ReaderError(error_message) + current_app.logger.debug("Request response is successful (200).") + return response.json() + def _iter(self, url, *args, **kwargs): """Yields HTTP response.""" # header set to include additional data (external file URLs and more detailed metadata headers = {"Accept": "application/vnd+inspire.record.expanded+json"} - initial_url = url - - while url: # Continue until there is no "next" link - current_app.logger.info(f"Querying URL: {url}.") - response = requests.get(url, headers=headers) - data = response.json() - if response.status_code == 200: - current_app.logger.debug("Request response is successful (200).") + # Three nested loops: + # - outer: re-harvest from the start when we got fewer records than INSPIRE + # reported (capped at MAX_HARVEST_PASSES) + # - middle (page_url): walk INSPIRE pagination (next page links) + # - inner (hits): yield each record on the current page + # seen_ids tracks ids already yielded in this run so retries do not send + # the same record twice. first_pass makes us retry at least once. if a + # later pass adds nothing new (new_in_pass == 0), harvesting stops. + harvest_url = url + seen_ids = set() + first_pass = True + + for pass_number in range(1, MAX_HARVEST_PASSES + 1): + page_url = harvest_url + reported_total = None + new_in_pass = 0 + + while page_url: + data = self._get_json(page_url, headers) total = data["hits"]["total"] hits = data["hits"]["hits"] - if total == 0: - current_app.logger.warning( - f"No results found when querying INSPIRE. See URL: {url}." - ) - elif url == initial_url: - current_app.logger.info(f"Records found: {total}.") + if reported_total is None: + reported_total = total + if total == 0: + current_app.logger.warning( + f"No results found when querying INSPIRE. See URL: {page_url}." + ) + else: + current_app.logger.info(f"Records found: {total}.") for inspire_record in hits: + record_id = str(inspire_record["id"]) + if record_id in seen_ids: + continue + seen_ids.add(record_id) + new_in_pass += 1 current_app.logger.debug( - f"Sending INSPIRE record #{inspire_record['id']} to transformer." + f"Sending INSPIRE record #{record_id} to transformer." ) yield inspire_record - else: - error_message = f"Error occurred while getting JSON data from INSPIRE. See URL: {url}. Error message: {response.text}. Status code: {response.status_code}" - current_app.logger.error(error_message) - raise ReaderError(error_message) - # Get the next page URL if available - url = data.get("links", {}).get("next") + page_url = data.get("links", {}).get("next") + + if len(seen_ids) == reported_total: + return + + if not first_pass and new_in_pass == 0: + msg = ( + "Harvest retry added no new INSPIRE records; stopping. " + f"| details: harvested={len(seen_ids)}, reported={reported_total}" + ) + current_app.logger.warning(msg) + raise IncompleteReadError(msg) + + if pass_number == MAX_HARVEST_PASSES: + msg = ( + "Harvest still short of INSPIRE total after max retries; stopping. " + f"| details: harvested={len(seen_ids)}, reported={reported_total}, " + f"max_passes={MAX_HARVEST_PASSES}" + ) + current_app.logger.warning(msg) + raise IncompleteReadError(msg) + + first_pass = False + current_app.logger.info( + "Harvested fewer INSPIRE records than reported; harvesting again. " + f"| details: harvested={len(seen_ids)}, reported={reported_total}, " + f"pass={pass_number}/{MAX_HARVEST_PASSES}" + ) def read(self, item=None, *args, **kwargs): """Builds a query depending on the input data.""" @@ -122,9 +186,7 @@ def read(self, item=None, *args, **kwargs): ) query_params = {"q": f"{q} AND du >= {self._since}"} - base_url = "https://inspirehep.net/api/literature" - encoded_query = urlencode(query_params) - url = f"{base_url}?{encoded_query}" + url = self._build_url(query_params["q"]) current_app.logger.info( f"Resulting query: {query_params['q']}. URL for harvesting data from INSPIRE: {url}." diff --git a/site/tests/inspire_harvester/test_harvester_job.py b/site/tests/inspire_harvester/test_harvester_job.py index ab1c21cc..820918bb 100644 --- a/site/tests/inspire_harvester/test_harvester_job.py +++ b/site/tests/inspire_harvester/test_harvester_job.py @@ -517,3 +517,113 @@ def mock_requests_get_pagination( tranformation(created_record2.to_dict()["hits"]["hits"][0]["id"], expected_result_2) tranformation(created_record3.to_dict()["hits"]["hits"][0]["id"], expected_result_3) + + +def test_inspire_job_recovers_pagination_shift(running_app, scientific_community, caplog): + """Full harvest persists a record skipped by mid-pagination INSPIRE shifts.""" + page_1_file = DATA_DIR / "inspire_response_15_records_page_1.json" + page_2_file = DATA_DIR / "inspire_response_15_records_page_2.json" + with open(page_1_file) as f: + page_1_data = json.load(f) + with open(page_2_file) as f: + page_2_data = json.load(f) + + by_id = { + str(hit["id"]): hit + for hit in page_1_data["hits"]["hits"] + page_2_data["hits"]["hits"] + } + # Known-good thesis fixtures from test_inspire_job. + record_a = by_id["2802969"] + record_b = by_id["1452604"] + record_c = by_id["2840463"] # skipped in first pass + skipped_id = str(record_c["id"]) + + page_1 = { + "hits": {"total": 3, "hits": [record_a, record_b]}, + "links": { + "next": ( + "https://inspirehep.net/api/literature" + "?q=_oai.sets%3AForCDS+AND+du+%3E%3D+2024-11-15+AND+du+%3C%3D+2025-01-09" + "&size=2&page=2" + ) + }, + } + # After a live update, record C moved off page 2, so the first pass never + # sees it and harvests 2 of the reported 3 records. + page_2_shifted = { + "hits": {"total": 3, "hits": []}, + "links": {}, + } + # By the time the reader harvests again, record C is back in view. + page_2_retry = { + "hits": {"total": 3, "hits": [record_c]}, + "links": {}, + } + page_2_calls = {"n": 0} + + ds_config = { + "config": { + "readers": [ + { + "type": "inspire-http-reader", + "args": { + "since": "2024-11-15", + "until": "2025-01-09", + }, + }, + ], + "transformers": [{"type": "inspire-json-transformer"}], + "writers": [ + { + "type": "async", + "args": { + "writer": { + "type": "inspire-writer", + } + }, + } + ], + "batch_size": 100, + "write_many": True, + } + } + + def mock_requests_get_shift( + url, + headers={"Accept": "application/vnd+inspire.record.expanded+json"}, + stream=True, + ): + if "page=2" in url: + page_2_calls["n"] += 1 + content = page_2_shifted if page_2_calls["n"] == 1 else page_2_retry + else: + content = page_1 + return mock_requests_get(url, mock_content=content) + + run_harvester_mock(ds_config, mock_requests_get_shift) + + RDMRecord.index.refresh() + + assert ( + "Harvested fewer INSPIRE records than reported; harvesting again." + in caplog.text + ) + assert "harvested=2, reported=3" in caplog.text + assert skipped_id in caplog.text + + for inspire_id in (str(record_a["id"]), str(record_b["id"]), skipped_id): + created = current_rdm_records_service.search( + system_identity, + params={"q": f"metadata.related_identifiers.identifier:{inspire_id}"}, + ) + assert created.total == 1, f"Expected CDS record for INSPIRE#{inspire_id}" + + # Explicitly prove the shifted record was persisted. + skipped_record = current_rdm_records_service.search( + system_identity, + params={"q": f"metadata.related_identifiers.identifier:{skipped_id}"}, + ) + assert ( + skipped_record.to_dict()["hits"]["hits"][0]["metadata"]["title"] + == record_c["metadata"]["titles"][0]["title"] + ) diff --git a/site/tests/inspire_harvester/test_reader.py b/site/tests/inspire_harvester/test_reader.py index ae5fb4b5..fe9dd662 100644 --- a/site/tests/inspire_harvester/test_reader.py +++ b/site/tests/inspire_harvester/test_reader.py @@ -10,7 +10,7 @@ from unittest.mock import Mock, patch import pytest -from invenio_vocabularies.datastreams.errors import ReaderError +from invenio_vocabularies.datastreams.errors import IncompleteReadError, ReaderError from cds_rdm.inspire_harvester.reader import InspireHTTPReader @@ -62,3 +62,152 @@ def test_reader_success(running_app): assert "metadata" in data assert "id" in data assert "links" in data + + +def test_reader_recovers_missing_records(running_app, caplog): + """Test reader harvests again when pagination skipped a record.""" + page_1 = { + "hits": { + "total": 6, + "hits": [{"id": "1"}, {"id": "2"}, {"id": "3"}], + }, + "links": { + "next": "https://inspirehep.net/api/literature?q=test&page=2", + }, + } + # Record 4 moved to page 1 after a live update, so page 2 no longer has it. + page_2 = { + "hits": { + "total": 6, + "hits": [{"id": "5"}, {"id": "6"}], + }, + "links": {}, + } + page_2_retry = { + "hits": { + "total": 6, + "hits": [{"id": "4"}, {"id": "5"}, {"id": "6"}], + }, + "links": {}, + } + page_2_calls = {"n": 0} + + def side_effect(url, headers=None): + mock_response = Mock() + mock_response.status_code = 200 + if "page=2" in url: + page_2_calls["n"] += 1 + mock_response.json.return_value = ( + page_2 if page_2_calls["n"] == 1 else page_2_retry + ) + else: + mock_response.json.return_value = page_1 + return mock_response + + with patch("requests.get", side_effect=side_effect): + reader = InspireHTTPReader(since="2024-01-01", until="2024-01-02") + records = list(reader.read()) + + assert [str(r["id"]) for r in records] == ["1", "2", "3", "5", "6", "4"] + assert "Harvested fewer INSPIRE records than reported; harvesting again." in caplog.text + + +def test_reader_does_not_retry_when_counts_match(running_app, caplog): + """Test reader stops when harvested IDs already match hits.total.""" + page_1 = { + "hits": { + "total": 6, + "hits": [{"id": "1"}, {"id": "2"}, {"id": "3"}], + }, + "links": { + "next": "https://inspirehep.net/api/literature?q=test&page=2", + }, + } + page_2 = { + "hits": { + "total": 6, + "hits": [{"id": "4"}, {"id": "5"}, {"id": "6"}], + }, + "links": {}, + } + page_1_calls = {"n": 0} + + def side_effect(url, headers=None): + mock_response = Mock() + mock_response.status_code = 200 + if "page=2" in url: + mock_response.json.return_value = page_2 + else: + page_1_calls["n"] += 1 + mock_response.json.return_value = page_1 + return mock_response + + with patch("requests.get", side_effect=side_effect) as mock_get: + reader = InspireHTTPReader(since="2024-01-01", until="2024-01-02") + records = list(reader.read()) + + assert [str(r["id"]) for r in records] == ["1", "2", "3", "4", "5", "6"] + assert "harvesting again" not in caplog.text + assert page_1_calls["n"] == 1 + assert all("fields=id" not in call.args[0] for call in mock_get.call_args_list) + + +def test_reader_skips_recovery_for_single_page(running_app, caplog): + """Single-page harvests do not run again when counts already match.""" + page_1 = { + "hits": { + "total": 2, + "hits": [{"id": "1"}, {"id": "2"}], + }, + "links": {}, + } + + def side_effect(url, headers=None): + mock_response = Mock() + mock_response.status_code = 200 + mock_response.json.return_value = page_1 + return mock_response + + with patch("requests.get", side_effect=side_effect) as mock_get: + reader = InspireHTTPReader(since="2024-01-01", until="2024-01-02") + records = list(reader.read()) + + assert [str(r["id"]) for r in records] == ["1", "2"] + assert "harvesting again" not in caplog.text + assert all("fields=id" not in call.args[0] for call in mock_get.call_args_list) + assert mock_get.call_count == 1 + + +def test_reader_caps_retry_passes(running_app, caplog): + """Test reader stops after MAX_HARVEST_PASSES even if counts never match.""" + from cds_rdm.inspire_harvester.reader import MAX_HARVEST_PASSES + + # Each pass reports total=3 but only yields one new id, so the outer loop + # would otherwise keep retrying forever as new_in_pass stays > 0. + pass_calls = {"n": 0} + + def side_effect(url, headers=None): + pass_calls["n"] += 1 + mock_response = Mock() + mock_response.status_code = 200 + mock_response.json.return_value = { + "hits": { + "total": 10, + "hits": [{"id": str(pass_calls["n"])}], + }, + "links": {}, + } + return mock_response + + records = [] + with patch("requests.get", side_effect=side_effect) as mock_get: + reader = InspireHTTPReader(since="2024-01-01", until="2024-01-02") + with pytest.raises(IncompleteReadError, match="after max retries"): + for record in reader.read(): + records.append(record) + + assert [str(r["id"]) for r in records] == [ + str(i) for i in range(1, MAX_HARVEST_PASSES + 1) + ] + assert mock_get.call_count == MAX_HARVEST_PASSES + assert "after max retries; stopping" in caplog.text diff --git a/uv.lock b/uv.lock index 9efe04ce..2342bae9 100644 --- a/uv.lock +++ b/uv.lock @@ -28,13 +28,13 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "aiohttp", version = "3.13.5", source = { registry = "https://pypi.org/simple" } }, - { name = "aioitertools" }, - { name = "botocore", version = "1.41.5", source = { registry = "https://pypi.org/simple" } }, - { name = "jmespath" }, - { name = "multidict" }, - { name = "python-dateutil" }, - { name = "wrapt", version = "1.17.3", source = { registry = "https://pypi.org/simple" } }, + { name = "aiohttp", version = "3.13.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "aioitertools", marker = "python_full_version < '3.10'" }, + { name = "botocore", version = "1.41.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "jmespath", marker = "python_full_version < '3.10'" }, + { name = "multidict", marker = "python_full_version < '3.10'" }, + { name = "python-dateutil", marker = "python_full_version < '3.10'" }, + { name = "wrapt", version = "1.17.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/4d/f8/99fa90d9c25b78292899fd4946fce97b6353838b5ecc139ad8ba1436e70c/aiobotocore-2.26.0.tar.gz", hash = "sha256:50567feaf8dfe2b653570b4491f5bc8c6e7fb9622479d66442462c021db4fadc", size = 122026, upload-time = "2025-11-28T07:54:59.956Z" } wheels = [ @@ -51,14 +51,14 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "aiohttp", version = "3.14.3", source = { registry = "https://pypi.org/simple" } }, - { name = "aioitertools" }, - { name = "botocore", version = "1.43.56", source = { registry = "https://pypi.org/simple" } }, - { name = "jmespath" }, - { name = "multidict" }, - { name = "python-dateutil" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, - { name = "wrapt", version = "2.4.0", source = { registry = "https://pypi.org/simple" } }, + { name = "aiohttp", version = "3.14.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "aioitertools", marker = "python_full_version >= '3.10'" }, + { name = "botocore", version = "1.43.56", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "jmespath", marker = "python_full_version >= '3.10'" }, + { name = "multidict", marker = "python_full_version >= '3.10'" }, + { name = "python-dateutil", marker = "python_full_version >= '3.10'" }, + { name = "typing-extensions", marker = "python_full_version == '3.10.*'" }, + { name = "wrapt", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/73/c0/18abcb7e4e504a68714c280853fd180afe376a4a55e5511fb04ba76702e4/aiobotocore-3.9.0.tar.gz", hash = "sha256:5d344e97c518b010bea167c7f7ba4f9e785f9d2b8ac7af4fd00846c62f2c0a10", size = 514972, upload-time = "2026-08-01T11:54:07.673Z" } wheels = [ @@ -101,14 +101,14 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "aiohappyeyeballs", version = "2.6.1", source = { registry = "https://pypi.org/simple" } }, - { name = "aiosignal" }, - { name = "async-timeout" }, - { name = "attrs" }, - { name = "frozenlist" }, - { name = "multidict" }, - { name = "propcache", version = "0.4.1", source = { registry = "https://pypi.org/simple" } }, - { name = "yarl", version = "1.22.0", source = { registry = "https://pypi.org/simple" } }, + { name = "aiohappyeyeballs", version = "2.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "aiosignal", marker = "python_full_version < '3.10'" }, + { name = "async-timeout", marker = "python_full_version < '3.10'" }, + { name = "attrs", marker = "python_full_version < '3.10'" }, + { name = "frozenlist", marker = "python_full_version < '3.10'" }, + { name = "multidict", marker = "python_full_version < '3.10'" }, + { name = "propcache", version = "0.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "yarl", version = "1.22.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/77/9a/152096d4808df8e4268befa55fba462f440f14beab85e8ad9bf990516918/aiohttp-3.13.5.tar.gz", hash = "sha256:9d98cc980ecc96be6eb4c1994ce35d28d8b1f5e5208a23b421187d1209dbb7d1", size = 7858271, upload-time = "2026-03-31T22:01:03.343Z" } wheels = [ @@ -243,15 +243,15 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "aiohappyeyeballs", version = "2.7.1", source = { registry = "https://pypi.org/simple" } }, - { name = "aiosignal" }, - { name = "async-timeout", marker = "python_full_version < '3.11'" }, - { name = "attrs" }, - { name = "frozenlist" }, - { name = "multidict" }, - { name = "propcache", version = "0.5.2", source = { registry = "https://pypi.org/simple" } }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, - { name = "yarl", version = "1.24.5", source = { registry = "https://pypi.org/simple" } }, + { name = "aiohappyeyeballs", version = "2.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "aiosignal", marker = "python_full_version >= '3.10'" }, + { name = "async-timeout", marker = "python_full_version == '3.10.*'" }, + { name = "attrs", marker = "python_full_version >= '3.10'" }, + { name = "frozenlist", marker = "python_full_version >= '3.10'" }, + { name = "multidict", marker = "python_full_version >= '3.10'" }, + { name = "propcache", version = "0.5.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "typing-extensions", marker = "python_full_version >= '3.10' and python_full_version < '3.13'" }, + { name = "yarl", version = "1.24.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/58/d9/22ce5786ac0c1653ae8b6c23bded02c1686d11f0dbb45b31ce128e0df985/aiohttp-3.14.3.tar.gz", hash = "sha256:9491196535a88924a60afd5b5f434b5b203b6cc616250878dbdb223a8f7844bc", size = 7971213, upload-time = "2026-07-23T01:57:27.037Z" } wheels = [ @@ -409,10 +409,10 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "mako", version = "1.3.12", source = { registry = "https://pypi.org/simple" } }, - { name = "sqlalchemy" }, - { name = "tomli" }, - { name = "typing-extensions" }, + { name = "mako", version = "1.3.12", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "sqlalchemy", marker = "python_full_version < '3.10'" }, + { name = "tomli", marker = "python_full_version < '3.10'" }, + { name = "typing-extensions", marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/9a/ca/4dc52902cf3491892d464f5265a81e9dff094692c8a049a3ed6a05fe7ee8/alembic-1.16.5.tar.gz", hash = "sha256:a88bb7f6e513bd4301ecf4c7f2206fe93f9913f9b48dac3b78babde2d6fe765e", size = 1969868, upload-time = "2025-08-27T18:02:05.668Z" } wheels = [ @@ -429,10 +429,10 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "mako", version = "1.4.1", source = { registry = "https://pypi.org/simple" } }, - { name = "sqlalchemy" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, - { name = "typing-extensions" }, + { name = "mako", version = "1.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "sqlalchemy", marker = "python_full_version >= '3.10'" }, + { name = "tomli", marker = "python_full_version == '3.10.*'" }, + { name = "typing-extensions", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/16/2b/e4153978368de59918115c9e01d3ebf58a558a7285efa7e960c383c4b59a/alembic-1.19.1.tar.gz", hash = "sha256:e0fca0518118c78acc493e31bcb5402f190057aaf6df8b5b95ce94c4789cf648", size = 2070816, upload-time = "2026-08-08T16:32:01.565Z" } wheels = [ @@ -675,7 +675,7 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "webencodings", version = "0.5.1", source = { registry = "https://pypi.org/simple" } }, + { name = "webencodings", version = "0.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/76/9a/0e33f5054c54d349ea62c277191c020c2d6ef1d65ab2cb1993f91ec846d1/bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f", size = 203083, upload-time = "2024-10-29T18:30:40.477Z" } wheels = [ @@ -684,7 +684,7 @@ wheels = [ [package.optional-dependencies] css = [ - { name = "tinycss2", version = "1.4.0", source = { registry = "https://pypi.org/simple" } }, + { name = "tinycss2", version = "1.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, ] [[package]] @@ -697,7 +697,7 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "webencodings", version = "0.6.1", source = { registry = "https://pypi.org/simple" } }, + { name = "webencodings", version = "0.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/48/3c/e12ac860709702bd5ebeb9b56a4fe334f1001246ee1b8f2b7ee28912df7d/bleach-6.4.0.tar.gz", hash = "sha256:4202482733d85cedd04e59fcb2f89f4e4c7c385a78d3c3c23c30446843a37452", size = 204857, upload-time = "2026-06-05T13:01:13.734Z" } wheels = [ @@ -706,7 +706,7 @@ wheels = [ [package.optional-dependencies] css = [ - { name = "tinycss2", version = "1.5.1", source = { registry = "https://pypi.org/simple" } }, + { name = "tinycss2", version = "1.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] [[package]] @@ -727,9 +727,9 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "jmespath" }, - { name = "python-dateutil" }, - { name = "urllib3", version = "1.26.20", source = { registry = "https://pypi.org/simple" } }, + { name = "jmespath", marker = "python_full_version < '3.10'" }, + { name = "python-dateutil", marker = "python_full_version < '3.10'" }, + { name = "urllib3", version = "1.26.20", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/90/22/7fe08c726a2e3b11a0aef8bf177e83891c9cb2dc1809d35c9ed91a9e60e6/botocore-1.41.5.tar.gz", hash = "sha256:0367622b811597d183bfcaab4a350f0d3ede712031ce792ef183cabdee80d3bf", size = 14668152, upload-time = "2025-11-26T20:27:38.026Z" } wheels = [ @@ -746,9 +746,9 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "jmespath" }, - { name = "python-dateutil" }, - { name = "urllib3", version = "2.7.0", source = { registry = "https://pypi.org/simple" } }, + { name = "jmespath", marker = "python_full_version >= '3.10'" }, + { name = "python-dateutil", marker = "python_full_version >= '3.10'" }, + { name = "urllib3", version = "2.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b9/cc/7f84a5d3071fe878380e9f610ab36ca87b8cbbc4aa81ba2727f90e1f3ea3/botocore-1.43.56.tar.gz", hash = "sha256:6c01f85f0ff9863076f4c761e74ee3aa96c5ccc1ad09fc1efd62ef8f2d22bf57", size = 15733117, upload-time = "2026-07-24T19:31:38.125Z" } wheels = [ @@ -828,7 +828,7 @@ name = "brotlicffi" version = "1.2.0.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cffi", version = "2.1.1", source = { registry = "https://pypi.org/simple" } }, + { name = "cffi", version = "2.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/71/97/7845739a36828ffe751a1c6b240692f552fd7ecf65026c51326c0a4aa369/brotlicffi-1.2.0.2.tar.gz", hash = "sha256:5e0fbd13644cf1f6015e75fa5e0ad8fdce1048d9c9ff90b0ce826174b249ee35", size = 478755, upload-time = "2026-08-21T17:29:18.415Z" } wheels = [ @@ -857,11 +857,11 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "colorama", marker = "os_name == 'nt'" }, - { name = "importlib-metadata", version = "8.7.1", source = { registry = "https://pypi.org/simple" } }, - { name = "packaging", version = "24.2", source = { registry = "https://pypi.org/simple" } }, - { name = "pyproject-hooks" }, - { name = "tomli" }, + { name = "colorama", marker = "python_full_version < '3.10' and os_name == 'nt'" }, + { name = "importlib-metadata", version = "8.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "packaging", version = "24.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "pyproject-hooks", marker = "python_full_version < '3.10'" }, + { name = "tomli", marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/02/ec/bf5ae0a7e5ab57abe8aabdd0759c971883895d1a20c49ae99f8146840c3c/build-1.4.4.tar.gz", hash = "sha256:f832ae053061f3fb524af812dc94b8b84bac6880cd587630e3b5d91a6a9c1703", size = 89220, upload-time = "2026-04-22T20:53:44.807Z" } wheels = [ @@ -878,11 +878,11 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "colorama", marker = "os_name == 'nt'" }, - { name = "importlib-metadata", version = "9.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10.2'" }, - { name = "packaging", version = "26.3", source = { registry = "https://pypi.org/simple" } }, - { name = "pyproject-hooks" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "colorama", marker = "python_full_version >= '3.10' and os_name == 'nt'" }, + { name = "importlib-metadata", version = "9.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and python_full_version < '3.10.2'" }, + { name = "packaging", version = "26.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pyproject-hooks", marker = "python_full_version >= '3.10'" }, + { name = "tomli", marker = "python_full_version == '3.10.*'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/4d/b7/1db48a9ce2984842c8c886432ec8a2719613322e868a966ba82a28862f25/build-1.6.0.tar.gz", hash = "sha256:bd2c8afc603e7a2e0ce70e2ea85f0a6d02043bafbd307f5bada0f98669eca5af", size = 113825, upload-time = "2026-08-27T21:01:16.458Z" } wheels = [ @@ -938,11 +938,11 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "cairocffi" }, - { name = "cssselect2", version = "0.8.0", source = { registry = "https://pypi.org/simple" } }, - { name = "defusedxml" }, - { name = "pillow", version = "11.3.0", source = { registry = "https://pypi.org/simple" } }, - { name = "tinycss2", version = "1.4.0", source = { registry = "https://pypi.org/simple" } }, + { name = "cairocffi", marker = "python_full_version < '3.10'" }, + { name = "cssselect2", version = "0.8.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "defusedxml", marker = "python_full_version < '3.10'" }, + { name = "pillow", version = "11.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "tinycss2", version = "1.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ab/b9/5106168bd43d7cd8b7cc2a2ee465b385f14b63f4c092bb89eee2d48c8e67/cairosvg-2.8.2.tar.gz", hash = "sha256:07cbf4e86317b27a92318a4cac2a4bb37a5e9c1b8a27355d06874b22f85bef9f", size = 8398590, upload-time = "2025-05-15T06:56:32.653Z" } wheels = [ @@ -959,11 +959,11 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "cairocffi" }, - { name = "cssselect2", version = "0.10.1", source = { registry = "https://pypi.org/simple" } }, - { name = "defusedxml" }, - { name = "pillow", version = "12.3.0", source = { registry = "https://pypi.org/simple" } }, - { name = "tinycss2", version = "1.5.1", source = { registry = "https://pypi.org/simple" } }, + { name = "cairocffi", marker = "python_full_version >= '3.10'" }, + { name = "cssselect2", version = "0.10.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "defusedxml", marker = "python_full_version >= '3.10'" }, + { name = "pillow", version = "12.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "tinycss2", version = "1.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/38/07/e8412a13019b3f737972dea23a2c61ca42becafc16c9338f4ca7a0caa993/cairosvg-2.9.0.tar.gz", hash = "sha256:1debb00cd2da11350d8b6f5ceb739f1b539196d71d5cf5eb7363dbd1bfbc8dc5", size = 40877, upload-time = "2026-03-13T15:42:00.564Z" } wheels = [ @@ -1067,7 +1067,7 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "pycparser", version = "2.23", source = { registry = "https://pypi.org/simple" }, marker = "implementation_name != 'PyPy'" }, + { name = "pycparser", version = "2.23", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10' and implementation_name != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } wheels = [ @@ -1166,7 +1166,7 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "pycparser", version = "3.0", source = { registry = "https://pypi.org/simple" }, marker = "implementation_name != 'PyPy'" }, + { name = "pycparser", version = "3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and implementation_name != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/9e/ef/008a1939e372c06329a3fce4279c02f328488f3526744906eeec3da7ad5f/cffi-2.1.1.tar.gz", hash = "sha256:dd31f52ea1086513bb9df30f8fcee9b8918323ae067a3d5b78bc826a000712be", size = 530807, upload-time = "2026-08-03T21:21:18.939Z" } wheels = [ @@ -1500,7 +1500,7 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "colorama", marker = "python_full_version < '3.10' and sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593, upload-time = "2024-12-21T18:38:44.339Z" } wheels = [ @@ -1776,7 +1776,7 @@ wheels = [ [package.optional-dependencies] toml = [ - { name = "tomli" }, + { name = "tomli", marker = "python_full_version < '3.10'" }, ] [[package]] @@ -1914,7 +1914,7 @@ wheels = [ [package.optional-dependencies] toml = [ - { name = "tomli", marker = "python_full_version <= '3.11'" }, + { name = "tomli", marker = "python_full_version >= '3.10' and python_full_version <= '3.11'" }, ] [[package]] @@ -1925,8 +1925,8 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "cffi", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "platform_python_implementation != 'PyPy'" }, - { name = "typing-extensions" }, + { name = "cffi", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version <= '3.9' and platform_python_implementation != 'PyPy'" }, + { name = "typing-extensions", marker = "python_full_version <= '3.9'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ef/b2/7ffa7fe8207a8c42147ffe70c3e360b228160c1d85dc3faff16aaa3244c0/cryptography-47.0.0.tar.gz", hash = "sha256:9f8e55fe4e63613a5e1cc5819030f27b97742d720203a087802ce4ce9ceb52bb", size = 830863, upload-time = "2026-04-24T19:54:57.056Z" } wheels = [ @@ -1991,9 +1991,9 @@ resolution-markers = [ "python_full_version > '3.9' and python_full_version < '3.10'", ] dependencies = [ - { name = "cffi", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10' and platform_python_implementation != 'PyPy'" }, + { name = "cffi", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version > '3.9' and python_full_version < '3.10' and platform_python_implementation != 'PyPy'" }, { name = "cffi", version = "2.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and platform_python_implementation != 'PyPy'" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version > '3.9' and python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/bb/ad/5d6702db60b1e40b41ef513b6967ff5848f307d50f8449baf1634f5908f1/cryptography-50.0.1.tar.gz", hash = "sha256:5dd9bda1c12b4162f6ff568eeb5e0ff956c28d14406e875cfe8a63a2d414ff20", size = 880381, upload-time = "2026-08-25T19:45:45.499Z" } wheels = [ @@ -2053,8 +2053,8 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "tinycss2", version = "1.4.0", source = { registry = "https://pypi.org/simple" } }, - { name = "webencodings", version = "0.5.1", source = { registry = "https://pypi.org/simple" } }, + { name = "tinycss2", version = "1.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "webencodings", version = "0.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/9f/86/fd7f58fc498b3166f3a7e8e0cddb6e620fe1da35b02248b1bd59e95dbaaa/cssselect2-0.8.0.tar.gz", hash = "sha256:7674ffb954a3b46162392aee2a3a0aedb2e14ecf99fcc28644900f4e6e3e9d3a", size = 35716, upload-time = "2025-03-05T14:46:07.988Z" } wheels = [ @@ -2071,8 +2071,8 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "tinycss2", version = "1.5.1", source = { registry = "https://pypi.org/simple" } }, - { name = "webencodings", version = "0.6.1", source = { registry = "https://pypi.org/simple" } }, + { name = "tinycss2", version = "1.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "webencodings", version = "0.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/06/00/2456b6b664c7a770989cbe3c352aac4eb962c938486f03a2e1255ae963c6/cssselect2-0.10.1.tar.gz", hash = "sha256:83b0d820ef589dabaf693289b647c2f5b410f76d285f56deba911ffa75a7b9d1", size = 35653, upload-time = "2026-08-31T21:57:42.59Z" } wheels = [ @@ -2231,8 +2231,8 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "pyparsing" }, - { name = "python-dateutil" }, + { name = "pyparsing", marker = "python_full_version < '3.10'" }, + { name = "python-dateutil", marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/7b/24/0a9053bea41c2860046416f3d136283233ce307adb218d406dede64a8fac/edtf-5.0.0.tar.gz", hash = "sha256:7393c570b4838c8cbc05b0687c6ea0578039ba007c8ce125206f44f18f2dea5d", size = 45617, upload-time = "2024-07-18T08:01:52.882Z" } wheels = [ @@ -2249,8 +2249,8 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "pyparsing" }, - { name = "python-dateutil" }, + { name = "pyparsing", marker = "python_full_version >= '3.10'" }, + { name = "python-dateutil", marker = "python_full_version >= '3.10'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/76/23/e9f69255f67f55b03e2705bfd7a579a01c26146b9ea98f9cdb07d8156b4d/edtf-5.0.1-py3-none-any.whl", hash = "sha256:d3ed8c1307330d7563ae9efc4193988acddeb60dcfb740d4fe0abe739ef0944a", size = 36776, upload-time = "2026-03-15T03:22:56.53Z" }, @@ -2310,7 +2310,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -2335,7 +2335,7 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "tzdata" }, + { name = "tzdata", marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/3d/84/e95acaa848b855e15c83331d0401ee5f84b2f60889255c2e055cb4fb6bdf/faker-37.12.0.tar.gz", hash = "sha256:7505e59a7e02fa9010f06c3e1e92f8250d4cfbb30632296140c2d6dbef09b0fa", size = 1935741, upload-time = "2025-10-24T15:19:58.764Z" } wheels = [ @@ -2352,7 +2352,7 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "tzdata", marker = "sys_platform == 'win32'" }, + { name = "tzdata", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f2/55/baeae0ecb04ef56c92d6ac1ef7b3b965af0502ac9863fc85db7afc0884fd/faker-40.38.0.tar.gz", hash = "sha256:72e421098664edf38478f4269a5d5a539337de5da18883ce67cb1e6bb96b0b3a", size = 2029190, upload-time = "2026-09-01T19:19:46.958Z" } wheels = [ @@ -2426,8 +2426,8 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "cachelib", version = "0.14.0", source = { registry = "https://pypi.org/simple" } }, - { name = "flask" }, + { name = "cachelib", version = "0.14.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "flask", marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e2/80/74846c8af58ed60972d64f23a6cd0c3ac0175677d7555dff9f51bf82c294/flask_caching-2.3.1.tar.gz", hash = "sha256:65d7fd1b4eebf810f844de7de6258254b3248296ee429bdcb3f741bcbf7b98c9", size = 67560, upload-time = "2025-02-23T01:34:40.207Z" } wheels = [ @@ -2442,8 +2442,8 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "cachelib", version = "0.14.0", source = { registry = "https://pypi.org/simple" } }, - { name = "flask" }, + { name = "cachelib", version = "0.14.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "flask", marker = "python_full_version == '3.10.*'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/89/15/d2852e86419c6c1416cba00c177b2cf609b5c2935372933684f84111c631/flask_caching-2.4.1.tar.gz", hash = "sha256:ecef4ca80b9cb1fa01d461373a0fce441527cd57eecee1aa71c1f6d750d7ff77", size = 165380, upload-time = "2026-07-08T19:23:57.264Z" } wheels = [ @@ -2459,8 +2459,8 @@ resolution-markers = [ "python_full_version >= '3.11' and python_full_version < '3.13'", ] dependencies = [ - { name = "cachelib", version = "0.17.0", source = { registry = "https://pypi.org/simple" } }, - { name = "flask" }, + { name = "cachelib", version = "0.17.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "flask", marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/dc/ce/a54552acb28bd0ac617703780e8f2344a4e5aee7a46936328fe7cf5b3a95/flask_caching-2.5.0.tar.gz", hash = "sha256:5a8779b54695f96e1b4a7a149dd8c6d863433ea66327cde4311ce7fd7b57391f", size = 218694, upload-time = "2026-08-24T18:52:01.459Z" } wheels = [ @@ -2549,11 +2549,11 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "flask" }, - { name = "limits", version = "4.2", source = { registry = "https://pypi.org/simple" } }, - { name = "ordered-set" }, - { name = "rich", version = "13.9.4", source = { registry = "https://pypi.org/simple" } }, - { name = "typing-extensions" }, + { name = "flask", marker = "python_full_version < '3.10'" }, + { name = "limits", version = "4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "ordered-set", marker = "python_full_version < '3.10'" }, + { name = "rich", version = "13.9.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "typing-extensions", marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/9c/a4/02f67783825a4207d4ae7de4c8be45596c3fba5b65ace77fd6dc3878020d/flask_limiter-3.11.0.tar.gz", hash = "sha256:57b037fb8be423ef7ebac4fbb279fbfdc42d9aa5378467ab6798d6ce3d912117", size = 303361, upload-time = "2025-03-11T20:37:59.839Z" } wheels = [ @@ -2570,10 +2570,10 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "flask" }, - { name = "limits", version = "5.8.0", source = { registry = "https://pypi.org/simple" } }, - { name = "ordered-set" }, - { name = "typing-extensions" }, + { name = "flask", marker = "python_full_version >= '3.10'" }, + { name = "limits", version = "5.8.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "ordered-set", marker = "python_full_version >= '3.10'" }, + { name = "typing-extensions", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/4e/98/71780be5d1afb941219c4b48d241d4e246e3062b017caa4e79c4dc71314c/flask_limiter-4.1.1.tar.gz", hash = "sha256:ca11608fc7eec43dcea606964ca07c3bd4ec1ae89043a0f67f717899a4f48106", size = 403198, upload-time = "2025-12-06T17:39:00.575Z" } wheels = [ @@ -2773,9 +2773,9 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "flask" }, - { name = "itsdangerous" }, - { name = "wtforms", version = "3.2.1", source = { registry = "https://pypi.org/simple" } }, + { name = "flask", marker = "python_full_version < '3.10'" }, + { name = "itsdangerous", marker = "python_full_version < '3.10'" }, + { name = "wtforms", version = "3.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/80/9b/f1cd6e41bbf874f3436368f2c7ee3216c1e82d666ff90d1d800e20eb1317/flask_wtf-1.2.2.tar.gz", hash = "sha256:79d2ee1e436cf570bccb7d916533fa18757a2f18c290accffab1b9a0b684666b", size = 42641, upload-time = "2024-10-24T07:18:58.555Z" } wheels = [ @@ -2792,9 +2792,9 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "flask" }, - { name = "itsdangerous" }, - { name = "wtforms", version = "3.2.2", source = { registry = "https://pypi.org/simple" } }, + { name = "flask", marker = "python_full_version >= '3.10'" }, + { name = "itsdangerous", marker = "python_full_version >= '3.10'" }, + { name = "wtforms", version = "3.2.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/91/f1/605a56d4ea217b307f3e6f4d663e0351253d85d841edc93ba559f0648e19/flask_wtf-1.3.0.tar.gz", hash = "sha256:61d5dabc50c3df885c297dcbd80810443a5d632106c8a69cab8ce740f0cdd7cc", size = 50414, upload-time = "2026-04-23T07:41:55.096Z" } wheels = [ @@ -2876,9 +2876,9 @@ wheels = [ [package.optional-dependencies] woff = [ - { name = "brotli", marker = "platform_python_implementation == 'CPython'" }, - { name = "brotlicffi", marker = "platform_python_implementation != 'CPython'" }, - { name = "zopfli" }, + { name = "brotli", marker = "python_full_version >= '3.10' and platform_python_implementation == 'CPython'" }, + { name = "brotlicffi", marker = "python_full_version >= '3.10' and platform_python_implementation != 'CPython'" }, + { name = "zopfli", marker = "python_full_version >= '3.10'" }, ] [[package]] @@ -3374,7 +3374,7 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "zipp", version = "3.23.1", source = { registry = "https://pypi.org/simple" } }, + { name = "zipp", version = "3.23.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f3/49/3b30cad09e7771a4982d9975a8cbf64f00d4a1ececb53297f1d9a7be1b10/importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", size = 57107, upload-time = "2025-12-21T10:00:19.278Z" } wheels = [ @@ -3391,7 +3391,7 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "zipp", version = "4.1.0", source = { registry = "https://pypi.org/simple" } }, + { name = "zipp", version = "4.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/6f/7e/1e7e8dc30634b93ebb3d58a3dea569ad146e656218d3960ab04f62047b29/importlib_metadata-9.0.1.tar.gz", hash = "sha256:ab830580bc0ef3db61ce8fae716389e5462b67e033018bab6d8f80ef17172f99", size = 59124, upload-time = "2026-08-28T15:30:34.646Z" } wheels = [ @@ -3407,7 +3407,7 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "zipp", version = "3.23.1", source = { registry = "https://pypi.org/simple" } }, + { name = "zipp", version = "3.23.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cf/8c/f834fbf984f691b4f7ff60f50b514cc3de5cc08abfc3295564dd89c5e2e7/importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c", size = 44693, upload-time = "2025-01-03T18:51:56.698Z" } wheels = [ @@ -4466,7 +4466,7 @@ wheels = [ [[package]] name = "invenio-vocabularies" -version = "14.3.2" +version = "14.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "invenio-administration" }, @@ -4481,9 +4481,9 @@ dependencies = [ { name = "regex", version = "2026.9.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "sparqlwrapper" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/75/45/2d77439e4c1b15a3d6a33d5112cdba0f8fdafcc1ecfde31d5472e365a486/invenio_vocabularies-14.3.2.tar.gz", hash = "sha256:3dec8f4858aadb79b81df9fb238c6f52b230150915ec998026e3efe30cb010de", size = 127262, upload-time = "2026-08-18T09:51:07.71Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e2/a8/cefdfb54cdf02c4f0501b9a5edfff6d8419512ce922c0eb1757d12669a31/invenio_vocabularies-14.5.0.tar.gz", hash = "sha256:45096e97a226ee08c3a5d94ee7625c7b74337dce366973290735a48f2cc88ee3", size = 127614, upload-time = "2026-10-02T06:51:43.144Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3e/10/edf299060f55f40faa5147a892c8897216908cdb54e9896ec09b3f7ff6ec/invenio_vocabularies-14.3.2-py3-none-any.whl", hash = "sha256:460dd9775eb9d94879eb2faafe6c13c71bab71005d262b6801ff6a5fa6cb1ab7", size = 333574, upload-time = "2026-08-18T09:51:06.486Z" }, + { url = "https://files.pythonhosted.org/packages/48/1a/283417f8b4b8d0ac7811a57a0b9a1b32c97395cf6ab6eef321687ab6e999/invenio_vocabularies-14.5.0-py3-none-any.whl", hash = "sha256:01e7e2ac644bab380a4eaa12dc83ad21ece5d7e58eaec5192618d6c3de664403", size = 333949, upload-time = "2026-10-02T06:51:41.442Z" }, ] [[package]] @@ -4523,17 +4523,17 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "decorator" }, - { name = "exceptiongroup" }, - { name = "jedi", version = "0.19.2", source = { registry = "https://pypi.org/simple" } }, - { name = "matplotlib-inline" }, - { name = "pexpect", marker = "sys_platform != 'win32'" }, - { name = "prompt-toolkit", version = "3.0.52", source = { registry = "https://pypi.org/simple" } }, - { name = "pygments" }, - { name = "stack-data" }, - { name = "traitlets", version = "5.15.1", source = { registry = "https://pypi.org/simple" } }, - { name = "typing-extensions" }, + { name = "colorama", marker = "python_full_version < '3.10' and sys_platform == 'win32'" }, + { name = "decorator", marker = "python_full_version < '3.10'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.10'" }, + { name = "jedi", version = "0.19.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "matplotlib-inline", marker = "python_full_version < '3.10'" }, + { name = "pexpect", marker = "python_full_version < '3.10' and sys_platform != 'win32'" }, + { name = "prompt-toolkit", version = "3.0.52", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "pygments", marker = "python_full_version < '3.10'" }, + { name = "stack-data", marker = "python_full_version < '3.10'" }, + { name = "traitlets", version = "5.15.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "typing-extensions", marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b1/b9/3ba6c45a6df813c09a48bac313c22ff83efa26cbb55011218d925a46e2ad/ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27", size = 5486330, upload-time = "2023-11-27T09:58:34.596Z" } wheels = [ @@ -4548,17 +4548,17 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "decorator" }, - { name = "exceptiongroup" }, - { name = "jedi", version = "0.20.0", source = { registry = "https://pypi.org/simple" } }, - { name = "matplotlib-inline" }, - { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, - { name = "prompt-toolkit", version = "3.0.53", source = { registry = "https://pypi.org/simple" } }, - { name = "pygments" }, - { name = "stack-data" }, - { name = "traitlets", version = "5.16.1", source = { registry = "https://pypi.org/simple" } }, - { name = "typing-extensions" }, + { name = "colorama", marker = "python_full_version == '3.10.*' and sys_platform == 'win32'" }, + { name = "decorator", marker = "python_full_version == '3.10.*'" }, + { name = "exceptiongroup", marker = "python_full_version == '3.10.*'" }, + { name = "jedi", version = "0.20.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "matplotlib-inline", marker = "python_full_version == '3.10.*'" }, + { name = "pexpect", marker = "python_full_version == '3.10.*' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit", version = "3.0.53", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "pygments", marker = "python_full_version == '3.10.*'" }, + { name = "stack-data", marker = "python_full_version == '3.10.*'" }, + { name = "traitlets", version = "5.16.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "typing-extensions", marker = "python_full_version == '3.10.*'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/40/18/f8598d287006885e7136451fdea0755af4ebcbfe342836f24deefaed1164/ipython-8.39.0.tar.gz", hash = "sha256:4110ae96012c379b8b6db898a07e186c40a2a1ef5d57a7fa83166047d9da7624", size = 5513971, upload-time = "2026-03-27T10:02:13.94Z" } wheels = [ @@ -4574,17 +4574,17 @@ resolution-markers = [ "python_full_version >= '3.11' and python_full_version < '3.13'", ] dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "ipython-pygments-lexers" }, - { name = "jedi", version = "0.20.0", source = { registry = "https://pypi.org/simple" } }, - { name = "matplotlib-inline" }, - { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, - { name = "prompt-toolkit", version = "3.0.53", source = { registry = "https://pypi.org/simple" } }, - { name = "psutil", marker = "sys_platform != 'cygwin' and sys_platform != 'emscripten'" }, - { name = "pygments" }, - { name = "stack-data" }, - { name = "traitlets", version = "5.16.1", source = { registry = "https://pypi.org/simple" } }, - { name = "typing-extensions", marker = "python_full_version < '3.12'" }, + { name = "colorama", marker = "python_full_version >= '3.11' and sys_platform == 'win32'" }, + { name = "ipython-pygments-lexers", marker = "python_full_version >= '3.11'" }, + { name = "jedi", version = "0.20.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "matplotlib-inline", marker = "python_full_version >= '3.11'" }, + { name = "pexpect", marker = "python_full_version >= '3.11' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit", version = "3.0.53", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "psutil", marker = "python_full_version >= '3.11' and sys_platform != 'cygwin' and sys_platform != 'emscripten'" }, + { name = "pygments", marker = "python_full_version >= '3.11'" }, + { name = "stack-data", marker = "python_full_version >= '3.11'" }, + { name = "traitlets", version = "5.16.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "typing-extensions", marker = "python_full_version == '3.11.*'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b9/32/99451b1283ec5d92ad77073f12e1c667dc10775384d8f15c2914207149dd/ipython-9.17.1.tar.gz", hash = "sha256:8919be8c27f20a6f4423145028063f6637b42a03ce57665bb12015ee1f073529", size = 4539289, upload-time = "2026-09-01T08:29:32.6Z" } wheels = [ @@ -4596,7 +4596,7 @@ name = "ipython-pygments-lexers" version = "1.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pygments" }, + { name = "pygments", marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" } wheels = [ @@ -4713,7 +4713,7 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "importlib-metadata", version = "8.7.1", source = { registry = "https://pypi.org/simple" } }, + { name = "importlib-metadata", version = "8.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/1e/82/fa43935523efdfcce6abbae9da7f372b627b27142c3419fcf13bf5b0c397/isort-6.1.0.tar.gz", hash = "sha256:9b8f96a14cfee0677e78e941ff62f03769a06d412aabb9e2a90487b3b7e8d481", size = 824325, upload-time = "2025-10-01T16:26:45.027Z" } wheels = [ @@ -4730,7 +4730,7 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "mypy-extensions" }, + { name = "mypy-extensions", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e6/43/067e17bfa10b6486b408d5294105ac894149a9abb94b338568b1f53a73c9/isort-9.0.1.tar.gz", hash = "sha256:ba23db109e3e93ef1999f7209a651214994cd807801addd16ac485982eb4edd7", size = 667724, upload-time = "2026-08-27T20:54:26.699Z" } wheels = [ @@ -4790,7 +4790,7 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "parso" }, + { name = "parso", marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload-time = "2024-11-11T01:41:42.873Z" } wheels = [ @@ -4807,7 +4807,7 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "parso" }, + { name = "parso", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/46/b7/a3635f6a2d7cf5b5dd98064fc1d5fbbafcb25477bcea204a3a92145d158b/jedi-0.20.0.tar.gz", hash = "sha256:c3f4ccbd276696f4b19c54618d4fb18f9fc24b0aef02acf704b23f487daa1011", size = 3119416, upload-time = "2026-05-01T23:38:47.814Z" } wheels = [ @@ -4913,10 +4913,10 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "attrs" }, - { name = "jsonschema-specifications" }, - { name = "referencing", version = "0.36.2", source = { registry = "https://pypi.org/simple" } }, - { name = "rpds-py", version = "0.27.1", source = { registry = "https://pypi.org/simple" } }, + { name = "attrs", marker = "python_full_version < '3.10'" }, + { name = "jsonschema-specifications", marker = "python_full_version < '3.10'" }, + { name = "referencing", version = "0.36.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "rpds-py", version = "0.27.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/74/69/f7185de793a29082a9f3c7728268ffb31cb5095131a9c139a74078e27336/jsonschema-4.25.1.tar.gz", hash = "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85", size = 357342, upload-time = "2025-08-18T17:03:50.038Z" } wheels = [ @@ -4933,10 +4933,10 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "attrs" }, - { name = "jsonschema-specifications" }, - { name = "referencing", version = "0.37.0", source = { registry = "https://pypi.org/simple" } }, - { name = "rpds-py", version = "0.30.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "attrs", marker = "python_full_version >= '3.10'" }, + { name = "jsonschema-specifications", marker = "python_full_version >= '3.10'" }, + { name = "referencing", version = "0.37.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "rpds-py", version = "0.30.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, { name = "rpds-py", version = "2026.6.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } @@ -5001,12 +5001,12 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "importlib-metadata", version = "8.7.1", source = { registry = "https://pypi.org/simple" } }, - { name = "jupyter-core", version = "5.8.1", source = { registry = "https://pypi.org/simple" } }, - { name = "python-dateutil" }, - { name = "pyzmq" }, - { name = "tornado" }, - { name = "traitlets", version = "5.15.1", source = { registry = "https://pypi.org/simple" } }, + { name = "importlib-metadata", version = "8.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "jupyter-core", version = "5.8.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "python-dateutil", marker = "python_full_version < '3.10'" }, + { name = "pyzmq", marker = "python_full_version < '3.10'" }, + { name = "tornado", marker = "python_full_version < '3.10'" }, + { name = "traitlets", version = "5.15.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019, upload-time = "2024-09-17T10:44:17.613Z" } wheels = [ @@ -5023,12 +5023,12 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "jupyter-core", version = "5.9.1", source = { registry = "https://pypi.org/simple" } }, - { name = "python-dateutil" }, - { name = "pyzmq" }, - { name = "tornado" }, - { name = "traitlets", version = "5.16.1", source = { registry = "https://pypi.org/simple" } }, - { name = "typing-extensions" }, + { name = "jupyter-core", version = "5.9.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "python-dateutil", marker = "python_full_version >= '3.10'" }, + { name = "pyzmq", marker = "python_full_version >= '3.10'" }, + { name = "tornado", marker = "python_full_version >= '3.10'" }, + { name = "traitlets", version = "5.16.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "typing-extensions", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c5/2a/906772148a06e48885039e0250c340b770a55bbf37b08d6ee0449df369c3/jupyter_client-8.10.0.tar.gz", hash = "sha256:9f7116294dca55f1785be880057d44544db9b1567718d92cb33c58886afb9497", size = 360653, upload-time = "2026-08-28T12:17:10.854Z" } wheels = [ @@ -5044,9 +5044,9 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "platformdirs", version = "4.4.0", source = { registry = "https://pypi.org/simple" } }, - { name = "pywin32", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, - { name = "traitlets", version = "5.15.1", source = { registry = "https://pypi.org/simple" } }, + { name = "platformdirs", version = "4.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "pywin32", marker = "python_full_version < '3.10' and platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, + { name = "traitlets", version = "5.15.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/99/1b/72906d554acfeb588332eaaa6f61577705e9ec752ddb486f302dafa292d9/jupyter_core-5.8.1.tar.gz", hash = "sha256:0a5f9706f70e64786b75acba995988915ebd4601c8a52e534a40b51c95f59941", size = 88923, upload-time = "2025-05-27T07:38:16.655Z" } wheels = [ @@ -5063,8 +5063,8 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "platformdirs", version = "4.11.7", source = { registry = "https://pypi.org/simple" } }, - { name = "traitlets", version = "5.16.1", source = { registry = "https://pypi.org/simple" } }, + { name = "platformdirs", version = "4.11.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "traitlets", version = "5.16.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/02/49/9d1284d0dc65e2c757b74c6687b6d319b02f822ad039e5c512df9194d9dd/jupyter_core-5.9.1.tar.gz", hash = "sha256:4d09aaff303b9566c3ce657f580bd089ff5c91f5f89cf7d8846c3cdf465b5508", size = 89814, upload-time = "2025-10-16T19:19:18.444Z" } wheels = [ @@ -5132,9 +5132,9 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "deprecated" }, - { name = "packaging", version = "24.2", source = { registry = "https://pypi.org/simple" } }, - { name = "typing-extensions" }, + { name = "deprecated", marker = "python_full_version < '3.10'" }, + { name = "packaging", version = "24.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "typing-extensions", marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/7b/54/f73e4810332f500b46b3fbf01d3258e0cbf1508d1be8d2438a1e174208c3/limits-4.2.tar.gz", hash = "sha256:d602ceae5d6b71063d5f9338904e32d569efaa84a7dd0399cde7ca6ff1a8fc9b", size = 85710, upload-time = "2025-03-11T18:55:13.637Z" } wheels = [ @@ -5151,9 +5151,9 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "deprecated" }, - { name = "packaging", version = "26.3", source = { registry = "https://pypi.org/simple" } }, - { name = "typing-extensions" }, + { name = "deprecated", marker = "python_full_version >= '3.10'" }, + { name = "packaging", version = "26.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "typing-extensions", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/71/69/826a5d1f45426c68d8f6539f8d275c0e4fcaa57f0c017ec3100986558a41/limits-5.8.0.tar.gz", hash = "sha256:c9e0d74aed837e8f6f50d1fcebcf5fd8130957287206bc3799adaee5092655da", size = 226104, upload-time = "2026-02-05T07:17:35.859Z" } wheels = [ @@ -5369,7 +5369,7 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "markupsafe" }, + { name = "markupsafe", marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/00/62/791b31e69ae182791ec67f04850f2f062716bbd205483d63a215f3e062d3/mako-1.3.12.tar.gz", hash = "sha256:9f778e93289bd410bb35daadeb4fc66d95a746f0b75777b942088b7fd7af550a", size = 400219, upload-time = "2026-04-28T19:01:08.512Z" } wheels = [ @@ -5386,7 +5386,7 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "markupsafe" }, + { name = "markupsafe", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/2a/12/b5fa2353e2754cd67fb9f83793fa48ff42c213a5da7e719869d2301f6ab8/mako-1.4.1.tar.gz", hash = "sha256:d7904710b662996425a21627710c4777c45053146942cf8a7aebf757c92b8c27", size = 410165, upload-time = "2026-08-05T06:10:56.611Z" } wheels = [ @@ -5402,7 +5402,7 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "mdurl" }, + { name = "mdurl", marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload-time = "2023-06-03T06:41:14.443Z" } wheels = [ @@ -5419,7 +5419,7 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "mdurl" }, + { name = "mdurl", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } wheels = [ @@ -6174,7 +6174,7 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version == '3.10.*'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ed/6b/c3b4bdf39cd427143939a6f4ad012575e76c78755ceb88c0587899c598df/nameparser-1.4.0.tar.gz", hash = "sha256:a5b9105de7b879909656b6954e7066f06bc7a743a6e6771b19465b0bbbe6a4cf", size = 103018, upload-time = "2026-07-12T19:33:56.835Z" } wheels = [ @@ -6190,10 +6190,10 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "jupyter-client", version = "8.6.3", source = { registry = "https://pypi.org/simple" } }, - { name = "jupyter-core", version = "5.8.1", source = { registry = "https://pypi.org/simple" } }, - { name = "nbformat", version = "5.10.4", source = { registry = "https://pypi.org/simple" } }, - { name = "traitlets", version = "5.15.1", source = { registry = "https://pypi.org/simple" } }, + { name = "jupyter-client", version = "8.6.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "jupyter-core", version = "5.8.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "nbformat", version = "5.10.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "traitlets", version = "5.15.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/87/66/7ffd18d58eae90d5721f9f39212327695b749e23ad44b3881744eaf4d9e8/nbclient-0.10.2.tar.gz", hash = "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193", size = 62424, upload-time = "2024-12-19T10:32:27.164Z" } wheels = [ @@ -6210,10 +6210,10 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "jupyter-client", version = "8.10.0", source = { registry = "https://pypi.org/simple" } }, - { name = "jupyter-core", version = "5.9.1", source = { registry = "https://pypi.org/simple" } }, - { name = "nbformat", version = "5.11.1", source = { registry = "https://pypi.org/simple" } }, - { name = "traitlets", version = "5.16.1", source = { registry = "https://pypi.org/simple" } }, + { name = "jupyter-client", version = "8.10.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "jupyter-core", version = "5.9.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "nbformat", version = "5.11.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "traitlets", version = "5.16.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/28/a5/b3bae4b590c0cbcada2c63a34f7580024e834a8ba213e949a2f906705787/nbclient-0.11.0.tar.gz", hash = "sha256:04a134a5b087f2c5887f228aca155db50169b8cd9334dee6942c8e927e56081a", size = 62535, upload-time = "2026-06-05T07:52:41.746Z" } wheels = [ @@ -6261,10 +6261,10 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "fastjsonschema" }, - { name = "jsonschema", version = "4.25.1", source = { registry = "https://pypi.org/simple" } }, - { name = "jupyter-core", version = "5.8.1", source = { registry = "https://pypi.org/simple" } }, - { name = "traitlets", version = "5.15.1", source = { registry = "https://pypi.org/simple" } }, + { name = "fastjsonschema", marker = "python_full_version < '3.10'" }, + { name = "jsonschema", version = "4.25.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "jupyter-core", version = "5.8.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "traitlets", version = "5.15.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749, upload-time = "2024-04-04T11:20:37.371Z" } wheels = [ @@ -6281,10 +6281,10 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "fastjsonschema" }, - { name = "jsonschema", version = "4.26.0", source = { registry = "https://pypi.org/simple" } }, - { name = "jupyter-core", version = "5.9.1", source = { registry = "https://pypi.org/simple" } }, - { name = "traitlets", version = "5.16.1", source = { registry = "https://pypi.org/simple" } }, + { name = "fastjsonschema", marker = "python_full_version >= '3.10'" }, + { name = "jsonschema", version = "4.26.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "jupyter-core", version = "5.9.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "traitlets", version = "5.16.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/31/72/b3446efab8756e7df4b8ec587f8e611cb5a7249e4323db480802f1d3be04/nbformat-5.11.1.tar.gz", hash = "sha256:32d4521c68c6e7d5b29c76defaeed9f42ea733142b9b19f88277ce10390b9c4d", size = 147775, upload-time = "2026-08-17T08:10:51.942Z" } wheels = [ @@ -6654,10 +6654,10 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "deprecated" }, - { name = "lxml" }, - { name = "packaging", version = "24.2", source = { registry = "https://pypi.org/simple" } }, - { name = "pillow", version = "11.3.0", source = { registry = "https://pypi.org/simple" } }, + { name = "deprecated", marker = "python_full_version < '3.10'" }, + { name = "lxml", marker = "python_full_version < '3.10'" }, + { name = "packaging", version = "24.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "pillow", version = "11.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f5/4c/62b37a3ee301c245be6ad269ca771c2c5298bf049366e1094cfdf80d850c/pikepdf-9.11.0.tar.gz", hash = "sha256:5ad6bffba08849c21eee273ba0b6fcd4b6a9cff81bcbca6988f87a765ba62163", size = 4546289, upload-time = "2025-09-12T07:15:11.096Z" } wheels = [ @@ -6715,9 +6715,9 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "lxml" }, - { name = "packaging", version = "26.3", source = { registry = "https://pypi.org/simple" } }, - { name = "pillow", version = "12.3.0", source = { registry = "https://pypi.org/simple" } }, + { name = "lxml", marker = "python_full_version >= '3.10'" }, + { name = "packaging", version = "26.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pillow", version = "12.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/1e/d4/f4383bb3ac90cb322cb340cd4253bfc19f80819a97d61a49077ab3a0581e/pikepdf-10.12.0.tar.gz", hash = "sha256:cbc790243a333a2c87bb4c1a69e3d7036b4a7f43c7fafc8ec7cee06985b48ae9", size = 4950459, upload-time = "2026-08-17T22:35:00.878Z" } wheels = [ @@ -7044,7 +7044,7 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "wcwidth" }, + { name = "wcwidth", marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload-time = "2025-08-27T15:24:02.057Z" } wheels = [ @@ -7061,7 +7061,7 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "wcwidth" }, + { name = "wcwidth", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/7d/ea/39b988c938f75cb75d7045b5c69f8bfed47ee2152c8837fb403de29d6fb8/prompt_toolkit-3.0.53.tar.gz", hash = "sha256:9ec8a0ad96d5c56148b3f914aa79c1564c3fde5d2e6b876e7bc327e353cf8fa6", size = 435492, upload-time = "2026-07-26T20:56:14.758Z" } wheels = [ @@ -7371,8 +7371,8 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "typing-extensions" }, - { name = "tzdata", marker = "sys_platform == 'win32'" }, + { name = "typing-extensions", marker = "python_full_version < '3.10'" }, + { name = "tzdata", marker = "python_full_version < '3.10' and sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/44/05/d4a05988f15fcf90e0088c735b1f2fc04a30b7fc65461d6ec278f5f2f17a/psycopg-3.2.13.tar.gz", hash = "sha256:309adaeda61d44556046ec9a83a93f42bbe5310120b1995f3af49ab6d9f13c1d", size = 160626, upload-time = "2025-11-21T22:34:32.328Z" } wheels = [ @@ -7381,7 +7381,7 @@ wheels = [ [package.optional-dependencies] binary = [ - { name = "psycopg-binary", version = "3.2.13", source = { registry = "https://pypi.org/simple" }, marker = "implementation_name != 'pypy'" }, + { name = "psycopg-binary", version = "3.2.13", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10' and implementation_name != 'pypy'" }, ] [[package]] @@ -7394,8 +7394,8 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, - { name = "tzdata", marker = "sys_platform == 'win32'" }, + { name = "typing-extensions", marker = "python_full_version >= '3.10' and python_full_version < '3.13'" }, + { name = "tzdata", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/72/73/8fb739d0f6bba247b9b93c9840c402a4f88545be5f1d4b02b23366371c00/psycopg-3.3.5.tar.gz", hash = "sha256:d0a3d9ccf5788af054cbd745278cb02401b5c312aeaafbf2c6144460aec47da4", size = 166508, upload-time = "2026-08-31T22:45:43.151Z" } wheels = [ @@ -7404,7 +7404,7 @@ wheels = [ [package.optional-dependencies] binary = [ - { name = "psycopg-binary", version = "3.3.5", source = { registry = "https://pypi.org/simple" }, marker = "implementation_name != 'pypy'" }, + { name = "psycopg-binary", version = "3.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and implementation_name != 'pypy'" }, ] [[package]] @@ -7952,7 +7952,7 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "pytest" }, + { name = "pytest", marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/39/d4/c54ee6a871eee4a7468e3a8c0dead28e634c0bc2110c694309dcb7563a66/pytest_github_actions_annotate_failures-0.3.0.tar.gz", hash = "sha256:d4c3177c98046c3900a7f8ddebb22ea54b9f6822201b5d3ab8fcdea51e010db7", size = 11248, upload-time = "2025-01-17T22:39:32.722Z" } wheels = [ @@ -7969,7 +7969,7 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "pytest" }, + { name = "pytest", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/00/a0/bdb91581b03c41016c78e16b8ec36c34d8508206fcb30f1951c9cdff2e97/pytest_github_actions_annotate_failures-0.4.2.tar.gz", hash = "sha256:5dd18304512361788bc7b5c5c805db853f03f4950c6be09b088de6bab8e2e6c9", size = 12158, upload-time = "2026-06-19T15:59:17.445Z" } wheels = [ @@ -8321,7 +8321,7 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "async-timeout" }, + { name = "async-timeout", marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/57/8f/f125feec0b958e8d22c8f0b492b30b1991d9499a4315dfde466cf4289edc/redis-7.0.1.tar.gz", hash = "sha256:c949df947dca995dc68fdf5a7863950bf6df24f8d6022394585acc98e81624f1", size = 4755322, upload-time = "2025-10-27T14:34:00.33Z" } wheels = [ @@ -8338,7 +8338,7 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "async-timeout", marker = "python_full_version < '3.11.3'" }, + { name = "async-timeout", marker = "python_full_version >= '3.10' and python_full_version < '3.11.3'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a8/99/604f0b666d4c616d891cf77ebb9db6bb21601344c051aebf1b72b9ff915f/redis-8.1.0.tar.gz", hash = "sha256:6e1a19beef9225c83efd689c7e6b7da2d5215b1f42cd13b7fc3714d0a09c7b25", size = 5254356, upload-time = "2026-07-30T08:51:00.269Z" } wheels = [ @@ -8354,9 +8354,9 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "attrs" }, - { name = "rpds-py", version = "0.27.1", source = { registry = "https://pypi.org/simple" } }, - { name = "typing-extensions" }, + { name = "attrs", marker = "python_full_version < '3.10'" }, + { name = "rpds-py", version = "0.27.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "typing-extensions", marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744, upload-time = "2025-01-25T08:48:16.138Z" } wheels = [ @@ -8373,10 +8373,10 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "attrs" }, - { name = "rpds-py", version = "0.30.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "attrs", marker = "python_full_version >= '3.10'" }, + { name = "rpds-py", version = "0.30.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, { name = "rpds-py", version = "2026.6.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version >= '3.10' and python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } wheels = [ @@ -8676,10 +8676,10 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "certifi" }, - { name = "charset-normalizer" }, - { name = "idna" }, - { name = "urllib3", version = "1.26.20", source = { registry = "https://pypi.org/simple" } }, + { name = "certifi", marker = "python_full_version < '3.10'" }, + { name = "charset-normalizer", marker = "python_full_version < '3.10'" }, + { name = "idna", marker = "python_full_version < '3.10'" }, + { name = "urllib3", version = "1.26.20", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } wheels = [ @@ -8696,10 +8696,10 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "certifi" }, - { name = "charset-normalizer" }, - { name = "idna" }, - { name = "urllib3", version = "2.7.0", source = { registry = "https://pypi.org/simple" } }, + { name = "certifi", marker = "python_full_version >= '3.10'" }, + { name = "charset-normalizer", marker = "python_full_version >= '3.10'" }, + { name = "idna", marker = "python_full_version >= '3.10'" }, + { name = "urllib3", version = "2.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } wheels = [ @@ -8758,9 +8758,9 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" } }, - { name = "pygments" }, - { name = "typing-extensions" }, + { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "pygments", marker = "python_full_version < '3.10'" }, + { name = "typing-extensions", marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149, upload-time = "2024-11-01T16:43:57.873Z" } wheels = [ @@ -8777,8 +8777,8 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "markdown-it-py", version = "4.2.0", source = { registry = "https://pypi.org/simple" } }, - { name = "pygments" }, + { name = "markdown-it-py", version = "4.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pygments", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } wheels = [ @@ -9229,9 +9229,9 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "aiobotocore", version = "2.26.0", source = { registry = "https://pypi.org/simple" } }, - { name = "aiohttp", version = "3.13.5", source = { registry = "https://pypi.org/simple" } }, - { name = "fsspec", version = "2025.10.0", source = { registry = "https://pypi.org/simple" } }, + { name = "aiobotocore", version = "2.26.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "aiohttp", version = "3.13.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "fsspec", version = "2025.10.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/bb/ee/7cf7de3b17ef6db10b027cc9f8a1108ceb6333e267943e666a35882b1474/s3fs-2025.10.0.tar.gz", hash = "sha256:e8be6cddc77aceea1681ece0f472c3a7f8ef71a0d2acddb1cc92bb6afa3e9e4f", size = 80383, upload-time = "2025-10-30T15:06:04.647Z" } wheels = [ @@ -9248,9 +9248,9 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "aiobotocore", version = "3.9.0", source = { registry = "https://pypi.org/simple" } }, - { name = "aiohttp", version = "3.14.3", source = { registry = "https://pypi.org/simple" } }, - { name = "fsspec", version = "2026.7.0", source = { registry = "https://pypi.org/simple" } }, + { name = "aiobotocore", version = "3.9.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "aiohttp", version = "3.14.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "fsspec", version = "2026.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/12/60/69fc080b72a32971b2fb5acbc80802b0e876b606f6e27b1689caac4bb57b/s3fs-2026.7.0.tar.gz", hash = "sha256:76b062d1b2bc7bf4bcd9e7d8f1eb2b5dd9d5cee96ce888664c4ddb5f563146bf", size = 87595, upload-time = "2026-07-28T17:14:10.595Z" } wheels = [ @@ -9266,12 +9266,12 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "certifi" }, - { name = "trio", version = "0.31.0", source = { registry = "https://pypi.org/simple" } }, - { name = "trio-websocket" }, - { name = "typing-extensions" }, - { name = "urllib3", version = "1.26.20", source = { registry = "https://pypi.org/simple" }, extra = ["socks"] }, - { name = "websocket-client", version = "1.9.0", source = { registry = "https://pypi.org/simple" } }, + { name = "certifi", marker = "python_full_version < '3.10'" }, + { name = "trio", version = "0.31.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "trio-websocket", marker = "python_full_version < '3.10'" }, + { name = "typing-extensions", marker = "python_full_version < '3.10'" }, + { name = "urllib3", version = "1.26.20", source = { registry = "https://pypi.org/simple" }, extra = ["socks"], marker = "python_full_version < '3.10'" }, + { name = "websocket-client", version = "1.9.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/54/2d/fafffe946099033ccf22bf89e12eede14c1d3c5936110c5f6f2b9830722c/selenium-4.32.0.tar.gz", hash = "sha256:b9509bef4056f4083772abb1ae19ff57247d617a29255384b26be6956615b206", size = 870997, upload-time = "2025-05-02T20:35:27.325Z" } wheels = [ @@ -9288,12 +9288,12 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "certifi" }, - { name = "trio", version = "0.34.0", source = { registry = "https://pypi.org/simple" } }, - { name = "trio-websocket" }, - { name = "typing-extensions" }, - { name = "urllib3", version = "2.7.0", source = { registry = "https://pypi.org/simple" }, extra = ["socks"] }, - { name = "websocket-client", version = "1.9.2", source = { registry = "https://pypi.org/simple" } }, + { name = "certifi", marker = "python_full_version >= '3.10'" }, + { name = "trio", version = "0.34.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "trio-websocket", marker = "python_full_version >= '3.10'" }, + { name = "typing-extensions", marker = "python_full_version >= '3.10'" }, + { name = "urllib3", version = "2.7.0", source = { registry = "https://pypi.org/simple" }, extra = ["socks"], marker = "python_full_version >= '3.10'" }, + { name = "websocket-client", version = "1.9.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/7f/8c/db97bdc1a8b41e7b6bf9d3099722ed8e7ac61328af8637f20004015c642b/selenium-4.48.0.tar.gz", hash = "sha256:045c1ec054c94e3be6c10febc509aa513b4c05e9146d1a9cf3de5375ec6ca2a1", size = 1055269, upload-time = "2026-08-27T20:05:51.235Z" } wheels = [ @@ -9726,7 +9726,7 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "webencodings", version = "0.5.1", source = { registry = "https://pypi.org/simple" } }, + { name = "webencodings", version = "0.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085, upload-time = "2024-10-24T14:58:29.895Z" } wheels = [ @@ -9743,7 +9743,7 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "webencodings", version = "0.6.1", source = { registry = "https://pypi.org/simple" } }, + { name = "webencodings", version = "0.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a3/ae/2ca4913e5c0f09781d75482874c3a95db9105462a92ddd303c7d285d3df2/tinycss2-1.5.1.tar.gz", hash = "sha256:d339d2b616ba90ccce58da8495a78f46e55d4d25f9fd71dfd526f07e7d53f957", size = 88195, upload-time = "2025-11-23T10:29:10.082Z" } wheels = [ @@ -9755,7 +9755,7 @@ name = "tinyhtml5" version = "2.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "webencodings", version = "0.6.1", source = { registry = "https://pypi.org/simple" } }, + { name = "webencodings", version = "0.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b1/1f/cfe2f6b30557c92b3f31d41707e09cef5c1efbd87392bc6c0430c46b0e4d/tinyhtml5-2.1.0.tar.gz", hash = "sha256:60a50ec3d938a37e491efa01af895853060943dcebb5627de5b10d188b338a67", size = 179242, upload-time = "2026-03-05T17:06:30.704Z" } wheels = [ @@ -9869,13 +9869,13 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "attrs" }, - { name = "cffi", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "implementation_name != 'pypy' and os_name == 'nt'" }, - { name = "exceptiongroup" }, - { name = "idna" }, - { name = "outcome" }, - { name = "sniffio" }, - { name = "sortedcontainers" }, + { name = "attrs", marker = "python_full_version < '3.10'" }, + { name = "cffi", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10' and implementation_name != 'pypy' and os_name == 'nt'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.10'" }, + { name = "idna", marker = "python_full_version < '3.10'" }, + { name = "outcome", marker = "python_full_version < '3.10'" }, + { name = "sniffio", marker = "python_full_version < '3.10'" }, + { name = "sortedcontainers", marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/76/8f/c6e36dd11201e2a565977d8b13f0b027ba4593c1a80bed5185489178e257/trio-0.31.0.tar.gz", hash = "sha256:f71d551ccaa79d0cb73017a33ef3264fde8335728eb4c6391451fe5d253a9d5b", size = 605825, upload-time = "2025-09-09T15:17:15.242Z" } wheels = [ @@ -9892,13 +9892,13 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "attrs" }, - { name = "cffi", version = "2.1.1", source = { registry = "https://pypi.org/simple" }, marker = "implementation_name != 'pypy' and os_name == 'nt'" }, - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, - { name = "idna" }, - { name = "outcome" }, - { name = "sniffio" }, - { name = "sortedcontainers" }, + { name = "attrs", marker = "python_full_version >= '3.10'" }, + { name = "cffi", version = "2.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and implementation_name != 'pypy' and os_name == 'nt'" }, + { name = "exceptiongroup", marker = "python_full_version == '3.10.*'" }, + { name = "idna", marker = "python_full_version >= '3.10'" }, + { name = "outcome", marker = "python_full_version >= '3.10'" }, + { name = "sniffio", marker = "python_full_version >= '3.10'" }, + { name = "sortedcontainers", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/92/dc/a2d25ed73ad49cfd79bf18d262577c3731c98e382284e28d522f49a0df35/trio-0.34.0.tar.gz", hash = "sha256:63b9485408bdfdde544fced107045a8c0086cdc4bd0ef2f797b9e0dd111b964b", size = 607457, upload-time = "2026-08-11T00:33:42.198Z" } wheels = [ @@ -9949,7 +9949,7 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "tzdata", marker = "sys_platform == 'win32'" }, + { name = "tzdata", marker = "python_full_version < '3.10' and sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/8b/2e/c14812d3d4d9cd1773c6be938f89e5735a1f11a9f184ac3639b93cef35d5/tzlocal-5.3.1.tar.gz", hash = "sha256:cceffc7edecefea1f595541dbd6e990cb1ea3d19bf01b2809f362a03dd7921fd", size = 30761, upload-time = "2025-03-05T21:17:41.549Z" } wheels = [ @@ -9966,7 +9966,7 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "tzdata", marker = "sys_platform == 'win32'" }, + { name = "tzdata", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/81/5b/879b2f932adfa7a053c360d50bc896c977fa6426109185f7c12ebdd0cb9d/tzlocal-5.4.4.tar.gz", hash = "sha256:8dbb8660838688a7b6ba4fed31d18dedf842afb4d47ca050d6d891c2c15f3be4", size = 31170, upload-time = "2026-06-29T08:03:40.026Z" } wheels = [ @@ -9982,7 +9982,7 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "ua-parser-builtins", version = "0.18.0.post1", source = { registry = "https://pypi.org/simple" } }, + { name = "ua-parser-builtins", version = "0.18.0.post1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/70/0e/ed98be735bc89d5040e0c60f5620d0b8c04e9e7da99ed1459e8050e90a77/ua_parser-1.0.1.tar.gz", hash = "sha256:f9d92bf19d4329019cef91707aecc23c6d65143ad7e29a233f0580fb0d15547d", size = 728106, upload-time = "2025-02-01T14:13:32.508Z" } wheels = [ @@ -9999,7 +9999,7 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "ua-parser-builtins", version = "202606", source = { registry = "https://pypi.org/simple" } }, + { name = "ua-parser-builtins", version = "202606", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/90/98/5e4b52d772a048af122a6fc5ce365c311efb9f5e79c55fd4fdd7c9f59e83/ua_parser-1.0.2.tar.gz", hash = "sha256:bab404ad42fb37f943107da2f6003ffc79724d11cc95076a7a539513371779da", size = 33239, upload-time = "2026-04-05T20:14:28.229Z" } wheels = [ @@ -10082,7 +10082,7 @@ wheels = [ [package.optional-dependencies] socks = [ - { name = "pysocks" }, + { name = "pysocks", marker = "python_full_version < '3.10'" }, ] [[package]] @@ -10101,7 +10101,7 @@ wheels = [ [package.optional-dependencies] socks = [ - { name = "pysocks" }, + { name = "pysocks", marker = "python_full_version >= '3.10'" }, ] [[package]] @@ -10203,14 +10203,14 @@ name = "weasyprint" version = "69.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cffi", version = "2.1.1", source = { registry = "https://pypi.org/simple" } }, - { name = "cssselect2", version = "0.10.1", source = { registry = "https://pypi.org/simple" } }, - { name = "fonttools", extra = ["woff"] }, - { name = "pillow", version = "12.3.0", source = { registry = "https://pypi.org/simple" } }, - { name = "pydyf" }, - { name = "pyphen" }, - { name = "tinycss2", version = "1.5.1", source = { registry = "https://pypi.org/simple" } }, - { name = "tinyhtml5" }, + { name = "cffi", version = "2.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "cssselect2", version = "0.10.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "fonttools", extra = ["woff"], marker = "python_full_version >= '3.10'" }, + { name = "pillow", version = "12.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pydyf", marker = "python_full_version >= '3.10'" }, + { name = "pyphen", marker = "python_full_version >= '3.10'" }, + { name = "tinycss2", version = "1.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "tinyhtml5", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/59/53/dcc3885c2f7a47faa45f6b8b801412f5f9e055173a52801ef01c09943c5a/weasyprint-69.0.tar.gz", hash = "sha256:a7a32f39ca16bd82ef11de99c92ea4b5f14951c9033af035e451ce4f4ee0a88c", size = 1549834, upload-time = "2026-06-02T14:42:17.765Z" } wheels = [ @@ -10503,7 +10503,7 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "h11" }, + { name = "h11", marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c9/4a/44d3c295350d776427904d73c189e10aeae66d7f555bb2feee16d1e4ba5a/wsproto-1.2.0.tar.gz", hash = "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065", size = 53425, upload-time = "2022-08-23T19:58:21.447Z" } wheels = [ @@ -10520,7 +10520,7 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "h11" }, + { name = "h11", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c7/79/12135bdf8b9c9367b8701c2c19a14c913c120b882d50b014ca0d38083c2c/wsproto-1.3.2.tar.gz", hash = "sha256:b86885dcf294e15204919950f666e06ffc6c7c114ca900b060d6e16293528294", size = 50116, upload-time = "2025-11-20T18:18:01.871Z" } wheels = [ @@ -10536,7 +10536,7 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "markupsafe" }, + { name = "markupsafe", marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/01/e4/633d080897e769ed5712dcfad626e55dbd6cf45db0ff4d9884315c6a82da/wtforms-3.2.1.tar.gz", hash = "sha256:df3e6b70f3192e92623128123ec8dca3067df9cfadd43d59681e210cfb8d4682", size = 137801, upload-time = "2024-10-21T11:34:00.108Z" } wheels = [ @@ -10553,7 +10553,7 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "markupsafe" }, + { name = "markupsafe", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e9/91/ed9b517da898e3fb747566aa3c12a734bd64ea7449a0d25ec74ce8f8b8eb/wtforms-3.2.2.tar.gz", hash = "sha256:7b00c73f8670f35d4edb0293dcd81b980528bee72fd662b182aaba27ae570b93", size = 139583, upload-time = "2026-05-03T05:53:44.147Z" } wheels = [ @@ -10601,7 +10601,7 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "elementpath", version = "5.0.4", source = { registry = "https://pypi.org/simple" } }, + { name = "elementpath", version = "5.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/84/f8/33b43a53503d0892e7555d16c593cf001d5aaa5b0ad7d53c68098235805b/xmlschema-4.2.0.tar.gz", hash = "sha256:b1f88c53493b2e75471977cbf218d939b872d0c7046bb63d48cc219fa7e241b9", size = 643756, upload-time = "2025-10-14T09:19:32.253Z" } wheels = [ @@ -10618,7 +10618,7 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "elementpath", version = "5.1.4", source = { registry = "https://pypi.org/simple" } }, + { name = "elementpath", version = "5.1.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/55/f0/2431c2c8f77326757f2e2b1d79226c17b2abfe44a78a41c7d7b944e90732/xmlschema-4.3.2.tar.gz", hash = "sha256:f3b33a21a2b2cdc404ddc3fb599d8bc1dee90b155d547370672e6e684746b8d6", size = 682724, upload-time = "2026-06-30T06:11:50.744Z" } wheels = [ @@ -10643,8 +10643,8 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "isal", marker = "platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'x86_64'" }, - { name = "zlib-ng", marker = "platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'x86_64'" }, + { name = "isal", marker = "(python_full_version < '3.10' and platform_machine == 'AMD64') or (python_full_version < '3.10' and platform_machine == 'aarch64') or (python_full_version < '3.10' and platform_machine == 'x86_64')" }, + { name = "zlib-ng", marker = "(python_full_version < '3.10' and platform_machine == 'AMD64') or (python_full_version < '3.10' and platform_machine == 'aarch64') or (python_full_version < '3.10' and platform_machine == 'x86_64')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/47/01/0abf3e42bb1bf15ce24e4b235b1274e0c3c9ba8e3bbf2300b6323e6f50c1/xopen-2.0.2.tar.gz", hash = "sha256:f19d83de470f5a81725df0140180ec71d198311a1d7dad48f5467b4ad5df6154", size = 32224, upload-time = "2024-06-12T05:19:11.513Z" } wheels = [ @@ -10661,9 +10661,9 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "backports-zstd", marker = "python_full_version < '3.14'" }, - { name = "isal", marker = "platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'x86_64'" }, - { name = "zlib-ng", marker = "platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'x86_64'" }, + { name = "backports-zstd", marker = "python_full_version >= '3.10' and python_full_version < '3.14'" }, + { name = "isal", marker = "(python_full_version >= '3.10' and platform_machine == 'AMD64') or (python_full_version >= '3.10' and platform_machine == 'aarch64') or (python_full_version >= '3.10' and platform_machine == 'x86_64')" }, + { name = "zlib-ng", marker = "(python_full_version >= '3.10' and platform_machine == 'AMD64') or (python_full_version >= '3.10' and platform_machine == 'aarch64') or (python_full_version >= '3.10' and platform_machine == 'x86_64')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/77/bb/74a5222fc975fccb9f8bfb62613ca42a5a28008362c598df09806ecd12c1/xopen-2.1.0.tar.gz", hash = "sha256:06584821588f813563863b63d5e02568a4328661b7507ea38c432f24c69ea4b7", size = 32424, upload-time = "2026-06-03T05:54:07.392Z" } wheels = [ @@ -10724,9 +10724,9 @@ resolution-markers = [ "python_full_version <= '3.9'", ] dependencies = [ - { name = "idna" }, - { name = "multidict" }, - { name = "propcache", version = "0.4.1", source = { registry = "https://pypi.org/simple" } }, + { name = "idna", marker = "python_full_version < '3.10'" }, + { name = "multidict", marker = "python_full_version < '3.10'" }, + { name = "propcache", version = "0.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/57/63/0c6ebca57330cd313f6102b16dd57ffaf3ec4c83403dcb45dbd15c6f3ea1/yarl-1.22.0.tar.gz", hash = "sha256:bebf8557577d4401ba8bd9ff33906f1376c877aa78d1fe216ad01b4d6745af71", size = 187169, upload-time = "2025-10-06T14:12:55.963Z" } wheels = [ @@ -10871,9 +10871,9 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "idna" }, - { name = "multidict" }, - { name = "propcache", version = "0.5.2", source = { registry = "https://pypi.org/simple" } }, + { name = "idna", marker = "python_full_version >= '3.10'" }, + { name = "multidict", marker = "python_full_version >= '3.10'" }, + { name = "propcache", version = "0.5.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/31/33/ebe9e3d1f86c7a0b51094c0a146392045ca1631d2664889539dec8088a33/yarl-1.24.5.tar.gz", hash = "sha256:e81b83143bee16329c23db3c1b2d82b29892fcbcb849186d2f6e98a5abe9a57f", size = 228679, upload-time = "2026-07-20T02:07:45.435Z" } wheels = [