pixeltable 0.2.2__py3-none-any.whl → 0.2.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/exec/cache_prefetch_node.py +14 -11
- pixeltable/exprs/data_row.py +14 -6
- pixeltable/iterators/document.py +1 -1
- pixeltable/store.py +15 -10
- pixeltable/tests/test_dataframe.py +7 -1
- pixeltable/tests/test_document.py +3 -0
- pixeltable/tests/test_exprs.py +2 -1
- pixeltable/tests/test_table.py +6 -0
- pixeltable/tests/test_video.py +2 -0
- pixeltable/tests/utils.py +6 -4
- pixeltable/type_system.py +1 -1
- {pixeltable-0.2.2.dist-info → pixeltable-0.2.3.dist-info}/METADATA +5 -3
- {pixeltable-0.2.2.dist-info → pixeltable-0.2.3.dist-info}/RECORD +15 -15
- {pixeltable-0.2.2.dist-info → pixeltable-0.2.3.dist-info}/LICENSE +0 -0
- {pixeltable-0.2.2.dist-info → pixeltable-0.2.3.dist-info}/WHEEL +0 -0
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
import concurrent.futures
|
|
4
|
+
import logging
|
|
3
5
|
import threading
|
|
6
|
+
import urllib.parse
|
|
7
|
+
import urllib.request
|
|
4
8
|
from collections import defaultdict
|
|
5
|
-
from uuid import UUID
|
|
6
|
-
import concurrent
|
|
7
|
-
import logging
|
|
8
|
-
import urllib
|
|
9
9
|
from pathlib import Path
|
|
10
|
+
from typing import List, Optional, Any, Tuple, Dict
|
|
11
|
+
from uuid import UUID
|
|
10
12
|
|
|
11
|
-
from .data_row_batch import DataRowBatch
|
|
12
|
-
from .exec_node import ExecNode
|
|
13
|
-
import pixeltable.exprs as exprs
|
|
14
|
-
from pixeltable.utils.filecache import FileCache
|
|
15
13
|
import pixeltable.env as env
|
|
16
14
|
import pixeltable.exceptions as excs
|
|
15
|
+
import pixeltable.exprs as exprs
|
|
16
|
+
from pixeltable.utils.filecache import FileCache
|
|
17
|
+
from .data_row_batch import DataRowBatch
|
|
18
|
+
from .exec_node import ExecNode
|
|
17
19
|
|
|
18
20
|
_logger = logging.getLogger('pixeltable')
|
|
19
21
|
|
|
@@ -81,7 +83,9 @@ class CachePrefetchNode(ExecNode):
|
|
|
81
83
|
"""Fetches a remote URL into Env.tmp_dir and returns its path"""
|
|
82
84
|
url = row.file_urls[slot_idx]
|
|
83
85
|
parsed = urllib.parse.urlparse(url)
|
|
84
|
-
|
|
86
|
+
# Use len(parsed.scheme) > 1 here to ensure we're not being passed
|
|
87
|
+
# a Windows filename
|
|
88
|
+
assert len(parsed.scheme) > 1 and parsed.scheme != 'file'
|
|
85
89
|
# preserve the file extension, if there is one
|
|
86
90
|
extension = ''
|
|
87
91
|
if parsed.path != '':
|
|
@@ -95,7 +99,6 @@ class CachePrefetchNode(ExecNode):
|
|
|
95
99
|
if self.boto_client is None:
|
|
96
100
|
self.boto_client = get_client()
|
|
97
101
|
self.boto_client.download_file(parsed.netloc, parsed.path.lstrip('/'), str(tmp_path))
|
|
98
|
-
return tmp_path
|
|
99
102
|
elif parsed.scheme == 'http' or parsed.scheme == 'https':
|
|
100
103
|
with urllib.request.urlopen(url) as resp, open(tmp_path, 'wb') as f:
|
|
101
104
|
data = resp.read()
|
pixeltable/exprs/data_row.py
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
|
-
|
|
2
|
+
|
|
3
3
|
import io
|
|
4
|
-
import urllib
|
|
4
|
+
import urllib.parse
|
|
5
|
+
import urllib.request
|
|
6
|
+
from typing import Optional, List, Any, Tuple
|
|
5
7
|
|
|
6
8
|
import PIL
|
|
7
9
|
import numpy as np
|
|
@@ -104,6 +106,7 @@ class DataRow:
|
|
|
104
106
|
assert self.file_paths[index] is not None
|
|
105
107
|
if self.vals[index] is None:
|
|
106
108
|
self.vals[index] = PIL.Image.open(self.file_paths[index])
|
|
109
|
+
self.vals[index].load()
|
|
107
110
|
|
|
108
111
|
return self.vals[index]
|
|
109
112
|
|
|
@@ -137,14 +140,19 @@ class DataRow:
|
|
|
137
140
|
if (idx in self.img_slot_idxs or idx in self.media_slot_idxs) and isinstance(val, str):
|
|
138
141
|
# this is either a local file path or a URL
|
|
139
142
|
parsed = urllib.parse.urlparse(val)
|
|
140
|
-
if
|
|
143
|
+
# Determine if this is a local file or a remote URL. If the scheme length is <= 1,
|
|
144
|
+
# we assume it's a local file. (This is because a Windows path will be interpreted
|
|
145
|
+
# by urllib as a URL with scheme equal to the drive letter.)
|
|
146
|
+
if len(parsed.scheme) <= 1 or parsed.scheme == 'file':
|
|
141
147
|
# local file path
|
|
142
148
|
assert self.file_urls[idx] is None and self.file_paths[idx] is None
|
|
143
|
-
if parsed.scheme
|
|
144
|
-
self.file_urls[idx] = urllib.parse.urljoin('file:', urllib.request.pathname2url(
|
|
149
|
+
if len(parsed.scheme) <= 1:
|
|
150
|
+
self.file_urls[idx] = urllib.parse.urljoin('file:', urllib.request.pathname2url(val))
|
|
151
|
+
self.file_paths[idx] = val
|
|
145
152
|
else:
|
|
146
153
|
self.file_urls[idx] = val
|
|
147
|
-
|
|
154
|
+
# Wrap the path in a url2pathname() call to ensure proper handling on Windows.
|
|
155
|
+
self.file_paths[idx] = urllib.parse.unquote(urllib.request.url2pathname(parsed.path))
|
|
148
156
|
else:
|
|
149
157
|
# URL
|
|
150
158
|
assert self.file_urls[idx] is None
|
pixeltable/iterators/document.py
CHANGED
|
@@ -61,7 +61,7 @@ class DocumentSplitter(ComponentIterator):
|
|
|
61
61
|
import bs4
|
|
62
62
|
if html_skip_tags is None:
|
|
63
63
|
html_skip_tags = ['nav']
|
|
64
|
-
with open(document, 'r') as fh:
|
|
64
|
+
with open(document, 'r', encoding='utf8') as fh:
|
|
65
65
|
s = fh.read()
|
|
66
66
|
self._doc_handle = get_document_handle(s)
|
|
67
67
|
assert self._doc_handle is not None
|
pixeltable/store.py
CHANGED
|
@@ -1,24 +1,26 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import abc
|
|
4
|
+
import logging
|
|
3
5
|
import os
|
|
4
6
|
import sys
|
|
7
|
+
import urllib.parse
|
|
8
|
+
import urllib.request
|
|
5
9
|
import warnings
|
|
6
10
|
from typing import Optional, Dict, Any, List, Tuple, Set
|
|
7
|
-
|
|
8
|
-
import urllib
|
|
11
|
+
|
|
9
12
|
import sqlalchemy as sql
|
|
10
13
|
from tqdm import tqdm, TqdmWarning
|
|
11
|
-
import abc
|
|
12
14
|
|
|
13
15
|
import pixeltable.catalog as catalog
|
|
16
|
+
import pixeltable.env as env
|
|
17
|
+
from pixeltable import exprs
|
|
18
|
+
import pixeltable.exceptions as excs
|
|
19
|
+
from pixeltable.exec import ExecNode
|
|
14
20
|
from pixeltable.metadata import schema
|
|
15
21
|
from pixeltable.type_system import StringType
|
|
16
|
-
from pixeltable.exec import ExecNode
|
|
17
|
-
from pixeltable import exprs
|
|
18
|
-
from pixeltable.utils.sql import log_stmt, log_explain
|
|
19
|
-
import pixeltable.env as env
|
|
20
22
|
from pixeltable.utils.media_store import MediaStore
|
|
21
|
-
|
|
23
|
+
from pixeltable.utils.sql import log_stmt, log_explain
|
|
22
24
|
|
|
23
25
|
_logger = logging.getLogger('pixeltable')
|
|
24
26
|
|
|
@@ -121,10 +123,13 @@ class StoreBase:
|
|
|
121
123
|
if file_url is None:
|
|
122
124
|
return None
|
|
123
125
|
parsed = urllib.parse.urlparse(file_url)
|
|
124
|
-
|
|
126
|
+
# We should never be passed a local file path here. The "len > 1" ensures that Windows
|
|
127
|
+
# file paths aren't mistaken for URLs with a single-character scheme.
|
|
128
|
+
assert len(parsed.scheme) > 1
|
|
129
|
+
if parsed.scheme != 'file':
|
|
125
130
|
# remote url
|
|
126
131
|
return file_url
|
|
127
|
-
file_path = urllib.parse.unquote(parsed.path)
|
|
132
|
+
file_path = urllib.parse.unquote(urllib.request.url2pathname(parsed.path))
|
|
128
133
|
if not file_path.startswith(pxt_tmp_dir):
|
|
129
134
|
# not a tmp file
|
|
130
135
|
return file_url
|
|
@@ -7,7 +7,6 @@ import bs4
|
|
|
7
7
|
import numpy as np
|
|
8
8
|
import pytest
|
|
9
9
|
import requests
|
|
10
|
-
from pycocotools.coco import COCO
|
|
11
10
|
|
|
12
11
|
import pixeltable as pxt
|
|
13
12
|
from pixeltable import catalog
|
|
@@ -184,6 +183,8 @@ class TestDataFrame:
|
|
|
184
183
|
res = t.select(1.0).where(t.c2 < 10).collect()
|
|
185
184
|
assert res[res.column_names()[0]] == [1.0] * 10
|
|
186
185
|
|
|
186
|
+
# TODO This test doesn't work on Windows due to reliance on the structure of file URLs
|
|
187
|
+
@pytest.mark.skip('Test is not portable')
|
|
187
188
|
def test_html_media_url(self, test_client: pxt.Client) -> None:
|
|
188
189
|
tab = test_client.create_table('test_html_repr', {'video': pxt.VideoType(), 'audio': pxt.AudioType()})
|
|
189
190
|
status = tab.insert(video=get_video_files()[0], audio=get_audio_files()[0])
|
|
@@ -208,6 +209,7 @@ class TestDataFrame:
|
|
|
208
209
|
def test_to_pytorch_dataset(self, all_datatypes_tbl: catalog.Table):
|
|
209
210
|
""" tests all types are handled correctly in this conversion
|
|
210
211
|
"""
|
|
212
|
+
skip_test_if_not_installed('torch')
|
|
211
213
|
import torch
|
|
212
214
|
|
|
213
215
|
t = all_datatypes_tbl
|
|
@@ -238,6 +240,7 @@ class TestDataFrame:
|
|
|
238
240
|
def test_to_pytorch_image_format(self, all_datatypes_tbl: catalog.Table) -> None:
|
|
239
241
|
""" tests the image_format parameter is honored
|
|
240
242
|
"""
|
|
243
|
+
skip_test_if_not_installed('torch')
|
|
241
244
|
import torch
|
|
242
245
|
import torchvision.transforms as T
|
|
243
246
|
|
|
@@ -295,6 +298,7 @@ class TestDataFrame:
|
|
|
295
298
|
1. compatibility with multiprocessing
|
|
296
299
|
2. compatibility of all types with default collate_fn
|
|
297
300
|
"""
|
|
301
|
+
skip_test_if_not_installed('torch')
|
|
298
302
|
import torch.utils.data
|
|
299
303
|
@pxt.udf(param_types=[pxt.JsonType()], return_type=pxt.JsonType())
|
|
300
304
|
def restrict_json_for_default_collate(obj):
|
|
@@ -352,6 +356,7 @@ class TestDataFrame:
|
|
|
352
356
|
2. adding a row to the table invalidates the cached version
|
|
353
357
|
3. changing the select list invalidates the cached version
|
|
354
358
|
"""
|
|
359
|
+
skip_test_if_not_installed('torch')
|
|
355
360
|
t = all_datatypes_tbl
|
|
356
361
|
|
|
357
362
|
t.drop_column('c_video') # null value video column triggers internal assertions in DataRow
|
|
@@ -383,6 +388,7 @@ class TestDataFrame:
|
|
|
383
388
|
|
|
384
389
|
def test_to_coco(self, test_client: pxt.Client) -> None:
|
|
385
390
|
skip_test_if_not_installed('nos')
|
|
391
|
+
from pycocotools.coco import COCO
|
|
386
392
|
cl = test_client
|
|
387
393
|
base_t = cl.create_table('videos', {'video': pxt.VideoType()})
|
|
388
394
|
args = {'video': base_t.video, 'fps': 1}
|
|
@@ -8,6 +8,7 @@ import pytest
|
|
|
8
8
|
import pixeltable as pxt
|
|
9
9
|
from pixeltable.iterators.document import DocumentSplitter
|
|
10
10
|
from pixeltable.tests.utils import get_documents, get_video_files, get_audio_files, get_image_files
|
|
11
|
+
from pixeltable.tests.utils import skip_test_if_not_installed
|
|
11
12
|
from pixeltable.type_system import DocumentType
|
|
12
13
|
|
|
13
14
|
|
|
@@ -34,6 +35,7 @@ class TestDocument:
|
|
|
34
35
|
assert status.num_excs == len(file_paths)
|
|
35
36
|
|
|
36
37
|
def test_doc_splitter(self, test_client: pxt.Client) -> None:
|
|
38
|
+
skip_test_if_not_installed('tiktoken')
|
|
37
39
|
file_paths = self.valid_doc_paths()
|
|
38
40
|
cl = test_client
|
|
39
41
|
doc_t = cl.create_table('docs', {'doc': DocumentType()})
|
|
@@ -88,6 +90,7 @@ class TestDocument:
|
|
|
88
90
|
cl.drop_table('chunks')
|
|
89
91
|
|
|
90
92
|
def test_doc_splitter_headings(self, test_client: pxt.Client) -> None:
|
|
93
|
+
skip_test_if_not_installed('spacy')
|
|
91
94
|
file_paths = self.valid_doc_paths()
|
|
92
95
|
cl = test_client
|
|
93
96
|
doc_t = cl.create_table('docs', {'doc': DocumentType()})
|
pixeltable/tests/test_exprs.py
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import urllib.parse
|
|
3
|
+
import urllib.request
|
|
3
4
|
from typing import List, Dict
|
|
4
5
|
|
|
5
6
|
import pytest
|
|
@@ -174,7 +175,7 @@ class TestExprs:
|
|
|
174
175
|
res = img_t.select(img_t.img.fileurl).show(0).to_pandas()
|
|
175
176
|
stored_urls = set(res.iloc[:, 0])
|
|
176
177
|
assert len(stored_urls) == len(res)
|
|
177
|
-
all_urls
|
|
178
|
+
all_urls = set(urllib.parse.urljoin('file:', urllib.request.pathname2url(path)) for path in get_image_files())
|
|
178
179
|
assert stored_urls <= all_urls
|
|
179
180
|
|
|
180
181
|
# localpath
|
pixeltable/tests/test_table.py
CHANGED
|
@@ -18,6 +18,7 @@ from pixeltable.iterators import FrameIterator
|
|
|
18
18
|
from pixeltable.tests.utils import \
|
|
19
19
|
make_tbl, create_table_data, read_data_file, get_video_files, get_audio_files, get_image_files, get_documents, \
|
|
20
20
|
assert_resultset_eq
|
|
21
|
+
from pixeltable.tests.utils import skip_test_if_not_installed
|
|
21
22
|
from pixeltable.type_system import \
|
|
22
23
|
StringType, IntType, FloatType, TimestampType, ImageType, VideoType, JsonType, BoolType, ArrayType, AudioType, \
|
|
23
24
|
DocumentType
|
|
@@ -296,6 +297,7 @@ class TestTable:
|
|
|
296
297
|
self.check_bad_media(test_client, rows, DocumentType(nullable=True))
|
|
297
298
|
|
|
298
299
|
def test_validate_external_url(self, test_client: pxt.Client) -> None:
|
|
300
|
+
skip_test_if_not_installed('boto3')
|
|
299
301
|
rows = [
|
|
300
302
|
{'media': 's3://open-images-dataset/validation/doesnotexist.jpg', 'is_bad_media': True},
|
|
301
303
|
{'media': 'https://archive.random.org/download?file=2024-01-28.bin', 'is_bad_media': True}, # 403 error
|
|
@@ -315,6 +317,7 @@ class TestTable:
|
|
|
315
317
|
self.check_bad_media(test_client, rows, VideoType(nullable=True))
|
|
316
318
|
|
|
317
319
|
def test_create_s3_image_table(self, test_client: pxt.Client) -> None:
|
|
320
|
+
skip_test_if_not_installed('boto3')
|
|
318
321
|
cl = test_client
|
|
319
322
|
tbl = cl.create_table('test', {'img': ImageType(nullable=False)})
|
|
320
323
|
# this is needed because Client.reset_catalog() doesn't call TableVersion.drop(), which would
|
|
@@ -371,6 +374,7 @@ class TestTable:
|
|
|
371
374
|
assert cache_stats.total_size == 0
|
|
372
375
|
|
|
373
376
|
def test_video_url(self, test_client: pxt.Client) -> None:
|
|
377
|
+
skip_test_if_not_installed('boto3')
|
|
374
378
|
cl = test_client
|
|
375
379
|
schema = {
|
|
376
380
|
'payload': IntType(nullable=False),
|
|
@@ -390,6 +394,7 @@ class TestTable:
|
|
|
390
394
|
cap.release()
|
|
391
395
|
|
|
392
396
|
def test_create_video_table(self, test_client: pxt.Client) -> None:
|
|
397
|
+
skip_test_if_not_installed('boto3')
|
|
393
398
|
cl = test_client
|
|
394
399
|
tbl = cl.create_table(
|
|
395
400
|
'test_tbl',
|
|
@@ -529,6 +534,7 @@ class TestTable:
|
|
|
529
534
|
assert 'expected ndarray((2, 3)' in str(exc_info.value)
|
|
530
535
|
|
|
531
536
|
def test_query(self, test_client: pxt.Client) -> None:
|
|
537
|
+
skip_test_if_not_installed('boto3')
|
|
532
538
|
cl = test_client
|
|
533
539
|
col_names = ['c1', 'c2', 'c3', 'c4', 'c5']
|
|
534
540
|
t = make_tbl(cl, 'test', col_names)
|
pixeltable/tests/test_video.py
CHANGED
|
@@ -8,6 +8,7 @@ from pixeltable import catalog
|
|
|
8
8
|
from pixeltable import exceptions as excs
|
|
9
9
|
from pixeltable.iterators import FrameIterator
|
|
10
10
|
from pixeltable.tests.utils import get_video_files
|
|
11
|
+
from pixeltable.tests.utils import skip_test_if_not_installed
|
|
11
12
|
from pixeltable.type_system import VideoType, ImageType
|
|
12
13
|
from pixeltable.utils.media_store import MediaStore
|
|
13
14
|
|
|
@@ -61,6 +62,7 @@ class TestVideo:
|
|
|
61
62
|
assert MediaStore.count(view.get_id()) == view.count()
|
|
62
63
|
|
|
63
64
|
def test_query(self, test_client: pxt.client) -> None:
|
|
65
|
+
skip_test_if_not_installed('boto3')
|
|
64
66
|
video_filepaths = get_video_files()
|
|
65
67
|
cl = test_client
|
|
66
68
|
base_t, view_t = self.create_tbls(cl)
|
pixeltable/tests/utils.py
CHANGED
|
@@ -225,7 +225,7 @@ def read_data_file(dir_name: str, file_name: str, path_col_names: Optional[List[
|
|
|
225
225
|
df[col_name] = df.apply(lambda r: str(abs_path / r[col_name]), axis=1)
|
|
226
226
|
return df.to_dict(orient='records')
|
|
227
227
|
|
|
228
|
-
def get_video_files(include_bad_video=False) -> List[str]:
|
|
228
|
+
def get_video_files(include_bad_video: bool = False) -> List[str]:
|
|
229
229
|
tests_dir = os.path.dirname(__file__) # search with respect to tests/ dir
|
|
230
230
|
glob_result = glob.glob(f'{tests_dir}/**/videos/*', recursive=True)
|
|
231
231
|
if not include_bad_video:
|
|
@@ -239,12 +239,14 @@ def get_test_video_files() -> List[str]:
|
|
|
239
239
|
glob_result = glob.glob(f'{tests_dir}/**/test_videos/*', recursive=True)
|
|
240
240
|
return glob_result
|
|
241
241
|
|
|
242
|
-
def get_image_files() -> List[str]:
|
|
242
|
+
def get_image_files(include_bad_image: bool = False) -> List[str]:
|
|
243
243
|
tests_dir = os.path.dirname(__file__) # search with respect to tests/ dir
|
|
244
244
|
glob_result = glob.glob(f'{tests_dir}/**/imagenette2-160/*', recursive=True)
|
|
245
|
+
if not include_bad_image:
|
|
246
|
+
glob_result = [f for f in glob_result if 'bad_image' not in f]
|
|
245
247
|
return glob_result
|
|
246
248
|
|
|
247
|
-
def get_audio_files(include_bad_audio=False) -> List[str]:
|
|
249
|
+
def get_audio_files(include_bad_audio: bool = False) -> List[str]:
|
|
248
250
|
tests_dir = os.path.dirname(__file__)
|
|
249
251
|
glob_result = glob.glob(f'{tests_dir}/**/audio/*', recursive=True)
|
|
250
252
|
if not include_bad_audio:
|
|
@@ -259,7 +261,7 @@ def get_documents() -> List[str]:
|
|
|
259
261
|
def get_sentences(n: int = 100) -> List[str]:
|
|
260
262
|
tests_dir = os.path.dirname(__file__)
|
|
261
263
|
path = glob.glob(f'{tests_dir}/**/jeopardy.json', recursive=True)[0]
|
|
262
|
-
with open(path, 'r') as f:
|
|
264
|
+
with open(path, 'r', encoding='utf8') as f:
|
|
263
265
|
questions_list = json.load(f)
|
|
264
266
|
# this dataset contains \' around the questions
|
|
265
267
|
return [q['question'].replace("'", '') for q in questions_list[:n]]
|
pixeltable/type_system.py
CHANGED
|
@@ -911,7 +911,7 @@ class DocumentType(ColumnType):
|
|
|
911
911
|
def validate_media(self, val: Any) -> None:
|
|
912
912
|
assert isinstance(val, str)
|
|
913
913
|
from pixeltable.utils.documents import get_document_handle
|
|
914
|
-
with open(val, 'r') as fh:
|
|
914
|
+
with open(val, 'r', encoding='utf8') as fh:
|
|
915
915
|
try:
|
|
916
916
|
s = fh.read()
|
|
917
917
|
dh = get_document_handle(s)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: pixeltable
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.3
|
|
4
4
|
Summary: Pixeltable: The Multimodal AI Data Plane
|
|
5
5
|
Author: Marcel Kornacker
|
|
6
6
|
Author-email: marcelk@gmail.com
|
|
@@ -11,19 +11,21 @@ Classifier: Programming Language :: Python :: 3.10
|
|
|
11
11
|
Classifier: Programming Language :: Python :: 3.11
|
|
12
12
|
Classifier: Programming Language :: Python :: 3.12
|
|
13
13
|
Requires-Dist: av (>=10.0.0)
|
|
14
|
+
Requires-Dist: beautifulsoup4 (>=4.0.0,<5.0.0)
|
|
14
15
|
Requires-Dist: cloudpickle (>=2.2.1,<3.0.0)
|
|
15
16
|
Requires-Dist: jinja2 (>=3.1.3,<4.0.0)
|
|
16
17
|
Requires-Dist: jmespath (>=1.0.1,<2.0.0)
|
|
17
|
-
Requires-Dist: numpy (>=1.
|
|
18
|
+
Requires-Dist: numpy (>=1.26,<2.0)
|
|
18
19
|
Requires-Dist: opencv-python-headless (>=4.7.0.68,<5.0.0.0)
|
|
19
20
|
Requires-Dist: pandas (>=2.0,<3.0)
|
|
20
|
-
Requires-Dist: pgserver (==0.0.
|
|
21
|
+
Requires-Dist: pgserver (==0.0.9)
|
|
21
22
|
Requires-Dist: pgvector (>=0.2.1,<0.3.0)
|
|
22
23
|
Requires-Dist: pillow (>=9.4.0,<10.0.0)
|
|
23
24
|
Requires-Dist: psutil (>=5.9.5,<6.0.0)
|
|
24
25
|
Requires-Dist: psycopg2-binary (>=2.9.5,<3.0.0)
|
|
25
26
|
Requires-Dist: pyyaml (>=6.0.1,<7.0.0)
|
|
26
27
|
Requires-Dist: regex (>=2022.10.31,<2023.0.0)
|
|
28
|
+
Requires-Dist: requests (>=2.31.0,<3.0.0)
|
|
27
29
|
Requires-Dist: sqlalchemy-utils (>=0.41.1,<0.42.0)
|
|
28
30
|
Requires-Dist: sqlalchemy[mypy] (>=2.0.23,<3.0.0)
|
|
29
31
|
Requires-Dist: tqdm (>=4.64.1,<5.0.0)
|
|
@@ -19,7 +19,7 @@ pixeltable/env.py,sha256=sY-VUY9WFs4li7CidyRXubfjmBh3cbR-cFj-wZr4xY0,16398
|
|
|
19
19
|
pixeltable/exceptions.py,sha256=MSP9zeL0AmXT93XqjdvgGN4rzno1_KRrGriq6hpemnw,376
|
|
20
20
|
pixeltable/exec/__init__.py,sha256=FOQBSMQ3buGg5kRzymkfDCk5fnVfICn3LrsJtbyNC6E,412
|
|
21
21
|
pixeltable/exec/aggregation_node.py,sha256=cf6rVAgrGh_uaMrCIgXJIwQTmbcboJlnrH_MmPIQSd0,3321
|
|
22
|
-
pixeltable/exec/cache_prefetch_node.py,sha256=
|
|
22
|
+
pixeltable/exec/cache_prefetch_node.py,sha256=zDYYc0vmdLzB82YqgJRdCMriaMHX07LS3o04G2U3NmI,5212
|
|
23
23
|
pixeltable/exec/component_iteration_node.py,sha256=Uz6zEeaJMcbvF3S0W0qmLI_uWsZsaSspHKNzuAMrasg,4069
|
|
24
24
|
pixeltable/exec/data_row_batch.py,sha256=ZaS_ciyYhoP50Aoszhgtnh_yDRR6z9H43crnaJdP-xA,3505
|
|
25
25
|
pixeltable/exec/exec_context.py,sha256=E82Q2bJMJ1ulud5L5D9dh2Z8vEUQ659SgT614YKDO34,924
|
|
@@ -35,7 +35,7 @@ pixeltable/exprs/column_property_ref.py,sha256=0PHiBys0fxe2LgjaMId5UHob4E-ZggyPL
|
|
|
35
35
|
pixeltable/exprs/column_ref.py,sha256=5-mbWV8-cWWu0ynxPSQ0L8oLewDrLp17xh8DOCmQ36s,4794
|
|
36
36
|
pixeltable/exprs/comparison.py,sha256=jwwvKG0nLOHiNyjZm8AWKn59qBtTYH98vTF_hhwn0Og,3000
|
|
37
37
|
pixeltable/exprs/compound_predicate.py,sha256=Gh22MKi625m5A_RunVRd-a1XFi-fitikqBVz2VNXKrs,3830
|
|
38
|
-
pixeltable/exprs/data_row.py,sha256=
|
|
38
|
+
pixeltable/exprs/data_row.py,sha256=TRbC2lmPm-U_Az2edlVaHbaYn-dm0G3IQp6gQ6HH5DQ,8046
|
|
39
39
|
pixeltable/exprs/expr.py,sha256=JyEmP8F9LXmxOrVswih1Aq0SrpGcboSRinOYIMWYfKM,23748
|
|
40
40
|
pixeltable/exprs/expr_set.py,sha256=Q64Q2yI0CTq2Ma_E-BUYlMotSstVuMm4OFZnBCedHRk,1222
|
|
41
41
|
pixeltable/exprs/function_call.py,sha256=QFzkb2gKjeALGTgCet-o0HETwTXoFBzsncbghgScmOE,16961
|
|
@@ -78,36 +78,36 @@ pixeltable/functions/util.py,sha256=v094FgixHchzKMj4YvfHExDRGIVhCL2D-NL3pl-92oo,
|
|
|
78
78
|
pixeltable/functions/video.py,sha256=WZF4G3tV-_LfRQHUinXe_rnu1-4N68Ht60JCR_s7Bew,2403
|
|
79
79
|
pixeltable/iterators/__init__.py,sha256=sfsasCypAq5rNOTMlr4j2ROXxzdl4M8L2KvQIEbd0cQ,70
|
|
80
80
|
pixeltable/iterators/base.py,sha256=sugU9mG19xf9I4c_lEQDI_xrXPLuyuIYlKc-9OiS1HQ,1545
|
|
81
|
-
pixeltable/iterators/document.py,sha256=
|
|
81
|
+
pixeltable/iterators/document.py,sha256=bWK-3oRD9Sbc5vIcxccMyFh8zTP40233NK3ch6uyLI0,13105
|
|
82
82
|
pixeltable/iterators/video.py,sha256=mUdHev0f_XJIfHTB-mejjToURh10Ud7l096eZm2aPjM,3444
|
|
83
83
|
pixeltable/metadata/__init__.py,sha256=6rLGFpWzQMCk0EcSKLp4Bnbk8tLK1cxuONBPqwDCMzU,2083
|
|
84
84
|
pixeltable/metadata/converters/convert_10.py,sha256=0mSGCn7vqtef63riPi9msUaaUvsSQIj-NFj9QFDYPdA,733
|
|
85
85
|
pixeltable/metadata/schema.py,sha256=oTxtFSvbmCEcr54F929_NYFVp76N8gpN4nHDr9VnA9M,7761
|
|
86
86
|
pixeltable/plan.py,sha256=BQMCxOCy7lO4dqBCt5W9GUFdBWkuhr13-T8_2E97fUk,34710
|
|
87
|
-
pixeltable/store.py,sha256=
|
|
87
|
+
pixeltable/store.py,sha256=ICqfHiotyMyTi2gsQ-Qw-ed1ooNkAx0vgMSMri4xfqk,19511
|
|
88
88
|
pixeltable/tests/conftest.py,sha256=2RyRWIW2Ky9VQ41Hj0ChNr_Oh5vTx4x95tUdJWX5ktE,6677
|
|
89
89
|
pixeltable/tests/test_audio.py,sha256=92PMPrMtYzLoaLiW92MupEfWPEcfoLlYlZKlxmWQXdI,3186
|
|
90
90
|
pixeltable/tests/test_catalog.py,sha256=Npxt72g5aZkfg1fqE-19L8rGilzicAiTC0ithIy3woI,1189
|
|
91
91
|
pixeltable/tests/test_client.py,sha256=9acrjElh1YVX8WXWO04VQ-S6mNx9ZtqAHoh4uBc81y4,531
|
|
92
92
|
pixeltable/tests/test_component_view.py,sha256=VfcBgdG1QKeo0AOnHmO21J3qdm_8-06RljB7kkTeTok,17732
|
|
93
|
-
pixeltable/tests/test_dataframe.py,sha256=
|
|
93
|
+
pixeltable/tests/test_dataframe.py,sha256=EH8pVeDpthH8J8561xZtn_Lz4Tb_8uycw4JjLKjZEJI,18007
|
|
94
94
|
pixeltable/tests/test_dirs.py,sha256=WuWGOcpUFPCl1PGZgOMcU5bpzv1ClUqZ5AxavrDeCic,3611
|
|
95
|
-
pixeltable/tests/test_document.py,sha256=
|
|
96
|
-
pixeltable/tests/test_exprs.py,sha256=
|
|
95
|
+
pixeltable/tests/test_document.py,sha256=5G52cMbkkX2lk5SwyYQ1KYjQjgUfVhjcsjPtL9xjGXU,5810
|
|
96
|
+
pixeltable/tests/test_exprs.py,sha256=ZwImlJpTu9YQ2AnAplurjxDmabYqG7rB7aU6TxQAJdI,32743
|
|
97
97
|
pixeltable/tests/test_function.py,sha256=6sA_3Oe1p4sUhL5L5hYyW-mG1TPGfFDmW1BPVPnGXek,12817
|
|
98
98
|
pixeltable/tests/test_functions.py,sha256=pKRsb8503vkYWzp_BOGuxd-PDtOb04NKW-T6_4sJ3B0,14394
|
|
99
99
|
pixeltable/tests/test_migration.py,sha256=UjJhhg061TtyTAa1CAB-BdlT9YwLJkl8yIGSetnqcKw,1535
|
|
100
100
|
pixeltable/tests/test_nos.py,sha256=ITE7FNEaNreJ_XTz4wYLWuidFSUQMFp3ShuHTz05OrE,2649
|
|
101
101
|
pixeltable/tests/test_snapshot.py,sha256=J8wepLOaOrJkqDWq1dkou8MIR5Hf1DEseAqlUrb7BFg,9297
|
|
102
|
-
pixeltable/tests/test_table.py,sha256=
|
|
102
|
+
pixeltable/tests/test_table.py,sha256=KGPny8KQ4wVYT-N78dqsoMahd_1GyQAGZaCqT7sB61E,48484
|
|
103
103
|
pixeltable/tests/test_transactional_directory.py,sha256=Jx55PZgrkHTI0Eli09puwMckvwfCM9arPTQUT9g6Tbg,1308
|
|
104
104
|
pixeltable/tests/test_types.py,sha256=4_LR5Poc8Fa5fOpRBaAc_qAN21SsVxFP54Npq_6n9G8,970
|
|
105
|
-
pixeltable/tests/test_video.py,sha256=
|
|
105
|
+
pixeltable/tests/test_video.py,sha256=j9vgxp9f2WdH0rCoMXqhgTW3XG-czTBU4rrnuR95y8E,7782
|
|
106
106
|
pixeltable/tests/test_view.py,sha256=vbKEk9kWF5U6B78uNLSQsGw46s2oOOhHnJy8p9NmNTo,21859
|
|
107
|
-
pixeltable/tests/utils.py,sha256=
|
|
107
|
+
pixeltable/tests/utils.py,sha256=2EpA2KQmE7fdNDGsOBmjpOwHmGpfNIv_1880itvcaoE,10378
|
|
108
108
|
pixeltable/tool/create_test_db_dump.py,sha256=ARlLUfOs4stxIPFl-hGl_KX-ck6JRWmUiXqTwTtS1GU,5148
|
|
109
109
|
pixeltable/tool/create_test_video.py,sha256=OLfccymYReIpzE8osZn4rQvLXxxiPC_l0vc06U74hVM,2899
|
|
110
|
-
pixeltable/type_system.py,sha256=
|
|
110
|
+
pixeltable/type_system.py,sha256=Qxx-LzE88QJPC528z8wnof66BwKBT7GPYOJ4bE4BV9o,31798
|
|
111
111
|
pixeltable/utils/__init__.py,sha256=UYlrf6TIWJT0g-Hac0b34-dEk478B5Qx8dGco34YlIk,439
|
|
112
112
|
pixeltable/utils/clip.py,sha256=HXXWFBJXW9XysdMk9_3hP1V1S-3B8Hwd5rNMbJFjjnI,720
|
|
113
113
|
pixeltable/utils/coco.py,sha256=mk1cxjKYQC0ABm2ZQ9SNu9MvBPECmmKvnASpxnFXdL0,5604
|
|
@@ -120,7 +120,7 @@ pixeltable/utils/pytorch.py,sha256=h7q-7q3gXThDoTVA8k9vIvMc4VgnNAQy3ScDIU6h3IE,6
|
|
|
120
120
|
pixeltable/utils/s3.py,sha256=rkanuhk9DWvSfmbOLQW1j1Iov4sl2KhxGGKN-AJ8LSE,432
|
|
121
121
|
pixeltable/utils/sql.py,sha256=5n5_OmXAGtqFdL6z5XvgnU-vlx6Ba6f1WJrO1ZwUle8,765
|
|
122
122
|
pixeltable/utils/transactional_directory.py,sha256=UGzCrGtLR3hEEf8sYGuWBzLVFAEQml3vdIavigWeTBM,1349
|
|
123
|
-
pixeltable-0.2.
|
|
124
|
-
pixeltable-0.2.
|
|
125
|
-
pixeltable-0.2.
|
|
126
|
-
pixeltable-0.2.
|
|
123
|
+
pixeltable-0.2.3.dist-info/LICENSE,sha256=0UNMmwuqWPC0xDY1NWMm4uNJ2_MyA1pnTNRgQTvuBiQ,746
|
|
124
|
+
pixeltable-0.2.3.dist-info/METADATA,sha256=n_jCwEwEIRpA78qdeOTZBgQzlTFAljHgsyOZPrg-o58,5473
|
|
125
|
+
pixeltable-0.2.3.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
|
|
126
|
+
pixeltable-0.2.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|