sqlalchemy-declarative-extensions 0.18.0__tar.gz → 0.19.0__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 (618) hide show
  1. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/CHANGELOG.md +6 -0
  2. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/PKG-INFO +1 -1
  3. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/docs/source/triggers.md +55 -0
  4. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/pyproject.toml +1 -1
  5. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/api.py +2 -2
  6. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/dialects/mysql/trigger.py +6 -0
  7. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/dialects/postgresql/__init__.py +2 -0
  8. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/dialects/postgresql/function.py +18 -0
  9. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/dialects/postgresql/trigger.py +17 -4
  10. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/function/base.py +54 -0
  11. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/trigger/base.py +32 -2
  12. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/trigger/compare.py +2 -1
  13. sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_trigger_function_execute/models.py +49 -0
  14. sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_trigger_function_execute/test_migrations.py +38 -0
  15. sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_update_pg/alembic.ini +36 -0
  16. sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_update_pg/migrations/env.py +26 -0
  17. sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_update_pg/migrations/script.py.mako +24 -0
  18. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/trigger/test_alembic.py +5 -0
  19. sqlalchemy_declarative_extensions-0.19.0/tests/trigger/test_function_execute_conflict.py +34 -0
  20. sqlalchemy_declarative_extensions-0.19.0/tests/trigger/test_function_execute_mysql.py +11 -0
  21. sqlalchemy_declarative_extensions-0.19.0/tests/trigger/test_function_execute_postgres.py +103 -0
  22. sqlalchemy_declarative_extensions-0.19.0/tests/view/__init__.py +0 -0
  23. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/.github/FUNDING.yml +0 -0
  24. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/.github/workflows/release.yml +0 -0
  25. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/.github/workflows/test.yml +0 -0
  26. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/.gitignore +0 -0
  27. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/.readthedocs.yml +0 -0
  28. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/CONTRIBUTING.md +0 -0
  29. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/LICENSE +0 -0
  30. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/Makefile +0 -0
  31. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/README.md +0 -0
  32. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/docs/Makefile +0 -0
  33. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/docs/docs/__init__.py +0 -0
  34. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/docs/make.bat +0 -0
  35. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/docs/pyproject.toml +0 -0
  36. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/docs/source/_static/.gitkeep +0 -0
  37. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/docs/source/alembic.md +0 -0
  38. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/docs/source/api.md +0 -0
  39. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/docs/source/audit_tables.md +0 -0
  40. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/docs/source/conf.py +0 -0
  41. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/docs/source/contributing/dialect-support.md +0 -0
  42. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/docs/source/contributing/index.md +0 -0
  43. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/docs/source/contributing/testing.md +0 -0
  44. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/docs/source/dialects/index.md +0 -0
  45. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/docs/source/dialects/mysql.md +0 -0
  46. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/docs/source/dialects/postgresql.md +0 -0
  47. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/docs/source/dialects/snowflake.md +0 -0
  48. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/docs/source/functions.md +0 -0
  49. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/docs/source/grants.md +0 -0
  50. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/docs/source/index.md +0 -0
  51. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/docs/source/roles.md +0 -0
  52. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/docs/source/rows.md +0 -0
  53. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/docs/source/schemas.md +0 -0
  54. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/docs/source/sqlalchemy.md +0 -0
  55. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/docs/source/views.md +0 -0
  56. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/docs/uv.lock +0 -0
  57. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/setup.cfg +0 -0
  58. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/__init__.py +0 -0
  59. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/alembic/__init__.py +0 -0
  60. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/alembic/base.py +0 -0
  61. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/alembic/database.py +0 -0
  62. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/alembic/function.py +0 -0
  63. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/alembic/grant.py +0 -0
  64. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/alembic/procedure.py +0 -0
  65. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/alembic/role.py +0 -0
  66. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/alembic/row.py +0 -0
  67. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/alembic/schema.py +0 -0
  68. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/alembic/trigger.py +0 -0
  69. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/alembic/view.py +0 -0
  70. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/audit.py +0 -0
  71. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/context.py +0 -0
  72. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/database/__init__.py +0 -0
  73. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/database/base.py +0 -0
  74. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/database/compare.py +0 -0
  75. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/database/ddl.py +0 -0
  76. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/dialects/__init__.py +0 -0
  77. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/dialects/from_string.py +0 -0
  78. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/dialects/mysql/__init__.py +0 -0
  79. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/dialects/mysql/function.py +0 -0
  80. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/dialects/mysql/procedure.py +0 -0
  81. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/dialects/mysql/query.py +0 -0
  82. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/dialects/mysql/schema.py +0 -0
  83. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/dialects/postgresql/acl.py +0 -0
  84. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/dialects/postgresql/grant.py +0 -0
  85. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/dialects/postgresql/grant_type.py +0 -0
  86. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/dialects/postgresql/procedure.py +0 -0
  87. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/dialects/postgresql/query.py +0 -0
  88. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/dialects/postgresql/role.py +0 -0
  89. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/dialects/postgresql/schema.py +0 -0
  90. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/dialects/postgresql/view.py +0 -0
  91. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/dialects/query.py +0 -0
  92. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/dialects/snowflake/__init__.py +0 -0
  93. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/dialects/snowflake/information_schema.py +0 -0
  94. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/dialects/snowflake/query.py +0 -0
  95. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/dialects/snowflake/role.py +0 -0
  96. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/dialects/snowflake/schema.py +0 -0
  97. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/dialects/snowflake/view.py +0 -0
  98. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/dialects/sqlite/__init__.py +0 -0
  99. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/dialects/sqlite/query.py +0 -0
  100. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/dialects/sqlite/schema.py +0 -0
  101. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/function/__init__.py +0 -0
  102. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/function/compare.py +0 -0
  103. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/function/ddl.py +0 -0
  104. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/grant/__init__.py +0 -0
  105. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/grant/base.py +0 -0
  106. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/grant/compare.py +0 -0
  107. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/grant/ddl.py +0 -0
  108. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/op.py +0 -0
  109. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/procedure/__init__.py +0 -0
  110. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/procedure/base.py +0 -0
  111. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/procedure/compare.py +0 -0
  112. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/procedure/ddl.py +0 -0
  113. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/py.typed +0 -0
  114. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/role/__init__.py +0 -0
  115. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/role/base.py +0 -0
  116. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/role/compare.py +0 -0
  117. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/role/ddl.py +0 -0
  118. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/role/generic.py +0 -0
  119. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/role/state.py +0 -0
  120. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/role/topological_sort.py +0 -0
  121. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/row/__init__.py +0 -0
  122. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/row/base.py +0 -0
  123. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/row/compare.py +0 -0
  124. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/row/query.py +0 -0
  125. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/schema/__init__.py +0 -0
  126. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/schema/base.py +0 -0
  127. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/schema/compare.py +0 -0
  128. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/schema/ddl.py +0 -0
  129. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/sql.py +0 -0
  130. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/sqlalchemy.py +0 -0
  131. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/trigger/__init__.py +0 -0
  132. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/trigger/ddl.py +0 -0
  133. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/typing.py +0 -0
  134. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/view/__init__.py +0 -0
  135. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/view/base.py +0 -0
  136. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/view/compare.py +0 -0
  137. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/src/sqlalchemy_declarative_extensions/view/ddl.py +0 -0
  138. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/__init__.py +0 -0
  139. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/audit/__init__.py +0 -0
  140. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/audit/test_context_values.py +0 -0
  141. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/audit/test_create_all.py +0 -0
  142. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/audit/test_disabled_operation.py +0 -0
  143. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/audit/test_quoting.py +0 -0
  144. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/audit/test_schema_support.py +0 -0
  145. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/conftest.py +0 -0
  146. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/dialect/__init__.py +0 -0
  147. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/dialect/postgresql/__init__.py +0 -0
  148. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/dialect/postgresql/test_acl.py +0 -0
  149. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/dialect/postgresql/test_exclude_extension_objects.py +0 -0
  150. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/dialect/postgresql/test_extension_owned_schema.py +0 -0
  151. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/dialect/postgresql/test_function_attributes.py +0 -0
  152. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/dialect/postgresql/test_function_defaults.py +0 -0
  153. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/dialect/postgresql/test_postgres_11.py +0 -0
  154. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/dialect/postgresql/test_postgres_14_sqlbody.py +0 -0
  155. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/dialect/test_from_string.py +0 -0
  156. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_create_role/alembic.ini +0 -0
  157. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_create_role/conftest.py +0 -0
  158. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_create_role/migrations/env.py +0 -0
  159. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_create_role/migrations/script.py.mako +0 -0
  160. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_create_role/migrations/versions/.gitkeep +0 -0
  161. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_create_role/models.py +0 -0
  162. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_create_role/test_migrations.py +0 -0
  163. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_create_rows/alembic.ini +0 -0
  164. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_create_rows/conftest.py +0 -0
  165. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_create_rows/migrations/env.py +0 -0
  166. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_create_rows/migrations/script.py.mako +0 -0
  167. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_create_rows/migrations/versions/.gitkeep +0 -0
  168. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_create_rows/migrations/versions/a63ad8efc2f4_.py +0 -0
  169. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_create_rows/models.py +0 -0
  170. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_create_rows/test_migrations.py +0 -0
  171. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_delete_rows/alembic.ini +0 -0
  172. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_delete_rows/conftest.py +0 -0
  173. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_delete_rows/migrations/env.py +0 -0
  174. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_delete_rows/migrations/script.py.mako +0 -0
  175. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_delete_rows/migrations/versions/.gitkeep +0 -0
  176. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_delete_rows/migrations/versions/a63ad8efc2f4_.py +0 -0
  177. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_delete_rows/models.py +0 -0
  178. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_delete_rows/test_migrations.py +0 -0
  179. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_delete_rows_ignore_unspecified/alembic.ini +0 -0
  180. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_delete_rows_ignore_unspecified/conftest.py +0 -0
  181. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_delete_rows_ignore_unspecified/migrations/env.py +0 -0
  182. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_delete_rows_ignore_unspecified/migrations/script.py.mako +0 -0
  183. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_delete_rows_ignore_unspecified/migrations/versions/.gitkeep +0 -0
  184. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_delete_rows_ignore_unspecified/migrations/versions/a63ad8efc2f4_.py +0 -0
  185. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_delete_rows_ignore_unspecified/models.py +0 -0
  186. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_delete_rows_ignore_unspecified/test_migrations.py +0 -0
  187. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_delete_unspecified_grants/alembic.ini +0 -0
  188. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_delete_unspecified_grants/conftest.py +0 -0
  189. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_delete_unspecified_grants/migrations/env.py +0 -0
  190. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_delete_unspecified_grants/migrations/script.py.mako +0 -0
  191. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_delete_unspecified_grants/migrations/versions/.gitkeep +0 -0
  192. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_delete_unspecified_grants/migrations/versions/0522a3309c12_.py +0 -0
  193. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_delete_unspecified_grants/models.py +0 -0
  194. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_delete_unspecified_grants/test_migrations.py +0 -0
  195. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_create/alembic.ini +0 -0
  196. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_create/migrations/env.py +0 -0
  197. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_create/migrations/script.py.mako +0 -0
  198. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_create/migrations/versions/.gitkeep +0 -0
  199. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_create/models.py +0 -0
  200. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_create/test_migrations.py +0 -0
  201. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_create_pg_postgis/alembic.ini +0 -0
  202. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_create_pg_postgis/migrations/env.py +0 -0
  203. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_create_pg_postgis/migrations/script.py.mako +0 -0
  204. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_create_pg_postgis/migrations/versions/.gitkeep +0 -0
  205. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_create_pg_postgis/models.py +0 -0
  206. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_create_pg_postgis/test_migrations.py +0 -0
  207. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_create_pg_sqlbody/alembic.ini +0 -0
  208. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_create_pg_sqlbody/migrations/env.py +0 -0
  209. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_create_pg_sqlbody/migrations/script.py.mako +0 -0
  210. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_create_pg_sqlbody/migrations/versions/.gitkeep +0 -0
  211. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_create_pg_sqlbody/models.py +0 -0
  212. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_create_pg_sqlbody/test_migrations.py +0 -0
  213. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_create_with_params_mysql/alembic.ini +0 -0
  214. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_create_with_params_mysql/migrations/env.py +0 -0
  215. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_create_with_params_mysql/migrations/script.py.mako +0 -0
  216. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_create_with_params_mysql/migrations/versions/.gitkeep +0 -0
  217. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_create_with_params_mysql/models.py +0 -0
  218. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_create_with_params_mysql/test_migrations.py +0 -0
  219. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_create_with_params_postgresql/alembic.ini +0 -0
  220. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_create_with_params_postgresql/migrations/env.py +0 -0
  221. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_create_with_params_postgresql/migrations/script.py.mako +0 -0
  222. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_create_with_params_postgresql/migrations/versions/.gitkeep +0 -0
  223. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_create_with_params_postgresql/models.py +0 -0
  224. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_create_with_params_postgresql/test_migrations.py +0 -0
  225. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_drop/alembic.ini +0 -0
  226. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_drop/migrations/env.py +0 -0
  227. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_drop/migrations/script.py.mako +0 -0
  228. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_drop/migrations/versions/.gitkeep +0 -0
  229. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_drop/models.py +0 -0
  230. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_drop/test_migrations.py +0 -0
  231. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_leading_whitespace/alembic.ini +0 -0
  232. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_leading_whitespace/migrations/env.py +0 -0
  233. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_leading_whitespace/migrations/script.py.mako +0 -0
  234. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_leading_whitespace/migrations/versions/.gitkeep +0 -0
  235. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_leading_whitespace/models.py +0 -0
  236. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_leading_whitespace/test_migrations.py +0 -0
  237. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_rewriter/alembic.ini +0 -0
  238. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_rewriter/migrations/env.py +0 -0
  239. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_rewriter/migrations/script.py.mako +0 -0
  240. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_rewriter/migrations/versions/.gitkeep +0 -0
  241. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_rewriter/models.py +0 -0
  242. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_rewriter/test_migrations.py +0 -0
  243. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_update/alembic.ini +0 -0
  244. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_update/migrations/env.py +0 -0
  245. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_update/migrations/script.py.mako +0 -0
  246. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_update/migrations/versions/.gitkeep +0 -0
  247. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_update/models.py +0 -0
  248. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_function_update/test_migrations.py +0 -0
  249. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_grant_after_schema/alembic.ini +0 -0
  250. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_grant_after_schema/conftest.py +0 -0
  251. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_grant_after_schema/migrations/env.py +0 -0
  252. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_grant_after_schema/migrations/script.py.mako +0 -0
  253. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_grant_after_schema/migrations/versions/.gitkeep +0 -0
  254. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_grant_after_schema/models.py +0 -0
  255. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_grant_after_schema/test_migrations.py +0 -0
  256. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_grant_disabled/alembic.ini +0 -0
  257. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_grant_disabled/conftest.py +0 -0
  258. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_grant_disabled/migrations/env.py +0 -0
  259. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_grant_disabled/migrations/script.py.mako +0 -0
  260. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_grant_disabled/migrations/versions/.gitkeep +0 -0
  261. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_grant_disabled/models.py +0 -0
  262. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_grant_disabled/test_migrations.py +0 -0
  263. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_grant_rewriter/alembic.ini +0 -0
  264. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_grant_rewriter/conftest.py +0 -0
  265. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_grant_rewriter/migrations/env.py +0 -0
  266. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_grant_rewriter/migrations/script.py.mako +0 -0
  267. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_grant_rewriter/migrations/versions/.gitkeep +0 -0
  268. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_grant_rewriter/models.py +0 -0
  269. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_grant_rewriter/test_migrations.py +0 -0
  270. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_grant_update_existing/alembic.ini +0 -0
  271. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_grant_update_existing/conftest.py +0 -0
  272. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_grant_update_existing/migrations/env.py +0 -0
  273. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_grant_update_existing/migrations/script.py.mako +0 -0
  274. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_grant_update_existing/migrations/versions/.gitkeep +0 -0
  275. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_grant_update_existing/migrations/versions/0522a3309c12_.py +0 -0
  276. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_grant_update_existing/models.py +0 -0
  277. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_grant_update_existing/test_migrations.py +0 -0
  278. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_identify_grants/alembic.ini +0 -0
  279. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_identify_grants/conftest.py +0 -0
  280. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_identify_grants/migrations/env.py +0 -0
  281. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_identify_grants/migrations/script.py.mako +0 -0
  282. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_identify_grants/migrations/versions/.gitkeep +0 -0
  283. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_identify_grants/models.py +0 -0
  284. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_identify_grants/test_migrations.py +0 -0
  285. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_procedure_create/alembic.ini +0 -0
  286. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_procedure_create/migrations/env.py +0 -0
  287. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_procedure_create/migrations/script.py.mako +0 -0
  288. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_procedure_create/migrations/versions/.gitkeep +0 -0
  289. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_procedure_create/models.py +0 -0
  290. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_procedure_create/test_migrations.py +0 -0
  291. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_procedure_rewriter/alembic.ini +0 -0
  292. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_procedure_rewriter/migrations/env.py +0 -0
  293. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_procedure_rewriter/migrations/script.py.mako +0 -0
  294. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_procedure_rewriter/migrations/versions/.gitkeep +0 -0
  295. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_procedure_rewriter/models.py +0 -0
  296. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_procedure_rewriter/test_migrations.py +0 -0
  297. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_role_disabled/alembic.ini +0 -0
  298. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_role_disabled/conftest.py +0 -0
  299. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_role_disabled/migrations/env.py +0 -0
  300. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_role_disabled/migrations/script.py.mako +0 -0
  301. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_role_disabled/migrations/versions/.gitkeep +0 -0
  302. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_role_disabled/models.py +0 -0
  303. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_role_disabled/test_migrations.py +0 -0
  304. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_role_operations/alembic.ini +0 -0
  305. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_role_operations/conftest.py +0 -0
  306. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_role_operations/migrations/env.py +0 -0
  307. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_role_operations/migrations/script.py.mako +0 -0
  308. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_role_operations/migrations/versions/.gitkeep +0 -0
  309. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_role_operations/migrations/versions/a63ad8efc2f4_.py +0 -0
  310. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_role_operations/models.py +0 -0
  311. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_role_operations/test_migrations.py +0 -0
  312. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_role_rewriter/alembic.ini +0 -0
  313. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_role_rewriter/conftest.py +0 -0
  314. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_role_rewriter/migrations/env.py +0 -0
  315. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_role_rewriter/migrations/script.py.mako +0 -0
  316. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_role_rewriter/migrations/versions/.gitkeep +0 -0
  317. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_role_rewriter/models.py +0 -0
  318. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_role_rewriter/test_migrations.py +0 -0
  319. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_row_rewriter/alembic.ini +0 -0
  320. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_row_rewriter/conftest.py +0 -0
  321. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_row_rewriter/migrations/env.py +0 -0
  322. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_row_rewriter/migrations/script.py.mako +0 -0
  323. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_row_rewriter/migrations/versions/.gitkeep +0 -0
  324. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_row_rewriter/migrations/versions/a63ad8efc2f4_.py +0 -0
  325. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_row_rewriter/models.py +0 -0
  326. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_row_rewriter/test_migrations.py +0 -0
  327. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_rows_disabled/alembic.ini +0 -0
  328. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_rows_disabled/conftest.py +0 -0
  329. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_rows_disabled/migrations/env.py +0 -0
  330. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_rows_disabled/migrations/script.py.mako +0 -0
  331. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_rows_disabled/migrations/versions/.gitkeep +0 -0
  332. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_rows_disabled/migrations/versions/a63ad8efc2f4_.py +0 -0
  333. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_rows_disabled/models.py +0 -0
  334. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_rows_disabled/test_migrations.py +0 -0
  335. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_rows_drop_table/alembic.ini +0 -0
  336. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_rows_drop_table/conftest.py +0 -0
  337. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_rows_drop_table/migrations/env.py +0 -0
  338. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_rows_drop_table/migrations/script.py.mako +0 -0
  339. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_rows_drop_table/migrations/versions/.gitkeep +0 -0
  340. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_rows_drop_table/migrations/versions/34137c7892d1_.py +0 -0
  341. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_rows_drop_table/migrations/versions/a63ad8efc2f4_.py +0 -0
  342. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_rows_drop_table/models.py +0 -0
  343. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_rows_drop_table/test_migrations.py +0 -0
  344. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_create/alembic.ini +0 -0
  345. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_create/conftest.py +0 -0
  346. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_create/migrations/env.py +0 -0
  347. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_create/migrations/script.py.mako +0 -0
  348. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_create/migrations/versions/.gitkeep +0 -0
  349. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_create/models.py +0 -0
  350. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_create/test_migrations.py +0 -0
  351. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_disabled/alembic.ini +0 -0
  352. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_disabled/conftest.py +0 -0
  353. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_disabled/migrations/env.py +0 -0
  354. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_disabled/migrations/script.py.mako +0 -0
  355. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_disabled/migrations/versions/.gitkeep +0 -0
  356. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_disabled/models.py +0 -0
  357. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_disabled/test_migrations.py +0 -0
  358. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_drop/alembic.ini +0 -0
  359. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_drop/conftest.py +0 -0
  360. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_drop/migrations/env.py +0 -0
  361. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_drop/migrations/script.py.mako +0 -0
  362. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_drop/migrations/versions/.gitkeep +0 -0
  363. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_drop/models.py +0 -0
  364. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_drop/test_migrations.py +0 -0
  365. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_ignore_unspecified/alembic.ini +0 -0
  366. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_ignore_unspecified/conftest.py +0 -0
  367. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_ignore_unspecified/migrations/env.py +0 -0
  368. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_ignore_unspecified/migrations/script.py.mako +0 -0
  369. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_ignore_unspecified/migrations/versions/.gitkeep +0 -0
  370. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_ignore_unspecified/models.py +0 -0
  371. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_ignore_unspecified/test_migrations.py +0 -0
  372. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_rewriter/alembic.ini +0 -0
  373. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_rewriter/conftest.py +0 -0
  374. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_rewriter/migrations/env.py +0 -0
  375. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_rewriter/migrations/script.py.mako +0 -0
  376. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_rewriter/migrations/versions/.gitkeep +0 -0
  377. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_rewriter/models.py +0 -0
  378. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_schema_rewriter/test_migrations.py +0 -0
  379. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_single_row_ops/alembic.ini +0 -0
  380. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_single_row_ops/conftest.py +0 -0
  381. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_single_row_ops/migrations/env.py +0 -0
  382. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_single_row_ops/migrations/script.py.mako +0 -0
  383. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_single_row_ops/migrations/versions/.gitkeep +0 -0
  384. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_single_row_ops/migrations/versions/34137c7892d1_.py +0 -0
  385. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_single_row_ops/migrations/versions/a63ad8efc2f4_.py +0 -0
  386. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_single_row_ops/models.py +0 -0
  387. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_single_row_ops/test_migrations.py +0 -0
  388. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_trigger_create/alembic.ini +0 -0
  389. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_trigger_create/migrations/env.py +0 -0
  390. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_trigger_create/migrations/script.py.mako +0 -0
  391. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_trigger_create/migrations/versions/.gitkeep +0 -0
  392. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_trigger_create/models.py +0 -0
  393. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_trigger_create/test_migrations.py +0 -0
  394. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_trigger_drop/alembic.ini +0 -0
  395. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_trigger_drop/migrations/env.py +0 -0
  396. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_trigger_drop/migrations/script.py.mako +0 -0
  397. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_trigger_drop/migrations/versions/.gitkeep +0 -0
  398. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_trigger_drop/models.py +0 -0
  399. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_trigger_drop/test_migrations.py +0 -0
  400. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_trigger_rewriter → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_trigger_function_execute}/alembic.ini +0 -0
  401. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_trigger_table_args → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_trigger_function_execute}/migrations/env.py +0 -0
  402. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_trigger_rewriter → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_trigger_function_execute}/migrations/script.py.mako +0 -0
  403. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_trigger_rewriter → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_trigger_function_execute}/migrations/versions/.gitkeep +0 -0
  404. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_trigger_table_args → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_trigger_rewriter}/alembic.ini +0 -0
  405. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_trigger_rewriter/migrations/env.py +0 -0
  406. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_trigger_table_args → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_trigger_rewriter}/migrations/script.py.mako +0 -0
  407. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_trigger_table_args → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_trigger_rewriter}/migrations/versions/.gitkeep +0 -0
  408. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_trigger_rewriter/models.py +0 -0
  409. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_trigger_rewriter/test_migrations.py +0 -0
  410. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_trigger_update → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_trigger_table_args}/alembic.ini +0 -0
  411. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_trigger_update → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_trigger_table_args}/migrations/env.py +0 -0
  412. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_trigger_update → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_trigger_table_args}/migrations/script.py.mako +0 -0
  413. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_trigger_update → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_trigger_table_args}/migrations/versions/.gitkeep +0 -0
  414. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_trigger_table_args/models.py +0 -0
  415. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_trigger_table_args/test_migrations.py +0 -0
  416. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_update_role → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_trigger_update}/alembic.ini +0 -0
  417. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_create_mysql → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_trigger_update}/migrations/env.py +0 -0
  418. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_update_role → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_trigger_update}/migrations/script.py.mako +0 -0
  419. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_update_role → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_trigger_update}/migrations/versions/.gitkeep +0 -0
  420. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_trigger_update/models.py +0 -0
  421. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_trigger_update/test_migrations.py +0 -0
  422. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_update_rows → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_update_role}/alembic.ini +0 -0
  423. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_update_role/conftest.py +0 -0
  424. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_update_role/migrations/env.py +0 -0
  425. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_update_rows → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_update_role}/migrations/script.py.mako +0 -0
  426. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_update_rows → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_update_role}/migrations/versions/.gitkeep +0 -0
  427. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_update_role/models.py +0 -0
  428. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_update_role/test_migrations.py +0 -0
  429. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_complex_comparison_pg → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_update_rows}/alembic.ini +0 -0
  430. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_update_rows/conftest.py +0 -0
  431. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_update_rows/migrations/env.py +0 -0
  432. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_complex_comparison_pg → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_update_rows}/migrations/script.py.mako +0 -0
  433. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_complex_comparison_pg → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_update_rows}/migrations/versions/.gitkeep +0 -0
  434. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_update_rows/migrations/versions/a63ad8efc2f4_.py +0 -0
  435. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_update_rows/models.py +0 -0
  436. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_update_rows/test_migrations.py +0 -0
  437. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_create_mysql → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_complex_comparison_pg}/alembic.ini +0 -0
  438. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_view_complex_comparison_pg/migrations/env.py +0 -0
  439. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_create_mysql → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_complex_comparison_pg}/migrations/script.py.mako +0 -0
  440. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_create_mysql → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_complex_comparison_pg}/migrations/versions/.gitkeep +0 -0
  441. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_view_complex_comparison_pg/migrations/versions/c90a0d80e7a4_.py +0 -0
  442. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_view_complex_comparison_pg/models.py +0 -0
  443. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_view_complex_comparison_pg/test_migrations.py +0 -0
  444. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_create_pg → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_create_mysql}/alembic.ini +0 -0
  445. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_create_pg → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_create_mysql}/migrations/env.py +0 -0
  446. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_create_pg → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_create_mysql}/migrations/script.py.mako +0 -0
  447. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_create_pg → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_create_mysql}/migrations/versions/.gitkeep +0 -0
  448. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_view_create_mysql/models.py +0 -0
  449. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_view_create_mysql/test_migrations.py +0 -0
  450. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_drop_mysql → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_create_pg}/alembic.ini +0 -0
  451. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_drop_mysql → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_create_pg}/migrations/env.py +0 -0
  452. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_drop_mysql → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_create_pg}/migrations/script.py.mako +0 -0
  453. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_drop_mysql → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_create_pg}/migrations/versions/.gitkeep +0 -0
  454. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_view_create_pg/migrations/versions/db72aad6c888_.py +0 -0
  455. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_view_create_pg/models.py +0 -0
  456. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_view_create_pg/test_migrations.py +0 -0
  457. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_drop_pg → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_drop_mysql}/alembic.ini +0 -0
  458. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_drop_pg → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_drop_mysql}/migrations/env.py +0 -0
  459. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_drop_pg → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_drop_mysql}/migrations/script.py.mako +0 -0
  460. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_drop_pg → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_drop_mysql}/migrations/versions/.gitkeep +0 -0
  461. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_view_drop_mysql/models.py +0 -0
  462. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_view_drop_mysql/test_migrations.py +0 -0
  463. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_materialized_constraint → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_drop_pg}/alembic.ini +0 -0
  464. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_materialized_constraint → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_drop_pg}/migrations/env.py +0 -0
  465. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_materialized_constraint → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_drop_pg}/migrations/script.py.mako +0 -0
  466. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_materialized_constraint → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_drop_pg}/migrations/versions/.gitkeep +0 -0
  467. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_view_drop_pg/models.py +0 -0
  468. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_view_drop_pg/test_migrations.py +0 -0
  469. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_rewriter → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_materialized_constraint}/alembic.ini +0 -0
  470. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_update_mysql → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_materialized_constraint}/migrations/env.py +0 -0
  471. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_rewriter → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_materialized_constraint}/migrations/script.py.mako +0 -0
  472. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_rewriter → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_materialized_constraint}/migrations/versions/.gitkeep +0 -0
  473. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_view_materialized_constraint/migrations/versions/cc63f503ef39_.py +0 -0
  474. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_view_materialized_constraint/models.py +0 -0
  475. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_view_materialized_constraint/test_migrations.py +0 -0
  476. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_update_mysql → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_rewriter}/alembic.ini +0 -0
  477. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_view_rewriter/migrations/env.py +0 -0
  478. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_update_mysql → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_rewriter}/migrations/script.py.mako +0 -0
  479. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_update_mysql → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_rewriter}/migrations/versions/.gitkeep +0 -0
  480. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_view_rewriter/migrations/versions/db72aad6c888_.py +0 -0
  481. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_view_rewriter/models.py +0 -0
  482. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_view_rewriter/test_migrations.py +0 -0
  483. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_update_pg → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_update_mysql}/alembic.ini +0 -0
  484. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_update_pg → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_update_mysql}/migrations/env.py +0 -0
  485. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_update_pg → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_update_mysql}/migrations/script.py.mako +0 -0
  486. {sqlalchemy_declarative_extensions-0.18.0/tests/examples/test_view_update_pg → sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_update_mysql}/migrations/versions/.gitkeep +0 -0
  487. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_view_update_mysql/migrations/versions/2152079ac9a3_.py +0 -0
  488. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_view_update_mysql/models.py +0 -0
  489. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_view_update_mysql/test_migrations.py +0 -0
  490. /sqlalchemy_declarative_extensions-0.18.0/tests/function/__init__.py → /sqlalchemy_declarative_extensions-0.19.0/tests/examples/test_view_update_pg/migrations/versions/.gitkeep +0 -0
  491. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_view_update_pg/migrations/versions/2152079ac9a3_.py +0 -0
  492. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_view_update_pg/models.py +0 -0
  493. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/examples/test_view_update_pg/test_migrations.py +0 -0
  494. {sqlalchemy_declarative_extensions-0.18.0/tests/grant → sqlalchemy_declarative_extensions-0.19.0/tests/function}/__init__.py +0 -0
  495. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/function/test_alembic.py +0 -0
  496. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/function/test_create_mysql.py +0 -0
  497. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/function/test_create_postgresql.py +0 -0
  498. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/function/test_create_requires_normalization.py +0 -0
  499. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/function/test_delete.py +0 -0
  500. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/function/test_delete_mysql.py +0 -0
  501. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/function/test_drop_all.py +0 -0
  502. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/function/test_exclude.py +0 -0
  503. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/function/test_filter.py +0 -0
  504. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/function/test_function_normalization.py +0 -0
  505. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/function/test_ignore_unspecified.py +0 -0
  506. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/function/test_include_exclude.py +0 -0
  507. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/function/test_metadata_sequence.py +0 -0
  508. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/function/test_pg_security_definer.py +0 -0
  509. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/function/test_quote.py +0 -0
  510. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/function/test_unnamed_param.py +0 -0
  511. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/function/test_update.py +0 -0
  512. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/function/test_update_mysql.py +0 -0
  513. {sqlalchemy_declarative_extensions-0.18.0/tests/procedure → sqlalchemy_declarative_extensions-0.19.0/tests/grant}/__init__.py +0 -0
  514. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/grant/test_alembic.py +0 -0
  515. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/grant/test_false_grants_imply_default_grants.py +0 -0
  516. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/grant/test_grant_schema.py +0 -0
  517. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/grant/test_ignore_unspecified.py +0 -0
  518. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/grant/test_metadata_sequence.py +0 -0
  519. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/grant/test_no_grants.py +0 -0
  520. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/grant/test_only_defined_roles.py +0 -0
  521. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/grant/test_postgresql.py +0 -0
  522. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/grant/test_remove_unspecified.py +0 -0
  523. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/grant/test_sqlalchemy.py +0 -0
  524. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/grant/test_table_grants.py +0 -0
  525. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/grant/test_view.py +0 -0
  526. {sqlalchemy_declarative_extensions-0.18.0/tests/role → sqlalchemy_declarative_extensions-0.19.0/tests/procedure}/__init__.py +0 -0
  527. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/procedure/test_alembic.py +0 -0
  528. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/procedure/test_create.py +0 -0
  529. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/procedure/test_create_mysql.py +0 -0
  530. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/procedure/test_create_requires_normalization.py +0 -0
  531. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/procedure/test_delete.py +0 -0
  532. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/procedure/test_delete_mysql.py +0 -0
  533. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/procedure/test_drop_all.py +0 -0
  534. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/procedure/test_exclude.py +0 -0
  535. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/procedure/test_filter.py +0 -0
  536. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/procedure/test_ignore_unspecified.py +0 -0
  537. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/procedure/test_metadata_sequence.py +0 -0
  538. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/procedure/test_pg_security_definer.py +0 -0
  539. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/procedure/test_quote.py +0 -0
  540. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/procedure/test_update.py +0 -0
  541. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/procedure/test_update_mysql.py +0 -0
  542. {sqlalchemy_declarative_extensions-0.18.0/tests/row → sqlalchemy_declarative_extensions-0.19.0/tests/role}/__init__.py +0 -0
  543. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/role/test_alembic.py +0 -0
  544. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/role/test_drop_all.py +0 -0
  545. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/role/test_external.py +0 -0
  546. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/role/test_filter.py +0 -0
  547. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/role/test_iterable_roles.py +0 -0
  548. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/role/test_metadata_sequence.py +0 -0
  549. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/role/test_remove_valid_until.py +0 -0
  550. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/role/test_sqlalchemy.py +0 -0
  551. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/role/test_sqlalchemy_snowflake.py +0 -0
  552. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/role/test_topological_sort.py +0 -0
  553. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/role/test_update_parent_role.py +0 -0
  554. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/role/test_use_role.py +0 -0
  555. {sqlalchemy_declarative_extensions-0.18.0/tests/trigger → sqlalchemy_declarative_extensions-0.19.0/tests/row}/__init__.py +0 -0
  556. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/row/test_alembic.py +0 -0
  557. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/row/test_bind_syntax.py +0 -0
  558. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/row/test_column_added.py +0 -0
  559. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/row/test_invalid_table.py +0 -0
  560. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/row/test_metadata_sequence.py +0 -0
  561. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/row/test_missing_primary_key.py +0 -0
  562. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/row/test_schema_context.py +0 -0
  563. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/row/test_sqlalchemy.py +0 -0
  564. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/schema/test_alembic.py +0 -0
  565. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/schema/test_drop.py +0 -0
  566. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/schema/test_drop_all.py +0 -0
  567. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/schema/test_filter.py +0 -0
  568. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/schema/test_metadata_sequence.py +0 -0
  569. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/schema/test_snowflake.py +0 -0
  570. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/schema/test_sqlalchemy.py +0 -0
  571. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/test_ignore_include.py +0 -0
  572. {sqlalchemy_declarative_extensions-0.18.0/tests/view → sqlalchemy_declarative_extensions-0.19.0/tests/trigger}/__init__.py +0 -0
  573. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/trigger/test_arguments.py +0 -0
  574. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/trigger/test_create_mysql.py +0 -0
  575. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/trigger/test_create_postgres.py +0 -0
  576. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/trigger/test_drop_all.py +0 -0
  577. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/trigger/test_drop_mysql.py +0 -0
  578. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/trigger/test_drop_postgres.py +0 -0
  579. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/trigger/test_for_each_statement_postgres.py +0 -0
  580. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/trigger/test_ignore_unspecified_postgres.py +0 -0
  581. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/trigger/test_include_exclude.py +0 -0
  582. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/trigger/test_metadata_sequence.py +0 -0
  583. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/trigger/test_missing_when_postgres.py +0 -0
  584. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/trigger/test_same_name_postgres.py +0 -0
  585. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/trigger/test_schema_quoting.py +0 -0
  586. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/trigger/test_table_args.py +0 -0
  587. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/trigger/test_table_args_mysql.py +0 -0
  588. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/trigger/test_table_args_postgres.py +0 -0
  589. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/trigger/test_update_mysql.py +0 -0
  590. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/trigger/test_update_postgres.py +0 -0
  591. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/trigger/test_when_references_new_postgres.py +0 -0
  592. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/trigger/test_wrapped_parens_postgres.py +0 -0
  593. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/utilities.py +0 -0
  594. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/view/test_add_constraint_to_existing.py +0 -0
  595. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/view/test_alembic.py +0 -0
  596. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/view/test_alembic_utils.py +0 -0
  597. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/view/test_constraint_drops_first.py +0 -0
  598. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/view/test_convert_to_materialized.py +0 -0
  599. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/view/test_create_table_and_view_together.py +0 -0
  600. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/view/test_drop_all.py +0 -0
  601. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/view/test_escaped_bindparam.py +0 -0
  602. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/view/test_filter.py +0 -0
  603. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/view/test_get_views_ignore.py +0 -0
  604. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/view/test_ignore_glob.py +0 -0
  605. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/view/test_ignore_unspecified.py +0 -0
  606. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/view/test_ignore_views.py +0 -0
  607. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/view/test_materialized.py +0 -0
  608. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/view/test_metadata_sequence.py +0 -0
  609. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/view/test_only_constraint_changes.py +0 -0
  610. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/view/test_only_different_constraints_drop.py +0 -0
  611. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/view/test_pg_materialized_no_data.py +0 -0
  612. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/view/test_snowflake.py +0 -0
  613. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/view/test_sqlalchemy.py +0 -0
  614. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/view/test_update.py +0 -0
  615. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/view/test_view_function.py +0 -0
  616. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/view/test_view_in_schema.py +0 -0
  617. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/tests/view/test_view_index_bound_column.py +0 -0
  618. {sqlalchemy_declarative_extensions-0.18.0 → sqlalchemy_declarative_extensions-0.19.0}/uv.lock +0 -0
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.19
4
+
5
+ ### 0.19.0
6
+
7
+ - feat: Accept a `Function` as a trigger's `execute`, creating it alongside the trigger.
8
+
3
9
  ## 0.18
4
10
 
5
11
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: sqlalchemy-declarative-extensions
3
- Version: 0.18.0
3
+ Version: 0.19.0
4
4
  Summary: Library to declare additional kinds of objects not natively supported by SQLAlchemy/Alembic.
5
5
  Project-URL: documentation, https://sqlalchemy-declarative-extensions.readthedocs.io/en/latest/
6
6
  Project-URL: homepage, https://sqlalchemy-declarative-extensions.readthedocs.io/en/latest/
@@ -91,6 +91,61 @@ the natural ordering, but it does mean that doing so afterwards will discard any
91
91
  already-attached table-level triggers.
92
92
  ```
93
93
 
94
+ ## Executing a function
95
+
96
+ For dialects whose triggers execute a function (PostgreSQL), `execute` may be a
97
+ `Function` rather than the name of one. The function is then created automatically
98
+ alongside the trigger, so it need not be separately registered through `Functions`.
99
+
100
+ ```python
101
+ from sqlalchemy_declarative_extensions.dialects.postgresql import Trigger, trigger_function
102
+
103
+ audit = trigger_function(
104
+ "audit",
105
+ """
106
+ BEGIN
107
+ INSERT INTO log (message) VALUES (TG_TABLE_NAME);
108
+ RETURN NULL;
109
+ END
110
+ """,
111
+ )
112
+
113
+
114
+ class Foo(Base):
115
+ __tablename__ = "foo"
116
+ __table_args__ = (
117
+ Trigger.after("insert", execute=audit).named("on_insert_foo").for_each_row(),
118
+ )
119
+
120
+ id = Column(types.Integer(), primary_key=True)
121
+ ```
122
+
123
+ This works however the trigger is declared (`Triggers`, `register_trigger` or
124
+ `__table_args__`). Any number of triggers may share the same function, as with the generic
125
+ audit function above, and it is created once. Declaring two *different* functions with the
126
+ same qualified name is an error.
127
+
128
+ `trigger_function` returns a PostgreSQL `Function` fixed to `RETURNS trigger LANGUAGE plpgsql`,
129
+ and accepts neither `parameters` nor `returns`. A plain `Function` may be used in the
130
+ same way when more control is needed.
131
+
132
+ ```{note}
133
+ Trigger functions are collected when `register_sqlalchemy_events` is called, so call it
134
+ after the models which declare triggers.
135
+ ```
136
+
137
+ ```{note}
138
+ When a function is only declared through a trigger, only that function is managed:
139
+ other functions in the database are left alone. If you also declare `Functions`, its
140
+ `ignore_unspecified` and `include`/`ignore` settings apply to the combined set (with
141
+ trigger functions added to `include`, if set).
142
+ ```
143
+
144
+ ```{note}
145
+ MySQL triggers execute a raw statement, so passing a `Function` to a MySQL `Trigger`
146
+ raises a `TypeError`.
147
+ ```
148
+
94
149
  ```{eval-rst}
95
150
  .. autoapimodule:: sqlalchemy_declarative_extensions.trigger.base
96
151
  :members: Trigger, Triggers, register_trigger
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sqlalchemy-declarative-extensions"
3
- version = "0.18.0"
3
+ version = "0.19.0"
4
4
  authors = [{ name = "Dan Cardin", email = "ddcardin@gmail.com" }]
5
5
  description = "Library to declare additional kinds of objects not natively supported by SQLAlchemy/Alembic."
6
6
  license = { file = "LICENSE" }
@@ -229,7 +229,7 @@ def register_create_events(
229
229
  concrete_grants = metadata.info.get("grants") or Grants()
230
230
  concrete_views = Views.extract(metadata) or Views()
231
231
  concrete_procedures = metadata.info.get("procedures") or Procedures()
232
- concrete_functions = metadata.info.get("functions") or Functions()
232
+ concrete_functions = Functions.extract(metadata) or Functions()
233
233
  concrete_triggers = metadata.info.get("triggers") or Triggers()
234
234
  concrete_databases = metadata.info.get("databases") or Databases()
235
235
  concrete_rows = metadata.info.get("rows") or Rows()
@@ -333,7 +333,7 @@ def register_drop_events(
333
333
  concrete_roles = metadata.info.get("roles")
334
334
  concrete_views = metadata.info.get("views")
335
335
  concrete_procedures = metadata.info.get("procedures")
336
- concrete_functions = metadata.info.get("functions")
336
+ concrete_functions = Functions.extract(metadata)
337
337
  concrete_triggers = metadata.info.get("triggers")
338
338
  concrete_databases = metadata.info.get("databases")
339
339
 
@@ -48,6 +48,11 @@ class Trigger(base.Trigger):
48
48
  order: TriggerOrder | None = None
49
49
 
50
50
  def __post_init__(self):
51
+ if not isinstance(self.execute, str):
52
+ raise TypeError(
53
+ f"MySQL trigger '{self.name}' must execute a statement string,"
54
+ " not a `Function`."
55
+ )
51
56
  self.time = TriggerTimes.from_string(self.time)
52
57
  self.event = TriggerEvents.from_string(self.event)
53
58
 
@@ -118,6 +123,7 @@ class Trigger(base.Trigger):
118
123
  if self.order:
119
124
  components.append(self.order.order.value)
120
125
  components.append(self.order.other_trigger_name)
126
+ assert isinstance(self.execute, str)
121
127
  components.append(self.execute)
122
128
 
123
129
  return " ".join(components) + ";"
@@ -5,6 +5,7 @@ from sqlalchemy_declarative_extensions.dialects.postgresql.function import (
5
5
  FunctionReturn,
6
6
  FunctionSecurity,
7
7
  FunctionVolatility,
8
+ trigger_function,
8
9
  )
9
10
  from sqlalchemy_declarative_extensions.dialects.postgresql.grant import (
10
11
  DefaultGrant,
@@ -70,4 +71,5 @@ __all__ = [
70
71
  "TypeGrants",
71
72
  "View",
72
73
  "ViewIndex",
74
+ "trigger_function",
73
75
  ]
@@ -363,3 +363,21 @@ type_map = {
363
363
  "bool[]": "_bool",
364
364
  "boolean[]": "_bool",
365
365
  }
366
+
367
+
368
+ def trigger_function(
369
+ name: str,
370
+ definition: str,
371
+ *,
372
+ schema: str | None = None,
373
+ security: FunctionSecurity = FunctionSecurity.invoker,
374
+ ) -> Function:
375
+ """Create a plpgsql `Function` returning `trigger`, suitable for `Trigger(execute=...)`."""
376
+ return Function(
377
+ name=name,
378
+ definition=definition,
379
+ schema=schema,
380
+ security=security,
381
+ returns="trigger",
382
+ language="plpgsql",
383
+ )
@@ -5,6 +5,7 @@ from dataclasses import dataclass, replace
5
5
  from sqlalchemy.engine import Connection
6
6
 
7
7
  from sqlalchemy_declarative_extensions.dialects.from_string import FromStrings
8
+ from sqlalchemy_declarative_extensions.function.base import Function
8
9
  from sqlalchemy_declarative_extensions.sql import quote_name
9
10
  from sqlalchemy_declarative_extensions.trigger import base
10
11
 
@@ -105,7 +106,11 @@ class Trigger(base.Trigger):
105
106
 
106
107
  @classmethod
107
108
  def before(
108
- cls, *events: TriggerEvents | str, execute: str, on: str = "", name: str = ""
109
+ cls,
110
+ *events: TriggerEvents | str,
111
+ execute: str | Function,
112
+ on: str = "",
113
+ name: str = "",
109
114
  ):
110
115
  return cls(
111
116
  time=TriggerTimes.before,
@@ -117,7 +122,11 @@ class Trigger(base.Trigger):
117
122
 
118
123
  @classmethod
119
124
  def after(
120
- cls, *events: TriggerEvents | str, execute: str, on: str = "", name: str = ""
125
+ cls,
126
+ *events: TriggerEvents | str,
127
+ execute: str | Function,
128
+ on: str = "",
129
+ name: str = "",
121
130
  ):
122
131
  return cls(
123
132
  time=TriggerTimes.after,
@@ -129,7 +138,11 @@ class Trigger(base.Trigger):
129
138
 
130
139
  @classmethod
131
140
  def instead_of(
132
- cls, *events: TriggerEvents | str, execute: str, on: str = "", name: str = ""
141
+ cls,
142
+ *events: TriggerEvents | str,
143
+ execute: str | Function,
144
+ on: str = "",
145
+ name: str = "",
133
146
  ):
134
147
  return cls(
135
148
  time=TriggerTimes.instead_of,
@@ -203,7 +216,7 @@ class Trigger(base.Trigger):
203
216
  args_quoted = (
204
217
  tuple(f"'{arg}'" for arg in self.arguments) if self.arguments else ()
205
218
  )
206
- components.append(quote_name(self.execute) + f"({','.join(args_quoted)})")
219
+ components.append(quote_name(self.execute_name) + f"({','.join(args_quoted)})")
207
220
  return " ".join(components) + ";"
208
221
 
209
222
  def to_sql_drop(self):
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import glob
3
4
  from dataclasses import dataclass, field, replace
4
5
  from typing import Iterable, Sequence
5
6
 
@@ -109,9 +110,35 @@ class Functions:
109
110
 
110
111
  @classmethod
111
112
  def extract(cls, metadata: MetaData | list[MetaData | None] | None) -> Self | None:
113
+ """Extract the declared functions, including those executed by declared triggers.
114
+
115
+ When a trigger function is not otherwise declared, only that function is managed
116
+ (through `include`), so unrelated functions in the database are left alone.
117
+ """
112
118
  if not isinstance(metadata, Sequence):
113
119
  metadata = [metadata]
114
120
 
121
+ declared = cls._extract_declared(metadata)
122
+ trigger_functions = [
123
+ function
124
+ for m in metadata
125
+ if m and m.info.get("triggers")
126
+ for function in m.info["triggers"].functions
127
+ ]
128
+ if not trigger_functions:
129
+ return declared
130
+
131
+ if declared is None:
132
+ result = cls(include=[])
133
+ else:
134
+ result = replace(declared, functions=list(declared.functions))
135
+
136
+ for function in trigger_functions:
137
+ result.append_managed(function)
138
+ return result
139
+
140
+ @classmethod
141
+ def _extract_declared(cls, metadata: Sequence[MetaData | None]) -> Self | None:
115
142
  instances: list[Self] = [
116
143
  m.info["functions"] for m in metadata if m and m.info.get("functions")
117
144
  ]
@@ -146,8 +173,35 @@ class Functions:
146
173
  )
147
174
 
148
175
  def append(self, function: Function):
176
+ """Add the function, unless an identical one is already present.
177
+
178
+ Raises a `ValueError` if a different function has the same qualified name.
179
+ """
180
+ qualified_name = function.qualified_name
181
+ existing = next(
182
+ (f for f in self.functions if f.qualified_name == qualified_name), None
183
+ )
184
+ if existing is not None:
185
+ if existing != function:
186
+ raise ValueError(
187
+ f"Function '{qualified_name}' is declared more than once"
188
+ " with differing definitions."
189
+ )
190
+ return
191
+
149
192
  self.functions.append(function)
150
193
 
194
+ def append_managed(self, function: Function):
195
+ """Append the function, and add it to `include` if this collection is restricted by it."""
196
+ self.append(function)
197
+
198
+ if self.include is None:
199
+ return
200
+
201
+ pattern = glob.escape(function.qualified_name)
202
+ if pattern not in self.include:
203
+ self.include = [*self.include, pattern]
204
+
151
205
  def __iter__(self):
152
206
  yield from self.functions
153
207
 
@@ -8,23 +8,40 @@ from sqlalchemy.engine import Connection
8
8
  from sqlalchemy.sql.schema import SchemaItem
9
9
  from typing_extensions import Self
10
10
 
11
+ from sqlalchemy_declarative_extensions.function.base import Function, Functions
11
12
  from sqlalchemy_declarative_extensions.sql import qualify_name
12
13
  from sqlalchemy_declarative_extensions.sqlalchemy import HasMetaData
13
14
 
14
15
 
15
16
  @dataclass
16
17
  class Trigger(SchemaItem):
17
- """Describes a generic trigger."""
18
+ """Describes a generic trigger.
19
+
20
+ `execute` is either the statement/name to execute, or (for dialects whose triggers
21
+ execute a function) a `Function`, which is then created alongside the trigger.
22
+ """
18
23
 
19
24
  name: str
20
25
  on: str
21
- execute: str
26
+ execute: str | Function
22
27
 
23
28
  @property
24
29
  def identity(self) -> Hashable:
25
30
  """Return the dialect-specific identity used to compare triggers."""
26
31
  return self.name
27
32
 
33
+ @property
34
+ def execute_name(self) -> str:
35
+ if isinstance(self.execute, Function):
36
+ return self.execute.qualified_name
37
+ return self.execute
38
+
39
+ def normalize(self) -> Self:
40
+ """Return the trigger with any `Function` replaced by its qualified name."""
41
+ if isinstance(self.execute, Function):
42
+ return replace(self, execute=self.execute_name)
43
+ return self
44
+
28
45
  def named(self, name: str):
29
46
  return replace(self, name=name)
30
47
 
@@ -118,6 +135,11 @@ class Triggers:
118
135
  include=include,
119
136
  )
120
137
 
138
+ @property
139
+ def functions(self) -> list[Function]:
140
+ """The functions referenced as `execute` by the triggers."""
141
+ return [t.execute for t in self.triggers if isinstance(t.execute, Function)]
142
+
121
143
  def append(self, trigger: Trigger):
122
144
  self.triggers.append(trigger)
123
145
 
@@ -133,12 +155,20 @@ def register_trigger(base_or_metadata: HasMetaData | MetaData, trigger: Trigger)
133
155
 
134
156
  This can be used instead of the static registration through `Triggers` on a declarative base or
135
157
  `MetaData`, to imperitively register triggers.
158
+
159
+ If the trigger executes a `Function`, that function is registered as well.
136
160
  """
137
161
  if isinstance(base_or_metadata, MetaData):
138
162
  metadata = base_or_metadata
139
163
  else:
140
164
  metadata = base_or_metadata.metadata
141
165
 
166
+ if isinstance(trigger.execute, Function):
167
+ functions = metadata.info.get("functions")
168
+ if not functions:
169
+ functions = metadata.info["functions"] = Functions(include=[])
170
+ functions.append_managed(trigger.execute)
171
+
142
172
  if not metadata.info.get("triggers"):
143
173
  metadata.info["triggers"] = Triggers()
144
174
  metadata.info["triggers"].append(trigger)
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from dataclasses import dataclass
3
+ from dataclasses import dataclass, replace
4
4
  from typing import Union
5
5
 
6
6
  from sqlalchemy.engine import Connection
@@ -51,6 +51,7 @@ Operation = Union[CreateTriggerOp, UpdateTriggerOp, DropTriggerOp]
51
51
  def compare_triggers(connection: Connection, triggers: Triggers) -> list[Operation]:
52
52
  result: list[Operation] = []
53
53
 
54
+ triggers = replace(triggers, triggers=[t.normalize() for t in triggers])
54
55
  triggers_by_identity = {r.identity: r for r in triggers.triggers}
55
56
  expected_trigger_identities = set(triggers_by_identity)
56
57
 
@@ -0,0 +1,49 @@
1
+ from sqlalchemy import Column, types
2
+
3
+ from sqlalchemy_declarative_extensions import declarative_database
4
+ from sqlalchemy_declarative_extensions.dialects.postgresql import (
5
+ Trigger,
6
+ trigger_function,
7
+ )
8
+ from sqlalchemy_declarative_extensions.sqlalchemy import declarative_base
9
+
10
+ _Base = declarative_base()
11
+
12
+ gimme = trigger_function(
13
+ "gimme",
14
+ """
15
+ BEGIN
16
+ INSERT INTO log (id) select NEW.id + 1;
17
+ RETURN NULL;
18
+ END
19
+ """,
20
+ )
21
+
22
+
23
+ @declarative_database
24
+ class Base(_Base): # type: ignore
25
+ __abstract__ = True
26
+
27
+
28
+ class Log(Base):
29
+ __tablename__ = "log"
30
+
31
+ id = Column(types.Integer(), primary_key=True)
32
+
33
+
34
+ class Foo(Base):
35
+ __tablename__ = "foo"
36
+ __table_args__ = (
37
+ Trigger.after("insert", execute=gimme).named("on_insert_foo").for_each_row(),
38
+ )
39
+
40
+ id = Column(types.Integer(), primary_key=True)
41
+
42
+
43
+ class Bar(Base):
44
+ __tablename__ = "bar"
45
+ __table_args__ = (
46
+ Trigger.after("insert", execute=gimme).named("on_insert_bar").for_each_row(),
47
+ )
48
+
49
+ id = Column(types.Integer(), primary_key=True)
@@ -0,0 +1,38 @@
1
+ from pathlib import Path
2
+
3
+ import pytest
4
+ from pytest_alembic import MigrationContext
5
+ from pytest_mock_resources import PostgresConfig, create_postgres_fixture
6
+ from sqlalchemy import text
7
+
8
+ alembic_engine = create_postgres_fixture(scope="function", engine_kwargs={"echo": True})
9
+
10
+
11
+ @pytest.fixture(scope="session")
12
+ def pmr_postgres_config():
13
+ return PostgresConfig(image="postgres:13", port=None, ci_port=None)
14
+
15
+
16
+ def test_function_is_created_before_triggers_and_dropped_after(
17
+ alembic_runner: MigrationContext, alembic_engine
18
+ ):
19
+ alembic_runner.generate_revision(autogenerate=True, prevent_file_generation=False)
20
+
21
+ (revision,) = Path("migrations/versions").glob("*.py")
22
+ source = revision.read_text()
23
+ upgrade, downgrade = source.split("def downgrade")
24
+ assert upgrade.count("CREATE FUNCTION") == 1
25
+ assert upgrade.index("CREATE FUNCTION") < upgrade.index("CREATE TRIGGER")
26
+ assert downgrade.index("DROP TRIGGER") < downgrade.index("DROP FUNCTION")
27
+
28
+ alembic_runner.migrate_up_one()
29
+
30
+ with alembic_engine.connect() as conn:
31
+ conn.execute(text("insert into foo (id) values (1)"))
32
+ conn.execute(text("insert into bar (id) values (10)"))
33
+ conn.commit()
34
+ result = [r for r, *_ in conn.execute(text("select id from log")).fetchall()]
35
+
36
+ assert sorted(result) == [2, 11]
37
+
38
+ alembic_runner.migrate_down_one()
@@ -0,0 +1,36 @@
1
+ [alembic]
2
+ script_location = migrations
3
+
4
+ [loggers]
5
+ keys = root,sqlalchemy,alembic
6
+
7
+ [handlers]
8
+ keys = console
9
+
10
+ [formatters]
11
+ keys = generic
12
+
13
+ [logger_root]
14
+ level = WARN
15
+ handlers = console
16
+ qualname =
17
+
18
+ [logger_sqlalchemy]
19
+ level = WARN
20
+ handlers =
21
+ qualname = sqlalchemy.engine
22
+
23
+ [logger_alembic]
24
+ level = INFO
25
+ handlers =
26
+ qualname = alembic
27
+
28
+ [handler_console]
29
+ class = StreamHandler
30
+ args = (sys.stderr,)
31
+ level = NOTSET
32
+ formatter = generic
33
+
34
+ [formatter_generic]
35
+ format = %(levelname)-5.5s [%(name)s] %(message)s
36
+ datefmt = %H:%M:%S
@@ -0,0 +1,26 @@
1
+ from alembic import context
2
+
3
+ # isort: split
4
+ from models import Base
5
+ from sqlalchemy import engine_from_config, pool
6
+
7
+ from sqlalchemy_declarative_extensions import register_alembic_events
8
+
9
+ target_metadata = Base.metadata
10
+
11
+ register_alembic_events(views=True, rows=True)
12
+
13
+ connectable = context.config.attributes.get("connection", None)
14
+
15
+ if connectable is None:
16
+ connectable = engine_from_config(
17
+ context.config.get_section(context.config.config_ini_section),
18
+ prefix="sqlalchemy.",
19
+ poolclass=pool.NullPool,
20
+ )
21
+
22
+ with connectable.connect() as connection:
23
+ context.configure(connection=connection, target_metadata=target_metadata)
24
+
25
+ with context.begin_transaction():
26
+ context.run_migrations()
@@ -0,0 +1,24 @@
1
+ """${message}
2
+
3
+ Revision ID: ${up_revision}
4
+ Revises: ${down_revision | comma,n}
5
+ Create Date: ${create_date}
6
+
7
+ """
8
+ from alembic import op
9
+ import sqlalchemy as sa
10
+ ${imports if imports else ""}
11
+
12
+ # revision identifiers, used by Alembic.
13
+ revision = ${repr(up_revision)}
14
+ down_revision = ${repr(down_revision)}
15
+ branch_labels = ${repr(branch_labels)}
16
+ depends_on = ${repr(depends_on)}
17
+
18
+
19
+ def upgrade():
20
+ ${upgrades if upgrades else "pass"}
21
+
22
+
23
+ def downgrade():
24
+ ${downgrades if downgrades else "pass"}
@@ -26,3 +26,8 @@ def test_trigger_rewriter(pytester):
26
26
  @pytest.mark.alembic
27
27
  def test_trigger_table_args(pytester):
28
28
  successful_test_run(pytester, count=1)
29
+
30
+
31
+ @pytest.mark.alembic
32
+ def test_trigger_function_execute(pytester):
33
+ successful_test_run(pytester, count=1)
@@ -0,0 +1,34 @@
1
+ import pytest
2
+ from sqlalchemy import MetaData
3
+
4
+ from sqlalchemy_declarative_extensions.dialects.postgresql import (
5
+ Trigger,
6
+ trigger_function,
7
+ )
8
+ from sqlalchemy_declarative_extensions.trigger.base import register_trigger
9
+
10
+
11
+ def test_different_functions_with_the_same_name_raise():
12
+ metadata = MetaData()
13
+ register_trigger(
14
+ metadata,
15
+ Trigger.after(
16
+ "insert",
17
+ on="a",
18
+ name="a",
19
+ execute=trigger_function("audit", "BEGIN RETURN NULL; END"),
20
+ ),
21
+ )
22
+
23
+ with pytest.raises(ValueError, match="'audit'"):
24
+ register_trigger(
25
+ metadata,
26
+ Trigger.after(
27
+ "insert",
28
+ on="b",
29
+ name="b",
30
+ execute=trigger_function("audit", "BEGIN RETURN NEW; END"),
31
+ ),
32
+ )
33
+
34
+ assert [t.name for t in metadata.info["triggers"]] == ["a"]
@@ -0,0 +1,11 @@
1
+ import pytest
2
+
3
+ from sqlalchemy_declarative_extensions.dialects import mysql
4
+ from sqlalchemy_declarative_extensions.dialects.postgresql import trigger_function
5
+
6
+
7
+ def test_function_is_rejected():
8
+ audit = trigger_function("audit", "BEGIN RETURN NULL; END")
9
+
10
+ with pytest.raises(TypeError, match="Function"):
11
+ mysql.Trigger.after("insert", execute=audit, on="a", name="a") # type: ignore