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/decorators/docs.py
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
from .merge import merge
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
def docs(doc_description=None, doc_model_name=None, doc_response_data_schema=None):
|
|
5
|
-
def wrap_in_application(function):
|
|
6
|
-
return merge(
|
|
7
|
-
function,
|
|
8
|
-
doc_description=doc_description,
|
|
9
|
-
doc_model_name=doc_model_name,
|
|
10
|
-
doc_response_data_schema=doc_response_data_schema,
|
|
11
|
-
)
|
|
12
|
-
|
|
13
|
-
wrap_in_application.is_wrapped_application = True
|
|
14
|
-
return wrap_in_application
|
clearskies/decorators/get.py
DELETED
clearskies/decorators/jwks.py
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
from .merge import merge
|
|
2
|
-
from typing import List, Optional
|
|
3
|
-
from ..authentication import jwks as jwks_binding
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
def jwks(
|
|
7
|
-
jwks_url: str,
|
|
8
|
-
audience: Optional[str] = None,
|
|
9
|
-
issuer: Optional[str] = None,
|
|
10
|
-
algorithms: Optional[List[str]] = None,
|
|
11
|
-
documentation_security_name: Optional[str] = None,
|
|
12
|
-
jwks_cache_time: Optional[int] = None,
|
|
13
|
-
):
|
|
14
|
-
def wrap_in_application(function):
|
|
15
|
-
auth0 = jwks_binding(
|
|
16
|
-
jwks_url=jwks_url,
|
|
17
|
-
audience=audience,
|
|
18
|
-
issuer=issuer,
|
|
19
|
-
algorithms=algorithms,
|
|
20
|
-
documentation_security_name=documentation_security_name,
|
|
21
|
-
jwks_cache_time=jwks_cache_time,
|
|
22
|
-
)
|
|
23
|
-
return merge(function, authentication=auth0)
|
|
24
|
-
|
|
25
|
-
wrap_in_application.is_wrapped_application = True
|
|
26
|
-
return wrap_in_application
|
clearskies/decorators/merge.py
DELETED
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
from ..application import Application
|
|
2
|
-
from ..handlers import callable as callable_handler
|
|
3
|
-
from ..handlers import simple_routing
|
|
4
|
-
from typing import Any, Dict, Set
|
|
5
|
-
|
|
6
|
-
routing_kwargs = ["path", "methods"]
|
|
7
|
-
binding_kwargs = ["bindings", "binding_classes", "binding_modules"]
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
def merge(function: callable, **kwargs: Dict[str, Any]) -> Application:
|
|
11
|
-
is_wrapped_application = getattr(function, "is_wrapped_application", False)
|
|
12
|
-
binding_configs = extract_binding_configs(kwargs)
|
|
13
|
-
callable_configs = extract_callable_configs(kwargs)
|
|
14
|
-
routing_configs = extract_routing_configs(kwargs)
|
|
15
|
-
|
|
16
|
-
# if ths is the first decorator added then we need to wrap it in an application
|
|
17
|
-
if not is_wrapped_application and type(function) != Application:
|
|
18
|
-
application = Application(
|
|
19
|
-
callable_handler.Callable,
|
|
20
|
-
{**callable_configs, "callable": function},
|
|
21
|
-
**binding_configs,
|
|
22
|
-
)
|
|
23
|
-
# and if we have a route then we also want to wrap it in a router. Note that
|
|
24
|
-
# there is a possible future issue in here and things will break if path
|
|
25
|
-
# and methods are not specified at the same time.
|
|
26
|
-
if "path" in kwargs:
|
|
27
|
-
application = Application(
|
|
28
|
-
simple_routing.SimpleRouting,
|
|
29
|
-
{
|
|
30
|
-
"routes": [
|
|
31
|
-
{
|
|
32
|
-
**routing_configs,
|
|
33
|
-
"handler_class": application.handler_class,
|
|
34
|
-
"handler_config": application.handler_config,
|
|
35
|
-
},
|
|
36
|
-
],
|
|
37
|
-
},
|
|
38
|
-
**binding_configs,
|
|
39
|
-
)
|
|
40
|
-
# and then we are all done
|
|
41
|
-
return application
|
|
42
|
-
|
|
43
|
-
# if we got here then we have a wrapped application, which means that function will return an
|
|
44
|
-
# application when called... except when it doesn't which has to do with nested decorators and
|
|
45
|
-
# I'm too lazy to sort it out but the below works fine.
|
|
46
|
-
if is_wrapped_application:
|
|
47
|
-
application = function()
|
|
48
|
-
else:
|
|
49
|
-
application = function
|
|
50
|
-
authentication = application.handler_config.get("authentication")
|
|
51
|
-
|
|
52
|
-
# Next question: is there a path in our kwargs? If so then we are trying to add routing to
|
|
53
|
-
# the application.
|
|
54
|
-
if "path" in kwargs:
|
|
55
|
-
# before we add routing, make sure we're not double routing
|
|
56
|
-
if application.handler_class == simple_routing.SimpleRouting:
|
|
57
|
-
raise ValueError(
|
|
58
|
-
"Error applying decorators: it looks like more than one routing decorator was added to a function"
|
|
59
|
-
)
|
|
60
|
-
# Now then, wrap the application in a router. For the inner application,
|
|
61
|
-
# merge any configurations for the callable
|
|
62
|
-
for binding_name in binding_kwargs:
|
|
63
|
-
if not getattr(application, binding_name):
|
|
64
|
-
continue
|
|
65
|
-
from_application = getattr(application, binding_name)
|
|
66
|
-
from_configs = binding_configs.get(binding_name, {} if type(from_application) == dict else [])
|
|
67
|
-
if type(from_application) == dict:
|
|
68
|
-
binding_configs[binding_name] = {**from_application, **from_configs}
|
|
69
|
-
else:
|
|
70
|
-
binding_configs[binding_name] = [*from_application, *from_configs]
|
|
71
|
-
return Application(
|
|
72
|
-
simple_routing.SimpleRouting,
|
|
73
|
-
{
|
|
74
|
-
"authentication": authentication,
|
|
75
|
-
"routes": [
|
|
76
|
-
{
|
|
77
|
-
**routing_configs,
|
|
78
|
-
"handler_class": application.handler_class,
|
|
79
|
-
"handler_config": {
|
|
80
|
-
**application.handler_config,
|
|
81
|
-
**callable_configs,
|
|
82
|
-
},
|
|
83
|
-
},
|
|
84
|
-
],
|
|
85
|
-
},
|
|
86
|
-
**binding_configs,
|
|
87
|
-
)
|
|
88
|
-
|
|
89
|
-
# if we got here then we just need to merge in our callable configs. The only trick is
|
|
90
|
-
# whether or not we have an outer routing application.
|
|
91
|
-
if application.handler_class == simple_routing.SimpleRouting:
|
|
92
|
-
application.handler_config["routes"][0]["handler_config"] = {
|
|
93
|
-
**application.handler_config["routes"][0]["handler_config"],
|
|
94
|
-
**callable_configs,
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
else:
|
|
98
|
-
application.handler_config = {**application.handler_config, **callable_configs}
|
|
99
|
-
|
|
100
|
-
for binding_name in binding_kwargs:
|
|
101
|
-
if binding_configs.get(binding_name):
|
|
102
|
-
from_application = getattr(application, binding_name)
|
|
103
|
-
from_configs = binding_configs[binding_name]
|
|
104
|
-
if type(from_application) == dict:
|
|
105
|
-
setattr(application, binding_name, {**from_application, **from_configs})
|
|
106
|
-
else:
|
|
107
|
-
setattr(application, binding_name, [*from_application, *from_configs])
|
|
108
|
-
return application
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
def extract_callable_configs(kwargs: Dict[str, Any]) -> Dict[str, Any]:
|
|
112
|
-
"""Return the configuration settings from the kwargs which are valid for the callable handler."""
|
|
113
|
-
# all configs execpt 'path' and 'methods' go with the callable
|
|
114
|
-
return {key: kwargs[key] for key in kwargs.keys() if key not in routing_kwargs and key not in binding_kwargs}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
def extract_routing_configs(kwargs: Dict[str, Any]) -> Dict[str, Any]:
|
|
118
|
-
"""Return the configuration settings from the kwargs which are valid for the routing info."""
|
|
119
|
-
return {key: kwargs[key] for key in kwargs.keys() if key in routing_kwargs}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
def extract_binding_configs(kwargs: Dict[str, Any]) -> Dict[str, Any]:
|
|
123
|
-
"""Return the configuration settings from the kwargs which are valid for bindings."""
|
|
124
|
-
return {key: kwargs[key] for key in kwargs.keys() if key in binding_kwargs}
|
clearskies/decorators/patch.py
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
from .merge import merge
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
def patch(path, **kwargs):
|
|
5
|
-
def wrap_in_application(function):
|
|
6
|
-
kwargs["path"] = path
|
|
7
|
-
return merge(function, **{**kwargs, "methods": "PATCH"})
|
|
8
|
-
|
|
9
|
-
wrap_in_application.is_wrapped_application = True
|
|
10
|
-
return wrap_in_application
|
clearskies/decorators/post.py
DELETED
clearskies/decorators/public.py
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
from .merge import merge
|
|
2
|
-
from typing import List, Optional
|
|
3
|
-
from ..authentication import public as public_binding
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
def public():
|
|
7
|
-
def wrap_in_application(function):
|
|
8
|
-
return merge(function, authentication=public_binding())
|
|
9
|
-
|
|
10
|
-
wrap_in_application.is_wrapped_application = True
|
|
11
|
-
return wrap_in_application
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
from .merge import merge
|
|
2
|
-
from typing import Dict
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
def response_headers(response_headers: Dict[str, str]):
|
|
6
|
-
def wrap_in_application(function):
|
|
7
|
-
return merge(function, response_headers=response_headers)
|
|
8
|
-
|
|
9
|
-
wrap_in_application.is_wrapped_application = True
|
|
10
|
-
return wrap_in_application
|
clearskies/decorators/schema.py
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
from .merge import merge
|
|
2
|
-
from typing import Dict
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
def schema(schema, writeable_columns=None):
|
|
6
|
-
def wrap_in_application(function):
|
|
7
|
-
return merge(function, schema=schema, writeable_columns=writeable_columns)
|
|
8
|
-
|
|
9
|
-
wrap_in_application.is_wrapped_application = True
|
|
10
|
-
return wrap_in_application
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
from .merge import merge
|
|
2
|
-
from typing import List, Optional
|
|
3
|
-
from ..authentication import secret_bearer as secret_bearer_binding
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
def secret_bearer(
|
|
7
|
-
secret: str = None,
|
|
8
|
-
secret_key: str = None,
|
|
9
|
-
header_prefix: str = None,
|
|
10
|
-
environment_key: str = None,
|
|
11
|
-
documentation_security_name: str = None,
|
|
12
|
-
):
|
|
13
|
-
def wrap_in_application(function):
|
|
14
|
-
secret_bearer = secret_bearer_binding(
|
|
15
|
-
secret=secret,
|
|
16
|
-
environment_key=environment_key,
|
|
17
|
-
documentation_security_name=documentation_security_name,
|
|
18
|
-
header_prefix=header_prefix,
|
|
19
|
-
secret_key=secret_key,
|
|
20
|
-
)
|
|
21
|
-
return merge(function, authentication=secret_bearer)
|
|
22
|
-
|
|
23
|
-
wrap_in_application.is_wrapped_application = True
|
|
24
|
-
return wrap_in_application
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
from .merge import merge
|
|
2
|
-
from typing import List, Optional
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
def security_headers(*args):
|
|
6
|
-
def wrap_in_application(function):
|
|
7
|
-
return merge(function, security_headers=args)
|
|
8
|
-
|
|
9
|
-
wrap_in_application.is_wrapped_application = True
|
|
10
|
-
return wrap_in_application
|
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
from .di import DI
|
|
2
|
-
from ..columns import Columns
|
|
3
|
-
from ..environment import Environment
|
|
4
|
-
from ..backends import CursorBackend, JsonBackend, MemoryBackend, SecretsBackend
|
|
5
|
-
from .. import autodoc
|
|
6
|
-
import os
|
|
7
|
-
import uuid
|
|
8
|
-
import inspect
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class StandardDependencies(DI):
|
|
12
|
-
def provide_requests(self):
|
|
13
|
-
# by importing the requests library when requested, instead of in the top of the file,
|
|
14
|
-
# it is not necessary to install the requests library if it is never used.
|
|
15
|
-
import requests
|
|
16
|
-
from requests.adapters import HTTPAdapter
|
|
17
|
-
from requests.packages.urllib3.util.retry import Retry
|
|
18
|
-
|
|
19
|
-
use_allowed_methods = "allowed_methods" in inspect.getfullargspec(Retry.__init__).args
|
|
20
|
-
methods_key = "allowed_methods" if use_allowed_methods else "method_whitelist"
|
|
21
|
-
kwargs = {
|
|
22
|
-
"total": 3,
|
|
23
|
-
"status_forcelist": [429, 500, 502, 503, 504],
|
|
24
|
-
"backoff_factor": 1,
|
|
25
|
-
methods_key: ["GET", "POST", "DELETE", "OPTIONS", "PATCH"],
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
retry_strategy = Retry(**kwargs)
|
|
29
|
-
adapter = HTTPAdapter(max_retries=retry_strategy)
|
|
30
|
-
http = requests.Session()
|
|
31
|
-
http.mount("https://", adapter)
|
|
32
|
-
return http
|
|
33
|
-
|
|
34
|
-
def provide_sys(self):
|
|
35
|
-
import sys
|
|
36
|
-
|
|
37
|
-
return sys
|
|
38
|
-
|
|
39
|
-
def provide_columns(self):
|
|
40
|
-
return Columns(self)
|
|
41
|
-
|
|
42
|
-
def provide_secrets(self):
|
|
43
|
-
from ..secrets import secrets
|
|
44
|
-
|
|
45
|
-
return secrets.Secrets()
|
|
46
|
-
|
|
47
|
-
def provide_environment(self):
|
|
48
|
-
return Environment(os.getcwd() + "/.env", os.environ, {})
|
|
49
|
-
|
|
50
|
-
def provide_connection_no_autocommit(self, connection_details):
|
|
51
|
-
# I should probably just switch things so that autocommit is *off* by default
|
|
52
|
-
# and only have one of these, but for now I'm being lazy.
|
|
53
|
-
import pymysql
|
|
54
|
-
|
|
55
|
-
return pymysql.connect(
|
|
56
|
-
user=connection_details["username"],
|
|
57
|
-
password=connection_details["password"],
|
|
58
|
-
host=connection_details["host"],
|
|
59
|
-
database=connection_details["database"],
|
|
60
|
-
port=connection_details.get("port", 3306),
|
|
61
|
-
ssl_ca=connection_details.get("ssl_ca", None),
|
|
62
|
-
autocommit=False,
|
|
63
|
-
connect_timeout=2,
|
|
64
|
-
cursorclass=pymysql.cursors.DictCursor,
|
|
65
|
-
)
|
|
66
|
-
|
|
67
|
-
def provide_connection(self, connection_details):
|
|
68
|
-
import pymysql
|
|
69
|
-
|
|
70
|
-
return pymysql.connect(
|
|
71
|
-
user=connection_details["username"],
|
|
72
|
-
password=connection_details["password"],
|
|
73
|
-
host=connection_details["host"],
|
|
74
|
-
database=connection_details["database"],
|
|
75
|
-
port=connection_details.get("port", 3306),
|
|
76
|
-
ssl_ca=connection_details.get("ssl_ca", None),
|
|
77
|
-
autocommit=True,
|
|
78
|
-
connect_timeout=2,
|
|
79
|
-
cursorclass=pymysql.cursors.DictCursor,
|
|
80
|
-
)
|
|
81
|
-
|
|
82
|
-
def provide_connection_details(self, environment):
|
|
83
|
-
return {
|
|
84
|
-
"username": environment.get("db_username"),
|
|
85
|
-
"password": environment.get("db_password"),
|
|
86
|
-
"host": environment.get("db_host"),
|
|
87
|
-
"database": environment.get("db_database"),
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
def provide_cursor(self, connection):
|
|
91
|
-
return connection.cursor()
|
|
92
|
-
|
|
93
|
-
def provide_cursor_backend(self, cursor):
|
|
94
|
-
return CursorBackend(cursor)
|
|
95
|
-
|
|
96
|
-
def provide_memory_backend(self):
|
|
97
|
-
return MemoryBackend()
|
|
98
|
-
|
|
99
|
-
def provide_json_backend(self):
|
|
100
|
-
return JsonBackend()
|
|
101
|
-
|
|
102
|
-
def provide_secrets_backend(self, secrets):
|
|
103
|
-
return SecretsBackend(secrets)
|
|
104
|
-
|
|
105
|
-
def provide_logging(self):
|
|
106
|
-
import logging
|
|
107
|
-
|
|
108
|
-
return logging
|
|
109
|
-
|
|
110
|
-
def provide_now(self):
|
|
111
|
-
import datetime
|
|
112
|
-
|
|
113
|
-
return datetime.datetime.now()
|
|
114
|
-
|
|
115
|
-
def provide_datetime(self):
|
|
116
|
-
import datetime
|
|
117
|
-
|
|
118
|
-
return datetime
|
|
119
|
-
|
|
120
|
-
def provide_utcnow(self):
|
|
121
|
-
import datetime
|
|
122
|
-
|
|
123
|
-
return datetime.datetime.now(datetime.timezone.utc)
|
|
124
|
-
|
|
125
|
-
def provide_input_output(self):
|
|
126
|
-
raise AttributeError("The dependency injector requested an InputOutput but none has been configured")
|
|
127
|
-
|
|
128
|
-
def provide_authentication(self):
|
|
129
|
-
raise AttributeError("The dependency injector requested an Authenticaiton method but none has been configured")
|
|
130
|
-
|
|
131
|
-
def provide_jose_jwt(self):
|
|
132
|
-
from jose import jwt
|
|
133
|
-
|
|
134
|
-
return jwt
|
|
135
|
-
|
|
136
|
-
def provide_oai3_schema_resolver(self):
|
|
137
|
-
return autodoc.formats.oai3_json.OAI3SchemaResolver()
|
|
138
|
-
|
|
139
|
-
def provide_uuid(self):
|
|
140
|
-
return uuid
|
clearskies/handlers/__init__.py
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
from .advanced_search import AdvancedSearch
|
|
2
|
-
from .callable import Callable
|
|
3
|
-
from .create import Create
|
|
4
|
-
from .crud_by_method import CRUDByMethod
|
|
5
|
-
from .database_connector import DatabaseConnector
|
|
6
|
-
from .delete import Delete
|
|
7
|
-
from .get import Get
|
|
8
|
-
from .health_check import HealthCheck
|
|
9
|
-
from .list import List
|
|
10
|
-
from .mygrations import Mygrations
|
|
11
|
-
from .request_method_routing import RequestMethodRouting
|
|
12
|
-
from .restful_api import RestfulAPI
|
|
13
|
-
from .routing import Routing
|
|
14
|
-
from .update import Update
|
|
15
|
-
from .write import Write
|
|
16
|
-
from .schema_helper import SchemaHelper
|
|
17
|
-
from .simple_routing import SimpleRouting
|
|
18
|
-
from .simple_search import SimpleSearch
|
|
19
|
-
from . import exceptions
|
|
20
|
-
|
|
21
|
-
__all__ = [
|
|
22
|
-
"exceptions",
|
|
23
|
-
"AdvancedSearch",
|
|
24
|
-
"Callable",
|
|
25
|
-
"Create",
|
|
26
|
-
"CRUDByMethod",
|
|
27
|
-
"DatabaseConnector",
|
|
28
|
-
"Delete",
|
|
29
|
-
"Get",
|
|
30
|
-
"HealthCheck",
|
|
31
|
-
"List",
|
|
32
|
-
"Mygrations",
|
|
33
|
-
"RequestMethodRouting",
|
|
34
|
-
"RestfulAPI",
|
|
35
|
-
"Routing",
|
|
36
|
-
"Update",
|
|
37
|
-
"Write",
|
|
38
|
-
"SchemaHelper",
|
|
39
|
-
"SimpleRouting",
|
|
40
|
-
"SimpleSearch",
|
|
41
|
-
]
|