1414class RestApiRecipeSession :
1515 def __init__ (self , custom_key_values , credential_parameters , endpoint_parameters , extraction_key , parameter_columns , parameter_renamings ,
1616 display_metadata = False ,
17- maximum_number_rows = - 1 ):
17+ maximum_number_rows = - 1 , behaviour_when_error = None ):
1818 self .custom_key_values = custom_key_values
1919 self .credential_parameters = credential_parameters
2020 self .endpoint_parameters = endpoint_parameters
@@ -25,7 +25,8 @@ def __init__(self, custom_key_values, credential_parameters, endpoint_parameters
2525 self .display_metadata = display_metadata
2626 self .maximum_number_rows = maximum_number_rows
2727 self .is_row_limit = (self .maximum_number_rows > 0 )
28- self .can_raise = False
28+ self .behaviour_when_error = behaviour_when_error or "add-error-column"
29+ self .can_raise = self .behaviour_when_error == "raise"
2930
3031 @staticmethod
3132 def get_column_to_parameter_dict (parameter_columns , parameter_renamings ):
@@ -55,7 +56,13 @@ def process_dataframe(self, input_parameters_dataframe, is_raw_output):
5556 updated_endpoint_parameters ,
5657 self .custom_key_values
5758 ))
58- self .client = RestAPIClient (self .credential_parameters , updated_endpoint_parameters , custom_key_values = self .custom_key_values , session = session )
59+ self .client = RestAPIClient (
60+ self .credential_parameters ,
61+ updated_endpoint_parameters ,
62+ custom_key_values = self .custom_key_values ,
63+ session = session ,
64+ behaviour_when_error = self .behaviour_when_error
65+ )
5966 self .client .time_last_request = time_last_request
6067 while self .client .has_more_data ():
6168 page_results = self .retrieve_next_page (is_raw_output )
@@ -69,17 +76,24 @@ def process_dataframe(self, input_parameters_dataframe, is_raw_output):
6976 def retrieve_next_page (self , is_raw_output ):
7077 page_rows = []
7178 logger .info ("retrieve_next_page: Calling next page" )
72- json_response = self .client .paginated_api_call (can_raise_exeption = False )
73- metadata = self .client .get_metadata () if self .display_metadata else {}
79+ json_response = self .client .paginated_api_call (can_raise_exeption = self .can_raise )
80+ default_dict = {
81+ DKUConstants .REPONSE_ERROR_KEY : json_response .get (DKUConstants .REPONSE_ERROR_KEY , None )
82+ } if self .behaviour_when_error == "keep-error-column" else {}
83+ metadata = self .client .get_metadata () if self .display_metadata else default_dict
7484 is_api_returning_dict = True
7585 if self .extraction_key :
7686 data_rows = get_value_from_path (json_response , self .extraction_key .split ("." ), can_raise = False )
77- if data_rows is None :
87+ if data_rows is None or type (data_rows ) != list :
88+ if self .behaviour_when_error == "ignore" :
89+ return []
7890 error_message = "Extraction key '{}' was not found in the incoming data" .format (self .extraction_key )
7991 if self .can_raise :
8092 raise DataikuException (error_message )
93+ elif DKUConstants .REPONSE_ERROR_KEY in metadata :
94+ return [metadata ]
8195 else :
82- return self .format_page_rows ([{"error" : error_message }], is_raw_output , metadata )
96+ return self .format_page_rows ([{DKUConstants . REPONSE_ERROR_KEY : error_message }], is_raw_output , metadata )
8397 page_rows .extend (self .format_page_rows (data_rows , is_raw_output , metadata ))
8498 else :
8599 # Todo: check api_response key is free and add something overwise
@@ -115,6 +129,9 @@ def format_page_rows(self, data_rows, is_raw_output, metadata=None):
115129 base_row .update (metadata )
116130 if is_raw_output :
117131 if is_error_message (data_row ):
132+ base_row .update ({
133+ DKUConstants .API_RESPONSE_KEY : None
134+ })
118135 base_row .update (parse_keys_for_json (data_row ))
119136 else :
120137 base_row .update ({
@@ -129,7 +146,7 @@ def format_page_rows(self, data_rows, is_raw_output, metadata=None):
129146def is_error_message (jsons_response ):
130147 if type (jsons_response ) not in [dict , list ]:
131148 return False
132- if "error" in jsons_response and len (jsons_response ) == 1 :
149+ if DKUConstants . REPONSE_ERROR_KEY in jsons_response and len (jsons_response ) == 1 :
133150 return True
134151 else :
135152 return False
0 commit comments