clear-skies 1.22.31__tar.gz → 2.0.1__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 clear-skies might be problematic. Click here for more details.
- {clear_skies-1.22.31 → clear_skies-2.0.1}/PKG-INFO +12 -14
- {clear_skies-1.22.31 → clear_skies-2.0.1}/README.md +2 -2
- clear_skies-2.0.1/pyproject.toml +77 -0
- clear_skies-2.0.1/src/clearskies/__init__.py +62 -0
- clear_skies-2.0.1/src/clearskies/action.py +7 -0
- clear_skies-2.0.1/src/clearskies/authentication/__init__.py +15 -0
- clear_skies-2.0.1/src/clearskies/authentication/authentication.py +46 -0
- clear_skies-2.0.1/src/clearskies/authentication/authorization.py +16 -0
- clear_skies-2.0.1/src/clearskies/authentication/authorization_pass_through.py +20 -0
- clear_skies-2.0.1/src/clearskies/authentication/jwks.py +163 -0
- clear_skies-2.0.1/src/clearskies/authentication/public.py +5 -0
- clear_skies-2.0.1/src/clearskies/authentication/secret_bearer.py +553 -0
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/autodoc/formats/oai3_json/oai3_json.py +9 -7
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/autodoc/formats/oai3_json/parameter.py +6 -3
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/autodoc/formats/oai3_json/request.py +7 -5
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/autodoc/formats/oai3_json/response.py +7 -4
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/autodoc/formats/oai3_json/schema/object.py +4 -1
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/autodoc/request/__init__.py +2 -0
- clear_skies-2.0.1/src/clearskies/autodoc/request/header.py +6 -0
- clear_skies-2.0.1/src/clearskies/autodoc/request/json_body.py +6 -0
- clear_skies-1.22.31/src/clearskies/autodoc/request/header.py → clear_skies-2.0.1/src/clearskies/autodoc/request/parameter.py +2 -2
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/autodoc/request/request.py +7 -4
- clear_skies-2.0.1/src/clearskies/autodoc/request/url_parameter.py +6 -0
- clear_skies-2.0.1/src/clearskies/autodoc/request/url_path.py +6 -0
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/autodoc/schema/__init__.py +4 -2
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/autodoc/schema/array.py +5 -6
- clear_skies-2.0.1/src/clearskies/autodoc/schema/boolean.py +5 -0
- clear_skies-2.0.1/src/clearskies/autodoc/schema/date.py +5 -0
- clear_skies-2.0.1/src/clearskies/autodoc/schema/datetime.py +5 -0
- clear_skies-2.0.1/src/clearskies/autodoc/schema/double.py +5 -0
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/autodoc/schema/enum.py +4 -2
- clear_skies-2.0.1/src/clearskies/autodoc/schema/integer.py +6 -0
- clear_skies-2.0.1/src/clearskies/autodoc/schema/long.py +5 -0
- clear_skies-2.0.1/src/clearskies/autodoc/schema/number.py +6 -0
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/autodoc/schema/object.py +5 -7
- clear_skies-2.0.1/src/clearskies/autodoc/schema/password.py +5 -0
- clear_skies-1.22.31/src/clearskies/autodoc/schema/string.py → clear_skies-2.0.1/src/clearskies/autodoc/schema/schema.py +1 -1
- clear_skies-2.0.1/src/clearskies/autodoc/schema/string.py +5 -0
- clear_skies-2.0.1/src/clearskies/backends/__init__.py +65 -0
- clear_skies-2.0.1/src/clearskies/backends/api_backend.py +1178 -0
- clear_skies-2.0.1/src/clearskies/backends/backend.py +136 -0
- clear_skies-2.0.1/src/clearskies/backends/cursor_backend.py +335 -0
- clear_skies-2.0.1/src/clearskies/backends/memory_backend.py +797 -0
- clear_skies-2.0.1/src/clearskies/backends/secrets_backend.py +107 -0
- clear_skies-2.0.1/src/clearskies/column.py +1229 -0
- clear_skies-2.0.1/src/clearskies/columns/__init__.py +71 -0
- clear_skies-2.0.1/src/clearskies/columns/audit.py +205 -0
- clear_skies-2.0.1/src/clearskies/columns/belongs_to_id.py +483 -0
- clear_skies-2.0.1/src/clearskies/columns/belongs_to_model.py +128 -0
- clear_skies-2.0.1/src/clearskies/columns/belongs_to_self.py +105 -0
- clear_skies-2.0.1/src/clearskies/columns/boolean.py +109 -0
- clear_skies-2.0.1/src/clearskies/columns/category_tree.py +275 -0
- clear_skies-2.0.1/src/clearskies/columns/category_tree_ancestors.py +51 -0
- clear_skies-2.0.1/src/clearskies/columns/category_tree_children.py +127 -0
- clear_skies-2.0.1/src/clearskies/columns/category_tree_descendants.py +48 -0
- clear_skies-2.0.1/src/clearskies/columns/created.py +94 -0
- clear_skies-2.0.1/src/clearskies/columns/created_by_authorization_data.py +116 -0
- clear_skies-2.0.1/src/clearskies/columns/created_by_header.py +99 -0
- clear_skies-2.0.1/src/clearskies/columns/created_by_ip.py +92 -0
- clear_skies-2.0.1/src/clearskies/columns/created_by_routing_data.py +96 -0
- clear_skies-2.0.1/src/clearskies/columns/created_by_user_agent.py +92 -0
- clear_skies-2.0.1/src/clearskies/columns/date.py +230 -0
- clear_skies-2.0.1/src/clearskies/columns/datetime.py +278 -0
- clear_skies-2.0.1/src/clearskies/columns/email.py +76 -0
- clear_skies-2.0.1/src/clearskies/columns/float.py +149 -0
- clear_skies-2.0.1/src/clearskies/columns/has_many.py +505 -0
- clear_skies-2.0.1/src/clearskies/columns/has_many_self.py +56 -0
- clear_skies-2.0.1/src/clearskies/columns/has_one.py +14 -0
- clear_skies-2.0.1/src/clearskies/columns/integer.py +156 -0
- clear_skies-2.0.1/src/clearskies/columns/json.py +122 -0
- clear_skies-2.0.1/src/clearskies/columns/many_to_many_ids.py +333 -0
- clear_skies-2.0.1/src/clearskies/columns/many_to_many_ids_with_data.py +270 -0
- clear_skies-2.0.1/src/clearskies/columns/many_to_many_models.py +154 -0
- clear_skies-2.0.1/src/clearskies/columns/many_to_many_pivots.py +133 -0
- clear_skies-2.0.1/src/clearskies/columns/phone.py +158 -0
- clear_skies-2.0.1/src/clearskies/columns/select.py +91 -0
- clear_skies-2.0.1/src/clearskies/columns/string.py +98 -0
- clear_skies-2.0.1/src/clearskies/columns/timestamp.py +160 -0
- clear_skies-2.0.1/src/clearskies/columns/updated.py +110 -0
- clear_skies-2.0.1/src/clearskies/columns/uuid.py +86 -0
- clear_skies-2.0.1/src/clearskies/configs/README.md +105 -0
- clear_skies-2.0.1/src/clearskies/configs/__init__.py +162 -0
- clear_skies-2.0.1/src/clearskies/configs/actions.py +43 -0
- clear_skies-2.0.1/src/clearskies/configs/any.py +13 -0
- clear_skies-2.0.1/src/clearskies/configs/any_dict.py +22 -0
- clear_skies-2.0.1/src/clearskies/configs/any_dict_or_callable.py +23 -0
- clear_skies-2.0.1/src/clearskies/configs/authentication.py +23 -0
- clear_skies-2.0.1/src/clearskies/configs/authorization.py +23 -0
- clear_skies-2.0.1/src/clearskies/configs/boolean.py +16 -0
- clear_skies-2.0.1/src/clearskies/configs/boolean_or_callable.py +18 -0
- clear_skies-2.0.1/src/clearskies/configs/callable_config.py +18 -0
- clear_skies-2.0.1/src/clearskies/configs/columns.py +34 -0
- clear_skies-2.0.1/src/clearskies/configs/conditions.py +30 -0
- clear_skies-2.0.1/src/clearskies/configs/config.py +24 -0
- clear_skies-2.0.1/src/clearskies/configs/datetime.py +18 -0
- clear_skies-2.0.1/src/clearskies/configs/datetime_or_callable.py +19 -0
- clear_skies-2.0.1/src/clearskies/configs/endpoint.py +23 -0
- clear_skies-2.0.1/src/clearskies/configs/endpoint_list.py +28 -0
- clear_skies-2.0.1/src/clearskies/configs/float.py +16 -0
- clear_skies-2.0.1/src/clearskies/configs/float_or_callable.py +18 -0
- clear_skies-2.0.1/src/clearskies/configs/integer.py +16 -0
- clear_skies-2.0.1/src/clearskies/configs/integer_or_callable.py +18 -0
- clear_skies-2.0.1/src/clearskies/configs/joins.py +30 -0
- clear_skies-2.0.1/src/clearskies/configs/list_any_dict.py +30 -0
- clear_skies-2.0.1/src/clearskies/configs/list_any_dict_or_callable.py +31 -0
- clear_skies-2.0.1/src/clearskies/configs/model_class.py +35 -0
- clear_skies-2.0.1/src/clearskies/configs/model_column.py +65 -0
- clear_skies-2.0.1/src/clearskies/configs/model_columns.py +56 -0
- clear_skies-2.0.1/src/clearskies/configs/model_destination_name.py +25 -0
- clear_skies-2.0.1/src/clearskies/configs/model_to_id_column.py +43 -0
- clear_skies-2.0.1/src/clearskies/configs/readable_model_column.py +9 -0
- clear_skies-2.0.1/src/clearskies/configs/readable_model_columns.py +9 -0
- clear_skies-2.0.1/src/clearskies/configs/schema.py +23 -0
- clear_skies-2.0.1/src/clearskies/configs/searchable_model_columns.py +9 -0
- clear_skies-2.0.1/src/clearskies/configs/security_headers.py +39 -0
- clear_skies-2.0.1/src/clearskies/configs/select.py +26 -0
- clear_skies-2.0.1/src/clearskies/configs/select_list.py +47 -0
- clear_skies-2.0.1/src/clearskies/configs/string.py +29 -0
- clear_skies-2.0.1/src/clearskies/configs/string_dict.py +32 -0
- clear_skies-2.0.1/src/clearskies/configs/string_list.py +32 -0
- clear_skies-2.0.1/src/clearskies/configs/string_list_or_callable.py +35 -0
- clear_skies-2.0.1/src/clearskies/configs/string_or_callable.py +18 -0
- clear_skies-2.0.1/src/clearskies/configs/timedelta.py +18 -0
- clear_skies-2.0.1/src/clearskies/configs/timezone.py +18 -0
- clear_skies-2.0.1/src/clearskies/configs/url.py +23 -0
- clear_skies-2.0.1/src/clearskies/configs/validators.py +45 -0
- clear_skies-2.0.1/src/clearskies/configs/writeable_model_column.py +9 -0
- clear_skies-2.0.1/src/clearskies/configs/writeable_model_columns.py +9 -0
- clear_skies-2.0.1/src/clearskies/configurable.py +76 -0
- clear_skies-2.0.1/src/clearskies/contexts/__init__.py +11 -0
- clear_skies-2.0.1/src/clearskies/contexts/cli.py +11 -0
- clear_skies-2.0.1/src/clearskies/contexts/context.py +97 -0
- clear_skies-2.0.1/src/clearskies/contexts/wsgi.py +20 -0
- clear_skies-2.0.1/src/clearskies/contexts/wsgi_ref.py +53 -0
- clear_skies-2.0.1/src/clearskies/di/__init__.py +14 -0
- clear_skies-2.0.1/src/clearskies/di/additional_config.py +130 -0
- clear_skies-2.0.1/src/clearskies/di/additional_config_auto_import.py +17 -0
- clear_skies-2.0.1/src/clearskies/di/di.py +968 -0
- clear_skies-2.0.1/src/clearskies/di/inject/__init__.py +23 -0
- clear_skies-2.0.1/src/clearskies/di/inject/by_class.py +21 -0
- clear_skies-2.0.1/src/clearskies/di/inject/by_name.py +18 -0
- clear_skies-2.0.1/src/clearskies/di/inject/di.py +13 -0
- clear_skies-2.0.1/src/clearskies/di/inject/environment.py +14 -0
- clear_skies-2.0.1/src/clearskies/di/inject/input_output.py +20 -0
- clear_skies-2.0.1/src/clearskies/di/inject/now.py +13 -0
- clear_skies-2.0.1/src/clearskies/di/inject/requests.py +13 -0
- clear_skies-2.0.1/src/clearskies/di/inject/secrets.py +14 -0
- clear_skies-2.0.1/src/clearskies/di/inject/utcnow.py +13 -0
- clear_skies-2.0.1/src/clearskies/di/inject/uuid.py +15 -0
- clear_skies-2.0.1/src/clearskies/di/injectable.py +29 -0
- clear_skies-2.0.1/src/clearskies/di/injectable_properties.py +131 -0
- clear_skies-2.0.1/src/clearskies/end.py +183 -0
- clear_skies-2.0.1/src/clearskies/endpoint.py +1310 -0
- clear_skies-2.0.1/src/clearskies/endpoint_group.py +310 -0
- clear_skies-2.0.1/src/clearskies/endpoints/__init__.py +23 -0
- clear_skies-2.0.1/src/clearskies/endpoints/advanced_search.py +526 -0
- clear_skies-2.0.1/src/clearskies/endpoints/callable.py +388 -0
- clear_skies-2.0.1/src/clearskies/endpoints/create.py +202 -0
- clear_skies-2.0.1/src/clearskies/endpoints/delete.py +139 -0
- clear_skies-2.0.1/src/clearskies/endpoints/get.py +275 -0
- clear_skies-2.0.1/src/clearskies/endpoints/health_check.py +181 -0
- clear_skies-2.0.1/src/clearskies/endpoints/list.py +573 -0
- clear_skies-2.0.1/src/clearskies/endpoints/restful_api.py +427 -0
- clear_skies-2.0.1/src/clearskies/endpoints/simple_search.py +286 -0
- clear_skies-2.0.1/src/clearskies/endpoints/update.py +190 -0
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/environment.py +5 -3
- clear_skies-2.0.1/src/clearskies/exceptions/__init__.py +17 -0
- clear_skies-1.22.31/src/clearskies/handlers/exceptions/input_error.py → clear_skies-2.0.1/src/clearskies/exceptions/input_errors.py +1 -1
- clear_skies-2.0.1/src/clearskies/exceptions/moved_permanently.py +3 -0
- clear_skies-2.0.1/src/clearskies/exceptions/moved_temporarily.py +3 -0
- clear_skies-2.0.1/src/clearskies/functional/__init__.py +7 -0
- clear_skies-2.0.1/src/clearskies/functional/routing.py +92 -0
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/functional/string.py +19 -11
- clear_skies-2.0.1/src/clearskies/functional/validations.py +76 -0
- clear_skies-2.0.1/src/clearskies/input_outputs/__init__.py +13 -0
- clear_skies-2.0.1/src/clearskies/input_outputs/cli.py +170 -0
- clear_skies-2.0.1/src/clearskies/input_outputs/headers.py +45 -0
- clear_skies-2.0.1/src/clearskies/input_outputs/input_output.py +138 -0
- clear_skies-2.0.1/src/clearskies/input_outputs/programmatic.py +69 -0
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/input_outputs/wsgi.py +23 -38
- clear_skies-2.0.1/src/clearskies/model.py +1158 -0
- clear_skies-2.0.1/src/clearskies/parameters_to_properties.py +31 -0
- clear_skies-2.0.1/src/clearskies/query/__init__.py +12 -0
- clear_skies-2.0.1/src/clearskies/query/condition.py +223 -0
- clear_skies-2.0.1/src/clearskies/query/join.py +136 -0
- clear_skies-2.0.1/src/clearskies/query/query.py +196 -0
- clear_skies-2.0.1/src/clearskies/query/sort.py +27 -0
- clear_skies-2.0.1/src/clearskies/schema.py +82 -0
- clear_skies-2.0.1/src/clearskies/secrets/__init__.py +6 -0
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/secrets/additional_configs/mysql_connection_dynamic_producer.py +15 -4
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/secrets/additional_configs/mysql_connection_dynamic_producer_via_ssh_cert_bastion.py +11 -5
- clear_skies-2.0.1/src/clearskies/secrets/akeyless.py +182 -0
- clear_skies-2.0.1/src/clearskies/secrets/exceptions/not_found.py +2 -0
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/secrets/secrets.py +8 -8
- clear_skies-2.0.1/src/clearskies/security_header.py +15 -0
- clear_skies-2.0.1/src/clearskies/security_headers/__init__.py +11 -0
- clear_skies-2.0.1/src/clearskies/security_headers/cache_control.py +67 -0
- clear_skies-2.0.1/src/clearskies/security_headers/cors.py +50 -0
- clear_skies-2.0.1/src/clearskies/security_headers/csp.py +94 -0
- clear_skies-2.0.1/src/clearskies/security_headers/hsts.py +22 -0
- clear_skies-2.0.1/src/clearskies/test_base.py +8 -0
- clear_skies-2.0.1/src/clearskies/typing.py +11 -0
- clear_skies-2.0.1/src/clearskies/validator.py +37 -0
- clear_skies-2.0.1/src/clearskies/validators/__init__.py +33 -0
- clear_skies-2.0.1/src/clearskies/validators/after_column.py +62 -0
- clear_skies-2.0.1/src/clearskies/validators/before_column.py +13 -0
- clear_skies-2.0.1/src/clearskies/validators/in_the_future.py +32 -0
- clear_skies-2.0.1/src/clearskies/validators/in_the_future_at_least.py +11 -0
- clear_skies-2.0.1/src/clearskies/validators/in_the_future_at_most.py +10 -0
- clear_skies-2.0.1/src/clearskies/validators/in_the_past.py +32 -0
- clear_skies-2.0.1/src/clearskies/validators/in_the_past_at_least.py +10 -0
- clear_skies-2.0.1/src/clearskies/validators/in_the_past_at_most.py +10 -0
- clear_skies-2.0.1/src/clearskies/validators/maximum_length.py +26 -0
- clear_skies-2.0.1/src/clearskies/validators/maximum_value.py +29 -0
- clear_skies-2.0.1/src/clearskies/validators/minimum_length.py +26 -0
- clear_skies-2.0.1/src/clearskies/validators/minimum_value.py +29 -0
- clear_skies-2.0.1/src/clearskies/validators/required.py +35 -0
- clear_skies-2.0.1/src/clearskies/validators/timedelta.py +59 -0
- clear_skies-2.0.1/src/clearskies/validators/unique.py +31 -0
- clear_skies-1.22.31/pyproject.toml +0 -59
- clear_skies-1.22.31/src/clearskies/__init__.py +0 -45
- clear_skies-1.22.31/src/clearskies/application.py +0 -29
- clear_skies-1.22.31/src/clearskies/authentication/__init__.py +0 -48
- clear_skies-1.22.31/src/clearskies/authentication/auth0_jwks.py +0 -118
- clear_skies-1.22.31/src/clearskies/authentication/auth_exception.py +0 -2
- clear_skies-1.22.31/src/clearskies/authentication/authorization.py +0 -17
- clear_skies-1.22.31/src/clearskies/authentication/authorization_pass_through.py +0 -18
- clear_skies-1.22.31/src/clearskies/authentication/jwks.py +0 -88
- clear_skies-1.22.31/src/clearskies/authentication/jwks_jwcrypto.py +0 -51
- clear_skies-1.22.31/src/clearskies/authentication/public.py +0 -40
- clear_skies-1.22.31/src/clearskies/authentication/secret_bearer.py +0 -91
- clear_skies-1.22.31/src/clearskies/autodoc/request/json_body.py +0 -8
- clear_skies-1.22.31/src/clearskies/autodoc/request/url_parameter.py +0 -8
- clear_skies-1.22.31/src/clearskies/autodoc/request/url_path.py +0 -8
- clear_skies-1.22.31/src/clearskies/autodoc/schema/boolean.py +0 -11
- clear_skies-1.22.31/src/clearskies/autodoc/schema/date.py +0 -8
- clear_skies-1.22.31/src/clearskies/autodoc/schema/datetime.py +0 -8
- clear_skies-1.22.31/src/clearskies/autodoc/schema/double.py +0 -8
- clear_skies-1.22.31/src/clearskies/autodoc/schema/integer.py +0 -11
- clear_skies-1.22.31/src/clearskies/autodoc/schema/long.py +0 -8
- clear_skies-1.22.31/src/clearskies/autodoc/schema/number.py +0 -11
- clear_skies-1.22.31/src/clearskies/autodoc/schema/password.py +0 -8
- clear_skies-1.22.31/src/clearskies/backends/__init__.py +0 -30
- clear_skies-1.22.31/src/clearskies/backends/api_backend.py +0 -362
- clear_skies-1.22.31/src/clearskies/backends/api_get_only_backend.py +0 -48
- clear_skies-1.22.31/src/clearskies/backends/backend.py +0 -167
- clear_skies-1.22.31/src/clearskies/backends/cursor_backend.py +0 -285
- clear_skies-1.22.31/src/clearskies/backends/example_backend.py +0 -43
- clear_skies-1.22.31/src/clearskies/backends/file_backend.py +0 -48
- clear_skies-1.22.31/src/clearskies/backends/json_backend.py +0 -7
- clear_skies-1.22.31/src/clearskies/backends/memory_backend.py +0 -504
- clear_skies-1.22.31/src/clearskies/backends/restful_api_advanced_search_backend.py +0 -103
- clear_skies-1.22.31/src/clearskies/backends/secrets_backend.py +0 -63
- clear_skies-1.22.31/src/clearskies/binding_config.py +0 -16
- clear_skies-1.22.31/src/clearskies/column_types/__init__.py +0 -203
- clear_skies-1.22.31/src/clearskies/column_types/audit.py +0 -249
- clear_skies-1.22.31/src/clearskies/column_types/belongs_to.py +0 -271
- clear_skies-1.22.31/src/clearskies/column_types/boolean.py +0 -60
- clear_skies-1.22.31/src/clearskies/column_types/category_tree.py +0 -304
- clear_skies-1.22.31/src/clearskies/column_types/column.py +0 -373
- clear_skies-1.22.31/src/clearskies/column_types/created.py +0 -26
- clear_skies-1.22.31/src/clearskies/column_types/created_by_authorization_data.py +0 -26
- clear_skies-1.22.31/src/clearskies/column_types/created_by_header.py +0 -24
- clear_skies-1.22.31/src/clearskies/column_types/created_by_ip.py +0 -17
- clear_skies-1.22.31/src/clearskies/column_types/created_by_routing_data.py +0 -25
- clear_skies-1.22.31/src/clearskies/column_types/created_by_user_agent.py +0 -17
- clear_skies-1.22.31/src/clearskies/column_types/created_micro.py +0 -26
- clear_skies-1.22.31/src/clearskies/column_types/datetime.py +0 -109
- clear_skies-1.22.31/src/clearskies/column_types/datetime_micro.py +0 -12
- clear_skies-1.22.31/src/clearskies/column_types/email.py +0 -18
- clear_skies-1.22.31/src/clearskies/column_types/float.py +0 -43
- clear_skies-1.22.31/src/clearskies/column_types/has_many.py +0 -179
- clear_skies-1.22.31/src/clearskies/column_types/has_one.py +0 -60
- clear_skies-1.22.31/src/clearskies/column_types/integer.py +0 -41
- clear_skies-1.22.31/src/clearskies/column_types/json.py +0 -25
- clear_skies-1.22.31/src/clearskies/column_types/many_to_many.py +0 -278
- clear_skies-1.22.31/src/clearskies/column_types/many_to_many_with_data.py +0 -162
- clear_skies-1.22.31/src/clearskies/column_types/phone.py +0 -48
- clear_skies-1.22.31/src/clearskies/column_types/select.py +0 -11
- clear_skies-1.22.31/src/clearskies/column_types/string.py +0 -24
- clear_skies-1.22.31/src/clearskies/column_types/timestamp.py +0 -73
- clear_skies-1.22.31/src/clearskies/column_types/updated.py +0 -26
- clear_skies-1.22.31/src/clearskies/column_types/updated_micro.py +0 -26
- clear_skies-1.22.31/src/clearskies/column_types/uuid.py +0 -25
- clear_skies-1.22.31/src/clearskies/columns.py +0 -123
- clear_skies-1.22.31/src/clearskies/condition_parser.py +0 -172
- clear_skies-1.22.31/src/clearskies/contexts/__init__.py +0 -11
- clear_skies-1.22.31/src/clearskies/contexts/build_context.py +0 -54
- clear_skies-1.22.31/src/clearskies/contexts/cli.py +0 -44
- clear_skies-1.22.31/src/clearskies/contexts/context.py +0 -62
- clear_skies-1.22.31/src/clearskies/contexts/convert_to_application.py +0 -190
- clear_skies-1.22.31/src/clearskies/contexts/extract_handler.py +0 -37
- clear_skies-1.22.31/src/clearskies/contexts/test.py +0 -94
- clear_skies-1.22.31/src/clearskies/contexts/wsgi.py +0 -33
- clear_skies-1.22.31/src/clearskies/decorators/__init__.py +0 -41
- clear_skies-1.22.31/src/clearskies/decorators/allow_non_json_bodies.py +0 -9
- clear_skies-1.22.31/src/clearskies/decorators/auth0_jwks.py +0 -22
- clear_skies-1.22.31/src/clearskies/decorators/authorization.py +0 -10
- clear_skies-1.22.31/src/clearskies/decorators/binding_classes.py +0 -9
- clear_skies-1.22.31/src/clearskies/decorators/binding_modules.py +0 -9
- clear_skies-1.22.31/src/clearskies/decorators/bindings.py +0 -9
- clear_skies-1.22.31/src/clearskies/decorators/create.py +0 -10
- clear_skies-1.22.31/src/clearskies/decorators/delete.py +0 -10
- clear_skies-1.22.31/src/clearskies/decorators/docs.py +0 -14
- clear_skies-1.22.31/src/clearskies/decorators/get.py +0 -10
- clear_skies-1.22.31/src/clearskies/decorators/jwks.py +0 -26
- clear_skies-1.22.31/src/clearskies/decorators/merge.py +0 -124
- clear_skies-1.22.31/src/clearskies/decorators/patch.py +0 -10
- clear_skies-1.22.31/src/clearskies/decorators/post.py +0 -10
- clear_skies-1.22.31/src/clearskies/decorators/public.py +0 -11
- clear_skies-1.22.31/src/clearskies/decorators/response_headers.py +0 -10
- clear_skies-1.22.31/src/clearskies/decorators/return_raw_response.py +0 -9
- clear_skies-1.22.31/src/clearskies/decorators/schema.py +0 -10
- clear_skies-1.22.31/src/clearskies/decorators/secret_bearer.py +0 -24
- clear_skies-1.22.31/src/clearskies/decorators/security_headers.py +0 -10
- clear_skies-1.22.31/src/clearskies/di/__init__.py +0 -11
- clear_skies-1.22.31/src/clearskies/di/additional_config.py +0 -19
- clear_skies-1.22.31/src/clearskies/di/additional_config_auto_import.py +0 -5
- clear_skies-1.22.31/src/clearskies/di/di.py +0 -347
- clear_skies-1.22.31/src/clearskies/di/standard_dependencies.py +0 -151
- clear_skies-1.22.31/src/clearskies/functional/__init__.py +0 -7
- clear_skies-1.22.31/src/clearskies/functional/validations.py +0 -24
- clear_skies-1.22.31/src/clearskies/handlers/__init__.py +0 -41
- clear_skies-1.22.31/src/clearskies/handlers/advanced_search.py +0 -271
- clear_skies-1.22.31/src/clearskies/handlers/base.py +0 -479
- clear_skies-1.22.31/src/clearskies/handlers/callable.py +0 -192
- clear_skies-1.22.31/src/clearskies/handlers/create.py +0 -35
- clear_skies-1.22.31/src/clearskies/handlers/crud_by_method.py +0 -18
- clear_skies-1.22.31/src/clearskies/handlers/database_connector.py +0 -32
- clear_skies-1.22.31/src/clearskies/handlers/delete.py +0 -61
- clear_skies-1.22.31/src/clearskies/handlers/exceptions/__init__.py +0 -5
- clear_skies-1.22.31/src/clearskies/handlers/exceptions/not_found.py +0 -3
- clear_skies-1.22.31/src/clearskies/handlers/get.py +0 -156
- clear_skies-1.22.31/src/clearskies/handlers/health_check.py +0 -59
- clear_skies-1.22.31/src/clearskies/handlers/input_processing.py +0 -79
- clear_skies-1.22.31/src/clearskies/handlers/list.py +0 -530
- clear_skies-1.22.31/src/clearskies/handlers/mygrations.py +0 -82
- clear_skies-1.22.31/src/clearskies/handlers/request_method_routing.py +0 -47
- clear_skies-1.22.31/src/clearskies/handlers/restful_api.py +0 -218
- clear_skies-1.22.31/src/clearskies/handlers/routing.py +0 -62
- clear_skies-1.22.31/src/clearskies/handlers/schema_helper.py +0 -128
- clear_skies-1.22.31/src/clearskies/handlers/simple_routing.py +0 -206
- clear_skies-1.22.31/src/clearskies/handlers/simple_routing_route.py +0 -197
- clear_skies-1.22.31/src/clearskies/handlers/simple_search.py +0 -136
- clear_skies-1.22.31/src/clearskies/handlers/update.py +0 -102
- clear_skies-1.22.31/src/clearskies/handlers/write.py +0 -193
- clear_skies-1.22.31/src/clearskies/input_outputs/__init__.py +0 -11
- clear_skies-1.22.31/src/clearskies/input_outputs/cli.py +0 -182
- clear_skies-1.22.31/src/clearskies/input_outputs/input_output.py +0 -169
- clear_skies-1.22.31/src/clearskies/input_requirements/__init__.py +0 -78
- clear_skies-1.22.31/src/clearskies/input_requirements/after.py +0 -36
- clear_skies-1.22.31/src/clearskies/input_requirements/before.py +0 -36
- clear_skies-1.22.31/src/clearskies/input_requirements/in_the_future_at_least.py +0 -19
- clear_skies-1.22.31/src/clearskies/input_requirements/in_the_future_at_most.py +0 -19
- clear_skies-1.22.31/src/clearskies/input_requirements/in_the_past_at_least.py +0 -19
- clear_skies-1.22.31/src/clearskies/input_requirements/in_the_past_at_most.py +0 -19
- clear_skies-1.22.31/src/clearskies/input_requirements/maximum_length.py +0 -19
- clear_skies-1.22.31/src/clearskies/input_requirements/maximum_value.py +0 -19
- clear_skies-1.22.31/src/clearskies/input_requirements/minimum_length.py +0 -22
- clear_skies-1.22.31/src/clearskies/input_requirements/minimum_value.py +0 -19
- clear_skies-1.22.31/src/clearskies/input_requirements/required.py +0 -23
- clear_skies-1.22.31/src/clearskies/input_requirements/requirement.py +0 -25
- clear_skies-1.22.31/src/clearskies/input_requirements/time_delta.py +0 -38
- clear_skies-1.22.31/src/clearskies/input_requirements/unique.py +0 -18
- clear_skies-1.22.31/src/clearskies/mocks/__init__.py +0 -7
- clear_skies-1.22.31/src/clearskies/mocks/input_output.py +0 -124
- clear_skies-1.22.31/src/clearskies/mocks/models.py +0 -142
- clear_skies-1.22.31/src/clearskies/model.py +0 -357
- clear_skies-1.22.31/src/clearskies/models.py +0 -350
- clear_skies-1.22.31/src/clearskies/secrets/__init__.py +0 -34
- clear_skies-1.22.31/src/clearskies/secrets/akeyless.py +0 -241
- clear_skies-1.22.31/src/clearskies/security_headers/__init__.py +0 -11
- clear_skies-1.22.31/src/clearskies/security_headers/base.py +0 -12
- clear_skies-1.22.31/src/clearskies/security_headers/cache_control.py +0 -130
- clear_skies-1.22.31/src/clearskies/security_headers/cors.py +0 -105
- clear_skies-1.22.31/src/clearskies/security_headers/csp.py +0 -169
- clear_skies-1.22.31/src/clearskies/security_headers/hsts.py +0 -24
- clear_skies-1.22.31/src/clearskies/tests/simple_api/models/__init__.py +0 -2
- clear_skies-1.22.31/src/clearskies/tests/simple_api/models/status.py +0 -23
- clear_skies-1.22.31/src/clearskies/tests/simple_api/models/user.py +0 -21
- clear_skies-1.22.31/src/clearskies/tests/simple_api/users_api.py +0 -64
- {clear_skies-1.22.31 → clear_skies-2.0.1}/LICENSE +0 -0
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/autodoc/__init__.py +0 -0
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/autodoc/formats/__init__.py +0 -0
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/autodoc/formats/oai3_json/__init__.py +1 -1
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/autodoc/formats/oai3_json/oai3_schema_resolver.py +0 -0
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/autodoc/formats/oai3_json/schema/__init__.py +0 -0
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/autodoc/formats/oai3_json/schema/array.py +0 -0
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/autodoc/formats/oai3_json/schema/default.py +0 -0
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/autodoc/formats/oai3_json/schema/enum.py +0 -0
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/autodoc/formats/oai3_json/test.json +0 -0
- clear_skies-1.22.31/src/clearskies/contexts/bash.py → clear_skies-2.0.1/src/clearskies/autodoc/py.typed +0 -0
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/autodoc/response/__init__.py +0 -0
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/autodoc/response/response.py +0 -0
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/autodoc/schema/base64.py +0 -0
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/di/test_module/__init__.py +0 -0
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/di/test_module/another_module/__init__.py +0 -0
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/di/test_module/module_class.py +0 -0
- {clear_skies-1.22.31/src/clearskies/handlers → clear_skies-2.0.1/src/clearskies}/exceptions/authentication.py +0 -0
- {clear_skies-1.22.31/src/clearskies/handlers → clear_skies-2.0.1/src/clearskies}/exceptions/authorization.py +0 -0
- {clear_skies-1.22.31/src/clearskies/handlers → clear_skies-2.0.1/src/clearskies}/exceptions/client_error.py +0 -0
- {clear_skies-1.22.31/src/clearskies/secrets → clear_skies-2.0.1/src/clearskies}/exceptions/not_found.py +0 -0
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/input_outputs/exceptions/__init__.py +1 -1
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/input_outputs/exceptions/cli_input_error.py +0 -0
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/input_outputs/exceptions/cli_not_found.py +0 -0
- /clear_skies-1.22.31/src/clearskies/security_headers/x_content_type_options.py → /clear_skies-2.0.1/src/clearskies/input_outputs/py.typed +0 -0
- /clear_skies-1.22.31/src/clearskies/security_headers/x_frame_options.py → /clear_skies-2.0.1/src/clearskies/py.typed +0 -0
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/secrets/additional_configs/__init__.py +0 -0
- {clear_skies-1.22.31 → clear_skies-2.0.1}/src/clearskies/secrets/exceptions/__init__.py +0 -0
- /clear_skies-1.22.31/src/clearskies/tests/__init__.py → /clear_skies-2.0.1/src/clearskies/security_headers/x_content_type_options.py +0 -0
- /clear_skies-1.22.31/src/clearskies/tests/simple_api/__init__.py → /clear_skies-2.0.1/src/clearskies/security_headers/x_frame_options.py +0 -0
|
@@ -1,44 +1,42 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: clear-skies
|
|
3
|
-
Version:
|
|
3
|
+
Version: 2.0.1
|
|
4
4
|
Summary: A framework for building backends in the cloud
|
|
5
5
|
License: MIT
|
|
6
6
|
Author: Conor Mancone
|
|
7
7
|
Author-email: cmancone@gmail.com
|
|
8
|
-
Requires-Python: >=3.
|
|
8
|
+
Requires-Python: >=3.11,<4.0
|
|
9
9
|
Classifier: Development Status :: 5 - Production/Stable
|
|
10
10
|
Classifier: Intended Audience :: Developers
|
|
11
11
|
Classifier: License :: OSI Approved :: MIT License
|
|
12
12
|
Classifier: Programming Language :: Python :: 3
|
|
13
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
14
13
|
Classifier: Programming Language :: Python :: 3.11
|
|
15
14
|
Classifier: Programming Language :: Python :: 3.12
|
|
16
15
|
Classifier: Programming Language :: Python :: 3.13
|
|
17
16
|
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
|
|
18
|
-
Provides-Extra: jose
|
|
19
17
|
Provides-Extra: jwcrypto
|
|
20
18
|
Provides-Extra: mysql
|
|
21
19
|
Provides-Extra: secrets
|
|
22
|
-
Requires-Dist: akeyless (>=
|
|
23
|
-
Requires-Dist: akeyless-cloud-id (>=0.3
|
|
24
|
-
Requires-Dist: dateparser (>=1.
|
|
25
|
-
Requires-Dist: jose (>=1.0.0,<2.0.0) ; extra == "jose"
|
|
20
|
+
Requires-Dist: akeyless (>=4.0.0,<5.0.0) ; extra == "secrets"
|
|
21
|
+
Requires-Dist: akeyless-cloud-id (>=0.2.3,<0.3.0) ; extra == "secrets"
|
|
22
|
+
Requires-Dist: dateparser (>=1.1.8,<2.0.0)
|
|
26
23
|
Requires-Dist: jwcrypto (>=1.5.6,<2.0.0) ; extra == "jwcrypto"
|
|
27
|
-
Requires-Dist: pymysql (>=1.1.
|
|
28
|
-
Requires-Dist: requests (>=2.
|
|
29
|
-
Requires-Dist: typing-extensions (>=4.
|
|
30
|
-
|
|
24
|
+
Requires-Dist: pymysql (>=1.1.0,<2.0.0) ; extra == "mysql"
|
|
25
|
+
Requires-Dist: requests (>=2.31.0,<3.0.0)
|
|
26
|
+
Requires-Dist: typing-extensions (>=4.12.0,<5.0.0) ; python_version == "3.10"
|
|
27
|
+
Requires-Dist: wrapt (>=1.16.0,<2.0.0)
|
|
28
|
+
Project-URL: Repository, https://github.com/clearskies-py/clearskies
|
|
31
29
|
Description-Content-Type: text/markdown
|
|
32
30
|
|
|
33
31
|
# clearskies
|
|
34
32
|
|
|
35
33
|
clearskies is a very opinionated Python framework intended for developing microservices in the cloud via declarative programming principles. It is mainly intended for backend services and so is designed for RESTful API endpoints, queue listeners, scheduled tasks, and the like.
|
|
36
34
|
|
|
37
|
-
|
|
35
|
+
## Installation, Documentation, and Usage
|
|
38
36
|
|
|
39
37
|
To install:
|
|
40
38
|
|
|
41
|
-
```
|
|
39
|
+
```bash
|
|
42
40
|
pip3 install clear-skies
|
|
43
41
|
```
|
|
44
42
|
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
clearskies is a very opinionated Python framework intended for developing microservices in the cloud via declarative programming principles. It is mainly intended for backend services and so is designed for RESTful API endpoints, queue listeners, scheduled tasks, and the like.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## Installation, Documentation, and Usage
|
|
6
6
|
|
|
7
7
|
To install:
|
|
8
8
|
|
|
9
|
-
```
|
|
9
|
+
```bash
|
|
10
10
|
pip3 install clear-skies
|
|
11
11
|
```
|
|
12
12
|
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "clear-skies"
|
|
3
|
+
description = "A framework for building backends in the cloud"
|
|
4
|
+
version = "v0.0.0-dev"
|
|
5
|
+
license = "MIT"
|
|
6
|
+
dynamic = ["classifiers"]
|
|
7
|
+
readme = "./README.md"
|
|
8
|
+
authors = [{name = "Conor Mancone", email = "cmancone@gmail.com"}]
|
|
9
|
+
requires-python = '>=3.11,<4.0'
|
|
10
|
+
dependencies = ['dateparser (>=1.1.8,<2.0.0)', 'requests (>=2.31.0,<3.0.0)', 'typing-extensions (>=4.12.0,<5.0.0) ; python_version >= "3.10" and python_version < "3.11"', 'wrapt (>=1.16.0,<2.0.0)']
|
|
11
|
+
|
|
12
|
+
[project.urls]
|
|
13
|
+
repository = "https://github.com/clearskies-py/clearskies"
|
|
14
|
+
|
|
15
|
+
[project.optional-dependencies]
|
|
16
|
+
secrets = ['akeyless (>=4.0.0,<5.0.0)', 'akeyless-cloud-id (>=0.2.3,<0.3.0)']
|
|
17
|
+
mysql = ['pymysql (>=1.1.0,<2.0.0)']
|
|
18
|
+
jwcrypto = ['jwcrypto (>=1.5.6,<2.0.0)']
|
|
19
|
+
|
|
20
|
+
[tool.poetry]
|
|
21
|
+
packages = [
|
|
22
|
+
{ include = "clearskies", from = "src" }
|
|
23
|
+
]
|
|
24
|
+
exclude = [
|
|
25
|
+
"src/clearskies/*_test.py",
|
|
26
|
+
"src/clearskies/**/*_test.py",
|
|
27
|
+
"src/clearskies/integration_tests/*",
|
|
28
|
+
"docs/**"
|
|
29
|
+
]
|
|
30
|
+
classifiers = [
|
|
31
|
+
"Development Status :: 5 - Production/Stable",
|
|
32
|
+
"Programming Language :: Python :: 3",
|
|
33
|
+
"License :: OSI Approved :: MIT License",
|
|
34
|
+
"Intended Audience :: Developers",
|
|
35
|
+
"Topic :: Software Development :: Libraries :: Application Frameworks"
|
|
36
|
+
]
|
|
37
|
+
requires-poetry = '>=2.0,<3.0'
|
|
38
|
+
|
|
39
|
+
[[tool.poetry.source]]
|
|
40
|
+
name = "PyPI"
|
|
41
|
+
priority = "primary"
|
|
42
|
+
|
|
43
|
+
[tool.poetry.group.dev.dependencies]
|
|
44
|
+
black = "^25.1.0"
|
|
45
|
+
mypy = "^1.16.1"
|
|
46
|
+
pre-commit = "^3.8.0"
|
|
47
|
+
pytest = "^8.4.1"
|
|
48
|
+
ruff = "^0.12.1"
|
|
49
|
+
types-dateparser = "^1.2.2.20250627"
|
|
50
|
+
types-jwcrypto = "^1.5.0.20250516"
|
|
51
|
+
types-pymysql = "^1.1.0.20250516"
|
|
52
|
+
types-requests = "^2.32.4.20250611"
|
|
53
|
+
|
|
54
|
+
[tool.pytest]
|
|
55
|
+
addopts = "--ignore=src/clearskies/contexts/test.py --cache-clear"
|
|
56
|
+
|
|
57
|
+
[build-system]
|
|
58
|
+
requires = ['poetry-core (>=2.0,<3.0)']
|
|
59
|
+
build-backend = "poetry.core.masonry.api"
|
|
60
|
+
|
|
61
|
+
[tool.black]
|
|
62
|
+
line-length = 120
|
|
63
|
+
# The following is Black's default, but it's good to be explicit
|
|
64
|
+
# to match your Ruff config.
|
|
65
|
+
skip-magic-trailing-comma = false
|
|
66
|
+
preview = true
|
|
67
|
+
|
|
68
|
+
[tool.mypy]
|
|
69
|
+
python_version = "3.11"
|
|
70
|
+
|
|
71
|
+
exclude = [
|
|
72
|
+
".*_test\\.py$",
|
|
73
|
+
"docs/.*"
|
|
74
|
+
]
|
|
75
|
+
|
|
76
|
+
[tool.poetry-git-version-plugin]
|
|
77
|
+
release_type = "tag"
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
from . import (
|
|
2
|
+
authentication,
|
|
3
|
+
autodoc,
|
|
4
|
+
backends,
|
|
5
|
+
columns,
|
|
6
|
+
configs,
|
|
7
|
+
contexts,
|
|
8
|
+
di,
|
|
9
|
+
endpoints,
|
|
10
|
+
exceptions,
|
|
11
|
+
functional,
|
|
12
|
+
query,
|
|
13
|
+
# secrets,
|
|
14
|
+
security_headers,
|
|
15
|
+
typing,
|
|
16
|
+
validators,
|
|
17
|
+
)
|
|
18
|
+
from . import parameters_to_properties as parameters_to_properties_module
|
|
19
|
+
from .column import Column
|
|
20
|
+
from .configurable import Configurable
|
|
21
|
+
from .end import End # type: ignore
|
|
22
|
+
from .endpoint import Endpoint
|
|
23
|
+
from .endpoint_group import EndpointGroup
|
|
24
|
+
from .schema import Schema
|
|
25
|
+
|
|
26
|
+
parameters_to_properties = parameters_to_properties_module.parameters_to_properties
|
|
27
|
+
|
|
28
|
+
from .action import Action
|
|
29
|
+
from .environment import Environment
|
|
30
|
+
from .model import Model
|
|
31
|
+
from .security_header import SecurityHeader
|
|
32
|
+
from .validator import Validator
|
|
33
|
+
|
|
34
|
+
__all__ = [
|
|
35
|
+
"Action",
|
|
36
|
+
"Authentication",
|
|
37
|
+
"autodoc",
|
|
38
|
+
"backends",
|
|
39
|
+
"Column",
|
|
40
|
+
"columns",
|
|
41
|
+
"configs",
|
|
42
|
+
"Configurable",
|
|
43
|
+
"contexts",
|
|
44
|
+
"di",
|
|
45
|
+
"End",
|
|
46
|
+
"Endpoint",
|
|
47
|
+
"EndpointGroup",
|
|
48
|
+
"endpoints",
|
|
49
|
+
"Environment",
|
|
50
|
+
"exceptions",
|
|
51
|
+
"functional",
|
|
52
|
+
"Model",
|
|
53
|
+
"parameters_to_properties",
|
|
54
|
+
"Schema",
|
|
55
|
+
"typing",
|
|
56
|
+
"Validator",
|
|
57
|
+
"query",
|
|
58
|
+
# "secrets",
|
|
59
|
+
"SecurityHeader",
|
|
60
|
+
"security_headers",
|
|
61
|
+
"validators",
|
|
62
|
+
]
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from clearskies.authentication.authentication import Authentication
|
|
2
|
+
from clearskies.authentication.authorization import Authorization
|
|
3
|
+
from clearskies.authentication.authorization_pass_through import AuthorizationPassThrough
|
|
4
|
+
from clearskies.authentication.jwks import Jwks
|
|
5
|
+
from clearskies.authentication.public import Public
|
|
6
|
+
from clearskies.authentication.secret_bearer import SecretBearer
|
|
7
|
+
|
|
8
|
+
__all__ = [
|
|
9
|
+
"Authentication",
|
|
10
|
+
"Authorization",
|
|
11
|
+
"AuthorizationPassThrough",
|
|
12
|
+
"Jwks",
|
|
13
|
+
"Public",
|
|
14
|
+
"SecretBearer",
|
|
15
|
+
]
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, Any
|
|
4
|
+
|
|
5
|
+
import requests
|
|
6
|
+
|
|
7
|
+
import clearskies.configurable
|
|
8
|
+
from clearskies.authentication.authorization import Authorization
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from clearskies.security_headers.cors import Cors
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class Authentication(clearskies.configurable.Configurable, requests.auth.AuthBase):
|
|
15
|
+
"""
|
|
16
|
+
Authentication!
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
is_public = True
|
|
20
|
+
can_authorize = False
|
|
21
|
+
has_dynamic_credentials = False
|
|
22
|
+
|
|
23
|
+
def clear_credential_cache(self) -> None:
|
|
24
|
+
pass
|
|
25
|
+
|
|
26
|
+
def headers(self, retry_auth: bool = False) -> dict[str, str]:
|
|
27
|
+
return {}
|
|
28
|
+
|
|
29
|
+
def authenticate(self, input_output) -> bool:
|
|
30
|
+
return True
|
|
31
|
+
|
|
32
|
+
def authorize(self, authorization: Authorization):
|
|
33
|
+
raise ValueError("Public endpoints do not support authorization")
|
|
34
|
+
|
|
35
|
+
def set_headers_for_cors(self, cors: Cors):
|
|
36
|
+
pass
|
|
37
|
+
|
|
38
|
+
def documentation_security_scheme(self) -> dict[str, Any]:
|
|
39
|
+
return {}
|
|
40
|
+
|
|
41
|
+
def documentation_security_scheme_name(self) -> str:
|
|
42
|
+
return ""
|
|
43
|
+
|
|
44
|
+
def __call__(self, request: requests.models.PreparedRequest) -> requests.models.PreparedRequest:
|
|
45
|
+
request.headers = {**request.headers, **self.headers()} # type: ignore
|
|
46
|
+
return request
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
class Authorization:
|
|
2
|
+
"""
|
|
3
|
+
Authorization!
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
def gate(self, authorization_data, input_output):
|
|
7
|
+
"""
|
|
8
|
+
Return True/False to denote if the given user, as represented by the authorization data, should be allowed access.
|
|
9
|
+
|
|
10
|
+
Raise clearskies.exceptions.ClientError if you want to raise a specific error message.
|
|
11
|
+
"""
|
|
12
|
+
return True
|
|
13
|
+
|
|
14
|
+
def filter_model(self, model, authorization_data, input_output):
|
|
15
|
+
"""Return a models object with additional filters applied to account for authorization needs."""
|
|
16
|
+
return model
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import clearskies.di
|
|
2
|
+
|
|
3
|
+
from .jwks import Jwks
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class AuthorizationPassThrough(Jwks):
|
|
7
|
+
"""
|
|
8
|
+
Authentication class with pass through.
|
|
9
|
+
|
|
10
|
+
This authentication class takes the authentication header from the incoming request and reflects
|
|
11
|
+
it on outgoing requests.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
"""
|
|
15
|
+
The input output helper
|
|
16
|
+
"""
|
|
17
|
+
input_output = clearskies.di.inject.InputOutput()
|
|
18
|
+
|
|
19
|
+
def headers(self, retry_auth=False):
|
|
20
|
+
return {"Authorization": self.input_output.request_headers.get("authorization", True)}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
import clearskies.configs
|
|
5
|
+
import clearskies.di
|
|
6
|
+
import clearskies.parameters_to_properties
|
|
7
|
+
from clearskies.authentication.authentication import Authentication
|
|
8
|
+
from clearskies.exceptions import ClientError
|
|
9
|
+
from clearskies.security_headers.cors import Cors
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class Jwks(Authentication, clearskies.di.InjectableProperties):
|
|
13
|
+
"""
|
|
14
|
+
Validate a JWT against a JWKS (JSON Web Key Set)
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
"""
|
|
18
|
+
The URL of the JWKS
|
|
19
|
+
"""
|
|
20
|
+
jwks_url = clearskies.configs.String(required=True)
|
|
21
|
+
|
|
22
|
+
"""
|
|
23
|
+
The audience to accept JWTs for.
|
|
24
|
+
"""
|
|
25
|
+
audience = clearskies.configs.StringList(default=[])
|
|
26
|
+
|
|
27
|
+
"""
|
|
28
|
+
The expected issuer of the JWTs.
|
|
29
|
+
"""
|
|
30
|
+
issuer = clearskies.configs.String(default="")
|
|
31
|
+
|
|
32
|
+
"""
|
|
33
|
+
The allowed algorithms
|
|
34
|
+
"""
|
|
35
|
+
algorithms = clearskies.configs.StringList(default=["RS256"])
|
|
36
|
+
|
|
37
|
+
"""
|
|
38
|
+
The number of seconds for which the JWKS URL contents can be cached
|
|
39
|
+
"""
|
|
40
|
+
jwks_cache_time = clearskies.configs.Integer(default=86400)
|
|
41
|
+
|
|
42
|
+
"""
|
|
43
|
+
The Authorization URL (used in the auto-generated documentation)
|
|
44
|
+
"""
|
|
45
|
+
authorization_url = clearskies.configs.String()
|
|
46
|
+
|
|
47
|
+
"""
|
|
48
|
+
The name of the security scheme in the auto-generated documentation.
|
|
49
|
+
"""
|
|
50
|
+
documentation_security_name = clearskies.configs.String(default="jwt")
|
|
51
|
+
|
|
52
|
+
"""
|
|
53
|
+
The environment helper.
|
|
54
|
+
"""
|
|
55
|
+
environment = clearskies.di.inject.Environment()
|
|
56
|
+
|
|
57
|
+
"""
|
|
58
|
+
The requests object.
|
|
59
|
+
"""
|
|
60
|
+
requests = clearskies.di.inject.Requests()
|
|
61
|
+
|
|
62
|
+
"""
|
|
63
|
+
The JoseJwt library
|
|
64
|
+
"""
|
|
65
|
+
jose_jwt = clearskies.di.inject.ByName("jose_jwt")
|
|
66
|
+
|
|
67
|
+
"""
|
|
68
|
+
The current time
|
|
69
|
+
"""
|
|
70
|
+
now = clearskies.di.inject.Now()
|
|
71
|
+
|
|
72
|
+
"""
|
|
73
|
+
Local cache of the JWKS
|
|
74
|
+
"""
|
|
75
|
+
_jwks = None
|
|
76
|
+
|
|
77
|
+
"""
|
|
78
|
+
The time when the JWKS was last fetched
|
|
79
|
+
"""
|
|
80
|
+
_jwks_fetched = None
|
|
81
|
+
|
|
82
|
+
@clearskies.parameters_to_properties.parameters_to_properties
|
|
83
|
+
def __init__(
|
|
84
|
+
self,
|
|
85
|
+
jwks_url: str,
|
|
86
|
+
audience: str = "",
|
|
87
|
+
issuer: str = "",
|
|
88
|
+
algorithms: list[str] = ["RS256"],
|
|
89
|
+
jwks_cache_time: int = 86400,
|
|
90
|
+
authorization_url: str = "",
|
|
91
|
+
documentation_security_name: str = "jwt",
|
|
92
|
+
):
|
|
93
|
+
self.finalize_and_validate_configuration()
|
|
94
|
+
|
|
95
|
+
def authenticate(self, input_output) -> bool:
|
|
96
|
+
auth_header = input_output.get_request_header("authorization", True)
|
|
97
|
+
if not auth_header:
|
|
98
|
+
raise ClientError("Missing 'Authorization' header in request")
|
|
99
|
+
if auth_header[:7].lower() != "bearer ":
|
|
100
|
+
raise ClientError("Missing 'Bearer ' prefix in authorization header")
|
|
101
|
+
self.validate_jwt(auth_header[7:])
|
|
102
|
+
input_output.authorization_data = self.jwt_claims
|
|
103
|
+
return True
|
|
104
|
+
|
|
105
|
+
def validate_jwt(self, raw_jwt):
|
|
106
|
+
try:
|
|
107
|
+
from jwcrypto import jwk, jws, jwt # type: ignore
|
|
108
|
+
from jwcrypto.common import JWException # type: ignore
|
|
109
|
+
except:
|
|
110
|
+
raise ValueError(
|
|
111
|
+
"The JWKS authentication method requires the jwcrypto libraries to be installed. These are optional dependencies of clearskies, so to include them do a `pip install 'clear-skies[jwcrypto]'`"
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
keys = jwk.JWKSet()
|
|
115
|
+
keys.import_keyset(json.dumps(self._get_jwks()))
|
|
116
|
+
|
|
117
|
+
client_jwt = jwt.JWT()
|
|
118
|
+
try:
|
|
119
|
+
client_jwt.deserialize(raw_jwt)
|
|
120
|
+
except Exception as e:
|
|
121
|
+
raise ClientError(str(e))
|
|
122
|
+
|
|
123
|
+
try:
|
|
124
|
+
client_jwt.validate(keys)
|
|
125
|
+
self.jwt_claims = json.loads(client_jwt.claims)
|
|
126
|
+
except JWException as e:
|
|
127
|
+
raise ClientError(str(e))
|
|
128
|
+
|
|
129
|
+
if self.issuer and self.jwt_claims.get("iss") != self.issuer:
|
|
130
|
+
raise ClientError("Issuer does not match")
|
|
131
|
+
|
|
132
|
+
if self.audience:
|
|
133
|
+
jwt_audience = self.jwt_claims.get("aud")
|
|
134
|
+
if not jwt_audience:
|
|
135
|
+
raise ClientError("Audience required, but missing in JWT")
|
|
136
|
+
has_match = False
|
|
137
|
+
for audience in jwt_audience:
|
|
138
|
+
if audience == self.audience:
|
|
139
|
+
has_match = True
|
|
140
|
+
if not has_match:
|
|
141
|
+
raise ClientError("Audience does not match")
|
|
142
|
+
|
|
143
|
+
return True
|
|
144
|
+
|
|
145
|
+
def _get_jwks(self):
|
|
146
|
+
if self._jwks is None or ((self.now - self._jwks_fetched).total_seconds() > self.jwks_cache_time):
|
|
147
|
+
self._jwks = self.requests.get(self.jwks_url).json()
|
|
148
|
+
self._jwks_fetched = self.now
|
|
149
|
+
|
|
150
|
+
return self._jwks
|
|
151
|
+
|
|
152
|
+
def documentation_security_scheme(self) -> dict[str, Any]:
|
|
153
|
+
return {
|
|
154
|
+
"type": "oauth2",
|
|
155
|
+
"description": "JWT based authentication",
|
|
156
|
+
"flows": {"implicit": {"authorizationUrl": self.authorization_url, "scopes": {}}},
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
def documentation_security_scheme_name(self) -> str:
|
|
160
|
+
return self.documentation_security_name
|
|
161
|
+
|
|
162
|
+
def set_headers_for_cors(self, cors: Cors):
|
|
163
|
+
cors.add_header("Authorization")
|