clear-skies 1.22.10__py3-none-any.whl → 2.0.23__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.
Files changed (368) hide show
  1. clear_skies-2.0.23.dist-info/METADATA +76 -0
  2. clear_skies-2.0.23.dist-info/RECORD +265 -0
  3. {clear_skies-1.22.10.dist-info → clear_skies-2.0.23.dist-info}/WHEEL +1 -1
  4. clearskies/__init__.py +37 -21
  5. clearskies/action.py +7 -0
  6. clearskies/authentication/__init__.py +8 -39
  7. clearskies/authentication/authentication.py +44 -0
  8. clearskies/authentication/authorization.py +14 -8
  9. clearskies/authentication/authorization_pass_through.py +14 -10
  10. clearskies/authentication/jwks.py +135 -58
  11. clearskies/authentication/public.py +3 -26
  12. clearskies/authentication/secret_bearer.py +515 -44
  13. clearskies/autodoc/formats/oai3_json/__init__.py +2 -2
  14. clearskies/autodoc/formats/oai3_json/oai3_json.py +11 -9
  15. clearskies/autodoc/formats/oai3_json/parameter.py +6 -3
  16. clearskies/autodoc/formats/oai3_json/request.py +7 -5
  17. clearskies/autodoc/formats/oai3_json/response.py +7 -4
  18. clearskies/autodoc/formats/oai3_json/schema/object.py +10 -1
  19. clearskies/autodoc/request/__init__.py +2 -0
  20. clearskies/autodoc/request/header.py +4 -6
  21. clearskies/autodoc/request/json_body.py +4 -6
  22. clearskies/autodoc/request/parameter.py +8 -0
  23. clearskies/autodoc/request/request.py +16 -4
  24. clearskies/autodoc/request/url_parameter.py +4 -6
  25. clearskies/autodoc/request/url_path.py +4 -6
  26. clearskies/autodoc/schema/__init__.py +4 -2
  27. clearskies/autodoc/schema/array.py +5 -6
  28. clearskies/autodoc/schema/boolean.py +4 -10
  29. clearskies/autodoc/schema/date.py +0 -3
  30. clearskies/autodoc/schema/datetime.py +1 -4
  31. clearskies/autodoc/schema/double.py +0 -3
  32. clearskies/autodoc/schema/enum.py +4 -2
  33. clearskies/autodoc/schema/integer.py +4 -9
  34. clearskies/autodoc/schema/long.py +0 -3
  35. clearskies/autodoc/schema/number.py +4 -9
  36. clearskies/autodoc/schema/object.py +5 -7
  37. clearskies/autodoc/schema/password.py +0 -3
  38. clearskies/autodoc/schema/schema.py +11 -0
  39. clearskies/autodoc/schema/string.py +4 -10
  40. clearskies/backends/__init__.py +55 -20
  41. clearskies/backends/api_backend.py +1118 -280
  42. clearskies/backends/backend.py +54 -85
  43. clearskies/backends/cursor_backend.py +246 -191
  44. clearskies/backends/memory_backend.py +514 -208
  45. clearskies/backends/secrets_backend.py +68 -31
  46. clearskies/column.py +1221 -0
  47. clearskies/columns/__init__.py +71 -0
  48. clearskies/columns/audit.py +306 -0
  49. clearskies/columns/belongs_to_id.py +478 -0
  50. clearskies/columns/belongs_to_model.py +129 -0
  51. clearskies/columns/belongs_to_self.py +109 -0
  52. clearskies/columns/boolean.py +110 -0
  53. clearskies/columns/category_tree.py +273 -0
  54. clearskies/columns/category_tree_ancestors.py +51 -0
  55. clearskies/columns/category_tree_children.py +126 -0
  56. clearskies/columns/category_tree_descendants.py +48 -0
  57. clearskies/columns/created.py +92 -0
  58. clearskies/columns/created_by_authorization_data.py +114 -0
  59. clearskies/columns/created_by_header.py +103 -0
  60. clearskies/columns/created_by_ip.py +90 -0
  61. clearskies/columns/created_by_routing_data.py +102 -0
  62. clearskies/columns/created_by_user_agent.py +89 -0
  63. clearskies/columns/date.py +232 -0
  64. clearskies/columns/datetime.py +284 -0
  65. clearskies/columns/email.py +78 -0
  66. clearskies/columns/float.py +149 -0
  67. clearskies/columns/has_many.py +529 -0
  68. clearskies/columns/has_many_self.py +62 -0
  69. clearskies/columns/has_one.py +21 -0
  70. clearskies/columns/integer.py +158 -0
  71. clearskies/columns/json.py +126 -0
  72. clearskies/columns/many_to_many_ids.py +335 -0
  73. clearskies/columns/many_to_many_ids_with_data.py +274 -0
  74. clearskies/columns/many_to_many_models.py +156 -0
  75. clearskies/columns/many_to_many_pivots.py +132 -0
  76. clearskies/columns/phone.py +162 -0
  77. clearskies/columns/select.py +95 -0
  78. clearskies/columns/string.py +102 -0
  79. clearskies/columns/timestamp.py +164 -0
  80. clearskies/columns/updated.py +107 -0
  81. clearskies/columns/uuid.py +83 -0
  82. clearskies/configs/README.md +105 -0
  83. clearskies/configs/__init__.py +170 -0
  84. clearskies/configs/actions.py +43 -0
  85. clearskies/configs/any.py +15 -0
  86. clearskies/configs/any_dict.py +24 -0
  87. clearskies/configs/any_dict_or_callable.py +25 -0
  88. clearskies/configs/authentication.py +23 -0
  89. clearskies/configs/authorization.py +23 -0
  90. clearskies/configs/boolean.py +18 -0
  91. clearskies/configs/boolean_or_callable.py +20 -0
  92. clearskies/configs/callable_config.py +20 -0
  93. clearskies/configs/columns.py +34 -0
  94. clearskies/configs/conditions.py +30 -0
  95. clearskies/configs/config.py +26 -0
  96. clearskies/configs/datetime.py +20 -0
  97. clearskies/configs/datetime_or_callable.py +21 -0
  98. clearskies/configs/email.py +10 -0
  99. clearskies/configs/email_list.py +17 -0
  100. clearskies/configs/email_list_or_callable.py +17 -0
  101. clearskies/configs/email_or_email_list_or_callable.py +59 -0
  102. clearskies/configs/endpoint.py +23 -0
  103. clearskies/configs/endpoint_list.py +29 -0
  104. clearskies/configs/float.py +18 -0
  105. clearskies/configs/float_or_callable.py +20 -0
  106. clearskies/configs/headers.py +28 -0
  107. clearskies/configs/integer.py +18 -0
  108. clearskies/configs/integer_or_callable.py +20 -0
  109. clearskies/configs/joins.py +30 -0
  110. clearskies/configs/list_any_dict.py +32 -0
  111. clearskies/configs/list_any_dict_or_callable.py +33 -0
  112. clearskies/configs/model_class.py +35 -0
  113. clearskies/configs/model_column.py +67 -0
  114. clearskies/configs/model_columns.py +58 -0
  115. clearskies/configs/model_destination_name.py +26 -0
  116. clearskies/configs/model_to_id_column.py +45 -0
  117. clearskies/configs/readable_model_column.py +11 -0
  118. clearskies/configs/readable_model_columns.py +11 -0
  119. clearskies/configs/schema.py +23 -0
  120. clearskies/configs/searchable_model_columns.py +11 -0
  121. clearskies/configs/security_headers.py +39 -0
  122. clearskies/configs/select.py +28 -0
  123. clearskies/configs/select_list.py +49 -0
  124. clearskies/configs/string.py +31 -0
  125. clearskies/configs/string_dict.py +34 -0
  126. clearskies/configs/string_list.py +47 -0
  127. clearskies/configs/string_list_or_callable.py +48 -0
  128. clearskies/configs/string_or_callable.py +18 -0
  129. clearskies/configs/timedelta.py +20 -0
  130. clearskies/configs/timezone.py +20 -0
  131. clearskies/configs/url.py +25 -0
  132. clearskies/configs/validators.py +45 -0
  133. clearskies/configs/writeable_model_column.py +11 -0
  134. clearskies/configs/writeable_model_columns.py +11 -0
  135. clearskies/configurable.py +78 -0
  136. clearskies/contexts/__init__.py +8 -8
  137. clearskies/contexts/cli.py +129 -43
  138. clearskies/contexts/context.py +93 -56
  139. clearskies/contexts/wsgi.py +79 -33
  140. clearskies/contexts/wsgi_ref.py +87 -0
  141. clearskies/cursors/__init__.py +7 -0
  142. clearskies/cursors/cursor.py +166 -0
  143. clearskies/cursors/from_environment/__init__.py +5 -0
  144. clearskies/cursors/from_environment/mysql.py +51 -0
  145. clearskies/cursors/from_environment/postgresql.py +49 -0
  146. clearskies/cursors/from_environment/sqlite.py +35 -0
  147. clearskies/cursors/mysql.py +61 -0
  148. clearskies/cursors/postgresql.py +61 -0
  149. clearskies/cursors/sqlite.py +62 -0
  150. clearskies/decorators.py +33 -0
  151. clearskies/decorators.pyi +10 -0
  152. clearskies/di/__init__.py +11 -7
  153. clearskies/di/additional_config.py +115 -4
  154. clearskies/di/additional_config_auto_import.py +12 -0
  155. clearskies/di/di.py +714 -125
  156. clearskies/di/inject/__init__.py +23 -0
  157. clearskies/di/inject/akeyless_sdk.py +16 -0
  158. clearskies/di/inject/by_class.py +24 -0
  159. clearskies/di/inject/by_name.py +22 -0
  160. clearskies/di/inject/di.py +16 -0
  161. clearskies/di/inject/environment.py +15 -0
  162. clearskies/di/inject/input_output.py +19 -0
  163. clearskies/di/inject/now.py +16 -0
  164. clearskies/di/inject/requests.py +16 -0
  165. clearskies/di/inject/secrets.py +15 -0
  166. clearskies/di/inject/utcnow.py +16 -0
  167. clearskies/di/inject/uuid.py +16 -0
  168. clearskies/di/injectable.py +32 -0
  169. clearskies/di/injectable_properties.py +131 -0
  170. clearskies/end.py +219 -0
  171. clearskies/endpoint.py +1303 -0
  172. clearskies/endpoint_group.py +333 -0
  173. clearskies/endpoints/__init__.py +25 -0
  174. clearskies/endpoints/advanced_search.py +519 -0
  175. clearskies/endpoints/callable.py +382 -0
  176. clearskies/endpoints/create.py +201 -0
  177. clearskies/endpoints/delete.py +133 -0
  178. clearskies/endpoints/get.py +267 -0
  179. clearskies/endpoints/health_check.py +181 -0
  180. clearskies/endpoints/list.py +567 -0
  181. clearskies/endpoints/restful_api.py +417 -0
  182. clearskies/endpoints/schema.py +185 -0
  183. clearskies/endpoints/simple_search.py +279 -0
  184. clearskies/endpoints/update.py +188 -0
  185. clearskies/environment.py +7 -3
  186. clearskies/exceptions/__init__.py +19 -0
  187. clearskies/{handlers/exceptions/input_error.py → exceptions/input_errors.py} +1 -1
  188. clearskies/exceptions/missing_dependency.py +2 -0
  189. clearskies/exceptions/moved_permanently.py +3 -0
  190. clearskies/exceptions/moved_temporarily.py +3 -0
  191. clearskies/functional/__init__.py +2 -2
  192. clearskies/functional/json.py +47 -0
  193. clearskies/functional/routing.py +92 -0
  194. clearskies/functional/string.py +19 -11
  195. clearskies/functional/validations.py +61 -9
  196. clearskies/input_outputs/__init__.py +9 -7
  197. clearskies/input_outputs/cli.py +135 -160
  198. clearskies/input_outputs/exceptions/__init__.py +6 -1
  199. clearskies/input_outputs/headers.py +54 -0
  200. clearskies/input_outputs/input_output.py +77 -123
  201. clearskies/input_outputs/programmatic.py +62 -0
  202. clearskies/input_outputs/wsgi.py +36 -48
  203. clearskies/model.py +1874 -193
  204. clearskies/query/__init__.py +12 -0
  205. clearskies/query/condition.py +228 -0
  206. clearskies/query/join.py +136 -0
  207. clearskies/query/query.py +193 -0
  208. clearskies/query/sort.py +27 -0
  209. clearskies/schema.py +82 -0
  210. clearskies/secrets/__init__.py +4 -31
  211. clearskies/secrets/additional_configs/mysql_connection_dynamic_producer.py +15 -4
  212. clearskies/secrets/additional_configs/mysql_connection_dynamic_producer_via_ssh_cert_bastion.py +11 -5
  213. clearskies/secrets/akeyless.py +421 -155
  214. clearskies/secrets/exceptions/__init__.py +7 -1
  215. clearskies/secrets/exceptions/not_found_error.py +2 -0
  216. clearskies/secrets/exceptions/permissions_error.py +2 -0
  217. clearskies/secrets/secrets.py +12 -11
  218. clearskies/security_header.py +17 -0
  219. clearskies/security_headers/__init__.py +8 -8
  220. clearskies/security_headers/cache_control.py +47 -109
  221. clearskies/security_headers/cors.py +38 -92
  222. clearskies/security_headers/csp.py +76 -150
  223. clearskies/security_headers/hsts.py +14 -15
  224. clearskies/typing.py +11 -0
  225. clearskies/validator.py +36 -0
  226. clearskies/validators/__init__.py +33 -0
  227. clearskies/validators/after_column.py +61 -0
  228. clearskies/validators/before_column.py +15 -0
  229. clearskies/validators/in_the_future.py +29 -0
  230. clearskies/validators/in_the_future_at_least.py +13 -0
  231. clearskies/validators/in_the_future_at_most.py +12 -0
  232. clearskies/validators/in_the_past.py +29 -0
  233. clearskies/validators/in_the_past_at_least.py +12 -0
  234. clearskies/validators/in_the_past_at_most.py +12 -0
  235. clearskies/validators/maximum_length.py +25 -0
  236. clearskies/validators/maximum_value.py +28 -0
  237. clearskies/validators/minimum_length.py +25 -0
  238. clearskies/validators/minimum_value.py +28 -0
  239. clearskies/{input_requirements → validators}/required.py +18 -9
  240. clearskies/validators/timedelta.py +58 -0
  241. clearskies/validators/unique.py +28 -0
  242. clear_skies-1.22.10.dist-info/METADATA +0 -47
  243. clear_skies-1.22.10.dist-info/RECORD +0 -213
  244. clearskies/application.py +0 -29
  245. clearskies/authentication/auth0_jwks.py +0 -118
  246. clearskies/authentication/auth_exception.py +0 -2
  247. clearskies/authentication/jwks_jwcrypto.py +0 -51
  248. clearskies/backends/api_get_only_backend.py +0 -48
  249. clearskies/backends/example_backend.py +0 -43
  250. clearskies/backends/file_backend.py +0 -48
  251. clearskies/backends/json_backend.py +0 -7
  252. clearskies/backends/restful_api_advanced_search_backend.py +0 -103
  253. clearskies/binding_config.py +0 -16
  254. clearskies/column_types/__init__.py +0 -203
  255. clearskies/column_types/audit.py +0 -249
  256. clearskies/column_types/belongs_to.py +0 -271
  257. clearskies/column_types/boolean.py +0 -60
  258. clearskies/column_types/category_tree.py +0 -304
  259. clearskies/column_types/column.py +0 -373
  260. clearskies/column_types/created.py +0 -26
  261. clearskies/column_types/created_by_authorization_data.py +0 -26
  262. clearskies/column_types/created_by_header.py +0 -24
  263. clearskies/column_types/created_by_ip.py +0 -17
  264. clearskies/column_types/created_by_routing_data.py +0 -25
  265. clearskies/column_types/created_by_user_agent.py +0 -17
  266. clearskies/column_types/created_micro.py +0 -26
  267. clearskies/column_types/datetime.py +0 -109
  268. clearskies/column_types/datetime_micro.py +0 -13
  269. clearskies/column_types/email.py +0 -18
  270. clearskies/column_types/float.py +0 -43
  271. clearskies/column_types/has_many.py +0 -179
  272. clearskies/column_types/has_one.py +0 -58
  273. clearskies/column_types/integer.py +0 -41
  274. clearskies/column_types/json.py +0 -25
  275. clearskies/column_types/many_to_many.py +0 -278
  276. clearskies/column_types/many_to_many_with_data.py +0 -162
  277. clearskies/column_types/phone.py +0 -48
  278. clearskies/column_types/select.py +0 -11
  279. clearskies/column_types/string.py +0 -24
  280. clearskies/column_types/timestamp.py +0 -73
  281. clearskies/column_types/updated.py +0 -26
  282. clearskies/column_types/updated_micro.py +0 -26
  283. clearskies/column_types/uuid.py +0 -25
  284. clearskies/columns.py +0 -123
  285. clearskies/condition_parser.py +0 -172
  286. clearskies/contexts/build_context.py +0 -54
  287. clearskies/contexts/convert_to_application.py +0 -190
  288. clearskies/contexts/extract_handler.py +0 -37
  289. clearskies/contexts/test.py +0 -94
  290. clearskies/decorators/__init__.py +0 -39
  291. clearskies/decorators/auth0_jwks.py +0 -22
  292. clearskies/decorators/authorization.py +0 -10
  293. clearskies/decorators/binding_classes.py +0 -9
  294. clearskies/decorators/binding_modules.py +0 -9
  295. clearskies/decorators/bindings.py +0 -9
  296. clearskies/decorators/create.py +0 -10
  297. clearskies/decorators/delete.py +0 -10
  298. clearskies/decorators/docs.py +0 -14
  299. clearskies/decorators/get.py +0 -10
  300. clearskies/decorators/jwks.py +0 -26
  301. clearskies/decorators/merge.py +0 -124
  302. clearskies/decorators/patch.py +0 -10
  303. clearskies/decorators/post.py +0 -10
  304. clearskies/decorators/public.py +0 -11
  305. clearskies/decorators/response_headers.py +0 -10
  306. clearskies/decorators/return_raw_response.py +0 -9
  307. clearskies/decorators/schema.py +0 -10
  308. clearskies/decorators/secret_bearer.py +0 -24
  309. clearskies/decorators/security_headers.py +0 -10
  310. clearskies/di/standard_dependencies.py +0 -151
  311. clearskies/di/test_module/__init__.py +0 -6
  312. clearskies/di/test_module/another_module/__init__.py +0 -2
  313. clearskies/di/test_module/module_class.py +0 -5
  314. clearskies/handlers/__init__.py +0 -41
  315. clearskies/handlers/advanced_search.py +0 -271
  316. clearskies/handlers/base.py +0 -479
  317. clearskies/handlers/callable.py +0 -191
  318. clearskies/handlers/create.py +0 -35
  319. clearskies/handlers/crud_by_method.py +0 -18
  320. clearskies/handlers/database_connector.py +0 -32
  321. clearskies/handlers/delete.py +0 -61
  322. clearskies/handlers/exceptions/__init__.py +0 -5
  323. clearskies/handlers/exceptions/not_found.py +0 -3
  324. clearskies/handlers/get.py +0 -156
  325. clearskies/handlers/health_check.py +0 -59
  326. clearskies/handlers/input_processing.py +0 -79
  327. clearskies/handlers/list.py +0 -530
  328. clearskies/handlers/mygrations.py +0 -82
  329. clearskies/handlers/request_method_routing.py +0 -47
  330. clearskies/handlers/restful_api.py +0 -218
  331. clearskies/handlers/routing.py +0 -62
  332. clearskies/handlers/schema_helper.py +0 -128
  333. clearskies/handlers/simple_routing.py +0 -206
  334. clearskies/handlers/simple_routing_route.py +0 -192
  335. clearskies/handlers/simple_search.py +0 -136
  336. clearskies/handlers/update.py +0 -96
  337. clearskies/handlers/write.py +0 -193
  338. clearskies/input_requirements/__init__.py +0 -78
  339. clearskies/input_requirements/after.py +0 -36
  340. clearskies/input_requirements/before.py +0 -36
  341. clearskies/input_requirements/in_the_future_at_least.py +0 -19
  342. clearskies/input_requirements/in_the_future_at_most.py +0 -19
  343. clearskies/input_requirements/in_the_past_at_least.py +0 -19
  344. clearskies/input_requirements/in_the_past_at_most.py +0 -19
  345. clearskies/input_requirements/maximum_length.py +0 -19
  346. clearskies/input_requirements/maximum_value.py +0 -19
  347. clearskies/input_requirements/minimum_length.py +0 -22
  348. clearskies/input_requirements/minimum_value.py +0 -19
  349. clearskies/input_requirements/requirement.py +0 -25
  350. clearskies/input_requirements/time_delta.py +0 -38
  351. clearskies/input_requirements/unique.py +0 -18
  352. clearskies/mocks/__init__.py +0 -7
  353. clearskies/mocks/input_output.py +0 -124
  354. clearskies/mocks/models.py +0 -142
  355. clearskies/models.py +0 -350
  356. clearskies/security_headers/base.py +0 -12
  357. clearskies/tests/simple_api/models/__init__.py +0 -2
  358. clearskies/tests/simple_api/models/status.py +0 -23
  359. clearskies/tests/simple_api/models/user.py +0 -21
  360. clearskies/tests/simple_api/users_api.py +0 -64
  361. {clear_skies-1.22.10.dist-info → clear_skies-2.0.23.dist-info/licenses}/LICENSE +0 -0
  362. /clearskies/{contexts/bash.py → autodoc/py.typed} +0 -0
  363. /clearskies/{handlers/exceptions → exceptions}/authentication.py +0 -0
  364. /clearskies/{handlers/exceptions → exceptions}/authorization.py +0 -0
  365. /clearskies/{handlers/exceptions → exceptions}/client_error.py +0 -0
  366. /clearskies/{secrets/exceptions → exceptions}/not_found.py +0 -0
  367. /clearskies/{tests/__init__.py → input_outputs/py.typed} +0 -0
  368. /clearskies/{tests/simple_api/__init__.py → py.typed} +0 -0
@@ -1,10 +1,19 @@
1
+ from typing import Any
2
+
3
+
1
4
  class Object:
2
5
  def __init__(self, schema, oai3_schema_resolver):
3
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
+
4
13
  self.oai3_schema_resolver = oai3_schema_resolver
5
14
 
6
15
  def convert(self, include_required=False):
7
- schema = {
16
+ schema: dict[str, Any] = {
8
17
  "type": "object",
9
18
  }
10
19
 
@@ -1,5 +1,6 @@
1
1
  from .header import Header
2
2
  from .json_body import JSONBody
3
+ from .parameter import Parameter
3
4
  from .request import Request
4
5
  from .url_parameter import URLParameter
5
6
  from .url_path import URLPath
@@ -7,6 +8,7 @@ from .url_path import URLPath
7
8
  __all__ = [
8
9
  "Header",
9
10
  "JSONBody",
11
+ "Parameter",
10
12
  "Request",
11
13
  "URLParameter",
12
14
  "URLPath",
@@ -1,8 +1,6 @@
1
- class Header:
1
+ from .parameter import Parameter
2
+
3
+
4
+ class Header(Parameter):
2
5
  location = "header"
3
6
  in_body = False
4
-
5
- def __init__(self, definition, description="", required=False):
6
- self.definition = definition
7
- self.description = description
8
- self.required = required
@@ -1,8 +1,6 @@
1
- class JSONBody:
1
+ from .parameter import Parameter
2
+
3
+
4
+ class JSONBody(Parameter):
2
5
  location = "json_body"
3
6
  in_body = True
4
-
5
- def __init__(self, definition, description="", required=False):
6
- self.definition = definition
7
- self.description = description
8
- self.required = required
@@ -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
@@ -1,14 +1,26 @@
1
+ import re
2
+ from typing import Any
3
+
4
+
1
5
  class Request:
2
- description = None
3
- relative_path = None
4
- request_methods = None
5
- parameters = None
6
+ description: str = ""
7
+ relative_path: str = ""
8
+ request_methods: list[str] = []
9
+ parameters: list[Any] = []
6
10
  responses = None
7
11
  root_properties = None
8
12
 
9
13
  def __init__(
10
14
  self, description, responses, relative_path="", request_methods="GET", parameters=None, root_properties=None
11
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
+
12
24
  self.description = description
13
25
  self.responses = responses
14
26
  self.relative_path = relative_path.lstrip("/")
@@ -1,8 +1,6 @@
1
- class URLParameter:
1
+ from .parameter import Parameter
2
+
3
+
4
+ class URLParameter(Parameter):
2
5
  location = "url_parameter"
3
6
  in_body = False
4
-
5
- def __init__(self, definition, description="", required=False):
6
- self.definition = definition
7
- self.description = description
8
- self.required = required
@@ -1,8 +1,6 @@
1
- class URLPath:
1
+ from .parameter import Parameter
2
+
3
+
4
+ class URLPath(Parameter):
2
5
  location = "url_path"
3
6
  in_body = False
4
-
5
- def __init__(self, definition, description="", required=False):
6
- self.definition = definition
7
- self.description = description
8
- self.required = required
@@ -2,7 +2,7 @@ from .array import Array
2
2
  from .base64 import Base64
3
3
  from .boolean import Boolean
4
4
  from .date import Date
5
- from .datetime import DateTime
5
+ from .datetime import Datetime
6
6
  from .double import Double
7
7
  from .enum import Enum
8
8
  from .integer import Integer
@@ -10,6 +10,7 @@ from .long import Long
10
10
  from .number import Number
11
11
  from .object import Object
12
12
  from .password import Password
13
+ from .schema import Schema
13
14
  from .string import String
14
15
 
15
16
  __all__ = [
@@ -17,7 +18,7 @@ __all__ = [
17
18
  "Base64",
18
19
  "Boolean",
19
20
  "Date",
20
- "DateTime",
21
+ "Datetime",
21
22
  "Double",
22
23
  "Enum",
23
24
  "Integer",
@@ -25,5 +26,6 @@ __all__ = [
25
26
  "Number",
26
27
  "Object",
27
28
  "Password",
29
+ "Schema",
28
30
  "String",
29
31
  ]
@@ -1,11 +1,10 @@
1
- class Array:
2
- name = None
3
- value = None
1
+ from .schema import Schema
2
+
3
+
4
+ class Array(Schema):
4
5
  item_definition = None
5
6
  _type = "array"
6
- _format = ""
7
7
 
8
8
  def __init__(self, name, item_definition, value=None):
9
- self.name = name
10
- self.value = value
9
+ super().__init__(name, example=None, value=value)
11
10
  self.item_definition = item_definition
@@ -1,11 +1,5 @@
1
- class Boolean:
2
- name = None
3
- example = None
4
- value = None
5
- _type = "boolean"
6
- _format = ""
1
+ from .schema import Schema
2
+
7
3
 
8
- def __init__(self, name, example=None, value=None):
9
- self.name = name
10
- self.example = example
11
- self.value = value
4
+ class Boolean(Schema):
5
+ _type = "boolean"
@@ -3,6 +3,3 @@ from .string import String
3
3
 
4
4
  class Date(String):
5
5
  _format = "date"
6
-
7
- def __init__(self, name, example=None, value=None):
8
- super().__init__(name, example=example, value=value)
@@ -1,8 +1,5 @@
1
1
  from .string import String
2
2
 
3
3
 
4
- class DateTime(String):
4
+ class Datetime(String):
5
5
  _format = "date-time"
6
-
7
- def __init__(self, name, example=None, value=None):
8
- super().__init__(name, example=example, value=value)
@@ -3,6 +3,3 @@ from .number import Number
3
3
 
4
4
  class Double(Number):
5
5
  _format = "double"
6
-
7
- def __init__(self, name, example=None, value=None):
8
- super().__init__(name, example=example, value=value)
@@ -1,5 +1,7 @@
1
- class Enum:
2
- name = None
1
+ from .schema import Schema
2
+
3
+
4
+ class Enum(Schema):
3
5
  values = None
4
6
  value_type = None
5
7
  example = None
@@ -1,11 +1,6 @@
1
- class Integer:
2
- name = None
3
- example = None
4
- value = None
1
+ from .schema import Schema
2
+
3
+
4
+ class Integer(Schema):
5
5
  _type = "integer"
6
6
  _format = "int32"
7
-
8
- def __init__(self, name, example=None, value=None):
9
- self.name = name
10
- self.example = example
11
- self.value = value
@@ -3,6 +3,3 @@ from .integer import Integer
3
3
 
4
4
  class Long(Integer):
5
5
  _format = "int64"
6
-
7
- def __init__(self, name, example=None, value=None):
8
- super().__init__(name, example=example, value=value)
@@ -1,11 +1,6 @@
1
- class Number:
2
- name = None
3
- example = None
4
- value = None
1
+ from .schema import Schema
2
+
3
+
4
+ class Number(Schema):
5
5
  _type = "number"
6
6
  _format = "float"
7
-
8
- def __init__(self, name, example=None, value=None):
9
- self.name = name
10
- self.example = example
11
- self.value = value
@@ -1,15 +1,13 @@
1
- class Object:
2
- name = None
1
+ from .schema import Schema
2
+
3
+
4
+ class Object(Schema):
3
5
  children = None
4
- value = None
5
- example = None
6
6
  model_name = None
7
7
  _type = "object"
8
8
  _format = ""
9
9
 
10
10
  def __init__(self, name, children, value=None, example=None, model_name=None):
11
- self.name = name
11
+ super().__init__(name, example=example, value=value)
12
12
  self.children = children
13
- self.value = value
14
- self.example = example
15
13
  self.model_name = model_name
@@ -3,6 +3,3 @@ from .string import String
3
3
 
4
4
  class Password(String):
5
5
  _format = "password"
6
-
7
- def __init__(self, name, example=None, value=None):
8
- super().__init__(name, example=example, value=value)
@@ -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
@@ -1,11 +1,5 @@
1
- class String:
2
- name = None
3
- example = None
4
- value = None
5
- _type = "string"
6
- _format = ""
1
+ from .schema import Schema
7
2
 
8
- def __init__(self, name, example=None, value=None):
9
- self.name = name
10
- self.example = example
11
- self.value = value
3
+
4
+ class String(Schema):
5
+ pass
@@ -1,30 +1,65 @@
1
- from .. import binding_config
2
- from .api_backend import ApiBackend
3
- from .api_get_only_backend import ApiGetOnlyBackend
4
- from .backend import Backend
5
- from .cursor_backend import CursorBackend
6
- from .example_backend import ExampleBackend
7
- from .file_backend import FileBackend
8
- from .json_backend import JsonBackend
9
- from .memory_backend import MemoryBackend
10
- from .restful_api_advanced_search_backend import RestfulApiAdvancedSearchBackend
11
- from .secrets_backend import SecretsBackend
1
+ """
2
+ The backend system provides a layer of abstraction between a clearskies model and the place where it stores its data.
12
3
 
4
+ ## Motivation
13
5
 
14
- def example_backend(data):
15
- return binding_config.BindingConfig(ExampleBackend, data=data)
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
16
55
 
17
56
 
18
57
  __all__ = [
19
58
  "ApiBackend",
20
- "ApiGetOnlyBackend",
59
+ # "ApiGetOnlyBackend",
21
60
  "Backend",
22
61
  "CursorBackend",
23
- "ExampleBackend",
24
- "example_backend",
25
- "FileBackend",
26
- "JsonBackend",
27
62
  "MemoryBackend",
28
- "RestfulApiAdvancedSearchBackend",
29
- "SecretsBackend",
63
+ # "RestfulApiAdvancedSearchBackend",
64
+ # "SecretsBackend",
30
65
  ]