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.

Files changed (270) hide show
  1. clear_skies-2.0.27.dist-info/METADATA +78 -0
  2. clear_skies-2.0.27.dist-info/RECORD +270 -0
  3. clear_skies-2.0.27.dist-info/WHEEL +4 -0
  4. clear_skies-2.0.27.dist-info/licenses/LICENSE +7 -0
  5. clearskies/__init__.py +69 -0
  6. clearskies/action.py +7 -0
  7. clearskies/authentication/__init__.py +15 -0
  8. clearskies/authentication/authentication.py +44 -0
  9. clearskies/authentication/authorization.py +23 -0
  10. clearskies/authentication/authorization_pass_through.py +22 -0
  11. clearskies/authentication/jwks.py +165 -0
  12. clearskies/authentication/public.py +5 -0
  13. clearskies/authentication/secret_bearer.py +551 -0
  14. clearskies/autodoc/__init__.py +8 -0
  15. clearskies/autodoc/formats/__init__.py +5 -0
  16. clearskies/autodoc/formats/oai3_json/__init__.py +7 -0
  17. clearskies/autodoc/formats/oai3_json/oai3_json.py +87 -0
  18. clearskies/autodoc/formats/oai3_json/oai3_schema_resolver.py +15 -0
  19. clearskies/autodoc/formats/oai3_json/parameter.py +35 -0
  20. clearskies/autodoc/formats/oai3_json/request.py +68 -0
  21. clearskies/autodoc/formats/oai3_json/response.py +28 -0
  22. clearskies/autodoc/formats/oai3_json/schema/__init__.py +11 -0
  23. clearskies/autodoc/formats/oai3_json/schema/array.py +9 -0
  24. clearskies/autodoc/formats/oai3_json/schema/default.py +13 -0
  25. clearskies/autodoc/formats/oai3_json/schema/enum.py +7 -0
  26. clearskies/autodoc/formats/oai3_json/schema/object.py +35 -0
  27. clearskies/autodoc/formats/oai3_json/test.json +1985 -0
  28. clearskies/autodoc/py.typed +0 -0
  29. clearskies/autodoc/request/__init__.py +15 -0
  30. clearskies/autodoc/request/header.py +6 -0
  31. clearskies/autodoc/request/json_body.py +6 -0
  32. clearskies/autodoc/request/parameter.py +8 -0
  33. clearskies/autodoc/request/request.py +47 -0
  34. clearskies/autodoc/request/url_parameter.py +6 -0
  35. clearskies/autodoc/request/url_path.py +6 -0
  36. clearskies/autodoc/response/__init__.py +5 -0
  37. clearskies/autodoc/response/response.py +9 -0
  38. clearskies/autodoc/schema/__init__.py +31 -0
  39. clearskies/autodoc/schema/array.py +10 -0
  40. clearskies/autodoc/schema/base64.py +8 -0
  41. clearskies/autodoc/schema/boolean.py +5 -0
  42. clearskies/autodoc/schema/date.py +5 -0
  43. clearskies/autodoc/schema/datetime.py +5 -0
  44. clearskies/autodoc/schema/double.py +5 -0
  45. clearskies/autodoc/schema/enum.py +17 -0
  46. clearskies/autodoc/schema/integer.py +6 -0
  47. clearskies/autodoc/schema/long.py +5 -0
  48. clearskies/autodoc/schema/number.py +6 -0
  49. clearskies/autodoc/schema/object.py +13 -0
  50. clearskies/autodoc/schema/password.py +5 -0
  51. clearskies/autodoc/schema/schema.py +11 -0
  52. clearskies/autodoc/schema/string.py +5 -0
  53. clearskies/backends/__init__.py +67 -0
  54. clearskies/backends/api_backend.py +1194 -0
  55. clearskies/backends/backend.py +137 -0
  56. clearskies/backends/cursor_backend.py +339 -0
  57. clearskies/backends/graphql_backend.py +977 -0
  58. clearskies/backends/memory_backend.py +794 -0
  59. clearskies/backends/secrets_backend.py +100 -0
  60. clearskies/clients/__init__.py +5 -0
  61. clearskies/clients/graphql_client.py +182 -0
  62. clearskies/column.py +1221 -0
  63. clearskies/columns/__init__.py +71 -0
  64. clearskies/columns/audit.py +306 -0
  65. clearskies/columns/belongs_to_id.py +478 -0
  66. clearskies/columns/belongs_to_model.py +145 -0
  67. clearskies/columns/belongs_to_self.py +109 -0
  68. clearskies/columns/boolean.py +110 -0
  69. clearskies/columns/category_tree.py +274 -0
  70. clearskies/columns/category_tree_ancestors.py +51 -0
  71. clearskies/columns/category_tree_children.py +125 -0
  72. clearskies/columns/category_tree_descendants.py +48 -0
  73. clearskies/columns/created.py +92 -0
  74. clearskies/columns/created_by_authorization_data.py +114 -0
  75. clearskies/columns/created_by_header.py +103 -0
  76. clearskies/columns/created_by_ip.py +90 -0
  77. clearskies/columns/created_by_routing_data.py +102 -0
  78. clearskies/columns/created_by_user_agent.py +89 -0
  79. clearskies/columns/date.py +232 -0
  80. clearskies/columns/datetime.py +284 -0
  81. clearskies/columns/email.py +78 -0
  82. clearskies/columns/float.py +149 -0
  83. clearskies/columns/has_many.py +552 -0
  84. clearskies/columns/has_many_self.py +62 -0
  85. clearskies/columns/has_one.py +21 -0
  86. clearskies/columns/integer.py +158 -0
  87. clearskies/columns/json.py +126 -0
  88. clearskies/columns/many_to_many_ids.py +335 -0
  89. clearskies/columns/many_to_many_ids_with_data.py +281 -0
  90. clearskies/columns/many_to_many_models.py +163 -0
  91. clearskies/columns/many_to_many_pivots.py +132 -0
  92. clearskies/columns/phone.py +162 -0
  93. clearskies/columns/select.py +95 -0
  94. clearskies/columns/string.py +102 -0
  95. clearskies/columns/timestamp.py +164 -0
  96. clearskies/columns/updated.py +107 -0
  97. clearskies/columns/uuid.py +83 -0
  98. clearskies/configs/README.md +105 -0
  99. clearskies/configs/__init__.py +170 -0
  100. clearskies/configs/actions.py +43 -0
  101. clearskies/configs/any.py +15 -0
  102. clearskies/configs/any_dict.py +24 -0
  103. clearskies/configs/any_dict_or_callable.py +25 -0
  104. clearskies/configs/authentication.py +23 -0
  105. clearskies/configs/authorization.py +23 -0
  106. clearskies/configs/boolean.py +18 -0
  107. clearskies/configs/boolean_or_callable.py +20 -0
  108. clearskies/configs/callable_config.py +20 -0
  109. clearskies/configs/columns.py +34 -0
  110. clearskies/configs/conditions.py +30 -0
  111. clearskies/configs/config.py +26 -0
  112. clearskies/configs/datetime.py +20 -0
  113. clearskies/configs/datetime_or_callable.py +21 -0
  114. clearskies/configs/email.py +10 -0
  115. clearskies/configs/email_list.py +17 -0
  116. clearskies/configs/email_list_or_callable.py +17 -0
  117. clearskies/configs/email_or_email_list_or_callable.py +59 -0
  118. clearskies/configs/endpoint.py +23 -0
  119. clearskies/configs/endpoint_list.py +29 -0
  120. clearskies/configs/float.py +18 -0
  121. clearskies/configs/float_or_callable.py +20 -0
  122. clearskies/configs/headers.py +28 -0
  123. clearskies/configs/integer.py +18 -0
  124. clearskies/configs/integer_or_callable.py +20 -0
  125. clearskies/configs/joins.py +30 -0
  126. clearskies/configs/list_any_dict.py +32 -0
  127. clearskies/configs/list_any_dict_or_callable.py +33 -0
  128. clearskies/configs/model_class.py +35 -0
  129. clearskies/configs/model_column.py +67 -0
  130. clearskies/configs/model_columns.py +58 -0
  131. clearskies/configs/model_destination_name.py +26 -0
  132. clearskies/configs/model_to_id_column.py +45 -0
  133. clearskies/configs/readable_model_column.py +11 -0
  134. clearskies/configs/readable_model_columns.py +11 -0
  135. clearskies/configs/schema.py +23 -0
  136. clearskies/configs/searchable_model_columns.py +11 -0
  137. clearskies/configs/security_headers.py +39 -0
  138. clearskies/configs/select.py +28 -0
  139. clearskies/configs/select_list.py +49 -0
  140. clearskies/configs/string.py +31 -0
  141. clearskies/configs/string_dict.py +34 -0
  142. clearskies/configs/string_list.py +47 -0
  143. clearskies/configs/string_list_or_callable.py +48 -0
  144. clearskies/configs/string_or_callable.py +18 -0
  145. clearskies/configs/timedelta.py +20 -0
  146. clearskies/configs/timezone.py +20 -0
  147. clearskies/configs/url.py +25 -0
  148. clearskies/configs/validators.py +45 -0
  149. clearskies/configs/writeable_model_column.py +11 -0
  150. clearskies/configs/writeable_model_columns.py +11 -0
  151. clearskies/configurable.py +78 -0
  152. clearskies/contexts/__init__.py +11 -0
  153. clearskies/contexts/cli.py +130 -0
  154. clearskies/contexts/context.py +99 -0
  155. clearskies/contexts/wsgi.py +79 -0
  156. clearskies/contexts/wsgi_ref.py +87 -0
  157. clearskies/cursors/__init__.py +10 -0
  158. clearskies/cursors/cursor.py +161 -0
  159. clearskies/cursors/from_environment/__init__.py +5 -0
  160. clearskies/cursors/from_environment/mysql.py +51 -0
  161. clearskies/cursors/from_environment/postgresql.py +49 -0
  162. clearskies/cursors/from_environment/sqlite.py +35 -0
  163. clearskies/cursors/mysql.py +61 -0
  164. clearskies/cursors/postgresql.py +61 -0
  165. clearskies/cursors/sqlite.py +62 -0
  166. clearskies/decorators.py +33 -0
  167. clearskies/decorators.pyi +10 -0
  168. clearskies/di/__init__.py +15 -0
  169. clearskies/di/additional_config.py +130 -0
  170. clearskies/di/additional_config_auto_import.py +17 -0
  171. clearskies/di/di.py +948 -0
  172. clearskies/di/inject/__init__.py +25 -0
  173. clearskies/di/inject/akeyless_sdk.py +16 -0
  174. clearskies/di/inject/by_class.py +24 -0
  175. clearskies/di/inject/by_name.py +22 -0
  176. clearskies/di/inject/di.py +16 -0
  177. clearskies/di/inject/environment.py +15 -0
  178. clearskies/di/inject/input_output.py +19 -0
  179. clearskies/di/inject/logger.py +16 -0
  180. clearskies/di/inject/now.py +16 -0
  181. clearskies/di/inject/requests.py +16 -0
  182. clearskies/di/inject/secrets.py +15 -0
  183. clearskies/di/inject/utcnow.py +16 -0
  184. clearskies/di/inject/uuid.py +16 -0
  185. clearskies/di/injectable.py +32 -0
  186. clearskies/di/injectable_properties.py +131 -0
  187. clearskies/end.py +219 -0
  188. clearskies/endpoint.py +1303 -0
  189. clearskies/endpoint_group.py +333 -0
  190. clearskies/endpoints/__init__.py +25 -0
  191. clearskies/endpoints/advanced_search.py +519 -0
  192. clearskies/endpoints/callable.py +382 -0
  193. clearskies/endpoints/create.py +201 -0
  194. clearskies/endpoints/delete.py +133 -0
  195. clearskies/endpoints/get.py +267 -0
  196. clearskies/endpoints/health_check.py +181 -0
  197. clearskies/endpoints/list.py +567 -0
  198. clearskies/endpoints/restful_api.py +417 -0
  199. clearskies/endpoints/schema.py +185 -0
  200. clearskies/endpoints/simple_search.py +279 -0
  201. clearskies/endpoints/update.py +188 -0
  202. clearskies/environment.py +106 -0
  203. clearskies/exceptions/__init__.py +19 -0
  204. clearskies/exceptions/authentication.py +2 -0
  205. clearskies/exceptions/authorization.py +2 -0
  206. clearskies/exceptions/client_error.py +2 -0
  207. clearskies/exceptions/input_errors.py +4 -0
  208. clearskies/exceptions/missing_dependency.py +2 -0
  209. clearskies/exceptions/moved_permanently.py +3 -0
  210. clearskies/exceptions/moved_temporarily.py +3 -0
  211. clearskies/exceptions/not_found.py +2 -0
  212. clearskies/functional/__init__.py +7 -0
  213. clearskies/functional/json.py +47 -0
  214. clearskies/functional/routing.py +92 -0
  215. clearskies/functional/string.py +112 -0
  216. clearskies/functional/validations.py +76 -0
  217. clearskies/input_outputs/__init__.py +13 -0
  218. clearskies/input_outputs/cli.py +157 -0
  219. clearskies/input_outputs/exceptions/__init__.py +7 -0
  220. clearskies/input_outputs/exceptions/cli_input_error.py +2 -0
  221. clearskies/input_outputs/exceptions/cli_not_found.py +2 -0
  222. clearskies/input_outputs/headers.py +54 -0
  223. clearskies/input_outputs/input_output.py +116 -0
  224. clearskies/input_outputs/programmatic.py +62 -0
  225. clearskies/input_outputs/py.typed +0 -0
  226. clearskies/input_outputs/wsgi.py +80 -0
  227. clearskies/loggable.py +19 -0
  228. clearskies/model.py +2039 -0
  229. clearskies/py.typed +0 -0
  230. clearskies/query/__init__.py +12 -0
  231. clearskies/query/condition.py +228 -0
  232. clearskies/query/join.py +136 -0
  233. clearskies/query/query.py +195 -0
  234. clearskies/query/sort.py +27 -0
  235. clearskies/schema.py +82 -0
  236. clearskies/secrets/__init__.py +7 -0
  237. clearskies/secrets/additional_configs/__init__.py +32 -0
  238. clearskies/secrets/additional_configs/mysql_connection_dynamic_producer.py +61 -0
  239. clearskies/secrets/additional_configs/mysql_connection_dynamic_producer_via_ssh_cert_bastion.py +160 -0
  240. clearskies/secrets/akeyless.py +507 -0
  241. clearskies/secrets/exceptions/__init__.py +7 -0
  242. clearskies/secrets/exceptions/not_found_error.py +2 -0
  243. clearskies/secrets/exceptions/permissions_error.py +2 -0
  244. clearskies/secrets/secrets.py +39 -0
  245. clearskies/security_header.py +17 -0
  246. clearskies/security_headers/__init__.py +11 -0
  247. clearskies/security_headers/cache_control.py +68 -0
  248. clearskies/security_headers/cors.py +51 -0
  249. clearskies/security_headers/csp.py +95 -0
  250. clearskies/security_headers/hsts.py +23 -0
  251. clearskies/security_headers/x_content_type_options.py +0 -0
  252. clearskies/security_headers/x_frame_options.py +0 -0
  253. clearskies/typing.py +11 -0
  254. clearskies/validator.py +36 -0
  255. clearskies/validators/__init__.py +33 -0
  256. clearskies/validators/after_column.py +61 -0
  257. clearskies/validators/before_column.py +15 -0
  258. clearskies/validators/in_the_future.py +29 -0
  259. clearskies/validators/in_the_future_at_least.py +13 -0
  260. clearskies/validators/in_the_future_at_most.py +12 -0
  261. clearskies/validators/in_the_past.py +29 -0
  262. clearskies/validators/in_the_past_at_least.py +12 -0
  263. clearskies/validators/in_the_past_at_most.py +12 -0
  264. clearskies/validators/maximum_length.py +25 -0
  265. clearskies/validators/maximum_value.py +28 -0
  266. clearskies/validators/minimum_length.py +25 -0
  267. clearskies/validators/minimum_value.py +28 -0
  268. clearskies/validators/required.py +32 -0
  269. clearskies/validators/timedelta.py +58 -0
  270. clearskies/validators/unique.py +28 -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 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,11 @@
1
+ from .array import Array
2
+ from .default import Default
3
+ from .enum import Enum
4
+ from .object import Object
5
+
6
+ __all__ = [
7
+ "Array",
8
+ "Default",
9
+ "Enum",
10
+ "Object",
11
+ ]
@@ -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,7 @@
1
+ class Enum:
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
+ return {"nullable": True, "type": "string", "enum": [*self.schema.values, None]}
@@ -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]