pixeltable 0.2.1__py3-none-any.whl → 0.2.2__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/dataframe.py +1 -1
- pixeltable/env.py +16 -14
- pixeltable/tests/conftest.py +3 -1
- pixeltable/tests/test_component_view.py +6 -8
- pixeltable/tests/test_functions.py +5 -4
- pixeltable/tests/utils.py +9 -0
- pixeltable/tool/create_test_video.py +81 -0
- {pixeltable-0.2.1.dist-info → pixeltable-0.2.2.dist-info}/METADATA +6 -6
- {pixeltable-0.2.1.dist-info → pixeltable-0.2.2.dist-info}/RECORD +11 -10
- {pixeltable-0.2.1.dist-info → pixeltable-0.2.2.dist-info}/LICENSE +0 -0
- {pixeltable-0.2.1.dist-info → pixeltable-0.2.2.dist-info}/WHEEL +0 -0
pixeltable/dataframe.py
CHANGED
|
@@ -39,7 +39,7 @@ def _format_img(img: object) -> str:
|
|
|
39
39
|
with io.BytesIO() as buffer:
|
|
40
40
|
img.save(buffer, 'jpeg')
|
|
41
41
|
img_base64 = base64.b64encode(buffer.getvalue()).decode()
|
|
42
|
-
return f'<div style
|
|
42
|
+
return f'<div style="width:200px;"><img src="data:image/jpeg;base64,{img_base64}" width="200" /></div>'
|
|
43
43
|
|
|
44
44
|
def _create_source_tag(file_path: str) -> str:
|
|
45
45
|
abs_path = Path(file_path)
|
pixeltable/env.py
CHANGED
|
@@ -92,7 +92,7 @@ class Env:
|
|
|
92
92
|
def db_url(self) -> str:
|
|
93
93
|
assert self._db_url is not None
|
|
94
94
|
return self._db_url
|
|
95
|
-
|
|
95
|
+
|
|
96
96
|
@property
|
|
97
97
|
def http_address(self) -> str:
|
|
98
98
|
assert self._http_address is not None
|
|
@@ -142,7 +142,7 @@ class Env:
|
|
|
142
142
|
def set_up(self, echo: bool = False, reinit_db: bool = False) -> None:
|
|
143
143
|
if self._initialized:
|
|
144
144
|
return
|
|
145
|
-
|
|
145
|
+
|
|
146
146
|
self._initialized = True
|
|
147
147
|
home = Path(os.environ.get('PIXELTABLE_HOME', str(Path.home() / '.pixeltable')))
|
|
148
148
|
assert self._home is None or self._home == home
|
|
@@ -153,7 +153,6 @@ class Env:
|
|
|
153
153
|
self._dataset_cache_dir = self._home / 'dataset_cache'
|
|
154
154
|
self._log_dir = self._home / 'logs'
|
|
155
155
|
self._tmp_dir = self._home / 'tmp'
|
|
156
|
-
self._pgdata_dir = Path(os.environ.get('PIXELTABLE_PGDATA', str(self._home / 'pgdata')))
|
|
157
156
|
|
|
158
157
|
# Read in the config
|
|
159
158
|
if os.path.isfile(self._config_file):
|
|
@@ -204,8 +203,9 @@ class Env:
|
|
|
204
203
|
os.remove(path)
|
|
205
204
|
|
|
206
205
|
self._db_name = os.environ.get('PIXELTABLE_DB', 'pixeltable')
|
|
206
|
+
self._pgdata_dir = Path(os.environ.get('PIXELTABLE_PGDATA', str(self._home / 'pgdata')))
|
|
207
207
|
|
|
208
|
-
# cleanup_mode=None will leave db on for debugging purposes
|
|
208
|
+
# in pgserver.get_server(): cleanup_mode=None will leave db on for debugging purposes
|
|
209
209
|
self._db_server = pgserver.get_server(self._pgdata_dir, cleanup_mode=None)
|
|
210
210
|
self._db_url = self._db_server.get_uri(database=self._db_name)
|
|
211
211
|
|
|
@@ -257,16 +257,17 @@ class Env:
|
|
|
257
257
|
_ = create_nos_modules()
|
|
258
258
|
|
|
259
259
|
def _create_openai_client(self) -> None:
|
|
260
|
+
if not self.is_installed_package('openai'):
|
|
261
|
+
raise excs.Error('OpenAI client not initialized (cannot find package `openai`: `pip install openai`?)')
|
|
262
|
+
import openai
|
|
260
263
|
if 'openai' in self._config and 'api_key' in self._config['openai']:
|
|
261
264
|
api_key = self._config['openai']['api_key']
|
|
262
265
|
else:
|
|
263
266
|
api_key = os.environ.get('OPENAI_API_KEY')
|
|
264
267
|
if api_key is None or api_key == '':
|
|
265
|
-
|
|
266
|
-
return
|
|
267
|
-
import openai
|
|
268
|
-
self._logger.info('Initializing OpenAI client.')
|
|
268
|
+
raise excs.Error('OpenAI client not initialized (no API key configured).')
|
|
269
269
|
self._openai_client = openai.OpenAI(api_key=api_key)
|
|
270
|
+
self._logger.info('Initialized OpenAI client.')
|
|
270
271
|
|
|
271
272
|
def _create_together_client(self) -> None:
|
|
272
273
|
if 'together' in self._config and 'api_key' in self._config['together']:
|
|
@@ -285,15 +286,15 @@ class Env:
|
|
|
285
286
|
"""
|
|
286
287
|
The http server root is the file system root.
|
|
287
288
|
eg: /home/media/foo.mp4 is located at http://127.0.0.1:{port}/home/media/foo.mp4
|
|
288
|
-
This arrangement enables serving media hosted within _home,
|
|
289
|
+
This arrangement enables serving media hosted within _home,
|
|
289
290
|
as well as external media inserted into pixeltable or produced by pixeltable.
|
|
290
291
|
The port is chosen dynamically to prevent conflicts.
|
|
291
|
-
"""
|
|
292
|
+
"""
|
|
292
293
|
# Port 0 means OS picks one for us.
|
|
293
294
|
address = ("127.0.0.1", 0)
|
|
294
295
|
class FixedRootHandler(http.server.SimpleHTTPRequestHandler):
|
|
295
296
|
def __init__(self, *args, **kwargs):
|
|
296
|
-
super().__init__(*args, directory='/', **kwargs)
|
|
297
|
+
super().__init__(*args, directory='/', **kwargs)
|
|
297
298
|
self._httpd = socketserver.TCPServer(address, FixedRootHandler)
|
|
298
299
|
port = self._httpd.server_address[1]
|
|
299
300
|
self._http_address = f'http://127.0.0.1:{port}'
|
|
@@ -330,8 +331,6 @@ class Env:
|
|
|
330
331
|
self._spacy_nlp = spacy.load('en_core_web_sm')
|
|
331
332
|
check('tiktoken')
|
|
332
333
|
check('openai')
|
|
333
|
-
if self.is_installed_package('openai'):
|
|
334
|
-
self._create_openai_client()
|
|
335
334
|
check('together')
|
|
336
335
|
if self.is_installed_package('together'):
|
|
337
336
|
self._create_together_client()
|
|
@@ -401,7 +400,10 @@ class Env:
|
|
|
401
400
|
return self._nos_client
|
|
402
401
|
|
|
403
402
|
@property
|
|
404
|
-
def openai_client(self) ->
|
|
403
|
+
def openai_client(self) -> 'openai.OpenAI':
|
|
404
|
+
if self._openai_client is None:
|
|
405
|
+
self._create_openai_client()
|
|
406
|
+
assert self._openai_client is not None
|
|
405
407
|
return self._openai_client
|
|
406
408
|
|
|
407
409
|
@property
|
pixeltable/tests/conftest.py
CHANGED
|
@@ -23,7 +23,7 @@ def init_env(tmp_path_factory) -> None:
|
|
|
23
23
|
from pixeltable.env import Env
|
|
24
24
|
# set the relevant env vars for Client() to connect to the test db
|
|
25
25
|
|
|
26
|
-
shared_home = pathlib.Path(os.environ.get('PIXELTABLE_HOME', '
|
|
26
|
+
shared_home = pathlib.Path(os.environ.get('PIXELTABLE_HOME', str(pathlib.Path.home() / '.pixeltable')))
|
|
27
27
|
home_dir = str(tmp_path_factory.mktemp('base') / '.pixeltable')
|
|
28
28
|
os.environ['PIXELTABLE_HOME'] = home_dir
|
|
29
29
|
os.environ['PIXELTABLE_CONFIG'] = str(shared_home / 'config.yaml')
|
|
@@ -31,6 +31,8 @@ def init_env(tmp_path_factory) -> None:
|
|
|
31
31
|
os.environ['PIXELTABLE_DB'] = test_db
|
|
32
32
|
os.environ['PIXELTABLE_PGDATA'] = str(shared_home / 'pgdata')
|
|
33
33
|
|
|
34
|
+
# ensure this home dir exits
|
|
35
|
+
shared_home.mkdir(parents=True, exist_ok=True)
|
|
34
36
|
# this also runs create_all()
|
|
35
37
|
Env.get().set_up(echo=True)
|
|
36
38
|
yield
|
|
@@ -9,10 +9,9 @@ import pixeltable as pxt
|
|
|
9
9
|
from pixeltable import exceptions as excs
|
|
10
10
|
from pixeltable.iterators import ComponentIterator
|
|
11
11
|
from pixeltable.iterators.video import FrameIterator
|
|
12
|
-
from pixeltable.tests.utils import assert_resultset_eq,
|
|
12
|
+
from pixeltable.tests.utils import assert_resultset_eq, get_test_video_files
|
|
13
13
|
from pixeltable.type_system import IntType, VideoType, JsonType
|
|
14
14
|
|
|
15
|
-
|
|
16
15
|
class ConstantImgIterator(ComponentIterator):
|
|
17
16
|
"""Component iterator that generates a fixed number of all-black 1280x720 images."""
|
|
18
17
|
def __init__(self, video: str, num_frames: int = 10):
|
|
@@ -59,14 +58,13 @@ class ConstantImgIterator(ComponentIterator):
|
|
|
59
58
|
return
|
|
60
59
|
self.next_frame_idx = pos
|
|
61
60
|
|
|
62
|
-
|
|
63
61
|
class TestComponentView:
|
|
64
62
|
def test_basic(self, test_client: pxt.Client) -> None:
|
|
65
63
|
cl = test_client
|
|
66
64
|
# create video table
|
|
67
65
|
schema = {'video': VideoType(), 'angle': IntType(), 'other_angle': IntType()}
|
|
68
66
|
video_t = cl.create_table('video_tbl', schema)
|
|
69
|
-
video_filepaths =
|
|
67
|
+
video_filepaths = get_test_video_files()
|
|
70
68
|
|
|
71
69
|
# cannot add 'pos' column
|
|
72
70
|
with pytest.raises(excs.Error) as excinfo:
|
|
@@ -124,7 +122,7 @@ class TestComponentView:
|
|
|
124
122
|
cl = test_client
|
|
125
123
|
# create video table
|
|
126
124
|
video_t = cl.create_table('video_tbl', {'video': VideoType()})
|
|
127
|
-
video_filepaths =
|
|
125
|
+
video_filepaths = get_test_video_files()
|
|
128
126
|
# create frame view
|
|
129
127
|
args = {'video': video_t.video, 'fps': 1}
|
|
130
128
|
view_t = cl.create_view('test_view', video_t, iterator_class=FrameIterator, iterator_args=args)
|
|
@@ -153,7 +151,7 @@ class TestComponentView:
|
|
|
153
151
|
'test_view', video_t, schema={'annotation': JsonType(nullable=True)},
|
|
154
152
|
iterator_class=FrameIterator, iterator_args=args)
|
|
155
153
|
|
|
156
|
-
video_filepaths =
|
|
154
|
+
video_filepaths = get_test_video_files()
|
|
157
155
|
rows = [{'video': p} for p in video_filepaths]
|
|
158
156
|
status = video_t.insert(rows)
|
|
159
157
|
assert status.num_excs == 0
|
|
@@ -206,7 +204,7 @@ class TestComponentView:
|
|
|
206
204
|
|
|
207
205
|
# create video table
|
|
208
206
|
video_t = cl.create_table(base_path, {'video': VideoType(), 'margin': IntType()})
|
|
209
|
-
video_filepaths =
|
|
207
|
+
video_filepaths = get_test_video_files()
|
|
210
208
|
rows = [{'video': path, 'margin': i * 10} for i, path in enumerate(video_filepaths)]
|
|
211
209
|
status = video_t.insert(rows)
|
|
212
210
|
assert status.num_rows == len(rows)
|
|
@@ -277,7 +275,7 @@ class TestComponentView:
|
|
|
277
275
|
# create video table
|
|
278
276
|
schema = {'video': VideoType(), 'int1': IntType(), 'int2': IntType()}
|
|
279
277
|
video_t = cl.create_table('video_tbl', schema)
|
|
280
|
-
video_filepaths =
|
|
278
|
+
video_filepaths = get_test_video_files()
|
|
281
279
|
|
|
282
280
|
# create first view
|
|
283
281
|
args = {'video': video_t.video}
|
|
@@ -5,6 +5,7 @@ import pytest
|
|
|
5
5
|
import pixeltable as pxt
|
|
6
6
|
from pixeltable import catalog
|
|
7
7
|
from pixeltable.env import Env
|
|
8
|
+
import pixeltable.exceptions as excs
|
|
8
9
|
from pixeltable.functions.pil.image import blend
|
|
9
10
|
from pixeltable.iterators import FrameIterator
|
|
10
11
|
from pixeltable.tests.utils import get_video_files, skip_test_if_not_installed, get_sentences, get_image_files
|
|
@@ -67,8 +68,6 @@ class TestFunctions:
|
|
|
67
68
|
def test_openai(self, test_client: pxt.Client) -> None:
|
|
68
69
|
skip_test_if_not_installed('openai')
|
|
69
70
|
TestFunctions.skip_test_if_no_openai_client()
|
|
70
|
-
if Env.get().openai_client is None:
|
|
71
|
-
pytest.skip(f'OpenAI client does not exist (missing API key?).')
|
|
72
71
|
cl = test_client
|
|
73
72
|
t = cl.create_table('test_tbl', {'input': StringType()})
|
|
74
73
|
from pixeltable.functions.openai import chat_completions, embeddings, moderations
|
|
@@ -110,8 +109,10 @@ class TestFunctions:
|
|
|
110
109
|
|
|
111
110
|
@staticmethod
|
|
112
111
|
def skip_test_if_no_openai_client() -> None:
|
|
113
|
-
|
|
114
|
-
|
|
112
|
+
try:
|
|
113
|
+
_ = Env.get().openai_client
|
|
114
|
+
except excs.Error as exc:
|
|
115
|
+
pytest.skip(str(exc))
|
|
115
116
|
|
|
116
117
|
def test_together(self, test_client: pxt.Client) -> None:
|
|
117
118
|
skip_test_if_not_installed('together')
|
pixeltable/tests/utils.py
CHANGED
|
@@ -18,6 +18,8 @@ from pixeltable.type_system import \
|
|
|
18
18
|
ColumnType, StringType, IntType, FloatType, ArrayType, BoolType, TimestampType, JsonType, ImageType, VideoType
|
|
19
19
|
|
|
20
20
|
|
|
21
|
+
|
|
22
|
+
|
|
21
23
|
def make_default_type(t: ColumnType.Type) -> ColumnType:
|
|
22
24
|
if t == ColumnType.Type.STRING:
|
|
23
25
|
return StringType()
|
|
@@ -228,6 +230,13 @@ def get_video_files(include_bad_video=False) -> List[str]:
|
|
|
228
230
|
glob_result = glob.glob(f'{tests_dir}/**/videos/*', recursive=True)
|
|
229
231
|
if not include_bad_video:
|
|
230
232
|
glob_result = [f for f in glob_result if 'bad_video' not in f]
|
|
233
|
+
|
|
234
|
+
half_res = [f for f in glob_result if 'half_res' in f or 'bad_video' in f]
|
|
235
|
+
return half_res
|
|
236
|
+
|
|
237
|
+
def get_test_video_files() -> List[str]:
|
|
238
|
+
tests_dir = os.path.dirname(__file__) # search with respect to tests/ dir
|
|
239
|
+
glob_result = glob.glob(f'{tests_dir}/**/test_videos/*', recursive=True)
|
|
231
240
|
return glob_result
|
|
232
241
|
|
|
233
242
|
def get_image_files() -> List[str]:
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import av
|
|
2
|
+
import PIL.Image
|
|
3
|
+
import PIL.ImageDraw
|
|
4
|
+
import PIL.ImageFont
|
|
5
|
+
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from typing import Optional
|
|
8
|
+
import tempfile
|
|
9
|
+
import math
|
|
10
|
+
|
|
11
|
+
def create_test_video(
|
|
12
|
+
frame_count: int,
|
|
13
|
+
frame_rate: float = 1.0,
|
|
14
|
+
frame_width: int = 224,
|
|
15
|
+
aspect_ratio: str = '16:9',
|
|
16
|
+
frame_height: Optional[int] = None,
|
|
17
|
+
output_path: Optional[Path] = None,
|
|
18
|
+
font_file: str = '/Library/Fonts/Arial Unicode.ttf',
|
|
19
|
+
) -> Path:
|
|
20
|
+
"""
|
|
21
|
+
Creates an .mp4 video file such as the ones in /tests/data/test_videos
|
|
22
|
+
The video contains a frame number in each frame (for visual sanity check).
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
frame_count: Number of frames to create
|
|
26
|
+
frame_rate: Frame rate of the video
|
|
27
|
+
frame_width (int): Width in pixels of the video frame. Note: cost of decoding increases dramatically
|
|
28
|
+
with frame width * frame height.
|
|
29
|
+
aspect_ratio: Aspect ratio (width/height) of the video frames string of form 'width:height'
|
|
30
|
+
frame_height: Height of the video frame, if given, aspect_ratio is ignored
|
|
31
|
+
output_path: Path to save the video file
|
|
32
|
+
font_file: Path to the font file used for text.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
if output_path is None:
|
|
36
|
+
output_path = Path(tempfile.NamedTemporaryFile(suffix='.mp4', delete=False).name)
|
|
37
|
+
|
|
38
|
+
parts = [int(p) for p in aspect_ratio.split(':')]
|
|
39
|
+
assert len(parts) == 2
|
|
40
|
+
aspect_ratio = parts[0] / parts[1]
|
|
41
|
+
|
|
42
|
+
if frame_height is None:
|
|
43
|
+
frame_height = math.ceil(frame_width / aspect_ratio)
|
|
44
|
+
|
|
45
|
+
frame_size = (frame_width, frame_height)
|
|
46
|
+
|
|
47
|
+
font_size = min(frame_height, frame_width) // 4
|
|
48
|
+
font = PIL.ImageFont.truetype(font=font_file, size=font_size)
|
|
49
|
+
font_fill = 0xFFFFFF # white
|
|
50
|
+
frame_color = 0xFFFFFF - font_fill # black
|
|
51
|
+
# Create a video container
|
|
52
|
+
container = av.open(str(output_path), mode='w')
|
|
53
|
+
|
|
54
|
+
# Add a video stream
|
|
55
|
+
stream = container.add_stream('h264', rate=frame_rate)
|
|
56
|
+
stream.width, stream.height = frame_size
|
|
57
|
+
stream.pix_fmt = 'yuv420p'
|
|
58
|
+
|
|
59
|
+
for frame_number in range(frame_count):
|
|
60
|
+
# Create an image with a number in it
|
|
61
|
+
image = PIL.Image.new('RGB', frame_size, color=frame_color)
|
|
62
|
+
draw = PIL.ImageDraw.Draw(image)
|
|
63
|
+
# Optionally, add a font here if you have one
|
|
64
|
+
text = str(frame_number)
|
|
65
|
+
_, _, text_width, text_height = draw.textbbox((0, 0), text, font=font)
|
|
66
|
+
text_position = ((frame_size[0] - text_width) // 2, (frame_size[1] - text_height) // 2)
|
|
67
|
+
draw.text(text_position, text, font=font, fill=font_fill)
|
|
68
|
+
|
|
69
|
+
# Convert the PIL image to an AVFrame
|
|
70
|
+
frame = av.VideoFrame.from_image(image)
|
|
71
|
+
|
|
72
|
+
# Encode and write the frame
|
|
73
|
+
for packet in stream.encode(frame):
|
|
74
|
+
container.mux(packet)
|
|
75
|
+
|
|
76
|
+
# Flush and close the stream
|
|
77
|
+
for packet in stream.encode():
|
|
78
|
+
container.mux(packet)
|
|
79
|
+
|
|
80
|
+
container.close()
|
|
81
|
+
return output_path
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: pixeltable
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.2
|
|
4
4
|
Summary: Pixeltable: The Multimodal AI Data Plane
|
|
5
5
|
Author: Marcel Kornacker
|
|
6
6
|
Author-email: marcelk@gmail.com
|
|
@@ -16,8 +16,8 @@ Requires-Dist: jinja2 (>=3.1.3,<4.0.0)
|
|
|
16
16
|
Requires-Dist: jmespath (>=1.0.1,<2.0.0)
|
|
17
17
|
Requires-Dist: numpy (>=1.24.1,<2.0.0)
|
|
18
18
|
Requires-Dist: opencv-python-headless (>=4.7.0.68,<5.0.0.0)
|
|
19
|
-
Requires-Dist: pandas (>=
|
|
20
|
-
Requires-Dist: pgserver (==0.0.
|
|
19
|
+
Requires-Dist: pandas (>=2.0,<3.0)
|
|
20
|
+
Requires-Dist: pgserver (==0.0.7)
|
|
21
21
|
Requires-Dist: pgvector (>=0.2.1,<0.3.0)
|
|
22
22
|
Requires-Dist: pillow (>=9.4.0,<10.0.0)
|
|
23
23
|
Requires-Dist: psutil (>=5.9.5,<6.0.0)
|
|
@@ -45,16 +45,16 @@ data plumbing.
|
|
|
45
45
|
It brings together data storage, versioning, and indexing with orchestration and model
|
|
46
46
|
versioning under a declarative table interface, with transformations, model inference,
|
|
47
47
|
and custom logic represented as computed columns.
|
|
48
|
-
|
|
48
|
+
|
|
49
49
|
## Quick Start
|
|
50
50
|
|
|
51
51
|
If you just want to play around with Pixeltable to see what it's capable of, the easiest way is to run
|
|
52
52
|
the Pixeltable Basics tutorial in colab:
|
|
53
53
|
|
|
54
|
-
<a target="_blank" href="https://colab.research.google.com/github/pixeltable/pixeltable/blob/docs/tutorials/pixeltable-basics.ipynb">
|
|
54
|
+
<a target="_blank" href="https://colab.research.google.com/github/pixeltable/pixeltable/blob/master/docs/tutorials/pixeltable-basics.ipynb">
|
|
55
55
|
<img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"/>
|
|
56
56
|
</a>
|
|
57
|
-
|
|
57
|
+
|
|
58
58
|
## Installation
|
|
59
59
|
|
|
60
60
|
Pixeltable works with Python 3.9, 3.10, or 3.11 running on Linux or MacOS.
|
|
@@ -14,8 +14,8 @@ pixeltable/catalog/table_version.py,sha256=Q1NSaeLmFw7gYgARyyW6JJ79GRhjtp0_Q410K
|
|
|
14
14
|
pixeltable/catalog/table_version_path.py,sha256=kn5T0m5XBqphlDqCKsqD-s159diCjKvrSrtzYZHwKuw,5461
|
|
15
15
|
pixeltable/catalog/view.py,sha256=BIL3s4DV3tWbOcqtqnhn46B2UvLaBhppfJUlNEt5nec,9734
|
|
16
16
|
pixeltable/client.py,sha256=HiqGNRQoyBPXF2rAhTJFE3ZSUUaSLpGo28pLZjubh8Y,20548
|
|
17
|
-
pixeltable/dataframe.py,sha256=
|
|
18
|
-
pixeltable/env.py,sha256=
|
|
17
|
+
pixeltable/dataframe.py,sha256=vBc4T-QU-lTTtnljqDbBFTHwm2CecLHIjJumEv8lQ0s,28339
|
|
18
|
+
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
|
|
@@ -85,17 +85,17 @@ pixeltable/metadata/converters/convert_10.py,sha256=0mSGCn7vqtef63riPi9msUaaUvsS
|
|
|
85
85
|
pixeltable/metadata/schema.py,sha256=oTxtFSvbmCEcr54F929_NYFVp76N8gpN4nHDr9VnA9M,7761
|
|
86
86
|
pixeltable/plan.py,sha256=BQMCxOCy7lO4dqBCt5W9GUFdBWkuhr13-T8_2E97fUk,34710
|
|
87
87
|
pixeltable/store.py,sha256=91WSmmYcvf_dXZEchj4jcBC7GavPFGZbwHGoPMKlfjU,19230
|
|
88
|
-
pixeltable/tests/conftest.py,sha256=
|
|
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
|
-
pixeltable/tests/test_component_view.py,sha256=
|
|
92
|
+
pixeltable/tests/test_component_view.py,sha256=VfcBgdG1QKeo0AOnHmO21J3qdm_8-06RljB7kkTeTok,17732
|
|
93
93
|
pixeltable/tests/test_dataframe.py,sha256=zu1Zw3c7k96afWqUyFwUnOBebzLxTRZ0xA3v7tnM2n8,17686
|
|
94
94
|
pixeltable/tests/test_dirs.py,sha256=WuWGOcpUFPCl1PGZgOMcU5bpzv1ClUqZ5AxavrDeCic,3611
|
|
95
95
|
pixeltable/tests/test_document.py,sha256=KUHZmjpI94rHdwOPBrhsSpeaqYbBTzIKa2gX98WGE7E,5657
|
|
96
96
|
pixeltable/tests/test_exprs.py,sha256=A4rhwONnOjovgenYF81n_q8NMJaGisT1kq8kJdDAqQ4,32695
|
|
97
97
|
pixeltable/tests/test_function.py,sha256=6sA_3Oe1p4sUhL5L5hYyW-mG1TPGfFDmW1BPVPnGXek,12817
|
|
98
|
-
pixeltable/tests/test_functions.py,sha256=
|
|
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
|
|
@@ -104,8 +104,9 @@ pixeltable/tests/test_transactional_directory.py,sha256=Jx55PZgrkHTI0Eli09puwMck
|
|
|
104
104
|
pixeltable/tests/test_types.py,sha256=4_LR5Poc8Fa5fOpRBaAc_qAN21SsVxFP54Npq_6n9G8,970
|
|
105
105
|
pixeltable/tests/test_video.py,sha256=GiSQjvobVdMvjGqvpZCc778sGpqX4LEy84zfgNSpjtA,7676
|
|
106
106
|
pixeltable/tests/test_view.py,sha256=vbKEk9kWF5U6B78uNLSQsGw46s2oOOhHnJy8p9NmNTo,21859
|
|
107
|
-
pixeltable/tests/utils.py,sha256=
|
|
107
|
+
pixeltable/tests/utils.py,sha256=7bSdyD0B_Tt-s6FpUmgzh5b-fMEw04Z2KO5WV62CZGo,10213
|
|
108
108
|
pixeltable/tool/create_test_db_dump.py,sha256=ARlLUfOs4stxIPFl-hGl_KX-ck6JRWmUiXqTwTtS1GU,5148
|
|
109
|
+
pixeltable/tool/create_test_video.py,sha256=OLfccymYReIpzE8osZn4rQvLXxxiPC_l0vc06U74hVM,2899
|
|
109
110
|
pixeltable/type_system.py,sha256=w3UMqk3U1IXyo-gAfoeiaOB26iSgYKAeGmTDzpwQkRk,31781
|
|
110
111
|
pixeltable/utils/__init__.py,sha256=UYlrf6TIWJT0g-Hac0b34-dEk478B5Qx8dGco34YlIk,439
|
|
111
112
|
pixeltable/utils/clip.py,sha256=HXXWFBJXW9XysdMk9_3hP1V1S-3B8Hwd5rNMbJFjjnI,720
|
|
@@ -119,7 +120,7 @@ pixeltable/utils/pytorch.py,sha256=h7q-7q3gXThDoTVA8k9vIvMc4VgnNAQy3ScDIU6h3IE,6
|
|
|
119
120
|
pixeltable/utils/s3.py,sha256=rkanuhk9DWvSfmbOLQW1j1Iov4sl2KhxGGKN-AJ8LSE,432
|
|
120
121
|
pixeltable/utils/sql.py,sha256=5n5_OmXAGtqFdL6z5XvgnU-vlx6Ba6f1WJrO1ZwUle8,765
|
|
121
122
|
pixeltable/utils/transactional_directory.py,sha256=UGzCrGtLR3hEEf8sYGuWBzLVFAEQml3vdIavigWeTBM,1349
|
|
122
|
-
pixeltable-0.2.
|
|
123
|
-
pixeltable-0.2.
|
|
124
|
-
pixeltable-0.2.
|
|
125
|
-
pixeltable-0.2.
|
|
123
|
+
pixeltable-0.2.2.dist-info/LICENSE,sha256=0UNMmwuqWPC0xDY1NWMm4uNJ2_MyA1pnTNRgQTvuBiQ,746
|
|
124
|
+
pixeltable-0.2.2.dist-info/METADATA,sha256=3--U-t3gfht-zUQrrkdhPzIKc6cBo3PaC2R62E6KNC0,5388
|
|
125
|
+
pixeltable-0.2.2.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
|
|
126
|
+
pixeltable-0.2.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|