python-sdk-remote 0.0.110__tar.gz → 0.0.112__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.

Files changed (20) hide show
  1. {python_sdk_remote-0.0.110 → python_sdk_remote-0.0.112}/PKG-INFO +2 -2
  2. {python_sdk_remote-0.0.110 → python_sdk_remote-0.0.112}/python_sdk_remote/src/http_response.py +13 -6
  3. {python_sdk_remote-0.0.110 → python_sdk_remote-0.0.112}/python_sdk_remote/src/mini_logger.py +0 -1
  4. {python_sdk_remote-0.0.110 → python_sdk_remote-0.0.112}/python_sdk_remote/src/utilities.py +40 -12
  5. {python_sdk_remote-0.0.110 → python_sdk_remote-0.0.112}/python_sdk_remote/src/validate_environment.py +0 -1
  6. {python_sdk_remote-0.0.110 → python_sdk_remote-0.0.112}/python_sdk_remote.egg-info/PKG-INFO +2 -2
  7. {python_sdk_remote-0.0.110 → python_sdk_remote-0.0.112}/setup.py +2 -2
  8. {python_sdk_remote-0.0.110 → python_sdk_remote-0.0.112}/README.md +0 -0
  9. {python_sdk_remote-0.0.110 → python_sdk_remote-0.0.112}/pyproject.toml +0 -0
  10. {python_sdk_remote-0.0.110 → python_sdk_remote-0.0.112}/python_sdk_remote/src/__init__.py +0 -0
  11. {python_sdk_remote-0.0.110 → python_sdk_remote-0.0.112}/python_sdk_remote/src/constants.py +0 -0
  12. {python_sdk_remote-0.0.110 → python_sdk_remote-0.0.112}/python_sdk_remote/src/item.py +0 -0
  13. {python_sdk_remote-0.0.110 → python_sdk_remote-0.0.112}/python_sdk_remote/src/our_object.py +0 -0
  14. {python_sdk_remote-0.0.110 → python_sdk_remote-0.0.112}/python_sdk_remote/src/unified_json.py +0 -0
  15. {python_sdk_remote-0.0.110 → python_sdk_remote-0.0.112}/python_sdk_remote/src/valid_json_versions.py +0 -0
  16. {python_sdk_remote-0.0.110 → python_sdk_remote-0.0.112}/python_sdk_remote.egg-info/SOURCES.txt +0 -0
  17. {python_sdk_remote-0.0.110 → python_sdk_remote-0.0.112}/python_sdk_remote.egg-info/dependency_links.txt +0 -0
  18. {python_sdk_remote-0.0.110 → python_sdk_remote-0.0.112}/python_sdk_remote.egg-info/requires.txt +0 -0
  19. {python_sdk_remote-0.0.110 → python_sdk_remote-0.0.112}/python_sdk_remote.egg-info/top_level.txt +0 -0
  20. {python_sdk_remote-0.0.110 → python_sdk_remote-0.0.112}/setup.cfg +0 -0
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: python-sdk-remote
3
- Version: 0.0.110
3
+ Version: 0.0.112
4
4
  Summary: PyPI Package for Circles Python SDK Local Python
5
5
  Home-page: https://github.com/circles-zone/python-sdk-remote-python-package
6
6
  Author: Circles
7
- Author-email: info@circles.life
7
+ Author-email: info@circles.ai
8
8
  Classifier: Programming Language :: Python :: 3
9
9
  Classifier: License :: Other/Proprietary License
10
10
  Classifier: Operating System :: OS Independent
@@ -1,6 +1,7 @@
1
1
  import json
2
- from typing import Any
2
+ import traceback
3
3
  from http import HTTPStatus
4
+ from typing import Any
4
5
 
5
6
  from .mini_logger import MiniLogger as logger
6
7
 
@@ -8,6 +9,7 @@ HEADERS_KEY = 'headers'
8
9
  AUTHORIZATION_KEY = 'authorization'
9
10
  AUTHORIZATION_PREFIX = 'Bearer '
10
11
 
12
+
11
13
  # 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
12
14
  # TODO Shall we create also createInternalServerErrorHttpResponse(), createOkHttpResponse() like we have in TypeScript?
13
15
 
@@ -17,15 +19,18 @@ def get_payload_dict_from_event(event: dict) -> dict:
17
19
  """Extracts params sent with payload"""
18
20
  return json.loads(event.get('body') or '{}')
19
21
 
22
+
20
23
  def get_path_parameters_dict_from_event(event: dict) -> dict:
21
24
  """Extracts params sent implicitly: `url/param?test=5` -> param
22
25
  (when the path is defined with /{param})"""
23
26
  return event.get('pathParameters') or {}
24
27
 
28
+
25
29
  def get_query_string_parameters_from_event(event: dict) -> dict:
26
30
  """Extracts params sent explicitly: `url/test?a=1&b=2` -> {'a': '1', 'b': '2'}"""
27
31
  return event.get("queryStringParameters") or {} # params sent with ?a=1&b=2
28
32
 
33
+
29
34
  def create_authorization_http_headers(user_jwt: str) -> dict:
30
35
  logger.start(object={"user_jwt": user_jwt})
31
36
  authorization_http_headers = {
@@ -55,13 +60,15 @@ def create_return_http_headers() -> dict:
55
60
  logger.end(object={"return_http_headers": return_http_headers})
56
61
  return return_http_headers
57
62
 
63
+
58
64
  def create_error_http_response(exception: Exception, status_code: HTTPStatus = HTTPStatus.BAD_REQUEST) -> dict:
59
65
  logger.start(object={"exception": exception})
60
66
  error_http_response = {
61
- "statusCode": status_code.value,
62
- "headers": create_return_http_headers(),
63
- "body": create_http_body({"error": str(exception)})
64
- }
67
+ "statusCode": status_code.value,
68
+ "headers": create_return_http_headers(),
69
+ "body": create_http_body({"error": str(exception)}),
70
+ "traceback": traceback.format_exc()
71
+ }
65
72
  logger.end(object={"error_http_response": error_http_response})
66
73
  return error_http_response
67
74
 
@@ -84,4 +91,4 @@ def create_http_body(body: Any) -> str:
84
91
  logger.start(object={"body": body})
85
92
  http_body = json.dumps(body)
86
93
  logger.end(object={"http_body": http_body})
87
- return http_body
94
+ return http_body
@@ -1,7 +1,6 @@
1
1
  import logging
2
2
  import os
3
3
  import sys
4
- from datetime import datetime
5
4
 
6
5
  LOGGER_MINIMUM_SEVERITY = os.getenv("LOGGER_MINIMUM_SEVERITY", "INFO").upper()
7
6
  # logging expects NOTSET/DEBUG/INFO/WARNING/ERROR/FATAL/CRITICAL
@@ -1,13 +1,15 @@
1
+ import json
1
2
  import os
2
3
  from datetime import date, datetime, time, timedelta
4
+ from urllib.parse import urlparse
5
+
3
6
  from dotenv import load_dotenv
4
7
  from url_remote.environment_name_enum import EnvironmentName
5
- from urllib.parse import urlparse
6
8
 
9
+ from .mini_logger import MiniLogger as logger
7
10
  from .http_response import (create_authorization_http_headers, get_user_jwt_from_event, # noqa - used for backwards compatibility
8
11
  create_return_http_headers, create_error_http_response, create_ok_http_response,
9
12
  create_http_body)
10
- from .mini_logger import MiniLogger as logger
11
13
 
12
14
  load_dotenv()
13
15
  # raise Exception("Failed to load environment variables from .env file\n"
@@ -18,6 +20,28 @@ load_dotenv()
18
20
  # TODO Use the const/enum from language package
19
21
  DEFAULT_LANG_CODE_STR = "en"
20
22
 
23
+
24
+ def append_if_not_exist(lst: list, item: object) -> None:
25
+ if item not in lst:
26
+ lst.append(item)
27
+
28
+
29
+ def to_dict(data: json or dict or None) -> dict:
30
+ if data is None:
31
+ return {}
32
+ if isinstance(data, dict):
33
+ return data
34
+ return json.loads(data)
35
+
36
+
37
+ def to_json(data: json or dict or None) -> json:
38
+ if data is None:
39
+ data = {}
40
+ if isinstance(data, dict):
41
+ return json.dumps(data)
42
+ return data
43
+
44
+
21
45
  def timedelta_to_time_format(time_delta: timedelta) -> str:
22
46
  """
23
47
  Convert a timedelta to a time format in HH:MM:SS.
@@ -109,7 +133,7 @@ def is_valid_date_range(date_range: tuple) -> bool:
109
133
  return True
110
134
 
111
135
 
112
- def is_valid_datetime_range(datetime_range: tuple) -> bool:
136
+ def is_valid_datetime_range(datetime_range: (datetime, datetime)) -> bool:
113
137
  """
114
138
  Validate that the datetime range is in the format 'YYYY-MM-DD HH:MM:SS'.
115
139
  """
@@ -118,10 +142,10 @@ def is_valid_datetime_range(datetime_range: tuple) -> bool:
118
142
  logger.end(object={"is_valid_datetime_range_result": False, "reason": "len(datetime_range) != 2"})
119
143
  return False
120
144
 
121
- for datetime_obj in datetime_range:
122
- if not isinstance(datetime_obj, datetime):
123
- logger.end(object={"is_valid_datetime_range_result": False, "reason": "datetime_range contains non-datetime objects"})
124
- return False
145
+ if not all(isinstance(datetime_obj, datetime) for datetime_obj in datetime_range):
146
+ logger.end(object={"is_valid_datetime_range_result": False,
147
+ "reason": "datetime_range contains non-datetime objects"})
148
+ return False
125
149
  logger.end(object={"is_valid_datetime_range_result": True})
126
150
  return True
127
151
 
@@ -217,7 +241,7 @@ def is_date_in_date_range(check_date: date, date_range: tuple) -> bool:
217
241
  return start_date <= check_date <= end_date
218
242
 
219
243
 
220
- def is_datetime_in_datetime_range(check_datetime: datetime, datetime_range: tuple) -> bool:
244
+ def is_datetime_in_datetime_range(check_datetime: datetime, datetime_range: (datetime, datetime)) -> bool:
221
245
  """
222
246
  Check if the given datetime is within the specified datetime range.
223
247
 
@@ -251,15 +275,19 @@ def get_environment_name() -> str:
251
275
  return environment_name
252
276
 
253
277
 
254
- def our_get_env(key: str, default: str = None, raise_if_not_found: bool = True) -> str:
255
- logger.start(object={"key": key, "default": default, "raise_if_not_found": raise_if_not_found})
278
+ def our_get_env(key: str, default: str = None, raise_if_not_found: bool = True,
279
+ raise_if_empty: bool = False) -> str:
280
+ logger.start(object={"key": key, "default": default, "raise_if_not_found": raise_if_not_found,
281
+ "raise_if_empty": raise_if_empty})
256
282
  env_var = os.getenv(key, default)
257
- if raise_if_not_found and env_var is None:
258
- raise Exception(f"Environment variable {key} not found")
283
+ if ((raise_if_not_found and key not in os.environ and default is None)
284
+ or (raise_if_empty and not env_var and not default)):
285
+ raise Exception(f"Environment variable {key} not found - please check your .env file")
259
286
  logger.end(object={"env_var": env_var})
260
287
  return env_var
261
288
 
262
289
 
290
+
263
291
  def get_sql_hostname() -> str:
264
292
  return our_get_env("RDS_HOSTNAME")
265
293
 
@@ -1,5 +1,4 @@
1
1
  # deleted as the validation is done in utilities.our_get_env
2
- from .constants import BRAND_NAME, ENVIRONMENT_NAME, LOGZIO_TOKEN, GOOGLE_PORT_FOR_AUTHENTICATION
3
2
 
4
3
 
5
4
  # TODO Align with https://github.com/circles-zone/typescript-sdk-remote-typescript-package/edit/dev/typescript-sdk/src/utils/index.ts validateTenantEnvironmentVariables() # noqa501
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: python-sdk-remote
3
- Version: 0.0.110
3
+ Version: 0.0.112
4
4
  Summary: PyPI Package for Circles Python SDK Local Python
5
5
  Home-page: https://github.com/circles-zone/python-sdk-remote-python-package
6
6
  Author: Circles
7
- Author-email: info@circles.life
7
+ Author-email: info@circles.ai
8
8
  Classifier: Programming Language :: Python :: 3
9
9
  Classifier: License :: Other/Proprietary License
10
10
  Classifier: Operating System :: OS Independent
@@ -7,9 +7,9 @@ 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.110', # https://pypi.org/project/python-sdk-remote/
10
+ version='0.0.112', # https://pypi.org/project/python-sdk-remote/
11
11
  author="Circles",
12
- author_email="info@circles.life",
12
+ author_email="info@circles.ai",
13
13
  description="PyPI Package for Circles Python SDK Local Python",
14
14
  long_description="This is a package for sharing common functions used in different repositories",
15
15
  long_description_content_type="text/markdown",