singlestoredb 1.10.0__py3-none-any.whl → 1.12.0__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 singlestoredb might be problematic. Click here for more details.

@@ -0,0 +1,267 @@
1
+ #!/usr/bin/env python
2
+ """Utilities for running SingleStoreDB in the free tier."""
3
+ from __future__ import annotations
4
+
5
+ import atexit
6
+ import os
7
+ import platform
8
+ import signal
9
+ import subprocess
10
+ import urllib.parse
11
+ from types import TracebackType
12
+ from typing import Any
13
+ from typing import Dict
14
+ from typing import List
15
+ from typing import Optional
16
+ from typing import Type
17
+
18
+ import requests
19
+
20
+ from .. import connect
21
+ from ..connection import Connection
22
+
23
+ try:
24
+ import pymongo
25
+ has_pymongo = True
26
+ except ImportError:
27
+ has_pymongo = False
28
+
29
+
30
+ class SingleStoreDB:
31
+ """
32
+ Manager for SingleStoreDB server running in Docker.
33
+
34
+ Parameters
35
+ -----------
36
+ global_vars : dict, optional
37
+ Global variables to set in the SingleStoreDB server.
38
+ init_sql : str, optional
39
+ Path to an SQL file to run on startup.
40
+
41
+ """
42
+
43
+ user: str
44
+ password: str
45
+ kai_enabled: bool
46
+ server_port: int
47
+ data_api_port: int
48
+ kai_port: Optional[int]
49
+
50
+ def __init__(self) -> None:
51
+ r = requests.get('https://shell.singlestore.com/api/session')
52
+
53
+ self._cookies = r.cookies.get_dict()
54
+
55
+ if 'userSessionID' in self._cookies:
56
+ self._session_id = self._cookies['userSessionID']
57
+ else:
58
+ self._session_id = ''
59
+
60
+ d = r.json()
61
+
62
+ self._connected = True
63
+ self.kai_enabled = True
64
+ self.kai_port = 27017
65
+ self.server_port = 3333
66
+ self.data_api_port = 443
67
+ self.user = d['user']
68
+ self.password = d['password']
69
+ self._database = d['databaseName']
70
+ self._endpoint = d['endpoint']
71
+ self._workspace_id = d['workspaceID']
72
+
73
+ self._saved_server_urls: Dict[str, Optional[str]] = {}
74
+
75
+ # Make sure container gets cleaned up at exit
76
+ atexit.register(self.stop)
77
+ signal.signal(signal.SIGINT, self.stop)
78
+ signal.signal(signal.SIGTERM, self.stop)
79
+
80
+ self._set_server_urls()
81
+
82
+ def __str__(self) -> str:
83
+ return f"SingleStoreDB('{self.connection_url}')"
84
+
85
+ def __repr__(self) -> str:
86
+ return str(self)
87
+
88
+ def _set_server_urls(self) -> None:
89
+ self._saved_server_urls['DATABASE_URL'] = os.environ.get('DATABASE_URL')
90
+ os.environ['DATABASE_URL'] = self.connection_url
91
+ self._saved_server_urls['SINGLESTOREDB_URL'] = os.environ.get('SINGLESTOREDB_URL')
92
+ os.environ['SINGLESTOREDB_URL'] = self.connection_url
93
+
94
+ def _restore_server_urls(self) -> None:
95
+ try:
96
+ for k, v in self._saved_server_urls.items():
97
+ if v is None:
98
+ del os.environ[k]
99
+ else:
100
+ os.environ[k] = v
101
+ except KeyError:
102
+ pass
103
+
104
+ def logs(self) -> List[str]:
105
+ return []
106
+
107
+ @property
108
+ def connection_url(self) -> str:
109
+ """Connection URL for the SingleStoreDB server."""
110
+ dbname = f'/{self._database}' if self._database else ''
111
+ password = urllib.parse.quote_plus(self.password)
112
+ return f'singlestoredb://{self.user}:{password}@' + \
113
+ f'{self._endpoint}:{self.server_port}{dbname}'
114
+
115
+ @property
116
+ def http_connection_url(self) -> str:
117
+ """HTTP Connection URL for the SingleStoreDB server."""
118
+ dbname = f'/{self._database}' if self._database else ''
119
+ password = urllib.parse.quote_plus(self.password)
120
+ return f'singlestoredb+https://{self.user}:{password}@' + \
121
+ f'{self._endpoint}:{self.data_api_port}{dbname}'
122
+
123
+ def connect(
124
+ self,
125
+ use_data_api: bool = False,
126
+ **kwargs: Any,
127
+ ) -> Connection:
128
+ """
129
+ Connect to the SingleStoreDB server.
130
+
131
+ Parameters
132
+ -----------
133
+ use_data_api : bool, optional
134
+ Use the Data API for the connection.
135
+ **kwargs : Any, optional
136
+ Additional keyword arguments to pass to the connection.
137
+
138
+ Returns
139
+ --------
140
+ Connection : Connection to the SingleStoreDB server.
141
+
142
+ """
143
+ if use_data_api:
144
+ return connect(self.http_connection_url, **kwargs)
145
+ return connect(self.connection_url, **kwargs)
146
+
147
+ @property
148
+ def kai_url(self) -> Optional[str]:
149
+ """Connection URL for the Kai (MongoDB) server."""
150
+ if not self.kai_enabled:
151
+ return None
152
+ password = urllib.parse.quote_plus(self.password)
153
+ endpoint = self._endpoint.replace('shared-dml', 'shared-mongo')
154
+ return f'mongodb://{self.user}^{self._database}:{password}@' + \
155
+ f'{endpoint}:{self.kai_port}/' + \
156
+ '?authMechanism=PLAIN&tls=true&loadBalanced=true' + \
157
+ f'&dbName={self._database}'
158
+
159
+ def connect_kai(self) -> 'pymongo.MongoClient':
160
+ """Connect to the Kai (MongoDB) server."""
161
+ if not self.kai_enabled:
162
+ raise RuntimeError('kai is not enabled')
163
+ if not has_pymongo:
164
+ raise RuntimeError('pymongo is not installed')
165
+ return pymongo.MongoClient(self.kai_url)
166
+
167
+ def open_shell(self) -> None:
168
+ """Open a shell in the SingleStoreDB server."""
169
+ if platform.platform().lower().startswith('macos'):
170
+ subprocess.call(
171
+ ' '.join([
172
+ 'osascript', '-e',
173
+ 'tell app "Terminal" to do script "' +
174
+ ' '.join([
175
+ 'mysql', '-h', self._endpoint,
176
+ '-P', str(self.server_port),
177
+ '-u', self.user,
178
+ f'--password=\'{self.password}\'',
179
+ self._database,
180
+ ]) +
181
+ '"',
182
+ ]), shell=True,
183
+ )
184
+ elif platform.platform().lower().startswith('linux'):
185
+ subprocess.call(
186
+ ' '.join([
187
+ 'gnome-terminal', '--',
188
+ 'mysql', '-h', self._endpoint,
189
+ '-P', str(self.server_port),
190
+ '-u', self.user,
191
+ f'--password="{self.password}"',
192
+ self._database,
193
+ ]), shell=True,
194
+ )
195
+ elif platform.platform().lower().startswith('windows'):
196
+ subprocess.call(
197
+ ' '.join([
198
+ 'start', 'cmd', '/k'
199
+ 'mysql', '-h', self._endpoint,
200
+ '-P', str(self.server_port),
201
+ '-u', self.user,
202
+ f'--password="{self.password}"',
203
+ self._database,
204
+ ]), shell=True,
205
+ )
206
+ else:
207
+ raise RuntimeError('unsupported platform')
208
+
209
+ def open_mongosh(self) -> None:
210
+ """Open a mongosh in the SingleStoreDB server."""
211
+ if not self.kai_enabled:
212
+ raise RuntimeError('kai interface is not enabled')
213
+ if platform.platform().lower().startswith('macos'):
214
+ subprocess.call([
215
+ 'osascript', '-e',
216
+ 'tell app "Terminal" to do script "' +
217
+ ' '.join(['mongosh', str(self.kai_url)]) +
218
+ '"',
219
+ ])
220
+ elif platform.platform().lower().startswith('linux'):
221
+ subprocess.call([
222
+ 'gnome-terminal', '--',
223
+ 'mongosh', str(self.kai_url),
224
+ ])
225
+ elif platform.platform().lower().startswith('windows'):
226
+ subprocess.call([
227
+ 'start', 'cmd', '/k'
228
+ 'mongosh', str(self.kai_url),
229
+ ])
230
+ else:
231
+ raise RuntimeError('unsupported platform')
232
+
233
+ def __enter__(self) -> SingleStoreDB:
234
+ return self
235
+
236
+ def __exit__(
237
+ self,
238
+ exc_type: Optional[Type[BaseException]],
239
+ exc_val: Optional[BaseException],
240
+ exc_tb: Optional[TracebackType],
241
+ ) -> Optional[bool]:
242
+ self.stop()
243
+ return None
244
+
245
+ def stop(self, *args: Any) -> None:
246
+ """Stop the SingleStoreDB server."""
247
+ if self._connected is not None:
248
+ self._restore_server_urls()
249
+ try:
250
+ requests.get(
251
+ 'https://shell.singlestore.com/api/terminate',
252
+ cookies=self._cookies,
253
+ )
254
+ finally:
255
+ self._connected = False
256
+
257
+
258
+ def start() -> SingleStoreDB:
259
+ """
260
+ Manager for SingleStoreDB server running in Docker.
261
+
262
+ Returns
263
+ -------
264
+ SingleStoreDB
265
+
266
+ """
267
+ return SingleStoreDB()
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env python
2
2
  # type: ignore
3
3
  """SingleStoreDB UDF testing."""
4
+ import dataclasses
4
5
  import datetime
5
6
  import re
6
7
  import unittest
@@ -11,9 +12,11 @@ from typing import TypeVar
11
12
  from typing import Union
12
13
 
13
14
  import numpy as np
15
+ import pydantic
14
16
 
15
17
  from ..functions import dtypes as dt
16
18
  from ..functions import signature as sig
19
+ from ..functions import tvf
17
20
  from ..functions import udf
18
21
 
19
22
 
@@ -28,7 +31,7 @@ def to_sql(x):
28
31
  out = sig.signature_to_sql(sig.get_signature(x))
29
32
  out = re.sub(r'^CREATE EXTERNAL FUNCTION ', r'', out)
30
33
  out = re.sub(r' AS REMOTE SERVICE.+$', r'', out)
31
- return out
34
+ return out.strip()
32
35
 
33
36
 
34
37
  class TestUDF(unittest.TestCase):
@@ -99,27 +102,27 @@ class TestUDF(unittest.TestCase):
99
102
 
100
103
  # Tuple
101
104
  def foo() -> Tuple[int, float, str]: ...
102
- assert to_sql(foo) == '`foo`() RETURNS RECORD(a BIGINT NOT NULL, ' \
103
- 'b DOUBLE NOT NULL, ' \
104
- 'c TEXT NOT NULL) NOT NULL'
105
+ assert to_sql(foo) == '`foo`() RETURNS RECORD(`a` BIGINT NOT NULL, ' \
106
+ '`b` DOUBLE NOT NULL, ' \
107
+ '`c` TEXT NOT NULL) NOT NULL'
105
108
 
106
109
  # Optional tuple
107
110
  def foo() -> Optional[Tuple[int, float, str]]: ...
108
- assert to_sql(foo) == '`foo`() RETURNS RECORD(a BIGINT NOT NULL, ' \
109
- 'b DOUBLE NOT NULL, ' \
110
- 'c TEXT NOT NULL) NULL'
111
+ assert to_sql(foo) == '`foo`() RETURNS RECORD(`a` BIGINT NOT NULL, ' \
112
+ '`b` DOUBLE NOT NULL, ' \
113
+ '`c` TEXT NOT NULL) NULL'
111
114
 
112
115
  # Optional tuple with optional element
113
116
  def foo() -> Optional[Tuple[int, float, Optional[str]]]: ...
114
- assert to_sql(foo) == '`foo`() RETURNS RECORD(a BIGINT NOT NULL, ' \
115
- 'b DOUBLE NOT NULL, ' \
116
- 'c TEXT NULL) NULL'
117
+ assert to_sql(foo) == '`foo`() RETURNS RECORD(`a` BIGINT NOT NULL, ' \
118
+ '`b` DOUBLE NOT NULL, ' \
119
+ '`c` TEXT NULL) NULL'
117
120
 
118
121
  # Optional tuple with optional union element
119
122
  def foo() -> Optional[Tuple[int, Optional[Union[float, int]], str]]: ...
120
- assert to_sql(foo) == '`foo`() RETURNS RECORD(a BIGINT NOT NULL, ' \
121
- 'b DOUBLE NULL, ' \
122
- 'c TEXT NOT NULL) NULL'
123
+ assert to_sql(foo) == '`foo`() RETURNS RECORD(`a` BIGINT NOT NULL, ' \
124
+ '`b` DOUBLE NULL, ' \
125
+ '`c` TEXT NOT NULL) NULL'
123
126
 
124
127
  # Unknown type
125
128
  def foo() -> set: ...
@@ -182,21 +185,21 @@ class TestUDF(unittest.TestCase):
182
185
 
183
186
  # Tuple
184
187
  def foo(x: Tuple[int, float, str]) -> None: ...
185
- assert to_sql(foo) == '`foo`(`x` RECORD(a BIGINT NOT NULL, ' \
186
- 'b DOUBLE NOT NULL, ' \
187
- 'c TEXT NOT NULL) NOT NULL) RETURNS NULL'
188
+ assert to_sql(foo) == '`foo`(`x` RECORD(`a` BIGINT NOT NULL, ' \
189
+ '`b` DOUBLE NOT NULL, ' \
190
+ '`c` TEXT NOT NULL) NOT NULL) RETURNS NULL'
188
191
 
189
192
  # Optional tuple with optional element
190
193
  def foo(x: Optional[Tuple[int, float, Optional[str]]]) -> None: ...
191
- assert to_sql(foo) == '`foo`(`x` RECORD(a BIGINT NOT NULL, ' \
192
- 'b DOUBLE NOT NULL, ' \
193
- 'c TEXT NULL) NULL) RETURNS NULL'
194
+ assert to_sql(foo) == '`foo`(`x` RECORD(`a` BIGINT NOT NULL, ' \
195
+ '`b` DOUBLE NOT NULL, ' \
196
+ '`c` TEXT NULL) NULL) RETURNS NULL'
194
197
 
195
198
  # Optional tuple with optional union element
196
199
  def foo(x: Optional[Tuple[int, Optional[Union[float, int]], str]]) -> None: ...
197
- assert to_sql(foo) == '`foo`(`x` RECORD(a BIGINT NOT NULL, ' \
198
- 'b DOUBLE NULL, ' \
199
- 'c TEXT NOT NULL) NULL) RETURNS NULL'
200
+ assert to_sql(foo) == '`foo`(`x` RECORD(`a` BIGINT NOT NULL, ' \
201
+ '`b` DOUBLE NULL, ' \
202
+ '`c` TEXT NOT NULL) NULL) RETURNS NULL'
200
203
 
201
204
  # Unknown type
202
205
  def foo(x: set) -> None: ...
@@ -391,16 +394,6 @@ class TestUDF(unittest.TestCase):
391
394
  '`y` DOUBLE NOT NULL, ' \
392
395
  '`z` CHAR(30) NULL) RETURNS SMALLINT NOT NULL'
393
396
 
394
- # Override parameter with incorrect type
395
- with self.assertRaises(TypeError):
396
- @udf(args=dict(x=int))
397
- def foo(x: int, y: float, z: str) -> int: ...
398
-
399
- # Override return value with incorrect type
400
- with self.assertRaises(TypeError):
401
- @udf(returns=int)
402
- def foo(x: int, y: float, z: str) -> int: ...
403
-
404
397
  # Change function name
405
398
  @udf(name='hello_world')
406
399
  def foo(x: int) -> int: ...
@@ -412,6 +405,65 @@ class TestUDF(unittest.TestCase):
412
405
  assert to_sql(foo) == '`hello``_``world`(`x` BIGINT NOT NULL) ' \
413
406
  'RETURNS BIGINT NOT NULL'
414
407
 
408
+ @dataclasses.dataclass
409
+ class MyData:
410
+ one: Optional[int]
411
+ two: str
412
+ three: float
413
+
414
+ @udf
415
+ def foo(x: int) -> MyData: ...
416
+ assert to_sql(foo) == '`foo`(`x` BIGINT NOT NULL) ' \
417
+ 'RETURNS RECORD(`one` BIGINT NULL, `two` TEXT NOT NULL, ' \
418
+ '`three` DOUBLE NOT NULL) NOT NULL'
419
+
420
+ @udf(returns=MyData)
421
+ def foo(x: int) -> Tuple[int, int, int]: ...
422
+ assert to_sql(foo) == '`foo`(`x` BIGINT NOT NULL) ' \
423
+ 'RETURNS RECORD(`one` BIGINT NULL, `two` TEXT NOT NULL, ' \
424
+ '`three` DOUBLE NOT NULL) NOT NULL'
425
+
426
+ @tvf
427
+ def foo(x: int) -> MyData: ...
428
+ assert to_sql(foo) == '`foo`(`x` BIGINT NOT NULL) ' \
429
+ 'RETURNS TABLE(`one` BIGINT NULL, `two` TEXT NOT NULL, ' \
430
+ '`three` DOUBLE NOT NULL)'
431
+
432
+ @tvf(returns=MyData)
433
+ def foo(x: int) -> Tuple[int, int, int]: ...
434
+ assert to_sql(foo) == '`foo`(`x` BIGINT NOT NULL) ' \
435
+ 'RETURNS TABLE(`one` BIGINT NULL, `two` TEXT NOT NULL, ' \
436
+ '`three` DOUBLE NOT NULL)'
437
+
438
+ class MyData(pydantic.BaseModel):
439
+ one: Optional[int]
440
+ two: str
441
+ three: float
442
+
443
+ @udf
444
+ def foo(x: int) -> MyData: ...
445
+ assert to_sql(foo) == '`foo`(`x` BIGINT NOT NULL) ' \
446
+ 'RETURNS RECORD(`one` BIGINT NULL, `two` TEXT NOT NULL, ' \
447
+ '`three` DOUBLE NOT NULL) NOT NULL'
448
+
449
+ @udf(returns=MyData)
450
+ def foo(x: int) -> Tuple[int, int, int]: ...
451
+ assert to_sql(foo) == '`foo`(`x` BIGINT NOT NULL) ' \
452
+ 'RETURNS RECORD(`one` BIGINT NULL, `two` TEXT NOT NULL, ' \
453
+ '`three` DOUBLE NOT NULL) NOT NULL'
454
+
455
+ @tvf
456
+ def foo(x: int) -> MyData: ...
457
+ assert to_sql(foo) == '`foo`(`x` BIGINT NOT NULL) ' \
458
+ 'RETURNS TABLE(`one` BIGINT NULL, `two` TEXT NOT NULL, ' \
459
+ '`three` DOUBLE NOT NULL)'
460
+
461
+ @tvf(returns=MyData)
462
+ def foo(x: int) -> Tuple[int, int, int]: ...
463
+ assert to_sql(foo) == '`foo`(`x` BIGINT NOT NULL) ' \
464
+ 'RETURNS TABLE(`one` BIGINT NULL, `two` TEXT NOT NULL, ' \
465
+ '`three` DOUBLE NOT NULL)'
466
+
415
467
  def test_dtypes(self):
416
468
  assert dt.BOOL() == 'BOOL NULL'
417
469
  assert dt.BOOL(nullable=False) == 'BOOL NOT NULL'
@@ -27,6 +27,22 @@ def subscribe(func: Callable[[Dict[str, Any]], None]) -> None:
27
27
  _subscribers.add(func)
28
28
 
29
29
 
30
+ def unsubscribe(func: Callable[[Dict[str, Any]], None]) -> None:
31
+ """
32
+ Unsubscribe from SingleStore portal events.
33
+
34
+ Parameters
35
+ ----------
36
+ func : Callable
37
+ The function to call when an event is received
38
+
39
+ """
40
+ try:
41
+ _subscribers.remove(func)
42
+ except KeyError:
43
+ pass
44
+
45
+
30
46
  def _event_handler(stream: Any, ident: Any, msg: Dict[str, Any]) -> None:
31
47
  """Handle request on the control stream."""
32
48
  if not _subscribers or not isinstance(msg, dict):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: singlestoredb
3
- Version: 1.10.0
3
+ Version: 1.12.0
4
4
  Summary: Interface to the SingleStoreDB database and workspace management APIs
5
5
  Home-page: https://github.com/singlestore-labs/singlestoredb-python
6
6
  Author: SingleStore
@@ -26,6 +26,8 @@ Provides-Extra: dataframe
26
26
  Requires-Dist: ibis-singlestoredb; extra == "dataframe"
27
27
  Provides-Extra: dbt
28
28
  Requires-Dist: dbt-singlestore; extra == "dbt"
29
+ Provides-Extra: docker
30
+ Requires-Dist: docker; extra == "docker"
29
31
  Provides-Extra: ed22519
30
32
  Requires-Dist: PyNaCl>=1.4.0; extra == "ed22519"
31
33
  Provides-Extra: gssapi
@@ -1,8 +1,8 @@
1
- singlestoredb/__init__.py,sha256=BbJxfn3xD6sghrcCqD-i8zh4_bZwrvLSoYVPLvAhTSo,1649
1
+ singlestoredb/__init__.py,sha256=rMEoyZJpkhiOhcoZLCItPxn7d2AppFdBTIwmK7t_Y7E,1649
2
2
  singlestoredb/auth.py,sha256=u8D9tpKzrqa4ssaHjyZnGDX1q8XBpGtuoOkTkSv7B28,7599
3
- singlestoredb/config.py,sha256=ZGmnG37Ug1hT5jdTSdMJBCGDvvz2GwxrZZ_ROVV2wUE,12439
4
- singlestoredb/connection.py,sha256=PlOD-4Qx3Q-lVPPdjru-kTC8kOWDos3eiWVo7pPKeKM,45679
5
- singlestoredb/converters.py,sha256=t1hRMZfccWJs_WyOw-W-Kh87fxsOkpOnKXAeh_Nr-zU,20681
3
+ singlestoredb/config.py,sha256=rlF69SiclYyKghNRckX77Ls1ZT23RhSssO1cyYBiHmA,12589
4
+ singlestoredb/connection.py,sha256=0HEpjBZXLqQwOTEfveMkgej1H3Kyof47prIHvJJZtoo,45831
5
+ singlestoredb/converters.py,sha256=Ui-AqdW3pRAQ8A_YcK9EqVYyM4Pt1_Q-tjlotbpK6Cw,20686
6
6
  singlestoredb/exceptions.py,sha256=HuoA6sMRL5qiCiee-_5ddTGmFbYC9Euk8TYUsh5GvTw,3234
7
7
  singlestoredb/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  singlestoredb/pytest.py,sha256=OyF3BO9mgxenifYhOihnzGk8WzCJ_zN5_mxe8XyFPOc,9074
@@ -18,13 +18,13 @@ singlestoredb/apps/_dashboards.py,sha256=_03fI-GJannamA5lxLvIoC6Mim-H1jTRuI8-dw_
18
18
  singlestoredb/apps/_process.py,sha256=G37fk6bzIxzhfEqp2aJBk3JCij-T2HFtTd078k5Xq9I,944
19
19
  singlestoredb/apps/_stdout_supress.py,sha256=8s9zMIIRPpeu44yluJFc_0VueAxZDmr9QVGT6TGiFeY,659
20
20
  singlestoredb/apps/_uvicorn_util.py,sha256=rEK4nEmq5hbpRgsmK16UVlxe2DyQSq7C5w5WZSp0kX8,962
21
- singlestoredb/functions/__init__.py,sha256=WL1LqgMTdnGOse3tQqmD-HH8TdfCPS89GNO7hO0v_aw,41
22
- singlestoredb/functions/decorator.py,sha256=H12MUeBw8VOppx6esntaR43ukeIffbnAr716CBpYJ4g,5193
21
+ singlestoredb/functions/__init__.py,sha256=nPaLVgtb5XDxbRucDFFwjePPh4n40_6jcbxE8HPebkQ,82
22
+ singlestoredb/functions/decorator.py,sha256=0gfYVCi_GvxKcuDmAcpfIFTTElLD0CBT8RYN_dUrEvU,11485
23
23
  singlestoredb/functions/dtypes.py,sha256=a2vevIug8NhiUCFiSOKwRPpdWU69Gn13ZoQ6Aovskhc,31408
24
- singlestoredb/functions/signature.py,sha256=1CRtE_Dp47ahYoPzB8oCVNS_gmEQz91xDH8FEKqWGL8,18960
24
+ singlestoredb/functions/signature.py,sha256=y3QKjjM9weZjIZyFE-E4SEFx5i3sgP8rqTC0iJ0hhaM,22396
25
25
  singlestoredb/functions/ext/__init__.py,sha256=1oLL20yLB1GL9IbFiZD8OReDqiCpFr-yetIR6x1cNkI,23
26
26
  singlestoredb/functions/ext/arrow.py,sha256=WB7n1ACslyd8nlbFzUvlbxn1BVuEjA9-BGBEqCWlSOo,9061
27
- singlestoredb/functions/ext/asgi.py,sha256=YV4i5RmnSsPvdJPM7_z9X3oR9b1zdZq2ylTSEAM_G54,40017
27
+ singlestoredb/functions/ext/asgi.py,sha256=UMZVrw2G_a5SDNy4X7uVJeidfR5HobJN1qLMLqPBAeM,43535
28
28
  singlestoredb/functions/ext/json.py,sha256=XkI8jirxi1T9F-M0p9NpLezph0MRAhYmDiPuU2Id0Uo,10404
29
29
  singlestoredb/functions/ext/mmap.py,sha256=OB6CIYoLe_AYuJM10lE0I6QhZJ5kMhLNbQo2Sp1wiZA,13711
30
30
  singlestoredb/functions/ext/rowdat_1.py,sha256=JgKRsVSQYczFD6cmo2xLilbNPYpyLL2tPOWO1Gh25ow,22306
@@ -33,24 +33,25 @@ singlestoredb/fusion/__init__.py,sha256=Qo7SuqGw-l-vE8-EI2jhm6hXJkYfOLUKIws9c7LF
33
33
  singlestoredb/fusion/graphql.py,sha256=ZA3HcDq5rER-dCEavwTqnF7KM0D2LCYIY7nLQk7lSso,5207
34
34
  singlestoredb/fusion/handler.py,sha256=HEW83De1zj94hvG7rbqlOszIIgBKiag0UGO5I0WoJ6A,27400
35
35
  singlestoredb/fusion/registry.py,sha256=jjdRTYZ3ylhy6gAoW5xBj0tkxGFBT-2yLQ0tztTgDIY,6112
36
- singlestoredb/fusion/result.py,sha256=Bd3KbRpqWqQcWp_Chd4bzBy8Kfc8nXLS_Pn_GGbPO6o,11772
36
+ singlestoredb/fusion/result.py,sha256=p5I65C-Dhhl1yeZwetXXZabwritr8Ph2mFvJJ3ovcBM,11790
37
37
  singlestoredb/fusion/handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
- singlestoredb/fusion/handlers/export.py,sha256=mnt2ZsmOzd7x8YHVMXtYdbtD0KvOzAngysyTwQz1x8w,6948
39
- singlestoredb/fusion/handlers/files.py,sha256=c-QaWzgLGRMheFvG2uUeYfVgLA5WfSE3e9XeBrsFNh0,18979
38
+ singlestoredb/fusion/handlers/export.py,sha256=3moTJeqsHkDDpitUUAE6x95JYH2rmb28MALbO4x0dcc,8981
39
+ singlestoredb/fusion/handlers/files.py,sha256=McoRacihcQn0-qILujBi0HCNyuFcrBoIUGlkWlg1cII,18991
40
40
  singlestoredb/fusion/handlers/job.py,sha256=r0KdOD55VUDw-SymC__5Mn-fzJTZE_xcBgH-O8DYVHc,21095
41
+ singlestoredb/fusion/handlers/models.py,sha256=xJPIG0_GgF-VrmPoIsU2U4AsS7ytDz8JMRaqchglAR0,6236
41
42
  singlestoredb/fusion/handlers/stage.py,sha256=kYVjbPys83kf3jX6jWwN8Ju0oEocKVZ3TIOt2HiC5Ew,14287
42
- singlestoredb/fusion/handlers/utils.py,sha256=yXggiwnKq7IrCFXQwY-ZNc8gHxvftUUq4NXc8LCP7eM,10046
43
+ singlestoredb/fusion/handlers/utils.py,sha256=mYRfGMFv2mxZVILeb_B0S55SWsb0gaye8RnjAyylbhE,10064
43
44
  singlestoredb/fusion/handlers/workspace.py,sha256=4xN2TFO4yF7KZB2Fcht7IuvoDdAT6fDfDLjixiHZN8w,27506
44
45
  singlestoredb/http/__init__.py,sha256=A_2ZUCCpvRYIA6YDpPy57wL5R1eZ5SfP6I1To5nfJ2s,912
45
- singlestoredb/http/connection.py,sha256=dU0a72pMpyq9l9ADKs5jpB-GAJScBxgd83NOlGreIdc,39473
46
+ singlestoredb/http/connection.py,sha256=gSqlCxHbjR1745LgUugfDAXU47Uoksu3jVicYI-gO1M,39609
46
47
  singlestoredb/magics/__init__.py,sha256=lZjkT3Webo9c1EQAzlRCRh6B2pckQH8uvNrrB__abcI,1210
47
48
  singlestoredb/magics/run_personal.py,sha256=2f7u1T7iblxGzZurHNgNXLrPBvsvPADZKo_RD_IjYuE,1844
48
49
  singlestoredb/magics/run_shared.py,sha256=SI8dCBRMaGn-xZU7dto4jsAqKBi-Ll14htUsMUSBpJM,1752
49
50
  singlestoredb/management/__init__.py,sha256=ofNTPCdkZ1dS_aX2aUujd8aMHQi8Lle5Ced0aaO3RH4,269
50
51
  singlestoredb/management/billing_usage.py,sha256=9ighjIpcopgIyJOktBYQ6pahBZmWGHOPyyCW4gu9FGs,3735
51
52
  singlestoredb/management/cluster.py,sha256=h75grXSxq4Anr4RxwKxcZW4TkWJ4bFg_ql5iRWCNLdQ,14405
52
- singlestoredb/management/export.py,sha256=_kr5grRVFe0RGuk_XoDGYq_4VXMvGCWvkan9dZO-jGA,4156
53
- singlestoredb/management/files.py,sha256=nig1XmTsDMN-0PToG0N80KsNiOoHwJhFwG1GNHNxWvU,28217
53
+ singlestoredb/management/export.py,sha256=jJCe25ecH_LzKSDc7vS1-5DQaWFrZipeawLPpArByJE,5108
54
+ singlestoredb/management/files.py,sha256=0sp3UDDHbiY5lP0QYkNgVcZ2v9zz3Kba3CeLU_xtE4Y,30575
54
55
  singlestoredb/management/job.py,sha256=4-xLWzbE8odQogVVaFer80UEoTAZY1T28VZ9Ug4rbmM,24611
55
56
  singlestoredb/management/manager.py,sha256=X29VEHlUEzmWvGo_bQMzo8a6d4nYMLE1CewlNBjrD7M,8851
56
57
  singlestoredb/management/organization.py,sha256=hqMaM7H-naMjNbxDl_f7G_2o5TkiGKyzPhxuzDveJAw,5402
@@ -60,7 +61,7 @@ singlestoredb/management/workspace.py,sha256=fNUiz3XNTGgXdOACsQz56Gox2qt9lOVGAtH
60
61
  singlestoredb/mysql/__init__.py,sha256=olUTAvkiERhDW41JXQMawkg-i0tvBEkoTkII1tt6lxU,4492
61
62
  singlestoredb/mysql/_auth.py,sha256=AugRitoUwgRIDFuJxuAH4MWIAmckY7Ji2pP6r_Ng9dY,8043
62
63
  singlestoredb/mysql/charset.py,sha256=-FlONDS_oAUF5B3mIgeHBPb_SCt4zHD33arUeBNctU0,10510
63
- singlestoredb/mysql/connection.py,sha256=MfPjQfAadI8xtn4xbaock34bCCJ2P1uaTqAw8o1PqS8,72696
64
+ singlestoredb/mysql/connection.py,sha256=TN-_c8JSFSEnpsHNtQ_3DQyOshp-BTx2PlF8g_hDeGQ,73087
64
65
  singlestoredb/mysql/converters.py,sha256=CVe8SDmjbIAhy1xpQ2N5OKWw6t5eWpw-EU3QTlA0Hh0,7500
65
66
  singlestoredb/mysql/cursors.py,sha256=Eqe7jITRvOo4P_TxIarTumg_2PG1DcCfZ4Uo9IFdDa8,26794
66
67
  singlestoredb/mysql/err.py,sha256=-m5rqXi8yhq6b8SCEJ2h0E5Rudh_15dlAU_WbJ1YrM8,2388
@@ -101,6 +102,9 @@ singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_nonstandard.py,sh
101
102
  singlestoredb/notebook/__init__.py,sha256=v0j1E3MFAtaC8wTrR-F7XY0nytUvQ4XpYhVXddv2xA0,533
102
103
  singlestoredb/notebook/_objects.py,sha256=MkB1eowEq5SQXFHY00xAKAyyeLqHu_uaZiA20BCJPaE,8043
103
104
  singlestoredb/notebook/_portal.py,sha256=DLerIEQmAUymtYcx8RBeuYJ4pJSy_xl1K6t1Oc-eTf8,9698
105
+ singlestoredb/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
106
+ singlestoredb/server/docker.py,sha256=r7b8tOYTGBD9NtS4_KuSDbj4bO9rarBC63BY6TdxheM,14640
107
+ singlestoredb/server/free_tier.py,sha256=YPtUX6idwcez9LGBaVllcTpKo8Qk2RZp3MaAZvsZcOg,8386
104
108
  singlestoredb/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
105
109
  singlestoredb/tests/empty.sql,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
106
110
  singlestoredb/tests/local_infile.csv,sha256=sBtqjvfkS9aoOVx8nMXYgYv4rDuT4OuYhqUhNRu0O68,42
@@ -121,7 +125,7 @@ singlestoredb/tests/test_management.py,sha256=biqwuHfzaH5Jay1yj-nHnX7fhvLB9DPcju
121
125
  singlestoredb/tests/test_plugin.py,sha256=qpO9wmWc62VaijN1sJ97YSYIX7I7Y5C6sY-WzwrutDQ,812
122
126
  singlestoredb/tests/test_results.py,sha256=wg93sujwt-R9_eJCgSCElgAZhLDkIiAo3qPkPydOv78,6582
123
127
  singlestoredb/tests/test_types.py,sha256=jqoAaSjhbgwB3vt0KsTcl7XBWoMMIa0mPFKhEi5bBjo,4500
124
- singlestoredb/tests/test_udf.py,sha256=2Ml6VMTKIfstB-L31uX-zftwPsT5C64M29WZ6iuKdjI,28075
128
+ singlestoredb/tests/test_udf.py,sha256=G6MgAzu5ZiMHmtHaGbWYXRZ-naEvwYzT5MRB900BU3I,30029
125
129
  singlestoredb/tests/test_xdict.py,sha256=fqHspoi39nbX3fIDVkkRXcd5H50xdOsSvK0bxAMQnaE,10408
126
130
  singlestoredb/tests/utils.py,sha256=2A2tEdD3t8aXWUnHtAIcFlWrflsz2MlMcCbUDaAG29c,4995
127
131
  singlestoredb/tests/ext_funcs/__init__.py,sha256=qZLnDI_Ck0tguVi-K-BKXDHAcC0jui3dsm93Djj4x08,9290
@@ -130,15 +134,15 @@ singlestoredb/utils/config.py,sha256=m3Xn6hsbdKyLufSnbokhFJ9Vfaz9Qpkj1IEnIiH9oJQ
130
134
  singlestoredb/utils/convert_rows.py,sha256=A6up7a8Bq-eV2BXdGCotQviqp1Q7XdJ2MA9339hLYVQ,1816
131
135
  singlestoredb/utils/debug.py,sha256=0JiLA37u_9CKiDGiN9BK_PtFMUku3vIcNjERWaTNRSU,349
132
136
  singlestoredb/utils/dtypes.py,sha256=1qUiB4BJFJ7rOVh2mItQssYbJupV7uq1x8uwX-Eu2Ks,5898
133
- singlestoredb/utils/events.py,sha256=9IB84T3pKQjs7aaoSSJCw7soNngnhoTDWIC52M51R9Y,1139
137
+ singlestoredb/utils/events.py,sha256=kSrdOf1PgGKaUf8Cauj3KhPEzA9dWlKIytpUMRGZ_cU,1454
134
138
  singlestoredb/utils/mogrify.py,sha256=-a56IF70U6CkfadeaZgfjRSVsAD3PuqRrzPpjZlgbwY,4050
135
139
  singlestoredb/utils/results.py,sha256=bJtaUaDiFq26IsPAKZ2FHGB7csMn94EAxLKrP4HaEEA,15277
136
140
  singlestoredb/utils/xdict.py,sha256=S9HKgrPrnu_6b7iOwa2KrW8CmU1Uqx0BWdEyogFzWbE,12896
137
141
  sqlx/__init__.py,sha256=aBYiU8DZXCogvWu3yWafOz7bZS5WWwLZXj7oL0dXGyU,85
138
142
  sqlx/magic.py,sha256=JsS9_9aBFaOt91Torm1JPN0c8qB2QmYJmNSKtbSQIY0,3509
139
- singlestoredb-1.10.0.dist-info/LICENSE,sha256=Mlq78idURT-9G026aMYswwwnnrLcgzTLuXeAs5hjDLM,11341
140
- singlestoredb-1.10.0.dist-info/METADATA,sha256=AJjDDzgSwAhjfE9TYRExsBssT0XuNEfi-btDUrTLpIA,5558
141
- singlestoredb-1.10.0.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
142
- singlestoredb-1.10.0.dist-info/entry_points.txt,sha256=bSLaTWB5zGjpVYPAaI46MkkDup0su-eb3uAhCNYuRV0,48
143
- singlestoredb-1.10.0.dist-info/top_level.txt,sha256=DfFGz7bM4XrshloiCeTABgylT3BUnS8T5pJam3ewT6Q,19
144
- singlestoredb-1.10.0.dist-info/RECORD,,
143
+ singlestoredb-1.12.0.dist-info/LICENSE,sha256=Mlq78idURT-9G026aMYswwwnnrLcgzTLuXeAs5hjDLM,11341
144
+ singlestoredb-1.12.0.dist-info/METADATA,sha256=FYAe2Jnc0F4-vk4fZkPtFyMY9ufN65uUxqNDPgqVgDk,5622
145
+ singlestoredb-1.12.0.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
146
+ singlestoredb-1.12.0.dist-info/entry_points.txt,sha256=bSLaTWB5zGjpVYPAaI46MkkDup0su-eb3uAhCNYuRV0,48
147
+ singlestoredb-1.12.0.dist-info/top_level.txt,sha256=DfFGz7bM4XrshloiCeTABgylT3BUnS8T5pJam3ewT6Q,19
148
+ singlestoredb-1.12.0.dist-info/RECORD,,