1
1
#!/usr/bin/env python
2
2
"""SingleStoreDB Base Manager."""
3
3
import os
4
+ import re
4
5
import sys
5
6
import time
7
+ from copy import deepcopy
6
8
from typing import Any
7
9
from typing import Dict
8
10
from typing import List
@@ -42,9 +44,6 @@ def is_jwt(token: str) -> bool:
42
44
class Manager (object ):
43
45
"""SingleStoreDB manager base class."""
44
46
45
- #: Management API version if none is specified.
46
- default_version = config .get_option ('management.version' ) or 'v1'
47
-
48
47
#: Base URL if none is specified.
49
48
default_base_url = config .get_option ('management.base_url' ) \
50
49
or 'https://api.singlestore.com'
@@ -53,7 +52,7 @@ class Manager(object):
53
52
obj_type = ''
54
53
55
54
def __init__ (
56
- self , access_token : Optional [str ] = None , version : Optional [str ] = None ,
55
+ self , access_token : Optional [str ] = None , version : Optional [str ] = 'v1' ,
57
56
base_url : Optional [str ] = None , * , organization_id : Optional [str ] = None ,
58
57
):
59
58
from .. import __version__ as client_version
@@ -72,17 +71,37 @@ def __init__(
72
71
'User-Agent' : f'SingleStoreDB-Python/{ client_version } ' ,
73
72
})
74
73
75
- self ._base_url = urljoin (
74
+ self ._base_url = '' . join ([
76
75
base_url
77
76
or config .get_option ('management.base_url' )
78
77
or type (self ).default_base_url ,
79
- version or type (self ).default_version ,
80
- ) + '/'
81
-
78
+ '/' ,
79
+ ])
80
+ self ._version = version
81
+ self ._access_token = new_access_token
82
82
self ._params : Dict [str , str ] = {}
83
83
if organization_id :
84
84
self ._params ['organizationID' ] = organization_id
85
85
86
+ def copy (self ) -> 'Manager' :
87
+ """Create a new instance with the same settings."""
88
+ new_manager = type (self ).__new__ (type (self ))
89
+ new_manager ._is_jwt = self ._is_jwt
90
+ new_manager ._sess = deepcopy (self ._sess )
91
+ new_manager ._base_url = self ._base_url
92
+ new_manager ._version = self ._version
93
+ new_manager ._access_token = self ._access_token
94
+ new_manager ._params = deepcopy (self ._params )
95
+ return new_manager
96
+
97
+ def __getattr__ (self , name : str ) -> Any :
98
+ """Handle dynamic version attributes (v2, v3, etc.)."""
99
+ if re .match (r'^v\d+[0-9a-z]*$' , name ):
100
+ new_mgr = self .copy ()
101
+ new_mgr ._version = name
102
+ return new_mgr
103
+ return super ().__getattribute__ (name )
104
+
86
105
def _check (
87
106
self , res : requests .Response , url : str , params : Dict [str , Any ],
88
107
) -> requests .Response :
@@ -125,8 +144,12 @@ def _doit(
125
144
# Refresh the JWT as needed
126
145
if self ._is_jwt :
127
146
self ._sess .headers .update ({'Authorization' : f'Bearer { get_token ()} ' })
147
+
148
+ # Combine version and path
149
+ versioned_path = f'{ self ._version } /{ path } '
150
+
128
151
return getattr (self ._sess , method .lower ())(
129
- urljoin (self ._base_url , path ), * args , ** kwargs ,
152
+ urljoin (self ._base_url , versioned_path ), * args , ** kwargs ,
130
153
)
131
154
132
155
def _get (self , path : str , * args : Any , ** kwargs : Any ) -> requests .Response :
@@ -300,3 +323,8 @@ def _wait_on_state(
300
323
out = getattr (self , f'get_{ self .obj_type } ' )(out .id )
301
324
302
325
return out
326
+
327
+
328
+ class ManagerV2 (Manager ):
329
+ """V2 API implementation."""
330
+ default_version = 'v2'
0 commit comments