python-sdk-remote 0.0.112__tar.gz → 0.0.114__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.112 → python_sdk_remote-0.0.114}/PKG-INFO +4 -2
- {python_sdk_remote-0.0.112 → python_sdk_remote-0.0.114}/python_sdk_remote/src/utilities.py +107 -4
- {python_sdk_remote-0.0.112 → python_sdk_remote-0.0.114}/python_sdk_remote.egg-info/PKG-INFO +4 -2
- {python_sdk_remote-0.0.112 → python_sdk_remote-0.0.114}/python_sdk_remote.egg-info/requires.txt +2 -0
- {python_sdk_remote-0.0.112 → python_sdk_remote-0.0.114}/setup.py +5 -3
- {python_sdk_remote-0.0.112 → python_sdk_remote-0.0.114}/README.md +0 -0
- {python_sdk_remote-0.0.112 → python_sdk_remote-0.0.114}/pyproject.toml +0 -0
- {python_sdk_remote-0.0.112 → python_sdk_remote-0.0.114}/python_sdk_remote/src/__init__.py +0 -0
- {python_sdk_remote-0.0.112 → python_sdk_remote-0.0.114}/python_sdk_remote/src/constants.py +0 -0
- {python_sdk_remote-0.0.112 → python_sdk_remote-0.0.114}/python_sdk_remote/src/http_response.py +0 -0
- {python_sdk_remote-0.0.112 → python_sdk_remote-0.0.114}/python_sdk_remote/src/item.py +0 -0
- {python_sdk_remote-0.0.112 → python_sdk_remote-0.0.114}/python_sdk_remote/src/mini_logger.py +0 -0
- {python_sdk_remote-0.0.112 → python_sdk_remote-0.0.114}/python_sdk_remote/src/our_object.py +0 -0
- {python_sdk_remote-0.0.112 → python_sdk_remote-0.0.114}/python_sdk_remote/src/unified_json.py +0 -0
- {python_sdk_remote-0.0.112 → python_sdk_remote-0.0.114}/python_sdk_remote/src/valid_json_versions.py +0 -0
- {python_sdk_remote-0.0.112 → python_sdk_remote-0.0.114}/python_sdk_remote/src/validate_environment.py +0 -0
- {python_sdk_remote-0.0.112 → python_sdk_remote-0.0.114}/python_sdk_remote.egg-info/SOURCES.txt +0 -0
- {python_sdk_remote-0.0.112 → python_sdk_remote-0.0.114}/python_sdk_remote.egg-info/dependency_links.txt +0 -0
- {python_sdk_remote-0.0.112 → python_sdk_remote-0.0.114}/python_sdk_remote.egg-info/top_level.txt +0 -0
- {python_sdk_remote-0.0.112 → python_sdk_remote-0.0.114}/setup.cfg +0 -0
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: python-sdk-remote
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.114
|
|
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
|
+
Requires-Dist: requests
|
|
12
13
|
Requires-Dist: python-dotenv
|
|
13
14
|
Requires-Dist: url-remote
|
|
15
|
+
Requires-Dist: pyjwt
|
|
14
16
|
|
|
15
17
|
This is a package for sharing common functions used in different repositories
|
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
import json
|
|
2
|
+
import jwt
|
|
3
|
+
import requests
|
|
4
|
+
import re
|
|
2
5
|
import os
|
|
3
|
-
|
|
6
|
+
import random
|
|
7
|
+
from datetime import date, datetime, time, timedelta, timezone
|
|
4
8
|
from urllib.parse import urlparse
|
|
5
9
|
|
|
6
10
|
from dotenv import load_dotenv
|
|
7
11
|
from url_remote.environment_name_enum import EnvironmentName
|
|
8
12
|
|
|
9
13
|
from .mini_logger import MiniLogger as logger
|
|
10
|
-
from .http_response import (create_authorization_http_headers,
|
|
14
|
+
from .http_response import (create_authorization_http_headers, # noqa - used for backwards compatibility
|
|
15
|
+
get_user_jwt_from_event,
|
|
11
16
|
create_return_http_headers, create_error_http_response, create_ok_http_response,
|
|
12
17
|
create_http_body)
|
|
13
18
|
|
|
@@ -19,6 +24,7 @@ load_dotenv()
|
|
|
19
24
|
|
|
20
25
|
# TODO Use the const/enum from language package
|
|
21
26
|
DEFAULT_LANG_CODE_STR = "en"
|
|
27
|
+
DEFAULT_DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S"
|
|
22
28
|
|
|
23
29
|
|
|
24
30
|
def append_if_not_exist(lst: list, item: object) -> None:
|
|
@@ -287,7 +293,6 @@ def our_get_env(key: str, default: str = None, raise_if_not_found: bool = True,
|
|
|
287
293
|
return env_var
|
|
288
294
|
|
|
289
295
|
|
|
290
|
-
|
|
291
296
|
def get_sql_hostname() -> str:
|
|
292
297
|
return our_get_env("RDS_HOSTNAME")
|
|
293
298
|
|
|
@@ -300,5 +305,103 @@ def get_sql_password() -> str:
|
|
|
300
305
|
return our_get_env("RDS_PASSWORD")
|
|
301
306
|
|
|
302
307
|
|
|
308
|
+
def get_dialog_jwt_secret_key() -> str:
|
|
309
|
+
return our_get_env("DIALOG_JWT_SECRET_KEY", raise_if_empty=True)
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
def encode_jwt(payload: dict, key: str) -> str:
|
|
313
|
+
"""Example:
|
|
314
|
+
payload = {
|
|
315
|
+
"user_id": 123,
|
|
316
|
+
"username": "john_doe",
|
|
317
|
+
"exp": datetime.datetime.utcnow() + datetime.timedelta(hours=1)
|
|
318
|
+
}
|
|
319
|
+
"""
|
|
320
|
+
return jwt.encode(payload, key, algorithm='HS256')
|
|
321
|
+
|
|
322
|
+
|
|
323
|
+
def decode_jwt(token: str, key: str) -> dict:
|
|
324
|
+
"""key can be private / public"""
|
|
325
|
+
return jwt.decode(token, key, algorithms=['HS256'])
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
def obfuscate_log_dict(log_dict: dict) -> dict:
|
|
329
|
+
"""
|
|
330
|
+
Obfuscate keys:
|
|
331
|
+
- %password%
|
|
332
|
+
- %secret%
|
|
333
|
+
- %token%
|
|
334
|
+
- %jwt%
|
|
335
|
+
- %e%mail%
|
|
336
|
+
- %phone%
|
|
337
|
+
- %name% (first / last / nick / user etc.)
|
|
338
|
+
- %address%
|
|
339
|
+
- %ssn%
|
|
340
|
+
"""
|
|
341
|
+
environment_name = get_environment_name()
|
|
342
|
+
if environment_name == EnvironmentName.PLAY1.value:
|
|
343
|
+
return log_dict
|
|
344
|
+
obfuscated_log_dict = {}
|
|
345
|
+
for key, value in log_dict.items():
|
|
346
|
+
if isinstance(value, dict):
|
|
347
|
+
obfuscated_log_dict[key] = obfuscate_log_dict(value)
|
|
348
|
+
elif re.search(r'password|secret|token|jwt|e[\-_]?mail|phone|name|address|ssn', key, re.IGNORECASE):
|
|
349
|
+
obfuscated_log_dict[key] = "***"
|
|
350
|
+
else:
|
|
351
|
+
obfuscated_log_dict[key] = value
|
|
352
|
+
return obfuscated_log_dict
|
|
353
|
+
|
|
354
|
+
# TODO: add tests to the following functions
|
|
355
|
+
|
|
303
356
|
def remove_digits(text: str) -> str:
|
|
304
|
-
return ''.join(
|
|
357
|
+
return ''.join(i for i in text if not i.isdigit())
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
def generate_otp():
|
|
361
|
+
"""Generates a 6-digit OTP"""
|
|
362
|
+
otp = random.randint(100000, 999999)
|
|
363
|
+
return otp
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
def get_current_datetime_string(datetime_format: str = DEFAULT_DATETIME_FORMAT, tz: timezone = None) -> str:
|
|
367
|
+
current_datetime_string = datetime.now(tz).strftime(datetime_format)
|
|
368
|
+
return current_datetime_string
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
def datetime_from_str(date_str: str, datetime_format: str = DEFAULT_DATETIME_FORMAT) -> datetime:
|
|
372
|
+
return datetime.strptime(date_str, datetime_format)
|
|
373
|
+
|
|
374
|
+
|
|
375
|
+
def datetime_to_str(input_datetime: datetime, datetime_format: str = DEFAULT_DATETIME_FORMAT) -> str:
|
|
376
|
+
return input_datetime.strftime(datetime_format)
|
|
377
|
+
|
|
378
|
+
|
|
379
|
+
def validate_arguments(args: dict) -> None:
|
|
380
|
+
"""
|
|
381
|
+
Validate method arguments to ensure they are not None or ''
|
|
382
|
+
:param args: arguments to be validated (usually locals())
|
|
383
|
+
:return: True if all arguments are not None or '', False otherwise
|
|
384
|
+
"""
|
|
385
|
+
for arg, value in args.items():
|
|
386
|
+
if not arg:
|
|
387
|
+
raise ValueError(f"Argument {arg} is cannot be empty (got {value})")
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
def reformat_time_string(input_str: str) -> str:
|
|
391
|
+
"""Example:
|
|
392
|
+
"1234" -> "12:34:00:00"
|
|
393
|
+
"""
|
|
394
|
+
hours = input_str[:2]
|
|
395
|
+
minutes = "00" if len(input_str) < 4 else input_str[2:4]
|
|
396
|
+
seconds = "00" if len(input_str) < 6 else input_str[4:6]
|
|
397
|
+
milliseconds = "00" if len(input_str) < 8 else input_str[6:8]
|
|
398
|
+
time_format = f"{hours}:{minutes}:{seconds}:{milliseconds}"
|
|
399
|
+
return time_format
|
|
400
|
+
|
|
401
|
+
|
|
402
|
+
def get_ip_v4():
|
|
403
|
+
return requests.get('https://ipv4.seeip.org/jsonip').json()['ip']
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
def get_ip_v6():
|
|
407
|
+
return requests.get('https://api.seeip.org/jsonip').json()['ip']
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: python-sdk-remote
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.114
|
|
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
|
+
Requires-Dist: requests
|
|
12
13
|
Requires-Dist: python-dotenv
|
|
13
14
|
Requires-Dist: url-remote
|
|
15
|
+
Requires-Dist: pyjwt
|
|
14
16
|
|
|
15
17
|
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.114', # 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",
|
|
@@ -23,7 +23,9 @@ setuptools.setup(
|
|
|
23
23
|
"Operating System :: OS Independent",
|
|
24
24
|
],
|
|
25
25
|
install_requires=[
|
|
26
|
+
"requests",
|
|
26
27
|
"python-dotenv",
|
|
27
|
-
"url-remote"
|
|
28
|
+
"url-remote",
|
|
29
|
+
"pyjwt",
|
|
28
30
|
]
|
|
29
31
|
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_sdk_remote-0.0.112 → python_sdk_remote-0.0.114}/python_sdk_remote/src/http_response.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_sdk_remote-0.0.112 → python_sdk_remote-0.0.114}/python_sdk_remote/src/mini_logger.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_sdk_remote-0.0.112 → python_sdk_remote-0.0.114}/python_sdk_remote/src/unified_json.py
RENAMED
|
File without changes
|
{python_sdk_remote-0.0.112 → python_sdk_remote-0.0.114}/python_sdk_remote/src/valid_json_versions.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_sdk_remote-0.0.112 → python_sdk_remote-0.0.114}/python_sdk_remote.egg-info/SOURCES.txt
RENAMED
|
File without changes
|
|
File without changes
|
{python_sdk_remote-0.0.112 → python_sdk_remote-0.0.114}/python_sdk_remote.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|