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
|
@@ -1,10 +1,19 @@
|
|
|
1
|
+
from typing import Any
|
|
2
|
+
|
|
3
|
+
|
|
1
4
|
class Object:
|
|
2
5
|
def __init__(self, schema, oai3_schema_resolver):
|
|
3
6
|
self.schema = schema
|
|
7
|
+
# shhhh
|
|
8
|
+
self.schema.children = [
|
|
9
|
+
child[0] if (isinstance(child, tuple) or isinstance(child, list)) else child
|
|
10
|
+
for child in self.schema.children
|
|
11
|
+
]
|
|
12
|
+
|
|
4
13
|
self.oai3_schema_resolver = oai3_schema_resolver
|
|
5
14
|
|
|
6
15
|
def convert(self, include_required=False):
|
|
7
|
-
schema = {
|
|
16
|
+
schema: dict[str, Any] = {
|
|
8
17
|
"type": "object",
|
|
9
18
|
}
|
|
10
19
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from .header import Header
|
|
2
2
|
from .json_body import JSONBody
|
|
3
|
+
from .parameter import Parameter
|
|
3
4
|
from .request import Request
|
|
4
5
|
from .url_parameter import URLParameter
|
|
5
6
|
from .url_path import URLPath
|
|
@@ -7,6 +8,7 @@ from .url_path import URLPath
|
|
|
7
8
|
__all__ = [
|
|
8
9
|
"Header",
|
|
9
10
|
"JSONBody",
|
|
11
|
+
"Parameter",
|
|
10
12
|
"Request",
|
|
11
13
|
"URLParameter",
|
|
12
14
|
"URLPath",
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
from .parameter import Parameter
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class Header(Parameter):
|
|
2
5
|
location = "header"
|
|
3
6
|
in_body = False
|
|
4
|
-
|
|
5
|
-
def __init__(self, definition, description="", required=False):
|
|
6
|
-
self.definition = definition
|
|
7
|
-
self.description = description
|
|
8
|
-
self.required = required
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
from .parameter import Parameter
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class JSONBody(Parameter):
|
|
2
5
|
location = "json_body"
|
|
3
6
|
in_body = True
|
|
4
|
-
|
|
5
|
-
def __init__(self, definition, description="", required=False):
|
|
6
|
-
self.definition = definition
|
|
7
|
-
self.description = description
|
|
8
|
-
self.required = required
|
|
@@ -1,14 +1,26 @@
|
|
|
1
|
+
import re
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
|
|
1
5
|
class Request:
|
|
2
|
-
description =
|
|
3
|
-
relative_path =
|
|
4
|
-
request_methods =
|
|
5
|
-
parameters =
|
|
6
|
+
description: str = ""
|
|
7
|
+
relative_path: str = ""
|
|
8
|
+
request_methods: list[str] = []
|
|
9
|
+
parameters: list[Any] = []
|
|
6
10
|
responses = None
|
|
7
11
|
root_properties = None
|
|
8
12
|
|
|
9
13
|
def __init__(
|
|
10
14
|
self, description, responses, relative_path="", request_methods="GET", parameters=None, root_properties=None
|
|
11
15
|
):
|
|
16
|
+
# clearskies supports path parameters via {parameter} and :parameter but we want to normalize to {paramter} for
|
|
17
|
+
# autodoc purposes
|
|
18
|
+
if ":" in relative_path:
|
|
19
|
+
relative_path = "/" + relative_path.strip("/") + "/"
|
|
20
|
+
for match in re.findall("/(:[^/]+)/", relative_path):
|
|
21
|
+
name = match[1:]
|
|
22
|
+
relative_path = relative_path.replace(f"/:{name}/", "/{" + name + "}/")
|
|
23
|
+
|
|
12
24
|
self.description = description
|
|
13
25
|
self.responses = responses
|
|
14
26
|
self.relative_path = relative_path.lstrip("/")
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
from .parameter import Parameter
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class URLParameter(Parameter):
|
|
2
5
|
location = "url_parameter"
|
|
3
6
|
in_body = False
|
|
4
|
-
|
|
5
|
-
def __init__(self, definition, description="", required=False):
|
|
6
|
-
self.definition = definition
|
|
7
|
-
self.description = description
|
|
8
|
-
self.required = required
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
from .parameter import Parameter
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class URLPath(Parameter):
|
|
2
5
|
location = "url_path"
|
|
3
6
|
in_body = False
|
|
4
|
-
|
|
5
|
-
def __init__(self, definition, description="", required=False):
|
|
6
|
-
self.definition = definition
|
|
7
|
-
self.description = description
|
|
8
|
-
self.required = required
|
|
@@ -2,7 +2,7 @@ from .array import Array
|
|
|
2
2
|
from .base64 import Base64
|
|
3
3
|
from .boolean import Boolean
|
|
4
4
|
from .date import Date
|
|
5
|
-
from .datetime import
|
|
5
|
+
from .datetime import Datetime
|
|
6
6
|
from .double import Double
|
|
7
7
|
from .enum import Enum
|
|
8
8
|
from .integer import Integer
|
|
@@ -10,6 +10,7 @@ from .long import Long
|
|
|
10
10
|
from .number import Number
|
|
11
11
|
from .object import Object
|
|
12
12
|
from .password import Password
|
|
13
|
+
from .schema import Schema
|
|
13
14
|
from .string import String
|
|
14
15
|
|
|
15
16
|
__all__ = [
|
|
@@ -17,7 +18,7 @@ __all__ = [
|
|
|
17
18
|
"Base64",
|
|
18
19
|
"Boolean",
|
|
19
20
|
"Date",
|
|
20
|
-
"
|
|
21
|
+
"Datetime",
|
|
21
22
|
"Double",
|
|
22
23
|
"Enum",
|
|
23
24
|
"Integer",
|
|
@@ -25,5 +26,6 @@ __all__ = [
|
|
|
25
26
|
"Number",
|
|
26
27
|
"Object",
|
|
27
28
|
"Password",
|
|
29
|
+
"Schema",
|
|
28
30
|
"String",
|
|
29
31
|
]
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
from .schema import Schema
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class Array(Schema):
|
|
4
5
|
item_definition = None
|
|
5
6
|
_type = "array"
|
|
6
|
-
_format = ""
|
|
7
7
|
|
|
8
8
|
def __init__(self, name, item_definition, value=None):
|
|
9
|
-
|
|
10
|
-
self.value = value
|
|
9
|
+
super().__init__(name, example=None, value=value)
|
|
11
10
|
self.item_definition = item_definition
|
|
@@ -1,11 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
example = None
|
|
4
|
-
value = None
|
|
5
|
-
_type = "boolean"
|
|
6
|
-
_format = ""
|
|
1
|
+
from .schema import Schema
|
|
2
|
+
|
|
7
3
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
self.example = example
|
|
11
|
-
self.value = value
|
|
4
|
+
class Boolean(Schema):
|
|
5
|
+
_type = "boolean"
|
|
@@ -1,11 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
from .schema import Schema
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class Integer(Schema):
|
|
5
5
|
_type = "integer"
|
|
6
6
|
_format = "int32"
|
|
7
|
-
|
|
8
|
-
def __init__(self, name, example=None, value=None):
|
|
9
|
-
self.name = name
|
|
10
|
-
self.example = example
|
|
11
|
-
self.value = value
|
|
@@ -1,11 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
from .schema import Schema
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class Number(Schema):
|
|
5
5
|
_type = "number"
|
|
6
6
|
_format = "float"
|
|
7
|
-
|
|
8
|
-
def __init__(self, name, example=None, value=None):
|
|
9
|
-
self.name = name
|
|
10
|
-
self.example = example
|
|
11
|
-
self.value = value
|
|
@@ -1,15 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
from .schema import Schema
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class Object(Schema):
|
|
3
5
|
children = None
|
|
4
|
-
value = None
|
|
5
|
-
example = None
|
|
6
6
|
model_name = None
|
|
7
7
|
_type = "object"
|
|
8
8
|
_format = ""
|
|
9
9
|
|
|
10
10
|
def __init__(self, name, children, value=None, example=None, model_name=None):
|
|
11
|
-
|
|
11
|
+
super().__init__(name, example=example, value=value)
|
|
12
12
|
self.children = children
|
|
13
|
-
self.value = value
|
|
14
|
-
self.example = example
|
|
15
13
|
self.model_name = model_name
|
|
@@ -1,11 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
name = None
|
|
3
|
-
example = None
|
|
4
|
-
value = None
|
|
5
|
-
_type = "string"
|
|
6
|
-
_format = ""
|
|
1
|
+
from .schema import Schema
|
|
7
2
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
self.value = value
|
|
3
|
+
|
|
4
|
+
class String(Schema):
|
|
5
|
+
pass
|
clearskies/backends/__init__.py
CHANGED
|
@@ -1,26 +1,65 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
from .cursor_backend import CursorBackend
|
|
4
|
-
from .example_backend import ExampleBackend
|
|
5
|
-
from .file_backend import FileBackend
|
|
6
|
-
from .json_backend import JsonBackend
|
|
7
|
-
from .memory_backend import MemoryBackend
|
|
8
|
-
from .restful_api_advanced_search_backend import RestfulApiAdvancedSearchBackend
|
|
9
|
-
from .secrets_backend import SecretsBackend
|
|
1
|
+
"""
|
|
2
|
+
The backend system provides a layer of abstraction between a clearskies model and the place where it stores its data.
|
|
10
3
|
|
|
4
|
+
## Motivation
|
|
11
5
|
|
|
12
|
-
|
|
13
|
-
|
|
6
|
+
The goal of the backend system is to create a standard way to interact with external systems, whether those are
|
|
7
|
+
databases, APIs, cloud resources, etc... For comparison, models in other frameworks typically interact exclusively
|
|
8
|
+
with SQL databases. Therefore, building integrations with other data stores or 3rd party systems requires the
|
|
9
|
+
creation of bespoke SDKs, which results in time spent integrating and learning how to use them. Clearskies models
|
|
10
|
+
work with different backends to normalize the process of integrating with data stores and external systems.
|
|
11
|
+
This ability to switch backends turns the models, in essence, into a standardized SDK. The details of how to
|
|
12
|
+
interact with some other system are abstracted away into the backend, and then developers can interact with the
|
|
13
|
+
system using models in the standard way.
|
|
14
|
+
|
|
15
|
+
Of course, no abstraction layer is perfect, and not all datastores can fit into the backend system provided by
|
|
16
|
+
clearskies. That's okay! Like every abstraction layer in clearskies, you should use it when it works for
|
|
17
|
+
you and forget about it otherwise. So, for instance, it is not possible to build arbitrarily complex SQL
|
|
18
|
+
queries with the query system provided by models, but you can always inject the cursor and use it directly.
|
|
19
|
+
If some arbitrary data store just works in a completely different way, such that the backend system doesn't
|
|
20
|
+
work for it, it's still fine to build an SDK the "old school" way and use it in a clearskies application.
|
|
21
|
+
|
|
22
|
+
## Backends
|
|
23
|
+
|
|
24
|
+
There are four primary kinds of backends built into clearskies, with a few sub-types. Those are:
|
|
25
|
+
|
|
26
|
+
1. CursorBackend: Store data in an SQL-like database
|
|
27
|
+
2. MemoryBackend: Store data in-memory
|
|
28
|
+
3. ApiBackend: Use an API to fetch and store data
|
|
29
|
+
1. ApiGetOnlyBackend: Only supports fetching individual records from the API by id.
|
|
30
|
+
2. RestfulApiAdvancedSearchBackend: Automatically integrates with APIs built using clearskies.endpoints.RestfulApi
|
|
31
|
+
4. SecretsBackend - Store data directly in a secrets manager
|
|
32
|
+
|
|
33
|
+
See the documentation for each backend to understand how to configure and use it. In all cases though, you specify
|
|
34
|
+
the backend by instantiating the backend and attaching it to the model class via the `backend` attribute:
|
|
35
|
+
|
|
36
|
+
```python
|
|
37
|
+
import clearskies
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class MyModel(clearskies.model):
|
|
41
|
+
backend = clearskies.backends.MemoryBackend()
|
|
42
|
+
```
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
# from .api_backend import ApiBackend
|
|
46
|
+
# from .api_get_only_backend import ApiGetOnlyBackend
|
|
47
|
+
from clearskies.backends.api_backend import ApiBackend
|
|
48
|
+
from clearskies.backends.backend import Backend
|
|
49
|
+
from clearskies.backends.cursor_backend import CursorBackend
|
|
50
|
+
from clearskies.backends.memory_backend import MemoryBackend
|
|
51
|
+
|
|
52
|
+
# from .memory_backend import MemoryBackend
|
|
53
|
+
# from .restful_api_advanced_search_backend import RestfulApiAdvancedSearchBackend
|
|
54
|
+
# from .secrets_backend import SecretsBackend
|
|
14
55
|
|
|
15
56
|
|
|
16
57
|
__all__ = [
|
|
17
58
|
"ApiBackend",
|
|
59
|
+
# "ApiGetOnlyBackend",
|
|
60
|
+
"Backend",
|
|
18
61
|
"CursorBackend",
|
|
19
|
-
"ExampleBackend",
|
|
20
|
-
"example_backend",
|
|
21
|
-
"FileBackend",
|
|
22
|
-
"JsonBackend",
|
|
23
62
|
"MemoryBackend",
|
|
24
|
-
"RestfulApiAdvancedSearchBackend",
|
|
25
|
-
"SecretsBackend",
|
|
63
|
+
# "RestfulApiAdvancedSearchBackend",
|
|
64
|
+
# "SecretsBackend",
|
|
26
65
|
]
|