ferro-orm 0.14.0__tar.gz → 0.16.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 (380) hide show
  1. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/.github/workflows/ci.yml +1 -91
  2. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/.github/workflows/release.yml +19 -0
  3. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/AGENTS.md +22 -3
  4. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/CHANGELOG.md +131 -0
  5. ferro_orm-0.16.0/CONTEXT.md +101 -0
  6. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/Cargo.lock +23 -24
  7. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/Cargo.toml +1 -1
  8. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/PKG-INFO +1 -1
  9. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/crates/ferro-ddl-lowering/src/lib.rs +135 -44
  10. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/crates/ferro-migrate/src/tests.rs +1 -1
  11. ferro_orm-0.16.0/crates/ferro-schema-ir/src/lib.rs +941 -0
  12. ferro_orm-0.16.0/docs/adr/0001-resolved-epoch-registration.md +69 -0
  13. ferro_orm-0.16.0/docs/adr/0002-unified-column-fact-derivation.md +83 -0
  14. ferro_orm-0.16.0/docs/adr/0003-path-blind-db-type-validation.md +47 -0
  15. ferro_orm-0.16.0/docs/adr/0004-jsonb-postgres-only-canonical.md +69 -0
  16. ferro_orm-0.16.0/docs/adr/0005-jsonb-default-on-postgres.md +34 -0
  17. ferro_orm-0.16.0/docs/adr/0006-relation-traversal-inner-joins.md +42 -0
  18. ferro_orm-0.16.0/docs/adr/0007-materialization-plan-complete-instances.md +53 -0
  19. ferro_orm-0.16.0/docs/adr/0008-populated-relations-include.md +74 -0
  20. ferro_orm-0.16.0/docs/adr/0009-aggregate-projections-derived-grouping.md +70 -0
  21. ferro_orm-0.16.0/docs/agents/domain.md +51 -0
  22. ferro_orm-0.16.0/docs/agents/issue-tracker.md +45 -0
  23. ferro_orm-0.16.0/docs/agents/triage-labels.md +15 -0
  24. ferro_orm-0.16.0/docs/architecture-review-2026-07-08.html +492 -0
  25. ferro_orm-0.16.0/docs/examples/aggregations.py +259 -0
  26. ferro_orm-0.16.0/docs/examples/aggregations_annotated.py +52 -0
  27. ferro_orm-0.16.0/docs/examples/partial_selects.py +180 -0
  28. ferro_orm-0.16.0/docs/examples/partial_selects_annotated.py +52 -0
  29. ferro_orm-0.16.0/docs/examples/populated_relations.py +201 -0
  30. ferro_orm-0.16.0/docs/examples/populated_relations_annotated.py +59 -0
  31. ferro_orm-0.16.0/docs/examples/traversal.py +302 -0
  32. ferro_orm-0.16.0/docs/examples/traversal_annotated.py +115 -0
  33. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/api/migrations.md +0 -2
  34. ferro_orm-0.16.0/docs/pages/api/queries.md +46 -0
  35. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/concepts/architecture.md +1 -3
  36. ferro_orm-0.16.0/docs/pages/concepts/query-typing.md +153 -0
  37. ferro_orm-0.16.0/docs/pages/guide/aggregations.md +162 -0
  38. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/guide/models-and-fields.md +64 -2
  39. ferro_orm-0.16.0/docs/pages/guide/queries.md +642 -0
  40. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/guide/raw-sql.md +1 -1
  41. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/guide/relationships.md +16 -2
  42. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/howto/migrate-from-sqlalchemy.md +4 -4
  43. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/howto/upgrade-guide.md +55 -11
  44. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/roadmap.md +3 -3
  45. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/why-ferro.md +1 -1
  46. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-04-24-001-refactor-multi-db-backend-architecture-plan.md +4 -4
  47. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-04-29-001-typed-null-binds-plan.md +5 -3
  48. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-04-29-002-feat-named-connections-plan.md +3 -6
  49. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-05-07-001-refactor-generic-model-connection-plan.md +1 -1
  50. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-05-08-001-feat-typed-query-predicates-plan.md +1 -1
  51. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-05-13-001-feat-configurable-column-storage-types-plan.md +2 -1
  52. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/solutions/patterns/cross-emitter-ddl-parity.md +2 -23
  53. ferro_orm-0.16.0/justfile +23 -0
  54. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/pyproject.toml +1 -1
  55. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/backend.rs +0 -16
  56. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/codec.rs +33 -21
  57. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/codec_plan.rs +139 -117
  58. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/connection.rs +1 -10
  59. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/ferro/__init__.py +119 -21
  60. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/ferro/_annotation_utils.py +92 -0
  61. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/ferro/_core.pyi +5 -18
  62. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/ferro/_deprecations.py +0 -19
  63. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/ferro/_shadow_fk_types.py +7 -44
  64. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/ferro/base.py +2 -0
  65. ferro_orm-0.16.0/src/ferro/columns.py +494 -0
  66. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/ferro/composite_indexes.py +41 -39
  67. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/ferro/composite_uniques.py +27 -22
  68. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/ferro/ir/__init__.py +2 -0
  69. ferro_orm-0.16.0/src/ferro/ir/compiler.py +445 -0
  70. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/ferro/metaclass.py +33 -78
  71. ferro_orm-0.16.0/src/ferro/migrations/alembic.py +273 -0
  72. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/ferro/models.py +72 -50
  73. ferro_orm-0.16.0/src/ferro/query/__init__.py +28 -0
  74. ferro_orm-0.16.0/src/ferro/query/builder.py +1904 -0
  75. ferro_orm-0.16.0/src/ferro/query/nodes.py +764 -0
  76. ferro_orm-0.16.0/src/ferro/query/rows.py +90 -0
  77. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/ferro/relations/__init__.py +46 -49
  78. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/ferro/relations/descriptors.py +4 -15
  79. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/ferro/state.py +139 -1
  80. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/hydration.rs +153 -0
  81. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/lib.rs +10 -15
  82. ferro_orm-0.16.0/src/migrate.rs +618 -0
  83. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/operations.rs +2550 -62
  84. ferro_orm-0.16.0/src/query.rs +1621 -0
  85. ferro_orm-0.16.0/src/schema.rs +587 -0
  86. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/state.rs +431 -72
  87. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/conftest.py +43 -1
  88. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/fixtures/ir_vectors/README.md +8 -2
  89. ferro_orm-0.16.0/tests/fixtures/ir_vectors/query_transaction_aggregate_v5.json +82 -0
  90. ferro_orm-0.16.0/tests/fixtures/ir_vectors/query_transaction_global_aggregate_v5.json +80 -0
  91. ferro_orm-0.16.0/tests/fixtures/ir_vectors/query_transaction_include_v5.json +48 -0
  92. ferro_orm-0.16.0/tests/fixtures/ir_vectors/query_transaction_left_join_v5.json +64 -0
  93. ferro_orm-0.16.0/tests/fixtures/ir_vectors/query_transaction_record_v5.json +50 -0
  94. ferro_orm-0.16.0/tests/fixtures/ir_vectors/query_transaction_traversal_v5.json +91 -0
  95. ferro_orm-0.16.0/tests/fixtures/ir_vectors/query_transaction_traversed_record_v5.json +84 -0
  96. ferro_orm-0.14.0/tests/fixtures/ir_vectors/query_user_compound_v1.json → ferro_orm-0.16.0/tests/fixtures/ir_vectors/query_user_compound_v5.json +19 -8
  97. ferro_orm-0.16.0/tests/fixtures/ir_vectors/schema_raw_str_pk_autoincrement_v1.json +46 -0
  98. ferro_orm-0.16.0/tests/static_fixtures/bad_includes.py +36 -0
  99. ferro_orm-0.16.0/tests/static_fixtures/bad_predicates.py +45 -0
  100. ferro_orm-0.16.0/tests/static_fixtures/bad_projections.py +55 -0
  101. ferro_orm-0.16.0/tests/static_fixtures/good_includes.py +44 -0
  102. ferro_orm-0.16.0/tests/static_fixtures/good_predicates.py +87 -0
  103. ferro_orm-0.16.0/tests/static_fixtures/good_projections.py +109 -0
  104. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_alembic_bridge.py +6 -34
  105. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_alembic_db_type.py +23 -0
  106. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_alembic_nullability.py +6 -10
  107. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_alembic_type_mapping.py +4 -2
  108. ferro_orm-0.16.0/tests/test_annotation_utils.py +24 -0
  109. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_auto_migrate.py +65 -0
  110. ferro_orm-0.16.0/tests/test_bulk_install.py +160 -0
  111. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_catalog_cache.py +1 -1
  112. ferro_orm-0.16.0/tests/test_column_specs.py +106 -0
  113. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_composite_index.py +45 -41
  114. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_composite_unique.py +0 -17
  115. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_connection.py +2 -2
  116. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_db_type_cross_emitter_parity.py +79 -4
  117. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_db_type_typing.py +14 -0
  118. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_db_type_validation.py +150 -1
  119. ferro_orm-0.16.0/tests/test_deprecations.py +52 -0
  120. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_documentation_features.py +2 -2
  121. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_enum_cold_hydration.py +5 -5
  122. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_fk_target_pk.py +5 -1
  123. ferro_orm-0.16.0/tests/test_generation_counter_dirty_tracking.py +150 -0
  124. ferro_orm-0.16.0/tests/test_global_aggregates.py +374 -0
  125. ferro_orm-0.16.0/tests/test_grouped_aggregates.py +406 -0
  126. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_import_budget.py +6 -8
  127. ferro_orm-0.16.0/tests/test_include.py +828 -0
  128. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_ir_vectors_contract.py +177 -39
  129. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_migrate_plan.py +189 -1
  130. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_named_connections_integration.py +8 -4
  131. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_naming_single_source.py +6 -6
  132. ferro_orm-0.16.0/tests/test_operation_seam_sync.py +269 -0
  133. ferro_orm-0.16.0/tests/test_partial_selects.py +472 -0
  134. ferro_orm-0.16.0/tests/test_provisional_import.py +231 -0
  135. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_query_builder.py +31 -1
  136. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_query_column_validation.py +4 -2
  137. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_query_immutability.py +1 -1
  138. ferro_orm-0.16.0/tests/test_query_joins.py +1177 -0
  139. ferro_orm-0.16.0/tests/test_registry_entrypoints.py +294 -0
  140. ferro_orm-0.16.0/tests/test_relation_specs.py +175 -0
  141. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_relationship_resolution_errors.py +16 -8
  142. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_schema.py +10 -9
  143. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_schema_db_type_metadata.py +14 -14
  144. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_schema_enum_annotations.py +2 -3
  145. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_session.py +2 -2
  146. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_static_contracts.py +42 -0
  147. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_structural_types.py +84 -0
  148. ferro_orm-0.16.0/tests/test_traversed_projection.py +427 -0
  149. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/uv.lock +1 -1
  150. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/zensical.toml +1 -0
  151. ferro_orm-0.14.0/crates/ferro-schema-ir/src/lib.rs +0 -294
  152. ferro_orm-0.14.0/docs/pages/api/queries.md +0 -9
  153. ferro_orm-0.14.0/docs/pages/concepts/query-typing.md +0 -56
  154. ferro_orm-0.14.0/docs/pages/guide/queries.md +0 -184
  155. ferro_orm-0.14.0/justfile +0 -17
  156. ferro_orm-0.14.0/src/ferro/ir/compiler.py +0 -449
  157. ferro_orm-0.14.0/src/ferro/migrations/alembic.py +0 -578
  158. ferro_orm-0.14.0/src/ferro/query/__init__.py +0 -13
  159. ferro_orm-0.14.0/src/ferro/query/builder.py +0 -555
  160. ferro_orm-0.14.0/src/ferro/query/nodes.py +0 -331
  161. ferro_orm-0.14.0/src/ferro/schema_metadata.py +0 -186
  162. ferro_orm-0.14.0/src/migrate.rs +0 -2438
  163. ferro_orm-0.14.0/src/query.rs +0 -558
  164. ferro_orm-0.14.0/src/schema.rs +0 -622
  165. ferro_orm-0.14.0/tests/fixtures/shadow_reports/postgres.json +0 -32
  166. ferro_orm-0.14.0/tests/fixtures/shadow_reports/sqlite.json +0 -32
  167. ferro_orm-0.14.0/tests/static_fixtures/bad_predicates.py +0 -19
  168. ferro_orm-0.14.0/tests/static_fixtures/good_predicates.py +0 -20
  169. ferro_orm-0.14.0/tests/test_deprecations.py +0 -74
  170. ferro_orm-0.14.0/tests/test_shadow_reports.py +0 -107
  171. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  172. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  173. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/.github/PERMISSIONS.md +0 -0
  174. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/.github/PYPI_CHECKLIST.md +0 -0
  175. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/.github/PYPI_SETUP.md +0 -0
  176. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/.github/generated/wheels.generated.yml +0 -0
  177. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/.github/pull_request_template.md +0 -0
  178. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/.github/workflows/packaging-smoke.yml +0 -0
  179. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/.github/workflows/publish-docs.yml +0 -0
  180. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/.github/workflows/publish.yml +0 -0
  181. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/.gitignore +0 -0
  182. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/.pre-commit-config.yaml +0 -0
  183. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/.python-version +0 -0
  184. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/CONTRIBUTING.md +0 -0
  185. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/LICENSE +0 -0
  186. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/README.md +0 -0
  187. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/benchmarks/README.md +0 -0
  188. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/benchmarks/__init__.py +0 -0
  189. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/benchmarks/__main__.py +0 -0
  190. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/benchmarks/backends.py +0 -0
  191. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/benchmarks/baselines/postgres.json +0 -0
  192. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/benchmarks/baselines/sqlite.json +0 -0
  193. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/benchmarks/compare.py +0 -0
  194. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/benchmarks/harness.py +0 -0
  195. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/benchmarks/model.py +0 -0
  196. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/benchmarks/run.py +0 -0
  197. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/crates/ferro-ddl-lowering/Cargo.toml +0 -0
  198. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/crates/ferro-migrate/Cargo.toml +0 -0
  199. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/crates/ferro-migrate/src/emit.rs +0 -0
  200. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/crates/ferro-migrate/src/lib.rs +0 -0
  201. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/crates/ferro-schema-ir/Cargo.toml +0 -0
  202. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/brainstorms/2026-04-29-named-connections-role-routing-requirements.md +0 -0
  203. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/brainstorms/2026-05-08-typed-query-predicates-requirements.md +0 -0
  204. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/brainstorms/2026-05-13-configurable-column-storage-types-requirements.md +0 -0
  205. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/brainstorms/2026-05-14-autogenerate-support-for-db-type-requirements.md +0 -0
  206. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/brainstorms/2026-05-25-annotated-strenum-cold-hydration-requirements.md +0 -0
  207. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/brainstorms/2026-06-24-ir-p8-119-wire-automigrate-requirements.md +0 -0
  208. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/brainstorms/2026-06-25-ir-p8-120-parity-gate-requirements.md +0 -0
  209. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/brainstorms/2026-06-26-ir-p8.5-140-shared-lowering-requirements.md +0 -0
  210. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/brainstorms/2026-06-26-ir-p8.5-143-db-type-drop-requirements.md +0 -0
  211. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/brainstorms/2026-06-26-ir-p8.5-144-reconcile-indexes-requirements.md +0 -0
  212. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/brainstorms/2026-06-28-ir-p8.5-141-single-schema-ir-producer-requirements.md +0 -0
  213. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/brainstorms/2026-06-29-ir-p8.6-146-dialect-enum-unification-requirements.md +0 -0
  214. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/brainstorms/2026-06-29-ir-p8.6-153-create-path-ir-requirements.md +0 -0
  215. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/brainstorms/2026-06-30-ir-p8.6-155-deferred-annotations-requirements.md +0 -0
  216. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/brainstorms/2026-06-30-ir-p8.6-158-check-renderer-requirements.md +0 -0
  217. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/brainstorms/2026-07-01-ir-p8.6-154-datetime-tz-coarseness-requirements.md +0 -0
  218. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/brainstorms/2026-07-01-ir-p8.6-162-typed-save-bind-requirements.md +0 -0
  219. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/brainstorms/2026-07-01-ir-p8.6-165-blob-introspection-false-positive-requirements.md +0 -0
  220. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/brainstorms/2026-07-02-ff-c1-codec-plan-design.md +0 -0
  221. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/brainstorms/2026-07-06-upgrade-guide-consolidation-requirements.md +0 -0
  222. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/examples/multiple_databases.py +0 -0
  223. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/examples/mutations.py +0 -0
  224. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/examples/pagination.py +0 -0
  225. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/examples/predicates.py +0 -0
  226. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/examples/predicates_annotated.py +0 -0
  227. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/examples/quickstart.py +0 -0
  228. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/examples/quickstart_annotated.py +0 -0
  229. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/examples/raw_sql.py +0 -0
  230. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/examples/relationships.py +0 -0
  231. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/examples/relationships_annotated.py +0 -0
  232. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/examples/soft_deletes.py +0 -0
  233. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/examples/soft_deletes_annotated.py +0 -0
  234. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/examples/testing_conftest.py +0 -0
  235. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/examples/timestamps.py +0 -0
  236. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/examples/timestamps_annotated.py +0 -0
  237. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/examples/transactions.py +0 -0
  238. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/api/connection.md +0 -0
  239. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/api/exceptions.md +0 -0
  240. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/api/fields.md +0 -0
  241. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/api/model.md +0 -0
  242. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/api/raw-sql.md +0 -0
  243. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/api/relationships.md +0 -0
  244. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/api/transactions.md +0 -0
  245. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/changelog.md +0 -0
  246. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/concepts/backends.md +0 -0
  247. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/concepts/identity-map.md +0 -0
  248. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/concepts/performance.md +0 -0
  249. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/concepts/type-safety.md +0 -0
  250. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/contributing.md +0 -0
  251. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/faq.md +0 -0
  252. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/getting-started/installation.md +0 -0
  253. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/getting-started/next-steps.md +0 -0
  254. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/getting-started/quickstart.md +0 -0
  255. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/guide/connections.md +0 -0
  256. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/guide/migrations.md +0 -0
  257. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/guide/mutations.md +0 -0
  258. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/guide/transactions.md +0 -0
  259. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/howto/multiple-databases.md +0 -0
  260. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/howto/pagination.md +0 -0
  261. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/howto/soft-deletes.md +0 -0
  262. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/howto/testing.md +0 -0
  263. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/howto/timestamps.md +0 -0
  264. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/index.md +0 -0
  265. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/pages/stylesheets/extra.css +0 -0
  266. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-05-25-001-fix-annotated-strenum-cold-hydration-plan.md +0 -0
  267. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-06-19-001-ir-first-roadmap.md +0 -0
  268. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-06-24-001-feat-ir-p8-119-wire-automigrate-plan.md +0 -0
  269. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-06-25-001-feat-ir-p8-120-parity-gate-plan.md +0 -0
  270. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-06-26-001-feat-ir-p8.5-140-shared-lowering-plan.md +0 -0
  271. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-06-26-002-feat-ir-p8.5-143-db-type-drop-plan.md +0 -0
  272. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-06-26-003-feat-ir-p8.5-144-reconcile-indexes-plan.md +0 -0
  273. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-06-28-001-feat-ir-p8.5-141-single-schema-ir-producer-plan.md +0 -0
  274. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-06-29-001-refactor-ir-p8.6-153-create-path-unification-plan.md +0 -0
  275. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-06-29-002-refactor-ir-p8.6-146-dialect-enum-unification-plan.md +0 -0
  276. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-06-30-001-refactor-ir-p8.6-158-check-renderer-plan.md +0 -0
  277. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-06-30-002-fix-ir-p8.6-155-deferred-annotations-plan.md +0 -0
  278. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-07-01-001-feat-ir-p8.6-162-typed-save-bind-plan.md +0 -0
  279. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-07-01-002-fix-ir-p8.6-154-datetime-tz-coarseness-plan.md +0 -0
  280. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-07-01-003-fix-ir-p8.6-165-blob-introspection-plan.md +0 -0
  281. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-07-02-001-fable-fixes-roadmap.md +0 -0
  282. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-07-02-002-feat-ff-a-172-typed-exceptions-plan.md +0 -0
  283. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-07-02-003-ff-c-native-decode-design.md +0 -0
  284. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-07-02-004-ff-c-c2-catalog-cache-design.md +0 -0
  285. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-07-02-005-ff-d-identity-routing-design.md +0 -0
  286. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-07-02-006-ff-d-identity-routing-plan.md +0 -0
  287. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-07-03-007-ff-e-registry-identity-design.md +0 -0
  288. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-07-03-008-ff-e-registry-identity-plan.md +0 -0
  289. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-07-06-009-ff-f-query-builder-1.0-design.md +0 -0
  290. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-07-06-010-ff-f-query-builder-1.0-plan.md +0 -0
  291. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-07-06-011-ff-g-hardening-design.md +0 -0
  292. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-07-06-012-ff-g-hardening-plan.md +0 -0
  293. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-07-06-013-ff-g2-operations-dedup-design.md +0 -0
  294. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-07-06-014-ff-g2-operations-dedup-plan.md +0 -0
  295. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/2026-07-06-015-docs-upgrade-guide-consolidation-plan.md +0 -0
  296. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/ir-first-migration-guide.md +0 -0
  297. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/plans/ir-first-release-checklist.md +0 -0
  298. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/rfc/ir-contracts-v1.md +0 -0
  299. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/solutions/README.md +0 -0
  300. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/solutions/architecture-patterns/ir-first-lowering-consolidation-audit.md +0 -0
  301. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/solutions/architecture-patterns/ir-first-merge-readiness-review.md +0 -0
  302. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/solutions/issues/pydantic-slots-missing-after-ferro-hydration.md +0 -0
  303. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/solutions/issues/python-3.14-deferred-annotation-typeerror-swallow.md +0 -0
  304. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/solutions/issues/sa-pk-column-nullable-divergence.md +0 -0
  305. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/solutions/issues/sa-vs-rust-unique-constraint-shape.md +0 -0
  306. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/solutions/issues/sqlite-integer-decimal-hydrates-as-none.md +0 -0
  307. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/solutions/issues/sqlite-null-hydrates-as-int-zero.md +0 -0
  308. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/solutions/issues/typed-where-null-panics-is-null.md +0 -0
  309. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/solutions/patterns/configurable-column-storage-types.md +0 -0
  310. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/solutions/patterns/ddl-on-live-engine.md +0 -0
  311. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/solutions/patterns/derived-type-and-naming-decision-table.md +0 -0
  312. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/solutions/patterns/foreign-key-index.md +0 -0
  313. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/solutions/patterns/index-unique-redundancy.md +0 -0
  314. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/solutions/patterns/ir-invariants.md +0 -0
  315. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/solutions/patterns/persistence-state.md +0 -0
  316. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/solutions/patterns/shadow-fk-columns.md +0 -0
  317. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/solutions/patterns/sqlite-alembic-reconnect-hydration-tests.md +0 -0
  318. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/docs/solutions/patterns/typed-null-binds.md +0 -0
  319. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/scripts/demo_queries.py +0 -0
  320. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/scripts/demo_queries_pre_v012.py +0 -0
  321. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/errors.rs +0 -0
  322. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/ferro/_bind_payload.py +0 -0
  323. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/ferro/exceptions.py +0 -0
  324. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/ferro/fields.py +0 -0
  325. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/ferro/migrations/__init__.py +0 -0
  326. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/ferro/py.typed +0 -0
  327. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/ferro/raw.py +0 -0
  328. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/ferro/session.py +0 -0
  329. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/introspect.rs +0 -0
  330. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/naming_ffi.rs +0 -0
  331. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/src/schema_bind.rs +0 -0
  332. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/__init__.py +0 -0
  333. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/db_backends.py +0 -0
  334. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/fixtures/ir_vectors/codec_registry_core_v1.json +0 -0
  335. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/fixtures/ir_vectors/schema_invoice_baseline_v1.json +0 -0
  336. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/fixtures/ir_vectors/schema_phase1_fixture_models_v1.json +0 -0
  337. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_aggregation.py +0 -0
  338. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_alembic_autogenerate.py +0 -0
  339. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_bulk_update.py +0 -0
  340. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_codec_plan.py +0 -0
  341. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_connection_redaction.py +0 -0
  342. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_constraints.py +0 -0
  343. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_cross_emitter_parity.py +0 -0
  344. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_crud.py +0 -0
  345. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_db_backends.py +0 -0
  346. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_db_type_integration.py +0 -0
  347. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_deletion.py +0 -0
  348. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_docs_examples.py +0 -0
  349. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_exception_mapping.py +0 -0
  350. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_exceptions.py +0 -0
  351. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_field_wrapper.py +0 -0
  352. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_helpers.py +0 -0
  353. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_hydration.py +0 -0
  354. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_hydration_equivalence.py +0 -0
  355. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_identity_memory.py +0 -0
  356. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_identity_refresh.py +0 -0
  357. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_identity_scoped_invalidation.py +0 -0
  358. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_identity_weakref.py +0 -0
  359. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_metaclass_internals.py +0 -0
  360. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_metadata.py +0 -0
  361. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_model_identity.py +0 -0
  362. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_models.py +0 -0
  363. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_mutation_pagination_guard.py +0 -0
  364. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_one_to_one.py +0 -0
  365. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_query_typing.py +0 -0
  366. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_raw_sql.py +0 -0
  367. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_refresh.py +0 -0
  368. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_relationship_engine.py +0 -0
  369. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_route_single_site.py +0 -0
  370. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_routing_errors.py +0 -0
  371. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_save_pk_edges.py +0 -0
  372. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_save_semantics.py +0 -0
  373. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_schema_constraints.py +0 -0
  374. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_shadow_fk_types.py +0 -0
  375. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_sqlite_alembic_reconnect_hydration.py +0 -0
  376. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_string_search.py +0 -0
  377. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_temporal_types.py +0 -0
  378. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_transactions.py +0 -0
  379. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_typed_null_binds.py +0 -0
  380. {ferro_orm-0.14.0 → ferro_orm-0.16.0}/tests/test_typed_save_bind.py +0 -0
@@ -15,33 +15,6 @@ permissions:
15
15
  contents: read
16
16
 
17
17
  jobs:
18
- changed-shadow-paths:
19
- name: Detect Shadow-Report Paths
20
- runs-on: ubuntu-latest
21
- if: github.event_name == 'pull_request'
22
- outputs:
23
- requires_shadow_reports: ${{ steps.filter.outputs.shadow }}
24
- steps:
25
- - name: Checkout repository
26
- uses: actions/checkout@v4
27
-
28
- - name: Detect planner/IR path changes
29
- id: filter
30
- uses: dorny/paths-filter@v3
31
- with:
32
- filters: |
33
- shadow:
34
- - 'src/operations.rs'
35
- - 'src/query.rs'
36
- - 'src/schema.rs'
37
- - 'src/migrate.rs'
38
- - 'src/backend.rs'
39
- - 'src/connection.rs'
40
- - 'src/ferro/ir/**'
41
- - 'crates/ferro-schema-ir/**'
42
- - 'tests/test_shadow_reports.py'
43
- - 'tests/fixtures/shadow_reports/**'
44
-
45
18
  lint-and-format:
46
19
  name: Lint & Format (Pre-commit / Prek)
47
20
  runs-on: ubuntu-latest
@@ -274,64 +247,6 @@ jobs:
274
247
  run: |
275
248
  uv run pytest -v -m "backend_matrix or postgres_only" --db-backends=sqlite,postgres
276
249
 
277
- test-shadow-reports-pr:
278
- name: Shadow reports (touched paths)
279
- runs-on: ubuntu-latest
280
- needs: [changed-shadow-paths]
281
- if: github.event_name == 'pull_request' && needs.changed-shadow-paths.outputs.requires_shadow_reports == 'true'
282
- services:
283
- postgres:
284
- image: postgres:17
285
- env:
286
- POSTGRES_USER: ferro
287
- POSTGRES_PASSWORD: ferro
288
- POSTGRES_DB: ferro
289
- ports:
290
- - 5432:5432
291
- options: >-
292
- --health-cmd "pg_isready -U ferro -d ferro"
293
- --health-interval 10s
294
- --health-timeout 5s
295
- --health-retries 5
296
- env:
297
- FERRO_SUPABASE_URL: postgresql://ferro:ferro@127.0.0.1:5432/ferro?sslmode=disable
298
- FERRO_SHADOW_RUNTIME: "1"
299
- FERRO_SHADOW_RUNTIME_STRICT: "1"
300
- steps:
301
- - name: Checkout repository
302
- uses: actions/checkout@v4
303
-
304
- - name: Set up Python
305
- uses: actions/setup-python@v5
306
- with:
307
- python-version: '3.13'
308
-
309
- - name: Install UV
310
- uses: astral-sh/setup-uv@v5
311
- with:
312
- enable-cache: true
313
-
314
- - name: Set up Rust
315
- uses: dtolnay/rust-toolchain@stable
316
-
317
- - name: Cache Rust build
318
- uses: Swatinem/rust-cache@v2
319
- with:
320
- prefix-key: v1
321
- cache-on-failure: true
322
-
323
- - name: Install dependencies
324
- run: |
325
- uv sync --only-group ci-test --no-install-project --python 3.13
326
-
327
- - name: Build Rust extension
328
- run: |
329
- uv run maturin develop
330
-
331
- - name: Verify stable shadow reports
332
- run: |
333
- uv run pytest -v tests/test_shadow_reports.py::test_shadow_report_fixture_stable --db-backends=sqlite,postgres
334
-
335
250
  check-conventional-commits:
336
251
  name: Check Conventional Commits
337
252
  runs-on: ubuntu-latest
@@ -381,7 +296,7 @@ jobs:
381
296
 
382
297
  all-checks:
383
298
  name: All Checks Passed
384
- needs: [changed-shadow-paths, lint-and-format, test-python-pr, test-python-main, test-python-backend-matrix, test-shadow-reports-pr, test-rust]
299
+ needs: [lint-and-format, test-python-pr, test-python-main, test-python-backend-matrix, test-rust]
385
300
  runs-on: ubuntu-latest
386
301
  if: always()
387
302
  steps:
@@ -390,15 +305,10 @@ jobs:
390
305
  run: |
391
306
  ok() { [[ "$1" == "success" || "$1" == "skipped" ]]; }
392
307
 
393
- if [[ "${{ needs.changed-shadow-paths.result }}" == "failure" ]]; then
394
- echo "Shadow path detection failed; refusing to treat shadow gate as passed."
395
- exit 1
396
- fi
397
308
  if ! ok "${{ needs.lint-and-format.result }}"; then exit 1; fi
398
309
  if ! ok "${{ needs.test-python-pr.result }}"; then exit 1; fi
399
310
  if ! ok "${{ needs.test-python-main.result }}"; then exit 1; fi
400
311
  if ! ok "${{ needs.test-python-backend-matrix.result }}"; then exit 1; fi
401
- if ! ok "${{ needs.test-shadow-reports-pr.result }}"; then exit 1; fi
402
312
  if ! ok "${{ needs.test-rust.result }}"; then exit 1; fi
403
313
 
404
314
  echo "All checks passed!"
@@ -8,6 +8,11 @@ on:
8
8
  required: false
9
9
  type: boolean
10
10
  default: false
11
+ highlights:
12
+ description: 'Markdown prepended to the top of the GitHub Release body'
13
+ required: false
14
+ type: string
15
+ default: ''
11
16
 
12
17
  concurrency:
13
18
  group: release-${{ github.workflow }}-${{ github.ref }}
@@ -185,6 +190,20 @@ jobs:
185
190
  echo "release_ref=$RELEASE_TAG" >> "$GITHUB_OUTPUT"
186
191
  echo "Using release ref: $RELEASE_TAG"
187
192
 
193
+ - name: Prepend highlights to GitHub Release
194
+ if: steps.verify_release.outputs.release_created == 'true' && inputs.highlights != ''
195
+ env:
196
+ GH_TOKEN: ${{ secrets.RELEASE_TOKEN || secrets.GITHUB_TOKEN }}
197
+ # Passed via env (not inline ${{ }}) so backticks, $, and quotes in the
198
+ # prose can't break the script or inject shell.
199
+ HIGHLIGHTS: ${{ inputs.highlights }}
200
+ shell: bash
201
+ run: |
202
+ TAG="${{ steps.release_ref.outputs.release_ref }}"
203
+ BODY="$(gh release view "$TAG" --json body -q .body)"
204
+ { printf '%s\n' "$HIGHLIGHTS"; printf '\n---\n\n'; printf '%s\n' "$BODY"; } > /tmp/notes.md
205
+ gh release edit "$TAG" --notes-file /tmp/notes.md
206
+
188
207
  - name: Release summary
189
208
  if: always()
190
209
  shell: bash
@@ -249,9 +249,12 @@ Rules:
249
249
  checking (`User.age >= 18` types as `bool`; `where()` expects
250
250
  `QueryNode | Predicate`). Docs say so explicitly wherever the style is
251
251
  shown.
252
- - **`order_by` is not a predicate** and keeps attribute style
253
- (`order_by(User.age, "desc")`). Passing a lambda to `order_by` silently
254
- produces a junk column name — never show it.
252
+ - **`order_by` is not a predicate**, but its lambda selector
253
+ (`order_by(lambda u: u.age, "desc")`) is validated and is the documented
254
+ style — and it is the ONLY way to order by a related column
255
+ (`order_by(lambda t: t.account.label)`), which relation traversal requires.
256
+ Attribute style is not accepted — `order_by` takes a column-name string or
257
+ a lambda selector (anything else raises `TypeError`).
255
258
 
256
259
  The canonical comparisons live in `docs/pages/guide/queries.md`
257
260
  ("Predicate Styles") and `docs/pages/concepts/query-typing.md`; everywhere
@@ -318,3 +321,19 @@ Rules:
318
321
  This applies to brainstorming, design discussions, PR descriptions, issue
319
322
  comments, and any explanation directed at the maintainer. It governs how work is
320
323
  communicated, not what gets built.
324
+
325
+ ---
326
+
327
+ ## Agent skills
328
+
329
+ ### Issue tracker
330
+
331
+ GitHub Issues on `syn54x/ferro-orm`; external PRs are a triage surface. See `docs/agents/issue-tracker.md`.
332
+
333
+ ### Triage labels
334
+
335
+ Canonical five-role vocabulary (`needs-triage`, `needs-info`, `ready-for-agent`, `ready-for-human`, `wontfix`). See `docs/agents/triage-labels.md`.
336
+
337
+ ### Domain docs
338
+
339
+ Single-context — `CONTEXT.md` at repo root, ADRs in `docs/adr/`. See `docs/agents/domain.md`.
@@ -1,6 +1,137 @@
1
1
  # CHANGELOG
2
2
 
3
3
 
4
+ ## v0.16.0 (2026-07-13)
5
+
6
+ ### Chores
7
+
8
+ - ADR-0009 aggregate projections + output-alias/traversed-projection/aggregate-projection glossary
9
+ ([`51b8c0c`](https://github.com/syn54x/ferro-orm/commit/51b8c0c5fef2d383561b0127028ad5e7eb5bbbc3))
10
+
11
+ ### Documentation
12
+
13
+ - Aggregation guide, projection reference, typing page
14
+ ([#296](https://github.com/syn54x/ferro-orm/pull/296),
15
+ [`44230c5`](https://github.com/syn54x/ferro-orm/commit/44230c55b53544788210f0664dc2a32634409839))
16
+
17
+ ### Features
18
+
19
+ - Global aggregates — count/sum/avg/min/max ([#294](https://github.com/syn54x/ferro-orm/pull/294),
20
+ [`1679e44`](https://github.com/syn54x/ferro-orm/commit/1679e44399b8ecc9f47a4f416dbf9aa821173b16))
21
+
22
+ - Grouped aggregates, order_by rules, verb guardrails
23
+ ([#295](https://github.com/syn54x/ferro-orm/pull/295),
24
+ [`2408ad7`](https://github.com/syn54x/ferro-orm/commit/2408ad7ae91cf6e7024e7297764191967596e869))
25
+
26
+ - Traversed projection + output aliases ([#293](https://github.com/syn54x/ferro-orm/pull/293),
27
+ [`1e73e2a`](https://github.com/syn54x/ferro-orm/commit/1e73e2a8f53a4d56d3caaa38a754166023e4c361))
28
+
29
+ ### Refactoring
30
+
31
+ - QueryIR v5 — the expr record-field shape ([#292](https://github.com/syn54x/ferro-orm/pull/292),
32
+ [`dc779d0`](https://github.com/syn54x/ferro-orm/commit/dc779d0e1184e6c87e19872302a045c3f36b8e5f))
33
+
34
+
35
+ ## v0.15.0 (2026-07-11)
36
+
37
+ ### Chores
38
+
39
+ - ADR-0008 populated relations + include/populated-relation glossary
40
+ ([`a1b273d`](https://github.com/syn54x/ferro-orm/commit/a1b273dc71b2b0f77e08e69808281ab5c25ffaea))
41
+
42
+ - Amend registration adr with review outcomes (operation-seam sync, build-then-swap, deregistration)
43
+ ([`fcb8db3`](https://github.com/syn54x/ferro-orm/commit/fcb8db385ef5c835121420b0d90c4a9bbfd8a1f8))
44
+
45
+ - New adrs and context
46
+ ([`3ea617c`](https://github.com/syn54x/ferro-orm/commit/3ea617c2ff418aa91fdf2d72470826b0aeec7242))
47
+
48
+ - Pin failed-resolve retryability in registration adr
49
+ ([`d5895ba`](https://github.com/syn54x/ferro-orm/commit/d5895bae311cf9a2cff230b16a975aa1a1e9a2ad))
50
+
51
+ - Pin zero-DDL, single-flight, and pure-Python clean-path invariants in registration adr
52
+ ([`09673f3`](https://github.com/syn54x/ferro-orm/commit/09673f334128cba7af7d94db38c6f43acd241d37))
53
+
54
+ - Registration adr
55
+ ([`05c5732`](https://github.com/syn54x/ferro-orm/commit/05c5732125370d1e2b539f83f89e200190c67bd0))
56
+
57
+ - Relation traversal ADR and context
58
+ ([`9151856`](https://github.com/syn54x/ferro-orm/commit/9151856364ea6ccc8ca125102302b5115e6a9ae0))
59
+
60
+ - Triage and update old plan statuses
61
+ ([`2f3e3c0`](https://github.com/syn54x/ferro-orm/commit/2f3e3c0584eec37815e2520852077b9c08885546))
62
+
63
+ ### Continuous Integration
64
+
65
+ - **release**: Custom highlights atop the GitHub Release notes
66
+ ([#275](https://github.com/syn54x/ferro-orm/pull/275),
67
+ [`f705938`](https://github.com/syn54x/ferro-orm/commit/f70593839af93ec902a0537f0f1ae73a34c425c2))
68
+
69
+ ### Documentation
70
+
71
+ - ADR-0007 materialization plan + complete-instance glossary
72
+ ([`4acc879`](https://github.com/syn54x/ferro-orm/commit/4acc879b23fcd5bc540b5ed7ee7129d95124ec77))
73
+
74
+ ### Features
75
+
76
+ - Atomic bulk registration install with fingerprint gate (#244)
77
+ ([#251](https://github.com/syn54x/ferro-orm/pull/251),
78
+ [`20c6061`](https://github.com/syn54x/ferro-orm/commit/20c6061c376faab78a7e3dc2496e5dd3cc123115))
79
+
80
+ - Compile ModelCodecPlan from SchemaIR at registration
81
+ ([#239](https://github.com/syn54x/ferro-orm/pull/239),
82
+ [`7e15fdc`](https://github.com/syn54x/ferro-orm/commit/7e15fdcb9f32938857ad21838feca978591fd044))
83
+
84
+ - Generation-counter dirty tracking with assemble-not-recompile (#245)
85
+ ([#252](https://github.com/syn54x/ferro-orm/pull/252),
86
+ [`2790e56`](https://github.com/syn54x/ferro-orm/commit/2790e566437d6e67f1f5c3abe555162ebb62598d))
87
+
88
+ - Joined-row hydration — QueryIR v4 + populated relations via include()
89
+ ([#289](https://github.com/syn54x/ferro-orm/pull/289),
90
+ [`4335417`](https://github.com/syn54x/ferro-orm/commit/4335417cbfd33da95b6ea52971d6f5e805af9ad7))
91
+
92
+ - JSONB column support (#260) ([#266](https://github.com/syn54x/ferro-orm/pull/266),
93
+ [`19f8cee`](https://github.com/syn54x/ferro-orm/commit/19f8cee3b7be3a570265f1269c735ac9093ab16a))
94
+
95
+ - Partial materialization — QueryIR v3 + partial selects (Rows/Row)
96
+ ([#283](https://github.com/syn54x/ferro-orm/pull/283),
97
+ [`e44129b`](https://github.com/syn54x/ferro-orm/commit/e44129bf966fa349b5bf637a5976c99b88c644b2))
98
+
99
+ - Query-time joins — relation traversal for filter and sort (stage 1)
100
+ ([#276](https://github.com/syn54x/ferro-orm/pull/276),
101
+ [`55dc386`](https://github.com/syn54x/ferro-orm/commit/55dc386f087fd6506d1713c9333bc11103bc96ac))
102
+
103
+ - Sync registration at ORM operation seam (#247)
104
+ ([#254](https://github.com/syn54x/ferro-orm/pull/254),
105
+ [`8409322`](https://github.com/syn54x/ferro-orm/commit/84093226a86b2cdc17afdce00d36fc4782c614c4))
106
+
107
+ ### Refactoring
108
+
109
+ - Canonicalize registry keys — derive register_model key from model identity
110
+ ([#250](https://github.com/syn54x/ferro-orm/pull/250),
111
+ [`d835c96`](https://github.com/syn54x/ferro-orm/commit/d835c96f08094ca0a8f7df0947ba9440f956edc9))
112
+
113
+ - Centralize register/deregister registry entrypoints (#243)
114
+ ([#248](https://github.com/syn54x/ferro-orm/pull/248),
115
+ [`2f2be69`](https://github.com/syn54x/ferro-orm/commit/2f2be69ac9dc859621afa5938f08b7f167af1870))
116
+
117
+ - Compile ColumnSpec column facts once (#255) ([#256](https://github.com/syn54x/ferro-orm/pull/256),
118
+ [`75fe1de`](https://github.com/syn54x/ferro-orm/commit/75fe1de5f3aee8f870e1e189f639b7466445c6dd))
119
+
120
+ - Drop RegisteredModel.schema — IR-first registry cleanup
121
+ ([#241](https://github.com/syn54x/ferro-orm/pull/241),
122
+ [`fc3b9f9`](https://github.com/syn54x/ferro-orm/commit/fc3b9f9c50bbd80f3915663e6278712df35fee96))
123
+
124
+ - Remove legacy migration shims and shadow runtime
125
+ ([#237](https://github.com/syn54x/ferro-orm/pull/237),
126
+ [`c2117b3`](https://github.com/syn54x/ferro-orm/commit/c2117b3351189912436c90552e127018db438c34))
127
+
128
+ ### Testing
129
+
130
+ - Pin provisional import — Python-only registration until connect (#246)
131
+ ([#253](https://github.com/syn54x/ferro-orm/pull/253),
132
+ [`ca111b5`](https://github.com/syn54x/ferro-orm/commit/ca111b5672c647cbb021fd63bf59038f0028f303))
133
+
134
+
4
135
  ## v0.14.0 (2026-07-07)
5
136
 
6
137
  ### Bug Fixes
@@ -0,0 +1,101 @@
1
+ # Ferro ORM
2
+
3
+ A Python ORM with a Rust core. Models are Pydantic subclasses; schema compiles to SchemaIR and fans out to runtime DDL and the Alembic bridge.
4
+
5
+ ## Language
6
+
7
+ **Materialized View**:
8
+ A PostgreSQL database object that stores the result of a query and is refreshed on demand. In Ferro it is a read-only `MaterializedView` subclass — queryable through the normal ORM, not writable.
9
+ _Avoid_: Snapshot table, cache table, denormalized table
10
+
11
+ **Refresh**:
12
+ The explicit operation that repopulates a materialized view from its defining SELECT. Ferro never refreshes at connect time; the user calls `refresh()` when they want updated data.
13
+ _Avoid_: Auto-refresh, sync, rebuild
14
+
15
+ **Postgres-only schema object**:
16
+ A model artifact that Ferro emits only on PostgreSQL. On SQLite the class still registers for imports and typing, but DDL is skipped and querying raises a clear error.
17
+ _Avoid_: Dialect-specific model, PG-only table
18
+
19
+ **Redefine**:
20
+ Replacing an existing materialized view by dropping and recreating it when its defining SELECT changes. Authorized by `migrate_materialized_redefine=True`; otherwise connect fails loudly on drift.
21
+ _Avoid_: Alter, migrate, update
22
+
23
+ **Materialized view column**:
24
+ A flat, typed field on a `MaterializedView` — same declarations as `Model` fields, but no `ForeignKey`, `BackRef`, or `ManyToMany`. Reference related entities by scalar columns (`order_id: int`), not relations.
25
+ _Avoid_: Relation column, FK field
26
+
27
+ **Materialized query**:
28
+ The `ClassVar` SQL string (`__materialized_query__`) that defines what rows a materialized view stores. Declared alongside typed fields; Ferro validates that SELECT output matches the field contract.
29
+ _Avoid_: Select SQL, view definition, query body
30
+
31
+ **Read-only view**:
32
+ A `MaterializedView` that can be queried but never mutated. `save()`, `delete()`, and `create()` raise a clear error.
33
+ _Avoid_: Immutable model, snapshot model
34
+
35
+ **Storage token**:
36
+ A word in the canonical `db_type` vocabulary (`text`, `bigint`, `timestamptz`, `jsonb`, …) naming how a column is stored. One shared vocabulary feeds every emitter; a token never means different things to different emitters.
37
+ _Avoid_: SQL type string, dialect type, column type name
38
+
39
+ **Storage lowering**:
40
+ The dialect-side degrade of a storage token to the nearest type a backend supports (e.g. `jsonb` stores as plain JSON on SQLite). Lowering is silent and documented; it never changes value semantics — only the on-disk representation.
41
+ _Avoid_: Fallback type, emulation, downgrade
42
+
43
+ **Json-family field**:
44
+ A field whose values Ferro stores as JSON documents: `dict`, `list` (any element type, including nested models), or a nested Pydantic model. Only json-family fields may opt into JSON storage tokens such as `jsonb`.
45
+ _Avoid_: Object field, blob field, document column
46
+
47
+ **Column spec**:
48
+ The single authoritative record of one column's facts — identity, type, and constraints — derived exactly once from the field declaration. Provisional at class-body time; authoritative once relationship resolution completes.
49
+ _Avoid_: Column metadata, enriched schema property, field dict
50
+
51
+ **Relation traversal**:
52
+ Attribute access on a declared forward-FK field inside a query lambda (`lambda t: t.account.ledger_id`), reaching a related model's columns from the root. Traversal narrows the result to rows where the relation exists; keeping rows without the relation requires an explicit left join.
53
+ _Avoid_: Join inference, nested filter, path lookup, string path
54
+
55
+ **Relation path**:
56
+ The ordered sequence of forward-FK hops a traversal walks (`account`, or `account → owner`). A path is the identity of a join: the same path referenced anywhere in a query is one join, and distinct paths to the same model are distinct joins. Left-join requests apply to a whole path.
57
+ _Avoid_: Join alias, lookup chain, dotted path string
58
+
59
+ **Shape-preserving query**:
60
+ The invariant that filtering and ordering never change what a query returns — a query over Transaction yields Transaction instances regardless of which relations its predicates traverse. Only an explicit projection operation may change the result shape.
61
+ _Avoid_: Implicit projection, row narrowing
62
+
63
+ **Complete-instance invariant**:
64
+ A model instance always carries a complete row — there is no such thing as a partial or deferred-field model instance, anywhere. Anything narrower than a full row (a column subset, an aggregate) comes back as a projected record, never as the model type.
65
+ _Avoid_: Partial instance, deferred field, lightweight model, .only()
66
+
67
+ **Projected record**:
68
+ The result of an explicit projection — a typed record of named values that is not a model instance and cannot be saved, refreshed, or identity-mapped. Column subsets and aggregation results are projected records; complete model rows are not. Realized as `Row`, delivered in the list-like `Rows` container.
69
+ _Avoid_: Partial model, row dict, value tuple
70
+
71
+ **Include**:
72
+ The explicit request (`.include(lambda t: t.account.owner)`) that a query populate a forward-FK relation path — the data axis of a query, distinct from joins (membership) and projection (shape). Including a path populates every hop along it and never changes which rows come back.
73
+ _Avoid_: Eager load, select_related, prefetch, join-fetch
74
+
75
+ **Populated relation**:
76
+ A forward-FK field carrying its complete related instance, attached by an explicit include on the query. Attribute access returns the instance directly — no await, no query — matching the field's declared type. An unpopulated relation keeps the awaitable contract; population changes cost and attached data, never the result type (there is no separate "loaded" model type).
77
+ _Avoid_: Eager-loaded field, select_related, prefetched attribute, joined attribute
78
+
79
+ **Materialization plan**:
80
+ A query's declaration of what its result columns become: complete root instances (every query today), a projected record of named fields, or — in the future — a populated instance graph. Every query carries exactly one plan; the plan travels with the query rather than being inferred from its column list.
81
+ _Avoid_: Select list, projection spec, hydration mode flag
82
+
83
+ **Aggregate projection**:
84
+ A projection containing at least one aggregate field. Each group collapses to exactly one projected record: every non-aggregate field is a group key, so grouping is derived from the projection and never declared separately. With no non-aggregate fields, the whole result collapses to a single record. Grouping collapses rows — bucketing complete instances by a key ("partitioning") is a different, client-side operation and is not grouping.
85
+ _Avoid_: Group-by query, summary query, rollup, partition
86
+
87
+ **Traversed projection**:
88
+ A projected record field whose source column lives across a forward-FK relation path (`select(lambda t: t.account.name)`). Projection traversal narrows exactly like predicate traversal (ADR-0006). Unaliased, the field takes the bare leaf column name; two selected fields sharing an output name is a build-time error, resolved with an output alias.
89
+ _Avoid_: Nested select, join column, related-field pull
90
+
91
+ **Output alias**:
92
+ A user-chosen name for one field of a projected record, given as the key in a dict-returning selector (`select(lambda t: {"account_name": t.account.name})`). Aliases name output fields only — never joins or tables; the relation path remains the sole join identity.
93
+ _Avoid_: Column alias, AS label, join alias
94
+
95
+ **Provisional registration**:
96
+ The per-model state installed when a class body finishes executing — enough for runtime codec and PK metadata, but relationships may still be pending and the modelset is not yet authoritative for DDL.
97
+ _Avoid_: Import-time registration, partial registry
98
+
99
+ **Resolved registration**:
100
+ The registry epoch after relationship resolution completes — join tables exist, shadow FK columns are wired, and the SchemaIR modelset is authoritative for DDL and auto-migrate.
101
+ _Avoid_: Final registration, committed registry
@@ -89,15 +89,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
89
89
 
90
90
  [[package]]
91
91
  name = "bytes"
92
- version = "1.12.0"
92
+ version = "1.12.1"
93
93
  source = "registry+https://github.com/rust-lang/crates.io-index"
94
- checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593"
94
+ checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04"
95
95
 
96
96
  [[package]]
97
97
  name = "cc"
98
- version = "1.2.66"
98
+ version = "1.2.67"
99
99
  source = "registry+https://github.com/rust-lang/crates.io-index"
100
- checksum = "f5d6cac793997bd970000024b2934968efe83b382de4fdcf4fcb46b6ee4ad996"
100
+ checksum = "e17dd265a7d0f31ef544e1b20e03add05d3b45b491b633b10d67145d2acc1a38"
101
101
  dependencies = [
102
102
  "find-msvc-tools",
103
103
  "shlex",
@@ -327,7 +327,7 @@ dependencies = [
327
327
 
328
328
  [[package]]
329
329
  name = "ferro"
330
- version = "0.14.0"
330
+ version = "0.16.0"
331
331
  dependencies = [
332
332
  "chrono",
333
333
  "dashmap",
@@ -875,9 +875,9 @@ dependencies = [
875
875
 
876
876
  [[package]]
877
877
  name = "memchr"
878
- version = "2.8.2"
878
+ version = "2.8.3"
879
879
  source = "registry+https://github.com/rust-lang/crates.io-index"
880
- checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4"
880
+ checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
881
881
 
882
882
  [[package]]
883
883
  name = "memoffset"
@@ -936,11 +936,10 @@ dependencies = [
936
936
 
937
937
  [[package]]
938
938
  name = "num-iter"
939
- version = "0.1.45"
939
+ version = "0.1.46"
940
940
  source = "registry+https://github.com/rust-lang/crates.io-index"
941
- checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf"
941
+ checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b"
942
942
  dependencies = [
943
- "autocfg",
944
943
  "num-integer",
945
944
  "num-traits",
946
945
  ]
@@ -1168,9 +1167,9 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
1168
1167
 
1169
1168
  [[package]]
1170
1169
  name = "rand"
1171
- version = "0.8.6"
1170
+ version = "0.8.7"
1172
1171
  source = "registry+https://github.com/rust-lang/crates.io-index"
1173
- checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a"
1172
+ checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a"
1174
1173
  dependencies = [
1175
1174
  "libc",
1176
1175
  "rand_chacha",
@@ -1382,9 +1381,9 @@ dependencies = [
1382
1381
 
1383
1382
  [[package]]
1384
1383
  name = "sha1"
1385
- version = "0.10.6"
1384
+ version = "0.10.7"
1386
1385
  source = "registry+https://github.com/rust-lang/crates.io-index"
1387
- checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
1386
+ checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8"
1388
1387
  dependencies = [
1389
1388
  "cfg-if",
1390
1389
  "cpufeatures",
@@ -1757,9 +1756,9 @@ dependencies = [
1757
1756
 
1758
1757
  [[package]]
1759
1758
  name = "tinyvec"
1760
- version = "1.11.0"
1759
+ version = "1.12.0"
1761
1760
  source = "registry+https://github.com/rust-lang/crates.io-index"
1762
- checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3"
1761
+ checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f"
1763
1762
  dependencies = [
1764
1763
  "tinyvec_macros",
1765
1764
  ]
@@ -1906,9 +1905,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
1906
1905
 
1907
1906
  [[package]]
1908
1907
  name = "uuid"
1909
- version = "1.23.4"
1908
+ version = "1.23.5"
1910
1909
  source = "registry+https://github.com/rust-lang/crates.io-index"
1911
- checksum = "bf80a72845275afea99e7f2b434723d3bc7e38470fcd1c7ed39a599c73319a53"
1910
+ checksum = "ea5fab0d6c3c01ae70085a09cb03d4c7a1d6314e2b3e075392783396d724ca0a"
1912
1911
  dependencies = [
1913
1912
  "getrandom 0.4.3",
1914
1913
  "js-sys",
@@ -2250,18 +2249,18 @@ dependencies = [
2250
2249
 
2251
2250
  [[package]]
2252
2251
  name = "zerocopy"
2253
- version = "0.8.53"
2252
+ version = "0.8.54"
2254
2253
  source = "registry+https://github.com/rust-lang/crates.io-index"
2255
- checksum = "75726053136156d419e285b9b7eddaaea9e3fea6ce32eed44a89901f0bd98de1"
2254
+ checksum = "b7cbbc0a705a0fd05cc3676525980d2bf5a9bc4adac6d6475209a7887cf59d19"
2256
2255
  dependencies = [
2257
2256
  "zerocopy-derive",
2258
2257
  ]
2259
2258
 
2260
2259
  [[package]]
2261
2260
  name = "zerocopy-derive"
2262
- version = "0.8.53"
2261
+ version = "0.8.54"
2263
2262
  source = "registry+https://github.com/rust-lang/crates.io-index"
2264
- checksum = "4714fd92cf900833d49538023a9b3915155210801d1c1169eba513b2addefd71"
2263
+ checksum = "e2e817b7b52d0c7358d3246da9d69935ebb18116b2b102b4230dac079b4862f5"
2265
2264
  dependencies = [
2266
2265
  "proc-macro2",
2267
2266
  "quote",
@@ -2330,6 +2329,6 @@ dependencies = [
2330
2329
 
2331
2330
  [[package]]
2332
2331
  name = "zmij"
2333
- version = "1.0.21"
2332
+ version = "1.0.22"
2334
2333
  source = "registry+https://github.com/rust-lang/crates.io-index"
2335
- checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
2334
+ checksum = "bd2f034a4bebf216c9e4b7083603e024cf930873fd67830cfb083c9fa33129d9"
@@ -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.14.0"
6
+ version = "0.16.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.14.0
3
+ Version: 0.16.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'