ferro-orm 0.21.0__tar.gz → 0.21.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (454) hide show
  1. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/.github/workflows/ci.yml +1 -1
  2. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/AGENTS.md +64 -4
  3. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/CHANGELOG.md +42 -0
  4. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/CONTEXT.md +13 -1
  5. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/Cargo.lock +31 -31
  6. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/Cargo.toml +1 -1
  7. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/PKG-INFO +1 -1
  8. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/crates/ferro-ddl-lowering/src/lib.rs +635 -6
  9. ferro_orm-0.21.2/docs/adr/0015-table-check-body-drift.md +14 -0
  10. ferro_orm-0.21.2/docs/adr/0020-enum-type-drop-on-downgrade.md +117 -0
  11. ferro_orm-0.21.2/docs/adr/0021-enum-type-reuse-on-upgrade.md +133 -0
  12. ferro_orm-0.21.2/docs/adr/0022-enum-type-creation-for-add-column.md +134 -0
  13. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/examples/row_level_security.py +9 -9
  14. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/examples/row_level_security_annotated.py +9 -9
  15. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/examples/traversal.py +2 -2
  16. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/api/connection.md +1 -1
  17. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/concepts/architecture.md +5 -5
  18. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/concepts/performance.md +1 -1
  19. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/concepts/type-safety.md +1 -1
  20. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/faq.md +1 -1
  21. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/getting-started/next-steps.md +2 -2
  22. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/getting-started/quickstart.md +2 -2
  23. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/guide/aggregations.md +1 -1
  24. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/guide/migrations.md +20 -3
  25. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/guide/models-and-fields.md +2 -2
  26. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/guide/queries.md +13 -5
  27. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/guide/relationships.md +1 -1
  28. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/guide/row-level-security.md +114 -67
  29. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/guide/transactions.md +1 -1
  30. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/howto/migrate-from-sqlalchemy.md +1 -1
  31. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/howto/pagination.md +1 -1
  32. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/howto/testing.md +1 -1
  33. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/index.md +2 -2
  34. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/why-ferro.md +4 -12
  35. ferro_orm-0.21.2/docs/solutions/issues/alembic-add-column-enum-type-undefined.md +90 -0
  36. ferro_orm-0.21.2/docs/solutions/issues/alembic-create-table-reissues-enum-type.md +87 -0
  37. ferro_orm-0.21.2/docs/solutions/issues/n-ary-check-chain-reads-as-drift.md +64 -0
  38. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/solutions/patterns/alembic-comparator-slot.md +19 -2
  39. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/justfile +1 -1
  40. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/pyproject.toml +2 -2
  41. ferro_orm-0.21.2/src/ferro/migrations/__init__.py +3 -0
  42. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/ferro/migrations/alembic.py +433 -26
  43. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/ferro/models.py +1 -1
  44. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/ferro/rowsecurity.py +22 -22
  45. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/lib.rs +1 -0
  46. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/naming_ffi.rs +84 -0
  47. ferro_orm-0.21.2/tests/_alembic_harness.py +135 -0
  48. ferro_orm-0.21.2/tests/test_alembic_enum_type_drop.py +906 -0
  49. ferro_orm-0.21.2/tests/test_alembic_render_execute.py +216 -0
  50. ferro_orm-0.21.2/tests/test_alembic_typing.py +81 -0
  51. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_cross_emitter_parity.py +102 -0
  52. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_label_addition.py +52 -29
  53. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_row_security_alembic.py +7 -90
  54. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_table_check_orphans.py +1 -27
  55. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_table_check_rebuild.py +124 -27
  56. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_table_check_reconcile.py +1 -29
  57. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/uv.lock +1 -1
  58. ferro_orm-0.21.0/docs/adr/0015-table-check-body-drift.md +0 -11
  59. ferro_orm-0.21.0/src/ferro/migrations/__init__.py +0 -3
  60. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  61. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  62. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/.github/PERMISSIONS.md +0 -0
  63. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/.github/PYPI_CHECKLIST.md +0 -0
  64. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/.github/PYPI_SETUP.md +0 -0
  65. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/.github/generated/wheels.generated.yml +0 -0
  66. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/.github/pull_request_template.md +0 -0
  67. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/.github/workflows/packaging-smoke.yml +0 -0
  68. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/.github/workflows/publish-docs.yml +0 -0
  69. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/.github/workflows/publish.yml +0 -0
  70. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/.github/workflows/release.yml +0 -0
  71. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/.gitignore +0 -0
  72. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/.pre-commit-config.yaml +0 -0
  73. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/.python-version +0 -0
  74. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/CONTRIBUTING.md +0 -0
  75. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/LICENSE +0 -0
  76. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/README.md +0 -0
  77. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/benchmarks/README.md +0 -0
  78. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/benchmarks/__init__.py +0 -0
  79. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/benchmarks/__main__.py +0 -0
  80. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/benchmarks/backends.py +0 -0
  81. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/benchmarks/baselines/postgres.json +0 -0
  82. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/benchmarks/baselines/sqlite.json +0 -0
  83. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/benchmarks/compare.py +0 -0
  84. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/benchmarks/harness.py +0 -0
  85. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/benchmarks/model.py +0 -0
  86. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/benchmarks/run.py +0 -0
  87. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/context7.json +0 -0
  88. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/crates/ferro-ddl-lowering/Cargo.toml +0 -0
  89. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/crates/ferro-ddl-lowering/src/policy_expr.rs +0 -0
  90. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/crates/ferro-migrate/Cargo.toml +0 -0
  91. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/crates/ferro-migrate/src/emit.rs +0 -0
  92. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/crates/ferro-migrate/src/lib.rs +0 -0
  93. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/crates/ferro-migrate/src/order.rs +0 -0
  94. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/crates/ferro-migrate/src/tests.rs +0 -0
  95. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/crates/ferro-schema-ir/Cargo.toml +0 -0
  96. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/crates/ferro-schema-ir/src/lib.rs +0 -0
  97. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/adr/0001-resolved-epoch-registration.md +0 -0
  98. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/adr/0002-unified-column-fact-derivation.md +0 -0
  99. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/adr/0003-path-blind-db-type-validation.md +0 -0
  100. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/adr/0004-jsonb-postgres-only-canonical.md +0 -0
  101. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/adr/0005-jsonb-default-on-postgres.md +0 -0
  102. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/adr/0006-relation-traversal-inner-joins.md +0 -0
  103. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/adr/0007-materialization-plan-complete-instances.md +0 -0
  104. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/adr/0007-reverse-relations-tested-not-traversed.md +0 -0
  105. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/adr/0008-populated-relations-include.md +0 -0
  106. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/adr/0008-predicate-negation-uniform-not.md +0 -0
  107. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/adr/0009-aggregate-projections-derived-grouping.md +0 -0
  108. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/adr/0010-create-pass-owns-only-missing-tables.md +0 -0
  109. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/adr/0011-label-addition-update-gated-append-only.md +0 -0
  110. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/adr/0012-table-checks-are-lambdas.md +0 -0
  111. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/adr/0013-table-check-reconciliation.md +0 -0
  112. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/adr/0014-table-checks-sqlite-create-only.md +0 -0
  113. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/adr/0016-check-predicates-literals-only.md +0 -0
  114. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/adr/0017-omitted-nulls-means-last.md +0 -0
  115. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/adr/0018-position-paging.md +0 -0
  116. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/adr/0019-row-policy-drift-and-the-one-way-flags.md +0 -0
  117. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/agents/domain.md +0 -0
  118. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/agents/issue-tracker.md +0 -0
  119. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/agents/triage-labels.md +0 -0
  120. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/architecture-review-2026-07-08.html +0 -0
  121. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/brainstorms/2026-04-29-named-connections-role-routing-requirements.md +0 -0
  122. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/brainstorms/2026-05-08-typed-query-predicates-requirements.md +0 -0
  123. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/brainstorms/2026-05-13-configurable-column-storage-types-requirements.md +0 -0
  124. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/brainstorms/2026-05-14-autogenerate-support-for-db-type-requirements.md +0 -0
  125. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/brainstorms/2026-05-25-annotated-strenum-cold-hydration-requirements.md +0 -0
  126. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/brainstorms/2026-06-24-ir-p8-119-wire-automigrate-requirements.md +0 -0
  127. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/brainstorms/2026-06-25-ir-p8-120-parity-gate-requirements.md +0 -0
  128. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/brainstorms/2026-06-26-ir-p8.5-140-shared-lowering-requirements.md +0 -0
  129. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/brainstorms/2026-06-26-ir-p8.5-143-db-type-drop-requirements.md +0 -0
  130. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/brainstorms/2026-06-26-ir-p8.5-144-reconcile-indexes-requirements.md +0 -0
  131. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/brainstorms/2026-06-28-ir-p8.5-141-single-schema-ir-producer-requirements.md +0 -0
  132. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/brainstorms/2026-06-29-ir-p8.6-146-dialect-enum-unification-requirements.md +0 -0
  133. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/brainstorms/2026-06-29-ir-p8.6-153-create-path-ir-requirements.md +0 -0
  134. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/brainstorms/2026-06-30-ir-p8.6-155-deferred-annotations-requirements.md +0 -0
  135. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/brainstorms/2026-06-30-ir-p8.6-158-check-renderer-requirements.md +0 -0
  136. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/brainstorms/2026-07-01-ir-p8.6-154-datetime-tz-coarseness-requirements.md +0 -0
  137. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/brainstorms/2026-07-01-ir-p8.6-162-typed-save-bind-requirements.md +0 -0
  138. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/brainstorms/2026-07-01-ir-p8.6-165-blob-introspection-false-positive-requirements.md +0 -0
  139. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/brainstorms/2026-07-02-ff-c1-codec-plan-design.md +0 -0
  140. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/brainstorms/2026-07-06-upgrade-guide-consolidation-requirements.md +0 -0
  141. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/examples/aggregations.py +0 -0
  142. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/examples/aggregations_annotated.py +0 -0
  143. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/examples/existence_tests.py +0 -0
  144. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/examples/existence_tests_annotated.py +0 -0
  145. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/examples/multiple_databases.py +0 -0
  146. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/examples/mutations.py +0 -0
  147. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/examples/pagination.py +0 -0
  148. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/examples/partial_selects.py +0 -0
  149. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/examples/partial_selects_annotated.py +0 -0
  150. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/examples/populated_relations.py +0 -0
  151. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/examples/populated_relations_annotated.py +0 -0
  152. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/examples/predicates.py +0 -0
  153. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/examples/predicates_annotated.py +0 -0
  154. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/examples/quickstart.py +0 -0
  155. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/examples/quickstart_annotated.py +0 -0
  156. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/examples/raw_sql.py +0 -0
  157. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/examples/relationships.py +0 -0
  158. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/examples/relationships_annotated.py +0 -0
  159. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/examples/soft_deletes.py +0 -0
  160. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/examples/soft_deletes_annotated.py +0 -0
  161. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/examples/table_checks.py +0 -0
  162. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/examples/table_checks_annotated.py +0 -0
  163. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/examples/testing_conftest.py +0 -0
  164. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/examples/timestamps.py +0 -0
  165. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/examples/timestamps_annotated.py +0 -0
  166. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/examples/transactions.py +0 -0
  167. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/examples/traversal_annotated.py +0 -0
  168. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/api/exceptions.md +0 -0
  169. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/api/fields.md +0 -0
  170. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/api/migrations.md +0 -0
  171. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/api/model.md +0 -0
  172. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/api/queries.md +0 -0
  173. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/api/raw-sql.md +0 -0
  174. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/api/relationships.md +0 -0
  175. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/api/transactions.md +0 -0
  176. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/changelog.md +0 -0
  177. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/concepts/backends.md +0 -0
  178. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/concepts/identity-map.md +0 -0
  179. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/concepts/query-typing.md +0 -0
  180. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/contributing.md +0 -0
  181. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/getting-started/installation.md +0 -0
  182. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/guide/connections.md +0 -0
  183. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/guide/mutations.md +0 -0
  184. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/guide/raw-sql.md +0 -0
  185. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/howto/multiple-databases.md +0 -0
  186. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/howto/soft-deletes.md +0 -0
  187. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/howto/timestamps.md +0 -0
  188. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/howto/upgrade-guide.md +0 -0
  189. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/roadmap.md +0 -0
  190. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/pages/stylesheets/extra.css +0 -0
  191. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-04-24-001-refactor-multi-db-backend-architecture-plan.md +0 -0
  192. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-04-29-001-typed-null-binds-plan.md +0 -0
  193. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-04-29-002-feat-named-connections-plan.md +0 -0
  194. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-05-07-001-refactor-generic-model-connection-plan.md +0 -0
  195. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-05-08-001-feat-typed-query-predicates-plan.md +0 -0
  196. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-05-13-001-feat-configurable-column-storage-types-plan.md +0 -0
  197. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-05-25-001-fix-annotated-strenum-cold-hydration-plan.md +0 -0
  198. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-06-19-001-ir-first-roadmap.md +0 -0
  199. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-06-24-001-feat-ir-p8-119-wire-automigrate-plan.md +0 -0
  200. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-06-25-001-feat-ir-p8-120-parity-gate-plan.md +0 -0
  201. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-06-26-001-feat-ir-p8.5-140-shared-lowering-plan.md +0 -0
  202. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-06-26-002-feat-ir-p8.5-143-db-type-drop-plan.md +0 -0
  203. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-06-26-003-feat-ir-p8.5-144-reconcile-indexes-plan.md +0 -0
  204. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-06-28-001-feat-ir-p8.5-141-single-schema-ir-producer-plan.md +0 -0
  205. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-06-29-001-refactor-ir-p8.6-153-create-path-unification-plan.md +0 -0
  206. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-06-29-002-refactor-ir-p8.6-146-dialect-enum-unification-plan.md +0 -0
  207. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-06-30-001-refactor-ir-p8.6-158-check-renderer-plan.md +0 -0
  208. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-06-30-002-fix-ir-p8.6-155-deferred-annotations-plan.md +0 -0
  209. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-07-01-001-feat-ir-p8.6-162-typed-save-bind-plan.md +0 -0
  210. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-07-01-002-fix-ir-p8.6-154-datetime-tz-coarseness-plan.md +0 -0
  211. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-07-01-003-fix-ir-p8.6-165-blob-introspection-plan.md +0 -0
  212. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-07-02-001-fable-fixes-roadmap.md +0 -0
  213. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-07-02-002-feat-ff-a-172-typed-exceptions-plan.md +0 -0
  214. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-07-02-003-ff-c-native-decode-design.md +0 -0
  215. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-07-02-004-ff-c-c2-catalog-cache-design.md +0 -0
  216. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-07-02-005-ff-d-identity-routing-design.md +0 -0
  217. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-07-02-006-ff-d-identity-routing-plan.md +0 -0
  218. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-07-03-007-ff-e-registry-identity-design.md +0 -0
  219. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-07-03-008-ff-e-registry-identity-plan.md +0 -0
  220. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-07-06-009-ff-f-query-builder-1.0-design.md +0 -0
  221. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-07-06-010-ff-f-query-builder-1.0-plan.md +0 -0
  222. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-07-06-011-ff-g-hardening-design.md +0 -0
  223. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-07-06-012-ff-g-hardening-plan.md +0 -0
  224. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-07-06-013-ff-g2-operations-dedup-design.md +0 -0
  225. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-07-06-014-ff-g2-operations-dedup-plan.md +0 -0
  226. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-07-06-015-docs-upgrade-guide-consolidation-plan.md +0 -0
  227. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/2026-07-18-016-existence-tests-design.md +0 -0
  228. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/ir-first-migration-guide.md +0 -0
  229. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/plans/ir-first-release-checklist.md +0 -0
  230. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/rfc/ir-contracts-v1.md +0 -0
  231. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/solutions/README.md +0 -0
  232. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/solutions/architecture-patterns/ir-first-lowering-consolidation-audit.md +0 -0
  233. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/solutions/architecture-patterns/ir-first-merge-readiness-review.md +0 -0
  234. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/solutions/issues/pg18-restrict-sqlstate-23001.md +0 -0
  235. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/solutions/issues/pydantic-slots-missing-after-ferro-hydration.md +0 -0
  236. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/solutions/issues/python-3.14-deferred-annotation-typeerror-swallow.md +0 -0
  237. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/solutions/issues/query-ir-version-pin-sweep.md +0 -0
  238. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/solutions/issues/sa-pk-column-nullable-divergence.md +0 -0
  239. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/solutions/issues/sa-vs-rust-unique-constraint-shape.md +0 -0
  240. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/solutions/issues/self-fk-evicts-component-from-create-order.md +0 -0
  241. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/solutions/issues/sqlite-integer-decimal-hydrates-as-none.md +0 -0
  242. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/solutions/issues/sqlite-null-hydrates-as-int-zero.md +0 -0
  243. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/solutions/issues/typed-where-null-panics-is-null.md +0 -0
  244. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/solutions/patterns/configurable-column-storage-types.md +0 -0
  245. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/solutions/patterns/cross-emitter-ddl-parity.md +0 -0
  246. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/solutions/patterns/ddl-on-live-engine.md +0 -0
  247. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/solutions/patterns/derived-type-and-naming-decision-table.md +0 -0
  248. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/solutions/patterns/foreign-key-index.md +0 -0
  249. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/solutions/patterns/index-unique-redundancy.md +0 -0
  250. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/solutions/patterns/ir-invariants.md +0 -0
  251. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/solutions/patterns/json-family-factory-migrate-backfill.md +0 -0
  252. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/solutions/patterns/persistence-state.md +0 -0
  253. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/solutions/patterns/position-paging-after.md +0 -0
  254. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/solutions/patterns/shadow-fk-columns.md +0 -0
  255. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/solutions/patterns/sqlite-alembic-reconnect-hydration-tests.md +0 -0
  256. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/solutions/patterns/typed-null-binds.md +0 -0
  257. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/docs/solutions/patterns/wire-scalar-canonicalization.md +0 -0
  258. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/scripts/demo_queries.py +0 -0
  259. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/scripts/demo_queries_pre_v012.py +0 -0
  260. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/backend.rs +0 -0
  261. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/codec.rs +0 -0
  262. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/codec_plan.rs +0 -0
  263. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/connection.rs +0 -0
  264. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/errors.rs +0 -0
  265. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/ferro/__init__.py +0 -0
  266. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/ferro/_annotation_utils.py +0 -0
  267. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/ferro/_bind_payload.py +0 -0
  268. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/ferro/_core.pyi +0 -0
  269. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/ferro/_deprecations.py +0 -0
  270. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/ferro/_shadow_fk_types.py +0 -0
  271. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/ferro/base.py +0 -0
  272. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/ferro/checks.py +0 -0
  273. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/ferro/columns.py +0 -0
  274. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/ferro/composite_indexes.py +0 -0
  275. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/ferro/composite_uniques.py +0 -0
  276. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/ferro/exceptions.py +0 -0
  277. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/ferro/fields.py +0 -0
  278. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/ferro/ir/__init__.py +0 -0
  279. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/ferro/ir/compiler.py +0 -0
  280. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/ferro/metaclass.py +0 -0
  281. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/ferro/py.typed +0 -0
  282. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/ferro/query/__init__.py +0 -0
  283. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/ferro/query/builder.py +0 -0
  284. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/ferro/query/nodes.py +0 -0
  285. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/ferro/query/rows.py +0 -0
  286. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/ferro/query/wire.py +0 -0
  287. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/ferro/raw.py +0 -0
  288. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/ferro/registry.py +0 -0
  289. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/ferro/relations/__init__.py +0 -0
  290. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/ferro/relations/descriptors.py +0 -0
  291. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/ferro/session.py +0 -0
  292. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/ferro/state.py +0 -0
  293. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/hydration.rs +0 -0
  294. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/introspect.rs +0 -0
  295. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/migrate.rs +0 -0
  296. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/operations.rs +0 -0
  297. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/query.rs +0 -0
  298. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/schema.rs +0 -0
  299. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/schema_bind.rs +0 -0
  300. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/session_settings.rs +0 -0
  301. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/src/state.rs +0 -0
  302. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/__init__.py +0 -0
  303. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/conftest.py +0 -0
  304. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/db_backends.py +0 -0
  305. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/fixtures/ir_vectors/README.md +0 -0
  306. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/fixtures/ir_vectors/codec_registry_core_v1.json +0 -0
  307. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/fixtures/ir_vectors/query_account_exists_v14.json +0 -0
  308. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/fixtures/ir_vectors/query_account_scoped_exists_v14.json +0 -0
  309. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/fixtures/ir_vectors/query_card_after_null_slot_v14.json +0 -0
  310. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/fixtures/ir_vectors/query_card_nulls_v14.json +0 -0
  311. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/fixtures/ir_vectors/query_owner_nested_exists_v14.json +0 -0
  312. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/fixtures/ir_vectors/query_owner_not_exists_v14.json +0 -0
  313. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/fixtures/ir_vectors/query_transaction_aggregate_v14.json +0 -0
  314. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/fixtures/ir_vectors/query_transaction_global_aggregate_v14.json +0 -0
  315. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/fixtures/ir_vectors/query_transaction_include_v14.json +0 -0
  316. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/fixtures/ir_vectors/query_transaction_left_join_v14.json +0 -0
  317. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/fixtures/ir_vectors/query_transaction_record_v14.json +0 -0
  318. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/fixtures/ir_vectors/query_transaction_traversal_v14.json +0 -0
  319. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/fixtures/ir_vectors/query_transaction_traversed_record_v14.json +0 -0
  320. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/fixtures/ir_vectors/query_user_add_columns_set_v14.json +0 -0
  321. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/fixtures/ir_vectors/query_user_add_literal_set_v14.json +0 -0
  322. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/fixtures/ir_vectors/query_user_after_v14.json +0 -0
  323. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/fixtures/ir_vectors/query_user_before_v14.json +0 -0
  324. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/fixtures/ir_vectors/query_user_compound_v14.json +0 -0
  325. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/fixtures/ir_vectors/query_user_literal_set_v14.json +0 -0
  326. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/fixtures/ir_vectors/query_user_m2m_exists_v14.json +0 -0
  327. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/fixtures/ir_vectors/query_user_merge_set_v14.json +0 -0
  328. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/fixtures/ir_vectors/query_user_mixed_set_v14.json +0 -0
  329. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/fixtures/ir_vectors/query_user_not_compound_v14.json +0 -0
  330. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/fixtures/ir_vectors/query_user_not_leaf_v14.json +0 -0
  331. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/fixtures/ir_vectors/query_user_now_set_v14.json +0 -0
  332. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/fixtures/ir_vectors/schema_invoice_baseline_v1.json +0 -0
  333. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/fixtures/ir_vectors/schema_phase1_fixture_models_v1.json +0 -0
  334. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/fixtures/ir_vectors/schema_raw_str_pk_autoincrement_v1.json +0 -0
  335. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/static_fixtures/bad_includes.py +0 -0
  336. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/static_fixtures/bad_predicates.py +0 -0
  337. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/static_fixtures/bad_projections.py +0 -0
  338. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/static_fixtures/good_includes.py +0 -0
  339. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/static_fixtures/good_predicates.py +0 -0
  340. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/static_fixtures/good_projections.py +0 -0
  341. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_after_position.py +0 -0
  342. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_aggregation.py +0 -0
  343. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_alembic_autogenerate.py +0 -0
  344. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_alembic_bridge.py +0 -0
  345. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_alembic_db_type.py +0 -0
  346. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_alembic_nullability.py +0 -0
  347. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_alembic_type_mapping.py +0 -0
  348. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_annotation_utils.py +0 -0
  349. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_auto_migrate.py +0 -0
  350. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_before_position.py +0 -0
  351. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_bulk_create_chunking.py +0 -0
  352. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_bulk_install.py +0 -0
  353. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_bulk_update.py +0 -0
  354. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_catalog_cache.py +0 -0
  355. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_check_predicate_dialect.py +0 -0
  356. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_codec_plan.py +0 -0
  357. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_column_specs.py +0 -0
  358. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_compiled_query.py +0 -0
  359. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_composite_index.py +0 -0
  360. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_composite_unique.py +0 -0
  361. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_connection.py +0 -0
  362. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_connection_redaction.py +0 -0
  363. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_constraints.py +0 -0
  364. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_crud.py +0 -0
  365. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_db_backends.py +0 -0
  366. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_db_type_cross_emitter_parity.py +0 -0
  367. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_db_type_integration.py +0 -0
  368. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_db_type_typing.py +0 -0
  369. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_db_type_validation.py +0 -0
  370. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_deletion.py +0 -0
  371. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_deprecations.py +0 -0
  372. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_docs_examples.py +0 -0
  373. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_documentation_features.py +0 -0
  374. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_enum_cold_hydration.py +0 -0
  375. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_exception_mapping.py +0 -0
  376. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_exceptions.py +0 -0
  377. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_field_wrapper.py +0 -0
  378. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_fk_target_pk.py +0 -0
  379. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_generation_counter_dirty_tracking.py +0 -0
  380. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_global_aggregates.py +0 -0
  381. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_grouped_aggregates.py +0 -0
  382. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_helpers.py +0 -0
  383. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_hydration.py +0 -0
  384. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_hydration_equivalence.py +0 -0
  385. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_identity_memory.py +0 -0
  386. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_identity_refresh.py +0 -0
  387. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_identity_scoped_invalidation.py +0 -0
  388. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_identity_weakref.py +0 -0
  389. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_import_budget.py +0 -0
  390. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_include.py +0 -0
  391. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_ir_vectors_contract.py +0 -0
  392. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_live_table_checks.py +0 -0
  393. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_metaclass_internals.py +0 -0
  394. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_metadata.py +0 -0
  395. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_migrate_plan.py +0 -0
  396. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_model_identity.py +0 -0
  397. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_models.py +0 -0
  398. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_mutation_pagination_guard.py +0 -0
  399. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_named_connections_integration.py +0 -0
  400. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_naming_single_source.py +0 -0
  401. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_negation.py +0 -0
  402. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_one_to_one.py +0 -0
  403. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_operation_seam_sync.py +0 -0
  404. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_order_by_nulls.py +0 -0
  405. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_order_by_nulls_wire.py +0 -0
  406. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_partial_selects.py +0 -0
  407. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_position_paging_traversal.py +0 -0
  408. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_primary_key_facts.py +0 -0
  409. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_provisional_import.py +0 -0
  410. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_query_builder.py +0 -0
  411. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_query_column_validation.py +0 -0
  412. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_query_exists.py +0 -0
  413. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_query_immutability.py +0 -0
  414. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_query_joins.py +0 -0
  415. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_query_typing.py +0 -0
  416. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_query_wire_vectors.py +0 -0
  417. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_raw_sql.py +0 -0
  418. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_refresh.py +0 -0
  419. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_registry_entrypoints.py +0 -0
  420. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_registry_owner.py +0 -0
  421. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_relation_specs.py +0 -0
  422. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_relationship_engine.py +0 -0
  423. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_relationship_resolution_errors.py +0 -0
  424. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_rls_end_to_end.py +0 -0
  425. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_route_single_site.py +0 -0
  426. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_routing_errors.py +0 -0
  427. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_row_security_create_pass.py +0 -0
  428. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_row_security_orphans.py +0 -0
  429. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_row_security_rebuild.py +0 -0
  430. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_row_security_reconcile.py +0 -0
  431. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_save_pk_edges.py +0 -0
  432. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_save_semantics.py +0 -0
  433. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_schema.py +0 -0
  434. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_schema_constraints.py +0 -0
  435. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_schema_db_type_metadata.py +0 -0
  436. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_schema_enum_annotations.py +0 -0
  437. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_session.py +0 -0
  438. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_session_set_config.py +0 -0
  439. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_session_settings.py +0 -0
  440. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_session_settings_connection_delivery.py +0 -0
  441. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_session_settings_operations.py +0 -0
  442. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_shadow_fk_types.py +0 -0
  443. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_sqlite_alembic_reconnect_hydration.py +0 -0
  444. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_static_contracts.py +0 -0
  445. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_string_search.py +0 -0
  446. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_structural_types.py +0 -0
  447. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_table_checks.py +0 -0
  448. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_temporal_types.py +0 -0
  449. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_transactions.py +0 -0
  450. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_traversed_projection.py +0 -0
  451. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_typed_null_binds.py +0 -0
  452. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_typed_save_bind.py +0 -0
  453. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/tests/test_update_recipe.py +0 -0
  454. {ferro_orm-0.21.0 → ferro_orm-0.21.2}/zensical.toml +0 -0
@@ -127,7 +127,7 @@ jobs:
127
127
 
128
128
  - name: Static type gate (ty, scoped)
129
129
  run: |
130
- uv run ty check src/ferro/query tests/test_query_typing.py tests/test_static_contracts.py
130
+ uv run ty check src/ferro/query tests/test_query_typing.py tests/test_static_contracts.py tests/test_alembic_typing.py
131
131
 
132
132
  - name: Run IR vector contract harness
133
133
  run: |
@@ -181,6 +181,51 @@ For a single model, every emitter must agree on:
181
181
  connect-time warnings remain the only word on them. See ADR-0019
182
182
  (rebuild the bodies ferro writes, report the bodies you write; flags are
183
183
  one-way) and PRD #406.
184
+ 17. **Enum type provenance** — the decision of which declared native enum
185
+ types a generated revision *introduces* (every column declaring the
186
+ type is one the revision adds: a created table's column or an
187
+ `add_column`), how an introduced type comes into being (`Inline`: a
188
+ `create_table` of the revision carries it and SQLAlchemy creates it
189
+ with the table; `Statement`: every column of it is an `add_column`, so
190
+ the revision must execute the `CREATE TYPE` itself, #439), and which
191
+ types it merely *reuses* (an added column declares it, but so does a
192
+ column the downgrade leaves standing or puts back), together with the
193
+ rendered `CREATE TYPE` and `DROP TYPE`, are decided by ONE trio of
194
+ functions: `ferro_ddl_lowering::enum_type_provenance` (one
195
+ `Introduced { creation } | Reused` verdict per touched type) /
196
+ `render_pg_enum_create_type` (the runtime create pass's guarded
197
+ statement; never a second renderer) / `render_pg_enum_drop_type`.
198
+ SQLAlchemy creates the type inline with `create_table`, unconditionally,
199
+ and nowhere else, and Alembic has no op for it, so the rendered
200
+ `downgrade()` never dropped it (#438), a `create_table` reusing a live
201
+ type re-issued `CREATE TYPE` and failed with `DuplicateObject` (#443),
202
+ and an `add_column` of a new type failed with `UndefinedObject` (#439).
203
+ The Alembic autogenerate comparator (`FerroEnumTypeIntroducedOp` /
204
+ `FerroEnumTypeDropOp` in `src/ferro/migrations/alembic.py`) consumes
205
+ the verdicts over FFI (`_core._plan_enum_type_provenance`, which carries
206
+ `create_statement` and `drop_statement`): an introduced type keeps its
207
+ inline creation, or gets the byte-identical guarded `CREATE TYPE`
208
+ ahead of every table op when only `add_column`s carry it, and gets the
209
+ byte-identical `DROP TYPE` on downgrade, after the last `drop_table` /
210
+ `drop_column`; a reused type gets neither and every `create_table`
211
+ column of it rewritten to
212
+ `postgresql.ENUM(..., create_type=False)` (`add_column` never creates a
213
+ type, so it is left alone). SQLAlchemy's `repr` omits that flag, so it
214
+ is rendered by the bridge's `render_item` hook
215
+ (`ferro.migrations.render_item`, wired in `env.py`); a revision that
216
+ needs it in a context that lacks it is refused at autogenerate with the
217
+ line to add, never written with an upgrade that fails later. The
218
+ decision is made from the revision alone, never from the live catalog,
219
+ so the file means the same thing on every database it runs against.
220
+ Pinned by `tests/test_alembic_enum_type_drop.py`,
221
+ `test_enum_type_provenance_parity_pin` and the ferro-ddl-lowering unit
222
+ pins. Postgres-only (SQLite enums store as text); Alembic-only by
223
+ construction (auto-migrate has no downgrade door, and its create pass
224
+ executes the same guarded `CREATE TYPE` itself), so the single-source
225
+ rule applies and the create statement is the one artifact with a
226
+ runtime twin to pin against. Ownership is by provenance (ADR-0020);
227
+ the upgrade side mirrors it (ADR-0021) and completes it for the
228
+ `add_column`-only shape (ADR-0022).
184
229
 
185
230
  ### Why this invariant exists
186
231
 
@@ -477,14 +522,29 @@ ops `extend` the list while it still has no table ops (#423).
477
522
  After-tables families (`ADD CONSTRAINT` over a new column, `CREATE POLICY`
478
523
  on a new table) register at `priority=LAST`. Before-tables families (enum
479
524
  label addition) register at `priority=FIRST` and insert at the front of the
480
- ops list. Default `MEDIUM` is an I-12 violation for ferro schema
481
- comparators. Alembic's own table comparator may remain `MEDIUM`. A
482
- same-revision pin is required for every after-tables family.
525
+ ops list. The enum type provenance family (#438, #439) is before-tables on
526
+ upgrade (the `CREATE TYPE` for a type only `add_column`s carry must precede
527
+ those `add_column`s) and after-tables on downgrade (`DROP TYPE` is only
528
+ legal after every `drop_table` / `drop_column`); it reads the revision's
529
+ `create_table` and `add_column` ops to decide, so it registers at
530
+ `priority=LAST`, but inserts at the front of the ops list, and the one
531
+ placement serves both sides: `UpgradeOps.reverse()` reverses order, so an
532
+ op ahead of every `create_table` lands behind every `drop_table` in the
533
+ downgrade. The priority says when a comparator runs; the insertion point
534
+ says where its op renders. Default `MEDIUM` is an I-12 violation for
535
+ ferro schema comparators. Alembic's own table comparator may remain
536
+ `MEDIUM`. A same-revision pin is required for every after-tables family
537
+ and for the before-tables upgrade statement.
483
538
 
484
539
  Pinned by the row-security comparator's LAST registration and
485
540
  `test_new_declaration_on_a_brand_new_table_lands_after_create_table`, and
486
541
  by `test_autogenerate_adds_a_column_before_the_check_that_references_it`
487
- (#423). Architecture review: I-19 in #427. See PRD #429 and
542
+ (#423), for the downgrade-after-tables slot by
543
+ `test_a_type_shared_by_two_new_tables_drops_once_after_both_tables`
544
+ (#438), and for the before-tables type creation by
545
+ `test_a_type_introduced_by_add_column_alone_is_created_and_dropped` and
546
+ `test_a_type_created_by_statement_lands_before_tables_beside_label_additions`
547
+ (#439). Architecture review: I-19 in #427. See PRD #429 and
488
548
  `docs/solutions/patterns/alembic-comparator-slot.md`.
489
549
 
490
550
  ---
@@ -1,6 +1,48 @@
1
1
  # CHANGELOG
2
2
 
3
3
 
4
+ ## v0.21.2 (2026-09-29)
5
+
6
+ ### Bug Fixes
7
+
8
+ - **alembic**: Create add_column-only enum types, type render_item, close the label-addition block
9
+ ([#448](https://github.com/syn54x/ferro-orm/pull/448),
10
+ [`dc49156`](https://github.com/syn54x/ferro-orm/commit/dc49156be6b8c998fd726230bc5a1ffb5fce15c4))
11
+
12
+
13
+ ## v0.21.1 (2026-09-28)
14
+
15
+ ### Bug Fixes
16
+
17
+ - **alembic**: Drop enum types in the downgrade of the create_table that made them
18
+ ([#441](https://github.com/syn54x/ferro-orm/pull/441),
19
+ [`5c86b7f`](https://github.com/syn54x/ferro-orm/commit/5c86b7fef03828443fd61852caa3705849e3150f))
20
+
21
+ - **alembic**: Render create_type=False for enum types a revision reuses
22
+ ([#445](https://github.com/syn54x/ferro-orm/pull/445),
23
+ [`6776d0b`](https://github.com/syn54x/ferro-orm/commit/6776d0b7b13499d85666280a623f91fbf2df6387))
24
+
25
+ - **checks**: Compare associative OR/AND chains flat in the drift normalizer
26
+ ([#442](https://github.com/syn54x/ferro-orm/pull/442),
27
+ [`4df72a2`](https://github.com/syn54x/ferro-orm/commit/4df72a2d37b456d79ba1fc9cfa6b5ba2a0c6f194))
28
+
29
+ ### Documentation
30
+
31
+ - Replace Pinch RLS examples and humanize guide prose
32
+ ([#433](https://github.com/syn54x/ferro-orm/pull/433),
33
+ [`4471d75`](https://github.com/syn54x/ferro-orm/commit/4471d7510f7bf6b642f13e5f768ac723bbdb2288))
34
+
35
+ - Unpack dense Why Ferro, query, and RLS prose
36
+ ([#434](https://github.com/syn54x/ferro-orm/pull/434),
37
+ [`1af08af`](https://github.com/syn54x/ferro-orm/commit/1af08af1288d670139fa5f0beab19bf7b19d8c8c))
38
+
39
+ ### Refactoring
40
+
41
+ - **alembic**: Enum type drop cleanups from the #441 review panel
42
+ ([#444](https://github.com/syn54x/ferro-orm/pull/444),
43
+ [`ae6b6d3`](https://github.com/syn54x/ferro-orm/commit/ae6b6d387d40727a79cb0f8a96c5151daffa1dbb))
44
+
45
+
4
46
  ## v0.21.0 (2026-09-17)
5
47
 
6
48
  ### Bug Fixes
@@ -149,7 +149,7 @@ The `migrate_updates` step that alters existing schema objects — tables and fe
149
149
  _Avoid_: Update pass, schema sync, drift repair
150
150
 
151
151
  **Ferro-owned artifact**:
152
- A schema object ferro may reconcile to match the declared model. Indexes and constraints are ferro-owned by naming (`idx_`, `uq_`, `fk_`, `ck_`); native enum types are ferro-owned by derivation — the type's name matches the name ferro derives from the model. Artifacts owned neither way belong to the user and are never altered or dropped.
152
+ A schema object ferro may reconcile to match the declared model. Indexes and constraints are ferro-owned by naming (`idx_`, `uq_`, `fk_`, `ck_`); native enum types are ferro-owned by derivation — the type's name matches the name ferro derives from the model. A generated revision owns an enum type a third way, by provenance: it introduces every column of the type, so its downgrade drops the type (see *Type drop*); a type it adds a column of but does not introduce is one it reuses, never creates (see *Type reuse*). Artifacts owned none of these ways belong to the user and are never altered or dropped.
153
153
  _Avoid_: Managed index, system constraint, internal index
154
154
 
155
155
  **Enum label**:
@@ -160,6 +160,18 @@ _Avoid_: Enum value, variant, choice
160
160
  The reconciliation-pass operation appending model-declared labels missing from a live ferro-owned enum type. Append-only and metadata-only: rows are never touched, and labels the database has but the model lacks are warned about loudly and never removed — removal and rename are reviewed-migration territory.
161
161
  _Avoid_: Enum sync, label reconciliation, enum evolution
162
162
 
163
+ **Type drop**:
164
+ The reverse of a generated revision's creation of a native enum type — inline with `create_table`, or by *Type creation* when only `add_column`s carry it: the `DROP TYPE` the revision's `downgrade()` emits, after its last `drop_table` and `drop_column`, for each native enum type the revision introduces — every column declaring it is one the revision adds, and none is one the downgrade puts back. Decided from the revision alone, never from the live catalog; the type is the revision's by provenance, not derivation (ADR-0020). Alembic core has no operation for either direction; ferro's bridge supplies the drop, and the creation for the `add_column`-only shape, so a downgrade leaves no type behind and an upgrade finds every type it needs.
165
+ _Avoid_: Enum cleanup, type teardown, cascade drop
166
+
167
+ **Type creation**:
168
+ The `CREATE TYPE` a generated revision's `upgrade()` executes, ahead of its table operations, for a native enum type it introduces (see *Type drop*) that no `create_table` of the revision carries — every column of it is an `add_column`, and SQLAlchemy creates a named enum type inline with `create_table` only. It is the runtime create pass's guarded statement, rendered by the same function, so both migration doors run the same SQL for the same model; a type a `create_table` carries is created inline by SQLAlchemy and gets no statement. The second axis of the one type-provenance decision (ADR-0022).
169
+ _Avoid_: Explicit enum create, add_column type fix, pre-create
170
+
171
+ **Type reuse**:
172
+ A generated revision's use of a native enum type it does not introduce — a column the revision adds declares it, but so does a column the downgrade leaves standing or puts back — so the type already lives on every database the revision can run against. The revision's `create_table` columns of that type render as `postgresql.ENUM(..., create_type=False)` (through the bridge's `render_item` hook, since SQLAlchemy's `repr` omits the flag) and no `DROP TYPE` is emitted. The other verdict of the one type-provenance decision that also decides the type drop, made from the revision alone (ADR-0021).
173
+ _Avoid_: Shared type, existing type, live-type exclusion
174
+
163
175
  **Constraint rebuild**:
164
176
  Drop-and-recreate of a ferro-owned constraint whose live definition no longer matches the declared model — a foreign key's `on_delete`, its target, its columns, or a table check's predicate. Metadata-only: rows are never touched. On a backend that cannot alter constraints, ferro warns loudly and skips; it never diverges silently.
165
177
  _Avoid_: Constraint alter, FK patch, in-place constraint update
@@ -46,9 +46,9 @@ checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06"
46
46
 
47
47
  [[package]]
48
48
  name = "bigdecimal"
49
- version = "0.4.10"
49
+ version = "0.4.11"
50
50
  source = "registry+https://github.com/rust-lang/crates.io-index"
51
- checksum = "4d6867f1565b3aad85681f1015055b087fcfd840d6aeee6eee7f2da317603695"
51
+ checksum = "8fa3f3d8cbf4dffcfe4991de61d012bef509a409ecbe9dd41049bfe32b4d4653"
52
52
  dependencies = [
53
53
  "autocfg",
54
54
  "libm",
@@ -95,9 +95,9 @@ checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04"
95
95
 
96
96
  [[package]]
97
97
  name = "cc"
98
- version = "1.4.6"
98
+ version = "1.5.1"
99
99
  source = "registry+https://github.com/rust-lang/crates.io-index"
100
- checksum = "a3eb0f42d6c360dc3f8a821f6bf2fdea7f72bfd36b3076eb0e6d1e9e0752fff4"
100
+ checksum = "f360145194ee8e21db5ee7f3fcd4fe52210864c75c985dae33218202c8bbe040"
101
101
  dependencies = [
102
102
  "find-msvc-tools",
103
103
  "shlex",
@@ -317,7 +317,7 @@ dependencies = [
317
317
 
318
318
  [[package]]
319
319
  name = "ferro"
320
- version = "0.21.0"
320
+ version = "0.21.2"
321
321
  dependencies = [
322
322
  "chrono",
323
323
  "dashmap",
@@ -365,9 +365,9 @@ dependencies = [
365
365
 
366
366
  [[package]]
367
367
  name = "find-msvc-tools"
368
- version = "0.1.12"
368
+ version = "0.1.14"
369
369
  source = "registry+https://github.com/rust-lang/crates.io-index"
370
- checksum = "3e0f1c7c3a72c66fd80abe965175f7523475c0489a87d3ff9d6e8c87d87a9d2d"
370
+ checksum = "aedcfb3409746eddb02b9e19ebda1c3394f759a152e48ee875a0844d1b955484"
371
371
 
372
372
  [[package]]
373
373
  name = "flume"
@@ -781,9 +781,9 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
781
781
 
782
782
  [[package]]
783
783
  name = "js-sys"
784
- version = "0.3.105"
784
+ version = "0.3.106"
785
785
  source = "registry+https://github.com/rust-lang/crates.io-index"
786
- checksum = "ce57d20d1ea864ce2ac172ab472d409214f4fd359f0b2a2775abdf522e2af99e"
786
+ checksum = "7883d941dae510fb2d978fc3fe018c71c9e2892fd38854de3e8b92c2e5ad9cc5"
787
787
  dependencies = [
788
788
  "cfg-if",
789
789
  "futures-util",
@@ -813,9 +813,9 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"
813
813
 
814
814
  [[package]]
815
815
  name = "libredox"
816
- version = "0.1.24"
816
+ version = "0.1.25"
817
817
  source = "registry+https://github.com/rust-lang/crates.io-index"
818
- checksum = "6480ccc157a1389bb2e4891b24751b0f798ba640d22386f23143fbcc89da195a"
818
+ checksum = "61ff90caf6077a803a240f62fdbe88645a890bbca49ef8174c3cb0404362171d"
819
819
  dependencies = [
820
820
  "bitflags",
821
821
  "libc",
@@ -1427,9 +1427,9 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
1427
1427
 
1428
1428
  [[package]]
1429
1429
  name = "smallvec"
1430
- version = "1.16.1"
1430
+ version = "1.16.2"
1431
1431
  source = "registry+https://github.com/rust-lang/crates.io-index"
1432
- checksum = "ba467056f1b547ed52077911161fc86985becbc60e8e1857c8a144dab0def891"
1432
+ checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e"
1433
1433
  dependencies = [
1434
1434
  "serde",
1435
1435
  ]
@@ -1729,18 +1729,18 @@ checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca"
1729
1729
 
1730
1730
  [[package]]
1731
1731
  name = "thiserror"
1732
- version = "2.0.20"
1732
+ version = "2.0.21"
1733
1733
  source = "registry+https://github.com/rust-lang/crates.io-index"
1734
- checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f"
1734
+ checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e"
1735
1735
  dependencies = [
1736
1736
  "thiserror-impl",
1737
1737
  ]
1738
1738
 
1739
1739
  [[package]]
1740
1740
  name = "thiserror-impl"
1741
- version = "2.0.20"
1741
+ version = "2.0.21"
1742
1742
  source = "registry+https://github.com/rust-lang/crates.io-index"
1743
- checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af"
1743
+ checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524"
1744
1744
  dependencies = [
1745
1745
  "proc-macro2",
1746
1746
  "quote",
@@ -1848,9 +1848,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5"
1848
1848
 
1849
1849
  [[package]]
1850
1850
  name = "unicode-ident"
1851
- version = "1.0.25"
1851
+ version = "1.0.26"
1852
1852
  source = "registry+https://github.com/rust-lang/crates.io-index"
1853
- checksum = "ab72a15cf68d77cb0987d3684aa8a45c5ef827e8cb49ee2f30bfd7ba2feb519f"
1853
+ checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954"
1854
1854
 
1855
1855
  [[package]]
1856
1856
  name = "unicode-normalization"
@@ -1934,9 +1934,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b"
1934
1934
 
1935
1935
  [[package]]
1936
1936
  name = "wasm-bindgen"
1937
- version = "0.2.128"
1937
+ version = "0.2.129"
1938
1938
  source = "registry+https://github.com/rust-lang/crates.io-index"
1939
- checksum = "aecb87a33d3b0c5e3b7aa46336eaf486cffafbd281b195e4c8b80d50df2351bf"
1939
+ checksum = "9bb54f33acc68fd454578d9820b0bde1a1a3d17aa17bb7b6595806d02886d409"
1940
1940
  dependencies = [
1941
1941
  "cfg-if",
1942
1942
  "once_cell",
@@ -1947,9 +1947,9 @@ dependencies = [
1947
1947
 
1948
1948
  [[package]]
1949
1949
  name = "wasm-bindgen-macro"
1950
- version = "0.2.128"
1950
+ version = "0.2.129"
1951
1951
  source = "registry+https://github.com/rust-lang/crates.io-index"
1952
- checksum = "a690d511e3c1a8b3a55e33511e3c2c00c78415cd23650f32b808627f5696b9ed"
1952
+ checksum = "2e29d0c35b16e224a7eeb5cd2d25e3e1968fbd65604117b44d3b789d00ee8535"
1953
1953
  dependencies = [
1954
1954
  "quote",
1955
1955
  "wasm-bindgen-macro-support",
@@ -1957,9 +1957,9 @@ dependencies = [
1957
1957
 
1958
1958
  [[package]]
1959
1959
  name = "wasm-bindgen-macro-support"
1960
- version = "0.2.128"
1960
+ version = "0.2.129"
1961
1961
  source = "registry+https://github.com/rust-lang/crates.io-index"
1962
- checksum = "411e4887f0071ef2d2164a9d5fdf2d20efbef78fccd3a78b0c10a1dc5295e48a"
1962
+ checksum = "6f501a8bc3719dba86ef8ae4728879c08001bea749eb1333ac5b91e040e2a6b7"
1963
1963
  dependencies = [
1964
1964
  "bumpalo",
1965
1965
  "proc-macro2",
@@ -1970,9 +1970,9 @@ dependencies = [
1970
1970
 
1971
1971
  [[package]]
1972
1972
  name = "wasm-bindgen-shared"
1973
- version = "0.2.128"
1973
+ version = "0.2.129"
1974
1974
  source = "registry+https://github.com/rust-lang/crates.io-index"
1975
- checksum = "81941cd78d0c92026c33e5e01312845a4cb1e9af3407f9134b100dd03144103e"
1975
+ checksum = "23f0c9c52aa7cd7d77769a4cfe2a9adb1b331f489a41d912ce14513d5ab995c6"
1976
1976
  dependencies = [
1977
1977
  "unicode-ident",
1978
1978
  ]
@@ -2243,18 +2243,18 @@ dependencies = [
2243
2243
 
2244
2244
  [[package]]
2245
2245
  name = "zerocopy"
2246
- version = "0.8.57"
2246
+ version = "0.8.59"
2247
2247
  source = "registry+https://github.com/rust-lang/crates.io-index"
2248
- checksum = "d35102a9f36d089ccae9e4c6802bc118be4487b80aaffc0ab4e0cf5ce92d2873"
2248
+ checksum = "6df92bf3d9227be3d53173901ddbffac2babc27ae50f397776ffd6dc33f800cb"
2249
2249
  dependencies = [
2250
2250
  "zerocopy-derive",
2251
2251
  ]
2252
2252
 
2253
2253
  [[package]]
2254
2254
  name = "zerocopy-derive"
2255
- version = "0.8.57"
2255
+ version = "0.8.59"
2256
2256
  source = "registry+https://github.com/rust-lang/crates.io-index"
2257
- checksum = "146c01f5ab44258da43cf276c74a2763db2ff3969c9c652c3f2de07041d0b2bc"
2257
+ checksum = "ac4f328cf2f05d084e496c3e9c3f33ed0a183656a16e1fcec4d464d8373aec82"
2258
2258
  dependencies = [
2259
2259
  "proc-macro2",
2260
2260
  "quote",
@@ -3,7 +3,7 @@ members = ["crates/ferro-schema-ir", "crates/ferro-ddl-lowering", "crates/ferro-
3
3
 
4
4
  [package]
5
5
  name = "ferro"
6
- version = "0.21.0"
6
+ version = "0.21.2"
7
7
  edition = "2024"
8
8
  readme = "README.md"
9
9
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ferro-orm
3
- Version: 0.21.0
3
+ Version: 0.21.2
4
4
  Requires-Dist: pydantic>=2.0
5
5
  Requires-Dist: alembic>=1.18.1 ; extra == 'alembic'
6
6
  Requires-Dist: sqlalchemy>=2.0.46 ; extra == 'alembic'