python-sdk-remote 0.0.122__tar.gz → 0.0.124__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.122 → python_sdk_remote-0.0.124}/PKG-INFO +1 -1
  2. {python_sdk_remote-0.0.122 → python_sdk_remote-0.0.124}/python_sdk_remote/src/http_response.py +32 -20
  3. {python_sdk_remote-0.0.122 → python_sdk_remote-0.0.124}/python_sdk_remote/src/utilities.py +15 -5
  4. {python_sdk_remote-0.0.122 → python_sdk_remote-0.0.124}/python_sdk_remote.egg-info/PKG-INFO +1 -1
  5. {python_sdk_remote-0.0.122 → python_sdk_remote-0.0.124}/setup.py +1 -1
  6. {python_sdk_remote-0.0.122 → python_sdk_remote-0.0.124}/README.md +0 -0
  7. {python_sdk_remote-0.0.122 → python_sdk_remote-0.0.124}/pyproject.toml +0 -0
  8. {python_sdk_remote-0.0.122 → python_sdk_remote-0.0.124}/python_sdk_remote/src/__init__.py +0 -0
  9. {python_sdk_remote-0.0.122 → python_sdk_remote-0.0.124}/python_sdk_remote/src/constants.py +0 -0
  10. {python_sdk_remote-0.0.122 → python_sdk_remote-0.0.124}/python_sdk_remote/src/item.py +0 -0
  11. {python_sdk_remote-0.0.122 → python_sdk_remote-0.0.124}/python_sdk_remote/src/mini_logger.py +0 -0
  12. {python_sdk_remote-0.0.122 → python_sdk_remote-0.0.124}/python_sdk_remote/src/our_object.py +0 -0
  13. {python_sdk_remote-0.0.122 → python_sdk_remote-0.0.124}/python_sdk_remote/src/unified_json.py +0 -0
  14. {python_sdk_remote-0.0.122 → python_sdk_remote-0.0.124}/python_sdk_remote/src/valid_json_versions.py +0 -0
  15. {python_sdk_remote-0.0.122 → python_sdk_remote-0.0.124}/python_sdk_remote/src/validate_environment.py +0 -0
  16. {python_sdk_remote-0.0.122 → python_sdk_remote-0.0.124}/python_sdk_remote.egg-info/SOURCES.txt +0 -0
  17. {python_sdk_remote-0.0.122 → python_sdk_remote-0.0.124}/python_sdk_remote.egg-info/dependency_links.txt +0 -0
  18. {python_sdk_remote-0.0.122 → python_sdk_remote-0.0.124}/python_sdk_remote.egg-info/requires.txt +0 -0
  19. {python_sdk_remote-0.0.122 → python_sdk_remote-0.0.124}/python_sdk_remote.egg-info/top_level.txt +0 -0
  20. {python_sdk_remote-0.0.122 → python_sdk_remote-0.0.124}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: python-sdk-remote
3
- Version: 0.0.122
3
+ Version: 0.0.124
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
@@ -1,9 +1,10 @@
1
- import json
2
1
  import traceback
2
+ from functools import wraps
3
3
  from http import HTTPStatus
4
4
  from typing import Any
5
5
 
6
6
  from .mini_logger import MiniLogger as logger
7
+ from .utilities import camel_to_snake, snake_to_camel, to_dict, to_json
7
8
 
8
9
  HEADERS_KEY = 'headers'
9
10
  AUTHORIZATION_KEY = 'authorization'
@@ -17,7 +18,7 @@ AUTHORIZATION_PREFIX = 'Bearer '
17
18
 
18
19
  def get_payload_dict_from_event(event: dict) -> dict:
19
20
  """Extracts params sent with payload"""
20
- return json.loads(event.get('body') or '{}')
21
+ return to_dict(event.get('body'))
21
22
 
22
23
 
23
24
  def get_path_parameters_dict_from_event(event: dict) -> dict:
@@ -32,13 +33,19 @@ def get_query_string_parameters_from_event(event: dict) -> dict:
32
33
 
33
34
 
34
35
  def get_request_parameters_from_event(event: dict) -> dict:
36
+ """Extracts all params from the event object.
37
+ The order of precedence is: payload > path > query string
38
+ returns a dictionary with all the parameters, with both camelCase and snake_case keys."""
35
39
  all_params = get_payload_dict_from_event(event)
36
40
  all_params.update(get_path_parameters_dict_from_event(event))
37
41
  all_params.update(get_query_string_parameters_from_event(event))
42
+ all_params = {camel_to_snake(key): value for key, value in all_params.items()}
43
+ all_params.update({snake_to_camel(key): value for key, value in all_params.items()})
38
44
  return all_params
39
45
 
46
+
40
47
  # TODO: test
41
- def handler_decorator(handler: callable, logger=logger):
48
+ def handler_decorator(logger):
42
49
  """Decorator for AWS Lambda handler functions. It wraps the handler function with logging and error handling.
43
50
  Usage:
44
51
  from python_sdk_remote.http_response import handler_decorator
@@ -47,20 +54,24 @@ def handler_decorator(handler: callable, logger=logger):
47
54
  def my_handler(request_parameters: dict) -> dict:
48
55
  return {"message": "Hello, World!"}"""
49
56
 
50
- def wrapper(event, context):
51
- handler_response = None
52
- try:
53
- logger.start(object={"event": event, "context": context})
54
- request_parameters = get_request_parameters_from_event(event)
55
- body_result: dict = handler(request_parameters)
56
- handler_response = create_ok_http_response(body_result)
57
- except Exception as e:
58
- handler_response = create_error_http_response(e)
59
- finally:
60
- logger.end(object={"handler_response": handler_response})
61
- return handler_response
57
+ def decorator(handler: callable) -> callable:
58
+ @wraps(handler)
59
+ def wrapper(event, context):
60
+ handler_response = None
61
+ try:
62
+ logger.start(object={"event": event, "context": context})
63
+ request_parameters = get_request_parameters_from_event(event)
64
+ body_result: dict = handler(request_parameters)
65
+ handler_response = create_ok_http_response(body_result)
66
+ except Exception as e:
67
+ handler_response = create_error_http_response(e)
68
+ finally:
69
+ logger.end(object={"handler_response": handler_response})
70
+ return handler_response
71
+
72
+ return wrapper
62
73
 
63
- return wrapper
74
+ return decorator
64
75
 
65
76
 
66
77
  def create_authorization_http_headers(user_jwt: str) -> dict:
@@ -107,10 +118,11 @@ def create_error_http_response(exception: Exception, status_code: HTTPStatus = H
107
118
 
108
119
  def create_ok_http_response(body: Any) -> dict:
109
120
  logger.start(object={"body": body})
121
+ # TODO: test sending statusCode/headers/body inside the body
110
122
  ok_http_response = {
111
- "statusCode": HTTPStatus.OK.value,
112
- "headers": create_return_http_headers(),
113
- "body": create_http_body(body)
123
+ "statusCode": body.get("statusCode") or HTTPStatus.OK.value,
124
+ "headers": body.get("headers") or create_return_http_headers(),
125
+ "body": create_http_body(body.get("body") or body)
114
126
  }
115
127
  logger.end(object={"ok_http_response": ok_http_response})
116
128
  return ok_http_response
@@ -121,6 +133,6 @@ def create_http_body(body: Any) -> str:
121
133
  # TODO console.warning() if the body is not a valid camelCase JSON
122
134
  # https://stackoverflow.com/questions/17156078/converting-identifier-naming-between-camelcase-and-underscores-during-json-seria
123
135
  logger.start(object={"body": body})
124
- http_body = json.dumps(body)
136
+ http_body = to_json(body)
125
137
  logger.end(object={"http_body": http_body})
126
138
  return http_body
@@ -11,10 +11,6 @@ from dotenv import load_dotenv
11
11
  from url_remote.environment_name_enum import EnvironmentName
12
12
 
13
13
  from .mini_logger import MiniLogger as logger
14
- from .http_response import (create_authorization_http_headers, # noqa - used for backwards compatibility
15
- get_user_jwt_from_event,
16
- create_return_http_headers, create_error_http_response, create_ok_http_response,
17
- create_http_body)
18
14
 
19
15
  load_dotenv()
20
16
  # TODO Let's do brainstorming on this
@@ -354,12 +350,13 @@ def obfuscate_log_dict(log_dict: dict) -> dict:
354
350
  if isinstance(value, dict):
355
351
  obfuscated_log_dict[key] = obfuscate_log_dict(value)
356
352
  elif re.search(r'password|secret|token|jwt|e[\-_]?mail|phone|name|address|ssn', key, re.IGNORECASE):
357
- # TODO Maybe we can reveal a small part
353
+ # TODO Maybe we can reveal a small part
358
354
  obfuscated_log_dict[key] = "***"
359
355
  else:
360
356
  obfuscated_log_dict[key] = value
361
357
  return obfuscated_log_dict
362
358
 
359
+
363
360
  # TODO: add tests to the following functions
364
361
 
365
362
  def remove_digits(text: str) -> str:
@@ -415,3 +412,16 @@ def get_ip_v4():
415
412
 
416
413
  def get_ip_v6():
417
414
  return requests.get('https://api.seeip.org/jsonip').json()['ip']
415
+
416
+
417
+ def snake_to_camel(snake_str: str) -> str:
418
+ """Converts snake_case to camelCase."""
419
+ components = snake_str.split('_')
420
+ camel_str = components[0] + ''.join(x.title() for x in components[1:])
421
+ return camel_str
422
+
423
+
424
+ def camel_to_snake(camel_str: str) -> str:
425
+ """Converts camelCase to snake_case."""
426
+ snake_str = re.sub(r'(?<!^)(?=[A-Z])', '_', camel_str).lower()
427
+ return snake_str
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: python-sdk-remote
3
- Version: 0.0.122
3
+ Version: 0.0.124
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,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.122', # https://pypi.org/project/python-sdk-remote/
10
+ version='0.0.124', # https://pypi.org/project/python-sdk-remote/
11
11
  author="Circles",
12
12
  author_email="info@circlez.ai",
13
13
  description="PyPI Package for Circles Python SDK Local Python",