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