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
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
from typing import Any
|
|
2
|
+
|
|
3
|
+
from clearskies.input_outputs.input_output import InputOutput
|
|
4
|
+
|
|
5
|
+
from .headers import Headers
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Programmatic(InputOutput):
|
|
9
|
+
_body: str | dict[str, Any] | list[Any] = ""
|
|
10
|
+
_request_method: str = ""
|
|
11
|
+
_request_headers: dict[str, Any] = {}
|
|
12
|
+
url: str = ""
|
|
13
|
+
|
|
14
|
+
def __init__(
|
|
15
|
+
self,
|
|
16
|
+
url: str = "",
|
|
17
|
+
request_method: str = "GET",
|
|
18
|
+
body: str | dict[str, Any] | list[Any] = "",
|
|
19
|
+
query_parameters: dict[str, Any] = {},
|
|
20
|
+
request_headers: dict[str, str] = {},
|
|
21
|
+
):
|
|
22
|
+
self.url = url
|
|
23
|
+
self._request_headers = {**request_headers}
|
|
24
|
+
self._body_loaded_as_json = True
|
|
25
|
+
self._body_as_json = None
|
|
26
|
+
self._request_method = request_method
|
|
27
|
+
if body:
|
|
28
|
+
self._body = body
|
|
29
|
+
if isinstance(body, dict) or isinstance(body, list):
|
|
30
|
+
self._body_as_json = body
|
|
31
|
+
|
|
32
|
+
super().__init__()
|
|
33
|
+
self.query_parameters = {**query_parameters}
|
|
34
|
+
|
|
35
|
+
def respond(self, response, status_code=200):
|
|
36
|
+
return (status_code, response, self.response_headers)
|
|
37
|
+
|
|
38
|
+
def get_script_name(self):
|
|
39
|
+
return self.url
|
|
40
|
+
|
|
41
|
+
def get_path_info(self):
|
|
42
|
+
return self.url
|
|
43
|
+
|
|
44
|
+
def get_full_path(self):
|
|
45
|
+
return self.url
|
|
46
|
+
|
|
47
|
+
def get_request_method(self):
|
|
48
|
+
return self._request_method
|
|
49
|
+
|
|
50
|
+
def has_body(self):
|
|
51
|
+
return bool(self._body)
|
|
52
|
+
|
|
53
|
+
def get_body(self):
|
|
54
|
+
if not self.has_body():
|
|
55
|
+
return ""
|
|
56
|
+
|
|
57
|
+
return self._body
|
|
58
|
+
|
|
59
|
+
def context_specifics(self):
|
|
60
|
+
return {}
|
|
61
|
+
|
|
62
|
+
def get_client_ip(self):
|
|
63
|
+
return "127.0.0.1"
|
|
64
|
+
|
|
65
|
+
def get_query_string(self):
|
|
66
|
+
return ""
|
|
67
|
+
|
|
68
|
+
def get_request_headers(self):
|
|
69
|
+
return self._request_headers
|
|
File without changes
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import urllib
|
|
3
|
+
import urllib.parse
|
|
4
|
+
from typing import Callable
|
|
5
|
+
|
|
6
|
+
from .input_output import InputOutput
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class Wsgi(InputOutput):
|
|
10
|
+
_environment: dict[str, str] = {}
|
|
11
|
+
_start_response: Callable = None # type: ignore
|
|
12
|
+
_request_headers: dict[str, str] = {}
|
|
13
|
+
_cached_body: str | None = None
|
|
14
|
+
|
|
15
|
+
def __init__(self, environment, start_response):
|
|
16
|
+
self._environment = environment
|
|
17
|
+
self._start_response = start_response
|
|
18
|
+
self._request_headers = {}
|
|
19
|
+
for key, value in self._environment.items():
|
|
20
|
+
if key.upper()[0:5] == "HTTP_":
|
|
21
|
+
self._request_headers[key[5:].lower()] = value
|
|
22
|
+
super().__init__()
|
|
23
|
+
|
|
24
|
+
def _from_environment(self, key):
|
|
25
|
+
return self._environment[key] if key in self._environment else ""
|
|
26
|
+
|
|
27
|
+
def respond(self, body, status_code=200):
|
|
28
|
+
if "content-type" not in self.response_headers:
|
|
29
|
+
self.response_headers.content_type = "application/json; charset=UTF-8"
|
|
30
|
+
|
|
31
|
+
self._start_response(f"{status_code} Ok", [header for header in self.response_headers.items()]) # type: ignore
|
|
32
|
+
if type(body) == bytes:
|
|
33
|
+
final_body = body
|
|
34
|
+
elif type(body) == str:
|
|
35
|
+
final_body = body.encode("utf-8")
|
|
36
|
+
else:
|
|
37
|
+
final_body = json.dumps(body).encode("utf-8")
|
|
38
|
+
return [final_body]
|
|
39
|
+
|
|
40
|
+
def has_body(self):
|
|
41
|
+
return bool(self._from_environment("CONTENT_LENGTH"))
|
|
42
|
+
|
|
43
|
+
def get_body(self):
|
|
44
|
+
if self._cached_body is None:
|
|
45
|
+
self._cached_body = (
|
|
46
|
+
self._from_environment("wsgi.input").read(int(self._from_environment("CONTENT_LENGTH"))).decode("utf-8")
|
|
47
|
+
if self._from_environment("CONTENT_LENGTH")
|
|
48
|
+
else ""
|
|
49
|
+
)
|
|
50
|
+
return self._cached_body
|
|
51
|
+
|
|
52
|
+
def get_request_method(self):
|
|
53
|
+
return self._from_environment("REQUEST_METHOD").upper()
|
|
54
|
+
|
|
55
|
+
def get_script_name(self):
|
|
56
|
+
return self._from_environment("SCRIPT_NAME")
|
|
57
|
+
|
|
58
|
+
def get_path_info(self):
|
|
59
|
+
return self._from_environment("PATH_INFO")
|
|
60
|
+
|
|
61
|
+
def get_query_string(self):
|
|
62
|
+
return self._from_environment("QUERY_STRING")
|
|
63
|
+
|
|
64
|
+
def get_content_type(self):
|
|
65
|
+
return self._from_environment("CONTENT_TYPE")
|
|
66
|
+
|
|
67
|
+
def get_protocol(self):
|
|
68
|
+
return self._from_environment("wsgi.url_scheme").lower()
|
|
69
|
+
|
|
70
|
+
def context_specifics(self):
|
|
71
|
+
return {"wsgi_environment": self._environment}
|
|
72
|
+
|
|
73
|
+
def get_client_ip(self):
|
|
74
|
+
return self._environment.get("REMOTE_ADDR")
|
|
75
|
+
|
|
76
|
+
def get_request_headers(self):
|
|
77
|
+
return self._request_headers
|