clear-skies 1.22.30__tar.gz → 2.0.0__tar.gz

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 (410) hide show
  1. {clear_skies-1.22.30 → clear_skies-2.0.0}/PKG-INFO +5 -7
  2. {clear_skies-1.22.30 → clear_skies-2.0.0}/README.md +2 -2
  3. clear_skies-2.0.0/pyproject.toml +75 -0
  4. clear_skies-2.0.0/src/clearskies/__init__.py +62 -0
  5. clear_skies-2.0.0/src/clearskies/action.py +7 -0
  6. clear_skies-2.0.0/src/clearskies/authentication/__init__.py +15 -0
  7. clear_skies-2.0.0/src/clearskies/authentication/authentication.py +42 -0
  8. clear_skies-2.0.0/src/clearskies/authentication/authorization.py +12 -0
  9. clear_skies-2.0.0/src/clearskies/authentication/authorization_pass_through.py +20 -0
  10. clear_skies-2.0.0/src/clearskies/authentication/jwks.py +158 -0
  11. clear_skies-2.0.0/src/clearskies/authentication/public.py +5 -0
  12. clear_skies-2.0.0/src/clearskies/authentication/secret_bearer.py +553 -0
  13. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/autodoc/formats/oai3_json/oai3_json.py +9 -7
  14. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/autodoc/formats/oai3_json/parameter.py +6 -3
  15. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/autodoc/formats/oai3_json/request.py +7 -5
  16. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/autodoc/formats/oai3_json/response.py +7 -4
  17. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/autodoc/formats/oai3_json/schema/object.py +4 -1
  18. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/autodoc/request/__init__.py +2 -0
  19. clear_skies-2.0.0/src/clearskies/autodoc/request/header.py +6 -0
  20. clear_skies-2.0.0/src/clearskies/autodoc/request/json_body.py +6 -0
  21. clear_skies-1.22.30/src/clearskies/autodoc/request/header.py → clear_skies-2.0.0/src/clearskies/autodoc/request/parameter.py +2 -2
  22. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/autodoc/request/request.py +7 -4
  23. clear_skies-2.0.0/src/clearskies/autodoc/request/url_parameter.py +6 -0
  24. clear_skies-2.0.0/src/clearskies/autodoc/request/url_path.py +6 -0
  25. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/autodoc/schema/__init__.py +4 -2
  26. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/autodoc/schema/array.py +5 -6
  27. clear_skies-2.0.0/src/clearskies/autodoc/schema/boolean.py +5 -0
  28. clear_skies-2.0.0/src/clearskies/autodoc/schema/date.py +5 -0
  29. clear_skies-2.0.0/src/clearskies/autodoc/schema/datetime.py +5 -0
  30. clear_skies-2.0.0/src/clearskies/autodoc/schema/double.py +5 -0
  31. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/autodoc/schema/enum.py +4 -2
  32. clear_skies-2.0.0/src/clearskies/autodoc/schema/integer.py +6 -0
  33. clear_skies-2.0.0/src/clearskies/autodoc/schema/long.py +5 -0
  34. clear_skies-2.0.0/src/clearskies/autodoc/schema/number.py +6 -0
  35. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/autodoc/schema/object.py +5 -7
  36. clear_skies-2.0.0/src/clearskies/autodoc/schema/password.py +5 -0
  37. clear_skies-1.22.30/src/clearskies/autodoc/schema/string.py → clear_skies-2.0.0/src/clearskies/autodoc/schema/schema.py +1 -1
  38. clear_skies-2.0.0/src/clearskies/autodoc/schema/string.py +5 -0
  39. clear_skies-2.0.0/src/clearskies/backends/__init__.py +65 -0
  40. clear_skies-2.0.0/src/clearskies/backends/api_backend.py +1178 -0
  41. clear_skies-2.0.0/src/clearskies/backends/backend.py +123 -0
  42. clear_skies-2.0.0/src/clearskies/backends/cursor_backend.py +335 -0
  43. clear_skies-2.0.0/src/clearskies/backends/memory_backend.py +797 -0
  44. clear_skies-2.0.0/src/clearskies/backends/secrets_backend.py +107 -0
  45. clear_skies-2.0.0/src/clearskies/column.py +1232 -0
  46. clear_skies-2.0.0/src/clearskies/columns/__init__.py +71 -0
  47. clear_skies-2.0.0/src/clearskies/columns/audit.py +205 -0
  48. clear_skies-2.0.0/src/clearskies/columns/belongs_to_id.py +483 -0
  49. clear_skies-2.0.0/src/clearskies/columns/belongs_to_model.py +128 -0
  50. clear_skies-2.0.0/src/clearskies/columns/belongs_to_self.py +105 -0
  51. clear_skies-2.0.0/src/clearskies/columns/boolean.py +109 -0
  52. clear_skies-2.0.0/src/clearskies/columns/category_tree.py +275 -0
  53. clear_skies-2.0.0/src/clearskies/columns/category_tree_ancestors.py +51 -0
  54. clear_skies-2.0.0/src/clearskies/columns/category_tree_children.py +127 -0
  55. clear_skies-2.0.0/src/clearskies/columns/category_tree_descendants.py +48 -0
  56. clear_skies-2.0.0/src/clearskies/columns/created.py +94 -0
  57. clear_skies-2.0.0/src/clearskies/columns/created_by_authorization_data.py +116 -0
  58. clear_skies-2.0.0/src/clearskies/columns/created_by_header.py +99 -0
  59. clear_skies-2.0.0/src/clearskies/columns/created_by_ip.py +92 -0
  60. clear_skies-2.0.0/src/clearskies/columns/created_by_routing_data.py +96 -0
  61. clear_skies-2.0.0/src/clearskies/columns/created_by_user_agent.py +92 -0
  62. clear_skies-2.0.0/src/clearskies/columns/date.py +230 -0
  63. clear_skies-2.0.0/src/clearskies/columns/datetime.py +278 -0
  64. clear_skies-2.0.0/src/clearskies/columns/email.py +76 -0
  65. clear_skies-2.0.0/src/clearskies/columns/float.py +149 -0
  66. clear_skies-2.0.0/src/clearskies/columns/has_many.py +505 -0
  67. clear_skies-2.0.0/src/clearskies/columns/has_many_self.py +56 -0
  68. clear_skies-2.0.0/src/clearskies/columns/has_one.py +14 -0
  69. clear_skies-2.0.0/src/clearskies/columns/integer.py +156 -0
  70. clear_skies-2.0.0/src/clearskies/columns/json.py +122 -0
  71. clear_skies-2.0.0/src/clearskies/columns/many_to_many_ids.py +333 -0
  72. clear_skies-2.0.0/src/clearskies/columns/many_to_many_ids_with_data.py +270 -0
  73. clear_skies-2.0.0/src/clearskies/columns/many_to_many_models.py +154 -0
  74. clear_skies-2.0.0/src/clearskies/columns/many_to_many_pivots.py +133 -0
  75. clear_skies-2.0.0/src/clearskies/columns/phone.py +158 -0
  76. clear_skies-2.0.0/src/clearskies/columns/select.py +91 -0
  77. clear_skies-2.0.0/src/clearskies/columns/string.py +98 -0
  78. clear_skies-2.0.0/src/clearskies/columns/timestamp.py +160 -0
  79. clear_skies-2.0.0/src/clearskies/columns/updated.py +110 -0
  80. clear_skies-2.0.0/src/clearskies/columns/uuid.py +86 -0
  81. clear_skies-2.0.0/src/clearskies/configs/README.md +105 -0
  82. clear_skies-2.0.0/src/clearskies/configs/__init__.py +159 -0
  83. clear_skies-2.0.0/src/clearskies/configs/actions.py +43 -0
  84. clear_skies-2.0.0/src/clearskies/configs/any.py +13 -0
  85. clear_skies-2.0.0/src/clearskies/configs/any_dict.py +22 -0
  86. clear_skies-2.0.0/src/clearskies/configs/any_dict_or_callable.py +23 -0
  87. clear_skies-2.0.0/src/clearskies/configs/authentication.py +23 -0
  88. clear_skies-2.0.0/src/clearskies/configs/authorization.py +23 -0
  89. clear_skies-2.0.0/src/clearskies/configs/boolean.py +16 -0
  90. clear_skies-2.0.0/src/clearskies/configs/boolean_or_callable.py +18 -0
  91. clear_skies-2.0.0/src/clearskies/configs/callable_config.py +18 -0
  92. clear_skies-2.0.0/src/clearskies/configs/columns.py +34 -0
  93. clear_skies-2.0.0/src/clearskies/configs/conditions.py +30 -0
  94. clear_skies-2.0.0/src/clearskies/configs/config.py +21 -0
  95. clear_skies-2.0.0/src/clearskies/configs/datetime.py +18 -0
  96. clear_skies-2.0.0/src/clearskies/configs/datetime_or_callable.py +19 -0
  97. clear_skies-2.0.0/src/clearskies/configs/endpoint.py +23 -0
  98. clear_skies-2.0.0/src/clearskies/configs/float.py +16 -0
  99. clear_skies-2.0.0/src/clearskies/configs/float_or_callable.py +18 -0
  100. clear_skies-2.0.0/src/clearskies/configs/integer.py +16 -0
  101. clear_skies-2.0.0/src/clearskies/configs/integer_or_callable.py +18 -0
  102. clear_skies-2.0.0/src/clearskies/configs/joins.py +30 -0
  103. clear_skies-2.0.0/src/clearskies/configs/list_any_dict.py +30 -0
  104. clear_skies-2.0.0/src/clearskies/configs/list_any_dict_or_callable.py +31 -0
  105. clear_skies-2.0.0/src/clearskies/configs/model_class.py +35 -0
  106. clear_skies-2.0.0/src/clearskies/configs/model_column.py +65 -0
  107. clear_skies-2.0.0/src/clearskies/configs/model_columns.py +56 -0
  108. clear_skies-2.0.0/src/clearskies/configs/model_destination_name.py +25 -0
  109. clear_skies-2.0.0/src/clearskies/configs/model_to_id_column.py +43 -0
  110. clear_skies-2.0.0/src/clearskies/configs/readable_model_column.py +9 -0
  111. clear_skies-2.0.0/src/clearskies/configs/readable_model_columns.py +9 -0
  112. clear_skies-2.0.0/src/clearskies/configs/schema.py +23 -0
  113. clear_skies-2.0.0/src/clearskies/configs/searchable_model_columns.py +9 -0
  114. clear_skies-2.0.0/src/clearskies/configs/security_headers.py +39 -0
  115. clear_skies-2.0.0/src/clearskies/configs/select.py +26 -0
  116. clear_skies-2.0.0/src/clearskies/configs/select_list.py +47 -0
  117. clear_skies-2.0.0/src/clearskies/configs/string.py +29 -0
  118. clear_skies-2.0.0/src/clearskies/configs/string_dict.py +32 -0
  119. clear_skies-2.0.0/src/clearskies/configs/string_list.py +32 -0
  120. clear_skies-2.0.0/src/clearskies/configs/string_list_or_callable.py +35 -0
  121. clear_skies-2.0.0/src/clearskies/configs/string_or_callable.py +18 -0
  122. clear_skies-2.0.0/src/clearskies/configs/timedelta.py +18 -0
  123. clear_skies-2.0.0/src/clearskies/configs/timezone.py +18 -0
  124. clear_skies-2.0.0/src/clearskies/configs/url.py +23 -0
  125. clear_skies-2.0.0/src/clearskies/configs/validators.py +45 -0
  126. clear_skies-2.0.0/src/clearskies/configs/writeable_model_column.py +9 -0
  127. clear_skies-2.0.0/src/clearskies/configs/writeable_model_columns.py +9 -0
  128. clear_skies-2.0.0/src/clearskies/configurable.py +76 -0
  129. clear_skies-2.0.0/src/clearskies/contexts/__init__.py +11 -0
  130. clear_skies-2.0.0/src/clearskies/contexts/cli.py +7 -0
  131. clear_skies-2.0.0/src/clearskies/contexts/context.py +84 -0
  132. clear_skies-2.0.0/src/clearskies/contexts/wsgi.py +16 -0
  133. clear_skies-2.0.0/src/clearskies/contexts/wsgi_ref.py +49 -0
  134. clear_skies-2.0.0/src/clearskies/di/__init__.py +14 -0
  135. clear_skies-2.0.0/src/clearskies/di/additional_config.py +130 -0
  136. clear_skies-2.0.0/src/clearskies/di/additional_config_auto_import.py +17 -0
  137. clear_skies-2.0.0/src/clearskies/di/di.py +968 -0
  138. clear_skies-2.0.0/src/clearskies/di/inject/__init__.py +23 -0
  139. clear_skies-2.0.0/src/clearskies/di/inject/by_class.py +21 -0
  140. clear_skies-2.0.0/src/clearskies/di/inject/by_name.py +18 -0
  141. clear_skies-2.0.0/src/clearskies/di/inject/di.py +13 -0
  142. clear_skies-2.0.0/src/clearskies/di/inject/environment.py +14 -0
  143. clear_skies-2.0.0/src/clearskies/di/inject/input_output.py +20 -0
  144. clear_skies-2.0.0/src/clearskies/di/inject/now.py +13 -0
  145. clear_skies-2.0.0/src/clearskies/di/inject/requests.py +13 -0
  146. clear_skies-2.0.0/src/clearskies/di/inject/secrets.py +14 -0
  147. clear_skies-2.0.0/src/clearskies/di/inject/utcnow.py +13 -0
  148. clear_skies-2.0.0/src/clearskies/di/inject/uuid.py +15 -0
  149. clear_skies-2.0.0/src/clearskies/di/injectable.py +29 -0
  150. clear_skies-2.0.0/src/clearskies/di/injectable_properties.py +131 -0
  151. clear_skies-2.0.0/src/clearskies/end.py +183 -0
  152. clear_skies-2.0.0/src/clearskies/endpoint.py +1309 -0
  153. clear_skies-2.0.0/src/clearskies/endpoint_group.py +297 -0
  154. clear_skies-2.0.0/src/clearskies/endpoints/__init__.py +23 -0
  155. clear_skies-2.0.0/src/clearskies/endpoints/advanced_search.py +526 -0
  156. clear_skies-2.0.0/src/clearskies/endpoints/callable.py +387 -0
  157. clear_skies-2.0.0/src/clearskies/endpoints/create.py +202 -0
  158. clear_skies-2.0.0/src/clearskies/endpoints/delete.py +139 -0
  159. clear_skies-2.0.0/src/clearskies/endpoints/get.py +275 -0
  160. clear_skies-2.0.0/src/clearskies/endpoints/health_check.py +181 -0
  161. clear_skies-2.0.0/src/clearskies/endpoints/list.py +573 -0
  162. clear_skies-2.0.0/src/clearskies/endpoints/restful_api.py +427 -0
  163. clear_skies-2.0.0/src/clearskies/endpoints/simple_search.py +286 -0
  164. clear_skies-2.0.0/src/clearskies/endpoints/update.py +190 -0
  165. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/environment.py +5 -3
  166. clear_skies-2.0.0/src/clearskies/exceptions/__init__.py +17 -0
  167. clear_skies-1.22.30/src/clearskies/handlers/exceptions/input_error.py → clear_skies-2.0.0/src/clearskies/exceptions/input_errors.py +1 -1
  168. clear_skies-2.0.0/src/clearskies/exceptions/moved_permanently.py +3 -0
  169. clear_skies-2.0.0/src/clearskies/exceptions/moved_temporarily.py +3 -0
  170. clear_skies-2.0.0/src/clearskies/functional/__init__.py +7 -0
  171. clear_skies-2.0.0/src/clearskies/functional/routing.py +92 -0
  172. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/functional/string.py +19 -11
  173. clear_skies-2.0.0/src/clearskies/functional/validations.py +76 -0
  174. clear_skies-2.0.0/src/clearskies/input_outputs/__init__.py +13 -0
  175. clear_skies-2.0.0/src/clearskies/input_outputs/cli.py +170 -0
  176. clear_skies-2.0.0/src/clearskies/input_outputs/headers.py +45 -0
  177. clear_skies-2.0.0/src/clearskies/input_outputs/input_output.py +138 -0
  178. clear_skies-2.0.0/src/clearskies/input_outputs/programmatic.py +69 -0
  179. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/input_outputs/wsgi.py +23 -38
  180. clear_skies-2.0.0/src/clearskies/model.py +662 -0
  181. clear_skies-2.0.0/src/clearskies/parameters_to_properties.py +31 -0
  182. clear_skies-2.0.0/src/clearskies/query/__init__.py +12 -0
  183. clear_skies-2.0.0/src/clearskies/query/condition.py +223 -0
  184. clear_skies-2.0.0/src/clearskies/query/join.py +136 -0
  185. clear_skies-2.0.0/src/clearskies/query/query.py +196 -0
  186. clear_skies-2.0.0/src/clearskies/query/sort.py +27 -0
  187. clear_skies-2.0.0/src/clearskies/schema.py +82 -0
  188. clear_skies-2.0.0/src/clearskies/secrets/__init__.py +6 -0
  189. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/secrets/additional_configs/mysql_connection_dynamic_producer.py +15 -4
  190. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/secrets/additional_configs/mysql_connection_dynamic_producer_via_ssh_cert_bastion.py +11 -5
  191. clear_skies-2.0.0/src/clearskies/secrets/akeyless.py +182 -0
  192. clear_skies-2.0.0/src/clearskies/secrets/exceptions/not_found.py +2 -0
  193. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/secrets/secrets.py +8 -8
  194. clear_skies-2.0.0/src/clearskies/security_header.py +8 -0
  195. clear_skies-2.0.0/src/clearskies/security_headers/__init__.py +11 -0
  196. clear_skies-2.0.0/src/clearskies/security_headers/cache_control.py +67 -0
  197. clear_skies-2.0.0/src/clearskies/security_headers/cors.py +50 -0
  198. clear_skies-2.0.0/src/clearskies/security_headers/csp.py +94 -0
  199. clear_skies-2.0.0/src/clearskies/security_headers/hsts.py +22 -0
  200. clear_skies-2.0.0/src/clearskies/test_base.py +8 -0
  201. clear_skies-2.0.0/src/clearskies/typing.py +11 -0
  202. clear_skies-2.0.0/src/clearskies/validator.py +25 -0
  203. clear_skies-2.0.0/src/clearskies/validators/__init__.py +33 -0
  204. clear_skies-2.0.0/src/clearskies/validators/after_column.py +62 -0
  205. clear_skies-2.0.0/src/clearskies/validators/before_column.py +13 -0
  206. clear_skies-2.0.0/src/clearskies/validators/in_the_future.py +32 -0
  207. clear_skies-2.0.0/src/clearskies/validators/in_the_future_at_least.py +11 -0
  208. clear_skies-2.0.0/src/clearskies/validators/in_the_future_at_most.py +10 -0
  209. clear_skies-2.0.0/src/clearskies/validators/in_the_past.py +32 -0
  210. clear_skies-2.0.0/src/clearskies/validators/in_the_past_at_least.py +10 -0
  211. clear_skies-2.0.0/src/clearskies/validators/in_the_past_at_most.py +10 -0
  212. clear_skies-2.0.0/src/clearskies/validators/maximum_length.py +26 -0
  213. clear_skies-2.0.0/src/clearskies/validators/maximum_value.py +29 -0
  214. clear_skies-2.0.0/src/clearskies/validators/minimum_length.py +26 -0
  215. clear_skies-2.0.0/src/clearskies/validators/minimum_value.py +29 -0
  216. clear_skies-2.0.0/src/clearskies/validators/required.py +35 -0
  217. clear_skies-2.0.0/src/clearskies/validators/timedelta.py +59 -0
  218. clear_skies-2.0.0/src/clearskies/validators/unique.py +31 -0
  219. clear_skies-1.22.30/pyproject.toml +0 -58
  220. clear_skies-1.22.30/src/clearskies/__init__.py +0 -45
  221. clear_skies-1.22.30/src/clearskies/application.py +0 -29
  222. clear_skies-1.22.30/src/clearskies/authentication/__init__.py +0 -48
  223. clear_skies-1.22.30/src/clearskies/authentication/auth0_jwks.py +0 -118
  224. clear_skies-1.22.30/src/clearskies/authentication/auth_exception.py +0 -2
  225. clear_skies-1.22.30/src/clearskies/authentication/authorization.py +0 -17
  226. clear_skies-1.22.30/src/clearskies/authentication/authorization_pass_through.py +0 -18
  227. clear_skies-1.22.30/src/clearskies/authentication/jwks.py +0 -88
  228. clear_skies-1.22.30/src/clearskies/authentication/jwks_jwcrypto.py +0 -51
  229. clear_skies-1.22.30/src/clearskies/authentication/public.py +0 -40
  230. clear_skies-1.22.30/src/clearskies/authentication/secret_bearer.py +0 -91
  231. clear_skies-1.22.30/src/clearskies/autodoc/request/json_body.py +0 -8
  232. clear_skies-1.22.30/src/clearskies/autodoc/request/url_parameter.py +0 -8
  233. clear_skies-1.22.30/src/clearskies/autodoc/request/url_path.py +0 -8
  234. clear_skies-1.22.30/src/clearskies/autodoc/schema/boolean.py +0 -11
  235. clear_skies-1.22.30/src/clearskies/autodoc/schema/date.py +0 -8
  236. clear_skies-1.22.30/src/clearskies/autodoc/schema/datetime.py +0 -8
  237. clear_skies-1.22.30/src/clearskies/autodoc/schema/double.py +0 -8
  238. clear_skies-1.22.30/src/clearskies/autodoc/schema/integer.py +0 -11
  239. clear_skies-1.22.30/src/clearskies/autodoc/schema/long.py +0 -8
  240. clear_skies-1.22.30/src/clearskies/autodoc/schema/number.py +0 -11
  241. clear_skies-1.22.30/src/clearskies/autodoc/schema/password.py +0 -8
  242. clear_skies-1.22.30/src/clearskies/backends/__init__.py +0 -30
  243. clear_skies-1.22.30/src/clearskies/backends/api_backend.py +0 -362
  244. clear_skies-1.22.30/src/clearskies/backends/api_get_only_backend.py +0 -48
  245. clear_skies-1.22.30/src/clearskies/backends/backend.py +0 -167
  246. clear_skies-1.22.30/src/clearskies/backends/cursor_backend.py +0 -285
  247. clear_skies-1.22.30/src/clearskies/backends/example_backend.py +0 -43
  248. clear_skies-1.22.30/src/clearskies/backends/file_backend.py +0 -48
  249. clear_skies-1.22.30/src/clearskies/backends/json_backend.py +0 -7
  250. clear_skies-1.22.30/src/clearskies/backends/memory_backend.py +0 -504
  251. clear_skies-1.22.30/src/clearskies/backends/restful_api_advanced_search_backend.py +0 -103
  252. clear_skies-1.22.30/src/clearskies/backends/secrets_backend.py +0 -63
  253. clear_skies-1.22.30/src/clearskies/binding_config.py +0 -16
  254. clear_skies-1.22.30/src/clearskies/column_types/__init__.py +0 -203
  255. clear_skies-1.22.30/src/clearskies/column_types/audit.py +0 -249
  256. clear_skies-1.22.30/src/clearskies/column_types/belongs_to.py +0 -271
  257. clear_skies-1.22.30/src/clearskies/column_types/boolean.py +0 -60
  258. clear_skies-1.22.30/src/clearskies/column_types/category_tree.py +0 -304
  259. clear_skies-1.22.30/src/clearskies/column_types/column.py +0 -373
  260. clear_skies-1.22.30/src/clearskies/column_types/created.py +0 -26
  261. clear_skies-1.22.30/src/clearskies/column_types/created_by_authorization_data.py +0 -26
  262. clear_skies-1.22.30/src/clearskies/column_types/created_by_header.py +0 -24
  263. clear_skies-1.22.30/src/clearskies/column_types/created_by_ip.py +0 -17
  264. clear_skies-1.22.30/src/clearskies/column_types/created_by_routing_data.py +0 -25
  265. clear_skies-1.22.30/src/clearskies/column_types/created_by_user_agent.py +0 -17
  266. clear_skies-1.22.30/src/clearskies/column_types/created_micro.py +0 -26
  267. clear_skies-1.22.30/src/clearskies/column_types/datetime.py +0 -109
  268. clear_skies-1.22.30/src/clearskies/column_types/datetime_micro.py +0 -12
  269. clear_skies-1.22.30/src/clearskies/column_types/email.py +0 -18
  270. clear_skies-1.22.30/src/clearskies/column_types/float.py +0 -43
  271. clear_skies-1.22.30/src/clearskies/column_types/has_many.py +0 -179
  272. clear_skies-1.22.30/src/clearskies/column_types/has_one.py +0 -60
  273. clear_skies-1.22.30/src/clearskies/column_types/integer.py +0 -41
  274. clear_skies-1.22.30/src/clearskies/column_types/json.py +0 -25
  275. clear_skies-1.22.30/src/clearskies/column_types/many_to_many.py +0 -278
  276. clear_skies-1.22.30/src/clearskies/column_types/many_to_many_with_data.py +0 -162
  277. clear_skies-1.22.30/src/clearskies/column_types/phone.py +0 -48
  278. clear_skies-1.22.30/src/clearskies/column_types/select.py +0 -11
  279. clear_skies-1.22.30/src/clearskies/column_types/string.py +0 -24
  280. clear_skies-1.22.30/src/clearskies/column_types/timestamp.py +0 -73
  281. clear_skies-1.22.30/src/clearskies/column_types/updated.py +0 -26
  282. clear_skies-1.22.30/src/clearskies/column_types/updated_micro.py +0 -26
  283. clear_skies-1.22.30/src/clearskies/column_types/uuid.py +0 -25
  284. clear_skies-1.22.30/src/clearskies/columns.py +0 -123
  285. clear_skies-1.22.30/src/clearskies/condition_parser.py +0 -172
  286. clear_skies-1.22.30/src/clearskies/contexts/__init__.py +0 -11
  287. clear_skies-1.22.30/src/clearskies/contexts/build_context.py +0 -54
  288. clear_skies-1.22.30/src/clearskies/contexts/cli.py +0 -44
  289. clear_skies-1.22.30/src/clearskies/contexts/context.py +0 -62
  290. clear_skies-1.22.30/src/clearskies/contexts/convert_to_application.py +0 -190
  291. clear_skies-1.22.30/src/clearskies/contexts/extract_handler.py +0 -37
  292. clear_skies-1.22.30/src/clearskies/contexts/test.py +0 -94
  293. clear_skies-1.22.30/src/clearskies/contexts/wsgi.py +0 -33
  294. clear_skies-1.22.30/src/clearskies/decorators/__init__.py +0 -41
  295. clear_skies-1.22.30/src/clearskies/decorators/allow_non_json_bodies.py +0 -9
  296. clear_skies-1.22.30/src/clearskies/decorators/auth0_jwks.py +0 -22
  297. clear_skies-1.22.30/src/clearskies/decorators/authorization.py +0 -10
  298. clear_skies-1.22.30/src/clearskies/decorators/binding_classes.py +0 -9
  299. clear_skies-1.22.30/src/clearskies/decorators/binding_modules.py +0 -9
  300. clear_skies-1.22.30/src/clearskies/decorators/bindings.py +0 -9
  301. clear_skies-1.22.30/src/clearskies/decorators/create.py +0 -10
  302. clear_skies-1.22.30/src/clearskies/decorators/delete.py +0 -10
  303. clear_skies-1.22.30/src/clearskies/decorators/docs.py +0 -14
  304. clear_skies-1.22.30/src/clearskies/decorators/get.py +0 -10
  305. clear_skies-1.22.30/src/clearskies/decorators/jwks.py +0 -26
  306. clear_skies-1.22.30/src/clearskies/decorators/merge.py +0 -124
  307. clear_skies-1.22.30/src/clearskies/decorators/patch.py +0 -10
  308. clear_skies-1.22.30/src/clearskies/decorators/post.py +0 -10
  309. clear_skies-1.22.30/src/clearskies/decorators/public.py +0 -11
  310. clear_skies-1.22.30/src/clearskies/decorators/response_headers.py +0 -10
  311. clear_skies-1.22.30/src/clearskies/decorators/return_raw_response.py +0 -9
  312. clear_skies-1.22.30/src/clearskies/decorators/schema.py +0 -10
  313. clear_skies-1.22.30/src/clearskies/decorators/secret_bearer.py +0 -24
  314. clear_skies-1.22.30/src/clearskies/decorators/security_headers.py +0 -10
  315. clear_skies-1.22.30/src/clearskies/di/__init__.py +0 -11
  316. clear_skies-1.22.30/src/clearskies/di/additional_config.py +0 -19
  317. clear_skies-1.22.30/src/clearskies/di/additional_config_auto_import.py +0 -5
  318. clear_skies-1.22.30/src/clearskies/di/di.py +0 -347
  319. clear_skies-1.22.30/src/clearskies/di/standard_dependencies.py +0 -151
  320. clear_skies-1.22.30/src/clearskies/functional/__init__.py +0 -7
  321. clear_skies-1.22.30/src/clearskies/functional/validations.py +0 -24
  322. clear_skies-1.22.30/src/clearskies/handlers/__init__.py +0 -41
  323. clear_skies-1.22.30/src/clearskies/handlers/advanced_search.py +0 -271
  324. clear_skies-1.22.30/src/clearskies/handlers/base.py +0 -479
  325. clear_skies-1.22.30/src/clearskies/handlers/callable.py +0 -192
  326. clear_skies-1.22.30/src/clearskies/handlers/create.py +0 -35
  327. clear_skies-1.22.30/src/clearskies/handlers/crud_by_method.py +0 -18
  328. clear_skies-1.22.30/src/clearskies/handlers/database_connector.py +0 -32
  329. clear_skies-1.22.30/src/clearskies/handlers/delete.py +0 -61
  330. clear_skies-1.22.30/src/clearskies/handlers/exceptions/__init__.py +0 -5
  331. clear_skies-1.22.30/src/clearskies/handlers/exceptions/not_found.py +0 -3
  332. clear_skies-1.22.30/src/clearskies/handlers/get.py +0 -156
  333. clear_skies-1.22.30/src/clearskies/handlers/health_check.py +0 -59
  334. clear_skies-1.22.30/src/clearskies/handlers/input_processing.py +0 -79
  335. clear_skies-1.22.30/src/clearskies/handlers/list.py +0 -530
  336. clear_skies-1.22.30/src/clearskies/handlers/mygrations.py +0 -82
  337. clear_skies-1.22.30/src/clearskies/handlers/request_method_routing.py +0 -47
  338. clear_skies-1.22.30/src/clearskies/handlers/restful_api.py +0 -218
  339. clear_skies-1.22.30/src/clearskies/handlers/routing.py +0 -62
  340. clear_skies-1.22.30/src/clearskies/handlers/schema_helper.py +0 -128
  341. clear_skies-1.22.30/src/clearskies/handlers/simple_routing.py +0 -206
  342. clear_skies-1.22.30/src/clearskies/handlers/simple_routing_route.py +0 -197
  343. clear_skies-1.22.30/src/clearskies/handlers/simple_search.py +0 -136
  344. clear_skies-1.22.30/src/clearskies/handlers/update.py +0 -102
  345. clear_skies-1.22.30/src/clearskies/handlers/write.py +0 -193
  346. clear_skies-1.22.30/src/clearskies/input_outputs/__init__.py +0 -11
  347. clear_skies-1.22.30/src/clearskies/input_outputs/cli.py +0 -182
  348. clear_skies-1.22.30/src/clearskies/input_outputs/input_output.py +0 -169
  349. clear_skies-1.22.30/src/clearskies/input_requirements/__init__.py +0 -78
  350. clear_skies-1.22.30/src/clearskies/input_requirements/after.py +0 -36
  351. clear_skies-1.22.30/src/clearskies/input_requirements/before.py +0 -36
  352. clear_skies-1.22.30/src/clearskies/input_requirements/in_the_future_at_least.py +0 -19
  353. clear_skies-1.22.30/src/clearskies/input_requirements/in_the_future_at_most.py +0 -19
  354. clear_skies-1.22.30/src/clearskies/input_requirements/in_the_past_at_least.py +0 -19
  355. clear_skies-1.22.30/src/clearskies/input_requirements/in_the_past_at_most.py +0 -19
  356. clear_skies-1.22.30/src/clearskies/input_requirements/maximum_length.py +0 -19
  357. clear_skies-1.22.30/src/clearskies/input_requirements/maximum_value.py +0 -19
  358. clear_skies-1.22.30/src/clearskies/input_requirements/minimum_length.py +0 -22
  359. clear_skies-1.22.30/src/clearskies/input_requirements/minimum_value.py +0 -19
  360. clear_skies-1.22.30/src/clearskies/input_requirements/required.py +0 -23
  361. clear_skies-1.22.30/src/clearskies/input_requirements/requirement.py +0 -25
  362. clear_skies-1.22.30/src/clearskies/input_requirements/time_delta.py +0 -38
  363. clear_skies-1.22.30/src/clearskies/input_requirements/unique.py +0 -18
  364. clear_skies-1.22.30/src/clearskies/mocks/__init__.py +0 -7
  365. clear_skies-1.22.30/src/clearskies/mocks/input_output.py +0 -124
  366. clear_skies-1.22.30/src/clearskies/mocks/models.py +0 -142
  367. clear_skies-1.22.30/src/clearskies/model.py +0 -357
  368. clear_skies-1.22.30/src/clearskies/models.py +0 -350
  369. clear_skies-1.22.30/src/clearskies/secrets/__init__.py +0 -34
  370. clear_skies-1.22.30/src/clearskies/secrets/akeyless.py +0 -241
  371. clear_skies-1.22.30/src/clearskies/security_headers/__init__.py +0 -11
  372. clear_skies-1.22.30/src/clearskies/security_headers/base.py +0 -12
  373. clear_skies-1.22.30/src/clearskies/security_headers/cache_control.py +0 -130
  374. clear_skies-1.22.30/src/clearskies/security_headers/cors.py +0 -105
  375. clear_skies-1.22.30/src/clearskies/security_headers/csp.py +0 -169
  376. clear_skies-1.22.30/src/clearskies/security_headers/hsts.py +0 -24
  377. clear_skies-1.22.30/src/clearskies/tests/simple_api/models/__init__.py +0 -2
  378. clear_skies-1.22.30/src/clearskies/tests/simple_api/models/status.py +0 -23
  379. clear_skies-1.22.30/src/clearskies/tests/simple_api/models/user.py +0 -21
  380. clear_skies-1.22.30/src/clearskies/tests/simple_api/users_api.py +0 -64
  381. {clear_skies-1.22.30 → clear_skies-2.0.0}/LICENSE +0 -0
  382. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/autodoc/__init__.py +0 -0
  383. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/autodoc/formats/__init__.py +0 -0
  384. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/autodoc/formats/oai3_json/__init__.py +1 -1
  385. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/autodoc/formats/oai3_json/oai3_schema_resolver.py +0 -0
  386. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/autodoc/formats/oai3_json/schema/__init__.py +0 -0
  387. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/autodoc/formats/oai3_json/schema/array.py +0 -0
  388. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/autodoc/formats/oai3_json/schema/default.py +0 -0
  389. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/autodoc/formats/oai3_json/schema/enum.py +0 -0
  390. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/autodoc/formats/oai3_json/test.json +0 -0
  391. clear_skies-1.22.30/src/clearskies/contexts/bash.py → clear_skies-2.0.0/src/clearskies/autodoc/py.typed +0 -0
  392. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/autodoc/response/__init__.py +0 -0
  393. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/autodoc/response/response.py +0 -0
  394. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/autodoc/schema/base64.py +0 -0
  395. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/di/test_module/__init__.py +0 -0
  396. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/di/test_module/another_module/__init__.py +0 -0
  397. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/di/test_module/module_class.py +0 -0
  398. {clear_skies-1.22.30/src/clearskies/handlers → clear_skies-2.0.0/src/clearskies}/exceptions/authentication.py +0 -0
  399. {clear_skies-1.22.30/src/clearskies/handlers → clear_skies-2.0.0/src/clearskies}/exceptions/authorization.py +0 -0
  400. {clear_skies-1.22.30/src/clearskies/handlers → clear_skies-2.0.0/src/clearskies}/exceptions/client_error.py +0 -0
  401. {clear_skies-1.22.30/src/clearskies/secrets → clear_skies-2.0.0/src/clearskies}/exceptions/not_found.py +0 -0
  402. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/input_outputs/exceptions/__init__.py +1 -1
  403. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/input_outputs/exceptions/cli_input_error.py +0 -0
  404. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/input_outputs/exceptions/cli_not_found.py +0 -0
  405. /clear_skies-1.22.30/src/clearskies/security_headers/x_content_type_options.py → /clear_skies-2.0.0/src/clearskies/input_outputs/py.typed +0 -0
  406. /clear_skies-1.22.30/src/clearskies/security_headers/x_frame_options.py → /clear_skies-2.0.0/src/clearskies/py.typed +0 -0
  407. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/secrets/additional_configs/__init__.py +0 -0
  408. {clear_skies-1.22.30 → clear_skies-2.0.0}/src/clearskies/secrets/exceptions/__init__.py +0 -0
  409. /clear_skies-1.22.30/src/clearskies/tests/__init__.py → /clear_skies-2.0.0/src/clearskies/security_headers/x_content_type_options.py +0 -0
  410. /clear_skies-1.22.30/src/clearskies/tests/simple_api/__init__.py → /clear_skies-2.0.0/src/clearskies/security_headers/x_frame_options.py +0 -0
@@ -1,32 +1,30 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: clear-skies
3
- Version: 1.22.30
3
+ Version: 2.0.0
4
4
  Summary: A framework for building backends in the cloud
5
5
  License: MIT
6
6
  Author: Conor Mancone
7
7
  Author-email: cmancone@gmail.com
8
- Requires-Python: >=3.10,<4.0
8
+ Requires-Python: >=3.11,<4.0
9
9
  Classifier: Development Status :: 5 - Production/Stable
10
10
  Classifier: Intended Audience :: Developers
11
11
  Classifier: License :: OSI Approved :: MIT License
12
12
  Classifier: Programming Language :: Python :: 3
13
- Classifier: Programming Language :: Python :: 3.10
14
13
  Classifier: Programming Language :: Python :: 3.11
15
14
  Classifier: Programming Language :: Python :: 3.12
16
15
  Classifier: Programming Language :: Python :: 3.13
17
16
  Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
18
- Provides-Extra: jose
19
17
  Provides-Extra: jwcrypto
20
18
  Provides-Extra: mysql
21
19
  Provides-Extra: secrets
22
20
  Requires-Dist: akeyless (>=4.0.0,<5.0.0) ; extra == "secrets"
23
21
  Requires-Dist: akeyless-cloud-id (>=0.2.3,<0.3.0) ; extra == "secrets"
24
22
  Requires-Dist: dateparser (>=1.1.8,<2.0.0)
25
- Requires-Dist: jose (>=1.0.0,<2.0.0) ; extra == "jose"
26
23
  Requires-Dist: jwcrypto (>=1.5.6,<2.0.0) ; extra == "jwcrypto"
27
24
  Requires-Dist: pymysql (>=1.1.0,<2.0.0) ; extra == "mysql"
28
25
  Requires-Dist: requests (>=2.31.0,<3.0.0)
29
26
  Requires-Dist: typing-extensions (>=4.12.0,<5.0.0) ; python_version == "3.10"
27
+ Requires-Dist: wrapt (>=1.16.0,<2.0.0)
30
28
  Project-URL: Repository, https://github.com/cmancone/clearskies
31
29
  Description-Content-Type: text/markdown
32
30
 
@@ -34,11 +32,11 @@ Description-Content-Type: text/markdown
34
32
 
35
33
  clearskies is a very opinionated Python framework intended for developing microservices in the cloud via declarative programming principles. It is mainly intended for backend services and so is designed for RESTful API endpoints, queue listeners, scheduled tasks, and the like.
36
34
 
37
- # Installation, Documentation, and Usage
35
+ ## Installation, Documentation, and Usage
38
36
 
39
37
  To install:
40
38
 
41
- ```
39
+ ```bash
42
40
  pip3 install clear-skies
43
41
  ```
44
42
 
@@ -2,11 +2,11 @@
2
2
 
3
3
  clearskies is a very opinionated Python framework intended for developing microservices in the cloud via declarative programming principles. It is mainly intended for backend services and so is designed for RESTful API endpoints, queue listeners, scheduled tasks, and the like.
4
4
 
5
- # Installation, Documentation, and Usage
5
+ ## Installation, Documentation, and Usage
6
6
 
7
7
  To install:
8
8
 
9
- ```
9
+ ```bash
10
10
  pip3 install clear-skies
11
11
  ```
12
12
 
@@ -0,0 +1,75 @@
1
+ [project]
2
+ name = "clear-skies"
3
+ description = "A framework for building backends in the cloud"
4
+ version = "v0.0.0-dev"
5
+ license = "MIT"
6
+ dynamic = ["classifiers"]
7
+ readme = "./README.md"
8
+ authors = [{name = "Conor Mancone", email = "cmancone@gmail.com"}]
9
+ requires-python = '>=3.11,<4.0'
10
+ dependencies = ['dateparser (>=1.1.8,<2.0.0)', 'requests (>=2.31.0,<3.0.0)', 'typing-extensions (>=4.12.0,<5.0.0) ; python_version >= "3.10" and python_version < "3.11"', 'wrapt (>=1.16.0,<2.0.0)']
11
+
12
+ [project.urls]
13
+ repository = "https://github.com/cmancone/clearskies"
14
+
15
+ [project.optional-dependencies]
16
+ secrets = ['akeyless (>=4.0.0,<5.0.0)', 'akeyless-cloud-id (>=0.2.3,<0.3.0)']
17
+ mysql = ['pymysql (>=1.1.0,<2.0.0)']
18
+ jwcrypto = ['jwcrypto (>=1.5.6,<2.0.0)']
19
+
20
+ [tool.poetry]
21
+ packages = [
22
+ { include = "clearskies", from = "src" }
23
+ ]
24
+ exclude = [
25
+ "src/clearskies/*_test.py",
26
+ "src/clearskies/**/*_test.py",
27
+ "src/clearskies/integration_tests/*"
28
+ ]
29
+ classifiers = [
30
+ "Development Status :: 5 - Production/Stable",
31
+ "Programming Language :: Python :: 3",
32
+ "License :: OSI Approved :: MIT License",
33
+ "Intended Audience :: Developers",
34
+ "Topic :: Software Development :: Libraries :: Application Frameworks"
35
+ ]
36
+ requires-poetry = '>=2.0,<3.0'
37
+
38
+ [[tool.poetry.source]]
39
+ name = "PyPI"
40
+ priority = "primary"
41
+
42
+ [tool.poetry.group.dev.dependencies]
43
+ black = "^25.1.0"
44
+ mypy = "^1.16.1"
45
+ pre-commit = "^3.8.0"
46
+ pytest = "^8.4.1"
47
+ ruff = "^0.12.1"
48
+ types-dateparser = "^1.2.2.20250627"
49
+ types-jwcrypto = "^1.5.0.20250516"
50
+ types-pymysql = "^1.1.0.20250516"
51
+ types-requests = "^2.32.4.20250611"
52
+
53
+ [tool.pytest]
54
+ addopts = "--ignore=src/clearskies/contexts/test.py --cache-clear"
55
+
56
+ [build-system]
57
+ requires = ['poetry-core (>=2.0,<3.0)']
58
+ build-backend = "poetry.core.masonry.api"
59
+
60
+ [tool.black]
61
+ line-length = 120
62
+ # The following is Black's default, but it's good to be explicit
63
+ # to match your Ruff config.
64
+ skip-magic-trailing-comma = false
65
+ preview = true
66
+
67
+ [tool.mypy]
68
+ python_version = "3.11"
69
+
70
+ exclude = [
71
+ ".*_test\\.py$"
72
+ ]
73
+
74
+ [tool.poetry-git-version-plugin]
75
+ release_type = "tag"
@@ -0,0 +1,62 @@
1
+ from . import (
2
+ authentication,
3
+ autodoc,
4
+ backends,
5
+ columns,
6
+ configs,
7
+ contexts,
8
+ di,
9
+ endpoints,
10
+ exceptions,
11
+ functional,
12
+ query,
13
+ # secrets,
14
+ security_headers,
15
+ typing,
16
+ validators,
17
+ )
18
+ from . import parameters_to_properties as parameters_to_properties_module
19
+ from .column import Column
20
+ from .configurable import Configurable
21
+ from .end import End # type: ignore
22
+ from .endpoint import Endpoint
23
+ from .endpoint_group import EndpointGroup
24
+ from .schema import Schema
25
+
26
+ parameters_to_properties = parameters_to_properties_module.parameters_to_properties
27
+
28
+ from .action import Action
29
+ from .environment import Environment
30
+ from .model import Model
31
+ from .security_header import SecurityHeader
32
+ from .validator import Validator
33
+
34
+ __all__ = [
35
+ "Action",
36
+ "Authentication",
37
+ "autodoc",
38
+ "backends",
39
+ "Column",
40
+ "columns",
41
+ "configs",
42
+ "Configurable",
43
+ "contexts",
44
+ "di",
45
+ "End",
46
+ "Endpoint",
47
+ "EndpointGroup",
48
+ "endpoints",
49
+ "Environment",
50
+ "exceptions",
51
+ "functional",
52
+ "Model",
53
+ "parameters_to_properties",
54
+ "Schema",
55
+ "typing",
56
+ "Validator",
57
+ "query",
58
+ # "secrets",
59
+ "SecurityHeader",
60
+ "security_headers",
61
+ "validators",
62
+ ]
@@ -0,0 +1,7 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+
4
+ class Action(ABC):
5
+ @abstractmethod
6
+ def __call__(self, model):
7
+ pass
@@ -0,0 +1,15 @@
1
+ from clearskies.authentication.authentication import Authentication
2
+ from clearskies.authentication.authorization import Authorization
3
+ from clearskies.authentication.authorization_pass_through import AuthorizationPassThrough
4
+ from clearskies.authentication.jwks import Jwks
5
+ from clearskies.authentication.public import Public
6
+ from clearskies.authentication.secret_bearer import SecretBearer
7
+
8
+ __all__ = [
9
+ "Authentication",
10
+ "Authorization",
11
+ "AuthorizationPassThrough",
12
+ "Jwks",
13
+ "Public",
14
+ "SecretBearer",
15
+ ]
@@ -0,0 +1,42 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING, Any
4
+
5
+ import requests
6
+
7
+ import clearskies.configurable
8
+ from clearskies.authentication.authorization import Authorization
9
+
10
+ if TYPE_CHECKING:
11
+ from clearskies.security_headers.cors import Cors
12
+
13
+
14
+ class Authentication(clearskies.configurable.Configurable, requests.auth.AuthBase):
15
+ is_public = True
16
+ can_authorize = False
17
+ has_dynamic_credentials = False
18
+
19
+ def clear_credential_cache(self) -> None:
20
+ pass
21
+
22
+ def headers(self, retry_auth: bool = False) -> dict[str, str]:
23
+ return {}
24
+
25
+ def authenticate(self, input_output) -> bool:
26
+ return True
27
+
28
+ def authorize(self, authorization: Authorization):
29
+ raise ValueError("Public endpoints do not support authorization")
30
+
31
+ def set_headers_for_cors(self, cors: Cors):
32
+ pass
33
+
34
+ def documentation_security_scheme(self) -> dict[str, Any]:
35
+ return {}
36
+
37
+ def documentation_security_scheme_name(self) -> str:
38
+ return ""
39
+
40
+ def __call__(self, request: requests.models.PreparedRequest) -> requests.models.PreparedRequest:
41
+ request.headers = {**request.headers, **self.headers()} # type: ignore
42
+ return request
@@ -0,0 +1,12 @@
1
+ class Authorization:
2
+ def gate(self, authorization_data, input_output):
3
+ """
4
+ Return True/False to denote if the given user, as represented by the authorization data, should be allowed access.
5
+
6
+ Raise clearskies.exceptions.ClientError if you want to raise a specific error message.
7
+ """
8
+ return True
9
+
10
+ def filter_model(self, model, authorization_data, input_output):
11
+ """Return a models object with additional filters applied to account for authorization needs."""
12
+ return model
@@ -0,0 +1,20 @@
1
+ import clearskies.di
2
+
3
+ from .jwks import Jwks
4
+
5
+
6
+ class AuthorizationPassThrough(Jwks):
7
+ """
8
+ Authentication class with pass through.
9
+
10
+ This authentication class takes the authentication header from the incoming request and reflects
11
+ it on outgoing requests.
12
+ """
13
+
14
+ """
15
+ The input output helper
16
+ """
17
+ input_output = clearskies.di.inject.InputOutput()
18
+
19
+ def headers(self, retry_auth=False):
20
+ return {"Authorization": self.input_output.request_headers.get("authorization", True)}
@@ -0,0 +1,158 @@
1
+ import json
2
+ from typing import Any
3
+
4
+ import clearskies.configs
5
+ import clearskies.di
6
+ import clearskies.parameters_to_properties
7
+ from clearskies.authentication.authentication import Authentication
8
+ from clearskies.exceptions import ClientError
9
+ from clearskies.security_headers.cors import Cors
10
+
11
+
12
+ class Jwks(Authentication, clearskies.di.InjectableProperties):
13
+ """The URL where the JWKS can be found."""
14
+
15
+ jwks_url = clearskies.configs.String(required=True)
16
+
17
+ """
18
+ The audience to accept JWTs for.
19
+ """
20
+ audience = clearskies.configs.StringList(default=[])
21
+
22
+ """
23
+ The expected issuer of the JWTs.
24
+ """
25
+ issuer = clearskies.configs.String(default="")
26
+
27
+ """
28
+ The allowed algorithms
29
+ """
30
+ algorithms = clearskies.configs.StringList(default=["RS256"])
31
+
32
+ """
33
+ The number of seconds for which the JWKS URL contents can be cached
34
+ """
35
+ jwks_cache_time = clearskies.configs.Integer(default=86400)
36
+
37
+ """
38
+ The Authorization URL (used in the auto-generated documentation)
39
+ """
40
+ authorization_url = clearskies.configs.String()
41
+
42
+ """
43
+ The name of the security scheme in the auto-generated documentation.
44
+ """
45
+ documentation_security_name = clearskies.configs.String(default="jwt")
46
+
47
+ """
48
+ The environment helper.
49
+ """
50
+ environment = clearskies.di.inject.Environment()
51
+
52
+ """
53
+ The requests object.
54
+ """
55
+ requests = clearskies.di.inject.Requests()
56
+
57
+ """
58
+ The JoseJwt library
59
+ """
60
+ jose_jwt = clearskies.di.inject.ByName("jose_jwt")
61
+
62
+ """
63
+ The current time
64
+ """
65
+ now = clearskies.di.inject.Now()
66
+
67
+ """
68
+ Local cache of the JWKS
69
+ """
70
+ _jwks = None
71
+
72
+ """
73
+ The time when the JWKS was last fetched
74
+ """
75
+ _jwks_fetched = None
76
+
77
+ @clearskies.parameters_to_properties.parameters_to_properties
78
+ def __init__(
79
+ self,
80
+ jwks_url: str,
81
+ audience: str = "",
82
+ issuer: str = "",
83
+ algorithms: list[str] = ["RS256"],
84
+ jwks_cache_time: int = 86400,
85
+ authorization_url: str = "",
86
+ documentation_security_name: str = "jwt",
87
+ ):
88
+ self.finalize_and_validate_configuration()
89
+
90
+ def authenticate(self, input_output) -> bool:
91
+ auth_header = input_output.get_request_header("authorization", True)
92
+ if not auth_header:
93
+ raise ClientError("Missing 'Authorization' header in request")
94
+ if auth_header[:7].lower() != "bearer ":
95
+ raise ClientError("Missing 'Bearer ' prefix in authorization header")
96
+ self.validate_jwt(auth_header[7:])
97
+ input_output.authorization_data = self.jwt_claims
98
+ return True
99
+
100
+ def validate_jwt(self, raw_jwt):
101
+ try:
102
+ from jwcrypto import jwk, jws, jwt # type: ignore
103
+ from jwcrypto.common import JWException # type: ignore
104
+ except:
105
+ raise ValueError(
106
+ "The JWKS authentication method requires the jwcrypto libraries to be installed. These are optional dependencies of clearskies, so to include them do a `pip install 'clear-skies[jwcrypto]'`"
107
+ )
108
+
109
+ keys = jwk.JWKSet()
110
+ keys.import_keyset(json.dumps(self._get_jwks()))
111
+
112
+ client_jwt = jwt.JWT()
113
+ try:
114
+ client_jwt.deserialize(raw_jwt)
115
+ except Exception as e:
116
+ raise ClientError(str(e))
117
+
118
+ try:
119
+ client_jwt.validate(keys)
120
+ self.jwt_claims = json.loads(client_jwt.claims)
121
+ except JWException as e:
122
+ raise ClientError(str(e))
123
+
124
+ if self.issuer and self.jwt_claims.get("iss") != self.issuer:
125
+ raise ClientError("Issuer does not match")
126
+
127
+ if self.audience:
128
+ jwt_audience = self.jwt_claims.get("aud")
129
+ if not jwt_audience:
130
+ raise ClientError("Audience required, but missing in JWT")
131
+ has_match = False
132
+ for audience in jwt_audience:
133
+ if audience == self.audience:
134
+ has_match = True
135
+ if not has_match:
136
+ raise ClientError("Audience does not match")
137
+
138
+ return True
139
+
140
+ def _get_jwks(self):
141
+ if self._jwks is None or ((self.now - self._jwks_fetched).total_seconds() > self.jwks_cache_time):
142
+ self._jwks = self.requests.get(self.jwks_url).json()
143
+ self._jwks_fetched = self.now
144
+
145
+ return self._jwks
146
+
147
+ def documentation_security_scheme(self) -> dict[str, Any]:
148
+ return {
149
+ "type": "oauth2",
150
+ "description": "JWT based authentication",
151
+ "flows": {"implicit": {"authorizationUrl": self.authorization_url, "scopes": {}}},
152
+ }
153
+
154
+ def documentation_security_scheme_name(self) -> str:
155
+ return self.documentation_security_name
156
+
157
+ def set_headers_for_cors(self, cors: Cors):
158
+ cors.add_header("Authorization")
@@ -0,0 +1,5 @@
1
+ from .authentication import Authentication
2
+
3
+
4
+ class Public(Authentication):
5
+ pass