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
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,6 @@
1
+ from .parameter import Parameter
2
+
3
+
4
+ class Header(Parameter):
5
+ location = "header"
6
+ in_body = False
@@ -0,0 +1,6 @@
1
+ from .parameter import Parameter
2
+
3
+
4
+ class JSONBody(Parameter):
5
+ location = "json_body"
6
+ in_body = True
@@ -0,0 +1,8 @@
1
+ class Parameter:
2
+ location = ""
3
+ in_body = False
4
+
5
+ def __init__(self, definition, description="", required=False):
6
+ self.definition = definition
7
+ self.description = description
8
+ self.required = required
@@ -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,6 @@
1
+ from .parameter import Parameter
2
+
3
+
4
+ class URLParameter(Parameter):
5
+ location = "url_parameter"
6
+ in_body = False
@@ -0,0 +1,6 @@
1
+ from .parameter import Parameter
2
+
3
+
4
+ class URLPath(Parameter):
5
+ location = "url_path"
6
+ in_body = False
@@ -0,0 +1,5 @@
1
+ from .response import Response
2
+
3
+ __all__ = [
4
+ "Response",
5
+ ]
@@ -0,0 +1,9 @@
1
+ class Response:
2
+ status = None
3
+ schema = None
4
+ description = None
5
+
6
+ def __init__(self, status, schema, description=None):
7
+ self.status = status
8
+ self.schema = schema
9
+ self.description = description if description is not None else ""
@@ -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,10 @@
1
+ from .schema import Schema
2
+
3
+
4
+ class Array(Schema):
5
+ item_definition = None
6
+ _type = "array"
7
+
8
+ def __init__(self, name, item_definition, value=None):
9
+ super().__init__(name, example=None, value=value)
10
+ self.item_definition = item_definition
@@ -0,0 +1,8 @@
1
+ from .string import String
2
+
3
+
4
+ class Base64(String):
5
+ _format = "byte"
6
+
7
+ def __init__(self, name, example=None, value=None):
8
+ super().__init__(name, example=example, value=value)
@@ -0,0 +1,5 @@
1
+ from .schema import Schema
2
+
3
+
4
+ class Boolean(Schema):
5
+ _type = "boolean"
@@ -0,0 +1,5 @@
1
+ from .string import String
2
+
3
+
4
+ class Date(String):
5
+ _format = "date"
@@ -0,0 +1,5 @@
1
+ from .string import String
2
+
3
+
4
+ class Datetime(String):
5
+ _format = "date-time"
@@ -0,0 +1,5 @@
1
+ from .number import Number
2
+
3
+
4
+ class Double(Number):
5
+ _format = "double"
@@ -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,6 @@
1
+ from .schema import Schema
2
+
3
+
4
+ class Integer(Schema):
5
+ _type = "integer"
6
+ _format = "int32"
@@ -0,0 +1,5 @@
1
+ from .integer import Integer
2
+
3
+
4
+ class Long(Integer):
5
+ _format = "int64"
@@ -0,0 +1,6 @@
1
+ from .schema import Schema
2
+
3
+
4
+ class Number(Schema):
5
+ _type = "number"
6
+ _format = "float"
@@ -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,5 @@
1
+ from .string import String
2
+
3
+
4
+ class Password(String):
5
+ _format = "password"
@@ -0,0 +1,11 @@
1
+ class Schema:
2
+ name: str
3
+ example = None
4
+ value = None
5
+ _type = "string"
6
+ _format = ""
7
+
8
+ def __init__(self, name, example=None, value=None):
9
+ self.name = name
10
+ self.example = example
11
+ self.value = value
@@ -0,0 +1,5 @@
1
+ from .schema import Schema
2
+
3
+
4
+ class String(Schema):
5
+ pass
@@ -0,0 +1,67 @@
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.graphql_backend import GraphqlBackend
51
+ from clearskies.backends.memory_backend import MemoryBackend
52
+
53
+ # from .memory_backend import MemoryBackend
54
+ # from .restful_api_advanced_search_backend import RestfulApiAdvancedSearchBackend
55
+ # from .secrets_backend import SecretsBackend
56
+
57
+
58
+ __all__ = [
59
+ "ApiBackend",
60
+ # "ApiGetOnlyBackend",
61
+ "Backend",
62
+ "CursorBackend",
63
+ "GraphqlBackend",
64
+ "MemoryBackend",
65
+ # "RestfulApiAdvancedSearchBackend",
66
+ # "SecretsBackend",
67
+ ]