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