11#!/usr/bin/env python
22"""SingleStoreDB Base Manager."""
33import os
4+ import re
45import sys
56import time
7+ from copy import deepcopy
68from typing import Any
79from typing import Dict
810from typing import List
@@ -42,9 +44,6 @@ def is_jwt(token: str) -> bool:
4244class 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