datachain 0.11.0__py3-none-any.whl → 0.12.0__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.

Potentially problematic release.


This version of datachain might be problematic. Click here for more details.

Files changed (39) hide show
  1. datachain/catalog/catalog.py +33 -5
  2. datachain/catalog/loader.py +19 -13
  3. datachain/cli/__init__.py +3 -1
  4. datachain/cli/commands/show.py +12 -1
  5. datachain/cli/parser/studio.py +13 -1
  6. datachain/cli/parser/utils.py +6 -0
  7. datachain/client/fsspec.py +12 -16
  8. datachain/client/hf.py +36 -14
  9. datachain/client/local.py +1 -4
  10. datachain/data_storage/warehouse.py +3 -8
  11. datachain/dataset.py +8 -0
  12. datachain/error.py +0 -12
  13. datachain/fs/utils.py +30 -0
  14. datachain/func/__init__.py +5 -0
  15. datachain/func/func.py +2 -1
  16. datachain/lib/data_model.py +6 -0
  17. datachain/lib/dc.py +114 -28
  18. datachain/lib/file.py +100 -25
  19. datachain/lib/image.py +30 -6
  20. datachain/lib/listing.py +21 -39
  21. datachain/lib/signal_schema.py +194 -15
  22. datachain/lib/video.py +7 -5
  23. datachain/model/bbox.py +209 -58
  24. datachain/model/pose.py +49 -37
  25. datachain/model/segment.py +22 -18
  26. datachain/model/ultralytics/bbox.py +9 -9
  27. datachain/model/ultralytics/pose.py +7 -7
  28. datachain/model/ultralytics/segment.py +7 -7
  29. datachain/model/utils.py +191 -0
  30. datachain/nodes_thread_pool.py +32 -11
  31. datachain/query/dataset.py +4 -2
  32. datachain/studio.py +8 -6
  33. datachain/utils.py +3 -16
  34. {datachain-0.11.0.dist-info → datachain-0.12.0.dist-info}/METADATA +6 -4
  35. {datachain-0.11.0.dist-info → datachain-0.12.0.dist-info}/RECORD +39 -37
  36. {datachain-0.11.0.dist-info → datachain-0.12.0.dist-info}/WHEEL +1 -1
  37. {datachain-0.11.0.dist-info → datachain-0.12.0.dist-info}/LICENSE +0 -0
  38. {datachain-0.11.0.dist-info → datachain-0.12.0.dist-info}/entry_points.txt +0 -0
  39. {datachain-0.11.0.dist-info → datachain-0.12.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,191 @@
1
+ from collections.abc import Sequence
2
+ from typing import Literal
3
+
4
+ BBoxType = Literal["albumentations", "coco", "voc", "yolo"]
5
+
6
+
7
+ def validate_bbox(coords: Sequence[float], *types: type) -> None:
8
+ """Validate the bounding box coordinates."""
9
+ if not isinstance(coords, (list, tuple)):
10
+ raise TypeError(
11
+ f"Invalid bounding box coordinates: {coords}, should be a list or tuple"
12
+ )
13
+ if len(coords) != 4:
14
+ raise ValueError(
15
+ f"Invalid bounding box coordinates: {coords}, should have 4 values"
16
+ )
17
+ if any(not isinstance(c, types) for c in coords):
18
+ raise ValueError(
19
+ f"Invalid bounding box coordinates: {coords}, should be {types}"
20
+ )
21
+
22
+
23
+ def convert_bbox(
24
+ coords: Sequence[float],
25
+ img_size: Sequence[int],
26
+ source: BBoxType,
27
+ target: BBoxType,
28
+ ) -> list[float]:
29
+ """
30
+ Convert the bounding box coordinates between different formats.
31
+
32
+ Supported formats: "albumentations", "coco", "voc", "yolo".
33
+
34
+ Albumentations format represents bounding boxes as [x_min, y_min, x_max, y_max],
35
+ where:
36
+ - (x_min, y_min) are the normalized coordinates of the top-left corner.
37
+ - (x_max, y_max) are the normalized coordinates of the bottom-right corner.
38
+
39
+ COCO format represents bounding boxes as [x_min, y_min, width, height], where:
40
+ - (x_min, y_min) are the pixel coordinates of the top-left corner.
41
+ - width and height define the size of the bounding box in pixels.
42
+
43
+ PASCAL VOC format represents bounding boxes as [x_min, y_min, x_max, y_max], where:
44
+ - (x_min, y_min) are the pixel coordinates of the top-left corner.
45
+ - (x_max, y_max) are the pixel coordinates of the bottom-right corner.
46
+
47
+ YOLO format represents bounding boxes as [x_center, y_center, width, height], where:
48
+ - (x_center, y_center) are the normalized coordinates of the box center.
49
+ - width and height normalized values define the size of the bounding box.
50
+
51
+ Normalized coordinates are floats between 0 and 1, representing the
52
+ relative position of the pixels in the image.
53
+
54
+ Args:
55
+ coords (Sequence[float]): The bounding box coordinates to convert.
56
+ img_size (Sequence[int]): The reference image size (width, height).
57
+ source (str): The source bounding box format.
58
+ target (str): The target bounding box format.
59
+
60
+ Returns:
61
+ list[float]: The bounding box coordinates in the target format.
62
+ """
63
+ if source == "albumentations":
64
+ return [
65
+ round(c, 4) for c in convert_albumentations_bbox(coords, img_size, target)
66
+ ]
67
+ if source == "coco":
68
+ return [round(c, 4) for c in convert_coco_bbox(coords, img_size, target)]
69
+ if source == "voc":
70
+ return [round(c, 4) for c in convert_voc_bbox(coords, img_size, target)]
71
+ if source == "yolo":
72
+ return [round(c, 4) for c in convert_yolo_bbox(coords, img_size, target)]
73
+ raise ValueError(f"Unsupported source format: {source}")
74
+
75
+
76
+ def convert_albumentations_bbox(
77
+ coords: Sequence[float],
78
+ img_size: Sequence[int],
79
+ target: BBoxType,
80
+ ) -> list[float]:
81
+ """Convert the Albumentations bounding box coordinates to other formats."""
82
+ if target == "albumentations":
83
+ return list(coords)
84
+ if target == "coco":
85
+ return [
86
+ coords[0] * img_size[0],
87
+ coords[1] * img_size[1],
88
+ (coords[2] - coords[0]) * img_size[0],
89
+ (coords[3] - coords[1]) * img_size[1],
90
+ ]
91
+ if target == "voc":
92
+ return [coords[i] * img_size[i % 2] for i in range(4)]
93
+ if target == "yolo":
94
+ return [
95
+ (coords[0] + coords[2]) / 2,
96
+ (coords[1] + coords[3]) / 2,
97
+ coords[2] - coords[0],
98
+ coords[3] - coords[1],
99
+ ]
100
+ raise ValueError(f"Unsupported target format: {target}")
101
+
102
+
103
+ def convert_coco_bbox(
104
+ coords: Sequence[float],
105
+ img_size: Sequence[int],
106
+ target: BBoxType,
107
+ ) -> list[float]:
108
+ """Convert the COCO bounding box coordinates to other formats."""
109
+ if target == "albumentations":
110
+ return [
111
+ coords[0] / img_size[0],
112
+ coords[1] / img_size[1],
113
+ (coords[0] + coords[2]) / img_size[0],
114
+ (coords[1] + coords[3]) / img_size[1],
115
+ ]
116
+ if target == "coco":
117
+ return list(coords)
118
+ if target == "voc":
119
+ return [coords[0], coords[1], coords[0] + coords[2], coords[1] + coords[3]]
120
+ if target == "yolo":
121
+ return [
122
+ (coords[0] + coords[2] / 2) / img_size[0],
123
+ (coords[1] + coords[3] / 2) / img_size[1],
124
+ coords[2] / img_size[0],
125
+ coords[3] / img_size[1],
126
+ ]
127
+ raise ValueError(f"Unsupported target format: {target}")
128
+
129
+
130
+ def convert_voc_bbox(
131
+ coords: Sequence[float],
132
+ img_size: Sequence[int],
133
+ target: BBoxType,
134
+ ) -> list[float]:
135
+ """Convert the PASCAL VOC bounding box coordinates to other formats."""
136
+ if target == "albumentations":
137
+ return [
138
+ coords[0] / img_size[0],
139
+ coords[1] / img_size[1],
140
+ coords[2] / img_size[0],
141
+ coords[3] / img_size[1],
142
+ ]
143
+ if target == "coco":
144
+ return [
145
+ coords[0],
146
+ coords[1],
147
+ coords[2] - coords[0],
148
+ coords[3] - coords[1],
149
+ ]
150
+ if target == "voc":
151
+ return list(coords)
152
+ if target == "yolo":
153
+ return [
154
+ (coords[0] + coords[2]) / 2 / img_size[0],
155
+ (coords[1] + coords[3]) / 2 / img_size[1],
156
+ (coords[2] - coords[0]) / img_size[0],
157
+ (coords[3] - coords[1]) / img_size[1],
158
+ ]
159
+ raise ValueError(f"Unsupported target format: {target}")
160
+
161
+
162
+ def convert_yolo_bbox(
163
+ coords: Sequence[float],
164
+ img_size: Sequence[int],
165
+ target: BBoxType,
166
+ ) -> list[float]:
167
+ """Convert the YOLO bounding box coordinates to other formats."""
168
+ if target == "albumentations":
169
+ return [
170
+ coords[0] - coords[2] / 2,
171
+ coords[1] - coords[3] / 2,
172
+ coords[0] + coords[2] / 2,
173
+ coords[1] + coords[3] / 2,
174
+ ]
175
+ if target == "coco":
176
+ return [
177
+ (coords[0] - coords[2] / 2) * img_size[0],
178
+ (coords[1] - coords[3] / 2) * img_size[1],
179
+ coords[2] * img_size[0],
180
+ coords[3] * img_size[1],
181
+ ]
182
+ if target == "voc":
183
+ return [
184
+ (coords[0] - coords[2] / 2) * img_size[0],
185
+ (coords[1] - coords[3] / 2) * img_size[1],
186
+ (coords[0] + coords[2] / 2) * img_size[0],
187
+ (coords[1] + coords[3] / 2) * img_size[1],
188
+ ]
189
+ if target == "yolo":
190
+ return list(coords)
191
+ raise ValueError(f"Unsupported target format: {target}")
@@ -57,6 +57,9 @@ class NodesThreadPool(ABC):
57
57
  self._max_threads = max_threads
58
58
  self._thread_counter = 0
59
59
  self._thread_lock = threading.Lock()
60
+ self.tasks = set()
61
+ self.canceled = False
62
+ self.th_pool = None
60
63
 
61
64
  def run(
62
65
  self,
@@ -64,37 +67,55 @@ class NodesThreadPool(ABC):
64
67
  progress_bar=None,
65
68
  ):
66
69
  results = []
67
- with concurrent.futures.ThreadPoolExecutor(self._max_threads) as th_pool:
68
- tasks = set()
70
+ self.th_pool = concurrent.futures.ThreadPoolExecutor(self._max_threads)
71
+ try:
69
72
  self._thread_counter = 0
70
73
  for chunk in chunk_gen:
71
- while len(tasks) >= self._max_threads:
74
+ if self.canceled:
75
+ break
76
+ while len(self.tasks) >= self._max_threads:
72
77
  done, _ = concurrent.futures.wait(
73
- tasks, timeout=1, return_when="FIRST_COMPLETED"
78
+ self.tasks, timeout=1, return_when="FIRST_COMPLETED"
74
79
  )
75
80
  self.done_task(done)
76
81
 
77
- tasks = tasks - done
82
+ self.tasks = self.tasks - done
78
83
  self.update_progress_bar(progress_bar)
79
84
 
80
- tasks.add(th_pool.submit(self.do_task, chunk))
85
+ self.tasks.add(self.th_pool.submit(self.do_task, chunk))
81
86
  self.update_progress_bar(progress_bar)
82
87
 
83
- while tasks:
88
+ while self.tasks:
89
+ if self.canceled:
90
+ break
84
91
  done, _ = concurrent.futures.wait(
85
- tasks, timeout=1, return_when="FIRST_COMPLETED"
92
+ self.tasks, timeout=1, return_when="FIRST_COMPLETED"
86
93
  )
87
94
  task_results = self.done_task(done)
88
95
  if task_results:
89
96
  results.extend(task_results)
90
97
 
91
- tasks = tasks - done
98
+ self.tasks = self.tasks - done
92
99
  self.update_progress_bar(progress_bar)
93
-
94
- th_pool.shutdown()
100
+ except:
101
+ self.cancel_all()
102
+ raise
103
+ else:
104
+ self.th_pool.shutdown()
95
105
 
96
106
  return results
97
107
 
108
+ def cancel_all(self):
109
+ self.cancel = True
110
+ # Canceling tasks just in case any of them is scheduled to run.
111
+ # Note that running tasks cannot be canceled, instead we will wait for
112
+ # them to finish when shutting down thread loop executor by calling
113
+ # shutdown() method.
114
+ for task in self.tasks:
115
+ task.cancel()
116
+ if self.th_pool:
117
+ self.th_pool.shutdown() # this will wait for running tasks to finish
118
+
98
119
  def update_progress_bar(self, progress_bar):
99
120
  if progress_bar is not None:
100
121
  with self._thread_lock:
@@ -22,7 +22,6 @@ from typing import (
22
22
  )
23
23
 
24
24
  import attrs
25
- import psutil
26
25
  import sqlalchemy
27
26
  import sqlalchemy as sa
28
27
  from attrs import frozen
@@ -52,7 +51,6 @@ from datachain.lib.udf import UDFAdapter, _get_cache
52
51
  from datachain.progress import CombinedDownloadCallback, TqdmCombinedDownloadCallback
53
52
  from datachain.query.schema import C, UDFParamSpec, normalize_param
54
53
  from datachain.query.session import Session
55
- from datachain.remote.studio import is_token_set
56
54
  from datachain.sql.functions.random import rand
57
55
  from datachain.utils import (
58
56
  batched,
@@ -333,6 +331,8 @@ def process_udf_outputs(
333
331
  batch_size: int = INSERT_BATCH_SIZE,
334
332
  cb: Callback = DEFAULT_CALLBACK,
335
333
  ) -> None:
334
+ import psutil
335
+
336
336
  rows: list[UDFResult] = []
337
337
  # Optimization: Compute row types once, rather than for every row.
338
338
  udf_col_types = get_udf_col_types(warehouse, udf)
@@ -1087,6 +1087,8 @@ class DatasetQuery:
1087
1087
  in_memory: bool = False,
1088
1088
  fallback_to_studio: bool = True,
1089
1089
  ) -> None:
1090
+ from datachain.remote.studio import is_token_set
1091
+
1090
1092
  self.session = Session.get(session, catalog=catalog, in_memory=in_memory)
1091
1093
  self.catalog = catalog or self.session.catalog
1092
1094
  self.steps: list[Step] = []
datachain/studio.py CHANGED
@@ -57,7 +57,7 @@ def process_auth_cli_args(args: "Namespace"):
57
57
  if args.cmd == "login":
58
58
  return login(args)
59
59
  if args.cmd == "logout":
60
- return logout()
60
+ return logout(args.local)
61
61
  if args.cmd == "token":
62
62
  return token()
63
63
 
@@ -110,13 +110,15 @@ def login(args: "Namespace"):
110
110
  except StudioAuthError as exc:
111
111
  raise DataChainError(f"Failed to authenticate with Studio: {exc}") from exc
112
112
 
113
- config_path = save_config(hostname, access_token)
113
+ level = ConfigLevel.LOCAL if args.local else ConfigLevel.GLOBAL
114
+ config_path = save_config(hostname, access_token, level=level)
114
115
  print(f"Authentication complete. Saved token to {config_path}.")
115
116
  return 0
116
117
 
117
118
 
118
- def logout():
119
- with Config(ConfigLevel.GLOBAL).edit() as conf:
119
+ def logout(local: bool = False):
120
+ level = ConfigLevel.LOCAL if local else ConfigLevel.GLOBAL
121
+ with Config(level).edit() as conf:
120
122
  token = conf.get("studio", {}).get("token")
121
123
  if not token:
122
124
  raise DataChainError(
@@ -209,8 +211,8 @@ def remove_studio_dataset(
209
211
  print(f"Dataset '{name}' removed from Studio")
210
212
 
211
213
 
212
- def save_config(hostname, token):
213
- config = Config(ConfigLevel.GLOBAL)
214
+ def save_config(hostname, token, level=ConfigLevel.GLOBAL):
215
+ config = Config(level)
214
216
  with config.edit() as conf:
215
217
  studio_conf = conf.get("studio", {})
216
218
  studio_conf["url"] = hostname
datachain/utils.py CHANGED
@@ -6,7 +6,6 @@ import os
6
6
  import os.path as osp
7
7
  import random
8
8
  import re
9
- import stat
10
9
  import sys
11
10
  import time
12
11
  from collections.abc import Iterable, Iterator, Sequence
@@ -193,14 +192,6 @@ def suffix_to_number(num_str: str) -> int:
193
192
  raise ValueError(f"Invalid number/suffix for: {num_str}") from None
194
193
 
195
194
 
196
- def force_create_dir(name):
197
- if not os.path.exists(name):
198
- os.mkdir(name)
199
- elif not os.path.isdir(name):
200
- os.remove(name)
201
- os.mkdir(name)
202
-
203
-
204
195
  def datachain_paths_join(source_path: str, file_paths: Iterable[str]) -> Iterable[str]:
205
196
  source_parts = source_path.rstrip("/").split("/")
206
197
  if glob.has_magic(source_parts[-1]):
@@ -210,13 +201,6 @@ def datachain_paths_join(source_path: str, file_paths: Iterable[str]) -> Iterabl
210
201
  return (f"{source_stripped}/{path.lstrip('/')}" for path in file_paths)
211
202
 
212
203
 
213
- # From: https://docs.python.org/3/library/shutil.html#rmtree-example
214
- def remove_readonly(func, path, _):
215
- "Clear the readonly bit and reattempt the removal"
216
- os.chmod(path, stat.S_IWRITE)
217
- func(path)
218
-
219
-
220
204
  def sql_escape_like(search: str, escape: str = "\\") -> str:
221
205
  return (
222
206
  search.replace(escape, escape * 2)
@@ -362,6 +346,7 @@ def show_records(
362
346
  records: Optional[list[dict]],
363
347
  collapse_columns: bool = False,
364
348
  system_columns: bool = False,
349
+ hidden_fields: Optional[list[str]] = None,
365
350
  ) -> None:
366
351
  import pandas as pd
367
352
 
@@ -369,6 +354,8 @@ def show_records(
369
354
  return
370
355
 
371
356
  df = pd.DataFrame.from_records(records)
357
+ if hidden_fields:
358
+ df = df.drop(columns=hidden_fields, errors="ignore")
372
359
  return show_df(df, collapse_columns=collapse_columns, system_columns=system_columns)
373
360
 
374
361
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: datachain
3
- Version: 0.11.0
3
+ Version: 0.12.0
4
4
  Summary: Wrangle unstructured AI data at scale
5
5
  Author-email: Dmitry Petrov <support@dvc.org>
6
6
  License: Apache-2.0
@@ -12,6 +12,7 @@ Classifier: Programming Language :: Python :: 3.9
12
12
  Classifier: Programming Language :: Python :: 3.10
13
13
  Classifier: Programming Language :: Python :: 3.11
14
14
  Classifier: Programming Language :: Python :: 3.12
15
+ Classifier: Programming Language :: Python :: 3.13
15
16
  Classifier: Development Status :: 2 - Pre-Alpha
16
17
  Requires-Python: >=3.9
17
18
  Description-Content-Type: text/x-rst
@@ -70,10 +71,10 @@ Requires-Dist: usearch; extra == "vector"
70
71
  Provides-Extra: hf
71
72
  Requires-Dist: numba>=0.60.0; extra == "hf"
72
73
  Requires-Dist: datasets[audio,vision]>=2.21.0; extra == "hf"
74
+ Requires-Dist: fsspec>=2024.12.0; extra == "hf"
73
75
  Provides-Extra: video
74
- Requires-Dist: av<14; extra == "video"
75
76
  Requires-Dist: ffmpeg-python; extra == "video"
76
- Requires-Dist: imageio[ffmpeg]; extra == "video"
77
+ Requires-Dist: imageio[ffmpeg,pyav]>=2.37.0; extra == "video"
77
78
  Requires-Dist: opencv-python; extra == "video"
78
79
  Provides-Extra: tests
79
80
  Requires-Dist: datachain[hf,remote,torch,vector,video]; extra == "tests"
@@ -90,6 +91,7 @@ Requires-Dist: hypothesis; extra == "tests"
90
91
  Requires-Dist: aiotools>=1.7.0; extra == "tests"
91
92
  Requires-Dist: requests-mock; extra == "tests"
92
93
  Requires-Dist: scipy; extra == "tests"
94
+ Requires-Dist: ultralytics; extra == "tests"
93
95
  Provides-Extra: dev
94
96
  Requires-Dist: datachain[docs,tests]; extra == "dev"
95
97
  Requires-Dist: mypy==1.15.0; extra == "dev"
@@ -103,7 +105,7 @@ Requires-Dist: datachain[tests]; extra == "examples"
103
105
  Requires-Dist: defusedxml; extra == "examples"
104
106
  Requires-Dist: accelerate; extra == "examples"
105
107
  Requires-Dist: huggingface_hub[hf_transfer]; extra == "examples"
106
- Requires-Dist: ultralytics==8.3.78; extra == "examples"
108
+ Requires-Dist: ultralytics; extra == "examples"
107
109
  Requires-Dist: open_clip_torch; extra == "examples"
108
110
 
109
111
  ================
@@ -3,24 +3,24 @@ datachain/__main__.py,sha256=hG3Y4ARGEqe1AWwNMd259rBlqtphx1Wk39YbueQ0yV8,91
3
3
  datachain/asyn.py,sha256=RH_jFwJcTXxhEFomaI9yL6S3Onau6NZ6FSKfKFGtrJE,9689
4
4
  datachain/cache.py,sha256=yQblPhOh_Mq74Ma7xT1CL1idLJ0HgrQxpGVYvRy_9Eg,3623
5
5
  datachain/config.py,sha256=g8qbNV0vW2VEKpX-dGZ9pAn0DAz6G2ZFcr7SAV3PoSM,4272
6
- datachain/dataset.py,sha256=e-iU2cOEYpmETN1Tu0d5-Mubad5dOWmgVhi4rmuOr6k,19067
7
- datachain/error.py,sha256=P1VI-etraA08ZrXHUEg1-xnOa2MkONd7vV0qA5uxBig,1314
6
+ datachain/dataset.py,sha256=ZfgsGlddTXsSqCohNSRSChdH6Jjw7wrkso1Am166k-M,19391
7
+ datachain/error.py,sha256=bxAAL32lSeMgzsQDEHbGTGORj-mPzzpCRvWDPueJNN4,1092
8
8
  datachain/job.py,sha256=x5PB6d5sqx00hePNNkirESlOVAvnmkEM5ygUgQmAhsk,1262
9
9
  datachain/listing.py,sha256=HNB-xeKA6aUA-HTWr--H22S6jVOxP2OVQ-3d07ISqAk,7109
10
10
  datachain/node.py,sha256=KWDT0ClYXB7FYI-QOvzAa-UDkLJErUI2eWm5FBteYuU,5577
11
11
  datachain/nodes_fetcher.py,sha256=_wgaKyqEjkqdwJ_Hj6D8vUYz7hnU7g6xhm0H6ZnYxmE,1095
12
- datachain/nodes_thread_pool.py,sha256=uPo-xl8zG5m9YgODjPFBpbcqqHjI-dcxH87yAbj_qco,3192
12
+ datachain/nodes_thread_pool.py,sha256=mdo0s-VybuSZkRUARcUO4Tjh8KFfZr9foHqmupx2SmM,3989
13
13
  datachain/progress.py,sha256=lRzxoYP4Qv2XBwD78sOkmYRzHFpZ2ExVNJF8wAeICtY,770
14
14
  datachain/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
15
  datachain/script_meta.py,sha256=V-LaFOZG84pD0Zc0NvejYdzwDgzITv6yHvAHggDCnuY,4978
16
- datachain/studio.py,sha256=Coo_6murSjh-RypiHDWNsVXGmfsopyMPCpPS1sA6uUc,9844
16
+ datachain/studio.py,sha256=9MEpFPLKI3gG4isKklcfD5BMLeNsSXhtOUboOjW4Fdc,10017
17
17
  datachain/telemetry.py,sha256=0A4IOPPp9VlP5pyW9eBfaTK3YhHGzHl7dQudQjUAx9A,994
18
- datachain/utils.py,sha256=n8fcyOM8P_2CEFK4h8BZxCAwCkOpt8NAeJK5tm1gIOg,14433
18
+ datachain/utils.py,sha256=CLAYkI7iPbLYw3Pjh5EkWuc2UOs8wEbuXQnqIs4UyV8,14173
19
19
  datachain/catalog/__init__.py,sha256=cMZzSz3VoUi-6qXSVaHYN-agxQuAcz2XSqnEPZ55crE,353
20
- datachain/catalog/catalog.py,sha256=xZC6drw4opoYcxTTiAFv6nbhNOzBb-UZZ_VqY9dqdIs,59458
20
+ datachain/catalog/catalog.py,sha256=3CGnGuQpFRi-BmPoq-0HeXntZcFG3sh7UhuRNClwYX4,60244
21
21
  datachain/catalog/datasource.py,sha256=IkGMh0Ttg6Q-9DWfU_H05WUnZepbGa28HYleECi6K7I,1353
22
- datachain/catalog/loader.py,sha256=HA_mBC7q_My8j2WnSvIjUGuJpl6SIdg5vvy_lagxJlA,5733
23
- datachain/cli/__init__.py,sha256=Uu_ARR5-VS1srC_o2EADRjYKX1c86GK7LZCDL4ufE_w,8290
22
+ datachain/catalog/loader.py,sha256=AhSQR_-S-9lY3DcXn3PVZv9UtarHOMlDy2x75iDwUjo,6035
23
+ datachain/cli/__init__.py,sha256=YPVkuQ7IezNhtzo5xrfca1hEIiZtFxOlJCOzAOEuxmA,8335
24
24
  datachain/cli/utils.py,sha256=wrLnAh7Wx8O_ojZE8AE4Lxn5WoxHbOj7as8NWlLAA74,3036
25
25
  datachain/cli/commands/__init__.py,sha256=zp3bYIioO60x_X04A4-IpZqSYVnpwOa1AdERQaRlIhI,493
26
26
  datachain/cli/commands/datasets.py,sha256=865ui6q4UVPbL_-jk18C-lYi_bGMlh7XhfRaHbbNyhk,5796
@@ -29,18 +29,18 @@ datachain/cli/commands/index.py,sha256=eglNaIe1yyIadUHHumjtNbgIjht6kme7SS7xE3YHR
29
29
  datachain/cli/commands/ls.py,sha256=Wb8hXyBwyhb62Zk6ZhNFPFrj2lJhdbRcnBQQkgL_qyw,5174
30
30
  datachain/cli/commands/misc.py,sha256=c0DmkOLwcDI2YhA8ArOuLJk6aGzSMZCiKL_E2JGibVE,600
31
31
  datachain/cli/commands/query.py,sha256=2S7hQxialt1fkbocxi6JXZI6jS5QnFrD1aOjKgZkzfI,1471
32
- datachain/cli/commands/show.py,sha256=RVb_7Kjd1kzqTxRKYFvmD04LaJHOtrCc4FYMyc-ZEYw,1149
32
+ datachain/cli/commands/show.py,sha256=d-DDw4hA3TWA2vqIS-FkEXrzqvttcTdh2QPaahtLdy0,1445
33
33
  datachain/cli/parser/__init__.py,sha256=rtjlqSsDd4LZH9WdgvluO27M4sID1wD7YkQ4cKhNXzw,15721
34
34
  datachain/cli/parser/job.py,sha256=kvQkSfieyUmvJpOK8p78UgS8sygHhQXztRlOtVcgtaU,3449
35
- datachain/cli/parser/studio.py,sha256=4HEE1K93WDJxMLfgqAA4mHdigpSzC7SLUx-qPF0NgYQ,3254
36
- datachain/cli/parser/utils.py,sha256=GEzxfPJ4i6nt6JhjvZ3PQesXl9islEV3E-N1NZGrLaA,2750
35
+ datachain/cli/parser/studio.py,sha256=Y-1OlQGecLVi9QofvWUfSlPd2ISyaESf7QFGZqGsrdw,3609
36
+ datachain/cli/parser/utils.py,sha256=rETdD-9Hq9A4OolgfT7jQw4aoawtbfmkdtH6E7nkhpI,2888
37
37
  datachain/client/__init__.py,sha256=1kDpCPoibMXi1gExR4lTLc5pi-k6M5TANiwtXkPoLhU,49
38
38
  datachain/client/azure.py,sha256=ma6fJcnveG8wpNy1PSrN5hgvmRdCj8Sf3RKjfd3qCyM,3221
39
39
  datachain/client/fileslice.py,sha256=bT7TYco1Qe3bqoc8aUkUZcPdPofJDHlryL5BsTn9xsY,3021
40
- datachain/client/fsspec.py,sha256=N_n3_DtZuKsLst8-XVda2xYCUHreUU3ld0MNTl8L9f4,14008
40
+ datachain/client/fsspec.py,sha256=VutCpF8MDisDwdnJvJpiTuDU9BRRAa0Km3ZkD0sKaI0,13834
41
41
  datachain/client/gcs.py,sha256=TY5K5INORKknTnoWDYv0EUztVLmuY1hHmdf2wUB_9uE,5114
42
- datachain/client/hf.py,sha256=XeVJVbiNViZCpn3sfb90Fr8SYO3BdLmfE3hOWMoqInE,951
43
- datachain/client/local.py,sha256=Pv67SYdkNkkNExBoKJF9AnNu0FSrt4JqLRkSVsUnveU,4672
42
+ datachain/client/hf.py,sha256=posnI5WOKOMG1yY_ZiV9Orcd24QsUPKZlOXgJVLxxrM,1558
43
+ datachain/client/local.py,sha256=cGoCYflribzexiOe-Y1qbaE2fJRh-_EgQrfCSa0yK_E,4568
44
44
  datachain/client/s3.py,sha256=l2A4J086ZROKKHNVXnoBky0OgYYKB0EAr8Y3lObo8GY,7284
45
45
  datachain/data_storage/__init__.py,sha256=9Wit-oe5P46V7CJQTD0BJ5MhOa2Y9h3ddJ4VWTe-Lec,273
46
46
  datachain/data_storage/db_engine.py,sha256=n8ojCbvVMPY2e3SG8fUaaD0b9GkVfpl_Naa_6EiHfWg,3788
@@ -49,16 +49,17 @@ datachain/data_storage/metastore.py,sha256=hfTITcesE9XlUTxcCcdDyWGGep-QSjJL9DUxk
49
49
  datachain/data_storage/schema.py,sha256=qSukry2kINhVw8aj5lQrpe7N90DFeatKIKmDh6jAzR8,9515
50
50
  datachain/data_storage/serializer.py,sha256=6G2YtOFqqDzJf1KbvZraKGXl2XHZyVml2krunWUum5o,927
51
51
  datachain/data_storage/sqlite.py,sha256=KJ8hI0Hrwv9eAA-nLUlw2AYCQxiAAZ12a-ftUBtroNQ,24545
52
- datachain/data_storage/warehouse.py,sha256=ovdH9LmOWLfCrvf0UvXnrNC-CrdAjns3EmXEgFdz4KM,30824
52
+ datachain/data_storage/warehouse.py,sha256=GGtgHcOKjnvHN6CFkGGB8m4CFgPPJBo3f-KHEFEJmDc,30730
53
53
  datachain/diff/__init__.py,sha256=xSbJtmj-oawXQ2qfdGtfnVsfXV7KhdkQKC9bG_5lA2k,9256
54
54
  datachain/fs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
55
  datachain/fs/reference.py,sha256=A8McpXF0CqbXPqanXuvpKu50YLB3a2ZXA3YAPxtBXSM,914
56
- datachain/func/__init__.py,sha256=vpd61Q0AmNHEhUTEtzmmmZMLngr7xkgy-SazX7Pzf4w,1159
56
+ datachain/fs/utils.py,sha256=s-FkTOCGBk-b6TT3toQH51s9608pofoFjUSTc1yy7oE,825
57
+ datachain/func/__init__.py,sha256=CjNLHfJkepdXdRZ6HjJBjNSIjOeFMuMkwPDaPUrM75g,1270
57
58
  datachain/func/aggregate.py,sha256=7_IPrIwb2XSs3zG4iOr1eTvzn6kNVe2mkzvNzjusDHk,10942
58
59
  datachain/func/array.py,sha256=O784_uwmaP5CjZX4VSF4RmS8cmpaForQc8zASxHJB6A,6717
59
60
  datachain/func/base.py,sha256=wA0sBQAVyN9LPxoo7Ox83peS0zUVnyuKxukwAcjGLfY,534
60
61
  datachain/func/conditional.py,sha256=HkNamQr9dLyIMDEbIeO6CZR0emQoDqeaWrZ1fECod4M,8062
61
- datachain/func/func.py,sha256=PnwTRAiEJUus3e4NYdQ-hldqLzKS9hY0FjiyBMZhsSo,16183
62
+ datachain/func/func.py,sha256=k8z5tIiabEOPymYWGfz4O7z1qS6zBZnVYRPp_58iU7c,16192
62
63
  datachain/func/numeric.py,sha256=gMe1Ks0dqQKHkjcpvj7I5S-neECzQ_gltPQLNoaWOyo,5632
63
64
  datachain/func/path.py,sha256=mqN_mfkwv44z2II7DMTp_fGGw95hmTCNls_TOFNpr4k,3155
64
65
  datachain/func/random.py,sha256=pENOLj9rSmWfGCnOsUIaCsVC5486zQb66qfQvXaz9Z4,452
@@ -67,25 +68,25 @@ datachain/func/window.py,sha256=0MB1yjpVbwOrl_WNLZ8V3jkJz3o0XlYinpAcZQJuxiA,1688
67
68
  datachain/lib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
69
  datachain/lib/arrow.py,sha256=9UBCF-lftQaz0yxdsjbLKbyzVSmrF_QSWdhp2oBDPqs,9486
69
70
  datachain/lib/clip.py,sha256=lm5CzVi4Cj1jVLEKvERKArb-egb9j1Ls-fwTItT6vlI,6150
70
- datachain/lib/data_model.py,sha256=zS4lmXHVBXc9ntcyea2a1CRLXGSAN_0glXcF88CohgY,2685
71
+ datachain/lib/data_model.py,sha256=ZwBXELtqROEdLL4DmxTipnwUZmhQvMz_UVDzyf7nQ9Y,2899
71
72
  datachain/lib/dataset_info.py,sha256=IjdF1E0TQNOq9YyynfWiCFTeZpbyGfyJvxgJY4YN810,2493
72
- datachain/lib/dc.py,sha256=QQPnrS_OB1d3CfjLnYtRByGc7wNX_YT24WOjaoFPJgw,95372
73
- datachain/lib/file.py,sha256=Bbnb7JBiAFRD1RsZwPdvoiWFKHkl7V3haDLh672xTZg,27658
73
+ datachain/lib/dc.py,sha256=qk6R8D1Snf3yuJ-y2PVbSjkpEllKVJ7TDkC7I2GpBHY,98590
74
+ datachain/lib/file.py,sha256=o4napoPLP_BZYc05ktE9GcF1VlTj3s4lrGvbhxpDeX8,30345
74
75
  datachain/lib/hf.py,sha256=gjxuStZBlKtNk3-4yYSlWZDv9zBGblOdvEy_Lwap5hA,5882
75
- datachain/lib/image.py,sha256=AMXYwQsmarZjRbPCZY3M1jDsM2WAB_b3cTY4uOIuXNU,2675
76
- datachain/lib/listing.py,sha256=auodM0HitYZsL0DybdgQUYhne_LgkVW-LKGYYOACP90,7272
76
+ datachain/lib/image.py,sha256=butvUY_33PVEYPKX2nVCPeJjJVcBaptZwsE9REQsTS8,3247
77
+ datachain/lib/listing.py,sha256=xrgsd1_YLLiA69LnwK56oZwe0RXTBCDicGzhavF_2AQ,6665
77
78
  datachain/lib/listing_info.py,sha256=9ua40Hw0aiQByUw3oAEeNzMavJYfW0Uhe8YdCTK-m_g,1110
78
79
  datachain/lib/meta_formats.py,sha256=hDPfEkcmiLZOjhBBXuareMdnq65Wj8vZvxjmum6cROM,6377
79
80
  datachain/lib/model_store.py,sha256=DNIv8Y6Jtk1_idNLzIpsThOsdW2BMAudyUCbPUcgcxk,2515
80
81
  datachain/lib/pytorch.py,sha256=QxXBhrn2-D0RiFA2rdxZ7wKMxyuQ0WWHKfiFEWAA760,7710
81
82
  datachain/lib/settings.py,sha256=ZELRCTLbi5vzRPiDX6cQ9LLg9TefJ_A05gIGni0lll8,2535
82
- datachain/lib/signal_schema.py,sha256=ps5od6zhWtdX3Khx2fwArl2xlGkK8SKi6vCQ6QmbaR0,27404
83
+ datachain/lib/signal_schema.py,sha256=WyVTXUsa4DVTIZRAX2-MdjOe4deat_Fufsd9n8ycrXQ,33629
83
84
  datachain/lib/tar.py,sha256=3WIzao6yD5fbLqXLTt9GhPGNonbFIs_fDRu-9vgLgsA,1038
84
85
  datachain/lib/text.py,sha256=UNHm8fhidk7wdrWqacEWaA6I9ykfYqarQ2URby7jc7M,1261
85
86
  datachain/lib/udf.py,sha256=TlvikKTFvkIKaqqSkSriOyXhQ0rwRHV2ZRs1LHZOCmo,16107
86
87
  datachain/lib/udf_signature.py,sha256=GXw24A-Olna6DWCdgy2bC-gZh_gLGPQ-KvjuI6pUjC0,7281
87
88
  datachain/lib/utils.py,sha256=QrjVs_oLRXEotOPUYurBJypBFi_ReTJmxcnJeH4j2Uk,1596
88
- datachain/lib/video.py,sha256=rqFockGMoWmLuGMN044BGZVogoCePv056BYi36u3nNo,6522
89
+ datachain/lib/video.py,sha256=suH_8Mi8VYk4-IVb1vjSduF_njs64ji1WGKHxDLnGYw,6629
89
90
  datachain/lib/webdataset.py,sha256=o7SHk5HOUWsZ5Ln04xOM04eQqiBHiJNO7xLgyVBrwo8,6924
90
91
  datachain/lib/webdataset_laion.py,sha256=xvT6m_r5y0KbOx14BUe7UC5mOgrktJq53Mh-H0EVlUE,2525
91
92
  datachain/lib/convert/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -95,16 +96,17 @@ datachain/lib/convert/sql_to_python.py,sha256=XXCBYDQFUXJIBNWkjEP944cnCfJ8GF2Tji
95
96
  datachain/lib/convert/unflatten.py,sha256=ysMkstwJzPMWUlnxn-Z-tXJR3wmhjHeSN_P-sDcLS6s,2010
96
97
  datachain/lib/convert/values_to_tuples.py,sha256=EFfIGBiVVltJQG8blzsQ1dGXneh4D3wdLfSUeoK10OI,3931
97
98
  datachain/model/__init__.py,sha256=R9faX5OHV1xh2EW-g2MPedwbtEqt3LodJRyluB-QylI,189
98
- datachain/model/bbox.py,sha256=jCuOdcdY__4WMsVfZp5ZNxnmcHva0KUm9MfbL0AMMy4,3158
99
- datachain/model/pose.py,sha256=NpxyDTcgPoB5LcoRVLwVXTKIHRxqZcdCX5c9soBIPb0,3078
100
- datachain/model/segment.py,sha256=LEZ88H9mb7tXq3OAcOYiYF8Di7NWmkSe3x9WSewpKQk,1595
99
+ datachain/model/bbox.py,sha256=cQNHuQuVsh6bW3n3Hj40F2Cc20cExQ9Lg_q7R2jxUMI,9324
100
+ datachain/model/pose.py,sha256=rjquA6M-I-Y30Xm6YSkGv1OY52hJZmR2AuxbIpE5uD0,3865
101
+ datachain/model/segment.py,sha256=NhcEYB_KVa0aLQYiZ4jEwkylH9QBLd8fZhmg6PVnx1Y,1967
102
+ datachain/model/utils.py,sha256=5elwCKleOO6CZM0IuWjFykPekrhc5m7V4jSIOcgGMms,6733
101
103
  datachain/model/ultralytics/__init__.py,sha256=EvcNX9qUyxKXXlKCPpsXeRrabyXk5E9EkN-tyiYkfS4,750
102
- datachain/model/ultralytics/bbox.py,sha256=OZ9XBdyMOYc401P-RhfSN9QaYvMpnx2Phu9ptaJgZBY,4316
103
- datachain/model/ultralytics/pose.py,sha256=71KBTcoST2wcEtsyGXqLVpvUtqbp9gwZGA15pEPtX5A,2959
104
- datachain/model/ultralytics/segment.py,sha256=Z1ab0tZRJubSYNH4KkFlzhYeGNTfAyC71KmkQcToHDQ,2760
104
+ datachain/model/ultralytics/bbox.py,sha256=1wnu3tXQn3i-047pncfHyCdKxHdP7MJDI1DXqzVc9ms,4500
105
+ datachain/model/ultralytics/pose.py,sha256=gXAWfAk4OWZl93hKcQPKZvqJa3nIrECB4RM8K8w8Og0,3109
106
+ datachain/model/ultralytics/segment.py,sha256=koq1HASo29isf0in6oSlzmU4IzsmOXe87F1ajQQVfh4,2911
105
107
  datachain/query/__init__.py,sha256=7DhEIjAA8uZJfejruAVMZVcGFmvUpffuZJwgRqNwe-c,263
106
108
  datachain/query/batch.py,sha256=6w8gzLTmLeylststu-gT5jIqEfi4-djS7_yTYyeo-fw,4190
107
- datachain/query/dataset.py,sha256=wK_etZkH558pzLKAMBArlj1TQD9n96YK-kpVYBCSR38,57083
109
+ datachain/query/dataset.py,sha256=jRMclCOKUblMb-OGGUHq59Zk0d3M2eHkqIh14F7jyY4,57097
108
110
  datachain/query/dispatch.py,sha256=_1vjeQ1wjUoxlik55k0JkWqQCUfMjgVWmEOyWRkx0dU,12437
109
111
  datachain/query/metrics.py,sha256=r5b0ygYhokbXp8Mg3kCH8iFSRw0jxzyeBe-C-J_bKFc,938
110
112
  datachain/query/params.py,sha256=O_j89mjYRLOwWNhYZl-z7mi-rkdP7WyFmaDufsdTryE,863
@@ -136,9 +138,9 @@ datachain/sql/sqlite/vector.py,sha256=ncW4eu2FlJhrP_CIpsvtkUabZlQdl2D5Lgwy_cbfqR
136
138
  datachain/toolkit/__init__.py,sha256=eQ58Q5Yf_Fgv1ZG0IO5dpB4jmP90rk8YxUWmPc1M2Bo,68
137
139
  datachain/toolkit/split.py,sha256=z3zRJNzjWrpPuRw-zgFbCOBKInyYxJew8ygrYQRQLNc,2930
138
140
  datachain/torch/__init__.py,sha256=gIS74PoEPy4TB3X6vx9nLO0Y3sLJzsA8ckn8pRWihJM,579
139
- datachain-0.11.0.dist-info/LICENSE,sha256=8DnqK5yoPI_E50bEg_zsHKZHY2HqPy4rYN338BHQaRA,11344
140
- datachain-0.11.0.dist-info/METADATA,sha256=ijLSRDc7IAZe6YxdX0ZRRNY2LOUlsFFib660U_upu20,11241
141
- datachain-0.11.0.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
142
- datachain-0.11.0.dist-info/entry_points.txt,sha256=0GMJS6B_KWq0m3VT98vQI2YZodAMkn4uReZ_okga9R4,49
143
- datachain-0.11.0.dist-info/top_level.txt,sha256=lZPpdU_2jJABLNIg2kvEOBi8PtsYikbN1OdMLHk8bTg,10
144
- datachain-0.11.0.dist-info/RECORD,,
141
+ datachain-0.12.0.dist-info/LICENSE,sha256=8DnqK5yoPI_E50bEg_zsHKZHY2HqPy4rYN338BHQaRA,11344
142
+ datachain-0.12.0.dist-info/METADATA,sha256=yHNtv5QzGI6O2TJcGTgFszXBANJHjQibgj_sq_00vy0,11351
143
+ datachain-0.12.0.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
144
+ datachain-0.12.0.dist-info/entry_points.txt,sha256=0GMJS6B_KWq0m3VT98vQI2YZodAMkn4uReZ_okga9R4,49
145
+ datachain-0.12.0.dist-info/top_level.txt,sha256=lZPpdU_2jJABLNIg2kvEOBi8PtsYikbN1OdMLHk8bTg,10
146
+ datachain-0.12.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.2)
2
+ Generator: setuptools (76.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5