Skip to content

Commit

Permalink
change of make_call to accept list of call configs
Browse files Browse the repository at this point in the history
  • Loading branch information
kudj committed May 11, 2024
1 parent 40c9583 commit 8fb5469
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 45 deletions.
114 changes: 69 additions & 45 deletions python-sync-actions/src/component.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,14 @@ def __init__(self):
self._client: GenericHttpClient = None
self._parent_params = {}
self._final_results = []
self._parent_results = []
self._final_response = None

def run(self):
"""
Main component method
"""
# self.make_call()
pass

def init_component(self):
Expand Down Expand Up @@ -148,7 +150,7 @@ def _process_nested_job(self, parent_result, config, parent_results_list, client
request_parameters: request parameters
"""
results = []
for row in parent_result:
for row in parent_result or [{}]:

parent_results_ext = parent_results_list + [row]

Expand Down Expand Up @@ -221,14 +223,15 @@ def _parse_data(self, data, path) -> list:
except KeyError:
raise UserException(f"Path {path.path} not found in the response data")

if not isinstance(result, list):
element_name = 'root' if path.path == '.' else path.path
raise UserException(f"The {element_name} element of the response is not list, "
"please change your Record Selector path to list")
# TODO: check if the result is list
# if not isinstance(result, list):
# element_name = 'root' if path.path == '.' else path.path
# raise UserException(f"The {element_name} element of the response is not list, "
# "please change your Record Selector path to list")

return result

def make_call(self) -> tuple[requests.Response, list[dict]]:
def make_call(self) -> tuple[list, any, str]:
"""
Make call to the API
Returns:
Expand All @@ -239,46 +242,67 @@ def make_call(self) -> tuple[requests.Response, list[dict]]:
raise ValueError("_JOB_PATH is missing!")
self._client.login()

api_cfg = self._configuration.api
request_cfg = self._configuration.request_parameters
# fix KBC bug
user_params = self._configuration.user_parameters
# evaluate user_params inside the user params itself
user_params = self._fill_in_user_parameters(user_params, user_params)

# build headers
headers = {**api_cfg.default_headers.copy(), **request_cfg.headers.copy()}
new_headers = self._fill_in_user_parameters(headers, user_params)

# build additional parameters
query_parameters = {**api_cfg.default_query_parameters.copy(), **request_cfg.query_parameters.copy()}
query_parameters = self._fill_in_user_parameters(query_parameters, user_params)
ssl_verify = api_cfg.ssl_verification
timeout = api_cfg.timeout
# additional_params = self._build_request_parameters(additional_params_cfg)
request_parameters = {'params': query_parameters,
'headers': new_headers,
'verify': ssl_verify,
'timeout': timeout}

endpoint_path = request_cfg.endpoint_path

# use client to send requests / perform actions
self._final_response = self._client.send_request(method=request_cfg.method, endpoint_path=endpoint_path,
**request_parameters)

headers = dict(self._final_response.headers)

result = self._parse_data(self._final_response.json(), self._configuration.data_path)

if request_cfg.nested_job:
parent_results = []
self._process_nested_job(result, request_cfg.nested_job[0], parent_results, self._client,
request_cfg.method, **request_parameters)
else:
self._final_results = result
final_results = []

self._parent_results = [{}] * len(self._configurations)

def recursive_call(parent_result, config_index=0):

if parent_result:
self._parent_results[config_index-1] = parent_result

if config_index >= len(self._configurations):
return final_results, self._final_response.json(), self.log.getvalue()

job = self._configurations[config_index]

api_cfg = job.api
request_cfg = job.request_parameters
# fix KBC bug
user_params = job.user_parameters
# evaluate user_params inside the user params itself
user_params = self._fill_in_user_parameters(user_params, user_params)

# build headers
headers = {**api_cfg.default_headers.copy(), **request_cfg.headers.copy()}
new_headers = self._fill_in_user_parameters(headers, user_params)

# build additional parameters
query_parameters = {**api_cfg.default_query_parameters.copy(), **request_cfg.query_parameters.copy()}
query_parameters = self._fill_in_user_parameters(query_parameters, user_params)
ssl_verify = api_cfg.ssl_verification
timeout = api_cfg.timeout
# additional_params = self._build_request_parameters(additional_params_cfg)
request_parameters = {'params': query_parameters,
'headers': new_headers,
'verify': ssl_verify,
'timeout': timeout}

row_path = job.request_parameters.endpoint_path

if job.request_parameters.placeholders:
placeholders = PlaceholdersUtils.get_params_for_child_jobs(job.request_parameters.placeholders,
self._parent_results, self._parent_params)
self._parent_params = placeholders[0]
row_path = self._fill_placeholders(placeholders, job.request_parameters.endpoint_path)

self._final_response = self._client.send_request(method=job.request_parameters.method,
endpoint_path=row_path, **request_parameters)

current_results = self._parse_data(self._final_response.json(), job.data_path)

if config_index == len(self._configurations) - 1:
final_results.append(current_results)
else:
if isinstance(current_results, list):
for result in current_results:
recursive_call(result, config_index + 1)
else:
recursive_call(current_results, config_index + 1)

recursive_call({})

return self._final_response, self._final_results
return final_results, self._final_response.json(), self.log.getvalue()

@sync_action('load_from_curl')
def load_from_curl(self) -> dict:
Expand Down
5 changes: 5 additions & 0 deletions python-sync-actions/src/configuration.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ class ApiConfig(ConfigurationBase):
class ApiRequest(ConfigurationBase):
method: str
endpoint_path: str
placeholders: dict = field(default_factory=dict)
headers: dict = field(default_factory=dict)
query_parameters: dict = field(default_factory=dict)
continue_on_failure: bool = False
Expand Down Expand Up @@ -245,6 +246,9 @@ def build_api_request(configuration: dict) -> List[Tuple[ApiRequest, RequestCont

data_field = endpoint_config.get('dataField')

placeholders = endpoint_config.get('placeholders', {})


if isinstance(data_field, dict):
path = data_field.get('path')
delimiter = data_field.get("delimiter", ".")
Expand All @@ -255,6 +259,7 @@ def build_api_request(configuration: dict) -> List[Tuple[ApiRequest, RequestCont
result_requests.append(
(ApiRequest(method=method,
endpoint_path=endpoint_path,
placeholders=placeholders,
headers=endpoint_config.get('headers', {}),
query_parameters=endpoint_config.get('params', {}),),
request_content,
Expand Down

0 comments on commit 8fb5469

Please sign in to comment.