pixeltable 0.2.5__py3-none-any.whl → 0.2.6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of pixeltable might be problematic. Click here for more details.

Files changed (87) hide show
  1. pixeltable/__init__.py +18 -9
  2. pixeltable/__version__.py +3 -0
  3. pixeltable/catalog/column.py +9 -5
  4. pixeltable/catalog/insertable_table.py +0 -2
  5. pixeltable/catalog/table.py +16 -8
  6. pixeltable/catalog/table_version.py +3 -2
  7. pixeltable/dataframe.py +184 -110
  8. pixeltable/env.py +69 -18
  9. pixeltable/exec/__init__.py +2 -1
  10. pixeltable/exec/data_row_batch.py +6 -7
  11. pixeltable/exec/expr_eval_node.py +28 -28
  12. pixeltable/exec/sql_scan_node.py +7 -6
  13. pixeltable/exprs/__init__.py +4 -3
  14. pixeltable/exprs/column_ref.py +9 -0
  15. pixeltable/exprs/expr.py +15 -7
  16. pixeltable/exprs/function_call.py +17 -15
  17. pixeltable/exprs/image_member_access.py +9 -28
  18. pixeltable/exprs/in_predicate.py +96 -0
  19. pixeltable/exprs/inline_array.py +13 -11
  20. pixeltable/exprs/inline_dict.py +15 -13
  21. pixeltable/exprs/row_builder.py +7 -1
  22. pixeltable/exprs/similarity_expr.py +65 -0
  23. pixeltable/func/__init__.py +0 -2
  24. pixeltable/func/aggregate_function.py +3 -0
  25. pixeltable/func/callable_function.py +57 -13
  26. pixeltable/func/expr_template_function.py +11 -2
  27. pixeltable/func/function.py +35 -4
  28. pixeltable/func/signature.py +5 -15
  29. pixeltable/func/udf.py +6 -10
  30. pixeltable/functions/huggingface.py +23 -4
  31. pixeltable/functions/openai.py +34 -1
  32. pixeltable/functions/pil/image.py +61 -64
  33. pixeltable/functions/together.py +21 -0
  34. pixeltable/globals.py +425 -0
  35. pixeltable/index/base.py +3 -1
  36. pixeltable/index/embedding_index.py +87 -14
  37. pixeltable/io/__init__.py +3 -0
  38. pixeltable/{utils → io}/hf_datasets.py +48 -17
  39. pixeltable/io/pandas.py +148 -0
  40. pixeltable/{utils → io}/parquet.py +58 -33
  41. pixeltable/iterators/__init__.py +1 -1
  42. pixeltable/iterators/base.py +4 -0
  43. pixeltable/iterators/document.py +218 -97
  44. pixeltable/iterators/video.py +8 -9
  45. pixeltable/metadata/__init__.py +7 -3
  46. pixeltable/metadata/converters/convert_12.py +3 -0
  47. pixeltable/metadata/converters/convert_13.py +41 -0
  48. pixeltable/plan.py +2 -19
  49. pixeltable/store.py +2 -2
  50. pixeltable/tool/create_test_db_dump.py +32 -13
  51. pixeltable/type_system.py +13 -54
  52. pixeltable/utils/documents.py +42 -12
  53. pixeltable/utils/http_server.py +70 -0
  54. {pixeltable-0.2.5.dist-info → pixeltable-0.2.6.dist-info}/METADATA +10 -7
  55. pixeltable-0.2.6.dist-info/RECORD +119 -0
  56. {pixeltable-0.2.5.dist-info → pixeltable-0.2.6.dist-info}/WHEEL +1 -1
  57. pixeltable/client.py +0 -600
  58. pixeltable/exprs/image_similarity_predicate.py +0 -58
  59. pixeltable/func/batched_function.py +0 -53
  60. pixeltable/tests/conftest.py +0 -171
  61. pixeltable/tests/ext/test_yolox.py +0 -21
  62. pixeltable/tests/functions/test_fireworks.py +0 -43
  63. pixeltable/tests/functions/test_functions.py +0 -60
  64. pixeltable/tests/functions/test_huggingface.py +0 -158
  65. pixeltable/tests/functions/test_openai.py +0 -162
  66. pixeltable/tests/functions/test_together.py +0 -112
  67. pixeltable/tests/test_audio.py +0 -65
  68. pixeltable/tests/test_catalog.py +0 -27
  69. pixeltable/tests/test_client.py +0 -21
  70. pixeltable/tests/test_component_view.py +0 -379
  71. pixeltable/tests/test_dataframe.py +0 -440
  72. pixeltable/tests/test_dirs.py +0 -107
  73. pixeltable/tests/test_document.py +0 -120
  74. pixeltable/tests/test_exprs.py +0 -802
  75. pixeltable/tests/test_function.py +0 -332
  76. pixeltable/tests/test_index.py +0 -138
  77. pixeltable/tests/test_migration.py +0 -44
  78. pixeltable/tests/test_nos.py +0 -54
  79. pixeltable/tests/test_snapshot.py +0 -231
  80. pixeltable/tests/test_table.py +0 -1343
  81. pixeltable/tests/test_transactional_directory.py +0 -42
  82. pixeltable/tests/test_types.py +0 -52
  83. pixeltable/tests/test_video.py +0 -159
  84. pixeltable/tests/test_view.py +0 -535
  85. pixeltable/tests/utils.py +0 -442
  86. pixeltable-0.2.5.dist-info/RECORD +0 -139
  87. {pixeltable-0.2.5.dist-info → pixeltable-0.2.6.dist-info}/LICENSE +0 -0
@@ -11,6 +11,7 @@ import toml
11
11
  import pixeltable as pxt
12
12
  import pixeltable.metadata as metadata
13
13
  from pixeltable.env import Env
14
+ from pixeltable.func import Batch
14
15
  from pixeltable.type_system import \
15
16
  StringType, IntType, FloatType, BoolType, TimestampType, JsonType
16
17
 
@@ -29,9 +30,7 @@ class Dumper:
29
30
  os.environ['PIXELTABLE_DB'] = db_name
30
31
  os.environ['PIXELTABLE_PGDATA'] = str(shared_home / 'pgdata')
31
32
 
32
- Env.get().set_up(reinit_db=True)
33
- self.cl = pxt.Client()
34
- self.cl.logging(level=logging.DEBUG, to_stdout=True)
33
+ Env.get().configure_logging(level=logging.DEBUG, to_stdout=True)
35
34
 
36
35
  def dump_db(self) -> None:
37
36
  md_version = metadata.VERSION
@@ -76,8 +75,18 @@ class Dumper:
76
75
  'c6': JsonType(nullable=False),
77
76
  'c7': JsonType(nullable=False),
78
77
  }
79
- t = self.cl.create_table('sample_table', schema, primary_key='c2')
78
+ t = pxt.create_table('sample_table', schema, primary_key='c2')
79
+
80
+ # Add columns for InlineArray and InlineDict
80
81
  t.add_column(c8=[[1, 2, 3], [4, 5, 6]])
82
+ t.add_column(c9=[['a', 'b', 'c'], ['d', 'e', 'f']])
83
+ t.add_column(c10=[t.c1, [t.c1n, t.c2]])
84
+ t.add_column(c11={'int': 22, 'dict': {'key': 'val'}, 'expr': t.c1})
85
+
86
+ # InPredicate
87
+ t.add_column(isin_1=t.c1.isin(['test string 1', 'test string 2', 'test string 3']))
88
+ t.add_column(isin_2=t.c2.isin([1, 2, 3, 4, 5]))
89
+ t.add_column(isin_3=t.c2.isin(t.c6.f5))
81
90
 
82
91
  # Add columns for .astype converters to ensure they're persisted properly
83
92
  t.add_column(c2_as_float=t.c2.astype(FloatType()))
@@ -136,24 +145,34 @@ class Dumper:
136
145
  for i in range(num_rows)
137
146
  ]
138
147
  t.insert(rows)
139
- self.cl.create_dir('views')
140
- v = self.cl.create_view('views.sample_view', t, filter=(t.c2 < 50))
141
- _ = self.cl.create_view('views.sample_snapshot', t, filter=(t.c2 >= 75), is_snapshot=True)
148
+ pxt.create_dir('views')
149
+ v = pxt.create_view('views.sample_view', t, filter=(t.c2 < 50))
150
+ _ = pxt.create_view('views.sample_snapshot', t, filter=(t.c2 >= 75), is_snapshot=True)
151
+ e = pxt.create_view('views.empty_view', t, filter=t.c2 == 4171780)
152
+ assert e.count() == 0
142
153
  # Computed column using a library function
143
154
  v['str_format'] = pxt.functions.string.str_format('{0} {key}', t.c1, key=t.c1)
144
- # Computed column using a bespoke udf
145
- v['test_udf'] = test_udf(t.c2)
155
+ # Computed column using a bespoke stored udf
156
+ v['test_udf'] = test_udf_stored(t.c2)
157
+ # Computed column using a batched function
158
+ # (apply this to the empty view, since it's a "heavyweight" function)
159
+ e['batched'] = pxt.functions.huggingface.clip_text(t.c1, model_id='openai/clip-vit-base-patch32')
160
+ # computed column using a stored batched function
161
+ v['test_udf_batched'] = test_udf_stored_batched(t.c1, upper=False)
146
162
  # astype
147
163
  v['astype'] = t.c1.astype(pxt.FloatType())
148
- # computed column using a stored function
149
- v['stored'] = t.c1.apply(lambda x: f'Hello, {x}', col_type=pxt.StringType())
150
164
 
151
165
 
152
- @pxt.udf
153
- def test_udf(n: int) -> int:
166
+ @pxt.udf(_force_stored=True)
167
+ def test_udf_stored(n: int) -> int:
154
168
  return n + 1
155
169
 
156
170
 
171
+ @pxt.udf(batch_size=4, _force_stored=True)
172
+ def test_udf_stored_batched(strings: Batch[str], *, upper: bool = True) -> Batch[str]:
173
+ return [string.upper() if upper else string.lower() for string in strings]
174
+
175
+
157
176
  def main() -> None:
158
177
  _logger.info("Creating pixeltable test artifact.")
159
178
  dumper = Dumper()
pixeltable/type_system.py CHANGED
@@ -225,6 +225,8 @@ class ColumnType:
225
225
  return BoolType()
226
226
  if isinstance(val, datetime.datetime) or isinstance(val, datetime.date):
227
227
  return TimestampType()
228
+ if isinstance(val, PIL.Image.Image):
229
+ return ImageType(width=val.width, height=val.height)
228
230
  if isinstance(val, np.ndarray):
229
231
  col_type = ArrayType.from_literal(val)
230
232
  if col_type is not None:
@@ -370,13 +372,6 @@ class ColumnType:
370
372
  # types that refer to external media files
371
373
  return self.is_image_type() or self.is_video_type() or self.is_audio_type() or self.is_document_type()
372
374
 
373
- @abc.abstractmethod
374
- def to_sql(self) -> str:
375
- """
376
- Return corresponding Postgres type.
377
- """
378
- pass
379
-
380
375
  @abc.abstractmethod
381
376
  def to_sa_type(self) -> sql.types.TypeEngine:
382
377
  """
@@ -404,9 +399,6 @@ class InvalidType(ColumnType):
404
399
  def __init__(self, nullable: bool = False):
405
400
  super().__init__(self.Type.INVALID, nullable=nullable)
406
401
 
407
- def to_sql(self) -> str:
408
- assert False
409
-
410
402
  def to_sa_type(self) -> sql.types.TypeEngine:
411
403
  assert False
412
404
 
@@ -432,9 +424,6 @@ class StringType(ColumnType):
432
424
  return None
433
425
  return convert
434
426
 
435
- def to_sql(self) -> str:
436
- return 'VARCHAR'
437
-
438
427
  def to_sa_type(self) -> sql.types.TypeEngine:
439
428
  return sql.String()
440
429
 
@@ -458,9 +447,6 @@ class IntType(ColumnType):
458
447
  def __init__(self, nullable: bool = False):
459
448
  super().__init__(self.Type.INT, nullable=nullable)
460
449
 
461
- def to_sql(self) -> str:
462
- return 'BIGINT'
463
-
464
450
  def to_sa_type(self) -> sql.types.TypeEngine:
465
451
  return sql.BigInteger()
466
452
 
@@ -473,9 +459,6 @@ class FloatType(ColumnType):
473
459
  def __init__(self, nullable: bool = False):
474
460
  super().__init__(self.Type.FLOAT, nullable=nullable)
475
461
 
476
- def to_sql(self) -> str:
477
- return 'FLOAT'
478
-
479
462
  def to_sa_type(self) -> sql.types.TypeEngine:
480
463
  return sql.Float()
481
464
 
@@ -493,9 +476,6 @@ class BoolType(ColumnType):
493
476
  def __init__(self, nullable: bool = False):
494
477
  super().__init__(self.Type.BOOL, nullable=nullable)
495
478
 
496
- def to_sql(self) -> str:
497
- return 'BOOLEAN'
498
-
499
479
  def to_sa_type(self) -> sql.types.TypeEngine:
500
480
  return sql.Boolean()
501
481
 
@@ -513,9 +493,6 @@ class TimestampType(ColumnType):
513
493
  def __init__(self, nullable: bool = False):
514
494
  super().__init__(self.Type.TIMESTAMP, nullable=nullable)
515
495
 
516
- def to_sql(self) -> str:
517
- return 'INTEGER'
518
-
519
496
  def to_sa_type(self) -> sql.types.TypeEngine:
520
497
  return sql.TIMESTAMP()
521
498
 
@@ -551,14 +528,13 @@ class JsonType(ColumnType):
551
528
  }
552
529
  return cls(type_spec, nullable=d['nullable'])
553
530
 
554
- def to_sql(self) -> str:
555
- return 'JSONB'
556
-
557
531
  def to_sa_type(self) -> sql.types.TypeEngine:
558
532
  return sql.dialects.postgresql.JSONB()
559
533
 
560
534
  def print_value(self, val: Any) -> str:
561
535
  val_type = self.infer_literal_type(val)
536
+ if val_type is None:
537
+ return super().print_value(val)
562
538
  if val_type == self:
563
539
  return str(val)
564
540
  return val_type.print_value(val)
@@ -657,9 +633,6 @@ class ArrayType(ColumnType):
657
633
  return np.array(val, dtype=self.numpy_dtype())
658
634
  return val
659
635
 
660
- def to_sql(self) -> str:
661
- return 'BYTEA'
662
-
663
636
  def to_sa_type(self) -> sql.types.TypeEngine:
664
637
  return sql.LargeBinary()
665
638
 
@@ -762,9 +735,6 @@ class ImageType(ColumnType):
762
735
  return img
763
736
  return convert
764
737
 
765
- def to_sql(self) -> str:
766
- return 'VARCHAR'
767
-
768
738
  def to_sa_type(self) -> sql.types.TypeEngine:
769
739
  return sql.String()
770
740
 
@@ -785,11 +755,8 @@ class VideoType(ColumnType):
785
755
  def __init__(self, nullable: bool = False):
786
756
  super().__init__(self.Type.VIDEO, nullable=nullable)
787
757
 
788
- def to_sql(self) -> str:
789
- # stored as a file path
790
- return 'VARCHAR'
791
-
792
758
  def to_sa_type(self) -> sql.types.TypeEngine:
759
+ # stored as a file path
793
760
  return sql.String()
794
761
 
795
762
  def _validate_literal(self, val: Any) -> None:
@@ -820,11 +787,8 @@ class AudioType(ColumnType):
820
787
  def __init__(self, nullable: bool = False):
821
788
  super().__init__(self.Type.AUDIO, nullable=nullable)
822
789
 
823
- def to_sql(self) -> str:
824
- # stored as a file path
825
- return 'VARCHAR'
826
-
827
790
  def to_sa_type(self) -> sql.types.TypeEngine:
791
+ # stored as a file path
828
792
  return sql.String()
829
793
 
830
794
  def _validate_literal(self, val: Any) -> None:
@@ -864,11 +828,8 @@ class DocumentType(ColumnType):
864
828
  else:
865
829
  self._doc_formats = [t for t in self.DocumentFormat]
866
830
 
867
- def to_sql(self) -> str:
868
- # stored as a file path
869
- return 'VARCHAR'
870
-
871
831
  def to_sa_type(self) -> sql.types.TypeEngine:
832
+ # stored as a file path
872
833
  return sql.String()
873
834
 
874
835
  def _validate_literal(self, val: Any) -> None:
@@ -877,11 +838,9 @@ class DocumentType(ColumnType):
877
838
  def validate_media(self, val: Any) -> None:
878
839
  assert isinstance(val, str)
879
840
  from pixeltable.utils.documents import get_document_handle
880
- with open(val, 'r', encoding='utf8') as fh:
881
- try:
882
- s = fh.read()
883
- dh = get_document_handle(s)
884
- if dh is None:
885
- raise excs.Error(f'Not a recognized document format: {val}')
886
- except Exception as e:
887
- raise excs.Error(f'Not a recognized document format: {val}') from None
841
+ try:
842
+ dh = get_document_handle(val)
843
+ if dh is None:
844
+ raise excs.Error(f'Not a recognized document format: {val}')
845
+ except Exception as e:
846
+ raise excs.Error(f'Not a recognized document format: {val}') from None
@@ -9,31 +9,61 @@ class DocumentHandle:
9
9
  format: ts.DocumentType.DocumentFormat
10
10
  bs_doc: Optional['bs4.BeautifulSoup'] = None
11
11
  md_ast: Optional[Dict] = None
12
+ pdf_doc: Optional['fitz.Document'] = None
12
13
 
14
+ def get_document_handle(path: str) -> Optional[DocumentHandle]:
15
+ # try pdf first, because a correct PDF is a binary format that
16
+ # would trigger encoding exceptions if oppened as utf8.
17
+ pdf_doc = get_pdf_handle(path)
18
+ if pdf_doc is not None:
19
+ return DocumentHandle(format=ts.DocumentType.DocumentFormat.PDF, pdf_doc=pdf_doc)
20
+ # currently the rest of the types are text-based, so we can open them in utf8 mode once
21
+ try:
22
+ with open(path, 'r', encoding='utf8') as file:
23
+ contents = file.read()
24
+ except UnicodeDecodeError:
25
+ # not pdf, and also not valid text file
26
+ return None
13
27
 
14
- def get_document_handle(s: str) -> Optional[DocumentHandle]:
15
- bs_doc = get_html_handle(s)
28
+ # bs4 will appear to succeed for md files as well.
29
+ # this will break most markdown files at the moment.
30
+ bs_doc = get_html_handle(contents)
16
31
  if bs_doc is not None:
17
32
  return DocumentHandle(format=ts.DocumentType.DocumentFormat.HTML, bs_doc=bs_doc)
18
- md_ast = get_markdown_handle(s)
33
+
34
+ md_ast = get_markdown_handle(contents)
19
35
  if md_ast is not None:
20
36
  return DocumentHandle(format=ts.DocumentType.DocumentFormat.MD, md_ast=md_ast)
37
+
21
38
  return None
22
39
 
23
- def get_html_handle(s: str) -> Optional['bs4.BeautifulSoup']:
40
+ def get_html_handle(text: str) -> Optional['bs4.BeautifulSoup']:
24
41
  import bs4
25
42
  try:
26
- doc = bs4.BeautifulSoup(s, 'html.parser')
27
- except Exception as e:
43
+ doc = bs4.BeautifulSoup(text, 'html.parser')
44
+ if doc.find() is None:
45
+ return None
46
+ return doc
47
+ except Exception:
28
48
  return None
29
- if doc.find() is None:
30
- return None
31
- return doc
32
49
 
33
- def get_markdown_handle(s: str) -> Optional[Dict]:
50
+ def get_markdown_handle(text: str) -> Optional[Dict]:
34
51
  import mistune
35
52
  try:
36
53
  md_ast = mistune.create_markdown(renderer=None)
37
- return md_ast(s)
38
- except Exception as e:
54
+ return md_ast(text)
55
+ except Exception:
39
56
  return None
57
+
58
+ def get_pdf_handle(path : str) -> Optional['fitz.Document']:
59
+ import fitz # aka pymupdf
60
+ try:
61
+ doc = fitz.open(path)
62
+ # check pdf (bc it will work for images)
63
+ if not doc.is_pdf:
64
+ return None
65
+ # try to read one page
66
+ next(page for page in doc)
67
+ return doc
68
+ except Exception:
69
+ return None
@@ -0,0 +1,70 @@
1
+ import http
2
+ import http.server
3
+ import logging
4
+ import urllib
5
+ import posixpath
6
+ import pathlib
7
+ import os
8
+ import string
9
+
10
+ _logger = logging.getLogger('pixeltable.http.server')
11
+
12
+
13
+ def get_file_uri(http_address: str, file_path: str) -> str:
14
+ """Get the URI for a file path, with the given prefix.
15
+ Used in the client to generate a URI
16
+ """
17
+ abs_path = pathlib.Path(file_path)
18
+ assert abs_path.is_absolute()
19
+ url = urllib.request.pathname2url(str(abs_path))
20
+ return f'{http_address}{url}'
21
+
22
+
23
+ class AbsolutePathHandler(http.server.SimpleHTTPRequestHandler):
24
+ """Serves all absolute paths, not just the current directory"""
25
+ def translate_path(self, path: str) -> str:
26
+ """
27
+ Translate a /-separated PATH to the local filename syntax.
28
+ overrides http.server.SimpleHTTPRequestHandler.translate_path
29
+
30
+ This is only useful for file serving.
31
+
32
+ Code initially taken from there:
33
+ https://github.com/python/cpython/blob/f5406ef454662b98df107775d18ff71ae6849618/Lib/http/server.py#L834
34
+ """
35
+ _logger.info(f'translate path {path=}')
36
+ # abandon query parameters, taken from http.server.SimpleHTTPRequestHandler
37
+ path = path.split('?', 1)[0]
38
+ path = path.split('#', 1)[0]
39
+
40
+ path = pathlib.Path(urllib.request.url2pathname(path))
41
+ return str(path)
42
+
43
+ def log_message(self, format, *args) -> None:
44
+ """override logging to stderr in http.server.BaseHTTPRequestHandler"""
45
+ message = format % args
46
+ _logger.info(message.translate(self._control_char_table))
47
+
48
+
49
+ class LoggingHTTPServer(http.server.ThreadingHTTPServer):
50
+ """Avoids polluting stdout and stderr"""
51
+
52
+ def handle_error(self, request, client_address) -> None:
53
+ """override socketserver.TCPServer.handle_error which prints directly to sys.stderr"""
54
+ import traceback
55
+
56
+ _logger.error(
57
+ f'Exception occurred during processing of {request=} from {client_address=}\
58
+ \nbacktrace:\n{traceback.format_exc()}\n----\n'
59
+ )
60
+
61
+
62
+ def make_server(address: str, port: int) -> http.server.HTTPServer:
63
+ """Create a file server with pixeltable specific config """
64
+ return LoggingHTTPServer((address, port), AbsolutePathHandler)
65
+
66
+
67
+ if __name__ == '__main__':
68
+ httpd = make_server('127.0.0.1', 8000)
69
+ print(f'about to server HTTP on {httpd.server_address}')
70
+ httpd.serve_forever()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pixeltable
3
- Version: 0.2.5
3
+ Version: 0.2.6
4
4
  Summary: Pixeltable: The Multimodal AI Data Plane
5
5
  Author: Marcel Kornacker
6
6
  Author-email: marcelk@gmail.com
@@ -13,19 +13,22 @@ Classifier: Programming Language :: Python :: 3.12
13
13
  Requires-Dist: av (>=10.0.0)
14
14
  Requires-Dist: beautifulsoup4 (>=4.0.0,<5.0.0)
15
15
  Requires-Dist: cloudpickle (>=2.2.1,<3.0.0)
16
+ Requires-Dist: ftfy (>=6.2.0,<7.0.0)
16
17
  Requires-Dist: jinja2 (>=3.1.3,<4.0.0)
17
18
  Requires-Dist: jmespath (>=1.0.1,<2.0.0)
18
- Requires-Dist: numpy (>=1.26)
19
+ Requires-Dist: mistune (>=3.0.2,<4.0.0)
20
+ Requires-Dist: numpy (>=1.25)
19
21
  Requires-Dist: opencv-python-headless (>=4.7.0.68,<5.0.0.0)
20
22
  Requires-Dist: pandas (>=2.0,<3.0)
21
23
  Requires-Dist: pgserver (==0.1.2)
22
24
  Requires-Dist: pgvector (>=0.2.1,<0.3.0)
23
- Requires-Dist: pillow (>=10.0)
25
+ Requires-Dist: pillow (>=9.3.0)
24
26
  Requires-Dist: psutil (>=5.9.5,<6.0.0)
25
27
  Requires-Dist: psycopg2-binary (>=2.9.5,<3.0.0)
28
+ Requires-Dist: pymupdf (>=1.24.1,<2.0.0)
26
29
  Requires-Dist: pyyaml (>=6.0.1,<7.0.0)
27
- Requires-Dist: regex (>=2022.10.31,<2023.0.0)
28
30
  Requires-Dist: requests (>=2.31.0,<3.0.0)
31
+ Requires-Dist: setuptools (==69.1.1)
29
32
  Requires-Dist: sqlalchemy-utils (>=0.41.1,<0.42.0)
30
33
  Requires-Dist: sqlalchemy[mypy] (>=2.0.23,<3.0.0)
31
34
  Requires-Dist: tenacity (>=8.2,<9.0)
@@ -33,13 +36,13 @@ Requires-Dist: tqdm (>=4.64.1,<5.0.0)
33
36
  Description-Content-Type: text/markdown
34
37
 
35
38
  <div align="center">
36
- <img src="docs/pixeltable-banner.png" width="45%"/>
39
+ <img src="https://raw.githubusercontent.com/pixeltable/pixeltable/master/docs/pixeltable-banner.png" alt="Pixeltable" width="45%" />
37
40
 
38
41
  # Unifying Data, Models, and Orchestration for AI Products
39
42
 
40
43
  [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
41
44
  &nbsp;&nbsp;
42
- ![pytest status](https://github.com/pixeltable/pixeltable/actions/workflows/pytest.yml/badge.svg)
45
+ [![pytest status](https://github.com/pixeltable/pixeltable/actions/workflows/pytest.yml/badge.svg)](https://github.com/pixeltable/pixeltable/actions)
43
46
 
44
47
  [Installation](https://pixeltable.github.io/pixeltable/getting-started/) | [Documentation](https://pixeltable.github.io/pixeltable/)
45
48
  </div>
@@ -75,7 +78,7 @@ To verify that it's working:
75
78
 
76
79
  ```
77
80
  import pixeltable as pxt
78
- cl = pxt.Client()
81
+ pxt.init()
79
82
  ```
80
83
 
81
84
  For more detailed installation instructions, see the
@@ -0,0 +1,119 @@
1
+ pixeltable/__init__.py,sha256=TGVKvEpabDRHNqsTYxdDgwU9rsDC9qLDL3D_tjyWemw,1040
2
+ pixeltable/__version__.py,sha256=k6bIPFFhfyfrj1i4diDW-baOOlmqe9QpqWcDh7d1ErM,112
3
+ pixeltable/catalog/__init__.py,sha256=E41bxaPeQIcgRYzTWc2vkDOboQhRymrJf4IcHQO7o_8,453
4
+ pixeltable/catalog/catalog.py,sha256=0TYWB1R6YBp9qCkWF7kCcX2Yw70UuburKKIemv5L1Js,7908
5
+ pixeltable/catalog/column.py,sha256=2qZ3Wxvi-kwiLseeZtXFiXWrHHzzktUa_2skPSP1FGs,8088
6
+ pixeltable/catalog/dir.py,sha256=pG1nMpG123POo6WMSHhAmnwXOQ26uUJfUcbzL-Jb4ws,919
7
+ pixeltable/catalog/globals.py,sha256=yLEGNbsSnLzjWNHVJacfjA9hbw13Q6QXLOSCRmdTlq0,943
8
+ pixeltable/catalog/insertable_table.py,sha256=1yGwuoMNbtBJQRDweEoH7hgxAI4uOB1k2VGpBAmsJxQ,8168
9
+ pixeltable/catalog/named_function.py,sha256=a96gnKtx-nz5_MzDIiD4t4Hxqdjkg9ZtijRQxvWA5WQ,1147
10
+ pixeltable/catalog/path.py,sha256=QgccEi_QOfaKt8YsR2zLtd_z7z7QQkU_1kprJFi2SPQ,1677
11
+ pixeltable/catalog/path_dict.py,sha256=xfvxg1Ze5jZCARUGASF2DRbQPh7pRVTYhuJ_u82gYUo,5941
12
+ pixeltable/catalog/schema_object.py,sha256=-UxmPLbuEBqJiJi_GGRbFdr7arAFxTqs4bt6TFmSt3M,1059
13
+ pixeltable/catalog/table.py,sha256=LgTWRrZcqx85bkW1kW9wWyDvFp15m8e5PfBYkY6E8JE,31252
14
+ pixeltable/catalog/table_version.py,sha256=7_sRbeado0Xu6hbsIAwiz3D35s-RdD5KI6csxhg5DMg,48865
15
+ pixeltable/catalog/table_version_path.py,sha256=2Ofzd0n36flcNm86KWwIWDBAfgnV5Z-FxAHdMSPgMLc,5482
16
+ pixeltable/catalog/view.py,sha256=BIL3s4DV3tWbOcqtqnhn46B2UvLaBhppfJUlNEt5nec,9734
17
+ pixeltable/dataframe.py,sha256=lzSzR7mi9C4BO39fNXYo64k3KxILyG_Z7eET6DXTgKY,31922
18
+ pixeltable/env.py,sha256=8OjBv3Jvd-74KepYYyIpLmhl2S85g-S14qDIywcbRpo,17971
19
+ pixeltable/exceptions.py,sha256=MSP9zeL0AmXT93XqjdvgGN4rzno1_KRrGriq6hpemnw,376
20
+ pixeltable/exec/__init__.py,sha256=RK7SKvrQ7Ky3G_LXDP4Bf7lHmMM_uYZl8dJaZYs0FjY,454
21
+ pixeltable/exec/aggregation_node.py,sha256=cf6rVAgrGh_uaMrCIgXJIwQTmbcboJlnrH_MmPIQSd0,3321
22
+ pixeltable/exec/cache_prefetch_node.py,sha256=d5pEuR6AtJQkEVy9X3XeYFI_q0szMtoNAH96vYdtBE0,5241
23
+ pixeltable/exec/component_iteration_node.py,sha256=Uz6zEeaJMcbvF3S0W0qmLI_uWsZsaSspHKNzuAMrasg,4069
24
+ pixeltable/exec/data_row_batch.py,sha256=1IDYHBkSQ60dwOnAGnS-Wpp3AsnbMqKcY40zUT7ku-Q,3392
25
+ pixeltable/exec/exec_context.py,sha256=E82Q2bJMJ1ulud5L5D9dh2Z8vEUQ659SgT614YKDO34,924
26
+ pixeltable/exec/exec_node.py,sha256=Hji5NCPHfa50IWyjladXrBm4I0zseV7AV4cVdx0Q8Ew,2170
27
+ pixeltable/exec/expr_eval_node.py,sha256=fEzbeZ0J-kylRQ2M0nSlUeLFRTHlwNzlvBo1yqWQ2rg,10856
28
+ pixeltable/exec/in_memory_data_node.py,sha256=SNM2AbMQSjmGDWMNJUf_5MmlXWE3P80lsuUjNfzQckA,3171
29
+ pixeltable/exec/media_validation_node.py,sha256=OKfRyKpcn7AZdACy_HD4NsDC87ZfNFs1tdrQz2NiIVw,1514
30
+ pixeltable/exec/sql_scan_node.py,sha256=s2PVls7gfSL0zQsdDWz8dC7MAE6KWeV_EDBCilx8Ros,10250
31
+ pixeltable/exprs/__init__.py,sha256=7dwrdk-NpF66OT-m5yNtFEhq-o1T476dnXHjluw2K1s,951
32
+ pixeltable/exprs/arithmetic_expr.py,sha256=sWBYCBKI6IHj9ASwDcm2BlkQ5gleVtKtmpiPvzFNBJM,4386
33
+ pixeltable/exprs/array_slice.py,sha256=VmWc6iFusrM85MjyEBBCfXG1Jnt8-Gr6-J88BXxNoOE,2131
34
+ pixeltable/exprs/column_property_ref.py,sha256=0PHiBys0fxe2LgjaMId5UHob4E-ZggyPLnnW41RgA0E,2706
35
+ pixeltable/exprs/column_ref.py,sha256=t_iJzai-x1Ds2ca3u5Qh3lzBqidP23e80Y7KcO_BDkA,5333
36
+ pixeltable/exprs/comparison.py,sha256=rAlGUF0AuzkYGspewJPu-6aaQZa4dVMJYGbMwqKyBIc,2964
37
+ pixeltable/exprs/compound_predicate.py,sha256=Gh22MKi625m5A_RunVRd-a1XFi-fitikqBVz2VNXKrs,3830
38
+ pixeltable/exprs/data_row.py,sha256=2kGnZhDna4bkgzb2y9iDnkLFe8lXSk59QAf9zW2Z-Y0,8278
39
+ pixeltable/exprs/expr.py,sha256=VYo7CqZJLb9Rsna4FbMBy6_KAZdbUy1oh6AmORpSUGw,24190
40
+ pixeltable/exprs/expr_set.py,sha256=Q64Q2yI0CTq2Ma_E-BUYlMotSstVuMm4OFZnBCedHRk,1222
41
+ pixeltable/exprs/function_call.py,sha256=JO0QwolyI60aG3t0zCqAxsaRWacvw6V6adNtY5WbyTo,17207
42
+ pixeltable/exprs/globals.py,sha256=liPgUTccTkyDRs4kG2r9ehRkwGZERmrCSJDZRdJoMqk,1537
43
+ pixeltable/exprs/image_member_access.py,sha256=KSYdTIaLh53dNRjv3SJFchPMPo7o5diJSQkV1NsyB4Y,3547
44
+ pixeltable/exprs/in_predicate.py,sha256=burxrBCH1MXqU-wrNWJvD0PRGzJdWy85intOSftQK54,3696
45
+ pixeltable/exprs/inline_array.py,sha256=293WuUEhYXrcp8-AnPDVIWQBPQMrPviB88A619Ls_Es,4499
46
+ pixeltable/exprs/inline_dict.py,sha256=TWYokJ14Nq-evODcYFVO471WSEDbz6cJqIdRb2PkbZQ,3885
47
+ pixeltable/exprs/is_null.py,sha256=nvpOXtQj1UeYJpkCWzbaGuQElzrA2HSG3XNQugOv-pw,1041
48
+ pixeltable/exprs/json_mapper.py,sha256=I60VNgus64ai80gnFCIsRn0VRWYXMkqH5VNvnATsN9s,4559
49
+ pixeltable/exprs/json_path.py,sha256=Wz_5zFsyc9TPhsSbsDjDmQ3Nb0uVIwMCx5nh-cQYBiE,6526
50
+ pixeltable/exprs/literal.py,sha256=5NNza-WL1dd3hNznwwkr_yAcTGXSIRYUszGfy30lruI,2396
51
+ pixeltable/exprs/object_ref.py,sha256=eTcx84aWRI59fIiGvbdv3_cfL0XW4xEFQ4lwpLpJkM8,1250
52
+ pixeltable/exprs/predicate.py,sha256=OSDgjfSqiK7J_5GZMUXMvjfyomKEGi0JNxeB073SGXw,1859
53
+ pixeltable/exprs/row_builder.py,sha256=cpQa7GHR2dZYxhCAwZBfz-MqO0oP-NS44mAYoVUOt7A,15662
54
+ pixeltable/exprs/rowid_ref.py,sha256=74w4rEy21YysTVbyKNc3op-pYFqDAx8VJdtl7ZPpxHs,4268
55
+ pixeltable/exprs/similarity_expr.py,sha256=LERVkFU8BwIi_S9IhAKXdFJSizJ2wI_0uN4_1AMZb1c,2664
56
+ pixeltable/exprs/type_cast.py,sha256=JMg8p1qYoFfiAXfJPSbTEnfrK7lRO_JMaqlPHOrhNQU,1793
57
+ pixeltable/exprs/variable.py,sha256=Kg_O4ytcHYZFijIyMHYBJn063cTKU1-YE583FAz8Qaw,1361
58
+ pixeltable/ext/__init__.py,sha256=0uugfuME1FybVo-MdxaVNGagRjhcvNTnv5MZUem6Cyo,269
59
+ pixeltable/ext/functions/yolox.py,sha256=LwrOtXMT57AP6-IkmRZ_12yN5-EiFRpTuh4Sexm8x24,3131
60
+ pixeltable/func/__init__.py,sha256=LCB5iB2aZyMrX-hn_oNBYnB1SE60t50hE23av_v2F50,348
61
+ pixeltable/func/aggregate_function.py,sha256=nEZ3WuVx3oabVK8yvqq6NNneI9USOkB8bL7etwQCUh4,9356
62
+ pixeltable/func/callable_function.py,sha256=nEEmXFvd8TW9TBPbDnC3q8phj9ARokAsB-OJ1_hTkGo,4612
63
+ pixeltable/func/expr_template_function.py,sha256=r0ML3IVGDgGM-7KtutnwnHBCmcDMfpblrJugh26A7Uc,4266
64
+ pixeltable/func/function.py,sha256=fANPfafLwY0Mq6CF21VYbuF-hRxxsPLHn5waoj1mOGY,5611
65
+ pixeltable/func/function_registry.py,sha256=1ibSQxEPm3Zd3r497vSlckQiDG9sfCnyJx3zcSm9t7c,11456
66
+ pixeltable/func/globals.py,sha256=sEwn6lGgHMp6VQORb_P5qRd_-Q2_bUSqvqM9-XPN_ec,1483
67
+ pixeltable/func/nos_function.py,sha256=HzIKK4XjTo1E6pML-EbhuX3u_LYibFWUuTkIxoIih7c,9650
68
+ pixeltable/func/signature.py,sha256=erOPFuSuaxkXnRyFd3nCYLuprUWcYFox3Hk3ZKUPWfM,6697
69
+ pixeltable/func/udf.py,sha256=92v3ArcZShR5D5xVWm5XB8HumCrPgc7frUrbu1yEPyo,6484
70
+ pixeltable/functions/__init__.py,sha256=uO-XB4QUbx3Jjs9GoaTXoJY2jn0AuXTL32YLkL_3_CI,3297
71
+ pixeltable/functions/eval.py,sha256=_2FANDJqwtIDzTxtcKc0Yacf7b4LTAjyy2fPDw1FG_s,8404
72
+ pixeltable/functions/fireworks.py,sha256=e_rCITg18yNndNI8TJPXRSN6DR0hYWT-_dUavoPuyfc,908
73
+ pixeltable/functions/huggingface.py,sha256=-a679an4nQyHChgQvvsfIoYGMQ_AfDmKpg2Ifc4FuV8,6458
74
+ pixeltable/functions/image.py,sha256=xR_S_0BuX6Ycc5E366GpOfP0JptD7beQwHE_fLl8ZVM,431
75
+ pixeltable/functions/openai.py,sha256=yvlxRd-9ViC4osJH0YWu18CuX83__NPPUVazXM3kJ8o,7972
76
+ pixeltable/functions/pil/image.py,sha256=6eNdMy2lZliFb8Lw12aBRUaShH07VEsFmhHSG21Jjt4,5992
77
+ pixeltable/functions/string.py,sha256=RYOgZwifjC943YloEMi3PdflnjFqOYB2FddrUvzgtXs,516
78
+ pixeltable/functions/together.py,sha256=HeiLQm0GCSgv5Jvdmw_Bqd7vKRBx-r6UazdseoEKMVg,4173
79
+ pixeltable/functions/util.py,sha256=djVqro_W5M_jUgYWzZZaXXH3lWaAWj6q-hrpzFl_Ko8,1860
80
+ pixeltable/functions/video.py,sha256=WZF4G3tV-_LfRQHUinXe_rnu1-4N68Ht60JCR_s7Bew,2403
81
+ pixeltable/globals.py,sha256=HWuz_erzAlBLkAYRqTJKphonSDLdNBTm1ZvVcxeFtwU,13606
82
+ pixeltable/index/__init__.py,sha256=tlJENOzEq6p_8xu-nX1mN4Zt9asw4481Znl5ZXYIKwc,72
83
+ pixeltable/index/base.py,sha256=MM8jLlr68e9M_R27EVsNxC7W7OVay27TOrnxrOlXz2s,1431
84
+ pixeltable/index/embedding_index.py,sha256=jxCTmW-KSNDNbFHbkQHYPI-CKTA_b6rTETH2t_qEFvM,7565
85
+ pixeltable/io/__init__.py,sha256=ejAAeWC8gIvNVxsOj7yNl4-3NHileGm-FKar9xvCy48,148
86
+ pixeltable/io/hf_datasets.py,sha256=h5M1NkXOvEU8kaeT3AON1A18Vmhnc1lVo5a3TZ5AAic,8004
87
+ pixeltable/io/pandas.py,sha256=cDHUDW2CGiBbsEJB9zE5vkXopTKxDdI-CZxNcp0OnIk,6478
88
+ pixeltable/io/parquet.py,sha256=Z1b92gsPeCBf4P9_jgWWHAEHtu51nhuC8nSJgoKiywQ,8150
89
+ pixeltable/iterators/__init__.py,sha256=kokLguXBY_nxBTqUiXZVvCxTv-vGsX4cK8tgIbsW5G8,108
90
+ pixeltable/iterators/base.py,sha256=4vss-RUq_L7ZQx9o99jZvRtFqPjtVXdwsuPtZ4JW_4s,1676
91
+ pixeltable/iterators/document.py,sha256=KmnrBJ7W39Xknj_pna7H--HbNztPmYFAleGhk9qsegY,19318
92
+ pixeltable/iterators/video.py,sha256=K39ZAIMVvqzGkE30gF2CAbIOOgoJnlBpmIPl4AnWbmY,3474
93
+ pixeltable/metadata/__init__.py,sha256=rBX4sIEfUlv11hDqgAOUl067l--zEeu-HQuGCTRZrfM,2227
94
+ pixeltable/metadata/converters/convert_10.py,sha256=0mSGCn7vqtef63riPi9msUaaUvsSQIj-NFj9QFDYPdA,733
95
+ pixeltable/metadata/converters/convert_12.py,sha256=g9rHTcKlDQZbM3_k4eBv0FBdWmQXHWCnMwx1_l6KpMI,107
96
+ pixeltable/metadata/converters/convert_13.py,sha256=FEgOH5PKf05xVoCaioDDDHOSuoWPyBzodojmsSMMZ5U,1366
97
+ pixeltable/metadata/schema.py,sha256=uuk3rzCpYr99PzEO1pIXe8nMaOoTJtwRfhnqgQ_MdDs,8335
98
+ pixeltable/plan.py,sha256=isb2-ECB3TwvHxZIR9lEKZ0wRKTCvRFp9NQDYhULxdI,32342
99
+ pixeltable/store.py,sha256=Mau3tRfXn6z1J3rzvtU3R4_-UjD-TMTv1FK8OjPMqp0,19394
100
+ pixeltable/tool/create_test_db_dump.py,sha256=yI62rFk7StF1cI8BKN1_hf6mkB6e4ndJH95gXeJOQFA,6847
101
+ pixeltable/tool/create_test_video.py,sha256=OLfccymYReIpzE8osZn4rQvLXxxiPC_l0vc06U74hVM,2899
102
+ pixeltable/type_system.py,sha256=DdI6g-ouqny8PdokEClxKwEwqjbWFDAxNrhYGh7pQLo,29224
103
+ pixeltable/utils/__init__.py,sha256=UYlrf6TIWJT0g-Hac0b34-dEk478B5Qx8dGco34YlIk,439
104
+ pixeltable/utils/arrow.py,sha256=83_7aG5UR2qtTktw_otLkQs-RQbLk0VVM0JLJkbweNU,3692
105
+ pixeltable/utils/clip.py,sha256=HXXWFBJXW9XysdMk9_3hP1V1S-3B8Hwd5rNMbJFjjnI,720
106
+ pixeltable/utils/coco.py,sha256=mk1cxjKYQC0ABm2ZQ9SNu9MvBPECmmKvnASpxnFXdL0,5604
107
+ pixeltable/utils/documents.py,sha256=Q7e5U2Hk0go83MdKzD_MIiMscwbcFsLMgRw2IU_vQF4,2213
108
+ pixeltable/utils/filecache.py,sha256=UoNONG2VaAc2IBB0e3sQdsvyOPOes2XSDc5_CsA4qek,7839
109
+ pixeltable/utils/help.py,sha256=cCnxJ4VP9MJ57iDqExmnDcM-JG3a1lw_q7g-D7bpSVI,252
110
+ pixeltable/utils/http_server.py,sha256=WQ5ILMzlz4TlwI9j5YqAPgEZyhrN1GytMNDbLD9occk,2422
111
+ pixeltable/utils/media_store.py,sha256=x71wnJDZDHcdd13VCfL4AkHQ6IJB41gNA-zBvXJwFos,3116
112
+ pixeltable/utils/pytorch.py,sha256=BR4tgfUWw-2rwWTOgzXj5qdMBpe1Arpp5SK4ax6jjpk,3483
113
+ pixeltable/utils/s3.py,sha256=rkanuhk9DWvSfmbOLQW1j1Iov4sl2KhxGGKN-AJ8LSE,432
114
+ pixeltable/utils/sql.py,sha256=5n5_OmXAGtqFdL6z5XvgnU-vlx6Ba6f1WJrO1ZwUle8,765
115
+ pixeltable/utils/transactional_directory.py,sha256=UGzCrGtLR3hEEf8sYGuWBzLVFAEQml3vdIavigWeTBM,1349
116
+ pixeltable-0.2.6.dist-info/LICENSE,sha256=0UNMmwuqWPC0xDY1NWMm4uNJ2_MyA1pnTNRgQTvuBiQ,746
117
+ pixeltable-0.2.6.dist-info/METADATA,sha256=BccXbmH76wNKX3D9Un4AZ28-E-blrldlrOamu2XdLpg,6317
118
+ pixeltable-0.2.6.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
119
+ pixeltable-0.2.6.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 1.8.1
2
+ Generator: poetry-core 1.9.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any