singlestoredb 1.12.0__cp38-abi3-macosx_10_9_universal2.whl → 1.12.1__cp38-abi3-macosx_10_9_universal2.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.

Binary file
singlestoredb/__init__.py CHANGED
@@ -13,7 +13,7 @@ Examples
13
13
 
14
14
  """
15
15
 
16
- __version__ = '1.12.0'
16
+ __version__ = '1.12.1'
17
17
 
18
18
  from typing import Any
19
19
 
@@ -7,13 +7,11 @@ from typing import Optional
7
7
  from typing import Union
8
8
 
9
9
  from ...exceptions import ManagementError
10
+ from ...management import files as mgmt_files
10
11
  from ...management import manage_workspaces
11
12
  from ...management.files import FilesManager
12
13
  from ...management.files import FileSpace
13
14
  from ...management.files import manage_files
14
- from ...management.files import MODELS_SPACE
15
- from ...management.files import PERSONAL_SPACE
16
- from ...management.files import SHARED_SPACE
17
15
  from ...management.workspace import StarterWorkspace
18
16
  from ...management.workspace import Workspace
19
17
  from ...management.workspace import WorkspaceGroup
@@ -190,6 +188,10 @@ def get_deployment(
190
188
  * params['group']['deployment_id']
191
189
  * params['in_deployment']['deployment_name']
192
190
  * params['in_deployment']['deployment_id']
191
+ * params['in']['in_group']['deployment_name']
192
+ * params['in']['in_group']['deployment_id']
193
+ * params['in']['in_deployment']['deployment_name']
194
+ * params['in']['in_deployment']['deployment_id']
193
195
 
194
196
  Or, from the SINGLESTOREDB_WORKSPACE_GROUP
195
197
  or SINGLESTOREDB_CLUSTER environment variables.
@@ -199,7 +201,9 @@ def get_deployment(
199
201
 
200
202
  deployment_name = params.get('deployment_name') or \
201
203
  (params.get('in_deployment') or {}).get('deployment_name') or \
202
- (params.get('group') or {}).get('deployment_name')
204
+ (params.get('group') or {}).get('deployment_name') or \
205
+ ((params.get('in') or {}).get('in_group') or {}).get('deployment_name') or \
206
+ ((params.get('in') or {}).get('in_deployment') or {}).get('deployment_name')
203
207
  if deployment_name:
204
208
  workspace_groups = [
205
209
  x for x in manager.workspace_groups
@@ -239,7 +243,9 @@ def get_deployment(
239
243
 
240
244
  deployment_id = params.get('deployment_id') or \
241
245
  (params.get('in_deployment') or {}).get('deployment_id') or \
242
- (params.get('group') or {}).get('deployment_id')
246
+ (params.get('group') or {}).get('deployment_id') or \
247
+ ((params.get('in') or {}).get('in_group') or {}).get('deployment_id') or \
248
+ ((params.get('in') or {}).get('in_deployment') or {}).get('deployment_id')
243
249
  if deployment_id:
244
250
  try:
245
251
  return manager.get_workspace_group(deployment_id)
@@ -298,11 +304,11 @@ def get_file_space(params: Dict[str, Any]) -> FileSpace:
298
304
  if file_location:
299
305
  file_location_lower_case = file_location.lower()
300
306
 
301
- if file_location_lower_case == PERSONAL_SPACE:
307
+ if file_location_lower_case == mgmt_files.PERSONAL_SPACE:
302
308
  return manager.personal_space
303
- elif file_location_lower_case == SHARED_SPACE:
309
+ elif file_location_lower_case == mgmt_files.SHARED_SPACE:
304
310
  return manager.shared_space
305
- elif file_location_lower_case == MODELS_SPACE:
311
+ elif file_location_lower_case == mgmt_files.MODELS_SPACE:
306
312
  return manager.models_space
307
313
  else:
308
314
  raise ValueError(f'invalid file location: {file_location}')
@@ -10,11 +10,9 @@ import re
10
10
  from abc import ABC
11
11
  from abc import abstractmethod
12
12
  from typing import Any
13
- from typing import BinaryIO
14
13
  from typing import Dict
15
14
  from typing import List
16
15
  from typing import Optional
17
- from typing import TextIO
18
16
  from typing import Union
19
17
 
20
18
  from .. import config
@@ -362,7 +360,7 @@ class FileLocation(ABC):
362
360
  @abstractmethod
363
361
  def upload_file(
364
362
  self,
365
- local_path: Union[PathLike, TextIO, BinaryIO],
363
+ local_path: Union[PathLike, io.IOBase],
366
364
  path: PathLike,
367
365
  *,
368
366
  overwrite: bool = False,
@@ -385,7 +383,7 @@ class FileLocation(ABC):
385
383
  @abstractmethod
386
384
  def _upload(
387
385
  self,
388
- content: Union[str, bytes, TextIO, BinaryIO],
386
+ content: Union[str, bytes, io.IOBase],
389
387
  path: PathLike,
390
388
  *,
391
389
  overwrite: bool = False,
@@ -628,7 +626,7 @@ class FileSpace(FileLocation):
628
626
 
629
627
  def upload_file(
630
628
  self,
631
- local_path: Union[PathLike, TextIO, BinaryIO],
629
+ local_path: Union[PathLike, io.IOBase],
632
630
  path: PathLike,
633
631
  *,
634
632
  overwrite: bool = False,
@@ -646,7 +644,7 @@ class FileSpace(FileLocation):
646
644
  Should the ``path`` be overwritten if it exists already?
647
645
 
648
646
  """
649
- if isinstance(local_path, (TextIO, BinaryIO)):
647
+ if isinstance(local_path, io.IOBase):
650
648
  pass
651
649
  elif not os.path.isfile(local_path):
652
650
  raise IsADirectoryError(f'local path is not a file: {local_path}')
@@ -657,8 +655,9 @@ class FileSpace(FileLocation):
657
655
 
658
656
  self.remove(path)
659
657
 
660
- if isinstance(local_path, (TextIO, BinaryIO)):
658
+ if isinstance(local_path, io.IOBase):
661
659
  return self._upload(local_path, path, overwrite=overwrite)
660
+
662
661
  return self._upload(open(local_path, 'rb'), path, overwrite=overwrite)
663
662
 
664
663
  def upload_folder(
@@ -727,7 +726,7 @@ class FileSpace(FileLocation):
727
726
 
728
727
  def _upload(
729
728
  self,
730
- content: Union[str, bytes, TextIO, BinaryIO],
729
+ content: Union[str, bytes, io.IOBase],
731
730
  path: PathLike,
732
731
  *,
733
732
  overwrite: bool = False,
@@ -10,11 +10,9 @@ import re
10
10
  import time
11
11
  from collections.abc import Mapping
12
12
  from typing import Any
13
- from typing import BinaryIO
14
13
  from typing import Dict
15
14
  from typing import List
16
15
  from typing import Optional
17
- from typing import TextIO
18
16
  from typing import Union
19
17
 
20
18
  from .. import config
@@ -165,7 +163,7 @@ class Stage(FileLocation):
165
163
 
166
164
  def upload_file(
167
165
  self,
168
- local_path: Union[PathLike, TextIO, BinaryIO],
166
+ local_path: Union[PathLike, io.IOBase],
169
167
  stage_path: PathLike,
170
168
  *,
171
169
  overwrite: bool = False,
@@ -183,7 +181,7 @@ class Stage(FileLocation):
183
181
  Should the ``stage_path`` be overwritten if it exists already?
184
182
 
185
183
  """
186
- if isinstance(local_path, (TextIO, BinaryIO)):
184
+ if isinstance(local_path, io.IOBase):
187
185
  pass
188
186
  elif not os.path.isfile(local_path):
189
187
  raise IsADirectoryError(f'local path is not a file: {local_path}')
@@ -194,8 +192,9 @@ class Stage(FileLocation):
194
192
 
195
193
  self.remove(stage_path)
196
194
 
197
- if isinstance(local_path, (TextIO, BinaryIO)):
195
+ if isinstance(local_path, io.IOBase):
198
196
  return self._upload(local_path, stage_path, overwrite=overwrite)
197
+
199
198
  return self._upload(open(local_path, 'rb'), stage_path, overwrite=overwrite)
200
199
 
201
200
  def upload_folder(
@@ -258,7 +257,7 @@ class Stage(FileLocation):
258
257
 
259
258
  def _upload(
260
259
  self,
261
- content: Union[str, bytes, TextIO, BinaryIO],
260
+ content: Union[str, bytes, io.IOBase],
262
261
  stage_path: PathLike,
263
262
  *,
264
263
  overwrite: bool = False,
@@ -414,8 +414,12 @@ class TestStage(unittest.TestCase):
414
414
  with self.assertRaises(OSError):
415
415
  st.upload_file(TEST_DIR / 'test.sql', 'upload_test.sql')
416
416
 
417
- # Force overwrite with new content
418
- f = st.upload_file(TEST_DIR / 'test2.sql', 'upload_test.sql', overwrite=True)
417
+ # Force overwrite with new content; use file object this time
418
+ f = st.upload_file(
419
+ open(TEST_DIR / 'test2.sql', 'r'),
420
+ 'upload_test.sql',
421
+ overwrite=True,
422
+ )
419
423
  assert str(f.path) == 'upload_test.sql'
420
424
  assert f.type == 'file'
421
425
 
@@ -1093,6 +1097,50 @@ class TestFileSpaces(unittest.TestCase):
1093
1097
  # Cleanup
1094
1098
  space.remove('upload_test.ipynb')
1095
1099
 
1100
+ def test_upload_file_io(self):
1101
+ for space in [self.personal_space, self.shared_space]:
1102
+ root = space.info('/')
1103
+ assert str(root.path) == '/'
1104
+ assert root.type == 'directory'
1105
+
1106
+ # Upload files
1107
+ f = space.upload_file(
1108
+ open(TEST_DIR / 'test.ipynb', 'r'),
1109
+ 'upload_test.ipynb',
1110
+ )
1111
+ assert str(f.path) == 'upload_test.ipynb'
1112
+ assert f.type == 'notebook'
1113
+
1114
+ # Download and compare to original
1115
+ txt = f.download(encoding='utf-8')
1116
+ assert txt == open(TEST_DIR / 'test.ipynb').read()
1117
+
1118
+ # Make sure we can't overwrite
1119
+ with self.assertRaises(OSError):
1120
+ space.upload_file(
1121
+ open(TEST_DIR / 'test.ipynb', 'r'),
1122
+ 'upload_test.ipynb',
1123
+ )
1124
+
1125
+ # Force overwrite with new content
1126
+ f = space.upload_file(
1127
+ open(TEST_DIR / 'test2.ipynb', 'r'),
1128
+ 'upload_test.ipynb', overwrite=True,
1129
+ )
1130
+ assert str(f.path) == 'upload_test.ipynb'
1131
+ assert f.type == 'notebook'
1132
+
1133
+ # Verify new content
1134
+ txt = f.download(encoding='utf-8')
1135
+ assert txt == open(TEST_DIR / 'test2.ipynb').read()
1136
+
1137
+ # Make sure we can't upload a folder
1138
+ with self.assertRaises(s2.ManagementError):
1139
+ space.upload_folder(TEST_DIR, 'test')
1140
+
1141
+ # Cleanup
1142
+ space.remove('upload_test.ipynb')
1143
+
1096
1144
  def test_open(self):
1097
1145
  for space in [self.personal_space, self.shared_space]:
1098
1146
  # See if error is raised for non-existent file
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: singlestoredb
3
- Version: 1.12.0
3
+ Version: 1.12.1
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
@@ -1,15 +1,15 @@
1
- _singlestoredb_accel.abi3.so,sha256=WQfunCWdQbFRxYoFX0QjZVDGx_uQ44k40GhykF39_R0,206864
2
- singlestoredb-1.12.0.dist-info/RECORD,,
3
- singlestoredb-1.12.0.dist-info/LICENSE,sha256=Mlq78idURT-9G026aMYswwwnnrLcgzTLuXeAs5hjDLM,11341
4
- singlestoredb-1.12.0.dist-info/WHEEL,sha256=_VEguvlLpUd-c8RbFMA4yMIVNMBv2LhpxYLCEQ-Bogk,113
5
- singlestoredb-1.12.0.dist-info/entry_points.txt,sha256=bSLaTWB5zGjpVYPAaI46MkkDup0su-eb3uAhCNYuRV0,48
6
- singlestoredb-1.12.0.dist-info/top_level.txt,sha256=lA65Vf4qAMfg_s1oG3LEO90h4t1Z-SPDbRqkevI3bSY,40
7
- singlestoredb-1.12.0.dist-info/METADATA,sha256=n-AeePEEJP3mbVTbkAIrZVWLt6eZDNBiWFCJejn-OKQ,5636
1
+ _singlestoredb_accel.abi3.so,sha256=hEcp6tY0Iwmx0nPwBkfSG2Yb9iWV4KUd65FPBatqYGc,206864
8
2
  sqlx/magic.py,sha256=JsS9_9aBFaOt91Torm1JPN0c8qB2QmYJmNSKtbSQIY0,3509
9
3
  sqlx/__init__.py,sha256=aBYiU8DZXCogvWu3yWafOz7bZS5WWwLZXj7oL0dXGyU,85
4
+ singlestoredb-1.12.1.dist-info/RECORD,,
5
+ singlestoredb-1.12.1.dist-info/LICENSE,sha256=Mlq78idURT-9G026aMYswwwnnrLcgzTLuXeAs5hjDLM,11341
6
+ singlestoredb-1.12.1.dist-info/WHEEL,sha256=_VEguvlLpUd-c8RbFMA4yMIVNMBv2LhpxYLCEQ-Bogk,113
7
+ singlestoredb-1.12.1.dist-info/entry_points.txt,sha256=bSLaTWB5zGjpVYPAaI46MkkDup0su-eb3uAhCNYuRV0,48
8
+ singlestoredb-1.12.1.dist-info/top_level.txt,sha256=lA65Vf4qAMfg_s1oG3LEO90h4t1Z-SPDbRqkevI3bSY,40
9
+ singlestoredb-1.12.1.dist-info/METADATA,sha256=wYTpEPYx7WpKtU6Jr7wQjunmlrA7UnsmNMRkbL73R40,5636
10
10
  singlestoredb/auth.py,sha256=u8D9tpKzrqa4ssaHjyZnGDX1q8XBpGtuoOkTkSv7B28,7599
11
11
  singlestoredb/config.py,sha256=rlF69SiclYyKghNRckX77Ls1ZT23RhSssO1cyYBiHmA,12589
12
- singlestoredb/__init__.py,sha256=rMEoyZJpkhiOhcoZLCItPxn7d2AppFdBTIwmK7t_Y7E,1649
12
+ singlestoredb/__init__.py,sha256=4htLkEL7t7jjaZ4Qym7QvHrv4P7cYZdDGtYcMpmSGow,1649
13
13
  singlestoredb/types.py,sha256=FIqO1A7e0Gkk7ITmIysBy-P5S--ItbMSlYvblzqGS30,9969
14
14
  singlestoredb/connection.py,sha256=0HEpjBZXLqQwOTEfveMkgej1H3Kyof47prIHvJJZtoo,45831
15
15
  singlestoredb/pytest.py,sha256=OyF3BO9mgxenifYhOihnzGk8WzCJ_zN5_mxe8XyFPOc,9074
@@ -26,7 +26,7 @@ singlestoredb/fusion/handlers/models.py,sha256=xJPIG0_GgF-VrmPoIsU2U4AsS7ytDz8JM
26
26
  singlestoredb/fusion/handlers/job.py,sha256=r0KdOD55VUDw-SymC__5Mn-fzJTZE_xcBgH-O8DYVHc,21095
27
27
  singlestoredb/fusion/handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
28
  singlestoredb/fusion/handlers/export.py,sha256=3moTJeqsHkDDpitUUAE6x95JYH2rmb28MALbO4x0dcc,8981
29
- singlestoredb/fusion/handlers/utils.py,sha256=mYRfGMFv2mxZVILeb_B0S55SWsb0gaye8RnjAyylbhE,10064
29
+ singlestoredb/fusion/handlers/utils.py,sha256=dg5v25kCejgqg8smnxE4vqu_G3OJzJ4jX8pm2N1z6mc,10574
30
30
  singlestoredb/fusion/handlers/stage.py,sha256=kYVjbPys83kf3jX6jWwN8Ju0oEocKVZ3TIOt2HiC5Ew,14287
31
31
  singlestoredb/fusion/handlers/workspace.py,sha256=4xN2TFO4yF7KZB2Fcht7IuvoDdAT6fDfDLjixiHZN8w,27506
32
32
  singlestoredb/tests/test.sql,sha256=dfMehVCQ9wObSVTQKyQi-fRFDZeqRxV4Cj8doBCPEFM,17679
@@ -41,7 +41,7 @@ singlestoredb/tests/test2.ipynb,sha256=yd1PE1VK-DwiRd6mYS4_0cPBtuVkvcDtycvTwD-Yn
41
41
  singlestoredb/tests/test_ext_func_data.py,sha256=yTADD93nPxX6_rZXXLZaOWEI_yPvYyir9psn5PK9ctU,47695
42
42
  singlestoredb/tests/test_exceptions.py,sha256=tfr_8X2w1UmG4nkSBzWGB0C7ehrf1GAVgj6_ODaG-TM,1131
43
43
  singlestoredb/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
- singlestoredb/tests/test_management.py,sha256=biqwuHfzaH5Jay1yj-nHnX7fhvLB9DPcjujmJR_T1vM,43480
44
+ singlestoredb/tests/test_management.py,sha256=9WKaFChAWkKMm0kDhwTgjaJIAcga7mQZiF0x9BNI1Tc,45112
45
45
  singlestoredb/tests/test_udf.py,sha256=G6MgAzu5ZiMHmtHaGbWYXRZ-naEvwYzT5MRB900BU3I,30029
46
46
  singlestoredb/tests/test_http.py,sha256=RXasTqBWRn__omj0eLFTJYIbZjd0PPdIV2d4Cqz0MC8,8580
47
47
  singlestoredb/tests/utils.py,sha256=2A2tEdD3t8aXWUnHtAIcFlWrflsz2MlMcCbUDaAG29c,4995
@@ -56,7 +56,7 @@ singlestoredb/tests/ext_funcs/__init__.py,sha256=qZLnDI_Ck0tguVi-K-BKXDHAcC0jui3
56
56
  singlestoredb/magics/__init__.py,sha256=lZjkT3Webo9c1EQAzlRCRh6B2pckQH8uvNrrB__abcI,1210
57
57
  singlestoredb/magics/run_shared.py,sha256=SI8dCBRMaGn-xZU7dto4jsAqKBi-Ll14htUsMUSBpJM,1752
58
58
  singlestoredb/magics/run_personal.py,sha256=2f7u1T7iblxGzZurHNgNXLrPBvsvPADZKo_RD_IjYuE,1844
59
- singlestoredb/management/files.py,sha256=0sp3UDDHbiY5lP0QYkNgVcZ2v9zz3Kba3CeLU_xtE4Y,30575
59
+ singlestoredb/management/files.py,sha256=_FDIs9rtG7cW6aIkXnYReLQaFxdix2iu7Do368hOoE8,30476
60
60
  singlestoredb/management/organization.py,sha256=hqMaM7H-naMjNbxDl_f7G_2o5TkiGKyzPhxuzDveJAw,5402
61
61
  singlestoredb/management/job.py,sha256=4-xLWzbE8odQogVVaFer80UEoTAZY1T28VZ9Ug4rbmM,24611
62
62
  singlestoredb/management/region.py,sha256=HnLcWUh7r_aLECliplCDHak4a_F3B7LOSXEYMW66qD0,1611
@@ -64,7 +64,7 @@ singlestoredb/management/__init__.py,sha256=ofNTPCdkZ1dS_aX2aUujd8aMHQi8Lle5Ced0
64
64
  singlestoredb/management/export.py,sha256=jJCe25ecH_LzKSDc7vS1-5DQaWFrZipeawLPpArByJE,5108
65
65
  singlestoredb/management/utils.py,sha256=P4fp8a7EwaYiag_hvpILcgwXtdFNYKKO70dsKjmxn1A,13171
66
66
  singlestoredb/management/cluster.py,sha256=h75grXSxq4Anr4RxwKxcZW4TkWJ4bFg_ql5iRWCNLdQ,14405
67
- singlestoredb/management/workspace.py,sha256=fNUiz3XNTGgXdOACsQz56Gox2qt9lOVGAtHK67IpMuc,56319
67
+ singlestoredb/management/workspace.py,sha256=ze-eE-cO3JCrR3uttVFaBOndDbEE8_qWR2kzOjzbKaY,56234
68
68
  singlestoredb/management/manager.py,sha256=X29VEHlUEzmWvGo_bQMzo8a6d4nYMLE1CewlNBjrD7M,8851
69
69
  singlestoredb/management/billing_usage.py,sha256=9ighjIpcopgIyJOktBYQ6pahBZmWGHOPyyCW4gu9FGs,3735
70
70
  singlestoredb/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0