python-sdk-remote 0.0.91__tar.gz → 0.0.93__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.
Potentially problematic release.
This version of python-sdk-remote might be problematic. Click here for more details.
- {python_sdk_remote-0.0.91 → python_sdk_remote-0.0.93}/PKG-INFO +1 -1
- {python_sdk_remote-0.0.91 → python_sdk_remote-0.0.93}/README.md +4 -1
- {python_sdk_remote-0.0.91 → python_sdk_remote-0.0.93}/python_sdk_remote/src/constants.py +1 -1
- python_sdk_remote-0.0.93/python_sdk_remote/src/get_dependencies.py +58 -0
- python_sdk_remote-0.0.93/python_sdk_remote/src/http_response.py +72 -0
- {python_sdk_remote-0.0.91 → python_sdk_remote-0.0.93}/python_sdk_remote/src/utilities.py +44 -100
- {python_sdk_remote-0.0.91 → python_sdk_remote-0.0.93}/python_sdk_remote.egg-info/PKG-INFO +1 -1
- {python_sdk_remote-0.0.91 → python_sdk_remote-0.0.93}/python_sdk_remote.egg-info/SOURCES.txt +2 -0
- {python_sdk_remote-0.0.91 → python_sdk_remote-0.0.93}/setup.py +1 -1
- {python_sdk_remote-0.0.91 → python_sdk_remote-0.0.93}/pyproject.toml +0 -0
- {python_sdk_remote-0.0.91 → python_sdk_remote-0.0.93}/python_sdk_remote/src/__init__.py +0 -0
- {python_sdk_remote-0.0.91 → python_sdk_remote-0.0.93}/python_sdk_remote/src/item.py +0 -0
- {python_sdk_remote-0.0.91 → python_sdk_remote-0.0.93}/python_sdk_remote/src/mini_logger.py +0 -0
- {python_sdk_remote-0.0.91 → python_sdk_remote-0.0.93}/python_sdk_remote/src/our_object.py +0 -0
- {python_sdk_remote-0.0.91 → python_sdk_remote-0.0.93}/python_sdk_remote/src/unified_json.py +0 -0
- {python_sdk_remote-0.0.91 → python_sdk_remote-0.0.93}/python_sdk_remote/src/valid_json_versions.py +0 -0
- {python_sdk_remote-0.0.91 → python_sdk_remote-0.0.93}/python_sdk_remote/src/validate_environment.py +0 -0
- {python_sdk_remote-0.0.91 → python_sdk_remote-0.0.93}/python_sdk_remote.egg-info/dependency_links.txt +0 -0
- {python_sdk_remote-0.0.91 → python_sdk_remote-0.0.93}/python_sdk_remote.egg-info/requires.txt +0 -0
- {python_sdk_remote-0.0.91 → python_sdk_remote-0.0.93}/python_sdk_remote.egg-info/top_level.txt +0 -0
- {python_sdk_remote-0.0.91 → python_sdk_remote-0.0.93}/setup.cfg +0 -0
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
# python-package
|
|
1
|
+
# python-sdk-package
|
|
2
|
+
|
|
3
|
+
https://github.com/grosser/repo_dependency_graph Ruby, Graph the dependencies of your repositories
|
|
4
|
+
https://github.com/thebjorn/pydeps Python
|
|
2
5
|
|
|
3
6
|
To create local package and remote package layers (not to create GraphQL and REST-API layers)
|
|
4
7
|
|
|
@@ -3,7 +3,7 @@ import os
|
|
|
3
3
|
from logger_local.LoggerComponentEnum import LoggerComponentEnum
|
|
4
4
|
|
|
5
5
|
PYTHON_SDK_LOCAL_COMPONENT_ID = 184
|
|
6
|
-
PYTHON_SDK_LOCAL_COMPONENT_NAME = '
|
|
6
|
+
PYTHON_SDK_LOCAL_COMPONENT_NAME = 'python_sdk_remote'
|
|
7
7
|
|
|
8
8
|
ENVIRONMENT_NAME = os.getenv("ENVIRONMENT_NAME")
|
|
9
9
|
BRAND_NAME = os.getenv("BRAND_NAME")
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# pip install BeautifulSoup4 requests importlib-metadata
|
|
2
|
+
import subprocess
|
|
3
|
+
import sys
|
|
4
|
+
import json
|
|
5
|
+
from collections import defaultdict
|
|
6
|
+
|
|
7
|
+
import importlib_metadata
|
|
8
|
+
import requests
|
|
9
|
+
from bs4 import BeautifulSoup
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def install(packages):
|
|
13
|
+
print("Installing...", packages)
|
|
14
|
+
if isinstance(packages, str):
|
|
15
|
+
packages = [packages]
|
|
16
|
+
try:
|
|
17
|
+
subprocess.run([sys.executable, "-m", "pip", "install", "-U", "--no-deps"] + packages, check=False)
|
|
18
|
+
except Exception as e:
|
|
19
|
+
print(e)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def get_dependencies_per_package(include_packages):
|
|
23
|
+
dependencies_per_package = defaultdict(list)
|
|
24
|
+
for dist in importlib_metadata.distributions():
|
|
25
|
+
package_name = dist.metadata['Name']
|
|
26
|
+
if package_name not in include_packages:
|
|
27
|
+
continue
|
|
28
|
+
|
|
29
|
+
dependencies = dist.metadata.get_all('Requires-Dist', [])
|
|
30
|
+
for dependency in dependencies:
|
|
31
|
+
depend_on = dependency.split()[0]
|
|
32
|
+
if depend_on in include_packages:
|
|
33
|
+
dependencies_per_package[depend_on].append(package_name)
|
|
34
|
+
|
|
35
|
+
return dependencies_per_package
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def get_included_packages():
|
|
39
|
+
url = "https://pypi.org/user/circles/"
|
|
40
|
+
class_name = "package-snippet__title"
|
|
41
|
+
|
|
42
|
+
response = requests.get(url)
|
|
43
|
+
soup = BeautifulSoup(response.text, "html.parser")
|
|
44
|
+
package_names = soup.find_all("h3", class_=class_name)
|
|
45
|
+
included_packages = [package_name.text for package_name in package_names]
|
|
46
|
+
install(included_packages)
|
|
47
|
+
return included_packages
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def main():
|
|
51
|
+
include_packages = get_included_packages()
|
|
52
|
+
dependencies_per_package = get_dependencies_per_package(include_packages)
|
|
53
|
+
with open('dependencies.json', 'w') as f:
|
|
54
|
+
json.dump(dependencies_per_package, f, indent=4)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
if __name__ == "__main__":
|
|
58
|
+
main()
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from http_constants import status
|
|
3
|
+
|
|
4
|
+
from .mini_logger import MiniLogger as logger
|
|
5
|
+
|
|
6
|
+
HEADERS_KEY = 'headers'
|
|
7
|
+
AUTHORIZATION_KEY = 'authorization'
|
|
8
|
+
AUTHORIZATION_PREFIX = 'Bearer '
|
|
9
|
+
|
|
10
|
+
# TODO Align those methods with typescript-sdk https://github.com/circles-zone/typescript-sdk-remote-typescript-package/blob/dev/typescript-sdk/src/utils/index.ts # noqa501
|
|
11
|
+
# TODO Shall we create also createInternalServerErrorHttpResponse(), createOkHttpResponse() like we have in TypeScript?
|
|
12
|
+
|
|
13
|
+
# Former name was create_http_headers()
|
|
14
|
+
def create_authorization_http_headers(user_jwt: str) -> dict:
|
|
15
|
+
logger.start(object={"user_jwt": user_jwt})
|
|
16
|
+
authorization_http_headers = {
|
|
17
|
+
'Content-Type': 'application/json',
|
|
18
|
+
'Authorization': AUTHORIZATION_PREFIX + user_jwt,
|
|
19
|
+
}
|
|
20
|
+
logger.end(object={"authorization_http_headers": authorization_http_headers})
|
|
21
|
+
return authorization_http_headers
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def get_user_jwt_from_event(event: dict) -> str:
|
|
25
|
+
logger.start(object={"event": event})
|
|
26
|
+
auth_header = event.get(HEADERS_KEY, {}).get(AUTHORIZATION_KEY)
|
|
27
|
+
if auth_header is None:
|
|
28
|
+
auth_header = event.get(HEADERS_KEY, {}).get(AUTHORIZATION_KEY.capitalize())
|
|
29
|
+
user_jwt = auth_header.split(AUTHORIZATION_PREFIX)[1]
|
|
30
|
+
logger.end(object={"user_jwt": user_jwt})
|
|
31
|
+
return user_jwt
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def create_return_http_headers() -> dict:
|
|
35
|
+
logger.start()
|
|
36
|
+
return_http_headers = {
|
|
37
|
+
"Content-Type": "application/json",
|
|
38
|
+
"Access-Control-Allow-Origin": "*",
|
|
39
|
+
}
|
|
40
|
+
logger.end(object={"return_http_headers": return_http_headers})
|
|
41
|
+
return return_http_headers
|
|
42
|
+
|
|
43
|
+
def create_error_http_response(exception: Exception) -> dict:
|
|
44
|
+
logger.start(object={"exception": exception})
|
|
45
|
+
error_http_response = {
|
|
46
|
+
"statusCode": status.BAD_GATEWAY,
|
|
47
|
+
"headers": create_return_http_headers(),
|
|
48
|
+
"body": create_http_body({"error": str(exception)})
|
|
49
|
+
}
|
|
50
|
+
logger.end(object={"error_http_response": error_http_response})
|
|
51
|
+
return error_http_response
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def create_ok_http_response(body: dict) -> dict:
|
|
55
|
+
logger.start(object={"body": body})
|
|
56
|
+
ok_http_response = {
|
|
57
|
+
"statusCode": status.OK,
|
|
58
|
+
"headers": create_return_http_headers(),
|
|
59
|
+
"body": create_http_body(body)
|
|
60
|
+
}
|
|
61
|
+
logger.end(object={"ok_http_response": ok_http_response})
|
|
62
|
+
return ok_http_response
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
# https://google.github.io/styleguide/jsoncstyleguide.xml?showone=Property_Name_Format#Property_Name_Format
|
|
66
|
+
def create_http_body(body: dict) -> str:
|
|
67
|
+
# TODO console.warning() if the body is not a valid camelCase JSON
|
|
68
|
+
# https://stackoverflow.com/questions/17156078/converting-identifier-naming-between-camelcase-and-underscores-during-json-seria
|
|
69
|
+
logger.start(object={"body": body})
|
|
70
|
+
http_body = json.dumps(body)
|
|
71
|
+
logger.end(object={"http_body": http_body})
|
|
72
|
+
return http_body
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import json
|
|
2
1
|
import os
|
|
3
2
|
from datetime import date, datetime, time, timedelta
|
|
4
3
|
from dotenv import load_dotenv
|
|
5
4
|
from url_remote.environment_name_enum import EnvironmentName
|
|
6
5
|
from urllib.parse import urlparse
|
|
7
|
-
from http_constants import status
|
|
8
6
|
|
|
7
|
+
from .http_response import (create_authorization_http_headers, get_user_jwt_from_event, # noqa - used for backwards compatibility
|
|
8
|
+
create_return_http_headers, create_error_http_response, create_ok_http_response,
|
|
9
|
+
create_http_body)
|
|
9
10
|
from .mini_logger import MiniLogger as logger
|
|
10
11
|
|
|
11
12
|
load_dotenv()
|
|
@@ -51,56 +52,54 @@ def is_valid_time_range(time_range: tuple) -> bool:
|
|
|
51
52
|
"""
|
|
52
53
|
Validate that the time range is in the format 'HH:MM:SS'.
|
|
53
54
|
"""
|
|
54
|
-
|
|
55
|
-
logger.start(IS_VALID_TIME_RANGE_METHOD_NAME, object={
|
|
56
|
-
"time_range": time_range.__str__()})
|
|
55
|
+
logger.start(object={"time_range": time_range.__str__()})
|
|
57
56
|
if len(time_range) != 2:
|
|
58
|
-
logger.end(
|
|
59
|
-
"is_valid_time_range_result": False, "reason": "len(time_range) != 2"})
|
|
57
|
+
logger.end(object={"is_valid_time_range_result": False, "reason": "len(time_range) != 2"})
|
|
60
58
|
return False
|
|
61
59
|
|
|
62
60
|
for time_obj in time_range:
|
|
63
61
|
if not isinstance(time_obj, time):
|
|
64
|
-
logger.end(
|
|
62
|
+
logger.end(object={
|
|
65
63
|
"is_valid_time_range_result": False, "reason": "time_range contains non-time objects"})
|
|
66
64
|
return False
|
|
67
65
|
time_str = time_obj.strftime('%H:%M:%S')
|
|
68
66
|
if time_obj.strftime('%H:%M:%S') != time_str:
|
|
69
|
-
logger.end(
|
|
67
|
+
logger.end(object={
|
|
70
68
|
"is_valid_time_range_result": False, "reason": "time_range contains invalid time format"})
|
|
71
69
|
return False
|
|
72
70
|
|
|
73
|
-
logger.end(
|
|
74
|
-
"is_valid_time_range_result": True})
|
|
71
|
+
logger.end(object={"is_valid_time_range_result": True})
|
|
75
72
|
return True
|
|
76
73
|
|
|
77
74
|
|
|
75
|
+
# TODO shall we also use Url type and not only str? - Strongly Type which I prefer
|
|
76
|
+
# (if yes we should change it also in all the calls to this function)
|
|
78
77
|
def validate_url(url: str):
|
|
78
|
+
logger.start(object={"url": url})
|
|
79
79
|
if url is not None or url != "":
|
|
80
80
|
parsed_url = urlparse(url)
|
|
81
|
-
|
|
82
|
-
|
|
81
|
+
is_valid_url = parsed_url.scheme and parsed_url.netloc
|
|
82
|
+
else:
|
|
83
|
+
is_valid_url = True
|
|
84
|
+
logger.end(object={"is_valid_url": is_valid_url})
|
|
85
|
+
return is_valid_url
|
|
83
86
|
|
|
84
87
|
|
|
85
88
|
def is_valid_date_range(date_range: tuple) -> bool:
|
|
86
89
|
"""
|
|
87
90
|
Validate that the date range is in the format 'YYYY-MM-DD'.
|
|
88
91
|
"""
|
|
89
|
-
|
|
90
|
-
logger.start(IS_VALID_DATE_RANGE_METHOD_NAME, object={
|
|
91
|
-
"date_range": date_range.__str__()})
|
|
92
|
+
logger.start(object={"date_range": date_range.__str__()})
|
|
92
93
|
if len(date_range) != 2:
|
|
93
|
-
logger.end(
|
|
94
|
-
"is_valid_date_range_result": False, "reason": "len(date_range) != 2"})
|
|
94
|
+
logger.end(object={"is_valid_date_range_result": False, "reason": "len(date_range) != 2"})
|
|
95
95
|
return False
|
|
96
96
|
|
|
97
97
|
for date_obj in date_range:
|
|
98
98
|
if not isinstance(date_obj, date):
|
|
99
|
-
logger.end(
|
|
99
|
+
logger.end(object={
|
|
100
100
|
"is_valid_date_range_result": False, "reason": "date_range contains non-date objects"})
|
|
101
101
|
return False
|
|
102
|
-
logger.end(
|
|
103
|
-
"is_valid_date_range_result": True})
|
|
102
|
+
logger.end(object={"is_valid_date_range_result": True})
|
|
104
103
|
return True
|
|
105
104
|
|
|
106
105
|
|
|
@@ -108,21 +107,16 @@ def is_valid_datetime_range(datetime_range: tuple) -> bool:
|
|
|
108
107
|
"""
|
|
109
108
|
Validate that the datetime range is in the format 'YYYY-MM-DD HH:MM:SS'.
|
|
110
109
|
"""
|
|
111
|
-
|
|
112
|
-
logger.start(IS_VALID_DATETIME_RANGE_METHOD_NAME, object={
|
|
113
|
-
"datetime_range": datetime_range.__str__()})
|
|
110
|
+
logger.start(object={"datetime_range": datetime_range.__str__()})
|
|
114
111
|
if len(datetime_range) != 2:
|
|
115
|
-
logger.end(
|
|
116
|
-
"is_valid_datetime_range_result": False, "reason": "len(datetime_range) != 2"})
|
|
112
|
+
logger.end(object={"is_valid_datetime_range_result": False, "reason": "len(datetime_range) != 2"})
|
|
117
113
|
return False
|
|
118
114
|
|
|
119
115
|
for datetime_obj in datetime_range:
|
|
120
116
|
if not isinstance(datetime_obj, datetime):
|
|
121
|
-
logger.end(
|
|
122
|
-
"is_valid_datetime_range_result": False, "reason": "datetime_range contains non-datetime objects"})
|
|
117
|
+
logger.end(object={"is_valid_datetime_range_result": False, "reason": "datetime_range contains non-datetime objects"})
|
|
123
118
|
return False
|
|
124
|
-
logger.end(
|
|
125
|
-
"is_valid_datetime_range_result": True})
|
|
119
|
+
logger.end(object={"is_valid_datetime_range_result": True})
|
|
126
120
|
return True
|
|
127
121
|
|
|
128
122
|
|
|
@@ -148,27 +142,25 @@ def is_list_of_dicts(obj: object) -> bool:
|
|
|
148
142
|
>>> is_list_of_dicts(1)
|
|
149
143
|
False
|
|
150
144
|
"""
|
|
151
|
-
|
|
152
|
-
logger.start(IS_LIST_OF_DICTS_FUNCTION_NAME, object={"obj": obj})
|
|
145
|
+
logger.start(object={"obj": obj})
|
|
153
146
|
try:
|
|
154
147
|
if not isinstance(obj, list):
|
|
155
148
|
is_list_of_dicts_result = False
|
|
156
|
-
logger.end(
|
|
157
|
-
"is_list_of_dicts_result": is_list_of_dicts_result})
|
|
149
|
+
logger.end(object={"is_list_of_dicts_result": is_list_of_dicts_result})
|
|
158
150
|
return is_list_of_dicts_result
|
|
159
151
|
for item in obj:
|
|
160
152
|
if not isinstance(item, dict):
|
|
161
153
|
is_list_of_dicts_result = False
|
|
162
|
-
logger.end(
|
|
154
|
+
logger.end(object={
|
|
163
155
|
"is_list_of_dicts_result": is_list_of_dicts_result})
|
|
164
156
|
return is_list_of_dicts_result
|
|
165
157
|
is_list_of_dicts_result = True
|
|
166
|
-
logger.end(
|
|
158
|
+
logger.end(object={
|
|
167
159
|
"is_list_of_dicts_result": is_list_of_dicts_result})
|
|
168
160
|
return is_list_of_dicts_result
|
|
169
161
|
except Exception as exception:
|
|
170
|
-
logger.exception(
|
|
171
|
-
logger.end(
|
|
162
|
+
logger.exception(object=exception)
|
|
163
|
+
logger.end()
|
|
172
164
|
raise
|
|
173
165
|
|
|
174
166
|
|
|
@@ -183,15 +175,14 @@ def is_time_in_time_range(check_time: time, time_range: tuple) -> bool:
|
|
|
183
175
|
Returns:
|
|
184
176
|
bool: True if the check_time is within the time range, False otherwise.
|
|
185
177
|
"""
|
|
186
|
-
|
|
187
|
-
logger.start(IS_TIME_IN_TIME_RANGE_METHOD_NAME, object={
|
|
178
|
+
logger.start(object={
|
|
188
179
|
"check_time": check_time.__str__(), "time_range": time_range.__str__()})
|
|
189
180
|
if not is_valid_time_range(time_range) or not isinstance(check_time, time):
|
|
190
|
-
logger.end(
|
|
181
|
+
logger.end(object={
|
|
191
182
|
"is_time_in_time_range_result": False})
|
|
192
183
|
return False
|
|
193
184
|
start_time, end_time = time_range
|
|
194
|
-
logger.end(
|
|
185
|
+
logger.end(object={
|
|
195
186
|
"is_time_in_time_range_result": start_time <= check_time <= end_time})
|
|
196
187
|
return start_time <= check_time <= end_time
|
|
197
188
|
|
|
@@ -207,16 +198,15 @@ def is_date_in_date_range(check_date: date, date_range: tuple) -> bool:
|
|
|
207
198
|
Returns:
|
|
208
199
|
bool: True if the check_date is within the date range, False otherwise.
|
|
209
200
|
"""
|
|
210
|
-
|
|
211
|
-
logger.start(IS_DATE_IN_DATE_RANGE_METHOD_NAME, object={
|
|
201
|
+
logger.start(object={
|
|
212
202
|
"check_date": check_date.__str__(), "date_range": date_range.__str__()})
|
|
213
203
|
if not is_valid_date_range(date_range) or not isinstance(check_date, date):
|
|
214
|
-
logger.end(
|
|
204
|
+
logger.end(object={
|
|
215
205
|
"is_date_in_date_range_result": False})
|
|
216
206
|
return False
|
|
217
207
|
|
|
218
208
|
start_date, end_date = date_range
|
|
219
|
-
logger.end(
|
|
209
|
+
logger.end(object={
|
|
220
210
|
"is_date_in_date_range_result": start_date <= check_date <= end_date})
|
|
221
211
|
return start_date <= check_date <= end_date
|
|
222
212
|
|
|
@@ -232,67 +222,19 @@ def is_datetime_in_datetime_range(check_datetime: datetime, datetime_range: tupl
|
|
|
232
222
|
Returns:
|
|
233
223
|
bool: True if the check_datetime is within the datetime range, False otherwise.
|
|
234
224
|
"""
|
|
235
|
-
|
|
236
|
-
logger.start(IS_DATETIME_IN_DATETIME_RANGE_METHOD_NAME)
|
|
225
|
+
logger.start()
|
|
237
226
|
if not is_valid_datetime_range(datetime_range) or not isinstance(check_datetime, datetime):
|
|
238
|
-
logger.end(
|
|
227
|
+
logger.end(object={
|
|
239
228
|
"is_valid_datetime_range": False})
|
|
240
229
|
return False
|
|
241
230
|
|
|
242
231
|
start_datetime, end_datetime = datetime_range
|
|
243
232
|
is_datetime_in_datetime_range_result = start_datetime <= check_datetime <= end_datetime
|
|
244
|
-
logger.end(
|
|
233
|
+
logger.end(object={
|
|
245
234
|
"is_datetime_in_datetime_range_result": is_datetime_in_datetime_range_result})
|
|
246
235
|
return is_datetime_in_datetime_range_result
|
|
247
236
|
|
|
248
237
|
|
|
249
|
-
# TODO Align those methods with typescript-sdk https://github.com/circles-zone/typescript-sdk-remote-typescript-package/blob/dev/typescript-sdk/src/utils/index.ts # noqa501
|
|
250
|
-
# TODO Take those three functions to a separate file http_response.py
|
|
251
|
-
# TODO Shall we create also createInternalServerErrorHttpResponse(), createOkHttpResponse() like we have in TypeScript?
|
|
252
|
-
|
|
253
|
-
# Former name was create_http_headers()
|
|
254
|
-
def create_authorization_http_headers(user_jwt: str) -> dict:
|
|
255
|
-
return {
|
|
256
|
-
'Content-Type': 'application/json',
|
|
257
|
-
'Authorization': f'Bearer {user_jwt}',
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
def get_user_jwt_from_event(event: dict) -> str:
|
|
262
|
-
auth_header = event.get('headers', {}).get('authorization')
|
|
263
|
-
if auth_header is None:
|
|
264
|
-
auth_header = event.get('headers', {}).get('Authorization')
|
|
265
|
-
return auth_header.split('Bearer ')[1]
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
def create_return_http_headers() -> dict:
|
|
269
|
-
return {
|
|
270
|
-
"Content-Type": "application/json",
|
|
271
|
-
"Access-Control-Allow-Origin": "*",
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
def create_error_http_response(exception: Exception) -> dict:
|
|
275
|
-
return {
|
|
276
|
-
"statusCode": status.BAD_GATEWAY,
|
|
277
|
-
"headers": create_return_http_headers(),
|
|
278
|
-
"body": create_http_body({"error": str(exception)})
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
def create_ok_http_response(body: dict) -> dict:
|
|
282
|
-
return {
|
|
283
|
-
"statusCode": status.OK,
|
|
284
|
-
"headers": create_return_http_headers(),
|
|
285
|
-
"body": create_http_body(body)
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
# https://google.github.io/styleguide/jsoncstyleguide.xml?showone=Property_Name_Format#Property_Name_Format
|
|
290
|
-
def create_http_body(body: dict) -> str:
|
|
291
|
-
# TODO console.warning() if the body is not a valid camelCase JSON
|
|
292
|
-
# https://stackoverflow.com/questions/17156078/converting-identifier-naming-between-camelcase-and-underscores-during-json-seria
|
|
293
|
-
return json.dumps(body)
|
|
294
|
-
|
|
295
|
-
|
|
296
238
|
def get_brand_name() -> str:
|
|
297
239
|
return our_get_env("BRAND_NAME")
|
|
298
240
|
|
|
@@ -304,10 +246,12 @@ def get_environment_name() -> str:
|
|
|
304
246
|
|
|
305
247
|
|
|
306
248
|
def our_get_env(key: str, default: str = None, raise_if_not_found: bool = True) -> str:
|
|
307
|
-
|
|
308
|
-
|
|
249
|
+
logger.start(object={"key": key, "default": default, "raise_if_not_found": raise_if_not_found})
|
|
250
|
+
env_var = os.getenv(key, default)
|
|
251
|
+
if raise_if_not_found and env_var is None:
|
|
309
252
|
raise Exception(f"Environment variable {key} not found")
|
|
310
|
-
|
|
253
|
+
logger.end(object={"env_var": env_var})
|
|
254
|
+
return env_var
|
|
311
255
|
|
|
312
256
|
|
|
313
257
|
def get_sql_hostname() -> str:
|
{python_sdk_remote-0.0.91 → python_sdk_remote-0.0.93}/python_sdk_remote.egg-info/SOURCES.txt
RENAMED
|
@@ -8,6 +8,8 @@ python_sdk_remote.egg-info/requires.txt
|
|
|
8
8
|
python_sdk_remote.egg-info/top_level.txt
|
|
9
9
|
python_sdk_remote/src/__init__.py
|
|
10
10
|
python_sdk_remote/src/constants.py
|
|
11
|
+
python_sdk_remote/src/get_dependencies.py
|
|
12
|
+
python_sdk_remote/src/http_response.py
|
|
11
13
|
python_sdk_remote/src/item.py
|
|
12
14
|
python_sdk_remote/src/mini_logger.py
|
|
13
15
|
python_sdk_remote/src/our_object.py
|
|
@@ -7,7 +7,7 @@ package_dir = PACKAGE_NAME.replace("-", "_")
|
|
|
7
7
|
# python -m build needs pyproject.toml or setup.py
|
|
8
8
|
setuptools.setup(
|
|
9
9
|
name=PACKAGE_NAME,
|
|
10
|
-
version='0.0.
|
|
10
|
+
version='0.0.93', # https://pypi.org/project/python-sdk-remote/
|
|
11
11
|
author="Circles",
|
|
12
12
|
author_email="info@circles.life",
|
|
13
13
|
description="PyPI Package for Circles Python SDK Local Python",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_sdk_remote-0.0.91 → python_sdk_remote-0.0.93}/python_sdk_remote/src/valid_json_versions.py
RENAMED
|
File without changes
|
{python_sdk_remote-0.0.91 → python_sdk_remote-0.0.93}/python_sdk_remote/src/validate_environment.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_sdk_remote-0.0.91 → python_sdk_remote-0.0.93}/python_sdk_remote.egg-info/requires.txt
RENAMED
|
File without changes
|
{python_sdk_remote-0.0.91 → python_sdk_remote-0.0.93}/python_sdk_remote.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|