clear-skies 1.21.0__tar.gz → 1.21.2__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.21.0 → clear_skies-1.21.2}/PKG-INFO +2 -1
- {clear_skies-1.21.0 → clear_skies-1.21.2}/pyproject.toml +2 -1
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/category_tree.py +79 -1
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/datetime.py +1 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/di/standard_dependencies.py +2 -1
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/model.py +38 -33
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/models.py +43 -43
- {clear_skies-1.21.0 → clear_skies-1.21.2}/LICENSE +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/README.md +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/__init__.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/application.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/authentication/__init__.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/authentication/auth0_jwks.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/authentication/auth_exception.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/authentication/authorization.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/authentication/jwks.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/authentication/jwks_jwcrypto.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/authentication/public.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/authentication/secret_bearer.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/__init__.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/formats/__init__.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/formats/oai3_json/__init__.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/formats/oai3_json/oai3_json.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/formats/oai3_json/oai3_schema_resolver.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/formats/oai3_json/parameter.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/formats/oai3_json/request.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/formats/oai3_json/response.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/formats/oai3_json/schema/__init__.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/formats/oai3_json/schema/array.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/formats/oai3_json/schema/default.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/formats/oai3_json/schema/enum.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/formats/oai3_json/schema/object.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/formats/oai3_json/test.json +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/request/__init__.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/request/header.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/request/json_body.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/request/request.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/request/url_parameter.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/request/url_path.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/response/__init__.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/response/response.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/schema/__init__.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/schema/array.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/schema/base64.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/schema/boolean.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/schema/date.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/schema/datetime.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/schema/double.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/schema/enum.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/schema/integer.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/schema/long.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/schema/number.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/schema/object.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/schema/password.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/schema/string.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/backends/__init__.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/backends/api_backend.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/backends/backend.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/backends/cursor_backend.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/backends/example_backend.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/backends/file_backend.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/backends/json_backend.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/backends/memory_backend.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/backends/restful_api_advanced_search_backend.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/backends/secrets_backend.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/binding_config.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/__init__.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/audit.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/belongs_to.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/boolean.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/column.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/created.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/created_by_authorization_data.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/created_by_header.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/created_by_ip.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/created_by_routing_data.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/created_by_user_agent.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/created_micro.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/datetime_micro.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/email.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/float.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/has_many.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/has_one.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/integer.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/json.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/many_to_many.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/many_to_many_with_data.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/phone.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/select.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/string.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/timestamp.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/updated.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/updated_micro.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/uuid.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/columns.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/condition_parser.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/contexts/__init__.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/contexts/bash.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/contexts/build_context.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/contexts/cli.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/contexts/context.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/contexts/convert_to_application.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/contexts/extract_handler.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/contexts/test.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/contexts/wsgi.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/__init__.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/auth0_jwks.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/authorization.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/binding_classes.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/binding_modules.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/bindings.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/create.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/delete.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/docs.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/get.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/jwks.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/merge.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/patch.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/post.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/public.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/response_headers.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/return_raw_response.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/schema.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/secret_bearer.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/security_headers.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/di/__init__.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/di/additional_config.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/di/additional_config_auto_import.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/di/di.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/di/test_module/__init__.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/di/test_module/another_module/__init__.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/di/test_module/module_class.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/environment.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/functional/__init__.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/functional/string.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/functional/validations.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/__init__.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/advanced_search.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/base.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/callable.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/create.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/crud_by_method.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/database_connector.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/delete.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/exceptions/__init__.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/exceptions/authentication.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/exceptions/authorization.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/exceptions/client_error.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/exceptions/input_error.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/exceptions/not_found.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/get.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/health_check.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/input_processing.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/list.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/mygrations.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/request_method_routing.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/restful_api.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/routing.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/schema_helper.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/simple_routing.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/simple_routing_route.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/simple_search.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/update.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/write.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_outputs/__init__.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_outputs/cli.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_outputs/exceptions/__init__.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_outputs/exceptions/cli_input_error.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_outputs/exceptions/cli_not_found.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_outputs/input_output.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_outputs/wsgi.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_requirements/__init__.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_requirements/after.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_requirements/before.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_requirements/in_the_future_at_least.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_requirements/in_the_future_at_most.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_requirements/in_the_past_at_least.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_requirements/in_the_past_at_most.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_requirements/maximum_length.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_requirements/maximum_value.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_requirements/minimum_length.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_requirements/minimum_value.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_requirements/required.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_requirements/requirement.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_requirements/time_delta.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_requirements/unique.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/mocks/__init__.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/mocks/input_output.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/mocks/models.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/secrets/__init__.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/secrets/additional_configs/__init__.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/secrets/additional_configs/mysql_connection_dynamic_producer.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/secrets/additional_configs/mysql_connection_dynamic_producer_via_ssh_cert_bastion.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/secrets/akeyless.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/secrets/exceptions/__init__.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/secrets/exceptions/not_found.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/secrets/secrets.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/security_headers/__init__.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/security_headers/base.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/security_headers/cache_control.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/security_headers/cors.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/security_headers/csp.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/security_headers/hsts.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/security_headers/x_content_type_options.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/security_headers/x_frame_options.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/tests/__init__.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/tests/simple_api/__init__.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/tests/simple_api/models/__init__.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/tests/simple_api/models/status.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/tests/simple_api/models/user.py +0 -0
- {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/tests/simple_api/users_api.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: clear-skies
|
|
3
|
-
Version: 1.21.
|
|
3
|
+
Version: 1.21.2
|
|
4
4
|
Summary: A framework for building backends in the cloud
|
|
5
5
|
Home-page: https://github.com/cmancone/clearskies
|
|
6
6
|
License: MIT
|
|
@@ -25,6 +25,7 @@ Requires-Dist: jose (>=1.0.0,<2.0.0) ; extra == "jose"
|
|
|
25
25
|
Requires-Dist: jwcrypto (>=1.5.6,<2.0.0) ; extra == "jwcrypto"
|
|
26
26
|
Requires-Dist: pymysql (>=1.1.0,<2.0.0) ; extra == "mysql"
|
|
27
27
|
Requires-Dist: requests (>=2.31.0,<3.0.0)
|
|
28
|
+
Requires-Dist: typing-extensions (>=4.12.0,<5.0.0) ; python_version >= "3.10" and python_version < "3.11"
|
|
28
29
|
Project-URL: Repository, https://github.com/cmancone/clearskies
|
|
29
30
|
Description-Content-Type: text/markdown
|
|
30
31
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[tool.poetry]
|
|
4
4
|
name = "clear-skies"
|
|
5
|
-
version = "1.21.
|
|
5
|
+
version = "1.21.2"
|
|
6
6
|
description = "A framework for building backends in the cloud"
|
|
7
7
|
authors = [
|
|
8
8
|
"Conor Mancone <cmancone@gmail.com>",
|
|
@@ -34,6 +34,7 @@ akeyless-cloud-id = {version = "^0.2.3", optional = true}
|
|
|
34
34
|
pymysql = {version = "^1.1.0", optional = true}
|
|
35
35
|
jose = {version = "^1.0.0", optional = true}
|
|
36
36
|
jwcrypto = {version = "^1.5.6", optional = true}
|
|
37
|
+
typing-extensions = {version = "^4.12.0", python = ">=3.10,<3.11"}
|
|
37
38
|
|
|
38
39
|
[[tool.poetry.source]]
|
|
39
40
|
name = "PyPI"
|
|
@@ -119,6 +119,10 @@ class CategoryTree(BelongsTo):
|
|
|
119
119
|
"tree_level_column_name",
|
|
120
120
|
"max_iterations",
|
|
121
121
|
"parent_models_class",
|
|
122
|
+
"children_column_name",
|
|
123
|
+
"descendents_column_name",
|
|
124
|
+
"ancestors_column_name",
|
|
125
|
+
"load_relatives_strategy",
|
|
122
126
|
]
|
|
123
127
|
|
|
124
128
|
def __init__(self, di):
|
|
@@ -137,6 +141,11 @@ class CategoryTree(BelongsTo):
|
|
|
137
141
|
configuration["tree_models_class"],
|
|
138
142
|
config_name="tree_models_class",
|
|
139
143
|
)
|
|
144
|
+
load_relatives_strategy = configuration.get("load_relatives_strategy", None)
|
|
145
|
+
if load_relatives_strategy and load_relatives_strategy not in ["join", "where_in", "individual"]:
|
|
146
|
+
raise ValueError(
|
|
147
|
+
f"Configuration error for category_tree column '{self.name} in model class '{self.model_class.__name__}': load_relatives_strategy must be one of ['join', 'where_in', or 'individual']"
|
|
148
|
+
)
|
|
140
149
|
|
|
141
150
|
def _finalize_configuration(self, configuration):
|
|
142
151
|
return {
|
|
@@ -152,6 +161,10 @@ class CategoryTree(BelongsTo):
|
|
|
152
161
|
"tree_is_parent_column_name": configuration.get("tree_is_parent_column_name", "is_parent"),
|
|
153
162
|
"tree_level_column_name": configuration.get("tree_level_column_name", "level"),
|
|
154
163
|
"max_iterations": configuration.get("max_iterations", 100),
|
|
164
|
+
"children_column_name": configuration.get("children_column_name", "children"),
|
|
165
|
+
"descendents_column_name": configuration.get("descendents_column_name", "descendents"),
|
|
166
|
+
"ancestors_column_name": configuration.get("ancestors_column_name", "ancestors"),
|
|
167
|
+
"load_relatives_strategy": configuration.get("load_relatives_strategy", "join"),
|
|
155
168
|
},
|
|
156
169
|
}
|
|
157
170
|
|
|
@@ -167,7 +180,7 @@ class CategoryTree(BelongsTo):
|
|
|
167
180
|
return data
|
|
168
181
|
|
|
169
182
|
def force_tree_update(self, model):
|
|
170
|
-
self.update_tree_table(model, model.
|
|
183
|
+
self.update_tree_table(model, model.get(self.id_column_name), model.__getattr__(self.name))
|
|
171
184
|
|
|
172
185
|
def update_tree_table(self, model, child_id, direct_parent_id):
|
|
173
186
|
tree_models = self.tree_models
|
|
@@ -224,3 +237,68 @@ class CategoryTree(BelongsTo):
|
|
|
224
237
|
+ "You may have accidentally created a circular cateogry tree. If not, and your category tree "
|
|
225
238
|
+ "really _is_ that deep, then adjust the 'max_iterations' configuration for this column accordingly. "
|
|
226
239
|
)
|
|
240
|
+
|
|
241
|
+
def can_provide(self, column_name):
|
|
242
|
+
return column_name in [
|
|
243
|
+
self.config("model_column_name"),
|
|
244
|
+
self.config("children_column_name"),
|
|
245
|
+
self.config("descendents_column_name"),
|
|
246
|
+
self.config("ancestors_column_name"),
|
|
247
|
+
]
|
|
248
|
+
|
|
249
|
+
def provide(self, data, column_name):
|
|
250
|
+
if column_name == self.config("model_column_name"):
|
|
251
|
+
return super().provide(data, column_name)
|
|
252
|
+
|
|
253
|
+
if column_name == self.config("children_column_name"):
|
|
254
|
+
return self.relatives(data)
|
|
255
|
+
|
|
256
|
+
if column_name == self.config("descendents_column_name"):
|
|
257
|
+
return self.relatives(data, include_all=True)
|
|
258
|
+
|
|
259
|
+
if column_name == self.config("ancestors_column_name"):
|
|
260
|
+
return self.relatives(data, find_parents=True)
|
|
261
|
+
|
|
262
|
+
def relatives(self, data, include_all=False, find_parents=False):
|
|
263
|
+
id_column_name = self.model_class.id_column_name
|
|
264
|
+
model_id = data[self.model_class.id_column_name]
|
|
265
|
+
model_table_name = self.model_class.table_name()
|
|
266
|
+
tree_table_name = self.config("tree_models_class").table_name()
|
|
267
|
+
parent_id_column_name = self.config("tree_parent_id_column_name")
|
|
268
|
+
child_id_column_name = self.config("tree_child_id_column_name")
|
|
269
|
+
is_parent_column_name = self.config("is_parent_column_name")
|
|
270
|
+
level_column_name = self.config("tree_level_column_name")
|
|
271
|
+
|
|
272
|
+
if find_parents:
|
|
273
|
+
join_on = parent_id_column_name
|
|
274
|
+
search_on = child_id_column_name
|
|
275
|
+
else:
|
|
276
|
+
join_on = child_id_column_name
|
|
277
|
+
search_on = parent_id_column_name
|
|
278
|
+
|
|
279
|
+
# if we can join then use a join.
|
|
280
|
+
if self.config("load_relatives_strategy") == "join":
|
|
281
|
+
relatives = self.parent_models.join(
|
|
282
|
+
f"{tree_table_name} as tree on tree.{join_on}={model_table_name}.{id_column_name}"
|
|
283
|
+
)
|
|
284
|
+
relatives = relatives.where(f"tree.{search_on}={model_id}")
|
|
285
|
+
if not include_all:
|
|
286
|
+
relatives = relatives.where(f"tree.{is_parent_column_name}=1")
|
|
287
|
+
if find_parents:
|
|
288
|
+
relatives = relatives.sort_by(level_column_name, "asc")
|
|
289
|
+
return relatives
|
|
290
|
+
|
|
291
|
+
# joins only work for SQL-like backends. Otherwise, we have to pull out our list of ids
|
|
292
|
+
branches = self.tree_models.where(f"{search_on}={model_id}")
|
|
293
|
+
if not include_all:
|
|
294
|
+
branches = branches.where(f"tree.{is_parent_column_name}=1")
|
|
295
|
+
if find_parents:
|
|
296
|
+
branches = branches.sort_by(level_column_name, "asc")
|
|
297
|
+
ids = [str(branch.get(child_id_column_name)) for branch in branches]
|
|
298
|
+
|
|
299
|
+
# Can we search with a WHERE IN() clause? If the backend supports it, it is probably faster
|
|
300
|
+
if self.config("load_relatives_strategy") == "where_in":
|
|
301
|
+
return self.parent_models.where(f"{id_column_name} IN ('" + "','".join(ids) + "')")
|
|
302
|
+
|
|
303
|
+
# otherwise we have to load each model individually which is SLOW....
|
|
304
|
+
return [self.parent_models.find(f"{id_column_name}={id}") for id in ids]
|
|
@@ -5,6 +5,11 @@ from .functional import string
|
|
|
5
5
|
import re
|
|
6
6
|
from .models import Models
|
|
7
7
|
|
|
8
|
+
try:
|
|
9
|
+
from typing_extensions import Self
|
|
10
|
+
except ModuleNotFoundError:
|
|
11
|
+
from typing import Self
|
|
12
|
+
|
|
8
13
|
|
|
9
14
|
class Model(Models):
|
|
10
15
|
_configured_columns = None
|
|
@@ -14,14 +19,14 @@ class Model(Models):
|
|
|
14
19
|
_transformed = None
|
|
15
20
|
id_column_name = "id"
|
|
16
21
|
|
|
17
|
-
def __init__(self, backend, columns):
|
|
22
|
+
def __init__(self: Self, backend, columns):
|
|
18
23
|
super().__init__(backend, columns)
|
|
19
24
|
self._transformed = {}
|
|
20
25
|
self._data = {}
|
|
21
26
|
self._previous_data = None
|
|
22
27
|
self._touched_columns = None
|
|
23
28
|
|
|
24
|
-
def model_class(self):
|
|
29
|
+
def model_class(self: Self) -> type[Self]:
|
|
25
30
|
"""
|
|
26
31
|
Return the model class that this models object will find/return instances of
|
|
27
32
|
|
|
@@ -30,7 +35,7 @@ class Model(Models):
|
|
|
30
35
|
return self.__class__
|
|
31
36
|
|
|
32
37
|
@classmethod
|
|
33
|
-
def table_name(cls):
|
|
38
|
+
def table_name(cls: type[Self]) -> str:
|
|
34
39
|
"""Return the name of the table that the model uses for data storage"""
|
|
35
40
|
singular = string.camel_case_to_snake_case(cls.__name__)
|
|
36
41
|
if singular[-1] == "y":
|
|
@@ -40,16 +45,16 @@ class Model(Models):
|
|
|
40
45
|
return f"{singular}s"
|
|
41
46
|
|
|
42
47
|
@abstractmethod
|
|
43
|
-
def columns_configuration(self):
|
|
48
|
+
def columns_configuration(self: Self):
|
|
44
49
|
"""Returns an ordered dictionary with the configuration for the columns"""
|
|
45
50
|
pass
|
|
46
51
|
|
|
47
|
-
def all_columns(self):
|
|
52
|
+
def all_columns(self: Self):
|
|
48
53
|
default = OrderedDict([(self.id_column_name, {"class": UUID})])
|
|
49
54
|
default.update(self.columns_configuration())
|
|
50
55
|
return default
|
|
51
56
|
|
|
52
|
-
def columns(self, overrides=None):
|
|
57
|
+
def columns(self: Self, overrides=None):
|
|
53
58
|
# no caching if we have overrides
|
|
54
59
|
if overrides is not None:
|
|
55
60
|
return self._columns.configure(self.all_columns(), self.__class__, overrides=overrides)
|
|
@@ -58,13 +63,13 @@ class Model(Models):
|
|
|
58
63
|
self._configured_columns = self._columns.configure(self.all_columns(), self.__class__)
|
|
59
64
|
return self._configured_columns
|
|
60
65
|
|
|
61
|
-
def supports_n_plus_one(self):
|
|
66
|
+
def supports_n_plus_one(self: Self):
|
|
62
67
|
return self._backend.supports_n_plus_one
|
|
63
68
|
|
|
64
|
-
def __getitem__(self, column_name):
|
|
69
|
+
def __getitem__(self: Self, column_name):
|
|
65
70
|
return self.__getattr__(column_name)
|
|
66
71
|
|
|
67
|
-
def __getattr__(self, column_name):
|
|
72
|
+
def __getattr__(self: Self, column_name):
|
|
68
73
|
# this should be adjusted to only return None for empty records if the column name corresponds
|
|
69
74
|
# to an actual column in the table.
|
|
70
75
|
if not self.exists:
|
|
@@ -72,13 +77,13 @@ class Model(Models):
|
|
|
72
77
|
|
|
73
78
|
return self.get_transformed_from_data(column_name, self._data)
|
|
74
79
|
|
|
75
|
-
def get(self, column_name, silent=False):
|
|
80
|
+
def get(self: Self, column_name, silent=False):
|
|
76
81
|
if not self.exists:
|
|
77
82
|
return None
|
|
78
83
|
|
|
79
84
|
return self.get_transformed_from_data(column_name, self._data, silent=silent)
|
|
80
85
|
|
|
81
|
-
def get_transformed_from_data(self, column_name, data, cache=True, check_providers=True, silent=False):
|
|
86
|
+
def get_transformed_from_data(self: Self, column_name, data, cache=True, check_providers=True, silent=False):
|
|
82
87
|
if cache and column_name in self._transformed:
|
|
83
88
|
return self._transformed[column_name]
|
|
84
89
|
|
|
@@ -111,18 +116,18 @@ class Model(Models):
|
|
|
111
116
|
return value
|
|
112
117
|
|
|
113
118
|
@property
|
|
114
|
-
def exists(self):
|
|
119
|
+
def exists(self: Self) -> bool:
|
|
115
120
|
return True if (self.id_column_name in self._data and self._data[self.id_column_name]) else False
|
|
116
121
|
|
|
117
122
|
@property
|
|
118
|
-
def data(self):
|
|
123
|
+
def data(self: Self):
|
|
119
124
|
return self._data
|
|
120
125
|
|
|
121
126
|
@data.setter
|
|
122
|
-
def data(self, data):
|
|
127
|
+
def data(self: Self, data) -> None:
|
|
123
128
|
self._data = {} if data is None else data
|
|
124
129
|
|
|
125
|
-
def save(self, data, columns=None):
|
|
130
|
+
def save(self: Self, data, columns=None) -> bool:
|
|
126
131
|
"""
|
|
127
132
|
Save data to the database and update the model!
|
|
128
133
|
|
|
@@ -168,7 +173,7 @@ class Model(Models):
|
|
|
168
173
|
|
|
169
174
|
return True
|
|
170
175
|
|
|
171
|
-
def is_changing(self, key, data):
|
|
176
|
+
def is_changing(self: Self, key, data) -> bool:
|
|
172
177
|
"""
|
|
173
178
|
Returns True/False to denote if the given column is being modified by the active save operation
|
|
174
179
|
|
|
@@ -184,7 +189,7 @@ class Model(Models):
|
|
|
184
189
|
|
|
185
190
|
return self.__getattr__(key) != data[key]
|
|
186
191
|
|
|
187
|
-
def latest(self, key, data):
|
|
192
|
+
def latest(self: Self, key, data):
|
|
188
193
|
"""
|
|
189
194
|
Returns the 'latest' value for a column during the save operation
|
|
190
195
|
|
|
@@ -198,7 +203,7 @@ class Model(Models):
|
|
|
198
203
|
return data[key]
|
|
199
204
|
return self.__getattr__(key)
|
|
200
205
|
|
|
201
|
-
def was_changed(self, key):
|
|
206
|
+
def was_changed(self: Self, key) -> bool:
|
|
202
207
|
"""Returns True/False to denote if a column was changed in the last save"""
|
|
203
208
|
if self._previous_data is None:
|
|
204
209
|
raise ValueError("was_changed was called before a save was finished - you must save something first")
|
|
@@ -221,10 +226,10 @@ class Model(Models):
|
|
|
221
226
|
return old_value != new_value
|
|
222
227
|
return not columns[key].values_match(old_value, new_value)
|
|
223
228
|
|
|
224
|
-
def previous_value(self, key):
|
|
229
|
+
def previous_value(self: Self, key):
|
|
225
230
|
return self.get_transformed_from_data(key, self._previous_data, cache=False, check_providers=False, silent=True)
|
|
226
231
|
|
|
227
|
-
def delete(self, except_if_not_exists=True):
|
|
232
|
+
def delete(self: Self, except_if_not_exists=True) -> bool:
|
|
228
233
|
if not self.exists:
|
|
229
234
|
if except_if_not_exists:
|
|
230
235
|
raise ValueError("Cannot delete model that already exists")
|
|
@@ -240,7 +245,7 @@ class Model(Models):
|
|
|
240
245
|
self.post_delete()
|
|
241
246
|
return True
|
|
242
247
|
|
|
243
|
-
def columns_pre_save(self, data, columns):
|
|
248
|
+
def columns_pre_save(self: Self, data, columns):
|
|
244
249
|
"""Uses the column information present in the model to make any necessary changes before saving"""
|
|
245
250
|
for column in columns.values():
|
|
246
251
|
data = column.pre_save(data, self)
|
|
@@ -258,7 +263,7 @@ class Model(Models):
|
|
|
258
263
|
"""
|
|
259
264
|
return data
|
|
260
265
|
|
|
261
|
-
def columns_to_backend(self, data, columns):
|
|
266
|
+
def columns_to_backend(self: Self, data, columns):
|
|
262
267
|
backend_data = {**data}
|
|
263
268
|
temporary_data = {}
|
|
264
269
|
for column in columns.values():
|
|
@@ -275,10 +280,10 @@ class Model(Models):
|
|
|
275
280
|
|
|
276
281
|
return [backend_data, temporary_data]
|
|
277
282
|
|
|
278
|
-
def to_backend(self, data, columns):
|
|
283
|
+
def to_backend(self: Self, data, columns):
|
|
279
284
|
return data
|
|
280
285
|
|
|
281
|
-
def columns_post_save(self, data, id, columns):
|
|
286
|
+
def columns_post_save(self: Self, data, id, columns):
|
|
282
287
|
"""Uses the column information present in the model to make additional changes as needed after saving"""
|
|
283
288
|
for column in columns.values():
|
|
284
289
|
data = column.post_save(data, self, id)
|
|
@@ -288,12 +293,12 @@ class Model(Models):
|
|
|
288
293
|
)
|
|
289
294
|
return data
|
|
290
295
|
|
|
291
|
-
def columns_save_finished(self, columns):
|
|
296
|
+
def columns_save_finished(self: Self, columns):
|
|
292
297
|
"""Calls the save_finished method on all of our columns"""
|
|
293
298
|
for column in columns.values():
|
|
294
299
|
column.save_finished(self)
|
|
295
300
|
|
|
296
|
-
def post_save(self, data, id):
|
|
301
|
+
def post_save(self: Self, data, id):
|
|
297
302
|
"""
|
|
298
303
|
A hook to extend so you can provide additional pre-save logic as needed
|
|
299
304
|
|
|
@@ -302,7 +307,7 @@ class Model(Models):
|
|
|
302
307
|
"""
|
|
303
308
|
pass
|
|
304
309
|
|
|
305
|
-
def pre_save(self, data):
|
|
310
|
+
def pre_save(self: Self, data):
|
|
306
311
|
"""
|
|
307
312
|
A hook to extend so you can provide additional pre-save logic as needed
|
|
308
313
|
|
|
@@ -310,7 +315,7 @@ class Model(Models):
|
|
|
310
315
|
"""
|
|
311
316
|
return data
|
|
312
317
|
|
|
313
|
-
def save_finished(self):
|
|
318
|
+
def save_finished(self: Self):
|
|
314
319
|
"""
|
|
315
320
|
A hook to extend so you can provide additional logic after a save operation has fully completed
|
|
316
321
|
|
|
@@ -320,29 +325,29 @@ class Model(Models):
|
|
|
320
325
|
"""
|
|
321
326
|
pass
|
|
322
327
|
|
|
323
|
-
def columns_pre_delete(self, columns):
|
|
328
|
+
def columns_pre_delete(self: Self, columns):
|
|
324
329
|
"""Uses the column information present in the model to make any necessary changes before deleting"""
|
|
325
330
|
for column in columns.values():
|
|
326
331
|
column.pre_delete(self)
|
|
327
332
|
|
|
328
|
-
def pre_delete(self):
|
|
333
|
+
def pre_delete(self: Self):
|
|
329
334
|
"""
|
|
330
335
|
A hook to extend so you can provide additional pre-delete logic as needed
|
|
331
336
|
"""
|
|
332
337
|
pass
|
|
333
338
|
|
|
334
|
-
def columns_post_delete(self, columns):
|
|
339
|
+
def columns_post_delete(self: Self, columns):
|
|
335
340
|
"""Uses the column information present in the model to make any necessary changes after deleting"""
|
|
336
341
|
for column in columns.values():
|
|
337
342
|
column.post_delete(self)
|
|
338
343
|
|
|
339
|
-
def post_delete(self):
|
|
344
|
+
def post_delete(self: Self):
|
|
340
345
|
"""
|
|
341
346
|
A hook to extend so you can provide additional post-delete logic as needed
|
|
342
347
|
"""
|
|
343
348
|
pass
|
|
344
349
|
|
|
345
|
-
def where_for_request(self, models, routing_data, authorization_data, input_output, overrides=None):
|
|
350
|
+
def where_for_request(self: Self, models, routing_data, authorization_data, input_output, overrides=None):
|
|
346
351
|
"""
|
|
347
352
|
A hook to automatically apply filtering whenever the model makes an appearance in a get/update/list/search handler.
|
|
348
353
|
"""
|