clear-skies 2.0.5__py3-none-any.whl → 2.0.7__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.7.dist-info}/METADATA +1 -1
- clear_skies-2.0.7.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 +15 -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.7.dist-info}/WHEEL +0 -0
- {clear_skies-2.0.5.dist-info → clear_skies-2.0.7.dist-info}/licenses/LICENSE +0 -0
|
File without changes
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from .header import Header
|
|
2
|
+
from .json_body import JSONBody
|
|
3
|
+
from .parameter import Parameter
|
|
4
|
+
from .request import Request
|
|
5
|
+
from .url_parameter import URLParameter
|
|
6
|
+
from .url_path import URLPath
|
|
7
|
+
|
|
8
|
+
__all__ = [
|
|
9
|
+
"Header",
|
|
10
|
+
"JSONBody",
|
|
11
|
+
"Parameter",
|
|
12
|
+
"Request",
|
|
13
|
+
"URLParameter",
|
|
14
|
+
"URLPath",
|
|
15
|
+
]
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import re
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class Request:
|
|
6
|
+
description: str = ""
|
|
7
|
+
relative_path: str = ""
|
|
8
|
+
request_methods: list[str] = []
|
|
9
|
+
parameters: list[Any] = []
|
|
10
|
+
responses = None
|
|
11
|
+
root_properties = None
|
|
12
|
+
|
|
13
|
+
def __init__(
|
|
14
|
+
self, description, responses, relative_path="", request_methods="GET", parameters=None, root_properties=None
|
|
15
|
+
):
|
|
16
|
+
# clearskies supports path parameters via {parameter} and :parameter but we want to normalize to {paramter} for
|
|
17
|
+
# autodoc purposes
|
|
18
|
+
if ":" in relative_path:
|
|
19
|
+
relative_path = "/" + relative_path.strip("/") + "/"
|
|
20
|
+
for match in re.findall("/(:[^/]+)/", relative_path):
|
|
21
|
+
name = match[1:]
|
|
22
|
+
relative_path = relative_path.replace(f"/:{name}/", "/{" + name + "}/")
|
|
23
|
+
|
|
24
|
+
self.description = description
|
|
25
|
+
self.responses = responses
|
|
26
|
+
self.relative_path = relative_path.lstrip("/")
|
|
27
|
+
self.request_methods = [request_methods] if type(request_methods) == str else request_methods
|
|
28
|
+
self.set_parameters(parameters)
|
|
29
|
+
self.root_properties = root_properties if root_properties is not None else {}
|
|
30
|
+
|
|
31
|
+
def set_request_methods(self, request_methods):
|
|
32
|
+
self.request_methods = [request_methods] if type(request_methods) == str else request_methods
|
|
33
|
+
return self
|
|
34
|
+
|
|
35
|
+
def prepend_relative_path(self, path):
|
|
36
|
+
self.relative_path = path.rstrip("/") + "/" + self.relative_path.lstrip("/")
|
|
37
|
+
return self
|
|
38
|
+
|
|
39
|
+
def append_relative_path(self, path):
|
|
40
|
+
self.relative_path = self.relative_path.rstrip("/") + "/" + path.lstrip("/")
|
|
41
|
+
return self
|
|
42
|
+
|
|
43
|
+
def set_parameters(self, parameters=None):
|
|
44
|
+
self.parameters = parameters if parameters else []
|
|
45
|
+
|
|
46
|
+
def add_parameter(self, parameter):
|
|
47
|
+
self.parameters.append(parameter)
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
from .array import Array
|
|
2
|
+
from .base64 import Base64
|
|
3
|
+
from .boolean import Boolean
|
|
4
|
+
from .date import Date
|
|
5
|
+
from .datetime import Datetime
|
|
6
|
+
from .double import Double
|
|
7
|
+
from .enum import Enum
|
|
8
|
+
from .integer import Integer
|
|
9
|
+
from .long import Long
|
|
10
|
+
from .number import Number
|
|
11
|
+
from .object import Object
|
|
12
|
+
from .password import Password
|
|
13
|
+
from .schema import Schema
|
|
14
|
+
from .string import String
|
|
15
|
+
|
|
16
|
+
__all__ = [
|
|
17
|
+
"Array",
|
|
18
|
+
"Base64",
|
|
19
|
+
"Boolean",
|
|
20
|
+
"Date",
|
|
21
|
+
"Datetime",
|
|
22
|
+
"Double",
|
|
23
|
+
"Enum",
|
|
24
|
+
"Integer",
|
|
25
|
+
"Long",
|
|
26
|
+
"Number",
|
|
27
|
+
"Object",
|
|
28
|
+
"Password",
|
|
29
|
+
"Schema",
|
|
30
|
+
"String",
|
|
31
|
+
]
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from .schema import Schema
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class Enum(Schema):
|
|
5
|
+
values = None
|
|
6
|
+
value_type = None
|
|
7
|
+
example = None
|
|
8
|
+
_type = "string"
|
|
9
|
+
_format = ""
|
|
10
|
+
|
|
11
|
+
def __init__(self, name, values, value_type, example=None):
|
|
12
|
+
self.name = name
|
|
13
|
+
self.values = values
|
|
14
|
+
self.value_type = value_type
|
|
15
|
+
self._type = value_type._type
|
|
16
|
+
self._format = value_type._format
|
|
17
|
+
self.example = example
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from .schema import Schema
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class Object(Schema):
|
|
5
|
+
children = None
|
|
6
|
+
model_name = None
|
|
7
|
+
_type = "object"
|
|
8
|
+
_format = ""
|
|
9
|
+
|
|
10
|
+
def __init__(self, name, children, value=None, example=None, model_name=None):
|
|
11
|
+
super().__init__(name, example=example, value=value)
|
|
12
|
+
self.children = children
|
|
13
|
+
self.model_name = model_name
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"""
|
|
2
|
+
The backend system provides a layer of abstraction between a clearskies model and the place where it stores its data.
|
|
3
|
+
|
|
4
|
+
## Motivation
|
|
5
|
+
|
|
6
|
+
The goal of the backend system is to create a standard way to interact with external systems, whether those are
|
|
7
|
+
databases, APIs, cloud resources, etc... For comparison, models in other frameworks typically interact exclusively
|
|
8
|
+
with SQL databases. Therefore, building integrations with other data stores or 3rd party systems requires the
|
|
9
|
+
creation of bespoke SDKs, which results in time spent integrating and learning how to use them. Clearskies models
|
|
10
|
+
work with different backends to normalize the process of integrating with data stores and external systems.
|
|
11
|
+
This ability to switch backends turns the models, in essence, into a standardized SDK. The details of how to
|
|
12
|
+
interact with some other system are abstracted away into the backend, and then developers can interact with the
|
|
13
|
+
system using models in the standard way.
|
|
14
|
+
|
|
15
|
+
Of course, no abstraction layer is perfect, and not all datastores can fit into the backend system provided by
|
|
16
|
+
clearskies. That's okay! Like every abstraction layer in clearskies, you should use it when it works for
|
|
17
|
+
you and forget about it otherwise. So, for instance, it is not possible to build arbitrarily complex SQL
|
|
18
|
+
queries with the query system provided by models, but you can always inject the cursor and use it directly.
|
|
19
|
+
If some arbitrary data store just works in a completely different way, such that the backend system doesn't
|
|
20
|
+
work for it, it's still fine to build an SDK the "old school" way and use it in a clearskies application.
|
|
21
|
+
|
|
22
|
+
## Backends
|
|
23
|
+
|
|
24
|
+
There are four primary kinds of backends built into clearskies, with a few sub-types. Those are:
|
|
25
|
+
|
|
26
|
+
1. CursorBackend: Store data in an SQL-like database
|
|
27
|
+
2. MemoryBackend: Store data in-memory
|
|
28
|
+
3. ApiBackend: Use an API to fetch and store data
|
|
29
|
+
1. ApiGetOnlyBackend: Only supports fetching individual records from the API by id.
|
|
30
|
+
2. RestfulApiAdvancedSearchBackend: Automatically integrates with APIs built using clearskies.endpoints.RestfulApi
|
|
31
|
+
4. SecretsBackend - Store data directly in a secrets manager
|
|
32
|
+
|
|
33
|
+
See the documentation for each backend to understand how to configure and use it. In all cases though, you specify
|
|
34
|
+
the backend by instantiating the backend and attaching it to the model class via the `backend` attribute:
|
|
35
|
+
|
|
36
|
+
```python
|
|
37
|
+
import clearskies
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class MyModel(clearskies.model):
|
|
41
|
+
backend = clearskies.backends.MemoryBackend()
|
|
42
|
+
```
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
# from .api_backend import ApiBackend
|
|
46
|
+
# from .api_get_only_backend import ApiGetOnlyBackend
|
|
47
|
+
from clearskies.backends.api_backend import ApiBackend
|
|
48
|
+
from clearskies.backends.backend import Backend
|
|
49
|
+
from clearskies.backends.cursor_backend import CursorBackend
|
|
50
|
+
from clearskies.backends.memory_backend import MemoryBackend
|
|
51
|
+
|
|
52
|
+
# from .memory_backend import MemoryBackend
|
|
53
|
+
# from .restful_api_advanced_search_backend import RestfulApiAdvancedSearchBackend
|
|
54
|
+
# from .secrets_backend import SecretsBackend
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
__all__ = [
|
|
58
|
+
"ApiBackend",
|
|
59
|
+
# "ApiGetOnlyBackend",
|
|
60
|
+
"Backend",
|
|
61
|
+
"CursorBackend",
|
|
62
|
+
"MemoryBackend",
|
|
63
|
+
# "RestfulApiAdvancedSearchBackend",
|
|
64
|
+
# "SecretsBackend",
|
|
65
|
+
]
|