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

@@ -13,13 +13,14 @@ from typing import ( # noqa: UP035
13
13
  Final,
14
14
  List,
15
15
  Literal,
16
+ Mapping,
16
17
  Optional,
17
18
  Union,
18
19
  get_args,
19
20
  get_origin,
20
21
  )
21
22
 
22
- from pydantic import BaseModel, create_model
23
+ from pydantic import BaseModel, Field, create_model
23
24
  from sqlalchemy import ColumnElement
24
25
  from typing_extensions import Literal as LiteralEx
25
26
 
@@ -85,8 +86,31 @@ class SignalResolvingTypeError(SignalResolvingError):
85
86
  )
86
87
 
87
88
 
89
+ class CustomType(BaseModel):
90
+ schema_version: int = Field(ge=1, le=2, strict=True)
91
+ name: str
92
+ fields: dict[str, str]
93
+ bases: list[tuple[str, str, Optional[str]]]
94
+
95
+ @classmethod
96
+ def deserialize(cls, data: dict[str, Any], type_name: str) -> "CustomType":
97
+ version = data.get("schema_version", 1)
98
+
99
+ if version == 1:
100
+ data = {
101
+ "schema_version": 1,
102
+ "name": type_name,
103
+ "fields": data,
104
+ "bases": [],
105
+ }
106
+
107
+ return cls(**data)
108
+
109
+
88
110
  def create_feature_model(
89
- name: str, fields: dict[str, Union[type, tuple[type, Any]]]
111
+ name: str,
112
+ fields: Mapping[str, Union[type, None, tuple[type, Any]]],
113
+ base: Optional[type] = None,
90
114
  ) -> type[BaseModel]:
91
115
  """
92
116
  This gets or returns a dynamic feature model for use in restoring a model
@@ -98,7 +122,7 @@ def create_feature_model(
98
122
  name = name.replace("@", "_")
99
123
  return create_model(
100
124
  name,
101
- __base__=DataModel, # type: ignore[call-overload]
125
+ __base__=base or DataModel, # type: ignore[call-overload]
102
126
  # These are tuples for each field of: annotation, default (if any)
103
127
  **{
104
128
  field_name: anno if isinstance(anno, tuple) else (anno, None)
@@ -156,7 +180,7 @@ class SignalSchema:
156
180
  return SignalSchema(signals)
157
181
 
158
182
  @staticmethod
159
- def _serialize_custom_model_fields(
183
+ def _serialize_custom_model(
160
184
  version_name: str, fr: type[BaseModel], custom_types: dict[str, Any]
161
185
  ) -> str:
162
186
  """This serializes any custom type information to the provided custom_types
@@ -165,12 +189,23 @@ class SignalSchema:
165
189
  # This type is already stored in custom_types.
166
190
  return version_name
167
191
  fields = {}
192
+
168
193
  for field_name, info in fr.model_fields.items():
169
194
  field_type = info.annotation
170
195
  # All fields should be typed.
171
196
  assert field_type
172
197
  fields[field_name] = SignalSchema._serialize_type(field_type, custom_types)
173
- custom_types[version_name] = fields
198
+
199
+ bases: list[tuple[str, str, Optional[str]]] = []
200
+ for type_ in fr.__mro__:
201
+ model_store_name = (
202
+ ModelStore.get_name(type_) if issubclass(type_, DataModel) else None
203
+ )
204
+ bases.append((type_.__name__, type_.__module__, model_store_name))
205
+
206
+ ct = CustomType(schema_version=2, name=version_name, fields=fields, bases=bases)
207
+ custom_types[version_name] = ct.model_dump()
208
+
174
209
  return version_name
175
210
 
176
211
  @staticmethod
@@ -184,15 +219,12 @@ class SignalSchema:
184
219
  if st is None or not ModelStore.is_pydantic(st):
185
220
  continue
186
221
  # Register and save feature types.
187
- ModelStore.register(st)
188
222
  st_version_name = ModelStore.get_name(st)
189
223
  if st is fr:
190
224
  # If the main type is Pydantic, then use the ModelStore version name.
191
225
  type_name = st_version_name
192
226
  # Save this type to custom_types.
193
- SignalSchema._serialize_custom_model_fields(
194
- st_version_name, st, custom_types
195
- )
227
+ SignalSchema._serialize_custom_model(st_version_name, st, custom_types)
196
228
  return type_name
197
229
 
198
230
  def serialize(self) -> dict[str, Any]:
@@ -215,7 +247,7 @@ class SignalSchema:
215
247
  depth += 1
216
248
  elif c == "]":
217
249
  if depth == 0:
218
- raise TypeError(
250
+ raise ValueError(
219
251
  "Extra closing square bracket when parsing subtype list"
220
252
  )
221
253
  depth -= 1
@@ -223,16 +255,51 @@ class SignalSchema:
223
255
  subtypes.append(type_name[start:i].strip())
224
256
  start = i + 1
225
257
  if depth > 0:
226
- raise TypeError("Unclosed square bracket when parsing subtype list")
258
+ raise ValueError("Unclosed square bracket when parsing subtype list")
227
259
  subtypes.append(type_name[start:].strip())
228
260
  return subtypes
229
261
 
230
262
  @staticmethod
231
- def _resolve_type(type_name: str, custom_types: dict[str, Any]) -> Optional[type]: # noqa: PLR0911
263
+ def _deserialize_custom_type(
264
+ type_name: str, custom_types: dict[str, Any]
265
+ ) -> Optional[type]:
266
+ """Given a type name like MyType@v1 gets a type from ModelStore or recreates
267
+ it based on the information from the custom types dict that includes fields and
268
+ bases."""
269
+ model_name, version = ModelStore.parse_name_version(type_name)
270
+ fr = ModelStore.get(model_name, version)
271
+ if fr:
272
+ return fr
273
+
274
+ if type_name in custom_types:
275
+ ct = CustomType.deserialize(custom_types[type_name], type_name)
276
+
277
+ fields = {
278
+ field_name: SignalSchema._resolve_type(field_type_str, custom_types)
279
+ for field_name, field_type_str in ct.fields.items()
280
+ }
281
+
282
+ base_model = None
283
+ for base in ct.bases:
284
+ _, _, model_store_name = base
285
+ if model_store_name:
286
+ model_name, version = ModelStore.parse_name_version(
287
+ model_store_name
288
+ )
289
+ base_model = ModelStore.get(model_name, version)
290
+ if base_model:
291
+ break
292
+
293
+ return create_feature_model(type_name, fields, base=base_model)
294
+
295
+ return None
296
+
297
+ @staticmethod
298
+ def _resolve_type(type_name: str, custom_types: dict[str, Any]) -> Optional[type]:
232
299
  """Convert a string-based type back into a python type."""
233
300
  type_name = type_name.strip()
234
301
  if not type_name:
235
- raise TypeError("Type cannot be empty")
302
+ raise ValueError("Type cannot be empty")
236
303
  if type_name == "NoneType":
237
304
  return None
238
305
 
@@ -240,14 +307,14 @@ class SignalSchema:
240
307
  subtypes: Optional[tuple[Optional[type], ...]] = None
241
308
  if bracket_idx > -1:
242
309
  if bracket_idx == 0:
243
- raise TypeError("Type cannot start with '['")
310
+ raise ValueError("Type cannot start with '['")
244
311
  close_bracket_idx = type_name.rfind("]")
245
312
  if close_bracket_idx == -1:
246
- raise TypeError("Unclosed square bracket when parsing type")
313
+ raise ValueError("Unclosed square bracket when parsing type")
247
314
  if close_bracket_idx < bracket_idx:
248
- raise TypeError("Square brackets are out of order when parsing type")
315
+ raise ValueError("Square brackets are out of order when parsing type")
249
316
  if close_bracket_idx == bracket_idx + 1:
250
- raise TypeError("Empty square brackets when parsing type")
317
+ raise ValueError("Empty square brackets when parsing type")
251
318
  subtype_names = SignalSchema._split_subtypes(
252
319
  type_name[bracket_idx + 1 : close_bracket_idx]
253
320
  )
@@ -267,18 +334,10 @@ class SignalSchema:
267
334
  return fr[subtypes] # type: ignore[index]
268
335
  return fr # type: ignore[return-value]
269
336
 
270
- model_name, version = ModelStore.parse_name_version(type_name)
271
- fr = ModelStore.get(model_name, version)
337
+ fr = SignalSchema._deserialize_custom_type(type_name, custom_types)
272
338
  if fr:
273
339
  return fr
274
340
 
275
- if type_name in custom_types:
276
- fields = custom_types[type_name]
277
- fields = {
278
- field_name: SignalSchema._resolve_type(field_type_str, custom_types)
279
- for field_name, field_type_str in fields.items()
280
- }
281
- return create_feature_model(type_name, fields)
282
341
  # This can occur if a third-party or custom type is used, which is not available
283
342
  # when deserializing.
284
343
  warnings.warn(
@@ -317,7 +376,7 @@ class SignalSchema:
317
376
  stacklevel=2,
318
377
  )
319
378
  continue
320
- except TypeError as err:
379
+ except ValueError as err:
321
380
  raise SignalSchemaError(
322
381
  f"cannot deserialize '{signal}': {err}"
323
382
  ) from err
@@ -662,6 +721,9 @@ class SignalSchema:
662
721
  stacklevel=2,
663
722
  )
664
723
  return "Any"
724
+ if ModelStore.is_pydantic(type_):
725
+ ModelStore.register(type_)
726
+ return ModelStore.get_name(type_)
665
727
  return type_.__name__
666
728
 
667
729
  @staticmethod
datachain/progress.py CHANGED
@@ -61,7 +61,7 @@ class Tqdm(tqdm):
61
61
  disable : If (default: None) or False,
62
62
  will be determined by logging level.
63
63
  May be overridden to `True` due to non-TTY status.
64
- Skip override by specifying env var `DVC_IGNORE_ISATTY`.
64
+ Skip override by specifying env var `DATACHAIN_IGNORE_ISATTY`.
65
65
  kwargs : anything accepted by `tqdm.tqdm()`
66
66
  """
67
67
  kwargs = kwargs.copy()
@@ -77,7 +77,7 @@ class Tqdm(tqdm):
77
77
  # auto-disable based on TTY
78
78
  if (
79
79
  not disable
80
- and not env2bool("DVC_IGNORE_ISATTY")
80
+ and not env2bool("DATACHAIN_IGNORE_ISATTY")
81
81
  and hasattr(file, "isatty")
82
82
  ):
83
83
  disable = not file.isatty()
datachain/studio.py CHANGED
@@ -20,21 +20,7 @@ POST_LOGIN_MESSAGE = (
20
20
  )
21
21
 
22
22
 
23
- def process_studio_cli_args(args: "Namespace"): # noqa: PLR0911
24
- if args.cmd == "login":
25
- return login(args)
26
- if args.cmd == "logout":
27
- return logout()
28
- if args.cmd == "token":
29
- return token()
30
- if args.cmd == "datasets":
31
- rows = [
32
- {"Name": name, "Version": version}
33
- for name, version in list_datasets(args.team)
34
- ]
35
- print(tabulate(rows, headers="keys"))
36
- return 0
37
-
23
+ def process_jobs_args(args: "Namespace"):
38
24
  if args.cmd == "run":
39
25
  return create_job(
40
26
  args.query_file,
@@ -50,6 +36,25 @@ def process_studio_cli_args(args: "Namespace"): # noqa: PLR0911
50
36
 
51
37
  if args.cmd == "cancel":
52
38
  return cancel_job(args.job_id, args.team)
39
+ if args.cmd == "logs":
40
+ return show_job_logs(args.job_id, args.team)
41
+ raise DataChainError(f"Unknown command '{args.cmd}'.")
42
+
43
+
44
+ def process_studio_cli_args(args: "Namespace"):
45
+ if args.cmd == "login":
46
+ return login(args)
47
+ if args.cmd == "logout":
48
+ return logout()
49
+ if args.cmd == "token":
50
+ return token()
51
+ if args.cmd == "dataset":
52
+ rows = [
53
+ {"Name": name, "Version": version}
54
+ for name, version in list_datasets(args.team)
55
+ ]
56
+ print(tabulate(rows, headers="keys"))
57
+ return 0
53
58
 
54
59
  if args.cmd == "team":
55
60
  return set_team(args)
@@ -187,6 +192,32 @@ def save_config(hostname, token):
187
192
  return config.config_file()
188
193
 
189
194
 
195
+ def show_logs_from_client(client, job_id):
196
+ # Sync usage
197
+ async def _run():
198
+ async for message in client.tail_job_logs(job_id):
199
+ if "logs" in message:
200
+ for log in message["logs"]:
201
+ print(log["message"], end="")
202
+ elif "job" in message:
203
+ print(f"\n>>>> Job is now in {message['job']['status']} status.")
204
+
205
+ asyncio.run(_run())
206
+
207
+ response = client.dataset_job_versions(job_id)
208
+ if not response.ok:
209
+ raise_remote_error(response.message)
210
+
211
+ response_data = response.data
212
+ if response_data:
213
+ dataset_versions = response_data.get("dataset_versions", [])
214
+ print("\n\n>>>> Dataset versions created during the job:")
215
+ for version in dataset_versions:
216
+ print(f" - {version.get('dataset_name')}@v{version.get('version')}")
217
+ else:
218
+ print("No dataset versions created during the job.")
219
+
220
+
190
221
  def create_job(
191
222
  query_file: str,
192
223
  team_name: Optional[str],
@@ -236,29 +267,7 @@ def create_job(
236
267
  print("Open the job in Studio at", response.data.get("job", {}).get("url"))
237
268
  print("=" * 40)
238
269
 
239
- # Sync usage
240
- async def _run():
241
- async for message in client.tail_job_logs(job_id):
242
- if "logs" in message:
243
- for log in message["logs"]:
244
- print(log["message"], end="")
245
- elif "job" in message:
246
- print(f"\n>>>> Job is now in {message['job']['status']} status.")
247
-
248
- asyncio.run(_run())
249
-
250
- response = client.dataset_job_versions(job_id)
251
- if not response.ok:
252
- raise_remote_error(response.message)
253
-
254
- response_data = response.data
255
- if response_data:
256
- dataset_versions = response_data.get("dataset_versions", [])
257
- print("\n\n>>>> Dataset versions created during the job:")
258
- for version in dataset_versions:
259
- print(f" - {version.get('dataset_name')}@v{version.get('version')}")
260
- else:
261
- print("No dataset versions created during the job.")
270
+ show_logs_from_client(client, job_id)
262
271
 
263
272
 
264
273
  def upload_files(client: StudioClient, files: list[str]) -> list[str]:
@@ -293,3 +302,14 @@ def cancel_job(job_id: str, team_name: Optional[str]):
293
302
  raise_remote_error(response.message)
294
303
 
295
304
  print(f"Job {job_id} canceled")
305
+
306
+
307
+ def show_job_logs(job_id: str, team_name: Optional[str]):
308
+ token = Config().read().get("studio", {}).get("token")
309
+ if not token:
310
+ raise DataChainError(
311
+ "Not logged in to Studio. Log in with 'datachain studio login'."
312
+ )
313
+
314
+ client = StudioClient(team=team_name)
315
+ show_logs_from_client(client, job_id)
datachain/utils.py CHANGED
@@ -30,7 +30,7 @@ APPNAME = "datachain"
30
30
  APPAUTHOR = "iterative"
31
31
  ENV_DATACHAIN_SYSTEM_CONFIG_DIR = "DATACHAIN_SYSTEM_CONFIG_DIR"
32
32
  ENV_DATACHAIN_GLOBAL_CONFIG_DIR = "DATACHAIN_GLOBAL_CONFIG_DIR"
33
- STUDIO_URL = "https://studio.dvc.ai"
33
+ STUDIO_URL = "https://studio.datachain.ai"
34
34
 
35
35
 
36
36
  T = TypeVar("T", bound="DataChainDir")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: datachain
3
- Version: 0.8.3
3
+ Version: 0.8.4
4
4
  Summary: Wrangle unstructured AI data at scale
5
5
  Author-email: Dmitry Petrov <support@dvc.org>
6
6
  License: Apache-2.0
@@ -50,7 +50,7 @@ Requires-Dist: websockets
50
50
  Provides-Extra: docs
51
51
  Requires-Dist: mkdocs>=1.5.2; extra == "docs"
52
52
  Requires-Dist: mkdocs-gen-files>=0.5.0; extra == "docs"
53
- Requires-Dist: mkdocs-material>=9.3.1; extra == "docs"
53
+ Requires-Dist: mkdocs-material==9.5.22; extra == "docs"
54
54
  Requires-Dist: mkdocs-section-index>=0.3.6; extra == "docs"
55
55
  Requires-Dist: mkdocstrings-python>=1.6.3; extra == "docs"
56
56
  Requires-Dist: mkdocs-literate-nav>=0.6.1; extra == "docs"
@@ -84,7 +84,7 @@ Requires-Dist: requests-mock; extra == "tests"
84
84
  Requires-Dist: scipy; extra == "tests"
85
85
  Provides-Extra: dev
86
86
  Requires-Dist: datachain[docs,tests]; extra == "dev"
87
- Requires-Dist: mypy==1.14.0; extra == "dev"
87
+ Requires-Dist: mypy==1.14.1; extra == "dev"
88
88
  Requires-Dist: types-python-dateutil; extra == "dev"
89
89
  Requires-Dist: types-pytz; extra == "dev"
90
90
  Requires-Dist: types-PyYAML; extra == "dev"
@@ -95,11 +95,11 @@ Requires-Dist: datachain[tests]; extra == "examples"
95
95
  Requires-Dist: defusedxml; extra == "examples"
96
96
  Requires-Dist: accelerate; extra == "examples"
97
97
  Requires-Dist: unstructured_ingest[embed-huggingface]; extra == "examples"
98
- Requires-Dist: unstructured[pdf]; extra == "examples"
98
+ Requires-Dist: unstructured[pdf]<0.16.12; extra == "examples"
99
99
  Requires-Dist: pdfplumber==0.11.4; extra == "examples"
100
100
  Requires-Dist: huggingface_hub[hf_transfer]; extra == "examples"
101
101
  Requires-Dist: onnx==1.16.1; extra == "examples"
102
- Requires-Dist: ultralytics==8.3.53; extra == "examples"
102
+ Requires-Dist: ultralytics==8.3.55; extra == "examples"
103
103
 
104
104
  ================
105
105
  |logo| DataChain
@@ -2,8 +2,6 @@ datachain/__init__.py,sha256=ofPJ6B-d-ybSDRrE7J6wqF_ZRAB2W9U8l-eeuBtqPLg,865
2
2
  datachain/__main__.py,sha256=hG3Y4ARGEqe1AWwNMd259rBlqtphx1Wk39YbueQ0yV8,91
3
3
  datachain/asyn.py,sha256=5aKrjnUxk0mtnZeFKNJd1DCE0MsnSoyJBZkr0y9H_a0,9313
4
4
  datachain/cache.py,sha256=4xI0Ct2gVXuLZPqKdbjmfb_KD2klou-9WnL1WNhIuCA,3077
5
- datachain/cli.py,sha256=gNXVoMfKINUhKjOpYN48tpyNBK13M0hkQWqra4jNSJQ,43137
6
- datachain/cli_utils.py,sha256=jrn9ejGXjybeO1ur3fjdSiAyCHZrX0qsLLbJzN9ErPM,2418
7
5
  datachain/config.py,sha256=g8qbNV0vW2VEKpX-dGZ9pAn0DAz6G2ZFcr7SAV3PoSM,4272
8
6
  datachain/dataset.py,sha256=5HtqZBRaaToa_C74g62bACjBaCRf2Y6BDgIACLhK1ZA,19161
9
7
  datachain/error.py,sha256=bxAAL32lSeMgzsQDEHbGTGORj-mPzzpCRvWDPueJNN4,1092
@@ -12,19 +10,33 @@ datachain/listing.py,sha256=WdiWMVa0xZ-LtR3SJ0gFLgYUI6VaLI0DSEE_KvfikXs,7582
12
10
  datachain/node.py,sha256=HSpjBUBQBWXUUpbUEq839dsSc5KR2O8ww1Udl4jQemY,6023
13
11
  datachain/nodes_fetcher.py,sha256=ILMzUW5o4_6lUOVrLDC9gJPCXfcgKnMG68plrc7dAOA,1113
14
12
  datachain/nodes_thread_pool.py,sha256=uPo-xl8zG5m9YgODjPFBpbcqqHjI-dcxH87yAbj_qco,3192
15
- datachain/progress.py,sha256=5KotcvvzAUL_RF0GEj4JY0IB1lyImnmHxe89YkT1XO4,4330
13
+ datachain/progress.py,sha256=jgW_MOGSyY9devjvW3Y1VkCk1z6FkQZ3qMURfRrNXMo,4342
16
14
  datachain/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
- datachain/studio.py,sha256=BegIXunW1n-sZtHSe3a30Mw2MXexVGRn_GU-OzjRRKM,8725
15
+ datachain/studio.py,sha256=LFSX-HDRiceZDqc4pfy6q97xoejQCeWmuUGomwmOH9Y,9315
18
16
  datachain/telemetry.py,sha256=0A4IOPPp9VlP5pyW9eBfaTK3YhHGzHl7dQudQjUAx9A,994
19
- datachain/utils.py,sha256=9iP8RGm3MHemj13qt1VxRGYAsA6v-627M22o0fr76_M,13906
17
+ datachain/utils.py,sha256=UWkPJrzGC6RiNxIvclxbchoJbuMnD0Nvf1ZO6RU6AcY,13912
20
18
  datachain/catalog/__init__.py,sha256=g2iAAFx_gEIrqshXlhSEbrc8qDaEH11cjU40n3CHDz4,409
21
19
  datachain/catalog/catalog.py,sha256=ixXJKftUIG_ZBPdie1dJAPPHddWV6HZwb3GO-TRHtxY,60103
22
20
  datachain/catalog/datasource.py,sha256=IkGMh0Ttg6Q-9DWfU_H05WUnZepbGa28HYleECi6K7I,1353
23
21
  datachain/catalog/loader.py,sha256=HA_mBC7q_My8j2WnSvIjUGuJpl6SIdg5vvy_lagxJlA,5733
22
+ datachain/cli/__init__.py,sha256=ywf3C552rQeXAW7xemodYqxJb1pAeVQulyCJSr7xiCk,8380
23
+ datachain/cli/utils.py,sha256=jEoqY0agU3AZ-VQBpyieDKIlk7j3sumtlHE3OgbAzdU,3038
24
+ datachain/cli/commands/__init__.py,sha256=uc77ggTRWrq-w1AVsH3Muy6v1ATkNsXUBPIRaOFgNus,533
25
+ datachain/cli/commands/datasets.py,sha256=0a311oIeKPtRxtoJE0Ui5-y7PEtEl-YEsshjSb5shDU,3557
26
+ datachain/cli/commands/du.py,sha256=9edEzDEs98K2VYk8Wf-ZMpUzALcgm9uD6YtoqbvtUGU,391
27
+ datachain/cli/commands/index.py,sha256=eglNaIe1yyIadUHHumjtNbgIjht6kme7SS7xE3YHR88,198
28
+ datachain/cli/commands/ls.py,sha256=Wb8hXyBwyhb62Zk6ZhNFPFrj2lJhdbRcnBQQkgL_qyw,5174
29
+ datachain/cli/commands/misc.py,sha256=c0DmkOLwcDI2YhA8ArOuLJk6aGzSMZCiKL_E2JGibVE,600
30
+ datachain/cli/commands/query.py,sha256=2S7hQxialt1fkbocxi6JXZI6jS5QnFrD1aOjKgZkzfI,1471
31
+ datachain/cli/commands/show.py,sha256=RVb_7Kjd1kzqTxRKYFvmD04LaJHOtrCc4FYMyc-ZEYw,1149
32
+ datachain/cli/parser/__init__.py,sha256=MqtK-IsQlwGqQN_tebbBwZkDJgE4EEjpTctubueQQLA,15489
33
+ datachain/cli/parser/job.py,sha256=KIs4_yIcfr09RqG5Bx7YAd-QlUs7IznUhf34OxX1z2c,3569
34
+ datachain/cli/parser/studio.py,sha256=V3LjaN8gexpMOHdshSCgfwR0LJswE4te0PLqARwwlPA,4044
35
+ datachain/cli/parser/utils.py,sha256=exnlrEQlEa5q0Jh4w_g-1O4niyDixsDpqa1DoIQewok,1590
24
36
  datachain/client/__init__.py,sha256=1kDpCPoibMXi1gExR4lTLc5pi-k6M5TANiwtXkPoLhU,49
25
37
  datachain/client/azure.py,sha256=D-mfLtpiq6O-DaSs-ofEEYhjIZBNfgRw1l9R7UgxEM4,3055
26
38
  datachain/client/fileslice.py,sha256=bT7TYco1Qe3bqoc8aUkUZcPdPofJDHlryL5BsTn9xsY,3021
27
- datachain/client/fsspec.py,sha256=rr6-M1iu30x8PAXpOD84U2Vh4CHU0-SdfJFdVZF3ouA,13650
39
+ datachain/client/fsspec.py,sha256=6Jwd3yaSG93NCfbRxf6I2IUi5t4nfgCp40De916IcoI,13894
28
40
  datachain/client/gcs.py,sha256=MI94GXpCRqAlaF56HNrzQbXA-yR7bn2FOBPzO-lG_SI,4947
29
41
  datachain/client/hf.py,sha256=XeVJVbiNViZCpn3sfb90Fr8SYO3BdLmfE3hOWMoqInE,951
30
42
  datachain/client/local.py,sha256=iHQKh-HhoNzqZ2yaiuIfZWGXtt_X9FMSA-TN_03zjPc,4708
@@ -37,34 +49,34 @@ datachain/data_storage/schema.py,sha256=-QVlRvD0dfu-ZFUxylEoSnLJLnleMEjVlcAb2OGu
37
49
  datachain/data_storage/serializer.py,sha256=6G2YtOFqqDzJf1KbvZraKGXl2XHZyVml2krunWUum5o,927
38
50
  datachain/data_storage/sqlite.py,sha256=iJv1QxwVifOowtYhIDqYVoea21dvkQIdxklGNIend3c,22961
39
51
  datachain/data_storage/warehouse.py,sha256=CMW36ZNrAzoZ003xGkdnIxC7S0PnQxC2588iUMKI9SM,30779
40
- datachain/func/__init__.py,sha256=TG6JHFKtLi06Nd5iLszXIflEq-VKZcKMdgo_KiQ8SGQ,1055
52
+ datachain/func/__init__.py,sha256=mvvuIycO3emE3pgbc1GNTeYbxnvto1yloULBLBBa0g4,1055
41
53
  datachain/func/aggregate.py,sha256=7_IPrIwb2XSs3zG4iOr1eTvzn6kNVe2mkzvNzjusDHk,10942
42
54
  datachain/func/array.py,sha256=zHDNWuWLA7HVa9FEvQeHhVi00_xqenyleTqcLwkXWBI,5477
43
55
  datachain/func/base.py,sha256=wA0sBQAVyN9LPxoo7Ox83peS0zUVnyuKxukwAcjGLfY,534
44
- datachain/func/conditional.py,sha256=mQroxsoExpBW84Zm5dAYP4OpBblWmzfnF2qJq9rba54,2223
45
- datachain/func/func.py,sha256=mJ_rOXMpoqnK4-d5eF9boSMx5hWzgKoMLPGpZQqLAfw,15222
56
+ datachain/func/conditional.py,sha256=iMh13mmeVJq8xa856suPD4ozDWo6-fs3nRtNhmLXGhg,3998
57
+ datachain/func/func.py,sha256=4FJYMqeGD6xNe5ahrFgfthi0DTFb5w3QDLlXxbpHZjU,15371
46
58
  datachain/func/numeric.py,sha256=gMe1Ks0dqQKHkjcpvj7I5S-neECzQ_gltPQLNoaWOyo,5632
47
59
  datachain/func/path.py,sha256=mqN_mfkwv44z2II7DMTp_fGGw95hmTCNls_TOFNpr4k,3155
48
60
  datachain/func/random.py,sha256=pENOLj9rSmWfGCnOsUIaCsVC5486zQb66qfQvXaz9Z4,452
49
61
  datachain/func/string.py,sha256=8az3BTeezlaZt6NW-54GWX7WSosAOVMbTr6bXIYyJq4,5958
50
62
  datachain/func/window.py,sha256=0MB1yjpVbwOrl_WNLZ8V3jkJz3o0XlYinpAcZQJuxiA,1688
51
63
  datachain/lib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
- datachain/lib/arrow.py,sha256=33Od_XECCfWR9PUDBdevSooXS4mpMdPx_hoMLjpaELU,9734
64
+ datachain/lib/arrow.py,sha256=pclruEeTffWZToeDlYDkWdlHZIyXb1YYFSjyutf8CDk,9867
53
65
  datachain/lib/clip.py,sha256=lm5CzVi4Cj1jVLEKvERKArb-egb9j1Ls-fwTItT6vlI,6150
54
66
  datachain/lib/data_model.py,sha256=zS4lmXHVBXc9ntcyea2a1CRLXGSAN_0glXcF88CohgY,2685
55
67
  datachain/lib/dataset_info.py,sha256=IjdF1E0TQNOq9YyynfWiCFTeZpbyGfyJvxgJY4YN810,2493
56
- datachain/lib/dc.py,sha256=UhyNLYVuCPJPz-EamMVPFjYwzJzbFrDzXvb07PscykI,91015
68
+ datachain/lib/dc.py,sha256=5AolChfT41QLhzVX1zaNRsZfQ8BAhLDZVvgu8qiU3jg,91145
57
69
  datachain/lib/diff.py,sha256=Yurzyi7PzZzY80HOnVTpwtbWzSJ1LqN8NgZWwZOh_UU,6732
58
- datachain/lib/file.py,sha256=KeccxOulTQCLitdHZoTaq96xpE-5kmWZCrT9X9bRkD0,15049
70
+ datachain/lib/file.py,sha256=JQ8GfqBwIikdaeSaQzbHo04DZWwNNk_Cgsofh1X7eg8,15047
59
71
  datachain/lib/hf.py,sha256=a-zFpDmZIR4r8dlNNTjfpAKSnuJ9xyRXlgcdENiXt3E,5864
60
72
  datachain/lib/image.py,sha256=AMXYwQsmarZjRbPCZY3M1jDsM2WAB_b3cTY4uOIuXNU,2675
61
- datachain/lib/listing.py,sha256=8OPAJZbjPIGQ7qJPyfJEI1s9j9tP0GkKfyHebjQxPx0,6092
73
+ datachain/lib/listing.py,sha256=6TRVCoXzC83wLFSyVOdA90_yxbKUmgcVYgIDSYuixiA,6621
62
74
  datachain/lib/listing_info.py,sha256=9ua40Hw0aiQByUw3oAEeNzMavJYfW0Uhe8YdCTK-m_g,1110
63
75
  datachain/lib/meta_formats.py,sha256=hDPfEkcmiLZOjhBBXuareMdnq65Wj8vZvxjmum6cROM,6377
64
76
  datachain/lib/model_store.py,sha256=DNIv8Y6Jtk1_idNLzIpsThOsdW2BMAudyUCbPUcgcxk,2515
65
77
  datachain/lib/pytorch.py,sha256=dA3r1JY0wqV_907a1D0lFaEN-7v3fMRpc1ePFE9CnvA,6168
66
78
  datachain/lib/settings.py,sha256=ZELRCTLbi5vzRPiDX6cQ9LLg9TefJ_A05gIGni0lll8,2535
67
- datachain/lib/signal_schema.py,sha256=ziRTctom0-wAqURZfkfG6dc_3P2FcYxKjYsKC49NQ1Q,25415
79
+ datachain/lib/signal_schema.py,sha256=ps5od6zhWtdX3Khx2fwArl2xlGkK8SKi6vCQ6QmbaR0,27404
68
80
  datachain/lib/tar.py,sha256=3WIzao6yD5fbLqXLTt9GhPGNonbFIs_fDRu-9vgLgsA,1038
69
81
  datachain/lib/text.py,sha256=UNHm8fhidk7wdrWqacEWaA6I9ykfYqarQ2URby7jc7M,1261
70
82
  datachain/lib/udf.py,sha256=Rsf_6mN6qCQVknl99yvi1guta1AMnG9MsoPn14ff5Fc,13609
@@ -121,9 +133,9 @@ datachain/sql/sqlite/vector.py,sha256=ncW4eu2FlJhrP_CIpsvtkUabZlQdl2D5Lgwy_cbfqR
121
133
  datachain/toolkit/__init__.py,sha256=eQ58Q5Yf_Fgv1ZG0IO5dpB4jmP90rk8YxUWmPc1M2Bo,68
122
134
  datachain/toolkit/split.py,sha256=z3zRJNzjWrpPuRw-zgFbCOBKInyYxJew8ygrYQRQLNc,2930
123
135
  datachain/torch/__init__.py,sha256=gIS74PoEPy4TB3X6vx9nLO0Y3sLJzsA8ckn8pRWihJM,579
124
- datachain-0.8.3.dist-info/LICENSE,sha256=8DnqK5yoPI_E50bEg_zsHKZHY2HqPy4rYN338BHQaRA,11344
125
- datachain-0.8.3.dist-info/METADATA,sha256=gAPCEMlRQirhIDHK61LPuF1NNNaZQxwMlTVG-8fZDnM,11066
126
- datachain-0.8.3.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
127
- datachain-0.8.3.dist-info/entry_points.txt,sha256=0GMJS6B_KWq0m3VT98vQI2YZodAMkn4uReZ_okga9R4,49
128
- datachain-0.8.3.dist-info/top_level.txt,sha256=lZPpdU_2jJABLNIg2kvEOBi8PtsYikbN1OdMLHk8bTg,10
129
- datachain-0.8.3.dist-info/RECORD,,
136
+ datachain-0.8.4.dist-info/LICENSE,sha256=8DnqK5yoPI_E50bEg_zsHKZHY2HqPy4rYN338BHQaRA,11344
137
+ datachain-0.8.4.dist-info/METADATA,sha256=s91ugEL68b3G1-Fv85lcMTj3C2LiKhlzSLrPP5hrb0E,11075
138
+ datachain-0.8.4.dist-info/WHEEL,sha256=A3WOREP4zgxI0fKrHUG8DC8013e3dK3n7a6HDbcEIwE,91
139
+ datachain-0.8.4.dist-info/entry_points.txt,sha256=0GMJS6B_KWq0m3VT98vQI2YZodAMkn4uReZ_okga9R4,49
140
+ datachain-0.8.4.dist-info/top_level.txt,sha256=lZPpdU_2jJABLNIg2kvEOBi8PtsYikbN1OdMLHk8bTg,10
141
+ datachain-0.8.4.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.6.0)
2
+ Generator: setuptools (75.7.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5