ul-api-utils 8.1.5__tar.gz → 8.1.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 (162) hide show
  1. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/PKG-INFO +1 -1
  2. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/setup.py +1 -1
  3. ul-api-utils-8.1.6/ul_api_utils/validators/__tests__/test_custom_fields.py +32 -0
  4. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/validators/custom_fields.py +21 -13
  5. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils.egg-info/PKG-INFO +1 -1
  6. ul-api-utils-8.1.5/ul_api_utils/validators/__tests__/test_custom_fields.py +0 -33
  7. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/LICENSE +0 -0
  8. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/README.md +0 -0
  9. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/__init__.py +0 -0
  10. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/conf.py +0 -0
  11. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/main.py +0 -0
  12. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/models/__init__.py +0 -0
  13. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/permissions.py +0 -0
  14. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/pure_flask_example.py +0 -0
  15. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/rate_limit_load.py +0 -0
  16. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/redis_repository.py +0 -0
  17. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/routes/__init__.py +0 -0
  18. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/routes/api_some.py +0 -0
  19. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/sockets/__init__.py +0 -0
  20. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/sockets/on_connect.py +0 -0
  21. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/sockets/on_disconnect.py +0 -0
  22. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/sockets/on_json.py +0 -0
  23. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/sockets/on_message.py +0 -0
  24. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/sockets/on_open.py +0 -0
  25. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/workers/__init__.py +0 -0
  26. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/workers/worker.py +0 -0
  27. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/setup.cfg +0 -0
  28. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/__init__.py +0 -0
  29. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/access/__init__.py +0 -0
  30. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/api_resource/__init__.py +0 -0
  31. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/api_resource/api_request.py +0 -0
  32. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/api_resource/api_resource.py +0 -0
  33. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/api_resource/api_resource_config.py +0 -0
  34. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/api_resource/api_resource_error_handling.py +0 -0
  35. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/api_resource/api_resource_fn_typing.py +0 -0
  36. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/api_resource/api_resource_type.py +0 -0
  37. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/api_resource/api_response.py +0 -0
  38. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/api_resource/api_response_db.py +0 -0
  39. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/api_resource/api_response_payload_alias.py +0 -0
  40. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/api_resource/db_types.py +0 -0
  41. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/api_resource/signature_check.py +0 -0
  42. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/commands/__init__.py +0 -0
  43. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/commands/cmd_enc_keys.py +0 -0
  44. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/commands/cmd_gen_api_user_token.py +0 -0
  45. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/commands/cmd_gen_new_api_user.py +0 -0
  46. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/commands/cmd_generate_api_docs.py +0 -0
  47. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/commands/cmd_start.py +0 -0
  48. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/commands/cmd_worker_start.py +0 -0
  49. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/commands/start/__init__.py +0 -0
  50. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/commands/start/gunicorn.conf.local.py +0 -0
  51. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/commands/start/gunicorn.conf.py +0 -0
  52. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/commands/start/wsgi.py +0 -0
  53. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/conf/ul-debugger-main.js +0 -0
  54. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/conf/ul-debugger-ui.js +0 -0
  55. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/conf.py +0 -0
  56. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/const.py +0 -0
  57. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/debug/__init__.py +0 -0
  58. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/debug/debugger.py +0 -0
  59. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/debug/malloc.py +0 -0
  60. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/debug/stat.py +0 -0
  61. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/encrypt/__init__.py +0 -0
  62. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/encrypt/encrypt_decrypt_abstract.py +0 -0
  63. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/encrypt/encrypt_decrypt_aes_xtea.py +0 -0
  64. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/errors.py +0 -0
  65. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/internal_api/__init__.py +0 -0
  66. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/internal_api/__tests__/__init__.py +0 -0
  67. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/internal_api/__tests__/internal_api.py +0 -0
  68. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/internal_api/__tests__/internal_api_content_type.py +0 -0
  69. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/internal_api/internal_api.py +0 -0
  70. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/internal_api/internal_api_check_context.py +0 -0
  71. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/internal_api/internal_api_error.py +0 -0
  72. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/internal_api/internal_api_response.py +0 -0
  73. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/main.py +0 -0
  74. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/modules/__init__.py +0 -0
  75. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/modules/__tests__/__init__.py +0 -0
  76. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/modules/__tests__/test_api_sdk_jwt.py +0 -0
  77. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/modules/api_sdk.py +0 -0
  78. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/modules/api_sdk_config.py +0 -0
  79. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/modules/api_sdk_jwt.py +0 -0
  80. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/modules/intermediate_state.py +0 -0
  81. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/modules/worker_context.py +0 -0
  82. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/modules/worker_sdk.py +0 -0
  83. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/modules/worker_sdk_config.py +0 -0
  84. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/py.typed +0 -0
  85. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/__init__.py +0 -0
  86. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/caching.py +0 -0
  87. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/debugger_scripts.py +0 -0
  88. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/health_check/__init__.py +0 -0
  89. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/health_check/const.py +0 -0
  90. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/health_check/health_check.py +0 -0
  91. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/health_check/health_check_template.py +0 -0
  92. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/health_check/resource.py +0 -0
  93. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/not_implemented.py +0 -0
  94. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/permissions.py +0 -0
  95. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/rate_limitter.py +0 -0
  96. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/socketio.py +0 -0
  97. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/swagger.py +0 -0
  98. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/web_forms/__init__.py +0 -0
  99. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/web_forms/custom_fields/__init__.py +0 -0
  100. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/web_forms/custom_fields/custom_checkbox_select.py +0 -0
  101. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/web_forms/custom_widgets/__init__.py +0 -0
  102. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/web_forms/custom_widgets/custom_select_widget.py +0 -0
  103. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/web_forms/custom_widgets/custom_text_input_widget.py +0 -0
  104. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/web_forms/uni_form.py +0 -0
  105. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/sentry.py +0 -0
  106. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/__init__.py +0 -0
  107. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/__tests__/__init__.py +0 -0
  108. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/__tests__/api_path_version.py +0 -0
  109. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/__tests__/unwrap_typing.py +0 -0
  110. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/api_encoding.py +0 -0
  111. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/api_format.py +0 -0
  112. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/api_method.py +0 -0
  113. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/api_pagination.py +0 -0
  114. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/api_path_version.py +0 -0
  115. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/api_request_info.py +0 -0
  116. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/avro.py +0 -0
  117. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/broker_topics_message_count.py +0 -0
  118. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/cached_per_request.py +0 -0
  119. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/colors.py +0 -0
  120. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/constants.py +0 -0
  121. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/decode_base64.py +0 -0
  122. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/deprecated.py +0 -0
  123. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/flags.py +0 -0
  124. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/flask_swagger_generator/__init__.py +0 -0
  125. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/flask_swagger_generator/conf.py +0 -0
  126. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/flask_swagger_generator/exceptions.py +0 -0
  127. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/flask_swagger_generator/specifiers/__init__.py +0 -0
  128. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/flask_swagger_generator/specifiers/swagger_models.py +0 -0
  129. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/flask_swagger_generator/specifiers/swagger_specifier.py +0 -0
  130. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/flask_swagger_generator/specifiers/swagger_three_specifier.py +0 -0
  131. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/flask_swagger_generator/specifiers/swagger_version.py +0 -0
  132. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/flask_swagger_generator/utils/__init__.py +0 -0
  133. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/flask_swagger_generator/utils/input_type.py +0 -0
  134. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/flask_swagger_generator/utils/parameter_type.py +0 -0
  135. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/flask_swagger_generator/utils/replace_in_dict.py +0 -0
  136. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/flask_swagger_generator/utils/request_type.py +0 -0
  137. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/flask_swagger_generator/utils/schema_type.py +0 -0
  138. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/flask_swagger_generator/utils/security_type.py +0 -0
  139. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/imports.py +0 -0
  140. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/instance_checks.py +0 -0
  141. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/jinja/__init__.py +0 -0
  142. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/jinja/t_url_for.py +0 -0
  143. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/jinja/to_pretty_json.py +0 -0
  144. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/json_encoder.py +0 -0
  145. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/load_modules.py +0 -0
  146. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/memory_db/__init__.py +0 -0
  147. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/memory_db/__tests__/__init__.py +0 -0
  148. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/memory_db/errors.py +0 -0
  149. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/memory_db/repository.py +0 -0
  150. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/token_check.py +0 -0
  151. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/token_check_through_request.py +0 -0
  152. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/unwrap_typing.py +0 -0
  153. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/uuid_converter.py +0 -0
  154. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/validators/__init__.py +0 -0
  155. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/validators/__tests__/__init__.py +0 -0
  156. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/validators/validate_empty_object.py +0 -0
  157. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/validators/validate_uuid.py +0 -0
  158. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils.egg-info/SOURCES.txt +0 -0
  159. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils.egg-info/dependency_links.txt +0 -0
  160. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils.egg-info/entry_points.txt +0 -0
  161. {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils.egg-info/requires.txt +0 -0
  162. {ul-api-utils-8.1.5 → ul-api-utils-8.1.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: 8.1.5
3
+ Version: 8.1.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='8.1.5',
12
+ version='8.1.6',
13
13
  description='Python api utils',
14
14
  author='Unic-lab',
15
15
  long_description=long_description,
@@ -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
@@ -1,8 +1,9 @@
1
1
  import csv
2
- from typing import TypeVar, Generic, List, Union, Generator, Callable, Annotated, Any, get_args
2
+ from typing import TypeVar, Generic, List, Union, Generator, Callable, Annotated, Any
3
3
  from uuid import UUID
4
4
 
5
- from pydantic import ValidationError, Field, StringConstraints, TypeAdapter
5
+ from pydantic import Field, StringConstraints, TypeAdapter
6
+ from pydantic_core import ValidationError, InitErrorDetails
6
7
  from pydantic_core.core_schema import ValidationInfo
7
8
 
8
9
  from ul_api_utils.const import CRON_EXPRESSION_VALIDATION_REGEX, MIN_UTC_OFFSET_SECONDS, MAX_UTC_OFFSET_SECONDS
@@ -38,12 +39,13 @@ class QueryParamsSeparatedList(Generic[QueryParamsSeparatedListValueType]):
38
39
  Note:
39
40
  Sent as a string, but interpreted as List.
40
41
  """
42
+ _contains_type: Any = None
41
43
 
42
- def __init__(self, contains_type: QueryParamsSeparatedListValueType) -> None:
43
- self.contains_type = contains_type
44
-
45
- def __repr__(self) -> str:
46
- return f'QueryParamsSeparatedList({super().__repr__()})'
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
47
49
 
48
50
  @classmethod
49
51
  def __get_validators__(cls) -> Generator[Callable[[Union[List[str], str], ValidationInfo], List[QueryParamsSeparatedListValueType]], None, None]:
@@ -54,23 +56,29 @@ class QueryParamsSeparatedList(Generic[QueryParamsSeparatedListValueType]):
54
56
  """
55
57
  Validate and convert the query parameter string into a list of the specified type.
56
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
+
57
64
  if not isinstance(query_param, list):
58
65
  query_param = [query_param]
59
66
 
60
67
  reader = csv.reader(query_param, skipinitialspace=True)
61
68
  splitted = next(reader)
62
69
 
63
- adapter = TypeAdapter(get_args(cls)[0])
64
-
65
70
  validated_items = []
66
- errors = []
71
+ errors: List[InitErrorDetails] = []
67
72
 
68
- for value in splitted:
73
+ for idx, value in enumerate(splitted):
69
74
  try:
70
75
  validated_items.append(adapter.validate_python(value))
71
76
  except ValidationError as e:
72
- errors.append(e)
77
+ for error in e.errors(include_url=False):
78
+ error['loc'] = ('param', idx)
79
+ errors.append(error) # type: ignore
80
+
73
81
  if errors:
74
- raise ValidationError(errors)
82
+ raise ValidationError.from_exception_data("List validation error", errors)
75
83
 
76
84
  return validated_items
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ul-api-utils
3
- Version: 8.1.5
3
+ Version: 8.1.6
4
4
  Summary: Python api utils
5
5
  Author: Unic-lab
6
6
  Author-email:
@@ -1,33 +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(ModelInt, ["1,2,3,4,5"], [1, 2, 3, 4, 5]),
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'], ["first_array_element", "second,third", "this"]),
25
- pytest.param(ModelStr, '"first_array_element,second,third",this, "1,2"', ["first_array_element,second,third", "this", "1,2"]),
26
- ],
27
- )
28
- def test__query_params_separated_list(
29
- model: Union[ModelStr, ModelInt], input_data: Union[List[str], str], expected_output: List[Union[str, int]],
30
- ) -> None:
31
- instance = model(param=input_data) # type: ignore
32
- assert isinstance(instance.param, list)
33
- assert instance.param == expected_output
File without changes
File without changes
File without changes