clear-skies 1.22.1__tar.gz → 1.22.3__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 (213) hide show
  1. {clear_skies-1.22.1 → clear_skies-1.22.3}/PKG-INFO +1 -1
  2. {clear_skies-1.22.1 → clear_skies-1.22.3}/pyproject.toml +1 -1
  3. clear_skies-1.22.3/src/clearskies/backends/api_get_only_backend.py +101 -0
  4. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/column_types/belongs_to.py +29 -8
  5. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/column_types/has_many.py +35 -2
  6. {clear_skies-1.22.1 → clear_skies-1.22.3}/LICENSE +0 -0
  7. {clear_skies-1.22.1 → clear_skies-1.22.3}/README.md +0 -0
  8. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/__init__.py +0 -0
  9. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/application.py +0 -0
  10. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/authentication/__init__.py +0 -0
  11. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/authentication/auth0_jwks.py +0 -0
  12. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/authentication/auth_exception.py +0 -0
  13. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/authentication/authorization.py +0 -0
  14. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/authentication/authorization_pass_through.py +0 -0
  15. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/authentication/jwks.py +0 -0
  16. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/authentication/jwks_jwcrypto.py +0 -0
  17. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/authentication/public.py +0 -0
  18. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/authentication/secret_bearer.py +0 -0
  19. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/__init__.py +0 -0
  20. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/formats/__init__.py +0 -0
  21. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/formats/oai3_json/__init__.py +0 -0
  22. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/formats/oai3_json/oai3_json.py +0 -0
  23. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/formats/oai3_json/oai3_schema_resolver.py +0 -0
  24. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/formats/oai3_json/parameter.py +0 -0
  25. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/formats/oai3_json/request.py +0 -0
  26. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/formats/oai3_json/response.py +0 -0
  27. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/formats/oai3_json/schema/__init__.py +0 -0
  28. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/formats/oai3_json/schema/array.py +0 -0
  29. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/formats/oai3_json/schema/default.py +0 -0
  30. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/formats/oai3_json/schema/enum.py +0 -0
  31. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/formats/oai3_json/schema/object.py +0 -0
  32. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/formats/oai3_json/test.json +0 -0
  33. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/request/__init__.py +0 -0
  34. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/request/header.py +0 -0
  35. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/request/json_body.py +0 -0
  36. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/request/request.py +0 -0
  37. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/request/url_parameter.py +0 -0
  38. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/request/url_path.py +0 -0
  39. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/response/__init__.py +0 -0
  40. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/response/response.py +0 -0
  41. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/schema/__init__.py +0 -0
  42. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/schema/array.py +0 -0
  43. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/schema/base64.py +0 -0
  44. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/schema/boolean.py +0 -0
  45. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/schema/date.py +0 -0
  46. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/schema/datetime.py +0 -0
  47. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/schema/double.py +0 -0
  48. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/schema/enum.py +0 -0
  49. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/schema/integer.py +0 -0
  50. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/schema/long.py +0 -0
  51. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/schema/number.py +0 -0
  52. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/schema/object.py +0 -0
  53. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/schema/password.py +0 -0
  54. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/autodoc/schema/string.py +0 -0
  55. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/backends/__init__.py +0 -0
  56. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/backends/api_backend.py +0 -0
  57. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/backends/backend.py +0 -0
  58. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/backends/cursor_backend.py +0 -0
  59. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/backends/example_backend.py +0 -0
  60. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/backends/file_backend.py +0 -0
  61. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/backends/json_backend.py +0 -0
  62. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/backends/memory_backend.py +0 -0
  63. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/backends/restful_api_advanced_search_backend.py +0 -0
  64. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/backends/secrets_backend.py +0 -0
  65. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/binding_config.py +0 -0
  66. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/column_types/__init__.py +0 -0
  67. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/column_types/audit.py +0 -0
  68. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/column_types/boolean.py +0 -0
  69. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/column_types/category_tree.py +0 -0
  70. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/column_types/column.py +0 -0
  71. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/column_types/created.py +0 -0
  72. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/column_types/created_by_authorization_data.py +0 -0
  73. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/column_types/created_by_header.py +0 -0
  74. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/column_types/created_by_ip.py +0 -0
  75. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/column_types/created_by_routing_data.py +0 -0
  76. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/column_types/created_by_user_agent.py +0 -0
  77. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/column_types/created_micro.py +0 -0
  78. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/column_types/datetime.py +0 -0
  79. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/column_types/datetime_micro.py +0 -0
  80. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/column_types/email.py +0 -0
  81. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/column_types/float.py +0 -0
  82. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/column_types/has_one.py +0 -0
  83. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/column_types/integer.py +0 -0
  84. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/column_types/json.py +0 -0
  85. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/column_types/many_to_many.py +0 -0
  86. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/column_types/many_to_many_with_data.py +0 -0
  87. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/column_types/phone.py +0 -0
  88. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/column_types/select.py +0 -0
  89. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/column_types/string.py +0 -0
  90. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/column_types/timestamp.py +0 -0
  91. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/column_types/updated.py +0 -0
  92. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/column_types/updated_micro.py +0 -0
  93. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/column_types/uuid.py +0 -0
  94. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/columns.py +0 -0
  95. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/condition_parser.py +0 -0
  96. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/contexts/__init__.py +0 -0
  97. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/contexts/bash.py +0 -0
  98. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/contexts/build_context.py +0 -0
  99. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/contexts/cli.py +0 -0
  100. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/contexts/context.py +0 -0
  101. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/contexts/convert_to_application.py +0 -0
  102. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/contexts/extract_handler.py +0 -0
  103. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/contexts/test.py +0 -0
  104. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/contexts/wsgi.py +0 -0
  105. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/decorators/__init__.py +0 -0
  106. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/decorators/auth0_jwks.py +0 -0
  107. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/decorators/authorization.py +0 -0
  108. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/decorators/binding_classes.py +0 -0
  109. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/decorators/binding_modules.py +0 -0
  110. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/decorators/bindings.py +0 -0
  111. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/decorators/create.py +0 -0
  112. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/decorators/delete.py +0 -0
  113. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/decorators/docs.py +0 -0
  114. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/decorators/get.py +0 -0
  115. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/decorators/jwks.py +0 -0
  116. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/decorators/merge.py +0 -0
  117. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/decorators/patch.py +0 -0
  118. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/decorators/post.py +0 -0
  119. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/decorators/public.py +0 -0
  120. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/decorators/response_headers.py +0 -0
  121. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/decorators/return_raw_response.py +0 -0
  122. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/decorators/schema.py +0 -0
  123. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/decorators/secret_bearer.py +0 -0
  124. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/decorators/security_headers.py +0 -0
  125. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/di/__init__.py +0 -0
  126. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/di/additional_config.py +0 -0
  127. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/di/additional_config_auto_import.py +0 -0
  128. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/di/di.py +0 -0
  129. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/di/standard_dependencies.py +0 -0
  130. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/di/test_module/__init__.py +0 -0
  131. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/di/test_module/another_module/__init__.py +0 -0
  132. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/di/test_module/module_class.py +0 -0
  133. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/environment.py +0 -0
  134. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/functional/__init__.py +0 -0
  135. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/functional/string.py +0 -0
  136. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/functional/validations.py +0 -0
  137. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/handlers/__init__.py +0 -0
  138. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/handlers/advanced_search.py +0 -0
  139. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/handlers/base.py +0 -0
  140. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/handlers/callable.py +0 -0
  141. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/handlers/create.py +0 -0
  142. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/handlers/crud_by_method.py +0 -0
  143. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/handlers/database_connector.py +0 -0
  144. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/handlers/delete.py +0 -0
  145. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/handlers/exceptions/__init__.py +0 -0
  146. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/handlers/exceptions/authentication.py +0 -0
  147. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/handlers/exceptions/authorization.py +0 -0
  148. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/handlers/exceptions/client_error.py +0 -0
  149. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/handlers/exceptions/input_error.py +0 -0
  150. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/handlers/exceptions/not_found.py +0 -0
  151. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/handlers/get.py +0 -0
  152. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/handlers/health_check.py +0 -0
  153. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/handlers/input_processing.py +0 -0
  154. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/handlers/list.py +0 -0
  155. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/handlers/mygrations.py +0 -0
  156. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/handlers/request_method_routing.py +0 -0
  157. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/handlers/restful_api.py +0 -0
  158. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/handlers/routing.py +0 -0
  159. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/handlers/schema_helper.py +0 -0
  160. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/handlers/simple_routing.py +0 -0
  161. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/handlers/simple_routing_route.py +0 -0
  162. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/handlers/simple_search.py +0 -0
  163. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/handlers/update.py +0 -0
  164. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/handlers/write.py +0 -0
  165. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/input_outputs/__init__.py +0 -0
  166. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/input_outputs/cli.py +0 -0
  167. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/input_outputs/exceptions/__init__.py +0 -0
  168. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/input_outputs/exceptions/cli_input_error.py +0 -0
  169. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/input_outputs/exceptions/cli_not_found.py +0 -0
  170. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/input_outputs/input_output.py +0 -0
  171. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/input_outputs/wsgi.py +0 -0
  172. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/input_requirements/__init__.py +0 -0
  173. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/input_requirements/after.py +0 -0
  174. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/input_requirements/before.py +0 -0
  175. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/input_requirements/in_the_future_at_least.py +0 -0
  176. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/input_requirements/in_the_future_at_most.py +0 -0
  177. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/input_requirements/in_the_past_at_least.py +0 -0
  178. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/input_requirements/in_the_past_at_most.py +0 -0
  179. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/input_requirements/maximum_length.py +0 -0
  180. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/input_requirements/maximum_value.py +0 -0
  181. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/input_requirements/minimum_length.py +0 -0
  182. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/input_requirements/minimum_value.py +0 -0
  183. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/input_requirements/required.py +0 -0
  184. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/input_requirements/requirement.py +0 -0
  185. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/input_requirements/time_delta.py +0 -0
  186. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/input_requirements/unique.py +0 -0
  187. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/mocks/__init__.py +0 -0
  188. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/mocks/input_output.py +0 -0
  189. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/mocks/models.py +0 -0
  190. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/model.py +0 -0
  191. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/models.py +0 -0
  192. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/secrets/__init__.py +0 -0
  193. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/secrets/additional_configs/__init__.py +0 -0
  194. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/secrets/additional_configs/mysql_connection_dynamic_producer.py +0 -0
  195. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/secrets/additional_configs/mysql_connection_dynamic_producer_via_ssh_cert_bastion.py +0 -0
  196. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/secrets/akeyless.py +0 -0
  197. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/secrets/exceptions/__init__.py +0 -0
  198. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/secrets/exceptions/not_found.py +0 -0
  199. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/secrets/secrets.py +0 -0
  200. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/security_headers/__init__.py +0 -0
  201. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/security_headers/base.py +0 -0
  202. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/security_headers/cache_control.py +0 -0
  203. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/security_headers/cors.py +0 -0
  204. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/security_headers/csp.py +0 -0
  205. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/security_headers/hsts.py +0 -0
  206. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/security_headers/x_content_type_options.py +0 -0
  207. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/security_headers/x_frame_options.py +0 -0
  208. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/tests/__init__.py +0 -0
  209. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/tests/simple_api/__init__.py +0 -0
  210. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/tests/simple_api/models/__init__.py +0 -0
  211. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/tests/simple_api/models/status.py +0 -0
  212. {clear_skies-1.22.1 → clear_skies-1.22.3}/src/clearskies/tests/simple_api/models/user.py +0 -0
  213. {clear_skies-1.22.1 → clear_skies-1.22.3}/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.22.1
3
+ Version: 1.22.3
4
4
  Summary: A framework for building backends in the cloud
5
5
  Home-page: https://github.com/cmancone/clearskies
6
6
  License: MIT
@@ -2,7 +2,7 @@
2
2
 
3
3
  [tool.poetry]
4
4
  name = "clear-skies"
5
- version = "1.22.1"
5
+ version = "1.22.3"
6
6
  description = "A framework for building backends in the cloud"
7
7
  authors = [
8
8
  "Conor Mancone <cmancone@gmail.com>",
@@ -0,0 +1,101 @@
1
+ from .api_backend import ApiBackend
2
+ from typing import Any, Callable, Dict, List, Tuple
3
+ from .. import model
4
+
5
+
6
+ class ApiGetOnlyBackend(ApiBackend):
7
+ _requests = None
8
+ _auth = None
9
+ _id_column_name = None
10
+
11
+ _allowed_configs = [
12
+ "wheres",
13
+ "table_name",
14
+ "model_columns",
15
+ "select_all",
16
+ ]
17
+
18
+ def __init__(self, requests):
19
+ self._requests = requests
20
+
21
+ def configure(self, auth=None, origin=None, id_column_name="id"):
22
+ self._auth = auth
23
+ self._origin = origin
24
+ self._id_column_name = id_column_name
25
+
26
+ def records_url(self, configuration):
27
+ record_id = None
28
+ for where in configuration["wheres"]:
29
+ if where["column"] == "id":
30
+ record_id = where["values"][0]
31
+ if record_id:
32
+ return self.auth_origin + configuration["table_name"].strip("/") + f"/{record_id}"
33
+ return self.auth_origin + configuration["table_name"].strip("/") + "/search"
34
+
35
+ def delete_url(self, id: str, model: model.Model) -> str:
36
+ table_name = model.table_name().rstrip("/")
37
+ return f"{table_name}/{id}"
38
+
39
+ def update_url(self, id: str, model: model.Model) -> str:
40
+ table_name = model.table_name().rstrip("/")
41
+ return f"{table_name}/{id}"
42
+
43
+ def create_url(self, data: Dict[str, Any], model: model.Model) -> str:
44
+ return model.table_name().rstrip("/")
45
+
46
+ def records_method(self, configuration: Dict[str, Any]) -> str:
47
+ return "POST"
48
+
49
+ def count_method(self, configuration: Dict[str, Any]) -> str:
50
+ return "POST"
51
+
52
+ def _build_delete_request(self, id, model):
53
+ data = model.data
54
+ (url, data) = self._finalize_url_and_data(self.delete_url(id, model), data)
55
+ return [url, self.delete_method(id, model), {}, {}]
56
+
57
+ def _build_count_request(self, configuration):
58
+ [url, method, json_data, headers] = super()._build_count_request(configuration)
59
+ json_data["count_only"] = True
60
+ return [url, method, json_data, headers]
61
+
62
+ def records(self, configuration, model, next_page_data={}):
63
+ configuration = self._check_query_configuration(configuration)
64
+ [url, method, json_data, headers] = self._build_records_request(configuration)
65
+ response = self._execute_request(url, method, json=json_data, headers=headers).json()
66
+ records = self._map_records_response(response)
67
+ for next_page_key in ["nextPage", "NextPage", "next_page"]:
68
+ if response.get("pagination", {}).get(next_page_key):
69
+ for key, value in response["pagination"][next_page_key].items():
70
+ next_page_data[key] = value
71
+ return records
72
+
73
+ def _as_post_data(self, configuration):
74
+ data = {
75
+ "where": list(
76
+ map(lambda where: self._where_for_post(where, configuration["model_columns"]), configuration["wheres"])
77
+ ),
78
+ "sort": configuration["sorts"],
79
+ "start": configuration["pagination"].get("start", 0),
80
+ "limit": configuration["limit"],
81
+ }
82
+ return {key: value for (key, value) in data.items() if value}
83
+
84
+ def _where_for_post(self, where, columns):
85
+ prefix = ""
86
+ if where.get("table"):
87
+ prefix = where["table"] + "."
88
+ return {
89
+ "column": prefix + where["column"],
90
+ "operator": where["operator"],
91
+ "value": self.normalize_outgoing_value(where, columns, where["values"][0]),
92
+ }
93
+
94
+ def normalize_outgoing_value(self, where, columns, value):
95
+ column_name = where["column"]
96
+ if where.get("table") or column_name not in columns:
97
+ return value
98
+ normalized_data = self.column_to_backend(columns[column_name], {column_name: value})
99
+ if column_name in normalized_data:
100
+ return normalized_data[column_name]
101
+ return value
@@ -34,6 +34,7 @@ class BelongsTo(String):
34
34
  "model_column_name",
35
35
  "readable_parent_columns",
36
36
  "join_type",
37
+ "where",
37
38
  ]
38
39
 
39
40
  def __init__(self, di):
@@ -43,6 +44,7 @@ class BelongsTo(String):
43
44
  super()._check_configuration(configuration)
44
45
  self.validate_models_class(configuration["parent_models_class"])
45
46
 
47
+ error_prefix = f"Configuration error for '{self.name}' in '{self.model_class.__name__}':"
46
48
  if not configuration.get("model_column_name") and self.name[-3:] != "_id":
47
49
  raise ValueError(
48
50
  f"Invalid name for column '{self.name}' in '{self.model_class.__name__}' - "
@@ -50,19 +52,14 @@ class BelongsTo(String):
50
52
  + "that the parent model can be fetched from."
51
53
  )
52
54
  if configuration.get("model_column_name") and type(configuration.get("model_column_name")) != str:
53
- raise ValueError(
54
- f"Configuration error for '{self.name}' in '{self.model_class.__name__}': 'model_column_name' must be a string."
55
- )
55
+ raise ValueError(f"{error_prefix} 'model_column_name' must be a string.")
56
56
 
57
57
  join_type = configuration.get("join_type")
58
58
  if join_type and join_type.upper() not in ["LEFT", "INNER"]:
59
- raise ValueError(
60
- f"Configuration error for '{self.name}' in '{self.model_class.__name__}': join_type must be INNER or LEFT"
61
- )
59
+ raise ValueError(f"{error_prefix} join_type must be INNER or LEFT")
62
60
 
63
61
  if configuration.get("readable_parent_columns"):
64
62
  parent_columns = self.di.build(configuration["parent_models_class"], cache=True).raw_columns_configuration()
65
- error_prefix = f"Configuration error for '{self.name}' in '{self.model_class.__name__}':"
66
63
  readable_parent_columns = configuration["readable_parent_columns"]
67
64
  if not hasattr(readable_parent_columns, "__iter__"):
68
65
  raise ValueError(
@@ -81,6 +78,19 @@ class BelongsTo(String):
81
78
  + "column does not exist in the model class."
82
79
  )
83
80
 
81
+ wheres = configuration.get("where")
82
+ if wheres:
83
+ if not isinstance(wheres, list):
84
+ raise ValueError(
85
+ f"{error_prefix} 'where' must be a list of where conditions or callables that return where conditions"
86
+ )
87
+ for index, where in enumerate(wheres):
88
+ if callable(where) or isinstance(where, str):
89
+ continue
90
+ raise ValueError(
91
+ f"{error_prefix} 'where' must be a list of where conditions or callables that return where conditions, but the item in entry #${index+1} was neither a string nor a callable"
92
+ )
93
+
84
94
  def _finalize_configuration(self, configuration):
85
95
  return {
86
96
  **super()._finalize_configuration(configuration),
@@ -89,6 +99,7 @@ class BelongsTo(String):
89
99
  if configuration.get("model_column_name")
90
100
  else self.name[:-3],
91
101
  "join_type": configuration.get("join_type", "INNER").upper(),
102
+ "where": configuration.get("where", []),
92
103
  },
93
104
  }
94
105
 
@@ -149,7 +160,17 @@ class BelongsTo(String):
149
160
 
150
161
  @property
151
162
  def parent_models(self):
152
- return self.di.build(self.config("parent_models_class"), cache=True)
163
+ parents = self.di.build(self.config("parent_models_class"), cache=True)
164
+ for where in self.config("where"):
165
+ if callable(where):
166
+ parents = self.di.call_function(where, model=parents)
167
+ if not parents:
168
+ raise ValueError(
169
+ f"Configuration error for column '{self.name}' in model '{self.model_class.__name__}': when 'where' is a callable, it must return a models class, but when the callable in where entry #{index+1} was called, it did not return the models class"
170
+ )
171
+ else:
172
+ parents = parents.where(where)
173
+ return parents
153
174
 
154
175
  @property
155
176
  def parent_columns(self):
@@ -27,6 +27,7 @@ class HasMany(Column):
27
27
  "is_readable",
28
28
  "readable_child_columns",
29
29
  "parent_id_column_name",
30
+ "where",
30
31
  ]
31
32
 
32
33
  def __init__(self, di):
@@ -63,9 +64,10 @@ class HasMany(Column):
63
64
 
64
65
  def _check_configuration(self, configuration):
65
66
  super()._check_configuration(configuration)
67
+ error_prefix = f"Configuration error for '{self.name}' in '{self.model_class.__name__}':"
68
+
66
69
  if configuration.get("is_readable"):
67
70
  child_columns = self.di.build(configuration["child_models_class"], cache=True).raw_columns_configuration()
68
- error_prefix = f"Configuration error for '{self.name}' in '{self.model_class.__name__}':"
69
71
  if not "readable_child_columns" in configuration:
70
72
  raise ValueError(f"{error_prefix} must provide 'readable_child_columns' if is_readable is set")
71
73
  readable_child_columns = configuration["readable_child_columns"]
@@ -86,6 +88,27 @@ class HasMany(Column):
86
88
  + "column does not exist in the model class."
87
89
  )
88
90
 
91
+ wheres = configuration.get("where")
92
+ if wheres:
93
+ if not isinstance(wheres, list):
94
+ raise ValueError(
95
+ f"{error_prefix} 'where' must be a list of where conditions or callables that return where conditions"
96
+ )
97
+ for index, where in enumerate(wheres):
98
+ if callable(where) or isinstance(where, str):
99
+ continue
100
+ raise ValueError(
101
+ f"{error_prefix} 'where' must be a list of where conditions or callables that return where conditions, but the item in entry #${index+1} was neither a string nor a callable"
102
+ )
103
+
104
+ def _finalize_configuration(self, configuration):
105
+ return {
106
+ **super()._finalize_configuration(configuration),
107
+ **{
108
+ "where": configuration.get("where", []),
109
+ },
110
+ }
111
+
89
112
  def get_child_columns(self):
90
113
  if "child_columns" not in self.configuration:
91
114
  self.configuration["child_columns"] = self.child_models.columns()
@@ -119,7 +142,17 @@ class HasMany(Column):
119
142
 
120
143
  @property
121
144
  def child_models(self):
122
- return self.di.build(self.config("child_models_class"), cache=True)
145
+ children = self.di.build(self.config("child_models_class"), cache=True)
146
+ for index, where in enumerate(self.config("where")):
147
+ if callable(where):
148
+ children = self.di.call_function(where, model=children)
149
+ if not children:
150
+ raise ValueError(
151
+ f"Configuration error for column '{self.name}' in model '{self.model_class.__name__}': when 'where' is a callable, it must return a models class, but when the callable in where entry #{index+1} was called, it did not return the models class"
152
+ )
153
+ else:
154
+ children = children.where(where)
155
+ return children
123
156
 
124
157
  def documentation(self, name=None, example=None, value=None):
125
158
  columns = self.get_child_columns()
File without changes
File without changes