clear-skies 2.0.27__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.
Potentially problematic release.
This version of clear-skies might be problematic. Click here for more details.
- clear_skies-2.0.27.dist-info/METADATA +78 -0
- clear_skies-2.0.27.dist-info/RECORD +270 -0
- clear_skies-2.0.27.dist-info/WHEEL +4 -0
- clear_skies-2.0.27.dist-info/licenses/LICENSE +7 -0
- clearskies/__init__.py +69 -0
- clearskies/action.py +7 -0
- clearskies/authentication/__init__.py +15 -0
- clearskies/authentication/authentication.py +44 -0
- clearskies/authentication/authorization.py +23 -0
- clearskies/authentication/authorization_pass_through.py +22 -0
- clearskies/authentication/jwks.py +165 -0
- clearskies/authentication/public.py +5 -0
- clearskies/authentication/secret_bearer.py +551 -0
- clearskies/autodoc/__init__.py +8 -0
- clearskies/autodoc/formats/__init__.py +5 -0
- clearskies/autodoc/formats/oai3_json/__init__.py +7 -0
- clearskies/autodoc/formats/oai3_json/oai3_json.py +87 -0
- clearskies/autodoc/formats/oai3_json/oai3_schema_resolver.py +15 -0
- clearskies/autodoc/formats/oai3_json/parameter.py +35 -0
- clearskies/autodoc/formats/oai3_json/request.py +68 -0
- clearskies/autodoc/formats/oai3_json/response.py +28 -0
- clearskies/autodoc/formats/oai3_json/schema/__init__.py +11 -0
- clearskies/autodoc/formats/oai3_json/schema/array.py +9 -0
- clearskies/autodoc/formats/oai3_json/schema/default.py +13 -0
- clearskies/autodoc/formats/oai3_json/schema/enum.py +7 -0
- clearskies/autodoc/formats/oai3_json/schema/object.py +35 -0
- clearskies/autodoc/formats/oai3_json/test.json +1985 -0
- clearskies/autodoc/py.typed +0 -0
- clearskies/autodoc/request/__init__.py +15 -0
- clearskies/autodoc/request/header.py +6 -0
- clearskies/autodoc/request/json_body.py +6 -0
- clearskies/autodoc/request/parameter.py +8 -0
- clearskies/autodoc/request/request.py +47 -0
- clearskies/autodoc/request/url_parameter.py +6 -0
- clearskies/autodoc/request/url_path.py +6 -0
- clearskies/autodoc/response/__init__.py +5 -0
- clearskies/autodoc/response/response.py +9 -0
- clearskies/autodoc/schema/__init__.py +31 -0
- clearskies/autodoc/schema/array.py +10 -0
- clearskies/autodoc/schema/base64.py +8 -0
- clearskies/autodoc/schema/boolean.py +5 -0
- clearskies/autodoc/schema/date.py +5 -0
- clearskies/autodoc/schema/datetime.py +5 -0
- clearskies/autodoc/schema/double.py +5 -0
- clearskies/autodoc/schema/enum.py +17 -0
- clearskies/autodoc/schema/integer.py +6 -0
- clearskies/autodoc/schema/long.py +5 -0
- clearskies/autodoc/schema/number.py +6 -0
- clearskies/autodoc/schema/object.py +13 -0
- clearskies/autodoc/schema/password.py +5 -0
- clearskies/autodoc/schema/schema.py +11 -0
- clearskies/autodoc/schema/string.py +5 -0
- clearskies/backends/__init__.py +67 -0
- clearskies/backends/api_backend.py +1194 -0
- clearskies/backends/backend.py +137 -0
- clearskies/backends/cursor_backend.py +339 -0
- clearskies/backends/graphql_backend.py +977 -0
- clearskies/backends/memory_backend.py +794 -0
- clearskies/backends/secrets_backend.py +100 -0
- clearskies/clients/__init__.py +5 -0
- clearskies/clients/graphql_client.py +182 -0
- 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 +145 -0
- clearskies/columns/belongs_to_self.py +109 -0
- clearskies/columns/boolean.py +110 -0
- clearskies/columns/category_tree.py +274 -0
- clearskies/columns/category_tree_ancestors.py +51 -0
- clearskies/columns/category_tree_children.py +125 -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 +552 -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 +281 -0
- clearskies/columns/many_to_many_models.py +163 -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 +11 -0
- clearskies/contexts/cli.py +130 -0
- clearskies/contexts/context.py +99 -0
- clearskies/contexts/wsgi.py +79 -0
- clearskies/contexts/wsgi_ref.py +87 -0
- clearskies/cursors/__init__.py +10 -0
- clearskies/cursors/cursor.py +161 -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 +15 -0
- clearskies/di/additional_config.py +130 -0
- clearskies/di/additional_config_auto_import.py +17 -0
- clearskies/di/di.py +948 -0
- clearskies/di/inject/__init__.py +25 -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/logger.py +16 -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 +106 -0
- clearskies/exceptions/__init__.py +19 -0
- clearskies/exceptions/authentication.py +2 -0
- clearskies/exceptions/authorization.py +2 -0
- clearskies/exceptions/client_error.py +2 -0
- clearskies/exceptions/input_errors.py +4 -0
- clearskies/exceptions/missing_dependency.py +2 -0
- clearskies/exceptions/moved_permanently.py +3 -0
- clearskies/exceptions/moved_temporarily.py +3 -0
- clearskies/exceptions/not_found.py +2 -0
- clearskies/functional/__init__.py +7 -0
- clearskies/functional/json.py +47 -0
- clearskies/functional/routing.py +92 -0
- clearskies/functional/string.py +112 -0
- clearskies/functional/validations.py +76 -0
- clearskies/input_outputs/__init__.py +13 -0
- clearskies/input_outputs/cli.py +157 -0
- clearskies/input_outputs/exceptions/__init__.py +7 -0
- clearskies/input_outputs/exceptions/cli_input_error.py +2 -0
- clearskies/input_outputs/exceptions/cli_not_found.py +2 -0
- clearskies/input_outputs/headers.py +54 -0
- clearskies/input_outputs/input_output.py +116 -0
- clearskies/input_outputs/programmatic.py +62 -0
- clearskies/input_outputs/py.typed +0 -0
- clearskies/input_outputs/wsgi.py +80 -0
- clearskies/loggable.py +19 -0
- clearskies/model.py +2039 -0
- clearskies/py.typed +0 -0
- clearskies/query/__init__.py +12 -0
- clearskies/query/condition.py +228 -0
- clearskies/query/join.py +136 -0
- clearskies/query/query.py +195 -0
- clearskies/query/sort.py +27 -0
- clearskies/schema.py +82 -0
- clearskies/secrets/__init__.py +7 -0
- clearskies/secrets/additional_configs/__init__.py +32 -0
- clearskies/secrets/additional_configs/mysql_connection_dynamic_producer.py +61 -0
- clearskies/secrets/additional_configs/mysql_connection_dynamic_producer_via_ssh_cert_bastion.py +160 -0
- clearskies/secrets/akeyless.py +507 -0
- clearskies/secrets/exceptions/__init__.py +7 -0
- clearskies/secrets/exceptions/not_found_error.py +2 -0
- clearskies/secrets/exceptions/permissions_error.py +2 -0
- clearskies/secrets/secrets.py +39 -0
- clearskies/security_header.py +17 -0
- clearskies/security_headers/__init__.py +11 -0
- clearskies/security_headers/cache_control.py +68 -0
- clearskies/security_headers/cors.py +51 -0
- clearskies/security_headers/csp.py +95 -0
- clearskies/security_headers/hsts.py +23 -0
- clearskies/security_headers/x_content_type_options.py +0 -0
- clearskies/security_headers/x_frame_options.py +0 -0
- 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/validators/required.py +32 -0
- clearskies/validators/timedelta.py +58 -0
- clearskies/validators/unique.py +28 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from clearskies.configs import config
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class AnyDict(config.Config):
|
|
9
|
+
def __set__(self, instance, value: dict[str, Any]):
|
|
10
|
+
if not isinstance(value, dict):
|
|
11
|
+
error_prefix = self._error_prefix(instance)
|
|
12
|
+
raise TypeError(
|
|
13
|
+
f"{error_prefix} attempt to set a value of type '{value.__class__.__name__}' to a parameter that requries a dictionary."
|
|
14
|
+
)
|
|
15
|
+
for key in value.keys():
|
|
16
|
+
if not isinstance(key, str):
|
|
17
|
+
error_prefix = self._error_prefix(instance)
|
|
18
|
+
raise TypeError(f"{error_prefix} attempt to set a dictionary with a non-string key.")
|
|
19
|
+
instance._set_config(self, value)
|
|
20
|
+
|
|
21
|
+
def __get__(self, instance, parent) -> dict[str, Any]:
|
|
22
|
+
if not instance:
|
|
23
|
+
return self # type: ignore
|
|
24
|
+
return instance._get_config(self)
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any, Callable
|
|
4
|
+
|
|
5
|
+
from clearskies.configs import config
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class AnyDictOrCallable(config.Config):
|
|
9
|
+
def __set__(self, instance, value: dict[str, Any] | Callable[..., dict[str, Any]]):
|
|
10
|
+
if not isinstance(value, dict) and not callable(value):
|
|
11
|
+
error_prefix = self._error_prefix(instance)
|
|
12
|
+
raise TypeError(
|
|
13
|
+
f"{error_prefix} attempt to set a value of type '{value.__class__.__name__}' to a parameter that requries a dictionary or a callable."
|
|
14
|
+
)
|
|
15
|
+
if isinstance(value, dict):
|
|
16
|
+
for key, val in value.items():
|
|
17
|
+
if not isinstance(key, str):
|
|
18
|
+
error_prefix = self._error_prefix(instance)
|
|
19
|
+
raise TypeError(f"{error_prefix} attempt to set a dictionary with a non-string key.")
|
|
20
|
+
instance._set_config(self, value)
|
|
21
|
+
|
|
22
|
+
def __get__(self, instance, parent) -> dict[str, Any] | Callable[..., dict[str, Any]]:
|
|
23
|
+
if not instance:
|
|
24
|
+
return self # type: ignore
|
|
25
|
+
return instance._get_config(self)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
from clearskies.configs import config
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from clearskies.authentication import Authentication as AuthenticationType
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class Authentication(config.Config):
|
|
12
|
+
def __set__(self, instance, value: AuthenticationType):
|
|
13
|
+
if not hasattr(value, "authenticate"):
|
|
14
|
+
error_prefix = self._error_prefix(instance)
|
|
15
|
+
raise TypeError(
|
|
16
|
+
f"{error_prefix} attempt to set a value of type '{value.__class__.__name__}' to parameter that requires an instance of clearskies.authentication.Authentication."
|
|
17
|
+
)
|
|
18
|
+
instance._set_config(self, value)
|
|
19
|
+
|
|
20
|
+
def __get__(self, instance, parent) -> AuthenticationType:
|
|
21
|
+
if not instance:
|
|
22
|
+
return self # type: ignore
|
|
23
|
+
return instance._get_config(self)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
from clearskies.configs import config
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from clearskies.authentication import Authorization as AuthorizationType
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class Authorization(config.Config):
|
|
12
|
+
def __set__(self, instance, value: AuthorizationType):
|
|
13
|
+
if not hasattr(value, "gate"):
|
|
14
|
+
error_prefix = self._error_prefix(instance)
|
|
15
|
+
raise TypeError(
|
|
16
|
+
f"{error_prefix} attempt to set a value of type '{value.__class__.__name__}' to parameter that requires an instance of clearskies.authentication.Authorization."
|
|
17
|
+
)
|
|
18
|
+
instance._set_config(self, value)
|
|
19
|
+
|
|
20
|
+
def __get__(self, instance, parent) -> AuthorizationType:
|
|
21
|
+
if not instance:
|
|
22
|
+
return self # type: ignore
|
|
23
|
+
return instance._get_config(self)
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from clearskies.configs import config
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Boolean(config.Config):
|
|
7
|
+
def __set__(self, instance, value: bool):
|
|
8
|
+
if not isinstance(value, bool):
|
|
9
|
+
error_prefix = self._error_prefix(instance)
|
|
10
|
+
raise TypeError(
|
|
11
|
+
f"{error_prefix} attempt to set a value of type '{value.__class__.__name__}' to a parameter that requries a boolean."
|
|
12
|
+
)
|
|
13
|
+
instance._set_config(self, value)
|
|
14
|
+
|
|
15
|
+
def __get__(self, instance, parent) -> bool:
|
|
16
|
+
if not instance:
|
|
17
|
+
return self # type: ignore
|
|
18
|
+
return instance._get_config(self)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Callable
|
|
4
|
+
|
|
5
|
+
from clearskies.configs import config
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class BooleanOrCallable(config.Config):
|
|
9
|
+
def __set__(self, instance, value: bool | Callable[..., bool]):
|
|
10
|
+
if not isinstance(value, bool) and not callable(value):
|
|
11
|
+
error_prefix = self._error_prefix(instance)
|
|
12
|
+
raise TypeError(
|
|
13
|
+
f"{error_prefix} attempt to set a value of type '{value.__class__.__name__}' to a parameter that requries a boolean or a callable."
|
|
14
|
+
)
|
|
15
|
+
instance._set_config(self, value)
|
|
16
|
+
|
|
17
|
+
def __get__(self, instance, parent) -> bool | Callable[..., bool]:
|
|
18
|
+
if not instance:
|
|
19
|
+
return self # type: ignore
|
|
20
|
+
return instance._get_config(self)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Callable as CallableType
|
|
4
|
+
|
|
5
|
+
from clearskies.configs import config
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Callable(config.Config):
|
|
9
|
+
def __set__(self, instance, value: CallableType):
|
|
10
|
+
if value is not None and not callable(value):
|
|
11
|
+
error_prefix = self._error_prefix(instance)
|
|
12
|
+
raise TypeError(
|
|
13
|
+
f"{error_prefix} attempt to set a value of type '{value.__class__.__name__}' to a parameter that requries a Callable."
|
|
14
|
+
)
|
|
15
|
+
instance._set_config(self, value)
|
|
16
|
+
|
|
17
|
+
def __get__(self, instance, parent) -> CallableType | None:
|
|
18
|
+
if not instance:
|
|
19
|
+
return self # type: ignore
|
|
20
|
+
return instance._get_config(self)
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
from clearskies.configs import config
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from clearskies.column import Column
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class Columns(config.Config):
|
|
12
|
+
"""This is for a configuration that should be a dictionary of columns with the key being the column name."""
|
|
13
|
+
|
|
14
|
+
def __set__(self, instance, value: dict[str, Column]):
|
|
15
|
+
if value is None:
|
|
16
|
+
return
|
|
17
|
+
|
|
18
|
+
if not isinstance(value, dict):
|
|
19
|
+
error_prefix = self._error_prefix(instance)
|
|
20
|
+
raise TypeError(
|
|
21
|
+
f"{error_prefix} attempt to set a value of type '{value.__class__.__name__}' to a dictionary with columns"
|
|
22
|
+
)
|
|
23
|
+
for index, item in enumerate(value.values()):
|
|
24
|
+
if not hasattr(item, "on_change_pre_save"):
|
|
25
|
+
error_prefix = self._error_prefix(instance)
|
|
26
|
+
raise TypeError(
|
|
27
|
+
f"{error_prefix} attempt to set a value of type '{item.__class__.__name__}' for item #{index + 1}. A column was expected."
|
|
28
|
+
)
|
|
29
|
+
instance._set_config(self, value)
|
|
30
|
+
|
|
31
|
+
def __get__(self, instance, parent) -> dict[str, Column]:
|
|
32
|
+
if not instance:
|
|
33
|
+
return self # type: ignore
|
|
34
|
+
return instance._get_config(self)
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
from clearskies.configs import config
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from clearskies import typing
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class Conditions(config.Config):
|
|
12
|
+
def __set__(self, instance, value: typing.condition | list[typing.condition]):
|
|
13
|
+
if not isinstance(value, list):
|
|
14
|
+
value = [value]
|
|
15
|
+
|
|
16
|
+
for index, item in enumerate(value):
|
|
17
|
+
if callable(item) or isinstance(item, str) or hasattr(item, "_raw_condition"):
|
|
18
|
+
continue
|
|
19
|
+
|
|
20
|
+
error_prefix = self._error_prefix(instance)
|
|
21
|
+
raise TypeError(
|
|
22
|
+
f"{error_prefix} attempt to set a value of type '{item.__class__.__name__}' for item #{index + 1} when a string, condition, callable is required" # type: ignore
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
instance._set_config(self, [*value])
|
|
26
|
+
|
|
27
|
+
def __get__(self, instance, parent) -> list[typing.condition]:
|
|
28
|
+
if not instance:
|
|
29
|
+
return self # type: ignore
|
|
30
|
+
return instance._get_config(self)
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Config:
|
|
7
|
+
def __init__(self, required: bool = False, default: Any = None):
|
|
8
|
+
self.required = required
|
|
9
|
+
self.default = default
|
|
10
|
+
|
|
11
|
+
def _error_prefix(self, instance) -> str:
|
|
12
|
+
name = instance._descriptor_to_name(self)
|
|
13
|
+
class_name = instance.__class__.__name__
|
|
14
|
+
return f"Error with '{class_name}.{name}':"
|
|
15
|
+
|
|
16
|
+
def finalize_and_validate_configuration(self, instance):
|
|
17
|
+
if self.default:
|
|
18
|
+
try:
|
|
19
|
+
instance._get_config(self)
|
|
20
|
+
except KeyError:
|
|
21
|
+
instance._set_config(self.default)
|
|
22
|
+
|
|
23
|
+
if self.required and instance._get_config(self) is None:
|
|
24
|
+
name = instance._descriptor_to_name(self)
|
|
25
|
+
prefix = self._error_prefix(instance)
|
|
26
|
+
raise ValueError("{prefix} {name} is a required configuration setting, but no value was set")
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import datetime
|
|
4
|
+
|
|
5
|
+
from clearskies.configs import config
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Datetime(config.Config):
|
|
9
|
+
def __set__(self, instance, value: datetime.datetime):
|
|
10
|
+
if not isinstance(value, datetime.datetime):
|
|
11
|
+
error_prefix = self._error_prefix(instance)
|
|
12
|
+
raise TypeError(
|
|
13
|
+
f"{error_prefix} attempt to set a value of type '{value.__class__.__name__}' to a parameter that requries a datetime object."
|
|
14
|
+
)
|
|
15
|
+
instance._set_config(self, value)
|
|
16
|
+
|
|
17
|
+
def __get__(self, instance, parent) -> datetime.datetime:
|
|
18
|
+
if not instance:
|
|
19
|
+
return self # type: ignore
|
|
20
|
+
return instance._get_config(self)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import datetime
|
|
4
|
+
from typing import Callable
|
|
5
|
+
|
|
6
|
+
from clearskies.configs import config
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class DatetimeOrCallable(config.Config):
|
|
10
|
+
def __set__(self, instance, value: datetime.datetime | Callable[..., datetime.datetime]):
|
|
11
|
+
if not isinstance(value, datetime.datetime) and not callable(value):
|
|
12
|
+
error_prefix = self._error_prefix(instance)
|
|
13
|
+
raise TypeError(
|
|
14
|
+
f"{error_prefix} attempt to set a value of type '{value.__class__.__name__}' to a parameter that requries a datetime object or a callable."
|
|
15
|
+
)
|
|
16
|
+
instance._set_config(self, value)
|
|
17
|
+
|
|
18
|
+
def __get__(self, instance, parent) -> datetime.datetime | Callable[..., datetime.datetime]:
|
|
19
|
+
if not instance:
|
|
20
|
+
return self # type: ignore
|
|
21
|
+
return instance._get_config(self)
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from clearskies.configs import string
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Email(string.String):
|
|
7
|
+
def __init__(
|
|
8
|
+
self, required=False, default=None, regexp: str = r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)"
|
|
9
|
+
):
|
|
10
|
+
super().__init__(required=required, default=default, regexp=regexp)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from clearskies.configs import string_list
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class EmailList(string_list.StringList):
|
|
7
|
+
"""
|
|
8
|
+
This is for a configuration that should be a list of strings in email format.
|
|
9
|
+
|
|
10
|
+
This is different than StringList, which also accepts a list of strings, but
|
|
11
|
+
validates that all of those values match the required format.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
def __init__(
|
|
15
|
+
self, required=False, default=None, regexp: str = r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)"
|
|
16
|
+
):
|
|
17
|
+
super().__init__(required=required, default=default, regexp=regexp)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from clearskies.configs import string_list_or_callable
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class EmailListOrCallable(string_list_or_callable.StringListOrCallable):
|
|
7
|
+
"""
|
|
8
|
+
This is for a configuration that should be a list of emails or a callable that returns a list of emails.
|
|
9
|
+
|
|
10
|
+
This is different than StringList, which also accepts a list of strings, but
|
|
11
|
+
validates that all of those values match the email format.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
def __init__(
|
|
15
|
+
self, required=False, default=None, regexp: str = r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)"
|
|
16
|
+
):
|
|
17
|
+
super().__init__(required=required, default=default, regexp=regexp)
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Callable
|
|
4
|
+
|
|
5
|
+
from clearskies.configs import config
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class EmailOrEmailListOrCallable(config.Config):
|
|
9
|
+
"""
|
|
10
|
+
This is for a configuration that should be an email or a list of emails or a callable that returns a list of emails.
|
|
11
|
+
|
|
12
|
+
This is a combination of Email and EmailListOrCallable.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
def __init__(
|
|
16
|
+
self, required=False, default=None, regexp: str = r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)"
|
|
17
|
+
):
|
|
18
|
+
self.required = required
|
|
19
|
+
self.default = default
|
|
20
|
+
self.regexp = regexp
|
|
21
|
+
|
|
22
|
+
def __set__(self, instance, value: str | list[str] | Callable[..., list[str]]):
|
|
23
|
+
if value is None:
|
|
24
|
+
return
|
|
25
|
+
if self.regexp:
|
|
26
|
+
import re
|
|
27
|
+
if isinstance(value, str):
|
|
28
|
+
if self.regexp and not re.match(self.regexp, value):
|
|
29
|
+
error_prefix = self._error_prefix(instance)
|
|
30
|
+
raise ValueError(
|
|
31
|
+
f"{error_prefix} attempt to set a value of '{value}' but this does not match the required regexp: '{self.regexp}'."
|
|
32
|
+
)
|
|
33
|
+
value = [value]
|
|
34
|
+
elif not isinstance(value, list) and not callable(value):
|
|
35
|
+
error_prefix = self._error_prefix(instance)
|
|
36
|
+
raise TypeError(
|
|
37
|
+
f"{error_prefix} attempt to set a value of type '{value.__class__.__name__}' to a parameter that should be a list or a callable"
|
|
38
|
+
)
|
|
39
|
+
if isinstance(value, list):
|
|
40
|
+
if self.regexp:
|
|
41
|
+
import re
|
|
42
|
+
|
|
43
|
+
for index, item in enumerate(value):
|
|
44
|
+
if not isinstance(item, str):
|
|
45
|
+
error_prefix = self._error_prefix(instance)
|
|
46
|
+
raise TypeError(
|
|
47
|
+
f"{error_prefix} attempt to set a value of type '{item.__class__.__name__}' for item #{index + 1}. A string was expected."
|
|
48
|
+
)
|
|
49
|
+
if not re.match(self.regexp, item):
|
|
50
|
+
error_prefix = self._error_prefix(instance)
|
|
51
|
+
raise ValueError(
|
|
52
|
+
f"{error_prefix} attempt to set a value of '{item}' for item #{index + 1} but this does not match the required regexp: '{self.regexp}'."
|
|
53
|
+
)
|
|
54
|
+
instance._set_config(self, value)
|
|
55
|
+
|
|
56
|
+
def __get__(self, instance, parent) -> list[str] | Callable[..., list[str]]:
|
|
57
|
+
if not instance:
|
|
58
|
+
return self # type: ignore
|
|
59
|
+
return instance._get_config(self)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
from clearskies.configs import config
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from clearskies.endpoint import Endpoint as EndpointBase
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class Endpoint(config.Config):
|
|
12
|
+
def __set__(self, instance, value: EndpointBase):
|
|
13
|
+
if not hasattr(value, "success"):
|
|
14
|
+
error_prefix = self._error_prefix(instance)
|
|
15
|
+
raise TypeError(
|
|
16
|
+
f"{error_prefix} attempt to set a value of type '{value.__class__.__name__}' to a parameter that requries an endpoint."
|
|
17
|
+
)
|
|
18
|
+
instance._set_config(self, value)
|
|
19
|
+
|
|
20
|
+
def __get__(self, instance, parent) -> EndpointBase:
|
|
21
|
+
if not instance:
|
|
22
|
+
return self # type: ignore
|
|
23
|
+
return instance._get_config(self)
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
from clearskies.configs import config
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from clearskies.endpoint import Endpoint as EndpointBase
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class EndpointList(config.Config):
|
|
12
|
+
def __set__(self, instance, value: list[EndpointBase]):
|
|
13
|
+
if not isinstance(value, list):
|
|
14
|
+
error_prefix = self._error_prefix(instance)
|
|
15
|
+
raise TypeError(
|
|
16
|
+
f"{error_prefix} attempt to set a value of type '{value.__class__.__name__}' to a parameter that requries a list of endpoints."
|
|
17
|
+
)
|
|
18
|
+
for index, item in enumerate(value):
|
|
19
|
+
if not hasattr(item, "top_level_authentication_and_authorization"):
|
|
20
|
+
error_prefix = self._error_prefix(instance)
|
|
21
|
+
raise TypeError(
|
|
22
|
+
f"{error_prefix} attempt to set a value of type '{item.__class__.__name__}' for item #{index + 1} when all items in the list should be instances of clearskies.End."
|
|
23
|
+
)
|
|
24
|
+
instance._set_config(self, value)
|
|
25
|
+
|
|
26
|
+
def __get__(self, instance, parent) -> list[EndpointBase]:
|
|
27
|
+
if not instance:
|
|
28
|
+
return self # type: ignore
|
|
29
|
+
return instance._get_config(self)
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from clearskies.configs import config
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Float(config.Config):
|
|
7
|
+
def __set__(self, instance, value: float):
|
|
8
|
+
if not isinstance(value, float):
|
|
9
|
+
error_prefix = self._error_prefix(instance)
|
|
10
|
+
raise TypeError(
|
|
11
|
+
f"{error_prefix} attempt to set a value of type '{value.__class__.__name__}' to parameter that requires a float."
|
|
12
|
+
)
|
|
13
|
+
instance._set_config(self, value)
|
|
14
|
+
|
|
15
|
+
def __get__(self, instance, parent) -> float:
|
|
16
|
+
if not instance:
|
|
17
|
+
return self # type: ignore
|
|
18
|
+
return instance._get_config(self)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Callable
|
|
4
|
+
|
|
5
|
+
from clearskies.configs import config
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class FloatOrCallable(config.Config):
|
|
9
|
+
def __set__(self, instance, value: float | Callable[..., float]):
|
|
10
|
+
if not isinstance(value, float) and not callable(value):
|
|
11
|
+
error_prefix = self._error_prefix(instance)
|
|
12
|
+
raise TypeError(
|
|
13
|
+
f"{error_prefix} attempt to set a value of type '{value.__class__.__name__}' to parameter that requires a float or a callable."
|
|
14
|
+
)
|
|
15
|
+
instance._set_config(self, value)
|
|
16
|
+
|
|
17
|
+
def __get__(self, instance, parent) -> float | Callable[..., float]:
|
|
18
|
+
if not instance:
|
|
19
|
+
return self # type: ignore
|
|
20
|
+
return instance._get_config(self)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
from clearskies.configs import config
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from clearskies.input_outputs import headers
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class Headers(config.Config):
|
|
12
|
+
"""This is for a configuration that should be an instance of type clearskies.input_outputs.Headers."""
|
|
13
|
+
|
|
14
|
+
def __set__(self, instance, value: headers.Headers):
|
|
15
|
+
if value is None:
|
|
16
|
+
return
|
|
17
|
+
|
|
18
|
+
if not hasattr(value, "_duck_cheat") or value._duck_cheat != "headers":
|
|
19
|
+
error_prefix = self._error_prefix(instance)
|
|
20
|
+
raise TypeError(
|
|
21
|
+
f"{error_prefix} attempt to set a value of type '{value.__class__.__name__}' to a property that expets an instance of clearskies.input_outputs.Headers"
|
|
22
|
+
)
|
|
23
|
+
instance._set_config(self, value)
|
|
24
|
+
|
|
25
|
+
def __get__(self, instance, parent) -> headers.Headers:
|
|
26
|
+
if not instance:
|
|
27
|
+
return self # type: ignore
|
|
28
|
+
return instance._get_config(self)
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from clearskies.configs import config
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Integer(config.Config):
|
|
7
|
+
def __set__(self, instance, value: int):
|
|
8
|
+
if not isinstance(value, int):
|
|
9
|
+
error_prefix = self._error_prefix(instance)
|
|
10
|
+
raise TypeError(
|
|
11
|
+
f"{error_prefix} attempt to set a value of type '{value.__class__.__name__}' to parameter that requires an integer."
|
|
12
|
+
)
|
|
13
|
+
instance._set_config(self, value)
|
|
14
|
+
|
|
15
|
+
def __get__(self, instance, parent) -> int:
|
|
16
|
+
if not instance:
|
|
17
|
+
return self # type: ignore
|
|
18
|
+
return instance._get_config(self)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Callable
|
|
4
|
+
|
|
5
|
+
from clearskies.configs import config
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class IntegerOrCallable(config.Config):
|
|
9
|
+
def __set__(self, instance, value: int | Callable[..., int]):
|
|
10
|
+
if not isinstance(value, int) and not callable(value):
|
|
11
|
+
error_prefix = self._error_prefix(instance)
|
|
12
|
+
raise TypeError(
|
|
13
|
+
f"{error_prefix} attempt to set a value of type '{value.__class__.__name__}' to parameter that requires an integer or a callable."
|
|
14
|
+
)
|
|
15
|
+
instance._set_config(self, value)
|
|
16
|
+
|
|
17
|
+
def __get__(self, instance, parent) -> int | Callable[..., int]:
|
|
18
|
+
if not instance:
|
|
19
|
+
return self # type: ignore
|
|
20
|
+
return instance._get_config(self)
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
from clearskies.configs import config
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from clearskies import typing
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class Joins(config.Config):
|
|
12
|
+
def __set__(self, instance, value: typing.join | list[typing.join]):
|
|
13
|
+
if not isinstance(value, list):
|
|
14
|
+
value = [value]
|
|
15
|
+
|
|
16
|
+
for index, item in enumerate(value):
|
|
17
|
+
if callable(item) or isinstance(item, str):
|
|
18
|
+
continue
|
|
19
|
+
|
|
20
|
+
error_prefix = self._error_prefix(instance)
|
|
21
|
+
raise TypeError(
|
|
22
|
+
f"{error_prefix} attempt to set a value of type '{item.__class__.__name__}' for item #{index + 1} when a string or callable is required" # type: ignore
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
instance._set_config(self, [*value])
|
|
26
|
+
|
|
27
|
+
def __get__(self, instance, parent) -> list[typing.join]:
|
|
28
|
+
if not instance:
|
|
29
|
+
return self # type: ignore
|
|
30
|
+
return instance._get_config(self)
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from clearskies.configs import config
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class ListAnyDict(config.Config):
|
|
9
|
+
def __set__(self, instance, value: list[dict[str, Any]]):
|
|
10
|
+
if not isinstance(value, list):
|
|
11
|
+
error_prefix = self._error_prefix(instance)
|
|
12
|
+
raise TypeError(
|
|
13
|
+
f"{error_prefix} attempt to set a value of type '{value.__class__.__name__}' to a parameter that requries a list."
|
|
14
|
+
)
|
|
15
|
+
for index, list_item in enumerate(value):
|
|
16
|
+
if not isinstance(list_item, dict):
|
|
17
|
+
error_prefix = self._error_prefix(instance)
|
|
18
|
+
raise TypeError(
|
|
19
|
+
f"{error_prefix} I was expecting a list of dictionaries, but item # {index + 1} has type '{list_item.__class__.__name__}."
|
|
20
|
+
)
|
|
21
|
+
for key, val in list_item.items():
|
|
22
|
+
if not isinstance(key, str):
|
|
23
|
+
error_prefix = self._error_prefix(instance)
|
|
24
|
+
raise TypeError(
|
|
25
|
+
f"{error_prefix} attempt to set a dictionary with a non-string key for item #{index + 1}."
|
|
26
|
+
)
|
|
27
|
+
instance._set_config(self, value)
|
|
28
|
+
|
|
29
|
+
def __get__(self, instance, parent) -> list[dict[str, Any]]:
|
|
30
|
+
if not instance:
|
|
31
|
+
return self # type: ignore
|
|
32
|
+
return instance._get_config(self)
|