ul-api-utils 7.10.5__tar.gz → 7.10.6__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 ul-api-utils might be problematic. Click here for more details.

Files changed (159) hide show
  1. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/PKG-INFO +1 -1
  2. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/setup.py +1 -1
  3. ul-api-utils-7.10.6/ul_api_utils/utils/instance_checks.py +16 -0
  4. ul-api-utils-7.10.6/ul_api_utils/utils/memory_db/errors.py +8 -0
  5. ul-api-utils-7.10.6/ul_api_utils/utils/memory_db/repository.py +98 -0
  6. ul-api-utils-7.10.6/ul_api_utils/validators/__init__.py +0 -0
  7. ul-api-utils-7.10.6/ul_api_utils/validators/__tests__/__init__.py +0 -0
  8. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils.egg-info/PKG-INFO +1 -1
  9. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils.egg-info/SOURCES.txt +5 -0
  10. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/LICENSE +0 -0
  11. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/README.md +0 -0
  12. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/example/__init__.py +0 -0
  13. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/example/conf.py +0 -0
  14. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/example/main.py +0 -0
  15. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/example/models/__init__.py +0 -0
  16. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/example/permissions.py +0 -0
  17. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/example/pure_flask_example.py +0 -0
  18. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/example/rate_limit_load.py +0 -0
  19. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/example/routes/__init__.py +0 -0
  20. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/example/routes/api_some.py +0 -0
  21. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/example/sockets/__init__.py +0 -0
  22. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/example/sockets/on_connect.py +0 -0
  23. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/example/sockets/on_disconnect.py +0 -0
  24. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/example/sockets/on_json.py +0 -0
  25. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/example/sockets/on_message.py +0 -0
  26. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/example/sockets/on_open.py +0 -0
  27. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/example/workers/__init__.py +0 -0
  28. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/example/workers/worker.py +0 -0
  29. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/setup.cfg +0 -0
  30. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/__init__.py +0 -0
  31. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/access/__init__.py +0 -0
  32. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/api_resource/__init__.py +0 -0
  33. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/api_resource/api_request.py +0 -0
  34. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/api_resource/api_resource.py +0 -0
  35. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/api_resource/api_resource_config.py +0 -0
  36. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/api_resource/api_resource_error_handling.py +0 -0
  37. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/api_resource/api_resource_fn_typing.py +0 -0
  38. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/api_resource/api_resource_type.py +0 -0
  39. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/api_resource/api_response.py +0 -0
  40. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/api_resource/api_response_db.py +0 -0
  41. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/api_resource/api_response_payload_alias.py +0 -0
  42. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/api_resource/db_types.py +0 -0
  43. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/api_resource/signature_check.py +0 -0
  44. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/commands/__init__.py +0 -0
  45. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/commands/cmd_enc_keys.py +0 -0
  46. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/commands/cmd_gen_api_user_token.py +0 -0
  47. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/commands/cmd_gen_new_api_user.py +0 -0
  48. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/commands/cmd_generate_api_docs.py +0 -0
  49. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/commands/cmd_start.py +0 -0
  50. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/commands/cmd_worker_start.py +0 -0
  51. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/commands/start/__init__.py +0 -0
  52. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/commands/start/gunicorn.conf.py +0 -0
  53. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/commands/start/wsgi.py +0 -0
  54. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/conf/ul-debugger-main.js +0 -0
  55. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/conf/ul-debugger-ui.js +0 -0
  56. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/conf.py +0 -0
  57. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/const.py +0 -0
  58. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/debug/__init__.py +0 -0
  59. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/debug/debugger.py +0 -0
  60. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/debug/malloc.py +0 -0
  61. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/debug/stat.py +0 -0
  62. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/encrypt/__init__.py +0 -0
  63. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/encrypt/encrypt_decrypt_abstract.py +0 -0
  64. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/encrypt/encrypt_decrypt_aes_xtea.py +0 -0
  65. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/errors.py +0 -0
  66. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/internal_api/__init__.py +0 -0
  67. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/internal_api/__tests__/__init__.py +0 -0
  68. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/internal_api/__tests__/internal_api.py +0 -0
  69. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/internal_api/__tests__/internal_api_content_type.py +0 -0
  70. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/internal_api/internal_api.py +0 -0
  71. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/internal_api/internal_api_check_context.py +0 -0
  72. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/internal_api/internal_api_error.py +0 -0
  73. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/internal_api/internal_api_response.py +0 -0
  74. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/main.py +0 -0
  75. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/modules/__init__.py +0 -0
  76. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/modules/__tests__/__init__.py +0 -0
  77. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/modules/__tests__/test_api_sdk_jwt.py +0 -0
  78. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/modules/api_sdk.py +0 -0
  79. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/modules/api_sdk_config.py +0 -0
  80. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/modules/api_sdk_jwt.py +0 -0
  81. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/modules/intermediate_state.py +0 -0
  82. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/modules/worker_context.py +0 -0
  83. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/modules/worker_sdk.py +0 -0
  84. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/modules/worker_sdk_config.py +0 -0
  85. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/py.typed +0 -0
  86. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/resources/__init__.py +0 -0
  87. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/resources/caching.py +0 -0
  88. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/resources/debugger_scripts.py +0 -0
  89. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/resources/health_check/__init__.py +0 -0
  90. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/resources/health_check/const.py +0 -0
  91. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/resources/health_check/health_check.py +0 -0
  92. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/resources/health_check/health_check_template.py +0 -0
  93. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/resources/health_check/resource.py +0 -0
  94. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/resources/not_implemented.py +0 -0
  95. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/resources/permissions.py +0 -0
  96. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/resources/rate_limitter.py +0 -0
  97. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/resources/socketio.py +0 -0
  98. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/resources/swagger.py +0 -0
  99. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/resources/web_forms/__init__.py +0 -0
  100. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/resources/web_forms/custom_fields/__init__.py +0 -0
  101. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/resources/web_forms/custom_fields/custom_checkbox_select.py +0 -0
  102. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/resources/web_forms/custom_widgets/__init__.py +0 -0
  103. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/resources/web_forms/custom_widgets/custom_select_widget.py +0 -0
  104. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/resources/web_forms/custom_widgets/custom_text_input_widget.py +0 -0
  105. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/resources/web_forms/uni_form.py +0 -0
  106. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/sentry.py +0 -0
  107. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/__init__.py +0 -0
  108. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/__tests__/__init__.py +0 -0
  109. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/__tests__/api_path_version.py +0 -0
  110. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/__tests__/unwrap_typing.py +0 -0
  111. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/api_encoding.py +0 -0
  112. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/api_format.py +0 -0
  113. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/api_method.py +0 -0
  114. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/api_pagination.py +0 -0
  115. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/api_path_version.py +0 -0
  116. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/api_request_info.py +0 -0
  117. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/avro.py +0 -0
  118. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/broker_topics_message_count.py +0 -0
  119. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/cached_per_request.py +0 -0
  120. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/colors.py +0 -0
  121. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/constants.py +0 -0
  122. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/decode_base64.py +0 -0
  123. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/deprecated.py +0 -0
  124. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/flags.py +0 -0
  125. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/flask_swagger_generator/__init__.py +0 -0
  126. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/flask_swagger_generator/conf.py +0 -0
  127. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/flask_swagger_generator/exceptions.py +0 -0
  128. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/flask_swagger_generator/specifiers/__init__.py +0 -0
  129. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/flask_swagger_generator/specifiers/swagger_models.py +0 -0
  130. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/flask_swagger_generator/specifiers/swagger_specifier.py +0 -0
  131. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/flask_swagger_generator/specifiers/swagger_three_specifier.py +0 -0
  132. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/flask_swagger_generator/specifiers/swagger_version.py +0 -0
  133. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/flask_swagger_generator/utils/__init__.py +0 -0
  134. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/flask_swagger_generator/utils/input_type.py +0 -0
  135. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/flask_swagger_generator/utils/parameter_type.py +0 -0
  136. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/flask_swagger_generator/utils/replace_in_dict.py +0 -0
  137. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/flask_swagger_generator/utils/request_type.py +0 -0
  138. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/flask_swagger_generator/utils/schema_type.py +0 -0
  139. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/flask_swagger_generator/utils/security_type.py +0 -0
  140. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/imports.py +0 -0
  141. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/jinja/__init__.py +0 -0
  142. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/jinja/t_url_for.py +0 -0
  143. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/jinja/to_pretty_json.py +0 -0
  144. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/json_encoder.py +0 -0
  145. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/load_modules.py +0 -0
  146. {ul-api-utils-7.10.5/ul_api_utils/validators → ul-api-utils-7.10.6/ul_api_utils/utils/memory_db}/__init__.py +0 -0
  147. {ul-api-utils-7.10.5/ul_api_utils/validators → ul-api-utils-7.10.6/ul_api_utils/utils/memory_db}/__tests__/__init__.py +0 -0
  148. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/token_check.py +0 -0
  149. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/token_check_through_request.py +0 -0
  150. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/unwrap_typing.py +0 -0
  151. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/utils/uuid_converter.py +0 -0
  152. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/validators/__tests__/test_custom_fields.py +0 -0
  153. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/validators/custom_fields.py +0 -0
  154. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/validators/validate_empty_object.py +0 -0
  155. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils/validators/validate_uuid.py +0 -0
  156. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils.egg-info/dependency_links.txt +0 -0
  157. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils.egg-info/entry_points.txt +0 -0
  158. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils.egg-info/requires.txt +0 -0
  159. {ul-api-utils-7.10.5 → ul-api-utils-7.10.6}/ul_api_utils.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ul-api-utils
3
- Version: 7.10.5
3
+ Version: 7.10.6
4
4
  Summary: Python api utils
5
5
  Author: Unic-lab
6
6
  Author-email:
@@ -9,7 +9,7 @@ with open(path.join(HERE, 'README.md'), encoding='utf-8') as f:
9
9
 
10
10
  setup(
11
11
  name='ul-api-utils',
12
- version='7.10.5',
12
+ version='7.10.6',
13
13
  description='Python api utils',
14
14
  author='Unic-lab',
15
15
  long_description=long_description,
@@ -0,0 +1,16 @@
1
+ from typing import Any
2
+
3
+
4
+ def isinstance_namedtuple(obj: Any) -> bool:
5
+ namedtuple_unique_attributes = ('_asdict', '_fields')
6
+ is_tuple = isinstance(obj, tuple)
7
+ has_namedtuple_attributes = hasattr(obj, namedtuple_unique_attributes[0]) and hasattr(obj, namedtuple_unique_attributes[1])
8
+ return has_namedtuple_attributes and is_tuple
9
+
10
+
11
+ def is_iterable(obj: Any) -> bool:
12
+ try:
13
+ iter(obj)
14
+ except TypeError:
15
+ return False
16
+ return True
@@ -0,0 +1,8 @@
1
+ class CompositeKeyError(LookupError):
2
+ """Raised in memory db repository when composite key is invalid."""
3
+ ...
4
+
5
+
6
+ class UnsupportedParsingType(TypeError):
7
+ """Raised in memory db repository when repo can't parse memory db object as provided type."""
8
+ ...
@@ -0,0 +1,98 @@
1
+ import decimal
2
+ import redis
3
+ import ormsgpack
4
+ import collections
5
+
6
+ from pydantic import BaseModel, ValidationError
7
+ from typing import Any, Type, overload, Iterator, KeysView, cast
8
+
9
+ from ul_api_utils.utils.instance_checks import isinstance_namedtuple
10
+ from ul_api_utils.utils.memory_db.errors import CompositeKeyError, UnsupportedParsingType
11
+
12
+
13
+ CompositeKeyT = tuple[str, Type[BaseModel]]
14
+ AnyKeyT = str | CompositeKeyT
15
+ AnyT = Any
16
+ RedisClientT = redis.StrictRedis | redis.Redis
17
+
18
+
19
+ class BaseMemoryDbRepository(collections.abc.MutableMapping[str, AnyT]):
20
+ def __init__(self, redis_client: RedisClientT) -> None:
21
+ self._db = redis_client
22
+ self._composite_key_max_length = 2
23
+
24
+ @property
25
+ def db(self) -> RedisClientT:
26
+ return self._db
27
+
28
+ def get(self, __key: str, *, parse_as_type: Type[BaseModel] | None = None, default: Any | None = None) -> AnyT | None: # type: ignore
29
+ try:
30
+ if parse_as_type is None:
31
+ return self[__key]
32
+ return self[__key, parse_as_type]
33
+ except KeyError:
34
+ return default
35
+
36
+ @overload
37
+ def __getitem__(self, key: str) -> AnyT:
38
+ ...
39
+
40
+ @overload
41
+ def __getitem__(self, key: CompositeKeyT) -> AnyT:
42
+ ...
43
+
44
+ def __getitem__(self, key: AnyKeyT) -> AnyT:
45
+ key_complex = isinstance(key, tuple)
46
+
47
+ if not key_complex:
48
+ single_key = cast(str, key)
49
+ return ormsgpack.unpackb(self._db[single_key])
50
+
51
+ composite_key = cast(CompositeKeyT, key)
52
+
53
+ if len(composite_key) > self._composite_key_max_length:
54
+ raise CompositeKeyError(f"Can't retrieve an item with {key=}. Composite key should have only two arguments.")
55
+
56
+ composite_key_name, _parse_as_type = composite_key
57
+ parsing_type_supported = issubclass(_parse_as_type, BaseModel) and _parse_as_type is not BaseModel
58
+ if not parsing_type_supported:
59
+ raise UnsupportedParsingType(f"Unsupported parsing type {_parse_as_type}.")
60
+ value = ormsgpack.unpackb(self._db[composite_key_name])
61
+ try:
62
+ model_fields = _parse_as_type.__fields_set__
63
+ if isinstance(value, list):
64
+ return [_parse_as_type.construct(_fields_set=model_fields, **obj) for obj in value]
65
+ return _parse_as_type.construct(_fields_set=model_fields, **value)
66
+ except ValidationError:
67
+ raise UnsupportedParsingType(f"Could not parse the value of key '{composite_key_name}' with type {_parse_as_type}") from None
68
+
69
+ def __setitem__(self, key: str, value: AnyT) -> None:
70
+ self._db[key] = ormsgpack.packb(value, option=ormsgpack.OPT_SERIALIZE_PYDANTIC, default=self._default_serializer)
71
+
72
+ def __delitem__(self, key: str) -> None:
73
+ del self._db[key]
74
+
75
+ def __iter__(self) -> Iterator[str]:
76
+ return iter(self.keys())
77
+
78
+ def __len__(self) -> int:
79
+ return len(self._db.keys())
80
+
81
+ def keys(self) -> KeysView[str]:
82
+ available_keys = [key.decode() for key in self._db.keys()]
83
+ return cast(KeysView[str], available_keys)
84
+
85
+ def clear(self) -> None:
86
+ self._db.flushdb()
87
+
88
+ @staticmethod
89
+ def _default_serializer(obj: Any) -> Any:
90
+ if isinstance_namedtuple(obj):
91
+ return obj._asdict()
92
+ if isinstance(obj, decimal.Decimal):
93
+ return str(obj)
94
+ if isinstance(obj, set):
95
+ return list(obj)
96
+ if isinstance(obj, frozenset):
97
+ return list(obj)
98
+ raise TypeError
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ul-api-utils
3
- Version: 7.10.5
3
+ Version: 7.10.6
4
4
  Summary: Python api utils
5
5
  Author: Unic-lab
6
6
  Author-email:
@@ -117,6 +117,7 @@ ul_api_utils/utils/decode_base64.py
117
117
  ul_api_utils/utils/deprecated.py
118
118
  ul_api_utils/utils/flags.py
119
119
  ul_api_utils/utils/imports.py
120
+ ul_api_utils/utils/instance_checks.py
120
121
  ul_api_utils/utils/json_encoder.py
121
122
  ul_api_utils/utils/load_modules.py
122
123
  ul_api_utils/utils/token_check.py
@@ -144,6 +145,10 @@ ul_api_utils/utils/flask_swagger_generator/utils/security_type.py
144
145
  ul_api_utils/utils/jinja/__init__.py
145
146
  ul_api_utils/utils/jinja/t_url_for.py
146
147
  ul_api_utils/utils/jinja/to_pretty_json.py
148
+ ul_api_utils/utils/memory_db/__init__.py
149
+ ul_api_utils/utils/memory_db/errors.py
150
+ ul_api_utils/utils/memory_db/repository.py
151
+ ul_api_utils/utils/memory_db/__tests__/__init__.py
147
152
  ul_api_utils/validators/__init__.py
148
153
  ul_api_utils/validators/custom_fields.py
149
154
  ul_api_utils/validators/validate_empty_object.py
File without changes
File without changes
File without changes