clear-skies 1.21.0__tar.gz → 1.21.2__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 (211) hide show
  1. {clear_skies-1.21.0 → clear_skies-1.21.2}/PKG-INFO +2 -1
  2. {clear_skies-1.21.0 → clear_skies-1.21.2}/pyproject.toml +2 -1
  3. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/category_tree.py +79 -1
  4. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/datetime.py +1 -0
  5. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/di/standard_dependencies.py +2 -1
  6. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/model.py +38 -33
  7. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/models.py +43 -43
  8. {clear_skies-1.21.0 → clear_skies-1.21.2}/LICENSE +0 -0
  9. {clear_skies-1.21.0 → clear_skies-1.21.2}/README.md +0 -0
  10. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/__init__.py +0 -0
  11. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/application.py +0 -0
  12. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/authentication/__init__.py +0 -0
  13. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/authentication/auth0_jwks.py +0 -0
  14. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/authentication/auth_exception.py +0 -0
  15. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/authentication/authorization.py +0 -0
  16. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/authentication/jwks.py +0 -0
  17. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/authentication/jwks_jwcrypto.py +0 -0
  18. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/authentication/public.py +0 -0
  19. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/authentication/secret_bearer.py +0 -0
  20. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/__init__.py +0 -0
  21. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/formats/__init__.py +0 -0
  22. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/formats/oai3_json/__init__.py +0 -0
  23. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/formats/oai3_json/oai3_json.py +0 -0
  24. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/formats/oai3_json/oai3_schema_resolver.py +0 -0
  25. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/formats/oai3_json/parameter.py +0 -0
  26. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/formats/oai3_json/request.py +0 -0
  27. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/formats/oai3_json/response.py +0 -0
  28. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/formats/oai3_json/schema/__init__.py +0 -0
  29. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/formats/oai3_json/schema/array.py +0 -0
  30. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/formats/oai3_json/schema/default.py +0 -0
  31. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/formats/oai3_json/schema/enum.py +0 -0
  32. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/formats/oai3_json/schema/object.py +0 -0
  33. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/formats/oai3_json/test.json +0 -0
  34. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/request/__init__.py +0 -0
  35. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/request/header.py +0 -0
  36. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/request/json_body.py +0 -0
  37. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/request/request.py +0 -0
  38. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/request/url_parameter.py +0 -0
  39. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/request/url_path.py +0 -0
  40. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/response/__init__.py +0 -0
  41. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/response/response.py +0 -0
  42. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/schema/__init__.py +0 -0
  43. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/schema/array.py +0 -0
  44. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/schema/base64.py +0 -0
  45. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/schema/boolean.py +0 -0
  46. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/schema/date.py +0 -0
  47. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/schema/datetime.py +0 -0
  48. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/schema/double.py +0 -0
  49. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/schema/enum.py +0 -0
  50. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/schema/integer.py +0 -0
  51. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/schema/long.py +0 -0
  52. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/schema/number.py +0 -0
  53. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/schema/object.py +0 -0
  54. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/schema/password.py +0 -0
  55. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/autodoc/schema/string.py +0 -0
  56. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/backends/__init__.py +0 -0
  57. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/backends/api_backend.py +0 -0
  58. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/backends/backend.py +0 -0
  59. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/backends/cursor_backend.py +0 -0
  60. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/backends/example_backend.py +0 -0
  61. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/backends/file_backend.py +0 -0
  62. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/backends/json_backend.py +0 -0
  63. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/backends/memory_backend.py +0 -0
  64. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/backends/restful_api_advanced_search_backend.py +0 -0
  65. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/backends/secrets_backend.py +0 -0
  66. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/binding_config.py +0 -0
  67. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/__init__.py +0 -0
  68. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/audit.py +0 -0
  69. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/belongs_to.py +0 -0
  70. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/boolean.py +0 -0
  71. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/column.py +0 -0
  72. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/created.py +0 -0
  73. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/created_by_authorization_data.py +0 -0
  74. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/created_by_header.py +0 -0
  75. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/created_by_ip.py +0 -0
  76. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/created_by_routing_data.py +0 -0
  77. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/created_by_user_agent.py +0 -0
  78. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/created_micro.py +0 -0
  79. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/datetime_micro.py +0 -0
  80. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/email.py +0 -0
  81. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/float.py +0 -0
  82. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/has_many.py +0 -0
  83. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/has_one.py +0 -0
  84. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/integer.py +0 -0
  85. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/json.py +0 -0
  86. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/many_to_many.py +0 -0
  87. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/many_to_many_with_data.py +0 -0
  88. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/phone.py +0 -0
  89. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/select.py +0 -0
  90. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/string.py +0 -0
  91. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/timestamp.py +0 -0
  92. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/updated.py +0 -0
  93. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/updated_micro.py +0 -0
  94. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/column_types/uuid.py +0 -0
  95. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/columns.py +0 -0
  96. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/condition_parser.py +0 -0
  97. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/contexts/__init__.py +0 -0
  98. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/contexts/bash.py +0 -0
  99. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/contexts/build_context.py +0 -0
  100. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/contexts/cli.py +0 -0
  101. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/contexts/context.py +0 -0
  102. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/contexts/convert_to_application.py +0 -0
  103. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/contexts/extract_handler.py +0 -0
  104. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/contexts/test.py +0 -0
  105. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/contexts/wsgi.py +0 -0
  106. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/__init__.py +0 -0
  107. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/auth0_jwks.py +0 -0
  108. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/authorization.py +0 -0
  109. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/binding_classes.py +0 -0
  110. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/binding_modules.py +0 -0
  111. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/bindings.py +0 -0
  112. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/create.py +0 -0
  113. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/delete.py +0 -0
  114. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/docs.py +0 -0
  115. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/get.py +0 -0
  116. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/jwks.py +0 -0
  117. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/merge.py +0 -0
  118. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/patch.py +0 -0
  119. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/post.py +0 -0
  120. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/public.py +0 -0
  121. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/response_headers.py +0 -0
  122. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/return_raw_response.py +0 -0
  123. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/schema.py +0 -0
  124. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/secret_bearer.py +0 -0
  125. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/decorators/security_headers.py +0 -0
  126. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/di/__init__.py +0 -0
  127. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/di/additional_config.py +0 -0
  128. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/di/additional_config_auto_import.py +0 -0
  129. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/di/di.py +0 -0
  130. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/di/test_module/__init__.py +0 -0
  131. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/di/test_module/another_module/__init__.py +0 -0
  132. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/di/test_module/module_class.py +0 -0
  133. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/environment.py +0 -0
  134. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/functional/__init__.py +0 -0
  135. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/functional/string.py +0 -0
  136. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/functional/validations.py +0 -0
  137. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/__init__.py +0 -0
  138. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/advanced_search.py +0 -0
  139. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/base.py +0 -0
  140. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/callable.py +0 -0
  141. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/create.py +0 -0
  142. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/crud_by_method.py +0 -0
  143. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/database_connector.py +0 -0
  144. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/delete.py +0 -0
  145. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/exceptions/__init__.py +0 -0
  146. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/exceptions/authentication.py +0 -0
  147. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/exceptions/authorization.py +0 -0
  148. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/exceptions/client_error.py +0 -0
  149. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/exceptions/input_error.py +0 -0
  150. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/exceptions/not_found.py +0 -0
  151. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/get.py +0 -0
  152. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/health_check.py +0 -0
  153. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/input_processing.py +0 -0
  154. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/list.py +0 -0
  155. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/mygrations.py +0 -0
  156. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/request_method_routing.py +0 -0
  157. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/restful_api.py +0 -0
  158. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/routing.py +0 -0
  159. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/schema_helper.py +0 -0
  160. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/simple_routing.py +0 -0
  161. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/simple_routing_route.py +0 -0
  162. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/simple_search.py +0 -0
  163. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/update.py +0 -0
  164. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/handlers/write.py +0 -0
  165. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_outputs/__init__.py +0 -0
  166. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_outputs/cli.py +0 -0
  167. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_outputs/exceptions/__init__.py +0 -0
  168. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_outputs/exceptions/cli_input_error.py +0 -0
  169. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_outputs/exceptions/cli_not_found.py +0 -0
  170. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_outputs/input_output.py +0 -0
  171. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_outputs/wsgi.py +0 -0
  172. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_requirements/__init__.py +0 -0
  173. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_requirements/after.py +0 -0
  174. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_requirements/before.py +0 -0
  175. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_requirements/in_the_future_at_least.py +0 -0
  176. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_requirements/in_the_future_at_most.py +0 -0
  177. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_requirements/in_the_past_at_least.py +0 -0
  178. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_requirements/in_the_past_at_most.py +0 -0
  179. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_requirements/maximum_length.py +0 -0
  180. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_requirements/maximum_value.py +0 -0
  181. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_requirements/minimum_length.py +0 -0
  182. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_requirements/minimum_value.py +0 -0
  183. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_requirements/required.py +0 -0
  184. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_requirements/requirement.py +0 -0
  185. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_requirements/time_delta.py +0 -0
  186. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/input_requirements/unique.py +0 -0
  187. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/mocks/__init__.py +0 -0
  188. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/mocks/input_output.py +0 -0
  189. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/mocks/models.py +0 -0
  190. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/secrets/__init__.py +0 -0
  191. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/secrets/additional_configs/__init__.py +0 -0
  192. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/secrets/additional_configs/mysql_connection_dynamic_producer.py +0 -0
  193. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/secrets/additional_configs/mysql_connection_dynamic_producer_via_ssh_cert_bastion.py +0 -0
  194. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/secrets/akeyless.py +0 -0
  195. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/secrets/exceptions/__init__.py +0 -0
  196. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/secrets/exceptions/not_found.py +0 -0
  197. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/secrets/secrets.py +0 -0
  198. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/security_headers/__init__.py +0 -0
  199. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/security_headers/base.py +0 -0
  200. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/security_headers/cache_control.py +0 -0
  201. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/security_headers/cors.py +0 -0
  202. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/security_headers/csp.py +0 -0
  203. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/security_headers/hsts.py +0 -0
  204. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/security_headers/x_content_type_options.py +0 -0
  205. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/security_headers/x_frame_options.py +0 -0
  206. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/tests/__init__.py +0 -0
  207. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/tests/simple_api/__init__.py +0 -0
  208. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/tests/simple_api/models/__init__.py +0 -0
  209. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/tests/simple_api/models/status.py +0 -0
  210. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/tests/simple_api/models/user.py +0 -0
  211. {clear_skies-1.21.0 → clear_skies-1.21.2}/src/clearskies/tests/simple_api/users_api.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: clear-skies
3
- Version: 1.21.0
3
+ Version: 1.21.2
4
4
  Summary: A framework for building backends in the cloud
5
5
  Home-page: https://github.com/cmancone/clearskies
6
6
  License: MIT
@@ -25,6 +25,7 @@ Requires-Dist: jose (>=1.0.0,<2.0.0) ; extra == "jose"
25
25
  Requires-Dist: jwcrypto (>=1.5.6,<2.0.0) ; extra == "jwcrypto"
26
26
  Requires-Dist: pymysql (>=1.1.0,<2.0.0) ; extra == "mysql"
27
27
  Requires-Dist: requests (>=2.31.0,<3.0.0)
28
+ Requires-Dist: typing-extensions (>=4.12.0,<5.0.0) ; python_version >= "3.10" and python_version < "3.11"
28
29
  Project-URL: Repository, https://github.com/cmancone/clearskies
29
30
  Description-Content-Type: text/markdown
30
31
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  [tool.poetry]
4
4
  name = "clear-skies"
5
- version = "1.21.0"
5
+ version = "1.21.2"
6
6
  description = "A framework for building backends in the cloud"
7
7
  authors = [
8
8
  "Conor Mancone <cmancone@gmail.com>",
@@ -34,6 +34,7 @@ akeyless-cloud-id = {version = "^0.2.3", optional = true}
34
34
  pymysql = {version = "^1.1.0", optional = true}
35
35
  jose = {version = "^1.0.0", optional = true}
36
36
  jwcrypto = {version = "^1.5.6", optional = true}
37
+ typing-extensions = {version = "^4.12.0", python = ">=3.10,<3.11"}
37
38
 
38
39
  [[tool.poetry.source]]
39
40
  name = "PyPI"
@@ -119,6 +119,10 @@ class CategoryTree(BelongsTo):
119
119
  "tree_level_column_name",
120
120
  "max_iterations",
121
121
  "parent_models_class",
122
+ "children_column_name",
123
+ "descendents_column_name",
124
+ "ancestors_column_name",
125
+ "load_relatives_strategy",
122
126
  ]
123
127
 
124
128
  def __init__(self, di):
@@ -137,6 +141,11 @@ class CategoryTree(BelongsTo):
137
141
  configuration["tree_models_class"],
138
142
  config_name="tree_models_class",
139
143
  )
144
+ load_relatives_strategy = configuration.get("load_relatives_strategy", None)
145
+ if load_relatives_strategy and load_relatives_strategy not in ["join", "where_in", "individual"]:
146
+ raise ValueError(
147
+ f"Configuration error for category_tree column '{self.name} in model class '{self.model_class.__name__}': load_relatives_strategy must be one of ['join', 'where_in', or 'individual']"
148
+ )
140
149
 
141
150
  def _finalize_configuration(self, configuration):
142
151
  return {
@@ -152,6 +161,10 @@ class CategoryTree(BelongsTo):
152
161
  "tree_is_parent_column_name": configuration.get("tree_is_parent_column_name", "is_parent"),
153
162
  "tree_level_column_name": configuration.get("tree_level_column_name", "level"),
154
163
  "max_iterations": configuration.get("max_iterations", 100),
164
+ "children_column_name": configuration.get("children_column_name", "children"),
165
+ "descendents_column_name": configuration.get("descendents_column_name", "descendents"),
166
+ "ancestors_column_name": configuration.get("ancestors_column_name", "ancestors"),
167
+ "load_relatives_strategy": configuration.get("load_relatives_strategy", "join"),
155
168
  },
156
169
  }
157
170
 
@@ -167,7 +180,7 @@ class CategoryTree(BelongsTo):
167
180
  return data
168
181
 
169
182
  def force_tree_update(self, model):
170
- self.update_tree_table(model, model.id, model.__getattr__(self.name))
183
+ self.update_tree_table(model, model.get(self.id_column_name), model.__getattr__(self.name))
171
184
 
172
185
  def update_tree_table(self, model, child_id, direct_parent_id):
173
186
  tree_models = self.tree_models
@@ -224,3 +237,68 @@ class CategoryTree(BelongsTo):
224
237
  + "You may have accidentally created a circular cateogry tree. If not, and your category tree "
225
238
  + "really _is_ that deep, then adjust the 'max_iterations' configuration for this column accordingly. "
226
239
  )
240
+
241
+ def can_provide(self, column_name):
242
+ return column_name in [
243
+ self.config("model_column_name"),
244
+ self.config("children_column_name"),
245
+ self.config("descendents_column_name"),
246
+ self.config("ancestors_column_name"),
247
+ ]
248
+
249
+ def provide(self, data, column_name):
250
+ if column_name == self.config("model_column_name"):
251
+ return super().provide(data, column_name)
252
+
253
+ if column_name == self.config("children_column_name"):
254
+ return self.relatives(data)
255
+
256
+ if column_name == self.config("descendents_column_name"):
257
+ return self.relatives(data, include_all=True)
258
+
259
+ if column_name == self.config("ancestors_column_name"):
260
+ return self.relatives(data, find_parents=True)
261
+
262
+ def relatives(self, data, include_all=False, find_parents=False):
263
+ id_column_name = self.model_class.id_column_name
264
+ model_id = data[self.model_class.id_column_name]
265
+ model_table_name = self.model_class.table_name()
266
+ tree_table_name = self.config("tree_models_class").table_name()
267
+ parent_id_column_name = self.config("tree_parent_id_column_name")
268
+ child_id_column_name = self.config("tree_child_id_column_name")
269
+ is_parent_column_name = self.config("is_parent_column_name")
270
+ level_column_name = self.config("tree_level_column_name")
271
+
272
+ if find_parents:
273
+ join_on = parent_id_column_name
274
+ search_on = child_id_column_name
275
+ else:
276
+ join_on = child_id_column_name
277
+ search_on = parent_id_column_name
278
+
279
+ # if we can join then use a join.
280
+ if self.config("load_relatives_strategy") == "join":
281
+ relatives = self.parent_models.join(
282
+ f"{tree_table_name} as tree on tree.{join_on}={model_table_name}.{id_column_name}"
283
+ )
284
+ relatives = relatives.where(f"tree.{search_on}={model_id}")
285
+ if not include_all:
286
+ relatives = relatives.where(f"tree.{is_parent_column_name}=1")
287
+ if find_parents:
288
+ relatives = relatives.sort_by(level_column_name, "asc")
289
+ return relatives
290
+
291
+ # joins only work for SQL-like backends. Otherwise, we have to pull out our list of ids
292
+ branches = self.tree_models.where(f"{search_on}={model_id}")
293
+ if not include_all:
294
+ branches = branches.where(f"tree.{is_parent_column_name}=1")
295
+ if find_parents:
296
+ branches = branches.sort_by(level_column_name, "asc")
297
+ ids = [str(branch.get(child_id_column_name)) for branch in branches]
298
+
299
+ # Can we search with a WHERE IN() clause? If the backend supports it, it is probably faster
300
+ if self.config("load_relatives_strategy") == "where_in":
301
+ return self.parent_models.where(f"{id_column_name} IN ('" + "','".join(ids) + "')")
302
+
303
+ # otherwise we have to load each model individually which is SLOW....
304
+ return [self.parent_models.find(f"{id_column_name}={id}") for id in ids]
@@ -3,6 +3,7 @@ from datetime import datetime, timezone
3
3
  import dateparser
4
4
  from ..autodoc.schema import DateTime as AutoDocDateTime
5
5
 
6
+
6
7
  class DateTime(Column):
7
8
  _auto_doc_class = AutoDocDateTime
8
9
  _date_format = "%Y-%m-%d %H:%M:%S"
@@ -138,8 +138,9 @@ class StandardDependencies(DI):
138
138
 
139
139
  def provide_uuid(self):
140
140
  return uuid
141
-
141
+
142
142
  def provide_timezone(self):
143
143
  """Set the default timezone."""
144
144
  import datetime
145
+
145
146
  return datetime.UTC
@@ -5,6 +5,11 @@ from .functional import string
5
5
  import re
6
6
  from .models import Models
7
7
 
8
+ try:
9
+ from typing_extensions import Self
10
+ except ModuleNotFoundError:
11
+ from typing import Self
12
+
8
13
 
9
14
  class Model(Models):
10
15
  _configured_columns = None
@@ -14,14 +19,14 @@ class Model(Models):
14
19
  _transformed = None
15
20
  id_column_name = "id"
16
21
 
17
- def __init__(self, backend, columns):
22
+ def __init__(self: Self, backend, columns):
18
23
  super().__init__(backend, columns)
19
24
  self._transformed = {}
20
25
  self._data = {}
21
26
  self._previous_data = None
22
27
  self._touched_columns = None
23
28
 
24
- def model_class(self):
29
+ def model_class(self: Self) -> type[Self]:
25
30
  """
26
31
  Return the model class that this models object will find/return instances of
27
32
 
@@ -30,7 +35,7 @@ class Model(Models):
30
35
  return self.__class__
31
36
 
32
37
  @classmethod
33
- def table_name(cls):
38
+ def table_name(cls: type[Self]) -> str:
34
39
  """Return the name of the table that the model uses for data storage"""
35
40
  singular = string.camel_case_to_snake_case(cls.__name__)
36
41
  if singular[-1] == "y":
@@ -40,16 +45,16 @@ class Model(Models):
40
45
  return f"{singular}s"
41
46
 
42
47
  @abstractmethod
43
- def columns_configuration(self):
48
+ def columns_configuration(self: Self):
44
49
  """Returns an ordered dictionary with the configuration for the columns"""
45
50
  pass
46
51
 
47
- def all_columns(self):
52
+ def all_columns(self: Self):
48
53
  default = OrderedDict([(self.id_column_name, {"class": UUID})])
49
54
  default.update(self.columns_configuration())
50
55
  return default
51
56
 
52
- def columns(self, overrides=None):
57
+ def columns(self: Self, overrides=None):
53
58
  # no caching if we have overrides
54
59
  if overrides is not None:
55
60
  return self._columns.configure(self.all_columns(), self.__class__, overrides=overrides)
@@ -58,13 +63,13 @@ class Model(Models):
58
63
  self._configured_columns = self._columns.configure(self.all_columns(), self.__class__)
59
64
  return self._configured_columns
60
65
 
61
- def supports_n_plus_one(self):
66
+ def supports_n_plus_one(self: Self):
62
67
  return self._backend.supports_n_plus_one
63
68
 
64
- def __getitem__(self, column_name):
69
+ def __getitem__(self: Self, column_name):
65
70
  return self.__getattr__(column_name)
66
71
 
67
- def __getattr__(self, column_name):
72
+ def __getattr__(self: Self, column_name):
68
73
  # this should be adjusted to only return None for empty records if the column name corresponds
69
74
  # to an actual column in the table.
70
75
  if not self.exists:
@@ -72,13 +77,13 @@ class Model(Models):
72
77
 
73
78
  return self.get_transformed_from_data(column_name, self._data)
74
79
 
75
- def get(self, column_name, silent=False):
80
+ def get(self: Self, column_name, silent=False):
76
81
  if not self.exists:
77
82
  return None
78
83
 
79
84
  return self.get_transformed_from_data(column_name, self._data, silent=silent)
80
85
 
81
- def get_transformed_from_data(self, column_name, data, cache=True, check_providers=True, silent=False):
86
+ def get_transformed_from_data(self: Self, column_name, data, cache=True, check_providers=True, silent=False):
82
87
  if cache and column_name in self._transformed:
83
88
  return self._transformed[column_name]
84
89
 
@@ -111,18 +116,18 @@ class Model(Models):
111
116
  return value
112
117
 
113
118
  @property
114
- def exists(self):
119
+ def exists(self: Self) -> bool:
115
120
  return True if (self.id_column_name in self._data and self._data[self.id_column_name]) else False
116
121
 
117
122
  @property
118
- def data(self):
123
+ def data(self: Self):
119
124
  return self._data
120
125
 
121
126
  @data.setter
122
- def data(self, data):
127
+ def data(self: Self, data) -> None:
123
128
  self._data = {} if data is None else data
124
129
 
125
- def save(self, data, columns=None):
130
+ def save(self: Self, data, columns=None) -> bool:
126
131
  """
127
132
  Save data to the database and update the model!
128
133
 
@@ -168,7 +173,7 @@ class Model(Models):
168
173
 
169
174
  return True
170
175
 
171
- def is_changing(self, key, data):
176
+ def is_changing(self: Self, key, data) -> bool:
172
177
  """
173
178
  Returns True/False to denote if the given column is being modified by the active save operation
174
179
 
@@ -184,7 +189,7 @@ class Model(Models):
184
189
 
185
190
  return self.__getattr__(key) != data[key]
186
191
 
187
- def latest(self, key, data):
192
+ def latest(self: Self, key, data):
188
193
  """
189
194
  Returns the 'latest' value for a column during the save operation
190
195
 
@@ -198,7 +203,7 @@ class Model(Models):
198
203
  return data[key]
199
204
  return self.__getattr__(key)
200
205
 
201
- def was_changed(self, key):
206
+ def was_changed(self: Self, key) -> bool:
202
207
  """Returns True/False to denote if a column was changed in the last save"""
203
208
  if self._previous_data is None:
204
209
  raise ValueError("was_changed was called before a save was finished - you must save something first")
@@ -221,10 +226,10 @@ class Model(Models):
221
226
  return old_value != new_value
222
227
  return not columns[key].values_match(old_value, new_value)
223
228
 
224
- def previous_value(self, key):
229
+ def previous_value(self: Self, key):
225
230
  return self.get_transformed_from_data(key, self._previous_data, cache=False, check_providers=False, silent=True)
226
231
 
227
- def delete(self, except_if_not_exists=True):
232
+ def delete(self: Self, except_if_not_exists=True) -> bool:
228
233
  if not self.exists:
229
234
  if except_if_not_exists:
230
235
  raise ValueError("Cannot delete model that already exists")
@@ -240,7 +245,7 @@ class Model(Models):
240
245
  self.post_delete()
241
246
  return True
242
247
 
243
- def columns_pre_save(self, data, columns):
248
+ def columns_pre_save(self: Self, data, columns):
244
249
  """Uses the column information present in the model to make any necessary changes before saving"""
245
250
  for column in columns.values():
246
251
  data = column.pre_save(data, self)
@@ -258,7 +263,7 @@ class Model(Models):
258
263
  """
259
264
  return data
260
265
 
261
- def columns_to_backend(self, data, columns):
266
+ def columns_to_backend(self: Self, data, columns):
262
267
  backend_data = {**data}
263
268
  temporary_data = {}
264
269
  for column in columns.values():
@@ -275,10 +280,10 @@ class Model(Models):
275
280
 
276
281
  return [backend_data, temporary_data]
277
282
 
278
- def to_backend(self, data, columns):
283
+ def to_backend(self: Self, data, columns):
279
284
  return data
280
285
 
281
- def columns_post_save(self, data, id, columns):
286
+ def columns_post_save(self: Self, data, id, columns):
282
287
  """Uses the column information present in the model to make additional changes as needed after saving"""
283
288
  for column in columns.values():
284
289
  data = column.post_save(data, self, id)
@@ -288,12 +293,12 @@ class Model(Models):
288
293
  )
289
294
  return data
290
295
 
291
- def columns_save_finished(self, columns):
296
+ def columns_save_finished(self: Self, columns):
292
297
  """Calls the save_finished method on all of our columns"""
293
298
  for column in columns.values():
294
299
  column.save_finished(self)
295
300
 
296
- def post_save(self, data, id):
301
+ def post_save(self: Self, data, id):
297
302
  """
298
303
  A hook to extend so you can provide additional pre-save logic as needed
299
304
 
@@ -302,7 +307,7 @@ class Model(Models):
302
307
  """
303
308
  pass
304
309
 
305
- def pre_save(self, data):
310
+ def pre_save(self: Self, data):
306
311
  """
307
312
  A hook to extend so you can provide additional pre-save logic as needed
308
313
 
@@ -310,7 +315,7 @@ class Model(Models):
310
315
  """
311
316
  return data
312
317
 
313
- def save_finished(self):
318
+ def save_finished(self: Self):
314
319
  """
315
320
  A hook to extend so you can provide additional logic after a save operation has fully completed
316
321
 
@@ -320,29 +325,29 @@ class Model(Models):
320
325
  """
321
326
  pass
322
327
 
323
- def columns_pre_delete(self, columns):
328
+ def columns_pre_delete(self: Self, columns):
324
329
  """Uses the column information present in the model to make any necessary changes before deleting"""
325
330
  for column in columns.values():
326
331
  column.pre_delete(self)
327
332
 
328
- def pre_delete(self):
333
+ def pre_delete(self: Self):
329
334
  """
330
335
  A hook to extend so you can provide additional pre-delete logic as needed
331
336
  """
332
337
  pass
333
338
 
334
- def columns_post_delete(self, columns):
339
+ def columns_post_delete(self: Self, columns):
335
340
  """Uses the column information present in the model to make any necessary changes after deleting"""
336
341
  for column in columns.values():
337
342
  column.post_delete(self)
338
343
 
339
- def post_delete(self):
344
+ def post_delete(self: Self):
340
345
  """
341
346
  A hook to extend so you can provide additional post-delete logic as needed
342
347
  """
343
348
  pass
344
349
 
345
- def where_for_request(self, models, routing_data, authorization_data, input_output, overrides=None):
350
+ def where_for_request(self: Self, models, routing_data, authorization_data, input_output, overrides=None):
346
351
  """
347
352
  A hook to automatically apply filtering whenever the model makes an appearance in a get/update/list/search handler.
348
353
  """