singlestoredb 1.10.0__cp38-abi3-win_amd64.whl → 1.12.0__cp38-abi3-win_amd64.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,9 +1,9 @@
1
- _singlestoredb_accel.pyd,sha256=cTNWxsBsHk77ryPm-wj9wFEi3q0MJgQ5JFOGo8KsfdM,59392
2
- singlestoredb/__init__.py,sha256=tic3Nv74hrvLzFMKed_-mr9zHudZrMogLBcwzs988lk,1712
1
+ _singlestoredb_accel.pyd,sha256=WHRaNLT9T443QYP2GcIt3sG6BVNm6xSWhWzIG8-P6Yg,59392
2
+ singlestoredb/__init__.py,sha256=Iara1fKCSwiFNw9PtYKuw07k0DG97Wp-6ppI8jcJti0,1712
3
3
  singlestoredb/auth.py,sha256=RmYiH0Wlc2RXc4pTlRMysxtBI445ggCIwojWKC_eDLE,7844
4
- singlestoredb/config.py,sha256=n6ludREIoiZDEzSGmv0xouv_zHFnznKNKxSvjzgQ3Lk,12876
5
- singlestoredb/connection.py,sha256=I3A0VkA_E6pfUNCzIvj0KTb5zn6-htBAPsu6OVXO9-I,47150
6
- singlestoredb/converters.py,sha256=7_Of1f3Ow-JUoY1pHFlMPYxvt8llzdk-7X8qk5z2xJM,21631
4
+ singlestoredb/config.py,sha256=5OY9RDlGBrBWAHsGrg0X4v0y_QwNb7G6FSQooMgT8rY,13032
5
+ singlestoredb/connection.py,sha256=Ty_idVYH50Qx-j8WXy7NeB-DYLAcpdjGYTrTHkKzG9U,47309
6
+ singlestoredb/converters.py,sha256=6gN3_RzSbw0Aimd5cGgBNPNq1yiHb1a_NK8qC9DmOQ0,21636
7
7
  singlestoredb/exceptions.py,sha256=WCCJrNSsU-hD-621Jpd6bwmvGftQ7byXkk-XKXlaxpg,3354
8
8
  singlestoredb/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  singlestoredb/pytest.py,sha256=TH364xRCN7_QaN0oRQDHixrEcDx_ZBgu3bmY0tvKrYU,9357
@@ -19,13 +19,13 @@ singlestoredb/apps/_dashboards.py,sha256=qEdDivjwS68Uukay0Qw-3awHZFpkcqapzd3vLaV
19
19
  singlestoredb/apps/_process.py,sha256=eMiBO4piaRX1S6zdnMx0X0E4J7E1XrXndnVW0GRYq1Y,976
20
20
  singlestoredb/apps/_stdout_supress.py,sha256=QRV-IHQQMvWMeJfqORuVE2-Il6ohO2Ti4IokFoTCJWE,689
21
21
  singlestoredb/apps/_uvicorn_util.py,sha256=Petkmq5keBPfXZsHBrnZfY3O2rUHvb3Cw6o-BRz5MP0,994
22
- singlestoredb/functions/__init__.py,sha256=EVxqWOCcXiIX4Yj7rljAYBBoVbTvm2KSuKSkMBDnEeU,42
23
- singlestoredb/functions/decorator.py,sha256=M103c1JAZfyGFQAU4uJ_J8XGGH3InhcfrNUCoEORNFQ,5335
22
+ singlestoredb/functions/__init__.py,sha256=Ehyp1pa40cvizzSYNGZ4UP4tiEcyfaxf_LI-oyt-Lro,84
23
+ singlestoredb/functions/decorator.py,sha256=6c0uIknQNZrN5LAj-mWUw25Bcnl-_dRel6RMDzn2vK8,11816
24
24
  singlestoredb/functions/dtypes.py,sha256=5IwMSaSzxtSowxXrm5hZXW1lpNm6QILxiU4mAUEkBO0,32854
25
- singlestoredb/functions/signature.py,sha256=gnD1JID0XVKU6p5UaPMb492A7nzJiSzFiRn18LeLWhY,19635
25
+ singlestoredb/functions/signature.py,sha256=np4DHtfLM-S38srVu9KzsJZnI7tiwrl0UtMnA8F6rZ0,23162
26
26
  singlestoredb/functions/ext/__init__.py,sha256=5ppI8IZN_zOwoJFdu_Oq9ipxtyHw9n6OMVAa_s9T_yY,24
27
27
  singlestoredb/functions/ext/arrow.py,sha256=mQhwaMpvCH_dP92WIhP_j-stu272n4UAHsFUOBTgnq0,9436
28
- singlestoredb/functions/ext/asgi.py,sha256=W4z-XyMvdNrEnEYicrP1hfLldI4H9FIEFIVvf4eXSA4,41195
28
+ singlestoredb/functions/ext/asgi.py,sha256=ENwGjjLxFYjv6HFB5WdX4YT5GSs5sn3mirOLgAM0wTY,44807
29
29
  singlestoredb/functions/ext/json.py,sha256=CROdj37cuJhAZ-CM93EI-SoLb4kxFcMGudsJ5QGyCoI,10831
30
30
  singlestoredb/functions/ext/mmap.py,sha256=zo6eweOFCZp0KIzAeL1vvuSjqvQhE8ybVhHbU0ZICt4,14124
31
31
  singlestoredb/functions/ext/rowdat_1.py,sha256=KYj_y5JWm3_B2-QC47HK-CNOrzujBqGUwLJfE49jwRg,23050
@@ -34,24 +34,25 @@ singlestoredb/fusion/__init__.py,sha256=FHWtrg6OJFTf6Ye197V5sU6ssryr2h6FBcDIgXP7
34
34
  singlestoredb/fusion/graphql.py,sha256=SHqsPe4xgawdsTPHEtJGQlybYGWqPrGMmyK-v20RLac,5420
35
35
  singlestoredb/fusion/handler.py,sha256=ohnU0BIoJ9AHrVLlCHI-3E4Icqoocxqip8T-XyYxBWQ,28293
36
36
  singlestoredb/fusion/registry.py,sha256=_eT1gd38VPlFKs5f9Pu6lqQyoDQ_ixW5O56QwYLQ89Y,6361
37
- singlestoredb/fusion/result.py,sha256=EcFY5Qv43ySlQsfl_JB-I3ko7PzVdjuhhoKN96uHSAM,12171
37
+ singlestoredb/fusion/result.py,sha256=KAwhXxXVgfkAWekCFY8-Y03ANKDiTflYRXyEc_1Id0k,12189
38
38
  singlestoredb/fusion/handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
- singlestoredb/fusion/handlers/export.py,sha256=Vf0idiFTluEhDpt7ozWSdYwQcOeXz2-J6-91ax8F834,7189
40
- singlestoredb/fusion/handlers/files.py,sha256=sXO5OFS5QsmwNOnMY3G5xpMPqh4_WkssW3dOB6uI4VQ,19669
39
+ singlestoredb/fusion/handlers/export.py,sha256=OPA1yY1GRRTh1YiGawfAx_LfsxA_qs8Ci0LDTfVEq9A,9278
40
+ singlestoredb/fusion/handlers/files.py,sha256=pCx1sqnjPtQrp39rv_V4RX9CVtj6uSiL6HPUyiABYpI,19681
41
41
  singlestoredb/fusion/handlers/job.py,sha256=3enfxHwERH7T4u0FEwOPN0IL0GtepaCYgEsisiy3Df4,21753
42
+ singlestoredb/fusion/handlers/models.py,sha256=XWaPJQc3GQIOAcjNcxBSGUBJ3xu2qkzQ4ILa40TFQmY,6486
42
43
  singlestoredb/fusion/handlers/stage.py,sha256=PP-SSP204lwpmnycSXXSmFPzoN535JVuwglDCbaQ8Lw,14789
43
- singlestoredb/fusion/handlers/utils.py,sha256=OffWWj8FkZgqr5ijY3WQ6cwaAB7a7Z5cYxLeOAfU_JE,10356
44
+ singlestoredb/fusion/handlers/utils.py,sha256=qwKGKi7hVlxoROZnAdOgqN3Fw4EHxMynfCdUWKvjFvo,10374
44
45
  singlestoredb/fusion/handlers/workspace.py,sha256=NxoEY5xd5lCQmXiim4nhAYCL0agHo1H_rGPpqa31hiw,28397
45
46
  singlestoredb/http/__init__.py,sha256=4cEDvLloGc3LSpU-PnIwacyu0n5oIIIE6xk2SPyWD_w,939
46
- singlestoredb/http/connection.py,sha256=LFUeWx7maS7xhQLqEX3pgvIGoosqyJTovtWwJ1DyDSA,40721
47
+ singlestoredb/http/connection.py,sha256=dqXX5SSn6EOV7q0Ehh0E525eLT__B_jJLG-7jgVjbXg,40861
47
48
  singlestoredb/magics/__init__.py,sha256=fqCBQ0s8o1CYE4Xo_XiSbkLDzLgMNDgpSkOx66-uDZw,1244
48
49
  singlestoredb/magics/run_personal.py,sha256=M11xHi9lWquh_pLSpFI89LGE7PhOPQOGqlSPDl48itE,1900
49
50
  singlestoredb/magics/run_shared.py,sha256=rnKpW4d8CJvD6ehK8jG8FlxuqZvjZl4KocPTsk-23O8,1805
50
51
  singlestoredb/management/__init__.py,sha256=A66ZnFyX--PsAZ2tvtYUfIUBvVGDBFQsnVc6nGTlX60,277
51
52
  singlestoredb/management/billing_usage.py,sha256=0UHFSPCrN0nyeGFFM-HXS3NP8pYmYo2BCCahDEPXvzg,3883
52
53
  singlestoredb/management/cluster.py,sha256=auBzNYIXvnI6rq3DNpPgJhwWoT6JsyZRikjpON23Pxg,14867
53
- singlestoredb/management/export.py,sha256=Ksrb8_sxeqva4NElaGxdPQUWQga2yOEkf0wnw5M-iGc,4302
54
- singlestoredb/management/files.py,sha256=9uVWe6yc48B9J1GHcMxQ4GEHOnIVlFzEXuKhWFuuZH0,29256
54
+ singlestoredb/management/export.py,sha256=2dCvnTnkxVI-arX3_375DtWzHkI1YNK5zaFYdHKE4cs,5277
55
+ singlestoredb/management/files.py,sha256=ly9Hwe0kVWqws8dvjuoIH0fURi8TadTTZPIFKTxnuWI,31677
55
56
  singlestoredb/management/job.py,sha256=Npfe1JLYJlggGBrXLniPKwKUKF1i3alvSY1SFtvauSs,25498
56
57
  singlestoredb/management/manager.py,sha256=8zU0d7NG83PYMhoAs2JriTqbqh-R2tLX7VZoeZtcogY,9148
57
58
  singlestoredb/management/organization.py,sha256=JBsNC4R3boUKdYvyCZyfGoVMC1mD6SPuMI1UssBVoOM,5611
@@ -61,7 +62,7 @@ singlestoredb/management/workspace.py,sha256=erII_7SA4vdJkTPBKB6aa88mYujmXTYdNeQ
61
62
  singlestoredb/mysql/__init__.py,sha256=CbpwzNUJPAmKPpIobC0-ugBta_RgHCMq7X7N75QLReY,4669
62
63
  singlestoredb/mysql/_auth.py,sha256=YaqqyvAHmeraBv3BM207rNveUVPM-mPnW20ts_ynVWg,8341
63
64
  singlestoredb/mysql/charset.py,sha256=mnCdMpvdub1S2mm2PSk2j5JddgsWRjsVLtGx-y9TskE,10724
64
- singlestoredb/mysql/connection.py,sha256=mmTF9X7cPbmTS7yPHHbkjwQGpOPSbpDgZ3MNd2MyXkA,74716
65
+ singlestoredb/mysql/connection.py,sha256=Dlam7wNSfn4jVBNrqdvxLzwxJqCQUzuu_rlcKU45MB0,75113
65
66
  singlestoredb/mysql/converters.py,sha256=vebFFm6IrC0WgY-5Eh-esaPizY5cq3vDOUlEKGaYM-U,7771
66
67
  singlestoredb/mysql/cursors.py,sha256=pkrP-1t8IhBJRnYpdM7Rdm-332nOq1RYTDJ_yg_q5HI,27682
67
68
  singlestoredb/mysql/err.py,sha256=aDbmfq08gWVmfgIea735wSeiFdvYbB5wusgd3qTVq1s,2480
@@ -102,6 +103,9 @@ singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_nonstandard.py,sh
102
103
  singlestoredb/notebook/__init__.py,sha256=XGvAnkjV_6MjaNv6aqxqDL3ovPApKmNX-2UYH1t0cec,549
103
104
  singlestoredb/notebook/_objects.py,sha256=rDfHGLLwrnuhVMOyNojzrGamykyfOQxZfH2EnFd8vEw,8256
104
105
  singlestoredb/notebook/_portal.py,sha256=ip3MkJ51syxppUVGRjgqLfR0He4KCZVklFwWT_X270s,10011
106
+ singlestoredb/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
107
+ singlestoredb/server/docker.py,sha256=gdGLEaUkPQJQ8u_1C1OQYr4iXPx1s6CmQmXKOrJFn3g,15095
108
+ singlestoredb/server/free_tier.py,sha256=rugYt_5jIC6AsE2UhR5hiLQKExyOqSXFyBoIaqG2pIc,8653
105
109
  singlestoredb/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
106
110
  singlestoredb/tests/empty.sql,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
107
111
  singlestoredb/tests/local_infile.csv,sha256=0fYxcZcTvcwS2McF4sktFsipRY1G-ClGmCRR1eCqdEQ,45
@@ -122,7 +126,7 @@ singlestoredb/tests/test_management.py,sha256=y6K9dm-s9wxi1yk7fGt-h6hYlB9W4VZy4F
122
126
  singlestoredb/tests/test_plugin.py,sha256=P1nXLnTafaHkHN-6bVbGryxTu7OWJPU9SYFZ_WQUwq8,845
123
127
  singlestoredb/tests/test_results.py,sha256=Zg1ynZFRZqalAMfNLOU5C6BDXaox6JxrKm_XZwVNFcg,6753
124
128
  singlestoredb/tests/test_types.py,sha256=YeVE6KPqlqzJke-4hbRmc8ko1E7RLHu5S8qLg04Bl5Y,4632
125
- singlestoredb/tests/test_udf.py,sha256=pac1Qp1JPcUgXB1-xBBMRCqWD17IBWMQ8TFe6LE3iLo,28762
129
+ singlestoredb/tests/test_udf.py,sha256=Hm4Egcrd3awgGQA9JS7T0yBWyNL44z8cdjvZwNL7re4,30768
126
130
  singlestoredb/tests/test_xdict.py,sha256=5ArRJqd5aNXkPK7Y6sFeRbqZ59MZ1YaGBpSlDAbBrjM,10741
127
131
  singlestoredb/tests/utils.py,sha256=WR8GFNiC0lU4tz21Y3rlbbp9Gz9WcSwp2jpUSCj7RFU,5136
128
132
  singlestoredb/tests/ext_funcs/__init__.py,sha256=mKa-vOh5D8M03kgKTQyvOB74X-Of0nl-mcmJBFzRW0c,9675
@@ -131,15 +135,15 @@ singlestoredb/utils/config.py,sha256=WVQ567ZzqzlTGueQH5fEpm5tPZuz8y7qvpEQUB-vPjk
131
135
  singlestoredb/utils/convert_rows.py,sha256=gkZeZazeJvimCYEQ1FdAC-AmMDwmFGCuP6mi653bpns,1885
132
136
  singlestoredb/utils/debug.py,sha256=y7dnJeJGt3U_BWXz9pLt1qNQREpPtumYX_sk1DiqG6Y,362
133
137
  singlestoredb/utils/dtypes.py,sha256=_P2fTX2Fgv9Bcl-2L6KivhWgLzyu91sDamxVnmG92Mw,6103
134
- singlestoredb/utils/events.py,sha256=rC9cHAetua_E1f-EiFkFM-gJzQSQIH5Uk-4sspC3KjI,1188
138
+ singlestoredb/utils/events.py,sha256=Wpp4Z5kw6f7axGAerMirEhgjcAArboQtMc4aqXzfKIc,1519
135
139
  singlestoredb/utils/mogrify.py,sha256=gCcn99-vgsGVjTUV7RHJ6hH4vCNrsGB_Xo4z8kiSPDQ,4201
136
140
  singlestoredb/utils/results.py,sha256=wR70LhCqlobniZf52r67zYLBOKjWHQm68NAskdRQND8,15862
137
141
  singlestoredb/utils/xdict.py,sha256=-wi1lSPTnY99fhVMBhPKJ8cCsQhNG4GMUfkEBDKYgCw,13321
138
142
  sqlx/__init__.py,sha256=4Sdn8HN-Hf8v0_wCt60DCckCg8BvgM3-9r4YVfZycRE,89
139
143
  sqlx/magic.py,sha256=6VBlotgjautjev599tHaTYOfcfOA9m6gV_-P1_Qc4lI,3622
140
- singlestoredb-1.10.0.dist-info/LICENSE,sha256=Bojenzui8aPNjlF3w4ojguDP7sTf8vFV_9Gc2UAG1sg,11542
141
- singlestoredb-1.10.0.dist-info/METADATA,sha256=WMO1XteYPWWD3omXLyDKKoz10HINKtWZ5Hqdo75Z8rQ,5711
142
- singlestoredb-1.10.0.dist-info/WHEEL,sha256=UyMHzmWA0xVqVPKfTiLs2eN3OWWZUl-kQemNbpIqlKo,100
143
- singlestoredb-1.10.0.dist-info/entry_points.txt,sha256=bSLaTWB5zGjpVYPAaI46MkkDup0su-eb3uAhCNYuRV0,48
144
- singlestoredb-1.10.0.dist-info/top_level.txt,sha256=lA65Vf4qAMfg_s1oG3LEO90h4t1Z-SPDbRqkevI3bSY,40
145
- singlestoredb-1.10.0.dist-info/RECORD,,
144
+ singlestoredb-1.12.0.dist-info/LICENSE,sha256=Bojenzui8aPNjlF3w4ojguDP7sTf8vFV_9Gc2UAG1sg,11542
145
+ singlestoredb-1.12.0.dist-info/METADATA,sha256=uUarreheJtoVdjN3cdib0m42WWjYaEyoU_RZw1niVNY,5778
146
+ singlestoredb-1.12.0.dist-info/WHEEL,sha256=UyMHzmWA0xVqVPKfTiLs2eN3OWWZUl-kQemNbpIqlKo,100
147
+ singlestoredb-1.12.0.dist-info/entry_points.txt,sha256=bSLaTWB5zGjpVYPAaI46MkkDup0su-eb3uAhCNYuRV0,48
148
+ singlestoredb-1.12.0.dist-info/top_level.txt,sha256=lA65Vf4qAMfg_s1oG3LEO90h4t1Z-SPDbRqkevI3bSY,40
149
+ singlestoredb-1.12.0.dist-info/RECORD,,