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.

Files changed (20) hide show
  1. {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/PKG-INFO +3 -2
  2. {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote/src/utilities.py +61 -11
  3. {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote.egg-info/PKG-INFO +3 -2
  4. {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote.egg-info/requires.txt +1 -0
  5. {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/setup.py +4 -3
  6. {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/README.md +0 -0
  7. {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/pyproject.toml +0 -0
  8. {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote/src/__init__.py +0 -0
  9. {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote/src/constants.py +0 -0
  10. {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote/src/http_response.py +0 -0
  11. {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote/src/item.py +0 -0
  12. {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote/src/mini_logger.py +0 -0
  13. {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote/src/our_object.py +0 -0
  14. {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote/src/unified_json.py +0 -0
  15. {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote/src/valid_json_versions.py +0 -0
  16. {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote/src/validate_environment.py +0 -0
  17. {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote.egg-info/SOURCES.txt +0 -0
  18. {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote.egg-info/dependency_links.txt +0 -0
  19. {python_sdk_remote-0.0.111 → python_sdk_remote-0.0.113}/python_sdk_remote.egg-info/top_level.txt +0 -0
  20. {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.111
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@circles.ai
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, get_user_jwt_from_event, # noqa - used for backwards compatibility
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: tuple) -> bool:
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
- if not isinstance(datetime_obj, datetime):
147
- logger.end(object={"is_valid_datetime_range_result": False,
148
- "reason": "datetime_range contains non-datetime objects"})
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: tuple) -> bool:
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 = True) -> str:
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 env_var is None) or (raise_if_empty and not env_var):
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([i for i in text if not i.isdigit()])
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.111
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@circles.ai
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.111', # https://pypi.org/project/python-sdk-remote/
10
+ version='0.0.113', # https://pypi.org/project/python-sdk-remote/
11
11
  author="Circles",
12
- author_email="info@circles.ai",
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
  )