Skip to content

Commit fbfaaa3

Browse files
Merge pull request #229 from skyflowapi/himanshu/2496-update-linting-rules-and-fix-hardcoded-values-in-python-v2-sdk
SK-2496: extract hard coded values to constants
2 parents 49f6b8b + 5eb3da9 commit fbfaaa3

File tree

12 files changed

+753
-443
lines changed

12 files changed

+753
-443
lines changed

ruff.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@ exclude = [
88
"venv",
99
"build",
1010
"dist",
11-
"tests"
11+
"tests",
12+
"samples"
1213
]
1314

1415
line-length = 120
1516

1617
[lint]
17-
select = ["N"]
18+
select = ["N", "PLR2004"]
1819

1920
[lint.pep8-naming]

skyflow/client/skyflow.py

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from skyflow.error import SkyflowError
44
from skyflow.utils import SkyflowMessages
55
from skyflow.utils.logger import log_info, Logger
6+
from skyflow.utils.constants import OptionField
67
from skyflow.utils.validations import validate_vault_config, validate_connection_config, validate_update_vault_config, \
78
validate_update_connection_config, validate_credentials, validate_log_level
89
from skyflow.vault.client.client import VaultClient
@@ -30,7 +31,7 @@ def update_vault_config(self,config):
3031
self.__builder.update_vault_config(config)
3132

3233
def get_vault_config(self, vault_id):
33-
return self.__builder.get_vault_config(vault_id).get("vault_client").get_config()
34+
return self.__builder.get_vault_config(vault_id).get(OptionField.VAULT_CLIENT).get_config()
3435

3536
def add_connection_config(self, config):
3637
self.__builder._Builder__add_connection_config(config)
@@ -45,7 +46,7 @@ def update_connection_config(self, config):
4546
return self
4647

4748
def get_connection_config(self, connection_id):
48-
return self.__builder.get_connection_config(connection_id).get("vault_client").get_config()
49+
return self.__builder.get_connection_config(connection_id).get(OptionField.VAULT_CLIENT).get_config()
4950

5051
def add_skyflow_credentials(self, credentials):
5152
self.__builder._Builder__add_skyflow_credentials(credentials)
@@ -66,15 +67,15 @@ def update_log_level(self, log_level):
6667

6768
def vault(self, vault_id = None) -> Vault:
6869
vault_config = self.__builder.get_vault_config(vault_id)
69-
return vault_config.get("vault_controller")
70+
return vault_config.get(OptionField.VAULT_CONTROLLER)
7071

7172
def connection(self, connection_id = None) -> Connection:
7273
connection_config = self.__builder.get_connection_config(connection_id)
73-
return connection_config.get("controller")
74+
return connection_config.get(OptionField.CONTROLLER)
7475

7576
def detect(self, vault_id = None) -> Detect:
7677
vault_config = self.__builder.get_vault_config(vault_id)
77-
return vault_config.get("detect_controller")
78+
return vault_config.get(OptionField.DETECT_CONTROLLER)
7879

7980
class Builder:
8081
def __init__(self):
@@ -87,13 +88,13 @@ def __init__(self):
8788
self.__logger = Logger(LogLevel.ERROR)
8889

8990
def add_vault_config(self, config):
90-
vault_id = config.get("vault_id")
91+
vault_id = config.get(OptionField.VAULT_ID)
9192
if not isinstance(vault_id, str) or not vault_id:
9293
raise SkyflowError(
9394
SkyflowMessages.Error.INVALID_VAULT_ID.value,
9495
SkyflowMessages.ErrorCodes.INVALID_INPUT.value
9596
)
96-
if vault_id in [vault.get("vault_id") for vault in self.__vault_list]:
97+
if vault_id in [vault.get(OptionField.VAULT_ID) for vault in self.__vault_list]:
9798
log_info(SkyflowMessages.Info.VAULT_CONFIG_EXISTS.value.format(vault_id), self.__logger)
9899
raise SkyflowError(
99100
SkyflowMessages.Error.VAULT_ID_ALREADY_EXISTS.value.format(vault_id),
@@ -112,9 +113,9 @@ def remove_vault_config(self, vault_id):
112113

113114
def update_vault_config(self, config):
114115
validate_update_vault_config(self.__logger, config)
115-
vault_id = config.get("vault_id")
116+
vault_id = config.get(OptionField.VAULT_ID)
116117
vault_config = self.__vault_configs[vault_id]
117-
vault_config.get("vault_client").update_config(config)
118+
vault_config.get(OptionField.VAULT_CLIENT).update_config(config)
118119

119120
def get_vault_config(self, vault_id):
120121
if vault_id is None:
@@ -129,13 +130,13 @@ def get_vault_config(self, vault_id):
129130

130131

131132
def add_connection_config(self, config):
132-
connection_id = config.get("connection_id")
133+
connection_id = config.get(OptionField.CONNECTION_ID)
133134
if not isinstance(connection_id, str) or not connection_id:
134135
raise SkyflowError(
135136
SkyflowMessages.Error.INVALID_CONNECTION_ID.value,
136137
SkyflowMessages.ErrorCodes.INVALID_INPUT.value
137138
)
138-
if connection_id in [connection.get("connection_id") for connection in self.__connection_list]:
139+
if connection_id in [connection.get(OptionField.CONNECTION_ID) for connection in self.__connection_list]:
139140
log_info(SkyflowMessages.Info.CONNECTION_CONFIG_EXISTS.value.format(connection_id), self.__logger)
140141
raise SkyflowError(
141142
SkyflowMessages.Error.CONNECTION_ID_ALREADY_EXISTS.value.format(connection_id),
@@ -153,9 +154,9 @@ def remove_connection_config(self, connection_id):
153154

154155
def update_connection_config(self, config):
155156
validate_update_connection_config(self.__logger, config)
156-
connection_id = config['connection_id']
157+
connection_id = config[OptionField.CONNECTION_ID]
157158
connection_config = self.__connection_configs[connection_id]
158-
connection_config.get("vault_client").update_config(config)
159+
connection_config.get(OptionField.VAULT_CLIENT).update_config(config)
159160

160161
def get_connection_config(self, connection_id):
161162
if connection_id is None:
@@ -183,32 +184,32 @@ def get_logger(self):
183184

184185
def __add_vault_config(self, config):
185186
validate_vault_config(self.__logger, config)
186-
vault_id = config.get("vault_id")
187+
vault_id = config.get(OptionField.VAULT_ID)
187188
vault_client = VaultClient(config)
188189
self.__vault_configs[vault_id] = {
189-
"vault_client": vault_client,
190-
"vault_controller": Vault(vault_client),
191-
"detect_controller": Detect(vault_client)
190+
OptionField.VAULT_CLIENT: vault_client,
191+
OptionField.VAULT_CONTROLLER: Vault(vault_client),
192+
OptionField.DETECT_CONTROLLER: Detect(vault_client)
192193
}
193-
log_info(SkyflowMessages.Info.VAULT_CONTROLLER_INITIALIZED.value.format(config.get("vault_id")), self.__logger)
194-
log_info(SkyflowMessages.Info.DETECT_CONTROLLER_INITIALIZED.value.format(config.get("vault_id")), self.__logger)
194+
log_info(SkyflowMessages.Info.VAULT_CONTROLLER_INITIALIZED.value.format(config.get(OptionField.VAULT_ID)), self.__logger)
195+
log_info(SkyflowMessages.Info.DETECT_CONTROLLER_INITIALIZED.value.format(config.get(OptionField.VAULT_ID)), self.__logger)
195196

196197
def __add_connection_config(self, config):
197198
validate_connection_config(self.__logger, config)
198-
connection_id = config.get("connection_id")
199+
connection_id = config.get(OptionField.CONNECTION_ID)
199200
vault_client = VaultClient(config)
200201
self.__connection_configs[connection_id] = {
201-
"vault_client": vault_client,
202-
"controller": Connection(vault_client)
202+
OptionField.VAULT_CLIENT: vault_client,
203+
OptionField.CONTROLLER: Connection(vault_client)
203204
}
204-
log_info(SkyflowMessages.Info.CONNECTION_CONTROLLER_INITIALIZED.value.format(config.get("connection_id")), self.__logger)
205+
log_info(SkyflowMessages.Info.CONNECTION_CONTROLLER_INITIALIZED.value.format(config.get(OptionField.CONNECTION_ID)), self.__logger)
205206

206207
def __update_vault_client_logger(self, log_level, logger):
207208
for vault_id, vault_config in self.__vault_configs.items():
208-
vault_config.get("vault_client").set_logger(log_level,logger)
209+
vault_config.get(OptionField.VAULT_CLIENT).set_logger(log_level,logger)
209210

210211
for connection_id, connection_config in self.__connection_configs.items():
211-
connection_config.get("vault_client").set_logger(log_level,logger)
212+
connection_config.get(OptionField.VAULT_CLIENT).set_logger(log_level,logger)
212213

213214
def __set_log_level(self, log_level):
214215
validate_log_level(self.__logger, log_level)
@@ -223,10 +224,10 @@ def __add_skyflow_credentials(self, credentials):
223224
self.__skyflow_credentials = credentials
224225
validate_credentials(self.__logger, credentials)
225226
for vault_id, vault_config in self.__vault_configs.items():
226-
vault_config.get("vault_client").set_common_skyflow_credentials(credentials)
227+
vault_config.get(OptionField.VAULT_CLIENT).set_common_skyflow_credentials(credentials)
227228

228229
for connection_id, connection_config in self.__connection_configs.items():
229-
connection_config.get("vault_client").set_common_skyflow_credentials(self.__skyflow_credentials)
230+
connection_config.get(OptionField.VAULT_CLIENT).set_common_skyflow_credentials(self.__skyflow_credentials)
230231
def build(self):
231232
validate_log_level(self.__logger, self.__log_level)
232233
self.__logger.set_log_level(self.__log_level)

skyflow/service_account/_utils.py

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from skyflow.service_account.client.auth_client import AuthClient
77
from skyflow.utils.logger import log_info, log_error_log
88
from skyflow.utils import get_base_url, format_scope, SkyflowMessages
9+
from skyflow.utils.constants import JWT, CredentialField, JwtField, OptionField, ResponseField
910

1011

1112
invalid_input_error_code = SkyflowMessages.ErrorCodes.INVALID_INPUT.value
@@ -17,8 +18,8 @@ def is_expired(token, logger = None):
1718

1819
try:
1920
decoded = jwt.decode(
20-
token, options={"verify_signature": False, "verify_aud": False})
21-
if time.time() >= decoded['exp']:
21+
token, options={OptionField.VERIFY_SIGNATURE: False, OptionField.VERIFY_AUD: False})
22+
if time.time() >= decoded[JwtField.EXP]:
2223
log_info(SkyflowMessages.Info.BEARER_TOKEN_EXPIRED.value, logger)
2324
log_error_log(SkyflowMessages.ErrorLogs.INVALID_BEARER_TOKEN.value)
2425
return True
@@ -59,22 +60,22 @@ def generate_bearer_token_from_creds(credentials, options = None, logger = None)
5960

6061
def get_service_account_token(credentials, options, logger):
6162
try:
62-
private_key = credentials["privateKey"]
63+
private_key = credentials[CredentialField.PRIVATE_KEY]
6364
except:
6465
log_error_log(SkyflowMessages.ErrorLogs.PRIVATE_KEY_IS_REQUIRED.value, logger = logger)
6566
raise SkyflowError(SkyflowMessages.Error.MISSING_PRIVATE_KEY.value, invalid_input_error_code)
6667
try:
67-
client_id = credentials["clientID"]
68+
client_id = credentials[CredentialField.CLIENT_ID]
6869
except:
6970
log_error_log(SkyflowMessages.ErrorLogs.CLIENT_ID_IS_REQUIRED.value, logger=logger)
7071
raise SkyflowError(SkyflowMessages.Error.MISSING_CLIENT_ID.value, invalid_input_error_code)
7172
try:
72-
key_id = credentials["keyID"]
73+
key_id = credentials[CredentialField.KEY_ID]
7374
except:
7475
log_error_log(SkyflowMessages.ErrorLogs.KEY_ID_IS_REQUIRED.value, logger=logger)
7576
raise SkyflowError(SkyflowMessages.Error.MISSING_KEY_ID.value, invalid_input_error_code)
7677
try:
77-
token_uri = credentials["tokenURI"]
78+
token_uri = credentials[CredentialField.TOKEN_URI]
7879
except:
7980
log_error_log(SkyflowMessages.ErrorLogs.TOKEN_URI_IS_REQUIRED.value, logger=logger)
8081
raise SkyflowError(SkyflowMessages.Error.MISSING_TOKEN_URI.value, invalid_input_error_code)
@@ -85,53 +86,53 @@ def get_service_account_token(credentials, options, logger):
8586
auth_api = auth_client.get_auth_api()
8687

8788
formatted_scope = None
88-
if options and "role_ids" in options:
89-
formatted_scope = format_scope(options.get("role_ids"))
89+
if options and OptionField.ROLE_IDS in options:
90+
formatted_scope = format_scope(options.get(OptionField.ROLE_IDS))
9091

9192
response = auth_api.authentication_service_get_auth_token(assertion = signed_token,
92-
grant_type="urn:ietf:params:oauth:grant-type:jwt-bearer",
93+
grant_type=JWT.GRANT_TYPE_JWT_BEARER,
9394
scope=formatted_scope)
9495
log_info(SkyflowMessages.Info.GET_BEARER_TOKEN_SUCCESS.value, logger)
9596
return response.access_token, response.token_type
9697

9798
def get_signed_jwt(options, client_id, key_id, token_uri, private_key, logger):
9899
payload = {
99-
"iss": client_id,
100-
"key": key_id,
101-
"aud": token_uri,
102-
"sub": client_id,
103-
"exp": datetime.datetime.utcnow() + datetime.timedelta(minutes=60)
100+
JwtField.ISS: client_id,
101+
JwtField.KEY: key_id,
102+
JwtField.AUD: token_uri,
103+
JwtField.SUB: client_id,
104+
JwtField.EXP: datetime.datetime.utcnow() + datetime.timedelta(minutes=60)
104105
}
105-
if options and "ctx" in options:
106-
payload["ctx"] = options.get("ctx")
106+
if options and JwtField.CTX in options:
107+
payload[JwtField.CTX] = options.get(JwtField.CTX)
107108
try:
108-
return jwt.encode(payload=payload, key=private_key, algorithm="RS256")
109+
return jwt.encode(payload=payload, key=private_key, algorithm=JWT.ALGORITHM_RS256)
109110
except Exception:
110111
raise SkyflowError(SkyflowMessages.Error.JWT_INVALID_FORMAT.value, invalid_input_error_code)
111112

112113

113114

114115
def get_signed_tokens(credentials_obj, options):
115116
try:
116-
expiry_time = int(time.time()) + options.get("time_to_live", 60)
117-
prefix = "signed_token_"
117+
expiry_time = int(time.time()) + options.get(OptionField.TIME_TO_LIVE, 60)
118+
prefix = JWT.SIGNED_TOKEN_PREFIX
118119

119-
if options and options.get("data_tokens"):
120-
for token in options["data_tokens"]:
120+
if options and options.get(OptionField.DATA_TOKENS):
121+
for token in options[OptionField.DATA_TOKENS]:
121122
claims = {
122-
"iss": "sdk",
123-
"key": credentials_obj.get("keyID"),
124-
"exp": expiry_time,
125-
"sub": credentials_obj.get("clientID"),
126-
"tok": token,
127-
"iat": int(time.time()),
123+
JwtField.ISS: JWT.ISSUER_SDK,
124+
JwtField.KEY: credentials_obj.get(CredentialField.KEY_ID),
125+
JwtField.EXP: expiry_time,
126+
JwtField.SUB: credentials_obj.get(CredentialField.CLIENT_ID),
127+
JwtField.TOK: token,
128+
JwtField.IAT: int(time.time()),
128129
}
129130

130-
if "ctx" in options:
131-
claims["ctx"] = options["ctx"]
131+
if JwtField.CTX in options:
132+
claims[JwtField.CTX] = options[JwtField.CTX]
132133

133-
private_key = credentials_obj.get("privateKey")
134-
signed_jwt = jwt.encode(claims, private_key, algorithm="RS256")
134+
private_key = credentials_obj.get(CredentialField.PRIVATE_KEY)
135+
signed_jwt = jwt.encode(claims, private_key, algorithm=JWT.ALGORITHM_RS256)
135136
response_object = get_signed_data_token_response_object(prefix + signed_jwt, token)
136137
log_info(SkyflowMessages.Info.GET_SIGNED_DATA_TOKEN_SUCCESS.value)
137138
return response_object
@@ -170,7 +171,7 @@ def generate_signed_data_tokens_from_creds(credentials, options):
170171

171172
def get_signed_data_token_response_object(signed_token, actual_token):
172173
response_object = {
173-
"token": actual_token,
174-
"signed_token": signed_token
174+
ResponseField.TOKEN: actual_token,
175+
ResponseField.SIGNED_TOKEN: signed_token
175176
}
176-
return response_object.get("token"), response_object.get("signed_token")
177+
return response_object.get(ResponseField.TOKEN), response_object.get(ResponseField.SIGNED_TOKEN)

skyflow/utils/_skyflow_messages.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,9 @@ class Error(Enum):
7171
RESPONSE_NOT_JSON = f"{error_prefix} Response {{}} is not valid JSON."
7272
API_ERROR = f"{error_prefix} Server returned status code {{}}"
7373

74+
INVALID_JSON_RESPONSE = f"{error_prefix} Invalid JSON response received."
75+
UNKNOWN_ERROR_DEFAULT_MESSAGE = f"{error_prefix} An unknown error occurred."
76+
7477
INVALID_FILE_INPUT = f"{error_prefix} Validation error. Invalid file input. Specify a valid file input."
7578
INVALID_DETECT_ENTITIES_TYPE = f"{error_prefix} Validation error. Invalid type of detect entities. Specify detect entities as list of DetectEntities enum."
7679
INVALID_TYPE_FOR_DEFAULT_TOKEN_TYPE = f"{error_prefix} Validation error. Invalid type of default token type. Specify default token type as TokenType enum."
@@ -386,6 +389,7 @@ class ErrorLogs(Enum):
386389
SAVING_DEIDENTIFY_FILE_FAILED = f"{ERROR}: [{error_prefix}] Error while saving deidentified file to output directory."
387390
REIDENTIFY_TEXT_REQUEST_REJECTED = f"{ERROR}: [{error_prefix}] Reidentify text resulted in failure."
388391
DETECT_FILE_REQUEST_REJECTED = f"{ERROR}: [{error_prefix}] Deidentify file resulted in failure."
392+
EMPTY_FILE_COLUMN_NAME = f"{ERROR}: [{error_prefix}] Empty column name in FILE_UPLOAD"
389393

390394
class Interface(Enum):
391395
INSERT = "INSERT"

0 commit comments

Comments
 (0)