11from typing import Union , Optional
2- from dataclasses import InitVar
2+ from dataclasses import asdict , InitVar
33from pathlib import Path
44from datamodel import BaseModel , Field
5+ from datamodel .exceptions import ValidationError
6+
7+
8+ def default_properties () -> tuple :
9+ return ('host' , 'port' , 'user' , 'username' , 'password' )
10+
11+ class BaseDriver (BaseModel ):
12+ """BaseDriver.
13+
14+ Description: Base class for all required datasources.
15+ """
16+ driver : str = Field (required = True , primary_key = True )
17+ driver_type : str = Field (
18+ required = True ,
19+ default = 'asyncdb' ,
20+ comment = "type of driver, can be asyncdb, qs or REST"
21+ )
22+ name : str = Field (required = False , comment = 'Datasource name, default to driver.' )
23+ description : str = Field (comment = 'Datasource Description' , repr = False )
24+ icon : str = Field (required = False , comment = 'Icon Path for Datasource.' , repr = False )
25+ dsn : str = Field (default = None )
26+ dsn_format : str = Field (required = False , default = None , repr = False )
27+ user : InitVar = Field (default = '' )
28+ username : str = Field (default = '' )
29+ password : str = Field (required = False , default = None , repr = False , is_secret = True )
30+ auth : dict = Field (required = False , default_factory = dict )
31+ required_properties : Optional [tuple ] = Field (
32+ repr = False ,
33+ default = default_properties (),
34+ default_factory = tuple
35+ )
36+
37+ def __post_init__ (self , user , ** kwargs ) -> None : # pylint: disable=W0613,W0221
38+ if not self .name :
39+ self .name = self .driver
40+ if user :
41+ self .username = user
42+ self .auth = {
43+ "username" : self .username ,
44+ "password" : self .password
45+ }
46+ # set DSN (if needed)
47+ if self .dsn_format is not None and self .dsn is None :
48+ self .create_dsn ()
49+ super (BaseDriver , self ).__post_init__ ()
50+
51+ def create_dsn (self ) -> str :
52+ """create_dsn.
53+
54+ Description: creates DSN from DSN Format.
55+ Returns:
56+ str: DSN.
57+ """
58+ params = asdict (self )
59+ try :
60+ self .dsn = self .dsn_format .format (** params )
61+ return self .dsn
62+ except (AttributeError , ValueError ):
63+ return None
64+
65+ def get_credentials (self ) -> dict :
66+ """get_credentials.
67+
68+ Description: Returns credentials for Datasource.
69+ Returns:
70+ dict: credentials.
71+ """
72+ return self .params ()
73+
74+ def get_parameters (self ) -> dict :
75+ return {}
76+
77+ @classmethod
78+ def properties (cls ) -> dict :
79+ """properties.
80+
81+ Description: Returns fields related to Drivers Supported.
82+ Returns:
83+ dict: all required fields for Supported Drivers.
84+ """
85+
86+ fields = {}
87+ for field in cls .required_properties :
88+ # because tuple is ordered:
89+ try :
90+ f = cls .column (cls , field )
91+ except KeyError :
92+ continue # Field Missing on Driver:
93+ secret = False
94+ if 'is_secret' in f .metadata :
95+ secret = f .metadata ["is_secret" ]
96+ title = field
97+ if 'title' in f .metadata :
98+ title = f .metadata ['title' ]
99+ required = False
100+ if 'required' in f .metadata :
101+ required = f .metadata ['required' ]
102+ f = {
103+ "name" : field ,
104+ "title" : title ,
105+ "required" : required ,
106+ "is_secret" : secret
107+ }
108+ value = getattr (cls , field )
109+ default = hasattr (f , 'default' )
110+ if not value and default :
111+ value = f .default
112+ if value :
113+ f ["value" ] = value
114+ fields [field ] = f
115+ return {
116+ "driver" : cls .driver ,
117+ "name" : cls .name ,
118+ "icon" : cls .icon ,
119+ "dsn_format" : cls .dsn_format ,
120+ "fields" : fields
121+ }
122+
5123
6124def jdbc_properties () -> tuple :
7125 return ('host' , 'port' , 'user' , 'password' , 'database' , 'dsn' , 'jar' , 'classpath' )
@@ -20,7 +138,7 @@ class jdbcDriver(BaseModel):
20138 jar : Union [list , str ] = Field (Required = True )
21139 classpath : Path = Field (Required = False )
22140 required_properties : Optional [Union [list , tuple ]] = Field (
23- repr = False , default = jdbc_properties ()
141+ repr = False , default = jdbc_properties (), default_factory = tuple
24142 )
25143
26144 def __post_init__ (self , username , * args , ** kwargs ):
@@ -53,9 +171,21 @@ def params(self) -> dict:
53171 jar = '/Users/jlara/.m2/repository/com/oracle/ojdbc/ojdbc8/' ,
54172 classpath = '/Users/jlara/.m2/repository/com/oracle/ojdbc/ojdbc8/ojdbc8-'
55173 )
174+ print ('JDBC > ' , jdbc_default )
56175except ValueError :
57176 jdbc_default = None
58177except Exception as e :
59178 print ('ERROR > ' , e , type (e ))
60179 print ('PAYLOAD > ' , e .payload )
61180 jdbc_default = None
181+
182+ try :
183+ base_driver = BaseDriver (
184+ driver = 'asyncdb' ,
185+ user = 'admin' ,
186+ password = 'admin' ,
187+ name = 'asyncdb_test'
188+ )
189+ print ('BASE DRIVER > ' , base_driver )
190+ except ValidationError as e :
191+ print (e .payload )
0 commit comments