clear-skies 2.0.7__py3-none-any.whl → 2.0.8__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.7.dist-info → clear_skies-2.0.8.dist-info}/METADATA +1 -1
- clear_skies-2.0.8.dist-info/RECORD +252 -0
- clearskies/__init__.py +2 -2
- clearskies/authentication/authentication.py +1 -3
- clearskies/authentication/authorization.py +12 -5
- clearskies/authentication/authorization_pass_through.py +5 -3
- clearskies/authentication/jwks.py +25 -23
- clearskies/authentication/secret_bearer.py +15 -17
- clearskies/autodoc/schema/schema.py +1 -1
- clearskies/backends/api_backend.py +50 -56
- clearskies/backends/backend.py +14 -14
- clearskies/backends/cursor_backend.py +17 -23
- clearskies/backends/memory_backend.py +27 -30
- clearskies/backends/secrets_backend.py +13 -18
- clearskies/column.py +44 -56
- clearskies/columns/audit.py +14 -13
- clearskies/columns/belongs_to_id.py +10 -15
- clearskies/columns/belongs_to_model.py +6 -9
- clearskies/columns/belongs_to_self.py +13 -9
- clearskies/columns/boolean.py +13 -16
- clearskies/columns/category_tree.py +9 -11
- clearskies/columns/category_tree_children.py +2 -3
- clearskies/columns/category_tree_descendants.py +1 -1
- clearskies/columns/created.py +8 -11
- clearskies/columns/created_by_authorization_data.py +7 -9
- clearskies/columns/created_by_header.py +12 -8
- clearskies/columns/created_by_ip.py +6 -8
- clearskies/columns/created_by_routing_data.py +12 -7
- clearskies/columns/created_by_user_agent.py +6 -9
- clearskies/columns/date.py +12 -14
- clearskies/columns/datetime.py +19 -17
- clearskies/columns/email.py +3 -1
- clearskies/columns/float.py +10 -14
- clearskies/columns/has_many.py +8 -10
- clearskies/columns/has_many_self.py +13 -7
- clearskies/columns/has_one.py +2 -0
- clearskies/columns/integer.py +9 -11
- clearskies/columns/json.py +10 -12
- clearskies/columns/many_to_many_ids.py +14 -16
- clearskies/columns/many_to_many_ids_with_data.py +16 -16
- clearskies/columns/many_to_many_models.py +5 -7
- clearskies/columns/many_to_many_pivots.py +3 -5
- clearskies/columns/phone.py +12 -9
- clearskies/columns/select.py +12 -9
- clearskies/columns/string.py +1 -1
- clearskies/columns/timestamp.py +15 -15
- clearskies/columns/updated.py +8 -10
- clearskies/columns/uuid.py +7 -10
- clearskies/configs/any.py +2 -0
- clearskies/configs/any_dict.py +2 -0
- clearskies/configs/any_dict_or_callable.py +2 -0
- clearskies/configs/boolean.py +2 -0
- clearskies/configs/boolean_or_callable.py +2 -0
- clearskies/configs/callable_config.py +2 -0
- clearskies/configs/config.py +2 -0
- clearskies/configs/datetime.py +2 -0
- clearskies/configs/datetime_or_callable.py +2 -0
- clearskies/configs/float.py +2 -0
- clearskies/configs/float_or_callable.py +2 -0
- clearskies/configs/integer.py +2 -0
- clearskies/configs/integer_or_callable.py +2 -0
- clearskies/configs/list_any_dict.py +2 -0
- clearskies/configs/list_any_dict_or_callable.py +2 -0
- clearskies/configs/model_column.py +2 -0
- clearskies/configs/model_columns.py +2 -0
- clearskies/configs/model_destination_name.py +2 -1
- clearskies/configs/model_to_id_column.py +2 -0
- clearskies/configs/readable_model_column.py +2 -0
- clearskies/configs/readable_model_columns.py +2 -0
- clearskies/configs/searchable_model_columns.py +2 -0
- clearskies/configs/select.py +2 -0
- clearskies/configs/select_list.py +2 -0
- clearskies/configs/string.py +2 -0
- clearskies/configs/string_dict.py +2 -0
- clearskies/configs/string_list.py +2 -0
- clearskies/configs/string_list_or_callable.py +2 -0
- clearskies/configs/timedelta.py +2 -0
- clearskies/configs/timezone.py +2 -0
- clearskies/configs/url.py +2 -0
- clearskies/configs/writeable_model_column.py +2 -0
- clearskies/configs/writeable_model_columns.py +2 -0
- clearskies/configurable.py +2 -0
- clearskies/contexts/cli.py +9 -1
- clearskies/contexts/context.py +13 -14
- clearskies/contexts/wsgi.py +12 -10
- clearskies/contexts/wsgi_ref.py +12 -6
- clearskies/decorators.py +1 -1
- clearskies/decorators.pyi +10 -0
- clearskies/di/di.py +7 -6
- clearskies/di/inject/by_class.py +2 -0
- clearskies/di/inject/by_name.py +2 -0
- clearskies/di/inject/di.py +2 -0
- clearskies/di/inject/environment.py +1 -1
- clearskies/di/inject/now.py +2 -0
- clearskies/di/inject/requests.py +2 -0
- clearskies/di/inject/secrets.py +2 -2
- clearskies/di/inject/utcnow.py +2 -0
- clearskies/di/inject/uuid.py +2 -2
- clearskies/end.py +45 -7
- clearskies/endpoint.py +43 -59
- clearskies/endpoint_group.py +15 -18
- clearskies/endpoints/advanced_search.py +19 -26
- clearskies/endpoints/callable.py +10 -16
- clearskies/endpoints/create.py +6 -10
- clearskies/endpoints/delete.py +5 -11
- clearskies/endpoints/get.py +11 -15
- clearskies/endpoints/health_check.py +9 -11
- clearskies/endpoints/list.py +29 -36
- clearskies/endpoints/restful_api.py +43 -53
- clearskies/endpoints/schema.py +14 -18
- clearskies/endpoints/simple_search.py +5 -12
- clearskies/endpoints/update.py +6 -11
- clearskies/environment.py +2 -0
- clearskies/input_outputs/cli.py +2 -0
- clearskies/input_outputs/headers.py +2 -0
- clearskies/input_outputs/input_output.py +15 -15
- clearskies/input_outputs/programmatic.py +2 -2
- clearskies/input_outputs/wsgi.py +2 -2
- clearskies/model.py +120 -25
- clearskies/query/query.py +1 -4
- clearskies/secrets/__init__.py +2 -1
- clearskies/secrets/akeyless.py +12 -10
- clearskies/secrets/secrets.py +7 -2
- clearskies/security_header.py +4 -2
- clearskies/security_headers/cache_control.py +15 -14
- clearskies/security_headers/cors.py +10 -9
- clearskies/security_headers/csp.py +25 -24
- clearskies/security_headers/hsts.py +6 -5
- clearskies/typing.py +1 -1
- clearskies/validator.py +5 -6
- clearskies/validators/after_column.py +6 -7
- clearskies/validators/before_column.py +2 -0
- clearskies/validators/in_the_future.py +5 -8
- clearskies/validators/in_the_future_at_least.py +2 -0
- clearskies/validators/in_the_future_at_most.py +2 -0
- clearskies/validators/in_the_past.py +5 -8
- clearskies/validators/in_the_past_at_least.py +2 -0
- clearskies/validators/in_the_past_at_most.py +2 -0
- clearskies/validators/maximum_length.py +4 -5
- clearskies/validators/maximum_value.py +4 -4
- clearskies/validators/minimum_length.py +4 -4
- clearskies/validators/minimum_value.py +4 -4
- clearskies/validators/required.py +2 -4
- clearskies/validators/timedelta.py +8 -9
- clearskies/validators/unique.py +2 -3
- clear_skies-2.0.7.dist-info/RECORD +0 -251
- {clear_skies-2.0.7.dist-info → clear_skies-2.0.8.dist-info}/WHEEL +0 -0
- {clear_skies-2.0.7.dist-info → clear_skies-2.0.8.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,19 +1,12 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
import inspect
|
|
4
|
-
from collections import OrderedDict
|
|
5
3
|
from typing import TYPE_CHECKING, Any, Callable
|
|
6
4
|
|
|
7
|
-
import
|
|
8
|
-
import clearskies.exceptions
|
|
9
|
-
from clearskies import authentication, autodoc, typing
|
|
5
|
+
from clearskies import authentication, autodoc, decorators, exceptions
|
|
10
6
|
from clearskies.endpoints.list import List
|
|
11
|
-
from clearskies.functional import string
|
|
12
|
-
from clearskies.input_outputs import InputOutput
|
|
13
7
|
|
|
14
8
|
if TYPE_CHECKING:
|
|
15
|
-
from clearskies import Column, Schema, SecurityHeader
|
|
16
|
-
from clearskies.model import Model
|
|
9
|
+
from clearskies import Column, Model, Schema, SecurityHeader, typing
|
|
17
10
|
|
|
18
11
|
|
|
19
12
|
class SimpleSearch(List):
|
|
@@ -194,7 +187,7 @@ class SimpleSearch(List):
|
|
|
194
187
|
```
|
|
195
188
|
"""
|
|
196
189
|
|
|
197
|
-
@
|
|
190
|
+
@decorators.parameters_to_properties
|
|
198
191
|
def __init__(
|
|
199
192
|
self,
|
|
200
193
|
model_class: type[Model],
|
|
@@ -233,7 +226,7 @@ class SimpleSearch(List):
|
|
|
233
226
|
if column_name in self.allowed_request_keys and column_name not in self.searchable_column_names:
|
|
234
227
|
continue
|
|
235
228
|
if column_name not in self.searchable_column_names:
|
|
236
|
-
raise
|
|
229
|
+
raise exceptions.ClientError(
|
|
237
230
|
f"Invalid request parameter found in {input_source_label}: '{column_name}'"
|
|
238
231
|
)
|
|
239
232
|
[relationship_column_name, final_column_name] = self.unpack_column_name_with_relationship(column_name)
|
|
@@ -242,7 +235,7 @@ class SimpleSearch(List):
|
|
|
242
235
|
value, relationship_reference=final_column_name
|
|
243
236
|
)
|
|
244
237
|
if value_error:
|
|
245
|
-
raise
|
|
238
|
+
raise exceptions.InputErrors({column_name: value_error})
|
|
246
239
|
|
|
247
240
|
def configure_model_from_request_data(
|
|
248
241
|
self,
|
clearskies/endpoints/update.py
CHANGED
|
@@ -1,19 +1,14 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
import
|
|
4
|
-
from collections import OrderedDict
|
|
5
|
-
from typing import TYPE_CHECKING, Any, Callable, Type
|
|
3
|
+
from typing import TYPE_CHECKING, Any, Callable
|
|
6
4
|
|
|
7
|
-
import
|
|
8
|
-
import clearskies.exceptions
|
|
9
|
-
from clearskies import authentication, autodoc, typing
|
|
5
|
+
from clearskies import authentication, autodoc, decorators, exceptions
|
|
10
6
|
from clearskies.endpoints.get import Get
|
|
11
|
-
from clearskies.functional import
|
|
7
|
+
from clearskies.functional import string
|
|
12
8
|
from clearskies.input_outputs import InputOutput
|
|
13
9
|
|
|
14
10
|
if TYPE_CHECKING:
|
|
15
|
-
from clearskies import SecurityHeader
|
|
16
|
-
from clearskies.model import Column, Model, Schema
|
|
11
|
+
from clearskies import Column, Model, Schema, SecurityHeader, typing
|
|
17
12
|
|
|
18
13
|
|
|
19
14
|
class Update(Get):
|
|
@@ -90,7 +85,7 @@ class Update(Get):
|
|
|
90
85
|
}
|
|
91
86
|
"""
|
|
92
87
|
|
|
93
|
-
@
|
|
88
|
+
@decorators.parameters_to_properties
|
|
94
89
|
def __init__(
|
|
95
90
|
self,
|
|
96
91
|
model_class: type[Model],
|
|
@@ -124,7 +119,7 @@ class Update(Get):
|
|
|
124
119
|
def handle(self, input_output: InputOutput) -> Any:
|
|
125
120
|
request_data = self.get_request_data(input_output)
|
|
126
121
|
if not request_data and input_output.has_body():
|
|
127
|
-
raise
|
|
122
|
+
raise exceptions.ClientError("Request body was not valid JSON")
|
|
128
123
|
model = self.fetch_model(input_output)
|
|
129
124
|
self.validate_input_against_schema(request_data, input_output, model)
|
|
130
125
|
model.save(request_data)
|
clearskies/environment.py
CHANGED
clearskies/input_outputs/cli.py
CHANGED
|
@@ -1,38 +1,38 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
1
3
|
import json
|
|
2
4
|
from abc import ABC, abstractmethod
|
|
3
|
-
from typing import Any
|
|
5
|
+
from typing import TYPE_CHECKING, Any
|
|
4
6
|
from urllib.parse import parse_qs
|
|
5
7
|
|
|
6
|
-
import
|
|
7
|
-
import clearskies.typing
|
|
8
|
-
from clearskies.configs import AnyDict, StringDict
|
|
9
|
-
from clearskies.exceptions import ClientError
|
|
8
|
+
from clearskies import configs, configurable, input_outputs
|
|
10
9
|
|
|
11
|
-
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from clearskies import typing
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
class InputOutput(ABC,
|
|
14
|
+
class InputOutput(ABC, configurable.Configurable):
|
|
15
15
|
"""Manage the request and response to the client."""
|
|
16
16
|
|
|
17
|
-
response_headers: Headers = None # type: ignore
|
|
18
|
-
request_headers: Headers = None # type: ignore
|
|
19
|
-
query_parameters =
|
|
20
|
-
routing_data =
|
|
21
|
-
authorization_data =
|
|
17
|
+
response_headers: input_outputs.Headers = None # type: ignore
|
|
18
|
+
request_headers: input_outputs.Headers = None # type: ignore
|
|
19
|
+
query_parameters = configs.AnyDict(default={})
|
|
20
|
+
routing_data = configs.StringDict(default={})
|
|
21
|
+
authorization_data = configs.AnyDict(default={})
|
|
22
22
|
|
|
23
23
|
_body_as_json: dict[str, Any] | list[Any] | None = {}
|
|
24
24
|
_body_loaded_as_json = False
|
|
25
25
|
|
|
26
26
|
def __init__(self):
|
|
27
|
-
self.response_headers = Headers()
|
|
28
|
-
self.request_headers = Headers(self.get_request_headers())
|
|
27
|
+
self.response_headers = input_outputs.Headers()
|
|
28
|
+
self.request_headers = input_outputs.Headers(self.get_request_headers())
|
|
29
29
|
self.query_parameters = {key: val[0] for (key, val) in parse_qs(self.get_query_string()).items()}
|
|
30
30
|
self.authorization_data = {}
|
|
31
31
|
self.routing_data = {}
|
|
32
32
|
self.finalize_and_validate_configuration()
|
|
33
33
|
|
|
34
34
|
@abstractmethod
|
|
35
|
-
def respond(self, body:
|
|
35
|
+
def respond(self, body: typing.response, status_code: int = 200) -> Any:
|
|
36
36
|
"""
|
|
37
37
|
Pass along a response to the client.
|
|
38
38
|
|