aplos-nca-saas-sdk 0.0.16__tar.gz → 0.0.17__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/PKG-INFO +1 -1
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/pyproject.toml +1 -1
- aplos_nca_saas_sdk-0.0.17/requirements.dev.txt +1 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/integration_testing/configs/login_config.py +3 -3
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/integration_testing/configs/nca_execution_config.py +64 -24
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/integration_testing/example_main.py +2 -2
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/integration_testing/readme.md +4 -4
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/integration_testing/tests/file_upload_test.py +8 -12
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/integration_testing/tests/nca_analysis_test.py +3 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/nca_resources/nca_analysis.py +23 -13
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/nca_resources/nca_file_download.py +26 -10
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/run_analysis_execution.py +4 -4
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/utilities/commandline_args.py +5 -5
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/utilities/environment_services.py +1 -1
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/version.py +1 -1
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/.gitignore +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/.pypirc +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/.vscode/launch.json +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/.vscode/settings.json +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/LICENSE +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/README.md +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/devops/pypi/build.py +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/devops/pypi/readme.md +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/devops/requirements.txt +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/docs/images/API_Configuration_blur.png +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/docs/images/aplos-nca-commandline-cropped.png +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/docs/images/aplos-nca-commandline.png +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/mypy.ini +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/mypy_checks.py +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/readme.md +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/requirements.txt +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/run-checks.sh +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/__init__.py +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/integration_testing/configs/_config_base.py +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/integration_testing/configs/app_settings_config.py +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/integration_testing/configs/config_sample.json +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/integration_testing/configs/file_upload_config.py +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/integration_testing/configs/nca_validation_config.py +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/integration_testing/files/executions/config1.json +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/integration_testing/files/uploads/input1.csv +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/integration_testing/files/uploads/input1.dat +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/integration_testing/files/uploads/input1.sas7bdat +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/integration_testing/files/uploads/input1.xls +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/integration_testing/files/uploads/input1.xlsx +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/integration_testing/files/uploads/input1.xpt +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/integration_testing/integration_test_base.py +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/integration_testing/integration_test_configurations.py +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/integration_testing/integration_test_factory.py +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/integration_testing/integration_test_response.py +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/integration_testing/integration_test_suite.py +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/integration_testing/tests/app_configuration_test.py +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/integration_testing/tests/app_login_test.py +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/integration_testing/tests/nca_analysis_validation_test.py +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/nca_resources/_api_base.py +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/nca_resources/aws_cognito.py +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/nca_resources/aws_s3_presigned_payload.py +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/nca_resources/aws_s3_presigned_upload.py +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/nca_resources/nca_app_configuration.py +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/nca_resources/nca_authenticator.py +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/nca_resources/nca_endpoints.py +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/nca_resources/nca_file_upload.py +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/nca_resources/nca_validations.py +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/sample_files/analysis_files/single_ev/config.json +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/sample_files/analysis_files/single_ev/input.csv +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/sample_files/analysis_files/single_ev/meta_data.json +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/utilities/environment_vars.py +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/utilities/file_utility.py +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/src/aplos_nca_saas_sdk/utilities/http_utility.py +0 -0
- {aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/tests/__init__.py +0 -0
@@ -0,0 +1 @@
|
|
1
|
+
mypy
|
@@ -17,13 +17,13 @@ class LoginConfig(ConfigBase):
|
|
17
17
|
def __init__(
|
18
18
|
self,
|
19
19
|
username: Optional[str] = None,
|
20
|
-
|
20
|
+
password: Optional[str] = None,
|
21
21
|
host: Optional[str] = None,
|
22
22
|
roles: Optional[List[str]] = None,
|
23
23
|
):
|
24
24
|
super().__init__()
|
25
25
|
self.__username: Optional[str] = username
|
26
|
-
self.__password: Optional[str] =
|
26
|
+
self.__password: Optional[str] = password
|
27
27
|
self.__host: Optional[str] = host
|
28
28
|
self.__roles: List[str] = roles if roles is not None else []
|
29
29
|
|
@@ -110,7 +110,7 @@ class LoginConfigs(ConfigBase):
|
|
110
110
|
|
111
111
|
@staticmethod
|
112
112
|
def try_load_login(login_config: Dict[str, Any]) -> LoginConfig | None:
|
113
|
-
"""Attempts to
|
113
|
+
"""Attempts to initialize a Login from a configuration object"""
|
114
114
|
login: LoginConfig | None = None
|
115
115
|
if login_config is not None:
|
116
116
|
username = login_config.get("username", None)
|
@@ -34,6 +34,9 @@ class NCAExecutionConfig(ConfigBase):
|
|
34
34
|
meta_data: str | dict | None = None,
|
35
35
|
output_dir: str | None = None,
|
36
36
|
unzip_after_download: bool = False,
|
37
|
+
data_processing: str | dict | None = None,
|
38
|
+
post_processing: str | dict | None = None,
|
39
|
+
full_payload: str | dict | None = None,
|
37
40
|
):
|
38
41
|
super().__init__()
|
39
42
|
|
@@ -52,6 +55,9 @@ class NCAExecutionConfig(ConfigBase):
|
|
52
55
|
self.__meta_data = meta_data
|
53
56
|
self.__output_dir = output_dir
|
54
57
|
self.__unzip_after_download = unzip_after_download
|
58
|
+
self.__data_processing = data_processing
|
59
|
+
self.__post_processing = post_processing
|
60
|
+
self.__full_payload = full_payload
|
55
61
|
|
56
62
|
@property
|
57
63
|
def login(self) -> LoginConfig:
|
@@ -83,6 +89,20 @@ class NCAExecutionConfig(ConfigBase):
|
|
83
89
|
"""Indicates if the download should be unzipped"""
|
84
90
|
return self.__unzip_after_download
|
85
91
|
|
92
|
+
@property
|
93
|
+
def data_processing(self) -> str | Dict[str, Any] | None:
|
94
|
+
"""Pre Processing"""
|
95
|
+
return self.__data_processing
|
96
|
+
|
97
|
+
@property
|
98
|
+
def post_processing(self) -> str | Dict[str, Any] | None:
|
99
|
+
"""Post Processing"""
|
100
|
+
return self.__post_processing
|
101
|
+
|
102
|
+
@property
|
103
|
+
def full_payload(self) -> str | Dict[str, Any] | None:
|
104
|
+
"""Full Payload"""
|
105
|
+
return self.__full_payload
|
86
106
|
|
87
107
|
class NCAExecutionConfigs(ConfigBase):
|
88
108
|
"""
|
@@ -106,21 +126,27 @@ class NCAExecutionConfigs(ConfigBase):
|
|
106
126
|
input_file_path: str,
|
107
127
|
config_data: dict,
|
108
128
|
meta_data: str | dict | None = None,
|
129
|
+
data_processing: str | dict | None = None,
|
130
|
+
post_processing: str | dict | None = None,
|
109
131
|
output_dir: str | None = None,
|
110
132
|
unzip_after_download: bool = False,
|
111
133
|
enabled: bool = True,
|
134
|
+
full_payload: str | dict | None = None,
|
112
135
|
):
|
113
136
|
"""Add an NCA Execution Config"""
|
114
|
-
|
137
|
+
nca_execution_config = NCAExecutionConfig(
|
115
138
|
login,
|
116
139
|
input_file_path,
|
117
140
|
config_data,
|
118
141
|
meta_data,
|
119
142
|
output_dir,
|
120
143
|
unzip_after_download,
|
144
|
+
data_processing,
|
145
|
+
post_processing,
|
146
|
+
full_payload,
|
121
147
|
)
|
122
|
-
|
123
|
-
self.__nca_executions.append(
|
148
|
+
nca_execution_config.enabled = enabled
|
149
|
+
self.__nca_executions.append(nca_execution_config)
|
124
150
|
|
125
151
|
def load(self, test_config: Dict[str, Any]):
|
126
152
|
"""Loads the NCA Execution configs from a list of dictionaries"""
|
@@ -150,41 +176,55 @@ class NCAExecutionConfigs(ConfigBase):
|
|
150
176
|
if not login:
|
151
177
|
raise RuntimeError("Failed to load the login configuration")
|
152
178
|
|
179
|
+
|
180
|
+
full_payload = self.__load_dictionary_data_or_file(key="payload", analysis=analysis, optional=True)
|
181
|
+
config_data = self.__load_dictionary_data_or_file(key="config", analysis=analysis, optional=True)
|
182
|
+
|
183
|
+
if not config_data and not full_payload:
|
184
|
+
raise RuntimeError("Failed to load the config data")
|
185
|
+
|
186
|
+
meta_data = self.__load_dictionary_data_or_file(key="meta", analysis=analysis, optional=True)
|
187
|
+
data_cleaning = self.__load_dictionary_data_or_file(key="data_cleaning", analysis=analysis, optional=True)
|
188
|
+
post_processing = self.__load_dictionary_data_or_file(key="post_processing", analysis=analysis, optional=True)
|
189
|
+
|
153
190
|
self.add(
|
154
191
|
login=login,
|
155
192
|
input_file_path=analysis["file"],
|
156
|
-
config_data=
|
157
|
-
meta_data=
|
193
|
+
config_data=config_data,
|
194
|
+
meta_data=meta_data,
|
158
195
|
output_dir=output_dir,
|
159
196
|
unzip_after_download=True,
|
160
197
|
enabled=enabled,
|
198
|
+
full_payload=full_payload,
|
199
|
+
data_processing=data_cleaning,
|
200
|
+
post_processing=post_processing
|
161
201
|
)
|
162
202
|
|
163
|
-
def __load_meta_data(self, analysis: Dict[str, Any]) -> Dict[str, Any]:
|
164
|
-
data: Dict[str, Any] = {}
|
165
|
-
data = analysis.get("meta", {}).get("data", {})
|
166
|
-
|
167
|
-
return data
|
168
203
|
|
169
|
-
def
|
170
|
-
|
171
|
-
|
204
|
+
def __load_dictionary_data_or_file(self, key: str, analysis: Dict[str, Any], optional: bool = False ) -> Dict[str, Any] | None:
|
205
|
+
data: Dict[str, Any] = {}
|
206
|
+
data = analysis.get(key, {}).get("data", {})
|
172
207
|
|
173
|
-
if
|
174
|
-
return
|
208
|
+
if data:
|
209
|
+
return data
|
175
210
|
|
176
|
-
|
211
|
+
file_path: str = analysis.get(key, {}).get("file")
|
177
212
|
|
178
213
|
logger.info(
|
179
214
|
{
|
180
|
-
"message": "Initializing
|
181
|
-
"
|
215
|
+
"message": f"Initializing {key} from file",
|
216
|
+
"key": key,
|
217
|
+
"file_path": file_path,
|
182
218
|
}
|
183
219
|
)
|
184
|
-
|
185
|
-
if os.path.exists(
|
186
|
-
|
187
|
-
|
188
|
-
|
220
|
+
path = FileUtility.load_filepath(file_path)
|
221
|
+
if os.path.exists(path) is False:
|
222
|
+
if optional:
|
223
|
+
return None
|
224
|
+
raise RuntimeError(f"Data for {key} not found: {path}")
|
225
|
+
with open(path, "r", encoding="utf-8") as f:
|
226
|
+
data = json.load(f)
|
227
|
+
|
228
|
+
return data
|
189
229
|
|
190
|
-
|
230
|
+
|
@@ -18,8 +18,8 @@ from aplos_nca_saas_sdk.integration_testing.integration_test_configurations impo
|
|
18
18
|
def main():
|
19
19
|
"""This is an example on how you can run the unit tests"""
|
20
20
|
|
21
|
-
# Optionally use our
|
22
|
-
# which can help during
|
21
|
+
# Optionally use our convenient Environment Services loader
|
22
|
+
# which can help during initial testings.
|
23
23
|
evs: EnvironmentServices = EnvironmentServices()
|
24
24
|
# see if we have a local .env, .env.uat, etc configured to look up
|
25
25
|
env_file = os.getenv("ENV_FILE")
|
@@ -12,7 +12,7 @@ The integration tests will require the following:
|
|
12
12
|
### Users
|
13
13
|
You will need valid user accounts with the appropriate permissions for the endpoints they are executing.
|
14
14
|
|
15
|
-
If you are testing permission
|
15
|
+
If you are testing permission boundaries then you should set up multiple users with different permissions.
|
16
16
|
|
17
17
|
|
18
18
|
### Subscriptions
|
@@ -44,8 +44,8 @@ from aplos_nca_saas_sdk.integration_testing.integration_test_configurations impo
|
|
44
44
|
def main():
|
45
45
|
"""This is an example on how you can run the unit tests"""
|
46
46
|
|
47
|
-
# Optionally use our
|
48
|
-
# which can help during
|
47
|
+
# Optionally use our convenient Environment Services loader
|
48
|
+
# which can help during initial testings.
|
49
49
|
evs: EnvironmentServices = EnvironmentServices()
|
50
50
|
# See if we have a local .env, .env.uat, etc configured to look up
|
51
51
|
# for local configuration settings
|
@@ -83,7 +83,7 @@ def main():
|
|
83
83
|
### Configs
|
84
84
|
Tests are run based on configurations. The following is an example of supported configurations:
|
85
85
|
|
86
|
-
-
|
86
|
+
- Application Configuration Settings
|
87
87
|
- Logins & Access
|
88
88
|
- Executing an Analysis
|
89
89
|
- Running a Validation
|
@@ -5,11 +5,13 @@ Property of Aplos Analytics, Utah, USA
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
import time
|
8
|
-
from
|
9
|
-
from typing import Any, Dict, List
|
8
|
+
from typing import Any, Dict
|
10
9
|
|
11
|
-
import requests
|
12
10
|
from aws_lambda_powertools import Logger
|
11
|
+
|
12
|
+
from aplos_nca_saas_sdk.integration_testing.configs.file_upload_config import (
|
13
|
+
FileUploadConfig,
|
14
|
+
)
|
13
15
|
from aplos_nca_saas_sdk.integration_testing.configs.login_config import LoginConfig
|
14
16
|
from aplos_nca_saas_sdk.integration_testing.integration_test_base import (
|
15
17
|
IntegrationTestBase,
|
@@ -17,13 +19,9 @@ from aplos_nca_saas_sdk.integration_testing.integration_test_base import (
|
|
17
19
|
from aplos_nca_saas_sdk.integration_testing.integration_test_response import (
|
18
20
|
IntegrationTestResponse,
|
19
21
|
)
|
20
|
-
from aplos_nca_saas_sdk.nca_resources.nca_file_upload import NCAFileUpload
|
21
|
-
from aplos_nca_saas_sdk.nca_resources.nca_file_download import NCAFileDownload
|
22
22
|
from aplos_nca_saas_sdk.nca_resources.nca_authenticator import NCAAuthenticator
|
23
|
-
from aplos_nca_saas_sdk.
|
24
|
-
from aplos_nca_saas_sdk.
|
25
|
-
FileUploadConfig,
|
26
|
-
)
|
23
|
+
from aplos_nca_saas_sdk.nca_resources.nca_file_download import NCAFileDownload
|
24
|
+
from aplos_nca_saas_sdk.nca_resources.nca_file_upload import NCAFileUpload
|
27
25
|
|
28
26
|
logger = Logger()
|
29
27
|
|
@@ -46,9 +44,7 @@ class FileUploadTest(IntegrationTestBase):
|
|
46
44
|
try:
|
47
45
|
# Confirm Login
|
48
46
|
nca_login = self.__login(file_upload.login)
|
49
|
-
|
50
|
-
# test_response.error = "Failed to authenticate"
|
51
|
-
# else:
|
47
|
+
|
52
48
|
# Confirm Upload
|
53
49
|
upload_response: Dict[str, Any] = self.__upload(
|
54
50
|
nca_login, file_upload.file_path
|
@@ -66,6 +66,9 @@ class NCAAnalysisTest(IntegrationTestBase):
|
|
66
66
|
wait_for_results=True,
|
67
67
|
output_directory=nca_execution_config.output_dir,
|
68
68
|
unzip_after_download=False,
|
69
|
+
data_processing=nca_execution_config.data_processing,
|
70
|
+
post_processing=nca_execution_config.post_processing,
|
71
|
+
full_payload=nca_execution_config.full_payload,
|
69
72
|
)
|
70
73
|
|
71
74
|
# Verify Download
|
@@ -41,13 +41,16 @@ class NCAAnalysis(NCAApiBaseClass):
|
|
41
41
|
config_data: dict,
|
42
42
|
*,
|
43
43
|
meta_data: str | dict | None = None,
|
44
|
+
post_processing: str | dict | None = None,
|
45
|
+
data_processing: str | dict | None = None,
|
44
46
|
wait_for_results: bool = True,
|
45
47
|
max_wait_in_seconds: int = 900,
|
46
48
|
output_directory: str | None = None,
|
47
49
|
unzip_after_download: bool = False,
|
50
|
+
full_payload: str | dict | None = None
|
48
51
|
) -> Dict[str, Any]:
|
49
52
|
"""
|
50
|
-
Executes an
|
53
|
+
Executes an analysis.
|
51
54
|
- Uploads an analysis file.
|
52
55
|
- Adds the execution to the queue.
|
53
56
|
|
@@ -81,7 +84,7 @@ class NCAAnalysis(NCAApiBaseClass):
|
|
81
84
|
"Unexpected empty file_id when attempting to upload file."
|
82
85
|
)
|
83
86
|
|
84
|
-
self.log("\tAdding
|
87
|
+
self.log("\tAdding analysis to the queue.")
|
85
88
|
execution_response: Dict[str, Any] = self.__add_to_queue(
|
86
89
|
file_id=file_id,
|
87
90
|
config_data=config_data,
|
@@ -130,6 +133,9 @@ class NCAAnalysis(NCAApiBaseClass):
|
|
130
133
|
file_id: str,
|
131
134
|
config_data: dict,
|
132
135
|
meta_data: str | dict | None = None,
|
136
|
+
post_processing: str | dict | None = None,
|
137
|
+
data_processing: str | dict | None = None,
|
138
|
+
full_payload: str | dict | None = None
|
133
139
|
) -> Dict[str, Any]:
|
134
140
|
"""
|
135
141
|
Adds the analysis to the execution queue.
|
@@ -151,15 +157,19 @@ class NCAAnalysis(NCAApiBaseClass):
|
|
151
157
|
"Missing config_data. Please provide a valid config_data."
|
152
158
|
)
|
153
159
|
headers = self.authenticator.get_jwt_http_headers()
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
160
|
+
|
161
|
+
submission: Dict[str, Any] = {}
|
162
|
+
|
163
|
+
if full_payload:
|
164
|
+
submission = full_payload
|
165
|
+
else:
|
166
|
+
submission = {
|
167
|
+
"file": {"id": file_id},
|
168
|
+
"configuration": config_data,
|
169
|
+
"meta_data": meta_data,
|
170
|
+
"post_processing": post_processing,
|
171
|
+
"data_processing": data_processing
|
172
|
+
}
|
163
173
|
|
164
174
|
response: requests.Response = requests.post(
|
165
175
|
self.endpoints.executions,
|
@@ -171,13 +181,13 @@ class NCAAnalysis(NCAApiBaseClass):
|
|
171
181
|
|
172
182
|
if response.status_code == 403:
|
173
183
|
raise PermissionError(
|
174
|
-
"Failed to execute. A 403 response
|
184
|
+
"Failed to execute. A 403 response occurred. "
|
175
185
|
"This could a token issue or a url path issue "
|
176
186
|
"By default unknown gateway calls return 403 errors. "
|
177
187
|
)
|
178
188
|
elif response.status_code != 200:
|
179
189
|
raise RuntimeError(
|
180
|
-
f"Unknown Error
|
190
|
+
f"Unknown Error occurred during executions: {response.status_code}. "
|
181
191
|
f"Reason: {response.reason}"
|
182
192
|
)
|
183
193
|
|
@@ -5,16 +5,17 @@ Property of Aplos Analytics, Utah, USA
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
import time
|
8
|
-
from typing import Any, Dict, List
|
9
8
|
from datetime import datetime, timedelta
|
9
|
+
from typing import Any, Dict, List
|
10
|
+
|
11
|
+
import requests
|
10
12
|
from aws_lambda_powertools import Logger
|
13
|
+
|
11
14
|
from aplos_nca_saas_sdk.nca_resources._api_base import NCAApiBaseClass
|
12
15
|
from aplos_nca_saas_sdk.nca_resources.aws_s3_presigned_upload import (
|
13
16
|
S3PresignedUrlUpload,
|
14
17
|
)
|
15
|
-
|
16
18
|
from aplos_nca_saas_sdk.utilities.http_utility import HttpUtilities
|
17
|
-
import requests
|
18
19
|
|
19
20
|
logger = Logger(service="nca-file-download")
|
20
21
|
|
@@ -41,7 +42,8 @@ class NCAFileDownload(NCAApiBaseClass):
|
|
41
42
|
ValueError: _description_
|
42
43
|
|
43
44
|
Returns:
|
44
|
-
Dict: {"file_id": id, "
|
45
|
+
Dict: {"file_id": id, "status_code": 204, ...}
|
46
|
+
204 Response staus_code is a success
|
45
47
|
"""
|
46
48
|
if input_file_path is None or not input_file_path:
|
47
49
|
raise ValueError("Valid input_file_path is required.")
|
@@ -67,12 +69,19 @@ class NCAFileDownload(NCAApiBaseClass):
|
|
67
69
|
file_id: str,
|
68
70
|
user_name: str | None = None,
|
69
71
|
password: str | None = None,
|
72
|
+
wait_time_in_seconds: float = 5,
|
73
|
+
max_tries: float = 12,
|
74
|
+
required_workable_state: str = "ready",
|
70
75
|
) -> Dict[str, Any]:
|
71
76
|
"""
|
72
77
|
Downloads a file from the Aplos NCA Cloud
|
73
78
|
|
74
79
|
Args:
|
75
80
|
file_id (str): the id of the file to download
|
81
|
+
user_name Optional(str): the username used to connect. If not specified
|
82
|
+
the authenticator is required.
|
83
|
+
password Optional(str): the password used to connect. If not specified
|
84
|
+
the authenticator is required.
|
76
85
|
|
77
86
|
Raises:
|
78
87
|
ValueError: _description_
|
@@ -94,12 +103,17 @@ class NCAFileDownload(NCAApiBaseClass):
|
|
94
103
|
)
|
95
104
|
self.authenticator.authenticate(username=user_name, password=password)
|
96
105
|
|
97
|
-
max_wait_in_minutes: int = 3
|
98
106
|
headers = HttpUtilities.get_headers(self.authenticator.cognito.jwt)
|
99
107
|
current_time = datetime.now()
|
100
108
|
|
101
|
-
|
102
|
-
|
109
|
+
if max_tries < 0:
|
110
|
+
max_tries = 1
|
111
|
+
if wait_time_in_seconds < 0:
|
112
|
+
wait_time_in_seconds = 1
|
113
|
+
|
114
|
+
max_wait_time_in_seconds = wait_time_in_seconds * max_tries
|
115
|
+
# Create a timedelta object representing x seconds
|
116
|
+
time_delta = timedelta(seconds=max_wait_time_in_seconds)
|
103
117
|
# Add the timedelta to the current time
|
104
118
|
max_time = current_time + time_delta
|
105
119
|
|
@@ -113,16 +127,18 @@ class NCAFileDownload(NCAApiBaseClass):
|
|
113
127
|
status = json_response.get("workable_state")
|
114
128
|
complete = status == "ready"
|
115
129
|
|
130
|
+
if not required_workable_state or required_workable_state == "any":
|
131
|
+
break
|
116
132
|
if status == "invalid" or len(errors) > 0:
|
117
133
|
break
|
118
134
|
if complete:
|
119
135
|
break
|
120
136
|
if not complete:
|
121
|
-
time.sleep(
|
137
|
+
time.sleep(wait_time_in_seconds)
|
122
138
|
if datetime.now() > max_time:
|
123
139
|
error = (
|
124
|
-
"Timeout attempting to get
|
125
|
-
f"The current timeout limit is {
|
140
|
+
"Timeout attempting to get an analysis file. "
|
141
|
+
f"The current timeout limit is {max_wait_time_in_seconds} seconds. "
|
126
142
|
"You may need to up the timeout period, or check for errors. "
|
127
143
|
)
|
128
144
|
raise RuntimeError(error)
|
@@ -48,7 +48,7 @@ def main():
|
|
48
48
|
|
49
49
|
wait_for_results = True
|
50
50
|
max_wait_in_seconds = 900 # 15 minutes
|
51
|
-
|
51
|
+
results = analysis_api.execute(
|
52
52
|
username=str(args.username),
|
53
53
|
password=str(args.password),
|
54
54
|
input_file_path=str(args.analysis_file),
|
@@ -60,7 +60,7 @@ def main():
|
|
60
60
|
)
|
61
61
|
|
62
62
|
if not wait_for_results:
|
63
|
-
exec_id =
|
63
|
+
exec_id = results.get("execution", {}).get("execution_id", "")
|
64
64
|
print(
|
65
65
|
"Analysis execution has been queued. We're not waiting for the results."
|
66
66
|
)
|
@@ -69,7 +69,7 @@ def main():
|
|
69
69
|
print("🙌 Thank you for using the NCA API for an Analysis Execution Demo. 🙌")
|
70
70
|
except Exception as e: # pylint: disable=w0718
|
71
71
|
print(
|
72
|
-
"🚨 An error
|
72
|
+
"🚨 An error occurred ... exiting with an error. Please check your settings and try again."
|
73
73
|
)
|
74
74
|
print(
|
75
75
|
"If you believe this is bug please create a support ticket and include the execution id (if available)."
|
@@ -83,7 +83,7 @@ def main():
|
|
83
83
|
|
84
84
|
def optional_json_loads(data: str | dict) -> str | dict:
|
85
85
|
"""
|
86
|
-
Attempts to load the data as json, fails
|
86
|
+
Attempts to load the data as json, fails graceful and returns the data is if it fails
|
87
87
|
Args:
|
88
88
|
data (str): data as string
|
89
89
|
|
@@ -39,7 +39,7 @@ class CommandlineArgs:
|
|
39
39
|
"-c", "--config-file", required=False, help="Path to the configuration file"
|
40
40
|
)
|
41
41
|
self.parser.add_argument(
|
42
|
-
"-f", "--
|
42
|
+
"-f", "--analysis-file", required=False, help="Path to the analysis file"
|
43
43
|
)
|
44
44
|
self.parser.add_argument(
|
45
45
|
"-m", "--metadata-file", required=False, help="Path to the metadata file"
|
@@ -82,7 +82,7 @@ class CommandlineArgs:
|
|
82
82
|
self.password: str | None = None
|
83
83
|
self.host: str | None = None
|
84
84
|
|
85
|
-
#
|
85
|
+
# execution setup
|
86
86
|
self.config_file: str | None = None
|
87
87
|
self.config_file_default: str | None = None
|
88
88
|
self.analysis_file: str | None = None
|
@@ -102,21 +102,21 @@ class CommandlineArgs:
|
|
102
102
|
Returns:
|
103
103
|
bool: True if they are all valid
|
104
104
|
"""
|
105
|
-
# see if we have any
|
105
|
+
# see if we have any arguments
|
106
106
|
args = self.parser.parse_args()
|
107
107
|
|
108
108
|
self.username = args.username
|
109
109
|
self.password = args.password
|
110
110
|
self.config_file = args.config_file
|
111
111
|
# anything with a dash (in the args) is accessed with an underscore
|
112
|
-
self.analysis_file = args.
|
112
|
+
self.analysis_file = args.analysis_file
|
113
113
|
self.host = args.host
|
114
114
|
|
115
115
|
self.metadata_file = args.metadata_file
|
116
116
|
self.skip = args.skip
|
117
117
|
self.output_directory = args.output_directory
|
118
118
|
self.environment_file = args.environment_file
|
119
|
-
# no args check to see if they have them in the
|
119
|
+
# no args check to see if they have them in the environment
|
120
120
|
|
121
121
|
# if we have an environment file we'll want to load it before checking any defaults
|
122
122
|
self.check_for_environment_config()
|
@@ -103,7 +103,7 @@ class EnvironmentServices:
|
|
103
103
|
if raise_error_if_not_found:
|
104
104
|
searched_paths = "\n".join(paths)
|
105
105
|
raise RuntimeError(
|
106
|
-
f"Failed to locate the
|
106
|
+
f"Failed to locate the module root: {MODULE_ROOT} in: \n {searched_paths}"
|
107
107
|
)
|
108
108
|
|
109
109
|
return None
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/docs/images/API_Configuration_blur.png
RENAMED
File without changes
|
File without changes
|
{aplos_nca_saas_sdk-0.0.16 → aplos_nca_saas_sdk-0.0.17}/docs/images/aplos-nca-commandline.png
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|