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.
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/.github/workflows/ci.yml +1 -2
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/AGENTS.md +35 -17
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/CHANGELOG.md +100 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/Cargo.lock +33 -20
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/Cargo.toml +3 -2
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/PKG-INFO +4 -4
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/README.md +3 -3
- {ferro_orm-0.12.2/crates/ferro-migrate → ferro_orm-0.13.0/crates/ferro-ddl-lowering}/Cargo.toml +3 -1
- ferro_orm-0.13.0/crates/ferro-ddl-lowering/src/lib.rs +875 -0
- ferro_orm-0.13.0/crates/ferro-migrate/Cargo.toml +10 -0
- ferro_orm-0.13.0/crates/ferro-migrate/src/emit.rs +640 -0
- ferro_orm-0.13.0/crates/ferro-migrate/src/lib.rs +322 -0
- ferro_orm-0.13.0/crates/ferro-migrate/src/tests.rs +1215 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/crates/ferro-schema-ir/src/lib.rs +101 -2
- ferro_orm-0.13.0/docs/brainstorms/2026-06-24-ir-p8-119-wire-automigrate-requirements.md +116 -0
- ferro_orm-0.13.0/docs/brainstorms/2026-06-25-ir-p8-120-parity-gate-requirements.md +119 -0
- ferro_orm-0.13.0/docs/brainstorms/2026-06-26-ir-p8.5-140-shared-lowering-requirements.md +111 -0
- ferro_orm-0.13.0/docs/brainstorms/2026-06-26-ir-p8.5-143-db-type-drop-requirements.md +116 -0
- ferro_orm-0.13.0/docs/brainstorms/2026-06-26-ir-p8.5-144-reconcile-indexes-requirements.md +130 -0
- ferro_orm-0.13.0/docs/brainstorms/2026-06-28-ir-p8.5-141-single-schema-ir-producer-requirements.md +166 -0
- ferro_orm-0.13.0/docs/brainstorms/2026-06-29-ir-p8.6-146-dialect-enum-unification-requirements.md +264 -0
- ferro_orm-0.13.0/docs/brainstorms/2026-06-29-ir-p8.6-153-create-path-ir-requirements.md +331 -0
- ferro_orm-0.13.0/docs/brainstorms/2026-06-30-ir-p8.6-155-deferred-annotations-requirements.md +338 -0
- ferro_orm-0.13.0/docs/brainstorms/2026-06-30-ir-p8.6-158-check-renderer-requirements.md +358 -0
- ferro_orm-0.13.0/docs/brainstorms/2026-07-01-ir-p8.6-154-datetime-tz-coarseness-requirements.md +327 -0
- ferro_orm-0.13.0/docs/brainstorms/2026-07-01-ir-p8.6-162-typed-save-bind-requirements.md +307 -0
- ferro_orm-0.13.0/docs/brainstorms/2026-07-01-ir-p8.6-165-blob-introspection-false-positive-requirements.md +353 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/examples/pagination.py +1 -1
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/examples/predicates.py +9 -9
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/examples/predicates_annotated.py +2 -2
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/examples/quickstart.py +5 -5
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/examples/quickstart_annotated.py +2 -2
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/examples/relationships_annotated.py +1 -1
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/examples/soft_deletes.py +1 -1
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/examples/soft_deletes_annotated.py +2 -2
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/examples/timestamps_annotated.py +1 -1
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/api/queries.md +1 -1
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/concepts/architecture.md +15 -4
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/concepts/query-typing.md +7 -7
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/getting-started/quickstart.md +1 -1
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/guide/connections.md +2 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/guide/migrations.md +3 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/guide/queries.md +2 -2
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/guide/transactions.md +2 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/howto/migrating-to-v0-12-0.md +3 -1
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/howto/timestamps.md +12 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/plans/2026-06-19-001-ir-first-roadmap.md +244 -24
- ferro_orm-0.13.0/docs/plans/2026-06-24-001-feat-ir-p8-119-wire-automigrate-plan.md +301 -0
- ferro_orm-0.13.0/docs/plans/2026-06-25-001-feat-ir-p8-120-parity-gate-plan.md +286 -0
- ferro_orm-0.13.0/docs/plans/2026-06-26-001-feat-ir-p8.5-140-shared-lowering-plan.md +311 -0
- ferro_orm-0.13.0/docs/plans/2026-06-26-002-feat-ir-p8.5-143-db-type-drop-plan.md +229 -0
- ferro_orm-0.13.0/docs/plans/2026-06-26-003-feat-ir-p8.5-144-reconcile-indexes-plan.md +503 -0
- ferro_orm-0.13.0/docs/plans/2026-06-28-001-feat-ir-p8.5-141-single-schema-ir-producer-plan.md +394 -0
- ferro_orm-0.13.0/docs/plans/2026-06-29-001-refactor-ir-p8.6-153-create-path-unification-plan.md +362 -0
- ferro_orm-0.13.0/docs/plans/2026-06-29-002-refactor-ir-p8.6-146-dialect-enum-unification-plan.md +388 -0
- ferro_orm-0.13.0/docs/plans/2026-06-30-001-refactor-ir-p8.6-158-check-renderer-plan.md +670 -0
- ferro_orm-0.13.0/docs/plans/2026-06-30-002-fix-ir-p8.6-155-deferred-annotations-plan.md +341 -0
- ferro_orm-0.13.0/docs/plans/2026-07-01-001-feat-ir-p8.6-162-typed-save-bind-plan.md +917 -0
- ferro_orm-0.13.0/docs/plans/2026-07-01-002-fix-ir-p8.6-154-datetime-tz-coarseness-plan.md +467 -0
- ferro_orm-0.13.0/docs/plans/2026-07-01-003-fix-ir-p8.6-165-blob-introspection-plan.md +307 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/plans/ir-first-migration-guide.md +10 -4
- ferro_orm-0.13.0/docs/solutions/architecture-patterns/ir-first-lowering-consolidation-audit.md +246 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/architecture-patterns/ir-first-merge-readiness-review.md +1 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/patterns/cross-emitter-ddl-parity.md +28 -1
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/pyproject.toml +1 -1
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/backend.rs +69 -40
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/codec.rs +111 -17
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/connection.rs +8 -8
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/__init__.py +74 -3
- ferro_orm-0.13.0/src/ferro/_bind_payload.py +51 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/_core.pyi +36 -9
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/ir/compiler.py +14 -23
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/metaclass.py +16 -1
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/migrations/alembic.py +18 -4
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/models.py +9 -7
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/query/builder.py +11 -13
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/query/nodes.py +4 -4
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/session.py +22 -16
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/hydration.rs +28 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/introspect.rs +105 -5
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/lib.rs +16 -4
- ferro_orm-0.13.0/src/migrate.rs +2312 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/operations.rs +521 -131
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/query.rs +82 -18
- ferro_orm-0.13.0/src/schema.rs +569 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/state.rs +155 -4
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/fixtures/ir_vectors/schema_invoice_baseline_v1.json +11 -8
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/fixtures/ir_vectors/schema_phase1_fixture_models_v1.json +1 -10
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/fixtures/shadow_reports/postgres.json +19 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/fixtures/shadow_reports/sqlite.json +19 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_alembic_bridge.py +26 -0
- ferro_orm-0.13.0/tests/test_auto_migrate.py +1188 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_db_type_cross_emitter_parity.py +65 -15
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_ir_vectors_contract.py +92 -1
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_metaclass_internals.py +44 -5
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_migrate_plan.py +86 -1
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_session.py +168 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_shadow_reports.py +34 -12
- ferro_orm-0.13.0/tests/test_typed_save_bind.py +188 -0
- ferro_orm-0.12.2/crates/ferro-migrate/src/lib.rs +0 -271
- ferro_orm-0.12.2/src/migrate.rs +0 -1481
- ferro_orm-0.12.2/src/schema.rs +0 -1166
- ferro_orm-0.12.2/tests/test_auto_migrate.py +0 -582
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/.github/PERMISSIONS.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/.github/PYPI_CHECKLIST.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/.github/PYPI_SETUP.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/.github/generated/wheels.generated.yml +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/.github/pull_request_template.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/.github/workflows/packaging-smoke.yml +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/.github/workflows/publish-docs.yml +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/.github/workflows/publish.yml +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/.github/workflows/release.yml +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/.gitignore +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/.pre-commit-config.yaml +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/.python-version +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/CONTRIBUTING.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/LICENSE +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/crates/ferro-schema-ir/Cargo.toml +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/brainstorms/2026-04-29-named-connections-role-routing-requirements.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/brainstorms/2026-05-08-typed-query-predicates-requirements.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/brainstorms/2026-05-13-configurable-column-storage-types-requirements.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/brainstorms/2026-05-14-autogenerate-support-for-db-type-requirements.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/brainstorms/2026-05-25-annotated-strenum-cold-hydration-requirements.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/examples/multiple_databases.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/examples/mutations.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/examples/raw_sql.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/examples/relationships.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/examples/testing_conftest.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/examples/timestamps.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/examples/transactions.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/api/connection.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/api/exceptions.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/api/fields.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/api/migrations.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/api/model.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/api/raw-sql.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/api/relationships.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/api/transactions.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/changelog.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/concepts/backends.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/concepts/identity-map.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/concepts/performance.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/concepts/type-safety.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/contributing.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/faq.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/getting-started/installation.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/getting-started/next-steps.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/guide/models-and-fields.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/guide/mutations.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/guide/raw-sql.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/guide/relationships.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/howto/migrate-from-sqlalchemy.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/howto/multiple-databases.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/howto/pagination.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/howto/soft-deletes.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/howto/testing.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/index.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/roadmap.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/stylesheets/extra.css +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/pages/why-ferro.md +0 -0
- {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
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/plans/2026-04-29-001-typed-null-binds-plan.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/plans/2026-04-29-002-feat-named-connections-plan.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/plans/2026-05-07-001-refactor-generic-model-connection-plan.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/plans/2026-05-08-001-feat-typed-query-predicates-plan.md +0 -0
- {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
- {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
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/plans/ir-first-release-checklist.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/rfc/ir-contracts-v1.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/README.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/issues/pydantic-slots-missing-after-ferro-hydration.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/issues/python-3.14-deferred-annotation-typeerror-swallow.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/issues/sa-pk-column-nullable-divergence.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/issues/sa-vs-rust-unique-constraint-shape.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/issues/sqlite-integer-decimal-hydrates-as-none.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/issues/sqlite-null-hydrates-as-int-zero.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/issues/typed-where-null-panics-is-null.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/patterns/configurable-column-storage-types.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/patterns/ddl-on-live-engine.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/patterns/foreign-key-index.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/patterns/index-unique-redundancy.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/patterns/ir-invariants.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/patterns/shadow-fk-columns.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/patterns/sqlite-alembic-reconnect-hydration-tests.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/docs/solutions/patterns/typed-null-binds.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/justfile +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/scripts/demo_queries.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/scripts/demo_queries_pre_v012.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/_annotation_utils.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/_deprecations.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/_shadow_fk_types.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/base.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/composite_indexes.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/composite_uniques.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/exceptions.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/fields.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/ir/__init__.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/migrations/__init__.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/py.typed +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/query/__init__.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/raw.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/relations/__init__.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/relations/descriptors.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/schema_metadata.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/ferro/state.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/src/schema_bind.rs +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/__init__.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/conftest.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/db_backends.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/fixtures/ir_vectors/README.md +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/fixtures/ir_vectors/codec_registry_core_v1.json +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/fixtures/ir_vectors/query_user_compound_v1.json +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_aggregation.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_alembic_autogenerate.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_alembic_db_type.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_alembic_nullability.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_alembic_type_mapping.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_bulk_update.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_composite_index.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_composite_unique.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_connection.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_connection_redaction.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_constraints.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_cross_emitter_parity.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_crud.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_db_backends.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_db_type_integration.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_db_type_typing.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_db_type_validation.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_deletion.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_deprecated_operator_inventory.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_deprecations.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_docs_examples.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_documentation_features.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_enum_cold_hydration.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_field_wrapper.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_framework_predicates.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_helpers.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_hydration.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_metadata.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_models.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_named_connections_integration.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_one_to_one.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_query_builder.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_query_typing.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_raw_sql.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_refresh.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_relationship_engine.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_schema.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_schema_constraints.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_schema_db_type_metadata.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_schema_enum_annotations.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_shadow_fk_types.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_sqlite_alembic_reconnect_hydration.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_static_contracts.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_string_search.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_structural_types.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_temporal_types.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_transactions.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/tests/test_typed_null_binds.py +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/uv.lock +0 -0
- {ferro_orm-0.12.2 → ferro_orm-0.13.0}/zensical.toml +0 -0
|
@@ -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-
|
|
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
|
|
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-
|
|
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-
|
|
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
|
|
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-
|
|
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-
|
|
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.
|
|
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.
|
|
728
|
+
version = "0.3.103"
|
|
716
729
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
717
|
-
checksum = "
|
|
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.
|
|
760
|
+
version = "0.1.18"
|
|
748
761
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
749
|
-
checksum = "
|
|
762
|
+
checksum = "c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652"
|
|
750
763
|
dependencies = [
|
|
751
764
|
"bitflags",
|
|
752
765
|
"libc",
|
|
753
766
|
"plain",
|
|
754
|
-
"redox_syscall 0.
|
|
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.
|
|
1136
|
+
version = "0.9.0"
|
|
1124
1137
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1125
|
-
checksum = "
|
|
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.
|
|
1193
|
+
version = "1.15.0"
|
|
1181
1194
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1182
|
-
checksum = "
|
|
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.
|
|
1827
|
+
version = "1.23.4"
|
|
1815
1828
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1816
|
-
checksum = "
|
|
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.
|
|
1862
|
+
version = "0.2.126"
|
|
1850
1863
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1851
|
-
checksum = "
|
|
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.
|
|
1875
|
+
version = "0.2.126"
|
|
1863
1876
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1864
|
-
checksum = "
|
|
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.
|
|
1885
|
+
version = "0.2.126"
|
|
1873
1886
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1874
|
-
checksum = "
|
|
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.
|
|
1898
|
+
version = "0.2.126"
|
|
1886
1899
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1887
|
-
checksum = "
|
|
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.
|
|
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.
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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__":
|