pixeltable 0.4.2__py3-none-any.whl → 0.4.3__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 pixeltable might be problematic. Click here for more details.

Files changed (47) hide show
  1. pixeltable/__init__.py +1 -0
  2. pixeltable/__version__.py +2 -2
  3. pixeltable/catalog/__init__.py +2 -10
  4. pixeltable/catalog/catalog.py +64 -38
  5. pixeltable/catalog/column.py +22 -23
  6. pixeltable/catalog/globals.py +2 -148
  7. pixeltable/catalog/insertable_table.py +6 -4
  8. pixeltable/catalog/path.py +6 -0
  9. pixeltable/catalog/table.py +51 -32
  10. pixeltable/catalog/table_version.py +69 -45
  11. pixeltable/catalog/update_status.py +179 -0
  12. pixeltable/catalog/view.py +9 -2
  13. pixeltable/config.py +76 -12
  14. pixeltable/dataframe.py +1 -1
  15. pixeltable/env.py +29 -0
  16. pixeltable/exec/exec_node.py +7 -24
  17. pixeltable/exec/expr_eval/schedulers.py +134 -7
  18. pixeltable/exprs/column_property_ref.py +21 -9
  19. pixeltable/exprs/column_ref.py +5 -1
  20. pixeltable/exprs/function_call.py +2 -2
  21. pixeltable/exprs/row_builder.py +10 -9
  22. pixeltable/exprs/rowid_ref.py +0 -4
  23. pixeltable/func/function.py +3 -3
  24. pixeltable/functions/audio.py +36 -9
  25. pixeltable/functions/video.py +57 -10
  26. pixeltable/globals.py +61 -1
  27. pixeltable/io/__init__.py +1 -1
  28. pixeltable/io/external_store.py +3 -55
  29. pixeltable/io/globals.py +4 -4
  30. pixeltable/io/hf_datasets.py +10 -2
  31. pixeltable/io/label_studio.py +16 -16
  32. pixeltable/metadata/__init__.py +1 -1
  33. pixeltable/metadata/converters/convert_39.py +125 -0
  34. pixeltable/metadata/converters/util.py +3 -0
  35. pixeltable/metadata/notes.py +1 -0
  36. pixeltable/metadata/schema.py +14 -2
  37. pixeltable/plan.py +4 -0
  38. pixeltable/share/packager.py +20 -38
  39. pixeltable/store.py +18 -50
  40. pixeltable/type_system.py +2 -2
  41. pixeltable/utils/coroutine.py +6 -23
  42. pixeltable/utils/media_store.py +39 -0
  43. {pixeltable-0.4.2.dist-info → pixeltable-0.4.3.dist-info}/METADATA +1 -1
  44. {pixeltable-0.4.2.dist-info → pixeltable-0.4.3.dist-info}/RECORD +47 -45
  45. {pixeltable-0.4.2.dist-info → pixeltable-0.4.3.dist-info}/LICENSE +0 -0
  46. {pixeltable-0.4.2.dist-info → pixeltable-0.4.3.dist-info}/WHEEL +0 -0
  47. {pixeltable-0.4.2.dist-info → pixeltable-0.4.3.dist-info}/entry_points.txt +0 -0
@@ -8,6 +8,8 @@ from sqlalchemy import BigInteger, ForeignKey, Integer, LargeBinary, orm
8
8
  from sqlalchemy.dialects.postgresql import JSONB, UUID
9
9
  from sqlalchemy.orm.decl_api import DeclarativeMeta
10
10
 
11
+ from ..catalog.update_status import UpdateStatus
12
+
11
13
  # Base has to be marked explicitly as a type, in order to be used elsewhere as a type hint. But in addition to being
12
14
  # a type, it's also a `DeclarativeMeta`. The following pattern enables us to expose both `Base` and `Base.metadata`
13
15
  # outside of the module in a typesafe way.
@@ -213,13 +215,15 @@ class Table(Base):
213
215
  lock_dummy: orm.Mapped[int] = orm.mapped_column(BigInteger, nullable=True)
214
216
 
215
217
 
216
- @dataclasses.dataclass
218
+ @dataclasses.dataclass(frozen=True)
217
219
  class TableVersionMd:
218
220
  tbl_id: str # uuid.UUID
219
221
  created_at: float # time.time()
220
222
  version: int
221
223
  schema_version: int
222
- additional_md: dict[str, Any]
224
+ user: Optional[str] = None # User that created this version
225
+ update_status: Optional[UpdateStatus] = None # UpdateStatus of the change that created this version
226
+ additional_md: dict[str, Any] = dataclasses.field(default_factory=dict)
223
227
 
224
228
 
225
229
  class TableVersion(Base):
@@ -308,6 +312,14 @@ class FullTableMd(NamedTuple):
308
312
  version_md: TableVersionMd
309
313
  schema_version_md: TableSchemaVersionMd
310
314
 
315
+ @property
316
+ def is_pure_snapshot(self) -> bool:
317
+ return (
318
+ self.tbl_md.view_md is not None
319
+ and self.tbl_md.view_md.predicate is None
320
+ and len(self.schema_version_md.columns) == 0
321
+ )
322
+
311
323
  def as_dict(self) -> dict[str, Any]:
312
324
  return {
313
325
  'table_id': self.tbl_md.tbl_id,
pixeltable/plan.py CHANGED
@@ -512,6 +512,7 @@ class Planner:
512
512
  # update row builder with column information
513
513
  for i, col in enumerate(all_base_cols):
514
514
  plan.row_builder.add_table_column(col, select_list[i].slot_idx)
515
+ plan.ctx.num_computed_exprs = len(recomputed_exprs)
515
516
  recomputed_user_cols = [c for c in recomputed_cols if c.name is not None]
516
517
  return plan, [f'{c.tbl.name}.{c.name}' for c in updated_cols + recomputed_user_cols], recomputed_user_cols
517
518
 
@@ -659,6 +660,7 @@ class Planner:
659
660
  ignore_errors=True,
660
661
  exact_version_only=view.get_bases(),
661
662
  )
663
+ plan.ctx.num_computed_exprs = len(recomputed_exprs)
662
664
  for i, col in enumerate(copied_cols + list(recomputed_cols)): # same order as select_list
663
665
  plan.row_builder.add_table_column(col, select_list[i].slot_idx)
664
666
  # TODO: avoid duplication with view_load_plan() logic (where does this belong?)
@@ -1057,6 +1059,8 @@ class Planner:
1057
1059
  plan.ctx.batch_size = 16
1058
1060
  plan.ctx.show_pbar = True
1059
1061
  plan.ctx.ignore_errors = True
1062
+ computed_exprs = row_builder.output_exprs - row_builder.input_exprs
1063
+ plan.ctx.num_computed_exprs = len(computed_exprs) # we are adding a computed column, so we need to evaluate it
1060
1064
 
1061
1065
  # we want to flush images
1062
1066
  if col.is_computed and col.is_stored and col.col_type.is_image_type():
@@ -361,49 +361,32 @@ class TableRestorer:
361
361
  )
362
362
 
363
363
  tbl_md = [schema.FullTableMd.from_dict(t) for t in self.md['md']['tables']]
364
+ for md in tbl_md:
365
+ md.tbl_md.is_replica = True
364
366
 
365
- # Create the replica table
366
- # The logic here needs to be completely restructured in order to make it concurrency-safe.
367
- # - Catalog.create_replica() needs to write the metadata and also create the physical store tables
368
- # and populate them, otherwise concurrent readers will see an inconsistent state (table metadata w/o
369
- # an actual table)
370
- # - this could be done one replica at a time (instead of the entire hierarchy)
371
367
  cat = catalog.Catalog.get()
372
- cat.create_replica(catalog.Path(self.tbl_path), tbl_md)
373
- # don't call get_table() until after the calls to create_replica() and __import_table() below;
374
- # the TV instances created by get_table() would be replaced by create_replica(), which creates duplicate
375
- # TV instances for the same replica version, which then leads to failures when constructing queries
376
-
377
- # Now we need to instantiate and load data for replica_tbl and its ancestors, except that we skip
378
- # replica_tbl itself if it's a pure snapshot.
379
- target_md = tbl_md[0]
380
- is_pure_snapshot = (
381
- target_md.tbl_md.view_md is not None
382
- and target_md.tbl_md.view_md.predicate is None
383
- and len(target_md.schema_version_md.columns) == 0
384
- )
385
- if is_pure_snapshot:
386
- ancestor_md = tbl_md[1:] # Pure snapshot; skip replica_tbl
387
- else:
388
- ancestor_md = tbl_md # Not a pure snapshot; include replica_tbl
389
-
390
- # Instantiate data from the Parquet tables.
391
- with Env.get().begin_xact():
392
- for md in ancestor_md[::-1]: # Base table first
393
- # Create a TableVersion instance (and a store table) for this ancestor.
394
- tv = catalog.TableVersion.create_replica(md)
395
- # Now import data from Parquet.
396
- _logger.info(f'Importing table {tv.name!r}.')
397
- self.__import_table(self.tmp_dir, tv, md)
398
-
399
- with cat.begin_xact(for_write=False):
368
+
369
+ with cat.begin_xact(for_write=True):
370
+ # Create (or update) the replica table and its ancestors, along with TableVersion instances for any
371
+ # versions that have not been seen before.
372
+ cat.create_replica(catalog.Path(self.tbl_path), tbl_md)
373
+
374
+ # Now we need to load data for replica_tbl and its ancestors, except that we skip
375
+ # replica_tbl itself if it's a pure snapshot.
376
+ for md in tbl_md[::-1]: # Base table first
377
+ if not md.is_pure_snapshot:
378
+ tv = cat.get_tbl_version(UUID(md.tbl_md.tbl_id), md.version_md.version)
379
+ # Import data from Parquet.
380
+ _logger.info(f'Importing table {tv.name!r}.')
381
+ self.__import_table(self.tmp_dir, tv, md)
382
+
400
383
  return cat.get_table_by_id(UUID(tbl_md[0].tbl_md.tbl_id))
401
384
 
402
385
  def __import_table(self, bundle_path: Path, tv: catalog.TableVersion, tbl_md: schema.FullTableMd) -> None:
403
386
  """
404
387
  Import the Parquet table into the Pixeltable catalog.
405
388
  """
406
- tbl_id = uuid.UUID(tbl_md.tbl_md.tbl_id)
389
+ tbl_id = UUID(tbl_md.tbl_md.tbl_id)
407
390
  parquet_dir = bundle_path / 'tables' / f'tbl_{tbl_id.hex}'
408
391
  parquet_table = pq.read_table(str(parquet_dir))
409
392
  replica_version = tv.version
@@ -626,9 +609,8 @@ class TableRestorer:
626
609
  # First time seeing this pxtmedia:// URL. Relocate the file to the media store and record the mapping
627
610
  # in self.media_files.
628
611
  src_path = self.tmp_dir / 'media' / parsed_url.netloc
629
- dest_path = MediaStore.prepare_media_path(tv.id, media_col_id, tv.version, ext=src_path.suffix)
630
- src_path.rename(dest_path)
631
- self.media_files[url] = urllib.parse.urljoin('file:', urllib.request.pathname2url(str(dest_path)))
612
+ # Move the file to the media store and update the URL.
613
+ self.media_files[url] = MediaStore.relocate_local_media_file(src_path, tv.id, media_col_id, tv.version)
632
614
  return self.media_files[url]
633
615
  # For any type of URL other than a local file, just return the URL as-is.
634
616
  return url
pixeltable/store.py CHANGED
@@ -2,10 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import abc
4
4
  import logging
5
- import os
6
5
  import sys
7
- import urllib.parse
8
- import urllib.request
9
6
  import warnings
10
7
  from typing import Any, Iterable, Iterator, Optional, Union
11
8
 
@@ -14,7 +11,7 @@ import sqlalchemy as sql
14
11
  from tqdm import TqdmWarning, tqdm
15
12
 
16
13
  from pixeltable import catalog, exceptions as excs
17
- from pixeltable.catalog import RowCountStats, UpdateStatus
14
+ from pixeltable.catalog.update_status import RowCountStats
18
15
  from pixeltable.env import Env
19
16
  from pixeltable.exec import ExecNode
20
17
  from pixeltable.metadata import schema
@@ -93,9 +90,8 @@ class StoreBase:
93
90
  # to the last sql.Table version we created and cannot be reused
94
91
  col.create_sa_cols()
95
92
  all_cols.append(col.sa_col)
96
- if col.records_errors:
97
- all_cols.append(col.sa_errormsg_col)
98
- all_cols.append(col.sa_errortype_col)
93
+ if col.stores_cellmd:
94
+ all_cols.append(col.sa_cellmd_col)
99
95
 
100
96
  if self.sa_tbl is not None:
101
97
  # if we're called in response to a schema change, we need to remove the old table first
@@ -127,27 +123,7 @@ class StoreBase:
127
123
  """Return the name of the data store table"""
128
124
 
129
125
  def _move_tmp_media_file(self, file_url: Optional[str], col: catalog.Column, v_min: int) -> str:
130
- """Move tmp media file with given url to Env.media_dir and return new url, or given url if not a tmp_dir file"""
131
- if file_url is None:
132
- return None
133
- assert isinstance(file_url, str), type(file_url)
134
- pxt_tmp_dir = str(Env.get().tmp_dir)
135
- parsed = urllib.parse.urlparse(file_url)
136
- # We should never be passed a local file path here. The "len > 1" ensures that Windows
137
- # file paths aren't mistaken for URLs with a single-character scheme.
138
- assert len(parsed.scheme) > 1, file_url
139
- if parsed.scheme != 'file':
140
- # remote url
141
- return file_url
142
- file_path = urllib.parse.unquote(urllib.request.url2pathname(parsed.path))
143
- if not file_path.startswith(pxt_tmp_dir):
144
- # not a tmp file
145
- return file_url
146
- _, ext = os.path.splitext(file_path)
147
- new_path = str(MediaStore.prepare_media_path(self.tbl_version.id, col.id, v_min, ext=ext))
148
- os.rename(file_path, new_path)
149
- new_file_url = urllib.parse.urljoin('file:', urllib.request.pathname2url(new_path))
150
- return new_file_url
126
+ return MediaStore.move_tmp_media_file(file_url, self.tbl_version.id, col.id, v_min)
151
127
 
152
128
  def _move_tmp_media_files(
153
129
  self, table_row: list[Any], media_cols_by_sql_idx: dict[int, catalog.Column], v_min: int
@@ -189,11 +165,10 @@ class StoreBase:
189
165
  col_type_str = col.get_sa_col_type().compile(dialect=conn.dialect)
190
166
  s_txt = f'ALTER TABLE {self._storage_name()} ADD COLUMN {col.store_name()} {col_type_str} NULL'
191
167
  added_storage_cols = [col.store_name()]
192
- if col.records_errors:
193
- # we also need to create the errormsg and errortype storage cols
194
- s_txt += f' , ADD COLUMN {col.errormsg_store_name()} VARCHAR DEFAULT NULL'
195
- s_txt += f' , ADD COLUMN {col.errortype_store_name()} VARCHAR DEFAULT NULL'
196
- added_storage_cols.extend([col.errormsg_store_name(), col.errortype_store_name()])
168
+ if col.stores_cellmd:
169
+ cellmd_type_str = col.sa_cellmd_type().compile(dialect=conn.dialect)
170
+ s_txt += f' , ADD COLUMN {col.cellmd_store_name()} {cellmd_type_str} DEFAULT NULL'
171
+ added_storage_cols.append(col.cellmd_store_name())
197
172
 
198
173
  stmt = sql.text(s_txt)
199
174
  log_stmt(_logger, stmt)
@@ -204,9 +179,8 @@ class StoreBase:
204
179
  def drop_column(self, col: catalog.Column) -> None:
205
180
  """Execute Alter Table Drop Column statement"""
206
181
  s_txt = f'ALTER TABLE {self._storage_name()} DROP COLUMN {col.store_name()}'
207
- if col.records_errors:
208
- s_txt += f' , DROP COLUMN {col.errormsg_store_name()}'
209
- s_txt += f' , DROP COLUMN {col.errortype_store_name()}'
182
+ if col.stores_cellmd:
183
+ s_txt += f' , DROP COLUMN {col.cellmd_store_name()}'
210
184
  stmt = sql.text(s_txt)
211
185
  log_stmt(_logger, stmt)
212
186
  Env.get().conn.execute(stmt)
@@ -239,10 +213,9 @@ class StoreBase:
239
213
  tmp_val_col = sql.Column(col.sa_col.name, col.sa_col.type)
240
214
  tmp_cols = [*tmp_pk_cols, tmp_val_col]
241
215
  # add error columns if the store column records errors
242
- if col.records_errors:
243
- tmp_errortype_col = sql.Column(col.sa_errortype_col.name, col.sa_errortype_col.type)
244
- tmp_errormsg_col = sql.Column(col.sa_errormsg_col.name, col.sa_errormsg_col.type)
245
- tmp_cols.extend((tmp_errortype_col, tmp_errormsg_col))
216
+ if col.stores_cellmd:
217
+ tmp_cellmd_col = sql.Column(col.sa_cellmd_col.name, col.sa_cellmd_col.type)
218
+ tmp_cols.append(tmp_cellmd_col)
246
219
  tmp_col_names = [col.name for col in tmp_cols]
247
220
 
248
221
  tmp_tbl = sql.Table(tmp_name, self.sa_md, *tmp_cols, prefixes=['TEMPORARY'])
@@ -285,10 +258,8 @@ class StoreBase:
285
258
  for pk_col, tmp_pk_col in zip(self.pk_columns(), tmp_pk_cols):
286
259
  update_stmt = update_stmt.where(pk_col == tmp_pk_col)
287
260
  update_stmt = update_stmt.values({col.sa_col: tmp_val_col})
288
- if col.records_errors:
289
- update_stmt = update_stmt.values(
290
- {col.sa_errortype_col: tmp_errortype_col, col.sa_errormsg_col: tmp_errormsg_col}
291
- )
261
+ if col.stores_cellmd:
262
+ update_stmt = update_stmt.values({col.sa_cellmd_col: tmp_cellmd_col})
292
263
  log_explain(_logger, update_stmt, conn)
293
264
  conn.execute(update_stmt)
294
265
 
@@ -309,7 +280,7 @@ class StoreBase:
309
280
  show_progress: bool = True,
310
281
  rowids: Optional[Iterator[int]] = None,
311
282
  abort_on_exc: bool = False,
312
- ) -> tuple[set[int], UpdateStatus]:
283
+ ) -> tuple[set[int], RowCountStats]:
313
284
  """Insert rows into the store table and update the catalog table's md
314
285
  Returns:
315
286
  number of inserted rows, number of exceptions, set of column ids that have exceptions
@@ -373,12 +344,9 @@ class StoreBase:
373
344
  if progress_bar is not None:
374
345
  progress_bar.close()
375
346
  computed_values = exec_plan.ctx.num_computed_exprs * num_rows
376
- row_counts = RowCountStats(
377
- ins_rows=num_rows, num_excs=num_excs, computed_values=computed_values
378
- ) # insert (StoreBase)
379
-
380
- return cols_with_excs, UpdateStatus(row_count_stats=row_counts)
347
+ row_counts = RowCountStats(ins_rows=num_rows, num_excs=num_excs, computed_values=computed_values)
381
348
 
349
+ return cols_with_excs, row_counts
382
350
  finally:
383
351
  exec_plan.close()
384
352
 
pixeltable/type_system.py CHANGED
@@ -1153,8 +1153,8 @@ class ImageType(ColumnType):
1153
1153
  img.load()
1154
1154
  return img
1155
1155
  except Exception as exc:
1156
- errormsg_val = val if len(val) < 50 else val[:50] + '...'
1157
- raise excs.Error(f'data URL could not be decoded into a valid image: {errormsg_val}') from exc
1156
+ error_msg_val = val if len(val) < 50 else val[:50] + '...'
1157
+ raise excs.Error(f'data URL could not be decoded into a valid image: {error_msg_val}') from exc
1158
1158
  return val
1159
1159
 
1160
1160
  def _validate_literal(self, val: Any) -> None:
@@ -1,10 +1,10 @@
1
1
  import asyncio
2
2
  import threading
3
- from concurrent.futures import ThreadPoolExecutor
4
3
  from typing import Any, Coroutine, TypeVar
5
4
 
6
- T = TypeVar('T')
5
+ from pixeltable.env import Env
7
6
 
7
+ T = TypeVar('T')
8
8
 
9
9
  # TODO This is a temporary hack to be able to run async UDFs in contexts that are not properly handled by the existing
10
10
  # scheduler logic (e.g., as an embedding function as part of a similarity lookup). Once the scheduler is fully
@@ -15,27 +15,10 @@ def run_coroutine_synchronously(coroutine: Coroutine[Any, Any, T], timeout: floa
15
15
  """
16
16
  Runs the given coroutine synchronously, even if called in the context of a running event loop.
17
17
  """
18
-
19
- def run_in_new_loop() -> T:
20
- new_loop = asyncio.new_event_loop()
21
- asyncio.set_event_loop(new_loop)
22
- try:
23
- return new_loop.run_until_complete(coroutine)
24
- finally:
25
- new_loop.close()
26
-
27
- try:
28
- loop = asyncio.get_running_loop()
29
- except RuntimeError:
30
- # No event loop; just call `asyncio.run()`
31
- return asyncio.run(coroutine)
18
+ loop = Env.get().event_loop
32
19
 
33
20
  if threading.current_thread() is threading.main_thread():
34
- if not loop.is_running():
35
- return loop.run_until_complete(coroutine)
36
- else:
37
- with ThreadPoolExecutor() as pool:
38
- future = pool.submit(run_in_new_loop)
39
- return future.result(timeout=timeout)
21
+ return loop.run_until_complete(coroutine)
40
22
  else:
41
- return asyncio.run_coroutine_threadsafe(coroutine, loop).result()
23
+ # Not in main thread, use run_coroutine_threadsafe
24
+ return asyncio.run_coroutine_threadsafe(coroutine, loop).result(timeout)
@@ -2,6 +2,7 @@ import glob
2
2
  import os
3
3
  import re
4
4
  import shutil
5
+ import urllib
5
6
  import uuid
6
7
  from collections import defaultdict
7
8
  from pathlib import Path
@@ -34,6 +35,44 @@ class MediaStore:
34
35
  parent.mkdir(parents=True, exist_ok=True)
35
36
  return parent / f'{tbl_id.hex}_{col_id}_{version}_{id_hex}{ext or ""}'
36
37
 
38
+ @classmethod
39
+ def move_tmp_media_file(cls, file_url: Optional[str], tbl_id: UUID, col_id: int, v_min: int) -> Optional[str]:
40
+ """Move a tmp media file with given url into the MediaStore, and return new url
41
+ If it is not a tmp file in the tmp_dir, return the original url.
42
+
43
+ Args:
44
+ file_url: URL of the tmp media file to move
45
+ tbl_id: Table ID to associate with the media file
46
+ col_id: Column ID to associate with the media file
47
+ v_min: Version number to associate with the media file
48
+
49
+ Returns:
50
+ URL of the media final location of the file
51
+ """
52
+ if file_url is None:
53
+ return None
54
+ assert isinstance(file_url, str), type(file_url)
55
+ pxt_tmp_dir = str(Env.get().tmp_dir)
56
+ parsed = urllib.parse.urlparse(file_url)
57
+ # We should never be passed a local file path here. The "len > 1" ensures that Windows
58
+ # file paths aren't mistaken for URLs with a single-character scheme.
59
+ assert len(parsed.scheme) > 1, file_url
60
+ if parsed.scheme != 'file':
61
+ # remote url
62
+ return file_url
63
+ file_path = urllib.parse.unquote(urllib.request.url2pathname(parsed.path))
64
+ if not file_path.startswith(pxt_tmp_dir):
65
+ # not a tmp file
66
+ return file_url
67
+ new_file_url = cls.relocate_local_media_file(Path(file_path), tbl_id, col_id, v_min)
68
+ return new_file_url
69
+
70
+ @classmethod
71
+ def relocate_local_media_file(cls, src_path: Path, tbl_id: UUID, col_id: int, tbl_version: int) -> str:
72
+ dest_path = MediaStore.prepare_media_path(tbl_id, col_id, tbl_version, ext=src_path.suffix)
73
+ src_path.rename(dest_path)
74
+ return urllib.parse.urljoin('file:', urllib.request.pathname2url(str(dest_path)))
75
+
37
76
  @classmethod
38
77
  def delete(cls, tbl_id: UUID, version: Optional[int] = None) -> None:
39
78
  """Delete all files belonging to tbl_id. If version is not None, delete
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pixeltable
3
- Version: 0.4.2
3
+ Version: 0.4.3
4
4
  Summary: AI Data Infrastructure: Declarative, Multimodal, and Incremental
5
5
  License: Apache-2.0
6
6
  Keywords: data-science,machine-learning,database,ai,computer-vision,chatbot,ml,artificial-intelligence,feature-engineering,multimodal,mlops,feature-store,vector-database,llm,genai
@@ -1,22 +1,23 @@
1
- pixeltable/__init__.py,sha256=WHZxJNz7vYcx_z3ebEg-RF22lJmlkfeqF2gv6mnrM1A,1449
2
- pixeltable/__version__.py,sha256=Tmdd4CrKsWN9gJkcXq-VR-egqtuKLYkyRkraXpi-2Kk,112
3
- pixeltable/catalog/__init__.py,sha256=pI6ncW9nJadW9ht_Mt1BYiY9kNMOwGxAb6n4q1oV61w,635
4
- pixeltable/catalog/catalog.py,sha256=pcZMrz9THSzjYusTlB0jTtrxOQzFT_xanONYTTpvhaU,73943
5
- pixeltable/catalog/column.py,sha256=ujoVR8gxuJwqYfIVsRT14TJ9nUxuczKJBJ-q-2klHUw,11571
1
+ pixeltable/__init__.py,sha256=-bu8Al-s2PyGpPYZgj016gMl9s6NMQfjxVRwvhfd8IY,1457
2
+ pixeltable/__version__.py,sha256=M4v_pNiomPFxqBLXiV15gErZhRoX50LOCHOE430L1kM,112
3
+ pixeltable/catalog/__init__.py,sha256=qXP4X1r5rVPvex_lIPSlQZrM7CoIxuvSI69h50SUlaE,624
4
+ pixeltable/catalog/catalog.py,sha256=GMXR63x0OzGrST0vhg7OEfyTBllaYkt-8AY_b7mbbfM,75418
5
+ pixeltable/catalog/column.py,sha256=HZfujfvdkJeyOWfgmVutJLWOy19R8ZFczaEjYTZ5NQo,11495
6
6
  pixeltable/catalog/dir.py,sha256=HFemOf67Nfw13EOpQsR_UgzP2L1w4LDfw2009DrSK0Y,2063
7
- pixeltable/catalog/globals.py,sha256=_qAs5g0Uxtw8oUjCdnRlZ9-_F6E2bm4OmLYb2Fg6YiU,8470
8
- pixeltable/catalog/insertable_table.py,sha256=inBrPkcu08DAsYzFkq3I53eU-j7pqmlscoTZzEdaI54,9377
7
+ pixeltable/catalog/globals.py,sha256=uMIDsbeDzFxZbcgKDTOiT5plC1gAKgz1oxxdh1odIPw,2648
8
+ pixeltable/catalog/insertable_table.py,sha256=zK48JZYWz4aKus97OOH51E1vcSFdEwzY_muf5X6wpP0,9442
9
9
  pixeltable/catalog/named_function.py,sha256=vZ-j7P4HugWh9OmUzBMwyRYvO3tQn9jWyJz_1stPavU,1210
10
- pixeltable/catalog/path.py,sha256=gk8TIlO_7Jpji5mAN0dUNvHmvU0uneTHeB_qCTWnszQ,2529
10
+ pixeltable/catalog/path.py,sha256=VdoRy2eRVyR3FhJoo8wVFcuqqEq4o36RJsJ0cDX4Cac,2705
11
11
  pixeltable/catalog/schema_object.py,sha256=jqOhZcI9QbT_EseDRQsVrp4pZ7jKB1wy4Sa-6aAvUCI,2004
12
- pixeltable/catalog/table.py,sha256=SZohsmgrjcdOCS_xTvkZXzFPTSfHuXE3bQBsDhyFHSU,75618
13
- pixeltable/catalog/table_version.py,sha256=EWB-49ce8Sm9DNaSGTxZohr2IecyzAhf9c6Bm4zQtOc,67018
12
+ pixeltable/catalog/table.py,sha256=7CL-_xsO258VH-3vbQ7XgS_kr8-dGHpJT4w07bH9nI4,76331
13
+ pixeltable/catalog/table_version.py,sha256=9K9_QDM8-PyRH79nE5KX-C__QAounUPB24-QQ3aPiEk,68208
14
14
  pixeltable/catalog/table_version_handle.py,sha256=FTPRqcGY-h-POcWyZbd9b8P2D5zIw5OSUvwF_dbyCGo,3608
15
15
  pixeltable/catalog/table_version_path.py,sha256=uRATYbAN0OXEkW1GZEC4hZulzvh8IJRwaN66ifUTJfw,9787
16
- pixeltable/catalog/view.py,sha256=oo1JU5dtz3tasXZm3FkbfZqwyCc9xgdIE9hOqh5tRy4,14677
17
- pixeltable/config.py,sha256=HIAyV3UGlcuQnHofKsid7wup518q_WfN6G-KB4yu_3g,4280
18
- pixeltable/dataframe.py,sha256=dTpjM72Cj2cYMo0_HH2BJ6P3s9rQAF4suuL413BDyJw,60673
19
- pixeltable/env.py,sha256=I8rvQQjvHB68rYCoSurR4pjn5qm6EvSwRL1CblUVPWs,35625
16
+ pixeltable/catalog/update_status.py,sha256=tF3KkDc6kvEQ7Tg3VMj-n774uKi1iLla61wLyeuwDRs,6888
17
+ pixeltable/catalog/view.py,sha256=FeTKerWVQfWv2yJgj2yc2E_m0qINFyTbCPO5SSYixZM,15053
18
+ pixeltable/config.py,sha256=UGLZ-A7exqGB5os3BluMXXj3iEo7mGQKBXebriTZjkQ,7148
19
+ pixeltable/dataframe.py,sha256=964O5FaXup7XxcwwRQCgEgq62UrqWnGWn8TLU5UOuoY,60679
20
+ pixeltable/env.py,sha256=GyQAE6R5IXbvdvNFgWj8BxEuKOpBwLSNUlde0e1YSME,36913
20
21
  pixeltable/exceptions.py,sha256=Gm8d3TL2iiv6Pj2DLd29wp_j41qNBhxXL9iTQnL4Nk4,1116
21
22
  pixeltable/exec/__init__.py,sha256=hQvj4ra4ubxu94qyuCBTHKsuYGzundkTTluOTIb5Bx8,524
22
23
  pixeltable/exec/aggregation_node.py,sha256=HqzISO1nv7_DFyqjZLRkjtbDJl9fIEto1i6Kh5ru8vA,4498
@@ -24,28 +25,28 @@ pixeltable/exec/cache_prefetch_node.py,sha256=GOa70eJDFY3FQV3VvJOrUVI8LFvro-r-V6
24
25
  pixeltable/exec/component_iteration_node.py,sha256=FZszWHrzsjHxCbUTwXtJIlgQqgYtvKZB6QWiDGkfIbs,4757
25
26
  pixeltable/exec/data_row_batch.py,sha256=EAB15JRhXbWIe91x1J5N5lFiMXzjB8NGTFjZsBDSbf8,3393
26
27
  pixeltable/exec/exec_context.py,sha256=jKeLStfkjwCKKAooC-7a7qZUnZU5O0_JQhanhVerV9c,984
27
- pixeltable/exec/exec_node.py,sha256=MsuCO7nCpmqfuNxTNKsz36sJVDrR-o-0-3S2FcXLwvM,4237
28
+ pixeltable/exec/exec_node.py,sha256=dEPVuXFU4niYONCk9ThKx8cZUBNkv0gbmKMDERgdDks,3671
28
29
  pixeltable/exec/expr_eval/__init__.py,sha256=sQThSEByK_DLfB-_-18RFhpARx49cSXYEkpCDyi0vQI,61
29
30
  pixeltable/exec/expr_eval/evaluators.py,sha256=-6s_y29Wh8p35SVKkXtnA0NkzcHVw1Z8PgHGiFrMsqs,17135
30
31
  pixeltable/exec/expr_eval/expr_eval_node.py,sha256=klPhvsug91GiPIHkwcTj1ympxsoj8nbNHzkzkC-NR88,18953
31
32
  pixeltable/exec/expr_eval/globals.py,sha256=fFrj2O53TgHDfVF8dgnyn1fPLi4ZHQuylewf5aHMwYk,7752
32
33
  pixeltable/exec/expr_eval/row_buffer.py,sha256=YY0thdlMNNReEOTyPp36xKPeMeXSZ0VrI9bJsXgo7sU,2744
33
- pixeltable/exec/expr_eval/schedulers.py,sha256=tAvCQKa1q0x7y7cdnGcTGbeku8QcoKH1GkgSm8ktOnM,17000
34
+ pixeltable/exec/expr_eval/schedulers.py,sha256=DuebLy_3Bu3MTUG3AQNk7JcVv69OeeRFu5bcZGT5T2c,22233
34
35
  pixeltable/exec/in_memory_data_node.py,sha256=vmxD2Jwn15Wjkf_3wufr35SPjb60H_I4zpUKaO1Zo_s,3592
35
36
  pixeltable/exec/row_update_node.py,sha256=zU0eSyn81-vRrjAMOadRqU8luTshnPUtIbS7npyLBKY,2798
36
37
  pixeltable/exec/sql_node.py,sha256=cMoBGPOFVmvL3UFjCKxhU3huJu_ko0PRr55-XhbF1i0,27572
37
38
  pixeltable/exprs/__init__.py,sha256=AxSMjKNavCT9F6vBaNR-nwX2iupAI5hbMb5hEj65Tfk,1096
38
39
  pixeltable/exprs/arithmetic_expr.py,sha256=sZPao0qdFWbrDx0eiAVxw1wGHJXZ5ZoCpQaScysBldE,7333
39
40
  pixeltable/exprs/array_slice.py,sha256=8Zv0E2RghdJi1Mbk0kKtOz2ccGQuXwLLb6R9v1jk7hA,2180
40
- pixeltable/exprs/column_property_ref.py,sha256=zcp0tuW0m1czslIAo_ucGkmGAIWxeeCvWzXy1NyetgQ,3760
41
- pixeltable/exprs/column_ref.py,sha256=0n6jcHeWd3dOaqrLPHQ6VjYDwgS0OMLqX3H0k60_-lE,15216
41
+ pixeltable/exprs/column_property_ref.py,sha256=rq8VD34fZwAZuN9wIqQEwVay7LTPBKvXXdZPknOJM6M,4422
42
+ pixeltable/exprs/column_ref.py,sha256=msZ0m-Da_H-jpm89TkFiVHx_0LidCyN91gluBqZ0Wys,15359
42
43
  pixeltable/exprs/comparison.py,sha256=lgaRx000ZaNH10A4hrtsi5XoZKE-CNEONGMi7jxJfcM,5133
43
44
  pixeltable/exprs/compound_predicate.py,sha256=vJVRVueAmaKnjiHCLWyh8wHgktzzK0DVqbOIQJgTjF8,3801
44
45
  pixeltable/exprs/data_row.py,sha256=4mW5Q56L53gLAX7xI0uBRW7a5Ax66Q0W9Bi-k_ZBoe8,11800
45
46
  pixeltable/exprs/expr.py,sha256=uLEMuJzHwPW3hBIcsASnhjcPyGBkY8_8sFCqgRetKP0,36013
46
47
  pixeltable/exprs/expr_dict.py,sha256=2ZeZ0eACx3VrRNEOjipuT5WxOIzjXQ_DSip8NTH0KRo,1584
47
48
  pixeltable/exprs/expr_set.py,sha256=OlRTbHAAYH2fOEs1HE-8DIu7Z247xVfoT_9Y58GZoOQ,2559
48
- pixeltable/exprs/function_call.py,sha256=_PxrEACVyiihdQdmTiiSv5WkZfOXSQFcGO18wPueM_Y,21989
49
+ pixeltable/exprs/function_call.py,sha256=k5_a9Fb7arw1q3PnInl8kpNKvlEZcYyOR_yOzRItKUU,21992
49
50
  pixeltable/exprs/globals.py,sha256=NIi16GCPYNFNrhDC0_IemHjFZEtbILJNmdxdguSdy00,2315
50
51
  pixeltable/exprs/in_predicate.py,sha256=u98JmBX9XsglKe5uCy1NUMnyi3wioBri_tue2vI9_sk,3799
51
52
  pixeltable/exprs/inline_expr.py,sha256=XYVKKXZN9BtHN5qlvZna-mgdOlot6WcmPu5usRBYei0,7972
@@ -55,8 +56,8 @@ pixeltable/exprs/json_path.py,sha256=sFuDjfz8_rlea4TKd68CS4pQTUiLDi68YwsgcQRHffI
55
56
  pixeltable/exprs/literal.py,sha256=OCJL_pw_WKqx3bXMEwL6yNaKVAKDtGRzSZUFwucRxZI,4860
56
57
  pixeltable/exprs/method_ref.py,sha256=NNhJTGo7luZLh8EJdFIZAax9LiiqqDCEK1AwPmHip0w,2642
57
58
  pixeltable/exprs/object_ref.py,sha256=idYFcT27jv0BjtJT3paL37xDrZZc35_3eCJyQOIqdZU,1999
58
- pixeltable/exprs/row_builder.py,sha256=90pYDuHd1fbaqbriYwl9iz3ciilbUAg_dq7M3lRq1j4,22334
59
- pixeltable/exprs/rowid_ref.py,sha256=SCPsDx3R55wtK-ND2xQQdV823RdeTF5HTcQ76e40NOE,5186
59
+ pixeltable/exprs/row_builder.py,sha256=K_HVjS1yxq2WImhVxSG_BG86ZyHaftfLenX5eVkQBmI,22394
60
+ pixeltable/exprs/rowid_ref.py,sha256=8MvQs3Uu01Gz__WXw9BCJv0CHrSaFDuQtU7rUr1AWEk,5008
60
61
  pixeltable/exprs/similarity_expr.py,sha256=i0UUnMSKKGXd3Uksu6FU2NvkfG0qzfzfi-GPy-LdutM,3688
61
62
  pixeltable/exprs/sql_element_cache.py,sha256=c7Q6vFK4xnf9vmcRYnXiAcwPBBwmw0dolftM4BwDO8c,1359
62
63
  pixeltable/exprs/string_op.py,sha256=8GkqYpZrSJjHX1ghsUMI9Op2NJyBbvmLWJwDYf_vad0,4171
@@ -70,7 +71,7 @@ pixeltable/func/__init__.py,sha256=SQPtGr_9dZNyXzxaZQcP3oVLKnbbs4UqV6sg8XUQHxQ,5
70
71
  pixeltable/func/aggregate_function.py,sha256=5_MgqHAlMaacX2sPIHv_auTvYXtqR5MIZy_WqYQSdho,13264
71
72
  pixeltable/func/callable_function.py,sha256=g_pA-g631YcFGLix9PpHYfgjOeS2qF0Csm1VxX8fah0,9278
72
73
  pixeltable/func/expr_template_function.py,sha256=wEidKrOBTZkA3U1PAtG6-6RlDFiiRJszIG4zNOuPcNY,5940
73
- pixeltable/func/function.py,sha256=w1U3j8XNeE4ZZ-rKuG13aTa8YGFkWAXjalh4j29_-e4,23136
74
+ pixeltable/func/function.py,sha256=3nSXRdGFGi471x7_TMVdSgXs1SQuLv4HaUJA7NLhv_M,23140
74
75
  pixeltable/func/function_registry.py,sha256=7AQ1bdF2DJbTRn9xx6s5cC_VHtCBXGt_GyJJEjJHcMw,12308
75
76
  pixeltable/func/globals.py,sha256=5Wo4GPxYgHRRk5nvV0h_lAthKSalxKvj5n1p-uMPR0U,1501
76
77
  pixeltable/func/mcp.py,sha256=P9M2w8cm7ad-XmAcf2ZThfWmD8W46De1spwX98bZL4Y,2861
@@ -80,7 +81,7 @@ pixeltable/func/tools.py,sha256=hKmQFvfpBvtLcItPRpqAmqt_tDg6latwyfv5FXBofBc,6074
80
81
  pixeltable/func/udf.py,sha256=6tKpMt37t3BmXwRyA5fFAd6OM4D5EPEd2KuAr7DQhr0,13231
81
82
  pixeltable/functions/__init__.py,sha256=Akk6Nk-rpz2D_V4kJTfyP56xnNbCz3EtxVAuwLoiysA,588
82
83
  pixeltable/functions/anthropic.py,sha256=G2E0sH5vP933eZZxhz1tOByy5cg6N2XPvhSqIBzqufo,8782
83
- pixeltable/functions/audio.py,sha256=7bsm4igQEW7RYSrSevwqaUOqyEnvBbPbJ8c-VknDl1E,657
84
+ pixeltable/functions/audio.py,sha256=6_tUhSZgxhOQQJemvZYNEoKNjWdr3SgJsvLkKCSmtfw,1633
84
85
  pixeltable/functions/bedrock.py,sha256=lTCFHjYunF3minBGWcjXR90yJ8resFjXr4niyKhfxms,4217
85
86
  pixeltable/functions/date.py,sha256=WUwqyrOWB8A00cTNEd6Vd7anQZo40_-7EWhpfpI-P6c,5323
86
87
  pixeltable/functions/deepseek.py,sha256=IAo2e_DhkM0A5NrskxuPQUGYzIYAl4do_mdO1Qc3PeY,3338
@@ -101,21 +102,21 @@ pixeltable/functions/string.py,sha256=LdBNOna5PUSPmM5VlJ_qhmwzyFhumW0k6Dvx2rXSZt
101
102
  pixeltable/functions/timestamp.py,sha256=0zp4urJagCcNLfJE0ltTCft-J9qs2C716TmRngKYaa0,9171
102
103
  pixeltable/functions/together.py,sha256=A8J19BXywyWQ6a2_n05-8uIG5jquOBGqPmW3mb-NrIc,8842
103
104
  pixeltable/functions/util.py,sha256=uQNkyBSkTVMe1wbUI2Q0nz-mM3qPVTF86yK8c9OFIcE,954
104
- pixeltable/functions/video.py,sha256=jS4YhMofD448YhGtI6ZXBAkeGw_AYYQTN0AbgHh_hok,6933
105
+ pixeltable/functions/video.py,sha256=XYxfVH7kTHx3RXruKIy2bfiNdX5uCjJ85u2G4kZFJFA,8654
105
106
  pixeltable/functions/vision.py,sha256=_a0wY3akkVhWnnxlq__1VzSLylytlNadpNOOPOwSfLk,15393
106
107
  pixeltable/functions/whisper.py,sha256=c9E6trhc2UcShVaGaEBCUEpArke1ql3MV5We0qSgmuU,2960
107
- pixeltable/globals.py,sha256=cQUzDiYzDftRhX1jwi1hi6OYx0zlDAMr04nShq75Knk,32226
108
+ pixeltable/globals.py,sha256=eAe9fLz47ergwatmlxptzMc0Z1dfWXHSV8Ih_6dgSjo,34438
108
109
  pixeltable/index/__init__.py,sha256=97aFuxiP_oz1ldn5iq8IWApkOV8XG6ZIBW5-9rkS0vM,122
109
110
  pixeltable/index/base.py,sha256=200s7v3Zy810bRlbSAYzxxaEjVssl6r8esTHiSvWRwQ,1704
110
111
  pixeltable/index/btree.py,sha256=8B06D67ay0DFUtEBC5q4bLjxMq7ILpKyyoLAiSaamzA,2503
111
112
  pixeltable/index/embedding_index.py,sha256=B_k_3UJmSv7t2ljUg8GC_D4t1jc03PVsTAvxqiTmHBA,11754
112
- pixeltable/io/__init__.py,sha256=Yjq13pBCBoaZv-OkIY2XSusVOC5b6cB5C6NbgJq5H1g,620
113
+ pixeltable/io/__init__.py,sha256=chVGh3ygtZwSY6g_skIyCsjxwzo2847jDq9YGObAY98,608
113
114
  pixeltable/io/datarows.py,sha256=p1UGxQOTjqI6kgQNAa3aj8TkylcNDtaGBTorOg_Pk84,6088
114
- pixeltable/io/external_store.py,sha256=cs-_pbRpINTpVMoMRmaoHdYjrjoW--6MyYAG7aF_Efc,16515
115
+ pixeltable/io/external_store.py,sha256=rOYBwTqcZZVU2toWxJ_9Iy2w2YO0DhuABrM2xGmqHSo,14787
115
116
  pixeltable/io/fiftyone.py,sha256=v0r28bIk2I0TRP5DfVHtBIUa4DpIJDK5sgExxOmHZ_w,6882
116
- pixeltable/io/globals.py,sha256=hxiwdCrRMGZ0IMPtleVkiqnthwHG-oemDV10Kf1Lbnk,11362
117
- pixeltable/io/hf_datasets.py,sha256=gWyBH_0iFvxcrrxMY9_W399ZRcNDCmWFOAMmb1apnY0,5246
118
- pixeltable/io/label_studio.py,sha256=rcsOp45c5CyY5ArkKJz_jyE40edpFPgU_8ZDaV2UrgQ,31423
117
+ pixeltable/io/globals.py,sha256=so-skHogbXocuzI_IweH2cEX_SW_tDvFqBZyxeMyMzc,11375
118
+ pixeltable/io/hf_datasets.py,sha256=USCWp0nqs2D9FFfxlGhFy6pn2kDUwGfDHgUiv0-osc8,5634
119
+ pixeltable/io/label_studio.py,sha256=XpPkOLktm37Jnhh5ce1PQpUYzeuPJjoCZDaSGedagF4,31426
119
120
  pixeltable/io/pandas.py,sha256=AbOeRDlA4MvUvianSKixsU-x-64nasPWw4HCHD6emz4,8981
120
121
  pixeltable/io/parquet.py,sha256=-cxyy9wMRzGFDJWhUIjACfQMyAmajyoFcTXSkB8qESE,7818
121
122
  pixeltable/io/table_data_conduit.py,sha256=8SEcOPTgPiKHqlDp0rvGcPOF4v8jRX5TwHwfi5MHYt4,22003
@@ -127,7 +128,7 @@ pixeltable/iterators/document.py,sha256=wJYSnzusJFaxipv5y0uQw-surN9fFz0Aq-s7w_l_
127
128
  pixeltable/iterators/image.py,sha256=nWm-03CxNvHRdTr8U6PvWEnEiquqIQNG5rB-3Y44Mm4,3440
128
129
  pixeltable/iterators/string.py,sha256=URj5edWp-CsorjN_8nnfWGvtIFs_Zh4VPm6htlJbFkU,1257
129
130
  pixeltable/iterators/video.py,sha256=L5S1YPmT_zM11vW9fK6d5nQpUvHVewQWmfDmy4BD45E,9134
130
- pixeltable/metadata/__init__.py,sha256=iDL2NJXvrJoc6pJ7xWLaQLZnzXt58UfnPRZw0U3Ci2Q,3154
131
+ pixeltable/metadata/__init__.py,sha256=iJxMsd3s5yNZ5ciIBzQCa0frXZKgvFj2_-H0Sf4N1mk,3154
131
132
  pixeltable/metadata/converters/convert_10.py,sha256=myYIo1DyccnsQUxDKG6mafnU5ge_EhZpHg_pesKBoK4,708
132
133
  pixeltable/metadata/converters/convert_12.py,sha256=Ci-qyZW1gqci-8wnjeOB5afdq7KTuN-hVSV9OqSPx8g,162
133
134
  pixeltable/metadata/converters/convert_13.py,sha256=B-_EkL0pSl1mAiv6DymeUAyBQUcYcV1qDdNz3Q359kc,1369
@@ -156,23 +157,24 @@ pixeltable/metadata/converters/convert_35.py,sha256=c88qft0RFQbdFIE_PZRHMjeku1r5
156
157
  pixeltable/metadata/converters/convert_36.py,sha256=g1rhZhAYfZpAwUgE3D1aipIR4RNvikhbKcrnBJzm0wM,1215
157
158
  pixeltable/metadata/converters/convert_37.py,sha256=IVZGtKFaaYMGBs39V_H_okWvpxxadTUWqxoln0cNeQI,392
158
159
  pixeltable/metadata/converters/convert_38.py,sha256=YyNyocwzzdJRcI0YSCo_70Q4hSk63235iE4IxhwSEzs,1169
159
- pixeltable/metadata/converters/util.py,sha256=95pfg9amEOmhho32PIbNYnqagVIN9adIcLXxB6zSYDY,7527
160
- pixeltable/metadata/notes.py,sha256=HXskIW7HqbVXqhzZm0VTZn2q1RW6Qk0P5mpifmBS_9w,1485
161
- pixeltable/metadata/schema.py,sha256=l8ZGcASiTrtaMW9jPDMtZmoT2BamGIDhujNUVgdag5E,11720
160
+ pixeltable/metadata/converters/convert_39.py,sha256=YaEfgStxtYGRbuRLFw8wTAZVJRzIU6zL6nPU2zuDcEU,4658
161
+ pixeltable/metadata/converters/util.py,sha256=QUBOj2F_6rCAdIo0lgD1IVgAM15Vmq7ikQspB4s0eQ8,7732
162
+ pixeltable/metadata/notes.py,sha256=3fdZDFpL1-b194Ejv0Y0YP-vbnV-XvVP9wOmZM9XARA,1545
163
+ pixeltable/metadata/schema.py,sha256=pc7MEzyGGHOoa45un7Eld0av-M84iV-b8X3UOpPjvEU,12232
162
164
  pixeltable/metadata/utils.py,sha256=NJQXWhhK1hdOZ4H3hh9N0mqbl-I9JqMUqrfA6OWLflE,2682
163
- pixeltable/plan.py,sha256=K_qO-BnSZOShGr9uGRsiCLPXJOeOzh5eGeODrqviMlQ,49053
165
+ pixeltable/plan.py,sha256=nnMiBiQNJ0fWBNetyypVggCBCDWekTvKiSCMeays7Os,49369
164
166
  pixeltable/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
165
167
  pixeltable/share/__init__.py,sha256=AtR4nS6YkfkFRkXA-zZXFTK5pSQjHry8MnxdVLUk5SA,68
166
- pixeltable/share/packager.py,sha256=wqOuuUXOor6YLzR9oZSYuJmdbkfBetZB3NkndsqbX3I,32172
168
+ pixeltable/share/packager.py,sha256=WDid1dOogPbAkF7pPrLe17eYR0_FWubvExU26ooQl4c,30994
167
169
  pixeltable/share/publish.py,sha256=U6PzOUYiZaPu-sVNjh2nN8qzY2-uMsYeTwQCCuGk7Jg,6537
168
- pixeltable/store.py,sha256=v0TI_w8NemhV-njrsj7IH8PXE4gz4mjjHesWoFNIQf4,24402
169
- pixeltable/type_system.py,sha256=P-ykQDPKbMZHtkozdrcBBpuX60Zc1nzwjwzSwlxIzPg,55319
170
+ pixeltable/store.py,sha256=pM0d8oaRBH7BVt4fJxV-xcrIcwTOOHv8jLVgNwBFYEc,22784
171
+ pixeltable/type_system.py,sha256=DuCWaHPeToQ22lDmcQRRHKTEz7ATAfFSYcRgQvdniQM,55321
170
172
  pixeltable/utils/__init__.py,sha256=Pwgu-Sg1XkxzdCZ4ZhWP77UgLP3tnQsyCKaUJLF4ajo,1741
171
173
  pixeltable/utils/arrow.py,sha256=74wIy58rDYZJBVQ1g85NqzFyiQBvEQhnJ0Gi82iZ0dw,6421
172
174
  pixeltable/utils/coco.py,sha256=Y1DWVYguZD4VhKyf7JruYfHWvhkJLq39fzbiSm5cdyY,7304
173
175
  pixeltable/utils/code.py,sha256=SbG5OUF_fQAbOgGZHDuENijmbzisVqa4VS9guaZ0KtU,1231
174
176
  pixeltable/utils/console_output.py,sha256=x23iDnNwUbsr7Ec20BQ7BLATTsrQZflxc9NucAt_sVU,1150
175
- pixeltable/utils/coroutine.py,sha256=IPUqBpwHkDNaioMde7Km3LU8s54SGXVOtRJpYPkm1gE,1425
177
+ pixeltable/utils/coroutine.py,sha256=d87kLlkVIZq2u0kTE7kJ5Tc_yjEkdGi5sXAuxjLLxXY,896
176
178
  pixeltable/utils/dbms.py,sha256=cuQqlzLF7WON_mkJZ4QWlfX6lCxA97V32lhtMcOlDLg,2018
177
179
  pixeltable/utils/description_helper.py,sha256=acibNm36wkZG7h6k8gjcypTD_PVV2SL7YgX6cPYP1i8,3743
178
180
  pixeltable/utils/documents.py,sha256=x3UHU7eykibyA3eVkSrCK1CQoaid228vp96WUEESssU,3105
@@ -181,13 +183,13 @@ pixeltable/utils/filecache.py,sha256=8RZZiEkD4awZpR-mn7OhoZPc6_JlPUNSBnMU8BcEAv4
181
183
  pixeltable/utils/formatter.py,sha256=tbMxE9rBw6wdKUnJhNZ8h9uAF8dZKcihQ2KesqAag9A,10096
182
184
  pixeltable/utils/http_server.py,sha256=B5iQ1s_VuwsVC7pUm1joGjLZqaluV8_RfFiU8V1FuG8,2453
183
185
  pixeltable/utils/iceberg.py,sha256=L_s9G9NMIGMQdRHtNkks6ntTVW4DKKAw97R9gRmtw5s,553
184
- pixeltable/utils/media_store.py,sha256=Dhsnj1ZPRSX0iyGOu4JU4pC3fvSBd7sQpruVHqzKm7A,3089
186
+ pixeltable/utils/media_store.py,sha256=a63_fck6d32AlW24cp5UoJvekCpKmU-UYlZ2yijHCbI,4922
185
187
  pixeltable/utils/pytorch.py,sha256=564VHRdDHwD9h0v5lBHEDTJ8c6zx8wuzWYx8ZYjBxlI,3621
186
188
  pixeltable/utils/s3.py,sha256=pxip2MlCqd2Qon2dzJXzfxvwtZyc-BAsjAnLL4J_OXY,587
187
189
  pixeltable/utils/sql.py,sha256=Sa4Lh-VGe8GToU5W7DRiWf2lMl9B6saPqemiT0ZdHEc,806
188
190
  pixeltable/utils/transactional_directory.py,sha256=OFKmu90oP7KwBAljwjnzP_w8euGdAXob3y4Nx9SCNHA,1357
189
- pixeltable-0.4.2.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
190
- pixeltable-0.4.2.dist-info/METADATA,sha256=RFiialgbsCHPt69fJ4aRgUpLcL1XGo47icfCrzJiMCo,20577
191
- pixeltable-0.4.2.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
192
- pixeltable-0.4.2.dist-info/entry_points.txt,sha256=ToOd-pRgG7AitEBgYoBCRRB4-KVDQ0pj_9T4a1LgwA4,97
193
- pixeltable-0.4.2.dist-info/RECORD,,
191
+ pixeltable-0.4.3.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
192
+ pixeltable-0.4.3.dist-info/METADATA,sha256=VfhTi_6PA51fE0XOxSTd9ZcIm4Af3sUPg3N9Z4YgSMk,20577
193
+ pixeltable-0.4.3.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
194
+ pixeltable-0.4.3.dist-info/entry_points.txt,sha256=ToOd-pRgG7AitEBgYoBCRRB4-KVDQ0pj_9T4a1LgwA4,97
195
+ pixeltable-0.4.3.dist-info/RECORD,,