clear-skies 1.18.3__tar.gz → 1.18.5__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 (193) hide show
  1. {clear_skies-1.18.3 → clear_skies-1.18.5}/PKG-INFO +1 -1
  2. {clear_skies-1.18.3 → clear_skies-1.18.5}/pyproject.toml +1 -1
  3. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/authentication/__init__.py +4 -0
  4. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/authentication/auth0_jwks.py +0 -1
  5. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/column.py +6 -0
  6. clear_skies-1.18.5/src/clearskies/column_types/datetime.py +92 -0
  7. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/columns.py +16 -11
  8. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/create.py +1 -1
  9. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/input_processing.py +4 -2
  10. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/update.py +1 -1
  11. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/model.py +16 -5
  12. clear_skies-1.18.3/src/clearskies/column_types/datetime.py +0 -51
  13. {clear_skies-1.18.3 → clear_skies-1.18.5}/LICENSE +0 -0
  14. {clear_skies-1.18.3 → clear_skies-1.18.5}/README.md +0 -0
  15. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/__init__.py +0 -0
  16. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/application.py +0 -0
  17. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/authentication/auth_exception.py +0 -0
  18. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/authentication/authorization.py +0 -0
  19. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/authentication/jwks.py +0 -0
  20. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/authentication/public.py +0 -0
  21. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/authentication/secret_bearer.py +0 -0
  22. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/__init__.py +0 -0
  23. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/__init__.py +0 -0
  24. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/__init__.py +0 -0
  25. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/oai3_json.py +0 -0
  26. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/oai3_schema_resolver.py +0 -0
  27. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/parameter.py +0 -0
  28. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/request.py +0 -0
  29. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/response.py +0 -0
  30. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/schema/__init__.py +0 -0
  31. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/schema/array.py +0 -0
  32. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/schema/default.py +0 -0
  33. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/schema/enum.py +0 -0
  34. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/schema/object.py +0 -0
  35. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/formats/oai3_json/test.json +0 -0
  36. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/request/__init__.py +0 -0
  37. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/request/header.py +0 -0
  38. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/request/json_body.py +0 -0
  39. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/request/request.py +0 -0
  40. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/request/url_parameter.py +0 -0
  41. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/request/url_path.py +0 -0
  42. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/response/__init__.py +0 -0
  43. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/response/response.py +0 -0
  44. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/schema/__init__.py +0 -0
  45. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/schema/array.py +0 -0
  46. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/schema/base64.py +0 -0
  47. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/schema/boolean.py +0 -0
  48. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/schema/date.py +0 -0
  49. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/schema/datetime.py +0 -0
  50. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/schema/double.py +0 -0
  51. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/schema/enum.py +0 -0
  52. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/schema/integer.py +0 -0
  53. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/schema/long.py +0 -0
  54. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/schema/number.py +0 -0
  55. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/schema/object.py +0 -0
  56. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/schema/password.py +0 -0
  57. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/autodoc/schema/string.py +0 -0
  58. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/backends/__init__.py +0 -0
  59. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/backends/api_backend.py +0 -0
  60. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/backends/backend.py +0 -0
  61. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/backends/cursor_backend.py +0 -0
  62. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/backends/example_backend.py +0 -0
  63. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/backends/file_backend.py +0 -0
  64. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/backends/json_backend.py +0 -0
  65. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/backends/memory_backend.py +0 -0
  66. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/backends/restful_api_advanced_search_backend.py +0 -0
  67. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/backends/secrets_backend.py +0 -0
  68. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/binding_config.py +0 -0
  69. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/__init__.py +0 -0
  70. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/audit.py +0 -0
  71. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/belongs_to.py +0 -0
  72. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/boolean.py +0 -0
  73. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/category_tree.py +0 -0
  74. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/created.py +0 -0
  75. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/created_by_authorization_data.py +0 -0
  76. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/created_by_ip.py +0 -0
  77. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/created_by_user_agent.py +0 -0
  78. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/email.py +0 -0
  79. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/float.py +0 -0
  80. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/has_many.py +0 -0
  81. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/integer.py +0 -0
  82. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/json.py +0 -0
  83. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/many_to_many.py +0 -0
  84. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/many_to_many_with_data.py +0 -0
  85. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/select.py +0 -0
  86. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/string.py +0 -0
  87. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/updated.py +0 -0
  88. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/column_types/uuid.py +0 -0
  89. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/condition_parser.py +0 -0
  90. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/contexts/__init__.py +0 -0
  91. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/contexts/bash.py +0 -0
  92. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/contexts/build_context.py +0 -0
  93. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/contexts/cli.py +0 -0
  94. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/contexts/context.py +0 -0
  95. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/contexts/convert_to_application.py +0 -0
  96. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/contexts/extract_handler.py +0 -0
  97. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/contexts/test.py +0 -0
  98. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/contexts/wsgi.py +0 -0
  99. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/__init__.py +0 -0
  100. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/auth0_jwks.py +0 -0
  101. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/authorization.py +0 -0
  102. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/binding_classes.py +0 -0
  103. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/binding_modules.py +0 -0
  104. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/bindings.py +0 -0
  105. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/create.py +0 -0
  106. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/delete.py +0 -0
  107. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/docs.py +0 -0
  108. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/get.py +0 -0
  109. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/jwks.py +0 -0
  110. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/merge.py +0 -0
  111. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/patch.py +0 -0
  112. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/post.py +0 -0
  113. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/public.py +0 -0
  114. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/response_headers.py +0 -0
  115. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/return_raw_response.py +0 -0
  116. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/schema.py +0 -0
  117. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/secret_bearer.py +0 -0
  118. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/decorators/security_headers.py +0 -0
  119. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/di/__init__.py +0 -0
  120. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/di/additional_config.py +0 -0
  121. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/di/di.py +0 -0
  122. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/di/standard_dependencies.py +0 -0
  123. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/di/test_module/__init__.py +0 -0
  124. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/di/test_module/another_module/__init__.py +0 -0
  125. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/di/test_module/module_class.py +0 -0
  126. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/environment.py +0 -0
  127. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/functional/__init__.py +0 -0
  128. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/functional/string.py +0 -0
  129. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/functional/validations.py +0 -0
  130. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/__init__.py +0 -0
  131. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/advanced_search.py +0 -0
  132. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/base.py +0 -0
  133. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/callable.py +0 -0
  134. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/crud_by_method.py +0 -0
  135. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/database_connector.py +0 -0
  136. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/delete.py +0 -0
  137. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/exceptions/__init__.py +0 -0
  138. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/exceptions/authentication.py +0 -0
  139. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/exceptions/authorization.py +0 -0
  140. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/exceptions/client_error.py +0 -0
  141. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/exceptions/input_error.py +0 -0
  142. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/exceptions/not_found.py +0 -0
  143. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/get.py +0 -0
  144. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/health_check.py +0 -0
  145. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/list.py +0 -0
  146. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/mygrations.py +0 -0
  147. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/request_method_routing.py +0 -0
  148. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/restful_api.py +0 -0
  149. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/routing.py +0 -0
  150. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/schema_helper.py +0 -0
  151. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/simple_routing.py +0 -0
  152. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/simple_routing_route.py +0 -0
  153. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/simple_search.py +0 -0
  154. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/handlers/write.py +0 -0
  155. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/input_outputs/__init__.py +0 -0
  156. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/input_outputs/cli.py +0 -0
  157. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/input_outputs/exceptions/__init__.py +0 -0
  158. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/input_outputs/exceptions/cli_input_error.py +0 -0
  159. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/input_outputs/exceptions/cli_not_found.py +0 -0
  160. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/input_outputs/input_output.py +0 -0
  161. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/input_outputs/wsgi.py +0 -0
  162. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/input_requirements/__init__.py +0 -0
  163. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/input_requirements/maximum_length.py +0 -0
  164. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/input_requirements/minimum_length.py +0 -0
  165. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/input_requirements/required.py +0 -0
  166. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/input_requirements/requirement.py +0 -0
  167. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/input_requirements/unique.py +0 -0
  168. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/mocks/__init__.py +0 -0
  169. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/mocks/input_output.py +0 -0
  170. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/mocks/models.py +0 -0
  171. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/models.py +0 -0
  172. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/secrets/__init__.py +0 -0
  173. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/secrets/additional_configs/__init__.py +0 -0
  174. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/secrets/additional_configs/mysql_connection_dynamic_producer.py +0 -0
  175. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/secrets/additional_configs/mysql_connection_dynamic_producer_via_ssh_cert_bastion.py +0 -0
  176. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/secrets/akeyless.py +0 -0
  177. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/secrets/exceptions/__init__.py +0 -0
  178. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/secrets/exceptions/not_found.py +0 -0
  179. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/secrets/secrets.py +0 -0
  180. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/security_headers/__init__.py +0 -0
  181. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/security_headers/base.py +0 -0
  182. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/security_headers/cache_control.py +0 -0
  183. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/security_headers/cors.py +0 -0
  184. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/security_headers/csp.py +0 -0
  185. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/security_headers/hsts.py +0 -0
  186. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/security_headers/x_content_type_options.py +0 -0
  187. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/security_headers/x_frame_options.py +0 -0
  188. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/tests/__init__.py +0 -0
  189. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/tests/simple_api/__init__.py +0 -0
  190. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/tests/simple_api/models/__init__.py +0 -0
  191. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/tests/simple_api/models/status.py +0 -0
  192. {clear_skies-1.18.3 → clear_skies-1.18.5}/src/clearskies/tests/simple_api/models/user.py +0 -0
  193. {clear_skies-1.18.3 → clear_skies-1.18.5}/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.18.3
3
+ Version: 1.18.5
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.18.3"
5
+ version = "1.18.5"
6
6
  description = "A framework for building backends in the cloud"
7
7
  authors = [
8
8
  "Conor Mancone <cmancone@gmail.com>",
@@ -26,8 +26,12 @@ __all__ = [
26
26
  "Authorization",
27
27
  "BindingConfig",
28
28
  "public",
29
+ "Public",
29
30
  "secret_bearer",
31
+ "SecretBearer",
30
32
  "auth0_jwks",
33
+ "Auth0JWKS",
31
34
  "authorization",
32
35
  "jwks",
36
+ "JWKS",
33
37
  ]
@@ -15,7 +15,6 @@ class Auth0JWKS:
15
15
  _jwks_fetched = None
16
16
  _algorithms = None
17
17
  _audience = None
18
- _jwt_claims = None
19
18
  _documentation_security_name = None
20
19
 
21
20
  def __init__(self, environment, requests, jose_jwt):
@@ -214,6 +214,12 @@ class Column(ABC):
214
214
  if on_change_actions and model.was_changed(self.name):
215
215
  self.execute_actions(on_change_actions, model)
216
216
 
217
+ def values_match(self, value_1, value_2):
218
+ """
219
+ Compares two values to see if they are the same
220
+ """
221
+ return value_1 == value_2
222
+
217
223
  def pre_delete(self, model):
218
224
  """
219
225
  Make any changes needed to the data before starting the delete process
@@ -0,0 +1,92 @@
1
+ from .column import Column
2
+ from datetime import datetime, timezone
3
+ import dateparser
4
+ from ..autodoc.schema import DateTime as AutoDocDateTime
5
+
6
+
7
+ class DateTime(Column):
8
+ _auto_doc_class = AutoDocDateTime
9
+
10
+ def __init__(self, di):
11
+ super().__init__(di)
12
+
13
+ def from_backend(self, value):
14
+ if not value or value == "0000-00-00 00:00:00":
15
+ date = None
16
+ elif type(value) == str:
17
+ date = dateparser.parse(value)
18
+ else:
19
+ date = value
20
+ return date.replace(tzinfo=timezone.utc) if date else None
21
+
22
+ def to_backend(self, data):
23
+ if not self.name in data or type(data[self.name]) == str or data[self.name] == None:
24
+ return data
25
+
26
+ # hopefully this is a Python datetime object in UTC timezone...
27
+ return {**data, **{self.name: data[self.name].strftime("%Y-%m-%d %H:%M:%S")}}
28
+
29
+ def to_json(self, model):
30
+ datetime = model.get(self.name, silent=True)
31
+ return {self.name: datetime.isoformat() if datetime else None}
32
+
33
+ def build_condition(self, value, operator=None, column_prefix=""):
34
+ date = dateparser.parse(value).astimezone(timezone.utc).strftime("%Y-%m-%d %H:%M:%S")
35
+ if not operator:
36
+ operator = "="
37
+ return f"{column_prefix}{self.name}{operator}{date}"
38
+
39
+ def is_allowed_operator(self, operator, relationship_reference=None):
40
+ """
41
+ This is called when processing user data to decide if the end-user is specifying an allowed operator
42
+ """
43
+ return operator in ["=", "<", ">", "<=", ">="]
44
+
45
+ def input_error_for_value(self, value, operator=None):
46
+ value = dateparser.parse(value)
47
+ if not value:
48
+ return "given value did not appear to be a valid date"
49
+ if not value.tzinfo:
50
+ return "date is missing timezone information"
51
+ return ""
52
+
53
+ def values_match(self, value_1, value_2):
54
+ """
55
+ Compares two values to see if they are the same
56
+ """
57
+ # in this function we deal with data directly out of the backend, so our date is likely
58
+ # to be string-ified and we want to look for default (e.g. null) values in string form.
59
+ if type(value_1) == str and "0000-00-00" in value_1:
60
+ value_1 = None
61
+ if type(value_2) == str and "0000-00-00" in value_2:
62
+ value_2 = None
63
+ number_values = 0
64
+ if value_1:
65
+ number_values += 1
66
+ if value_2:
67
+ number_values += 1
68
+ if number_values == 0:
69
+ return True
70
+ if number_values == 1:
71
+ return False
72
+
73
+ if type(value_1) == str:
74
+ value_1 = dateparser.parse(value_1)
75
+ if type(value_2) == str:
76
+ value_2 = dateparser.parse(value_2)
77
+
78
+ # we need to make sure we're comparing in the same timezones. For our purposes, a difference in timezone
79
+ # is fine as long as they represent the same time (e.g. 16:00EST == 20:00UTC). For python, same time in different
80
+ # timezones is treated as different datetime objects.
81
+ if value_1.tzinfo is not None and value_2.tzinfo is not None:
82
+ value_1 = value_1.astimezone(value_2.tzinfo)
83
+
84
+ # two times can be the same but if one is datetime-aware and one is not, python will treat them as not equal.
85
+ # we want to treat such times as being the same. Therefore, check for equality but ignore the timezone.
86
+ for to_check in ["year", "month", "day", "hour", "minute", "second", "microsecond"]:
87
+ if getattr(value_1, to_check) != getattr(value_2, to_check):
88
+ return False
89
+
90
+ # and since we already converted the timezones to match (or one has a timezone and one doesn't), we're good to go.
91
+ # if we passed the above loop then the times are the same.
92
+ return True
@@ -17,18 +17,23 @@ class Columns:
17
17
  if name in columns:
18
18
  raise ValueError(f"Duplicate column '{name}' found for model '{model_class.__name__}'")
19
19
  column_overrides = overrides[name] if (overrides is not None and name in overrides) else {}
20
- configuration = {
21
- **configuration,
22
- **column_overrides,
23
- "input_requirements": self._resolve_input_requirements(
24
- self._merge_input_requirements(
25
- configuration.get("input_requirements"),
26
- column_overrides.get("input_requirements"),
20
+ # if the overrides changes the class then we need to completely replace the column definition
21
+ # with what is in the overrides.
22
+ if "class" in column_overrides and id(column_overrides["class"]) != id(configuration["class"]):
23
+ configuration = column_overrides
24
+ else:
25
+ configuration = {
26
+ **configuration,
27
+ **column_overrides,
28
+ "input_requirements": self._resolve_input_requirements(
29
+ self._merge_input_requirements(
30
+ configuration.get("input_requirements"),
31
+ column_overrides.get("input_requirements"),
32
+ ),
33
+ name,
34
+ model_class.__name__,
27
35
  ),
28
- name,
29
- model_class.__name__,
30
- ),
31
- }
36
+ }
32
37
  columns[name] = self.build_column(name, configuration, model_class)
33
38
 
34
39
  # overrides can add columns too - need to handle those separately
@@ -23,7 +23,7 @@ class Create(Write):
23
23
  if input_errors:
24
24
  self._logging.debug("Request rejected due to input errors: " + json.dumps(input_errors))
25
25
  raise InputError(input_errors)
26
- model.save(input_data)
26
+ model.save(input_data, columns=self._columns)
27
27
 
28
28
  return self.success(input_output, self._model_as_json(model, input_output))
29
29
 
@@ -9,11 +9,13 @@ class InputProcessing:
9
9
  def _get_writeable_columns(self):
10
10
  if self._writeable_columns is None:
11
11
  self._writeable_columns = self._get_rw_columns("writeable")
12
+ additional_columns = OrderedDict()
12
13
  for column in self._writeable_columns.values():
13
14
  more_columns = column.additional_write_columns(is_create=self._is_create)
14
- # do it one-at-a-time so we don't lose our OrderedDict
15
15
  for additional_column_name, additional_column in more_columns.items():
16
- self._writeable_columns[additional_column_name] = additional_column
16
+ additional_columns[additional_column_name] = additional_column
17
+ for additional_column_name, additional_column in additional_columns.items():
18
+ self._writeable_columns[additional_column_name] = additional_column
17
19
  return self._writeable_columns
18
20
 
19
21
  def _extra_column_errors(self, input_data):
@@ -58,7 +58,7 @@ class Update(Write):
58
58
  }
59
59
  if input_errors:
60
60
  raise InputError(input_errors)
61
- model.save(input_data)
61
+ model.save(input_data, columns=self._columns)
62
62
 
63
63
  return self.success(input_output, self._model_as_json(model, input_output))
64
64
 
@@ -10,6 +10,7 @@ class Model(Models):
10
10
  _configured_columns = None
11
11
  _data = None
12
12
  _previous_data = None
13
+ _touched_columns = None
13
14
  _transformed = None
14
15
  id_column_name = "id"
15
16
 
@@ -18,6 +19,7 @@ class Model(Models):
18
19
  self._transformed = {}
19
20
  self._data = {}
20
21
  self._previous_data = None
22
+ self._touched_columns = None
21
23
 
22
24
  def model_class(self):
23
25
  """
@@ -120,7 +122,7 @@ class Model(Models):
120
122
  def data(self, data):
121
123
  self._data = {} if data is None else data
122
124
 
123
- def save(self, data):
125
+ def save(self, data, columns=None):
124
126
  """
125
127
  Save data to the database and update the model!
126
128
 
@@ -128,7 +130,8 @@ class Model(Models):
128
130
  """
129
131
  if not len(data):
130
132
  raise ValueError("You have to pass in something to save!")
131
- columns = self.columns()
133
+ if columns is None:
134
+ columns = self.columns()
132
135
 
133
136
  old_data = self.data
134
137
  data = self.columns_pre_save(data, columns)
@@ -150,6 +153,7 @@ class Model(Models):
150
153
  self.data = new_data
151
154
  self._transformed = {}
152
155
  self._previous_data = old_data
156
+ self._touched_columns = list(data.keys())
153
157
 
154
158
  self.columns_save_finished(columns)
155
159
  self.save_finished()
@@ -190,9 +194,11 @@ class Model(Models):
190
194
  """Returns True/False to denote if a column was changed in the last save"""
191
195
  if self._previous_data is None:
192
196
  raise ValueError("was_changed was called before a save was finished - you must save something first")
197
+ if key not in self._touched_columns:
198
+ return False
193
199
 
194
- has_old_value = key in self._previous_data
195
- has_new_value = key in self._data
200
+ has_old_value = bool(self._previous_data.get(key))
201
+ has_new_value = bool(self._data.get(key))
196
202
 
197
203
  if has_new_value != has_old_value:
198
204
  return True
@@ -200,7 +206,12 @@ class Model(Models):
200
206
  if not has_old_value:
201
207
  return False
202
208
 
203
- return self.__getattr__(key) != self._previous_data[key]
209
+ columns = self.columns()
210
+ new_value = self.__getattr__(key)
211
+ old_value = self._previous_data[key]
212
+ if key not in columns:
213
+ return old_value != new_value
214
+ return not columns[key].values_match(old_value, new_value)
204
215
 
205
216
  def previous_value(self, key):
206
217
  return self.get_transformed_from_data(key, self._previous_data, cache=False, check_providers=False, silent=True)
@@ -1,51 +0,0 @@
1
- from .column import Column
2
- from datetime import datetime, timezone
3
- import dateparser
4
- from ..autodoc.schema import DateTime as AutoDocDateTime
5
-
6
-
7
- class DateTime(Column):
8
- _auto_doc_class = AutoDocDateTime
9
-
10
- def __init__(self, di):
11
- super().__init__(di)
12
-
13
- def from_backend(self, value):
14
- if not value or value == "0000-00-00 00:00:00":
15
- date = None
16
- elif type(value) == str:
17
- date = dateparser.parse(value)
18
- else:
19
- date = value
20
- return date.replace(tzinfo=timezone.utc) if date else None
21
-
22
- def to_backend(self, data):
23
- if not self.name in data or type(data[self.name]) == str or data[self.name] == None:
24
- return data
25
-
26
- # hopefully this is a Python datetime object in UTC timezone...
27
- return {**data, **{self.name: data[self.name].strftime("%Y-%m-%d %H:%M:%S")}}
28
-
29
- def to_json(self, model):
30
- datetime = model.get(self.name, silent=True)
31
- return {self.name: datetime.isoformat() if datetime else None}
32
-
33
- def build_condition(self, value, operator=None, column_prefix=""):
34
- date = dateparser.parse(value).astimezone(timezone.utc).strftime("%Y-%m-%d %H:%M:%S")
35
- if not operator:
36
- operator = "="
37
- return f"{column_prefix}{self.name}{operator}{date}"
38
-
39
- def is_allowed_operator(self, operator, relationship_reference=None):
40
- """
41
- This is called when processing user data to decide if the end-user is specifying an allowed operator
42
- """
43
- return operator in ["=", "<", ">", "<=", ">="]
44
-
45
- def input_error_for_value(self, value, operator=None):
46
- value = dateparser.parse(value)
47
- if not value:
48
- return "given value did not appear to be a valid date"
49
- if not value.tzinfo:
50
- return "date is missing timezone information"
51
- return ""
File without changes
File without changes