atk-common 1.60.0__tar.gz → 1.62.0__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.
Files changed (60) hide show
  1. {atk_common-1.60.0 → atk_common-1.62.0}/PKG-INFO +1 -1
  2. {atk_common-1.60.0 → atk_common-1.62.0}/setup.py +1 -1
  3. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/__init__.py +4 -0
  4. atk_common-1.62.0/src/atk_common/consumer_retry_handler.py +49 -0
  5. atk_common-1.62.0/src/atk_common/default_should_retry.py +19 -0
  6. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/env_utils.py +11 -2
  7. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common.egg-info/PKG-INFO +1 -1
  8. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common.egg-info/SOURCES.txt +2 -0
  9. {atk_common-1.60.0 → atk_common-1.62.0}/README.md +0 -0
  10. {atk_common-1.60.0 → atk_common-1.62.0}/license.txt +0 -0
  11. {atk_common-1.60.0 → atk_common-1.62.0}/pyproject.toml +0 -0
  12. {atk_common-1.60.0 → atk_common-1.62.0}/setup.cfg +0 -0
  13. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/datetime_utils.py +0 -0
  14. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/db_utils.py +0 -0
  15. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/docker_utils.py +0 -0
  16. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/enums/__init__.py +0 -0
  17. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/enums/api_error_type_enum.py +0 -0
  18. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/enums/camera_cabinet_type_enum.py +0 -0
  19. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/enums/camera_role_enum.py +0 -0
  20. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/enums/certificate_issuer_enum.py +0 -0
  21. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/enums/command_status_type_enum.py +0 -0
  22. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/enums/command_type_enum.py +0 -0
  23. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/enums/config_reply_status_type_enum.py +0 -0
  24. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/enums/detection_status_type_enum.py +0 -0
  25. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/enums/encryption_type_enum.py +0 -0
  26. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/enums/file_exists_enum.py +0 -0
  27. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/enums/history_status_type_enum.py +0 -0
  28. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/enums/image_encoding_type_enum.py +0 -0
  29. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/enums/image_part_category_enum.py +0 -0
  30. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/enums/image_part_type_enum.py +0 -0
  31. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/enums/image_shelf_type_enum.py +0 -0
  32. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/enums/metering_direction_enum.py +0 -0
  33. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/enums/multimotor_status_type_enum.py +0 -0
  34. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/enums/piezo_vehicle_type_enum.py +0 -0
  35. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/enums/process_status_type_enum.py +0 -0
  36. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/enums/response_status_type_enum.py +0 -0
  37. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/enums/section_role_enum.py +0 -0
  38. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/enums/sensor_order_enum.py +0 -0
  39. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/enums/sensor_type_enum.py +0 -0
  40. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/enums/speed_control_status_type_enum.py +0 -0
  41. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/enums/speed_control_stop_reason.py +0 -0
  42. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/enums/test_image_type_enum.py +0 -0
  43. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/enums/violation_type_enum.py +0 -0
  44. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/error_utils.py +0 -0
  45. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/file_utils.py +0 -0
  46. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/hash_utils.py +0 -0
  47. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/http_response_utils.py +0 -0
  48. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/http_utils.py +0 -0
  49. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/internal_response_utils.py +0 -0
  50. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/log_utils.py +0 -0
  51. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/mq_utils.py +0 -0
  52. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common/rabbitmq_consumer.py +0 -0
  53. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common.egg-info/dependency_links.txt +0 -0
  54. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common.egg-info/requires.txt +0 -0
  55. {atk_common-1.60.0 → atk_common-1.62.0}/src/atk_common.egg-info/top_level.txt +0 -0
  56. {atk_common-1.60.0 → atk_common-1.62.0}/src/shared_python_atk_enforcement/__init__.py +0 -0
  57. {atk_common-1.60.0 → atk_common-1.62.0}/tests/test_docker_utils.py +0 -0
  58. {atk_common-1.60.0 → atk_common-1.62.0}/tests/test_error_utils.py +0 -0
  59. {atk_common-1.60.0 → atk_common-1.62.0}/tests/test_http_utils.py +0 -0
  60. {atk_common-1.60.0 → atk_common-1.62.0}/tests/test_log_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atk_common
3
- Version: 1.60.0
3
+ Version: 1.62.0
4
4
  Summary: ATK common methods
5
5
  Home-page: https://github.com/pypa/atk_common
6
6
  Author: Roger
@@ -36,7 +36,7 @@ setup(
36
36
  # For a discussion on single-sourcing the version across setup.py and the
37
37
  # project code, see
38
38
  # https://packaging.python.org/guides/single-sourcing-package-version/
39
- version="1.60.0", # Required
39
+ version="1.62.0", # Required
40
40
  # This is a one-line description or tagline of what your project does. This
41
41
  # corresponds to the "Summary" metadata field:
42
42
  # https://packaging.python.org/specifications/core-metadata/#summary
@@ -1,4 +1,5 @@
1
1
  # __init__.py
2
+ from atk_common.consumer_retry_handler import create_retry_handler
2
3
  from atk_common.datetime_utils import \
3
4
  get_utc_date_time, \
4
5
  get_utc_date_time_str, \
@@ -9,6 +10,7 @@ from atk_common.datetime_utils import \
9
10
  convert_to_utc, \
10
11
  convert_to_utc_image_dt
11
12
  from atk_common.db_utils import sql, sql_with_record, convert_none_to_null, date_time_utc_column
13
+ from atk_common.default_should_retry import default_should_retry
12
14
  from atk_common.docker_utils import get_current_container_info, set_container_metadata
13
15
  from atk_common.env_utils import get_env_value
14
16
  from atk_common.error_utils import get_message, create_error_log, get_error_entity, resend_error_entity, handle_error, get_response_error, get_error_type
@@ -22,6 +24,7 @@ from atk_common.mq_utils import decode_message
22
24
  from atk_common.rabbitmq_consumer import RabbitMQConsumer
23
25
 
24
26
  __all__ = [
27
+ 'create_retry_handler',
25
28
  'get_utc_date_time',
26
29
  'get_utc_date_time_str',
27
30
  'get_utc_date_time_str_with_z',
@@ -34,6 +37,7 @@ __all__ = [
34
37
  'sql_with_record',
35
38
  'convert_none_to_null',
36
39
  'date_time_utc_column',
40
+ 'default_should_retry',
37
41
  'get_current_container_info',
38
42
  'set_container_metadata',
39
43
  'get_env_value',
@@ -0,0 +1,49 @@
1
+ from kombu import Producer
2
+ from atk_common import *
3
+
4
+ def create_retry_handler(process_func, connection, exchange, routing_key, should_retry, log, declare=None):
5
+ """
6
+ process_func: your original handler function (body, message)
7
+ retry_queue: kombu.Queue instance to republish to
8
+ should_retry: function(message_status) -> bool
9
+ log: function for logging
10
+ """
11
+
12
+ def handler(body, message):
13
+ try:
14
+ process_response = process_func(body, message)
15
+ if is_response_ok(process_response):
16
+ message.ack()
17
+ else:
18
+ if connection is not None:
19
+ # Use retry queue
20
+ if should_retry(process_response):
21
+ log("Retrying after delay...")
22
+ with connection.Producer() as producer:
23
+ producer.publish(
24
+ message.body,
25
+ exchange=exchange,
26
+ routing_key=routing_key,
27
+ retry=True,
28
+ declare=declare,
29
+ content_type=message.content_type,
30
+ content_encoding=message.content_encoding,
31
+ headers=message.headers,
32
+ timestamp=message.properties.get("timestamp")
33
+ )
34
+ message.ack()
35
+ else:
36
+ log("Sending to DLQ...")
37
+ message.reject(requeue=False)
38
+ else:
39
+ if should_retry(process_response):
40
+ log("Requing...")
41
+ message.requeue()
42
+ else:
43
+ log("Sending to DLQ...")
44
+ message.reject(requeue=False)
45
+ except Exception as e:
46
+ log(f"Error during processing: {e}")
47
+ message.reject(requeue=False)
48
+
49
+ return handler
@@ -0,0 +1,19 @@
1
+ from atk_common.enums.api_error_type_enum import ApiErrorType
2
+ from atk_common.enums.response_status_type_enum import ResponseStatusType
3
+ from atk_common.http_utils import is_http_status_internal, is_http_status_ok
4
+
5
+ def default_should_retry(message_status):
6
+ if message_status['status'] == ResponseStatusType.HTTP:
7
+ status_code = message_status['statusCode']
8
+ if is_http_status_ok(status_code):
9
+ return False
10
+ elif is_http_status_internal(status_code):
11
+ #errorType = 1: connection error
12
+ #errorType = 2: api internal error (database, etc)
13
+ if message_status['responseMsg']['errorType'] == ApiErrorType.CONNECTION.value:
14
+ return True
15
+ else:
16
+ return False
17
+ else:
18
+ return True
19
+ return True
@@ -3,16 +3,25 @@ from atk_common.log_utils import add_log_item
3
3
 
4
4
  def val_str(value):
5
5
  if value is None:
6
- return 'Empty'
6
+ return '<Empty>'
7
7
  if isinstance(value, str):
8
+ if value.strip() == '' or value.lower() == 'null':
9
+ return '<Null>'
8
10
  return value
9
11
  return str(value)
10
12
 
13
+ def is_value_null_or_empty(value):
14
+ if isinstance(value, str):
15
+ return value.strip() == '' or value.lower() == 'null'
16
+ return False
17
+
11
18
  def get_env_value(key, abort_on_error=True):
12
19
  val = os.environ.get(key)
20
+ add_log_item(key + ':' + val_str(val))
13
21
  if val is None and abort_on_error:
14
22
  err_msg = f"Environment variable '{key}' is not set."
15
23
  add_log_item(err_msg)
16
24
  raise ValueError(err_msg)
17
- add_log_item(key + ':' + val_str(val))
25
+ if is_value_null_or_empty(val):
26
+ return None
18
27
  return val
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atk_common
3
- Version: 1.60.0
3
+ Version: 1.62.0
4
4
  Summary: ATK common methods
5
5
  Home-page: https://github.com/pypa/atk_common
6
6
  Author: Roger
@@ -4,8 +4,10 @@ pyproject.toml
4
4
  setup.cfg
5
5
  setup.py
6
6
  src/atk_common/__init__.py
7
+ src/atk_common/consumer_retry_handler.py
7
8
  src/atk_common/datetime_utils.py
8
9
  src/atk_common/db_utils.py
10
+ src/atk_common/default_should_retry.py
9
11
  src/atk_common/docker_utils.py
10
12
  src/atk_common/env_utils.py
11
13
  src/atk_common/error_utils.py
File without changes
File without changes
File without changes
File without changes