singlestoredb 1.5.0__cp38-abi3-win32.whl → 1.6.0__cp38-abi3-win32.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.

@@ -7,6 +7,7 @@ from typing import Optional
7
7
  from typing import Union
8
8
 
9
9
  from ..exceptions import ManagementError
10
+ from .job import JobsManager
10
11
  from .manager import Manager
11
12
  from .utils import vars_to_str
12
13
 
@@ -190,3 +191,19 @@ class Organization(object):
190
191
  )
191
192
  out._manager = manager
192
193
  return out
194
+
195
+ @property
196
+ def jobs(self) -> JobsManager:
197
+ """
198
+ Retrieve a SingleStoreDB scheduled job manager.
199
+
200
+ Parameters
201
+ ----------
202
+ manager : WorkspaceManager, optional
203
+ The WorkspaceManager the JobsManager belongs to
204
+
205
+ Returns
206
+ -------
207
+ :class:`JobsManager`
208
+ """
209
+ return JobsManager(self._manager)
@@ -215,6 +215,26 @@ def get_token() -> Optional[str]:
215
215
  return None
216
216
 
217
217
 
218
+ def get_cluster_id() -> Optional[str]:
219
+ """Return the cluster id for the current token or environment."""
220
+ return os.environ.get('SINGLESTOREDB_CLUSTER') or None
221
+
222
+
223
+ def get_workspace_id() -> Optional[str]:
224
+ """Return the workspace id for the current token or environment."""
225
+ return os.environ.get('SINGLESTOREDB_WORKSPACE') or None
226
+
227
+
228
+ def get_virtual_workspace_id() -> Optional[str]:
229
+ """Return the virtual workspace id for the current token or environment."""
230
+ return os.environ.get('SINGLESTOREDB_VIRTUAL_WORKSPACE') or None
231
+
232
+
233
+ def get_database_name() -> Optional[str]:
234
+ """Return the default database name for the current token or environment."""
235
+ return os.environ.get('SINGLESTOREDB_DEFAULT_DATABASE') or None
236
+
237
+
218
238
  def enable_http_tracing() -> None:
219
239
  """Enable tracing of HTTP requests."""
220
240
  import logging
@@ -246,7 +266,33 @@ def to_datetime(
246
266
  out = converters.datetime_fromisoformat(obj)
247
267
  if isinstance(out, str):
248
268
  return None
249
- if isinstance(out, datetime.date):
269
+ if isinstance(out, datetime.date) and not isinstance(out, datetime.datetime):
270
+ return datetime.datetime(out.year, out.month, out.day)
271
+ return out
272
+
273
+
274
+ def to_datetime_strict(
275
+ obj: Optional[Union[str, datetime.datetime]],
276
+ ) -> datetime.datetime:
277
+ """Convert string to datetime."""
278
+ if not obj:
279
+ raise TypeError('not possible to convert None to datetime')
280
+ if isinstance(obj, datetime.datetime):
281
+ return obj
282
+ if obj == '0001-01-01T00:00:00Z':
283
+ raise ValueError('not possible to convert 0001-01-01T00:00:00Z to datetime')
284
+ obj = obj.replace('Z', '')
285
+ # Fix datetimes with truncated zeros
286
+ if '.' in obj:
287
+ obj, micros = obj.split('.', 1)
288
+ micros = micros + '0' * (6 - len(micros))
289
+ obj = obj + '.' + micros
290
+ out = converters.datetime_fromisoformat(obj)
291
+ if not out:
292
+ raise TypeError('not possible to convert None to datetime')
293
+ if isinstance(out, str):
294
+ raise ValueError('value cannot be str')
295
+ if isinstance(out, datetime.date) and not isinstance(out, datetime.datetime):
250
296
  return datetime.datetime(out.year, out.month, out.day)
251
297
  return out
252
298
 
@@ -91,7 +91,7 @@ class TestFusion(unittest.TestCase):
91
91
 
92
92
 
93
93
  @pytest.mark.management
94
- class TestManagementAPIFusion(unittest.TestCase):
94
+ class TestWorkspaceFusion(unittest.TestCase):
95
95
 
96
96
  id: str = secrets.token_hex(8)
97
97
  dbname: str = ''
@@ -463,3 +463,252 @@ class TestManagementAPIFusion(unittest.TestCase):
463
463
  mgr.workspace_groups[wg_name].terminate(force=True)
464
464
  except Exception:
465
465
  pass
466
+
467
+
468
+ @pytest.mark.management
469
+ class TestJobsFusion(unittest.TestCase):
470
+
471
+ id: str = secrets.token_hex(8)
472
+ notebook_name: str = 'Scheduling Test.ipynb'
473
+ dbname: str = ''
474
+ dbexisted: bool = False
475
+ manager: None
476
+ workspace_group: None
477
+ workspace: None
478
+ job_ids = []
479
+
480
+ @classmethod
481
+ def setUpClass(cls):
482
+ sql_file = os.path.join(os.path.dirname(__file__), 'test.sql')
483
+ cls.dbname, cls.dbexisted = utils.load_sql(sql_file)
484
+ cls.manager = s2.manage_workspaces()
485
+ us_regions = [x for x in cls.manager.regions if x.name.startswith('US')]
486
+ cls.workspace_group = cls.manager.create_workspace_group(
487
+ f'Jobs Fusion Testing {cls.id}',
488
+ region=random.choice(us_regions),
489
+ firewall_ranges=[],
490
+ )
491
+ cls.workspace = cls.workspace_group.create_workspace(
492
+ f'jobs-test-{cls.id}',
493
+ wait_on_active=True,
494
+ )
495
+ os.environ['SINGLESTOREDB_DEFAULT_DATABASE'] = cls.dbname
496
+ os.environ['SINGLESTOREDB_WORKSPACE'] = cls.workspace.id
497
+
498
+ @classmethod
499
+ def tearDownClass(cls):
500
+ for job_id in cls.job_ids:
501
+ cls.manager.organizations.current.jobs.delete(job_id)
502
+ if cls.workspace_group is not None:
503
+ cls.workspace_group.terminate(force=True)
504
+ cls.manager = None
505
+ cls.workspace_group = None
506
+ cls.workspace = None
507
+ if os.environ.get('SINGLESTOREDB_WORKSPACE', None) is not None:
508
+ del os.environ['SINGLESTOREDB_WORKSPACE']
509
+ if os.environ.get('SINGLESTOREDB_DEFAULT_DATABASE', None) is not None:
510
+ del os.environ['SINGLESTOREDB_DEFAULT_DATABASE']
511
+
512
+ def setUp(self):
513
+ self.enabled = os.environ.get('SINGLESTOREDB_FUSION_ENABLED')
514
+ os.environ['SINGLESTOREDB_FUSION_ENABLED'] = '1'
515
+ self.conn = s2.connect(database=type(self).dbname, local_infile=True)
516
+ self.cur = self.conn.cursor()
517
+
518
+ def tearDown(self):
519
+ if self.enabled:
520
+ os.environ['SINGLESTOREDB_FUSION_ENABLED'] = self.enabled
521
+ else:
522
+ del os.environ['SINGLESTOREDB_FUSION_ENABLED']
523
+
524
+ try:
525
+ if self.cur is not None:
526
+ self.cur.close()
527
+ except Exception:
528
+ # traceback.print_exc()
529
+ pass
530
+
531
+ try:
532
+ if self.conn is not None:
533
+ self.conn.close()
534
+ except Exception:
535
+ # traceback.print_exc()
536
+ pass
537
+
538
+ def test_schedule_drop_job(self):
539
+ # schedule recurring job
540
+ self.cur.execute(
541
+ f'schedule job using notebook "{self.notebook_name}" '
542
+ 'with mode "recurring" '
543
+ 'execute every 5 minutes '
544
+ 'with name "recurring-job" '
545
+ 'create snapshot '
546
+ 'resume target '
547
+ 'with runtime "notebooks-cpu-small" '
548
+ 'with parameters '
549
+ '{"strParam": "string", "intParam": 1, '
550
+ '"floatParam": 1.0, "boolParam": true}',
551
+ )
552
+ out = list(self.cur)
553
+ job_id = out[0][0]
554
+ self.job_ids.append(job_id)
555
+ desc = self.cur.description
556
+ assert len(desc) == 1
557
+ assert desc[0][0] == 'JobID'
558
+ assert len(out) == 1
559
+ assert out[0][0] == job_id
560
+
561
+ # drop job
562
+ self.cur.execute(f'drop jobs {job_id}')
563
+ out = list(self.cur)
564
+ desc = self.cur.description
565
+ assert len(desc) == 2
566
+ assert [x[0] for x in desc] == [
567
+ 'JobID', 'Success',
568
+ ]
569
+ assert len(out) == 1
570
+ res = out[0]
571
+ assert res[0] == job_id
572
+ assert res[1] == 1
573
+
574
+ def test_run_wait_drop_job(self):
575
+ # run job
576
+ self.cur.execute(
577
+ f'run job using notebook "{self.notebook_name}" '
578
+ 'with runtime "notebooks-cpu-small" '
579
+ 'with parameters '
580
+ '{"strParam": "string", "intParam": 1, '
581
+ '"floatParam": 1.0, "boolParam": true}',
582
+ )
583
+ out = list(self.cur)
584
+ job_id = out[0][0]
585
+ self.job_ids.append(job_id)
586
+ desc = self.cur.description
587
+ assert len(desc) == 1
588
+ assert desc[0][0] == 'JobID'
589
+ assert len(out) == 1
590
+ assert out[0][0] == job_id
591
+
592
+ # wait on job
593
+ self.cur.execute(f'wait on jobs {job_id}')
594
+ out = list(self.cur)
595
+ desc = self.cur.description
596
+ assert len(desc) == 1
597
+ assert desc[0][0] == 'Success'
598
+ assert out[0][0] == 1
599
+
600
+ # drop job
601
+ self.cur.execute(f'drop jobs {job_id}')
602
+ out = list(self.cur)
603
+ desc = self.cur.description
604
+ assert len(desc) == 2
605
+ assert [x[0] for x in desc] == [
606
+ 'JobID', 'Success',
607
+ ]
608
+ assert len(out) == 1
609
+ res = out[0]
610
+ assert res[0] == job_id
611
+ assert res[1] == 1
612
+
613
+ def test_show_jobs_and_executions(self):
614
+ # schedule recurring job
615
+ self.cur.execute(
616
+ f'schedule job using notebook "{self.notebook_name}" '
617
+ 'with mode "recurring" '
618
+ 'execute every 5 minutes '
619
+ 'with name "show-job" '
620
+ 'with runtime "notebooks-cpu-small" '
621
+ 'with parameters '
622
+ '{"strParam": "string", "intParam": 1, '
623
+ '"floatParam": 1.0, "boolParam": true}',
624
+ )
625
+ out = list(self.cur)
626
+ job_id = out[0][0]
627
+ self.job_ids.append(job_id)
628
+ desc = self.cur.description
629
+ assert len(desc) == 1
630
+ assert desc[0][0] == 'JobID'
631
+ assert len(out) == 1
632
+ assert out[0][0] == job_id
633
+
634
+ # show jobs with name like "show-job"
635
+ self.cur.execute(f'show jobs {job_id} like "show-job"')
636
+ out = list(self.cur)
637
+ desc = self.cur.description
638
+ assert len(desc) == 9
639
+ assert [x[0] for x in desc] == [
640
+ 'JobID', 'Name', 'CreatedAt', 'EnqueuedBy',
641
+ 'CompletedExecutions', 'NotebookPath', 'DatabaseName', 'TargetID',
642
+ 'TargetType',
643
+ ]
644
+ assert len(out) == 1
645
+ job = out[0]
646
+ assert job[0] == job_id
647
+ assert job[1] == 'show-job'
648
+ assert job[5] == self.notebook_name
649
+ assert job[6] == self.dbname
650
+ assert job[7] == self.workspace.id
651
+ assert job[8] == 'Workspace'
652
+
653
+ # show jobs with name like "show-job" extended
654
+ self.cur.execute(f'show jobs {job_id} like "show-job" extended')
655
+ out = list(self.cur)
656
+ desc = self.cur.description
657
+ assert len(desc) == 17
658
+ assert [x[0] for x in desc] == [
659
+ 'JobID', 'Name', 'CreatedAt', 'EnqueuedBy',
660
+ 'CompletedExecutions', 'NotebookPath', 'DatabaseName', 'TargetID',
661
+ 'TargetType', 'Description', 'TerminatedAt', 'CreateSnapshot',
662
+ 'MaxDurationInMins', 'ExecutionIntervalInMins', 'Mode', 'StartAt',
663
+ 'ResumeTarget',
664
+ ]
665
+ assert len(out) == 1
666
+ job = out[0]
667
+ assert job[0] == job_id
668
+ assert job[1] == 'show-job'
669
+ assert job[5] == self.notebook_name
670
+ assert job[6] == self.dbname
671
+ assert job[7] == self.workspace.id
672
+ assert job[8] == 'Workspace'
673
+ assert not job[11]
674
+ assert job[13] == 5
675
+ assert job[14] == 'Recurring'
676
+ assert not job[16]
677
+
678
+ # show executions for job with id job_id from 1 to 5
679
+ self.cur.execute(f'show job executions for {job_id} from 1 to 5')
680
+ out = list(self.cur)
681
+ desc = self.cur.description
682
+ assert len(desc) == 7
683
+ assert [x[0] for x in desc] == [
684
+ 'ExecutionID', 'ExecutionNumber', 'JobID',
685
+ 'Status', 'ScheduledStartTime', 'StartedAt', 'FinishedAt',
686
+ ]
687
+ exec_job_ids = [x[2] for x in out]
688
+ assert [x for x in exec_job_ids] == [job_id]
689
+
690
+ # show executions for job with id job_id from 1 to 5 extended
691
+ self.cur.execute(f'show job executions for {job_id} from 1 to 5 extended')
692
+ out = list(self.cur)
693
+ desc = self.cur.description
694
+ assert len(desc) == 8
695
+ assert [x[0] for x in desc] == [
696
+ 'ExecutionID', 'ExecutionNumber', 'JobID',
697
+ 'Status', 'ScheduledStartTime', 'StartedAt', 'FinishedAt',
698
+ 'SnapshotNotebookPath',
699
+ ]
700
+ exec_job_ids = [x[2] for x in out]
701
+ assert [x for x in exec_job_ids] == [job_id]
702
+
703
+ # drop job
704
+ self.cur.execute(f'drop jobs {job_id}')
705
+ out = list(self.cur)
706
+ desc = self.cur.description
707
+ assert len(desc) == 2
708
+ assert [x[0] for x in desc] == [
709
+ 'JobID', 'Success',
710
+ ]
711
+ assert len(out) == 1
712
+ res = out[0]
713
+ assert res[0] == job_id
714
+ assert res[1] == 1
@@ -11,6 +11,8 @@ import unittest
11
11
  import pytest
12
12
 
13
13
  import singlestoredb as s2
14
+ from singlestoredb.management.job import Status
15
+ from singlestoredb.management.job import TargetType
14
16
 
15
17
 
16
18
  TEST_DIR = pathlib.Path(os.path.dirname(__file__))
@@ -876,3 +878,153 @@ class TestSecrets(unittest.TestCase):
876
878
 
877
879
  assert secret.name == 'secret_name'
878
880
  assert secret.value == 'secret_value'
881
+
882
+
883
+ @pytest.mark.management
884
+ class TestJob(unittest.TestCase):
885
+
886
+ manager = None
887
+ workspace_group = None
888
+ workspace = None
889
+ password = None
890
+ job_ids = []
891
+
892
+ @classmethod
893
+ def setUpClass(cls):
894
+ cls.manager = s2.manage_workspaces()
895
+
896
+ us_regions = [x for x in cls.manager.regions if 'US' in x.name]
897
+ cls.password = secrets.token_urlsafe(20)
898
+
899
+ name = clean_name(secrets.token_urlsafe(20)[:20])
900
+
901
+ cls.workspace_group = cls.manager.create_workspace_group(
902
+ f'wg-test-{name}',
903
+ region=random.choice(us_regions).id,
904
+ admin_password=cls.password,
905
+ firewall_ranges=['0.0.0.0/0'],
906
+ )
907
+
908
+ try:
909
+ cls.workspace = cls.workspace_group.create_workspace(
910
+ f'ws-test-{name}-x',
911
+ wait_on_active=True,
912
+ )
913
+ except Exception:
914
+ cls.workspace_group.terminate(force=True)
915
+ raise
916
+
917
+ @classmethod
918
+ def tearDownClass(cls):
919
+ for job_id in cls.job_ids:
920
+ cls.manager.organizations.current.jobs.delete(job_id)
921
+ if cls.workspace_group is not None:
922
+ cls.workspace_group.terminate(force=True)
923
+ cls.workspace_group = None
924
+ cls.workspace = None
925
+ cls.manager = None
926
+ cls.password = None
927
+ if os.environ.get('SINGLESTOREDB_WORKSPACE', None) is not None:
928
+ del os.environ['SINGLESTOREDB_WORKSPACE']
929
+ if os.environ.get('SINGLESTOREDB_DEFAULT_DATABASE', None) is not None:
930
+ del os.environ['SINGLESTOREDB_DEFAULT_DATABASE']
931
+
932
+ def test_job_without_database_target(self):
933
+ """
934
+ Creates job without target database on a specific runtime
935
+ Waits for job to finish
936
+ Gets the job
937
+ Deletes the job
938
+ """
939
+ if os.environ.get('SINGLESTOREDB_WORKSPACE', None) is not None:
940
+ del os.environ['SINGLESTOREDB_WORKSPACE']
941
+ if os.environ.get('SINGLESTOREDB_DEFAULT_DATABASE', None) is not None:
942
+ del os.environ['SINGLESTOREDB_DEFAULT_DATABASE']
943
+
944
+ job_manager = self.manager.organizations.current.jobs
945
+ job = job_manager.run(
946
+ 'Scheduling Test.ipynb',
947
+ 'notebooks-cpu-small',
948
+ {'strParam': 'string', 'intParam': 1, 'floatParam': 1.0, 'boolParam': True},
949
+ )
950
+ self.job_ids.append(job.job_id)
951
+ assert job.execution_config.notebook_path == 'Scheduling Test.ipynb'
952
+ assert job.schedule.mode == job_manager.modes().ONCE
953
+ assert not job.execution_config.create_snapshot
954
+ assert job.completed_executions_count == 0
955
+ assert job.name is None
956
+ assert job.description is None
957
+ assert job.job_metadata == []
958
+ assert job.terminated_at is None
959
+ assert job.target_config is None
960
+ job.wait()
961
+ job = job_manager.get(job.job_id)
962
+ assert job.execution_config.notebook_path == 'Scheduling Test.ipynb'
963
+ assert job.schedule.mode == job_manager.modes().ONCE
964
+ assert not job.execution_config.create_snapshot
965
+ assert job.completed_executions_count == 1
966
+ assert job.name is None
967
+ assert job.description is None
968
+ assert job.job_metadata != []
969
+ assert len(job.job_metadata) == 1
970
+ assert job.job_metadata[0].count == 1
971
+ assert job.job_metadata[0].status == Status.COMPLETED
972
+ assert job.terminated_at is None
973
+ assert job.target_config is None
974
+ deleted = job.delete()
975
+ assert deleted
976
+ job = job_manager.get(job.job_id)
977
+ assert job.terminated_at is not None
978
+
979
+ def test_job_with_database_target(self):
980
+ """
981
+ Creates job with target database on a specific runtime
982
+ Waits for job to finish
983
+ Gets the job
984
+ Deletes the job
985
+ """
986
+ os.environ['SINGLESTOREDB_DEFAULT_DATABASE'] = 'information_schema'
987
+ os.environ['SINGLESTOREDB_WORKSPACE'] = self.workspace.id
988
+
989
+ job_manager = self.manager.organizations.current.jobs
990
+ job = job_manager.run(
991
+ 'Scheduling Test.ipynb',
992
+ 'notebooks-cpu-small',
993
+ {'strParam': 'string', 'intParam': 1, 'floatParam': 1.0, 'boolParam': True},
994
+ )
995
+ self.job_ids.append(job.job_id)
996
+ assert job.execution_config.notebook_path == 'Scheduling Test.ipynb'
997
+ assert job.schedule.mode == job_manager.modes().ONCE
998
+ assert not job.execution_config.create_snapshot
999
+ assert job.completed_executions_count == 0
1000
+ assert job.name is None
1001
+ assert job.description is None
1002
+ assert job.job_metadata == []
1003
+ assert job.terminated_at is None
1004
+ assert job.target_config is not None
1005
+ assert job.target_config.database_name == 'information_schema'
1006
+ assert job.target_config.target_id == self.workspace.id
1007
+ assert job.target_config.target_type == TargetType.WORKSPACE
1008
+ assert not job.target_config.resume_target
1009
+ job.wait()
1010
+ job = job_manager.get(job.job_id)
1011
+ assert job.execution_config.notebook_path == 'Scheduling Test.ipynb'
1012
+ assert job.schedule.mode == job_manager.modes().ONCE
1013
+ assert not job.execution_config.create_snapshot
1014
+ assert job.completed_executions_count == 1
1015
+ assert job.name is None
1016
+ assert job.description is None
1017
+ assert job.job_metadata != []
1018
+ assert len(job.job_metadata) == 1
1019
+ assert job.job_metadata[0].count == 1
1020
+ assert job.job_metadata[0].status == Status.COMPLETED
1021
+ assert job.terminated_at is None
1022
+ assert job.target_config is not None
1023
+ assert job.target_config.database_name == 'information_schema'
1024
+ assert job.target_config.target_id == self.workspace.id
1025
+ assert job.target_config.target_type == TargetType.WORKSPACE
1026
+ assert not job.target_config.resume_target
1027
+ deleted = job.delete()
1028
+ assert deleted
1029
+ job = job_manager.get(job.job_id)
1030
+ assert job.terminated_at is not None
@@ -73,6 +73,13 @@ def load_sql(sql_file: str) -> str:
73
73
  with open(sql_file, 'r') as infile:
74
74
  with s2.connect(**args) as conn:
75
75
  with conn.cursor() as cur:
76
+ try:
77
+ cur.execute('SET GLOBAL default_partitions_per_leaf=2')
78
+ cur.execute('SET GLOBAL log_file_size_partitions=1048576')
79
+ cur.execute('SET GLOBAL log_file_size_ref_dbs=1048576')
80
+ except s2.OperationalError:
81
+ pass
82
+
76
83
  if not dbname:
77
84
  dbname = 'TEST_{}'.format(uuid.uuid4()).replace('-', '_')
78
85
  cur.execute(f'CREATE DATABASE {dbname};')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: singlestoredb
3
- Version: 1.5.0
3
+ Version: 1.6.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
@@ -1,5 +1,5 @@
1
- _singlestoredb_accel.pyd,sha256=Fe88gHmUq8Dh80VyPCuEbhDxA3ygjCZ8wriiT-AMSY8,59904
2
- singlestoredb/__init__.py,sha256=JmRMLxVTnSEebFN9UCjgzhvHrFwwih57UKmtuWjPCTo,1697
1
+ _singlestoredb_accel.pyd,sha256=_W23xHKHToUfXs9C_tvFPDtfGIgt8LphfqGb6MHPKDM,59904
2
+ singlestoredb/__init__.py,sha256=fX5aeEitOx9asAMYkKhdHWAuhqcTTmKxlD06B_zyn1s,1697
3
3
  singlestoredb/auth.py,sha256=RmYiH0Wlc2RXc4pTlRMysxtBI445ggCIwojWKC_eDLE,7844
4
4
  singlestoredb/config.py,sha256=U2v66Ua0eLWWOcmD9-XfCG-bjqQCHS6iMSejiogXVbw,12491
5
5
  singlestoredb/connection.py,sha256=CvdVyLfR_08ONma1BiwqqjVVSsdXxeHdfpR-zaq0wwc,46765
@@ -23,22 +23,24 @@ singlestoredb/functions/ext/rowdat_1.py,sha256=KYj_y5JWm3_B2-QC47HK-CNOrzujBqGUw
23
23
  singlestoredb/functions/ext/utils.py,sha256=OPMFD-tTCx2Kk9jguQkrTr7e4AgNkt15YsvaT1YSmN8,5480
24
24
  singlestoredb/fusion/__init__.py,sha256=FHWtrg6OJFTf6Ye197V5sU6ssryr2h6FBcDIgXP7-H4,367
25
25
  singlestoredb/fusion/graphql.py,sha256=SHqsPe4xgawdsTPHEtJGQlybYGWqPrGMmyK-v20RLac,5420
26
- singlestoredb/fusion/handler.py,sha256=XjxyMsTaTp1MYqtYCb5rOId4RD1zye9qqFYgCZmWcM0,25808
26
+ singlestoredb/fusion/handler.py,sha256=k6OgdbwFl5T0s8TlShTmlAsMtp2Z53nwXoax_utA6Kw,25995
27
27
  singlestoredb/fusion/registry.py,sha256=_eT1gd38VPlFKs5f9Pu6lqQyoDQ_ixW5O56QwYLQ89Y,6361
28
28
  singlestoredb/fusion/result.py,sha256=EcFY5Qv43ySlQsfl_JB-I3ko7PzVdjuhhoKN96uHSAM,12171
29
29
  singlestoredb/fusion/handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
+ singlestoredb/fusion/handlers/job.py,sha256=h1KWApk5QzmwbqRqLTLfCdXOboM4b0yoOyLVItRCwJc,21767
30
31
  singlestoredb/fusion/handlers/stage.py,sha256=uPqawMvchnpyrPYLhB0joTremCURNYKOvYntFc3zTRU,14133
31
32
  singlestoredb/fusion/handlers/utils.py,sha256=7xWb_1mJzxW0po9iHVY2ZVnRvHIQgOlKZQZ1zllJBjk,5271
32
- singlestoredb/fusion/handlers/workspace.py,sha256=i2DllEVcBEzSKVPp380ezqFT5gcbluhk-OjEo17ejnQ,27323
33
+ singlestoredb/fusion/handlers/workspace.py,sha256=NxoEY5xd5lCQmXiim4nhAYCL0agHo1H_rGPpqa31hiw,28397
33
34
  singlestoredb/http/__init__.py,sha256=4cEDvLloGc3LSpU-PnIwacyu0n5oIIIE6xk2SPyWD_w,939
34
35
  singlestoredb/http/connection.py,sha256=dbMIxT5CeD5ABnXgFwY9fFbW42IXQWUi3ZC6ID7mnPY,40699
35
36
  singlestoredb/management/__init__.py,sha256=pQbsOffl-i6zIzR63MCxSjxPY6TNmy7Kg0BCTExt3mk,244
36
37
  singlestoredb/management/billing_usage.py,sha256=0UHFSPCrN0nyeGFFM-HXS3NP8pYmYo2BCCahDEPXvzg,3883
37
38
  singlestoredb/management/cluster.py,sha256=XfdBuTlrAG-mnW1BFKeoAr4YSE5IVgxLjbuBSpqIySo,14823
39
+ singlestoredb/management/job.py,sha256=Npfe1JLYJlggGBrXLniPKwKUKF1i3alvSY1SFtvauSs,25498
38
40
  singlestoredb/management/manager.py,sha256=uGNrUe3zhuP-HUqdfwvy4MdEXTCmq-FZKjIwZSc3hOM,9096
39
- singlestoredb/management/organization.py,sha256=MjZ_tIoJGZwF95yfQ_Adz8LHYwkrKyj3p5JHDk6rWHE,5187
41
+ singlestoredb/management/organization.py,sha256=JBsNC4R3boUKdYvyCZyfGoVMC1mD6SPuMI1UssBVoOM,5611
40
42
  singlestoredb/management/region.py,sha256=oGoLLS88dE1GmY7GCc0BV7X3f7bWwKQyeXOVBFmK9Pk,1678
41
- singlestoredb/management/utils.py,sha256=uXrKlMnzlHj3qWO2vWCJP9mykUzIfbBxzZNN2vdXCvo,11775
43
+ singlestoredb/management/utils.py,sha256=BP-Wb8Sg16GbdLI_DeBz-3ttMklz6ZjYyMOz-sxElz8,13594
42
44
  singlestoredb/management/workspace.py,sha256=BBNa3Af5IaUAwtzHWrNTJXoc8anXJ7FiWH9yIvtg79Q,63610
43
45
  singlestoredb/mysql/__init__.py,sha256=CbpwzNUJPAmKPpIobC0-ugBta_RgHCMq7X7N75QLReY,4669
44
46
  singlestoredb/mysql/_auth.py,sha256=YaqqyvAHmeraBv3BM207rNveUVPM-mPnW20ts_ynVWg,8341
@@ -96,15 +98,15 @@ singlestoredb/tests/test_dbapi.py,sha256=cNJoTEZvYG7ckcwT7xqlkJX-2TDEYGTDDU1Iguc
96
98
  singlestoredb/tests/test_exceptions.py,sha256=vscMYmdOJr0JmkTAJrNI2w0Q96Nfugjkrt5_lYnw8i0,1176
97
99
  singlestoredb/tests/test_ext_func.py,sha256=gQErR-wAN8BqLNG5U4pNbg4qkQEo6Re8Hd9_Ztqo1RM,38550
98
100
  singlestoredb/tests/test_ext_func_data.py,sha256=9kn8BWmCjkbnP6hSbFhmhcdW4OmVT-GSvBTIzFBLEys,48796
99
- singlestoredb/tests/test_fusion.py,sha256=oFfn7vtdMeTEl02JC74JcQHSA6V1BgzAkioBSnruwPs,15565
101
+ singlestoredb/tests/test_fusion.py,sha256=Jsg6xWqeDXyTD2BMc3PTSorf_bc4uqLMnHNgDMZbgtc,24524
100
102
  singlestoredb/tests/test_http.py,sha256=7hwXe61hlUes3nji0MTTZweo94tJAlJ-vA5ct9geXFQ,8868
101
- singlestoredb/tests/test_management.py,sha256=WmgsCCpPQTks8WyeD6ZO5ID0B_3GKZphW8I2EeSVAGU,29101
103
+ singlestoredb/tests/test_management.py,sha256=B4NkK7J0luuS7T-7OR5qzu-v8gkViIiXie-58bHQIDQ,35334
102
104
  singlestoredb/tests/test_plugin.py,sha256=P1nXLnTafaHkHN-6bVbGryxTu7OWJPU9SYFZ_WQUwq8,845
103
105
  singlestoredb/tests/test_results.py,sha256=Zg1ynZFRZqalAMfNLOU5C6BDXaox6JxrKm_XZwVNFcg,6753
104
106
  singlestoredb/tests/test_types.py,sha256=YeVE6KPqlqzJke-4hbRmc8ko1E7RLHu5S8qLg04Bl5Y,4632
105
107
  singlestoredb/tests/test_udf.py,sha256=pac1Qp1JPcUgXB1-xBBMRCqWD17IBWMQ8TFe6LE3iLo,28762
106
108
  singlestoredb/tests/test_xdict.py,sha256=5ArRJqd5aNXkPK7Y6sFeRbqZ59MZ1YaGBpSlDAbBrjM,10741
107
- singlestoredb/tests/utils.py,sha256=1ZliGv1gqkKEzb9OhRSxTaWg7md_Z4htIxTMiOjyHj0,4807
109
+ singlestoredb/tests/utils.py,sha256=WR8GFNiC0lU4tz21Y3rlbbp9Gz9WcSwp2jpUSCj7RFU,5136
108
110
  singlestoredb/tests/ext_funcs/__init__.py,sha256=mKa-vOh5D8M03kgKTQyvOB74X-Of0nl-mcmJBFzRW0c,9675
109
111
  singlestoredb/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
110
112
  singlestoredb/utils/config.py,sha256=WVQ567ZzqzlTGueQH5fEpm5tPZuz8y7qvpEQUB-vPjk,25453
@@ -115,9 +117,9 @@ singlestoredb/utils/events.py,sha256=rC9cHAetua_E1f-EiFkFM-gJzQSQIH5Uk-4sspC3KjI
115
117
  singlestoredb/utils/mogrify.py,sha256=gCcn99-vgsGVjTUV7RHJ6hH4vCNrsGB_Xo4z8kiSPDQ,4201
116
118
  singlestoredb/utils/results.py,sha256=wR70LhCqlobniZf52r67zYLBOKjWHQm68NAskdRQND8,15862
117
119
  singlestoredb/utils/xdict.py,sha256=-wi1lSPTnY99fhVMBhPKJ8cCsQhNG4GMUfkEBDKYgCw,13321
118
- singlestoredb-1.5.0.dist-info/LICENSE,sha256=Bojenzui8aPNjlF3w4ojguDP7sTf8vFV_9Gc2UAG1sg,11542
119
- singlestoredb-1.5.0.dist-info/METADATA,sha256=bENk-7v217z-lq59jAreazeMlGOaNo59QyWDIammDvo,5710
120
- singlestoredb-1.5.0.dist-info/WHEEL,sha256=c4k7z5HB0t-y0nBCv6KyJ6KCjn8SEGPddD0lhaPtU3E,96
121
- singlestoredb-1.5.0.dist-info/entry_points.txt,sha256=bSLaTWB5zGjpVYPAaI46MkkDup0su-eb3uAhCNYuRV0,48
122
- singlestoredb-1.5.0.dist-info/top_level.txt,sha256=SDtemIXf-Kp-_F2f_S6x0db33cHGOILdAEsIQZe2LZc,35
123
- singlestoredb-1.5.0.dist-info/RECORD,,
120
+ singlestoredb-1.6.0.dist-info/LICENSE,sha256=Bojenzui8aPNjlF3w4ojguDP7sTf8vFV_9Gc2UAG1sg,11542
121
+ singlestoredb-1.6.0.dist-info/METADATA,sha256=JSyhaRFOlUsZcFG57aOLOe1RueAFZnepTbRk4tFNExs,5710
122
+ singlestoredb-1.6.0.dist-info/WHEEL,sha256=c4k7z5HB0t-y0nBCv6KyJ6KCjn8SEGPddD0lhaPtU3E,96
123
+ singlestoredb-1.6.0.dist-info/entry_points.txt,sha256=bSLaTWB5zGjpVYPAaI46MkkDup0su-eb3uAhCNYuRV0,48
124
+ singlestoredb-1.6.0.dist-info/top_level.txt,sha256=SDtemIXf-Kp-_F2f_S6x0db33cHGOILdAEsIQZe2LZc,35
125
+ singlestoredb-1.6.0.dist-info/RECORD,,