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 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=\'width:200px;\'><img src="data:image/jpeg;base64,{img_base64}"></div>'
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
- self._logger.info("OpenAI client not initialized (no API key configured).")
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) -> Optional['openai.OpenAI']:
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
@@ -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', '~/.pixeltable')).expanduser()
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, get_video_files
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 = get_video_files()
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 = get_video_files()
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 = get_video_files()
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 = get_video_files()
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 = get_video_files()
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
- if Env.get().openai_client is None:
114
- pytest.skip(f'OpenAI client does not exist (missing API key?)')
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.1
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 (>=1.5.3,<2.0.0)
20
- Requires-Dist: pgserver (==0.0.5)
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=rLgeYdVhAyeCZcgTDJWbCwR59OVp5vmpwL4PrIaEcDM,28327
18
- pixeltable/env.py,sha256=NdjLCAYCYqb2IlOJXTgLROondJim9adkj6hX3atCbNE,16225
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=8H8llMTdc7l9tUKuPqI-KzJYdM_G_X-mGPx9RhxNPYU,6581
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=I_IQalmd79LocI3bgwQ4Ad91fOHS1E9AOVhe--NH4Io,17704
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=XmqIwcZ5lVouSowtVImJPgIv0bSEYHR-J0BzgLDHkm8,14477
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=z_dj69xN3iLA2-nL7dy98tvZdlPFKjZHNuWogAWO75Y,9914
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.1.dist-info/LICENSE,sha256=0UNMmwuqWPC0xDY1NWMm4uNJ2_MyA1pnTNRgQTvuBiQ,746
123
- pixeltable-0.2.1.dist-info/METADATA,sha256=kGc8hDA7BwNSqw_uM-c-rytQbY8iZPFJKs_X8jQv0DY,5392
124
- pixeltable-0.2.1.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
125
- pixeltable-0.2.1.dist-info/RECORD,,
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,,