From 708f8af8a8cb05df2f696062e98261e7c24ea052 Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Thu, 8 Aug 2024 17:26:42 -0400 Subject: [PATCH] Remove pyarrow dependency (#582) For #581 --- lonboard/_cli.py | 20 +- lonboard/_geoarrow/_duckdb.py | 63 +- lonboard/_geoarrow/crs.py | 4 +- lonboard/_geoarrow/extension_types.py | 291 +++---- lonboard/_geoarrow/geopandas_interop.py | 15 +- lonboard/_geoarrow/ops/bbox.py | 36 +- lonboard/_geoarrow/ops/centroid.py | 41 +- lonboard/_geoarrow/ops/coord_layout.py | 58 +- lonboard/_geoarrow/ops/reproject.py | 115 +-- lonboard/_geoarrow/parse_wkb.py | 50 +- lonboard/_geoarrow/sanitize.py | 59 -- lonboard/_geoarrow/utils.py | 4 +- lonboard/_layer.py | 48 +- lonboard/_serialization.py | 62 +- lonboard/_utils.py | 6 +- lonboard/_viz.py | 78 +- lonboard/colormap.py | 14 +- lonboard/traits.py | 261 ++++-- lonboard/types/arrow.py | 13 + lonboard/types/layer.py | 20 +- poetry.lock | 1019 +++++++++++++---------- pyproject.toml | 9 +- tests/test_geoarrow.py | 4 +- tests/test_traits.py | 58 +- tests/test_viz.py | 7 +- 25 files changed, 1233 insertions(+), 1122 deletions(-) delete mode 100644 lonboard/_geoarrow/sanitize.py create mode 100644 lonboard/types/arrow.py diff --git a/lonboard/_cli.py b/lonboard/_cli.py index fbea6ce1..8c94ef67 100644 --- a/lonboard/_cli.py +++ b/lonboard/_cli.py @@ -5,29 +5,32 @@ from typing import Dict, List, Optional import click -import pyarrow as pa import pyarrow.parquet as pq +from arro3.core import Table from pyproj import CRS from lonboard import viz from lonboard._constants import EXTENSION_NAME -def read_pyogrio(path: Path) -> pa.Table: +def read_pyogrio(path: Path) -> Table: """Read path using pyogrio and convert field metadata to geoarrow Args: path: Path to file readable by pyogrio """ try: - from pyogrio.raw import read_arrow + from pyogrio.raw import open_arrow except ImportError as e: raise ImportError( "pyogrio is a required dependency for the CLI. " "Install with `pip install pyogrio`." ) from e - meta, table = read_arrow(path) + with open_arrow(path, use_pyarrow=False) as source: + meta, stream = source + table = Table.from_arrow(stream) + # The `geometry_name` key always exists but can be an empty string. In the case of # an empty string, we want to default to `wkb_geometry` geometry_column_name = meta.get("geometry_name") or "wkb_geometry" @@ -53,10 +56,10 @@ def read_pyogrio(path: Path) -> pa.Table: new_field = field.with_name("geometry").with_metadata(metadata) new_schema = schema.set(geometry_column_index, new_field) - return pa.Table.from_arrays(table.columns, schema=new_schema) + return table.with_schema(new_schema) -def read_geoparquet(path: Path): +def read_geoparquet(path: Path) -> Table: """Read GeoParquet file at path using pyarrow Args: @@ -67,7 +70,8 @@ def read_geoparquet(path: Path): if not geo_meta: raise ValueError("Expected geo metadata in Parquet file") - table = file.read() + pyarrow_table = file.read() + table = Table.from_arrow(pyarrow_table) geo_meta = json.loads(geo_meta) geometry_column_name = geo_meta["primary_column"] @@ -86,7 +90,7 @@ def read_geoparquet(path: Path): new_field = table.schema.field(geometry_column_index).with_metadata(metadata) new_schema = table.schema.set(geometry_column_index, new_field) - return pa.Table.from_arrays(table.columns, schema=new_schema) + return table.with_schema(new_schema) @click.command() diff --git a/lonboard/_geoarrow/_duckdb.py b/lonboard/_geoarrow/_duckdb.py index 84efdf90..55ad4fd4 100644 --- a/lonboard/_geoarrow/_duckdb.py +++ b/lonboard/_geoarrow/_duckdb.py @@ -2,11 +2,18 @@ import json import re -from typing import TYPE_CHECKING, Optional, Union +from typing import TYPE_CHECKING, List, Optional, Union import numpy as np -import pyarrow as pa -import pyarrow.compute as pc +from arro3.compute import struct_field +from arro3.core import ( + Array, + ChunkedArray, + Field, + Table, + fixed_size_list_array, + list_array, +) from lonboard._constants import EXTENSION_NAME @@ -29,7 +36,7 @@ def from_duckdb( *, con: Optional[duckdb.DuckDBPyConnection] = None, crs: Optional[Union[str, pyproj.CRS]] = None, -) -> pa.Table: +) -> Table: geom_col_idxs = [ i for i, t in enumerate(rel.types) if str(t) in DUCKDB_SPATIAL_TYPES ] @@ -89,9 +96,9 @@ def _from_geometry( con: Optional[duckdb.DuckDBPyConnection] = None, geom_col_idx: int, crs: Optional[Union[str, pyproj.CRS]] = None, -) -> pa.Table: +) -> Table: other_col_names = [name for i, name in enumerate(rel.columns) if i != geom_col_idx] - non_geo_table = rel.select(*other_col_names).arrow() + non_geo_table = Table.from_arrow(rel.select(*other_col_names).arrow()) geom_col_name = rel.columns[geom_col_idx] # A poor-man's string interpolation check @@ -102,9 +109,11 @@ def _from_geometry( ), f"Expected geometry column name to match regex: {re_match}" if con is not None: - geom_table = con.sql(f""" + geom_table = Table.from_arrow( + con.sql(f""" SELECT ST_AsWKB( {geom_col_name} ) as {geom_col_name} FROM rel; """).arrow() + ) else: import duckdb @@ -119,7 +128,9 @@ def _from_geometry( SELECT ST_AsWKB( {geom_col_name} ) as {geom_col_name} FROM rel; """ try: - geom_table = duckdb.execute(sql).arrow() + geom_table = Table.from_arrow( + duckdb.execute(sql, connection=duckdb.default_connection).arrow() + ) except duckdb.CatalogException as err: msg = ( "Could not coerce type GEOMETRY to WKB.\n" @@ -140,8 +151,8 @@ def _from_geoarrow( extension_type: EXTENSION_NAME, geom_col_idx: int, crs: Optional[Union[str, pyproj.CRS]] = None, -) -> pa.Table: - table = rel.arrow() +) -> Table: + table = Table.from_arrow(rel.arrow()) metadata = _make_geoarrow_field_metadata(extension_type, crs) geom_field = table.schema.field(geom_col_idx).with_metadata(metadata) return table.set_column(geom_col_idx, geom_field, table.column(geom_col_idx)) @@ -152,21 +163,24 @@ def _from_box2d( *, geom_col_idx: int, crs: Optional[Union[str, pyproj.CRS]] = None, -) -> pa.Table: - table = rel.arrow() +) -> Table: + table = Table.from_arrow(rel.arrow()) geom_col = table.column(geom_col_idx) - polygon_array = _convert_box2d_to_geoarrow_polygon_array(geom_col) + polygon_chunks: List[Array] = [] + for geom_chunk in geom_col.chunks: + polygon_array = _convert_box2d_to_geoarrow_polygon_array(geom_chunk) + polygon_chunks.append(polygon_array) metadata = _make_geoarrow_field_metadata(EXTENSION_NAME.POLYGON, crs) prev_field = table.schema.field(geom_col_idx) - geom_field = pa.field(prev_field.name, polygon_array.type, metadata=metadata) - return table.set_column(geom_col_idx, geom_field, polygon_array) + geom_field = Field(prev_field.name, polygon_chunks[0].type, metadata=metadata) + return table.set_column(geom_col_idx, geom_field, ChunkedArray(polygon_chunks)) def _convert_box2d_to_geoarrow_polygon_array( - geom_col: pa.StructArray, -) -> pa.ListArray: + geom_col: Array, +) -> Array: """ This is a manual conversion of the duckdb box_2d type to a GeoArrow Polygon array. @@ -176,10 +190,10 @@ def _convert_box2d_to_geoarrow_polygon_array( # Extract the bounding box columns from the Arrow struct # NOTE: this assumes that the box ordering is minx, miny, maxx, maxy # Note sure whether the positional ordering or the named fields is more stable - min_x = pc.struct_field(geom_col, 0) - min_y = pc.struct_field(geom_col, 1) - max_x = pc.struct_field(geom_col, 2) - max_y = pc.struct_field(geom_col, 3) + min_x = struct_field(geom_col, 0) + min_y = struct_field(geom_col, 1) + max_x = struct_field(geom_col, 2) + max_y = struct_field(geom_col, 3) # Provision memory for the output coordinates. For closed polygons, each input box # becomes 5 coordinates. @@ -208,9 +222,10 @@ def _convert_box2d_to_geoarrow_polygon_array( geom_offsets = np.arange(0, len(ring_offsets), dtype=np.int32) # Construct the final PolygonArray - coords = pa.FixedSizeListArray.from_arrays(coords.ravel("C"), 2) - ring_array = pa.ListArray.from_arrays(ring_offsets, coords) - polygon_array = pa.ListArray.from_arrays(geom_offsets, ring_array) + flat_coords: Array = Array.from_numpy(coords.ravel("C")) + coords = fixed_size_list_array(flat_coords, 2) + ring_array = list_array(Array.from_numpy(ring_offsets), coords) + polygon_array = list_array(Array.from_numpy(geom_offsets), ring_array) return polygon_array diff --git a/lonboard/_geoarrow/crs.py b/lonboard/_geoarrow/crs.py index abf8b843..7d7a19db 100644 --- a/lonboard/_geoarrow/crs.py +++ b/lonboard/_geoarrow/crs.py @@ -1,12 +1,12 @@ import json from typing import Optional -import pyarrow as pa +from arro3.core import Field # Note: According to the spec, if the metadata key exists, its value should never be # `null` or an empty dict, but we still check for those to be safe -def get_field_crs(field: pa.Field) -> Optional[str]: +def get_field_crs(field: Field) -> Optional[str]: extension_metadata_value = field.metadata.get(b"ARROW:extension:metadata") if not extension_metadata_value: return None diff --git a/lonboard/_geoarrow/extension_types.py b/lonboard/_geoarrow/extension_types.py index a9e8d8b6..6b51ed4a 100644 --- a/lonboard/_geoarrow/extension_types.py +++ b/lonboard/_geoarrow/extension_types.py @@ -1,10 +1,14 @@ +from __future__ import annotations + import json from enum import Enum -from typing import Dict, Optional, Tuple +from typing import TYPE_CHECKING, Dict, Optional, Sequence, Tuple import numpy as np -import pyarrow as pa -from numpy.typing import NDArray +from arro3.core import Array, DataType, Field, fixed_size_list_array, list_array + +if TYPE_CHECKING: + from numpy.typing import NDArray class CoordinateDimension(str, Enum): @@ -14,12 +18,7 @@ class CoordinateDimension(str, Enum): XYZM = "xyzm" -class BaseGeometryType(pa.ExtensionType): - extension_name: str - coord_dimension: CoordinateDimension - - -def coord_storage_type(*, interleaved: bool, dims: CoordinateDimension) -> pa.DataType: +def coord_storage_type(*, interleaved: bool, dims: CoordinateDimension) -> DataType: """Generate the storage type of a geoarrow coordinate array Args: @@ -27,46 +26,46 @@ def coord_storage_type(*, interleaved: bool, dims: CoordinateDimension) -> pa.Da dims: The number of dimensions """ if interleaved: - return pa.list_(pa.field(dims, pa.float64()), len(dims)) + return DataType.list(Field(dims, DataType.float64()), len(dims)) else: if dims == CoordinateDimension.XY: - return pa.struct( + return DataType.struct( [ - ("x", pa.float64()), - ("y", pa.float64()), + Field("x", DataType.float64()), + Field("y", DataType.float64()), ] ) if dims == CoordinateDimension.XYZ: - return pa.struct( + return DataType.struct( [ - ("x", pa.float64()), - ("y", pa.float64()), - ("z", pa.float64()), + Field("x", DataType.float64()), + Field("y", DataType.float64()), + Field("z", DataType.float64()), ] ) if dims == CoordinateDimension.XYM: - return pa.struct( + return DataType.struct( [ - ("x", pa.float64()), - ("y", pa.float64()), - ("m", pa.float64()), + Field("x", DataType.float64()), + Field("y", DataType.float64()), + Field("m", DataType.float64()), ] ) if dims == CoordinateDimension.XYZM: - return pa.struct( + return DataType.struct( [ - ("x", pa.float64()), - ("y", pa.float64()), - ("z", pa.float64()), - ("m", pa.float64()), + Field("x", DataType.float64()), + Field("y", DataType.float64()), + Field("z", DataType.float64()), + Field("m", DataType.float64()), ] ) def linestring_storage_type( *, interleaved: bool, dims: CoordinateDimension, large_list: bool = False -) -> pa.DataType: +) -> DataType: """Generate the storage type of a geoarrow.linestring array Args: @@ -76,14 +75,14 @@ def linestring_storage_type( """ vertices_type = coord_storage_type(interleaved=interleaved, dims=dims) if large_list: - return pa.large_list(pa.field("vertices", vertices_type)) + return DataType.large_list(Field("vertices", vertices_type)) else: - return pa.list_(pa.field("vertices", vertices_type)) + return DataType.list(Field("vertices", vertices_type)) def polygon_storage_type( *, interleaved: bool, dims: CoordinateDimension, large_list: bool = False -) -> pa.DataType: +) -> DataType: """Generate the storage type of a geoarrow.polygon array Args: @@ -95,14 +94,14 @@ def polygon_storage_type( large_list=large_list, interleaved=interleaved, dims=dims ) if large_list: - return pa.large_list(pa.field("rings", rings_type)) + return DataType.large_list(Field("rings", rings_type)) else: - return pa.list_(pa.field("rings", rings_type)) + return DataType.list(Field("rings", rings_type)) def multipoint_storage_type( *, interleaved: bool, dims: CoordinateDimension, large_list: bool = False -) -> pa.DataType: +) -> DataType: """Generate the storage type of a geoarrow.multipoint array Args: @@ -112,14 +111,14 @@ def multipoint_storage_type( """ points_type = coord_storage_type(interleaved=interleaved, dims=dims) if large_list: - return pa.large_list(pa.field("points", points_type)) + return DataType.large_list(Field("points", points_type)) else: - return pa.list_(pa.field("points", points_type)) + return DataType.list(Field("points", points_type)) def multilinestring_storage_type( *, interleaved: bool, dims: CoordinateDimension, large_list: bool = False -) -> pa.DataType: +) -> DataType: """Generate the storage type of a geoarrow.multilinestring array Args: @@ -131,14 +130,14 @@ def multilinestring_storage_type( large_list=large_list, interleaved=interleaved, dims=dims ) if large_list: - return pa.large_list(pa.field("linestrings", linestrings_type)) + return DataType.large_list(Field("linestrings", linestrings_type)) else: - return pa.list_(pa.field("linestrings", linestrings_type)) + return DataType.list(Field("linestrings", linestrings_type)) def multipolygon_storage_type( *, interleaved: bool, dims: CoordinateDimension, large_list: bool = False -) -> pa.DataType: +) -> DataType: """Generate the storage type of a geoarrow.multipolygon array Args: @@ -150,131 +149,19 @@ def multipolygon_storage_type( large_list=large_list, interleaved=interleaved, dims=dims ) if large_list: - return pa.large_list(pa.field("polygons", polygons_type)) + return DataType.large_list(Field("polygons", polygons_type)) else: - return pa.list_(pa.field("polygons", polygons_type)) - - -class PointType(BaseGeometryType): - extension_name = "geoarrow.point" - - def __init__(self, *, interleaved: bool, dims: CoordinateDimension): - self.coord_dimension = dims - - storage_type = coord_storage_type(interleaved=interleaved, dims=dims) - super().__init__(storage_type, self.extension_name) - - def __arrow_ext_serialize__(self): - return b"" - - @classmethod - def __arrow_ext_deserialize__(cls, storage_type: pa.DataType, serialized: bytes): - return cls(interleaved=True, dims=CoordinateDimension.XY) - - -class LineStringType(BaseGeometryType): - extension_name = "geoarrow.linestring" - - def __init__( - self, *, interleaved: bool, dims: CoordinateDimension, large_list: bool = False - ): - self.coord_dimension = dims - - storage_type = linestring_storage_type( - interleaved=interleaved, dims=dims, large_list=large_list - ) - super().__init__(storage_type, self.extension_name) - - def __arrow_ext_serialize__(self): - return b"" - - @classmethod - def __arrow_ext_deserialize__(cls, storage_type: pa.DataType, serialized: bytes): - return cls(interleaved=True, dims=CoordinateDimension.XY) - - -class PolygonType(BaseGeometryType): - extension_name = "geoarrow.polygon" - - def __init__( - self, *, interleaved: bool, dims: CoordinateDimension, large_list: bool = False - ): - self.coord_dimension = dims - - storage_type = polygon_storage_type( - interleaved=interleaved, dims=dims, large_list=large_list - ) - super().__init__(storage_type, self.extension_name) - - def __arrow_ext_serialize__(self): - return b"" - - @classmethod - def __arrow_ext_deserialize__(cls, storage_type: pa.DataType, serialized: bytes): - return cls(interleaved=True, dims=CoordinateDimension.XY) + return DataType.list(Field("polygons", polygons_type)) -class MultiPointType(BaseGeometryType): - extension_name = "geoarrow.multipoint" +def offsets_to_arrow( + offsets: Tuple[NDArray[np.int64], ...], +) -> Sequence[Array]: + # Shapely produces int64 offset arrays. We downcast those to int32 if possible + if any(offset_arr[-1] >= np.iinfo(np.int32).max for offset_arr in offsets): + return [Array.from_numpy(offset_arr) for offset_arr in offsets] - def __init__( - self, *, interleaved: bool, dims: CoordinateDimension, large_list: bool = False - ): - self.coord_dimension = dims - - storage_type = multipoint_storage_type( - interleaved=interleaved, dims=dims, large_list=large_list - ) - super().__init__(storage_type, self.extension_name) - - def __arrow_ext_serialize__(self): - return b"" - - @classmethod - def __arrow_ext_deserialize__(cls, storage_type: pa.DataType, serialized: bytes): - return cls(interleaved=True, dims=CoordinateDimension.XY) - - -class MultiLineStringType(BaseGeometryType): - extension_name = "geoarrow.multilinestring" - - def __init__( - self, *, interleaved: bool, dims: CoordinateDimension, large_list: bool = False - ): - self.coord_dimension = dims - - storage_type = multilinestring_storage_type( - interleaved=interleaved, dims=dims, large_list=large_list - ) - super().__init__(storage_type, self.extension_name) - - def __arrow_ext_serialize__(self): - return b"" - - @classmethod - def __arrow_ext_deserialize__(cls, storage_type: pa.DataType, serialized: bytes): - return cls(interleaved=True, dims=CoordinateDimension.XY) - - -class MultiPolygonType(BaseGeometryType): - extension_name = "geoarrow.multipolygon" - - def __init__( - self, *, interleaved: bool, dims: CoordinateDimension, large_list: bool = False - ): - self.coord_dimension = dims - - storage_type = multipolygon_storage_type( - interleaved=interleaved, dims=dims, large_list=large_list - ) - super().__init__(storage_type, self.extension_name) - - def __arrow_ext_serialize__(self): - return b"" - - @classmethod - def __arrow_ext_deserialize__(cls, storage_type: pa.DataType, serialized: bytes): - return cls(interleaved=True, dims=CoordinateDimension.XY) + return [Array.from_numpy(offset_arr.astype(np.int32)) for offset_arr in offsets] def construct_geometry_array( @@ -283,16 +170,14 @@ def construct_geometry_array( *, field_name: str = "geometry", crs_str: Optional[str] = None, -) -> Tuple[pa.Field, pa.Array]: +) -> Tuple[Field, Array]: import shapely from shapely import GeometryType - # NOTE: this implementation returns a (field, array) pair so that it can set the - # extension metadata on the field without instantiating extension types into the - # global pyarrow registry geom_type, coords, offsets = shapely.to_ragged_array( shapely_arr, include_z=include_z ) + offsets = offsets_to_arrow(offsets) if coords.shape[-1] == 2: dims = CoordinateDimension.XY @@ -306,89 +191,101 @@ def construct_geometry_array( extension_metadata["ARROW:extension:metadata"] = json.dumps({"crs": crs_str}) if geom_type == GeometryType.POINT: - parr = pa.FixedSizeListArray.from_arrays(coords.ravel("C"), len(dims)) + arrow_coords = fixed_size_list_array( + Array.from_numpy(coords.ravel("C")), len(dims) + ) extension_metadata["ARROW:extension:name"] = "geoarrow.point" - field = pa.field( + field = Field( field_name, - parr.type, + arrow_coords.type, nullable=True, metadata=extension_metadata, ) - return field, parr + return field, arrow_coords elif geom_type == GeometryType.LINESTRING: assert len(offsets) == 1, "Expected one offsets array" (geom_offsets,) = offsets - _parr = pa.FixedSizeListArray.from_arrays(coords.ravel("C"), len(dims)) - parr = pa.ListArray.from_arrays(pa.array(geom_offsets), _parr) + arrow_coords = fixed_size_list_array( + Array.from_numpy(coords.ravel("C")), len(dims) + ) + arrow_geoms = list_array(geom_offsets, arrow_coords) extension_metadata["ARROW:extension:name"] = "geoarrow.linestring" - field = pa.field( + field = Field( field_name, - parr.type, + arrow_geoms.type, nullable=True, metadata=extension_metadata, ) - return field, parr + return field, arrow_geoms elif geom_type == GeometryType.POLYGON: assert len(offsets) == 2, "Expected two offsets arrays" ring_offsets, geom_offsets = offsets - _parr = pa.FixedSizeListArray.from_arrays(coords.ravel("C"), len(dims)) - _parr1 = pa.ListArray.from_arrays(pa.array(ring_offsets), _parr) - parr = pa.ListArray.from_arrays(pa.array(geom_offsets), _parr1) + arrow_coords = fixed_size_list_array( + Array.from_numpy(coords.ravel("C")), len(dims) + ) + arrow_rings = list_array(ring_offsets, arrow_coords) + arrow_geoms = list_array(geom_offsets, arrow_rings) extension_metadata["ARROW:extension:name"] = "geoarrow.polygon" - field = pa.field( + field = Field( field_name, - parr.type, + arrow_geoms.type, nullable=True, metadata=extension_metadata, ) - return field, parr + return field, arrow_geoms elif geom_type == GeometryType.MULTIPOINT: assert len(offsets) == 1, "Expected one offsets array" (geom_offsets,) = offsets - _parr = pa.FixedSizeListArray.from_arrays(coords.ravel("C"), len(dims)) - parr = pa.ListArray.from_arrays(pa.array(geom_offsets), _parr) + arrow_coords = fixed_size_list_array( + Array.from_numpy(coords.ravel("C")), len(dims) + ) + arrow_geoms = list_array(geom_offsets, arrow_coords) extension_metadata["ARROW:extension:name"] = "geoarrow.multipoint" - field = pa.field( + field = Field( field_name, - parr.type, + arrow_geoms.type, nullable=True, metadata=extension_metadata, ) - return field, parr + return field, arrow_geoms elif geom_type == GeometryType.MULTILINESTRING: assert len(offsets) == 2, "Expected two offsets arrays" ring_offsets, geom_offsets = offsets - _parr = pa.FixedSizeListArray.from_arrays(coords.ravel("C"), len(dims)) - _parr1 = pa.ListArray.from_arrays(pa.array(ring_offsets), _parr) - parr = pa.ListArray.from_arrays(pa.array(geom_offsets), _parr1) + arrow_coords = fixed_size_list_array( + Array.from_numpy(coords.ravel("C")), len(dims) + ) + arrow_rings = list_array(ring_offsets, arrow_coords) + arrow_geoms = list_array(geom_offsets, arrow_rings) extension_metadata["ARROW:extension:name"] = "geoarrow.multilinestring" - field = pa.field( + field = Field( field_name, - parr.type, + arrow_geoms.type, nullable=True, metadata=extension_metadata, ) - return field, parr + return field, arrow_geoms elif geom_type == GeometryType.MULTIPOLYGON: assert len(offsets) == 3, "Expected three offsets arrays" ring_offsets, polygon_offsets, geom_offsets = offsets - _parr = pa.FixedSizeListArray.from_arrays(coords.ravel("C"), len(dims)) - _parr1 = pa.ListArray.from_arrays(pa.array(ring_offsets), _parr) - _parr2 = pa.ListArray.from_arrays(pa.array(polygon_offsets), _parr1) - parr = pa.ListArray.from_arrays(pa.array(geom_offsets), _parr2) + arrow_coords = fixed_size_list_array( + Array.from_numpy(coords.ravel("C")), len(dims) + ) + arrow_rings = list_array(ring_offsets, arrow_coords) + arrow_polygons = list_array(polygon_offsets, arrow_rings) + arrow_geoms = list_array(geom_offsets, arrow_polygons) extension_metadata["ARROW:extension:name"] = "geoarrow.multipolygon" - field = pa.field( + field = Field( field_name, - parr.type, + arrow_geoms.type, nullable=True, metadata=extension_metadata, ) - return field, parr + return field, arrow_geoms else: raise ValueError(f"Unsupported type for geoarrow: {geom_type}") diff --git a/lonboard/_geoarrow/geopandas_interop.py b/lonboard/_geoarrow/geopandas_interop.py index 6e8eb4aa..02e3082f 100644 --- a/lonboard/_geoarrow/geopandas_interop.py +++ b/lonboard/_geoarrow/geopandas_interop.py @@ -3,7 +3,9 @@ from typing import TYPE_CHECKING, List, Optional import numpy as np -import pyarrow as pa +from arro3.core import ChunkedArray, Table + +from lonboard._geoarrow.extension_types import construct_geometry_array if TYPE_CHECKING: import geopandas as gpd @@ -13,18 +15,19 @@ def geopandas_to_geoarrow( gdf: gpd.GeoDataFrame, columns: Optional[List[str]] = None, preserve_index: Optional[bool] = None, -): - from lonboard._geoarrow.extension_types import construct_geometry_array +) -> Table: + import pyarrow df_attr = gdf.drop(columns=[gdf._geometry_column_name]) if columns is not None: df_attr = df_attr[columns] - table = pa.Table.from_pandas(df_attr, preserve_index=preserve_index) + pyarrow_table = pyarrow.Table.from_pandas(df_attr, preserve_index=preserve_index) field, geom_arr = construct_geometry_array( np.array(gdf.geometry), crs_str=gdf.crs.to_json() if gdf.crs is not None else None, ) - - return table.append_column(field, geom_arr) + return Table.from_arrow(pyarrow_table).append_column( + field, ChunkedArray([geom_arr]) + ) diff --git a/lonboard/_geoarrow/ops/bbox.py b/lonboard/_geoarrow/ops/bbox.py index 6d3ab883..a26f5507 100644 --- a/lonboard/_geoarrow/ops/bbox.py +++ b/lonboard/_geoarrow/ops/bbox.py @@ -7,7 +7,8 @@ from typing import Tuple import numpy as np -import pyarrow as pa +from arro3.compute import list_flatten +from arro3.core import Array, ChunkedArray, DataType, Field from lonboard._constants import EXTENSION_NAME @@ -33,7 +34,7 @@ def to_tuple(self) -> Tuple[float, float, float, float]: return (self.minx, self.miny, self.maxx, self.maxy) -def total_bounds(field: pa.Field, column: pa.ChunkedArray) -> Bbox: +def total_bounds(field: Field, column: ChunkedArray) -> Bbox: """Compute the total bounds of a geometry column""" extension_type_name = field.metadata[b"ARROW:extension:name"] @@ -52,44 +53,47 @@ def total_bounds(field: pa.Field, column: pa.ChunkedArray) -> Bbox: assert False -def _coords_bbox(arr: pa.FixedSizeListArray) -> Bbox: - np_arr = arr.flatten().to_numpy().reshape(-1, arr.type.list_size) +def _coords_bbox(arr: Array) -> Bbox: + assert DataType.is_fixed_size_list(arr.type) + list_size = arr.type.list_size + assert list_size is not None + + np_arr = list_flatten(arr).to_numpy().reshape(-1, list_size) min_vals = np.min(np_arr, axis=0) max_vals = np.max(np_arr, axis=0) return Bbox(minx=min_vals[0], miny=min_vals[1], maxx=max_vals[0], maxy=max_vals[1]) -def _total_bounds_nest_0(column: pa.ChunkedArray) -> Bbox: +def _total_bounds_nest_0(column: ChunkedArray) -> Bbox: bbox = Bbox() - for chunk in column.chunks: - coords = chunk + for coords in column.chunks: bbox.update(_coords_bbox(coords)) return bbox -def _total_bounds_nest_1(column: pa.ChunkedArray) -> Bbox: +def _total_bounds_nest_1(column: ChunkedArray) -> Bbox: bbox = Bbox() - for chunk in column.chunks: - coords = chunk.flatten() + flat_array = list_flatten(column) + for coords in flat_array: bbox.update(_coords_bbox(coords)) return bbox -def _total_bounds_nest_2(column: pa.ChunkedArray) -> Bbox: +def _total_bounds_nest_2(column: ChunkedArray) -> Bbox: bbox = Bbox() - for chunk in column.chunks: - coords = chunk.flatten().flatten() + flat_array = list_flatten(list_flatten(column)) + for coords in flat_array: bbox.update(_coords_bbox(coords)) return bbox -def _total_bounds_nest_3(column: pa.ChunkedArray) -> Bbox: +def _total_bounds_nest_3(column: ChunkedArray) -> Bbox: bbox = Bbox() - for chunk in column.chunks: - coords = chunk.flatten().flatten().flatten() + flat_array = list_flatten(list_flatten(list_flatten(column))) + for coords in flat_array: bbox.update(_coords_bbox(coords)) return bbox diff --git a/lonboard/_geoarrow/ops/centroid.py b/lonboard/_geoarrow/ops/centroid.py index 875fd970..2b58a9f4 100644 --- a/lonboard/_geoarrow/ops/centroid.py +++ b/lonboard/_geoarrow/ops/centroid.py @@ -6,7 +6,8 @@ from typing import Optional import numpy as np -import pyarrow as pa +from arro3.compute import list_flatten +from arro3.core import Array, ChunkedArray, DataType, Field from lonboard._constants import EXTENSION_NAME @@ -49,7 +50,7 @@ def update(self, other: WeightedCentroid): ) self.num_items += new_chunk_len - def update_coords(self, coords: pa.FixedSizeListArray): + def update_coords(self, coords: Array): """Update the average for x and y based on a new chunk of data Note that this does not keep a cumulative sum due to precision concerns. Rather @@ -59,13 +60,17 @@ def update_coords(self, coords: pa.FixedSizeListArray): Note: this currently computes the mean weighted _per coordinate_ and not _per geometry_. """ - np_arr = coords.flatten().to_numpy().reshape(-1, coords.type.list_size) + assert DataType.is_fixed_size_list(coords.type) + list_size = coords.type.list_size + assert list_size is not None + + np_arr = list_flatten(coords).to_numpy().reshape(-1, list_size) new_chunk_len = np_arr.shape[0] if self.x is None or self.y is None: assert self.x is None and self.y is None and self.num_items == 0 - self.x = np.mean(np_arr[:, 0]) - self.y = np.mean(np_arr[:, 1]) + self.x = float(np.mean(np_arr[:, 0])) + self.y = float(np.mean(np_arr[:, 1])) self.num_items = new_chunk_len return @@ -78,16 +83,16 @@ def update_coords(self, coords: pa.FixedSizeListArray): existing_x_avg = self.x existing_y_avg = self.y - self.x = ( + self.x = float( existing_x_avg * existing_modifier + new_chunk_avg_x * new_chunk_modifier ) - self.y = ( + self.y = float( existing_y_avg * existing_modifier + new_chunk_avg_y * new_chunk_modifier ) self.num_items += new_chunk_len -def weighted_centroid(field: pa.Field, column: pa.ChunkedArray) -> WeightedCentroid: +def weighted_centroid(field: Field, column: ChunkedArray) -> WeightedCentroid: """Get the bounding box and geometric (weighted) center of the geometries in the table.""" extension_type_name = field.metadata[b"ARROW:extension:name"] @@ -107,7 +112,7 @@ def weighted_centroid(field: pa.Field, column: pa.ChunkedArray) -> WeightedCentr assert False -def _weighted_centroid_nest_0(column: pa.ChunkedArray) -> WeightedCentroid: +def _weighted_centroid_nest_0(column: ChunkedArray) -> WeightedCentroid: centroid = WeightedCentroid() for chunk in column.chunks: coords = chunk @@ -116,28 +121,28 @@ def _weighted_centroid_nest_0(column: pa.ChunkedArray) -> WeightedCentroid: return centroid -def _weighted_centroid_nest_1(column: pa.ChunkedArray) -> WeightedCentroid: +def _weighted_centroid_nest_1(column: ChunkedArray) -> WeightedCentroid: centroid = WeightedCentroid() - for chunk in column.chunks: - coords = chunk.flatten() + flat_array = list_flatten(column) + for coords in flat_array: centroid.update_coords(coords) return centroid -def _weighted_centroid_nest_2(column: pa.ChunkedArray) -> WeightedCentroid: +def _weighted_centroid_nest_2(column: ChunkedArray) -> WeightedCentroid: centroid = WeightedCentroid() - for chunk in column.chunks: - coords = chunk.flatten().flatten() + flat_array = list_flatten(list_flatten(column)) + for coords in flat_array: centroid.update_coords(coords) return centroid -def _weighted_centroid_nest_3(column: pa.ChunkedArray) -> WeightedCentroid: +def _weighted_centroid_nest_3(column: ChunkedArray) -> WeightedCentroid: centroid = WeightedCentroid() - for chunk in column.chunks: - coords = chunk.flatten().flatten().flatten() + flat_array = list_flatten(list_flatten(list_flatten(column))) + for coords in flat_array: centroid.update_coords(coords) return centroid diff --git a/lonboard/_geoarrow/ops/coord_layout.py b/lonboard/_geoarrow/ops/coord_layout.py index 67273518..e535d726 100644 --- a/lonboard/_geoarrow/ops/coord_layout.py +++ b/lonboard/_geoarrow/ops/coord_layout.py @@ -1,9 +1,17 @@ """Convert a GeoArrow array to interleaved representation""" -from typing import Tuple, Union +from typing import Tuple import numpy as np -import pyarrow as pa +from arro3.compute import struct_field +from arro3.core import ( + Array, + ChunkedArray, + DataType, + Field, + Table, + fixed_size_list_array, +) from lonboard._constants import EXTENSION_NAME from lonboard._geoarrow.ops.reproject import ( @@ -16,8 +24,8 @@ def transpose_table( - table: pa.Table, -) -> pa.Table: + table: Table, +) -> Table: """Convert geometry columns in table to interleaved coordinate layout""" geom_col_idx = get_geometry_column_index(table.schema) # No geometry column in table @@ -33,23 +41,23 @@ def transpose_table( def transpose_column( *, - field: pa.Field, - column: pa.ChunkedArray, -) -> Tuple[pa.Field, pa.ChunkedArray]: + field: Field, + column: ChunkedArray, +) -> Tuple[Field, ChunkedArray]: extension_type_name = field.metadata[b"ARROW:extension:name"] new_chunked_array = _transpose_column( column, - extension_type_name=extension_type_name, + extension_type_name=extension_type_name, # type: ignore ) return field.with_type(new_chunked_array.type), new_chunked_array def _transpose_column( - column: pa.ChunkedArray, + column: ChunkedArray, *, extension_type_name: EXTENSION_NAME, -) -> pa.ChunkedArray: +) -> ChunkedArray: if extension_type_name == EXTENSION_NAME.POINT: func = _transpose_chunk_nest_0 elif extension_type_name in [EXTENSION_NAME.LINESTRING, EXTENSION_NAME.MULTIPOINT]: @@ -65,40 +73,42 @@ def _transpose_column( else: raise ValueError(f"Unexpected extension type name {extension_type_name}") - return pa.chunked_array([func(chunk) for chunk in column.chunks]) + return ChunkedArray([func(chunk) for chunk in column.chunks]) -def _transpose_coords(arr: Union[pa.FixedSizeListArray, pa.StructArray]): - if isinstance(arr, pa.FixedSizeListArray): +def _transpose_coords(arr: Array): + if DataType.is_fixed_size_list(arr.type): return arr if arr.type.num_fields == 2: - x = arr.field("x").to_numpy() - y = arr.field("y").to_numpy() + x = struct_field(arr, [0]).to_numpy() + y = struct_field(arr, [1]).to_numpy() coords = np.column_stack([x, y]).ravel("C") - return pa.FixedSizeListArray.from_arrays(coords, 2) + flat_coords = Array.from_numpy(coords) + return fixed_size_list_array(flat_coords, 2) if arr.type.num_fields == 3: - x = arr.field("x").to_numpy() - y = arr.field("y").to_numpy() - z = arr.field("z").to_numpy() + x = struct_field(arr, [0]).to_numpy() + y = struct_field(arr, [1]).to_numpy() + z = struct_field(arr, [2]).to_numpy() coords = np.column_stack([x, y, z]).ravel("C") - return pa.FixedSizeListArray.from_arrays(coords, 3) + flat_coords = Array.from_numpy(coords) + return fixed_size_list_array(flat_coords, 3) raise ValueError(f"Expected struct with 2 or 3 fields, got {arr.type.num_fields}") -def _transpose_chunk_nest_0(arr: pa.ListArray): +def _transpose_chunk_nest_0(arr: Array): return _map_coords_nest_0(arr, _transpose_coords) -def _transpose_chunk_nest_1(arr: pa.ListArray): +def _transpose_chunk_nest_1(arr: Array): return _map_coords_nest_1(arr, _transpose_coords) -def _transpose_chunk_nest_2(arr: pa.ListArray): +def _transpose_chunk_nest_2(arr: Array): return _map_coords_nest_2(arr, _transpose_coords) -def _transpose_chunk_nest_3(arr: pa.ListArray): +def _transpose_chunk_nest_3(arr: Array): return _map_coords_nest_3(arr, _transpose_coords) diff --git a/lonboard/_geoarrow/ops/reproject.py b/lonboard/_geoarrow/ops/reproject.py index 7623fb1c..31bd27e2 100644 --- a/lonboard/_geoarrow/ops/reproject.py +++ b/lonboard/_geoarrow/ops/reproject.py @@ -8,7 +8,16 @@ from warnings import warn import numpy as np -import pyarrow as pa +from arro3.compute import list_flatten, list_offsets +from arro3.core import ( + Array, + ChunkedArray, + DataType, + Field, + Table, + fixed_size_list_array, + list_array, +) from pyproj import CRS, Transformer from lonboard._constants import EPSG_4326, EXTENSION_NAME, OGC_84 @@ -27,11 +36,11 @@ def no_crs_warning(): def reproject_table( - table: pa.Table, + table: Table, *, to_crs: Union[str, CRS] = OGC_84, max_workers: Optional[int] = None, -) -> pa.Table: +) -> Table: """Reproject a GeoArrow table to a new CRS Args: @@ -63,11 +72,11 @@ def reproject_table( def reproject_column( *, - field: pa.Field, - column: pa.ChunkedArray, + field: Field, + column: ChunkedArray, to_crs: Union[str, CRS] = OGC_84, max_workers: Optional[int] = None, -) -> Tuple[pa.Field, pa.ChunkedArray]: +) -> Tuple[Field, ChunkedArray]: """Reproject a GeoArrow array to a new CRS Args: @@ -102,12 +111,12 @@ def reproject_column( new_extension_meta_meta = {"crs": CRS(to_crs).to_json()} new_extension_metadata = { b"ARROW:extension:name": extension_type_name, - b"ARROW:extension:metadata": json.dumps(new_extension_meta_meta), + b"ARROW:extension:metadata": json.dumps(new_extension_meta_meta).encode(), } new_chunked_array = _reproject_column( column, - extension_type_name=extension_type_name, + extension_type_name=extension_type_name, # type: ignore transformer=transformer, max_workers=max_workers, ) @@ -118,12 +127,12 @@ def reproject_column( def _reproject_column( - column: pa.ChunkedArray, + column: ChunkedArray, *, extension_type_name: EXTENSION_NAME, transformer: Transformer, max_workers: Optional[int] = None, -) -> pa.ChunkedArray: +) -> ChunkedArray: if extension_type_name == EXTENSION_NAME.POINT: func = partial(_reproject_chunk_nest_0, transformer=transformer) elif extension_type_name in [EXTENSION_NAME.LINESTRING, EXTENSION_NAME.MULTIPOINT]: @@ -140,12 +149,13 @@ def _reproject_column( raise ValueError(f"Unexpected extension type name {extension_type_name}") with ThreadPoolExecutor(max_workers=max_workers) as executor: - return pa.chunked_array(executor.map(func, column.chunks)) + return ChunkedArray(list(executor.map(func, column.chunks))) -def _reproject_coords(arr: pa.FixedSizeListArray, transformer: Transformer): +def _reproject_coords(arr: Array, transformer: Transformer): list_size = arr.type.list_size - np_arr = arr.flatten().to_numpy().reshape(-1, list_size) + assert list_size is not None + np_arr = list_flatten(arr).to_numpy().reshape(-1, list_size) if list_size == 2: output_np_arr = np.column_stack( @@ -160,85 +170,76 @@ def _reproject_coords(arr: pa.FixedSizeListArray, transformer: Transformer): else: raise ValueError(f"Unexpected list size {list_size}") - coord_field = pa.list_(pa.field(dims, pa.float64()), len(dims)) - return pa.FixedSizeListArray.from_arrays(output_np_arr.ravel("C"), type=coord_field) + coord_field = DataType.list(Field(dims, DataType.float64()), len(dims)) + return fixed_size_list_array( + Array.from_numpy(output_np_arr.ravel("C")), + len(dims), + type=coord_field, + ) -def _reproject_chunk_nest_0(arr: pa.ListArray, transformer: Transformer): +def _reproject_chunk_nest_0(arr: Array, transformer: Transformer): callback = partial(_reproject_coords, transformer=transformer) return _map_coords_nest_0(arr, callback) -def _reproject_chunk_nest_1(arr: pa.ListArray, transformer: Transformer): +def _reproject_chunk_nest_1(arr: Array, transformer: Transformer): callback = partial(_reproject_coords, transformer=transformer) return _map_coords_nest_1(arr, callback) -def _reproject_chunk_nest_2(arr: pa.ListArray, transformer: Transformer): +def _reproject_chunk_nest_2(arr: Array, transformer: Transformer): callback = partial(_reproject_coords, transformer=transformer) return _map_coords_nest_2(arr, callback) -def _reproject_chunk_nest_3(arr: pa.ListArray, transformer: Transformer): +def _reproject_chunk_nest_3(arr: Array, transformer: Transformer): callback = partial(_reproject_coords, transformer=transformer) return _map_coords_nest_3(arr, callback) -def _copy_sliced_offsets(offsets: pa.Int32Array) -> pa.Int32Array: - """ - When operating on _sliced_ input, the physical offsets are incorrect because the - current array points to a range not at the beginning of the array. So when creating - new arrays that are not sliced, we need to subtract off the original offset of the - first element. - """ - if offsets[0].as_py() == 0: - return offsets - else: - return pa.array(offsets.to_numpy() - offsets[0].as_py()) - - def _map_coords_nest_0( - arr: pa.FixedSizeListArray, - callback: Callable[[pa.FixedSizeListArray], pa.FixedSizeListArray], -): + arr: Array, + callback: Callable[[Array], Array], +) -> Array: new_coords = callback(arr) return new_coords def _map_coords_nest_1( - arr: pa.ListArray, - callback: Callable[[pa.FixedSizeListArray], pa.FixedSizeListArray], -): - geom_offsets = _copy_sliced_offsets(arr.offsets) - coords = arr.flatten() + arr: Array, + callback: Callable[[Array], Array], +) -> Array: + geom_offsets = list_offsets(arr, logical=True) + coords = list_flatten(arr) new_coords = callback(coords) - new_geometry_array = pa.ListArray.from_arrays(geom_offsets, new_coords) + new_geometry_array = list_array(geom_offsets, new_coords) return new_geometry_array def _map_coords_nest_2( - arr: pa.ListArray, - callback: Callable[[pa.FixedSizeListArray], pa.FixedSizeListArray], + arr: Array, + callback: Callable[[Array], Array], ): - geom_offsets = _copy_sliced_offsets(arr.offsets) - ring_offsets = _copy_sliced_offsets(arr.flatten().offsets) - coords = arr.flatten().flatten() + geom_offsets = list_offsets(arr, logical=True) + ring_offsets = list_offsets(list_flatten(arr), logical=True) + coords = list_flatten(list_flatten(arr)) new_coords = callback(coords) - new_ring_array = pa.ListArray.from_arrays(ring_offsets, new_coords) - new_geometry_array = pa.ListArray.from_arrays(geom_offsets, new_ring_array) + new_ring_array = list_array(ring_offsets, new_coords) + new_geometry_array = list_array(geom_offsets, new_ring_array) return new_geometry_array def _map_coords_nest_3( - arr: pa.ListArray, - callback: Callable[[pa.FixedSizeListArray], pa.FixedSizeListArray], + arr: Array, + callback: Callable[[Array], Array], ): - geom_offsets = _copy_sliced_offsets(arr.offsets) - polygon_offsets = _copy_sliced_offsets(arr.flatten().offsets) - ring_offsets = _copy_sliced_offsets(arr.flatten().flatten().offsets) - coords = arr.flatten().flatten().flatten() + geom_offsets = list_offsets(arr, logical=True) + polygon_offsets = list_offsets(list_flatten(arr), logical=True) + ring_offsets = list_offsets(list_flatten(list_flatten(arr)), logical=True) + coords = list_flatten(list_flatten(list_flatten(arr))) new_coords = callback(coords) - new_ring_array = pa.ListArray.from_arrays(ring_offsets, new_coords) - new_polygon_array = pa.ListArray.from_arrays(polygon_offsets, new_ring_array) - new_geometry_array = pa.ListArray.from_arrays(geom_offsets, new_polygon_array) + new_ring_array = list_array(ring_offsets, new_coords) + new_polygon_array = list_array(polygon_offsets, new_ring_array) + new_geometry_array = list_array(geom_offsets, new_polygon_array) return new_geometry_array diff --git a/lonboard/_geoarrow/parse_wkb.py b/lonboard/_geoarrow/parse_wkb.py index ce548999..ba007cbc 100644 --- a/lonboard/_geoarrow/parse_wkb.py +++ b/lonboard/_geoarrow/parse_wkb.py @@ -1,10 +1,10 @@ """Handle GeoArrow tables with WKB-encoded geometry""" import json -from typing import List +from typing import Dict, List import numpy as np -import pyarrow as pa +from arro3.core import Array, Table from lonboard._constants import EXTENSION_NAME, OGC_84 from lonboard._geoarrow.crs import get_field_crs @@ -13,7 +13,7 @@ from lonboard._utils import get_geometry_column_index -def parse_serialized_table(table: pa.Table) -> List[pa.Table]: +def parse_serialized_table(table: Table) -> List[Table]: """Parse a table with a serialized WKB/WKT column into GeoArrow-native geometries. If no columns are WKB/WKT-encoded, returns the input. Note that WKB columns must be @@ -79,30 +79,40 @@ def parse_serialized_table(table: pa.Table) -> List[pa.Table]: # Starting from polygons, then linestrings, then points, # so that the order of generated layers is polygon, then path then scatterplot. # This ensures that points are rendered on top and polygons on the bottom. - parsed_tables = [] + parsed_tables: List[Table] = [] for single_type_geometry_indices in ( polygon_indices, linestring_indices, point_indices, ): - if len(single_type_geometry_indices) > 0: - single_type_geometry_field, single_type_geometry_arr = ( - construct_geometry_array( - shapely_arr[single_type_geometry_indices], - crs_str=crs_str, - ) - ) - single_type_geometry_table = table.take( - single_type_geometry_indices - ).set_column( - field_idx, single_type_geometry_field, single_type_geometry_arr - ) - parsed_tables.append(single_type_geometry_table) + if len(single_type_geometry_indices) == 0: + continue + + single_type_geometry_field, single_type_geometry_arr = construct_geometry_array( + shapely_arr[single_type_geometry_indices], + crs_str=crs_str, + ) + + concatted_table = table.combine_chunks() + batches = concatted_table.to_batches() + assert len(batches) == 1 + + assert single_type_geometry_indices.dtype == np.int64 + single_type_geometry_indices_arrow = Array.from_numpy( + single_type_geometry_indices + ) + + single_type_geometry_record_batch = ( + batches[0] + .take(single_type_geometry_indices_arrow) + .set_column(field_idx, single_type_geometry_field, single_type_geometry_arr) + ) + parsed_tables.append(Table.from_batches([single_type_geometry_record_batch])) return parsed_tables -def parse_geoparquet_table(table: pa.Table) -> pa.Table: +def parse_geoparquet_table(table: Table) -> Table: """Parse GeoParquet table metadata, assigning it to GeoArrow metadata""" # If a column already has geoarrow metadata, don't parse from GeoParquet metadata if get_geometry_column_index(table.schema) is not None: @@ -129,9 +139,9 @@ def parse_geoparquet_table(table: pa.Table) -> pa.Table: existing_field = table.schema.field(column_idx) existing_column = table.column(column_idx) crs_metadata = {"crs": column_meta.get("crs", OGC_84.to_json_dict())} - metadata = { + metadata: Dict[bytes, bytes] = { b"ARROW:extension:name": EXTENSION_NAME.WKB, - b"ARROW:extension:metadata": json.dumps(crs_metadata), + b"ARROW:extension:metadata": json.dumps(crs_metadata).encode(), } new_field = existing_field.with_metadata(metadata) table = table.set_column(column_idx, new_field, existing_column) diff --git a/lonboard/_geoarrow/sanitize.py b/lonboard/_geoarrow/sanitize.py deleted file mode 100644 index faa98716..00000000 --- a/lonboard/_geoarrow/sanitize.py +++ /dev/null @@ -1,59 +0,0 @@ -"""Remove custom geoarrow.pyarrow types from input geoarrow data""" - -import json -from typing import Tuple - -import pyarrow as pa -from pyproj import CRS - - -def remove_extension_classes(table: pa.Table) -> pa.Table: - """ - Convert any registered geoarrow.pyarrow extension fields and arrays to plain - metadata - """ - for field_idx in range(len(table.schema)): - field = table.field(field_idx) - column = table.column(field_idx) - - if isinstance(field.type, pa.ExtensionType): - assert all(isinstance(chunk, pa.ExtensionArray) for chunk in column.chunks) - new_field, new_column = sanitize_column(field, column) - table = table.set_column(field_idx, new_field, new_column) - - return table - - -def sanitize_column( - field: pa.Field, column: pa.ChunkedArray -) -> Tuple[pa.Field, pa.ChunkedArray]: - """ - Convert a registered geoarrow.pyarrow extension field and column to plain metadata - """ - import geoarrow.pyarrow as gap - - extension_metadata = {} - if field.type.crs: - extension_metadata["crs"] = CRS.from_user_input(field.type.crs).to_json() - - if field.type.edge_type == gap.EdgeType.SPHERICAL: - extension_metadata["edges"] = "spherical" - - metadata = { - "ARROW:extension:name": field.type.extension_name, - } - if extension_metadata: - metadata["ARROW:extension:metadata"] = json.dumps(extension_metadata) - - new_field = pa.field( - field.name, field.type.storage_type, nullable=field.nullable, metadata=metadata - ) - - new_chunks = [] - for chunk in column.chunks: - if hasattr(chunk, "storage"): - new_chunks.append(chunk.storage) - else: - new_chunks.append(chunk.cast(new_field.type)) - - return new_field, pa.chunked_array(new_chunks) diff --git a/lonboard/_geoarrow/utils.py b/lonboard/_geoarrow/utils.py index a0590559..9ca5c59e 100644 --- a/lonboard/_geoarrow/utils.py +++ b/lonboard/_geoarrow/utils.py @@ -1,7 +1,9 @@ +from __future__ import annotations + from lonboard._constants import EXTENSION_NAME -def is_native_geoarrow(extension_type_name: bytes) -> bool: +def is_native_geoarrow(extension_type_name: bytes | None) -> bool: """Return True if this GeoArrow column has a "native" coordinate representation This will return false for WKB and WKT-serialized arrays. diff --git a/lonboard/_layer.py b/lonboard/_layer.py index 8962e59a..54456e8a 100644 --- a/lonboard/_layer.py +++ b/lonboard/_layer.py @@ -20,8 +20,8 @@ ) import ipywidgets -import pyarrow as pa import traitlets +from arro3.core import Table from lonboard._base import BaseExtension, BaseWidget from lonboard._constants import EXTENSION_NAME, OGC_84 @@ -32,7 +32,6 @@ from lonboard._geoarrow.ops.centroid import WeightedCentroid, weighted_centroid from lonboard._geoarrow.ops.coord_layout import transpose_table from lonboard._geoarrow.parse_wkb import parse_serialized_table -from lonboard._geoarrow.sanitize import remove_extension_classes from lonboard._serialization import infer_rows_per_chunk from lonboard._utils import auto_downcast as _auto_downcast from lonboard._utils import get_geometry_column_index, remove_extension_kwargs @@ -42,6 +41,7 @@ NormalAccessor, PyarrowTableTrait, ) +from lonboard.types.arrow import ArrowStreamExportable if TYPE_CHECKING: import geopandas as gpd @@ -233,7 +233,7 @@ def _add_extension_traits(self, extensions: Sequence[BaseExtension]): def default_geoarrow_viewport( - table: pa.Table, + table: Table, ) -> Optional[Tuple[Bbox, WeightedCentroid]]: # Note: in the ArcLayer we won't necessarily have a column with a geoarrow # extension type/metadata @@ -286,40 +286,35 @@ class BaseArrowLayer(BaseLayer): def __init__( self, *, - table: pa.Table, + table: ArrowStreamExportable, _rows_per_chunk: Optional[int] = None, **kwargs: Unpack[BaseLayerKwargs], ): - # Check for Arrow PyCapsule Interface - # https://arrow.apache.org/docs/format/CDataInterface/PyCapsuleInterface.html - if not isinstance(table, pa.Table) and hasattr(table, "__arrow_c_stream__"): - table = pa.table(table) - - table = remove_extension_classes(table) - parsed_tables = parse_serialized_table(table) + table_o3 = Table.from_arrow(table) + parsed_tables = parse_serialized_table(table_o3) assert len(parsed_tables) == 1, ( "Mixed geometry type input not supported here. Use the top " "level viz() function or separate your geometry types in advanced." ) - table = parsed_tables[0] - table = transpose_table(table) + table_o3 = parsed_tables[0] + table_o3 = transpose_table(table_o3) # Reproject table to WGS84 if needed # Note this must happen before calculating the default viewport - table = reproject_table(table, to_crs=OGC_84) + table_o3 = reproject_table(table_o3, to_crs=OGC_84) - default_viewport = default_geoarrow_viewport(table) + default_viewport = default_geoarrow_viewport(table_o3) if default_viewport is not None: self._bbox = default_viewport[0] self._weighted_centroid = default_viewport[1] - rows_per_chunk = _rows_per_chunk or infer_rows_per_chunk(table) + rows_per_chunk = _rows_per_chunk or infer_rows_per_chunk(table_o3) if rows_per_chunk <= 0: raise ValueError("Cannot serialize table with 0 rows per chunk.") self._rows_per_chunk = rows_per_chunk - super().__init__(table=table, **kwargs) + super().__init__(table=table_o3, **kwargs) @classmethod def from_geopandas( @@ -688,7 +683,7 @@ class ColumnLayer(BaseArrowLayer): def __init__( self, *, - table: pa.Table, + table: ArrowStreamExportable, _rows_per_chunk: Optional[int] = None, **kwargs: Unpack[ColumnLayerKwargs], ): @@ -975,7 +970,7 @@ class PolygonLayer(BaseArrowLayer): def __init__( self, *, - table: pa.Table, + table: ArrowStreamExportable, _rows_per_chunk: Optional[int] = None, **kwargs: Unpack[PolygonLayerKwargs], ): @@ -1220,7 +1215,7 @@ class ScatterplotLayer(BaseArrowLayer): def __init__( self, *, - table: pa.Table, + table: ArrowStreamExportable, _rows_per_chunk: Optional[int] = None, **kwargs: Unpack[ScatterplotLayerKwargs], ): @@ -1462,7 +1457,7 @@ class PathLayer(BaseArrowLayer): def __init__( self, *, - table: pa.Table, + table: ArrowStreamExportable, _rows_per_chunk: Optional[int] = None, **kwargs: Unpack[PathLayerKwargs], ): @@ -1633,7 +1628,7 @@ class PointCloudLayer(BaseArrowLayer): def __init__( self, *, - table: pa.Table, + table: ArrowStreamExportable, _rows_per_chunk: Optional[int] = None, **kwargs: Unpack[PointCloudLayerKwargs], ): @@ -1766,7 +1761,7 @@ class SolidPolygonLayer(BaseArrowLayer): def __init__( self, *, - table: pa.Table, + table: ArrowStreamExportable, _rows_per_chunk: Optional[int] = None, **kwargs: Unpack[SolidPolygonLayerKwargs], ): @@ -1930,10 +1925,13 @@ class HeatmapLayer(BaseArrowLayer): """ - def __init__(self, *, table: pa.Table, **kwargs: Unpack[HeatmapLayerKwargs]): + def __init__( + self, *, table: ArrowStreamExportable, **kwargs: Unpack[HeatmapLayerKwargs] + ): # NOTE: we override the default for _rows_per_chunk because otherwise we render # one heatmap per _chunk_ not for the entire dataset. - super().__init__(table=table, _rows_per_chunk=len(table), **kwargs) + table_o3 = Table.from_arrow(table) + super().__init__(table=table, _rows_per_chunk=len(table_o3), **kwargs) @classmethod def from_geopandas( diff --git a/lonboard/_serialization.py b/lonboard/_serialization.py index 0ea02d70..04c051d3 100644 --- a/lonboard/_serialization.py +++ b/lonboard/_serialization.py @@ -1,15 +1,20 @@ +from __future__ import annotations + import math from io import BytesIO -from typing import List, Optional, Tuple, Union +from typing import TYPE_CHECKING, List, Optional, Tuple, Union import numpy as np -import pyarrow as pa -import pyarrow.parquet as pq -from numpy.typing import NDArray +from arro3.core import Array, ChunkedArray, Table +from arro3.io import write_parquet from traitlets import TraitError from lonboard.models import ViewState +if TYPE_CHECKING: + from numpy.typing import NDArray + + DEFAULT_PARQUET_COMPRESSION = "ZSTD" DEFAULT_PARQUET_COMPRESSION_LEVEL = 7 DEFAULT_PARQUET_CHUNK_SIZE = 2**16 @@ -22,36 +27,41 @@ DEFAULT_MAX_NUM_CHUNKS = 32 -def serialize_table_to_parquet(table: pa.Table, *, max_chunksize: int) -> List[bytes]: +def serialize_table_to_parquet(table: Table, *, max_chunksize: int) -> List[bytes]: buffers: List[bytes] = [] # NOTE: passing `max_chunksize=0` creates an infinite loop # https://github.com/apache/arrow/issues/39788 assert max_chunksize > 0 - for record_batch in table.to_batches(max_chunksize=max_chunksize): + compression_string = ( + f"{DEFAULT_PARQUET_COMPRESSION}({DEFAULT_PARQUET_COMPRESSION_LEVEL})" + ) + # TODO: restore rechunking + # max_chunksize=max_chunksize + for record_batch in table.to_batches(): with BytesIO() as bio: - with pq.ParquetWriter( + # Occasionally it's possible for there to be empty batches in the + # pyarrow table. This will error when writing to parquet. We want to + # give a more informative error. + if record_batch.num_rows == 0: + raise ValueError("Batch with 0 rows.") + + write_parquet( + table, bio, - schema=table.schema, - compression=DEFAULT_PARQUET_COMPRESSION, - compression_level=DEFAULT_PARQUET_COMPRESSION_LEVEL, - ) as writer: - # Occasionally it's possible for there to be empty batches in the - # pyarrow table. This will error when writing to parquet. We want to - # give a more informative error. - if record_batch.num_rows == 0: - raise ValueError("Batch with 0 rows.") - - writer.write_batch(record_batch, row_group_size=record_batch.num_rows) - + compression=compression_string, + max_row_group_size=record_batch.num_rows, + ) buffers.append(bio.getvalue()) return buffers -def serialize_pyarrow_column(data: pa.Array, *, max_chunksize: int) -> List[bytes]: +def serialize_pyarrow_column( + data: Array | ChunkedArray, *, max_chunksize: int +) -> List[bytes]: """Serialize a pyarrow column to a Parquet file with one column""" - pyarrow_table = pa.table({"value": data}) + pyarrow_table = Table.from_pydict({"value": data}) return serialize_table_to_parquet(pyarrow_table, max_chunksize=max_chunksize) @@ -64,17 +74,17 @@ def serialize_accessor(data: Union[List[int], Tuple[int], NDArray[np.uint8]], ob if isinstance(data, (str, int, float, list, tuple, bytes)): return data - assert isinstance(data, (pa.ChunkedArray, pa.Array)) + assert isinstance(data, (ChunkedArray, Array)) validate_accessor_length_matches_table(data, obj.table) return serialize_pyarrow_column(data, max_chunksize=obj._rows_per_chunk) def serialize_table(data, obj): - assert isinstance(data, pa.Table), "expected pyarrow table" + assert isinstance(data, Table), "expected Arrow table" return serialize_table_to_parquet(data, max_chunksize=obj._rows_per_chunk) -def infer_rows_per_chunk(table: pa.Table) -> int: +def infer_rows_per_chunk(table: Table) -> int: # At least one chunk num_chunks = max(round(table.nbytes / DEFAULT_ARROW_CHUNK_BYTES_SIZE), 1) @@ -85,7 +95,9 @@ def infer_rows_per_chunk(table: pa.Table) -> int: return rows_per_chunk -def validate_accessor_length_matches_table(accessor, table): +def validate_accessor_length_matches_table( + accessor: Array | ChunkedArray, table: Table +): if len(accessor) != len(table): raise TraitError("accessor must have same length as table") diff --git a/lonboard/_utils.py b/lonboard/_utils.py index f24d95ae..cc5927fa 100644 --- a/lonboard/_utils.py +++ b/lonboard/_utils.py @@ -3,7 +3,7 @@ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Sequence, TypeVar import numpy as np -import pyarrow as pa +from arro3.core import Schema from lonboard._base import BaseExtension from lonboard._compat import check_pandas_version @@ -18,7 +18,7 @@ GEOARROW_EXTENSION_TYPE_NAMES = {e.value for e in EXTENSION_NAME} -def get_geometry_column_index(schema: pa.Schema) -> Optional[int]: +def get_geometry_column_index(schema: Schema) -> Optional[int]: """Get the positional index of the geometry column in a pyarrow Schema""" field_idxs = [] @@ -57,7 +57,7 @@ def auto_downcast(df: DF) -> DF: # `convert_dtypes(dtype_backend="pyarrow")` fails on the geometory column, but we # also have to manually cast to a non-geo data frame because it'll fail to convert # dtypes on a GeoDataFrame without a geom col - casted_df = pd.DataFrame(df.select_dtypes(exclude="geometry")).convert_dtypes( + casted_df = pd.DataFrame(df.select_dtypes(exclude="geometry")).convert_dtypes( # type: ignore infer_objects=True, convert_string=True, convert_integer=True, diff --git a/lonboard/_viz.py b/lonboard/_viz.py index a23fb878..a12e6a94 100644 --- a/lonboard/_viz.py +++ b/lonboard/_viz.py @@ -18,16 +18,14 @@ ) import numpy as np -import pyarrow as pa -import pyarrow.compute as pc -from numpy.typing import NDArray +from arro3.compute import struct_field +from arro3.core import Array, ChunkedArray, Schema, Table from lonboard._compat import check_pandas_version from lonboard._constants import EXTENSION_NAME from lonboard._geoarrow.extension_types import construct_geometry_array from lonboard._geoarrow.geopandas_interop import geopandas_to_geoarrow from lonboard._geoarrow.parse_wkb import parse_serialized_table -from lonboard._geoarrow.sanitize import remove_extension_classes from lonboard._layer import PathLayer, PolygonLayer, ScatterplotLayer from lonboard._map import Map from lonboard._utils import get_geometry_column_index, split_mixed_gdf @@ -36,9 +34,12 @@ if TYPE_CHECKING: import duckdb import geopandas as gpd + import pyarrow import shapely.geometry import shapely.geometry.base + from numpy.typing import NDArray + from lonboard.types.arrow import ArrowArrayExportable, ArrowStreamExportable from lonboard.types.layer import ( PathLayerKwargs, PolygonLayerKwargs, @@ -50,20 +51,10 @@ class GeoInterfaceProtocol(Protocol): @property def __geo_interface__(self) -> dict: ... - class ArrowArrayExportable(Protocol): - def __arrow_c_array__( - self, requested_schema: object | None = None - ) -> Tuple[object, object]: ... - - class ArrowStreamExportable(Protocol): - def __arrow_c_stream__( - self, requested_schema: object | None = None - ) -> object: ... - VizDataInput = Union[ gpd.GeoDataFrame, gpd.GeoSeries, - pa.Table, + pyarrow.Table, NDArray[np.object_], shapely.geometry.base.BaseGeometry, ArrowArrayExportable, @@ -282,10 +273,6 @@ def create_layers_from_data_input( ): raise TypeError(DUCKDB_PY_CONN_ERROR) - # pyarrow table - if isinstance(data, pa.Table): - return _viz_geoarrow_table(data, **kwargs) - # Shapely array if isinstance(data, np.ndarray) and np.issubdtype(data.dtype, np.object_): return _viz_shapely_array(data, **kwargs) @@ -304,7 +291,7 @@ def create_layers_from_data_input( # Anything with __arrow_c_stream__ if hasattr(data, "__arrow_c_stream__"): data = cast("ArrowStreamExportable", data) - return _viz_geoarrow_table(pa.table(data), **kwargs) + return _viz_geoarrow_table(Table.from_arrow(data), **kwargs) # Anything with __geo_interface__ if hasattr(data, "__geo_interface__"): @@ -385,6 +372,7 @@ def _viz_shapely_array( def _viz_geo_interface( data: dict, **kwargs ) -> List[Union[ScatterplotLayer, PathLayer, PolygonLayer]]: + import pyarrow as pa import shapely if data["type"] in [ @@ -420,7 +408,7 @@ def _viz_geo_interface( arrays = [] for field_idx in range(attribute_columns_struct.type.num_fields): fields.append(attribute_columns_struct.type.field(field_idx)) - arrays.append(pc.struct_field(attribute_columns_struct, field_idx)) # type: ignore + arrays.append(struct_field(attribute_columns_struct, field_idx)) # type: ignore table = pa.Table.from_arrays(arrays, schema=pa.schema(fields)) df = table.to_pandas(types_mapper=pd.ArrowDtype) @@ -439,57 +427,33 @@ def _viz_geoarrow_array( data: ArrowArrayExportable, **kwargs, ) -> List[Union[ScatterplotLayer, PathLayer, PolygonLayer]]: - schema_capsule, array_capsule = data.__arrow_c_array__() - - # If the user doesn't have pyarrow extension types registered for geoarrow types, - # `pa.array()` will lose the extension metadata. Instead, we manually persist the - # extension metadata by extracting both the field and the array. - - class ArrayHolder: - schema_capsule: object - array_capsule: object - - def __init__(self, schema_capsule, array_capsule) -> None: - self.schema_capsule = schema_capsule - self.array_capsule = array_capsule - - def __arrow_c_array__(self, requested_schema): - return self.schema_capsule, self.array_capsule - - if not hasattr(pa.Field, "_import_from_c_capsule"): - raise KeyError( - "Incompatible version of pyarrow: pa.Field does not have" - " _import_from_c_capsule method" - ) - - field = pa.Field._import_from_c_capsule(schema_capsule) - array = pa.array(ArrayHolder(field.__arrow_c_schema__(), array_capsule)) - schema = pa.schema([field.with_name("geometry")]) - table = pa.Table.from_arrays([array], schema=schema) + array = Array.from_arrow(data) + field = array.field.with_name("geometry") + schema = Schema([field]) + table = Table.from_arrays([array], schema=schema) num_rows = len(array) if num_rows <= np.iinfo(np.uint8).max: - arange_col = np.arange(num_rows, dtype=np.uint8) + arange_col = Array.from_numpy(np.arange(num_rows, dtype=np.uint8)) elif num_rows <= np.iinfo(np.uint16).max: - arange_col = np.arange(num_rows, dtype=np.uint16) + arange_col = Array.from_numpy(np.arange(num_rows, dtype=np.uint16)) elif num_rows <= np.iinfo(np.uint32).max: - arange_col = np.arange(num_rows, dtype=np.uint32) + arange_col = Array.from_numpy(np.arange(num_rows, dtype=np.uint32)) else: - arange_col = np.arange(num_rows, dtype=np.uint64) + arange_col = Array.from_numpy(np.arange(num_rows, dtype=np.uint64)) - table = table.append_column("row_index", pa.array(arange_col)) + table = table.append_column("row_index", ChunkedArray([arange_col])) return _viz_geoarrow_table(table, **kwargs) def _viz_geoarrow_table( - table: pa.Table, + table: Table, *, _viz_color: str, scatterplot_kwargs: Optional[ScatterplotLayerKwargs] = None, path_kwargs: Optional[PathLayerKwargs] = None, polygon_kwargs: Optional[PolygonLayerKwargs] = None, ) -> List[Union[ScatterplotLayer, PathLayer, PolygonLayer]]: - table = remove_extension_classes(table) parsed_tables = parse_serialized_table(table) if len(parsed_tables) > 1: output: List[Union[ScatterplotLayer, PathLayer, PolygonLayer]] = [] @@ -509,6 +473,10 @@ def _viz_geoarrow_table( table = parsed_tables[0] geometry_column_index = get_geometry_column_index(table.schema) + assert ( + geometry_column_index is not None + ), "One column must have GeoArrow extension metadata" + geometry_field = table.schema.field(geometry_column_index) geometry_ext_type = geometry_field.metadata.get(b"ARROW:extension:name") diff --git a/lonboard/colormap.py b/lonboard/colormap.py index 81c1fc04..f903316b 100644 --- a/lonboard/colormap.py +++ b/lonboard/colormap.py @@ -4,13 +4,12 @@ import matplotlib as mpl import numpy as np -import pyarrow as pa -import pyarrow.compute as pc -from numpy.typing import NDArray from palettable.palette import Palette if TYPE_CHECKING: import pandas as pd + import pyarrow as pa + from numpy.typing import NDArray __all__ = ( @@ -154,7 +153,16 @@ def apply_categorical_cmap( dimension will have a length of either `3` if `alpha` is `None`, or `4` is each color has an alpha value. """ + import pyarrow as pa + import pyarrow.compute as pc + # Import from PyCapsule interface + if hasattr(values, "__arrow_c_array__"): + values = pa.array(values) + elif hasattr(values, "__arrow_c_stream__"): + values = pa.chunked_array(values) + + # Construct from non-arrow data if not isinstance(values, (pa.Array, pa.ChunkedArray)): values = pa.array(values) diff --git a/lonboard/traits.py b/lonboard/traits.py index aadc8ec1..1f3c9e05 100644 --- a/lonboard/traits.py +++ b/lonboard/traits.py @@ -7,17 +7,24 @@ from __future__ import annotations import warnings -from typing import Any, List, Optional, Set, Tuple, Union, cast +from typing import TYPE_CHECKING, Any, List, NoReturn, Optional, Set, Tuple, Union +from typing import cast as type_cast from urllib.parse import urlparse import matplotlib as mpl import numpy as np -import pyarrow as pa import traitlets +from arro3.core import ( + Array, + ChunkedArray, + DataType, + Field, + Table, + fixed_size_list_array, +) from traitlets import TraitError from traitlets.traitlets import TraitType from traitlets.utils.descriptions import class_of, describe -from typing_extensions import Self from lonboard._serialization import ( ACCESSOR_SERIALIZATION, @@ -27,6 +34,9 @@ from lonboard._utils import get_geometry_column_index from lonboard.models import ViewState +if TYPE_CHECKING: + from traitlets import HasTraits + DEFAULT_INITIAL_VIEW_STATE = { "latitude": 10, "longitude": 0, @@ -40,7 +50,13 @@ # the `info` passed in. See https://github.com/developmentseed/lonboard/issues/71 and # https://github.com/ipython/traitlets/pull/884 class FixedErrorTraitType(traitlets.TraitType): - def error(self, obj: Self, value, error=None, info=None): + def error( + self, + obj: HasTraits | None, + value: Any, + error: Exception | None = None, + info: str | None = None, + ) -> NoReturn: """Raise a TraitError Parameters @@ -153,18 +169,21 @@ def __init__( **TABLE_SERIALIZATION, ) - def validate(self, obj: Self, value: Any): - if not isinstance(value, pa.Table): + def validate(self, obj: HasTraits | None, value: Any): + if not isinstance(value, Table): self.error(obj, value) allowed_geometry_types = self.metadata.get("allowed_geometry_types") - allowed_geometry_types = cast(Optional[Set[bytes]], allowed_geometry_types) + allowed_geometry_types = type_cast(Optional[Set[bytes]], allowed_geometry_types) allowed_dimensions = self.metadata.get("allowed_dimensions") - allowed_dimensions = cast(Optional[Set[int]], allowed_dimensions) + allowed_dimensions = type_cast(Optional[Set[int]], allowed_dimensions) geom_col_idx = get_geometry_column_index(value.schema) + if geom_col_idx is None: + return self.error(obj, value, info="geometry column in table") + # No restriction on the allowed geometry types in this table if allowed_geometry_types: geometry_extension_type = value.schema.field(geom_col_idx).metadata.get( @@ -184,10 +203,12 @@ def validate(self, obj: Self, value: Any): if allowed_dimensions: typ = value.column(geom_col_idx).type - while isinstance(typ, pa.ListType): - typ = typ.value_type + while DataType.is_list(typ): + value_type = typ.value_type + assert value_type is not None + typ = value_type - assert isinstance(typ, pa.FixedSizeListType) + assert DataType.is_fixed_size_list(typ) if typ.list_size not in allowed_dimensions: msg = " or ".join(map(str, list(allowed_dimensions))) self.error(obj, value, info=f"{msg}-dimensional points") @@ -235,8 +256,8 @@ def __init__( self.tag(sync=True, **ACCESSOR_SERIALIZATION) def validate( - self, obj, value - ) -> Union[Tuple[int, ...], List[int], pa.ChunkedArray, pa.FixedSizeListArray]: + self, obj: HasTraits | None, value + ) -> Union[tuple, list, ChunkedArray, Array]: if isinstance(value, (tuple, list)): if len(value) < 3 or len(value) > 4: self.error(obj, value, info="3 or 4 values if passed a tuple or list") @@ -272,17 +293,18 @@ def validate( info="Color array must have 3 or 4 as its second dimension.", ) - return pa.FixedSizeListArray.from_arrays(value.ravel("C"), list_size) + flat_values = Array.from_numpy(value.ravel("C")) + return ChunkedArray([fixed_size_list_array(flat_values, list_size)]) # Check for Arrow PyCapsule Interface - # https://arrow.apache.org/docs/format/CDataInterface/PyCapsuleInterface.html - # TODO: with pyarrow v16 also import chunked array from stream - if not isinstance(value, (pa.ChunkedArray, pa.Array)): - if hasattr(value, "__arrow_c_array__"): - value = pa.array(value) - - if isinstance(value, (pa.ChunkedArray, pa.Array)): - if not pa.types.is_fixed_size_list(value.type): + if hasattr(value, "__arrow_c_array__"): + value = Array.from_arrow(value) + + elif hasattr(value, "__arrow_c_stream__"): + value = ChunkedArray.from_arrow(value) + + if isinstance(value, (ChunkedArray, Array)): + if not DataType.is_fixed_size_list(value.type): self.error( obj, value, info="Color pyarrow array must be a FixedSizeList." ) @@ -297,7 +319,9 @@ def validate( ), ) - if not pa.types.is_uint8(value.type.value_type): + value_type = value.type.value_type + assert value_type is not None + if not DataType.is_uint8(value_type): self.error( obj, value, info="Color pyarrow array must have a uint8 child." ) @@ -308,7 +332,7 @@ def validate( try: c = mpl.colors.to_rgba(value) # type: ignore except ValueError: - self.error( + return self.error( obj, value, info=( @@ -316,7 +340,6 @@ def validate( "matplotlib.colors.to_rgba." ), ) - return return tuple(map(int, (np.array(c) * 255).astype(np.uint8))) @@ -360,7 +383,9 @@ def __init__( super().__init__(*args, **kwargs) self.tag(sync=True, **ACCESSOR_SERIALIZATION) - def validate(self, obj, value) -> Union[float, pa.ChunkedArray, pa.DoubleArray]: + def validate( + self, obj: HasTraits | None, value + ) -> Union[float, Array, ChunkedArray]: if isinstance(value, (int, float)): return float(value) @@ -378,24 +403,24 @@ def validate(self, obj, value) -> Union[float, pa.ChunkedArray, pa.DoubleArray]: # TODO: should we always be casting to float32? Should it be # possible/allowed to pass in ~int8 or a data type smaller than float32? - return pa.array(value.astype(np.float32)) + return ChunkedArray([Array.from_numpy(value.astype(np.float32))]) # Check for Arrow PyCapsule Interface - # https://arrow.apache.org/docs/format/CDataInterface/PyCapsuleInterface.html - # TODO: with pyarrow v16 also import chunked array from stream - if not isinstance(value, (pa.ChunkedArray, pa.Array)): - if hasattr(value, "__arrow_c_array__"): - value = pa.array(value) - - if isinstance(value, (pa.ChunkedArray, pa.Array)): - if not pa.types.is_floating(value.type): + if hasattr(value, "__arrow_c_array__"): + value = Array.from_arrow(value) + + elif hasattr(value, "__arrow_c_stream__"): + value = ChunkedArray.from_arrow(value) + + if isinstance(value, (ChunkedArray, Array)): + if not DataType.is_floating(value.type): self.error( obj, value, info="Float pyarrow array must be a floating point type.", ) - return value.cast(pa.float32()) + return value.cast(DataType.float32()) self.error(obj, value) assert False @@ -430,7 +455,9 @@ def __init__( super().__init__(*args, **kwargs) self.tag(sync=True, **ACCESSOR_SERIALIZATION) - def validate(self, obj, value) -> Union[float, pa.ChunkedArray, pa.DoubleArray]: + def validate( + self, obj: HasTraits | None, value + ) -> Union[float, str, ChunkedArray, Array]: if isinstance(value, str): return value @@ -439,14 +466,35 @@ def validate(self, obj, value) -> Union[float, pa.ChunkedArray, pa.DoubleArray]: value.__class__.__module__.startswith("pandas") and value.__class__.__name__ == "Series" ): + try: + import pyarrow as pa + except ImportError as e: + raise ImportError( + "pyarrow is a required dependency when passing in a pandas series" + ) from e + # Cast pandas Series to pyarrow array value = pa.array(value) if isinstance(value, np.ndarray): + try: + import pyarrow as pa + except ImportError as e: + raise ImportError( + "pyarrow is a required dependency when passing in a pandas series" + ) from e + value = pa.StringArray.from_pandas(value) - if isinstance(value, (pa.ChunkedArray, pa.Array)): - if not pa.types.is_string(value.type): + # Check for Arrow PyCapsule Interface + if hasattr(value, "__arrow_c_array__"): + value = Array.from_arrow(value) + + elif hasattr(value, "__arrow_c_stream__"): + value = ChunkedArray.from_arrow(value) + + if isinstance(value, (ChunkedArray, Array)): + if not DataType.is_string(value.type): self.error( obj, value, @@ -488,8 +536,8 @@ def __init__( self.tag(sync=True, **ACCESSOR_SERIALIZATION) def validate( - self, obj, value - ) -> Union[Tuple[int, ...], List[int], pa.ChunkedArray, pa.FixedSizeListArray]: + self, obj: HasTraits | None, value + ) -> Union[Tuple[int, ...], List[int], ChunkedArray, Array]: if isinstance(value, np.ndarray): if value.ndim != 2: self.error(obj, value, info="Point array to have 2 dimensions") @@ -502,10 +550,21 @@ def validate( info="Point array to have 2 or 3 as its second dimension", ) - return pa.FixedSizeListArray.from_arrays(value.ravel("C"), list_size) + assert np.issubdtype(value.dtype, np.float64) + return fixed_size_list_array( + Array.from_numpy(value.ravel("C")), + list_size, + ) + + # Check for Arrow PyCapsule Interface + if hasattr(value, "__arrow_c_array__"): + value = Array.from_arrow(value) + + elif hasattr(value, "__arrow_c_stream__"): + value = ChunkedArray.from_arrow(value) - if isinstance(value, (pa.ChunkedArray, pa.Array)): - if not pa.types.is_fixed_size_list(value.type): + if isinstance(value, (ChunkedArray, Array)): + if not DataType.is_fixed_size_list(value.type): self.error(obj, value, info="Point pyarrow array to be a FixedSizeList") if value.type.list_size not in (2, 3): @@ -518,7 +577,9 @@ def validate( ), ) - if not pa.types.is_floating(value.type.value_type): + value_type = value.type.value_type + assert value_type is not None + if not DataType.is_floating(value_type): self.error( obj, value, @@ -531,7 +592,7 @@ def validate( try: c = mpl.colors.to_rgba(value) # type: ignore except ValueError: - self.error( + return self.error( obj, value, info=( @@ -539,7 +600,6 @@ def validate( "matplotlib.colors.to_rgba" ), ) - return return tuple(map(int, (np.array(c) * 255).astype(np.uint8))) @@ -609,7 +669,7 @@ def __init__( super().__init__(*args, **kwargs) self.tag(sync=True, **ACCESSOR_SERIALIZATION) - def validate(self, obj, value) -> Union[float, pa.ChunkedArray, pa.DoubleArray]: + def validate(self, obj, value) -> Union[float, tuple, list, ChunkedArray, Array]: # Find the data filter extension in the attributes of the parent object so we # can validate against the filter size. data_filter_extension = [ @@ -666,7 +726,7 @@ def validate(self, obj, value) -> Union[float, pa.ChunkedArray, pa.DoubleArray]: if filter_size != 1: self.error(obj, value, info="filter_size==1 with 1-D numpy array") - return pa.array(value) + return Array.from_numpy(value) if len(value.shape) != 2: self.error(obj, value, info="1-D or 2-D numpy array") @@ -681,19 +741,22 @@ def validate(self, obj, value) -> Union[float, pa.ChunkedArray, pa.DoubleArray]: ), ) - return pa.FixedSizeListArray.from_arrays(value.ravel("C"), filter_size) + return fixed_size_list_array( + Array.from_numpy(value.ravel("C")), + filter_size, + ) # Check for Arrow PyCapsule Interface - # https://arrow.apache.org/docs/format/CDataInterface/PyCapsuleInterface.html - # TODO: with pyarrow v16 also import chunked array from stream - if not isinstance(value, (pa.ChunkedArray, pa.Array)): - if hasattr(value, "__arrow_c_array__"): - value = pa.array(value) + if hasattr(value, "__arrow_c_array__"): + value = Array.from_arrow(value) + + elif hasattr(value, "__arrow_c_stream__"): + value = ChunkedArray.from_arrow(value) - if isinstance(value, (pa.ChunkedArray, pa.Array)): + if isinstance(value, (ChunkedArray, Array)): # Allowed inputs are either a FixedSizeListArray or numeric array. # If not a fixed size list array, check for floating and cast to float32 - if not pa.types.is_fixed_size_list(value.type): + if not DataType.is_fixed_size_list(value.type): if filter_size != 1: self.error( obj, @@ -701,14 +764,14 @@ def validate(self, obj, value) -> Union[float, pa.ChunkedArray, pa.DoubleArray]: info="filter_size==1 with non-FixedSizeList type arrow array", ) - if not pa.types.is_floating(value.type): + if not DataType.is_floating(value.type): self.error( obj, value, info="arrow array to be a floating point type", ) - return value.cast(pa.float32()) + return value.cast(DataType.float32()) # We have a FixedSizeListArray if filter_size != value.type.list_size: @@ -721,7 +784,9 @@ def validate(self, obj, value) -> Union[float, pa.ChunkedArray, pa.DoubleArray]: ), ) - if not pa.types.is_floating(value.type.value_type): + value_type = value.type.value_type + assert value_type is not None + if not DataType.is_floating(value_type): self.error( obj, value, @@ -729,7 +794,9 @@ def validate(self, obj, value) -> Union[float, pa.ChunkedArray, pa.DoubleArray]: ) # Cast values to float32 - return value.cast(pa.list_(pa.float32(), value.type.list_size)) + return value.cast( + DataType.list(Field("", DataType.float32()), value.type.list_size) + ) self.error(obj, value) assert False @@ -769,8 +836,8 @@ def __init__( self.tag(sync=True, **ACCESSOR_SERIALIZATION) def validate( - self, obj, value - ) -> Union[Tuple[int, ...], List[int], pa.ChunkedArray, pa.FixedSizeListArray]: + self, obj: HasTraits | None, value + ) -> Union[Tuple[int, ...], List[int], ChunkedArray, Array]: if isinstance(value, (tuple, list)): if len(value) != 3: self.error( @@ -800,17 +867,20 @@ def validate( ) value = value.astype(np.float32) - return pa.FixedSizeListArray.from_arrays(value.ravel("C"), 3) + return fixed_size_list_array( + Array.from_numpy(value.ravel("C")), + 3, + ) # Check for Arrow PyCapsule Interface - # https://arrow.apache.org/docs/format/CDataInterface/PyCapsuleInterface.html - # TODO: with pyarrow v16 also import chunked array from stream - if not isinstance(value, (pa.ChunkedArray, pa.Array)): - if hasattr(value, "__arrow_c_array__"): - value = pa.array(value) - - if isinstance(value, (pa.ChunkedArray, pa.Array)): - if not pa.types.is_fixed_size_list(value.type): + if hasattr(value, "__arrow_c_array__"): + value = Array.from_arrow(value) + + elif hasattr(value, "__arrow_c_stream__"): + value = ChunkedArray.from_arrow(value) + + if isinstance(value, (ChunkedArray, Array)): + if not DataType.is_fixed_size_list(value.type): self.error( obj, value, info="normal pyarrow array to be a FixedSizeList." ) @@ -822,14 +892,16 @@ def validate( info=("normal pyarrow array to have an inner size of 3."), ) - if not pa.types.is_floating(value.type.value_type): + value_type = value.type.value_type + assert value_type is not None + if not DataType.is_floating(value_type): self.error( obj, value, info="pyarrow array to be floating point type", ) - return value.cast(pa.list_(pa.float32(), 3)) + return value.cast(DataType.list(Field("", DataType.float32()), 3)) self.error(obj, value) assert False @@ -898,8 +970,8 @@ def __init__( self.tag(sync=True, **ACCESSOR_SERIALIZATION) def validate( - self, obj, value - ) -> Union[Tuple[int, ...], List[int], pa.ChunkedArray, pa.FixedSizeListArray]: + self, obj: HasTraits | None, value + ) -> Union[Tuple[int, ...], List[int], ChunkedArray, Array]: if isinstance(value, (tuple, list)): if len(value) != 2: self.error(obj, value, info="2 value list only") @@ -932,17 +1004,20 @@ def validate( if np.issubdtype(value.dtype, np.float64): value = value.astype(np.float32) - return pa.FixedSizeListArray.from_arrays(value.ravel("C"), list_size) + return fixed_size_list_array( + Array.from_numpy(value.ravel("C")), + list_size, + ) # Check for Arrow PyCapsule Interface - # https://arrow.apache.org/docs/format/CDataInterface/PyCapsuleInterface.html - # TODO: with pyarrow v16 also import chunked array from stream - if not isinstance(value, (pa.ChunkedArray, pa.Array)): - if hasattr(value, "__arrow_c_array__"): - value = pa.array(value) - - if isinstance(value, (pa.ChunkedArray, pa.Array)): - if not pa.types.is_fixed_size_list(value.type): + if hasattr(value, "__arrow_c_array__"): + value = Array.from_arrow(value) + + elif hasattr(value, "__arrow_c_stream__"): + value = ChunkedArray.from_arrow(value) + + if isinstance(value, (ChunkedArray, Array)): + if not DataType.is_fixed_size_list(value.type): self.error(obj, value, info="Pyarrow array must be a FixedSizeList.") if value.type.list_size != 2: @@ -952,18 +1027,22 @@ def validate( info="Pyarrow array must have a FixedSizeList inner size of 2.", ) + value_type = value.type.value_type + assert value_type is not None if not ( - pa.types.is_integer(value.type.value_type) - or pa.types.is_signed_integer(value.type.value_type) - or pa.types.is_floating(value.type.value_type) + DataType.is_integer(value_type) + or DataType.is_signed_integer(value_type) + or DataType.is_floating(value_type) ): self.error( obj, value, info="Pyarrow array to have a numeric type child." ) # Cast float64 to float32; leave other data types the same - if pa.types.is_float64(value.type.value_type): - value = value.cast(pa.list_(pa.float32(), value.type.list_size)) + if DataType.is_float64(value_type): + value = value.cast( + DataType.list(DataType.float32(), value.type.list_size) + ) return value @@ -980,7 +1059,7 @@ def __init__( super().__init__(*args, **kwargs) self.tag(sync=True) - def validate(self, obj: Any, value: Any) -> Any: + def validate(self, obj: HasTraits | None, value: Any) -> Any: value = super().validate(obj, value) try: diff --git a/lonboard/types/arrow.py b/lonboard/types/arrow.py new file mode 100644 index 00000000..6346ce98 --- /dev/null +++ b/lonboard/types/arrow.py @@ -0,0 +1,13 @@ +from __future__ import annotations + +from typing import Protocol, Tuple + + +class ArrowArrayExportable(Protocol): + def __arrow_c_array__( + self, requested_schema: object | None = None + ) -> Tuple[object, object]: ... + + +class ArrowStreamExportable(Protocol): + def __arrow_c_stream__(self, requested_schema: object | None = None) -> object: ... diff --git a/lonboard/types/layer.py b/lonboard/types/layer.py index 31354a80..53750be3 100644 --- a/lonboard/types/layer.py +++ b/lonboard/types/layer.py @@ -12,7 +12,7 @@ import numpy as np import pandas as pd -import pyarrow as pa +import pyarrow from numpy.typing import NDArray from lonboard._base import BaseExtension @@ -38,8 +38,8 @@ def __arrow_c_array__( Tuple[int, ...], str, NDArray[np.uint8], - pa.FixedSizeListArray, - pa.ChunkedArray, + pyarrow.FixedSizeListArray, + pyarrow.ChunkedArray, ArrowArrayExportable, ] FloatAccessorInput = Union[ @@ -47,8 +47,8 @@ def __arrow_c_array__( float, NDArray[np.number], pd.Series, - pa.FloatingPointArray, - pa.ChunkedArray, + pyarrow.FloatingPointArray, + pyarrow.ChunkedArray, ArrowArrayExportable, ] NormalAccessorInput = Union[ @@ -56,17 +56,17 @@ def __arrow_c_array__( Tuple[int, int, int], Tuple[int, ...], NDArray[np.floating], - pa.FixedSizeListArray, - pa.ChunkedArray, + pyarrow.FixedSizeListArray, + pyarrow.ChunkedArray, ArrowArrayExportable, ] TextAccessorInput = Union[ str, NDArray[np.str_], pd.Series, - pa.StringArray, - pa.LargeStringArray, - pa.ChunkedArray, + pyarrow.StringArray, + pyarrow.LargeStringArray, + pyarrow.ChunkedArray, ArrowArrayExportable, ] diff --git a/poetry.lock b/poetry.lock index c19ef833..15b03af9 100644 --- a/poetry.lock +++ b/poetry.lock @@ -110,6 +110,69 @@ cffi = ">=1.0.1" dev = ["cogapp", "pre-commit", "pytest", "wheel"] tests = ["pytest"] +[[package]] +name = "arro3-compute" +version = "0.2.0b3" +description = "Rust-based compute kernels for Arrow in Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "arro3_compute-0.2.0b3-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:0dde2ae913bc22abf7aa5e6113340557fd7fac75412ca3a054548e461c479fc7"}, + {file = "arro3_compute-0.2.0b3-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:fc3d950afcae2dfa47cb4595c46c1958b75e69670d89dd5f967ed4d8fea97125"}, + {file = "arro3_compute-0.2.0b3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a97f70b0a6d4126503fe243a1a96e7153f40880f01d7cdf5350f5524af89b902"}, + {file = "arro3_compute-0.2.0b3-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:34275d7cd11592e709ac87768926ed345028f8ec89f0082345d9dffe4aca94ef"}, + {file = "arro3_compute-0.2.0b3-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb05b29830555a516d663e091e851870187194fec842f2b835690f8c0db9bae6"}, + {file = "arro3_compute-0.2.0b3-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43b490fdf7609b21fee2d1081238275e2f9354ea0dc381d4188cd10af315e0f5"}, + {file = "arro3_compute-0.2.0b3-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a5ee781f48f6acfcc133094238b266d54b5c290b48f7a7ccfa1bce5021ec160"}, + {file = "arro3_compute-0.2.0b3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c8fca593e11a9c481300a4f5f47983b4b816a64fed55b0fc083b1184074f0a71"}, + {file = "arro3_compute-0.2.0b3-cp38-abi3-win32.whl", hash = "sha256:cd4a79a0834f0380ef37cd08447ad11a90bc5a57961c90941e4f2d073bccf72b"}, + {file = "arro3_compute-0.2.0b3-cp38-abi3-win_amd64.whl", hash = "sha256:267f1205932892310fc33bb454f306233a0dd831459fd3a9966bf1b8a09d2b9c"}, +] + +[package.dependencies] +arro3-core = "*" + +[[package]] +name = "arro3-core" +version = "0.2.0b3" +description = "Core library for representing Arrow data in Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "arro3_core-0.2.0b3-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bb0aa0a08c1a8a37bee27b173c2508289ad302bfae79c82a5f3bf2773b28b396"}, + {file = "arro3_core-0.2.0b3-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:e8c8949da5d81626bf49b58c6193a9d1973226d5d140788dadb7d531a3de5518"}, + {file = "arro3_core-0.2.0b3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c1e479e5a2c890472bbaa122eaae21e15c4b76a674b1ea00fdf0f08b3168622"}, + {file = "arro3_core-0.2.0b3-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:764276979b27f455007a90b7c4a1f41978aff63cc187bbd4ea64af84ad9f1bc8"}, + {file = "arro3_core-0.2.0b3-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cead1c7d5e2f6a048dd984237a0b4b59b3d1dba940e8654405fb9a96ce2dfcbd"}, + {file = "arro3_core-0.2.0b3-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dff825ed3c8c83a30dce2b47b464b87b6b4f0ffc5da06b72857e163b69b66c16"}, + {file = "arro3_core-0.2.0b3-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ce2a34a106e80250ee159f8ed755f50173eb5463c84ef48974fee9ae72ccf48"}, + {file = "arro3_core-0.2.0b3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3e32a8296a66e8fba201fb0fcf40f4a9cb286a4d78a51b28ecad34dc7ff10b72"}, + {file = "arro3_core-0.2.0b3-cp38-abi3-win32.whl", hash = "sha256:fb30870df49b54ba269d23a00a493f06e90fbbc9c0614d848863c7868c20217a"}, + {file = "arro3_core-0.2.0b3-cp38-abi3-win_amd64.whl", hash = "sha256:0e4b3ac8c33d44f7bd75654116d38ab54ef90990663d86939f6dadb996384e7d"}, +] + +[[package]] +name = "arro3-io" +version = "0.2.0b3" +description = "Rust-based readers and writers for Arrow in Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "arro3_io-0.2.0b3-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:136d8f8f1749552c24ec290bcc853fe348e54027810ca33876dfa8538477b7df"}, + {file = "arro3_io-0.2.0b3-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:ecb9e3ed97ab4e1067416d18cb520c132b36d5022252f75a577179877dd705ce"}, + {file = "arro3_io-0.2.0b3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbd53b894c3683bd1835803f66e5fbb8b02815f37bb6469bbd92c17d6553fc78"}, + {file = "arro3_io-0.2.0b3-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:94e3bd5e7b77dd8318d88fe0b16abb519da7e282938c20683825626e033c0bf7"}, + {file = "arro3_io-0.2.0b3-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9575b409499404997a955664e84d000cef44ca6f775c1e06b0bad7a19b77b638"}, + {file = "arro3_io-0.2.0b3-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0c6f4be000e478be4ea8e0f821238e15a219eef03f4804f8c04f109f10a029f"}, + {file = "arro3_io-0.2.0b3-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa2b1df0ecc5628fe1ad1454cbdf38a42b8aa0072cd72795e28da55ee82f9d20"}, + {file = "arro3_io-0.2.0b3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a97e2911a4bc11f93552b91b29f50ae98eb83b6bace3bee8190d58a4fade2e5d"}, + {file = "arro3_io-0.2.0b3-cp38-abi3-win32.whl", hash = "sha256:151389bda8ef7edb3a1ce4311fa5020528492b60eeca34032c747f569012534f"}, + {file = "arro3_io-0.2.0b3-cp38-abi3-win_amd64.whl", hash = "sha256:d0d65c4547d4c15e75e95b7e84ebea3a830eddac5c40f512a1b5e5934e476caf"}, +] + +[package.dependencies] +arro3-core = "*" + [[package]] name = "arrow" version = "1.3.0" @@ -178,32 +241,32 @@ typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} [[package]] name = "attrs" -version = "23.2.0" +version = "24.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" files = [ - {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, - {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, + {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, + {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, ] [package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] -tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] [[package]] name = "babel" -version = "2.15.0" +version = "2.16.0" description = "Internationalization utilities" optional = false python-versions = ">=3.8" files = [ - {file = "Babel-2.15.0-py3-none-any.whl", hash = "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb"}, - {file = "babel-2.15.0.tar.gz", hash = "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413"}, + {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, + {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, ] [package.dependencies] @@ -362,63 +425,78 @@ files = [ [[package]] name = "cffi" -version = "1.16.0" +version = "1.17.0" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" files = [ - {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, - {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, - {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, - {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, - {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, - {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, - {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, - {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, - {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, - {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, - {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, - {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, - {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, - {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, - {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, + {file = "cffi-1.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f9338cc05451f1942d0d8203ec2c346c830f8e86469903d5126c1f0a13a2bcbb"}, + {file = "cffi-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0ce71725cacc9ebf839630772b07eeec220cbb5f03be1399e0457a1464f8e1a"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c815270206f983309915a6844fe994b2fa47e5d05c4c4cef267c3b30e34dbe42"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6bdcd415ba87846fd317bee0774e412e8792832e7805938987e4ede1d13046d"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a98748ed1a1df4ee1d6f927e151ed6c1a09d5ec21684de879c7ea6aa96f58f2"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a048d4f6630113e54bb4b77e315e1ba32a5a31512c31a273807d0027a7e69ab"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24aa705a5f5bd3a8bcfa4d123f03413de5d86e497435693b638cbffb7d5d8a1b"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:856bf0924d24e7f93b8aee12a3a1095c34085600aa805693fb7f5d1962393206"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:4304d4416ff032ed50ad6bb87416d802e67139e31c0bde4628f36a47a3164bfa"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:331ad15c39c9fe9186ceaf87203a9ecf5ae0ba2538c9e898e3a6967e8ad3db6f"}, + {file = "cffi-1.17.0-cp310-cp310-win32.whl", hash = "sha256:669b29a9eca6146465cc574659058ed949748f0809a2582d1f1a324eb91054dc"}, + {file = "cffi-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:48b389b1fd5144603d61d752afd7167dfd205973a43151ae5045b35793232aa2"}, + {file = "cffi-1.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5d97162c196ce54af6700949ddf9409e9833ef1003b4741c2b39ef46f1d9720"}, + {file = "cffi-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ba5c243f4004c750836f81606a9fcb7841f8874ad8f3bf204ff5e56332b72b9"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bb9333f58fc3a2296fb1d54576138d4cf5d496a2cc118422bd77835e6ae0b9cb"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:435a22d00ec7d7ea533db494da8581b05977f9c37338c80bc86314bec2619424"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1df34588123fcc88c872f5acb6f74ae59e9d182a2707097f9e28275ec26a12d"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df8bb0010fdd0a743b7542589223a2816bdde4d94bb5ad67884348fa2c1c67e8"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8b5b9712783415695663bd463990e2f00c6750562e6ad1d28e072a611c5f2a6"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ffef8fd58a36fb5f1196919638f73dd3ae0db1a878982b27a9a5a176ede4ba91"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e67d26532bfd8b7f7c05d5a766d6f437b362c1bf203a3a5ce3593a645e870b8"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45f7cd36186db767d803b1473b3c659d57a23b5fa491ad83c6d40f2af58e4dbb"}, + {file = "cffi-1.17.0-cp311-cp311-win32.whl", hash = "sha256:a9015f5b8af1bb6837a3fcb0cdf3b874fe3385ff6274e8b7925d81ccaec3c5c9"}, + {file = "cffi-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:b50aaac7d05c2c26dfd50c3321199f019ba76bb650e346a6ef3616306eed67b0"}, + {file = "cffi-1.17.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aec510255ce690d240f7cb23d7114f6b351c733a74c279a84def763660a2c3bc"}, + {file = "cffi-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2770bb0d5e3cc0e31e7318db06efcbcdb7b31bcb1a70086d3177692a02256f59"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db9a30ec064129d605d0f1aedc93e00894b9334ec74ba9c6bdd08147434b33eb"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a47eef975d2b8b721775a0fa286f50eab535b9d56c70a6e62842134cf7841195"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f3e0992f23bbb0be00a921eae5363329253c3b86287db27092461c887b791e5e"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6107e445faf057c118d5050560695e46d272e5301feffda3c41849641222a828"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb862356ee9391dc5a0b3cbc00f416b48c1b9a52d252d898e5b7696a5f9fe150"}, + {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c1c13185b90bbd3f8b5963cd8ce7ad4ff441924c31e23c975cb150e27c2bf67a"}, + {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:17c6d6d3260c7f2d94f657e6872591fe8733872a86ed1345bda872cfc8c74885"}, + {file = "cffi-1.17.0-cp312-cp312-win32.whl", hash = "sha256:c3b8bd3133cd50f6b637bb4322822c94c5ce4bf0d724ed5ae70afce62187c492"}, + {file = "cffi-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:dca802c8db0720ce1c49cce1149ff7b06e91ba15fa84b1d59144fef1a1bc7ac2"}, + {file = "cffi-1.17.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6ce01337d23884b21c03869d2f68c5523d43174d4fc405490eb0091057943118"}, + {file = "cffi-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cab2eba3830bf4f6d91e2d6718e0e1c14a2f5ad1af68a89d24ace0c6b17cced7"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14b9cbc8f7ac98a739558eb86fabc283d4d564dafed50216e7f7ee62d0d25377"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b00e7bcd71caa0282cbe3c90966f738e2db91e64092a877c3ff7f19a1628fdcb"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41f4915e09218744d8bae14759f983e466ab69b178de38066f7579892ff2a555"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4760a68cab57bfaa628938e9c2971137e05ce48e762a9cb53b76c9b569f1204"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:011aff3524d578a9412c8b3cfaa50f2c0bd78e03eb7af7aa5e0df59b158efb2f"}, + {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:a003ac9edc22d99ae1286b0875c460351f4e101f8c9d9d2576e78d7e048f64e0"}, + {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ef9528915df81b8f4c7612b19b8628214c65c9b7f74db2e34a646a0a2a0da2d4"}, + {file = "cffi-1.17.0-cp313-cp313-win32.whl", hash = "sha256:70d2aa9fb00cf52034feac4b913181a6e10356019b18ef89bc7c12a283bf5f5a"}, + {file = "cffi-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:b7b6ea9e36d32582cda3465f54c4b454f62f23cb083ebc7a94e2ca6ef011c3a7"}, + {file = "cffi-1.17.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:964823b2fc77b55355999ade496c54dde161c621cb1f6eac61dc30ed1b63cd4c"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:516a405f174fd3b88829eabfe4bb296ac602d6a0f68e0d64d5ac9456194a5b7e"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dec6b307ce928e8e112a6bb9921a1cb00a0e14979bf28b98e084a4b8a742bd9b"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4094c7b464cf0a858e75cd14b03509e84789abf7b79f8537e6a72152109c76e"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2404f3de742f47cb62d023f0ba7c5a916c9c653d5b368cc966382ae4e57da401"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aa9d43b02a0c681f0bfbc12d476d47b2b2b6a3f9287f11ee42989a268a1833c"}, + {file = "cffi-1.17.0-cp38-cp38-win32.whl", hash = "sha256:0bb15e7acf8ab35ca8b24b90af52c8b391690ef5c4aec3d31f38f0d37d2cc499"}, + {file = "cffi-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:93a7350f6706b31f457c1457d3a3259ff9071a66f312ae64dc024f049055f72c"}, + {file = "cffi-1.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a2ddbac59dc3716bc79f27906c010406155031a1c801410f1bafff17ea304d2"}, + {file = "cffi-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6327b572f5770293fc062a7ec04160e89741e8552bf1c358d1a23eba68166759"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbc183e7bef690c9abe5ea67b7b60fdbca81aa8da43468287dae7b5c046107d4"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bdc0f1f610d067c70aa3737ed06e2726fd9d6f7bfee4a351f4c40b6831f4e82"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d872186c1617d143969defeadac5a904e6e374183e07977eedef9c07c8953bf"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d46ee4764b88b91f16661a8befc6bfb24806d885e27436fdc292ed7e6f6d058"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f76a90c345796c01d85e6332e81cab6d70de83b829cf1d9762d0a3da59c7932"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e60821d312f99d3e1569202518dddf10ae547e799d75aef3bca3a2d9e8ee693"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:eb09b82377233b902d4c3fbeeb7ad731cdab579c6c6fda1f763cd779139e47c3"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:24658baf6224d8f280e827f0a50c46ad819ec8ba380a42448e24459daf809cf4"}, + {file = "cffi-1.17.0-cp39-cp39-win32.whl", hash = "sha256:0fdacad9e0d9fc23e519efd5ea24a70348305e8d7d85ecbb1a5fa66dc834e7fb"}, + {file = "cffi-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:7cbc78dc018596315d4e7841c8c3a7ae31cc4d638c9b627f87d52e8abaaf2d29"}, + {file = "cffi-1.17.0.tar.gz", hash = "sha256:f3157624b7558b914cb039fd1af735e5e8049a87c817cc215109ad1c8779df76"}, ] [package.dependencies] @@ -775,33 +853,33 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "debugpy" -version = "1.8.2" +version = "1.8.5" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" files = [ - {file = "debugpy-1.8.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:7ee2e1afbf44b138c005e4380097d92532e1001580853a7cb40ed84e0ef1c3d2"}, - {file = "debugpy-1.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f8c3f7c53130a070f0fc845a0f2cee8ed88d220d6b04595897b66605df1edd6"}, - {file = "debugpy-1.8.2-cp310-cp310-win32.whl", hash = "sha256:f179af1e1bd4c88b0b9f0fa153569b24f6b6f3de33f94703336363ae62f4bf47"}, - {file = "debugpy-1.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:0600faef1d0b8d0e85c816b8bb0cb90ed94fc611f308d5fde28cb8b3d2ff0fe3"}, - {file = "debugpy-1.8.2-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:8a13417ccd5978a642e91fb79b871baded925d4fadd4dfafec1928196292aa0a"}, - {file = "debugpy-1.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acdf39855f65c48ac9667b2801234fc64d46778021efac2de7e50907ab90c634"}, - {file = "debugpy-1.8.2-cp311-cp311-win32.whl", hash = "sha256:2cbd4d9a2fc5e7f583ff9bf11f3b7d78dfda8401e8bb6856ad1ed190be4281ad"}, - {file = "debugpy-1.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:d3408fddd76414034c02880e891ea434e9a9cf3a69842098ef92f6e809d09afa"}, - {file = "debugpy-1.8.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:5d3ccd39e4021f2eb86b8d748a96c766058b39443c1f18b2dc52c10ac2757835"}, - {file = "debugpy-1.8.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62658aefe289598680193ff655ff3940e2a601765259b123dc7f89c0239b8cd3"}, - {file = "debugpy-1.8.2-cp312-cp312-win32.whl", hash = "sha256:bd11fe35d6fd3431f1546d94121322c0ac572e1bfb1f6be0e9b8655fb4ea941e"}, - {file = "debugpy-1.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:15bc2f4b0f5e99bf86c162c91a74c0631dbd9cef3c6a1d1329c946586255e859"}, - {file = "debugpy-1.8.2-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:5a019d4574afedc6ead1daa22736c530712465c0c4cd44f820d803d937531b2d"}, - {file = "debugpy-1.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40f062d6877d2e45b112c0bbade9a17aac507445fd638922b1a5434df34aed02"}, - {file = "debugpy-1.8.2-cp38-cp38-win32.whl", hash = "sha256:c78ba1680f1015c0ca7115671fe347b28b446081dada3fedf54138f44e4ba031"}, - {file = "debugpy-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:cf327316ae0c0e7dd81eb92d24ba8b5e88bb4d1b585b5c0d32929274a66a5210"}, - {file = "debugpy-1.8.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:1523bc551e28e15147815d1397afc150ac99dbd3a8e64641d53425dba57b0ff9"}, - {file = "debugpy-1.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e24ccb0cd6f8bfaec68d577cb49e9c680621c336f347479b3fce060ba7c09ec1"}, - {file = "debugpy-1.8.2-cp39-cp39-win32.whl", hash = "sha256:7f8d57a98c5a486c5c7824bc0b9f2f11189d08d73635c326abef268f83950326"}, - {file = "debugpy-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:16c8dcab02617b75697a0a925a62943e26a0330da076e2a10437edd9f0bf3755"}, - {file = "debugpy-1.8.2-py2.py3-none-any.whl", hash = "sha256:16e16df3a98a35c63c3ab1e4d19be4cbc7fdda92d9ddc059294f18910928e0ca"}, - {file = "debugpy-1.8.2.zip", hash = "sha256:95378ed08ed2089221896b9b3a8d021e642c24edc8fef20e5d4342ca8be65c00"}, + {file = "debugpy-1.8.5-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:7e4d594367d6407a120b76bdaa03886e9eb652c05ba7f87e37418426ad2079f7"}, + {file = "debugpy-1.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4413b7a3ede757dc33a273a17d685ea2b0c09dbd312cc03f5534a0fd4d40750a"}, + {file = "debugpy-1.8.5-cp310-cp310-win32.whl", hash = "sha256:dd3811bd63632bb25eda6bd73bea8e0521794cda02be41fa3160eb26fc29e7ed"}, + {file = "debugpy-1.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:b78c1250441ce893cb5035dd6f5fc12db968cc07f91cc06996b2087f7cefdd8e"}, + {file = "debugpy-1.8.5-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:606bccba19f7188b6ea9579c8a4f5a5364ecd0bf5a0659c8a5d0e10dcee3032a"}, + {file = "debugpy-1.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db9fb642938a7a609a6c865c32ecd0d795d56c1aaa7a7a5722d77855d5e77f2b"}, + {file = "debugpy-1.8.5-cp311-cp311-win32.whl", hash = "sha256:4fbb3b39ae1aa3e5ad578f37a48a7a303dad9a3d018d369bc9ec629c1cfa7408"}, + {file = "debugpy-1.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:345d6a0206e81eb68b1493ce2fbffd57c3088e2ce4b46592077a943d2b968ca3"}, + {file = "debugpy-1.8.5-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:5b5c770977c8ec6c40c60d6f58cacc7f7fe5a45960363d6974ddb9b62dbee156"}, + {file = "debugpy-1.8.5-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0a65b00b7cdd2ee0c2cf4c7335fef31e15f1b7056c7fdbce9e90193e1a8c8cb"}, + {file = "debugpy-1.8.5-cp312-cp312-win32.whl", hash = "sha256:c9f7c15ea1da18d2fcc2709e9f3d6de98b69a5b0fff1807fb80bc55f906691f7"}, + {file = "debugpy-1.8.5-cp312-cp312-win_amd64.whl", hash = "sha256:28ced650c974aaf179231668a293ecd5c63c0a671ae6d56b8795ecc5d2f48d3c"}, + {file = "debugpy-1.8.5-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:3df6692351172a42af7558daa5019651f898fc67450bf091335aa8a18fbf6f3a"}, + {file = "debugpy-1.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cd04a73eb2769eb0bfe43f5bfde1215c5923d6924b9b90f94d15f207a402226"}, + {file = "debugpy-1.8.5-cp38-cp38-win32.whl", hash = "sha256:8f913ee8e9fcf9d38a751f56e6de12a297ae7832749d35de26d960f14280750a"}, + {file = "debugpy-1.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:a697beca97dad3780b89a7fb525d5e79f33821a8bc0c06faf1f1289e549743cf"}, + {file = "debugpy-1.8.5-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:0a1029a2869d01cb777216af8c53cda0476875ef02a2b6ff8b2f2c9a4b04176c"}, + {file = "debugpy-1.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84c276489e141ed0b93b0af648eef891546143d6a48f610945416453a8ad406"}, + {file = "debugpy-1.8.5-cp39-cp39-win32.whl", hash = "sha256:ad84b7cde7fd96cf6eea34ff6c4a1b7887e0fe2ea46e099e53234856f9d99a34"}, + {file = "debugpy-1.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:7b0fe36ed9d26cb6836b0a51453653f8f2e347ba7348f2bbfe76bfeb670bfb1c"}, + {file = "debugpy-1.8.5-py2.py3-none-any.whl", hash = "sha256:55919dce65b471eff25901acf82d328bbd5b833526b6c1364bd5133754777a44"}, + {file = "debugpy-1.8.5.zip", hash = "sha256:b2112cfeb34b4507399d298fe7023a16656fc553ed5246536060ca7bd0e668d0"}, ] [[package]] @@ -1816,13 +1894,13 @@ files = [ [[package]] name = "jupytext" -version = "1.16.3" +version = "1.16.4" description = "Jupyter notebooks as Markdown documents, Julia, Python or R scripts" optional = false python-versions = ">=3.8" files = [ - {file = "jupytext-1.16.3-py3-none-any.whl", hash = "sha256:870e0d7a716dcb1303df6ad1cec65e3315a20daedd808a55cb3dae2d56e4ed20"}, - {file = "jupytext-1.16.3.tar.gz", hash = "sha256:1ebac990461dd9f477ff7feec9e3003fa1acc89f3c16ba01b73f79fd76f01a98"}, + {file = "jupytext-1.16.4-py3-none-any.whl", hash = "sha256:76989d2690e65667ea6fb411d8056abe7cd0437c07bd774660b83d62acf9490a"}, + {file = "jupytext-1.16.4.tar.gz", hash = "sha256:28e33f46f2ce7a41fb9d677a4a2c95327285579b64ca104437c4b9eb1e4174e9"}, ] [package.dependencies] @@ -2311,13 +2389,13 @@ pygments = ">2.12.0" [[package]] name = "mkdocs-material" -version = "9.5.30" +version = "9.5.31" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.5.30-py3-none-any.whl", hash = "sha256:fc070689c5250a180e9b9d79d8491ef9a3a7acb240db0728728d6c31eeb131d4"}, - {file = "mkdocs_material-9.5.30.tar.gz", hash = "sha256:3fd417dd42d679e3ba08b9e2d72cd8b8af142cc4a3969676ad6b00993dd182ec"}, + {file = "mkdocs_material-9.5.31-py3-none-any.whl", hash = "sha256:1b1f49066fdb3824c1e96d6bacd2d4375de4ac74580b47e79ff44c4d835c5fcb"}, + {file = "mkdocs_material-9.5.31.tar.gz", hash = "sha256:31833ec664772669f5856f4f276bf3fdf0e642a445e64491eda459249c3a1ca8"}, ] [package.dependencies] @@ -2353,13 +2431,13 @@ files = [ [[package]] name = "mkdocstrings" -version = "0.25.1" +version = "0.25.2" description = "Automatic documentation from sources, for MkDocs." optional = false python-versions = ">=3.8" files = [ - {file = "mkdocstrings-0.25.1-py3-none-any.whl", hash = "sha256:da01fcc2670ad61888e8fe5b60afe9fee5781017d67431996832d63e887c2e51"}, - {file = "mkdocstrings-0.25.1.tar.gz", hash = "sha256:c3a2515f31577f311a9ee58d089e4c51fc6046dbd9e9b4c3de4c3194667fe9bf"}, + {file = "mkdocstrings-0.25.2-py3-none-any.whl", hash = "sha256:9e2cda5e2e12db8bb98d21e3410f3f27f8faab685a24b03b06ba7daa5b92abfc"}, + {file = "mkdocstrings-0.25.2.tar.gz", hash = "sha256:5cf57ad7f61e8be3111a2458b4e49c2029c9cb35525393b179f9c916ca8042dc"}, ] [package.dependencies] @@ -3123,13 +3201,13 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pymdown-extensions" -version = "10.8.1" +version = "10.9" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "pymdown_extensions-10.8.1-py3-none-any.whl", hash = "sha256:f938326115884f48c6059c67377c46cf631c733ef3629b6eed1349989d1b30cb"}, - {file = "pymdown_extensions-10.8.1.tar.gz", hash = "sha256:3ab1db5c9e21728dabf75192d71471f8e50f216627e9a1fa9535ecb0231b9940"}, + {file = "pymdown_extensions-10.9-py3-none-any.whl", hash = "sha256:d323f7e90d83c86113ee78f3fe62fc9dee5f56b54d912660703ea1816fed5626"}, + {file = "pymdown_extensions-10.9.tar.gz", hash = "sha256:6ff740bcd99ec4172a938970d42b96128bdc9d4b9bcad72494f29921dc69b753"}, ] [package.dependencies] @@ -3141,36 +3219,37 @@ extra = ["pygments (>=2.12)"] [[package]] name = "pyogrio" -version = "0.7.2" +version = "0.8.0" description = "Vectorized spatial vector file format I/O using GDAL/OGR" optional = false python-versions = ">=3.8" files = [ - {file = "pyogrio-0.7.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ba386a02c9b5934c568b40acc95c9863f92075f6990167635e51368976569c66"}, - {file = "pyogrio-0.7.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:860b04ddf23b8c253ceb3621e4b0e0dc0f293eab66cb14f799a5c9f9fe0a882c"}, - {file = "pyogrio-0.7.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:caaf61d473ac207f170082e602ea57c096e8dd4c4be51de58fba96f1a5944096"}, - {file = "pyogrio-0.7.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bee556ca305b7e8c68aada259d925c612131205074fb2373badafacbef610b77"}, - {file = "pyogrio-0.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:7e2c856961efdc6cb3809b97b49016cbbcee17c8a1e85fc4000b5fcb3cfcb9b1"}, - {file = "pyogrio-0.7.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5654e7c33442cbd98e7a56f705e160415d7503b2420d724d4f81b8cc88360b3e"}, - {file = "pyogrio-0.7.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b9a8a4854c7af2c76683ce5666ee765b207901b362576465219d75deb6159821"}, - {file = "pyogrio-0.7.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a23136d1bffa9d811263807b850c6e9854201710276f09de650131e89f2486aa"}, - {file = "pyogrio-0.7.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:234b0d1d22e9680229b0618c25077a0cb2428cbbc2939b4bb9bdd8ee77e0f3e0"}, - {file = "pyogrio-0.7.2-cp311-cp311-win_amd64.whl", hash = "sha256:33ae5aafcf3a557e107a33f5b3e878750d2e467b8cc911dc4bf261c1a602b534"}, - {file = "pyogrio-0.7.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:73577fecebeecf0d06e78c1a4bddd460a4d57c6d918affab7594c0bc72f5fa14"}, - {file = "pyogrio-0.7.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f2ff58184020da39540a2f5d4a5412005a01b0c4cd03c7b8294bc670d1f3fe50"}, - {file = "pyogrio-0.7.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31112bb0b6a4a3f80ec3252d7eeb7be81045860d49fd76e297c073759450652b"}, - {file = "pyogrio-0.7.2-cp312-cp312-win_amd64.whl", hash = "sha256:1b7197c72f034ac7187da2a8d50a063a5f1256aab732b154f11f887a7652dc3d"}, - {file = "pyogrio-0.7.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7e39bb6bfdd74e63ae96acced7297bbe8a157f85c0107f1cbb395d2a937f3a38"}, - {file = "pyogrio-0.7.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:436de39f57e8f8cc41682981518b9490d64d3a1c48bf78d415e5747c296790dc"}, - {file = "pyogrio-0.7.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5feeb7a0da7ee82580f6aa6508a80602413675b99c60c822929e0e8b925e0517"}, - {file = "pyogrio-0.7.2-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:429dcff4c36f0e0a15ba4a20f2d4478b9c6d095e70c4bcc007a536ea420a1a93"}, - {file = "pyogrio-0.7.2-cp38-cp38-win_amd64.whl", hash = "sha256:f219c1edb010d0248891a3d27d15faf17c91cfe69daef84d7471e22e4ed4fcff"}, - {file = "pyogrio-0.7.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9cc6db2e5dc50dfe23554d10502920eafa0648c365725e552aaa523432a9bf35"}, - {file = "pyogrio-0.7.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:be46be43c4148a3ad09da38670411485ec544a51cbd6b7d004a0eca5035023fc"}, - {file = "pyogrio-0.7.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3001efd5dfee36459d0cfdafbe91ed88fc5ae734353d771cdb75546ef1427735"}, - {file = "pyogrio-0.7.2-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:892fdab0e1c44c0125254d92928081c14f93ac553f371addc2c9a1d4bde41cad"}, - {file = "pyogrio-0.7.2-cp39-cp39-win_amd64.whl", hash = "sha256:d5fc2304aeb927564f77caaa4da9a47e2d77a8ceb1c624ea84c505140886b221"}, - {file = "pyogrio-0.7.2.tar.gz", hash = "sha256:33afb7d211c6434613f24174722347a5cb11d22a212f28c817f67c89d30d0c0d"}, + {file = "pyogrio-0.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7434b5222e6c373c9fc01937fdea7e1cfa88030770efe650f296cdd7656f7c35"}, + {file = "pyogrio-0.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc58e9e9201605bd5f9056734e67314a296a696f28a71c9a0fb0152108965b0"}, + {file = "pyogrio-0.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c2550195df759486337aea76353c467bb7f4b5287df6bc789756d4b7f84aab8"}, + {file = "pyogrio-0.8.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ed10c44e7b2fe899ecd25e9bdd82a1b4ba5d2792850924858f7aea04cad3d801"}, + {file = "pyogrio-0.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:3a574acccec2a2d8af097a01975688bc059d8d03b49c56b4ee029eb3d9b384e2"}, + {file = "pyogrio-0.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dca63e63a50ca69e0334d6d4f8904e622974007ed072f179f5c26f81277a6dbe"}, + {file = "pyogrio-0.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7a830a0a89f5846c4b7fbb9faf34d3ca5cdb56f427f0eb12dfa46bc2664affda"}, + {file = "pyogrio-0.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63dc3ef1272c4b01b8dd6a5fd3c696ab81cc6f7030d2dcb266d01fb8909e27cf"}, + {file = "pyogrio-0.8.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:f67c0e68896fd49218e6451a95d2dee75816a715fb80048250c21e3b39babc48"}, + {file = "pyogrio-0.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:fc77e8b07cd971601868e1c8ff1fa231773df1c889ca6e2c99a0ad22380aefb2"}, + {file = "pyogrio-0.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:2779f0c04573321b879570e07de3525cadb4e47efa4bc245ff655a419d84a3e2"}, + {file = "pyogrio-0.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e83ddf7e821ec3c1376ab9cf57ba3def18f687a117e43f508c4be1174045ffc7"}, + {file = "pyogrio-0.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12eaa1dd13d4632f12e334f7dccbbf7cea6ae3ed967d8db2b0ade44787f44cfa"}, + {file = "pyogrio-0.8.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:83bdf508a1903328731d3843955a951b717092317e6192ff6d882ceece559da7"}, + {file = "pyogrio-0.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:1bcca7902eb7c3c5d2d7528f6fa86cd9f0409a993e63c661dfec2415ad5a3a55"}, + {file = "pyogrio-0.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3b05184adb265d8b1d17b8da4a0d08c311ba09d38d843286184d399997028344"}, + {file = "pyogrio-0.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b8fef111416d149d098e999cf2df2dd3cbe3d8dac2b7c63017b8b931dcbde51b"}, + {file = "pyogrio-0.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd4c7b294c62d48f4263db78d8998d27db29298cfbbbe244ba7687a6280853c7"}, + {file = "pyogrio-0.8.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:04e673fe5d712711eed4877aed069683f9734948a66e58785f045166343c5f3f"}, + {file = "pyogrio-0.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:e8cc26bb7685371da471e8b6107bed9fe4a56a4fe649c38dea8aaee99b26bf2e"}, + {file = "pyogrio-0.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:56997a41ef9cf1e36996526e9f9c1f620d18cfc67cebe94afcd82d44315b490f"}, + {file = "pyogrio-0.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d78585d100cb86b98582702416e56cd6bc10540a6cbedfd2b5d3d75b9a44e3d3"}, + {file = "pyogrio-0.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e09b72756700537456007ee7c2734cc76cb2239e20617735b019a2c402b93a91"}, + {file = "pyogrio-0.8.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:00347b7187eb289819295333cf363161eb4cf8d8abb469af7f5bc84a00916ff5"}, + {file = "pyogrio-0.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:a06cfd08d9abcc28a1ae07f3c3def02c6698767a8200c0248f3cd06e50e27433"}, + {file = "pyogrio-0.8.0.tar.gz", hash = "sha256:459ec590c3c1cda451f3f73c88a678c32b127de783bf54c41ea6ad708969f020"}, ] [package.dependencies] @@ -3343,61 +3422,64 @@ files = [ [[package]] name = "pyyaml" -version = "6.0.1" +version = "6.0.2" description = "YAML parser and emitter for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] [[package]] @@ -3416,99 +3498,120 @@ pyyaml = "*" [[package]] name = "pyzmq" -version = "26.0.3" +version = "26.1.0" description = "Python bindings for 0MQ" optional = false python-versions = ">=3.7" files = [ - {file = "pyzmq-26.0.3-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:44dd6fc3034f1eaa72ece33588867df9e006a7303725a12d64c3dff92330f625"}, - {file = "pyzmq-26.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:acb704195a71ac5ea5ecf2811c9ee19ecdc62b91878528302dd0be1b9451cc90"}, - {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dbb9c997932473a27afa93954bb77a9f9b786b4ccf718d903f35da3232317de"}, - {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6bcb34f869d431799c3ee7d516554797f7760cb2198ecaa89c3f176f72d062be"}, - {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ece17ec5f20d7d9b442e5174ae9f020365d01ba7c112205a4d59cf19dc38ee"}, - {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ba6e5e6588e49139a0979d03a7deb9c734bde647b9a8808f26acf9c547cab1bf"}, - {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3bf8b000a4e2967e6dfdd8656cd0757d18c7e5ce3d16339e550bd462f4857e59"}, - {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2136f64fbb86451dbbf70223635a468272dd20075f988a102bf8a3f194a411dc"}, - {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e8918973fbd34e7814f59143c5f600ecd38b8038161239fd1a3d33d5817a38b8"}, - {file = "pyzmq-26.0.3-cp310-cp310-win32.whl", hash = "sha256:0aaf982e68a7ac284377d051c742610220fd06d330dcd4c4dbb4cdd77c22a537"}, - {file = "pyzmq-26.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:f1a9b7d00fdf60b4039f4455afd031fe85ee8305b019334b72dcf73c567edc47"}, - {file = "pyzmq-26.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:80b12f25d805a919d53efc0a5ad7c0c0326f13b4eae981a5d7b7cc343318ebb7"}, - {file = "pyzmq-26.0.3-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:a72a84570f84c374b4c287183debc776dc319d3e8ce6b6a0041ce2e400de3f32"}, - {file = "pyzmq-26.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ca684ee649b55fd8f378127ac8462fb6c85f251c2fb027eb3c887e8ee347bcd"}, - {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e222562dc0f38571c8b1ffdae9d7adb866363134299264a1958d077800b193b7"}, - {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f17cde1db0754c35a91ac00b22b25c11da6eec5746431d6e5092f0cd31a3fea9"}, - {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b7c0c0b3244bb2275abe255d4a30c050d541c6cb18b870975553f1fb6f37527"}, - {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:ac97a21de3712afe6a6c071abfad40a6224fd14fa6ff0ff8d0c6e6cd4e2f807a"}, - {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:88b88282e55fa39dd556d7fc04160bcf39dea015f78e0cecec8ff4f06c1fc2b5"}, - {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:72b67f966b57dbd18dcc7efbc1c7fc9f5f983e572db1877081f075004614fcdd"}, - {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f4b6cecbbf3b7380f3b61de3a7b93cb721125dc125c854c14ddc91225ba52f83"}, - {file = "pyzmq-26.0.3-cp311-cp311-win32.whl", hash = "sha256:eed56b6a39216d31ff8cd2f1d048b5bf1700e4b32a01b14379c3b6dde9ce3aa3"}, - {file = "pyzmq-26.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:3191d312c73e3cfd0f0afdf51df8405aafeb0bad71e7ed8f68b24b63c4f36500"}, - {file = "pyzmq-26.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:b6907da3017ef55139cf0e417c5123a84c7332520e73a6902ff1f79046cd3b94"}, - {file = "pyzmq-26.0.3-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:068ca17214038ae986d68f4a7021f97e187ed278ab6dccb79f837d765a54d753"}, - {file = "pyzmq-26.0.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7821d44fe07335bea256b9f1f41474a642ca55fa671dfd9f00af8d68a920c2d4"}, - {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eeb438a26d87c123bb318e5f2b3d86a36060b01f22fbdffd8cf247d52f7c9a2b"}, - {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69ea9d6d9baa25a4dc9cef5e2b77b8537827b122214f210dd925132e34ae9b12"}, - {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7daa3e1369355766dea11f1d8ef829905c3b9da886ea3152788dc25ee6079e02"}, - {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:6ca7a9a06b52d0e38ccf6bca1aeff7be178917893f3883f37b75589d42c4ac20"}, - {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1b7d0e124948daa4d9686d421ef5087c0516bc6179fdcf8828b8444f8e461a77"}, - {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e746524418b70f38550f2190eeee834db8850088c834d4c8406fbb9bc1ae10b2"}, - {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6b3146f9ae6af82c47a5282ac8803523d381b3b21caeae0327ed2f7ecb718798"}, - {file = "pyzmq-26.0.3-cp312-cp312-win32.whl", hash = "sha256:2b291d1230845871c00c8462c50565a9cd6026fe1228e77ca934470bb7d70ea0"}, - {file = "pyzmq-26.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:926838a535c2c1ea21c903f909a9a54e675c2126728c21381a94ddf37c3cbddf"}, - {file = "pyzmq-26.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:5bf6c237f8c681dfb91b17f8435b2735951f0d1fad10cc5dfd96db110243370b"}, - {file = "pyzmq-26.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c0991f5a96a8e620f7691e61178cd8f457b49e17b7d9cfa2067e2a0a89fc1d5"}, - {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dbf012d8fcb9f2cf0643b65df3b355fdd74fc0035d70bb5c845e9e30a3a4654b"}, - {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:01fbfbeb8249a68d257f601deb50c70c929dc2dfe683b754659569e502fbd3aa"}, - {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c8eb19abe87029c18f226d42b8a2c9efdd139d08f8bf6e085dd9075446db450"}, - {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5344b896e79800af86ad643408ca9aa303a017f6ebff8cee5a3163c1e9aec987"}, - {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:204e0f176fd1d067671157d049466869b3ae1fc51e354708b0dc41cf94e23a3a"}, - {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a42db008d58530efa3b881eeee4991146de0b790e095f7ae43ba5cc612decbc5"}, - {file = "pyzmq-26.0.3-cp37-cp37m-win32.whl", hash = "sha256:8d7a498671ca87e32b54cb47c82a92b40130a26c5197d392720a1bce1b3c77cf"}, - {file = "pyzmq-26.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:3b4032a96410bdc760061b14ed6a33613ffb7f702181ba999df5d16fb96ba16a"}, - {file = "pyzmq-26.0.3-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:2cc4e280098c1b192c42a849de8de2c8e0f3a84086a76ec5b07bfee29bda7d18"}, - {file = "pyzmq-26.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5bde86a2ed3ce587fa2b207424ce15b9a83a9fa14422dcc1c5356a13aed3df9d"}, - {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:34106f68e20e6ff253c9f596ea50397dbd8699828d55e8fa18bd4323d8d966e6"}, - {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ebbbd0e728af5db9b04e56389e2299a57ea8b9dd15c9759153ee2455b32be6ad"}, - {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6b1d1c631e5940cac5a0b22c5379c86e8df6a4ec277c7a856b714021ab6cfad"}, - {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e891ce81edd463b3b4c3b885c5603c00141151dd9c6936d98a680c8c72fe5c67"}, - {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9b273ecfbc590a1b98f014ae41e5cf723932f3b53ba9367cfb676f838038b32c"}, - {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b32bff85fb02a75ea0b68f21e2412255b5731f3f389ed9aecc13a6752f58ac97"}, - {file = "pyzmq-26.0.3-cp38-cp38-win32.whl", hash = "sha256:f6c21c00478a7bea93caaaef9e7629145d4153b15a8653e8bb4609d4bc70dbfc"}, - {file = "pyzmq-26.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:3401613148d93ef0fd9aabdbddb212de3db7a4475367f49f590c837355343972"}, - {file = "pyzmq-26.0.3-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:2ed8357f4c6e0daa4f3baf31832df8a33334e0fe5b020a61bc8b345a3db7a606"}, - {file = "pyzmq-26.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c1c8f2a2ca45292084c75bb6d3a25545cff0ed931ed228d3a1810ae3758f975f"}, - {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b63731993cdddcc8e087c64e9cf003f909262b359110070183d7f3025d1c56b5"}, - {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b3cd31f859b662ac5d7f4226ec7d8bd60384fa037fc02aee6ff0b53ba29a3ba8"}, - {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:115f8359402fa527cf47708d6f8a0f8234f0e9ca0cab7c18c9c189c194dbf620"}, - {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:715bdf952b9533ba13dfcf1f431a8f49e63cecc31d91d007bc1deb914f47d0e4"}, - {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e1258c639e00bf5e8a522fec6c3eaa3e30cf1c23a2f21a586be7e04d50c9acab"}, - {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:15c59e780be8f30a60816a9adab900c12a58d79c1ac742b4a8df044ab2a6d920"}, - {file = "pyzmq-26.0.3-cp39-cp39-win32.whl", hash = "sha256:d0cdde3c78d8ab5b46595054e5def32a755fc028685add5ddc7403e9f6de9879"}, - {file = "pyzmq-26.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:ce828058d482ef860746bf532822842e0ff484e27f540ef5c813d516dd8896d2"}, - {file = "pyzmq-26.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:788f15721c64109cf720791714dc14afd0f449d63f3a5487724f024345067381"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c18645ef6294d99b256806e34653e86236eb266278c8ec8112622b61db255de"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e6bc96ebe49604df3ec2c6389cc3876cabe475e6bfc84ced1bf4e630662cb35"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:971e8990c5cc4ddcff26e149398fc7b0f6a042306e82500f5e8db3b10ce69f84"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8416c23161abd94cc7da80c734ad7c9f5dbebdadfdaa77dad78244457448223"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:082a2988364b60bb5de809373098361cf1dbb239623e39e46cb18bc035ed9c0c"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d57dfbf9737763b3a60d26e6800e02e04284926329aee8fb01049635e957fe81"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:77a85dca4c2430ac04dc2a2185c2deb3858a34fe7f403d0a946fa56970cf60a1"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4c82a6d952a1d555bf4be42b6532927d2a5686dd3c3e280e5f63225ab47ac1f5"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4496b1282c70c442809fc1b151977c3d967bfb33e4e17cedbf226d97de18f709"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:e4946d6bdb7ba972dfda282f9127e5756d4f299028b1566d1245fa0d438847e6"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:03c0ae165e700364b266876d712acb1ac02693acd920afa67da2ebb91a0b3c09"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3e3070e680f79887d60feeda051a58d0ac36622e1759f305a41059eff62c6da7"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6ca08b840fe95d1c2bd9ab92dac5685f949fc6f9ae820ec16193e5ddf603c3b2"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e76654e9dbfb835b3518f9938e565c7806976c07b37c33526b574cc1a1050480"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:871587bdadd1075b112e697173e946a07d722459d20716ceb3d1bd6c64bd08ce"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d0a2d1bd63a4ad79483049b26514e70fa618ce6115220da9efdff63688808b17"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0270b49b6847f0d106d64b5086e9ad5dc8a902413b5dbbb15d12b60f9c1747a4"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:703c60b9910488d3d0954ca585c34f541e506a091a41930e663a098d3b794c67"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74423631b6be371edfbf7eabb02ab995c2563fee60a80a30829176842e71722a"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4adfbb5451196842a88fda3612e2c0414134874bffb1c2ce83ab4242ec9e027d"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3516119f4f9b8671083a70b6afaa0a070f5683e431ab3dc26e9215620d7ca1ad"}, - {file = "pyzmq-26.0.3.tar.gz", hash = "sha256:dba7d9f2e047dfa2bca3b01f4f84aa5246725203d6284e3790f2ca15fba6b40a"}, + {file = "pyzmq-26.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:263cf1e36862310bf5becfbc488e18d5d698941858860c5a8c079d1511b3b18e"}, + {file = "pyzmq-26.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d5c8b17f6e8f29138678834cf8518049e740385eb2dbf736e8f07fc6587ec682"}, + {file = "pyzmq-26.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75a95c2358fcfdef3374cb8baf57f1064d73246d55e41683aaffb6cfe6862917"}, + {file = "pyzmq-26.1.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f99de52b8fbdb2a8f5301ae5fc0f9e6b3ba30d1d5fc0421956967edcc6914242"}, + {file = "pyzmq-26.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bcbfbab4e1895d58ab7da1b5ce9a327764f0366911ba5b95406c9104bceacb0"}, + {file = "pyzmq-26.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:77ce6a332c7e362cb59b63f5edf730e83590d0ab4e59c2aa5bd79419a42e3449"}, + {file = "pyzmq-26.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ba0a31d00e8616149a5ab440d058ec2da621e05d744914774c4dde6837e1f545"}, + {file = "pyzmq-26.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8b88641384e84a258b740801cd4dbc45c75f148ee674bec3149999adda4a8598"}, + {file = "pyzmq-26.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2fa76ebcebe555cce90f16246edc3ad83ab65bb7b3d4ce408cf6bc67740c4f88"}, + {file = "pyzmq-26.1.0-cp310-cp310-win32.whl", hash = "sha256:fbf558551cf415586e91160d69ca6416f3fce0b86175b64e4293644a7416b81b"}, + {file = "pyzmq-26.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:a7b8aab50e5a288c9724d260feae25eda69582be84e97c012c80e1a5e7e03fb2"}, + {file = "pyzmq-26.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:08f74904cb066e1178c1ec706dfdb5c6c680cd7a8ed9efebeac923d84c1f13b1"}, + {file = "pyzmq-26.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:46d6800b45015f96b9d92ece229d92f2aef137d82906577d55fadeb9cf5fcb71"}, + {file = "pyzmq-26.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5bc2431167adc50ba42ea3e5e5f5cd70d93e18ab7b2f95e724dd8e1bd2c38120"}, + {file = "pyzmq-26.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3bb34bebaa1b78e562931a1687ff663d298013f78f972a534f36c523311a84d"}, + {file = "pyzmq-26.1.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3f6329340cef1c7ba9611bd038f2d523cea79f09f9c8f6b0553caba59ec562"}, + {file = "pyzmq-26.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:471880c4c14e5a056a96cd224f5e71211997d40b4bf5e9fdded55dafab1f98f2"}, + {file = "pyzmq-26.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:ce6f2b66799971cbae5d6547acefa7231458289e0ad481d0be0740535da38d8b"}, + {file = "pyzmq-26.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0a1f6ea5b1d6cdbb8cfa0536f0d470f12b4b41ad83625012e575f0e3ecfe97f0"}, + {file = "pyzmq-26.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b45e6445ac95ecb7d728604bae6538f40ccf4449b132b5428c09918523abc96d"}, + {file = "pyzmq-26.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:94c4262626424683feea0f3c34951d39d49d354722db2745c42aa6bb50ecd93b"}, + {file = "pyzmq-26.1.0-cp311-cp311-win32.whl", hash = "sha256:a0f0ab9df66eb34d58205913f4540e2ad17a175b05d81b0b7197bc57d000e829"}, + {file = "pyzmq-26.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:8efb782f5a6c450589dbab4cb0f66f3a9026286333fe8f3a084399149af52f29"}, + {file = "pyzmq-26.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:f133d05aaf623519f45e16ab77526e1e70d4e1308e084c2fb4cedb1a0c764bbb"}, + {file = "pyzmq-26.1.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:3d3146b1c3dcc8a1539e7cc094700b2be1e605a76f7c8f0979b6d3bde5ad4072"}, + {file = "pyzmq-26.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d9270fbf038bf34ffca4855bcda6e082e2c7f906b9eb8d9a8ce82691166060f7"}, + {file = "pyzmq-26.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:995301f6740a421afc863a713fe62c0aaf564708d4aa057dfdf0f0f56525294b"}, + {file = "pyzmq-26.1.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7eca8b89e56fb8c6c26dd3e09bd41b24789022acf1cf13358e96f1cafd8cae3"}, + {file = "pyzmq-26.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d4feb2e83dfe9ace6374a847e98ee9d1246ebadcc0cb765482e272c34e5820"}, + {file = "pyzmq-26.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d4fafc2eb5d83f4647331267808c7e0c5722c25a729a614dc2b90479cafa78bd"}, + {file = "pyzmq-26.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:58c33dc0e185dd97a9ac0288b3188d1be12b756eda67490e6ed6a75cf9491d79"}, + {file = "pyzmq-26.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:68a0a1d83d33d8367ddddb3e6bb4afbb0f92bd1dac2c72cd5e5ddc86bdafd3eb"}, + {file = "pyzmq-26.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2ae7c57e22ad881af78075e0cea10a4c778e67234adc65c404391b417a4dda83"}, + {file = "pyzmq-26.1.0-cp312-cp312-win32.whl", hash = "sha256:347e84fc88cc4cb646597f6d3a7ea0998f887ee8dc31c08587e9c3fd7b5ccef3"}, + {file = "pyzmq-26.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:9f136a6e964830230912f75b5a116a21fe8e34128dcfd82285aa0ef07cb2c7bd"}, + {file = "pyzmq-26.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:a4b7a989c8f5a72ab1b2bbfa58105578753ae77b71ba33e7383a31ff75a504c4"}, + {file = "pyzmq-26.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d416f2088ac8f12daacffbc2e8918ef4d6be8568e9d7155c83b7cebed49d2322"}, + {file = "pyzmq-26.1.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:ecb6c88d7946166d783a635efc89f9a1ff11c33d680a20df9657b6902a1d133b"}, + {file = "pyzmq-26.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:471312a7375571857a089342beccc1a63584315188560c7c0da7e0a23afd8a5c"}, + {file = "pyzmq-26.1.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e6cea102ffa16b737d11932c426f1dc14b5938cf7bc12e17269559c458ac334"}, + {file = "pyzmq-26.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec7248673ffc7104b54e4957cee38b2f3075a13442348c8d651777bf41aa45ee"}, + {file = "pyzmq-26.1.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:0614aed6f87d550b5cecb03d795f4ddbb1544b78d02a4bd5eecf644ec98a39f6"}, + {file = "pyzmq-26.1.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:e8746ce968be22a8a1801bf4a23e565f9687088580c3ed07af5846580dd97f76"}, + {file = "pyzmq-26.1.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:7688653574392d2eaeef75ddcd0b2de5b232d8730af29af56c5adf1df9ef8d6f"}, + {file = "pyzmq-26.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:8d4dac7d97f15c653a5fedcafa82626bd6cee1450ccdaf84ffed7ea14f2b07a4"}, + {file = "pyzmq-26.1.0-cp313-cp313-win32.whl", hash = "sha256:ccb42ca0a4a46232d716779421bbebbcad23c08d37c980f02cc3a6bd115ad277"}, + {file = "pyzmq-26.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e1e5d0a25aea8b691a00d6b54b28ac514c8cc0d8646d05f7ca6cb64b97358250"}, + {file = "pyzmq-26.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:fc82269d24860cfa859b676d18850cbb8e312dcd7eada09e7d5b007e2f3d9eb1"}, + {file = "pyzmq-26.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:416ac51cabd54f587995c2b05421324700b22e98d3d0aa2cfaec985524d16f1d"}, + {file = "pyzmq-26.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:ff832cce719edd11266ca32bc74a626b814fff236824aa1aeaad399b69fe6eae"}, + {file = "pyzmq-26.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:393daac1bcf81b2a23e696b7b638eedc965e9e3d2112961a072b6cd8179ad2eb"}, + {file = "pyzmq-26.1.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9869fa984c8670c8ab899a719eb7b516860a29bc26300a84d24d8c1b71eae3ec"}, + {file = "pyzmq-26.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b3b8e36fd4c32c0825b4461372949ecd1585d326802b1321f8b6dc1d7e9318c"}, + {file = "pyzmq-26.1.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:3ee647d84b83509b7271457bb428cc347037f437ead4b0b6e43b5eba35fec0aa"}, + {file = "pyzmq-26.1.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:45cb1a70eb00405ce3893041099655265fabcd9c4e1e50c330026e82257892c1"}, + {file = "pyzmq-26.1.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:5cca7b4adb86d7470e0fc96037771981d740f0b4cb99776d5cb59cd0e6684a73"}, + {file = "pyzmq-26.1.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:91d1a20bdaf3b25f3173ff44e54b1cfbc05f94c9e8133314eb2962a89e05d6e3"}, + {file = "pyzmq-26.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c0665d85535192098420428c779361b8823d3d7ec4848c6af3abb93bc5c915bf"}, + {file = "pyzmq-26.1.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:96d7c1d35ee4a495df56c50c83df7af1c9688cce2e9e0edffdbf50889c167595"}, + {file = "pyzmq-26.1.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b281b5ff5fcc9dcbfe941ac5c7fcd4b6c065adad12d850f95c9d6f23c2652384"}, + {file = "pyzmq-26.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5384c527a9a004445c5074f1e20db83086c8ff1682a626676229aafd9cf9f7d1"}, + {file = "pyzmq-26.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:754c99a9840839375ee251b38ac5964c0f369306eddb56804a073b6efdc0cd88"}, + {file = "pyzmq-26.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9bdfcb74b469b592972ed881bad57d22e2c0acc89f5e8c146782d0d90fb9f4bf"}, + {file = "pyzmq-26.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bd13f0231f4788db619347b971ca5f319c5b7ebee151afc7c14632068c6261d3"}, + {file = "pyzmq-26.1.0-cp37-cp37m-win32.whl", hash = "sha256:c5668dac86a869349828db5fc928ee3f58d450dce2c85607067d581f745e4fb1"}, + {file = "pyzmq-26.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad875277844cfaeca7fe299ddf8c8d8bfe271c3dc1caf14d454faa5cdbf2fa7a"}, + {file = "pyzmq-26.1.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:65c6e03cc0222eaf6aad57ff4ecc0a070451e23232bb48db4322cc45602cede0"}, + {file = "pyzmq-26.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:038ae4ffb63e3991f386e7fda85a9baab7d6617fe85b74a8f9cab190d73adb2b"}, + {file = "pyzmq-26.1.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:bdeb2c61611293f64ac1073f4bf6723b67d291905308a7de9bb2ca87464e3273"}, + {file = "pyzmq-26.1.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:61dfa5ee9d7df297c859ac82b1226d8fefaf9c5113dc25c2c00ecad6feeeb04f"}, + {file = "pyzmq-26.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3292d384537b9918010769b82ab3e79fca8b23d74f56fc69a679106a3e2c2cf"}, + {file = "pyzmq-26.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f9499c70c19ff0fbe1007043acb5ad15c1dec7d8e84ab429bca8c87138e8f85c"}, + {file = "pyzmq-26.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d3dd5523ed258ad58fed7e364c92a9360d1af8a9371e0822bd0146bdf017ef4c"}, + {file = "pyzmq-26.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baba2fd199b098c5544ef2536b2499d2e2155392973ad32687024bd8572a7d1c"}, + {file = "pyzmq-26.1.0-cp38-cp38-win32.whl", hash = "sha256:ddbb2b386128d8eca92bd9ca74e80f73fe263bcca7aa419f5b4cbc1661e19741"}, + {file = "pyzmq-26.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:79e45a4096ec8388cdeb04a9fa5e9371583bcb826964d55b8b66cbffe7b33c86"}, + {file = "pyzmq-26.1.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:add52c78a12196bc0fda2de087ba6c876ea677cbda2e3eba63546b26e8bf177b"}, + {file = "pyzmq-26.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:98c03bd7f3339ff47de7ea9ac94a2b34580a8d4df69b50128bb6669e1191a895"}, + {file = "pyzmq-26.1.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dcc37d9d708784726fafc9c5e1232de655a009dbf97946f117aefa38d5985a0f"}, + {file = "pyzmq-26.1.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a6ed52f0b9bf8dcc64cc82cce0607a3dfed1dbb7e8c6f282adfccc7be9781de"}, + {file = "pyzmq-26.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:451e16ae8bea3d95649317b463c9f95cd9022641ec884e3d63fc67841ae86dfe"}, + {file = "pyzmq-26.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:906e532c814e1d579138177a00ae835cd6becbf104d45ed9093a3aaf658f6a6a"}, + {file = "pyzmq-26.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:05bacc4f94af468cc82808ae3293390278d5f3375bb20fef21e2034bb9a505b6"}, + {file = "pyzmq-26.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:57bb2acba798dc3740e913ffadd56b1fcef96f111e66f09e2a8db3050f1f12c8"}, + {file = "pyzmq-26.1.0-cp39-cp39-win32.whl", hash = "sha256:f774841bb0e8588505002962c02da420bcfb4c5056e87a139c6e45e745c0e2e2"}, + {file = "pyzmq-26.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:359c533bedc62c56415a1f5fcfd8279bc93453afdb0803307375ecf81c962402"}, + {file = "pyzmq-26.1.0-cp39-cp39-win_arm64.whl", hash = "sha256:7907419d150b19962138ecec81a17d4892ea440c184949dc29b358bc730caf69"}, + {file = "pyzmq-26.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b24079a14c9596846bf7516fe75d1e2188d4a528364494859106a33d8b48be38"}, + {file = "pyzmq-26.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59d0acd2976e1064f1b398a00e2c3e77ed0a157529779e23087d4c2fb8aaa416"}, + {file = "pyzmq-26.1.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:911c43a4117915203c4cc8755e0f888e16c4676a82f61caee2f21b0c00e5b894"}, + {file = "pyzmq-26.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b10163e586cc609f5f85c9b233195554d77b1e9a0801388907441aaeb22841c5"}, + {file = "pyzmq-26.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:28a8b2abb76042f5fd7bd720f7fea48c0fd3e82e9de0a1bf2c0de3812ce44a42"}, + {file = "pyzmq-26.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bef24d3e4ae2c985034439f449e3f9e06bf579974ce0e53d8a507a1577d5b2ab"}, + {file = "pyzmq-26.1.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2cd0f4d314f4a2518e8970b6f299ae18cff7c44d4a1fc06fc713f791c3a9e3ea"}, + {file = "pyzmq-26.1.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fa25a620eed2a419acc2cf10135b995f8f0ce78ad00534d729aa761e4adcef8a"}, + {file = "pyzmq-26.1.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef3b048822dca6d231d8a8ba21069844ae38f5d83889b9b690bf17d2acc7d099"}, + {file = "pyzmq-26.1.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:9a6847c92d9851b59b9f33f968c68e9e441f9a0f8fc972c5580c5cd7cbc6ee24"}, + {file = "pyzmq-26.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9b9305004d7e4e6a824f4f19b6d8f32b3578aad6f19fc1122aaf320cbe3dc83"}, + {file = "pyzmq-26.1.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:63c1d3a65acb2f9c92dce03c4e1758cc552f1ae5c78d79a44e3bb88d2fa71f3a"}, + {file = "pyzmq-26.1.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d36b8fffe8b248a1b961c86fbdfa0129dfce878731d169ede7fa2631447331be"}, + {file = "pyzmq-26.1.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67976d12ebfd61a3bc7d77b71a9589b4d61d0422282596cf58c62c3866916544"}, + {file = "pyzmq-26.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:998444debc8816b5d8d15f966e42751032d0f4c55300c48cc337f2b3e4f17d03"}, + {file = "pyzmq-26.1.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e5c88b2f13bcf55fee78ea83567b9fe079ba1a4bef8b35c376043440040f7edb"}, + {file = "pyzmq-26.1.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d906d43e1592be4b25a587b7d96527cb67277542a5611e8ea9e996182fae410"}, + {file = "pyzmq-26.1.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80b0c9942430d731c786545da6be96d824a41a51742e3e374fedd9018ea43106"}, + {file = "pyzmq-26.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:314d11564c00b77f6224d12eb3ddebe926c301e86b648a1835c5b28176c83eab"}, + {file = "pyzmq-26.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:093a1a3cae2496233f14b57f4b485da01b4ff764582c854c0f42c6dd2be37f3d"}, + {file = "pyzmq-26.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3c397b1b450f749a7e974d74c06d69bd22dd362142f370ef2bd32a684d6b480c"}, + {file = "pyzmq-26.1.0.tar.gz", hash = "sha256:6c5aeea71f018ebd3b9115c7cb13863dd850e98ca6b9258509de1246461a7e7f"}, ] [package.dependencies] @@ -3531,90 +3634,90 @@ rpds-py = ">=0.7.0" [[package]] name = "regex" -version = "2024.5.15" +version = "2024.7.24" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" files = [ - {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a81e3cfbae20378d75185171587cbf756015ccb14840702944f014e0d93ea09f"}, - {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b59138b219ffa8979013be7bc85bb60c6f7b7575df3d56dc1e403a438c7a3f6"}, - {file = "regex-2024.5.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0bd000c6e266927cb7a1bc39d55be95c4b4f65c5be53e659537537e019232b1"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eaa7ddaf517aa095fa8da0b5015c44d03da83f5bd49c87961e3c997daed0de7"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba68168daedb2c0bab7fd7e00ced5ba90aebf91024dea3c88ad5063c2a562cca"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e8d717bca3a6e2064fc3a08df5cbe366369f4b052dcd21b7416e6d71620dca1"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1337b7dbef9b2f71121cdbf1e97e40de33ff114801263b275aafd75303bd62b5"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9ebd0a36102fcad2f03696e8af4ae682793a5d30b46c647eaf280d6cfb32796"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9efa1a32ad3a3ea112224897cdaeb6aa00381627f567179c0314f7b65d354c62"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1595f2d10dff3d805e054ebdc41c124753631b6a471b976963c7b28543cf13b0"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b802512f3e1f480f41ab5f2cfc0e2f761f08a1f41092d6718868082fc0d27143"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a0981022dccabca811e8171f913de05720590c915b033b7e601f35ce4ea7019f"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:19068a6a79cf99a19ccefa44610491e9ca02c2be3305c7760d3831d38a467a6f"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1b5269484f6126eee5e687785e83c6b60aad7663dafe842b34691157e5083e53"}, - {file = "regex-2024.5.15-cp310-cp310-win32.whl", hash = "sha256:ada150c5adfa8fbcbf321c30c751dc67d2f12f15bd183ffe4ec7cde351d945b3"}, - {file = "regex-2024.5.15-cp310-cp310-win_amd64.whl", hash = "sha256:ac394ff680fc46b97487941f5e6ae49a9f30ea41c6c6804832063f14b2a5a145"}, - {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f5b1dff3ad008dccf18e652283f5e5339d70bf8ba7c98bf848ac33db10f7bc7a"}, - {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c6a2b494a76983df8e3d3feea9b9ffdd558b247e60b92f877f93a1ff43d26656"}, - {file = "regex-2024.5.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a32b96f15c8ab2e7d27655969a23895eb799de3665fa94349f3b2fbfd547236f"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10002e86e6068d9e1c91eae8295ef690f02f913c57db120b58fdd35a6bb1af35"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec54d5afa89c19c6dd8541a133be51ee1017a38b412b1321ccb8d6ddbeb4cf7d"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10e4ce0dca9ae7a66e6089bb29355d4432caed736acae36fef0fdd7879f0b0cb"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e507ff1e74373c4d3038195fdd2af30d297b4f0950eeda6f515ae3d84a1770f"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1f059a4d795e646e1c37665b9d06062c62d0e8cc3c511fe01315973a6542e40"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0721931ad5fe0dda45d07f9820b90b2148ccdd8e45bb9e9b42a146cb4f695649"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:833616ddc75ad595dee848ad984d067f2f31be645d603e4d158bba656bbf516c"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:287eb7f54fc81546346207c533ad3c2c51a8d61075127d7f6d79aaf96cdee890"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:19dfb1c504781a136a80ecd1fff9f16dddf5bb43cec6871778c8a907a085bb3d"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:119af6e56dce35e8dfb5222573b50c89e5508d94d55713c75126b753f834de68"}, - {file = "regex-2024.5.15-cp311-cp311-win32.whl", hash = "sha256:1c1c174d6ec38d6c8a7504087358ce9213d4332f6293a94fbf5249992ba54efa"}, - {file = "regex-2024.5.15-cp311-cp311-win_amd64.whl", hash = "sha256:9e717956dcfd656f5055cc70996ee2cc82ac5149517fc8e1b60261b907740201"}, - {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:632b01153e5248c134007209b5c6348a544ce96c46005d8456de1d552455b014"}, - {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e64198f6b856d48192bf921421fdd8ad8eb35e179086e99e99f711957ffedd6e"}, - {file = "regex-2024.5.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68811ab14087b2f6e0fc0c2bae9ad689ea3584cad6917fc57be6a48bbd012c49"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ec0c2fea1e886a19c3bee0cd19d862b3aa75dcdfb42ebe8ed30708df64687a"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0c0c0003c10f54a591d220997dd27d953cd9ccc1a7294b40a4be5312be8797b"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2431b9e263af1953c55abbd3e2efca67ca80a3de8a0437cb58e2421f8184717a"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a605586358893b483976cffc1723fb0f83e526e8f14c6e6614e75919d9862cf"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:391d7f7f1e409d192dba8bcd42d3e4cf9e598f3979cdaed6ab11288da88cb9f2"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9ff11639a8d98969c863d4617595eb5425fd12f7c5ef6621a4b74b71ed8726d5"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4eee78a04e6c67e8391edd4dad3279828dd66ac4b79570ec998e2155d2e59fd5"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8fe45aa3f4aa57faabbc9cb46a93363edd6197cbc43523daea044e9ff2fea83e"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:d0a3d8d6acf0c78a1fff0e210d224b821081330b8524e3e2bc5a68ef6ab5803d"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c486b4106066d502495b3025a0a7251bf37ea9540433940a23419461ab9f2a80"}, - {file = "regex-2024.5.15-cp312-cp312-win32.whl", hash = "sha256:c49e15eac7c149f3670b3e27f1f28a2c1ddeccd3a2812cba953e01be2ab9b5fe"}, - {file = "regex-2024.5.15-cp312-cp312-win_amd64.whl", hash = "sha256:673b5a6da4557b975c6c90198588181029c60793835ce02f497ea817ff647cb2"}, - {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:87e2a9c29e672fc65523fb47a90d429b70ef72b901b4e4b1bd42387caf0d6835"}, - {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c3bea0ba8b73b71b37ac833a7f3fd53825924165da6a924aec78c13032f20850"}, - {file = "regex-2024.5.15-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bfc4f82cabe54f1e7f206fd3d30fda143f84a63fe7d64a81558d6e5f2e5aaba9"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5bb9425fe881d578aeca0b2b4b3d314ec88738706f66f219c194d67179337cb"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64c65783e96e563103d641760664125e91bd85d8e49566ee560ded4da0d3e704"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf2430df4148b08fb4324b848672514b1385ae3807651f3567871f130a728cc3"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5397de3219a8b08ae9540c48f602996aa6b0b65d5a61683e233af8605c42b0f2"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:455705d34b4154a80ead722f4f185b04c4237e8e8e33f265cd0798d0e44825fa"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2b6f1b3bb6f640c1a92be3bbfbcb18657b125b99ecf141fb3310b5282c7d4ed"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3ad070b823ca5890cab606c940522d05d3d22395d432f4aaaf9d5b1653e47ced"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5b5467acbfc153847d5adb21e21e29847bcb5870e65c94c9206d20eb4e99a384"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e6662686aeb633ad65be2a42b4cb00178b3fbf7b91878f9446075c404ada552f"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:2b4c884767504c0e2401babe8b5b7aea9148680d2e157fa28f01529d1f7fcf67"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3cd7874d57f13bf70078f1ff02b8b0aa48d5b9ed25fc48547516c6aba36f5741"}, - {file = "regex-2024.5.15-cp38-cp38-win32.whl", hash = "sha256:e4682f5ba31f475d58884045c1a97a860a007d44938c4c0895f41d64481edbc9"}, - {file = "regex-2024.5.15-cp38-cp38-win_amd64.whl", hash = "sha256:d99ceffa25ac45d150e30bd9ed14ec6039f2aad0ffa6bb87a5936f5782fc1569"}, - {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13cdaf31bed30a1e1c2453ef6015aa0983e1366fad2667657dbcac7b02f67133"}, - {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cac27dcaa821ca271855a32188aa61d12decb6fe45ffe3e722401fe61e323cd1"}, - {file = "regex-2024.5.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7dbe2467273b875ea2de38ded4eba86cbcbc9a1a6d0aa11dcf7bd2e67859c435"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64f18a9a3513a99c4bef0e3efd4c4a5b11228b48aa80743be822b71e132ae4f5"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d347a741ea871c2e278fde6c48f85136c96b8659b632fb57a7d1ce1872547600"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1878b8301ed011704aea4c806a3cadbd76f84dece1ec09cc9e4dc934cfa5d4da"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4babf07ad476aaf7830d77000874d7611704a7fcf68c9c2ad151f5d94ae4bfc4"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35cb514e137cb3488bce23352af3e12fb0dbedd1ee6e60da053c69fb1b29cc6c"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cdd09d47c0b2efee9378679f8510ee6955d329424c659ab3c5e3a6edea696294"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:72d7a99cd6b8f958e85fc6ca5b37c4303294954eac1376535b03c2a43eb72629"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:a094801d379ab20c2135529948cb84d417a2169b9bdceda2a36f5f10977ebc16"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c0c18345010870e58238790a6779a1219b4d97bd2e77e1140e8ee5d14df071aa"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:16093f563098448ff6b1fa68170e4acbef94e6b6a4e25e10eae8598bb1694b5d"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e38a7d4e8f633a33b4c7350fbd8bad3b70bf81439ac67ac38916c4a86b465456"}, - {file = "regex-2024.5.15-cp39-cp39-win32.whl", hash = "sha256:71a455a3c584a88f654b64feccc1e25876066c4f5ef26cd6dd711308aa538694"}, - {file = "regex-2024.5.15-cp39-cp39-win_amd64.whl", hash = "sha256:cab12877a9bdafde5500206d1020a584355a97884dfd388af3699e9137bf7388"}, - {file = "regex-2024.5.15.tar.gz", hash = "sha256:d3ee02d9e5f482cc8309134a91eeaacbdd2261ba111b0fef3748eeb4913e6a2c"}, + {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b0d3f567fafa0633aee87f08b9276c7062da9616931382993c03808bb68ce"}, + {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3426de3b91d1bc73249042742f45c2148803c111d1175b283270177fdf669024"}, + {file = "regex-2024.7.24-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f273674b445bcb6e4409bf8d1be67bc4b58e8b46fd0d560055d515b8830063cd"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23acc72f0f4e1a9e6e9843d6328177ae3074b4182167e34119ec7233dfeccf53"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65fd3d2e228cae024c411c5ccdffae4c315271eee4a8b839291f84f796b34eca"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c414cbda77dbf13c3bc88b073a1a9f375c7b0cb5e115e15d4b73ec3a2fbc6f59"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf7a89eef64b5455835f5ed30254ec19bf41f7541cd94f266ab7cbd463f00c41"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19c65b00d42804e3fbea9708f0937d157e53429a39b7c61253ff15670ff62cb5"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7a5486ca56c8869070a966321d5ab416ff0f83f30e0e2da1ab48815c8d165d46"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6f51f9556785e5a203713f5efd9c085b4a45aecd2a42573e2b5041881b588d1f"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a4997716674d36a82eab3e86f8fa77080a5d8d96a389a61ea1d0e3a94a582cf7"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c0abb5e4e8ce71a61d9446040c1e86d4e6d23f9097275c5bd49ed978755ff0fe"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:18300a1d78cf1290fa583cd8b7cde26ecb73e9f5916690cf9d42de569c89b1ce"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:416c0e4f56308f34cdb18c3f59849479dde5b19febdcd6e6fa4d04b6c31c9faa"}, + {file = "regex-2024.7.24-cp310-cp310-win32.whl", hash = "sha256:fb168b5924bef397b5ba13aabd8cf5df7d3d93f10218d7b925e360d436863f66"}, + {file = "regex-2024.7.24-cp310-cp310-win_amd64.whl", hash = "sha256:6b9fc7e9cc983e75e2518496ba1afc524227c163e43d706688a6bb9eca41617e"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:382281306e3adaaa7b8b9ebbb3ffb43358a7bbf585fa93821300a418bb975281"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4fdd1384619f406ad9037fe6b6eaa3de2749e2e12084abc80169e8e075377d3b"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3d974d24edb231446f708c455fd08f94c41c1ff4f04bcf06e5f36df5ef50b95a"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2ec4419a3fe6cf8a4795752596dfe0adb4aea40d3683a132bae9c30b81e8d73"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb563dd3aea54c797adf513eeec819c4213d7dbfc311874eb4fd28d10f2ff0f2"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45104baae8b9f67569f0f1dca5e1f1ed77a54ae1cd8b0b07aba89272710db61e"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:994448ee01864501912abf2bad9203bffc34158e80fe8bfb5b031f4f8e16da51"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fac296f99283ac232d8125be932c5cd7644084a30748fda013028c815ba3364"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e37e809b9303ec3a179085415cb5f418ecf65ec98cdfe34f6a078b46ef823ee"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:01b689e887f612610c869421241e075c02f2e3d1ae93a037cb14f88ab6a8934c"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f6442f0f0ff81775eaa5b05af8a0ffa1dda36e9cf6ec1e0d3d245e8564b684ce"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:871e3ab2838fbcb4e0865a6e01233975df3a15e6fce93b6f99d75cacbd9862d1"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c918b7a1e26b4ab40409820ddccc5d49871a82329640f5005f73572d5eaa9b5e"}, + {file = "regex-2024.7.24-cp311-cp311-win32.whl", hash = "sha256:2dfbb8baf8ba2c2b9aa2807f44ed272f0913eeeba002478c4577b8d29cde215c"}, + {file = "regex-2024.7.24-cp311-cp311-win_amd64.whl", hash = "sha256:538d30cd96ed7d1416d3956f94d54e426a8daf7c14527f6e0d6d425fcb4cca52"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fe4ebef608553aff8deb845c7f4f1d0740ff76fa672c011cc0bacb2a00fbde86"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:74007a5b25b7a678459f06559504f1eec2f0f17bca218c9d56f6a0a12bfffdad"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7df9ea48641da022c2a3c9c641650cd09f0cd15e8908bf931ad538f5ca7919c9"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1141a1dcc32904c47f6846b040275c6e5de0bf73f17d7a409035d55b76f289"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80c811cfcb5c331237d9bad3bea2c391114588cf4131707e84d9493064d267f9"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7214477bf9bd195894cf24005b1e7b496f46833337b5dedb7b2a6e33f66d962c"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d55588cba7553f0b6ec33130bc3e114b355570b45785cebdc9daed8c637dd440"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:558a57cfc32adcf19d3f791f62b5ff564922942e389e3cfdb538a23d65a6b610"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a512eed9dfd4117110b1881ba9a59b31433caed0c4101b361f768e7bcbaf93c5"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:86b17ba823ea76256b1885652e3a141a99a5c4422f4a869189db328321b73799"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5eefee9bfe23f6df09ffb6dfb23809f4d74a78acef004aa904dc7c88b9944b05"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:731fcd76bbdbf225e2eb85b7c38da9633ad3073822f5ab32379381e8c3c12e94"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eaef80eac3b4cfbdd6de53c6e108b4c534c21ae055d1dbea2de6b3b8ff3def38"}, + {file = "regex-2024.7.24-cp312-cp312-win32.whl", hash = "sha256:185e029368d6f89f36e526764cf12bf8d6f0e3a2a7737da625a76f594bdfcbfc"}, + {file = "regex-2024.7.24-cp312-cp312-win_amd64.whl", hash = "sha256:2f1baff13cc2521bea83ab2528e7a80cbe0ebb2c6f0bfad15be7da3aed443908"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:66b4c0731a5c81921e938dcf1a88e978264e26e6ac4ec96a4d21ae0354581ae0"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:88ecc3afd7e776967fa16c80f974cb79399ee8dc6c96423321d6f7d4b881c92b"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:64bd50cf16bcc54b274e20235bf8edbb64184a30e1e53873ff8d444e7ac656b2"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb462f0e346fcf41a901a126b50f8781e9a474d3927930f3490f38a6e73b6950"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a82465ebbc9b1c5c50738536fdfa7cab639a261a99b469c9d4c7dcbb2b3f1e57"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:68a8f8c046c6466ac61a36b65bb2395c74451df2ffb8458492ef49900efed293"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac8e84fff5d27420f3c1e879ce9929108e873667ec87e0c8eeb413a5311adfe"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba2537ef2163db9e6ccdbeb6f6424282ae4dea43177402152c67ef869cf3978b"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:43affe33137fcd679bdae93fb25924979517e011f9dea99163f80b82eadc7e53"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:c9bb87fdf2ab2370f21e4d5636e5317775e5d51ff32ebff2cf389f71b9b13750"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:945352286a541406f99b2655c973852da7911b3f4264e010218bbc1cc73168f2"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:8bc593dcce679206b60a538c302d03c29b18e3d862609317cb560e18b66d10cf"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3f3b6ca8eae6d6c75a6cff525c8530c60e909a71a15e1b731723233331de4169"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c51edc3541e11fbe83f0c4d9412ef6c79f664a3745fab261457e84465ec9d5a8"}, + {file = "regex-2024.7.24-cp38-cp38-win32.whl", hash = "sha256:d0a07763776188b4db4c9c7fb1b8c494049f84659bb387b71c73bbc07f189e96"}, + {file = "regex-2024.7.24-cp38-cp38-win_amd64.whl", hash = "sha256:8fd5afd101dcf86a270d254364e0e8dddedebe6bd1ab9d5f732f274fa00499a5"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0ffe3f9d430cd37d8fa5632ff6fb36d5b24818c5c986893063b4e5bdb84cdf24"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:25419b70ba00a16abc90ee5fce061228206173231f004437730b67ac77323f0d"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:33e2614a7ce627f0cdf2ad104797d1f68342d967de3695678c0cb84f530709f8"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d33a0021893ede5969876052796165bab6006559ab845fd7b515a30abdd990dc"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04ce29e2c5fedf296b1a1b0acc1724ba93a36fb14031f3abfb7abda2806c1535"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b16582783f44fbca6fcf46f61347340c787d7530d88b4d590a397a47583f31dd"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:836d3cc225b3e8a943d0b02633fb2f28a66e281290302a79df0e1eaa984ff7c1"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:438d9f0f4bc64e8dea78274caa5af971ceff0f8771e1a2333620969936ba10be"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:973335b1624859cb0e52f96062a28aa18f3a5fc77a96e4a3d6d76e29811a0e6e"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c5e69fd3eb0b409432b537fe3c6f44ac089c458ab6b78dcec14478422879ec5f"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fbf8c2f00904eaf63ff37718eb13acf8e178cb940520e47b2f05027f5bb34ce3"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2757ace61bc4061b69af19e4689fa4416e1a04840f33b441034202b5cd02d4"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:44fc61b99035fd9b3b9453f1713234e5a7c92a04f3577252b45feefe1b327759"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:84c312cdf839e8b579f504afcd7b65f35d60b6285d892b19adea16355e8343c9"}, + {file = "regex-2024.7.24-cp39-cp39-win32.whl", hash = "sha256:ca5b2028c2f7af4e13fb9fc29b28d0ce767c38c7facdf64f6c2cd040413055f1"}, + {file = "regex-2024.7.24-cp39-cp39-win_amd64.whl", hash = "sha256:7c479f5ae937ec9985ecaf42e2e10631551d909f203e31308c12d703922742f9"}, + {file = "regex-2024.7.24.tar.gz", hash = "sha256:9cfd009eed1a46b27c14039ad5bbc5e71b6367c5b2e6d5f5da0ea91600817506"}, ] [[package]] @@ -3665,114 +3768,114 @@ files = [ [[package]] name = "rpds-py" -version = "0.19.1" +version = "0.20.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" files = [ - {file = "rpds_py-0.19.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:aaf71f95b21f9dc708123335df22e5a2fef6307e3e6f9ed773b2e0938cc4d491"}, - {file = "rpds_py-0.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ca0dda0c5715efe2ab35bb83f813f681ebcd2840d8b1b92bfc6fe3ab382fae4a"}, - {file = "rpds_py-0.19.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81db2e7282cc0487f500d4db203edc57da81acde9e35f061d69ed983228ffe3b"}, - {file = "rpds_py-0.19.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1a8dfa125b60ec00c7c9baef945bb04abf8ac772d8ebefd79dae2a5f316d7850"}, - {file = "rpds_py-0.19.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:271accf41b02687cef26367c775ab220372ee0f4925591c6796e7c148c50cab5"}, - {file = "rpds_py-0.19.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9bc4161bd3b970cd6a6fcda70583ad4afd10f2750609fb1f3ca9505050d4ef3"}, - {file = "rpds_py-0.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0cf2a0dbb5987da4bd92a7ca727eadb225581dd9681365beba9accbe5308f7d"}, - {file = "rpds_py-0.19.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b5e28e56143750808c1c79c70a16519e9bc0a68b623197b96292b21b62d6055c"}, - {file = "rpds_py-0.19.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c7af6f7b80f687b33a4cdb0a785a5d4de1fb027a44c9a049d8eb67d5bfe8a687"}, - {file = "rpds_py-0.19.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e429fc517a1c5e2a70d576077231538a98d59a45dfc552d1ac45a132844e6dfb"}, - {file = "rpds_py-0.19.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d2dbd8f4990d4788cb122f63bf000357533f34860d269c1a8e90ae362090ff3a"}, - {file = "rpds_py-0.19.1-cp310-none-win32.whl", hash = "sha256:e0f9d268b19e8f61bf42a1da48276bcd05f7ab5560311f541d22557f8227b866"}, - {file = "rpds_py-0.19.1-cp310-none-win_amd64.whl", hash = "sha256:df7c841813f6265e636fe548a49664c77af31ddfa0085515326342a751a6ba51"}, - {file = "rpds_py-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:902cf4739458852fe917104365ec0efbea7d29a15e4276c96a8d33e6ed8ec137"}, - {file = "rpds_py-0.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f3d73022990ab0c8b172cce57c69fd9a89c24fd473a5e79cbce92df87e3d9c48"}, - {file = "rpds_py-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3837c63dd6918a24de6c526277910e3766d8c2b1627c500b155f3eecad8fad65"}, - {file = "rpds_py-0.19.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cdb7eb3cf3deb3dd9e7b8749323b5d970052711f9e1e9f36364163627f96da58"}, - {file = "rpds_py-0.19.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26ab43b6d65d25b1a333c8d1b1c2f8399385ff683a35ab5e274ba7b8bb7dc61c"}, - {file = "rpds_py-0.19.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75130df05aae7a7ac171b3b5b24714cffeabd054ad2ebc18870b3aa4526eba23"}, - {file = "rpds_py-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c34f751bf67cab69638564eee34023909380ba3e0d8ee7f6fe473079bf93f09b"}, - {file = "rpds_py-0.19.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f2671cb47e50a97f419a02cd1e0c339b31de017b033186358db92f4d8e2e17d8"}, - {file = "rpds_py-0.19.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3c73254c256081704dba0a333457e2fb815364018788f9b501efe7c5e0ada401"}, - {file = "rpds_py-0.19.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4383beb4a29935b8fa28aca8fa84c956bf545cb0c46307b091b8d312a9150e6a"}, - {file = "rpds_py-0.19.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dbceedcf4a9329cc665452db1aaf0845b85c666e4885b92ee0cddb1dbf7e052a"}, - {file = "rpds_py-0.19.1-cp311-none-win32.whl", hash = "sha256:f0a6d4a93d2a05daec7cb885157c97bbb0be4da739d6f9dfb02e101eb40921cd"}, - {file = "rpds_py-0.19.1-cp311-none-win_amd64.whl", hash = "sha256:c149a652aeac4902ecff2dd93c3b2681c608bd5208c793c4a99404b3e1afc87c"}, - {file = "rpds_py-0.19.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:56313be667a837ff1ea3508cebb1ef6681d418fa2913a0635386cf29cff35165"}, - {file = "rpds_py-0.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d1d7539043b2b31307f2c6c72957a97c839a88b2629a348ebabe5aa8b626d6b"}, - {file = "rpds_py-0.19.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e1dc59a5e7bc7f44bd0c048681f5e05356e479c50be4f2c1a7089103f1621d5"}, - {file = "rpds_py-0.19.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b8f78398e67a7227aefa95f876481485403eb974b29e9dc38b307bb6eb2315ea"}, - {file = "rpds_py-0.19.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ef07a0a1d254eeb16455d839cef6e8c2ed127f47f014bbda64a58b5482b6c836"}, - {file = "rpds_py-0.19.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8124101e92c56827bebef084ff106e8ea11c743256149a95b9fd860d3a4f331f"}, - {file = "rpds_py-0.19.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08ce9c95a0b093b7aec75676b356a27879901488abc27e9d029273d280438505"}, - {file = "rpds_py-0.19.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b02dd77a2de6e49078c8937aadabe933ceac04b41c5dde5eca13a69f3cf144e"}, - {file = "rpds_py-0.19.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4dd02e29c8cbed21a1875330b07246b71121a1c08e29f0ee3db5b4cfe16980c4"}, - {file = "rpds_py-0.19.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9c7042488165f7251dc7894cd533a875d2875af6d3b0e09eda9c4b334627ad1c"}, - {file = "rpds_py-0.19.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f809a17cc78bd331e137caa25262b507225854073fd319e987bd216bed911b7c"}, - {file = "rpds_py-0.19.1-cp312-none-win32.whl", hash = "sha256:3ddab996807c6b4227967fe1587febade4e48ac47bb0e2d3e7858bc621b1cace"}, - {file = "rpds_py-0.19.1-cp312-none-win_amd64.whl", hash = "sha256:32e0db3d6e4f45601b58e4ac75c6f24afbf99818c647cc2066f3e4b192dabb1f"}, - {file = "rpds_py-0.19.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:747251e428406b05fc86fee3904ee19550c4d2d19258cef274e2151f31ae9d38"}, - {file = "rpds_py-0.19.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dc733d35f861f8d78abfaf54035461e10423422999b360966bf1c443cbc42705"}, - {file = "rpds_py-0.19.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbda75f245caecff8faa7e32ee94dfaa8312a3367397975527f29654cd17a6ed"}, - {file = "rpds_py-0.19.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd04d8cab16cab5b0a9ffc7d10f0779cf1120ab16c3925404428f74a0a43205a"}, - {file = "rpds_py-0.19.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2d66eb41ffca6cc3c91d8387509d27ba73ad28371ef90255c50cb51f8953301"}, - {file = "rpds_py-0.19.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fdf4890cda3b59170009d012fca3294c00140e7f2abe1910e6a730809d0f3f9b"}, - {file = "rpds_py-0.19.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1fa67ef839bad3815124f5f57e48cd50ff392f4911a9f3cf449d66fa3df62a5"}, - {file = "rpds_py-0.19.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b82c9514c6d74b89a370c4060bdb80d2299bc6857e462e4a215b4ef7aa7b090e"}, - {file = "rpds_py-0.19.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c7b07959866a6afb019abb9564d8a55046feb7a84506c74a6f197cbcdf8a208e"}, - {file = "rpds_py-0.19.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4f580ae79d0b861dfd912494ab9d477bea535bfb4756a2269130b6607a21802e"}, - {file = "rpds_py-0.19.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c6d20c8896c00775e6f62d8373aba32956aa0b850d02b5ec493f486c88e12859"}, - {file = "rpds_py-0.19.1-cp313-none-win32.whl", hash = "sha256:afedc35fe4b9e30ab240b208bb9dc8938cb4afe9187589e8d8d085e1aacb8309"}, - {file = "rpds_py-0.19.1-cp313-none-win_amd64.whl", hash = "sha256:1d4af2eb520d759f48f1073ad3caef997d1bfd910dc34e41261a595d3f038a94"}, - {file = "rpds_py-0.19.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:34bca66e2e3eabc8a19e9afe0d3e77789733c702c7c43cd008e953d5d1463fde"}, - {file = "rpds_py-0.19.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:24f8ae92c7fae7c28d0fae9b52829235df83f34847aa8160a47eb229d9666c7b"}, - {file = "rpds_py-0.19.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71157f9db7f6bc6599a852852f3389343bea34315b4e6f109e5cbc97c1fb2963"}, - {file = "rpds_py-0.19.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1d494887d40dc4dd0d5a71e9d07324e5c09c4383d93942d391727e7a40ff810b"}, - {file = "rpds_py-0.19.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7b3661e6d4ba63a094138032c1356d557de5b3ea6fd3cca62a195f623e381c76"}, - {file = "rpds_py-0.19.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97fbb77eaeb97591efdc654b8b5f3ccc066406ccfb3175b41382f221ecc216e8"}, - {file = "rpds_py-0.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cc4bc73e53af8e7a42c8fd7923bbe35babacfa7394ae9240b3430b5dcf16b2a"}, - {file = "rpds_py-0.19.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:35af5e4d5448fa179fd7fff0bba0fba51f876cd55212f96c8bbcecc5c684ae5c"}, - {file = "rpds_py-0.19.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3511f6baf8438326e351097cecd137eb45c5f019944fe0fd0ae2fea2fd26be39"}, - {file = "rpds_py-0.19.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:57863d16187995c10fe9cf911b897ed443ac68189179541734502353af33e693"}, - {file = "rpds_py-0.19.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:9e318e6786b1e750a62f90c6f7fa8b542102bdcf97c7c4de2a48b50b61bd36ec"}, - {file = "rpds_py-0.19.1-cp38-none-win32.whl", hash = "sha256:53dbc35808c6faa2ce3e48571f8f74ef70802218554884787b86a30947842a14"}, - {file = "rpds_py-0.19.1-cp38-none-win_amd64.whl", hash = "sha256:8df1c283e57c9cb4d271fdc1875f4a58a143a2d1698eb0d6b7c0d7d5f49c53a1"}, - {file = "rpds_py-0.19.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:e76c902d229a3aa9d5ceb813e1cbcc69bf5bda44c80d574ff1ac1fa3136dea71"}, - {file = "rpds_py-0.19.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:de1f7cd5b6b351e1afd7568bdab94934d656abe273d66cda0ceea43bbc02a0c2"}, - {file = "rpds_py-0.19.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24fc5a84777cb61692d17988989690d6f34f7f95968ac81398d67c0d0994a897"}, - {file = "rpds_py-0.19.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:74129d5ffc4cde992d89d345f7f7d6758320e5d44a369d74d83493429dad2de5"}, - {file = "rpds_py-0.19.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e360188b72f8080fefa3adfdcf3618604cc8173651c9754f189fece068d2a45"}, - {file = "rpds_py-0.19.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13e6d4840897d4e4e6b2aa1443e3a8eca92b0402182aafc5f4ca1f5e24f9270a"}, - {file = "rpds_py-0.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f09529d2332264a902688031a83c19de8fda5eb5881e44233286b9c9ec91856d"}, - {file = "rpds_py-0.19.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0d4b52811dcbc1aba08fd88d475f75b4f6db0984ba12275d9bed1a04b2cae9b5"}, - {file = "rpds_py-0.19.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dd635c2c4043222d80d80ca1ac4530a633102a9f2ad12252183bcf338c1b9474"}, - {file = "rpds_py-0.19.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f35b34a5184d5e0cc360b61664c1c06e866aab077b5a7c538a3e20c8fcdbf90b"}, - {file = "rpds_py-0.19.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d4ec0046facab83012d821b33cead742a35b54575c4edfb7ed7445f63441835f"}, - {file = "rpds_py-0.19.1-cp39-none-win32.whl", hash = "sha256:f5b8353ea1a4d7dfb59a7f45c04df66ecfd363bb5b35f33b11ea579111d4655f"}, - {file = "rpds_py-0.19.1-cp39-none-win_amd64.whl", hash = "sha256:1fb93d3486f793d54a094e2bfd9cd97031f63fcb5bc18faeb3dd4b49a1c06523"}, - {file = "rpds_py-0.19.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7d5c7e32f3ee42f77d8ff1a10384b5cdcc2d37035e2e3320ded909aa192d32c3"}, - {file = "rpds_py-0.19.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:89cc8921a4a5028d6dd388c399fcd2eef232e7040345af3d5b16c04b91cf3c7e"}, - {file = "rpds_py-0.19.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bca34e913d27401bda2a6f390d0614049f5a95b3b11cd8eff80fe4ec340a1208"}, - {file = "rpds_py-0.19.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5953391af1405f968eb5701ebbb577ebc5ced8d0041406f9052638bafe52209d"}, - {file = "rpds_py-0.19.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:840e18c38098221ea6201f091fc5d4de6128961d2930fbbc96806fb43f69aec1"}, - {file = "rpds_py-0.19.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d8b735c4d162dc7d86a9cf3d717f14b6c73637a1f9cd57fe7e61002d9cb1972"}, - {file = "rpds_py-0.19.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce757c7c90d35719b38fa3d4ca55654a76a40716ee299b0865f2de21c146801c"}, - {file = "rpds_py-0.19.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a9421b23c85f361a133aa7c5e8ec757668f70343f4ed8fdb5a4a14abd5437244"}, - {file = "rpds_py-0.19.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:3b823be829407393d84ee56dc849dbe3b31b6a326f388e171555b262e8456cc1"}, - {file = "rpds_py-0.19.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:5e58b61dcbb483a442c6239c3836696b79f2cd8e7eec11e12155d3f6f2d886d1"}, - {file = "rpds_py-0.19.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:39d67896f7235b2c886fb1ee77b1491b77049dcef6fbf0f401e7b4cbed86bbd4"}, - {file = "rpds_py-0.19.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:8b32cd4ab6db50c875001ba4f5a6b30c0f42151aa1fbf9c2e7e3674893fb1dc4"}, - {file = "rpds_py-0.19.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:1c32e41de995f39b6b315d66c27dea3ef7f7c937c06caab4c6a79a5e09e2c415"}, - {file = "rpds_py-0.19.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1a129c02b42d46758c87faeea21a9f574e1c858b9f358b6dd0bbd71d17713175"}, - {file = "rpds_py-0.19.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:346557f5b1d8fd9966059b7a748fd79ac59f5752cd0e9498d6a40e3ac1c1875f"}, - {file = "rpds_py-0.19.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:31e450840f2f27699d014cfc8865cc747184286b26d945bcea6042bb6aa4d26e"}, - {file = "rpds_py-0.19.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01227f8b3e6c8961490d869aa65c99653df80d2f0a7fde8c64ebddab2b9b02fd"}, - {file = "rpds_py-0.19.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69084fd29bfeff14816666c93a466e85414fe6b7d236cfc108a9c11afa6f7301"}, - {file = "rpds_py-0.19.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d2b88efe65544a7d5121b0c3b003ebba92bfede2ea3577ce548b69c5235185"}, - {file = "rpds_py-0.19.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ea961a674172ed2235d990d7edf85d15d8dfa23ab8575e48306371c070cda67"}, - {file = "rpds_py-0.19.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:5beffdbe766cfe4fb04f30644d822a1080b5359df7db3a63d30fa928375b2720"}, - {file = "rpds_py-0.19.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:720f3108fb1bfa32e51db58b832898372eb5891e8472a8093008010911e324c5"}, - {file = "rpds_py-0.19.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:c2087dbb76a87ec2c619253e021e4fb20d1a72580feeaa6892b0b3d955175a71"}, - {file = "rpds_py-0.19.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ddd50f18ebc05ec29a0d9271e9dbe93997536da3546677f8ca00b76d477680c"}, - {file = "rpds_py-0.19.1.tar.gz", hash = "sha256:31dd5794837f00b46f4096aa8ccaa5972f73a938982e32ed817bb520c465e520"}, + {file = "rpds_py-0.20.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3ad0fda1635f8439cde85c700f964b23ed5fc2d28016b32b9ee5fe30da5c84e2"}, + {file = "rpds_py-0.20.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9bb4a0d90fdb03437c109a17eade42dfbf6190408f29b2744114d11586611d6f"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6377e647bbfd0a0b159fe557f2c6c602c159fc752fa316572f012fc0bf67150"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb851b7df9dda52dc1415ebee12362047ce771fc36914586b2e9fcbd7d293b3e"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e0f80b739e5a8f54837be5d5c924483996b603d5502bfff79bf33da06164ee2"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a8c94dad2e45324fc74dce25e1645d4d14df9a4e54a30fa0ae8bad9a63928e3"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e604fe73ba048c06085beaf51147eaec7df856824bfe7b98657cf436623daf"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:df3de6b7726b52966edf29663e57306b23ef775faf0ac01a3e9f4012a24a4140"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf258ede5bc22a45c8e726b29835b9303c285ab46fc7c3a4cc770736b5304c9f"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:55fea87029cded5df854ca7e192ec7bdb7ecd1d9a3f63d5c4eb09148acf4a7ce"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ae94bd0b2f02c28e199e9bc51485d0c5601f58780636185660f86bf80c89af94"}, + {file = "rpds_py-0.20.0-cp310-none-win32.whl", hash = "sha256:28527c685f237c05445efec62426d285e47a58fb05ba0090a4340b73ecda6dee"}, + {file = "rpds_py-0.20.0-cp310-none-win_amd64.whl", hash = "sha256:238a2d5b1cad28cdc6ed15faf93a998336eb041c4e440dd7f902528b8891b399"}, + {file = "rpds_py-0.20.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac2f4f7a98934c2ed6505aead07b979e6f999389f16b714448fb39bbaa86a489"}, + {file = "rpds_py-0.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:220002c1b846db9afd83371d08d239fdc865e8f8c5795bbaec20916a76db3318"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d7919548df3f25374a1f5d01fbcd38dacab338ef5f33e044744b5c36729c8db"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:758406267907b3781beee0f0edfe4a179fbd97c0be2e9b1154d7f0a1279cf8e5"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d61339e9f84a3f0767b1995adfb171a0d00a1185192718a17af6e124728e0f5"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1259c7b3705ac0a0bd38197565a5d603218591d3f6cee6e614e380b6ba61c6f6"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c1dc0f53856b9cc9a0ccca0a7cc61d3d20a7088201c0937f3f4048c1718a209"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7e60cb630f674a31f0368ed32b2a6b4331b8350d67de53c0359992444b116dd3"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dbe982f38565bb50cb7fb061ebf762c2f254ca3d8c20d4006878766e84266272"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:514b3293b64187172bc77c8fb0cdae26981618021053b30d8371c3a902d4d5ad"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d0a26ffe9d4dd35e4dfdd1e71f46401cff0181c75ac174711ccff0459135fa58"}, + {file = "rpds_py-0.20.0-cp311-none-win32.whl", hash = "sha256:89c19a494bf3ad08c1da49445cc5d13d8fefc265f48ee7e7556839acdacf69d0"}, + {file = "rpds_py-0.20.0-cp311-none-win_amd64.whl", hash = "sha256:c638144ce971df84650d3ed0096e2ae7af8e62ecbbb7b201c8935c370df00a2c"}, + {file = "rpds_py-0.20.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a84ab91cbe7aab97f7446652d0ed37d35b68a465aeef8fc41932a9d7eee2c1a6"}, + {file = "rpds_py-0.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:56e27147a5a4c2c21633ff8475d185734c0e4befd1c989b5b95a5d0db699b21b"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2580b0c34583b85efec8c5c5ec9edf2dfe817330cc882ee972ae650e7b5ef739"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b80d4a7900cf6b66bb9cee5c352b2d708e29e5a37fe9bf784fa97fc11504bf6c"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50eccbf054e62a7b2209b28dc7a22d6254860209d6753e6b78cfaeb0075d7bee"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:49a8063ea4296b3a7e81a5dfb8f7b2d73f0b1c20c2af401fb0cdf22e14711a96"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea438162a9fcbee3ecf36c23e6c68237479f89f962f82dae83dc15feeceb37e4"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:18d7585c463087bddcfa74c2ba267339f14f2515158ac4db30b1f9cbdb62c8ef"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d4c7d1a051eeb39f5c9547e82ea27cbcc28338482242e3e0b7768033cb083821"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4df1e3b3bec320790f699890d41c59d250f6beda159ea3c44c3f5bac1976940"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2cf126d33a91ee6eedc7f3197b53e87a2acdac63602c0f03a02dd69e4b138174"}, + {file = "rpds_py-0.20.0-cp312-none-win32.whl", hash = "sha256:8bc7690f7caee50b04a79bf017a8d020c1f48c2a1077ffe172abec59870f1139"}, + {file = "rpds_py-0.20.0-cp312-none-win_amd64.whl", hash = "sha256:0e13e6952ef264c40587d510ad676a988df19adea20444c2b295e536457bc585"}, + {file = "rpds_py-0.20.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:aa9a0521aeca7d4941499a73ad7d4f8ffa3d1affc50b9ea11d992cd7eff18a29"}, + {file = "rpds_py-0.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1f1d51eccb7e6c32ae89243cb352389228ea62f89cd80823ea7dd1b98e0b91"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a86a9b96070674fc88b6f9f71a97d2c1d3e5165574615d1f9168ecba4cecb24"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6c8ef2ebf76df43f5750b46851ed1cdf8f109d7787ca40035fe19fbdc1acc5a7"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b25f024b421d5859d156750ea9a65651793d51b76a2e9238c05c9d5f203a9"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57eb94a8c16ab08fef6404301c38318e2c5a32216bf5de453e2714c964c125c8"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1940dae14e715e2e02dfd5b0f64a52e8374a517a1e531ad9412319dc3ac7879"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d20277fd62e1b992a50c43f13fbe13277a31f8c9f70d59759c88f644d66c619f"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:06db23d43f26478303e954c34c75182356ca9aa7797d22c5345b16871ab9c45c"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b2a5db5397d82fa847e4c624b0c98fe59d2d9b7cf0ce6de09e4d2e80f8f5b3f2"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a35df9f5548fd79cb2f52d27182108c3e6641a4feb0f39067911bf2adaa3e57"}, + {file = "rpds_py-0.20.0-cp313-none-win32.whl", hash = "sha256:fd2d84f40633bc475ef2d5490b9c19543fbf18596dcb1b291e3a12ea5d722f7a"}, + {file = "rpds_py-0.20.0-cp313-none-win_amd64.whl", hash = "sha256:9bc2d153989e3216b0559251b0c260cfd168ec78b1fac33dd485750a228db5a2"}, + {file = "rpds_py-0.20.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:f2fbf7db2012d4876fb0d66b5b9ba6591197b0f165db8d99371d976546472a24"}, + {file = "rpds_py-0.20.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1e5f3cd7397c8f86c8cc72d5a791071431c108edd79872cdd96e00abd8497d29"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce9845054c13696f7af7f2b353e6b4f676dab1b4b215d7fe5e05c6f8bb06f965"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c3e130fd0ec56cb76eb49ef52faead8ff09d13f4527e9b0c400307ff72b408e1"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b16aa0107ecb512b568244ef461f27697164d9a68d8b35090e9b0c1c8b27752"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa7f429242aae2947246587d2964fad750b79e8c233a2367f71b554e9447949c"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af0fc424a5842a11e28956e69395fbbeab2c97c42253169d87e90aac2886d751"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b8c00a3b1e70c1d3891f0db1b05292747f0dbcfb49c43f9244d04c70fbc40eb8"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:40ce74fc86ee4645d0a225498d091d8bc61f39b709ebef8204cb8b5a464d3c0e"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4fe84294c7019456e56d93e8ababdad5a329cd25975be749c3f5f558abb48253"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:338ca4539aad4ce70a656e5187a3a31c5204f261aef9f6ab50e50bcdffaf050a"}, + {file = "rpds_py-0.20.0-cp38-none-win32.whl", hash = "sha256:54b43a2b07db18314669092bb2de584524d1ef414588780261e31e85846c26a5"}, + {file = "rpds_py-0.20.0-cp38-none-win_amd64.whl", hash = "sha256:a1862d2d7ce1674cffa6d186d53ca95c6e17ed2b06b3f4c476173565c862d232"}, + {file = "rpds_py-0.20.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3fde368e9140312b6e8b6c09fb9f8c8c2f00999d1823403ae90cc00480221b22"}, + {file = "rpds_py-0.20.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9824fb430c9cf9af743cf7aaf6707bf14323fb51ee74425c380f4c846ea70789"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11ef6ce74616342888b69878d45e9f779b95d4bd48b382a229fe624a409b72c5"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c52d3f2f82b763a24ef52f5d24358553e8403ce05f893b5347098014f2d9eff2"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d35cef91e59ebbeaa45214861874bc6f19eb35de96db73e467a8358d701a96c"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d72278a30111e5b5525c1dd96120d9e958464316f55adb030433ea905866f4de"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c29cbbba378759ac5786730d1c3cb4ec6f8ababf5c42a9ce303dc4b3d08cda"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6632f2d04f15d1bd6fe0eedd3b86d9061b836ddca4c03d5cf5c7e9e6b7c14580"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d0b67d87bb45ed1cd020e8fbf2307d449b68abc45402fe1a4ac9e46c3c8b192b"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ec31a99ca63bf3cd7f1a5ac9fe95c5e2d060d3c768a09bc1d16e235840861420"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22e6c9976e38f4d8c4a63bd8a8edac5307dffd3ee7e6026d97f3cc3a2dc02a0b"}, + {file = "rpds_py-0.20.0-cp39-none-win32.whl", hash = "sha256:569b3ea770c2717b730b61998b6c54996adee3cef69fc28d444f3e7920313cf7"}, + {file = "rpds_py-0.20.0-cp39-none-win_amd64.whl", hash = "sha256:e6900ecdd50ce0facf703f7a00df12374b74bbc8ad9fe0f6559947fb20f82364"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:617c7357272c67696fd052811e352ac54ed1d9b49ab370261a80d3b6ce385045"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9426133526f69fcaba6e42146b4e12d6bc6c839b8b555097020e2b78ce908dcc"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:deb62214c42a261cb3eb04d474f7155279c1a8a8c30ac89b7dcb1721d92c3c02"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fcaeb7b57f1a1e071ebd748984359fef83ecb026325b9d4ca847c95bc7311c92"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d454b8749b4bd70dd0a79f428731ee263fa6995f83ccb8bada706e8d1d3ff89d"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d807dc2051abe041b6649681dce568f8e10668e3c1c6543ebae58f2d7e617855"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3c20f0ddeb6e29126d45f89206b8291352b8c5b44384e78a6499d68b52ae511"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b7f19250ceef892adf27f0399b9e5afad019288e9be756d6919cb58892129f51"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4f1ed4749a08379555cebf4650453f14452eaa9c43d0a95c49db50c18b7da075"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:dcedf0b42bcb4cfff4101d7771a10532415a6106062f005ab97d1d0ab5681c60"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:39ed0d010457a78f54090fafb5d108501b5aa5604cc22408fc1c0c77eac14344"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:bb273176be34a746bdac0b0d7e4e2c467323d13640b736c4c477881a3220a989"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f918a1a130a6dfe1d7fe0f105064141342e7dd1611f2e6a21cd2f5c8cb1cfb3e"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f60012a73aa396be721558caa3a6fd49b3dd0033d1675c6d59c4502e870fcf0c"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d2b1ad682a3dfda2a4e8ad8572f3100f95fad98cb99faf37ff0ddfe9cbf9d03"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:614fdafe9f5f19c63ea02817fa4861c606a59a604a77c8cdef5aa01d28b97921"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa518bcd7600c584bf42e6617ee8132869e877db2f76bcdc281ec6a4113a53ab"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0475242f447cc6cb8a9dd486d68b2ef7fbee84427124c232bff5f63b1fe11e5"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f90a4cd061914a60bd51c68bcb4357086991bd0bb93d8aa66a6da7701370708f"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:def7400461c3a3f26e49078302e1c1b38f6752342c77e3cf72ce91ca69fb1bc1"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:65794e4048ee837494aea3c21a28ad5fc080994dfba5b036cf84de37f7ad5074"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:faefcc78f53a88f3076b7f8be0a8f8d35133a3ecf7f3770895c25f8813460f08"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:5b4f105deeffa28bbcdff6c49b34e74903139afa690e35d2d9e3c2c2fba18cec"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fdfc3a892927458d98f3d55428ae46b921d1f7543b89382fdb483f5640daaec8"}, + {file = "rpds_py-0.20.0.tar.gz", hash = "sha256:d72a210824facfdaf8768cf2d7ca25a042c30320b3020de2fa04640920d4e121"}, ] [[package]] @@ -3793,13 +3896,13 @@ win32 = ["pywin32"] [[package]] name = "setuptools" -version = "71.1.0" +version = "72.1.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-71.1.0-py3-none-any.whl", hash = "sha256:33874fdc59b3188304b2e7c80d9029097ea31627180896fb549c578ceb8a0855"}, - {file = "setuptools-71.1.0.tar.gz", hash = "sha256:032d42ee9fb536e33087fb66cac5f840eb9391ed05637b3f2a76a7c8fb477936"}, + {file = "setuptools-72.1.0-py3-none-any.whl", hash = "sha256:5a03e1860cf56bb6ef48ce186b0e557fdba433237481a9a625176c2831be15d1"}, + {file = "setuptools-72.1.0.tar.gz", hash = "sha256:8d243eff56d095e5817f796ede6ae32941278f542e0f941867cc05ae52b162ec"}, ] [package.extras] @@ -4280,13 +4383,13 @@ test = ["websockets"] [[package]] name = "wheel" -version = "0.43.0" +version = "0.44.0" description = "A built-package format for Python" optional = false python-versions = ">=3.8" files = [ - {file = "wheel-0.43.0-py3-none-any.whl", hash = "sha256:55c570405f142630c6b9f72fe09d9b67cf1477fcf543ae5b8dcb1f5b7377da81"}, - {file = "wheel-0.43.0.tar.gz", hash = "sha256:465ef92c69fa5c5da2d1cf8ac40559a8c940886afcef87dcf14b9470862f1d85"}, + {file = "wheel-0.44.0-py3-none-any.whl", hash = "sha256:2376a90c98cc337d18623527a97c31797bd02bad0033d41547043a1cbfbe448f"}, + {file = "wheel-0.44.0.tar.gz", hash = "sha256:a29c3f2817e95ab89aa4660681ad547c0e9547f20e75b0562fe7723c9a2a9d49"}, ] [package.extras] @@ -4325,4 +4428,4 @@ geopandas = ["geopandas", "pandas", "shapely"] [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "59b9ebeeb5bbc4968ffb79ddf4c74696ff74d6c4495b379ba5c76e20f3ad5641" +content-hash = "a721445ec3b6d7d23790dc6045b11a0fab2fd900c75981c57295505f5b02159c" diff --git a/pyproject.toml b/pyproject.toml index 07dd2dc0..6bacb412 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,19 +32,21 @@ classifiers = [ [tool.poetry.dependencies] python = "^3.8" anywidget = "^0.9.0" -pyarrow = ">=14.0.1" palettable = "^3.3.3" # We use the colormap module from matplotlib. This module may be vendored in the # future to remove the matplotlib dependency. matplotlib = "^3.7" click = { version = "^8.1.7", optional = true } -pyogrio = { version = "^0.7.2", optional = true } +pyogrio = { version = ">=0.8", optional = true } typing-extensions = { version = "^4.6.0", python = "<3.12" } geopandas = { version = ">=0.13", optional = true } pandas = { version = "^2", optional = true } shapely = { version = "^2", optional = true } # The same version pin as geopandas pyproj = ">=3.3" +arro3-core = "^0.2.0b3" +arro3-io = "^0.2.0b3" +arro3-compute = "^0.2.0b3" [tool.poetry.extras] @@ -58,9 +60,10 @@ pre-commit = "^3.4.0" pytest = "^7.4.2" geoarrow-rust-core = "^0.2.0" geodatasets = "^2023.12.0" -pyogrio = "^0.7.2" +pyogrio = "^0.8" geoarrow-pyarrow = "^0.1.1" duckdb = "^0.10.2" +pyarrow = ">=14.0.1" [tool.poetry.group.docs.dependencies] # We use ruff format ourselves, but mkdocstrings requires black to be installed diff --git a/tests/test_geoarrow.py b/tests/test_geoarrow.py index 37bb9127..eb0bcc2f 100644 --- a/tests/test_geoarrow.py +++ b/tests/test_geoarrow.py @@ -2,8 +2,10 @@ from tempfile import NamedTemporaryFile import geodatasets +import pyarrow import pyarrow.parquet as pq import pytest +from arro3.core import Table from pyproj import CRS from lonboard import SolidPolygonLayer @@ -66,7 +68,7 @@ def test_reproject_sliced_array(): gdf = gpd.read_file(geodatasets.get_path("nybb")) table = geopandas_to_geoarrow(gdf) - sliced_table = table.slice(2) + sliced_table = Table.from_arrow(pyarrow.table(table).slice(2)) # This should work even with a sliced array. _reprojected = reproject_table(sliced_table, to_crs=OGC_84) diff --git a/tests/test_traits.py b/tests/test_traits.py index 47ea05fc..7f0a5304 100644 --- a/tests/test_traits.py +++ b/tests/test_traits.py @@ -1,8 +1,10 @@ +import geoarrow.pyarrow as gap import ipywidgets import numpy as np import pyarrow as pa import pytest import traitlets +from arro3.core import Table from traitlets import TraitError from lonboard._base import BaseExtension @@ -179,7 +181,8 @@ class FilterValueAccessorWidget(BaseArrowLayer): def __init__(self, *args, **kwargs): # Any tests that are intended to pass validation checks must also have 3 rows, # since there's another length check in the serialization code. - table = pa.table({"data": [1, 2, 3]}) + geometry = gap.as_geoarrow(["POINT (0 1)", "POINT (0 1)", "POINT (0 1)"]) + table = Table.from_arrow(pa.table({"data": [1, 2, 3], "geometry": geometry})) super().__init__(*args, table=table, _rows_per_chunk=3, **kwargs) @@ -201,31 +204,49 @@ def test_filter_value_validation_filter_size_1(): FilterValueAccessorWidget(extensions=extensions, get_filter_value=[1, 2]) with pytest.raises(TraitError): FilterValueAccessorWidget(extensions=extensions, get_filter_value=(1, 2)) - FilterValueAccessorWidget(extensions=extensions, get_filter_value=[1]) - FilterValueAccessorWidget(extensions=extensions, get_filter_value=(1,)) + FilterValueAccessorWidget( + extensions=extensions, get_filter_value=[1], filter_range=(0, 1) + ) + FilterValueAccessorWidget( + extensions=extensions, get_filter_value=(1,), filter_range=(0, 1) + ) # Allow floats and ints - FilterValueAccessorWidget(extensions=extensions, get_filter_value=2) - FilterValueAccessorWidget(extensions=extensions, get_filter_value=2.0) + FilterValueAccessorWidget( + extensions=extensions, get_filter_value=2, filter_range=(0, 1) + ) + FilterValueAccessorWidget( + extensions=extensions, get_filter_value=2.0, filter_range=(0, 1) + ) # Numpy arrays FilterValueAccessorWidget( - extensions=extensions, get_filter_value=np.array([2, 3, 4]) + extensions=extensions, get_filter_value=np.array([2, 3, 4]), filter_range=(0, 1) ) FilterValueAccessorWidget( - extensions=extensions, get_filter_value=np.array([2, 3, 4], dtype=np.float32) + extensions=extensions, + get_filter_value=np.array([2, 3, 4], dtype=np.float32), + filter_range=(0, 1), ) FilterValueAccessorWidget( - extensions=extensions, get_filter_value=np.array([2, 3, 4], dtype=np.float64) + extensions=extensions, + get_filter_value=np.array([2, 3, 4], dtype=np.float64), + filter_range=(0, 1), ) FilterValueAccessorWidget( - extensions=extensions, get_filter_value=pd.Series([2, 3, 4]) + extensions=extensions, + get_filter_value=pd.Series([2, 3, 4]), + filter_range=(0, 1), ) FilterValueAccessorWidget( - extensions=extensions, get_filter_value=pd.Series([2, 3, 4], dtype=np.float32) + extensions=extensions, + get_filter_value=pd.Series([2, 3, 4], dtype=np.float32), + filter_range=(0, 1), ) FilterValueAccessorWidget( - extensions=extensions, get_filter_value=pd.Series([2, 3, 4], dtype=np.float64) + extensions=extensions, + get_filter_value=pd.Series([2, 3, 4], dtype=np.float64), + filter_range=(0, 1), ) # Raises for non-numeric numpy array @@ -238,6 +259,7 @@ def test_filter_value_validation_filter_size_1(): FilterValueAccessorWidget( extensions=extensions, get_filter_value=np.array([2, 3, 4], dtype=np.float32).reshape(-1, 1), + filter_range=(0, 1), ) # Raises for 2D numpy array with second dim >1 @@ -260,10 +282,12 @@ def test_filter_value_validation_filter_size_1(): FilterValueAccessorWidget( extensions=extensions, get_filter_value=pa.array(np.array([2, 3, 4], dtype=np.float32)), + filter_range=(0, 1), ) FilterValueAccessorWidget( extensions=extensions, get_filter_value=pa.array(np.array([2, 3, 4], dtype=np.float64)), + filter_range=(0, 1), ) @@ -285,8 +309,12 @@ def test_filter_value_validation_filter_size_3(): FilterValueAccessorWidget(extensions=extensions, get_filter_value=[1, 2]) with pytest.raises(TraitError): FilterValueAccessorWidget(extensions=extensions, get_filter_value=(1, 2)) - FilterValueAccessorWidget(extensions=extensions, get_filter_value=[1, 2, 3]) - FilterValueAccessorWidget(extensions=extensions, get_filter_value=(1, 2, 3)) + FilterValueAccessorWidget( + extensions=extensions, get_filter_value=[1, 2, 3], filter_range=(0, 1) + ) + FilterValueAccessorWidget( + extensions=extensions, get_filter_value=(1, 2, 3), filter_range=(0, 1) + ) # Disallow floats and ints with pytest.raises(TraitError): @@ -304,12 +332,14 @@ def test_filter_value_validation_filter_size_3(): get_filter_value=np.array( [1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=np.float32 ).reshape(-1, 3), + filter_range=(0, 1), ) FilterValueAccessorWidget( extensions=extensions, get_filter_value=np.array( [1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=np.float64 ).reshape(-1, 3), + filter_range=(0, 1), ) # Disallow pandas series @@ -346,12 +376,14 @@ def test_filter_value_validation_filter_size_3(): get_filter_value=pa.FixedSizeListArray.from_arrays( np.array([1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=np.float32), 3 ), + filter_range=(0, 1), ) FilterValueAccessorWidget( extensions=extensions, get_filter_value=pa.FixedSizeListArray.from_arrays( np.array([1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=np.float64), 3 ), + filter_range=(0, 1), ) diff --git a/tests/test_viz.py b/tests/test_viz.py index 8fae53cd..384ff95d 100644 --- a/tests/test_viz.py +++ b/tests/test_viz.py @@ -87,10 +87,11 @@ def test_viz_reproject(): map_ = viz(gdf) # Assert table was reprojected - first_coord = map_.layers[0].table["geometry"][0][0][0][0] + scalar = pa.chunked_array(map_.layers[0].table["geometry"])[0] + first_coord = scalar.as_py()[0][0][0] expected_coord = -74.05050951794041, 40.56643026026788 - assert (first_coord[0].as_py() - expected_coord[0]) < 0.0001 - assert (first_coord[1].as_py() - expected_coord[1]) < 0.0001 + assert (first_coord[0] - expected_coord[0]) < 0.0001 + assert (first_coord[1] - expected_coord[1]) < 0.0001 def test_viz_geo_interface_geometry():