fugue 0.8.7.dev5__py3-none-any.whl → 0.8.7.dev7__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. fugue/__init__.py +0 -1
  2. fugue/_utils/io.py +84 -89
  3. fugue/api.py +1 -0
  4. fugue/dataframe/api.py +19 -2
  5. fugue/dataframe/arrow_dataframe.py +48 -11
  6. fugue/dataframe/dataframe.py +20 -2
  7. fugue/dataframe/function_wrapper.py +1 -1
  8. fugue/dataframe/iterable_dataframe.py +3 -0
  9. fugue/dataframe/pandas_dataframe.py +73 -0
  10. fugue/dataframe/utils.py +78 -25
  11. fugue/execution/execution_engine.py +1 -8
  12. fugue/execution/native_execution_engine.py +5 -11
  13. fugue/plugins.py +1 -0
  14. fugue/workflow/_checkpoint.py +9 -9
  15. {fugue-0.8.7.dev5.dist-info → fugue-0.8.7.dev7.dist-info}/METADATA +4 -4
  16. {fugue-0.8.7.dev5.dist-info → fugue-0.8.7.dev7.dist-info}/RECORD +40 -38
  17. {fugue-0.8.7.dev5.dist-info → fugue-0.8.7.dev7.dist-info}/WHEEL +1 -1
  18. {fugue-0.8.7.dev5.dist-info → fugue-0.8.7.dev7.dist-info}/entry_points.txt +3 -2
  19. fugue_dask/_io.py +22 -29
  20. fugue_dask/_utils.py +15 -2
  21. fugue_dask/dataframe.py +105 -18
  22. fugue_dask/execution_engine.py +5 -12
  23. fugue_duckdb/_io.py +21 -37
  24. fugue_duckdb/dataframe.py +87 -29
  25. fugue_duckdb/execution_engine.py +2 -7
  26. fugue_ibis/dataframe.py +13 -0
  27. fugue_ibis/execution_engine.py +1 -5
  28. fugue_polars/polars_dataframe.py +53 -16
  29. fugue_ray/_utils/io.py +15 -17
  30. fugue_ray/dataframe.py +71 -19
  31. fugue_spark/_utils/io.py +3 -5
  32. fugue_spark/dataframe.py +69 -13
  33. fugue_spark/execution_engine.py +2 -7
  34. fugue_test/builtin_suite.py +12 -12
  35. fugue_test/dataframe_suite.py +14 -0
  36. fugue_test/execution_suite.py +13 -18
  37. fugue_test/plugins/misc/__init__.py +2 -0
  38. fugue_test/plugins/misc/fixtures.py +18 -0
  39. {fugue-0.8.7.dev5.dist-info → fugue-0.8.7.dev7.dist-info}/LICENSE +0 -0
  40. {fugue-0.8.7.dev5.dist-info → fugue-0.8.7.dev7.dist-info}/top_level.txt +0 -0
fugue/dataframe/utils.py CHANGED
@@ -1,15 +1,16 @@
1
- import os
2
1
  import pickle
3
- from typing import Any, Iterable, Optional, Tuple
2
+ from typing import Any, Dict, Iterable, List, Optional, Tuple
4
3
 
5
4
  import pandas as pd
6
5
  import pyarrow as pa
7
- from fs import open_fs
8
- from triad import FileSystem, Schema
6
+ from fsspec import AbstractFileSystem
7
+ from triad import Schema, assert_or_throw
9
8
  from triad.collections.schema import SchemaError
10
9
  from triad.exceptions import InvalidOperationError
11
10
  from triad.utils.assertion import assert_arg_not_none
12
11
  from triad.utils.assertion import assert_or_throw as aot
12
+ from triad.utils.io import url_to_fs
13
+ from triad.utils.pyarrow import pa_batch_to_dicts
13
14
 
14
15
  from .api import as_fugue_df, get_column_names, normalize_column_names, rename
15
16
  from .dataframe import DataFrame, LocalBoundedDataFrame
@@ -111,7 +112,6 @@ def serialize_df(
111
112
  df: Optional[DataFrame],
112
113
  threshold: int = -1,
113
114
  file_path: Optional[str] = None,
114
- fs: Optional[FileSystem] = None,
115
115
  ) -> Optional[bytes]:
116
116
  """Serialize input dataframe to base64 string or to file
117
117
  if it's larger than threshold
@@ -120,15 +120,8 @@ def serialize_df(
120
120
  :param threshold: file byte size threshold, defaults to -1
121
121
  :param file_path: file path to store the data (used only if the serialized data
122
122
  is larger than ``threshold``), defaults to None
123
- :param fs: :class:`~triad:triad.collections.fs.FileSystem`, defaults to None
124
123
  :raises InvalidOperationError: if file is large but ``file_path`` is not provided
125
124
  :return: a pickled blob either containing the data or the file path
126
-
127
- .. note::
128
-
129
- If fs is not provided but it needs to write to disk, then it will use
130
- :meth:`~fs:fs.opener.registry.Registry.open_fs` to try to open the file to
131
- write.
132
125
  """
133
126
  if df is None:
134
127
  return None
@@ -139,24 +132,20 @@ def serialize_df(
139
132
  else:
140
133
  if file_path is None:
141
134
  raise InvalidOperationError("file_path is not provided")
142
- if fs is None:
143
- with open_fs(
144
- os.path.dirname(file_path), writeable=True, create=False
145
- ) as _fs:
146
- _fs.writebytes(os.path.basename(file_path), data)
147
- else:
148
- fs.writebytes(file_path, data)
135
+ fs, path = url_to_fs(file_path)
136
+ with fs.open(path, "wb") as f:
137
+ f.write(data)
149
138
  return pickle.dumps(file_path)
150
139
 
151
140
 
152
141
  def deserialize_df(
153
- data: Optional[bytes], fs: Optional[FileSystem] = None
142
+ data: Optional[bytes], fs: Optional[AbstractFileSystem] = None
154
143
  ) -> Optional[LocalBoundedDataFrame]:
155
144
  """Deserialize json string to
156
145
  :class:`~fugue.dataframe.dataframe.LocalBoundedDataFrame`
157
146
 
158
147
  :param json_str: json string containing the base64 data or a file path
159
- :param fs: :class:`~triad:triad.collections.fs.FileSystem`, defaults to None
148
+ :param fs: the file system to use, defaults to None
160
149
  :raises ValueError: if the json string is invalid, not generated from
161
150
  :func:`~.serialize_df`
162
151
  :return: :class:`~fugue.dataframe.dataframe.LocalBoundedDataFrame` if ``json_str``
@@ -168,10 +157,9 @@ def deserialize_df(
168
157
  if isinstance(obj, LocalBoundedDataFrame):
169
158
  return obj
170
159
  elif isinstance(obj, str):
171
- if fs is None:
172
- with open_fs(os.path.dirname(obj), create=False) as _fs:
173
- return pickle.loads(_fs.readbytes(os.path.basename(obj)))
174
- return pickle.loads(fs.readbytes(obj))
160
+ fs, path = url_to_fs(obj)
161
+ with fs.open(path, "rb") as f:
162
+ return pickle.load(f)
175
163
  raise ValueError("data is invalid")
176
164
 
177
165
 
@@ -250,3 +238,68 @@ def get_join_schemas(
250
238
  else:
251
239
  aot(len(on) > 0, SchemaError("join on columns must be specified"))
252
240
  return cm, (df1.schema.union(schema2))
241
+
242
+
243
+ def pa_table_as_array_iterable(
244
+ df: pa.Table, columns: Optional[List[str]] = None
245
+ ) -> Iterable[List[List[Any]]]:
246
+ """Convert a pyarrow table to an iterable of list
247
+
248
+ :param df: pyarrow table
249
+ :param columns: if not None, only these columns will be returned, defaults to None
250
+ :return: an iterable of list
251
+ """
252
+ assert_or_throw(columns is None or len(columns) > 0, ValueError("empty columns"))
253
+ _df = df if columns is None or len(columns) == 0 else df.select(columns)
254
+ for batch in _df.to_batches():
255
+ for x in zip(*batch.to_pydict().values()):
256
+ yield list(x)
257
+
258
+
259
+ def pa_table_as_array(
260
+ df: pa.Table, columns: Optional[List[str]] = None
261
+ ) -> List[List[List[Any]]]:
262
+ """Convert a pyarrow table to a list of list
263
+
264
+ :param df: pyarrow table
265
+ :param columns: if not None, only these columns will be returned, defaults to None
266
+ :return: a list of list
267
+ """
268
+ return list(pa_table_as_array_iterable(df, columns=columns))
269
+
270
+
271
+ def pa_table_as_dict_iterable(
272
+ df: pa.Table, columns: Optional[List[str]] = None
273
+ ) -> Iterable[Dict[str, Any]]:
274
+ """Convert a pyarrow table to an iterable of dict
275
+
276
+ :param df: pyarrow table
277
+ :param columns: if not None, only these columns will be returned, defaults to None
278
+ :return: an iterable of dict
279
+ """
280
+ for ck in _pa_table_as_dicts_chunks(df, columns=columns):
281
+ yield from ck
282
+
283
+
284
+ def pa_table_as_dicts(
285
+ df: pa.Table, columns: Optional[List[str]] = None
286
+ ) -> List[Dict[str, Any]]:
287
+ """Convert a pyarrow table to a list of dict
288
+
289
+ :param df: pyarrow table
290
+ :param columns: if not None, only these columns will be returned, defaults to None
291
+ :return: a list of dict
292
+ """
293
+ res: List[Dict[str, Any]] = []
294
+ for ck in _pa_table_as_dicts_chunks(df, columns=columns):
295
+ res += ck
296
+ return res
297
+
298
+
299
+ def _pa_table_as_dicts_chunks(
300
+ df: pa.Table, columns: Optional[List[str]] = None
301
+ ) -> Iterable[List[Dict[str, Any]]]:
302
+ assert_or_throw(columns is None or len(columns) > 0, ValueError("empty columns"))
303
+ _df = df if columns is None or len(columns) == 0 else df.select(columns)
304
+ for batch in _df.to_batches():
305
+ yield pa_batch_to_dicts(batch)
@@ -18,7 +18,6 @@ from typing import (
18
18
  from uuid import uuid4
19
19
 
20
20
  from triad import ParamDict, Schema, SerializableRLock, assert_or_throw, to_uuid
21
- from triad.collections.fs import FileSystem
22
21
  from triad.collections.function_wrapper import AnnotatedParam
23
22
  from triad.exceptions import InvalidOperationError
24
23
  from triad.utils.convert import to_size
@@ -471,12 +470,6 @@ class ExecutionEngine(FugueEngineBase):
471
470
  """
472
471
  self._sql_engine = engine
473
472
 
474
- @property
475
- @abstractmethod
476
- def fs(self) -> FileSystem: # pragma: no cover
477
- """File system of this engine instance"""
478
- raise NotImplementedError
479
-
480
473
  @abstractmethod
481
474
  def create_default_map_engine(self) -> MapEngine: # pragma: no cover
482
475
  """Default MapEngine if user doesn't specify"""
@@ -1323,7 +1316,7 @@ class _Comap:
1323
1316
  self._on_init(partition_no, empty_dfs)
1324
1317
 
1325
1318
  def run(self, cursor: PartitionCursor, df: LocalDataFrame) -> LocalDataFrame:
1326
- data = list(df.as_dict_iterable())
1319
+ data = df.as_dicts()
1327
1320
  if self.how == "inner":
1328
1321
  if len(data) < self.dfs_count:
1329
1322
  return ArrayDataFrame([], self.output_schema)
@@ -1,12 +1,13 @@
1
1
  import logging
2
2
  import os
3
3
  from typing import Any, Callable, Dict, List, Optional, Type, Union
4
+
4
5
  import numpy as np
5
6
  import pandas as pd
6
7
  from triad import Schema
7
8
  from triad.collections.dict import IndexedOrderedDict
8
- from triad.collections.fs import FileSystem
9
9
  from triad.utils.assertion import assert_or_throw
10
+ from triad.utils.io import makedirs
10
11
  from triad.utils.pandas_like import PandasUtils
11
12
 
12
13
  from fugue._utils.io import load_df, save_df
@@ -179,7 +180,6 @@ class NativeExecutionEngine(ExecutionEngine):
179
180
 
180
181
  def __init__(self, conf: Any = None):
181
182
  super().__init__(conf)
182
- self._fs = FileSystem()
183
183
  self._log = logging.getLogger()
184
184
 
185
185
  def __repr__(self) -> str:
@@ -189,10 +189,6 @@ class NativeExecutionEngine(ExecutionEngine):
189
189
  def log(self) -> logging.Logger:
190
190
  return self._log
191
191
 
192
- @property
193
- def fs(self) -> FileSystem:
194
- return self._fs
195
-
196
192
  @property
197
193
  def is_distributed(self) -> bool:
198
194
  return False
@@ -395,9 +391,7 @@ class NativeExecutionEngine(ExecutionEngine):
395
391
  **kwargs: Any,
396
392
  ) -> LocalBoundedDataFrame:
397
393
  return self.to_df(
398
- load_df(
399
- path, format_hint=format_hint, columns=columns, fs=self.fs, **kwargs
400
- )
394
+ load_df(path, format_hint=format_hint, columns=columns, **kwargs)
401
395
  )
402
396
 
403
397
  def save_df(
@@ -413,9 +407,9 @@ class NativeExecutionEngine(ExecutionEngine):
413
407
  partition_spec = partition_spec or PartitionSpec()
414
408
  if not force_single and not partition_spec.empty:
415
409
  kwargs["partition_cols"] = partition_spec.partition_by
416
- self.fs.makedirs(os.path.dirname(path), recreate=True)
410
+ makedirs(os.path.dirname(path), exist_ok=True)
417
411
  df = self.to_df(df)
418
- save_df(df, path, format_hint=format_hint, mode=mode, fs=self.fs, **kwargs)
412
+ save_df(df, path, format_hint=format_hint, mode=mode, **kwargs)
419
413
 
420
414
 
421
415
  @fugue_annotated_param(NativeExecutionEngine)
fugue/plugins.py CHANGED
@@ -7,6 +7,7 @@ from fugue.dataframe import (
7
7
  as_array_iterable,
8
8
  as_arrow,
9
9
  as_dict_iterable,
10
+ as_dicts,
10
11
  as_pandas,
11
12
  drop_columns,
12
13
  fugue_annotated_param,
@@ -1,14 +1,15 @@
1
1
  from typing import Any
2
2
 
3
- import fs as pfs
3
+ from triad.utils.assertion import assert_or_throw
4
+ from triad.utils.hash import to_uuid
5
+ from triad.utils.io import exists, join, makedirs, rm
6
+
4
7
  from fugue.collections.partition import PartitionSpec
5
8
  from fugue.collections.yielded import PhysicalYielded
6
9
  from fugue.constants import FUGUE_CONF_WORKFLOW_CHECKPOINT_PATH
7
10
  from fugue.dataframe import DataFrame
8
11
  from fugue.exceptions import FugueWorkflowCompileError, FugueWorkflowRuntimeError
9
12
  from fugue.execution.execution_engine import ExecutionEngine
10
- from triad.utils.assertion import assert_or_throw
11
- from triad.utils.hash import to_uuid
12
13
 
13
14
 
14
15
  class Checkpoint(object):
@@ -130,7 +131,6 @@ class WeakCheckpoint(Checkpoint):
130
131
  class CheckpointPath(object):
131
132
  def __init__(self, engine: ExecutionEngine):
132
133
  self._engine = engine
133
- self._fs = engine.fs
134
134
  self._log = engine.log
135
135
  self._path = engine.conf.get(FUGUE_CONF_WORKFLOW_CHECKPOINT_PATH, "").strip()
136
136
  self._temp_path = ""
@@ -143,14 +143,14 @@ class CheckpointPath(object):
143
143
  if self._path == "":
144
144
  self._temp_path = ""
145
145
  return ""
146
- self._temp_path = pfs.path.combine(self._path, execution_id)
147
- self._fs.makedirs(self._temp_path, recreate=True)
146
+ self._temp_path = join(self._path, execution_id)
147
+ makedirs(self._temp_path, exist_ok=True)
148
148
  return self._temp_path
149
149
 
150
150
  def remove_temp_path(self):
151
151
  if self._temp_path != "":
152
152
  try:
153
- self._fs.removetree(self._temp_path)
153
+ rm(self._temp_path, recursive=True)
154
154
  except Exception as e: # pragma: no cover
155
155
  self._log.info("Unable to remove " + self._temp_path, e)
156
156
 
@@ -162,7 +162,7 @@ class CheckpointPath(object):
162
162
  f"{FUGUE_CONF_WORKFLOW_CHECKPOINT_PATH} is not set"
163
163
  ),
164
164
  )
165
- return pfs.path.combine(path, obj_id + ".parquet")
165
+ return join(path, obj_id + ".parquet")
166
166
 
167
167
  def get_table_name(self, obj_id: str, permanent: bool) -> str:
168
168
  path = self._path if permanent else self._temp_path
@@ -170,6 +170,6 @@ class CheckpointPath(object):
170
170
 
171
171
  def temp_file_exists(self, path: str) -> bool:
172
172
  try:
173
- return self._fs.exists(path)
173
+ return exists(path)
174
174
  except Exception: # pragma: no cover
175
175
  return False
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fugue
3
- Version: 0.8.7.dev5
3
+ Version: 0.8.7.dev7
4
4
  Summary: An abstraction layer for distributed computation
5
5
  Home-page: http://github.com/fugue-project/fugue
6
6
  Author: The Fugue Development Team
@@ -19,7 +19,7 @@ Classifier: Programming Language :: Python :: 3.10
19
19
  Classifier: Programming Language :: Python :: 3 :: Only
20
20
  Requires-Python: >=3.8
21
21
  Description-Content-Type: text/markdown
22
- Requires-Dist: triad ==0.9.2.dev3
22
+ Requires-Dist: triad ==0.9.2.dev8
23
23
  Requires-Dist: adagio >=0.2.4
24
24
  Requires-Dist: qpd >=0.4.4
25
25
  Requires-Dist: fugue-sql-antlr >=0.1.6
@@ -32,7 +32,7 @@ Requires-Dist: fugue-sql-antlr[cpp] >=0.1.6 ; extra == 'all'
32
32
  Requires-Dist: pyspark >=3.1.1 ; extra == 'all'
33
33
  Requires-Dist: dask[dataframe,distributed] >=2023.5.0 ; extra == 'all'
34
34
  Requires-Dist: dask-sql ; extra == 'all'
35
- Requires-Dist: ray[data] >=2.1.0 ; extra == 'all'
35
+ Requires-Dist: ray[data] >=2.4.0 ; extra == 'all'
36
36
  Requires-Dist: notebook ; extra == 'all'
37
37
  Requires-Dist: jupyterlab ; extra == 'all'
38
38
  Requires-Dist: ipython >=7.10.0 ; extra == 'all'
@@ -59,7 +59,7 @@ Requires-Dist: ipython >=7.10.0 ; extra == 'notebook'
59
59
  Provides-Extra: polars
60
60
  Requires-Dist: polars ; extra == 'polars'
61
61
  Provides-Extra: ray
62
- Requires-Dist: ray[data] >=2.1.0 ; extra == 'ray'
62
+ Requires-Dist: ray[data] >=2.4.0 ; extra == 'ray'
63
63
  Requires-Dist: duckdb >=0.5.0 ; extra == 'ray'
64
64
  Requires-Dist: pyarrow >=6.0.1 ; extra == 'ray'
65
65
  Provides-Extra: spark
@@ -1,16 +1,16 @@
1
- fugue/__init__.py,sha256=xT5zuNZfRkjbA8a-uTT5oLK6hLGuezGZLWYBl6eS5J4,2749
2
- fugue/api.py,sha256=6_d3vYwJGAX7tW7NMhHB_NAX4aPsfzK2L06Zr2V78Ks,1240
1
+ fugue/__init__.py,sha256=LKkBEPEAMLG-Yuzqt0IgoIDEfNf9a1zUffNKb83D_l8,2705
2
+ fugue/api.py,sha256=dLUrigFhDMB5x7cvlWSK8EyaY2o0AmhgPr0VRtfzSz0,1254
3
3
  fugue/constants.py,sha256=crd0VqX8WtBcjSUNwZDi2LDIEkhUMWOlSn73H8JI9ds,3385
4
4
  fugue/dev.py,sha256=GQCkezBBl4V0lVDWhGtUQKqomiCxgR9dMhfqj9C8cS8,1369
5
5
  fugue/exceptions.py,sha256=ylP8gkZL8ao_ZLinNYKv16FPyO_n7c29dN-4QChUxi0,1544
6
- fugue/plugins.py,sha256=SJ-jqs04StHIHJ65lgdGP0IDopVIGBDpmzHHllNK8p0,998
6
+ fugue/plugins.py,sha256=kao-H5z-cRbujBKW1QC9IHUOBKxXMhpVQ6saIE7cXm8,1012
7
7
  fugue/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  fugue/registry.py,sha256=SNULGv08f37fRO-cIxFDmnVcod7ref2fNLSK6G7nVnI,868
9
9
  fugue/_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  fugue/_utils/display.py,sha256=JV8oDA7efHm1wceZulCBOY5dMvjbWHvIm6ASisKfoWY,3164
11
11
  fugue/_utils/exception.py,sha256=SFIjwjV4CIEovp3P9k7ePNOFB12A5D8hDdhtfFUeM5Y,2247
12
12
  fugue/_utils/interfaceless.py,sha256=wI0H6L4W_1uQjh9tpjgT9HzN-fbrrtXXHC1x6Q_rrPg,2203
13
- fugue/_utils/io.py,sha256=qDwqgY389GhCHV-7EvuiysJVbHxhquuEva9IlOYsmDw,9271
13
+ fugue/_utils/io.py,sha256=adrtj6Dq0ti426DNlkliApbTkp8b3bfBysAiE5MVQVc,9265
14
14
  fugue/_utils/misc.py,sha256=_huy0eylmRTEFoReGR2M4rbAI8m79hFcfY5bDceVEXU,887
15
15
  fugue/_utils/registry.py,sha256=lrbzTdUEVnW6paBGDj-Yb-aTIbP5mjCqrXuRU9_N6os,316
16
16
  fugue/bag/__init__.py,sha256=0Q0_rnrEThrTx2U-1xGNyAg95idp_xcnywymIcW4Xck,46
@@ -25,24 +25,24 @@ fugue/column/expressions.py,sha256=fdGX9oPCqJBuROFZqrOYVcwkjghdXT9ngaSTG5tW_i8,2
25
25
  fugue/column/functions.py,sha256=ygLyn2gp5lTdGbYqJXeGeMmRNhbm4-vfJvAY_Zt0pb0,9774
26
26
  fugue/column/sql.py,sha256=s_qTtHgnvRFqjhCWr7s595PTrHM-Pr9zHUQfU5xcTVA,17391
27
27
  fugue/dataframe/__init__.py,sha256=zm7TbsaJLIvfm7zymWm2LGcuJd3nxfGsFnQiyrSnenM,678
28
- fugue/dataframe/api.py,sha256=KEbZbXCnaUgfwGF7iZODZsCtJTL4-reQS4qVbigFrps,10554
28
+ fugue/dataframe/api.py,sha256=aWBvMaiSUxOvdQMfe79zHShWuPfLcgiWggC9HvVxvSE,11017
29
29
  fugue/dataframe/array_dataframe.py,sha256=4scWnmQ6sjy1A6o7IYdRc0VVutBEfcJrA1f9wkph4Kg,4440
30
- fugue/dataframe/arrow_dataframe.py,sha256=mJzrYBGs9mEMsHgxmnhDdiLUiOkcOs3YBAzHs75KFsI,10202
31
- fugue/dataframe/dataframe.py,sha256=a7jhYUaovN7w8vcJ-OU2AMfkfqxpvFF06cYWFqIJWqM,16418
30
+ fugue/dataframe/arrow_dataframe.py,sha256=r5zcZBX_N6XO5dmixBkTCPgLcMmgDF022piZvrwRp_c,11485
31
+ fugue/dataframe/dataframe.py,sha256=xmyG85i14A6LDRkNmPt29oYq7PJsq668s1QvFHK8PV4,16964
32
32
  fugue/dataframe/dataframe_iterable_dataframe.py,sha256=lx71KfaI4lsVKI-79buc-idaeT20JEMBOq21SQcAiY8,7259
33
33
  fugue/dataframe/dataframes.py,sha256=tBSpHsENgbcdOJ0Jgst6PTKbjG7_uoFJch96oTlaQIs,4160
34
- fugue/dataframe/function_wrapper.py,sha256=r6H1SQWaag2eSbJ50327t_bt7MZunbOMOl9OcOcQW2E,14827
35
- fugue/dataframe/iterable_dataframe.py,sha256=9g2BAF9A6QPbo63Si-trFq_9nPVqAD9vSePRCV71AfY,4620
36
- fugue/dataframe/pandas_dataframe.py,sha256=JNkr24h5gir1Msttx3lNfzFjwMqjHbjDswNynpCiizo,9158
37
- fugue/dataframe/utils.py,sha256=Oid7L9-V-NjKnwnkN8Jg85E2OPMWkjkjNI5OoeKTnbs,9132
34
+ fugue/dataframe/function_wrapper.py,sha256=V1eQMOn27UroEYT7_YiwoEF0RjZYIM0zkD3vfaMAQFs,14813
35
+ fugue/dataframe/iterable_dataframe.py,sha256=TcOoNKa4jNbHbvAZ0XAhtMmGcioygIHPxI9budDtenQ,4758
36
+ fugue/dataframe/pandas_dataframe.py,sha256=0L0wYCGhD2BpQbruoT07Ox9iQM5YLHLNrcgzudc-yKs,11633
37
+ fugue/dataframe/utils.py,sha256=shN1eHYTnPhb38BHEpLlCdLSzX_qpoQ3-fsDgu1hCzQ,10840
38
38
  fugue/dataset/__init__.py,sha256=5f2CAJ4xst6Z2o9Q2e2twfDOGUw8ZJoE2ild4JEU2pg,112
39
39
  fugue/dataset/api.py,sha256=DacI4L2w5NJ-eZ6nFxNMqmReEnb0WUXswbjVp7BeErk,2794
40
40
  fugue/dataset/dataset.py,sha256=jWXZqy3msMPFFkhas2PYJEX55ZAI3gk3Txq5f4-Qya4,4759
41
41
  fugue/execution/__init__.py,sha256=iZGxAznZz9piM3k4gp0tln97MDIBxdliLyNbD-0Zc48,427
42
42
  fugue/execution/api.py,sha256=KsFOLGdWQMlXmlQ5JRgRsbUeB64qzTVHxSEaunjiojo,39818
43
- fugue/execution/execution_engine.py,sha256=n-mw0k0QtK8FQgP4w4_NrWJbg0XvrR4sFn70tSaOi0I,47735
43
+ fugue/execution/execution_engine.py,sha256=5lIlebgPK7q-Gf4bWt1t_Anq3MjPaJBpGWN9bbry1B4,47506
44
44
  fugue/execution/factory.py,sha256=5ICzfNh2QqqABuVyYLijY5-7LZgfRqczlaZN32p78bE,21003
45
- fugue/execution/native_execution_engine.py,sha256=Mm9BVC3dEMS3IWRZe4YvGKp6_mmW7dLmoLMK5HgAPcs,14408
45
+ fugue/execution/native_execution_engine.py,sha256=lbKd3uGh00cSTkIM8l-u8jmsMxFzV2PSUeJgudayxKs,14236
46
46
  fugue/extensions/__init__.py,sha256=y-uLKd6mZ8sZ_8-OdW6ELoBO_9IfC0gDmEbE_rMCvOA,599
47
47
  fugue/extensions/_utils.py,sha256=Bi3pYKy2Z6fG6_5BpwIWldxetassXpB4Zp8QamWB-wg,5173
48
48
  fugue/extensions/context.py,sha256=c_y2UttzzIFoQTOCV42VCdj2nqah33xYuBjbKNIOpx8,4262
@@ -72,7 +72,7 @@ fugue/sql/_visitors.py,sha256=2pc0J-AHJAiIexsKgNjcgrCGOyhC3_7rzonSgtjy--k,33844
72
72
  fugue/sql/api.py,sha256=l2I9CAy_W2oFFTct9fDPLyXF0LiDxQhMx5O8jBHTAxU,10050
73
73
  fugue/sql/workflow.py,sha256=S1pOhp0b0t6johFAJWmj6xUB7Ti5LQgNABpAzmLGjrQ,3010
74
74
  fugue/workflow/__init__.py,sha256=tXM_KYO8Q358W6qAVlwhIQIaYNRDgZtTubrIEX4QMgM,229
75
- fugue/workflow/_checkpoint.py,sha256=MTMyNCdWHf5UK8bRepfR2u8y3cEhO1RYIYq558ZlXzA,5715
75
+ fugue/workflow/_checkpoint.py,sha256=tt5Iv7c5ZStC0MD1inItksQ0GuK0ViniA3nvrgym-5c,5681
76
76
  fugue/workflow/_tasks.py,sha256=Zq_jXJO_VaF8DrWUuBiwO2Y3OVuhsiOQdzP4VBsp7Fo,11826
77
77
  fugue/workflow/_workflow_context.py,sha256=Wmp6n0lSrh2Gpslb5EaSX6BQNniKsvKn6SlhVkQ6ui0,2504
78
78
  fugue/workflow/api.py,sha256=uQoxPSCZ91-ST4vwuPWG7qioRGW4eo-Sgi3DdwtSL4k,12495
@@ -86,25 +86,25 @@ fugue_contrib/viz/__init__.py,sha256=osgZx63Br-yMZImyEfYf9MVzJNM2Cqqke_-WsuDmG5M
86
86
  fugue_contrib/viz/_ext.py,sha256=Lu_DlS5DcmrFz27fHcKTCkhKyknVWcfS5kzZVVuO9xM,1345
87
87
  fugue_dask/__init__.py,sha256=2CcJ0AsN-k_f7dZ-yAyYpaICfUMPfH3l0FvUJSBzTr0,161
88
88
  fugue_dask/_constants.py,sha256=35UmTVITk21GhRyRlbJOwPPdQsytM_p_2NytOXEay18,510
89
- fugue_dask/_io.py,sha256=9G516yM6zQvSC5_JA6qHb3LwBDmhWcxK5sjFHrQ81zo,6012
90
- fugue_dask/_utils.py,sha256=uFoJAL95rmnBgieU2hPyqxFZGvR6ZJgPRMq5TAJqIBI,8520
91
- fugue_dask/dataframe.py,sha256=TdKjxhoQpsU5CvBTgO2c5Zo_4LfyelR0IK8bPgjAxcg,10218
92
- fugue_dask/execution_engine.py,sha256=XJp6wrdkaNh5pOpwt-Hjoa2sxgCOgusFRWrcqoCcaNM,21153
89
+ fugue_dask/_io.py,sha256=HmL3Q2lRSptX1-GwiB3MN2VpjTRfmVKD8TDZkhS4x5c,5818
90
+ fugue_dask/_utils.py,sha256=n70N3wPPMz13Jh0GWJM3Je-TCYpU36yGP_YCwIHqUrc,8908
91
+ fugue_dask/dataframe.py,sha256=MuG9TqCND7qI66lPvxzuomfE7yA4sW7DjrvbyvE6XEU,13471
92
+ fugue_dask/execution_engine.py,sha256=PAClUP9lCdn2Aajt2AsoFOsgO-95WcdRDKkjNSbVbzA,20980
93
93
  fugue_dask/ibis_engine.py,sha256=kQdaG_KlZZ2AjtYETNCdTJOgtwI_eH0aGzLaAiIBbRI,2120
94
94
  fugue_dask/registry.py,sha256=7UTg_eie7zKlHYKMCyOo0TNn5y2TiIjE8kiS2PruHFc,2200
95
95
  fugue_duckdb/__init__.py,sha256=nSNv-fxBAKD6W23EbMeV4dVRIaSTqr9DzQUWuVOES8s,379
96
- fugue_duckdb/_io.py,sha256=Sq228unVnroYTq4GX-Wnv22SLHC9Ji-aWgiqrfdu81w,8880
96
+ fugue_duckdb/_io.py,sha256=E35_GoD1uGuuAMOY4H8E2j-UazdAgTmLp4lLWqJrNsE,8437
97
97
  fugue_duckdb/_utils.py,sha256=ElKbHUyn5fWSPGXsK57iqMzcqKtCf0c8pBVBYGe5Ql4,5020
98
98
  fugue_duckdb/dask.py,sha256=agoLzeB7Swxj2kVWfmXFbWD1NS2lbbTlnrjSkR8kKWY,5014
99
- fugue_duckdb/dataframe.py,sha256=vNZF2BC1sJpW3P5TVFTpU6C1Ddam81jPC_4i8kBuEpo,6512
100
- fugue_duckdb/execution_engine.py,sha256=fkkQb4Eh0m7SwKrTplVk2oQalLkNoj3CW0R12g01ofk,20536
99
+ fugue_duckdb/dataframe.py,sha256=LRfTv7Y46wMM_IDYSP1R-5OXuHuBg8GHjPGFFt8u7l0,8444
100
+ fugue_duckdb/execution_engine.py,sha256=IZDmSAtOMJGvulTStxjTmsqJyI5QRNyxBgSMlFMSrBI,20389
101
101
  fugue_duckdb/ibis_engine.py,sha256=MrypeABozqwetKOpqtrmWvCJX2QPfBXhbSEhvK9vqmI,1990
102
102
  fugue_duckdb/registry.py,sha256=Dj0Tng1cXVT6Q7t-KxOky2k1dD9xSBjYGQmI26UgZPo,3095
103
103
  fugue_ibis/__init__.py,sha256=PcUt66KlLyGGicad7asq5j2U567_fhR0HzvWQBhV1VM,362
104
104
  fugue_ibis/_compat.py,sha256=zKdTaTfuC02eUIzZPkcd7oObnVBi_X5mQjQf7SDme3Y,246
105
105
  fugue_ibis/_utils.py,sha256=BUL5swA5FE4eQu0t5Z17hZVu9a2MFfxlFH6Ymy9xifg,6607
106
- fugue_ibis/dataframe.py,sha256=olGfVYY9n5wwPOZojS30Fs3XEOMlenCzX8fuR2WPaq4,7295
107
- fugue_ibis/execution_engine.py,sha256=p5zy0IBXiJgLi67RBHCRcHgZsaJMANdNSpUxz0k_6C0,18453
106
+ fugue_ibis/dataframe.py,sha256=0Fb1vJjwEeffgoUCDfDGIMuSFaPgUJqcB-JqJOAALfs,7789
107
+ fugue_ibis/execution_engine.py,sha256=0GIjjMmitCKhjasAKFiFUCCUBNdxAiU0b61RsmFyhIk,18355
108
108
  fugue_ibis/extensions.py,sha256=H8l-SPfoqLuUoILtOuL2nccOpoL83zHeSoIhoqjtWQM,6905
109
109
  fugue_ibis/execution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
110
110
  fugue_ibis/execution/ibis_engine.py,sha256=-HdPnIFWD83n5WITdzJiu4attH7GOcO041wkT5Y5ChA,1499
@@ -117,47 +117,49 @@ fugue_notebook/nbextension/description.yaml,sha256=CsXgx9CSLbAlO4Z1kvX9ejYA_TImP
117
117
  fugue_notebook/nbextension/main.js,sha256=Px2tQuBCNGEZOEBKsnfVruFEg-AxK7Tj0dY84ktub_U,3709
118
118
  fugue_polars/__init__.py,sha256=NDkjlbLhHPTjUaCAw6mAwIqeK3HSeh-z88s9dqmwheQ,61
119
119
  fugue_polars/_utils.py,sha256=7rGGWgB1-VqFwh4PcBLYk_5VNjd8FNOS4TDFyDVz2sg,159
120
- fugue_polars/polars_dataframe.py,sha256=Ll4ZUuRhAETWtmSf87KsdUCqZPiexFqy4FiPkvWQkN0,7348
120
+ fugue_polars/polars_dataframe.py,sha256=8LQ0IB-JFFdjW2ltDzq8DfIbUC_jjjDr1YM29usJag0,8831
121
121
  fugue_polars/registry.py,sha256=gd6qQ-OxYtTAQFyvYbLDPXmSvCR-LW6n5K5ylgMY_7A,2950
122
122
  fugue_ray/__init__.py,sha256=HzEHfG2mpc0ugf3nf1Pdy15Bhg35K6maZpYejn1aoyI,119
123
123
  fugue_ray/_constants.py,sha256=vu5l1w-Wi-2V_nm0HLXKOYhh5HdWRCc5yQktO2XzhOg,569
124
- fugue_ray/dataframe.py,sha256=vyVShPnNtMef_KBsVP3iTHcssA_fm33-Y077c7S3J-A,10612
124
+ fugue_ray/dataframe.py,sha256=7asw2qf9vm6vLBSzqghm9pUcNAppJOz5CkT7XyR0S5g,12514
125
125
  fugue_ray/execution_engine.py,sha256=NT_mnacijp1zskFbtganUwA3JNRPU-FNNvJswA6U_Yg,12607
126
126
  fugue_ray/registry.py,sha256=xJRAhbwNrg695EwghQDnVtTKi4YkqZ0_61BD4OAblSA,1685
127
127
  fugue_ray/_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
128
128
  fugue_ray/_utils/cluster.py,sha256=3T3Gyra6lAHlzktta-Ro35j6YZQfH6fNrj2hC5ATF9k,621
129
129
  fugue_ray/_utils/dataframe.py,sha256=_EadzS4rPom1A_cF0pqoPlwrNYZTfTwcyyu86_fFsqU,4400
130
- fugue_ray/_utils/io.py,sha256=SFTU4qXubGEmO5IGZA5yHy8Hu4b9aFZ9-eTU4Qs-NsQ,8757
130
+ fugue_ray/_utils/io.py,sha256=4FfPS2DMeIHvbzGoJ_iPvwwVr7lZHXRoJZxceNZ4EHQ,8647
131
131
  fugue_spark/__init__.py,sha256=rvrMpFs9socMgyH_58gLbnAqmirBf5oidXoO4cekW6U,165
132
132
  fugue_spark/_constants.py,sha256=K2uLQfjvMxXk75K-7_Wn47Alpwq5rW57BtECAUrOeqA,177
133
- fugue_spark/dataframe.py,sha256=HJHMDVLaT-7QZ8mhMcvpLDRiKuFjtw4XtLm1N2QskKs,9704
134
- fugue_spark/execution_engine.py,sha256=rqgY9U1bpjh0GFNyNkuPcI7iV0xeipadURhNIir4w08,33147
133
+ fugue_spark/dataframe.py,sha256=lYa8FizM3p_lsKYFR49FazkVZMJKyi2LABKTpP5YBLo,12006
134
+ fugue_spark/execution_engine.py,sha256=KPmBtH4zioXdWsvnPow4fOPQh8Yj0cn6yCJyKdbT544,33023
135
135
  fugue_spark/ibis_engine.py,sha256=Yl5xxwROo1idcD2hFaylaI1IpmBUgbvOZRWtcrE0Zjo,1697
136
136
  fugue_spark/registry.py,sha256=kyIMk6dAiKRSKCHawQKyXu9DhZ24T6j3gL57TiOAZ8c,4162
137
137
  fugue_spark/_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
138
138
  fugue_spark/_utils/convert.py,sha256=eRWkDYA4UO-FQu-2y4O80WEdawx7X_rIrWg55AlOiRc,10007
139
- fugue_spark/_utils/io.py,sha256=0ndQ70YlirPwGKjh5IDN6IdJxD26BnPpMonRob4dxII,5668
139
+ fugue_spark/_utils/io.py,sha256=OdUezKpB29Lx9aUS2k9x0xUAGZrmgMZyQYGPEeHk7rQ,5574
140
140
  fugue_spark/_utils/misc.py,sha256=o8dZmXOHnA7D_ps37vgGXTPTiSEG9LQzPKq7l-MG-qM,860
141
141
  fugue_spark/_utils/partition.py,sha256=iaesyO5f4uXhj1W-p91cD5ecPiGlu0bzh8gl2ce2Uvg,3618
142
142
  fugue_sql/__init__.py,sha256=Cmr7w0Efr7PzoXdQzdJfc4Dgqd69qKqcHZZodENq7EU,287
143
143
  fugue_sql/exceptions.py,sha256=ltS0MC8gMnVVrJbQiOZ0kRUWvVQ2LTx33dCW3ugqtb0,260
144
144
  fugue_test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
145
145
  fugue_test/bag_suite.py,sha256=WbDCFjuAHYoJh4GXSPiSJxOoOwE1VMtYpJ3lQrsUK-Y,2483
146
- fugue_test/builtin_suite.py,sha256=o8aMZTKa74nKBmcUTTBbliTJMtNbsXE9SPKZopS504o,78400
147
- fugue_test/dataframe_suite.py,sha256=mOr_x94H-Ylp0lJ-KBwHXJu-Q-qesqY3PzJxR9LI_Ko,18323
148
- fugue_test/execution_suite.py,sha256=FI6UmwBvdoT1jkJRBqJT_Q0IDehFryvv00UL6jjxyAk,47689
146
+ fugue_test/builtin_suite.py,sha256=3uSY484Jl2985UoJravD4C-SlKBH0WwTWFobp4Pqgzg,78399
147
+ fugue_test/dataframe_suite.py,sha256=LgB931CkASbGOrRQ9j92DGk9wPb__FoNusOk-HeqU9E,19165
148
+ fugue_test/execution_suite.py,sha256=ClZUYt2R560LN4DZM_OP9cA5jaHmz3-u_BC3A0C24fQ,47472
149
149
  fugue_test/ibis_suite.py,sha256=Dk4AHVD00RcFsNm9VvJ4_4LOyFdGX30OnAtpO2SPruE,3529
150
150
  fugue_test/plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
151
151
  fugue_test/plugins/dask/__init__.py,sha256=LQVyNgGRvZrKUrNNV1z1X1GyIL3qJoxvNjFfpFzNVCc,55
152
152
  fugue_test/plugins/dask/fixtures.py,sha256=uf5gkO30L5-LvxpEpBjG4_bNUrpkemHvyVPxDHgMSGM,354
153
153
  fugue_test/plugins/duckdb/__init__.py,sha256=WXtNYQpbO0JScPpIA3QREv8cwOZP2GDOgGOtJKgpTVM,61
154
154
  fugue_test/plugins/duckdb/fixtures.py,sha256=UxQbIMRbSrTZ3pgCmKZgd5wd1YvnVrqLSUPaO8UYrSE,165
155
+ fugue_test/plugins/misc/__init__.py,sha256=0SZvyo0xlw5NDbJly4yjaNDqL9M4D2Jsg33HCWE40q8,49
156
+ fugue_test/plugins/misc/fixtures.py,sha256=GrD9WTTtcIDCWLHn-ToVv8pUiUCGCSczgs9bodWKo7c,353
155
157
  fugue_test/plugins/ray/__init__.py,sha256=nyKGW6xgTXtMhSs7yjgFNKO7mVboCNg63Bvdf39fO_I,55
156
158
  fugue_test/plugins/ray/fixtures.py,sha256=hZkvuo0AcD63XJl5JUroc9tm2LWHUPszg2zzY6FCSao,141
157
159
  fugue_version/__init__.py,sha256=vTwvdJOZi8jZb9U-Em7-d50qNDNPS2z51IXqRoojeNM,22
158
- fugue-0.8.7.dev5.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
159
- fugue-0.8.7.dev5.dist-info/METADATA,sha256=yQYxW_TTsinAtSyHUUfLVxrFlyc9x5FU-lfRH-77wfA,17860
160
- fugue-0.8.7.dev5.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
161
- fugue-0.8.7.dev5.dist-info/entry_points.txt,sha256=F4V76epxLiTYZgyacpmxJzNgfGqy2mUnIIG-PMlvBo8,536
162
- fugue-0.8.7.dev5.dist-info/top_level.txt,sha256=y1eCfzGdQ1_RkgcShcfbvXs-bopD3DwJcIOxP9EFXno,140
163
- fugue-0.8.7.dev5.dist-info/RECORD,,
160
+ fugue-0.8.7.dev7.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
161
+ fugue-0.8.7.dev7.dist-info/METADATA,sha256=nSp1i8apniEEe6U09_5RA8K89P40c7M5Gn9l6ofLTHQ,17860
162
+ fugue-0.8.7.dev7.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92
163
+ fugue-0.8.7.dev7.dist-info/entry_points.txt,sha256=Xrl3ISyVKAFIPn1klqeGsL9DinzoYqfqBkOT4qAVBNA,578
164
+ fugue-0.8.7.dev7.dist-info/top_level.txt,sha256=y1eCfzGdQ1_RkgcShcfbvXs-bopD3DwJcIOxP9EFXno,140
165
+ fugue-0.8.7.dev7.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.41.2)
2
+ Generator: bdist_wheel (0.41.3)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -2,15 +2,16 @@
2
2
  dask = fugue_dask.registry [dask]
3
3
  dask_ibis = fugue_dask.ibis_engine [dask,ibis]
4
4
  duckdb = fugue_duckdb.registry [duckdb]
5
- duckdb_ibis = fugue_duckdb.ibis_engine [duckdb,ibis]
5
+ duckdb_ibis = fugue_duckdb.ibis_engine [ibis,duckdb]
6
6
  ibis = fugue_ibis [ibis]
7
7
  polars = fugue_polars.registry [polars]
8
8
  ray = fugue_ray.registry [ray]
9
9
  spark = fugue_spark.registry [spark]
10
- spark_ibis = fugue_spark.ibis_engine [ibis,spark]
10
+ spark_ibis = fugue_spark.ibis_engine [spark,ibis]
11
11
 
12
12
  [pytest11]
13
13
  fugue_test_dask = fugue_test.plugins.dask [dask]
14
14
  fugue_test_duckdb = fugue_test.plugins.duckdb [duckdb]
15
+ fugue_test_misc = fugue_test.plugins.misc
15
16
  fugue_test_ray = fugue_test.plugins.ray [ray]
16
17