python-sdk-remote 0.0.111__tar.gz → 0.0.113__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.111 → python_sdk_remote-0.0.113}/PKG-INFO +3 -2
- {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote/src/utilities.py +61 -11
- {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote.egg-info/PKG-INFO +3 -2
- {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote.egg-info/requires.txt +1 -0
- {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/setup.py +4 -3
- {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/README.md +0 -0
- {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/pyproject.toml +0 -0
- {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote/src/__init__.py +0 -0
- {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote/src/constants.py +0 -0
- {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote/src/http_response.py +0 -0
- {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote/src/item.py +0 -0
- {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote/src/mini_logger.py +0 -0
- {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote/src/our_object.py +0 -0
- {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote/src/unified_json.py +0 -0
- {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote/src/valid_json_versions.py +0 -0
- {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote/src/validate_environment.py +0 -0
- {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote.egg-info/SOURCES.txt +0 -0
- {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote.egg-info/dependency_links.txt +0 -0
- {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote.egg-info/top_level.txt +0 -0
- {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/setup.cfg +0 -0
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: python-sdk-remote
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.113
|
|
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@
|
|
7
|
+
Author-email: info@circlez.ai
|
|
8
8
|
Classifier: Programming Language :: Python :: 3
|
|
9
9
|
Classifier: License :: Other/Proprietary License
|
|
10
10
|
Classifier: Operating System :: OS Independent
|
|
11
11
|
Description-Content-Type: text/markdown
|
|
12
12
|
Requires-Dist: python-dotenv
|
|
13
13
|
Requires-Dist: url-remote
|
|
14
|
+
Requires-Dist: pyjwt
|
|
14
15
|
|
|
15
16
|
This is a package for sharing common functions used in different repositories
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import json
|
|
2
|
+
import jwt
|
|
3
|
+
import re
|
|
2
4
|
import os
|
|
3
5
|
from datetime import date, datetime, time, timedelta
|
|
4
6
|
from urllib.parse import urlparse
|
|
@@ -7,7 +9,8 @@ from dotenv import load_dotenv
|
|
|
7
9
|
from url_remote.environment_name_enum import EnvironmentName
|
|
8
10
|
|
|
9
11
|
from .mini_logger import MiniLogger as logger
|
|
10
|
-
from .http_response import (create_authorization_http_headers,
|
|
12
|
+
from .http_response import (create_authorization_http_headers, # noqa - used for backwards compatibility
|
|
13
|
+
get_user_jwt_from_event,
|
|
11
14
|
create_return_http_headers, create_error_http_response, create_ok_http_response,
|
|
12
15
|
create_http_body)
|
|
13
16
|
|
|
@@ -133,7 +136,7 @@ def is_valid_date_range(date_range: tuple) -> bool:
|
|
|
133
136
|
return True
|
|
134
137
|
|
|
135
138
|
|
|
136
|
-
def is_valid_datetime_range(datetime_range:
|
|
139
|
+
def is_valid_datetime_range(datetime_range: (datetime, datetime)) -> bool:
|
|
137
140
|
"""
|
|
138
141
|
Validate that the datetime range is in the format 'YYYY-MM-DD HH:MM:SS'.
|
|
139
142
|
"""
|
|
@@ -142,11 +145,10 @@ def is_valid_datetime_range(datetime_range: tuple) -> bool:
|
|
|
142
145
|
logger.end(object={"is_valid_datetime_range_result": False, "reason": "len(datetime_range) != 2"})
|
|
143
146
|
return False
|
|
144
147
|
|
|
145
|
-
for datetime_obj in datetime_range:
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
return False
|
|
148
|
+
if not all(isinstance(datetime_obj, datetime) for datetime_obj in datetime_range):
|
|
149
|
+
logger.end(object={"is_valid_datetime_range_result": False,
|
|
150
|
+
"reason": "datetime_range contains non-datetime objects"})
|
|
151
|
+
return False
|
|
150
152
|
logger.end(object={"is_valid_datetime_range_result": True})
|
|
151
153
|
return True
|
|
152
154
|
|
|
@@ -242,7 +244,7 @@ def is_date_in_date_range(check_date: date, date_range: tuple) -> bool:
|
|
|
242
244
|
return start_date <= check_date <= end_date
|
|
243
245
|
|
|
244
246
|
|
|
245
|
-
def is_datetime_in_datetime_range(check_datetime: datetime, datetime_range:
|
|
247
|
+
def is_datetime_in_datetime_range(check_datetime: datetime, datetime_range: (datetime, datetime)) -> bool:
|
|
246
248
|
"""
|
|
247
249
|
Check if the given datetime is within the specified datetime range.
|
|
248
250
|
|
|
@@ -277,11 +279,12 @@ def get_environment_name() -> str:
|
|
|
277
279
|
|
|
278
280
|
|
|
279
281
|
def our_get_env(key: str, default: str = None, raise_if_not_found: bool = True,
|
|
280
|
-
raise_if_empty: bool =
|
|
282
|
+
raise_if_empty: bool = False) -> str:
|
|
281
283
|
logger.start(object={"key": key, "default": default, "raise_if_not_found": raise_if_not_found,
|
|
282
284
|
"raise_if_empty": raise_if_empty})
|
|
283
285
|
env_var = os.getenv(key, default)
|
|
284
|
-
if (raise_if_not_found and
|
|
286
|
+
if ((raise_if_not_found and key not in os.environ and default is None)
|
|
287
|
+
or (raise_if_empty and not env_var and not default)):
|
|
285
288
|
raise Exception(f"Environment variable {key} not found - please check your .env file")
|
|
286
289
|
logger.end(object={"env_var": env_var})
|
|
287
290
|
return env_var
|
|
@@ -299,5 +302,52 @@ def get_sql_password() -> str:
|
|
|
299
302
|
return our_get_env("RDS_PASSWORD")
|
|
300
303
|
|
|
301
304
|
|
|
305
|
+
def get_smartlink_jwt_secret_key() -> str:
|
|
306
|
+
return our_get_env("SMARTLINK_JWT_SECRET_KEY", raise_if_empty=True)
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
def encode_jwt(payload: dict, key: str) -> str:
|
|
310
|
+
"""Example:
|
|
311
|
+
payload = {
|
|
312
|
+
"user_id": 123,
|
|
313
|
+
"username": "john_doe",
|
|
314
|
+
"exp": datetime.datetime.utcnow() + datetime.timedelta(hours=1)
|
|
315
|
+
}
|
|
316
|
+
"""
|
|
317
|
+
return jwt.encode(payload, key, algorithm='HS256')
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
def decode_jwt(token: str, key: str) -> dict:
|
|
321
|
+
"""key can be private / public"""
|
|
322
|
+
return jwt.decode(token, key, algorithms=['HS256'])
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
def obfuscate_log_dict(log_dict: dict) -> dict:
|
|
326
|
+
"""
|
|
327
|
+
Obfuscate keys:
|
|
328
|
+
- %password%
|
|
329
|
+
- %secret%
|
|
330
|
+
- %token%
|
|
331
|
+
- %jwt%
|
|
332
|
+
- %e%mail%
|
|
333
|
+
- %phone%
|
|
334
|
+
- %name% (first / last / nick / user etc.)
|
|
335
|
+
- %address%
|
|
336
|
+
- %ssn%
|
|
337
|
+
"""
|
|
338
|
+
environment_name = get_environment_name()
|
|
339
|
+
if environment_name == EnvironmentName.PLAY1.value:
|
|
340
|
+
return log_dict
|
|
341
|
+
obfuscated_log_dict = {}
|
|
342
|
+
for key, value in log_dict.items():
|
|
343
|
+
if isinstance(value, dict):
|
|
344
|
+
obfuscated_log_dict[key] = obfuscate_log_dict(value)
|
|
345
|
+
elif re.search(r'password|secret|token|jwt|e[\-_]?mail|phone|name|address|ssn', key, re.IGNORECASE):
|
|
346
|
+
obfuscated_log_dict[key] = "***"
|
|
347
|
+
else:
|
|
348
|
+
obfuscated_log_dict[key] = value
|
|
349
|
+
return obfuscated_log_dict
|
|
350
|
+
|
|
351
|
+
|
|
302
352
|
def remove_digits(text: str) -> str:
|
|
303
|
-
return ''.join(
|
|
353
|
+
return ''.join(i for i in text if not i.isdigit())
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: python-sdk-remote
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.113
|
|
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@
|
|
7
|
+
Author-email: info@circlez.ai
|
|
8
8
|
Classifier: Programming Language :: Python :: 3
|
|
9
9
|
Classifier: License :: Other/Proprietary License
|
|
10
10
|
Classifier: Operating System :: OS Independent
|
|
11
11
|
Description-Content-Type: text/markdown
|
|
12
12
|
Requires-Dist: python-dotenv
|
|
13
13
|
Requires-Dist: url-remote
|
|
14
|
+
Requires-Dist: pyjwt
|
|
14
15
|
|
|
15
16
|
This is a package for sharing common functions used in different repositories
|
|
@@ -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.
|
|
10
|
+
version='0.0.113', # https://pypi.org/project/python-sdk-remote/
|
|
11
11
|
author="Circles",
|
|
12
|
-
author_email="info@
|
|
12
|
+
author_email="info@circlez.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",
|
|
@@ -24,6 +24,7 @@ setuptools.setup(
|
|
|
24
24
|
],
|
|
25
25
|
install_requires=[
|
|
26
26
|
"python-dotenv",
|
|
27
|
-
"url-remote"
|
|
27
|
+
"url-remote",
|
|
28
|
+
"pyjwt",
|
|
28
29
|
]
|
|
29
30
|
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote/src/http_response.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote/src/mini_logger.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote/src/unified_json.py
RENAMED
|
File without changes
|
{python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote/src/valid_json_versions.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote.egg-info/SOURCES.txt
RENAMED
|
File without changes
|
|
File without changes
|
{python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|