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.
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/PKG-INFO +1 -1
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/setup.py +1 -1
- ul-api-utils-8.1.6/ul_api_utils/validators/__tests__/test_custom_fields.py +32 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/validators/custom_fields.py +21 -13
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils.egg-info/PKG-INFO +1 -1
- ul-api-utils-8.1.5/ul_api_utils/validators/__tests__/test_custom_fields.py +0 -33
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/LICENSE +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/README.md +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/__init__.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/conf.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/main.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/models/__init__.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/permissions.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/pure_flask_example.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/rate_limit_load.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/redis_repository.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/routes/__init__.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/routes/api_some.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/sockets/__init__.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/sockets/on_connect.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/sockets/on_disconnect.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/sockets/on_json.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/sockets/on_message.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/sockets/on_open.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/workers/__init__.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/example/workers/worker.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/setup.cfg +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/__init__.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/access/__init__.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/api_resource/__init__.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/api_resource/api_request.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/api_resource/api_resource.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/api_resource/api_resource_config.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/api_resource/api_resource_error_handling.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/api_resource/api_resource_fn_typing.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/api_resource/api_resource_type.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/api_resource/api_response.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/api_resource/api_response_db.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/api_resource/api_response_payload_alias.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/api_resource/db_types.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/api_resource/signature_check.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/commands/__init__.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/commands/cmd_enc_keys.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/commands/cmd_gen_api_user_token.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/commands/cmd_gen_new_api_user.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/commands/cmd_generate_api_docs.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/commands/cmd_start.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/commands/cmd_worker_start.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/commands/start/__init__.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/commands/start/gunicorn.conf.local.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/commands/start/gunicorn.conf.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/commands/start/wsgi.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/conf/ul-debugger-main.js +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/conf/ul-debugger-ui.js +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/conf.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/const.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/debug/__init__.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/debug/debugger.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/debug/malloc.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/debug/stat.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/encrypt/__init__.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/encrypt/encrypt_decrypt_abstract.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/encrypt/encrypt_decrypt_aes_xtea.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/errors.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/internal_api/__init__.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/internal_api/__tests__/__init__.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/internal_api/__tests__/internal_api.py +0 -0
- {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
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/internal_api/internal_api.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/internal_api/internal_api_check_context.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/internal_api/internal_api_error.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/internal_api/internal_api_response.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/main.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/modules/__init__.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/modules/__tests__/__init__.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/modules/__tests__/test_api_sdk_jwt.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/modules/api_sdk.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/modules/api_sdk_config.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/modules/api_sdk_jwt.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/modules/intermediate_state.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/modules/worker_context.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/modules/worker_sdk.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/modules/worker_sdk_config.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/py.typed +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/__init__.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/caching.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/debugger_scripts.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/health_check/__init__.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/health_check/const.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/health_check/health_check.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/health_check/health_check_template.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/health_check/resource.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/not_implemented.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/permissions.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/rate_limitter.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/socketio.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/swagger.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/web_forms/__init__.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/web_forms/custom_fields/__init__.py +0 -0
- {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
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/web_forms/custom_widgets/__init__.py +0 -0
- {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
- {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
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/web_forms/uni_form.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/sentry.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/__init__.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/__tests__/__init__.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/__tests__/api_path_version.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/__tests__/unwrap_typing.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/api_encoding.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/api_format.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/api_method.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/api_pagination.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/api_path_version.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/api_request_info.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/avro.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/broker_topics_message_count.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/cached_per_request.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/colors.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/constants.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/decode_base64.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/deprecated.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/flags.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/flask_swagger_generator/__init__.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/flask_swagger_generator/conf.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/flask_swagger_generator/exceptions.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/flask_swagger_generator/specifiers/__init__.py +0 -0
- {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
- {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
- {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
- {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
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/flask_swagger_generator/utils/__init__.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/imports.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/instance_checks.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/jinja/__init__.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/jinja/t_url_for.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/jinja/to_pretty_json.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/json_encoder.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/load_modules.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/memory_db/__init__.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/memory_db/__tests__/__init__.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/memory_db/errors.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/memory_db/repository.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/token_check.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/token_check_through_request.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/unwrap_typing.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/uuid_converter.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/validators/__init__.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/validators/__tests__/__init__.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/validators/validate_empty_object.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/validators/validate_uuid.py +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils.egg-info/SOURCES.txt +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils.egg-info/dependency_links.txt +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils.egg-info/entry_points.txt +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils.egg-info/requires.txt +0 -0
- {ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils.egg-info/top_level.txt +0 -0
|
@@ -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
|
|
2
|
+
from typing import TypeVar, Generic, List, Union, Generator, Callable, Annotated, Any
|
|
3
3
|
from uuid import UUID
|
|
4
4
|
|
|
5
|
-
from pydantic import
|
|
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
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
return
|
|
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
|
|
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,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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/api_resource/api_resource_error_handling.py
RENAMED
|
File without changes
|
{ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/api_resource/api_resource_fn_typing.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/api_resource/api_response_payload_alias.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/commands/start/gunicorn.conf.local.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/internal_api/__tests__/internal_api.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/internal_api/internal_api_check_context.py
RENAMED
|
File without changes
|
|
File without changes
|
{ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/internal_api/internal_api_response.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/modules/__tests__/test_api_sdk_jwt.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/health_check/health_check.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/resources/web_forms/custom_fields/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/flask_swagger_generator/__init__.py
RENAMED
|
File without changes
|
{ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/flask_swagger_generator/conf.py
RENAMED
|
File without changes
|
{ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/flask_swagger_generator/exceptions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ul-api-utils-8.1.5 → ul-api-utils-8.1.6}/ul_api_utils/utils/memory_db/__tests__/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|