1
1
from typing import Union , Optional
2
- from dataclasses import InitVar
2
+ from dataclasses import asdict , InitVar
3
3
from pathlib import Path
4
4
from 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
+
5
123
6
124
def jdbc_properties () -> tuple :
7
125
return ('host' , 'port' , 'user' , 'password' , 'database' , 'dsn' , 'jar' , 'classpath' )
@@ -20,7 +138,7 @@ class jdbcDriver(BaseModel):
20
138
jar : Union [list , str ] = Field (Required = True )
21
139
classpath : Path = Field (Required = False )
22
140
required_properties : Optional [Union [list , tuple ]] = Field (
23
- repr = False , default = jdbc_properties ()
141
+ repr = False , default = jdbc_properties (), default_factory = tuple
24
142
)
25
143
26
144
def __post_init__ (self , username , * args , ** kwargs ):
@@ -53,9 +171,21 @@ def params(self) -> dict:
53
171
jar = '/Users/jlara/.m2/repository/com/oracle/ojdbc/ojdbc8/' ,
54
172
classpath = '/Users/jlara/.m2/repository/com/oracle/ojdbc/ojdbc8/ojdbc8-'
55
173
)
174
+ print ('JDBC > ' , jdbc_default )
56
175
except ValueError :
57
176
jdbc_default = None
58
177
except Exception as e :
59
178
print ('ERROR > ' , e , type (e ))
60
179
print ('PAYLOAD > ' , e .payload )
61
180
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