clear-skies 2.0.5__py3-none-any.whl → 2.0.6__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.5.dist-info → clear_skies-2.0.6.dist-info}/METADATA +1 -1
- clear_skies-2.0.6.dist-info/RECORD +251 -0
- clearskies/__init__.py +61 -0
- clearskies/action.py +7 -0
- clearskies/authentication/__init__.py +15 -0
- clearskies/authentication/authentication.py +46 -0
- clearskies/authentication/authorization.py +16 -0
- clearskies/authentication/authorization_pass_through.py +20 -0
- clearskies/authentication/jwks.py +163 -0
- clearskies/authentication/public.py +5 -0
- clearskies/authentication/secret_bearer.py +553 -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 +65 -0
- clearskies/backends/api_backend.py +1178 -0
- clearskies/backends/backend.py +136 -0
- clearskies/backends/cursor_backend.py +335 -0
- clearskies/backends/memory_backend.py +797 -0
- clearskies/backends/secrets_backend.py +106 -0
- clearskies/column.py +1233 -0
- clearskies/columns/__init__.py +71 -0
- clearskies/columns/audit.py +206 -0
- clearskies/columns/belongs_to_id.py +483 -0
- clearskies/columns/belongs_to_model.py +132 -0
- clearskies/columns/belongs_to_self.py +105 -0
- clearskies/columns/boolean.py +113 -0
- clearskies/columns/category_tree.py +275 -0
- clearskies/columns/category_tree_ancestors.py +51 -0
- clearskies/columns/category_tree_children.py +127 -0
- clearskies/columns/category_tree_descendants.py +48 -0
- clearskies/columns/created.py +95 -0
- clearskies/columns/created_by_authorization_data.py +116 -0
- clearskies/columns/created_by_header.py +99 -0
- clearskies/columns/created_by_ip.py +92 -0
- clearskies/columns/created_by_routing_data.py +97 -0
- clearskies/columns/created_by_user_agent.py +92 -0
- clearskies/columns/date.py +234 -0
- clearskies/columns/datetime.py +282 -0
- clearskies/columns/email.py +76 -0
- clearskies/columns/float.py +153 -0
- clearskies/columns/has_many.py +505 -0
- clearskies/columns/has_many_self.py +56 -0
- clearskies/columns/has_one.py +14 -0
- clearskies/columns/integer.py +160 -0
- clearskies/columns/json.py +128 -0
- clearskies/columns/many_to_many_ids.py +337 -0
- clearskies/columns/many_to_many_ids_with_data.py +274 -0
- clearskies/columns/many_to_many_models.py +158 -0
- clearskies/columns/many_to_many_pivots.py +134 -0
- clearskies/columns/phone.py +159 -0
- clearskies/columns/select.py +92 -0
- clearskies/columns/string.py +102 -0
- clearskies/columns/timestamp.py +164 -0
- clearskies/columns/updated.py +110 -0
- clearskies/columns/uuid.py +86 -0
- clearskies/configs/README.md +105 -0
- clearskies/configs/__init__.py +162 -0
- clearskies/configs/actions.py +43 -0
- clearskies/configs/any.py +13 -0
- clearskies/configs/any_dict.py +22 -0
- clearskies/configs/any_dict_or_callable.py +23 -0
- clearskies/configs/authentication.py +23 -0
- clearskies/configs/authorization.py +23 -0
- clearskies/configs/boolean.py +16 -0
- clearskies/configs/boolean_or_callable.py +18 -0
- clearskies/configs/callable_config.py +18 -0
- clearskies/configs/columns.py +34 -0
- clearskies/configs/conditions.py +30 -0
- clearskies/configs/config.py +24 -0
- clearskies/configs/datetime.py +18 -0
- clearskies/configs/datetime_or_callable.py +19 -0
- clearskies/configs/endpoint.py +23 -0
- clearskies/configs/endpoint_list.py +29 -0
- clearskies/configs/float.py +16 -0
- clearskies/configs/float_or_callable.py +18 -0
- clearskies/configs/integer.py +16 -0
- clearskies/configs/integer_or_callable.py +18 -0
- clearskies/configs/joins.py +30 -0
- clearskies/configs/list_any_dict.py +30 -0
- clearskies/configs/list_any_dict_or_callable.py +31 -0
- clearskies/configs/model_class.py +35 -0
- clearskies/configs/model_column.py +65 -0
- clearskies/configs/model_columns.py +56 -0
- clearskies/configs/model_destination_name.py +25 -0
- clearskies/configs/model_to_id_column.py +43 -0
- clearskies/configs/readable_model_column.py +9 -0
- clearskies/configs/readable_model_columns.py +9 -0
- clearskies/configs/schema.py +23 -0
- clearskies/configs/searchable_model_columns.py +9 -0
- clearskies/configs/security_headers.py +39 -0
- clearskies/configs/select.py +26 -0
- clearskies/configs/select_list.py +47 -0
- clearskies/configs/string.py +29 -0
- clearskies/configs/string_dict.py +32 -0
- clearskies/configs/string_list.py +32 -0
- clearskies/configs/string_list_or_callable.py +35 -0
- clearskies/configs/string_or_callable.py +18 -0
- clearskies/configs/timedelta.py +18 -0
- clearskies/configs/timezone.py +18 -0
- clearskies/configs/url.py +23 -0
- clearskies/configs/validators.py +45 -0
- clearskies/configs/writeable_model_column.py +9 -0
- clearskies/configs/writeable_model_columns.py +9 -0
- clearskies/configurable.py +76 -0
- clearskies/contexts/__init__.py +11 -0
- clearskies/contexts/cli.py +117 -0
- clearskies/contexts/context.py +98 -0
- clearskies/contexts/wsgi.py +76 -0
- clearskies/contexts/wsgi_ref.py +82 -0
- clearskies/decorators.py +33 -0
- clearskies/di/__init__.py +14 -0
- clearskies/di/additional_config.py +130 -0
- clearskies/di/additional_config_auto_import.py +17 -0
- clearskies/di/di.py +973 -0
- clearskies/di/inject/__init__.py +23 -0
- clearskies/di/inject/by_class.py +21 -0
- clearskies/di/inject/by_name.py +18 -0
- clearskies/di/inject/di.py +13 -0
- clearskies/di/inject/environment.py +14 -0
- clearskies/di/inject/input_output.py +20 -0
- clearskies/di/inject/now.py +13 -0
- clearskies/di/inject/requests.py +13 -0
- clearskies/di/inject/secrets.py +14 -0
- clearskies/di/inject/utcnow.py +13 -0
- clearskies/di/inject/uuid.py +15 -0
- clearskies/di/injectable.py +29 -0
- clearskies/di/injectable_properties.py +131 -0
- clearskies/di/test_module/__init__.py +6 -0
- clearskies/di/test_module/another_module/__init__.py +2 -0
- clearskies/di/test_module/module_class.py +5 -0
- clearskies/end.py +183 -0
- clearskies/endpoint.py +1314 -0
- clearskies/endpoint_group.py +336 -0
- clearskies/endpoints/__init__.py +25 -0
- clearskies/endpoints/advanced_search.py +526 -0
- clearskies/endpoints/callable.py +388 -0
- clearskies/endpoints/create.py +205 -0
- clearskies/endpoints/delete.py +139 -0
- clearskies/endpoints/get.py +271 -0
- clearskies/endpoints/health_check.py +183 -0
- clearskies/endpoints/list.py +574 -0
- clearskies/endpoints/restful_api.py +427 -0
- clearskies/endpoints/schema.py +189 -0
- clearskies/endpoints/simple_search.py +286 -0
- clearskies/endpoints/update.py +193 -0
- clearskies/environment.py +104 -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/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 +171 -0
- clearskies/input_outputs/exceptions/__init__.py +2 -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 +45 -0
- clearskies/input_outputs/input_output.py +138 -0
- clearskies/input_outputs/programmatic.py +69 -0
- clearskies/input_outputs/py.typed +0 -0
- clearskies/input_outputs/wsgi.py +77 -0
- clearskies/model.py +1922 -0
- clearskies/py.typed +0 -0
- clearskies/query/__init__.py +12 -0
- clearskies/query/condition.py +223 -0
- clearskies/query/join.py +136 -0
- clearskies/query/query.py +196 -0
- clearskies/query/sort.py +27 -0
- clearskies/schema.py +82 -0
- clearskies/secrets/__init__.py +6 -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 +182 -0
- clearskies/secrets/exceptions/__init__.py +1 -0
- clearskies/secrets/exceptions/not_found.py +2 -0
- clearskies/secrets/secrets.py +38 -0
- clearskies/security_header.py +15 -0
- clearskies/security_headers/__init__.py +11 -0
- clearskies/security_headers/cache_control.py +67 -0
- clearskies/security_headers/cors.py +50 -0
- clearskies/security_headers/csp.py +94 -0
- clearskies/security_headers/hsts.py +22 -0
- clearskies/security_headers/x_content_type_options.py +0 -0
- clearskies/security_headers/x_frame_options.py +0 -0
- clearskies/test_base.py +8 -0
- clearskies/typing.py +11 -0
- clearskies/validator.py +37 -0
- clearskies/validators/__init__.py +33 -0
- clearskies/validators/after_column.py +62 -0
- clearskies/validators/before_column.py +13 -0
- clearskies/validators/in_the_future.py +32 -0
- clearskies/validators/in_the_future_at_least.py +11 -0
- clearskies/validators/in_the_future_at_most.py +10 -0
- clearskies/validators/in_the_past.py +32 -0
- clearskies/validators/in_the_past_at_least.py +10 -0
- clearskies/validators/in_the_past_at_most.py +10 -0
- clearskies/validators/maximum_length.py +26 -0
- clearskies/validators/maximum_value.py +29 -0
- clearskies/validators/minimum_length.py +26 -0
- clearskies/validators/minimum_value.py +29 -0
- clearskies/validators/required.py +34 -0
- clearskies/validators/timedelta.py +59 -0
- clearskies/validators/unique.py +30 -0
- clear_skies-2.0.5.dist-info/RECORD +0 -4
- {clear_skies-2.0.5.dist-info → clear_skies-2.0.6.dist-info}/WHEEL +0 -0
- {clear_skies-2.0.5.dist-info → clear_skies-2.0.6.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
from typing import Any
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class Parameter:
|
|
5
|
+
name: str = ""
|
|
6
|
+
parameter: Any = None
|
|
7
|
+
required: bool = False
|
|
8
|
+
location_map = {
|
|
9
|
+
"url_parameter": "query",
|
|
10
|
+
"header": "header",
|
|
11
|
+
"url_path": "path",
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
def __init__(self, oai3_schema_resolver):
|
|
15
|
+
self.oai3_schema_resolver = oai3_schema_resolver
|
|
16
|
+
|
|
17
|
+
def set_parameter(self, parameter):
|
|
18
|
+
self.parameter = parameter
|
|
19
|
+
self.name = self.parameter.definition.name
|
|
20
|
+
self.required = self.parameter.required
|
|
21
|
+
|
|
22
|
+
def convert(self):
|
|
23
|
+
if self.parameter.location not in self.location_map:
|
|
24
|
+
raise ValueError(
|
|
25
|
+
f"Parameter of class {self.parameter.__class__} declares "
|
|
26
|
+
+ f"an unsupported location: '{self.parameter.location}'"
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
return {
|
|
30
|
+
"name": self.parameter.definition.name,
|
|
31
|
+
"description": self.parameter.description,
|
|
32
|
+
"required": self.required,
|
|
33
|
+
"in": self.location_map[self.parameter.location],
|
|
34
|
+
"schema": self.oai3_schema_resolver(self.parameter.definition).convert(),
|
|
35
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
from typing import Any
|
|
2
|
+
|
|
3
|
+
from ...schema import Array, Object
|
|
4
|
+
from .parameter import Parameter
|
|
5
|
+
from .response import Response
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Request:
|
|
9
|
+
formatted_responses: Any = None
|
|
10
|
+
request: Any = None
|
|
11
|
+
relative_path: str = ""
|
|
12
|
+
|
|
13
|
+
def __init__(self, oai3_schema_resolver):
|
|
14
|
+
self.oai3_schema_resolver = oai3_schema_resolver
|
|
15
|
+
|
|
16
|
+
def set_request(self, request):
|
|
17
|
+
self.request = request
|
|
18
|
+
self.formatted_responses = [self.format_response(response) for response in self.request.responses]
|
|
19
|
+
self.formatted_parameters = [
|
|
20
|
+
self.format_parameter(parameter) for parameter in self.request.parameters if not parameter.in_body
|
|
21
|
+
]
|
|
22
|
+
self.json_body_parameters = [parameter for parameter in self.request.parameters if parameter.in_body]
|
|
23
|
+
self.relative_path = self.request.relative_path
|
|
24
|
+
|
|
25
|
+
def format_response(self, response):
|
|
26
|
+
formatted = Response(self.oai3_schema_resolver)
|
|
27
|
+
formatted.set_response(response)
|
|
28
|
+
return formatted
|
|
29
|
+
|
|
30
|
+
def format_parameter(self, parameter):
|
|
31
|
+
formatted = Parameter(self.oai3_schema_resolver)
|
|
32
|
+
formatted.set_parameter(parameter)
|
|
33
|
+
return formatted
|
|
34
|
+
|
|
35
|
+
def convert(self):
|
|
36
|
+
data = {}
|
|
37
|
+
for request_method in self.request.request_methods:
|
|
38
|
+
data[request_method.lower()] = {
|
|
39
|
+
"summary": self.request.description,
|
|
40
|
+
"parameters": [parameter.convert() for parameter in self.formatted_parameters],
|
|
41
|
+
"responses": {str(response.status_code): response.convert() for response in self.formatted_responses},
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
if self.request.root_properties:
|
|
45
|
+
data[request_method.lower()] = {**data[request_method.lower()], **self.request.root_properties}
|
|
46
|
+
|
|
47
|
+
if self.json_body_parameters:
|
|
48
|
+
# For OAI3, there should only be one JSON body root parameter, so it should either be an
|
|
49
|
+
# object or an array. If we have an array then wrap it in an object
|
|
50
|
+
if type(self.json_body_parameters) == list:
|
|
51
|
+
definitions = [parameter.definition for parameter in self.json_body_parameters]
|
|
52
|
+
json_body = Object("body", definitions)
|
|
53
|
+
is_required = len([1 for param in self.json_body_parameters if param.required]) >= 1
|
|
54
|
+
else:
|
|
55
|
+
json_body = self.json_body_parameters[0].definition
|
|
56
|
+
is_required = len([1 for param in json_body.definition.children if param.required]) >= 1
|
|
57
|
+
|
|
58
|
+
data[request_method.lower()]["requestBody"] = {
|
|
59
|
+
"description": self.request.description,
|
|
60
|
+
"required": is_required,
|
|
61
|
+
"content": {
|
|
62
|
+
"application/json": {
|
|
63
|
+
"schema": self.oai3_schema_resolver(json_body).convert(),
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return data
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
from typing import Any
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class Response:
|
|
5
|
+
response: Any = None
|
|
6
|
+
formatted_schema: Any = None
|
|
7
|
+
oai3_schema_resolver: Any = None
|
|
8
|
+
status_code: Any = None
|
|
9
|
+
|
|
10
|
+
def __init__(self, oai3_schema_resolver):
|
|
11
|
+
self.oai3_schema_resolver = oai3_schema_resolver
|
|
12
|
+
|
|
13
|
+
def set_response(self, response):
|
|
14
|
+
self.response = response
|
|
15
|
+
self.status_code = self.response.status
|
|
16
|
+
self.formatted_schema = self.oai3_schema_resolver(response.schema)
|
|
17
|
+
|
|
18
|
+
def convert(self):
|
|
19
|
+
schema = {
|
|
20
|
+
"description": self.response.description,
|
|
21
|
+
"content": {
|
|
22
|
+
"application/json": {
|
|
23
|
+
"schema": self.oai3_schema_resolver(self.response.schema).convert(),
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return schema
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
class Array:
|
|
2
|
+
def __init__(self, schema, oai3_schema_resolver):
|
|
3
|
+
self.schema = schema
|
|
4
|
+
self.oai3_schema_resolver = oai3_schema_resolver
|
|
5
|
+
|
|
6
|
+
def convert(self):
|
|
7
|
+
schema = {"type": "array", "items": self.oai3_schema_resolver(self.schema.item_definition).convert()}
|
|
8
|
+
|
|
9
|
+
return schema
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
class Default:
|
|
2
|
+
def __init__(self, schema):
|
|
3
|
+
self.schema = schema
|
|
4
|
+
|
|
5
|
+
def convert(self):
|
|
6
|
+
schema = {"type": self.schema._type}
|
|
7
|
+
if self.schema._format:
|
|
8
|
+
schema["format"] = self.schema._format
|
|
9
|
+
if hasattr(self.schema, "example") and self.schema.example:
|
|
10
|
+
schema["example"] = self.schema.example
|
|
11
|
+
if hasattr(self.schema, "value") and self.schema.value:
|
|
12
|
+
schema["example"] = self.schema.value
|
|
13
|
+
return schema
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
from typing import Any
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class Object:
|
|
5
|
+
def __init__(self, schema, oai3_schema_resolver):
|
|
6
|
+
self.schema = schema
|
|
7
|
+
# shhhh
|
|
8
|
+
self.schema.children = [
|
|
9
|
+
child[0] if (isinstance(child, tuple) or isinstance(child, list)) else child
|
|
10
|
+
for child in self.schema.children
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
self.oai3_schema_resolver = oai3_schema_resolver
|
|
14
|
+
|
|
15
|
+
def convert(self, include_required=False):
|
|
16
|
+
schema: dict[str, Any] = {
|
|
17
|
+
"type": "object",
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if self.schema.model_name:
|
|
21
|
+
schema["$ref"] = f"#/components/schemas/{self.schema.model_name}"
|
|
22
|
+
else:
|
|
23
|
+
schema["properties"] = {
|
|
24
|
+
schematic.name: self.oai3_schema_resolver(schematic).convert() for schematic in self.schema.children
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if include_required:
|
|
28
|
+
required = self.required()
|
|
29
|
+
if required:
|
|
30
|
+
schema["required"] = required
|
|
31
|
+
|
|
32
|
+
return schema
|
|
33
|
+
|
|
34
|
+
def required(self):
|
|
35
|
+
return [schematic.name for schematic in self.schema.children if schematic.required]
|