clear-skies 1.19.22__py3-none-any.whl → 2.0.23__py3-none-any.whl
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.
- clear_skies-2.0.23.dist-info/METADATA +76 -0
- clear_skies-2.0.23.dist-info/RECORD +265 -0
- {clear_skies-1.19.22.dist-info → clear_skies-2.0.23.dist-info}/WHEEL +1 -1
- clearskies/__init__.py +37 -21
- clearskies/action.py +7 -0
- clearskies/authentication/__init__.py +9 -38
- clearskies/authentication/authentication.py +44 -0
- clearskies/authentication/authorization.py +14 -8
- clearskies/authentication/authorization_pass_through.py +22 -0
- clearskies/authentication/jwks.py +135 -58
- clearskies/authentication/public.py +3 -26
- clearskies/authentication/secret_bearer.py +515 -44
- clearskies/autodoc/formats/oai3_json/__init__.py +2 -2
- clearskies/autodoc/formats/oai3_json/oai3_json.py +11 -9
- clearskies/autodoc/formats/oai3_json/parameter.py +6 -3
- clearskies/autodoc/formats/oai3_json/request.py +7 -5
- clearskies/autodoc/formats/oai3_json/response.py +7 -4
- clearskies/autodoc/formats/oai3_json/schema/object.py +10 -1
- clearskies/autodoc/request/__init__.py +2 -0
- clearskies/autodoc/request/header.py +4 -6
- clearskies/autodoc/request/json_body.py +4 -6
- clearskies/autodoc/request/parameter.py +8 -0
- clearskies/autodoc/request/request.py +16 -4
- clearskies/autodoc/request/url_parameter.py +4 -6
- clearskies/autodoc/request/url_path.py +4 -6
- clearskies/autodoc/schema/__init__.py +4 -2
- clearskies/autodoc/schema/array.py +5 -6
- clearskies/autodoc/schema/boolean.py +4 -10
- clearskies/autodoc/schema/date.py +0 -3
- clearskies/autodoc/schema/datetime.py +1 -4
- clearskies/autodoc/schema/double.py +0 -3
- clearskies/autodoc/schema/enum.py +4 -2
- clearskies/autodoc/schema/integer.py +4 -9
- clearskies/autodoc/schema/long.py +0 -3
- clearskies/autodoc/schema/number.py +4 -9
- clearskies/autodoc/schema/object.py +5 -7
- clearskies/autodoc/schema/password.py +0 -3
- clearskies/autodoc/schema/schema.py +11 -0
- clearskies/autodoc/schema/string.py +4 -10
- clearskies/backends/__init__.py +56 -17
- clearskies/backends/api_backend.py +1128 -166
- clearskies/backends/backend.py +54 -85
- clearskies/backends/cursor_backend.py +246 -191
- clearskies/backends/memory_backend.py +514 -208
- clearskies/backends/secrets_backend.py +68 -31
- clearskies/column.py +1221 -0
- clearskies/columns/__init__.py +71 -0
- clearskies/columns/audit.py +306 -0
- clearskies/columns/belongs_to_id.py +478 -0
- clearskies/columns/belongs_to_model.py +129 -0
- clearskies/columns/belongs_to_self.py +109 -0
- clearskies/columns/boolean.py +110 -0
- clearskies/columns/category_tree.py +273 -0
- clearskies/columns/category_tree_ancestors.py +51 -0
- clearskies/columns/category_tree_children.py +126 -0
- clearskies/columns/category_tree_descendants.py +48 -0
- clearskies/columns/created.py +92 -0
- clearskies/columns/created_by_authorization_data.py +114 -0
- clearskies/columns/created_by_header.py +103 -0
- clearskies/columns/created_by_ip.py +90 -0
- clearskies/columns/created_by_routing_data.py +102 -0
- clearskies/columns/created_by_user_agent.py +89 -0
- clearskies/columns/date.py +232 -0
- clearskies/columns/datetime.py +284 -0
- clearskies/columns/email.py +78 -0
- clearskies/columns/float.py +149 -0
- clearskies/columns/has_many.py +529 -0
- clearskies/columns/has_many_self.py +62 -0
- clearskies/columns/has_one.py +21 -0
- clearskies/columns/integer.py +158 -0
- clearskies/columns/json.py +126 -0
- clearskies/columns/many_to_many_ids.py +335 -0
- clearskies/columns/many_to_many_ids_with_data.py +274 -0
- clearskies/columns/many_to_many_models.py +156 -0
- clearskies/columns/many_to_many_pivots.py +132 -0
- clearskies/columns/phone.py +162 -0
- clearskies/columns/select.py +95 -0
- clearskies/columns/string.py +102 -0
- clearskies/columns/timestamp.py +164 -0
- clearskies/columns/updated.py +107 -0
- clearskies/columns/uuid.py +83 -0
- clearskies/configs/README.md +105 -0
- clearskies/configs/__init__.py +170 -0
- clearskies/configs/actions.py +43 -0
- clearskies/configs/any.py +15 -0
- clearskies/configs/any_dict.py +24 -0
- clearskies/configs/any_dict_or_callable.py +25 -0
- clearskies/configs/authentication.py +23 -0
- clearskies/configs/authorization.py +23 -0
- clearskies/configs/boolean.py +18 -0
- clearskies/configs/boolean_or_callable.py +20 -0
- clearskies/configs/callable_config.py +20 -0
- clearskies/configs/columns.py +34 -0
- clearskies/configs/conditions.py +30 -0
- clearskies/configs/config.py +26 -0
- clearskies/configs/datetime.py +20 -0
- clearskies/configs/datetime_or_callable.py +21 -0
- clearskies/configs/email.py +10 -0
- clearskies/configs/email_list.py +17 -0
- clearskies/configs/email_list_or_callable.py +17 -0
- clearskies/configs/email_or_email_list_or_callable.py +59 -0
- clearskies/configs/endpoint.py +23 -0
- clearskies/configs/endpoint_list.py +29 -0
- clearskies/configs/float.py +18 -0
- clearskies/configs/float_or_callable.py +20 -0
- clearskies/configs/headers.py +28 -0
- clearskies/configs/integer.py +18 -0
- clearskies/configs/integer_or_callable.py +20 -0
- clearskies/configs/joins.py +30 -0
- clearskies/configs/list_any_dict.py +32 -0
- clearskies/configs/list_any_dict_or_callable.py +33 -0
- clearskies/configs/model_class.py +35 -0
- clearskies/configs/model_column.py +67 -0
- clearskies/configs/model_columns.py +58 -0
- clearskies/configs/model_destination_name.py +26 -0
- clearskies/configs/model_to_id_column.py +45 -0
- clearskies/configs/readable_model_column.py +11 -0
- clearskies/configs/readable_model_columns.py +11 -0
- clearskies/configs/schema.py +23 -0
- clearskies/configs/searchable_model_columns.py +11 -0
- clearskies/configs/security_headers.py +39 -0
- clearskies/configs/select.py +28 -0
- clearskies/configs/select_list.py +49 -0
- clearskies/configs/string.py +31 -0
- clearskies/configs/string_dict.py +34 -0
- clearskies/configs/string_list.py +47 -0
- clearskies/configs/string_list_or_callable.py +48 -0
- clearskies/configs/string_or_callable.py +18 -0
- clearskies/configs/timedelta.py +20 -0
- clearskies/configs/timezone.py +20 -0
- clearskies/configs/url.py +25 -0
- clearskies/configs/validators.py +45 -0
- clearskies/configs/writeable_model_column.py +11 -0
- clearskies/configs/writeable_model_columns.py +11 -0
- clearskies/configurable.py +78 -0
- clearskies/contexts/__init__.py +8 -8
- clearskies/contexts/cli.py +129 -43
- clearskies/contexts/context.py +93 -56
- clearskies/contexts/wsgi.py +79 -33
- clearskies/contexts/wsgi_ref.py +87 -0
- clearskies/cursors/__init__.py +7 -0
- clearskies/cursors/cursor.py +166 -0
- clearskies/cursors/from_environment/__init__.py +5 -0
- clearskies/cursors/from_environment/mysql.py +51 -0
- clearskies/cursors/from_environment/postgresql.py +49 -0
- clearskies/cursors/from_environment/sqlite.py +35 -0
- clearskies/cursors/mysql.py +61 -0
- clearskies/cursors/postgresql.py +61 -0
- clearskies/cursors/sqlite.py +62 -0
- clearskies/decorators.py +33 -0
- clearskies/decorators.pyi +10 -0
- clearskies/di/__init__.py +11 -7
- clearskies/di/additional_config.py +117 -3
- clearskies/di/additional_config_auto_import.py +12 -0
- clearskies/di/di.py +717 -126
- clearskies/di/inject/__init__.py +23 -0
- clearskies/di/inject/akeyless_sdk.py +16 -0
- clearskies/di/inject/by_class.py +24 -0
- clearskies/di/inject/by_name.py +22 -0
- clearskies/di/inject/di.py +16 -0
- clearskies/di/inject/environment.py +15 -0
- clearskies/di/inject/input_output.py +19 -0
- clearskies/di/inject/now.py +16 -0
- clearskies/di/inject/requests.py +16 -0
- clearskies/di/inject/secrets.py +15 -0
- clearskies/di/inject/utcnow.py +16 -0
- clearskies/di/inject/uuid.py +16 -0
- clearskies/di/injectable.py +32 -0
- clearskies/di/injectable_properties.py +131 -0
- clearskies/end.py +219 -0
- clearskies/endpoint.py +1303 -0
- clearskies/endpoint_group.py +333 -0
- clearskies/endpoints/__init__.py +25 -0
- clearskies/endpoints/advanced_search.py +519 -0
- clearskies/endpoints/callable.py +382 -0
- clearskies/endpoints/create.py +201 -0
- clearskies/endpoints/delete.py +133 -0
- clearskies/endpoints/get.py +267 -0
- clearskies/endpoints/health_check.py +181 -0
- clearskies/endpoints/list.py +567 -0
- clearskies/endpoints/restful_api.py +417 -0
- clearskies/endpoints/schema.py +185 -0
- clearskies/endpoints/simple_search.py +279 -0
- clearskies/endpoints/update.py +188 -0
- clearskies/environment.py +7 -3
- clearskies/exceptions/__init__.py +19 -0
- clearskies/{handlers/exceptions/input_error.py → exceptions/input_errors.py} +1 -1
- clearskies/exceptions/missing_dependency.py +2 -0
- clearskies/exceptions/moved_permanently.py +3 -0
- clearskies/exceptions/moved_temporarily.py +3 -0
- clearskies/functional/__init__.py +2 -2
- clearskies/functional/json.py +47 -0
- clearskies/functional/routing.py +92 -0
- clearskies/functional/string.py +19 -11
- clearskies/functional/validations.py +61 -9
- clearskies/input_outputs/__init__.py +9 -7
- clearskies/input_outputs/cli.py +135 -152
- clearskies/input_outputs/exceptions/__init__.py +6 -1
- clearskies/input_outputs/headers.py +54 -0
- clearskies/input_outputs/input_output.py +77 -123
- clearskies/input_outputs/programmatic.py +62 -0
- clearskies/input_outputs/wsgi.py +36 -48
- clearskies/model.py +1894 -199
- clearskies/query/__init__.py +12 -0
- clearskies/query/condition.py +228 -0
- clearskies/query/join.py +136 -0
- clearskies/query/query.py +193 -0
- clearskies/query/sort.py +27 -0
- clearskies/schema.py +82 -0
- clearskies/secrets/__init__.py +4 -31
- clearskies/secrets/additional_configs/mysql_connection_dynamic_producer.py +15 -4
- clearskies/secrets/additional_configs/mysql_connection_dynamic_producer_via_ssh_cert_bastion.py +11 -5
- clearskies/secrets/akeyless.py +421 -155
- clearskies/secrets/exceptions/__init__.py +7 -1
- clearskies/secrets/exceptions/not_found_error.py +2 -0
- clearskies/secrets/exceptions/permissions_error.py +2 -0
- clearskies/secrets/secrets.py +12 -11
- clearskies/security_header.py +17 -0
- clearskies/security_headers/__init__.py +8 -8
- clearskies/security_headers/cache_control.py +47 -109
- clearskies/security_headers/cors.py +38 -92
- clearskies/security_headers/csp.py +76 -150
- clearskies/security_headers/hsts.py +14 -15
- clearskies/typing.py +11 -0
- clearskies/validator.py +36 -0
- clearskies/validators/__init__.py +33 -0
- clearskies/validators/after_column.py +61 -0
- clearskies/validators/before_column.py +15 -0
- clearskies/validators/in_the_future.py +29 -0
- clearskies/validators/in_the_future_at_least.py +13 -0
- clearskies/validators/in_the_future_at_most.py +12 -0
- clearskies/validators/in_the_past.py +29 -0
- clearskies/validators/in_the_past_at_least.py +12 -0
- clearskies/validators/in_the_past_at_most.py +12 -0
- clearskies/validators/maximum_length.py +25 -0
- clearskies/validators/maximum_value.py +28 -0
- clearskies/validators/minimum_length.py +25 -0
- clearskies/validators/minimum_value.py +28 -0
- clearskies/{input_requirements → validators}/required.py +18 -9
- clearskies/validators/timedelta.py +58 -0
- clearskies/validators/unique.py +28 -0
- clear_skies-1.19.22.dist-info/METADATA +0 -46
- clear_skies-1.19.22.dist-info/RECORD +0 -206
- clearskies/application.py +0 -29
- clearskies/authentication/auth0_jwks.py +0 -118
- clearskies/authentication/auth_exception.py +0 -2
- clearskies/authentication/jwks_jwcrypto.py +0 -39
- clearskies/backends/example_backend.py +0 -43
- clearskies/backends/file_backend.py +0 -48
- clearskies/backends/json_backend.py +0 -7
- clearskies/backends/restful_api_advanced_search_backend.py +0 -138
- clearskies/binding_config.py +0 -16
- clearskies/column_types/__init__.py +0 -184
- clearskies/column_types/audit.py +0 -235
- clearskies/column_types/belongs_to.py +0 -250
- clearskies/column_types/boolean.py +0 -60
- clearskies/column_types/category_tree.py +0 -226
- clearskies/column_types/column.py +0 -373
- clearskies/column_types/created.py +0 -26
- clearskies/column_types/created_by_authorization_data.py +0 -26
- clearskies/column_types/created_by_header.py +0 -24
- clearskies/column_types/created_by_ip.py +0 -17
- clearskies/column_types/created_by_routing_data.py +0 -25
- clearskies/column_types/created_by_user_agent.py +0 -17
- clearskies/column_types/created_micro.py +0 -26
- clearskies/column_types/datetime.py +0 -108
- clearskies/column_types/datetime_micro.py +0 -12
- clearskies/column_types/email.py +0 -18
- clearskies/column_types/float.py +0 -43
- clearskies/column_types/has_many.py +0 -139
- clearskies/column_types/integer.py +0 -41
- clearskies/column_types/json.py +0 -25
- clearskies/column_types/many_to_many.py +0 -278
- clearskies/column_types/many_to_many_with_data.py +0 -162
- clearskies/column_types/select.py +0 -11
- clearskies/column_types/string.py +0 -24
- clearskies/column_types/updated.py +0 -24
- clearskies/column_types/updated_micro.py +0 -24
- clearskies/column_types/uuid.py +0 -25
- clearskies/columns.py +0 -123
- clearskies/condition_parser.py +0 -172
- clearskies/contexts/build_context.py +0 -54
- clearskies/contexts/convert_to_application.py +0 -190
- clearskies/contexts/extract_handler.py +0 -37
- clearskies/contexts/test.py +0 -94
- clearskies/decorators/__init__.py +0 -39
- clearskies/decorators/auth0_jwks.py +0 -22
- clearskies/decorators/authorization.py +0 -10
- clearskies/decorators/binding_classes.py +0 -9
- clearskies/decorators/binding_modules.py +0 -9
- clearskies/decorators/bindings.py +0 -9
- clearskies/decorators/create.py +0 -10
- clearskies/decorators/delete.py +0 -10
- clearskies/decorators/docs.py +0 -14
- clearskies/decorators/get.py +0 -10
- clearskies/decorators/jwks.py +0 -26
- clearskies/decorators/merge.py +0 -124
- clearskies/decorators/patch.py +0 -10
- clearskies/decorators/post.py +0 -10
- clearskies/decorators/public.py +0 -11
- clearskies/decorators/response_headers.py +0 -10
- clearskies/decorators/return_raw_response.py +0 -9
- clearskies/decorators/schema.py +0 -10
- clearskies/decorators/secret_bearer.py +0 -24
- clearskies/decorators/security_headers.py +0 -10
- clearskies/di/standard_dependencies.py +0 -140
- clearskies/di/test_module/__init__.py +0 -6
- clearskies/di/test_module/another_module/__init__.py +0 -2
- clearskies/di/test_module/module_class.py +0 -5
- clearskies/handlers/__init__.py +0 -41
- clearskies/handlers/advanced_search.py +0 -271
- clearskies/handlers/base.py +0 -473
- clearskies/handlers/callable.py +0 -189
- clearskies/handlers/create.py +0 -35
- clearskies/handlers/crud_by_method.py +0 -18
- clearskies/handlers/database_connector.py +0 -32
- clearskies/handlers/delete.py +0 -61
- clearskies/handlers/exceptions/__init__.py +0 -5
- clearskies/handlers/exceptions/not_found.py +0 -3
- clearskies/handlers/get.py +0 -156
- clearskies/handlers/health_check.py +0 -59
- clearskies/handlers/input_processing.py +0 -79
- clearskies/handlers/list.py +0 -530
- clearskies/handlers/mygrations.py +0 -82
- clearskies/handlers/request_method_routing.py +0 -47
- clearskies/handlers/restful_api.py +0 -218
- clearskies/handlers/routing.py +0 -62
- clearskies/handlers/schema_helper.py +0 -128
- clearskies/handlers/simple_routing.py +0 -204
- clearskies/handlers/simple_routing_route.py +0 -192
- clearskies/handlers/simple_search.py +0 -136
- clearskies/handlers/update.py +0 -96
- clearskies/handlers/write.py +0 -193
- clearskies/input_requirements/__init__.py +0 -68
- clearskies/input_requirements/after.py +0 -36
- clearskies/input_requirements/before.py +0 -36
- clearskies/input_requirements/in_the_future_at_least.py +0 -19
- clearskies/input_requirements/in_the_future_at_most.py +0 -19
- clearskies/input_requirements/in_the_past_at_least.py +0 -19
- clearskies/input_requirements/in_the_past_at_most.py +0 -19
- clearskies/input_requirements/maximum_length.py +0 -19
- clearskies/input_requirements/minimum_length.py +0 -22
- clearskies/input_requirements/requirement.py +0 -25
- clearskies/input_requirements/time_delta.py +0 -38
- clearskies/input_requirements/unique.py +0 -18
- clearskies/mocks/__init__.py +0 -7
- clearskies/mocks/input_output.py +0 -124
- clearskies/mocks/models.py +0 -142
- clearskies/models.py +0 -345
- clearskies/security_headers/base.py +0 -12
- clearskies/tests/simple_api/models/__init__.py +0 -2
- clearskies/tests/simple_api/models/status.py +0 -23
- clearskies/tests/simple_api/models/user.py +0 -21
- clearskies/tests/simple_api/users_api.py +0 -64
- {clear_skies-1.19.22.dist-info → clear_skies-2.0.23.dist-info/licenses}/LICENSE +0 -0
- /clearskies/{contexts/bash.py → autodoc/py.typed} +0 -0
- /clearskies/{handlers/exceptions → exceptions}/authentication.py +0 -0
- /clearskies/{handlers/exceptions → exceptions}/authorization.py +0 -0
- /clearskies/{handlers/exceptions → exceptions}/client_error.py +0 -0
- /clearskies/{secrets/exceptions → exceptions}/not_found.py +0 -0
- /clearskies/{tests/__init__.py → input_outputs/py.typed} +0 -0
- /clearskies/{tests/simple_api/__init__.py → py.typed} +0 -0
clearskies/backends/backend.py
CHANGED
|
@@ -1,46 +1,56 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
1
3
|
from abc import ABC, abstractmethod
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
from
|
|
4
|
+
from typing import TYPE_CHECKING, Any, Callable
|
|
5
|
+
|
|
6
|
+
from clearskies.autodoc.schema import Schema as AutoDocSchema
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from clearskies import Column, Model
|
|
10
|
+
from clearskies.query import Query
|
|
5
11
|
|
|
6
12
|
|
|
7
13
|
class Backend(ABC):
|
|
14
|
+
"""
|
|
15
|
+
Connecting models to their data since 2020!.
|
|
16
|
+
|
|
17
|
+
The backend system acts as a flexible layer between models and their data sources. By changing the backend attached to a model,
|
|
18
|
+
you change where the model fetches and saves data. This might be a database, an in-memory data store, a dynamodb table,
|
|
19
|
+
an API, and more. This allows you to interact with a variety of data sources with the models acting as a standardized API.
|
|
20
|
+
Since endpoints also rely on the models for their functionality, this means that you can easily build API endpoints and
|
|
21
|
+
more for a variety of data sources with a minimal amount of code.
|
|
22
|
+
|
|
23
|
+
Of course, not all data sources support all functionality present in the model. Therefore, you do still need to have
|
|
24
|
+
a fair understanding of how your data sources work.
|
|
25
|
+
"""
|
|
26
|
+
|
|
8
27
|
supports_n_plus_one = False
|
|
28
|
+
can_count = True
|
|
9
29
|
|
|
10
30
|
@abstractmethod
|
|
11
|
-
def update(self, id: str, data:
|
|
12
|
-
"""
|
|
13
|
-
Updates the record with the given id with the information from the data dictionary
|
|
14
|
-
"""
|
|
31
|
+
def update(self, id: int | str, data: dict[str, Any], model: Model) -> dict[str, Any]:
|
|
32
|
+
"""Update the record with the given id with the information from the data dictionary."""
|
|
15
33
|
pass
|
|
16
34
|
|
|
17
35
|
@abstractmethod
|
|
18
|
-
def create(self, data:
|
|
19
|
-
"""
|
|
20
|
-
Creates a record with the information from the data dictionary
|
|
21
|
-
"""
|
|
36
|
+
def create(self, data: dict[str, Any], model: Model) -> dict[str, Any]:
|
|
37
|
+
"""Create a record with the information from the data dictionary."""
|
|
22
38
|
pass
|
|
23
39
|
|
|
24
40
|
@abstractmethod
|
|
25
|
-
def delete(self, id: str, model:
|
|
26
|
-
"""
|
|
27
|
-
Deletes the record with the given id
|
|
28
|
-
"""
|
|
41
|
+
def delete(self, id: int | str, model: Model) -> bool:
|
|
42
|
+
"""Delete the record with the given id."""
|
|
29
43
|
pass
|
|
30
44
|
|
|
31
45
|
@abstractmethod
|
|
32
|
-
def count(self,
|
|
33
|
-
"""
|
|
34
|
-
Returns the number of records which match the given query configuration
|
|
35
|
-
"""
|
|
46
|
+
def count(self, query: Query) -> int:
|
|
47
|
+
"""Return the number of records which match the given query configuration."""
|
|
36
48
|
pass
|
|
37
49
|
|
|
38
50
|
@abstractmethod
|
|
39
|
-
def records(
|
|
40
|
-
self, configuration: Dict[str, Any], model: model.Model, next_page_data: Dict[str, str] = None
|
|
41
|
-
) -> List[Dict[str, Any]]:
|
|
51
|
+
def records(self, query: Query, next_page_data: dict[str, str | int] | None = None) -> list[dict[str, Any]]:
|
|
42
52
|
"""
|
|
43
|
-
|
|
53
|
+
Return a list of records that match the given query configuration.
|
|
44
54
|
|
|
45
55
|
next_page_data is used to return data to the caller. Pass in an empty dictionary, and it will be populated
|
|
46
56
|
with the data needed to return the next page of results. If it is still an empty dictionary when returned,
|
|
@@ -49,18 +59,18 @@ class Backend(ABC):
|
|
|
49
59
|
pass
|
|
50
60
|
|
|
51
61
|
@abstractmethod
|
|
52
|
-
def
|
|
62
|
+
def validate_pagination_data(self, data: dict[str, Any], case_mapping: Callable[[str], str]) -> str:
|
|
53
63
|
"""
|
|
54
|
-
|
|
64
|
+
Check if the given dictionary is valid pagination data for the background.
|
|
55
65
|
|
|
56
|
-
|
|
66
|
+
Return a string with an error message, or an empty string if the data is valid
|
|
57
67
|
"""
|
|
58
68
|
pass
|
|
59
69
|
|
|
60
70
|
@abstractmethod
|
|
61
|
-
def allowed_pagination_keys(self) ->
|
|
71
|
+
def allowed_pagination_keys(self) -> list[str]:
|
|
62
72
|
"""
|
|
63
|
-
|
|
73
|
+
Return the list of allowed keys in the pagination kwargs for the backend.
|
|
64
74
|
|
|
65
75
|
It must always return keys in snake_case so that the auto casing system can
|
|
66
76
|
adjust on the front-end for consistency.
|
|
@@ -68,79 +78,38 @@ class Backend(ABC):
|
|
|
68
78
|
pass
|
|
69
79
|
|
|
70
80
|
@abstractmethod
|
|
71
|
-
def documentation_pagination_next_page_response(self, case_mapping: Callable) ->
|
|
81
|
+
def documentation_pagination_next_page_response(self, case_mapping: Callable) -> list[Any]:
|
|
72
82
|
"""
|
|
73
|
-
|
|
83
|
+
Return a list of autodoc schema objects.
|
|
84
|
+
|
|
85
|
+
It will describe the contents of the `next_page` dictionary
|
|
74
86
|
in the pagination section of the response
|
|
75
87
|
"""
|
|
76
88
|
pass
|
|
77
89
|
|
|
78
90
|
@abstractmethod
|
|
79
|
-
def documentation_pagination_parameters(self, case_mapping: Callable) ->
|
|
91
|
+
def documentation_pagination_parameters(self, case_mapping: Callable) -> list[tuple[AutoDocSchema, str]]:
|
|
80
92
|
"""
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
93
|
+
Return a list of autodoc schema objects describing the allowed input keys to set pagination.
|
|
94
|
+
|
|
95
|
+
It should return a list of tuples, with each tuple corresponding to an input key.
|
|
96
|
+
The first element in the tuple should be the schema, and the second should be the description.
|
|
84
97
|
"""
|
|
85
98
|
pass
|
|
86
99
|
|
|
87
100
|
@abstractmethod
|
|
88
|
-
def documentation_pagination_next_page_example(self, case_mapping: Callable) ->
|
|
101
|
+
def documentation_pagination_next_page_example(self, case_mapping: Callable) -> dict[str, Any]:
|
|
89
102
|
"""
|
|
103
|
+
Return an example for next page documentation.
|
|
104
|
+
|
|
90
105
|
Returns an example (as a simple dictionary) of what the next_page data in the pagination response
|
|
91
106
|
should look like
|
|
92
107
|
"""
|
|
93
108
|
pass
|
|
94
109
|
|
|
95
|
-
def
|
|
96
|
-
self, model_or_class: Union[model.Model, Type[model.Model]], data: Dict[str, Any]
|
|
97
|
-
) -> Dict[str, Any]:
|
|
98
|
-
"""
|
|
99
|
-
This creates a record but, unlike with self.create, does not require a model - just the model class
|
|
100
|
-
|
|
101
|
-
Mainly meant for testing because this cheats badly.
|
|
102
|
-
"""
|
|
103
|
-
model = self.cheez_model(model_or_class)
|
|
104
|
-
return self.create(data, model)
|
|
105
|
-
|
|
106
|
-
def cheez_model(self, model_or_class: Union[model.Model, Type[model.Model]]) -> model.Model:
|
|
107
|
-
"""
|
|
108
|
-
Pass in a model or model class, and it returns a (possibly poorly constructed) model
|
|
109
|
-
|
|
110
|
-
The backends have some methods mainly meant for testing which accept either a model
|
|
111
|
-
or model class. We accept the model class because, especially when testing, this is often much easier
|
|
112
|
-
to provide (since you need a columns object to build the model). In all current cases, these backend
|
|
113
|
-
methods don't actually need a full model - just the table name. This is quite simple when we have a model,
|
|
114
|
-
because the model can tell you what the table name is.
|
|
115
|
-
|
|
116
|
-
It's tricky when we get a model class because that means we need to build the model, but we don't
|
|
117
|
-
have access to a generic model builder. We could ask the dev to provide a model, but being able to provide just
|
|
118
|
-
a model class will save devs a lot trouble in many cases (especially testing).
|
|
119
|
-
|
|
120
|
-
Fortunately, pulling out a table name for the model basically never involves dependencies. Therefore,
|
|
121
|
-
we will cheat! We'll just inject gibberish for the arguments of the constructor and hope nothing
|
|
122
|
-
breaks.
|
|
123
|
-
|
|
124
|
-
NOTE: If you're here because something broke, and your dependencies actually do matter for determining
|
|
125
|
-
the table name, then you need to do two things:
|
|
126
|
-
|
|
127
|
-
1. Consider if you're doing something the wrong way, because that is weird
|
|
128
|
-
2. Just provide the model instead of the model class.
|
|
129
|
-
"""
|
|
130
|
-
if inspect.isclass(model_or_class):
|
|
131
|
-
try:
|
|
132
|
-
# the list of args will include 'self' which we don't have to provide, so subtract 1
|
|
133
|
-
nargs = len(inspect.getfullargspec(model_or_class.__init__).args) - 1
|
|
134
|
-
# generate a list of empty strings with a size of nargs and pass that into the constructor
|
|
135
|
-
return model_or_class(*([""] * nargs))
|
|
136
|
-
except AttributeError:
|
|
137
|
-
# if we get here there is no __init__ defined so we don't need to pass arguments
|
|
138
|
-
return model_or_class()
|
|
139
|
-
return model_or_class
|
|
140
|
-
|
|
141
|
-
def column_from_backend(self, column, value):
|
|
110
|
+
def column_from_backend(self, column: Column, value: Any) -> Any:
|
|
142
111
|
"""
|
|
143
|
-
|
|
112
|
+
Manage transformations from the backend.
|
|
144
113
|
|
|
145
114
|
The idea with this (and `column_to_backend`) is that the transformations to
|
|
146
115
|
and from the backend are mostly determined by the column type - integer, string,
|
|
@@ -152,9 +121,9 @@ class Backend(ABC):
|
|
|
152
121
|
"""
|
|
153
122
|
return column.from_backend(value)
|
|
154
123
|
|
|
155
|
-
def column_to_backend(self, column, backend_data):
|
|
124
|
+
def column_to_backend(self, column: Column, backend_data: dict[str, Any]) -> dict[str, Any]:
|
|
156
125
|
"""
|
|
157
|
-
|
|
126
|
+
Manage transformations to the backend.
|
|
158
127
|
|
|
159
128
|
The idea with this (and `column_from_backend`) is that the transformations to
|
|
160
129
|
and from the backend are mostly determined by the column type - integer, string,
|