clear-skies 0.0.3a0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of clear-skies might be problematic. Click here for more details.

Files changed (248) hide show
  1. clear_skies-0.0.3a0.dist-info/LICENSE +7 -0
  2. clear_skies-0.0.3a0.dist-info/METADATA +46 -0
  3. clear_skies-0.0.3a0.dist-info/RECORD +248 -0
  4. clear_skies-0.0.3a0.dist-info/WHEEL +4 -0
  5. clearskies/__init__.py +62 -0
  6. clearskies/action.py +7 -0
  7. clearskies/authentication/__init__.py +15 -0
  8. clearskies/authentication/authentication.py +42 -0
  9. clearskies/authentication/authorization.py +12 -0
  10. clearskies/authentication/authorization_pass_through.py +20 -0
  11. clearskies/authentication/jwks.py +158 -0
  12. clearskies/authentication/public.py +5 -0
  13. clearskies/authentication/secret_bearer.py +553 -0
  14. clearskies/autodoc/__init__.py +8 -0
  15. clearskies/autodoc/formats/__init__.py +5 -0
  16. clearskies/autodoc/formats/oai3_json/__init__.py +7 -0
  17. clearskies/autodoc/formats/oai3_json/oai3_json.py +87 -0
  18. clearskies/autodoc/formats/oai3_json/oai3_schema_resolver.py +15 -0
  19. clearskies/autodoc/formats/oai3_json/parameter.py +35 -0
  20. clearskies/autodoc/formats/oai3_json/request.py +68 -0
  21. clearskies/autodoc/formats/oai3_json/response.py +28 -0
  22. clearskies/autodoc/formats/oai3_json/schema/__init__.py +11 -0
  23. clearskies/autodoc/formats/oai3_json/schema/array.py +9 -0
  24. clearskies/autodoc/formats/oai3_json/schema/default.py +13 -0
  25. clearskies/autodoc/formats/oai3_json/schema/enum.py +7 -0
  26. clearskies/autodoc/formats/oai3_json/schema/object.py +29 -0
  27. clearskies/autodoc/formats/oai3_json/test.json +1985 -0
  28. clearskies/autodoc/py.typed +0 -0
  29. clearskies/autodoc/request/__init__.py +15 -0
  30. clearskies/autodoc/request/header.py +6 -0
  31. clearskies/autodoc/request/json_body.py +6 -0
  32. clearskies/autodoc/request/parameter.py +8 -0
  33. clearskies/autodoc/request/request.py +38 -0
  34. clearskies/autodoc/request/url_parameter.py +6 -0
  35. clearskies/autodoc/request/url_path.py +6 -0
  36. clearskies/autodoc/response/__init__.py +5 -0
  37. clearskies/autodoc/response/response.py +9 -0
  38. clearskies/autodoc/schema/__init__.py +31 -0
  39. clearskies/autodoc/schema/array.py +10 -0
  40. clearskies/autodoc/schema/base64.py +8 -0
  41. clearskies/autodoc/schema/boolean.py +5 -0
  42. clearskies/autodoc/schema/date.py +5 -0
  43. clearskies/autodoc/schema/datetime.py +5 -0
  44. clearskies/autodoc/schema/double.py +5 -0
  45. clearskies/autodoc/schema/enum.py +17 -0
  46. clearskies/autodoc/schema/integer.py +6 -0
  47. clearskies/autodoc/schema/long.py +5 -0
  48. clearskies/autodoc/schema/number.py +6 -0
  49. clearskies/autodoc/schema/object.py +13 -0
  50. clearskies/autodoc/schema/password.py +5 -0
  51. clearskies/autodoc/schema/schema.py +11 -0
  52. clearskies/autodoc/schema/string.py +5 -0
  53. clearskies/backends/__init__.py +65 -0
  54. clearskies/backends/api_backend.py +1178 -0
  55. clearskies/backends/backend.py +123 -0
  56. clearskies/backends/cursor_backend.py +335 -0
  57. clearskies/backends/memory_backend.py +797 -0
  58. clearskies/backends/secrets_backend.py +107 -0
  59. clearskies/column.py +1232 -0
  60. clearskies/columns/__init__.py +71 -0
  61. clearskies/columns/audit.py +205 -0
  62. clearskies/columns/belongs_to_id.py +483 -0
  63. clearskies/columns/belongs_to_model.py +128 -0
  64. clearskies/columns/belongs_to_self.py +105 -0
  65. clearskies/columns/boolean.py +109 -0
  66. clearskies/columns/category_tree.py +275 -0
  67. clearskies/columns/category_tree_ancestors.py +51 -0
  68. clearskies/columns/category_tree_children.py +127 -0
  69. clearskies/columns/category_tree_descendants.py +48 -0
  70. clearskies/columns/created.py +94 -0
  71. clearskies/columns/created_by_authorization_data.py +116 -0
  72. clearskies/columns/created_by_header.py +99 -0
  73. clearskies/columns/created_by_ip.py +92 -0
  74. clearskies/columns/created_by_routing_data.py +96 -0
  75. clearskies/columns/created_by_user_agent.py +92 -0
  76. clearskies/columns/date.py +230 -0
  77. clearskies/columns/datetime.py +278 -0
  78. clearskies/columns/email.py +76 -0
  79. clearskies/columns/float.py +149 -0
  80. clearskies/columns/has_many.py +505 -0
  81. clearskies/columns/has_many_self.py +56 -0
  82. clearskies/columns/has_one.py +14 -0
  83. clearskies/columns/integer.py +156 -0
  84. clearskies/columns/json.py +122 -0
  85. clearskies/columns/many_to_many_ids.py +333 -0
  86. clearskies/columns/many_to_many_ids_with_data.py +270 -0
  87. clearskies/columns/many_to_many_models.py +154 -0
  88. clearskies/columns/many_to_many_pivots.py +133 -0
  89. clearskies/columns/phone.py +158 -0
  90. clearskies/columns/select.py +91 -0
  91. clearskies/columns/string.py +98 -0
  92. clearskies/columns/timestamp.py +160 -0
  93. clearskies/columns/updated.py +110 -0
  94. clearskies/columns/uuid.py +86 -0
  95. clearskies/configs/README.md +105 -0
  96. clearskies/configs/__init__.py +159 -0
  97. clearskies/configs/actions.py +43 -0
  98. clearskies/configs/any.py +13 -0
  99. clearskies/configs/any_dict.py +22 -0
  100. clearskies/configs/any_dict_or_callable.py +23 -0
  101. clearskies/configs/authentication.py +23 -0
  102. clearskies/configs/authorization.py +23 -0
  103. clearskies/configs/boolean.py +16 -0
  104. clearskies/configs/boolean_or_callable.py +18 -0
  105. clearskies/configs/callable_config.py +18 -0
  106. clearskies/configs/columns.py +34 -0
  107. clearskies/configs/conditions.py +30 -0
  108. clearskies/configs/config.py +21 -0
  109. clearskies/configs/datetime.py +18 -0
  110. clearskies/configs/datetime_or_callable.py +19 -0
  111. clearskies/configs/endpoint.py +23 -0
  112. clearskies/configs/float.py +16 -0
  113. clearskies/configs/float_or_callable.py +18 -0
  114. clearskies/configs/integer.py +16 -0
  115. clearskies/configs/integer_or_callable.py +18 -0
  116. clearskies/configs/joins.py +30 -0
  117. clearskies/configs/list_any_dict.py +30 -0
  118. clearskies/configs/list_any_dict_or_callable.py +31 -0
  119. clearskies/configs/model_class.py +35 -0
  120. clearskies/configs/model_column.py +65 -0
  121. clearskies/configs/model_columns.py +56 -0
  122. clearskies/configs/model_destination_name.py +25 -0
  123. clearskies/configs/model_to_id_column.py +43 -0
  124. clearskies/configs/readable_model_column.py +9 -0
  125. clearskies/configs/readable_model_columns.py +9 -0
  126. clearskies/configs/schema.py +23 -0
  127. clearskies/configs/searchable_model_columns.py +9 -0
  128. clearskies/configs/security_headers.py +39 -0
  129. clearskies/configs/select.py +26 -0
  130. clearskies/configs/select_list.py +47 -0
  131. clearskies/configs/string.py +29 -0
  132. clearskies/configs/string_dict.py +32 -0
  133. clearskies/configs/string_list.py +32 -0
  134. clearskies/configs/string_list_or_callable.py +35 -0
  135. clearskies/configs/string_or_callable.py +18 -0
  136. clearskies/configs/timedelta.py +18 -0
  137. clearskies/configs/timezone.py +18 -0
  138. clearskies/configs/url.py +23 -0
  139. clearskies/configs/validators.py +45 -0
  140. clearskies/configs/writeable_model_column.py +9 -0
  141. clearskies/configs/writeable_model_columns.py +9 -0
  142. clearskies/configurable.py +76 -0
  143. clearskies/contexts/__init__.py +11 -0
  144. clearskies/contexts/cli.py +7 -0
  145. clearskies/contexts/context.py +84 -0
  146. clearskies/contexts/wsgi.py +16 -0
  147. clearskies/contexts/wsgi_ref.py +49 -0
  148. clearskies/di/__init__.py +14 -0
  149. clearskies/di/additional_config.py +130 -0
  150. clearskies/di/additional_config_auto_import.py +17 -0
  151. clearskies/di/di.py +968 -0
  152. clearskies/di/inject/__init__.py +23 -0
  153. clearskies/di/inject/by_class.py +21 -0
  154. clearskies/di/inject/by_name.py +18 -0
  155. clearskies/di/inject/di.py +13 -0
  156. clearskies/di/inject/environment.py +14 -0
  157. clearskies/di/inject/input_output.py +20 -0
  158. clearskies/di/inject/now.py +13 -0
  159. clearskies/di/inject/requests.py +13 -0
  160. clearskies/di/inject/secrets.py +14 -0
  161. clearskies/di/inject/utcnow.py +13 -0
  162. clearskies/di/inject/uuid.py +15 -0
  163. clearskies/di/injectable.py +29 -0
  164. clearskies/di/injectable_properties.py +131 -0
  165. clearskies/di/test_module/__init__.py +6 -0
  166. clearskies/di/test_module/another_module/__init__.py +2 -0
  167. clearskies/di/test_module/module_class.py +5 -0
  168. clearskies/end.py +183 -0
  169. clearskies/endpoint.py +1309 -0
  170. clearskies/endpoint_group.py +297 -0
  171. clearskies/endpoints/__init__.py +23 -0
  172. clearskies/endpoints/advanced_search.py +526 -0
  173. clearskies/endpoints/callable.py +387 -0
  174. clearskies/endpoints/create.py +202 -0
  175. clearskies/endpoints/delete.py +139 -0
  176. clearskies/endpoints/get.py +275 -0
  177. clearskies/endpoints/health_check.py +181 -0
  178. clearskies/endpoints/list.py +573 -0
  179. clearskies/endpoints/restful_api.py +427 -0
  180. clearskies/endpoints/simple_search.py +286 -0
  181. clearskies/endpoints/update.py +190 -0
  182. clearskies/environment.py +104 -0
  183. clearskies/exceptions/__init__.py +17 -0
  184. clearskies/exceptions/authentication.py +2 -0
  185. clearskies/exceptions/authorization.py +2 -0
  186. clearskies/exceptions/client_error.py +2 -0
  187. clearskies/exceptions/input_errors.py +4 -0
  188. clearskies/exceptions/moved_permanently.py +3 -0
  189. clearskies/exceptions/moved_temporarily.py +3 -0
  190. clearskies/exceptions/not_found.py +2 -0
  191. clearskies/functional/__init__.py +7 -0
  192. clearskies/functional/routing.py +92 -0
  193. clearskies/functional/string.py +112 -0
  194. clearskies/functional/validations.py +76 -0
  195. clearskies/input_outputs/__init__.py +13 -0
  196. clearskies/input_outputs/cli.py +170 -0
  197. clearskies/input_outputs/exceptions/__init__.py +2 -0
  198. clearskies/input_outputs/exceptions/cli_input_error.py +2 -0
  199. clearskies/input_outputs/exceptions/cli_not_found.py +2 -0
  200. clearskies/input_outputs/headers.py +45 -0
  201. clearskies/input_outputs/input_output.py +138 -0
  202. clearskies/input_outputs/programmatic.py +69 -0
  203. clearskies/input_outputs/py.typed +0 -0
  204. clearskies/input_outputs/wsgi.py +77 -0
  205. clearskies/model.py +662 -0
  206. clearskies/parameters_to_properties.py +31 -0
  207. clearskies/py.typed +0 -0
  208. clearskies/query/__init__.py +12 -0
  209. clearskies/query/condition.py +223 -0
  210. clearskies/query/join.py +136 -0
  211. clearskies/query/query.py +196 -0
  212. clearskies/query/sort.py +27 -0
  213. clearskies/schema.py +82 -0
  214. clearskies/secrets/__init__.py +6 -0
  215. clearskies/secrets/additional_configs/__init__.py +32 -0
  216. clearskies/secrets/additional_configs/mysql_connection_dynamic_producer.py +61 -0
  217. clearskies/secrets/additional_configs/mysql_connection_dynamic_producer_via_ssh_cert_bastion.py +160 -0
  218. clearskies/secrets/akeyless.py +182 -0
  219. clearskies/secrets/exceptions/__init__.py +1 -0
  220. clearskies/secrets/exceptions/not_found.py +2 -0
  221. clearskies/secrets/secrets.py +38 -0
  222. clearskies/security_header.py +8 -0
  223. clearskies/security_headers/__init__.py +11 -0
  224. clearskies/security_headers/cache_control.py +67 -0
  225. clearskies/security_headers/cors.py +50 -0
  226. clearskies/security_headers/csp.py +94 -0
  227. clearskies/security_headers/hsts.py +22 -0
  228. clearskies/security_headers/x_content_type_options.py +0 -0
  229. clearskies/security_headers/x_frame_options.py +0 -0
  230. clearskies/test_base.py +8 -0
  231. clearskies/typing.py +11 -0
  232. clearskies/validator.py +25 -0
  233. clearskies/validators/__init__.py +33 -0
  234. clearskies/validators/after_column.py +62 -0
  235. clearskies/validators/before_column.py +13 -0
  236. clearskies/validators/in_the_future.py +32 -0
  237. clearskies/validators/in_the_future_at_least.py +11 -0
  238. clearskies/validators/in_the_future_at_most.py +10 -0
  239. clearskies/validators/in_the_past.py +32 -0
  240. clearskies/validators/in_the_past_at_least.py +10 -0
  241. clearskies/validators/in_the_past_at_most.py +10 -0
  242. clearskies/validators/maximum_length.py +26 -0
  243. clearskies/validators/maximum_value.py +29 -0
  244. clearskies/validators/minimum_length.py +26 -0
  245. clearskies/validators/minimum_value.py +29 -0
  246. clearskies/validators/required.py +35 -0
  247. clearskies/validators/timedelta.py +59 -0
  248. clearskies/validators/unique.py +31 -0
@@ -0,0 +1,7 @@
1
+ Copyright 2021 Conor Mancone
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4
+
5
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6
+
7
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,46 @@
1
+ Metadata-Version: 2.3
2
+ Name: clear-skies
3
+ Version: 0.0.3a0
4
+ Summary: A framework for building backends in the cloud
5
+ License: MIT
6
+ Author: Conor Mancone
7
+ Author-email: cmancone@gmail.com
8
+ Requires-Python: >=3.11,<4.0
9
+ Classifier: Development Status :: 5 - Production/Stable
10
+ Classifier: Intended Audience :: Developers
11
+ Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: Programming Language :: Python :: 3.11
14
+ Classifier: Programming Language :: Python :: 3.12
15
+ Classifier: Programming Language :: Python :: 3.13
16
+ Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
17
+ Provides-Extra: jwcrypto
18
+ Provides-Extra: mysql
19
+ Provides-Extra: secrets
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)
23
+ Requires-Dist: jwcrypto (>=1.5.6,<2.0.0) ; extra == "jwcrypto"
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/cmancone/clearskies
29
+ Description-Content-Type: text/markdown
30
+
31
+ # clearskies
32
+
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.
34
+
35
+ ## Installation, Documentation, and Usage
36
+
37
+ To install:
38
+
39
+ ```bash
40
+ pip3 install clear-skies
41
+ ```
42
+
43
+ Documentation is under construction here:
44
+
45
+ [https://clearskies.info](https://clearskies.info)
46
+
@@ -0,0 +1,248 @@
1
+ clearskies/__init__.py,sha256=HLBu0CXipIp-Cr_-iBfpN4UlrFwsjTNFOwF9i0iN5i0,1241
2
+ clearskies/action.py,sha256=x_T05XaC0m-BYPZWaSR94XbE7T5ZK1vRtSfEszfZuDg,121
3
+ clearskies/authentication/__init__.py,sha256=MxXNCWhKbha7TPu_MAyssfTdOCEDSNBwzshEHx8gfHo,525
4
+ clearskies/authentication/authentication.py,sha256=rMzX5pveW00RXrAujLGqxOhCMLnvOlAxdQTwl-kCEQk,1203
5
+ clearskies/authentication/authorization.py,sha256=SMbEhX-kwvV5ivFToEVcGR7xqm95DkRg4RAPVLLStOc,534
6
+ clearskies/authentication/authorization_pass_through.py,sha256=d3XKcUWmI_u9QBBTGKrU1hdD-LM56iH60Qv_xc8TE6k,512
7
+ clearskies/authentication/jwks.py,sha256=LPDYjZVVK8aoDUERSyE5pjoac8nA9_TaQtiZRLIZLcs,4826
8
+ clearskies/authentication/public.py,sha256=GSNl4X4fnB25BZoXSo8nqL0iZCa9rzfvPfIsJ2Y34B4,84
9
+ clearskies/authentication/secret_bearer.py,sha256=DP3M5rMW48CToD_ITlrYpaHGyOanyBVGMQQmLo6BK6Y,17608
10
+ clearskies/autodoc/__init__.py,sha256=JRUAmd0he8iGlgiZvxewLMIXJqnOFEdvlaKAtHpC2lo,124
11
+ clearskies/autodoc/formats/__init__.py,sha256=3rhoLKmEwT6PljaHvOl9qdeMIXyD7PQBZbqZKy5Mb5I,56
12
+ clearskies/autodoc/formats/oai3_json/__init__.py,sha256=C9DzR38Uu0t41osMzhQx6K-hyaNWA1t6agTzOXW9k88,142
13
+ clearskies/autodoc/formats/oai3_json/oai3_json.py,sha256=8q3_-Ea-nKySszDQTU2rTyGrp0t_X3IjUMfH1vLt4z8,3052
14
+ clearskies/autodoc/formats/oai3_json/oai3_schema_resolver.py,sha256=5gifJ36dyWEeYtfjHVbbTpPBo0BB1Gqxt0Y3sxTiHJA,509
15
+ clearskies/autodoc/formats/oai3_json/parameter.py,sha256=h9bHXxqJhUc7NRQCZF6RnIPuaY9BA6V_xzYNnsplXlc,1110
16
+ clearskies/autodoc/formats/oai3_json/request.py,sha256=WHEWQvhuhkw82V4YS6GwDN4y8Qy7QDSn9awJEhwLmWU,2939
17
+ clearskies/autodoc/formats/oai3_json/response.py,sha256=ou06oFQtaAR70qIvIoAe4QzohWiACzhCwlW73oM5Dvg,778
18
+ clearskies/autodoc/formats/oai3_json/schema/__init__.py,sha256=VJiDueMdGfJoVQVt9SXIE_-uPghSXtCzpTXuqPaaiRw,173
19
+ clearskies/autodoc/formats/oai3_json/schema/array.py,sha256=1VOrMC_i1JSu1Gw2cqQ7uVDhSk-xNm25io7oBQL9PZM,310
20
+ clearskies/autodoc/formats/oai3_json/schema/default.py,sha256=BhwQebdIaK6rrATu6yZxPU3bqVmd4LFKTTlydJVl644,484
21
+ clearskies/autodoc/formats/oai3_json/schema/enum.py,sha256=7qkpYWXPwbkgkoHPAowMIHJeGNb81qQmTmIIdc5yJbA,265
22
+ clearskies/autodoc/formats/oai3_json/schema/object.py,sha256=-RLIbma-yG6XjGwzBAP7b-smwLhMronW-kdoP5T-Nfk,878
23
+ clearskies/autodoc/formats/oai3_json/test.json,sha256=DdMvSUbaTEAyWtX_RDxEFR82kK9pCCTeFUghQwHjB3s,59848
24
+ clearskies/autodoc/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
+ clearskies/autodoc/request/__init__.py,sha256=-L1hZ70QKn0yzXJtpQS741lbcYXA4i0xQnkebKDjzsA,303
26
+ clearskies/autodoc/request/header.py,sha256=TCeRyFFqcgNN8o9vEmc0JTxs7vRlMHnlhs7zsYfShRM,104
27
+ clearskies/autodoc/request/json_body.py,sha256=qURg3_4fQA9ZUVeR_T0g-RZ8seFIrI0ME-s4PzosfGE,108
28
+ clearskies/autodoc/request/parameter.py,sha256=Z7l7gdsOw-SSLYfL8kQmLnslg89JUQObppxatJiI2sA,233
29
+ clearskies/autodoc/request/request.py,sha256=t1LRnf440xtLaDm8xlbWH9RWtliAstczbKbOsU8HfXg,1371
30
+ clearskies/autodoc/request/url_parameter.py,sha256=mwM9Fe16h_8tdPXvXokjzOH1I2Txs-GFjK1a9FQND2w,117
31
+ clearskies/autodoc/request/url_path.py,sha256=WmZDltORzCir4Ei6_XqoBlh7UBpZZmvZIDfaQezGtmc,107
32
+ clearskies/autodoc/response/__init__.py,sha256=a0vlujvsyLkq1zleRTqcGULoaXTJLkjyTKCUWdsq8Uc,62
33
+ clearskies/autodoc/response/response.py,sha256=I3-wA1gd5XKYey_7gqBoWA-II4k6URop48NO3ckQoh4,266
34
+ clearskies/autodoc/schema/__init__.py,sha256=PF4jywX7Bk6rXaK0LxTQnxk1FLg2O3_Gdm3_XpN61nI,586
35
+ clearskies/autodoc/schema/array.py,sha256=hBLtH5v-o7-KtiFscoa-KAxW4Fcqv_5h542eS7yOo0o,262
36
+ clearskies/autodoc/schema/base64.py,sha256=IPISPbUVf02N_fqcxRMsaiBvFTXAznngZxlWSSyHh-w,190
37
+ clearskies/autodoc/schema/boolean.py,sha256=e6ofkyPcKZllMvSL96M3whjA-tWeT0m5AVotl61wIG8,74
38
+ clearskies/autodoc/schema/date.py,sha256=5IiLM2La1br1E3url6_6k54PYyw_3SyAvvKb1kNReSA,70
39
+ clearskies/autodoc/schema/datetime.py,sha256=WoIPfpVWvr4znQpkqTUT_R1jdnulEvXfOAI3al-AzFA,79
40
+ clearskies/autodoc/schema/double.py,sha256=Wyv9aiPRneeoYWHoYlvkkLUo4WaLnQdvg6ePkXL6k5I,74
41
+ clearskies/autodoc/schema/enum.py,sha256=YP6hPYXTlHWEIPyczPKtimm9luvTcLTT6YrKdGTwty0,413
42
+ clearskies/autodoc/schema/integer.py,sha256=AVqcNyJemzA0Cgg8OGPntDIGONcvOaPWeBVkyQ0ENcY,96
43
+ clearskies/autodoc/schema/long.py,sha256=NhRYUQhr1PZR2gI945RXzu9SfV_hQnTzlxrYCAZKOEo,74
44
+ clearskies/autodoc/schema/number.py,sha256=z6q7XPKW_rLZSv4nYMOcKYQJgXZlmBq9-zsK3kGmI5M,94
45
+ clearskies/autodoc/schema/object.py,sha256=sjW3A1yIGCseRcHHmVbkxNtsg6EPivVMSmmRyZjO_1w,346
46
+ clearskies/autodoc/schema/password.py,sha256=hSXPvHoXEbG-KHQFxXubEarxSMg9Cki_n8tw_yvEFp4,78
47
+ clearskies/autodoc/schema/schema.py,sha256=KZ4r88OUMzbeV4DQ3yUhK8bHS_zJiimsWPWc1rJVDZs,244
48
+ clearskies/autodoc/schema/string.py,sha256=GXRI-aU8PYmjfnhmfaOe4vq7JASb-aB4SiFeG-EmJY0,60
49
+ clearskies/backends/__init__.py,sha256=krBB3gHLP-lVYkm5ksdK7teEtouAHhL3EC__WGVnF4A,3157
50
+ clearskies/backends/api_backend.py,sha256=fRt0U5pZn41ltZUKjbYguJrtNxchSJICLOYIV1bJV7A,54901
51
+ clearskies/backends/backend.py,sha256=1IgX4ts9x8qxoVS2csdDflimVQx0leeVNhvgeUaFn40,5050
52
+ clearskies/backends/cursor_backend.py,sha256=lMnkHATU2Fxr0ihgrVnvI9IVnUPxNfjzpkdJIok2mXY,14360
53
+ clearskies/backends/memory_backend.py,sha256=fXgbFcTvbZeKHs4CsI_yNsofHSjWqZqY9QWI7uJzVws,34260
54
+ clearskies/backends/secrets_backend.py,sha256=zlS2ELM6pgS18tt6KvyOPqHWMMFCqsu76prEnZ8GeE0,4323
55
+ clearskies/column.py,sha256=PKpHsGihsMP4Ph1xzbCvvgjpt5NuiNpGZUGLKvXlNVM,52091
56
+ clearskies/columns/__init__.py,sha256=a__-1hv-aMV3RU0Sd-BEkfItSJaG51EF2VeRQoTdka8,1990
57
+ clearskies/columns/audit.py,sha256=vwWQR_lNKonihb71qUoKQwzLQ5VA1ASFOm7ggA9jJ3Y,7628
58
+ clearskies/columns/belongs_to_id.py,sha256=H6yWsnMgr1za8hRWW40R499SVuTd11Ixb1YCacqCTHM,17820
59
+ clearskies/columns/belongs_to_model.py,sha256=gahATn7dyLsqtS9A1S2ggBOhy6t-x6m84-BjQaPywZk,5703
60
+ clearskies/columns/belongs_to_self.py,sha256=PbSsZVeHe_oex5_aVo059QI4-NjI3ZMGwzPjxNfCwJE,3784
61
+ clearskies/columns/boolean.py,sha256=VJWWgX_QUoc8Otk7S3Ddxea59UlDbaUqiCfMo99Ar1g,3831
62
+ clearskies/columns/category_tree.py,sha256=e4Ja5O3W0XGJCqnJtoJ4Bi2gnuc51UhfJjPbvQ9FiQs,11142
63
+ clearskies/columns/category_tree_ancestors.py,sha256=FRFAMD3E6GzOzzLkY-IhWBdiYSpHHnthF5kX8V3iPr8,1380
64
+ clearskies/columns/category_tree_children.py,sha256=2I3iOBVzcxPp1_NojsCC0exfQDipxbYzGelOcQeUY1M,5267
65
+ clearskies/columns/category_tree_descendants.py,sha256=qM3rgqmxpUkOcCz8b-xCsMDRxjrBpPKyQ_FLGG0ItUc,1234
66
+ clearskies/columns/created.py,sha256=cQQRjqaVwLIQYWyEbuaYsIwYuZOpAXe7XYmysLzeuqY,2851
67
+ clearskies/columns/created_by_authorization_data.py,sha256=7Tp9HOvZXRt6_sUO_8i3UqJ1brp0ZWocYKCCdPW8BSs,4824
68
+ clearskies/columns/created_by_header.py,sha256=WQOl3eyC_bcPn646eTXaynDWEhWtJ6Rw3B31ls-f4lg,3672
69
+ clearskies/columns/created_by_ip.py,sha256=uyiFCwbYaQPZ0pn8asoI-zUMONBQiPnS4tHvnZHTbfU,2811
70
+ clearskies/columns/created_by_routing_data.py,sha256=Joktt9TLFEnqdohKdc11yywE2ZAVNpWA1o6dP-KZyhs,3626
71
+ clearskies/columns/created_by_user_agent.py,sha256=a2OaB5tacr-2Dlvzxjw6tDGhlJIBXZTb69hpy4lxVmM,2896
72
+ clearskies/columns/date.py,sha256=cW94wJAp2K5Qwc04Rl_HY9VD31ia0VQyFcecuvKrVa8,8719
73
+ clearskies/columns/datetime.py,sha256=IJPoCXNMvh_D-KSuE2UBR1dJIfb0EHGooCWonqqvLj0,10463
74
+ clearskies/columns/email.py,sha256=74es6fdA4MJQ9cm5WfEgEvqZgj5pdnFE96cKN1YQ4b0,1868
75
+ clearskies/columns/float.py,sha256=S5ypL0WfguWzKOQzFq5m7bd31IzndNqwazeUIsGcrtk,4453
76
+ clearskies/columns/has_many.py,sha256=RIIks40phXZ_leKoqX4j4w3X6gpRJjDHf7A9SJs9xC0,18670
77
+ clearskies/columns/has_many_self.py,sha256=kFr2eEviiKy_G7zTQx-YqBi5qlWKQaxBylRp-CNiOxg,2425
78
+ clearskies/columns/has_one.py,sha256=8cwfNmAFO1DdfBsZ1scpc3LwLoSUHWR_zPn4T-DN0Mg,396
79
+ clearskies/columns/integer.py,sha256=qWG6JQhZlhrTrIepbeJRdfgShwNXs2ZMj3vCbBDDrIU,4543
80
+ clearskies/columns/json.py,sha256=XZYNs4I2jykYvx8b_jPuRB_x5Ko-AgnnmtV7bjzDzOA,3458
81
+ clearskies/columns/many_to_many_ids.py,sha256=d2kW_QBbxOMU37_uO0LvDMSr1rB4sAlavabEgtze2qc,14158
82
+ clearskies/columns/many_to_many_ids_with_data.py,sha256=i4D9vh61MfP8PpH68vxHGwQgiYJ2YIWKj-EwejEx_nY,11910
83
+ clearskies/columns/many_to_many_models.py,sha256=SUmPcLQqUuj2ptXfNKqHd-DjHBB2yAuklaLbN5dvXFk,7238
84
+ clearskies/columns/many_to_many_pivots.py,sha256=qBsHUBpHSNAAtPfEjMw8rJ7_P51117iA4f1Nz_yaQ0Y,5731
85
+ clearskies/columns/phone.py,sha256=Cv_gAeREmFbTIln6y6yQZrkxzB8PWvKtK3bneABdEko,5219
86
+ clearskies/columns/select.py,sha256=P_nb1n-VQs7-w_GcZ7AAWq0_QA_KQ7EA_kBOng_HgLY,2751
87
+ clearskies/columns/string.py,sha256=MeRN5gMf6SjUV1w6U013-QFWMCEx9h5NJz8uZMlvIhQ,2451
88
+ clearskies/columns/timestamp.py,sha256=_1T20qTVHeLEqqKlxb7IFwUvcYsLWPrGMylPwvVCGBc,5827
89
+ clearskies/columns/updated.py,sha256=_gJw8W_HlNKr-bHTE4eHqMqbFqJ4JcSzTRDLOt7d0Us,3481
90
+ clearskies/columns/uuid.py,sha256=WjWqkGHU6MlxjNQYW8lscgsOfG4mDQnJZGxEqQAoeQU,2432
91
+ clearskies/configs/README.md,sha256=4-r2FvkrBTrKkcKgJ5O3Qj1RZ7nnkknenKze4XYlQDs,4827
92
+ clearskies/configs/__init__.py,sha256=xoll5EalODwI_W1HtWutAIJ_ndzLyWLqvfZonVUtmYY,5017
93
+ clearskies/configs/actions.py,sha256=5OwrokU8uTSSQ_6SvL94SOP5JVkvRRFGAXNcCdMt8aQ,1388
94
+ clearskies/configs/any.py,sha256=_nac0cZY9uRhwGQZqj2N72ZFehYqOedb97lPADP3Yg8,352
95
+ clearskies/configs/any_dict.py,sha256=B8Gd0zwC-6UxvMvPsXMJySzVMADxG3oxnrhgBnJWCGo,871
96
+ clearskies/configs/any_dict_or_callable.py,sha256=cMUaiwcwJS2xv3InwV93icwahUaxoJCbtBwXDylIk-o,1051
97
+ clearskies/configs/authentication.py,sha256=9XZClfYcECi5dzt1BvDof34tW6IotN252bcxlc_u2fc,842
98
+ clearskies/configs/authorization.py,sha256=Pa6wCyMitpKv2Nde69tMB5sJsxeCI2nVSdTuwF6R9pQ,828
99
+ clearskies/configs/boolean.py,sha256=3uoxUmYIK5CAIZRtpcDy18AJ3MWljgUTyvzvSG3EU6I,588
100
+ clearskies/configs/boolean_or_callable.py,sha256=nvvWD_A5HoxW-6_rZJL23_1517T8IQ6Kbu4tNZh9R1E,709
101
+ clearskies/configs/callable_config.py,sha256=gcTlRwCppdaj1gFuCugc4ahxMCTEDKD_z_f85eadWpc,650
102
+ clearskies/configs/columns.py,sha256=WhdpPUiwVqwBO2XCDDiMym2nWr_1-L1JoICyob4T6Wo,1258
103
+ clearskies/configs/conditions.py,sha256=a09bVac4-10ZtKPQGSu_e9VnHnwITwy_7_T4NekXpgs,1008
104
+ clearskies/configs/config.py,sha256=YD7uDn1bbW4TYlcFjKFvx90HoSGbIYn77qjdAHm6z9E,833
105
+ clearskies/configs/datetime.py,sha256=jRYXwLeTUqh8FNwWq_0yYoSH8YU9NEhYhuQScr56nTg,653
106
+ clearskies/configs/datetime_or_callable.py,sha256=81YCDk0g5cIxdXxgem1Ei6m7gUI213Cfryp3GyBfpD4,799
107
+ clearskies/configs/endpoint.py,sha256=NEDthtdPzejAot7yzUjC01PvQJR9BIyk5YnWXCi1w9I,759
108
+ clearskies/configs/float.py,sha256=3870-DkoXCyeOSwUGa69BzhG4XI_tNfei5cX-q1b1UQ,585
109
+ clearskies/configs/float_or_callable.py,sha256=lIOg20Xw0AOB0k3I7f0b98srVgMWQKcyM4aWRT0tUI4,708
110
+ clearskies/configs/integer.py,sha256=d6uoQaUoE01rrWOsxYl1vHG_raUFmB0AUOgoCWwOVC0,584
111
+ clearskies/configs/integer_or_callable.py,sha256=IrVY2Ye57xTxuzOYZ0JY7s6nH6Iphsps32x1dNpcUbw,703
112
+ clearskies/configs/joins.py,sha256=i1QmxFwkpL-pnzVPh3mrHpwrvzsjt9nH5pMSj4J1TT4,944
113
+ clearskies/configs/list_any_dict.py,sha256=YLvlEbM3MrxcOLps5a8CCVl-5o82z4J2aIqKDB7VruU,1327
114
+ clearskies/configs/list_any_dict_or_callable.py,sha256=96mtN6DwkKCAmHlFDHRKnWIhODDu5PQ4O9RpE3wVWh0,1545
115
+ clearskies/configs/model_class.py,sha256=ks0hnB2mZFHjhR3-x51d8IJSLVBclNjD_GhBcNfIxZE,1170
116
+ clearskies/configs/model_column.py,sha256=asTgdSIv27rZQP6KKfvkyRxB4iNgRIExm2DplL95Ro0,2584
117
+ clearskies/configs/model_columns.py,sha256=Kxm1K9jV9ribQtQUMsdyZmKv9GbqLteX_VhEEc9PVzY,2467
118
+ clearskies/configs/model_destination_name.py,sha256=lgC6kDEPWH4cHbAF_N92IF7JdMwNzSkau0HmcyeQ7Ik,983
119
+ clearskies/configs/model_to_id_column.py,sha256=1ItXK4bpOV0putVbOmDcPMH9qz1LDiW1uCN2Z0Qf_co,1543
120
+ clearskies/configs/readable_model_column.py,sha256=SD3LzGkzLbODQILliJveGO-xQxPmOMOL-XX0ROCQ__g,316
121
+ clearskies/configs/readable_model_columns.py,sha256=bz-jwdwhSzs57Dp0ffrajPL0WWZfUXxbhA33zLQmkO8,320
122
+ clearskies/configs/schema.py,sha256=W7xK5EOvZbbi2H5CgT4iifefrR2-XJXBNNx4f8t7j7o,766
123
+ clearskies/configs/searchable_model_columns.py,sha256=SEpYLsaCuT4PJ01RbIeSxGIgVFfFjkvAk9jkDt1AsC8,326
124
+ clearskies/configs/security_headers.py,sha256=wNtoUsghhec-NNZl9dSIRxTTApYw2vukbslYI-YY968,1403
125
+ clearskies/configs/select.py,sha256=xhhgqZZ5fE379iRRuLhV4ouKWro50ODusgtFlU96Ze0,1021
126
+ clearskies/configs/select_list.py,sha256=upnGgw4rHLHlfeKoZps9vrtnzWJr9qN9TDbyu6lw7ps,1889
127
+ clearskies/configs/string.py,sha256=LSPMeh30ljWvC21jNDFmCsyOLMgg_Ip2sV1_fkUxEg4,1093
128
+ clearskies/configs/string_dict.py,sha256=XBK6p1MmzU0gux14Rtc1S9B9PLVcuybRjHxK--LCd3Q,1356
129
+ clearskies/configs/string_list.py,sha256=W33fZfetBvKmT2c1Hza7dtxv2b_xGbAPCQLuUXoM75s,1202
130
+ clearskies/configs/string_list_or_callable.py,sha256=9JycGdX9oUi7IGyY7j50ehTuM2RlQ429BO0NEM1x5eM,1455
131
+ clearskies/configs/string_or_callable.py,sha256=2Bg05AYN6j3v4ttFOmD-EBGfYpok67yiuFXnTTUhhNo,702
132
+ clearskies/configs/timedelta.py,sha256=KpuPDu1_ewEGT_JWCp_YQtKPgZesJClAmxHq047MOjY,667
133
+ clearskies/configs/timezone.py,sha256=FShZlSfCeRk7YkDREJpYC_B8mi-H1aC6Q2CZT659es8,683
134
+ clearskies/configs/url.py,sha256=dx02oiwt8ua5Kv30dJFE0ekJ6Zgz3lcPq9-UNIblI9s,775
135
+ clearskies/configs/validators.py,sha256=aAvf5dgncR8OP7_M7QUNhsHau4wAdPiXw9wNARRAYNY,1346
136
+ clearskies/configs/writeable_model_column.py,sha256=ZwroRcvmNznggtNMSZiAmKAvllcV9LDWZSB-J330Lxg,319
137
+ clearskies/configs/writeable_model_columns.py,sha256=D8E4aQRg1MX8-TM8lkyrWE-G_YoX2eerX4KLszgk0hA,323
138
+ clearskies/configurable.py,sha256=FFkKwlQk17KOLnZiTsTF3hrCu2WxRSuuddNNhz9aySY,3049
139
+ clearskies/contexts/__init__.py,sha256=f7XVUq2UKlDH6fjmcUWk6lbe9p_OaGpZ5ZjM6CuwTGQ,247
140
+ clearskies/contexts/cli.py,sha256=1y7g45FiHbI3Q6JEmwskWVuXPWgmddyK49FfgSafR5U,227
141
+ clearskies/contexts/context.py,sha256=ESnzmhZ7pjDVsmbT7eZTsR26ZvgV-aeeUGsDsT1oK0s,3109
142
+ clearskies/contexts/wsgi.py,sha256=xXHb3m8m44dHKsPX4WLIFExWg5Do2Zv6mQtyb4V4pnM,547
143
+ clearskies/contexts/wsgi_ref.py,sha256=awy-J4DELrVyD5E9FysPE5A_W9JLEZOf2g1hIAogJUA,1733
144
+ clearskies/di/__init__.py,sha256=uJ1NkACEIaot7ALr3M6vQ55Pe9By_s_1z52ssAnw28E,466
145
+ clearskies/di/additional_config.py,sha256=65INxw8aqTZQsyaKPj-aQmd6FBe4_4DwibXGgWYBy14,5139
146
+ clearskies/di/additional_config_auto_import.py,sha256=XYw0Kcnp6hp-ee-c0YjiATwJvRb2E82xk9PuoX9dGRY,758
147
+ clearskies/di/di.py,sha256=g6v2Pjga1EUJ6BaHlX8HL3qoK1z6l_iPl7oNN6eJD9Y,45131
148
+ clearskies/di/inject/__init__.py,sha256=plEkWId-VyhvqX5KM2HhdCqi7_ZJzPmFz69cPAo812Y,643
149
+ clearskies/di/inject/by_class.py,sha256=dUA_ZseLZWT30wnkg272rWwe5FzUpr0gCMMQP_HFahc,796
150
+ clearskies/di/inject/by_name.py,sha256=oEfzeotUXPbUAiBrkE7i19nD2ISk59EEwCH3pcgSmqA,639
151
+ clearskies/di/inject/di.py,sha256=JsQJgoxGdawKN3mAfK5Pu7Ju2b1f0JB0PGQmnSaz2RM,275
152
+ clearskies/di/inject/environment.py,sha256=LWzx1ebujXtgQDGHmiX3O8nB3hihZY7Rl-_ZW-qEH-0,450
153
+ clearskies/di/inject/input_output.py,sha256=URb2qt8F-0QJ1zQpGdkrJxrZVNyF7S21EhhE5x2Irys,517
154
+ clearskies/di/inject/now.py,sha256=XZLeCWRQGQdwG12orozpB2YKS4cQYblc2iVHxEmJneU,359
155
+ clearskies/di/inject/requests.py,sha256=GCfPWEZKrL7uergQB-ZYF235GKG4FAYy5WngRhIOi7I,367
156
+ clearskies/di/inject/secrets.py,sha256=zK7ZJJwZS4l13OVlbBs8ESL8yMxa6jDa4_tiLUvUTdY,418
157
+ clearskies/di/inject/utcnow.py,sha256=3OAzR82k0yEfQ65bJ-4Q7gCZH-Y_viucPJQtfcHu_AA,365
158
+ clearskies/di/inject/uuid.py,sha256=ncXvVNevj6CCwxh1r1IGojEPZaOuHnRjYT7B69RTVhs,400
159
+ clearskies/di/injectable.py,sha256=TTgqhx494470I61-88BUQmHmevfat-wXVseKl8pQOEk,852
160
+ clearskies/di/injectable_properties.py,sha256=0cONm04h_PIK-nIVg1UY2kUnO_FlgktJ1Z9up3vij_8,6463
161
+ clearskies/di/test_module/__init__.py,sha256=7YHQF7JHP0FdI7GdEGANSZ_t1EISQYhUNm1wqOg0NKw,88
162
+ clearskies/di/test_module/another_module/__init__.py,sha256=8SRmHPDepLKGWTUSc1ucDF6U8mJPsNDsBDmBQCpzPWo,35
163
+ clearskies/di/test_module/module_class.py,sha256=I_-wnMuHfbsvti-7d2Z4bXnr6deo__uvww9nds9qrlE,46
164
+ clearskies/end.py,sha256=Z4C9n7OvBky_640oJ8d19jIr_ap1iqjGJqqO6s_zF5g,8919
165
+ clearskies/endpoint.py,sha256=4Wzl89zmNwhKDGqMMlQhzy5MJWx5x_hkbYMDdNguFzw,48817
166
+ clearskies/endpoint_group.py,sha256=ZAkkUsOyd5GFyh_kWFezuO7f8dOzS49pH9bcaaDuW7A,10997
167
+ clearskies/endpoints/__init__.py,sha256=CZJQ3rHF1GA0QvH9CKxUFM1pEnJrg-2wAj5rzIDdzjc,689
168
+ clearskies/endpoints/advanced_search.py,sha256=c1fj81nohHGqe56t00o6kLN3XIh3kfy-aKy_C1pxwgw,21835
169
+ clearskies/endpoints/callable.py,sha256=fdVAa2Dhfg3-OikoE9-PiDnJuZRD0MarQKcdRGwlnaA,13904
170
+ clearskies/endpoints/create.py,sha256=Fgm8ZN2WreGTjWreSyty1c80SP8_qHcjK_be9hpWELw,8757
171
+ clearskies/endpoints/delete.py,sha256=GWnD5-By_5clJzDi8Mac5aeL7HArDpRet3Qo7GPinWk,5296
172
+ clearskies/endpoints/get.py,sha256=w-NWyq9GcQqyBHGS-dTqRdaXRXdvooD-iZ_doDbemNA,10382
173
+ clearskies/endpoints/health_check.py,sha256=Dtj_U2gnrXr7lHXEF0fvldAmA0njsbhivXiKJDe7h7o,5520
174
+ clearskies/endpoints/list.py,sha256=y1I27NlkneYEQ5pc0bKi-99NhoYQlj8kiMJzw91DGCc,25825
175
+ clearskies/endpoints/restful_api.py,sha256=CJZIVEhnTybCwDyQoHmvpvJ7e8p8ays37R1IVX6v79I,16663
176
+ clearskies/endpoints/simple_search.py,sha256=44G4GqNwgNDhcmfpQUFierqvgMxqoRc6y4gqvtHn1xw,9728
177
+ clearskies/endpoints/update.py,sha256=t8kD5zdmcBFSQBbi7C5VnCNs2AUq6xU1cCkvJAKNlFw,7542
178
+ clearskies/environment.py,sha256=LV7XztYYUZhaL8zWXi2EC-u6DLrCPxJTeUzmCy7p-ZA,3703
179
+ clearskies/exceptions/__init__.py,sha256=invmb0wSTpkUuPSEl49bAjU8ing8jt0vEpF2TTnvd_I,595
180
+ clearskies/exceptions/authentication.py,sha256=VlNS0Aq2_6LbG0jiE8jULpS54jNW8a8px0gPrK3EZCc,42
181
+ clearskies/exceptions/authorization.py,sha256=14JuU5zLEf2sv82VNxsJt7dGSwfP-t3Pvf_6QZuacfA,41
182
+ clearskies/exceptions/client_error.py,sha256=o1OGnjlXT5zZ1Vb2LTRPYIio0YAnXPpXDGuqSLQP9_Y,39
183
+ clearskies/exceptions/input_errors.py,sha256=cTEFhWKb6zGZ0NCE8s3eyjB2vZpeUVuBaFPg25ThAn0,137
184
+ clearskies/exceptions/moved_permanently.py,sha256=fcgU_VBtAe8ZnbyNoNpXDcTQ8UtsjdoYg4Z3Ry2gXmc,110
185
+ clearskies/exceptions/moved_temporarily.py,sha256=Pt3muYHASvgOC50wPmoul9hUfy3Ud_NPSGFxshNWbIk,110
186
+ clearskies/exceptions/not_found.py,sha256=_lZwovDrd18dUHDop5pF4mhexBPNr126xF2gOLA2-EA,36
187
+ clearskies/functional/__init__.py,sha256=yXnbX-pjW6MOaBTjIzogvSJZ6O9dbUAWOalhu0WSDiQ,106
188
+ clearskies/functional/routing.py,sha256=tfIvP_Y29GTGr91_1ec3LSQFoTRwpkqU4BYHXPnBaXA,3685
189
+ clearskies/functional/string.py,sha256=ZnkOjx8nxqZq2TV0CIb-Kz4onGoyekTX_WkLJM6XTmM,3311
190
+ clearskies/functional/validations.py,sha256=cPYOTwWomlQrPvqPP_Jdlds7zZ5H9GABCP5pnGzC9T4,2821
191
+ clearskies/input_outputs/__init__.py,sha256=9qeKJULw3MQ3zqkgBZice5d7qqRgsP3y-wkhWO2Y9vM,362
192
+ clearskies/input_outputs/cli.py,sha256=3kSE7p9OitUFyajuALwOtggJCIMIl5p_gxIby6lXE1E,6005
193
+ clearskies/input_outputs/exceptions/__init__.py,sha256=3KiM3KaMYEKoToqCCQ4_no2n0W5ROqeBC0sI2Ix4P6w,82
194
+ clearskies/input_outputs/exceptions/cli_input_error.py,sha256=kOFU8aLTLmeTL_AKDshxMu8_ufildg6p8ndhE1xHfb0,41
195
+ clearskies/input_outputs/exceptions/cli_not_found.py,sha256=JBBuZA9ZwdkPhd3a0qaGgEPQrxh1fehy4R3ZaV2gWXU,39
196
+ clearskies/input_outputs/headers.py,sha256=WjDwV3RppIpPtt5QdgdjYJfIO9ufCEpwJLEn4vLypZI,1616
197
+ clearskies/input_outputs/input_output.py,sha256=W5h8a9XFEqwi3h6v17okblz8sOozUj-mMt4JQyTQUJM,5963
198
+ clearskies/input_outputs/programmatic.py,sha256=gfsNFIfiF5cvxi1aS9SgArcKYUgkL5gyxjCMQLwgivY,1711
199
+ clearskies/input_outputs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
200
+ clearskies/input_outputs/wsgi.py,sha256=94tgWxiwpwvJA9G4nG-hCHteg0pq9pIDCVhnheZuAQc,2544
201
+ clearskies/model.py,sha256=qdGco45F2icRLxhNy5Chtuww-q72jac6eoUpvFn40bU,26492
202
+ clearskies/parameters_to_properties.py,sha256=kbU9Ln2mU3XX4p-QNepGgS4HiQ1BUuJnhx9T6kgB9jw,1004
203
+ clearskies/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
204
+ clearskies/query/__init__.py,sha256=ISF80_cG3rd574sRTdKKPxAdlSjtQh_ClXKKs_MSSSo,277
205
+ clearskies/query/condition.py,sha256=9RJrYya1Kfzx0L_BMDKQhYkN9dB7NAq5kRK5mz51YdY,8624
206
+ clearskies/query/join.py,sha256=4lrDUQzck7klKY_VYkc4SVK95SVwyy3SVTvasnsAEyc,4713
207
+ clearskies/query/query.py,sha256=J_fJ8XZXvZxZ0nZd276WXaxzOFb-bVZ-PTaAqddGhOk,6076
208
+ clearskies/query/sort.py,sha256=c-EtIkjg3kLjwSTdXD7sfyx-mNUhAepUV-2izprh3iY,754
209
+ clearskies/schema.py,sha256=9S0RuFBiydsDy4kATy2BBsXJ9aWHILW0ja_q9F4kxb0,2872
210
+ clearskies/secrets/__init__.py,sha256=WauemayzKCr-guvMu6wCL4hQUIbkDJFuNKEm8Rd6cUs,136
211
+ clearskies/secrets/additional_configs/__init__.py,sha256=cFCrbtKF5nuR061S2y1iKZp349x-y8Srdwe3VZbfSFU,1119
212
+ clearskies/secrets/additional_configs/mysql_connection_dynamic_producer.py,sha256=CnIiXLVQdUnUey3dbCTXuNNP7Mmw1gjjNjZiBtfgGto,2757
213
+ clearskies/secrets/additional_configs/mysql_connection_dynamic_producer_via_ssh_cert_bastion.py,sha256=N8ruxrTNhvYlp3cYXq6V78KPPr4n40LM7QoXHvD8IZg,6235
214
+ clearskies/secrets/akeyless.py,sha256=IUI4RYD-XdNQvyhpuElnw_O74ZY4tJUUtCHmd0dArUI,7158
215
+ clearskies/secrets/exceptions/__init__.py,sha256=j-SLHD-DL0CT4cZXibD9kXHk63JEl_UKX6xL_nq1EfE,32
216
+ clearskies/secrets/exceptions/not_found.py,sha256=_lZwovDrd18dUHDop5pF4mhexBPNr126xF2gOLA2-EA,36
217
+ clearskies/secrets/secrets.py,sha256=TYN0T7XjmvETtSacDKEkyGGO9kDFCoPl5A7FNkvyNj4,1593
218
+ clearskies/security_header.py,sha256=__gPaE6F_MQKpt1cFh_ZOky7I44K3yiy0Z9FeEYscK0,202
219
+ clearskies/security_headers/__init__.py,sha256=JUpc4Y8dNBinDQAkP7OOABR7N787-lRR23boSWmY6Us,285
220
+ clearskies/security_headers/cache_control.py,sha256=1gxASHq74Azpm_19kDFEyT55KuO7gYeyauuvTAZVeaA,2279
221
+ clearskies/security_headers/cors.py,sha256=8cErvdprnT3IlBaoENbNz43UwFpaUWI_NXtJJaYEH3c,1859
222
+ clearskies/security_headers/csp.py,sha256=LQOebTB3pCodiTrJGi6rzac62T1jRAM4XSxuFo2rlqo,2993
223
+ clearskies/security_headers/hsts.py,sha256=sDMgdFxZkwcNvJS2CxXBKGrAWrhs3JqvuOV0Z8Hy2XA,760
224
+ clearskies/security_headers/x_content_type_options.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
225
+ clearskies/security_headers/x_frame_options.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
226
+ clearskies/test_base.py,sha256=Nw6qwsPMOx-QT_6wXn6f9P4BcA7OeGrs83IC2naNMYY,205
227
+ clearskies/typing.py,sha256=Kme9es5c_lw4qQCbCL7lKXtDemVl0_qBy7jxKIu4yyg,378
228
+ clearskies/validator.py,sha256=u9xNOfXbDOTpP1XLu-5O_QGJ6Ja674HRCW6QCxtlD1c,723
229
+ clearskies/validators/__init__.py,sha256=Hz0L5Y7EkeK4Px6WcdQ3ku6VqUGpLHX0ZWwCpT1ts1U,1248
230
+ clearskies/validators/after_column.py,sha256=WPbto20CEYaKjjQtO-0t1s5DvTKW7ipDMNYaqNlr1zY,2394
231
+ clearskies/validators/before_column.py,sha256=fDXhgPwGvnjk1Xy6iwebE8q--BeD48uu3cVGpRGTSBc,528
232
+ clearskies/validators/in_the_future.py,sha256=RLpQvIpng-0eDbOmI5xVLlnXnxS4YwRalYJTDFf_Y74,1012
233
+ clearskies/validators/in_the_future_at_least.py,sha256=C8g6xizvjgB9ZYI8lsccqmxiWR-AmZDuV2hW9gJ3w3A,407
234
+ clearskies/validators/in_the_future_at_most.py,sha256=55Zlw4hEmjm7VbUAesvFpP2Ha1gcEZJuPMZE_15bY0Y,361
235
+ clearskies/validators/in_the_past.py,sha256=nj8ytA8zZYCR4paPWvz-DH-NimFAEXkDtT23HIRrXDc,1008
236
+ clearskies/validators/in_the_past_at_least.py,sha256=58oZEWCL9GC-8kC-VyxN_455DQC2IdF2bWLsOxqLVqU,359
237
+ clearskies/validators/in_the_past_at_most.py,sha256=e78fz7XIBmvbw5EAj-4xjRqiQ-Ul1xKKwMXL-erpxto,357
238
+ clearskies/validators/maximum_length.py,sha256=lTatC9xFQ2JAiBOJtWCrqNEPh7O5k-_L5--FAc-z05U,877
239
+ clearskies/validators/maximum_value.py,sha256=dy3h2LdnPlAhQoVDCtlrf9Yd8yIrmax08u_qSmBddmI,889
240
+ clearskies/validators/minimum_length.py,sha256=gOMbtkoWxvWT4WEPtdP_5xCTn5GsshaaTC1vADpBoao,878
241
+ clearskies/validators/minimum_value.py,sha256=Vz0e_9U5KYqBGqfrVBOtPiVtmNPWwFEGPAuMH1q7Ky0,890
242
+ clearskies/validators/required.py,sha256=gNKEZsYP04PQZc0bE_EpgFw4dWrcKnml2D2QthuD7lY,1410
243
+ clearskies/validators/timedelta.py,sha256=TLtFs4KhOmJpDdrf9mmsSiLtt8yz-i0ym30Cw4EcykY,1960
244
+ clearskies/validators/unique.py,sha256=m59azxUecp7t3WFCehcmQ6E1ZpyXdcLQ1KOSm_p5Hn4,1077
245
+ clear_skies-0.0.3a0.dist-info/LICENSE,sha256=3Ehd0g3YOpCj8sqj0Xjq5qbOtjjgk9qzhhD9YjRQgOA,1053
246
+ clear_skies-0.0.3a0.dist-info/METADATA,sha256=VwDQJYJ_YoN2yZ2QHFNu0Yo7iEOF4ezwUV3zC6LYGVc,1759
247
+ clear_skies-0.0.3a0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
248
+ clear_skies-0.0.3a0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: poetry-core 2.1.3
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
clearskies/__init__.py ADDED
@@ -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
+ ]
clearskies/action.py ADDED
@@ -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