Skip to content

Commit b473889

Browse files
committed
manager v2
1 parent 89c8e93 commit b473889

File tree

1 file changed

+37
-9
lines changed

1 file changed

+37
-9
lines changed

singlestoredb/management/manager.py

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
#!/usr/bin/env python
22
"""SingleStoreDB Base Manager."""
33
import os
4+
import re
45
import sys
56
import time
7+
from copy import deepcopy
68
from typing import Any
79
from typing import Dict
810
from typing import List
@@ -42,9 +44,6 @@ def is_jwt(token: str) -> bool:
4244
class Manager(object):
4345
"""SingleStoreDB manager base class."""
4446

45-
#: Management API version if none is specified.
46-
default_version = config.get_option('management.version') or 'v1'
47-
4847
#: Base URL if none is specified.
4948
default_base_url = config.get_option('management.base_url') \
5049
or 'https://api.singlestore.com'
@@ -53,7 +52,7 @@ class Manager(object):
5352
obj_type = ''
5453

5554
def __init__(
56-
self, access_token: Optional[str] = None, version: Optional[str] = None,
55+
self, access_token: Optional[str] = None, version: Optional[str] = 'v1',
5756
base_url: Optional[str] = None, *, organization_id: Optional[str] = None,
5857
):
5958
from .. import __version__ as client_version
@@ -72,17 +71,37 @@ def __init__(
7271
'User-Agent': f'SingleStoreDB-Python/{client_version}',
7372
})
7473

75-
self._base_url = urljoin(
74+
self._base_url = ''.join([
7675
base_url
7776
or config.get_option('management.base_url')
7877
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
8282
self._params: Dict[str, str] = {}
8383
if organization_id:
8484
self._params['organizationID'] = organization_id
8585

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+
86105
def _check(
87106
self, res: requests.Response, url: str, params: Dict[str, Any],
88107
) -> requests.Response:
@@ -125,8 +144,12 @@ def _doit(
125144
# Refresh the JWT as needed
126145
if self._is_jwt:
127146
self._sess.headers.update({'Authorization': f'Bearer {get_token()}'})
147+
148+
# Combine version and path
149+
versioned_path = f'{self._version}/{path}'
150+
128151
return getattr(self._sess, method.lower())(
129-
urljoin(self._base_url, path), *args, **kwargs,
152+
urljoin(self._base_url, versioned_path), *args, **kwargs,
130153
)
131154

132155
def _get(self, path: str, *args: Any, **kwargs: Any) -> requests.Response:
@@ -300,3 +323,8 @@ def _wait_on_state(
300323
out = getattr(self, f'get_{self.obj_type}')(out.id)
301324

302325
return out
326+
327+
328+
class ManagerV2(Manager):
329+
"""V2 API implementation."""
330+
default_version = 'v2'

0 commit comments

Comments
 (0)