ferro-orm 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 (402) hide show
  1. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/AGENTS.md +40 -2
  2. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/CHANGELOG.md +14 -0
  3. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/CONTEXT.md +13 -1
  4. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/Cargo.lock +87 -86
  5. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/Cargo.toml +1 -1
  6. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/PKG-INFO +1 -1
  7. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/crates/ferro-ddl-lowering/src/lib.rs +1007 -1
  8. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/crates/ferro-migrate/src/emit.rs +99 -3
  9. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/crates/ferro-migrate/src/lib.rs +142 -1
  10. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/crates/ferro-migrate/src/tests.rs +477 -1
  11. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/crates/ferro-schema-ir/src/lib.rs +143 -0
  12. ferro_orm-0.19.0/docs/adr/0012-table-checks-are-lambdas.md +12 -0
  13. ferro_orm-0.19.0/docs/adr/0013-table-check-reconciliation.md +12 -0
  14. ferro_orm-0.19.0/docs/adr/0014-table-checks-sqlite-create-only.md +11 -0
  15. ferro_orm-0.19.0/docs/adr/0015-table-check-body-drift.md +11 -0
  16. ferro_orm-0.19.0/docs/adr/0016-check-predicates-literals-only.md +11 -0
  17. ferro_orm-0.19.0/docs/examples/table_checks.py +45 -0
  18. ferro_orm-0.19.0/docs/examples/table_checks_annotated.py +42 -0
  19. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/api/exceptions.md +18 -0
  20. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/guide/migrations.md +7 -0
  21. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/guide/models-and-fields.md +32 -0
  22. ferro_orm-0.19.0/docs/solutions/issues/pg18-restrict-sqlstate-23001.md +33 -0
  23. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/pyproject.toml +1 -1
  24. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/errors.rs +87 -7
  25. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/ferro/__init__.py +2 -0
  26. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/ferro/_core.pyi +60 -1
  27. ferro_orm-0.19.0/src/ferro/checks.py +609 -0
  28. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/ferro/exceptions.py +6 -1
  29. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/ferro/ir/compiler.py +55 -0
  30. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/ferro/migrations/alembic.py +254 -0
  31. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/ferro/models.py +12 -0
  32. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/introspect.rs +338 -0
  33. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/lib.rs +7 -1
  34. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/migrate.rs +93 -9
  35. ferro_orm-0.19.0/src/naming_ffi.rs +241 -0
  36. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/schema.rs +11 -3
  37. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/state.rs +1 -0
  38. ferro_orm-0.19.0/tests/test_check_predicate_dialect.py +348 -0
  39. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_exception_mapping.py +65 -0
  40. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_generation_counter_dirty_tracking.py +2 -10
  41. ferro_orm-0.19.0/tests/test_live_table_checks.py +74 -0
  42. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_naming_single_source.py +19 -0
  43. ferro_orm-0.19.0/tests/test_table_check_orphans.py +546 -0
  44. ferro_orm-0.19.0/tests/test_table_check_rebuild.py +532 -0
  45. ferro_orm-0.19.0/tests/test_table_check_reconcile.py +514 -0
  46. ferro_orm-0.19.0/tests/test_table_checks.py +599 -0
  47. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/uv.lock +1 -1
  48. ferro_orm-0.18.0/src/naming_ffi.rs +0 -115
  49. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  50. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  51. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/.github/PERMISSIONS.md +0 -0
  52. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/.github/PYPI_CHECKLIST.md +0 -0
  53. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/.github/PYPI_SETUP.md +0 -0
  54. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/.github/generated/wheels.generated.yml +0 -0
  55. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/.github/pull_request_template.md +0 -0
  56. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/.github/workflows/ci.yml +0 -0
  57. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/.github/workflows/packaging-smoke.yml +0 -0
  58. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/.github/workflows/publish-docs.yml +0 -0
  59. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/.github/workflows/publish.yml +0 -0
  60. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/.github/workflows/release.yml +0 -0
  61. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/.gitignore +0 -0
  62. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/.pre-commit-config.yaml +0 -0
  63. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/.python-version +0 -0
  64. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/CONTRIBUTING.md +0 -0
  65. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/LICENSE +0 -0
  66. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/README.md +0 -0
  67. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/benchmarks/README.md +0 -0
  68. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/benchmarks/__init__.py +0 -0
  69. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/benchmarks/__main__.py +0 -0
  70. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/benchmarks/backends.py +0 -0
  71. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/benchmarks/baselines/postgres.json +0 -0
  72. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/benchmarks/baselines/sqlite.json +0 -0
  73. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/benchmarks/compare.py +0 -0
  74. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/benchmarks/harness.py +0 -0
  75. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/benchmarks/model.py +0 -0
  76. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/benchmarks/run.py +0 -0
  77. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/crates/ferro-ddl-lowering/Cargo.toml +0 -0
  78. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/crates/ferro-migrate/Cargo.toml +0 -0
  79. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/crates/ferro-migrate/src/order.rs +0 -0
  80. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/crates/ferro-schema-ir/Cargo.toml +0 -0
  81. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/adr/0001-resolved-epoch-registration.md +0 -0
  82. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/adr/0002-unified-column-fact-derivation.md +0 -0
  83. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/adr/0003-path-blind-db-type-validation.md +0 -0
  84. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/adr/0004-jsonb-postgres-only-canonical.md +0 -0
  85. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/adr/0005-jsonb-default-on-postgres.md +0 -0
  86. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/adr/0006-relation-traversal-inner-joins.md +0 -0
  87. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/adr/0007-materialization-plan-complete-instances.md +0 -0
  88. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/adr/0007-reverse-relations-tested-not-traversed.md +0 -0
  89. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/adr/0008-populated-relations-include.md +0 -0
  90. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/adr/0008-predicate-negation-uniform-not.md +0 -0
  91. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/adr/0009-aggregate-projections-derived-grouping.md +0 -0
  92. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/adr/0010-create-pass-owns-only-missing-tables.md +0 -0
  93. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/adr/0011-label-addition-update-gated-append-only.md +0 -0
  94. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/agents/domain.md +0 -0
  95. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/agents/issue-tracker.md +0 -0
  96. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/agents/triage-labels.md +0 -0
  97. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/architecture-review-2026-07-08.html +0 -0
  98. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/brainstorms/2026-04-29-named-connections-role-routing-requirements.md +0 -0
  99. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/brainstorms/2026-05-08-typed-query-predicates-requirements.md +0 -0
  100. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/brainstorms/2026-05-13-configurable-column-storage-types-requirements.md +0 -0
  101. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/brainstorms/2026-05-14-autogenerate-support-for-db-type-requirements.md +0 -0
  102. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/brainstorms/2026-05-25-annotated-strenum-cold-hydration-requirements.md +0 -0
  103. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/brainstorms/2026-06-24-ir-p8-119-wire-automigrate-requirements.md +0 -0
  104. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/brainstorms/2026-06-25-ir-p8-120-parity-gate-requirements.md +0 -0
  105. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/brainstorms/2026-06-26-ir-p8.5-140-shared-lowering-requirements.md +0 -0
  106. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/brainstorms/2026-06-26-ir-p8.5-143-db-type-drop-requirements.md +0 -0
  107. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/brainstorms/2026-06-26-ir-p8.5-144-reconcile-indexes-requirements.md +0 -0
  108. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/brainstorms/2026-06-28-ir-p8.5-141-single-schema-ir-producer-requirements.md +0 -0
  109. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/brainstorms/2026-06-29-ir-p8.6-146-dialect-enum-unification-requirements.md +0 -0
  110. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/brainstorms/2026-06-29-ir-p8.6-153-create-path-ir-requirements.md +0 -0
  111. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/brainstorms/2026-06-30-ir-p8.6-155-deferred-annotations-requirements.md +0 -0
  112. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/brainstorms/2026-06-30-ir-p8.6-158-check-renderer-requirements.md +0 -0
  113. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/brainstorms/2026-07-01-ir-p8.6-154-datetime-tz-coarseness-requirements.md +0 -0
  114. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/brainstorms/2026-07-01-ir-p8.6-162-typed-save-bind-requirements.md +0 -0
  115. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/brainstorms/2026-07-01-ir-p8.6-165-blob-introspection-false-positive-requirements.md +0 -0
  116. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/brainstorms/2026-07-02-ff-c1-codec-plan-design.md +0 -0
  117. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/brainstorms/2026-07-06-upgrade-guide-consolidation-requirements.md +0 -0
  118. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/examples/aggregations.py +0 -0
  119. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/examples/aggregations_annotated.py +0 -0
  120. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/examples/existence_tests.py +0 -0
  121. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/examples/existence_tests_annotated.py +0 -0
  122. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/examples/multiple_databases.py +0 -0
  123. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/examples/mutations.py +0 -0
  124. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/examples/pagination.py +0 -0
  125. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/examples/partial_selects.py +0 -0
  126. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/examples/partial_selects_annotated.py +0 -0
  127. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/examples/populated_relations.py +0 -0
  128. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/examples/populated_relations_annotated.py +0 -0
  129. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/examples/predicates.py +0 -0
  130. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/examples/predicates_annotated.py +0 -0
  131. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/examples/quickstart.py +0 -0
  132. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/examples/quickstart_annotated.py +0 -0
  133. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/examples/raw_sql.py +0 -0
  134. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/examples/relationships.py +0 -0
  135. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/examples/relationships_annotated.py +0 -0
  136. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/examples/soft_deletes.py +0 -0
  137. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/examples/soft_deletes_annotated.py +0 -0
  138. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/examples/testing_conftest.py +0 -0
  139. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/examples/timestamps.py +0 -0
  140. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/examples/timestamps_annotated.py +0 -0
  141. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/examples/transactions.py +0 -0
  142. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/examples/traversal.py +0 -0
  143. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/examples/traversal_annotated.py +0 -0
  144. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/api/connection.md +0 -0
  145. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/api/fields.md +0 -0
  146. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/api/migrations.md +0 -0
  147. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/api/model.md +0 -0
  148. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/api/queries.md +0 -0
  149. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/api/raw-sql.md +0 -0
  150. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/api/relationships.md +0 -0
  151. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/api/transactions.md +0 -0
  152. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/changelog.md +0 -0
  153. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/concepts/architecture.md +0 -0
  154. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/concepts/backends.md +0 -0
  155. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/concepts/identity-map.md +0 -0
  156. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/concepts/performance.md +0 -0
  157. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/concepts/query-typing.md +0 -0
  158. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/concepts/type-safety.md +0 -0
  159. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/contributing.md +0 -0
  160. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/faq.md +0 -0
  161. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/getting-started/installation.md +0 -0
  162. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/getting-started/next-steps.md +0 -0
  163. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/getting-started/quickstart.md +0 -0
  164. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/guide/aggregations.md +0 -0
  165. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/guide/connections.md +0 -0
  166. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/guide/mutations.md +0 -0
  167. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/guide/queries.md +0 -0
  168. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/guide/raw-sql.md +0 -0
  169. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/guide/relationships.md +0 -0
  170. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/guide/transactions.md +0 -0
  171. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/howto/migrate-from-sqlalchemy.md +0 -0
  172. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/howto/multiple-databases.md +0 -0
  173. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/howto/pagination.md +0 -0
  174. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/howto/soft-deletes.md +0 -0
  175. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/howto/testing.md +0 -0
  176. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/howto/timestamps.md +0 -0
  177. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/howto/upgrade-guide.md +0 -0
  178. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/index.md +0 -0
  179. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/roadmap.md +0 -0
  180. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/stylesheets/extra.css +0 -0
  181. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/pages/why-ferro.md +0 -0
  182. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-04-24-001-refactor-multi-db-backend-architecture-plan.md +0 -0
  183. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-04-29-001-typed-null-binds-plan.md +0 -0
  184. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-04-29-002-feat-named-connections-plan.md +0 -0
  185. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-05-07-001-refactor-generic-model-connection-plan.md +0 -0
  186. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-05-08-001-feat-typed-query-predicates-plan.md +0 -0
  187. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-05-13-001-feat-configurable-column-storage-types-plan.md +0 -0
  188. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-05-25-001-fix-annotated-strenum-cold-hydration-plan.md +0 -0
  189. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-06-19-001-ir-first-roadmap.md +0 -0
  190. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-06-24-001-feat-ir-p8-119-wire-automigrate-plan.md +0 -0
  191. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-06-25-001-feat-ir-p8-120-parity-gate-plan.md +0 -0
  192. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-06-26-001-feat-ir-p8.5-140-shared-lowering-plan.md +0 -0
  193. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-06-26-002-feat-ir-p8.5-143-db-type-drop-plan.md +0 -0
  194. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-06-26-003-feat-ir-p8.5-144-reconcile-indexes-plan.md +0 -0
  195. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-06-28-001-feat-ir-p8.5-141-single-schema-ir-producer-plan.md +0 -0
  196. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-06-29-001-refactor-ir-p8.6-153-create-path-unification-plan.md +0 -0
  197. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-06-29-002-refactor-ir-p8.6-146-dialect-enum-unification-plan.md +0 -0
  198. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-06-30-001-refactor-ir-p8.6-158-check-renderer-plan.md +0 -0
  199. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-06-30-002-fix-ir-p8.6-155-deferred-annotations-plan.md +0 -0
  200. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-07-01-001-feat-ir-p8.6-162-typed-save-bind-plan.md +0 -0
  201. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-07-01-002-fix-ir-p8.6-154-datetime-tz-coarseness-plan.md +0 -0
  202. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-07-01-003-fix-ir-p8.6-165-blob-introspection-plan.md +0 -0
  203. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-07-02-001-fable-fixes-roadmap.md +0 -0
  204. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-07-02-002-feat-ff-a-172-typed-exceptions-plan.md +0 -0
  205. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-07-02-003-ff-c-native-decode-design.md +0 -0
  206. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-07-02-004-ff-c-c2-catalog-cache-design.md +0 -0
  207. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-07-02-005-ff-d-identity-routing-design.md +0 -0
  208. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-07-02-006-ff-d-identity-routing-plan.md +0 -0
  209. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-07-03-007-ff-e-registry-identity-design.md +0 -0
  210. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-07-03-008-ff-e-registry-identity-plan.md +0 -0
  211. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-07-06-009-ff-f-query-builder-1.0-design.md +0 -0
  212. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-07-06-010-ff-f-query-builder-1.0-plan.md +0 -0
  213. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-07-06-011-ff-g-hardening-design.md +0 -0
  214. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-07-06-012-ff-g-hardening-plan.md +0 -0
  215. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-07-06-013-ff-g2-operations-dedup-design.md +0 -0
  216. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-07-06-014-ff-g2-operations-dedup-plan.md +0 -0
  217. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-07-06-015-docs-upgrade-guide-consolidation-plan.md +0 -0
  218. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/2026-07-18-016-existence-tests-design.md +0 -0
  219. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/ir-first-migration-guide.md +0 -0
  220. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/plans/ir-first-release-checklist.md +0 -0
  221. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/rfc/ir-contracts-v1.md +0 -0
  222. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/solutions/README.md +0 -0
  223. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/solutions/architecture-patterns/ir-first-lowering-consolidation-audit.md +0 -0
  224. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/solutions/architecture-patterns/ir-first-merge-readiness-review.md +0 -0
  225. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/solutions/issues/pydantic-slots-missing-after-ferro-hydration.md +0 -0
  226. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/solutions/issues/python-3.14-deferred-annotation-typeerror-swallow.md +0 -0
  227. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/solutions/issues/sa-pk-column-nullable-divergence.md +0 -0
  228. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/solutions/issues/sa-vs-rust-unique-constraint-shape.md +0 -0
  229. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/solutions/issues/self-fk-evicts-component-from-create-order.md +0 -0
  230. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/solutions/issues/sqlite-integer-decimal-hydrates-as-none.md +0 -0
  231. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/solutions/issues/sqlite-null-hydrates-as-int-zero.md +0 -0
  232. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/solutions/issues/typed-where-null-panics-is-null.md +0 -0
  233. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/solutions/patterns/configurable-column-storage-types.md +0 -0
  234. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/solutions/patterns/cross-emitter-ddl-parity.md +0 -0
  235. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/solutions/patterns/ddl-on-live-engine.md +0 -0
  236. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/solutions/patterns/derived-type-and-naming-decision-table.md +0 -0
  237. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/solutions/patterns/foreign-key-index.md +0 -0
  238. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/solutions/patterns/index-unique-redundancy.md +0 -0
  239. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/solutions/patterns/ir-invariants.md +0 -0
  240. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/solutions/patterns/persistence-state.md +0 -0
  241. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/solutions/patterns/shadow-fk-columns.md +0 -0
  242. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/solutions/patterns/sqlite-alembic-reconnect-hydration-tests.md +0 -0
  243. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/docs/solutions/patterns/typed-null-binds.md +0 -0
  244. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/justfile +0 -0
  245. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/scripts/demo_queries.py +0 -0
  246. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/scripts/demo_queries_pre_v012.py +0 -0
  247. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/backend.rs +0 -0
  248. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/codec.rs +0 -0
  249. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/codec_plan.rs +0 -0
  250. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/connection.rs +0 -0
  251. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/ferro/_annotation_utils.py +0 -0
  252. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/ferro/_bind_payload.py +0 -0
  253. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/ferro/_deprecations.py +0 -0
  254. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/ferro/_shadow_fk_types.py +0 -0
  255. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/ferro/base.py +0 -0
  256. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/ferro/columns.py +0 -0
  257. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/ferro/composite_indexes.py +0 -0
  258. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/ferro/composite_uniques.py +0 -0
  259. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/ferro/fields.py +0 -0
  260. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/ferro/ir/__init__.py +0 -0
  261. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/ferro/metaclass.py +0 -0
  262. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/ferro/migrations/__init__.py +0 -0
  263. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/ferro/py.typed +0 -0
  264. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/ferro/query/__init__.py +0 -0
  265. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/ferro/query/builder.py +0 -0
  266. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/ferro/query/nodes.py +0 -0
  267. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/ferro/query/rows.py +0 -0
  268. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/ferro/query/wire.py +0 -0
  269. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/ferro/raw.py +0 -0
  270. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/ferro/registry.py +0 -0
  271. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/ferro/relations/__init__.py +0 -0
  272. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/ferro/relations/descriptors.py +0 -0
  273. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/ferro/session.py +0 -0
  274. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/ferro/state.py +0 -0
  275. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/hydration.rs +0 -0
  276. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/operations.rs +0 -0
  277. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/query.rs +0 -0
  278. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/src/schema_bind.rs +0 -0
  279. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/__init__.py +0 -0
  280. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/conftest.py +0 -0
  281. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/db_backends.py +0 -0
  282. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/fixtures/ir_vectors/README.md +0 -0
  283. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/fixtures/ir_vectors/codec_registry_core_v1.json +0 -0
  284. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/fixtures/ir_vectors/query_account_exists_v7.json +0 -0
  285. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/fixtures/ir_vectors/query_account_scoped_exists_v7.json +0 -0
  286. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/fixtures/ir_vectors/query_owner_nested_exists_v7.json +0 -0
  287. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/fixtures/ir_vectors/query_owner_not_exists_v7.json +0 -0
  288. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/fixtures/ir_vectors/query_transaction_aggregate_v7.json +0 -0
  289. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/fixtures/ir_vectors/query_transaction_global_aggregate_v7.json +0 -0
  290. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/fixtures/ir_vectors/query_transaction_include_v7.json +0 -0
  291. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/fixtures/ir_vectors/query_transaction_left_join_v7.json +0 -0
  292. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/fixtures/ir_vectors/query_transaction_record_v7.json +0 -0
  293. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/fixtures/ir_vectors/query_transaction_traversal_v7.json +0 -0
  294. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/fixtures/ir_vectors/query_transaction_traversed_record_v7.json +0 -0
  295. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/fixtures/ir_vectors/query_user_compound_v7.json +0 -0
  296. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/fixtures/ir_vectors/query_user_m2m_exists_v7.json +0 -0
  297. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/fixtures/ir_vectors/query_user_not_compound_v7.json +0 -0
  298. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/fixtures/ir_vectors/query_user_not_leaf_v7.json +0 -0
  299. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/fixtures/ir_vectors/schema_invoice_baseline_v1.json +0 -0
  300. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/fixtures/ir_vectors/schema_phase1_fixture_models_v1.json +0 -0
  301. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/fixtures/ir_vectors/schema_raw_str_pk_autoincrement_v1.json +0 -0
  302. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/static_fixtures/bad_includes.py +0 -0
  303. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/static_fixtures/bad_predicates.py +0 -0
  304. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/static_fixtures/bad_projections.py +0 -0
  305. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/static_fixtures/good_includes.py +0 -0
  306. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/static_fixtures/good_predicates.py +0 -0
  307. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/static_fixtures/good_projections.py +0 -0
  308. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_aggregation.py +0 -0
  309. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_alembic_autogenerate.py +0 -0
  310. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_alembic_bridge.py +0 -0
  311. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_alembic_db_type.py +0 -0
  312. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_alembic_nullability.py +0 -0
  313. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_alembic_type_mapping.py +0 -0
  314. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_annotation_utils.py +0 -0
  315. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_auto_migrate.py +0 -0
  316. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_bulk_create_chunking.py +0 -0
  317. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_bulk_install.py +0 -0
  318. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_bulk_update.py +0 -0
  319. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_catalog_cache.py +0 -0
  320. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_codec_plan.py +0 -0
  321. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_column_specs.py +0 -0
  322. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_compiled_query.py +0 -0
  323. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_composite_index.py +0 -0
  324. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_composite_unique.py +0 -0
  325. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_connection.py +0 -0
  326. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_connection_redaction.py +0 -0
  327. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_constraints.py +0 -0
  328. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_cross_emitter_parity.py +0 -0
  329. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_crud.py +0 -0
  330. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_db_backends.py +0 -0
  331. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_db_type_cross_emitter_parity.py +0 -0
  332. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_db_type_integration.py +0 -0
  333. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_db_type_typing.py +0 -0
  334. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_db_type_validation.py +0 -0
  335. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_deletion.py +0 -0
  336. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_deprecations.py +0 -0
  337. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_docs_examples.py +0 -0
  338. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_documentation_features.py +0 -0
  339. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_enum_cold_hydration.py +0 -0
  340. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_exceptions.py +0 -0
  341. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_field_wrapper.py +0 -0
  342. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_fk_target_pk.py +0 -0
  343. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_global_aggregates.py +0 -0
  344. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_grouped_aggregates.py +0 -0
  345. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_helpers.py +0 -0
  346. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_hydration.py +0 -0
  347. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_hydration_equivalence.py +0 -0
  348. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_identity_memory.py +0 -0
  349. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_identity_refresh.py +0 -0
  350. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_identity_scoped_invalidation.py +0 -0
  351. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_identity_weakref.py +0 -0
  352. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_import_budget.py +0 -0
  353. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_include.py +0 -0
  354. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_ir_vectors_contract.py +0 -0
  355. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_label_addition.py +0 -0
  356. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_metaclass_internals.py +0 -0
  357. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_metadata.py +0 -0
  358. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_migrate_plan.py +0 -0
  359. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_model_identity.py +0 -0
  360. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_models.py +0 -0
  361. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_mutation_pagination_guard.py +0 -0
  362. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_named_connections_integration.py +0 -0
  363. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_negation.py +0 -0
  364. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_one_to_one.py +0 -0
  365. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_operation_seam_sync.py +0 -0
  366. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_partial_selects.py +0 -0
  367. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_primary_key_facts.py +0 -0
  368. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_provisional_import.py +0 -0
  369. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_query_builder.py +0 -0
  370. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_query_column_validation.py +0 -0
  371. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_query_exists.py +0 -0
  372. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_query_immutability.py +0 -0
  373. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_query_joins.py +0 -0
  374. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_query_typing.py +0 -0
  375. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_query_wire_vectors.py +0 -0
  376. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_raw_sql.py +0 -0
  377. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_refresh.py +0 -0
  378. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_registry_entrypoints.py +0 -0
  379. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_registry_owner.py +0 -0
  380. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_relation_specs.py +0 -0
  381. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_relationship_engine.py +0 -0
  382. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_relationship_resolution_errors.py +0 -0
  383. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_route_single_site.py +0 -0
  384. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_routing_errors.py +0 -0
  385. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_save_pk_edges.py +0 -0
  386. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_save_semantics.py +0 -0
  387. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_schema.py +0 -0
  388. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_schema_constraints.py +0 -0
  389. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_schema_db_type_metadata.py +0 -0
  390. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_schema_enum_annotations.py +0 -0
  391. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_session.py +0 -0
  392. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_shadow_fk_types.py +0 -0
  393. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_sqlite_alembic_reconnect_hydration.py +0 -0
  394. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_static_contracts.py +0 -0
  395. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_string_search.py +0 -0
  396. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_structural_types.py +0 -0
  397. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_temporal_types.py +0 -0
  398. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_transactions.py +0 -0
  399. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_traversed_projection.py +0 -0
  400. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_typed_null_binds.py +0 -0
  401. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/tests/test_typed_save_bind.py +0 -0
  402. {ferro_orm-0.18.0 → ferro_orm-0.19.0}/zensical.toml +0 -0
@@ -46,8 +46,11 @@ For a single model, every emitter must agree on:
46
46
  `docs/solutions/patterns/derived-type-and-naming-decision-table.md`.
47
47
  7. **Primary key constraint names** — when explicitly named.
48
48
  8. **Check constraint names** — `ck_<table>_<col>` for the single-column
49
- `db_check=True` constraint; generated by `_ck_constraint_name` (Python)
50
- and `db_check_constraint_name` (Rust).
49
+ `db_check=True` constraint; `ck_<table>_<suffix>` for table checks declared
50
+ in `__ferro_checks__`. Column checks use `_ddl_check_constraint_name`
51
+ (Python) and `db_check_constraint_name` (Rust); table checks use
52
+ `_ddl_table_check_constraint_name` (Python) and
53
+ `table_check_constraint_name` (Rust).
51
54
  9. **Default values** — server-side defaults must serialize identically.
52
55
  10. **Nullability** — must agree.
53
56
  11. **Enum label additions** — the label-addition decision (which model-declared
@@ -60,6 +63,41 @@ For a single model, every emitter must agree on:
60
63
  executes the byte-identical statements. Pinned by
61
64
  `tests/test_cross_emitter_parity.py` and the ferro-ddl-lowering unit pins.
62
65
  See ADR-0011 (append-only; update-gated; warn-never-act for extras).
66
+ 12. **Check additions** — the missing-check decision (which declared `ck_*`
67
+ names — table checks, then column checks — a live table does not carry)
68
+ and the rendered ADD are decided by ONE pair of functions:
69
+ `ferro_ddl_lowering::missing_check_names` / `render_check_addition`.
70
+ The auto-migrate reconciliation pass consumes them through
71
+ `ferro_migrate::plan_missing_checks`; the Alembic autogenerate
72
+ comparator consumes them over FFI (`_core._plan_check_addition`) and
73
+ executes the byte-identical statements. Pinned by
74
+ `tests/test_table_check_reconcile.py`. See ADR-0013 (add on
75
+ `migrate_updates`; name-only comparison) and ADR-0014 (SQLite warn-skip).
76
+ 13. **Check rebuilds** — the same-name body-drift decision (which declared
77
+ `ck_*` names exist live **and** whose catalog definition normalizes
78
+ unequal to the canonical rendering) and the rendered DROP + bare ADD
79
+ are decided by ONE pair of functions:
80
+ `ferro_ddl_lowering::drifted_check_names` / `render_check_rebuild`
81
+ (one normalizer: `normalize_check_definition`). The auto-migrate
82
+ reconciliation pass consumes them through
83
+ `ferro_migrate::plan_check_rebuilds`; the Alembic autogenerate
84
+ comparator consumes them over FFI (`_core._plan_check_rebuild`) and
85
+ executes the byte-identical statements. Pinned by
86
+ `tests/test_table_check_rebuild.py`. See ADR-0015 (canonical render vs
87
+ catalog, both through one normalizer) and ADR-0014 (SQLite warn-skip).
88
+ 14. **Check leftovers / drops** — the leftover-name decision (which live
89
+ ferro-owned `ck_*` names a table carries that the model no longer
90
+ declares) and the rendered DROP are decided by ONE trio of functions:
91
+ `ferro_ddl_lowering::extra_check_names` /
92
+ `extra_check_names_warning` / `render_check_drop`. The auto-migrate
93
+ reconciliation pass consumes them through
94
+ `ferro_migrate::plan_check_drops` (ops only under
95
+ `migrate_destructive`; the warning always fires on `migrate_updates`).
96
+ The Alembic autogenerate comparator consumes them over FFI
97
+ (`_core._plan_check_drop`) with **no** destructive gate and executes
98
+ the byte-identical statements. Pinned by
99
+ `tests/test_table_check_orphans.py`. See ADR-0013 (leftover warning +
100
+ destructive ladder) and ADR-0014 (SQLite warn-skip).
63
101
 
64
102
  ### Why this invariant exists
65
103
 
@@ -1,6 +1,20 @@
1
1
  # CHANGELOG
2
2
 
3
3
 
4
+ ## v0.19.0 (2026-08-18)
5
+
6
+ ### Bug Fixes
7
+
8
+ - Classify PG18 RESTRICT (23001) as ForeignKeyViolationError
9
+ ([#338](https://github.com/syn54x/ferro-orm/pull/338),
10
+ [`4fa1153`](https://github.com/syn54x/ferro-orm/commit/4fa1153477802de8207c7987748db962b35c2f0f))
11
+
12
+ ### Features
13
+
14
+ - Named table-level CHECK constraints ([#356](https://github.com/syn54x/ferro-orm/pull/356),
15
+ [`ba179e7`](https://github.com/syn54x/ferro-orm/commit/ba179e71e9bce4ab77a6fdbc1831661485de6799))
16
+
17
+
4
18
  ## v0.18.0 (2026-08-05)
5
19
 
6
20
  ### Documentation
@@ -145,5 +145,17 @@ The reconciliation-pass operation appending model-declared labels missing from a
145
145
  _Avoid_: Enum sync, label reconciliation, enum evolution
146
146
 
147
147
  **Constraint rebuild**:
148
- 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. Metadata-only: rows are never touched. On a backend that cannot alter constraints, ferro warns loudly and skips; it never diverges silently.
148
+ 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.
149
149
  _Avoid_: Constraint alter, FK patch, in-place constraint update
150
+
151
+ **Column check**:
152
+ A single-column CHECK that restricts a closed-domain field to its declared labels (`Field(db_check=True)` → `col IN (...)`). Named `ck_<table>_<col>`; not a table check.
153
+ _Avoid_: enum check, db_check constraint, value check
154
+
155
+ **Table check**:
156
+ A named boolean invariant over one row of one table, declared on the model as a lambda and enforced by the database as a CHECK constraint. The live name is `ck_<table>_<suffix>`; the suffix is what the model declares.
157
+ _Avoid_: table-level check, multi-column check, composite check, row check
158
+
159
+ **Check predicate**:
160
+ The lambda body of a table check — a ferro predicate over that model's own columns (or a forward-FK null test on the relation or its shadow `*_id`), with literal values only. Relation traversal, existence tests, and aggregates are not check predicates.
161
+ _Avoid_: check SQL, constraint expression, check body
@@ -95,9 +95,9 @@ checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04"
95
95
 
96
96
  [[package]]
97
97
  name = "cc"
98
- version = "1.4.0"
98
+ version = "1.4.3"
99
99
  source = "registry+https://github.com/rust-lang/crates.io-index"
100
- checksum = "5add81bb678e6cb321aff7fa0dc7689ad82b112dbc032cea19f91d6b8e3582b9"
100
+ checksum = "509591b7bcd67f4ef775afad7662703b4935daaa6ec0e5605cfb1090b32a2b6d"
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.18.0"
320
+ version = "0.19.0"
321
321
  dependencies = [
322
322
  "chrono",
323
323
  "dashmap",
@@ -364,9 +364,9 @@ dependencies = [
364
364
 
365
365
  [[package]]
366
366
  name = "find-msvc-tools"
367
- version = "0.1.9"
367
+ version = "0.1.11"
368
368
  source = "registry+https://github.com/rust-lang/crates.io-index"
369
- checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"
369
+ checksum = "d45db016d36b838f563236e9193d0ee6ce38f3f68b6c94e914b4929c96bbb890"
370
370
 
371
371
  [[package]]
372
372
  name = "flume"
@@ -402,9 +402,9 @@ dependencies = [
402
402
 
403
403
  [[package]]
404
404
  name = "futures"
405
- version = "0.3.33"
405
+ version = "0.3.34"
406
406
  source = "registry+https://github.com/rust-lang/crates.io-index"
407
- checksum = "a88cf1f829d945f548cf8fec32c61b1f202b6d93b45848602fc02af4b12ad218"
407
+ checksum = "9a31d2a3fbaaeb2af2368bbdd904aa8e812d3c04a1ee10d3171f52d556e5d0a3"
408
408
  dependencies = [
409
409
  "futures-channel",
410
410
  "futures-core",
@@ -417,9 +417,9 @@ dependencies = [
417
417
 
418
418
  [[package]]
419
419
  name = "futures-channel"
420
- version = "0.3.33"
420
+ version = "0.3.34"
421
421
  source = "registry+https://github.com/rust-lang/crates.io-index"
422
- checksum = "262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae"
422
+ checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4"
423
423
  dependencies = [
424
424
  "futures-core",
425
425
  "futures-sink",
@@ -427,15 +427,15 @@ dependencies = [
427
427
 
428
428
  [[package]]
429
429
  name = "futures-core"
430
- version = "0.3.33"
430
+ version = "0.3.34"
431
431
  source = "registry+https://github.com/rust-lang/crates.io-index"
432
- checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7"
432
+ checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e"
433
433
 
434
434
  [[package]]
435
435
  name = "futures-executor"
436
- version = "0.3.33"
436
+ version = "0.3.34"
437
437
  source = "registry+https://github.com/rust-lang/crates.io-index"
438
- checksum = "6754879cc9f2c66f88c6e5c35344bb0bdb0708b0352b1201815667c7eabc7458"
438
+ checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432"
439
439
  dependencies = [
440
440
  "futures-core",
441
441
  "futures-task",
@@ -455,38 +455,38 @@ dependencies = [
455
455
 
456
456
  [[package]]
457
457
  name = "futures-io"
458
- version = "0.3.33"
458
+ version = "0.3.34"
459
459
  source = "registry+https://github.com/rust-lang/crates.io-index"
460
- checksum = "4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a"
460
+ checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed"
461
461
 
462
462
  [[package]]
463
463
  name = "futures-macro"
464
- version = "0.3.33"
464
+ version = "0.3.34"
465
465
  source = "registry+https://github.com/rust-lang/crates.io-index"
466
- checksum = "2d6d3cde68c518367be28956066ddfef33813991b77a55005a69dae04bf3b10b"
466
+ checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44"
467
467
  dependencies = [
468
468
  "proc-macro2",
469
469
  "quote",
470
- "syn 2.0.119",
470
+ "syn 3.0.3",
471
471
  ]
472
472
 
473
473
  [[package]]
474
474
  name = "futures-sink"
475
- version = "0.3.33"
475
+ version = "0.3.34"
476
476
  source = "registry+https://github.com/rust-lang/crates.io-index"
477
- checksum = "e34418ac499d6305c2fb5ad0ed2f6ac998c5f8ca209b4510f7f94242c647e307"
477
+ checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d"
478
478
 
479
479
  [[package]]
480
480
  name = "futures-task"
481
- version = "0.3.33"
481
+ version = "0.3.34"
482
482
  source = "registry+https://github.com/rust-lang/crates.io-index"
483
- checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109"
483
+ checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd"
484
484
 
485
485
  [[package]]
486
486
  name = "futures-util"
487
- version = "0.3.33"
487
+ version = "0.3.34"
488
488
  source = "registry+https://github.com/rust-lang/crates.io-index"
489
- checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa"
489
+ checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc"
490
490
  dependencies = [
491
491
  "futures-channel",
492
492
  "futures-core",
@@ -634,9 +634,9 @@ dependencies = [
634
634
 
635
635
  [[package]]
636
636
  name = "icu_collections"
637
- version = "2.2.0"
637
+ version = "2.3.0"
638
638
  source = "registry+https://github.com/rust-lang/crates.io-index"
639
- checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c"
639
+ checksum = "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513"
640
640
  dependencies = [
641
641
  "displaydoc",
642
642
  "potential_utf",
@@ -648,9 +648,9 @@ dependencies = [
648
648
 
649
649
  [[package]]
650
650
  name = "icu_locale_core"
651
- version = "2.2.0"
651
+ version = "2.3.0"
652
652
  source = "registry+https://github.com/rust-lang/crates.io-index"
653
- checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29"
653
+ checksum = "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb"
654
654
  dependencies = [
655
655
  "displaydoc",
656
656
  "litemap",
@@ -661,9 +661,9 @@ dependencies = [
661
661
 
662
662
  [[package]]
663
663
  name = "icu_normalizer"
664
- version = "2.2.0"
664
+ version = "2.3.0"
665
665
  source = "registry+https://github.com/rust-lang/crates.io-index"
666
- checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4"
666
+ checksum = "12f9cf5f235641ed274641dd81c3f28d870e276763d0797aeeab72317b1c646f"
667
667
  dependencies = [
668
668
  "icu_collections",
669
669
  "icu_normalizer_data",
@@ -675,16 +675,17 @@ dependencies = [
675
675
 
676
676
  [[package]]
677
677
  name = "icu_normalizer_data"
678
- version = "2.2.0"
678
+ version = "2.3.0"
679
679
  source = "registry+https://github.com/rust-lang/crates.io-index"
680
- checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38"
680
+ checksum = "1563da1ed3e0b3bf3d74c9b85917ac9c56464d2f57242270c09c9e752f8021a0"
681
681
 
682
682
  [[package]]
683
683
  name = "icu_properties"
684
- version = "2.2.0"
684
+ version = "2.3.0"
685
685
  source = "registry+https://github.com/rust-lang/crates.io-index"
686
- checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de"
686
+ checksum = "7e7ca276ad3145661a65914e6daf131ca5120cd3dcee8f8f3214b8875184a148"
687
687
  dependencies = [
688
+ "displaydoc",
688
689
  "icu_collections",
689
690
  "icu_locale_core",
690
691
  "icu_properties_data",
@@ -695,15 +696,15 @@ dependencies = [
695
696
 
696
697
  [[package]]
697
698
  name = "icu_properties_data"
698
- version = "2.2.0"
699
+ version = "2.3.0"
699
700
  source = "registry+https://github.com/rust-lang/crates.io-index"
700
- checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14"
701
+ checksum = "e590f038c1464a96894fd6d10127e90a8be4509f56ff7ecef851b15cee0b7caa"
701
702
 
702
703
  [[package]]
703
704
  name = "icu_provider"
704
- version = "2.2.0"
705
+ version = "2.3.0"
705
706
  source = "registry+https://github.com/rust-lang/crates.io-index"
706
- checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421"
707
+ checksum = "92a7ed671a6aad807a8651a2e1782a6598fda9ce5185dd8158549e95a91c6428"
707
708
  dependencies = [
708
709
  "displaydoc",
709
710
  "icu_locale_core",
@@ -779,9 +780,9 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
779
780
 
780
781
  [[package]]
781
782
  name = "js-sys"
782
- version = "0.3.103"
783
+ version = "0.3.104"
783
784
  source = "registry+https://github.com/rust-lang/crates.io-index"
784
- checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102"
785
+ checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a"
785
786
  dependencies = [
786
787
  "cfg-if",
787
788
  "futures-util",
@@ -811,14 +812,14 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"
811
812
 
812
813
  [[package]]
813
814
  name = "libredox"
814
- version = "0.1.19"
815
+ version = "0.1.20"
815
816
  source = "registry+https://github.com/rust-lang/crates.io-index"
816
- checksum = "2026a5056764a10b2bf5d56488cba40da507f5493a6a429340e2004d9ed085fa"
817
+ checksum = "28d0a00925a9f930d679b6789b721e3a7f9ed110f41b86d2497caa780c3a070a"
817
818
  dependencies = [
818
819
  "bitflags",
819
820
  "libc",
820
821
  "plain",
821
- "redox_syscall 0.9.1",
822
+ "redox_syscall 0.9.2",
822
823
  ]
823
824
 
824
825
  [[package]]
@@ -834,9 +835,9 @@ dependencies = [
834
835
 
835
836
  [[package]]
836
837
  name = "litemap"
837
- version = "0.8.2"
838
+ version = "0.8.3"
838
839
  source = "registry+https://github.com/rust-lang/crates.io-index"
839
- checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0"
840
+ checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae"
840
841
 
841
842
  [[package]]
842
843
  name = "lock_api"
@@ -917,9 +918,9 @@ dependencies = [
917
918
 
918
919
  [[package]]
919
920
  name = "num-integer"
920
- version = "0.1.46"
921
+ version = "0.1.47"
921
922
  source = "registry+https://github.com/rust-lang/crates.io-index"
922
- checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
923
+ checksum = "7ce2d95d4b3734dc35aa2f45e1aa22cd416814592a4f9d9205e11affd5b8e10b"
923
924
  dependencies = [
924
925
  "num-traits",
925
926
  ]
@@ -1023,9 +1024,9 @@ dependencies = [
1023
1024
 
1024
1025
  [[package]]
1025
1026
  name = "pkg-config"
1026
- version = "0.3.33"
1027
+ version = "0.3.34"
1027
1028
  source = "registry+https://github.com/rust-lang/crates.io-index"
1028
- checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e"
1029
+ checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548"
1029
1030
 
1030
1031
  [[package]]
1031
1032
  name = "plain"
@@ -1035,15 +1036,15 @@ checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6"
1035
1036
 
1036
1037
  [[package]]
1037
1038
  name = "portable-atomic"
1038
- version = "1.14.0"
1039
+ version = "1.15.0"
1039
1040
  source = "registry+https://github.com/rust-lang/crates.io-index"
1040
- checksum = "3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3"
1041
+ checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85"
1041
1042
 
1042
1043
  [[package]]
1043
1044
  name = "potential_utf"
1044
- version = "0.1.5"
1045
+ version = "0.1.6"
1045
1046
  source = "registry+https://github.com/rust-lang/crates.io-index"
1046
- checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564"
1047
+ checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661"
1047
1048
  dependencies = [
1048
1049
  "zerovec",
1049
1050
  ]
@@ -1196,9 +1197,9 @@ dependencies = [
1196
1197
 
1197
1198
  [[package]]
1198
1199
  name = "redox_syscall"
1199
- version = "0.9.1"
1200
+ version = "0.9.2"
1200
1201
  source = "registry+https://github.com/rust-lang/crates.io-index"
1201
- checksum = "07507be7b4a5f9f26eeb41eeaebb1f5a7ff29dfb29739facc21d35bf8b11c21e"
1202
+ checksum = "f1c93da5bb2c5d4e6c0ef7abeead62c89169a0a4882bfb83ac892f2423aea2fe"
1202
1203
  dependencies = [
1203
1204
  "bitflags",
1204
1205
  ]
@@ -1262,9 +1263,9 @@ dependencies = [
1262
1263
 
1263
1264
  [[package]]
1264
1265
  name = "rustls-webpki"
1265
- version = "0.103.13"
1266
+ version = "0.103.14"
1266
1267
  source = "registry+https://github.com/rust-lang/crates.io-index"
1267
- checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e"
1268
+ checksum = "0527518605e68109d875e248ea259b6758801cf165e4b2c2733ae3b51f12535a"
1268
1269
  dependencies = [
1269
1270
  "ring",
1270
1271
  "rustls-pki-types",
@@ -1727,18 +1728,18 @@ checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca"
1727
1728
 
1728
1729
  [[package]]
1729
1730
  name = "thiserror"
1730
- version = "2.0.19"
1731
+ version = "2.0.20"
1731
1732
  source = "registry+https://github.com/rust-lang/crates.io-index"
1732
- checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9"
1733
+ checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f"
1733
1734
  dependencies = [
1734
1735
  "thiserror-impl",
1735
1736
  ]
1736
1737
 
1737
1738
  [[package]]
1738
1739
  name = "thiserror-impl"
1739
- version = "2.0.19"
1740
+ version = "2.0.20"
1740
1741
  source = "registry+https://github.com/rust-lang/crates.io-index"
1741
- checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd"
1742
+ checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af"
1742
1743
  dependencies = [
1743
1744
  "proc-macro2",
1744
1745
  "quote",
@@ -1747,9 +1748,9 @@ dependencies = [
1747
1748
 
1748
1749
  [[package]]
1749
1750
  name = "tinystr"
1750
- version = "0.8.3"
1751
+ version = "0.8.4"
1751
1752
  source = "registry+https://github.com/rust-lang/crates.io-index"
1752
- checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d"
1753
+ checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643"
1753
1754
  dependencies = [
1754
1755
  "displaydoc",
1755
1756
  "zerovec",
@@ -1906,9 +1907,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
1906
1907
 
1907
1908
  [[package]]
1908
1909
  name = "uuid"
1909
- version = "1.24.0"
1910
+ version = "1.24.1"
1910
1911
  source = "registry+https://github.com/rust-lang/crates.io-index"
1911
- checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239"
1912
+ checksum = "2cefc03fd367c0c6d4305de1b312cf00248c4114f4a0418ce6a6af769e3b0bd9"
1912
1913
  dependencies = [
1913
1914
  "getrandom 0.4.3",
1914
1915
  "js-sys",
@@ -1941,9 +1942,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b"
1941
1942
 
1942
1943
  [[package]]
1943
1944
  name = "wasm-bindgen"
1944
- version = "0.2.126"
1945
+ version = "0.2.127"
1945
1946
  source = "registry+https://github.com/rust-lang/crates.io-index"
1946
- checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4"
1947
+ checksum = "1b70935747edd64d89de3efa29d73789b806c15798f8e7dca4d8ac356b50ce70"
1947
1948
  dependencies = [
1948
1949
  "cfg-if",
1949
1950
  "once_cell",
@@ -1954,9 +1955,9 @@ dependencies = [
1954
1955
 
1955
1956
  [[package]]
1956
1957
  name = "wasm-bindgen-macro"
1957
- version = "0.2.126"
1958
+ version = "0.2.127"
1958
1959
  source = "registry+https://github.com/rust-lang/crates.io-index"
1959
- checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1"
1960
+ checksum = "77775f8f3f7217702089053b94958f8f54061a3f663417df76e19cbdcca29bc1"
1960
1961
  dependencies = [
1961
1962
  "quote",
1962
1963
  "wasm-bindgen-macro-support",
@@ -1964,9 +1965,9 @@ dependencies = [
1964
1965
 
1965
1966
  [[package]]
1966
1967
  name = "wasm-bindgen-macro-support"
1967
- version = "0.2.126"
1968
+ version = "0.2.127"
1968
1969
  source = "registry+https://github.com/rust-lang/crates.io-index"
1969
- checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e"
1970
+ checksum = "e11d33f857dc2fb11b8bc75aee111aa9cbeb12cd9f25efd3d4c2a3dd4e235284"
1970
1971
  dependencies = [
1971
1972
  "bumpalo",
1972
1973
  "proc-macro2",
@@ -1977,9 +1978,9 @@ dependencies = [
1977
1978
 
1978
1979
  [[package]]
1979
1980
  name = "wasm-bindgen-shared"
1980
- version = "0.2.126"
1981
+ version = "0.2.127"
1981
1982
  source = "registry+https://github.com/rust-lang/crates.io-index"
1982
- checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24"
1983
+ checksum = "7ef64dbcc55df09c7e5a46182d181c2cfa3e925f3da937ea764728b4bbb9dcbf"
1983
1984
  dependencies = [
1984
1985
  "unicode-ident",
1985
1986
  ]
@@ -2221,9 +2222,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
2221
2222
 
2222
2223
  [[package]]
2223
2224
  name = "writeable"
2224
- version = "0.6.3"
2225
+ version = "0.6.4"
2225
2226
  source = "registry+https://github.com/rust-lang/crates.io-index"
2226
- checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4"
2227
+ checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc"
2227
2228
 
2228
2229
  [[package]]
2229
2230
  name = "yoke"
@@ -2250,18 +2251,18 @@ dependencies = [
2250
2251
 
2251
2252
  [[package]]
2252
2253
  name = "zerocopy"
2253
- version = "0.8.55"
2254
+ version = "0.8.56"
2254
2255
  source = "registry+https://github.com/rust-lang/crates.io-index"
2255
- checksum = "b5a105cd7b140f6eeec8acff2ea38135d3cab283ada58540f629fe51e46696eb"
2256
+ checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb"
2256
2257
  dependencies = [
2257
2258
  "zerocopy-derive",
2258
2259
  ]
2259
2260
 
2260
2261
  [[package]]
2261
2262
  name = "zerocopy-derive"
2262
- version = "0.8.55"
2263
+ version = "0.8.56"
2263
2264
  source = "registry+https://github.com/rust-lang/crates.io-index"
2264
- checksum = "0fe976fb70c78cd64cccfe3a6fc142244e8a77b70959b30faf9d0ac37ee228eb"
2265
+ checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1"
2265
2266
  dependencies = [
2266
2267
  "proc-macro2",
2267
2268
  "quote",
@@ -2297,9 +2298,9 @@ checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e"
2297
2298
 
2298
2299
  [[package]]
2299
2300
  name = "zerotrie"
2300
- version = "0.2.4"
2301
+ version = "0.2.5"
2301
2302
  source = "registry+https://github.com/rust-lang/crates.io-index"
2302
- checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf"
2303
+ checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f"
2303
2304
  dependencies = [
2304
2305
  "displaydoc",
2305
2306
  "yoke",
@@ -2308,9 +2309,9 @@ dependencies = [
2308
2309
 
2309
2310
  [[package]]
2310
2311
  name = "zerovec"
2311
- version = "0.11.6"
2312
+ version = "0.11.7"
2312
2313
  source = "registry+https://github.com/rust-lang/crates.io-index"
2313
- checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239"
2314
+ checksum = "94b5c6b5976d66c1d703c4fd17d3f5e43c8cedaacf604961b171adc7130896d8"
2314
2315
  dependencies = [
2315
2316
  "yoke",
2316
2317
  "zerofrom",
@@ -2319,13 +2320,13 @@ dependencies = [
2319
2320
 
2320
2321
  [[package]]
2321
2322
  name = "zerovec-derive"
2322
- version = "0.11.3"
2323
+ version = "0.11.5"
2323
2324
  source = "registry+https://github.com/rust-lang/crates.io-index"
2324
- checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555"
2325
+ checksum = "9f212a141d820099d57ffafb9569be9617a6f27d3dc881fbee8fb56642f917a9"
2325
2326
  dependencies = [
2326
2327
  "proc-macro2",
2327
2328
  "quote",
2328
- "syn 2.0.119",
2329
+ "syn 3.0.3",
2329
2330
  ]
2330
2331
 
2331
2332
  [[package]]
@@ -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.18.0"
6
+ version = "0.19.0"
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.18.0
3
+ Version: 0.19.0
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'