ul-api-utils 8.1.19__tar.gz → 8.1.21__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 (163) hide show
  1. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/PKG-INFO +1 -1
  2. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/setup.py +2 -2
  3. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/flask_swagger_generator/specifiers/swagger_three_specifier.py +3 -3
  4. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/flask_swagger_generator/utils/replace_in_dict.py +1 -1
  5. ul-api-utils-8.1.21/ul_api_utils/validators/__tests__/test_custom_fields.py +32 -0
  6. ul-api-utils-8.1.21/ul_api_utils/validators/custom_fields.py +60 -0
  7. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils.egg-info/PKG-INFO +1 -1
  8. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils.egg-info/requires.txt +1 -1
  9. ul-api-utils-8.1.19/ul_api_utils/validators/__tests__/test_custom_fields.py +0 -32
  10. ul-api-utils-8.1.19/ul_api_utils/validators/custom_fields.py +0 -84
  11. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/LICENSE +0 -0
  12. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/README.md +0 -0
  13. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/example/__init__.py +0 -0
  14. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/example/conf.py +0 -0
  15. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/example/main.py +0 -0
  16. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/example/models/__init__.py +0 -0
  17. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/example/permissions.py +0 -0
  18. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/example/pure_flask_example.py +0 -0
  19. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/example/rate_limit_load.py +0 -0
  20. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/example/redis_repository.py +0 -0
  21. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/example/routes/__init__.py +0 -0
  22. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/example/routes/api_some.py +0 -0
  23. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/example/sockets/__init__.py +0 -0
  24. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/example/sockets/on_connect.py +0 -0
  25. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/example/sockets/on_disconnect.py +0 -0
  26. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/example/sockets/on_json.py +0 -0
  27. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/example/sockets/on_message.py +0 -0
  28. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/example/sockets/on_open.py +0 -0
  29. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/example/workers/__init__.py +0 -0
  30. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/example/workers/worker.py +0 -0
  31. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/setup.cfg +0 -0
  32. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/__init__.py +0 -0
  33. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/access/__init__.py +0 -0
  34. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/api_resource/__init__.py +0 -0
  35. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/api_resource/api_request.py +0 -0
  36. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/api_resource/api_resource.py +0 -0
  37. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/api_resource/api_resource_config.py +0 -0
  38. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/api_resource/api_resource_error_handling.py +0 -0
  39. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/api_resource/api_resource_fn_typing.py +0 -0
  40. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/api_resource/api_resource_type.py +0 -0
  41. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/api_resource/api_response.py +0 -0
  42. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/api_resource/api_response_db.py +0 -0
  43. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/api_resource/api_response_payload_alias.py +0 -0
  44. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/api_resource/db_types.py +0 -0
  45. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/api_resource/signature_check.py +0 -0
  46. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/commands/__init__.py +0 -0
  47. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/commands/cmd_enc_keys.py +0 -0
  48. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/commands/cmd_gen_api_user_token.py +0 -0
  49. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/commands/cmd_gen_new_api_user.py +0 -0
  50. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/commands/cmd_generate_api_docs.py +0 -0
  51. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/commands/cmd_start.py +0 -0
  52. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/commands/cmd_worker_start.py +0 -0
  53. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/commands/start/__init__.py +0 -0
  54. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/commands/start/gunicorn.conf.local.py +0 -0
  55. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/commands/start/gunicorn.conf.py +0 -0
  56. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/commands/start/wsgi.py +0 -0
  57. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/conf/ul-debugger-main.js +0 -0
  58. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/conf/ul-debugger-ui.js +0 -0
  59. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/conf.py +0 -0
  60. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/const.py +0 -0
  61. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/debug/__init__.py +0 -0
  62. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/debug/debugger.py +0 -0
  63. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/debug/malloc.py +0 -0
  64. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/debug/stat.py +0 -0
  65. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/encrypt/__init__.py +0 -0
  66. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/encrypt/encrypt_decrypt_abstract.py +0 -0
  67. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/encrypt/encrypt_decrypt_aes_xtea.py +0 -0
  68. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/errors.py +0 -0
  69. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/internal_api/__init__.py +0 -0
  70. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/internal_api/__tests__/__init__.py +0 -0
  71. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/internal_api/__tests__/internal_api.py +0 -0
  72. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/internal_api/__tests__/internal_api_content_type.py +0 -0
  73. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/internal_api/internal_api.py +0 -0
  74. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/internal_api/internal_api_check_context.py +0 -0
  75. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/internal_api/internal_api_error.py +0 -0
  76. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/internal_api/internal_api_response.py +0 -0
  77. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/main.py +0 -0
  78. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/modules/__init__.py +0 -0
  79. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/modules/__tests__/__init__.py +0 -0
  80. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/modules/__tests__/test_api_sdk_jwt.py +0 -0
  81. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/modules/api_sdk.py +0 -0
  82. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/modules/api_sdk_config.py +0 -0
  83. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/modules/api_sdk_jwt.py +0 -0
  84. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/modules/intermediate_state.py +0 -0
  85. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/modules/worker_context.py +0 -0
  86. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/modules/worker_sdk.py +0 -0
  87. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/modules/worker_sdk_config.py +0 -0
  88. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/py.typed +0 -0
  89. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/resources/__init__.py +0 -0
  90. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/resources/caching.py +0 -0
  91. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/resources/debugger_scripts.py +0 -0
  92. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/resources/health_check/__init__.py +0 -0
  93. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/resources/health_check/const.py +0 -0
  94. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/resources/health_check/health_check.py +0 -0
  95. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/resources/health_check/health_check_template.py +0 -0
  96. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/resources/health_check/resource.py +0 -0
  97. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/resources/not_implemented.py +0 -0
  98. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/resources/permissions.py +0 -0
  99. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/resources/rate_limitter.py +0 -0
  100. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/resources/socketio.py +0 -0
  101. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/resources/swagger.py +0 -0
  102. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/resources/web_forms/__init__.py +0 -0
  103. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/resources/web_forms/custom_fields/__init__.py +0 -0
  104. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/resources/web_forms/custom_fields/custom_checkbox_select.py +0 -0
  105. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/resources/web_forms/custom_widgets/__init__.py +0 -0
  106. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/resources/web_forms/custom_widgets/custom_select_widget.py +0 -0
  107. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/resources/web_forms/custom_widgets/custom_text_input_widget.py +0 -0
  108. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/resources/web_forms/uni_form.py +0 -0
  109. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/sentry.py +0 -0
  110. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/__init__.py +0 -0
  111. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/__tests__/__init__.py +0 -0
  112. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/__tests__/api_path_version.py +0 -0
  113. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/__tests__/unwrap_typing.py +0 -0
  114. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/api_encoding.py +0 -0
  115. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/api_format.py +0 -0
  116. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/api_method.py +0 -0
  117. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/api_pagination.py +0 -0
  118. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/api_path_version.py +0 -0
  119. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/api_request_info.py +0 -0
  120. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/avro.py +0 -0
  121. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/broker_topics_message_count.py +0 -0
  122. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/cached_per_request.py +0 -0
  123. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/colors.py +0 -0
  124. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/constants.py +0 -0
  125. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/decode_base64.py +0 -0
  126. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/deprecated.py +0 -0
  127. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/flags.py +0 -0
  128. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/flask_swagger_generator/__init__.py +0 -0
  129. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/flask_swagger_generator/conf.py +0 -0
  130. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/flask_swagger_generator/exceptions.py +0 -0
  131. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/flask_swagger_generator/specifiers/__init__.py +0 -0
  132. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/flask_swagger_generator/specifiers/swagger_models.py +0 -0
  133. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/flask_swagger_generator/specifiers/swagger_specifier.py +0 -0
  134. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/flask_swagger_generator/specifiers/swagger_version.py +0 -0
  135. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/flask_swagger_generator/utils/__init__.py +0 -0
  136. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/flask_swagger_generator/utils/input_type.py +0 -0
  137. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/flask_swagger_generator/utils/parameter_type.py +0 -0
  138. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/flask_swagger_generator/utils/request_type.py +0 -0
  139. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/flask_swagger_generator/utils/schema_type.py +0 -0
  140. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/flask_swagger_generator/utils/security_type.py +0 -0
  141. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/imports.py +0 -0
  142. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/instance_checks.py +0 -0
  143. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/jinja/__init__.py +0 -0
  144. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/jinja/t_url_for.py +0 -0
  145. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/jinja/to_pretty_json.py +0 -0
  146. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/json_encoder.py +0 -0
  147. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/load_modules.py +0 -0
  148. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/memory_db/__init__.py +0 -0
  149. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/memory_db/__tests__/__init__.py +0 -0
  150. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/memory_db/errors.py +0 -0
  151. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/memory_db/repository.py +0 -0
  152. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/token_check.py +0 -0
  153. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/token_check_through_request.py +0 -0
  154. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/unwrap_typing.py +0 -0
  155. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/utils/uuid_converter.py +0 -0
  156. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/validators/__init__.py +0 -0
  157. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/validators/__tests__/__init__.py +0 -0
  158. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/validators/validate_empty_object.py +0 -0
  159. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils/validators/validate_uuid.py +0 -0
  160. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils.egg-info/SOURCES.txt +0 -0
  161. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils.egg-info/dependency_links.txt +0 -0
  162. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/ul_api_utils.egg-info/entry_points.txt +0 -0
  163. {ul-api-utils-8.1.19 → ul-api-utils-8.1.21}/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: 8.1.19
3
+ Version: 8.1.21
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='8.1.19',
12
+ version='8.1.21',
13
13
  description='Python api utils',
14
14
  author='Unic-lab',
15
15
  long_description=long_description,
@@ -66,7 +66,7 @@ setup(
66
66
  "cryptography==38.0.1",
67
67
  "colored==1.4.3",
68
68
  "flask-socketio==5.3.6",
69
- "ormsgpack==1.4.1",
69
+ "ormsgpack==1.8.0",
70
70
  "msgpack==1.0.4",
71
71
  "msgpack-types==0.2.0",
72
72
  "fastavro==1.7.0",
@@ -68,8 +68,8 @@ class SwaggerSchema(SwaggerModel):
68
68
  if '$ref' in json.dumps(json_schema):
69
69
  while '$ref' in json.dumps(json_schema):
70
70
  json_schema = replace_value_in_dict(json_schema.copy(), json_schema.copy())
71
- if 'definitions' in json_schema:
72
- del json_schema['definitions']
71
+ if '$defs' in json_schema:
72
+ del json_schema['$defs']
73
73
  self.type = json_schema['type']
74
74
  if json_schema['type'] == 'object':
75
75
  self.properties = json_schema.get('properties', dict())
@@ -508,7 +508,7 @@ class SwaggerPath(SwaggerModel):
508
508
  swagger_request_type.add_swagger_model(parameters)
509
509
  query_schema = query_model.model_json_schema()
510
510
  query_required_fields = set(query_schema.get('required')) if query_schema.get('required') is not None else set()
511
- query_definitions = query_schema.get('definitions')
511
+ query_definitions = query_schema.get('$defs')
512
512
  for parameter_name, parameter_spec in query_schema.get('properties').items():
513
513
  if parameter_spec.get('type') is not None:
514
514
  parameter_models.add(SwaggerQueryParameter(
@@ -5,7 +5,7 @@ def replace_value_in_dict(item: Union[List, Dict], original_schema): # type: ig
5
5
  if isinstance(item, list):
6
6
  return [replace_value_in_dict(i, original_schema) for i in item]
7
7
  elif isinstance(item, dict):
8
- if list(item.keys()) == ['$ref']:
8
+ if '$ref' in list(item.keys()):
9
9
  definitions = item['$ref'][2:].split('/')
10
10
  res = original_schema.copy()
11
11
  for definition in definitions:
@@ -0,0 +1,32 @@
1
+ import pytest
2
+
3
+ from pydantic import BaseModel
4
+ from typing import Union, List
5
+ from ul_api_utils.validators.custom_fields import QueryParamsSeparatedList
6
+
7
+
8
+ class ModelStr(BaseModel):
9
+ param: QueryParamsSeparatedList[str]
10
+
11
+
12
+ class ModelInt(BaseModel):
13
+ param: QueryParamsSeparatedList[int]
14
+
15
+
16
+ @pytest.mark.parametrize(
17
+ "model, input_data, expected_output",
18
+ [
19
+ pytest.param(ModelStr, "first_array_element,second,third,this", ["first_array_element", "second", "third", "this"]),
20
+ pytest.param(ModelStr, ["first_array_element,second,third,this"], ["first_array_element", "second", "third", "this"]),
21
+ pytest.param(ModelInt, ["1,2,3,4,5"], [1, 2, 3, 4, 5]),
22
+ pytest.param(ModelStr, 'first_array_element,"second,third",this', ["first_array_element", "second,third", "this"]),
23
+ pytest.param(ModelStr, ['first_array_element,"second,third",this'], ["first_array_element", "second,third", "this"]),
24
+ pytest.param(ModelStr, '"first_array_element,second,third",this, "1,2"', ["first_array_element,second,third", "this", "1,2"]),
25
+ ],
26
+ )
27
+ def test__query_params_separated_list(
28
+ model: Union[ModelStr, ModelInt], input_data: Union[List[str], str], expected_output: List[Union[str, int]],
29
+ ) -> None:
30
+ instance = model(param=input_data) # type: ignore
31
+ assert isinstance(instance.param, list)
32
+ assert instance.param == expected_output
@@ -0,0 +1,60 @@
1
+ import csv
2
+ from typing import TypeVar, Generic, List, Union, Annotated, Any, get_args
3
+ from uuid import UUID
4
+
5
+ from pydantic import Field, StringConstraints, BeforeValidator
6
+
7
+ from ul_api_utils.const import CRON_EXPRESSION_VALIDATION_REGEX, MIN_UTC_OFFSET_SECONDS, MAX_UTC_OFFSET_SECONDS
8
+
9
+ NotEmptyListAnnotation = Annotated[list[Any], Field(min_length=1)]
10
+ NotEmptyListStrAnnotation = Annotated[list[str], Field(min_length=1)]
11
+ NotEmptyListIntAnnotation = Annotated[list[int], Field(min_length=1)]
12
+ NotEmptyListUUIDAnnotation = Annotated[list[UUID], Field(min_length=1)]
13
+ CronScheduleAnnotation = Annotated[str, StringConstraints(pattern=CRON_EXPRESSION_VALIDATION_REGEX)]
14
+ WhiteSpaceStrippedStrAnnotation = Annotated[str, StringConstraints(strip_whitespace=True)]
15
+ UTCOffsetSecondsAnnotation = Annotated[int, Field(ge=MIN_UTC_OFFSET_SECONDS, le=MAX_UTC_OFFSET_SECONDS)]
16
+ PgTypePasswordStrAnnotation = Annotated[str, StringConstraints(min_length=6, max_length=72)]
17
+ PgTypeShortStrAnnotation = Annotated[str, StringConstraints(min_length=0, max_length=255)]
18
+ PgTypeLongStrAnnotation = Annotated[str, StringConstraints(min_length=0, max_length=1000)]
19
+ PgTypeInt16Annotation = Annotated[int, Field(ge=-32768, le=32768)]
20
+ PgTypePositiveInt16Annotation = Annotated[int, Field(ge=0, le=32768)]
21
+ PgTypeInt32Annotation = Annotated[int, Field(ge=-2147483648, le=2147483648)]
22
+ PgTypePositiveInt32Annotation = Annotated[int, Field(ge=0, le=2147483648)]
23
+ PgTypeInt64Annotation = Annotated[int, Field(ge=-9223372036854775808, le=9223372036854775808)]
24
+ PgTypePositiveInt64Annotation = Annotated[int, Field(ge=0, le=9223372036854775808)]
25
+
26
+
27
+ QueryParamsSeparatedListValueType = TypeVar('QueryParamsSeparatedListValueType')
28
+
29
+
30
+ def validate_query_params(value: Union[str, List[str]], type_: type) -> List[QueryParamsSeparatedListValueType]:
31
+ def process_item(item: str) -> QueryParamsSeparatedListValueType:
32
+ return type_(item.strip())
33
+
34
+ if isinstance(value, list):
35
+ result: list[QueryParamsSeparatedListValueType] = []
36
+ for item in value:
37
+ if isinstance(item, str):
38
+ reader = csv.reader([item], skipinitialspace=True)
39
+ result.extend(process_item(sub_item) for row in reader for sub_item in row)
40
+ else:
41
+ raise ValueError("List items must be strings")
42
+ elif isinstance(value, str):
43
+ reader = csv.reader([value], skipinitialspace=True)
44
+ result = [process_item(item) for row in reader for item in row]
45
+ else:
46
+ raise ValueError("Value must be a string or a list of strings")
47
+
48
+ return result
49
+
50
+
51
+ class QueryParamsSeparatedList(Generic[QueryParamsSeparatedListValueType]):
52
+ @classmethod
53
+ def __get_pydantic_core_schema__(cls, source_type: type, handler: Any) -> Any:
54
+ inner_type = get_args(source_type)[0]
55
+ return handler(
56
+ Annotated[
57
+ List[inner_type], # type: ignore
58
+ BeforeValidator(lambda x: validate_query_params(x, inner_type))
59
+ ]
60
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ul-api-utils
3
- Version: 8.1.19
3
+ Version: 8.1.21
4
4
  Summary: Python api utils
5
5
  Author: Unic-lab
6
6
  Author-email:
@@ -16,7 +16,7 @@ requests==2.28.1
16
16
  cryptography==38.0.1
17
17
  colored==1.4.3
18
18
  flask-socketio==5.3.6
19
- ormsgpack==1.4.1
19
+ ormsgpack==1.8.0
20
20
  msgpack==1.0.4
21
21
  msgpack-types==0.2.0
22
22
  fastavro==1.7.0
@@ -1,32 +0,0 @@
1
- # import pytest
2
- #
3
- # from pydantic import BaseModel
4
- # from typing import Union, List
5
- # from ul_api_utils.validators.custom_fields import QueryParamsSeparatedList
6
- #
7
- #
8
- # class ModelStr(BaseModel):
9
- # param: QueryParamsSeparatedList[str]
10
- #
11
- #
12
- # class ModelInt(BaseModel):
13
- # param: QueryParamsSeparatedList[int]
14
- #
15
- #
16
- # @pytest.mark.parametrize(
17
- # "model, input_data, expected_output",
18
- # [
19
- # pytest.param(ModelStr, "first_array_element,second,third,this", ["first_array_element", "second", "third", "this"]),
20
- # pytest.param(ModelStr, ["first_array_element,second,third,this"], ["first_array_element", "second", "third", "this"]),
21
- # pytest.param(ModelInt, ["1,2,3,4,5"], [1, 2, 3, 4, 5]),
22
- # pytest.param(ModelStr, 'first_array_element,"second,third",this', ["first_array_element", "second,third", "this"]),
23
- # pytest.param(ModelStr, ['first_array_element,"second,third",this'], ["first_array_element", "second,third", "this"]),
24
- # pytest.param(ModelStr, '"first_array_element,second,third",this, "1,2"', ["first_array_element,second,third", "this", "1,2"]),
25
- # ],
26
- # )
27
- # def test__query_params_separated_list(
28
- # model: Union[ModelStr, ModelInt], input_data: Union[List[str], str], expected_output: List[Union[str, int]],
29
- # ) -> None:
30
- # instance = model(param=input_data) # type: ignore
31
- # assert isinstance(instance.param, list)
32
- # assert instance.param == expected_output
@@ -1,84 +0,0 @@
1
- import csv
2
- from typing import TypeVar, Generic, List, Union, Generator, Callable, Annotated, Any
3
- from uuid import UUID
4
-
5
- from pydantic import Field, StringConstraints, TypeAdapter
6
- from pydantic_core import ValidationError, InitErrorDetails
7
- from pydantic_core.core_schema import ValidationInfo
8
-
9
- from ul_api_utils.const import CRON_EXPRESSION_VALIDATION_REGEX, MIN_UTC_OFFSET_SECONDS, MAX_UTC_OFFSET_SECONDS
10
-
11
- NotEmptyListAnnotation = Annotated[list[Any], Field(min_length=1)]
12
- NotEmptyListStrAnnotation = Annotated[list[str], Field(min_length=1)]
13
- NotEmptyListIntAnnotation = Annotated[list[int], Field(min_length=1)]
14
- NotEmptyListUUIDAnnotation = Annotated[list[UUID], Field(min_length=1)]
15
- CronScheduleAnnotation = Annotated[str, StringConstraints(pattern=CRON_EXPRESSION_VALIDATION_REGEX)]
16
- WhiteSpaceStrippedStrAnnotation = Annotated[str, StringConstraints(strip_whitespace=True)]
17
- UTCOffsetSecondsAnnotation = Annotated[int, Field(ge=MIN_UTC_OFFSET_SECONDS, le=MAX_UTC_OFFSET_SECONDS)]
18
- PgTypePasswordStrAnnotation = Annotated[str, StringConstraints(min_length=6, max_length=72)]
19
- PgTypeShortStrAnnotation = Annotated[str, StringConstraints(min_length=0, max_length=255)]
20
- PgTypeLongStrAnnotation = Annotated[str, StringConstraints(min_length=0, max_length=1000)]
21
- PgTypeInt16Annotation = Annotated[int, Field(ge=-32768, le=32768)]
22
- PgTypePositiveInt16Annotation = Annotated[int, Field(ge=0, le=32768)]
23
- PgTypeInt32Annotation = Annotated[int, Field(ge=-2147483648, le=2147483648)]
24
- PgTypePositiveInt32Annotation = Annotated[int, Field(ge=0, le=2147483648)]
25
- PgTypeInt64Annotation = Annotated[int, Field(ge=-9223372036854775808, le=9223372036854775808)]
26
- PgTypePositiveInt64Annotation = Annotated[int, Field(ge=0, le=9223372036854775808)]
27
-
28
-
29
- QueryParamsSeparatedListValueType = TypeVar('QueryParamsSeparatedListValueType')
30
-
31
-
32
- class QueryParamsSeparatedList(Generic[QueryParamsSeparatedListValueType]):
33
- """
34
- Supports cases when query parameters are being sent as a string, but you have to assume
35
- that it is a list.
36
-
37
- F.E. Query string is ?foo=1,2
38
-
39
- Note:
40
- Sent as a string, but interpreted as List.
41
- """
42
- _contains_type: Any = None
43
-
44
- @classmethod
45
- def __class_getitem__(cls, item: Any) -> QueryParamsSeparatedListValueType:
46
- new_cls = super().__class_getitem__(item) # type: ignore
47
- new_cls._contains_type = item
48
- return new_cls
49
-
50
- @classmethod
51
- def __get_validators__(cls) -> Generator[Callable[[Union[List[str], str], ValidationInfo], List[QueryParamsSeparatedListValueType]], None, None]:
52
- yield cls.validate
53
-
54
- @classmethod
55
- def validate(cls, query_param: Union[List[str], str], info: ValidationInfo) -> List[QueryParamsSeparatedListValueType]:
56
- """
57
- Validate and convert the query parameter string into a list of the specified type.
58
- """
59
- if cls._contains_type is None:
60
- raise TypeError("QueryParamsSeparatedList must be parameterized with a type, e.g., QueryParamsSeparatedList[int]")
61
-
62
- adapter = TypeAdapter(cls._contains_type)
63
-
64
- if not isinstance(query_param, list):
65
- query_param = [query_param]
66
-
67
- reader = csv.reader(query_param, skipinitialspace=True)
68
- splitted = next(reader)
69
-
70
- validated_items = []
71
- errors: List[InitErrorDetails] = []
72
-
73
- for idx, value in enumerate(splitted):
74
- try:
75
- validated_items.append(adapter.validate_python(value))
76
- except ValidationError as e:
77
- for error in e.errors(include_url=False):
78
- error['loc'] = ('param', idx)
79
- errors.append(error) # type: ignore
80
-
81
- if errors:
82
- raise ValidationError.from_exception_data("List validation error", errors)
83
-
84
- return validated_items
File without changes
File without changes
File without changes