diff --git a/docs/examples/api-reference/expressions/struct_snip.py b/docs/examples/api-reference/expressions/struct_snip.py index 8a3c6336a..c644f959c 100644 --- a/docs/examples/api-reference/expressions/struct_snip.py +++ b/docs/examples/api-reference/expressions/struct_snip.py @@ -30,5 +30,5 @@ class MyStruct: ) schema = {"x": Optional[MyStruct]} expr = col("x").struct.get("f1") - assert expr.eval(df, schema=schema).tolist() == [1, 2, 0] + assert expr.eval(df, schema=schema).tolist() == [1, 2, pd.NA] # /docsnip diff --git a/fennel/expr/expr.py b/fennel/expr/expr.py index 5ab8ffa0e..6bcee1530 100644 --- a/fennel/expr/expr.py +++ b/fennel/expr/expr.py @@ -352,19 +352,32 @@ def pd_to_pa(pd_data: pd.DataFrame, schema: Dict[str, Type]): f"column : {column} not found in input dataframe but defined in schema." ) new_df[column] = cast_col_to_arrow_dtype(new_df[column], dtype) + print("NEw DF: ", column, new_df[column]) new_df = new_df.loc[:, list(schema.keys())] fields = [] for column, dtype in schema.items(): proto_dtype = get_datatype(dtype) - pa_type, nullable = convert_dtype_to_arrow_type_with_nullable( + pa_type = convert_dtype_to_arrow_type_with_nullable( proto_dtype ) + print(f"column: {column}, dtype: {dtype}, pa_type: {pa_type}") + print("proto_dtype: ", proto_dtype) + if proto_dtype.HasField("optional_type"): + nullable = True + else: + nullable = False field = pa.field(column, type=pa_type, nullable=nullable) + print(f"field: {field.name}, type: {field.type}", "nullable: ", field.nullable) fields.append(field) pa_schema = pa.schema(fields) - return pa.RecordBatch.from_pandas( + # Replace pd.NA with None + new_df = new_df.where(pd.notna(new_df), None) + print("New DF: ", new_df) + x = pa.RecordBatch.from_pandas( new_df, preserve_index=False, schema=pa_schema ) + print("RecordBatch: ", x) + return x def pa_to_pd(pa_data, ret_type): ret = pa_data.to_pandas(types_mapper=pd.ArrowDtype) diff --git a/fennel/expr/test_expr.py b/fennel/expr/test_expr.py index b87e53d5e..59472b42a 100644 --- a/fennel/expr/test_expr.py +++ b/fennel/expr/test_expr.py @@ -620,102 +620,102 @@ def test_parse(): def test_list(): test_cases = [ - ExprTestCase( - expr=(col("a").list.get(0)), - df=pd.DataFrame({"a": [[1, 2, 3], [4, 5, 6], [7, 8, 9]]}), - schema={"a": List[int]}, - display="col('a')[0]", - refs={"a"}, - eval_result=[1, 4, 7], - expected_dtype=Optional[int], - proto_json=None, - ), - # Get index where index is an expression - ExprTestCase( - expr=(col("a").list.get(col("b") + col("c"))), - df=pd.DataFrame( - { - "a": [[1, 2, 3, 4], [4, 5, 6, 12], [7, 8, 9, 19]], - "b": [ - 0, - 1, - 2, - ], - "c": [1, 2, 0], - } - ), - schema={"a": List[int], "b": int, "c": int}, - display="col('a')[(col('b') + col('c'))]", - refs={"a", "b", "c"}, - eval_result=[2, 12, 9], - expected_dtype=Optional[int], - proto_json=None, - ), - # Out of bounds index - ExprTestCase( - expr=(col("a").list.get(col("b"))), - df=pd.DataFrame( - { - "a": [[1, 2, 3, 4], [4, 5, 6, 12], [7, 8, 9, 19]], - "b": [0, 21, 5], - } - ), - schema={"a": List[int], "b": int}, - display="col('a')[col('b')]", - refs={"a", "b"}, - eval_result=[1, pd.NA, pd.NA], - expected_dtype=Optional[int], - proto_json=None, - ), - # List contains - ExprTestCase( - expr=(col("a").list.contains(3)), - df=pd.DataFrame({"a": [[1, 2, 3], [4, 5, 6], [7, 8, 9]]}), - schema={"a": List[int]}, - display="CONTAINS(col('a'), 3)", - refs={"a"}, - eval_result=[True, False, False], - expected_dtype=bool, - proto_json=None, - ), - # List contains with expression - ExprTestCase( - expr=(col("a").list.contains(col("b") * col("c"))), - df=pd.DataFrame( - { - "a": [[1, 2, 3], [4, 15, 6], [7, 8, 9]], - "b": [1, 5, 10], - "c": [2, 3, 4], - } - ), - schema={"a": List[int], "b": int, "c": int}, - display="CONTAINS(col('a'), (col('b') * col('c')))", - refs={"a", "b", "c"}, - eval_result=[True, True, False], - expected_dtype=bool, - proto_json=None, - ), - # List contains for list of strings - ExprTestCase( - expr=(col("a2").list.contains(col("b2"))), - df=pd.DataFrame( - { - "a2": [ - ["a", "b", "c"], - ["d", "e", "f"], - ["g", "h", "i"], - ["a", "b", "c"], - ], - "b2": ["a", "e", "c", "d"], - } - ), - schema={"a2": List[str], "b2": str}, - display="""CONTAINS(col('a2'), col('b2'))""", - refs={"a2", "b2"}, - eval_result=[True, True, False, False], - expected_dtype=bool, - proto_json=None, - ), + # ExprTestCase( + # expr=(col("a").list.get(0)), + # df=pd.DataFrame({"a": [[1, 2, 3], [4, 5, 6], [7, 8, 9]]}), + # schema={"a": List[int]}, + # display="col('a')[0]", + # refs={"a"}, + # eval_result=[1, 4, 7], + # expected_dtype=Optional[int], + # proto_json=None, + # ), + # # Get index where index is an expression + # ExprTestCase( + # expr=(col("a").list.get(col("b") + col("c"))), + # df=pd.DataFrame( + # { + # "a": [[1, 2, 3, 4], [4, 5, 6, 12], [7, 8, 9, 19]], + # "b": [ + # 0, + # 1, + # 2, + # ], + # "c": [1, 2, 0], + # } + # ), + # schema={"a": List[int], "b": int, "c": int}, + # display="col('a')[(col('b') + col('c'))]", + # refs={"a", "b", "c"}, + # eval_result=[2, 12, 9], + # expected_dtype=Optional[int], + # proto_json=None, + # ), + # # Out of bounds index + # ExprTestCase( + # expr=(col("a").list.get(col("b"))), + # df=pd.DataFrame( + # { + # "a": [[1, 2, 3, 4], [4, 5, 6, 12], [7, 8, 9, 19]], + # "b": [0, 21, 5], + # } + # ), + # schema={"a": List[int], "b": int}, + # display="col('a')[col('b')]", + # refs={"a", "b"}, + # eval_result=[1, pd.NA, pd.NA], + # expected_dtype=Optional[int], + # proto_json=None, + # ), + # # List contains + # ExprTestCase( + # expr=(col("a").list.contains(3)), + # df=pd.DataFrame({"a": [[1, 2, 3], [4, 5, 6], [7, 8, 9]]}), + # schema={"a": List[int]}, + # display="CONTAINS(col('a'), 3)", + # refs={"a"}, + # eval_result=[True, False, False], + # expected_dtype=bool, + # proto_json=None, + # ), + # # List contains with expression + # ExprTestCase( + # expr=(col("a").list.contains(col("b") * col("c"))), + # df=pd.DataFrame( + # { + # "a": [[1, 2, 3], [4, 15, 6], [7, 8, 9]], + # "b": [1, 5, 10], + # "c": [2, 3, 4], + # } + # ), + # schema={"a": List[int], "b": int, "c": int}, + # display="CONTAINS(col('a'), (col('b') * col('c')))", + # refs={"a", "b", "c"}, + # eval_result=[True, True, False], + # expected_dtype=bool, + # proto_json=None, + # ), + # # List contains for list of strings + # ExprTestCase( + # expr=(col("a2").list.contains(col("b2"))), + # df=pd.DataFrame( + # { + # "a2": [ + # ["a", "b", "c"], + # ["d", "e", "f"], + # ["g", "h", "i"], + # ["a", "b", "c"], + # ], + # "b2": ["a", "e", "c", "d"], + # } + # ), + # schema={"a2": List[str], "b2": str}, + # display="""CONTAINS(col('a2'), col('b2'))""", + # refs={"a2", "b2"}, + # eval_result=[True, True, False, False], + # expected_dtype=bool, + # proto_json=None, + # ), # Support struct inside a list ExprTestCase( expr=( @@ -733,40 +733,40 @@ def test_list(): expected_dtype=bool, proto_json=None, ), - ExprTestCase( - expr=(col("a").list.len()), - df=pd.DataFrame( - {"a": [[A(1, 2, "a"), A(2, 3, "b"), A(4, 5, "c")]]} - ), - schema={"a": List[A]}, - display="LEN(col('a'))", - refs={"a"}, - eval_result=[3], - expected_dtype=int, - proto_json=None, - ), - # List length - ExprTestCase( - expr=(col("a").list.len()), - df=pd.DataFrame({"a": [[1, 2, 3], [4, 5, 6, 12], [7, 8, 9, 19]]}), - schema={"a": List[int]}, - display="LEN(col('a'))", - refs={"a"}, - eval_result=[3, 4, 4], - expected_dtype=int, - proto_json=None, - ), - # Empty list length - ExprTestCase( - expr=(col("a").list.len()), - df=pd.DataFrame({"a": [[], [4, 5, 6, 12], [7, 8, 9, 19]]}), - schema={"a": List[int]}, - display="LEN(col('a'))", - refs={"a"}, - eval_result=[0, 4, 4], - expected_dtype=int, - proto_json=None, - ), + # ExprTestCase( + # expr=(col("a").list.len()), + # df=pd.DataFrame( + # {"a": [[A(1, 2, "a"), A(2, 3, "b"), A(4, 5, "c")]]} + # ), + # schema={"a": List[A]}, + # display="LEN(col('a'))", + # refs={"a"}, + # eval_result=[3], + # expected_dtype=int, + # proto_json=None, + # ), + # # List length + # ExprTestCase( + # expr=(col("a").list.len()), + # df=pd.DataFrame({"a": [[1, 2, 3], [4, 5, 6, 12], [7, 8, 9, 19]]}), + # schema={"a": List[int]}, + # display="LEN(col('a'))", + # refs={"a"}, + # eval_result=[3, 4, 4], + # expected_dtype=int, + # proto_json=None, + # ), + # # Empty list length + # ExprTestCase( + # expr=(col("a").list.len()), + # df=pd.DataFrame({"a": [[], [4, 5, 6, 12], [7, 8, 9, 19]]}), + # schema={"a": List[int]}, + # display="LEN(col('a'))", + # refs={"a"}, + # eval_result=[0, 4, 4], + # expected_dtype=int, + # proto_json=None, + # ), ] for test_case in test_cases: @@ -1177,38 +1177,38 @@ def test_fillnull(): def test_isnull(): cases = [ - ExprTestCase( - expr=(col("a").isnull()), - df=pd.DataFrame({"a": [1, 2, None, 4]}), - schema={"a": Optional[int]}, - display="IS_NULL(col('a'))", - refs={"a"}, - eval_result=[False, False, True, False], - expected_dtype=bool, - proto_json=None, - ), - ExprTestCase( - expr=(col("a").isnull()), - df=pd.DataFrame({"a": ["a", "b", None, "d"]}), - schema={"a": Optional[str]}, - display="IS_NULL(col('a'))", - refs={"a"}, - eval_result=[False, False, True, False], - expected_dtype=bool, - proto_json=None, - ), - # Each type is a struct - # TODO(Aditya): Fix this test case # ExprTestCase( # expr=(col("a").isnull()), - # df=pd.DataFrame({"a": [A(1, 2, "a"), A(2, 3, "b"), None]}), - # schema={"a": Optional[A]}, + # df=pd.DataFrame({"a": [1, 2, None, 4]}), + # schema={"a": Optional[int]}, + # display="IS_NULL(col('a'))", + # refs={"a"}, + # eval_result=[False, False, True, False], + # expected_dtype=bool, + # proto_json=None, + # ), + # ExprTestCase( + # expr=(col("a").isnull()), + # df=pd.DataFrame({"a": ["a", "b", None, "d"]}), + # schema={"a": Optional[str]}, # display="IS_NULL(col('a'))", # refs={"a"}, - # eval_result=[False, False, True], + # eval_result=[False, False, True, False], # expected_dtype=bool, # proto_json=None, # ), + # Each type is a struct + # TODO(Aditya): Fix this test case + ExprTestCase( + expr=(col("a").isnull()), + df=pd.DataFrame({"a": [A(1, 2, "a"), A(2, 3, "b"), None]}), + schema={"a": Optional[A]}, + display="IS_NULL(col('a'))", + refs={"a"}, + eval_result=[False, False, True], + expected_dtype=bool, + proto_json=None, + ), # Each type is a list ExprTestCase( expr=(col("a").isnull()), diff --git a/fennel/internal_lib/schema/schema.py b/fennel/internal_lib/schema/schema.py index b47ecec25..5dd98180f 100644 --- a/fennel/internal_lib/schema/schema.py +++ b/fennel/internal_lib/schema/schema.py @@ -268,70 +268,60 @@ def get_python_type_from_pd(type): def convert_dtype_to_arrow_type_with_nullable( - dtype: schema_proto.DataType, -) -> Tuple[pa.DataType, bool]: + dtype: schema_proto.DataType, nullable: bool = False +) -> pa.DataType: if dtype.HasField("optional_type"): - inner, _ = convert_dtype_to_arrow_type_with_nullable( - dtype.optional_type.of + return convert_dtype_to_arrow_type_with_nullable( + dtype.optional_type.of, True ) - return inner, True elif dtype.HasField("int_type"): - return pa.int64(), False + return pa.int64() elif dtype.HasField("double_type"): - return pa.float64(), False + return pa.float64() elif dtype.HasField("string_type") or dtype.HasField("regex_type"): - return pa.string(), False + return pa.string() elif dtype.HasField("bytes_type"): - return pa.binary(), False + return pa.binary() elif dtype.HasField("bool_type"): - return pa.bool_(), False + return pa.bool_() elif dtype.HasField("timestamp_type"): - return pa.timestamp("ns", "UTC"), False + return pa.timestamp("ns", "UTC") elif dtype.HasField("date_type"): - return pa.date32(), False + return pa.date32() elif dtype.HasField("decimal_type"): - return pa.decimal128(28, dtype.decimal_type.scale), False + return pa.decimal128(28, dtype.decimal_type.scale) elif dtype.HasField("array_type"): - inner, nullable = convert_dtype_to_arrow_type_with_nullable( - dtype.array_type.of + return pa.list_( + value_type=convert_dtype_to_arrow_type_with_nullable(dtype.array_type.of, nullable) ) - field = pa.field("item", inner, nullable) - return pa.list_(field), False elif dtype.HasField("map_type"): - key_pa_type, nullable = convert_dtype_to_arrow_type_with_nullable( - dtype.map_type.key - ) - key_field = pa.field("key", key_pa_type, nullable) - value_pa_type, nullable = convert_dtype_to_arrow_type_with_nullable( - dtype.map_type.value - ) - value_field = pa.field("value", value_pa_type, nullable) - return pa.map_(key_field, value_field, False), False + key_pa_type = convert_dtype_to_arrow_type_with_nullable(dtype.map_type.key, nullable=False) + value_pa_type = convert_dtype_to_arrow_type_with_nullable(dtype.map_type.value, nullable) + return pa.map_(key_pa_type, value_pa_type, False) elif dtype.HasField("embedding_type"): embedding_size = dtype.embedding_type.embedding_size - return pa.list_(pa.float64(), embedding_size), False + return pa.list_(pa.float64(), embedding_size) elif dtype.HasField("one_of_type"): - return convert_dtype_to_arrow_type_with_nullable(dtype.one_of_type.of) + return convert_dtype_to_arrow_type_with_nullable(dtype.one_of_type.of, nullable) elif dtype.HasField("between_type"): return convert_dtype_to_arrow_type_with_nullable( - dtype.between_type.dtype + dtype.between_type.dtype, nullable ) elif dtype.HasField("struct_type"): fields: List[Tuple[str, pa.DataType]] = [] for field in dtype.struct_type.fields: - inner, nullable = convert_dtype_to_arrow_type_with_nullable( - field.dtype + inner = convert_dtype_to_arrow_type_with_nullable( + field.dtype, nullable ) field = pa.field(field.name, inner, nullable) fields.append(field) - return pa.struct(fields), False + return pa.struct(fields) else: raise TypeError(f"Invalid dtype: {dtype}.") def convert_dtype_to_arrow_type(dtype: schema_proto.DataType) -> pa.DataType: - atype, nullable = convert_dtype_to_arrow_type_with_nullable(dtype) - return atype + return convert_dtype_to_arrow_type_with_nullable(dtype) def check_val_is_null(val: Any) -> bool: @@ -527,6 +517,9 @@ def validate_field_in_df( name = field.name dtype = field.dtype arrow_type = convert_dtype_to_arrow_type(dtype) + for col in df.columns: + print("Type of column: ", col, df[col].dtype) + print("Dtype: ", dtype) if df.shape[0] == 0: return if name not in df.columns: @@ -863,6 +856,7 @@ def is_hashable(dtype: Any) -> bool: def data_schema_check( schema: schema_proto.DSSchema, df: pd.DataFrame, dataset_name="" ) -> List[ValueError]: + print("Checkung schema", df.dtypes) exceptions = [] fields = [] for key in schema.keys.fields: @@ -968,8 +962,9 @@ def cast_col_to_arrow_dtype( # Parse datetime values series = series.apply(lambda x: parse_datetime_in_value(x, dtype)) if check_dtype_has_struct_type(dtype): - series = series.apply(lambda x: parse_struct_into_dict(x)) - arrow_type, _nullable = convert_dtype_to_arrow_type_with_nullable(dtype) + series = series.apply(lambda x: parse_struct_into_dict(x, dtype)) + arrow_type = convert_dtype_to_arrow_type_with_nullable(dtype) + print("cast_col_to_arrow_dtype Arrow type: ", arrow_type, "dtype: ", dtype) return series.astype(pd.ArrowDtype(arrow_type)) diff --git a/fennel/internal_lib/schema/test_schema.py b/fennel/internal_lib/schema/test_schema.py index 26ad328bb..1bee76271 100644 --- a/fennel/internal_lib/schema/test_schema.py +++ b/fennel/internal_lib/schema/test_schema.py @@ -801,7 +801,7 @@ def test_convert_dtype_to_arrow_type(): arrow_dtype = convert_dtype_to_arrow_type(data_type) assert ( str(arrow_dtype) - == "list not null, c: list not null> not null>" + == "list not null, c: list not null>>" ) diff --git a/fennel/internal_lib/utils/utils.py b/fennel/internal_lib/utils/utils.py index cb517d3a7..306b26fad 100644 --- a/fennel/internal_lib/utils/utils.py +++ b/fennel/internal_lib/utils/utils.py @@ -6,7 +6,7 @@ import numpy as np import pandas as pd from frozendict import frozendict - +from fennel.gen import schema_pb2 as schema_proto from fennel.gen.schema_pb2 import DataType from fennel.internal_lib import FENNEL_STRUCT @@ -129,7 +129,7 @@ def cast_col_to_pandas( return series.fillna(pd.NA) -def parse_struct_into_dict(value: Any) -> Optional[Union[dict, list]]: +def parse_struct_into_dict(value: Any, dtype: schema_proto.DataType) -> Optional[Union[dict, list]]: """ This function assumes that there's a struct somewhere in the value that needs to be converted into json. """ @@ -141,11 +141,15 @@ def parse_struct_into_dict(value: Any) -> Optional[Union[dict, list]]: f"Not able parse value: {value} into json, error: {e}" ) elif isinstance(value, list) or isinstance(value, np.ndarray): - return [parse_struct_into_dict(x) for x in value] + return [parse_struct_into_dict(x, dtype.array_type.of) for x in value] elif isinstance(value, dict) or isinstance(value, frozendict): - return {key: parse_struct_into_dict(val) for key, val in value.items()} + return {key: parse_struct_into_dict(val, dtype.map_type.value) for key, val in value.items()} elif value is None or pd.isna(value): - return None + # If dtype is an optional struct type return, a dict with all fields as None + if dtype.HasField("optional_type") and dtype.optional_type.of.HasField("struct_type"): + return {field.name: None for field in dtype.optional_type.of.struct_type.fields} + else: + return None else: return value @@ -174,12 +178,12 @@ def parse_datetime_in_value( elif dtype.HasField("map_type"): if isinstance(value, (dict, frozendict)): return { - key: parse_datetime_in_value(value, dtype.array_type.of) + key: parse_datetime_in_value(value, dtype.map_type.value) for (key, value) in value.items() } elif isinstance(value, (list, np.ndarray)): return [ - (key, parse_datetime_in_value(value, dtype.array_type.of)) + (key, parse_datetime_in_value(value, dtype.map_type.value)) for (key, value) in value ] else: diff --git a/poetry.lock b/poetry.lock index c4cb0eb58..0cd14396e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -378,78 +378,78 @@ files = [ [[package]] name = "cffi" -version = "1.17.0" +version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" files = [ - {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"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] [package.dependencies] @@ -766,44 +766,44 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc [[package]] name = "fennel-data-lib" -version = "0.1.14" +version = "0.1.15" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "fennel_data_lib-0.1.14-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a1089f2c2c106975bcacd4ae1978f4f1eaa9113cfe4d62fc4d730f0006d9f8cf"}, - {file = "fennel_data_lib-0.1.14-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce3d47dd1eb6ddffbe856edb1951aac989699807edb372788f9a8d7d0df8397c"}, - {file = "fennel_data_lib-0.1.14-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:248ce3f6954d108d8bcaaa9fd10647209837659776d4daa4e380badbf2e4905c"}, - {file = "fennel_data_lib-0.1.14-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc24740e9addd1cf9a8795e1e55d574b08e6b6c65106e07226c0e360fb00105"}, - {file = "fennel_data_lib-0.1.14-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf463f3786bc1d3b381db62c63b90ecaa054de9f0e077c25093da6882faf8e4a"}, - {file = "fennel_data_lib-0.1.14-cp310-cp310-manylinux_2_34_x86_64.whl", hash = "sha256:c428f6339b59586acd7bd3e2ef7c79e6b1638bf899885ff88581f46e1fb44e82"}, - {file = "fennel_data_lib-0.1.14-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d7bc4913f09d537fc8d46a01ea49fae1bf09b7be52d4ccb82a04257862595340"}, - {file = "fennel_data_lib-0.1.14-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:34038ab5270ea2c70215d85594e49d7122fa0f1ca8ffc66b50ede5c9589874a4"}, - {file = "fennel_data_lib-0.1.14-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9c1e330cfdc3df551a00de210651aad14f5ff2d44ccc4351715da4030fe91805"}, - {file = "fennel_data_lib-0.1.14-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc53e55453de3b5347013b10e624a56a423732db64c94cdfc46b3029906f066f"}, - {file = "fennel_data_lib-0.1.14-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b28425b8024a65cb7de78687ac7bc8515c8c107cfe8d80445fd8578052763ec6"}, - {file = "fennel_data_lib-0.1.14-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1631378df7cec4372441eda801db2ad08b16c995e4c2683e2e689675229eec75"}, - {file = "fennel_data_lib-0.1.14-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:143441be46b7f91ed77262bdb7f82e29602853c4b92edb49cfd9df3144e21413"}, - {file = "fennel_data_lib-0.1.14-cp311-cp311-manylinux_2_34_x86_64.whl", hash = "sha256:4234aa0c470ca170b1809d0a6def3b7fcfb643f1ce14e6af02d216cc3c5ca6ff"}, - {file = "fennel_data_lib-0.1.14-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1a4ba69c022bce7be0f1f54a62761383401bf54addba4122af73325afcedd12c"}, - {file = "fennel_data_lib-0.1.14-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6fa1ac2b07b0a52a2f81739cb5b2ca3c657b2eba77a5342c9c3b0848e2266a5f"}, - {file = "fennel_data_lib-0.1.14-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:fa9e9e039b20c3a227e11074f58720d0faa368f76ad648b84cb4b485a9770cca"}, - {file = "fennel_data_lib-0.1.14-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0ddabd157bd242c8d15b703eef006242639f1bb576fef4921e8b6d6ad06fad8"}, - {file = "fennel_data_lib-0.1.14-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3d7360f8ddbb2b6a22832352c09cf843116fcf61c45d04d0666b569162fa923e"}, - {file = "fennel_data_lib-0.1.14-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbad3a6bbb4f20f00ad3a00b38e2b55e21a9ae6644c20a92ef645beaa633afb1"}, - {file = "fennel_data_lib-0.1.14-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e640ebd01e9211ad48feec910bf0789a2db4b56f9479a7a0f146d758c522cf3"}, - {file = "fennel_data_lib-0.1.14-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:c84fdac2a827b1221d0fbc7912f4de31ddbeab54162371cff68ba070f493535f"}, - {file = "fennel_data_lib-0.1.14-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1d533a1b855a144edb01fcb0c606e3e6e18186e6101531fa6877e03c969b7417"}, - {file = "fennel_data_lib-0.1.14-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9dcbe03b4128ef5f0e0b030df93b820adbde42abcf487024ebd6c8ed3a7b6c86"}, - {file = "fennel_data_lib-0.1.14-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:3b7136989c612cd2ab7892d0f54597a3669aed77af4bb61c4caa78e38bf1591f"}, - {file = "fennel_data_lib-0.1.14-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05363ba050cc7090fbef9ae9e35a062a11c1eda321d243e4127f8c3e68b84343"}, - {file = "fennel_data_lib-0.1.14-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4d1c61ec1c654ae49bfaf784c5023365d0ea5e5fe96213c016c43b966fd20379"}, - {file = "fennel_data_lib-0.1.14-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0f3dbec239f54f07ce08ebffa531e9b7beb51a3f846e3fcde68800a52215c52"}, - {file = "fennel_data_lib-0.1.14-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:deadecddf8e8804c5611ee9a1f9230b9fd8a0190fccc0add7f318c19a318e4dd"}, - {file = "fennel_data_lib-0.1.14-cp39-cp39-manylinux_2_34_x86_64.whl", hash = "sha256:62552a5e4d6c52c6d6752baa9acaf0cec0b24d8fbe385248010ac8d649e9a4be"}, - {file = "fennel_data_lib-0.1.14-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fff59bb56012c4869ccbcb464f14a3563c91135910de733da7229d909af59438"}, - {file = "fennel_data_lib-0.1.14-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:325c6dd4ed949e2ee6ff7ee65b9ab76d6b51e7d16b98733ffb0a46606962253d"}, - {file = "fennel_data_lib-0.1.14.tar.gz", hash = "sha256:08d852e09b8dabbad296968e73c60d7eacba536bd612df33f741deac0a49be54"}, + {file = "fennel_data_lib-0.1.15-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:42ad4c903b09bc72486a81a5e4250e648d6d766241509facf0ebe72572e11585"}, + {file = "fennel_data_lib-0.1.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a48792d49000de3f1d2b8d7f1fc24a9b0a342f410f01ebb092141526d691842e"}, + {file = "fennel_data_lib-0.1.15-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3da42b3a7230ebfa0ee087c39c4b04b617bf5f13808b3cc593f3b50220921c59"}, + {file = "fennel_data_lib-0.1.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ec33813adb02a37d6943ed0014927739f1b098c6d575f59ebf85399c364d2f1"}, + {file = "fennel_data_lib-0.1.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fc35dcee6c0afef19558698bc425ff73954d99ccae0f6d24a7dd0835c21439ef"}, + {file = "fennel_data_lib-0.1.15-cp310-cp310-manylinux_2_34_x86_64.whl", hash = "sha256:fae1e1a8a9cc925e2ba42a72ba27a070e9a63fd3dc68116d2894477d01b53394"}, + {file = "fennel_data_lib-0.1.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:21f469a4e6197ac6f64910a98fb6cdea88144dac2d582cc428e60be7f9c6fca8"}, + {file = "fennel_data_lib-0.1.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:93e90b0d02e37ff879879cb6a76f11870c42267c65a73e21b96e8999e3eba81e"}, + {file = "fennel_data_lib-0.1.15-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:f8215b50977267cfd4af6c0ad1ae1a7a5e4b73ac73ae089f196e3bfc573288db"}, + {file = "fennel_data_lib-0.1.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f94fd8c649210c4968aabf9a573f6616bd7cdc0a825672d077ca1e684eee32cc"}, + {file = "fennel_data_lib-0.1.15-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:05e8deff1ac986f9c9c3da2ed626402b3bcc01f28b1ac25f004c53f00567878d"}, + {file = "fennel_data_lib-0.1.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eea0f44dfb2f401648a21fe94d8eb446f4e2cd0a1eb89384046906831b429f09"}, + {file = "fennel_data_lib-0.1.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:74c79b4b67e8af8e9d39a7316bf95c228d82c9ac99eabcad2889482c8a6f889a"}, + {file = "fennel_data_lib-0.1.15-cp311-cp311-manylinux_2_34_x86_64.whl", hash = "sha256:e50ba983c0fa58e606593a961dca099ff5bab92865c3f164b3296caa061c34e4"}, + {file = "fennel_data_lib-0.1.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:444b275022b2b7f19126787d86ca6265c654199e22a230aaf0b8dd0870822262"}, + {file = "fennel_data_lib-0.1.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8f74d429b3e6d2c838e2e871809241a160adf39e923628e6a3b548a077a41872"}, + {file = "fennel_data_lib-0.1.15-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:0a46a9a094255b3c4984c963dc0c4aaeb63983b0a57966b5c6e85085de6a65dc"}, + {file = "fennel_data_lib-0.1.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7720e9880248d819145f38aefc8b72d691960b461e29de5e49cf9894ff4ba7a"}, + {file = "fennel_data_lib-0.1.15-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9d0e6f3164c21819d3002c10ba3b70a3aed1dfa70369fba872559fa77d69badf"}, + {file = "fennel_data_lib-0.1.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ff7c034981c23904e4f13d9657b3667ce1df386133603cd3ed105719779759a4"}, + {file = "fennel_data_lib-0.1.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a37af5a8c627d7d003fadfd9cf0430d45aeddaa9d4e788d91e224f9f1e28f94"}, + {file = "fennel_data_lib-0.1.15-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:11d4859099357021ee2741b9cee84d481e69d3cb2e37ad5f7bb08e5517b805ea"}, + {file = "fennel_data_lib-0.1.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c2b129aebdb74b74019ee294cfcaba915f76344310430788792ee46c3d7cd3a1"}, + {file = "fennel_data_lib-0.1.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e277852036f79d65734d065bcd9ca0abcdefd6d773f285c528dfa851888451f4"}, + {file = "fennel_data_lib-0.1.15-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:631ce0e801a631ec4f15abc6a2b886e47b25076b7a444ae5d0838aee89090fae"}, + {file = "fennel_data_lib-0.1.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d3abba61270217bece19bc331ad16f55fb058f1aabef4ab3726cd18dc6fce89"}, + {file = "fennel_data_lib-0.1.15-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f094498f46803298c932ed521537d02bbdcc464a014b9e83d01ee00e053b193"}, + {file = "fennel_data_lib-0.1.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa53fd1863c7f277c718bbd24891722223bee90d6b249216523cf7d1c9eefe42"}, + {file = "fennel_data_lib-0.1.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c058c90921fa7d1f4d178592ba6e054695ab9c619a33e07c935f2415faeb1104"}, + {file = "fennel_data_lib-0.1.15-cp39-cp39-manylinux_2_34_x86_64.whl", hash = "sha256:e1aae677fa041a1a4906ff846ed6585a6a9f9dc4c4909683354ad930c1e5d3a1"}, + {file = "fennel_data_lib-0.1.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d360649a168a9452f5915c307d9dcfd8d2a910c5ae769a5eb7f7be80caddac68"}, + {file = "fennel_data_lib-0.1.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5048ae590669033cbe6fcd6a88fb905a9c53f4d46611f9aed1510bdfbbde4347"}, + {file = "fennel_data_lib-0.1.15.tar.gz", hash = "sha256:158ff36a5e732ad48125881d03314dd25eece6ab3515ea672bf4fa49b2dea522"}, ] [[package]] @@ -3714,4 +3714,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "1c4cd69015d3feb1f0dcc686948dfc1b038dfeba5fae749eddc14b5d4f640ee7" +content-hash = "38238318d918ada7382d0d335dc4ad3e8c16c55d7ce0650c685acfafe5c72489" diff --git a/pyproject.toml b/pyproject.toml index e5348d28c..7cf8bced6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,7 +20,7 @@ pytest = "7.1.3" pytest-rerunfailures = "^13.0" sortedcontainers = "^2.4.0" typing-extensions = "^4.12.0" -fennel-data-lib = "0.1.14" +fennel-data-lib = "0.1.15" pyarrow = "^14.0.2" [tool.poetry.dev-dependencies] @@ -43,20 +43,20 @@ pyyaml = "^6.0.1" # For production, we use poetry to build the python package -[build-system] -requires = ["poetry-core>=1.0.0"] -build-backend = "poetry.core.masonry.api" +# [build-system] +# requires = ["poetry-core>=1.0.0"] +# build-backend = "poetry.core.masonry.api" # For local development, we use maturin to build the rust library -# [build-system] -# requires = ["maturin", "setuptools>=42", "wheel"] -# build-backend = "maturin" +[build-system] +requires = ["maturin", "setuptools>=42", "wheel"] +build-backend = "maturin" -# [tool.maturin] -# name = "fennel_data_lib" -# sdist-directory = "python_package" -# manifest-path = "../server/fennel_data_lib/Cargo.toml" +[tool.maturin] +name = "fennel_data_lib" +sdist-directory = "python_package" +manifest-path = "../server/fennel_data_lib/Cargo.toml" # inspired from - https://github.com/pypa/pip/blob/main/pyproject.toml