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.
- pixeltable/__init__.py +1 -0
- pixeltable/__version__.py +2 -2
- pixeltable/catalog/__init__.py +2 -10
- pixeltable/catalog/catalog.py +64 -38
- pixeltable/catalog/column.py +22 -23
- pixeltable/catalog/globals.py +2 -148
- pixeltable/catalog/insertable_table.py +6 -4
- pixeltable/catalog/path.py +6 -0
- pixeltable/catalog/table.py +51 -32
- pixeltable/catalog/table_version.py +69 -45
- pixeltable/catalog/update_status.py +179 -0
- pixeltable/catalog/view.py +9 -2
- pixeltable/config.py +76 -12
- pixeltable/dataframe.py +1 -1
- pixeltable/env.py +29 -0
- pixeltable/exec/exec_node.py +7 -24
- pixeltable/exec/expr_eval/schedulers.py +134 -7
- pixeltable/exprs/column_property_ref.py +21 -9
- pixeltable/exprs/column_ref.py +5 -1
- pixeltable/exprs/function_call.py +2 -2
- pixeltable/exprs/row_builder.py +10 -9
- pixeltable/exprs/rowid_ref.py +0 -4
- pixeltable/func/function.py +3 -3
- pixeltable/functions/audio.py +36 -9
- pixeltable/functions/video.py +57 -10
- pixeltable/globals.py +61 -1
- pixeltable/io/__init__.py +1 -1
- pixeltable/io/external_store.py +3 -55
- pixeltable/io/globals.py +4 -4
- pixeltable/io/hf_datasets.py +10 -2
- pixeltable/io/label_studio.py +16 -16
- pixeltable/metadata/__init__.py +1 -1
- pixeltable/metadata/converters/convert_39.py +125 -0
- pixeltable/metadata/converters/util.py +3 -0
- pixeltable/metadata/notes.py +1 -0
- pixeltable/metadata/schema.py +14 -2
- pixeltable/plan.py +4 -0
- pixeltable/share/packager.py +20 -38
- pixeltable/store.py +18 -50
- pixeltable/type_system.py +2 -2
- pixeltable/utils/coroutine.py +6 -23
- pixeltable/utils/media_store.py +39 -0
- {pixeltable-0.4.2.dist-info → pixeltable-0.4.3.dist-info}/METADATA +1 -1
- {pixeltable-0.4.2.dist-info → pixeltable-0.4.3.dist-info}/RECORD +47 -45
- {pixeltable-0.4.2.dist-info → pixeltable-0.4.3.dist-info}/LICENSE +0 -0
- {pixeltable-0.4.2.dist-info → pixeltable-0.4.3.dist-info}/WHEEL +0 -0
- {pixeltable-0.4.2.dist-info → pixeltable-0.4.3.dist-info}/entry_points.txt +0 -0
pixeltable/metadata/schema.py
CHANGED
|
@@ -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
|
-
|
|
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():
|
pixeltable/share/packager.py
CHANGED
|
@@ -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
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
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 =
|
|
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
|
-
|
|
630
|
-
src_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
|
|
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.
|
|
97
|
-
all_cols.append(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
|
-
|
|
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.
|
|
193
|
-
|
|
194
|
-
s_txt += f' , ADD COLUMN {col.
|
|
195
|
-
|
|
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.
|
|
208
|
-
s_txt += f' , DROP COLUMN {col.
|
|
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.
|
|
243
|
-
|
|
244
|
-
|
|
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.
|
|
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],
|
|
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
|
-
|
|
1157
|
-
raise excs.Error(f'data URL could not be decoded into a valid image: {
|
|
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:
|
pixeltable/utils/coroutine.py
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
23
|
+
# Not in main thread, use run_coroutine_threadsafe
|
|
24
|
+
return asyncio.run_coroutine_threadsafe(coroutine, loop).result(timeout)
|
pixeltable/utils/media_store.py
CHANGED
|
@@ -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.
|
|
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
|
|
2
|
-
pixeltable/__version__.py,sha256=
|
|
3
|
-
pixeltable/catalog/__init__.py,sha256=
|
|
4
|
-
pixeltable/catalog/catalog.py,sha256=
|
|
5
|
-
pixeltable/catalog/column.py,sha256=
|
|
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=
|
|
8
|
-
pixeltable/catalog/insertable_table.py,sha256=
|
|
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=
|
|
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=
|
|
13
|
-
pixeltable/catalog/table_version.py,sha256=
|
|
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/
|
|
17
|
-
pixeltable/
|
|
18
|
-
pixeltable/
|
|
19
|
-
pixeltable/
|
|
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=
|
|
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=
|
|
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=
|
|
41
|
-
pixeltable/exprs/column_ref.py,sha256=
|
|
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=
|
|
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=
|
|
59
|
-
pixeltable/exprs/rowid_ref.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
117
|
-
pixeltable/io/hf_datasets.py,sha256=
|
|
118
|
-
pixeltable/io/label_studio.py,sha256=
|
|
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=
|
|
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/
|
|
160
|
-
pixeltable/metadata/
|
|
161
|
-
pixeltable/metadata/
|
|
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=
|
|
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=
|
|
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=
|
|
169
|
-
pixeltable/type_system.py,sha256=
|
|
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=
|
|
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=
|
|
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.
|
|
190
|
-
pixeltable-0.4.
|
|
191
|
-
pixeltable-0.4.
|
|
192
|
-
pixeltable-0.4.
|
|
193
|
-
pixeltable-0.4.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|