clear-skies 1.19.22__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 (362) 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.19.22.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 +9 -38
  7. clearskies/authentication/authentication.py +44 -0
  8. clearskies/authentication/authorization.py +14 -8
  9. clearskies/authentication/authorization_pass_through.py +22 -0
  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 +56 -17
  41. clearskies/backends/api_backend.py +1128 -166
  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 +117 -3
  154. clearskies/di/additional_config_auto_import.py +12 -0
  155. clearskies/di/di.py +717 -126
  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 -152
  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 +1894 -199
  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.19.22.dist-info/METADATA +0 -46
  243. clear_skies-1.19.22.dist-info/RECORD +0 -206
  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 -39
  248. clearskies/backends/example_backend.py +0 -43
  249. clearskies/backends/file_backend.py +0 -48
  250. clearskies/backends/json_backend.py +0 -7
  251. clearskies/backends/restful_api_advanced_search_backend.py +0 -138
  252. clearskies/binding_config.py +0 -16
  253. clearskies/column_types/__init__.py +0 -184
  254. clearskies/column_types/audit.py +0 -235
  255. clearskies/column_types/belongs_to.py +0 -250
  256. clearskies/column_types/boolean.py +0 -60
  257. clearskies/column_types/category_tree.py +0 -226
  258. clearskies/column_types/column.py +0 -373
  259. clearskies/column_types/created.py +0 -26
  260. clearskies/column_types/created_by_authorization_data.py +0 -26
  261. clearskies/column_types/created_by_header.py +0 -24
  262. clearskies/column_types/created_by_ip.py +0 -17
  263. clearskies/column_types/created_by_routing_data.py +0 -25
  264. clearskies/column_types/created_by_user_agent.py +0 -17
  265. clearskies/column_types/created_micro.py +0 -26
  266. clearskies/column_types/datetime.py +0 -108
  267. clearskies/column_types/datetime_micro.py +0 -12
  268. clearskies/column_types/email.py +0 -18
  269. clearskies/column_types/float.py +0 -43
  270. clearskies/column_types/has_many.py +0 -139
  271. clearskies/column_types/integer.py +0 -41
  272. clearskies/column_types/json.py +0 -25
  273. clearskies/column_types/many_to_many.py +0 -278
  274. clearskies/column_types/many_to_many_with_data.py +0 -162
  275. clearskies/column_types/select.py +0 -11
  276. clearskies/column_types/string.py +0 -24
  277. clearskies/column_types/updated.py +0 -24
  278. clearskies/column_types/updated_micro.py +0 -24
  279. clearskies/column_types/uuid.py +0 -25
  280. clearskies/columns.py +0 -123
  281. clearskies/condition_parser.py +0 -172
  282. clearskies/contexts/build_context.py +0 -54
  283. clearskies/contexts/convert_to_application.py +0 -190
  284. clearskies/contexts/extract_handler.py +0 -37
  285. clearskies/contexts/test.py +0 -94
  286. clearskies/decorators/__init__.py +0 -39
  287. clearskies/decorators/auth0_jwks.py +0 -22
  288. clearskies/decorators/authorization.py +0 -10
  289. clearskies/decorators/binding_classes.py +0 -9
  290. clearskies/decorators/binding_modules.py +0 -9
  291. clearskies/decorators/bindings.py +0 -9
  292. clearskies/decorators/create.py +0 -10
  293. clearskies/decorators/delete.py +0 -10
  294. clearskies/decorators/docs.py +0 -14
  295. clearskies/decorators/get.py +0 -10
  296. clearskies/decorators/jwks.py +0 -26
  297. clearskies/decorators/merge.py +0 -124
  298. clearskies/decorators/patch.py +0 -10
  299. clearskies/decorators/post.py +0 -10
  300. clearskies/decorators/public.py +0 -11
  301. clearskies/decorators/response_headers.py +0 -10
  302. clearskies/decorators/return_raw_response.py +0 -9
  303. clearskies/decorators/schema.py +0 -10
  304. clearskies/decorators/secret_bearer.py +0 -24
  305. clearskies/decorators/security_headers.py +0 -10
  306. clearskies/di/standard_dependencies.py +0 -140
  307. clearskies/di/test_module/__init__.py +0 -6
  308. clearskies/di/test_module/another_module/__init__.py +0 -2
  309. clearskies/di/test_module/module_class.py +0 -5
  310. clearskies/handlers/__init__.py +0 -41
  311. clearskies/handlers/advanced_search.py +0 -271
  312. clearskies/handlers/base.py +0 -473
  313. clearskies/handlers/callable.py +0 -189
  314. clearskies/handlers/create.py +0 -35
  315. clearskies/handlers/crud_by_method.py +0 -18
  316. clearskies/handlers/database_connector.py +0 -32
  317. clearskies/handlers/delete.py +0 -61
  318. clearskies/handlers/exceptions/__init__.py +0 -5
  319. clearskies/handlers/exceptions/not_found.py +0 -3
  320. clearskies/handlers/get.py +0 -156
  321. clearskies/handlers/health_check.py +0 -59
  322. clearskies/handlers/input_processing.py +0 -79
  323. clearskies/handlers/list.py +0 -530
  324. clearskies/handlers/mygrations.py +0 -82
  325. clearskies/handlers/request_method_routing.py +0 -47
  326. clearskies/handlers/restful_api.py +0 -218
  327. clearskies/handlers/routing.py +0 -62
  328. clearskies/handlers/schema_helper.py +0 -128
  329. clearskies/handlers/simple_routing.py +0 -204
  330. clearskies/handlers/simple_routing_route.py +0 -192
  331. clearskies/handlers/simple_search.py +0 -136
  332. clearskies/handlers/update.py +0 -96
  333. clearskies/handlers/write.py +0 -193
  334. clearskies/input_requirements/__init__.py +0 -68
  335. clearskies/input_requirements/after.py +0 -36
  336. clearskies/input_requirements/before.py +0 -36
  337. clearskies/input_requirements/in_the_future_at_least.py +0 -19
  338. clearskies/input_requirements/in_the_future_at_most.py +0 -19
  339. clearskies/input_requirements/in_the_past_at_least.py +0 -19
  340. clearskies/input_requirements/in_the_past_at_most.py +0 -19
  341. clearskies/input_requirements/maximum_length.py +0 -19
  342. clearskies/input_requirements/minimum_length.py +0 -22
  343. clearskies/input_requirements/requirement.py +0 -25
  344. clearskies/input_requirements/time_delta.py +0 -38
  345. clearskies/input_requirements/unique.py +0 -18
  346. clearskies/mocks/__init__.py +0 -7
  347. clearskies/mocks/input_output.py +0 -124
  348. clearskies/mocks/models.py +0 -142
  349. clearskies/models.py +0 -345
  350. clearskies/security_headers/base.py +0 -12
  351. clearskies/tests/simple_api/models/__init__.py +0 -2
  352. clearskies/tests/simple_api/models/status.py +0 -23
  353. clearskies/tests/simple_api/models/user.py +0 -21
  354. clearskies/tests/simple_api/users_api.py +0 -64
  355. {clear_skies-1.19.22.dist-info → clear_skies-2.0.23.dist-info/licenses}/LICENSE +0 -0
  356. /clearskies/{contexts/bash.py → autodoc/py.typed} +0 -0
  357. /clearskies/{handlers/exceptions → exceptions}/authentication.py +0 -0
  358. /clearskies/{handlers/exceptions → exceptions}/authorization.py +0 -0
  359. /clearskies/{handlers/exceptions → exceptions}/client_error.py +0 -0
  360. /clearskies/{secrets/exceptions → exceptions}/not_found.py +0 -0
  361. /clearskies/{tests/__init__.py → input_outputs/py.typed} +0 -0
  362. /clearskies/{tests/simple_api/__init__.py → py.typed} +0 -0
@@ -1,14 +0,0 @@
1
- from .merge import merge
2
-
3
-
4
- def docs(doc_description=None, doc_model_name=None, doc_response_data_schema=None):
5
- def wrap_in_application(function):
6
- return merge(
7
- function,
8
- doc_description=doc_description,
9
- doc_model_name=doc_model_name,
10
- doc_response_data_schema=doc_response_data_schema,
11
- )
12
-
13
- wrap_in_application.is_wrapped_application = True
14
- return wrap_in_application
@@ -1,10 +0,0 @@
1
- from .merge import merge
2
-
3
-
4
- def get(path, **kwargs):
5
- def wrap_in_application(function):
6
- kwargs["path"] = path
7
- return merge(function, **{**kwargs, "methods": "GET"})
8
-
9
- wrap_in_application.is_wrapped_application = True
10
- return wrap_in_application
@@ -1,26 +0,0 @@
1
- from .merge import merge
2
- from typing import List, Optional
3
- from ..authentication import jwks as jwks_binding
4
-
5
-
6
- def jwks(
7
- jwks_url: str,
8
- audience: Optional[str] = None,
9
- issuer: Optional[str] = None,
10
- algorithms: Optional[List[str]] = None,
11
- documentation_security_name: Optional[str] = None,
12
- jwks_cache_time: Optional[int] = None,
13
- ):
14
- def wrap_in_application(function):
15
- auth0 = jwks_binding(
16
- jwks_url=jwks_url,
17
- audience=audience,
18
- issuer=issuer,
19
- algorithms=algorithms,
20
- documentation_security_name=documentation_security_name,
21
- jwks_cache_time=jwks_cache_time,
22
- )
23
- return merge(function, authentication=auth0)
24
-
25
- wrap_in_application.is_wrapped_application = True
26
- return wrap_in_application
@@ -1,124 +0,0 @@
1
- from ..application import Application
2
- from ..handlers import callable as callable_handler
3
- from ..handlers import simple_routing
4
- from typing import Any, Dict, Set
5
-
6
- routing_kwargs = ["path", "methods"]
7
- binding_kwargs = ["bindings", "binding_classes", "binding_modules"]
8
-
9
-
10
- def merge(function: callable, **kwargs: Dict[str, Any]) -> Application:
11
- is_wrapped_application = getattr(function, "is_wrapped_application", False)
12
- binding_configs = extract_binding_configs(kwargs)
13
- callable_configs = extract_callable_configs(kwargs)
14
- routing_configs = extract_routing_configs(kwargs)
15
-
16
- # if ths is the first decorator added then we need to wrap it in an application
17
- if not is_wrapped_application and type(function) != Application:
18
- application = Application(
19
- callable_handler.Callable,
20
- {**callable_configs, "callable": function},
21
- **binding_configs,
22
- )
23
- # and if we have a route then we also want to wrap it in a router. Note that
24
- # there is a possible future issue in here and things will break if path
25
- # and methods are not specified at the same time.
26
- if "path" in kwargs:
27
- application = Application(
28
- simple_routing.SimpleRouting,
29
- {
30
- "routes": [
31
- {
32
- **routing_configs,
33
- "handler_class": application.handler_class,
34
- "handler_config": application.handler_config,
35
- },
36
- ],
37
- },
38
- **binding_configs,
39
- )
40
- # and then we are all done
41
- return application
42
-
43
- # if we got here then we have a wrapped application, which means that function will return an
44
- # application when called... except when it doesn't which has to do with nested decorators and
45
- # I'm too lazy to sort it out but the below works fine.
46
- if is_wrapped_application:
47
- application = function()
48
- else:
49
- application = function
50
- authentication = application.handler_config.get("authentication")
51
-
52
- # Next question: is there a path in our kwargs? If so then we are trying to add routing to
53
- # the application.
54
- if "path" in kwargs:
55
- # before we add routing, make sure we're not double routing
56
- if application.handler_class == simple_routing.SimpleRouting:
57
- raise ValueError(
58
- "Error applying decorators: it looks like more than one routing decorator was added to a function"
59
- )
60
- # Now then, wrap the application in a router. For the inner application,
61
- # merge any configurations for the callable
62
- for binding_name in binding_kwargs:
63
- if not getattr(application, binding_name):
64
- continue
65
- from_application = getattr(application, binding_name)
66
- from_configs = binding_configs.get(binding_name, {} if type(from_application) == dict else [])
67
- if type(from_application) == dict:
68
- binding_configs[binding_name] = {**from_application, **from_configs}
69
- else:
70
- binding_configs[binding_name] = [*from_application, *from_configs]
71
- return Application(
72
- simple_routing.SimpleRouting,
73
- {
74
- "authentication": authentication,
75
- "routes": [
76
- {
77
- **routing_configs,
78
- "handler_class": application.handler_class,
79
- "handler_config": {
80
- **application.handler_config,
81
- **callable_configs,
82
- },
83
- },
84
- ],
85
- },
86
- **binding_configs,
87
- )
88
-
89
- # if we got here then we just need to merge in our callable configs. The only trick is
90
- # whether or not we have an outer routing application.
91
- if application.handler_class == simple_routing.SimpleRouting:
92
- application.handler_config["routes"][0]["handler_config"] = {
93
- **application.handler_config["routes"][0]["handler_config"],
94
- **callable_configs,
95
- }
96
-
97
- else:
98
- application.handler_config = {**application.handler_config, **callable_configs}
99
-
100
- for binding_name in binding_kwargs:
101
- if binding_configs.get(binding_name):
102
- from_application = getattr(application, binding_name)
103
- from_configs = binding_configs[binding_name]
104
- if type(from_application) == dict:
105
- setattr(application, binding_name, {**from_application, **from_configs})
106
- else:
107
- setattr(application, binding_name, [*from_application, *from_configs])
108
- return application
109
-
110
-
111
- def extract_callable_configs(kwargs: Dict[str, Any]) -> Dict[str, Any]:
112
- """Return the configuration settings from the kwargs which are valid for the callable handler."""
113
- # all configs execpt 'path' and 'methods' go with the callable
114
- return {key: kwargs[key] for key in kwargs.keys() if key not in routing_kwargs and key not in binding_kwargs}
115
-
116
-
117
- def extract_routing_configs(kwargs: Dict[str, Any]) -> Dict[str, Any]:
118
- """Return the configuration settings from the kwargs which are valid for the routing info."""
119
- return {key: kwargs[key] for key in kwargs.keys() if key in routing_kwargs}
120
-
121
-
122
- def extract_binding_configs(kwargs: Dict[str, Any]) -> Dict[str, Any]:
123
- """Return the configuration settings from the kwargs which are valid for bindings."""
124
- return {key: kwargs[key] for key in kwargs.keys() if key in binding_kwargs}
@@ -1,10 +0,0 @@
1
- from .merge import merge
2
-
3
-
4
- def patch(path, **kwargs):
5
- def wrap_in_application(function):
6
- kwargs["path"] = path
7
- return merge(function, **{**kwargs, "methods": "PATCH"})
8
-
9
- wrap_in_application.is_wrapped_application = True
10
- return wrap_in_application
@@ -1,10 +0,0 @@
1
- from .merge import merge
2
-
3
-
4
- def post(path, **kwargs):
5
- def wrap_in_application(function):
6
- kwargs["path"] = path
7
- return merge(function, **{**kwargs, "methods": "POST"})
8
-
9
- wrap_in_application.is_wrapped_application = True
10
- return wrap_in_application
@@ -1,11 +0,0 @@
1
- from .merge import merge
2
- from typing import List, Optional
3
- from ..authentication import public as public_binding
4
-
5
-
6
- def public():
7
- def wrap_in_application(function):
8
- return merge(function, authentication=public_binding())
9
-
10
- wrap_in_application.is_wrapped_application = True
11
- return wrap_in_application
@@ -1,10 +0,0 @@
1
- from .merge import merge
2
- from typing import Dict
3
-
4
-
5
- def response_headers(response_headers: Dict[str, str]):
6
- def wrap_in_application(function):
7
- return merge(function, response_headers=response_headers)
8
-
9
- wrap_in_application.is_wrapped_application = True
10
- return wrap_in_application
@@ -1,9 +0,0 @@
1
- from .merge import merge
2
-
3
-
4
- def return_raw_response():
5
- def wrap_in_application(function):
6
- return merge(function, return_raw_response=True)
7
-
8
- wrap_in_application.is_wrapped_application = True
9
- return wrap_in_application
@@ -1,10 +0,0 @@
1
- from .merge import merge
2
- from typing import Dict
3
-
4
-
5
- def schema(schema, writeable_columns=None):
6
- def wrap_in_application(function):
7
- return merge(function, schema=schema, writeable_columns=writeable_columns)
8
-
9
- wrap_in_application.is_wrapped_application = True
10
- return wrap_in_application
@@ -1,24 +0,0 @@
1
- from .merge import merge
2
- from typing import List, Optional
3
- from ..authentication import secret_bearer as secret_bearer_binding
4
-
5
-
6
- def secret_bearer(
7
- secret: str = None,
8
- secret_key: str = None,
9
- header_prefix: str = None,
10
- environment_key: str = None,
11
- documentation_security_name: str = None,
12
- ):
13
- def wrap_in_application(function):
14
- secret_bearer = secret_bearer_binding(
15
- secret=secret,
16
- environment_key=environment_key,
17
- documentation_security_name=documentation_security_name,
18
- header_prefix=header_prefix,
19
- secret_key=secret_key,
20
- )
21
- return merge(function, authentication=secret_bearer)
22
-
23
- wrap_in_application.is_wrapped_application = True
24
- return wrap_in_application
@@ -1,10 +0,0 @@
1
- from .merge import merge
2
- from typing import List, Optional
3
-
4
-
5
- def security_headers(*args):
6
- def wrap_in_application(function):
7
- return merge(function, security_headers=args)
8
-
9
- wrap_in_application.is_wrapped_application = True
10
- return wrap_in_application
@@ -1,140 +0,0 @@
1
- from .di import DI
2
- from ..columns import Columns
3
- from ..environment import Environment
4
- from ..backends import CursorBackend, JsonBackend, MemoryBackend, SecretsBackend
5
- from .. import autodoc
6
- import os
7
- import uuid
8
- import inspect
9
-
10
-
11
- class StandardDependencies(DI):
12
- def provide_requests(self):
13
- # by importing the requests library when requested, instead of in the top of the file,
14
- # it is not necessary to install the requests library if it is never used.
15
- import requests
16
- from requests.adapters import HTTPAdapter
17
- from requests.packages.urllib3.util.retry import Retry
18
-
19
- use_allowed_methods = "allowed_methods" in inspect.getfullargspec(Retry.__init__).args
20
- methods_key = "allowed_methods" if use_allowed_methods else "method_whitelist"
21
- kwargs = {
22
- "total": 3,
23
- "status_forcelist": [429, 500, 502, 503, 504],
24
- "backoff_factor": 1,
25
- methods_key: ["GET", "POST", "DELETE", "OPTIONS", "PATCH"],
26
- }
27
-
28
- retry_strategy = Retry(**kwargs)
29
- adapter = HTTPAdapter(max_retries=retry_strategy)
30
- http = requests.Session()
31
- http.mount("https://", adapter)
32
- return http
33
-
34
- def provide_sys(self):
35
- import sys
36
-
37
- return sys
38
-
39
- def provide_columns(self):
40
- return Columns(self)
41
-
42
- def provide_secrets(self):
43
- from ..secrets import secrets
44
-
45
- return secrets.Secrets()
46
-
47
- def provide_environment(self):
48
- return Environment(os.getcwd() + "/.env", os.environ, {})
49
-
50
- def provide_connection_no_autocommit(self, connection_details):
51
- # I should probably just switch things so that autocommit is *off* by default
52
- # and only have one of these, but for now I'm being lazy.
53
- import pymysql
54
-
55
- return pymysql.connect(
56
- user=connection_details["username"],
57
- password=connection_details["password"],
58
- host=connection_details["host"],
59
- database=connection_details["database"],
60
- port=connection_details.get("port", 3306),
61
- ssl_ca=connection_details.get("ssl_ca", None),
62
- autocommit=False,
63
- connect_timeout=2,
64
- cursorclass=pymysql.cursors.DictCursor,
65
- )
66
-
67
- def provide_connection(self, connection_details):
68
- import pymysql
69
-
70
- return pymysql.connect(
71
- user=connection_details["username"],
72
- password=connection_details["password"],
73
- host=connection_details["host"],
74
- database=connection_details["database"],
75
- port=connection_details.get("port", 3306),
76
- ssl_ca=connection_details.get("ssl_ca", None),
77
- autocommit=True,
78
- connect_timeout=2,
79
- cursorclass=pymysql.cursors.DictCursor,
80
- )
81
-
82
- def provide_connection_details(self, environment):
83
- return {
84
- "username": environment.get("db_username"),
85
- "password": environment.get("db_password"),
86
- "host": environment.get("db_host"),
87
- "database": environment.get("db_database"),
88
- }
89
-
90
- def provide_cursor(self, connection):
91
- return connection.cursor()
92
-
93
- def provide_cursor_backend(self, cursor):
94
- return CursorBackend(cursor)
95
-
96
- def provide_memory_backend(self):
97
- return MemoryBackend()
98
-
99
- def provide_json_backend(self):
100
- return JsonBackend()
101
-
102
- def provide_secrets_backend(self, secrets):
103
- return SecretsBackend(secrets)
104
-
105
- def provide_logging(self):
106
- import logging
107
-
108
- return logging
109
-
110
- def provide_now(self):
111
- import datetime
112
-
113
- return datetime.datetime.now()
114
-
115
- def provide_datetime(self):
116
- import datetime
117
-
118
- return datetime
119
-
120
- def provide_utcnow(self):
121
- import datetime
122
-
123
- return datetime.datetime.now(datetime.timezone.utc)
124
-
125
- def provide_input_output(self):
126
- raise AttributeError("The dependency injector requested an InputOutput but none has been configured")
127
-
128
- def provide_authentication(self):
129
- raise AttributeError("The dependency injector requested an Authenticaiton method but none has been configured")
130
-
131
- def provide_jose_jwt(self):
132
- from jose import jwt
133
-
134
- return jwt
135
-
136
- def provide_oai3_schema_resolver(self):
137
- return autodoc.formats.oai3_json.OAI3SchemaResolver()
138
-
139
- def provide_uuid(self):
140
- return uuid
@@ -1,6 +0,0 @@
1
- from . import another_module
2
- from .module_class import ModuleClass
3
-
4
-
5
- class Hi:
6
- pass
@@ -1,2 +0,0 @@
1
- class AnotherModuleClass:
2
- pass
@@ -1,5 +0,0 @@
1
- import datetime
2
-
3
-
4
- class ModuleClass:
5
- pass
@@ -1,41 +0,0 @@
1
- from .advanced_search import AdvancedSearch
2
- from .callable import Callable
3
- from .create import Create
4
- from .crud_by_method import CRUDByMethod
5
- from .database_connector import DatabaseConnector
6
- from .delete import Delete
7
- from .get import Get
8
- from .health_check import HealthCheck
9
- from .list import List
10
- from .mygrations import Mygrations
11
- from .request_method_routing import RequestMethodRouting
12
- from .restful_api import RestfulAPI
13
- from .routing import Routing
14
- from .update import Update
15
- from .write import Write
16
- from .schema_helper import SchemaHelper
17
- from .simple_routing import SimpleRouting
18
- from .simple_search import SimpleSearch
19
- from . import exceptions
20
-
21
- __all__ = [
22
- "exceptions",
23
- "AdvancedSearch",
24
- "Callable",
25
- "Create",
26
- "CRUDByMethod",
27
- "DatabaseConnector",
28
- "Delete",
29
- "Get",
30
- "HealthCheck",
31
- "List",
32
- "Mygrations",
33
- "RequestMethodRouting",
34
- "RestfulAPI",
35
- "Routing",
36
- "Update",
37
- "Write",
38
- "SchemaHelper",
39
- "SimpleRouting",
40
- "SimpleSearch",
41
- ]