From f01aa08ed1476e13788911dbdc7e7c696d3aeb3e Mon Sep 17 00:00:00 2001 From: Stefan Amberger <1277330+snamber@users.noreply.github.com> Date: Fri, 23 Jan 2026 19:49:08 -0700 Subject: [PATCH] Accommodate Pandas 3 breaking changes --- matrix.toml | 78 +++++++ pyproject.toml | 7 + tilebox-datasets/pyproject.toml | 8 +- .../test_protobuf_xarray.py | 13 +- .../protobuf_conversion/field_types.py | 32 ++- .../protobuf_conversion/to_protobuf.py | 20 +- .../tilebox/datasets/query/time_interval.py | 2 +- tilebox-grpc/pyproject.toml | 3 +- tilebox-storage/pyproject.toml | 9 +- tilebox-workflows/pyproject.toml | 3 +- .../tilebox/workflows/jobs/client.py | 2 + uv.lock | 214 +++++++++++------- 12 files changed, 272 insertions(+), 119 deletions(-) create mode 100644 matrix.toml diff --git a/matrix.toml b/matrix.toml new file mode 100644 index 0000000..aa706af --- /dev/null +++ b/matrix.toml @@ -0,0 +1,78 @@ +# Matrix test configuration for testing pandas compatibility across Python versions +# Run with: pymatrix --config matrix.toml +# +# Split into scenarios per package due to pytest conftest collision when running +# multiple packages together (each has tests/conftest.py). + +[[scenarios]] +name = "datasets-pandas2" +python = ["3.10", "3.11", "3.12", "3.13"] +test-command = "pytest" +test-args = ["tilebox-datasets/tests/", "-v"] + +[scenarios.packages] +pandas = ["2.2.3"] + +[[scenarios]] +name = "datasets-pandas3" +python = ["3.11", "3.12", "3.13"] # pandas 3.0 requires Python 3.11+ +test-command = "pytest" +test-args = ["tilebox-datasets/tests/", "-v"] + +[scenarios.packages] +pandas = ["3.0.0"] + +[[scenarios]] +name = "storage-pandas2" +python = ["3.10", "3.11", "3.12", "3.13"] +test-command = "pytest" +test-args = ["tilebox-storage/tests/", "-v"] + +[scenarios.packages] +pandas = ["2.2.3"] + +[[scenarios]] +name = "storage-pandas3" +python = ["3.11", "3.12", "3.13"] # pandas 3.0 requires Python 3.11+ +test-command = "pytest" +test-args = ["tilebox-storage/tests/", "-v"] + +[scenarios.packages] +pandas = ["3.0.0"] + +[[scenarios]] +name = "grpc-pandas2" +python = ["3.10", "3.11", "3.12", "3.13"] +test-command = "pytest" +test-args = ["tilebox-grpc/tests/", "-v"] + +[scenarios.packages] +pandas = ["2.2.3"] + +[[scenarios]] +name = "grpc-pandas3" +python = ["3.11", "3.12", "3.13"] # pandas 3.0 requires Python 3.11+ +test-command = "pytest" +test-args = ["tilebox-grpc/tests/", "-v"] + +[scenarios.packages] +pandas = ["3.0.0"] + +[[scenarios]] +name = "workflows-pandas2" +python = ["3.10", "3.11", "3.12", "3.13"] +test-command = "pytest" +# Ignore FutureWarning: google-cloud-storage raises deprecation warning on Python 3.10 +test-args = ["tilebox-workflows/tests/", "-v", "-W", "ignore::FutureWarning"] + +[scenarios.packages] +pandas = ["2.2.3"] + +[[scenarios]] +name = "workflows-pandas3" +python = ["3.11", "3.12", "3.13"] # pandas 3.0 requires Python 3.11+ +test-command = "pytest" +test-args = ["tilebox-workflows/tests/", "-v"] + +[scenarios.packages] +pandas = ["3.0.0"] diff --git a/pyproject.toml b/pyproject.toml index 13b7e62..04faca6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,6 +28,13 @@ dev = [ "junitparser>=3.2.0", "ty>=0.0.11", "prek>=0.2.27", + # testing + "pytest>=8.3.2", + "pytest-asyncio>=0.24.0", + "pytest-cov>=5.0.0", + "pytest-httpx>=0.30.0", + "hypothesis>=6.112.1", + "moto>=5", ] [project.scripts] diff --git a/tilebox-datasets/pyproject.toml b/tilebox-datasets/pyproject.toml index 96fd875..fcf53e5 100644 --- a/tilebox-datasets/pyproject.toml +++ b/tilebox-datasets/pyproject.toml @@ -34,13 +34,7 @@ dependencies = [ "promise>=2.3", ] -[dependency-groups] -dev = [ - "hypothesis>=6.112.1", - "pytest-asyncio>=0.24.0", - "pytest-cov>=5.0.0", - "pytest>=8.3.2", -] + [project.urls] diff --git a/tilebox-datasets/tests/protobuf_conversion/test_protobuf_xarray.py b/tilebox-datasets/tests/protobuf_conversion/test_protobuf_xarray.py index 8b6308a..56020fa 100644 --- a/tilebox-datasets/tests/protobuf_conversion/test_protobuf_xarray.py +++ b/tilebox-datasets/tests/protobuf_conversion/test_protobuf_xarray.py @@ -1,5 +1,6 @@ from uuid import UUID +import pandas as pd import pytest from hypothesis import given, settings from hypothesis.strategies import lists @@ -152,21 +153,21 @@ def test_convert_datapoints(datapoints: list[ExampleDatapoint]) -> None: # noqa for uuid in dataset.some_id.to_numpy(): assert isinstance(uuid, str) - # strings should be stored as object arrays, with None as the fill value if missing + # strings should be stored as object arrays, with missing values (None or NaN) as fill if "some_string" in dataset: for string in dataset.some_string.to_numpy(): - assert string is None or isinstance(string, str) + assert pd.isna(string) or isinstance(string, str) if "some_repeated_string" in dataset: for string in dataset.some_repeated_string.to_numpy().ravel(): - assert string is None or isinstance(string, str) + assert pd.isna(string) or isinstance(string, str) - # bytes should be stored as object arrays, with None as the fill value if missing + # bytes should be stored as object arrays, with missing values (None or NaN) as fill if "some_bytes" in dataset: for bytes_ in dataset.some_bytes.to_numpy(): - assert bytes_ is None or isinstance(bytes_, bytes) + assert pd.isna(bytes_) or isinstance(bytes_, bytes) if "some_repeated_bytes" in dataset: for bytes_ in dataset.some_repeated_bytes.to_numpy().ravel(): - assert bytes_ is None or isinstance(bytes_, bytes) + assert pd.isna(bytes_) or isinstance(bytes_, bytes) @given(lists(example_datapoints(missing_fields=True), min_size=1, max_size=10)) diff --git a/tilebox-datasets/tilebox/datasets/protobuf_conversion/field_types.py b/tilebox-datasets/tilebox/datasets/protobuf_conversion/field_types.py index 052452f..d148be8 100644 --- a/tilebox-datasets/tilebox/datasets/protobuf_conversion/field_types.py +++ b/tilebox-datasets/tilebox/datasets/protobuf_conversion/field_types.py @@ -4,6 +4,7 @@ from uuid import UUID import numpy as np +import pandas as pd from google.protobuf.descriptor import FieldDescriptor from google.protobuf.duration_pb2 import Duration from google.protobuf.message import Message @@ -17,6 +18,21 @@ from tilebox.datasets.datasets.v1.well_known_types_pb2 import Geometry, LatLon, LatLonAlt, Quaternion, Vec3 ScalarProtoFieldValue = Message | float | str | bool | bytes + + +def _is_missing(value: Any) -> bool: + """Check if a value represents a missing/null value. + + Handles None, np.nan, pd.NA, NaT, and other pandas missing value sentinels. + This is needed for pandas 3.0+ compatibility where object-dtype columns use + np.nan instead of None for missing values. + """ + if value is None: + return True + try: + return bool(pd.isna(value)) + except (TypeError, ValueError): + return False ProtoFieldValue = ScalarProtoFieldValue | Sequence[ScalarProtoFieldValue] | None _FILL_VALUES_BY_DTYPE: dict[type[np.dtype[Any]], Any] = { @@ -107,7 +123,7 @@ def from_proto(self, value: ProtoFieldValue) -> int: return value.seconds * 10**9 + value.nanos def to_proto(self, value: DatetimeScalar) -> Timestamp | None: - if value is None or (isinstance(value, np.datetime64) and np.isnat(value)): + if _is_missing(value) or (isinstance(value, np.datetime64) and np.isnat(value)): return None # we use pandas to_datetime function to handle a variety of input types that can be coerced to datetimes seconds, nanos = divmod(to_datetime(value, utc=True).value, 10**9) @@ -124,7 +140,7 @@ def from_proto(self, value: ProtoFieldValue) -> int: return value.seconds * 10**9 + value.nanos def to_proto(self, value: str | float | timedelta | np.timedelta64) -> Duration | None: - if value is None or (isinstance(value, np.timedelta64) and np.isnat(value)): + if _is_missing(value) or (isinstance(value, np.timedelta64) and np.isnat(value)): return None # we use pandas to_timedelta function to handle a variety of input types that can be coerced to timedeltas seconds, nanos = divmod(to_timedelta(value).value, 10**9) # type: ignore[arg-type] @@ -141,7 +157,7 @@ def from_proto(self, value: ProtoFieldValue) -> str: return str(UUID(bytes=value.uuid)) def to_proto(self, value: str | UUID) -> UUIDMessage | None: - if not value: # None or empty string + if _is_missing(value) or value == "": # missing or empty string return None if isinstance(value, str): @@ -160,7 +176,7 @@ def from_proto(self, value: ProtoFieldValue) -> Any: return from_wkb(value.wkb) def to_proto(self, value: Any) -> Geometry | None: - if value is None: + if _is_missing(value): return None return Geometry(wkb=value.wkb) @@ -175,7 +191,7 @@ def from_proto(self, value: ProtoFieldValue) -> tuple[float, float, float]: return value.x, value.y, value.z def to_proto(self, value: tuple[float, float, float]) -> Vec3 | None: - if value is None or np.all(np.isnan(value)): + if _is_missing(value) or np.all(np.isnan(value)): return None return Vec3(x=value[0], y=value[1], z=value[2]) @@ -190,7 +206,7 @@ def from_proto(self, value: ProtoFieldValue) -> tuple[float, float, float, float return value.q1, value.q2, value.q3, value.q4 def to_proto(self, value: tuple[float, float, float, float]) -> Quaternion | None: - if value is None or np.all(np.isnan(value)): + if _is_missing(value) or np.all(np.isnan(value)): return None return Quaternion(q1=value[0], q2=value[1], q3=value[2], q4=value[3]) @@ -205,7 +221,7 @@ def from_proto(self, value: ProtoFieldValue) -> tuple[float, float]: return value.latitude, value.longitude def to_proto(self, value: tuple[float, float]) -> LatLon | None: - if value is None or np.all(np.isnan(value)): + if _is_missing(value) or np.all(np.isnan(value)): return None return LatLon(latitude=value[0], longitude=value[1]) @@ -221,7 +237,7 @@ def from_proto(self, value: ProtoFieldValue) -> tuple[float, float, float]: return value.latitude, value.longitude, value.altitude def to_proto(self, value: tuple[float, float, float]) -> LatLonAlt | None: - if value is None or np.all(np.isnan(value)): + if _is_missing(value) or np.all(np.isnan(value)): return None return LatLonAlt(latitude=value[0], longitude=value[1], altitude=value[2]) diff --git a/tilebox-datasets/tilebox/datasets/protobuf_conversion/to_protobuf.py b/tilebox-datasets/tilebox/datasets/protobuf_conversion/to_protobuf.py index 4d6b43e..8038975 100644 --- a/tilebox-datasets/tilebox/datasets/protobuf_conversion/to_protobuf.py +++ b/tilebox-datasets/tilebox/datasets/protobuf_conversion/to_protobuf.py @@ -116,11 +116,29 @@ def columnar_to_row_based( yield datapoint +def _is_scalar_missing(value: Any) -> bool: + """Check if a scalar value is missing (None, NaN, NA, NaT). + + Handles both scalar and array-like values safely - for arrays, returns False + since pd.isna would return an array which can't be used in a boolean context. + """ + if value is None: + return True + try: + result = pd.isna(value) + # pd.isna returns an array for array-like inputs; we only want scalar True/False + if isinstance(result, (bool, np.bool_)): + return bool(result) + return False + except (TypeError, ValueError): + return False + + def convert_values_to_proto( values: np.ndarray | pd.Series, field_type: ProtobufFieldType, filter_none: bool = False ) -> list[ProtoFieldValue]: if filter_none: - return [field_type.to_proto(value) for value in values if value is not None] + return [field_type.to_proto(value) for value in values if not _is_scalar_missing(value)] return [field_type.to_proto(value) for value in values] diff --git a/tilebox-datasets/tilebox/datasets/query/time_interval.py b/tilebox-datasets/tilebox/datasets/query/time_interval.py index 35ae71e..0524a8a 100644 --- a/tilebox-datasets/tilebox/datasets/query/time_interval.py +++ b/tilebox-datasets/tilebox/datasets/query/time_interval.py @@ -15,7 +15,7 @@ # A type alias for the different types that can be used to specify a time interval TimeIntervalLike: TypeAlias = ( - DatetimeScalar | tuple[DatetimeScalar, DatetimeScalar] | xr.DataArray | xr.Dataset | "TimeInterval" + "DatetimeScalar | tuple[DatetimeScalar, DatetimeScalar] | xr.DataArray | xr.Dataset | TimeInterval" ) diff --git a/tilebox-grpc/pyproject.toml b/tilebox-grpc/pyproject.toml index c6bdd47..27134ce 100644 --- a/tilebox-grpc/pyproject.toml +++ b/tilebox-grpc/pyproject.toml @@ -34,8 +34,7 @@ dependencies = [ ] -[dependency-groups] -dev = ["pytest-asyncio>=0.24.0", "pytest-cov>=5.0.0", "pytest>=8.3.2"] + [project.urls] Homepage = "https://tilebox.com" diff --git a/tilebox-storage/pyproject.toml b/tilebox-storage/pyproject.toml index 2a721da..b4b8661 100644 --- a/tilebox-storage/pyproject.toml +++ b/tilebox-storage/pyproject.toml @@ -29,14 +29,7 @@ dependencies = [ "obstore>=0.8.0", ] -[dependency-groups] -dev = [ - "hypothesis>=6.112.1", - "pytest-httpx>=0.30.0", - "pytest-asyncio>=0.24.0", - "pytest-cov>=5.0.0", - "pytest>=8.3.2", -] + [project.urls] Homepage = "https://tilebox.com" diff --git a/tilebox-workflows/pyproject.toml b/tilebox-workflows/pyproject.toml index 76e232b..b7dd042 100644 --- a/tilebox-workflows/pyproject.toml +++ b/tilebox-workflows/pyproject.toml @@ -34,8 +34,7 @@ dependencies = [ "python-dateutil>=2.9.0.post0", ] -[dependency-groups] -dev = ["hypothesis>=6.112.1", "pytest-cov>=5.0.0", "pytest>=8.3.2", "moto>=5"] + [project.urls] Homepage = "https://tilebox.com" diff --git a/tilebox-workflows/tilebox/workflows/jobs/client.py b/tilebox-workflows/tilebox/workflows/jobs/client.py index 6271ab6..f250ac5 100644 --- a/tilebox-workflows/tilebox/workflows/jobs/client.py +++ b/tilebox-workflows/tilebox/workflows/jobs/client.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Any, TypeAlias from uuid import UUID diff --git a/uv.lock b/uv.lock index 46c5294..843c216 100644 --- a/uv.lock +++ b/uv.lock @@ -2,9 +2,15 @@ version = 1 revision = 3 requires-python = ">=3.10" resolution-markers = [ - "python_full_version >= '3.13'", - "python_full_version == '3.12.*'", - "python_full_version == '3.11.*'", + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version < '3.11'", ] @@ -980,9 +986,15 @@ name = "ipython" version = "9.9.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.13'", - "python_full_version == '3.12.*'", - "python_full_version == '3.11.*'", + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] dependencies = [ { name = "colorama", marker = "python_full_version >= '3.11' and sys_platform == 'win32'" }, @@ -1431,9 +1443,15 @@ name = "numpy" version = "2.4.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.13'", - "python_full_version == '3.12.*'", - "python_full_version == '3.11.*'", + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] sdist = { url = "https://files.pythonhosted.org/packages/24/62/ae72ff66c0f1fd959925b4c11f8c2dea61f47f6acaea75a08512cdfe3fed/numpy-2.4.1.tar.gz", hash = "sha256:a1ceafc5042451a858231588a104093474c6a5c57dcc724841f5c888d237d690", size = 20721320, upload-time = "2026-01-10T06:44:59.619Z" } wheels = [ @@ -1692,12 +1710,14 @@ wheels = [ name = "pandas" version = "2.3.3" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11'", +] dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "python-dateutil" }, - { name = "pytz" }, - { name = "tzdata" }, + { name = "python-dateutil", marker = "python_full_version < '3.11'" }, + { name = "pytz", marker = "python_full_version < '3.11'" }, + { name = "tzdata", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } wheels = [ @@ -1750,6 +1770,77 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", size = 13202175, upload-time = "2025-09-29T23:31:59.173Z" }, ] +[[package]] +name = "pandas" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] +dependencies = [ + { name = "numpy", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "python-dateutil", marker = "python_full_version >= '3.11'" }, + { name = "tzdata", marker = "(python_full_version >= '3.11' and sys_platform == 'emscripten') or (python_full_version >= '3.11' and sys_platform == 'win32')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/de/da/b1dc0481ab8d55d0f46e343cfe67d4551a0e14fcee52bd38ca1bd73258d8/pandas-3.0.0.tar.gz", hash = "sha256:0facf7e87d38f721f0af46fe70d97373a37701b1c09f7ed7aeeb292ade5c050f", size = 4633005, upload-time = "2026-01-21T15:52:04.726Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/1e/b184654a856e75e975a6ee95d6577b51c271cd92cb2b020c9378f53e0032/pandas-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d64ce01eb9cdca96a15266aa679ae50212ec52757c79204dbc7701a222401850", size = 10313247, upload-time = "2026-01-21T15:50:15.775Z" }, + { url = "https://files.pythonhosted.org/packages/dd/5e/e04a547ad0f0183bf151fd7c7a477468e3b85ff2ad231c566389e6cc9587/pandas-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:613e13426069793aa1ec53bdcc3b86e8d32071daea138bbcf4fa959c9cdaa2e2", size = 9913131, upload-time = "2026-01-21T15:50:18.611Z" }, + { url = "https://files.pythonhosted.org/packages/a2/93/bb77bfa9fc2aba9f7204db807d5d3fb69832ed2854c60ba91b4c65ba9219/pandas-3.0.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0192fee1f1a8e743b464a6607858ee4b071deb0b118eb143d71c2a1d170996d5", size = 10741925, upload-time = "2026-01-21T15:50:21.058Z" }, + { url = "https://files.pythonhosted.org/packages/62/fb/89319812eb1d714bfc04b7f177895caeba8ab4a37ef6712db75ed786e2e0/pandas-3.0.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f0b853319dec8d5e0c8b875374c078ef17f2269986a78168d9bd57e49bf650ae", size = 11245979, upload-time = "2026-01-21T15:50:23.413Z" }, + { url = "https://files.pythonhosted.org/packages/a9/63/684120486f541fc88da3862ed31165b3b3e12b6a1c7b93be4597bc84e26c/pandas-3.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:707a9a877a876c326ae2cb640fbdc4ef63b0a7b9e2ef55c6df9942dcee8e2af9", size = 11756337, upload-time = "2026-01-21T15:50:25.932Z" }, + { url = "https://files.pythonhosted.org/packages/39/92/7eb0ad232312b59aec61550c3c81ad0743898d10af5df7f80bc5e5065416/pandas-3.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:afd0aa3d0b5cda6e0b8ffc10dbcca3b09ef3cbcd3fe2b27364f85fdc04e1989d", size = 12325517, upload-time = "2026-01-21T15:50:27.952Z" }, + { url = "https://files.pythonhosted.org/packages/51/27/bf9436dd0a4fc3130acec0828951c7ef96a0631969613a9a35744baf27f6/pandas-3.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:113b4cca2614ff7e5b9fee9b6f066618fe73c5a83e99d721ffc41217b2bf57dd", size = 9881576, upload-time = "2026-01-21T15:50:30.149Z" }, + { url = "https://files.pythonhosted.org/packages/e7/2b/c618b871fce0159fd107516336e82891b404e3f340821853c2fc28c7830f/pandas-3.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c14837eba8e99a8da1527c0280bba29b0eb842f64aa94982c5e21227966e164b", size = 9140807, upload-time = "2026-01-21T15:50:32.308Z" }, + { url = "https://files.pythonhosted.org/packages/0b/38/db33686f4b5fa64d7af40d96361f6a4615b8c6c8f1b3d334eee46ae6160e/pandas-3.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9803b31f5039b3c3b10cc858c5e40054adb4b29b4d81cb2fd789f4121c8efbcd", size = 10334013, upload-time = "2026-01-21T15:50:34.771Z" }, + { url = "https://files.pythonhosted.org/packages/a5/7b/9254310594e9774906bacdd4e732415e1f86ab7dbb4b377ef9ede58cd8ec/pandas-3.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:14c2a4099cd38a1d18ff108168ea417909b2dea3bd1ebff2ccf28ddb6a74d740", size = 9874154, upload-time = "2026-01-21T15:50:36.67Z" }, + { url = "https://files.pythonhosted.org/packages/63/d4/726c5a67a13bc66643e66d2e9ff115cead482a44fc56991d0c4014f15aaf/pandas-3.0.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d257699b9a9960e6125686098d5714ac59d05222bef7a5e6af7a7fd87c650801", size = 10384433, upload-time = "2026-01-21T15:50:39.132Z" }, + { url = "https://files.pythonhosted.org/packages/bf/2e/9211f09bedb04f9832122942de8b051804b31a39cfbad199a819bb88d9f3/pandas-3.0.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:69780c98f286076dcafca38d8b8eee1676adf220199c0a39f0ecbf976b68151a", size = 10864519, upload-time = "2026-01-21T15:50:41.043Z" }, + { url = "https://files.pythonhosted.org/packages/00/8d/50858522cdc46ac88b9afdc3015e298959a70a08cd21e008a44e9520180c/pandas-3.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4a66384f017240f3858a4c8a7cf21b0591c3ac885cddb7758a589f0f71e87ebb", size = 11394124, upload-time = "2026-01-21T15:50:43.377Z" }, + { url = "https://files.pythonhosted.org/packages/86/3f/83b2577db02503cd93d8e95b0f794ad9d4be0ba7cb6c8bcdcac964a34a42/pandas-3.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:be8c515c9bc33989d97b89db66ea0cececb0f6e3c2a87fcc8b69443a6923e95f", size = 11920444, upload-time = "2026-01-21T15:50:45.932Z" }, + { url = "https://files.pythonhosted.org/packages/64/2d/4f8a2f192ed12c90a0aab47f5557ece0e56b0370c49de9454a09de7381b2/pandas-3.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:a453aad8c4f4e9f166436994a33884442ea62aa8b27d007311e87521b97246e1", size = 9730970, upload-time = "2026-01-21T15:50:47.962Z" }, + { url = "https://files.pythonhosted.org/packages/d4/64/ff571be435cf1e643ca98d0945d76732c0b4e9c37191a89c8550b105eed1/pandas-3.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:da768007b5a33057f6d9053563d6b74dd6d029c337d93c6d0d22a763a5c2ecc0", size = 9041950, upload-time = "2026-01-21T15:50:50.422Z" }, + { url = "https://files.pythonhosted.org/packages/6f/fa/7f0ac4ca8877c57537aaff2a842f8760e630d8e824b730eb2e859ffe96ca/pandas-3.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b78d646249b9a2bc191040988c7bb524c92fa8534fb0898a0741d7e6f2ffafa6", size = 10307129, upload-time = "2026-01-21T15:50:52.877Z" }, + { url = "https://files.pythonhosted.org/packages/6f/11/28a221815dcea4c0c9414dfc845e34a84a6a7dabc6da3194498ed5ba4361/pandas-3.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bc9cba7b355cb4162442a88ce495e01cb605f17ac1e27d6596ac963504e0305f", size = 9850201, upload-time = "2026-01-21T15:50:54.807Z" }, + { url = "https://files.pythonhosted.org/packages/ba/da/53bbc8c5363b7e5bd10f9ae59ab250fc7a382ea6ba08e4d06d8694370354/pandas-3.0.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c9a1a149aed3b6c9bf246033ff91e1b02d529546c5d6fb6b74a28fea0cf4c70", size = 10354031, upload-time = "2026-01-21T15:50:57.463Z" }, + { url = "https://files.pythonhosted.org/packages/f7/a3/51e02ebc2a14974170d51e2410dfdab58870ea9bcd37cda15bd553d24dc4/pandas-3.0.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95683af6175d884ee89471842acfca29172a85031fccdabc35e50c0984470a0e", size = 10861165, upload-time = "2026-01-21T15:50:59.32Z" }, + { url = "https://files.pythonhosted.org/packages/a5/fe/05a51e3cac11d161472b8297bd41723ea98013384dd6d76d115ce3482f9b/pandas-3.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1fbbb5a7288719e36b76b4f18d46ede46e7f916b6c8d9915b756b0a6c3f792b3", size = 11359359, upload-time = "2026-01-21T15:51:02.014Z" }, + { url = "https://files.pythonhosted.org/packages/ee/56/ba620583225f9b85a4d3e69c01df3e3870659cc525f67929b60e9f21dcd1/pandas-3.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8e8b9808590fa364416b49b2a35c1f4cf2785a6c156935879e57f826df22038e", size = 11912907, upload-time = "2026-01-21T15:51:05.175Z" }, + { url = "https://files.pythonhosted.org/packages/c9/8c/c6638d9f67e45e07656b3826405c5cc5f57f6fd07c8b2572ade328c86e22/pandas-3.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:98212a38a709feb90ae658cb6227ea3657c22ba8157d4b8f913cd4c950de5e7e", size = 9732138, upload-time = "2026-01-21T15:51:07.569Z" }, + { url = "https://files.pythonhosted.org/packages/7b/bf/bd1335c3bf1770b6d8fed2799993b11c4971af93bb1b729b9ebbc02ca2ec/pandas-3.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:177d9df10b3f43b70307a149d7ec49a1229a653f907aa60a48f1877d0e6be3be", size = 9033568, upload-time = "2026-01-21T15:51:09.484Z" }, + { url = "https://files.pythonhosted.org/packages/8e/c6/f5e2171914d5e29b9171d495344097d54e3ffe41d2d85d8115baba4dc483/pandas-3.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2713810ad3806767b89ad3b7b69ba153e1c6ff6d9c20f9c2140379b2a98b6c98", size = 10741936, upload-time = "2026-01-21T15:51:11.693Z" }, + { url = "https://files.pythonhosted.org/packages/51/88/9a0164f99510a1acb9f548691f022c756c2314aad0d8330a24616c14c462/pandas-3.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:15d59f885ee5011daf8335dff47dcb8a912a27b4ad7826dc6cbe809fd145d327", size = 10393884, upload-time = "2026-01-21T15:51:14.197Z" }, + { url = "https://files.pythonhosted.org/packages/e0/53/b34d78084d88d8ae2b848591229da8826d1e65aacf00b3abe34023467648/pandas-3.0.0-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24e6547fb64d2c92665dd2adbfa4e85fa4fd70a9c070e7cfb03b629a0bbab5eb", size = 10310740, upload-time = "2026-01-21T15:51:16.093Z" }, + { url = "https://files.pythonhosted.org/packages/5b/d3/bee792e7c3d6930b74468d990604325701412e55d7aaf47460a22311d1a5/pandas-3.0.0-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:48ee04b90e2505c693d3f8e8f524dab8cb8aaf7ddcab52c92afa535e717c4812", size = 10700014, upload-time = "2026-01-21T15:51:18.818Z" }, + { url = "https://files.pythonhosted.org/packages/55/db/2570bc40fb13aaed1cbc3fbd725c3a60ee162477982123c3adc8971e7ac1/pandas-3.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:66f72fb172959af42a459e27a8d8d2c7e311ff4c1f7db6deb3b643dbc382ae08", size = 11323737, upload-time = "2026-01-21T15:51:20.784Z" }, + { url = "https://files.pythonhosted.org/packages/bc/2e/297ac7f21c8181b62a4cccebad0a70caf679adf3ae5e83cb676194c8acc3/pandas-3.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4a4a400ca18230976724a5066f20878af785f36c6756e498e94c2a5e5d57779c", size = 11771558, upload-time = "2026-01-21T15:51:22.977Z" }, + { url = "https://files.pythonhosted.org/packages/0a/46/e1c6876d71c14332be70239acce9ad435975a80541086e5ffba2f249bcf6/pandas-3.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:940eebffe55528074341a5a36515f3e4c5e25e958ebbc764c9502cfc35ba3faa", size = 10473771, upload-time = "2026-01-21T15:51:25.285Z" }, + { url = "https://files.pythonhosted.org/packages/c0/db/0270ad9d13c344b7a36fa77f5f8344a46501abf413803e885d22864d10bf/pandas-3.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:597c08fb9fef0edf1e4fa2f9828dd27f3d78f9b8c9b4a748d435ffc55732310b", size = 10312075, upload-time = "2026-01-21T15:51:28.5Z" }, + { url = "https://files.pythonhosted.org/packages/09/9f/c176f5e9717f7c91becfe0f55a52ae445d3f7326b4a2cf355978c51b7913/pandas-3.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:447b2d68ac5edcbf94655fe909113a6dba6ef09ad7f9f60c80477825b6c489fe", size = 9900213, upload-time = "2026-01-21T15:51:30.955Z" }, + { url = "https://files.pythonhosted.org/packages/d9/e7/63ad4cc10b257b143e0a5ebb04304ad806b4e1a61c5da25f55896d2ca0f4/pandas-3.0.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:debb95c77ff3ed3ba0d9aa20c3a2f19165cc7956362f9873fce1ba0a53819d70", size = 10428768, upload-time = "2026-01-21T15:51:33.018Z" }, + { url = "https://files.pythonhosted.org/packages/9e/0e/4e4c2d8210f20149fd2248ef3fff26623604922bd564d915f935a06dd63d/pandas-3.0.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fedabf175e7cd82b69b74c30adbaa616de301291a5231138d7242596fc296a8d", size = 10882954, upload-time = "2026-01-21T15:51:35.287Z" }, + { url = "https://files.pythonhosted.org/packages/c6/60/c9de8ac906ba1f4d2250f8a951abe5135b404227a55858a75ad26f84db47/pandas-3.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:412d1a89aab46889f3033a386912efcdfa0f1131c5705ff5b668dda88305e986", size = 11430293, upload-time = "2026-01-21T15:51:37.57Z" }, + { url = "https://files.pythonhosted.org/packages/a1/69/806e6637c70920e5787a6d6896fd707f8134c2c55cd761e7249a97b7dc5a/pandas-3.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e979d22316f9350c516479dd3a92252be2937a9531ed3a26ec324198a99cdd49", size = 11952452, upload-time = "2026-01-21T15:51:39.618Z" }, + { url = "https://files.pythonhosted.org/packages/cb/de/918621e46af55164c400ab0ef389c9d969ab85a43d59ad1207d4ddbe30a5/pandas-3.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:083b11415b9970b6e7888800c43c82e81a06cd6b06755d84804444f0007d6bb7", size = 9851081, upload-time = "2026-01-21T15:51:41.758Z" }, + { url = "https://files.pythonhosted.org/packages/91/a1/3562a18dd0bd8c73344bfa26ff90c53c72f827df119d6d6b1dacc84d13e3/pandas-3.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:5db1e62cb99e739fa78a28047e861b256d17f88463c76b8dafc7c1338086dca8", size = 9174610, upload-time = "2026-01-21T15:51:44.312Z" }, + { url = "https://files.pythonhosted.org/packages/ce/26/430d91257eaf366f1737d7a1c158677caaf6267f338ec74e3a1ec444111c/pandas-3.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:697b8f7d346c68274b1b93a170a70974cdc7d7354429894d5927c1effdcccd73", size = 10761999, upload-time = "2026-01-21T15:51:46.899Z" }, + { url = "https://files.pythonhosted.org/packages/ec/1a/954eb47736c2b7f7fe6a9d56b0cb6987773c00faa3c6451a43db4beb3254/pandas-3.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8cb3120f0d9467ed95e77f67a75e030b67545bcfa08964e349252d674171def2", size = 10410279, upload-time = "2026-01-21T15:51:48.89Z" }, + { url = "https://files.pythonhosted.org/packages/20/fc/b96f3a5a28b250cd1b366eb0108df2501c0f38314a00847242abab71bb3a/pandas-3.0.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:33fd3e6baa72899746b820c31e4b9688c8e1b7864d7aec2de7ab5035c285277a", size = 10330198, upload-time = "2026-01-21T15:51:51.015Z" }, + { url = "https://files.pythonhosted.org/packages/90/b3/d0e2952f103b4fbef1ef22d0c2e314e74fc9064b51cee30890b5e3286ee6/pandas-3.0.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8942e333dc67ceda1095227ad0febb05a3b36535e520154085db632c40ad084", size = 10728513, upload-time = "2026-01-21T15:51:53.387Z" }, + { url = "https://files.pythonhosted.org/packages/76/81/832894f286df828993dc5fd61c63b231b0fb73377e99f6c6c369174cf97e/pandas-3.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:783ac35c4d0fe0effdb0d67161859078618b1b6587a1af15928137525217a721", size = 11345550, upload-time = "2026-01-21T15:51:55.329Z" }, + { url = "https://files.pythonhosted.org/packages/34/a0/ed160a00fb4f37d806406bc0a79a8b62fe67f29d00950f8d16203ff3409b/pandas-3.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:125eb901e233f155b268bbef9abd9afb5819db74f0e677e89a61b246228c71ac", size = 11799386, upload-time = "2026-01-21T15:51:57.457Z" }, + { url = "https://files.pythonhosted.org/packages/36/c8/2ac00d7255252c5e3cf61b35ca92ca25704b0188f7454ca4aec08a33cece/pandas-3.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b86d113b6c109df3ce0ad5abbc259fe86a1bd4adfd4a31a89da42f84f65509bb", size = 10873041, upload-time = "2026-01-21T15:52:00.034Z" }, + { url = "https://files.pythonhosted.org/packages/e6/3f/a80ac00acbc6b35166b42850e98a4f466e2c0d9c64054161ba9620f95680/pandas-3.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:1c39eab3ad38f2d7a249095f0a3d8f8c22cc0f847e98ccf5bbe732b272e2d9fa", size = 9441003, upload-time = "2026-01-21T15:52:02.281Z" }, +] + [[package]] name = "parso" version = "0.8.5" @@ -1764,7 +1855,7 @@ name = "pexpect" version = "4.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "ptyprocess" }, + { name = "ptyprocess", marker = "(python_full_version < '3.11' and sys_platform == 'emscripten') or (python_full_version < '3.11' and sys_platform == 'win32') or (sys_platform != 'emscripten' and sys_platform != 'win32')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } wheels = [ @@ -2324,7 +2415,8 @@ dependencies = [ { name = "loguru" }, { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "numpy", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "pandas" }, + { name = "pandas", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "pandas", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "promise" }, { name = "shapely" }, { name = "tilebox-grpc" }, @@ -2333,14 +2425,6 @@ dependencies = [ { name = "xarray", version = "2025.12.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -[package.dev-dependencies] -dev = [ - { name = "hypothesis" }, - { name = "pytest" }, - { name = "pytest-asyncio" }, - { name = "pytest-cov" }, -] - [package.metadata] requires-dist = [ { name = "cftime", specifier = ">=1.6.4" }, @@ -2354,14 +2438,6 @@ requires-dist = [ { name = "xarray", specifier = ">=2023.11" }, ] -[package.metadata.requires-dev] -dev = [ - { name = "hypothesis", specifier = ">=6.112.1" }, - { name = "pytest", specifier = ">=8.3.2" }, - { name = "pytest-asyncio", specifier = ">=0.24.0" }, - { name = "pytest-cov", specifier = ">=5.0.0" }, -] - [[package]] name = "tilebox-grpc" source = { editable = "tilebox-grpc" } @@ -2374,13 +2450,6 @@ dependencies = [ { name = "protobuf" }, ] -[package.dev-dependencies] -dev = [ - { name = "pytest" }, - { name = "pytest-asyncio" }, - { name = "pytest-cov" }, -] - [package.metadata] requires-dist = [ { name = "anyio", specifier = ">=4" }, @@ -2391,13 +2460,6 @@ requires-dist = [ { name = "protobuf", specifier = ">=6" }, ] -[package.metadata.requires-dev] -dev = [ - { name = "pytest", specifier = ">=8.3.2" }, - { name = "pytest-asyncio", specifier = ">=0.24.0" }, - { name = "pytest-cov", specifier = ">=5.0.0" }, -] - [[package]] name = "tilebox-python" source = { editable = "." } @@ -2412,10 +2474,16 @@ dependencies = [ dev = [ { name = "build" }, { name = "cython" }, + { name = "hypothesis" }, { name = "junitparser" }, + { name = "moto" }, { name = "pip" }, { name = "prek" }, { name = "pyarrow" }, + { name = "pytest" }, + { name = "pytest-asyncio" }, + { name = "pytest-cov" }, + { name = "pytest-httpx" }, { name = "ruff" }, { name = "ty" }, { name = "types-protobuf" }, @@ -2433,10 +2501,16 @@ requires-dist = [ dev = [ { name = "build", specifier = ">=1.2.2" }, { name = "cython", specifier = ">=3.0.11" }, + { name = "hypothesis", specifier = ">=6.112.1" }, { name = "junitparser", specifier = ">=3.2.0" }, + { name = "moto", specifier = ">=5" }, { name = "pip", specifier = ">=24.2" }, { name = "prek", specifier = ">=0.2.27" }, { name = "pyarrow", specifier = ">=17.0.0" }, + { name = "pytest", specifier = ">=8.3.2" }, + { name = "pytest-asyncio", specifier = ">=0.24.0" }, + { name = "pytest-cov", specifier = ">=5.0.0" }, + { name = "pytest-httpx", specifier = ">=0.30.0" }, { name = "ruff", specifier = ">=0.11.10" }, { name = "ty", specifier = ">=0.0.11" }, { name = "types-protobuf", specifier = ">=6.30" }, @@ -2454,15 +2528,6 @@ dependencies = [ { name = "tilebox-datasets" }, ] -[package.dev-dependencies] -dev = [ - { name = "hypothesis" }, - { name = "pytest" }, - { name = "pytest-asyncio" }, - { name = "pytest-cov" }, - { name = "pytest-httpx" }, -] - [package.metadata] requires-dist = [ { name = "aiofile", specifier = ">=3.8" }, @@ -2473,15 +2538,6 @@ requires-dist = [ { name = "tilebox-datasets", editable = "tilebox-datasets" }, ] -[package.metadata.requires-dev] -dev = [ - { name = "hypothesis", specifier = ">=6.112.1" }, - { name = "pytest", specifier = ">=8.3.2" }, - { name = "pytest-asyncio", specifier = ">=0.24.0" }, - { name = "pytest-cov", specifier = ">=5.0.0" }, - { name = "pytest-httpx", specifier = ">=0.30.0" }, -] - [[package]] name = "tilebox-workflows" source = { editable = "tilebox-workflows" } @@ -2499,14 +2555,6 @@ dependencies = [ { name = "tilebox-grpc" }, ] -[package.dev-dependencies] -dev = [ - { name = "hypothesis" }, - { name = "moto" }, - { name = "pytest" }, - { name = "pytest-cov" }, -] - [package.metadata] requires-dist = [ { name = "boto3", specifier = ">=1.33" }, @@ -2522,14 +2570,6 @@ requires-dist = [ { name = "tilebox-grpc", editable = "tilebox-grpc" }, ] -[package.metadata.requires-dev] -dev = [ - { name = "hypothesis", specifier = ">=6.112.1" }, - { name = "moto", specifier = ">=5" }, - { name = "pytest", specifier = ">=8.3.2" }, - { name = "pytest-cov", specifier = ">=5.0.0" }, -] - [[package]] name = "tomli" version = "2.4.0" @@ -2733,7 +2773,7 @@ resolution-markers = [ dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "packaging", marker = "python_full_version < '3.11'" }, - { name = "pandas", marker = "python_full_version < '3.11'" }, + { name = "pandas", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/19/ec/e50d833518f10b0c24feb184b209bb6856f25b919ba8c1f89678b930b1cd/xarray-2025.6.1.tar.gz", hash = "sha256:a84f3f07544634a130d7dc615ae44175419f4c77957a7255161ed99c69c7c8b0", size = 3003185, upload-time = "2025-06-12T03:04:09.099Z" } wheels = [ @@ -2745,14 +2785,20 @@ name = "xarray" version = "2025.12.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.13'", - "python_full_version == '3.12.*'", - "python_full_version == '3.11.*'", + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] dependencies = [ { name = "numpy", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "packaging", marker = "python_full_version >= '3.11'" }, - { name = "pandas", marker = "python_full_version >= '3.11'" }, + { name = "pandas", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d3/af/7b945f331ba8911fdfff2fdfa092763156119f124be1ba4144615c540222/xarray-2025.12.0.tar.gz", hash = "sha256:73f6a6fadccc69c4d45bdd70821a47c72de078a8a0313ff8b1e97cd54ac59fed", size = 3082244, upload-time = "2025-12-05T21:51:22.432Z" } wheels = [