ferro-orm 0.12.2__tar.gz → 0.13.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 (264) hide show
  1. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/.github/workflows/ci.yml +1 -2
  2. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/AGENTS.md +35 -17
  3. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/CHANGELOG.md +100 -0
  4. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/Cargo.lock +33 -20
  5. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/Cargo.toml +3 -2
  6. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/PKG-INFO +4 -4
  7. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/README.md +3 -3
  8. {ferro_orm-0.12.2/crates/ferro-migrate → ferro_orm-0.13.0/crates/ferro-ddl-lowering}/Cargo.toml +3 -1
  9. ferro_orm-0.13.0/crates/ferro-ddl-lowering/src/lib.rs +875 -0
  10. ferro_orm-0.13.0/crates/ferro-migrate/Cargo.toml +10 -0
  11. ferro_orm-0.13.0/crates/ferro-migrate/src/emit.rs +640 -0
  12. ferro_orm-0.13.0/crates/ferro-migrate/src/lib.rs +322 -0
  13. ferro_orm-0.13.0/crates/ferro-migrate/src/tests.rs +1215 -0
  14. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/crates/ferro-schema-ir/src/lib.rs +101 -2
  15. ferro_orm-0.13.0/docs/brainstorms/2026-06-24-ir-p8-119-wire-automigrate-requirements.md +116 -0
  16. ferro_orm-0.13.0/docs/brainstorms/2026-06-25-ir-p8-120-parity-gate-requirements.md +119 -0
  17. ferro_orm-0.13.0/docs/brainstorms/2026-06-26-ir-p8.5-140-shared-lowering-requirements.md +111 -0
  18. ferro_orm-0.13.0/docs/brainstorms/2026-06-26-ir-p8.5-143-db-type-drop-requirements.md +116 -0
  19. ferro_orm-0.13.0/docs/brainstorms/2026-06-26-ir-p8.5-144-reconcile-indexes-requirements.md +130 -0
  20. ferro_orm-0.13.0/docs/brainstorms/2026-06-28-ir-p8.5-141-single-schema-ir-producer-requirements.md +166 -0
  21. ferro_orm-0.13.0/docs/brainstorms/2026-06-29-ir-p8.6-146-dialect-enum-unification-requirements.md +264 -0
  22. ferro_orm-0.13.0/docs/brainstorms/2026-06-29-ir-p8.6-153-create-path-ir-requirements.md +331 -0
  23. ferro_orm-0.13.0/docs/brainstorms/2026-06-30-ir-p8.6-155-deferred-annotations-requirements.md +338 -0
  24. ferro_orm-0.13.0/docs/brainstorms/2026-06-30-ir-p8.6-158-check-renderer-requirements.md +358 -0
  25. ferro_orm-0.13.0/docs/brainstorms/2026-07-01-ir-p8.6-154-datetime-tz-coarseness-requirements.md +327 -0
  26. ferro_orm-0.13.0/docs/brainstorms/2026-07-01-ir-p8.6-162-typed-save-bind-requirements.md +307 -0
  27. ferro_orm-0.13.0/docs/brainstorms/2026-07-01-ir-p8.6-165-blob-introspection-false-positive-requirements.md +353 -0
  28. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/examples/pagination.py +1 -1
  29. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/examples/predicates.py +9 -9
  30. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/examples/predicates_annotated.py +2 -2
  31. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/examples/quickstart.py +5 -5
  32. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/examples/quickstart_annotated.py +2 -2
  33. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/examples/relationships_annotated.py +1 -1
  34. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/examples/soft_deletes.py +1 -1
  35. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/examples/soft_deletes_annotated.py +2 -2
  36. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/examples/timestamps_annotated.py +1 -1
  37. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/api/queries.md +1 -1
  38. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/concepts/architecture.md +15 -4
  39. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/concepts/query-typing.md +7 -7
  40. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/getting-started/quickstart.md +1 -1
  41. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/guide/connections.md +2 -0
  42. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/guide/migrations.md +3 -0
  43. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/guide/queries.md +2 -2
  44. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/guide/transactions.md +2 -0
  45. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/howto/migrating-to-v0-12-0.md +3 -1
  46. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/howto/timestamps.md +12 -0
  47. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/plans/2026-06-19-001-ir-first-roadmap.md +244 -24
  48. ferro_orm-0.13.0/docs/plans/2026-06-24-001-feat-ir-p8-119-wire-automigrate-plan.md +301 -0
  49. ferro_orm-0.13.0/docs/plans/2026-06-25-001-feat-ir-p8-120-parity-gate-plan.md +286 -0
  50. ferro_orm-0.13.0/docs/plans/2026-06-26-001-feat-ir-p8.5-140-shared-lowering-plan.md +311 -0
  51. ferro_orm-0.13.0/docs/plans/2026-06-26-002-feat-ir-p8.5-143-db-type-drop-plan.md +229 -0
  52. ferro_orm-0.13.0/docs/plans/2026-06-26-003-feat-ir-p8.5-144-reconcile-indexes-plan.md +503 -0
  53. ferro_orm-0.13.0/docs/plans/2026-06-28-001-feat-ir-p8.5-141-single-schema-ir-producer-plan.md +394 -0
  54. ferro_orm-0.13.0/docs/plans/2026-06-29-001-refactor-ir-p8.6-153-create-path-unification-plan.md +362 -0
  55. ferro_orm-0.13.0/docs/plans/2026-06-29-002-refactor-ir-p8.6-146-dialect-enum-unification-plan.md +388 -0
  56. ferro_orm-0.13.0/docs/plans/2026-06-30-001-refactor-ir-p8.6-158-check-renderer-plan.md +670 -0
  57. ferro_orm-0.13.0/docs/plans/2026-06-30-002-fix-ir-p8.6-155-deferred-annotations-plan.md +341 -0
  58. ferro_orm-0.13.0/docs/plans/2026-07-01-001-feat-ir-p8.6-162-typed-save-bind-plan.md +917 -0
  59. ferro_orm-0.13.0/docs/plans/2026-07-01-002-fix-ir-p8.6-154-datetime-tz-coarseness-plan.md +467 -0
  60. ferro_orm-0.13.0/docs/plans/2026-07-01-003-fix-ir-p8.6-165-blob-introspection-plan.md +307 -0
  61. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/plans/ir-first-migration-guide.md +10 -4
  62. ferro_orm-0.13.0/docs/solutions/architecture-patterns/ir-first-lowering-consolidation-audit.md +246 -0
  63. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/architecture-patterns/ir-first-merge-readiness-review.md +1 -0
  64. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/patterns/cross-emitter-ddl-parity.md +28 -1
  65. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/pyproject.toml +1 -1
  66. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/backend.rs +69 -40
  67. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/codec.rs +111 -17
  68. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/connection.rs +8 -8
  69. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/__init__.py +74 -3
  70. ferro_orm-0.13.0/src/ferro/_bind_payload.py +51 -0
  71. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/_core.pyi +36 -9
  72. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/ir/compiler.py +14 -23
  73. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/metaclass.py +16 -1
  74. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/migrations/alembic.py +18 -4
  75. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/models.py +9 -7
  76. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/query/builder.py +11 -13
  77. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/query/nodes.py +4 -4
  78. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/session.py +22 -16
  79. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/hydration.rs +28 -0
  80. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/introspect.rs +105 -5
  81. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/lib.rs +16 -4
  82. ferro_orm-0.13.0/src/migrate.rs +2312 -0
  83. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/operations.rs +521 -131
  84. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/query.rs +82 -18
  85. ferro_orm-0.13.0/src/schema.rs +569 -0
  86. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/state.rs +155 -4
  87. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/fixtures/ir_vectors/schema_invoice_baseline_v1.json +11 -8
  88. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/fixtures/ir_vectors/schema_phase1_fixture_models_v1.json +1 -10
  89. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/fixtures/shadow_reports/postgres.json +19 -0
  90. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/fixtures/shadow_reports/sqlite.json +19 -0
  91. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_alembic_bridge.py +26 -0
  92. ferro_orm-0.13.0/tests/test_auto_migrate.py +1188 -0
  93. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_db_type_cross_emitter_parity.py +65 -15
  94. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_ir_vectors_contract.py +92 -1
  95. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_metaclass_internals.py +44 -5
  96. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_migrate_plan.py +86 -1
  97. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_session.py +168 -0
  98. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_shadow_reports.py +34 -12
  99. ferro_orm-0.13.0/tests/test_typed_save_bind.py +188 -0
  100. ferro_orm-0.12.2/crates/ferro-migrate/src/lib.rs +0 -271
  101. ferro_orm-0.12.2/src/migrate.rs +0 -1481
  102. ferro_orm-0.12.2/src/schema.rs +0 -1166
  103. ferro_orm-0.12.2/tests/test_auto_migrate.py +0 -582
  104. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  105. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  106. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/.github/PERMISSIONS.md +0 -0
  107. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/.github/PYPI_CHECKLIST.md +0 -0
  108. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/.github/PYPI_SETUP.md +0 -0
  109. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/.github/generated/wheels.generated.yml +0 -0
  110. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/.github/pull_request_template.md +0 -0
  111. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/.github/workflows/packaging-smoke.yml +0 -0
  112. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/.github/workflows/publish-docs.yml +0 -0
  113. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/.github/workflows/publish.yml +0 -0
  114. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/.github/workflows/release.yml +0 -0
  115. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/.gitignore +0 -0
  116. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/.pre-commit-config.yaml +0 -0
  117. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/.python-version +0 -0
  118. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/CONTRIBUTING.md +0 -0
  119. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/LICENSE +0 -0
  120. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/crates/ferro-schema-ir/Cargo.toml +0 -0
  121. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/brainstorms/2026-04-29-named-connections-role-routing-requirements.md +0 -0
  122. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/brainstorms/2026-05-08-typed-query-predicates-requirements.md +0 -0
  123. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/brainstorms/2026-05-13-configurable-column-storage-types-requirements.md +0 -0
  124. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/brainstorms/2026-05-14-autogenerate-support-for-db-type-requirements.md +0 -0
  125. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/brainstorms/2026-05-25-annotated-strenum-cold-hydration-requirements.md +0 -0
  126. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/examples/multiple_databases.py +0 -0
  127. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/examples/mutations.py +0 -0
  128. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/examples/raw_sql.py +0 -0
  129. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/examples/relationships.py +0 -0
  130. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/examples/testing_conftest.py +0 -0
  131. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/examples/timestamps.py +0 -0
  132. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/examples/transactions.py +0 -0
  133. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/api/connection.md +0 -0
  134. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/api/exceptions.md +0 -0
  135. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/api/fields.md +0 -0
  136. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/api/migrations.md +0 -0
  137. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/api/model.md +0 -0
  138. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/api/raw-sql.md +0 -0
  139. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/api/relationships.md +0 -0
  140. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/api/transactions.md +0 -0
  141. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/changelog.md +0 -0
  142. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/concepts/backends.md +0 -0
  143. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/concepts/identity-map.md +0 -0
  144. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/concepts/performance.md +0 -0
  145. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/concepts/type-safety.md +0 -0
  146. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/contributing.md +0 -0
  147. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/faq.md +0 -0
  148. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/getting-started/installation.md +0 -0
  149. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/getting-started/next-steps.md +0 -0
  150. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/guide/models-and-fields.md +0 -0
  151. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/guide/mutations.md +0 -0
  152. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/guide/raw-sql.md +0 -0
  153. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/guide/relationships.md +0 -0
  154. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/howto/migrate-from-sqlalchemy.md +0 -0
  155. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/howto/multiple-databases.md +0 -0
  156. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/howto/pagination.md +0 -0
  157. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/howto/soft-deletes.md +0 -0
  158. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/howto/testing.md +0 -0
  159. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/index.md +0 -0
  160. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/roadmap.md +0 -0
  161. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/stylesheets/extra.css +0 -0
  162. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/why-ferro.md +0 -0
  163. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/plans/2026-04-24-001-refactor-multi-db-backend-architecture-plan.md +0 -0
  164. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/plans/2026-04-29-001-typed-null-binds-plan.md +0 -0
  165. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/plans/2026-04-29-002-feat-named-connections-plan.md +0 -0
  166. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/plans/2026-05-07-001-refactor-generic-model-connection-plan.md +0 -0
  167. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/plans/2026-05-08-001-feat-typed-query-predicates-plan.md +0 -0
  168. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/plans/2026-05-13-001-feat-configurable-column-storage-types-plan.md +0 -0
  169. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/plans/2026-05-25-001-fix-annotated-strenum-cold-hydration-plan.md +0 -0
  170. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/plans/ir-first-release-checklist.md +0 -0
  171. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/rfc/ir-contracts-v1.md +0 -0
  172. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/README.md +0 -0
  173. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/issues/pydantic-slots-missing-after-ferro-hydration.md +0 -0
  174. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/issues/python-3.14-deferred-annotation-typeerror-swallow.md +0 -0
  175. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/issues/sa-pk-column-nullable-divergence.md +0 -0
  176. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/issues/sa-vs-rust-unique-constraint-shape.md +0 -0
  177. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/issues/sqlite-integer-decimal-hydrates-as-none.md +0 -0
  178. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/issues/sqlite-null-hydrates-as-int-zero.md +0 -0
  179. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/issues/typed-where-null-panics-is-null.md +0 -0
  180. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/patterns/configurable-column-storage-types.md +0 -0
  181. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/patterns/ddl-on-live-engine.md +0 -0
  182. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/patterns/foreign-key-index.md +0 -0
  183. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/patterns/index-unique-redundancy.md +0 -0
  184. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/patterns/ir-invariants.md +0 -0
  185. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/patterns/shadow-fk-columns.md +0 -0
  186. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/patterns/sqlite-alembic-reconnect-hydration-tests.md +0 -0
  187. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/patterns/typed-null-binds.md +0 -0
  188. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/justfile +0 -0
  189. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/scripts/demo_queries.py +0 -0
  190. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/scripts/demo_queries_pre_v012.py +0 -0
  191. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/_annotation_utils.py +0 -0
  192. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/_deprecations.py +0 -0
  193. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/_shadow_fk_types.py +0 -0
  194. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/base.py +0 -0
  195. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/composite_indexes.py +0 -0
  196. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/composite_uniques.py +0 -0
  197. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/exceptions.py +0 -0
  198. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/fields.py +0 -0
  199. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/ir/__init__.py +0 -0
  200. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/migrations/__init__.py +0 -0
  201. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/py.typed +0 -0
  202. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/query/__init__.py +0 -0
  203. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/raw.py +0 -0
  204. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/relations/__init__.py +0 -0
  205. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/relations/descriptors.py +0 -0
  206. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/schema_metadata.py +0 -0
  207. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/state.py +0 -0
  208. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/schema_bind.rs +0 -0
  209. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/__init__.py +0 -0
  210. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/conftest.py +0 -0
  211. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/db_backends.py +0 -0
  212. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/fixtures/ir_vectors/README.md +0 -0
  213. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/fixtures/ir_vectors/codec_registry_core_v1.json +0 -0
  214. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/fixtures/ir_vectors/query_user_compound_v1.json +0 -0
  215. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_aggregation.py +0 -0
  216. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_alembic_autogenerate.py +0 -0
  217. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_alembic_db_type.py +0 -0
  218. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_alembic_nullability.py +0 -0
  219. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_alembic_type_mapping.py +0 -0
  220. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_bulk_update.py +0 -0
  221. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_composite_index.py +0 -0
  222. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_composite_unique.py +0 -0
  223. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_connection.py +0 -0
  224. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_connection_redaction.py +0 -0
  225. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_constraints.py +0 -0
  226. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_cross_emitter_parity.py +0 -0
  227. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_crud.py +0 -0
  228. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_db_backends.py +0 -0
  229. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_db_type_integration.py +0 -0
  230. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_db_type_typing.py +0 -0
  231. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_db_type_validation.py +0 -0
  232. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_deletion.py +0 -0
  233. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_deprecated_operator_inventory.py +0 -0
  234. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_deprecations.py +0 -0
  235. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_docs_examples.py +0 -0
  236. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_documentation_features.py +0 -0
  237. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_enum_cold_hydration.py +0 -0
  238. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_field_wrapper.py +0 -0
  239. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_framework_predicates.py +0 -0
  240. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_helpers.py +0 -0
  241. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_hydration.py +0 -0
  242. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_metadata.py +0 -0
  243. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_models.py +0 -0
  244. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_named_connections_integration.py +0 -0
  245. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_one_to_one.py +0 -0
  246. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_query_builder.py +0 -0
  247. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_query_typing.py +0 -0
  248. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_raw_sql.py +0 -0
  249. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_refresh.py +0 -0
  250. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_relationship_engine.py +0 -0
  251. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_schema.py +0 -0
  252. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_schema_constraints.py +0 -0
  253. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_schema_db_type_metadata.py +0 -0
  254. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_schema_enum_annotations.py +0 -0
  255. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_shadow_fk_types.py +0 -0
  256. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_sqlite_alembic_reconnect_hydration.py +0 -0
  257. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_static_contracts.py +0 -0
  258. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_string_search.py +0 -0
  259. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_structural_types.py +0 -0
  260. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_temporal_types.py +0 -0
  261. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_transactions.py +0 -0
  262. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_typed_null_binds.py +0 -0
  263. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/uv.lock +0 -0
  264. {ferro_orm-0.12.2 → ferro_orm-0.13.0}/zensical.toml +0 -0
@@ -3,9 +3,8 @@ name: CI
3
3
  on:
4
4
  workflow_call:
5
5
  pull_request:
6
- branches: [main, feat/ir-first]
7
6
  push:
8
- branches: [main, feat/ir-first]
7
+ branches: [main]
9
8
  workflow_dispatch:
10
9
 
11
10
  concurrency:
@@ -91,7 +91,7 @@ If you add a new schema feature (e.g. partial indexes, exclusion constraints):
91
91
  2. Implement it in **both** the Alembic and Rust paths in the same PR.
92
92
  3. Add a parity test that asserts the names match.
93
93
  4. Do not edit `CHANGELOG.md` manually — release tooling records entries at
94
- release time (see I-11).
94
+ release time (see I-10).
95
95
 
96
96
  ---
97
97
 
@@ -151,17 +151,7 @@ See `docs/solutions/README.md` for the frontmatter conventions.
151
151
 
152
152
  ---
153
153
 
154
- ## I-6: No AI attribution in commits or PRs
155
-
156
- Never sign commits or pull requests with AI/agent attribution. No
157
- `Co-Authored-By: Claude ...` trailers, no "Generated with Claude Code"
158
- footers, no robot emoji bylines — in commit messages, PR titles, or PR
159
- bodies. This applies even when an agent's default behavior is to add them:
160
- this rule overrides those defaults for this repository.
161
-
162
- ---
163
-
164
- ## I-7: No stop-gap solutions
154
+ ## I-6: No stop-gap solutions
165
155
 
166
156
  Every feature, bug fix, and improvement must be designed as the best,
167
157
  well-thought-out solution for the project with the library's future in
@@ -194,7 +184,7 @@ agent default that biases toward minimal or expedient changes.
194
184
 
195
185
  ---
196
186
 
197
- ## I-8: Docs examples show both field-declaration styles
187
+ ## I-7: Docs examples show both field-declaration styles
198
188
 
199
189
  Ferro supports two equivalent ways to declare model fields: assignment
200
190
  (`name: str = Field(unique=True)`) and `Annotated` metadata
@@ -232,18 +222,20 @@ preferred declaration style.
232
222
 
233
223
  ---
234
224
 
235
- ## I-9: Lambda predicates are the official query style
225
+ ## I-8: Lambda predicates are the official query style
236
226
 
237
227
  Documentation and examples use the lambda predicate style for all queries:
238
228
 
239
229
  ```python
240
- adults = await User.where(lambda t: t.age >= 18).all()
230
+ adults = await User.where(lambda user: user.age >= 18).all()
241
231
  ```
242
232
 
243
233
  Rules:
244
234
 
245
235
  - **Every query example** in docs, docstring `Examples:` sections, and
246
236
  `docs/examples/` scripts uses lambda predicates.
237
+ - Name the lambda parameter after the model in **lowercase singular**
238
+ (`user` for `User`, `post` for `Post`) so filters read naturally.
247
239
  - When the predicate styles themselves are documented, present them in
248
240
  order **lambda > `col()` > operator**, with lambda labeled the officially
249
241
  recommended style.
@@ -262,7 +254,7 @@ else uses lambda without restating the trade-offs.
262
254
 
263
255
  ---
264
256
 
265
- ## I-10: PRs must close scoped issues explicitly
257
+ ## I-9: PRs must close scoped issues explicitly
266
258
 
267
259
  Issue closure is part of feature completion, not optional cleanup.
268
260
 
@@ -280,7 +272,7 @@ Rules:
280
272
 
281
273
  ---
282
274
 
283
- ## I-11: Do not edit CHANGELOG.md manually
275
+ ## I-10: Do not edit CHANGELOG.md manually
284
276
 
285
277
  `CHANGELOG.md` is updated automatically by the release workflow (semantic
286
278
  release / release tooling). Agents and contributors must **not** add,
@@ -295,3 +287,29 @@ What to do instead:
295
287
  If release tooling fails to capture a change, fix the release configuration or
296
288
  commit message conventions — do not patch `CHANGELOG.md` by hand in ordinary
297
289
  PRs.
290
+
291
+ ---
292
+
293
+ ## I-11: Explain technical concepts in plain language, example-first
294
+
295
+ When explaining a concept, design, trade-off, or change to the maintainer, lead
296
+ with plain language and a concrete, user-facing example — not internal function
297
+ names and call graphs.
298
+
299
+ Rules:
300
+
301
+ - **Anchor on what the user sees.** Show a real model definition and the SQL (or
302
+ behavior) it produces, then explain the internal mechanics against that
303
+ anchor. "A `datetime` field becomes `timestamptz` — here's the `CREATE TABLE`"
304
+ beats "`canonical_from_parts` maps the logical type."
305
+ - **Introduce jargon only after the plain version.** Function and type names are
306
+ precise back-references once the idea is clear — not the primary explanation.
307
+ - **Use analogies for architecture.** "Two translation dictionaries that must
308
+ agree by hand" communicates a duplication smell faster than a module diagram.
309
+ - **Show, don't just tell.** Prefer before/after diffs, rendered SQL, and
310
+ concrete values over abstract prose (complements the show-don't-tell habit
311
+ used in issue/PR explanations).
312
+
313
+ This applies to brainstorming, design discussions, PR descriptions, issue
314
+ comments, and any explanation directed at the maintainer. It governs how work is
315
+ communicated, not what gets built.
@@ -1,6 +1,106 @@
1
1
  # CHANGELOG
2
2
 
3
3
 
4
+ ## v0.13.0 (2026-07-02)
5
+
6
+ ### Bug Fixes
7
+
8
+ - **ir-p8.6**: Datetime/timestamptz coarseness — stop silent Postgres column reinterpretation (#154)
9
+ ([#167](https://github.com/syn54x/ferro-orm/pull/167),
10
+ [`7182a57`](https://github.com/syn54x/ferro-orm/commit/7182a5744900abe7ed50915edbca7d5184b2c535))
11
+
12
+ - **ir-p8.6**: Stop false-positive BLOB drift warning on SQLite (#165)
13
+ ([#168](https://github.com/syn54x/ferro-orm/pull/168),
14
+ [`d554ac4`](https://github.com/syn54x/ferro-orm/commit/d554ac4558286106bcb0908baec9fa3d49a2781d))
15
+
16
+ - **ir-p8.6**: Surface real PEP 649 deferred-annotation error (#155)
17
+ ([#163](https://github.com/syn54x/ferro-orm/pull/163),
18
+ [`00976e7`](https://github.com/syn54x/ferro-orm/commit/00976e748d86246b8be47230229d19516d8bb3c0))
19
+
20
+ ### Documentation
21
+
22
+ - Use model-named lambda predicates in examples
23
+ ([#132](https://github.com/syn54x/ferro-orm/pull/132),
24
+ [`420ca6e`](https://github.com/syn54x/ferro-orm/commit/420ca6e1cb4a90d1acc556a83373c9da99b22bb3))
25
+
26
+ - **agents**: Add I-11 — explain concepts plainly, example-first
27
+ ([`efc7ef5`](https://github.com/syn54x/ferro-orm/commit/efc7ef5678e2f6efacaa3a6e84c0575b0cdef51c))
28
+
29
+ - **ir-first**: Add Phase 8.6 post-8.5 cleanup backlog (epic #145)
30
+ ([#147](https://github.com/syn54x/ferro-orm/pull/147),
31
+ [`e57b74b`](https://github.com/syn54x/ferro-orm/commit/e57b74b397bd51ebc4809f25d57536896540b9de))
32
+
33
+ - **ir-first**: Expand #144 scope — auto-migrate index/unique reconciliation
34
+ ([#150](https://github.com/syn54x/ferro-orm/pull/150),
35
+ [`fdbac40`](https://github.com/syn54x/ferro-orm/commit/fdbac4003e9bd25fdc3f3cb0012c5dd9d562ee68))
36
+
37
+ - **ir-first**: Lowering-consolidation audit + Phase 8.5
38
+ ([#138](https://github.com/syn54x/ferro-orm/pull/138),
39
+ [`c6ce53c`](https://github.com/syn54x/ferro-orm/commit/c6ce53c2409a1fd20a40c1de58d42e1e3d2e1344))
40
+
41
+ - **ir-p8.6**: Add #153 create-path IR unification spec
42
+ ([`be4bb99`](https://github.com/syn54x/ferro-orm/commit/be4bb99b90e6d02a6e01bfc5807a7cb178055862))
43
+
44
+ - **ir-p8.6**: Add #153 create-path unification implementation plan
45
+ ([`de3c427`](https://github.com/syn54x/ferro-orm/commit/de3c42794de821d8e47eb5ca94b582f8199992df))
46
+
47
+ - **ir-p8.6**: Sync roadmap — #153 merged, file #158 (db_check check-renderer)
48
+ ([`62c80fa`](https://github.com/syn54x/ferro-orm/commit/62c80fa3fe7ac456169d280f3ee8795feac32a8c))
49
+
50
+ - **ir-p8.6**: Sync roadmap — #154 merged (datetime/timestamptz warn-and-skip); #145 now 6/7
51
+ ([`31dbbb6`](https://github.com/syn54x/ferro-orm/commit/31dbbb6c0f1d3afa0ed452ed9ae34441df69c501))
52
+
53
+ - **ir-p8.6**: Sync roadmap — #162 merged (typed save/update bind), file #165
54
+ ([`5ca76a1`](https://github.com/syn54x/ferro-orm/commit/5ca76a1e177f4847ded4fb19402841a9988b62d1))
55
+
56
+ - **ir-p8.6**: Sync roadmap — #165 merged (BLOB introspection); #145 complete 7/7, Phase 8.6 wrapped
57
+ ([`1dbb278`](https://github.com/syn54x/ferro-orm/commit/1dbb27864881d77a68d5026ab5a9bb07f142c3c5))
58
+
59
+ - **rust**: Add detailed docstrings for all public APIs
60
+ ([#130](https://github.com/syn54x/ferro-orm/pull/130),
61
+ [`8d5a951`](https://github.com/syn54x/ferro-orm/commit/8d5a95162568eef215ba03524a31b657df87e8c6))
62
+
63
+ ### Features
64
+
65
+ - Ir cutover ([#137](https://github.com/syn54x/ferro-orm/pull/137),
66
+ [`0509c2a`](https://github.com/syn54x/ferro-orm/commit/0509c2a35b0f0200492143a52563146359550129))
67
+
68
+ - **ir-p8.6**: Route save/update/bulk value bind through the typed codec path (#162)
69
+ ([#166](https://github.com/syn54x/ferro-orm/pull/166),
70
+ [`486e68c`](https://github.com/syn54x/ferro-orm/commit/486e68c110c03356fa579051849b44e8f4eae751))
71
+
72
+ ### Refactoring
73
+
74
+ - Lowering consolidation & single-source-of-truth closeout (#139)
75
+ ([#156](https://github.com/syn54x/ferro-orm/pull/156),
76
+ [`f76bec9`](https://github.com/syn54x/ferro-orm/commit/f76bec93651bc9741bea85171da927ddb8864a1a))
77
+
78
+ - Unify the CREATE TABLE path onto the Python SchemaIR (#153)
79
+ ([#157](https://github.com/syn54x/ferro-orm/pull/157),
80
+ [`c9ce7b0`](https://github.com/syn54x/ferro-orm/commit/c9ce7b093fde350da8a1653cf7c42f522e0523b2))
81
+
82
+ - Unify the three dialect enums into one shared Dialect (#146)
83
+ ([#159](https://github.com/syn54x/ferro-orm/pull/159),
84
+ [`4b0dfe6`](https://github.com/syn54x/ferro-orm/commit/4b0dfe6b9eca1a2a63631a54504c629f42f7c5e1))
85
+
86
+ - **ir-p8.6**: Single check-renderer for db_check (#158)
87
+ ([#161](https://github.com/syn54x/ferro-orm/pull/161),
88
+ [`c04df1c`](https://github.com/syn54x/ferro-orm/commit/c04df1ce5aa4505f737864944855ff4170a4d350))
89
+
90
+
91
+ ## v0.12.3 (2026-06-24)
92
+
93
+ ### Bug Fixes
94
+
95
+ - **session**: Reject close while transactions are active
96
+ ([#128](https://github.com/syn54x/ferro-orm/pull/128),
97
+ [`e46f183`](https://github.com/syn54x/ferro-orm/commit/e46f183fba7a3bcbc635f7e66502a77aeb56861d))
98
+
99
+ - **session**: Serialize concurrent close teardown
100
+ ([#129](https://github.com/syn54x/ferro-orm/pull/129),
101
+ [`7afa616`](https://github.com/syn54x/ferro-orm/commit/7afa6168abd2eb19b564fc1c2ab9956e03a20fe9))
102
+
103
+
4
104
  ## v0.12.2 (2026-06-23)
5
105
 
6
106
  ### Bug Fixes
@@ -288,9 +288,10 @@ dependencies = [
288
288
 
289
289
  [[package]]
290
290
  name = "ferro"
291
- version = "0.12.2"
291
+ version = "0.13.0"
292
292
  dependencies = [
293
293
  "dashmap",
294
+ "ferro-ddl-lowering",
294
295
  "ferro-migrate",
295
296
  "ferro-schema-ir",
296
297
  "once_cell",
@@ -304,11 +305,23 @@ dependencies = [
304
305
  "uuid",
305
306
  ]
306
307
 
308
+ [[package]]
309
+ name = "ferro-ddl-lowering"
310
+ version = "0.1.0"
311
+ dependencies = [
312
+ "ferro-schema-ir",
313
+ "sea-query",
314
+ "serde_json",
315
+ ]
316
+
307
317
  [[package]]
308
318
  name = "ferro-migrate"
309
319
  version = "0.1.0"
310
320
  dependencies = [
321
+ "ferro-ddl-lowering",
311
322
  "ferro-schema-ir",
323
+ "sea-query",
324
+ "serde_json",
312
325
  ]
313
326
 
314
327
  [[package]]
@@ -712,9 +725,9 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
712
725
 
713
726
  [[package]]
714
727
  name = "js-sys"
715
- version = "0.3.102"
728
+ version = "0.3.103"
716
729
  source = "registry+https://github.com/rust-lang/crates.io-index"
717
- checksum = "03d04c30968dffe80775bd4d7fb676131cd04a1fb46d2686dbffbaec2d9dfd31"
730
+ checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102"
718
731
  dependencies = [
719
732
  "cfg-if",
720
733
  "futures-util",
@@ -744,14 +757,14 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"
744
757
 
745
758
  [[package]]
746
759
  name = "libredox"
747
- version = "0.1.17"
760
+ version = "0.1.18"
748
761
  source = "registry+https://github.com/rust-lang/crates.io-index"
749
- checksum = "f02ab6bace2054fb888a3c16f990117b579d14a3088e472d63c6011fa185c9d3"
762
+ checksum = "c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652"
750
763
  dependencies = [
751
764
  "bitflags",
752
765
  "libc",
753
766
  "plain",
754
- "redox_syscall 0.8.1",
767
+ "redox_syscall 0.9.0",
755
768
  ]
756
769
 
757
770
  [[package]]
@@ -1120,9 +1133,9 @@ dependencies = [
1120
1133
 
1121
1134
  [[package]]
1122
1135
  name = "redox_syscall"
1123
- version = "0.8.1"
1136
+ version = "0.9.0"
1124
1137
  source = "registry+https://github.com/rust-lang/crates.io-index"
1125
- checksum = "5b44b894f2a6e36457d665d1e08c3866add6ed5e70050c1b4ba8a8ddedb02ce7"
1138
+ checksum = "c5102a6aaa05aa011a238e178e6bca86d2cb56fc9f586d37cb80f5bca6e07759"
1126
1139
  dependencies = [
1127
1140
  "bitflags",
1128
1141
  ]
@@ -1177,9 +1190,9 @@ dependencies = [
1177
1190
 
1178
1191
  [[package]]
1179
1192
  name = "rustls-pki-types"
1180
- version = "1.14.1"
1193
+ version = "1.15.0"
1181
1194
  source = "registry+https://github.com/rust-lang/crates.io-index"
1182
- checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9"
1195
+ checksum = "764899a24af3980067ee14bc143654f297b22eaebfe3c7b6b211920a5a59b046"
1183
1196
  dependencies = [
1184
1197
  "zeroize",
1185
1198
  ]
@@ -1811,9 +1824,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
1811
1824
 
1812
1825
  [[package]]
1813
1826
  name = "uuid"
1814
- version = "1.23.3"
1827
+ version = "1.23.4"
1815
1828
  source = "registry+https://github.com/rust-lang/crates.io-index"
1816
- checksum = "144d6b123cef80b301b8f72a9e2ca4370ddec21950d0a103dd22c437006d2db7"
1829
+ checksum = "bf80a72845275afea99e7f2b434723d3bc7e38470fcd1c7ed39a599c73319a53"
1817
1830
  dependencies = [
1818
1831
  "getrandom 0.4.3",
1819
1832
  "js-sys",
@@ -1846,9 +1859,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b"
1846
1859
 
1847
1860
  [[package]]
1848
1861
  name = "wasm-bindgen"
1849
- version = "0.2.125"
1862
+ version = "0.2.126"
1850
1863
  source = "registry+https://github.com/rust-lang/crates.io-index"
1851
- checksum = "8ddb3f79143bced6de84270411622a2699cee572fc0875aeaf1e7867cf9fca1a"
1864
+ checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4"
1852
1865
  dependencies = [
1853
1866
  "cfg-if",
1854
1867
  "once_cell",
@@ -1859,9 +1872,9 @@ dependencies = [
1859
1872
 
1860
1873
  [[package]]
1861
1874
  name = "wasm-bindgen-macro"
1862
- version = "0.2.125"
1875
+ version = "0.2.126"
1863
1876
  source = "registry+https://github.com/rust-lang/crates.io-index"
1864
- checksum = "4e21a184b13fb19e157296e2c46056aec9092264fab83e4ba59e68c61b323c3d"
1877
+ checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1"
1865
1878
  dependencies = [
1866
1879
  "quote",
1867
1880
  "wasm-bindgen-macro-support",
@@ -1869,9 +1882,9 @@ dependencies = [
1869
1882
 
1870
1883
  [[package]]
1871
1884
  name = "wasm-bindgen-macro-support"
1872
- version = "0.2.125"
1885
+ version = "0.2.126"
1873
1886
  source = "registry+https://github.com/rust-lang/crates.io-index"
1874
- checksum = "fecefd9c35bd935a20fc3fc344b5f29138961e4f47fb03297d88f2587afb5ebd"
1887
+ checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e"
1875
1888
  dependencies = [
1876
1889
  "bumpalo",
1877
1890
  "proc-macro2",
@@ -1882,9 +1895,9 @@ dependencies = [
1882
1895
 
1883
1896
  [[package]]
1884
1897
  name = "wasm-bindgen-shared"
1885
- version = "0.2.125"
1898
+ version = "0.2.126"
1886
1899
  source = "registry+https://github.com/rust-lang/crates.io-index"
1887
- checksum = "23939e44bb9a5d7576fa2b563dc2e136628f1224e88a8deed09e04858b77871f"
1900
+ checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24"
1888
1901
  dependencies = [
1889
1902
  "unicode-ident",
1890
1903
  ]
@@ -1,9 +1,9 @@
1
1
  [workspace]
2
- members = ["crates/ferro-schema-ir", "crates/ferro-migrate"]
2
+ members = ["crates/ferro-schema-ir", "crates/ferro-ddl-lowering", "crates/ferro-migrate"]
3
3
 
4
4
  [package]
5
5
  name = "ferro"
6
- version = "0.12.2"
6
+ version = "0.13.0"
7
7
  edition = "2024"
8
8
  readme = "README.md"
9
9
 
@@ -36,4 +36,5 @@ tokio = { version = "1.49", features = ["full"] }
36
36
  pyo3-async-runtimes = { version = "0.27", features = ["tokio-runtime"] }
37
37
  uuid = { version = "1.11", features = ["v4"] }
38
38
  ferro-schema-ir = { path = "crates/ferro-schema-ir" }
39
+ ferro-ddl-lowering = { path = "crates/ferro-ddl-lowering" }
39
40
  ferro-migrate = { path = "crates/ferro-migrate" }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ferro-orm
3
- Version: 0.12.2
3
+ Version: 0.13.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'
@@ -54,7 +54,7 @@ pip install ferro-orm
54
54
  pip install "ferro-orm[alembic]"
55
55
  ```
56
56
 
57
- Ferro currently supports SQLite and PostgreSQL as runtime backends. Named multi-database routing and custom connection-pool kwargs are planned, but not part of the current public API.
57
+ Ferro currently supports SQLite and PostgreSQL. Register multiple named connections with `connect(..., name="...")` when a process needs more than one database — see the [connections guide](https://syn54x.github.io/ferro-orm/guide/connections/).
58
58
 
59
59
  ## Quick Start
60
60
 
@@ -73,8 +73,8 @@ async def main():
73
73
  # Create
74
74
  alice = await User.create(username="alice")
75
75
 
76
- # Query
77
- active_users = await User.where(User.is_active == True).all()
76
+ # Query (lambda predicates — name the parameter after the model, e.g. user for User)
77
+ active_users = await User.where(lambda user: user.is_active == True).all()
78
78
  print(f"Found {len(active_users)} active users.")
79
79
 
80
80
  if __name__ == "__main__":
@@ -41,7 +41,7 @@ pip install ferro-orm
41
41
  pip install "ferro-orm[alembic]"
42
42
  ```
43
43
 
44
- Ferro currently supports SQLite and PostgreSQL as runtime backends. Named multi-database routing and custom connection-pool kwargs are planned, but not part of the current public API.
44
+ Ferro currently supports SQLite and PostgreSQL. Register multiple named connections with `connect(..., name="...")` when a process needs more than one database — see the [connections guide](https://syn54x.github.io/ferro-orm/guide/connections/).
45
45
 
46
46
  ## Quick Start
47
47
 
@@ -60,8 +60,8 @@ async def main():
60
60
  # Create
61
61
  alice = await User.create(username="alice")
62
62
 
63
- # Query
64
- active_users = await User.where(User.is_active == True).all()
63
+ # Query (lambda predicates — name the parameter after the model, e.g. user for User)
64
+ active_users = await User.where(lambda user: user.is_active == True).all()
65
65
  print(f"Found {len(active_users)} active users.")
66
66
 
67
67
  if __name__ == "__main__":
@@ -1,7 +1,9 @@
1
1
  [package]
2
- name = "ferro-migrate"
2
+ name = "ferro-ddl-lowering"
3
3
  version = "0.1.0"
4
4
  edition = "2024"
5
5
 
6
6
  [dependencies]
7
7
  ferro-schema-ir = { path = "../ferro-schema-ir" }
8
+ sea-query = { version = "0.32", features = ["with-uuid"] }
9
+ serde_json = "1.0"