fastapi-rtk 2.3.3__tar.gz → 2.3.4__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.
Files changed (304) hide show
  1. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/PKG-INFO +1 -1
  2. fastapi_rtk-2.3.4/fastapi_rtk/_version.py +1 -0
  3. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/api/base_api.py +4 -3
  4. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/api/model_rest_api/__init__.py +71 -47
  5. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/api/model_rest_api/_bulk_mixin.py +2 -2
  6. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/api/model_rest_api/_columns_mixin.py +20 -15
  7. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/api/model_rest_api/_info_mixin.py +6 -6
  8. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/api/model_rest_api/_list_mixin.py +1 -1
  9. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/api/model_rest_api/_params.py +4 -4
  10. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/api/model_rest_api/_typed_base.py +36 -39
  11. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/auth/auth.py +19 -13
  12. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/auth/hashers/pbkdf2.py +6 -7
  13. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/auth/hashers/scrypt.py +6 -7
  14. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/auth/password_helpers/fab.py +1 -4
  15. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/auth/strategies/config.py +6 -6
  16. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/auth/strategies/db.py +5 -5
  17. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/generic/column.py +15 -14
  18. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/generic/db.py +1 -1
  19. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/generic/interface.py +3 -4
  20. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/generic/session.py +6 -5
  21. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/db.py +0 -8
  22. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/extensions/audit/_decorators_mixin.py +25 -23
  23. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/extensions/audit/_lifecycle_mixin.py +15 -13
  24. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/extensions/audit/_processing_mixin.py +7 -7
  25. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/extensions/audit/audit.py +15 -16
  26. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/interface.py +4 -3
  27. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/model.py +8 -5
  28. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/bases/file_manager.py +5 -4
  29. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/bases/interface.py +10 -9
  30. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/cli.py +2 -2
  31. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/commands/_security_crypto.py +3 -2
  32. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/commands/db/__init__.py +28 -28
  33. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/commands/export.py +1 -1
  34. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/commands/security.py +1 -1
  35. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/commands/translate.py +1 -1
  36. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/utils.py +6 -4
  37. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/db.py +12 -17
  38. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/decorators.py +28 -25
  39. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/exceptions.py +4 -4
  40. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/fastapi_react_toolkit.py +15 -11
  41. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/file_managers/s3_file_manager.py +3 -2
  42. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/manager.py +15 -18
  43. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/middlewares.py +4 -4
  44. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/registry.py +21 -11
  45. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/routers.py +7 -6
  46. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/schemas.py +4 -4
  47. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/security/sqla/apis.py +1 -3
  48. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/security/sqla/security_manager/__init__.py +2 -2
  49. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/security/sqla/security_manager/_import.py +3 -2
  50. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/security/sqla/security_manager/_role_mixin.py +7 -5
  51. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/setting.py +2 -2
  52. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/async_task_runner.py +14 -12
  53. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/deep_merge.py +6 -5
  54. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/formatter.py +2 -2
  55. fastapi_rtk-2.3.4/fastapi_rtk/utils/hooks.py +42 -0
  56. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/lazy.py +10 -7
  57. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/merge_schema.py +5 -6
  58. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/pydantic.py +4 -4
  59. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/run_utils.py +19 -16
  60. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/smartdefaultdict.py +3 -2
  61. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/sqla.py +1 -3
  62. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/update_signature.py +6 -3
  63. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/conftest.py +8 -7
  64. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/integration/api/test_model_rest_api.py +3 -2
  65. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/integration/auth/test_oauth.py +77 -61
  66. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/integration/conftest.py +3 -6
  67. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/integration/file_managers/test_file_routes.py +2 -2
  68. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/integration/security/sqla/test_security_manager.py +6 -10
  69. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/api/model_rest_api/test_columns.py +66 -7
  70. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/api/model_rest_api/test_file_mixin.py +5 -5
  71. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/api/model_rest_api/test_init.py +5 -3
  72. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/api/test_base_api.py +12 -13
  73. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/apis/test_info.py +10 -10
  74. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/auth/password_helpers/test_fab.py +3 -2
  75. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/auth/strategies/test_config.py +5 -4
  76. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/auth/strategies/test_db.py +10 -4
  77. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/auth/strategies/test_jwt.py +3 -2
  78. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/auth/test_auth.py +28 -28
  79. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/generic/test_filters.py +8 -8
  80. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/generic/test_interface.py +0 -2
  81. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/generic/test_session.py +9 -6
  82. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/sqla/conftest.py +7 -6
  83. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/sqla/test_audit.py +21 -33
  84. fastapi_rtk-2.3.4/tests/unit/backends/sqla/test_column.py +27 -0
  85. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/sqla/test_db.py +18 -22
  86. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/sqla/test_filters.py +28 -23
  87. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/sqla/test_geoalchemy2.py +41 -52
  88. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/sqla/test_interface.py +6 -8
  89. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/sqla/test_model.py +8 -11
  90. fastapi_rtk-2.3.4/tests/unit/backends/sqla/test_session.py +43 -0
  91. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/bases/test_db.py +0 -2
  92. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/bases/test_file_manager.py +5 -7
  93. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/cli/commands/conftest.py +6 -6
  94. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/cli/commands/test_db.py +6 -5
  95. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/cli/commands/test_export.py +34 -53
  96. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/cli/commands/test_security.py +136 -111
  97. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/cli/commands/test_translate.py +15 -25
  98. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/cli/test_cli.py +7 -6
  99. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/cli/test_decorators.py +31 -25
  100. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/file_managers/test_file_manager.py +3 -2
  101. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/file_managers/test_s3_file_manager.py +59 -37
  102. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/file_managers/test_s3_image_manager.py +3 -3
  103. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/lang/test_babel_cli.py +8 -7
  104. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/lang/test_lazy_text.py +15 -8
  105. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/security/sqla/conftest.py +5 -4
  106. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/security/sqla/test_apis.py +5 -6
  107. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/security/sqla/test_models.py +3 -2
  108. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/security/sqla/test_security_manager.py +24 -26
  109. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_db.py +31 -30
  110. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_decorators.py +12 -10
  111. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_dependencies.py +51 -51
  112. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_fastapi_react_toolkit.py +49 -54
  113. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_globals.py +3 -2
  114. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_manager.py +131 -80
  115. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_middlewares.py +17 -13
  116. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_routers.py +265 -278
  117. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_types.py +11 -8
  118. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_async_task_runner.py +5 -4
  119. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_csv_json_converter.py +11 -10
  120. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_flask_appbuilder_utils.py +3 -2
  121. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_lazy.py +3 -2
  122. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_pydantic.py +8 -8
  123. fastapi_rtk-2.3.4/tests/unit/utils/test_sqla.py +82 -0
  124. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_timezone.py +21 -18
  125. fastapi_rtk-2.3.3/fastapi_rtk/_version.py +0 -1
  126. fastapi_rtk-2.3.3/fastapi_rtk/utils/hooks.py +0 -37
  127. fastapi_rtk-2.3.3/tests/unit/backends/sqla/test_column.py +0 -29
  128. fastapi_rtk-2.3.3/tests/unit/backends/sqla/test_session.py +0 -37
  129. fastapi_rtk-2.3.3/tests/unit/utils/test_sqla.py +0 -81
  130. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/.gitignore +0 -0
  131. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/LICENSE +0 -0
  132. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/README.md +0 -0
  133. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/__init__.py +0 -0
  134. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/api/__init__.py +0 -0
  135. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/api/model_rest_api/_add_mixin.py +0 -0
  136. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/api/model_rest_api/_delete_mixin.py +0 -0
  137. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/api/model_rest_api/_download_mixin.py +0 -0
  138. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/api/model_rest_api/_edit_mixin.py +0 -0
  139. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/api/model_rest_api/_file_mixin.py +0 -0
  140. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/api/model_rest_api/_show_mixin.py +0 -0
  141. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/api/model_rest_api/_upload_mixin.py +0 -0
  142. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/apis/__init__.py +0 -0
  143. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/apis/info.py +0 -0
  144. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/apis/license.py +0 -0
  145. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/auth/__init__.py +0 -0
  146. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/auth/hashers/__init__.py +0 -0
  147. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/auth/ldap.py +0 -0
  148. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/auth/password_helpers/__init__.py +0 -0
  149. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/auth/strategies/__init__.py +0 -0
  150. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/auth/strategies/jwt.py +0 -0
  151. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/__init__.py +0 -0
  152. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/generic/__init__.py +0 -0
  153. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/generic/exceptions.py +0 -0
  154. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/generic/filters.py +0 -0
  155. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/generic/model.py +0 -0
  156. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/__init__.py +0 -0
  157. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/column.py +0 -0
  158. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/exceptions.py +0 -0
  159. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/extensions/__init__.py +0 -0
  160. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/extensions/audit/__init__.py +0 -0
  161. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/extensions/audit/_logger.py +0 -0
  162. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/extensions/audit/types.py +0 -0
  163. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/extensions/geoalchemy2/__init__.py +0 -0
  164. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/extensions/geoalchemy2/filters.py +0 -0
  165. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/extensions/geoalchemy2/geometry_converter.py +0 -0
  166. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/filters.py +0 -0
  167. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/session.py +0 -0
  168. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/bases/__init__.py +0 -0
  169. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/bases/db.py +0 -0
  170. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/bases/filter.py +0 -0
  171. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/bases/model.py +0 -0
  172. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/bases/session.py +0 -0
  173. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/__init__.py +0 -0
  174. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/commands/__init__.py +0 -0
  175. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/commands/db/templates/fastapi/README +0 -0
  176. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/commands/db/templates/fastapi/alembic.ini.mako +0 -0
  177. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/commands/db/templates/fastapi/env.py +0 -0
  178. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/commands/db/templates/fastapi/script.py.mako +0 -0
  179. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/commands/db/templates/fastapi-multidb/README +0 -0
  180. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/commands/db/templates/fastapi-multidb/alembic.ini.mako +0 -0
  181. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/commands/db/templates/fastapi-multidb/env.py +0 -0
  182. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/commands/db/templates/fastapi-multidb/script.py.mako +0 -0
  183. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/const.py +0 -0
  184. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/decorators.py +0 -0
  185. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/types.py +0 -0
  186. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/config.py +0 -0
  187. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/const.py +0 -0
  188. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/dependencies.py +0 -0
  189. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/file_managers/__init__.py +0 -0
  190. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/file_managers/file_manager.py +0 -0
  191. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/file_managers/image_manager.py +0 -0
  192. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/file_managers/s3_image_manager.py +0 -0
  193. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/filters.py +0 -0
  194. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/globals.py +0 -0
  195. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/lang/__init__.py +0 -0
  196. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/lang/babel/__init__.py +0 -0
  197. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/lang/babel/cli.py +0 -0
  198. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/lang/babel/config.py +0 -0
  199. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/lang/babel.cfg +0 -0
  200. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/lang/lazy_text.py +0 -0
  201. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/lang/messages.pot +0 -0
  202. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/lang/translations/de/LC_MESSAGES/messages.mo +0 -0
  203. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/lang/translations/de/LC_MESSAGES/messages.po +0 -0
  204. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/lang/translations/en/LC_MESSAGES/messages.mo +0 -0
  205. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/lang/translations/en/LC_MESSAGES/messages.po +0 -0
  206. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/mixins.py +0 -0
  207. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/models.py +0 -0
  208. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/py.typed +0 -0
  209. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/security/__init__.py +0 -0
  210. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/security/sqla/__init__.py +0 -0
  211. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/security/sqla/models.py +0 -0
  212. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/security/sqla/security_manager/_association_mixin.py +0 -0
  213. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/security/sqla/security_manager/_builtin_role_mixin.py +0 -0
  214. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/security/sqla/security_manager/_cleanup_mixin.py +0 -0
  215. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/security/sqla/security_manager/_exception_filters.py +0 -0
  216. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/security/sqla/security_manager/_export.py +0 -0
  217. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/security/sqla/security_manager/_user_mixin.py +0 -0
  218. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/types.py +0 -0
  219. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/__init__.py +0 -0
  220. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/class_factory.py +0 -0
  221. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/csv_json_converter.py +0 -0
  222. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/extender_mixin.py +0 -0
  223. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/flask_appbuilder_utils.py +0 -0
  224. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/multiple_async_contexts.py +0 -0
  225. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/self_dependencies.py +0 -0
  226. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/timezone.py +0 -0
  227. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/use_default_when_none.py +0 -0
  228. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/version.py +0 -0
  229. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/pyproject.toml +0 -0
  230. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/docker-compose.gis.yml +0 -0
  231. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/integration/__init__.py +0 -0
  232. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/integration/api/__init__.py +0 -0
  233. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/integration/apis/__init__.py +0 -0
  234. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/integration/apis/test_info_callable_schema.py +0 -0
  235. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/integration/apis/test_info_contract.py +0 -0
  236. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/integration/auth/__init__.py +0 -0
  237. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/integration/auth/test_auth_flow.py +0 -0
  238. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/integration/file_managers/__init__.py +0 -0
  239. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/integration/security/__init__.py +0 -0
  240. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/integration/security/sqla/__init__.py +0 -0
  241. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/integration/test_app_smoke.py +0 -0
  242. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/__init__.py +0 -0
  243. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/api/__init__.py +0 -0
  244. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/api/conftest.py +0 -0
  245. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/api/model_rest_api/__init__.py +0 -0
  246. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/api/model_rest_api/test_typed_base_consistency.py +0 -0
  247. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/apis/__init__.py +0 -0
  248. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/apis/test_license.py +0 -0
  249. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/auth/__init__.py +0 -0
  250. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/auth/hashers/__init__.py +0 -0
  251. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/auth/hashers/test_pbkdf2.py +0 -0
  252. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/auth/hashers/test_scrypt.py +0 -0
  253. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/auth/password_helpers/__init__.py +0 -0
  254. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/auth/strategies/__init__.py +0 -0
  255. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/__init__.py +0 -0
  256. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/generic/__init__.py +0 -0
  257. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/generic/test_column.py +0 -0
  258. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/generic/test_db.py +0 -0
  259. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/generic/test_exceptions.py +0 -0
  260. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/generic/test_model.py +0 -0
  261. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/sqla/__init__.py +0 -0
  262. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/sqla/test_audit_types.py +0 -0
  263. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/bases/__init__.py +0 -0
  264. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/bases/test_filter.py +0 -0
  265. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/bases/test_interface.py +0 -0
  266. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/bases/test_model.py +0 -0
  267. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/bases/test_session.py +0 -0
  268. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/cli/__init__.py +0 -0
  269. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/cli/commands/__init__.py +0 -0
  270. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/cli/commands/test_security_crypto.py +0 -0
  271. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/cli/conftest.py +0 -0
  272. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/cli/test_types.py +0 -0
  273. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/cli/test_utils.py +0 -0
  274. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/file_managers/__init__.py +0 -0
  275. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/file_managers/conftest.py +0 -0
  276. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/file_managers/test_image_manager.py +0 -0
  277. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/lang/__init__.py +0 -0
  278. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/lang/test_babel_config.py +0 -0
  279. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/security/__init__.py +0 -0
  280. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/security/sqla/__init__.py +0 -0
  281. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_config.py +0 -0
  282. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_const.py +0 -0
  283. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_exceptions.py +0 -0
  284. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_filters.py +0 -0
  285. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_mixins.py +0 -0
  286. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_models.py +0 -0
  287. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_registry.py +0 -0
  288. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_schemas.py +0 -0
  289. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_setting.py +0 -0
  290. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_version.py +0 -0
  291. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/__init__.py +0 -0
  292. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_class_factory.py +0 -0
  293. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_deep_merge.py +0 -0
  294. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_extender_mixin.py +0 -0
  295. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_formatter.py +0 -0
  296. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_hooks.py +0 -0
  297. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_merge_schema.py +0 -0
  298. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_multiple_async_contexts.py +0 -0
  299. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_run_utils.py +0 -0
  300. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_self_dependencies.py +0 -0
  301. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_smartdefaultdict.py +0 -0
  302. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_update_signature.py +0 -0
  303. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_use_default_when_none.py +0 -0
  304. {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastapi-rtk
3
- Version: 2.3.3
3
+ Version: 2.3.4
4
4
  Summary: A package that provides a set of tools to build a FastAPI application with a Class-Based CRUD API.
5
5
  Project-URL: Homepage, https://codeberg.org/datatactics/fastapi-rtk
6
6
  Project-URL: Issues, https://codeberg.org/datatactics/fastapi-rtk/issues
@@ -0,0 +1 @@
1
+ __version__ = "2.3.4"
@@ -1,3 +1,4 @@
1
+ import collections.abc
1
2
  import typing
2
3
 
3
4
  import fastapi
@@ -87,9 +88,9 @@ class BaseApi:
87
88
  """
88
89
  routes_to_register: list[
89
90
  tuple[
90
- typing.Callable,
91
+ collections.abc.Callable,
91
92
  dict[str, typing.Any],
92
- typing.Callable,
93
+ collections.abc.Callable,
93
94
  dict[str, typing.Any],
94
95
  ]
95
96
  ] = lazy(lambda self: [])
@@ -102,7 +103,7 @@ class BaseApi:
102
103
  """
103
104
  The FastAPIReactToolkit object. Automatically set when the API is added to the toolkit.
104
105
  """
105
- cache: typing.Dict[str, typing.Any] = lazy(lambda self: dict())
106
+ cache: dict[str, typing.Any] = lazy(lambda self: dict())
106
107
  """
107
108
  The cache for the API.
108
109
 
@@ -22,6 +22,7 @@ remain on the composed class so they can be overridden in subclasses with
22
22
  the usual ``class MyApi(ModelRestApi): list_columns = [...]`` idiom.
23
23
  """
24
24
 
25
+ import collections.abc
25
26
  import enum
26
27
  import typing
27
28
 
@@ -170,17 +171,17 @@ class ModelRestApi(
170
171
  """
171
172
  The list of routes to expose. Available routes: `info`, `download`, `bulk`, `get_list`, `get`, `post`, `put`, `delete`.
172
173
  """
173
- exclude_routes: typing.List[AVAILABLE_ROUTES] = lazy(lambda: [])
174
+ exclude_routes: list[AVAILABLE_ROUTES] = lazy(lambda: [])
174
175
  """
175
176
  The list of routes to exclude. Available routes: `info`, `download`, `bulk`, `get_list`, `get`, `post`, `put`, `delete`.
176
177
  """
177
- protected_routes: typing.List[AVAILABLE_ROUTES] = lazy(
178
+ protected_routes: list[AVAILABLE_ROUTES] = lazy(
178
179
  lambda self: [x for x in self.routes if x not in self.exclude_protected_routes]
179
180
  )
180
181
  """
181
182
  The list of routes to protect. Defaults to all routes within `routes` property except those in `exclude_protected_routes`.
182
183
  """
183
- exclude_protected_routes: typing.List[AVAILABLE_ROUTES] = lazy(lambda: [])
184
+ exclude_protected_routes: list[AVAILABLE_ROUTES] = lazy(lambda: [])
184
185
  """
185
186
  The list of routes to exclude from protection. Defaults to `[]`.
186
187
  """
@@ -197,7 +198,7 @@ class ModelRestApi(
197
198
  }
198
199
  ```
199
200
  """
200
- base_order: typing.Tuple[str, typing.Literal["asc", "desc"]] | None = None
201
+ base_order: tuple[str, typing.Literal["asc", "desc"]] | None = None
201
202
  """
202
203
  The default order for the list endpoint. Set this to set the default order for the list endpoint.
203
204
 
@@ -206,9 +207,7 @@ class ModelRestApi(
206
207
  base_order = ("name", "asc")
207
208
  ```
208
209
  """
209
- base_filters: (
210
- typing.List[typing.Tuple[str, typing.Type[BaseFilter], typing.Any]] | None
211
- ) = None
210
+ base_filters: list[tuple[str, type[BaseFilter], typing.Any]] | None = None
212
211
  """
213
212
  The default filters to apply for the following endpoints: `download`, `list`, `show`, `add`, and `edit`. Defaults to None.
214
213
 
@@ -219,9 +218,7 @@ class ModelRestApi(
219
218
  ]
220
219
  ```
221
220
  """
222
- base_opr_filters: (
223
- typing.List[typing.Tuple[typing.Type[BaseOprFilter], typing.Any]] | None
224
- ) = None
221
+ base_opr_filters: list[tuple[type[BaseOprFilter], typing.Any]] | None = None
225
222
  """
226
223
  The default opr filters to apply for the following endpoints: `download`, `list`, `show`, `add`, and `edit`. Defaults to None.
227
224
 
@@ -232,7 +229,7 @@ class ModelRestApi(
232
229
  ]
233
230
  ```
234
231
  """
235
- opr_filters: typing.List[typing.Type[BaseOprFilter]] | None = None
232
+ opr_filters: list[type[BaseOprFilter]] | None = None
236
233
  """
237
234
  The list of opr filters to be exposed to the user. Defaults to None, which means no opr filters will be exposed.
238
235
 
@@ -267,7 +264,7 @@ class ModelRestApi(
267
264
  """
268
265
  The enum for the order columns in the list endpoint.
269
266
  """
270
- query_schema: typing.Type[QuerySchema] = lazy(
267
+ query_schema: type[QuerySchema] = lazy(
271
268
  lambda self: merge_schema(
272
269
  QuerySchema,
273
270
  {
@@ -286,7 +283,7 @@ class ModelRestApi(
286
283
 
287
284
  DO NOT MODIFY UNLESS YOU KNOW WHAT YOU ARE DOING.
288
285
  """
289
- download_body_schema: typing.Type[QueryBody] = lazy(
286
+ download_body_schema: type[QueryBody] = lazy(
290
287
  lambda self: merge_schema(
291
288
  QueryBody,
292
289
  {
@@ -336,7 +333,7 @@ class ModelRestApi(
336
333
  ```
337
334
  """
338
335
  add_query_rel_fields = lazy(
339
- lambda: dict[str, list[tuple[str, typing.Type[BaseFilter], typing.Any]]]()
336
+ lambda: dict[str, list[tuple[str, type[BaseFilter], typing.Any]]]()
340
337
  )
341
338
  """
342
339
  The query fields for the related fields in the add_columns property.
@@ -351,7 +348,7 @@ class ModelRestApi(
351
348
  ```
352
349
  """
353
350
  edit_query_rel_fields = lazy(
354
- lambda: dict[str, list[tuple[str, typing.Type[BaseFilter], typing.Any]]]()
351
+ lambda: dict[str, list[tuple[str, type[BaseFilter], typing.Any]]]()
355
352
  )
356
353
  """
357
354
  The query fields for the related fields in the edit_columns property.
@@ -366,7 +363,7 @@ class ModelRestApi(
366
363
  ```
367
364
  """
368
365
  search_query_rel_fields = lazy(
369
- lambda: dict[str, list[tuple[str, typing.Type[BaseFilter], typing.Any]]]()
366
+ lambda: dict[str, list[tuple[str, type[BaseFilter], typing.Any]]]()
370
367
  )
371
368
  """
372
369
  The query fields for the related fields in the filters.
@@ -393,7 +390,7 @@ class ModelRestApi(
393
390
  }
394
391
  ```
395
392
  """
396
- search_filters = lazy(lambda: dict[str, list[typing.Type[BaseFilter]]]())
393
+ search_filters = lazy(lambda: dict[str, list[type[BaseFilter]]]())
397
394
  """
398
395
  Add additional filters to the search columns.
399
396
 
@@ -404,9 +401,7 @@ class ModelRestApi(
404
401
  }
405
402
  ```
406
403
  """
407
- search_exclude_filters = lazy(
408
- lambda: dict[str, list[typing.Type[BaseFilter] | str]]()
409
- )
404
+ search_exclude_filters = lazy(lambda: dict[str, list[type[BaseFilter] | str]]())
410
405
  """
411
406
  Exclude filters from the search columns.
412
407
 
@@ -419,7 +414,7 @@ class ModelRestApi(
419
414
  }
420
415
  ```
421
416
  """
422
- info_return_schema: typing.Type[InfoResponse] = lazy(
417
+ info_return_schema: type[InfoResponse] = lazy(
423
418
  lambda self: merge_schema(
424
419
  InfoResponse,
425
420
  {
@@ -663,13 +658,13 @@ class ModelRestApi(
663
658
 
664
659
  add_jsonforms_schema: (
665
660
  dict[str, typing.Any]
666
- | typing.Callable[[], dict | typing.Awaitable[dict]]
661
+ | collections.abc.Callable[[], dict | collections.abc.Awaitable[dict]]
667
662
  | None
668
663
  ) = None
669
664
  """
670
665
  The `JSONForms` schema for the add endpoint. If not provided, Defaults to the schema generated from the `add_columns` property. May also be a sync or async callable returning the schema, resolved via `smart_run`.
671
666
  """
672
- add_jsonforms_uischema: typing.Dict[str, typing.Any] | None = None
667
+ add_jsonforms_uischema: dict[str, typing.Any] | None = None
673
668
  """
674
669
  The `JSONForms` uischema for the add endpoint. If not provided, it will let `JSONForms` generate the uischema.
675
670
  """
@@ -679,11 +674,15 @@ class ModelRestApi(
679
674
  """
680
675
  add_jsonforms_use_enum: (
681
676
  bool
682
- | typing.Callable[[ColumnInfo | ColumnEnumInfo | ColumnRelationInfo], bool]
677
+ | collections.abc.Callable[
678
+ [ColumnInfo | ColumnEnumInfo | ColumnRelationInfo], bool
679
+ ]
683
680
  | dict[
684
681
  str,
685
682
  bool
686
- | typing.Callable[[ColumnInfo | ColumnEnumInfo | ColumnRelationInfo], bool],
683
+ | collections.abc.Callable[
684
+ [ColumnInfo | ColumnEnumInfo | ColumnRelationInfo], bool
685
+ ],
687
686
  ]
688
687
  ) = lazy(lambda: lambda info: len(info.values) > 100)
689
688
  """
@@ -709,13 +708,13 @@ class ModelRestApi(
709
708
 
710
709
  edit_jsonforms_schema: (
711
710
  dict[str, typing.Any]
712
- | typing.Callable[[], dict | typing.Awaitable[dict]]
711
+ | collections.abc.Callable[[], dict | collections.abc.Awaitable[dict]]
713
712
  | None
714
713
  ) = None
715
714
  """
716
715
  The `JSONForms` schema for the edit endpoint. If not provided, Defaults to the schema generated from the `edit_columns` property. May also be a sync or async callable returning the schema, resolved via `smart_run`.
717
716
  """
718
- edit_jsonforms_uischema: typing.Dict[str, typing.Any] | None = None
717
+ edit_jsonforms_uischema: dict[str, typing.Any] | None = None
719
718
  """
720
719
  The `JSONForms` uischema for the edit endpoint. If not provided, it will let `JSONForms` generate the uischema.
721
720
  """
@@ -725,11 +724,15 @@ class ModelRestApi(
725
724
  """
726
725
  edit_jsonforms_use_enum: (
727
726
  bool
728
- | typing.Callable[[ColumnInfo | ColumnEnumInfo | ColumnRelationInfo], bool]
727
+ | collections.abc.Callable[
728
+ [ColumnInfo | ColumnEnumInfo | ColumnRelationInfo], bool
729
+ ]
729
730
  | dict[
730
731
  str,
731
732
  bool
732
- | typing.Callable[[ColumnInfo | ColumnEnumInfo | ColumnRelationInfo], bool],
733
+ | collections.abc.Callable[
734
+ [ColumnInfo | ColumnEnumInfo | ColumnRelationInfo], bool
735
+ ],
733
736
  ]
734
737
  ) = lazy(lambda: lambda info: len(info.values) > 100)
735
738
  """
@@ -823,14 +826,14 @@ class ModelRestApi(
823
826
  -------------
824
827
  """
825
828
 
826
- add_schema: typing.Type[pydantic.BaseModel] = lazy(
829
+ add_schema: type[pydantic.BaseModel] = lazy(
827
830
  lambda self: typing.Annotated[
828
- self._create_request_schema(
829
- merge_schema(
831
+ merge_schema(
832
+ self._create_request_schema(
830
833
  self.add_obj_schema,
831
- self._handle_schema_extra_fields(self.add_schema_extra_fields),
832
- name=f"{self.__class__.__name__}-AddObjSchema-Merged",
834
+ name=f"{self.__class__.__name__}-AddObjSchema-Request",
833
835
  ),
836
+ self._handle_schema_extra_fields(self.add_schema_extra_fields),
834
837
  name=f"{self.__class__.__name__}-AddSchema",
835
838
  ),
836
839
  fastapi.Form(media_type="multipart/form-data")
@@ -843,15 +846,15 @@ class ModelRestApi(
843
846
 
844
847
  DO NOT MODIFY UNLESS YOU KNOW WHAT YOU ARE DOING.
845
848
  """
846
- edit_schema: typing.Type[pydantic.BaseModel] = lazy(
849
+ edit_schema: type[pydantic.BaseModel] = lazy(
847
850
  lambda self: typing.Annotated[
848
- self._create_request_schema(
849
- merge_schema(
851
+ merge_schema(
852
+ self._create_request_schema(
850
853
  self.edit_obj_schema,
851
- self._handle_schema_extra_fields(self.edit_schema_extra_fields),
852
- name=f"{self.__class__.__name__}-EditObjSchema-Merged",
854
+ optional=True,
855
+ name=f"{self.__class__.__name__}-EditObjSchema-Request",
853
856
  ),
854
- optional=True,
857
+ self._handle_schema_extra_fields(self.edit_schema_extra_fields),
855
858
  name=f"{self.__class__.__name__}-EditSchema",
856
859
  ),
857
860
  fastapi.Form(media_type="multipart/form-data")
@@ -870,6 +873,8 @@ class ModelRestApi(
870
873
  """
871
874
  Extra fields to add to the add schema. Useful when you want to add extra fields in the body of the add endpoint for your custom logic.
872
875
 
876
+ Keys must not collide with `add_columns`; a colliding name raises `ValueError` at API setup, since extra fields override the request body but not the JSONForms / object schema.
877
+
873
878
  Example:
874
879
  ```python
875
880
  add_schema_extra_fields = {
@@ -884,6 +889,8 @@ class ModelRestApi(
884
889
  """
885
890
  Extra fields to add to the edit schema. Useful when you want to add extra fields in the body of the edit endpoint for your custom logic.
886
891
 
892
+ Keys must not collide with `edit_columns`; a colliding name raises `ValueError` at API setup, since extra fields override the request body but not the JSONForms / object schema.
893
+
887
894
  Example:
888
895
  ```python
889
896
  edit_schema_extra_fields = {
@@ -899,12 +906,12 @@ class ModelRestApi(
899
906
  -------------
900
907
  """
901
908
 
902
- list_return_schema: typing.Type[BaseResponseMany] = lazy(
909
+ list_return_schema: type[BaseResponseMany] = lazy(
903
910
  lambda self: merge_schema(
904
911
  BaseResponseMany,
905
912
  {
906
913
  **vars(self),
907
- "result": (typing.List[self.list_obj_schema], ...),
914
+ "result": (list[self.list_obj_schema], ...),
908
915
  },
909
916
  True,
910
917
  f"{self.__class__.__name__}-ListResponse",
@@ -915,7 +922,7 @@ class ModelRestApi(
915
922
 
916
923
  DO NOT MODIFY UNLESS YOU KNOW WHAT YOU ARE DOING.
917
924
  """
918
- show_return_schema: typing.Type[BaseResponseSingle] = lazy(
925
+ show_return_schema: type[BaseResponseSingle] = lazy(
919
926
  lambda self: merge_schema(
920
927
  BaseResponseSingle,
921
928
  {
@@ -931,7 +938,7 @@ class ModelRestApi(
931
938
 
932
939
  DO NOT MODIFY UNLESS YOU KNOW WHAT YOU ARE DOING.
933
940
  """
934
- add_return_schema: typing.Type[BaseResponseSingle] = lazy(
941
+ add_return_schema: type[BaseResponseSingle] = lazy(
935
942
  lambda self: merge_schema(
936
943
  self.show_return_schema,
937
944
  {},
@@ -943,7 +950,7 @@ class ModelRestApi(
943
950
 
944
951
  DO NOT MODIFY UNLESS YOU KNOW WHAT YOU ARE DOING.
945
952
  """
946
- edit_return_schema: typing.Type[BaseResponseSingle] = lazy(
953
+ edit_return_schema: type[BaseResponseSingle] = lazy(
947
954
  lambda self: merge_schema(
948
955
  self.show_return_schema,
949
956
  {},
@@ -1055,6 +1062,23 @@ class ModelRestApi(
1055
1062
  f"Search columns with 2nd level relations are not supported: {not_supported_search_columns}"
1056
1063
  )
1057
1064
 
1065
+ # Extra fields override the request schema but never the JSONForms /
1066
+ # object schema, so a name in both desyncs the form from the body.
1067
+ add_collisions = set(self.add_schema_extra_fields) & set(self.add_columns)
1068
+ if add_collisions:
1069
+ raise ValueError(
1070
+ f"add_schema_extra_fields keys collide with add_columns in "
1071
+ f"{self.__class__.__name__}: {sorted(add_collisions)}. Remove them "
1072
+ f"from add_columns or rename the extra fields."
1073
+ )
1074
+ edit_collisions = set(self.edit_schema_extra_fields) & set(self.edit_columns)
1075
+ if edit_collisions:
1076
+ raise ValueError(
1077
+ f"edit_schema_extra_fields keys collide with edit_columns in "
1078
+ f"{self.__class__.__name__}: {sorted(edit_collisions)}. Remove them "
1079
+ f"from edit_columns or rename the extra fields."
1080
+ )
1081
+
1058
1082
  self._gen_labels_columns(self.list_columns)
1059
1083
  self._gen_labels_columns(self.show_columns)
1060
1084
  self._gen_labels_columns(self.search_columns)
@@ -1111,7 +1135,7 @@ class ModelRestApi(
1111
1135
  Returns the current permissions dependency.
1112
1136
 
1113
1137
  Returns:
1114
- typing.Callable[..., Coroutine[typing.Any, typing.Any, typing.Any | list]]: The current permissions that the user has for the API dependency.
1138
+ collections.abc.Callable[..., Coroutine[typing.Any, typing.Any, typing.Any | list]]: The current permissions that the user has for the API dependency.
1115
1139
  """
1116
1140
  return current_permissions(self)
1117
1141
 
@@ -1122,7 +1146,7 @@ class ModelRestApi(
1122
1146
  If `list_query_count_enabled` is False or `q.with_count` is False, the session will be None.
1123
1147
 
1124
1148
  Returns:
1125
- typing.Callable[..., Coroutine[typing.Any, typing.Any, typing.Tuple[QuerySchema, SQLASession | None]]]: The dependency that yields the tuple.
1149
+ collections.abc.Callable[..., Coroutine[typing.Any, typing.Any, tuple[QuerySchema, SQLASession | None]]]: The dependency that yields the tuple.
1126
1150
  """
1127
1151
 
1128
1152
  async def dependency(
@@ -3,7 +3,7 @@ Bulk route mixin for ``ModelRestApi``: ``bulk`` registration, ``bulk_headless``
3
3
  dispatcher, and the subclass-overridable ``bulk_handler``.
4
4
  """
5
5
 
6
- import typing
6
+ import collections.abc
7
7
 
8
8
  import fastapi
9
9
 
@@ -54,7 +54,7 @@ class BulkMixin(_TypedModelRestApi):
54
54
  If you are overriding this method, make sure to copy all the decorators too.
55
55
  """
56
56
  async with AsyncTaskRunner():
57
- bulk_handler: typing.Callable | None = getattr(
57
+ bulk_handler: collections.abc.Callable | None = getattr(
58
58
  self, f"bulk_{handler}", None
59
59
  )
60
60
  if not bulk_handler:
@@ -19,6 +19,7 @@ This mixin holds:
19
19
  derive the JSONForms schema served by ``/_info``.
20
20
  """
21
21
 
22
+ import collections.abc
22
23
  import enum
23
24
  import re
24
25
  import types
@@ -52,7 +53,7 @@ class ColumnsMixin(_TypedModelRestApi):
52
53
  Column / schema / body helpers shared by every ``ModelRestApi`` route.
53
54
  """
54
55
 
55
- def _gen_labels_columns(self, list_columns: typing.List[str]) -> None:
56
+ def _gen_labels_columns(self, list_columns: list[str]) -> None:
56
57
  """
57
58
  Auto generates pretty label_columns from list of columns
58
59
  """
@@ -87,17 +88,17 @@ class ColumnsMixin(_TypedModelRestApi):
87
88
  def _init_filters(
88
89
  self,
89
90
  datamodel: SQLAInterface,
90
- filters: typing.List[typing.Tuple[str, typing.Type[BaseFilter], typing.Any]],
91
+ filters: list[tuple[str, type[BaseFilter], typing.Any]],
91
92
  ):
92
93
  """
93
94
  Initialize the filter for the API.
94
95
 
95
96
  Args:
96
97
  datamodel (SQLAInterface): The datamodel object.
97
- filters (typing.List[typing.Tuple[str, typing.Type[BaseFilter], typing.Any]]): The list of filters to initialize.
98
+ filters (list[tuple[str, type[BaseFilter], typing.Any]]): The list of filters to initialize.
98
99
 
99
100
  Returns:
100
- typing.List[typing.Tuple[str, typing.Type[BaseFilter], typing.Any]]: The initialized filters.
101
+ list[tuple[str, type[BaseFilter], typing.Any]]: The initialized filters.
101
102
  """
102
103
  return [
103
104
  (
@@ -158,7 +159,7 @@ class ColumnsMixin(_TypedModelRestApi):
158
159
  col (str): The column name.
159
160
 
160
161
  Returns:
161
- typing.Tuple[SQLAInterface, str]: The datamodel and the related column name.
162
+ tuple[SQLAInterface, str]: The datamodel and the related column name.
162
163
  """
163
164
  datamodel = self.datamodel
164
165
  col_to_get = col
@@ -169,7 +170,7 @@ class ColumnsMixin(_TypedModelRestApi):
169
170
 
170
171
  def _create_request_schema(
171
172
  self,
172
- schema: typing.Type[pydantic.BaseModel],
173
+ schema: type[pydantic.BaseModel],
173
174
  optional: bool = False,
174
175
  name: str | None = None,
175
176
  ):
@@ -177,7 +178,7 @@ class ColumnsMixin(_TypedModelRestApi):
177
178
  Create a request schema from `schema` for add and edit endpoints, transforming relation columns into the appropriate schema.
178
179
 
179
180
  Args:
180
- schema (typing.Type[BaseModel]): The base schema to create the request schema from.
181
+ schema (type[BaseModel]): The base schema to create the request schema from.
181
182
  optional (bool, optional): Flag indicating whether the request schema is optional. Defaults to False.
182
183
  name (str | None, optional): The name of the request schema. Defaults to None.
183
184
 
@@ -217,8 +218,8 @@ class ColumnsMixin(_TypedModelRestApi):
217
218
  if not optional:
218
219
  params["default"] = []
219
220
  type = (
220
- typing.List[self.datamodel.get_related_interface(col).id_schema]
221
- | typing.List[RelInfo]
221
+ list[self.datamodel.get_related_interface(col).id_schema]
222
+ | list[RelInfo]
222
223
  )
223
224
  if optional or self.datamodel.is_nullable(col):
224
225
  type = (
@@ -253,24 +254,24 @@ class ColumnsMixin(_TypedModelRestApi):
253
254
  async def _process_body(
254
255
  self,
255
256
  session: SQLASession,
256
- body: pydantic.BaseModel | typing.Dict[str, typing.Any],
257
+ body: pydantic.BaseModel | dict[str, typing.Any],
257
258
  filter_dict: dict[str, list[tuple[str, BaseFilter, typing.Any]]],
258
259
  exclude: list[str] | None = None,
259
260
  *,
260
261
  item: Model | None = None,
261
- ) -> typing.Dict[str, typing.Any]:
262
+ ) -> dict[str, typing.Any]:
262
263
  """
263
264
  Process the body of the request by handling relations and returning a new body dictionary.
264
265
 
265
266
  Args:
266
267
  session (SQLASession): The session object for the database connection.
267
- body (BaseModel | typing.Dict[str, typing.Any]): The request body.
268
+ body (BaseModel | dict[str, typing.Any]): The request body.
268
269
  filter_dict (dict[str, list[tuple[str, BaseFilter, typing.Any]]): The filter dictionary.
269
270
  exclude (list[str] | None, optional): The list of fields to exclude from the body. Defaults to None.
270
271
  item (Model | None, optional): The item to be updated. Defaults to None.
271
272
 
272
273
  Returns:
273
- typing.Dict[str, typing.Any]: The transformed body dictionary.
274
+ dict[str, typing.Any]: The transformed body dictionary.
274
275
 
275
276
  Raises:
276
277
  HTTPException: If any related items are not found or if an item is not found for a one-to-one or many-to-one relation.
@@ -524,11 +525,15 @@ class ColumnsMixin(_TypedModelRestApi):
524
525
  schema: type[pydantic.BaseModel],
525
526
  info_columns: list[ColumnInfo | ColumnEnumInfo | ColumnRelationInfo],
526
527
  use_enum: bool
527
- | typing.Callable[[ColumnInfo | ColumnEnumInfo | ColumnRelationInfo], bool]
528
+ | collections.abc.Callable[
529
+ [ColumnInfo | ColumnEnumInfo | ColumnRelationInfo], bool
530
+ ]
528
531
  | dict[
529
532
  str,
530
533
  bool
531
- | typing.Callable[[ColumnInfo | ColumnEnumInfo | ColumnRelationInfo], bool],
534
+ | collections.abc.Callable[
535
+ [ColumnInfo | ColumnEnumInfo | ColumnRelationInfo], bool
536
+ ],
532
537
  ] = False,
533
538
  ):
534
539
  """
@@ -33,7 +33,7 @@ class InfoMixin(_TypedModelRestApi):
33
33
 
34
34
  async def info_headless(
35
35
  self,
36
- permissions: typing.List[str] = SelfDepends().get_current_permissions,
36
+ permissions: list[str] = SelfDepends().get_current_permissions,
37
37
  session: SQLASession = SelfDepends().datamodel.get_session_factory,
38
38
  session_count: SQLASession = SelfDepends().datamodel.get_session_factory,
39
39
  ):
@@ -41,7 +41,7 @@ class InfoMixin(_TypedModelRestApi):
41
41
  Retrieves information in headless mode.
42
42
 
43
43
  Args:
44
- permissions (typing.List[str]): A list of permissions.
44
+ permissions (list[str]): A list of permissions.
45
45
  session (SQLASession): A database session from the model's
46
46
  session factory.
47
47
 
@@ -67,7 +67,7 @@ class InfoMixin(_TypedModelRestApi):
67
67
  async def pre_info(
68
68
  self,
69
69
  info: InfoResponse,
70
- permissions: typing.List[str],
70
+ permissions: list[str],
71
71
  session: SQLASession,
72
72
  ):
73
73
  """
@@ -76,7 +76,7 @@ class InfoMixin(_TypedModelRestApi):
76
76
 
77
77
  Args:
78
78
  info (InfoResponse): The info response.
79
- permissions (typing.List[str]): A list of permissions.
79
+ permissions (list[str]): A list of permissions.
80
80
  session (SQLASession): The database session passed through from
81
81
  `info_headless`.
82
82
  """
@@ -84,7 +84,7 @@ class InfoMixin(_TypedModelRestApi):
84
84
 
85
85
  async def _generate_info_schema(
86
86
  self,
87
- permissions: typing.List[str],
87
+ permissions: list[str],
88
88
  session: SQLASession,
89
89
  session_count: SQLASession,
90
90
  ):
@@ -92,7 +92,7 @@ class InfoMixin(_TypedModelRestApi):
92
92
  Generates the information schema for the API.
93
93
 
94
94
  Args:
95
- permissions (typing.List[str]): The list of permissions for the API.
95
+ permissions (list[str]): The list of permissions for the API.
96
96
  session (SQLASession): The database session.
97
97
  session_count (SQLASession): The database session for counting.
98
98
 
@@ -80,7 +80,7 @@ class ListMixin(_TypedModelRestApi):
80
80
  with_name=False,
81
81
  )
82
82
  schema = merge_schema(
83
- schema, {"result": (typing.List[list_obj_schema], ...)}, True
83
+ schema, {"result": (list[list_obj_schema], ...)}, True
84
84
  )
85
85
 
86
86
  body = await smart_run(
@@ -35,12 +35,12 @@ __all__ = [
35
35
  class Params(pydantic.BaseModel):
36
36
  model_config = pydantic.ConfigDict(arbitrary_types_allowed=True)
37
37
  id: PRIMARY_KEY | None = None
38
- ids: typing.List[PRIMARY_KEY] | None = None
38
+ ids: list[PRIMARY_KEY] | None = None
39
39
  q: QuerySchema | None = None
40
40
  session: SQLASession | AbstractSession | typing.Any | None = None
41
41
  body: pydantic.BaseModel | None = None
42
42
  item: Model | typing.Any | None = None
43
- items: typing.List[Model | typing.Any] | None = None
43
+ items: list[Model | typing.Any] | None = None
44
44
  extra: typing.Any | None = None
45
45
 
46
46
 
@@ -49,7 +49,7 @@ class P_ID(Params):
49
49
 
50
50
 
51
51
  class P_IDS(Params):
52
- ids: typing.List[PRIMARY_KEY]
52
+ ids: list[PRIMARY_KEY]
53
53
 
54
54
 
55
55
  class P_Q(Params):
@@ -69,7 +69,7 @@ class P_ITEM(Params):
69
69
 
70
70
 
71
71
  class P_ITEMS(Params):
72
- items: typing.List[Model | typing.Any]
72
+ items: list[Model | typing.Any]
73
73
 
74
74
 
75
75
  class PARAM_Q(P_Q):