ferro-orm 0.9.0__tar.gz → 0.9.1__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 (155) hide show
  1. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/CHANGELOG.md +8 -0
  2. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/Cargo.lock +4 -4
  3. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/Cargo.toml +1 -1
  4. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/PKG-INFO +1 -1
  5. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/pyproject.toml +1 -1
  6. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/src/ferro/models.py +7 -1
  7. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_named_connections_integration.py +4 -0
  8. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  9. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  10. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/.github/PERMISSIONS.md +0 -0
  11. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/.github/PYPI_CHECKLIST.md +0 -0
  12. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/.github/PYPI_SETUP.md +0 -0
  13. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/.github/generated/wheels.generated.yml +0 -0
  14. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/.github/pull_request_template.md +0 -0
  15. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/.github/workflows/ci.yml +0 -0
  16. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/.github/workflows/packaging-smoke.yml +0 -0
  17. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/.github/workflows/publish-docs.yml +0 -0
  18. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/.github/workflows/publish.yml +0 -0
  19. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/.github/workflows/release.yml +0 -0
  20. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/.gitignore +0 -0
  21. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/.pre-commit-config.yaml +0 -0
  22. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/.python-version +0 -0
  23. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/AGENTS.md +0 -0
  24. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/CONTRIBUTING.md +0 -0
  25. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/LICENSE +0 -0
  26. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/README.md +0 -0
  27. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/TEST_RESULTS.md +0 -0
  28. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/api/exceptions.md +0 -0
  29. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/api/fields.md +0 -0
  30. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/api/model.md +0 -0
  31. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/api/query.md +0 -0
  32. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/api/raw-sql.md +0 -0
  33. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/api/relationships.md +0 -0
  34. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/api/transactions.md +0 -0
  35. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/api/utilities.md +0 -0
  36. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/brainstorms/2026-04-29-named-connections-role-routing-requirements.md +0 -0
  37. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/brainstorms/2026-05-08-typed-query-predicates-requirements.md +0 -0
  38. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/changelog.md +0 -0
  39. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/coming-soon.md +0 -0
  40. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/concepts/architecture.md +0 -0
  41. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/concepts/identity-map.md +0 -0
  42. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/concepts/performance.md +0 -0
  43. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/concepts/query-typing.md +0 -0
  44. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/concepts/type-safety.md +0 -0
  45. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/contributing.md +0 -0
  46. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/faq.md +0 -0
  47. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/getting-started/installation.md +0 -0
  48. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/getting-started/next-steps.md +0 -0
  49. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/getting-started/tutorial.md +0 -0
  50. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/guide/backend.md +0 -0
  51. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/guide/database.md +0 -0
  52. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/guide/migrations.md +0 -0
  53. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/guide/models-and-fields.md +0 -0
  54. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/guide/mutations.md +0 -0
  55. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/guide/queries.md +0 -0
  56. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/guide/relationships.md +0 -0
  57. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/guide/transactions.md +0 -0
  58. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/howto/multiple-databases.md +0 -0
  59. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/howto/pagination.md +0 -0
  60. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/howto/soft-deletes.md +0 -0
  61. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/howto/testing.md +0 -0
  62. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/howto/timestamps.md +0 -0
  63. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/index.md +0 -0
  64. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/migration-sqlalchemy.md +0 -0
  65. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/plans/2026-04-24-001-refactor-multi-db-backend-architecture-plan.md +0 -0
  66. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/plans/2026-04-29-001-typed-null-binds-plan.md +0 -0
  67. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/plans/2026-04-29-002-feat-named-connections-plan.md +0 -0
  68. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/plans/2026-05-07-001-refactor-generic-model-connection-plan.md +0 -0
  69. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/plans/2026-05-08-001-feat-typed-query-predicates-plan.md +0 -0
  70. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/solutions/README.md +0 -0
  71. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/solutions/issues/python-3.14-deferred-annotation-typeerror-swallow.md +0 -0
  72. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/solutions/issues/sa-pk-column-nullable-divergence.md +0 -0
  73. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/solutions/issues/sa-vs-rust-unique-constraint-shape.md +0 -0
  74. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/solutions/patterns/cross-emitter-ddl-parity.md +0 -0
  75. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/solutions/patterns/foreign-key-index.md +0 -0
  76. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/solutions/patterns/index-unique-redundancy.md +0 -0
  77. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/solutions/patterns/shadow-fk-columns.md +0 -0
  78. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/solutions/patterns/typed-null-binds.md +0 -0
  79. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/stylesheets/extra.css +0 -0
  80. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/docs/why-ferro.md +0 -0
  81. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/justfile +0 -0
  82. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/mkdocs.yml +0 -0
  83. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/scripts/demo_queries.py +0 -0
  84. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/src/backend.rs +0 -0
  85. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/src/connection.rs +0 -0
  86. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/src/ferro/__init__.py +0 -0
  87. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/src/ferro/_annotation_utils.py +0 -0
  88. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/src/ferro/_core.pyi +0 -0
  89. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/src/ferro/_shadow_fk_types.py +0 -0
  90. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/src/ferro/base.py +0 -0
  91. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/src/ferro/composite_indexes.py +0 -0
  92. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/src/ferro/composite_uniques.py +0 -0
  93. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/src/ferro/exceptions.py +0 -0
  94. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/src/ferro/fields.py +0 -0
  95. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/src/ferro/metaclass.py +0 -0
  96. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/src/ferro/migrations/__init__.py +0 -0
  97. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/src/ferro/migrations/alembic.py +0 -0
  98. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/src/ferro/py.typed +0 -0
  99. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/src/ferro/query/__init__.py +0 -0
  100. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/src/ferro/query/builder.py +0 -0
  101. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/src/ferro/query/nodes.py +0 -0
  102. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/src/ferro/raw.py +0 -0
  103. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/src/ferro/relations/__init__.py +0 -0
  104. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/src/ferro/relations/descriptors.py +0 -0
  105. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/src/ferro/schema_metadata.py +0 -0
  106. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/src/ferro/state.py +0 -0
  107. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/src/lib.rs +0 -0
  108. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/src/operations.rs +0 -0
  109. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/src/query.rs +0 -0
  110. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/src/schema.rs +0 -0
  111. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/src/state.rs +0 -0
  112. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/__init__.py +0 -0
  113. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/conftest.py +0 -0
  114. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/db_backends.py +0 -0
  115. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_aggregation.py +0 -0
  116. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_alembic_autogenerate.py +0 -0
  117. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_alembic_bridge.py +0 -0
  118. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_alembic_nullability.py +0 -0
  119. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_alembic_type_mapping.py +0 -0
  120. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_auto_migrate.py +0 -0
  121. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_bulk_update.py +0 -0
  122. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_composite_index.py +0 -0
  123. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_composite_unique.py +0 -0
  124. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_connection.py +0 -0
  125. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_connection_redaction.py +0 -0
  126. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_constraints.py +0 -0
  127. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_cross_emitter_parity.py +0 -0
  128. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_crud.py +0 -0
  129. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_db_backends.py +0 -0
  130. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_deletion.py +0 -0
  131. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_docs_examples.py +0 -0
  132. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_documentation_features.py +0 -0
  133. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_field_wrapper.py +0 -0
  134. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_helpers.py +0 -0
  135. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_hydration.py +0 -0
  136. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_metaclass_internals.py +0 -0
  137. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_metadata.py +0 -0
  138. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_models.py +0 -0
  139. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_one_to_one.py +0 -0
  140. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_query_builder.py +0 -0
  141. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_query_typing.py +0 -0
  142. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_raw_sql.py +0 -0
  143. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_refresh.py +0 -0
  144. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_relationship_engine.py +0 -0
  145. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_schema.py +0 -0
  146. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_schema_constraints.py +0 -0
  147. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_schema_enum_annotations.py +0 -0
  148. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_shadow_fk_types.py +0 -0
  149. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_static_contracts.py +0 -0
  150. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_string_search.py +0 -0
  151. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_structural_types.py +0 -0
  152. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_temporal_types.py +0 -0
  153. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_transactions.py +0 -0
  154. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/tests/test_typed_null_binds.py +0 -0
  155. {ferro_orm-0.9.0 → ferro_orm-0.9.1}/uv.lock +0 -0
@@ -1,6 +1,14 @@
1
1
  # CHANGELOG
2
2
 
3
3
 
4
+ ## v0.9.1 (2026-05-11)
5
+
6
+ ### Bug Fixes
7
+
8
+ - ModelConnection annotations
9
+ ([`337b983`](https://github.com/syn54x/ferro-orm/commit/337b9838c18835b6e00bc20487b9c24fc76bfaeb))
10
+
11
+
4
12
  ## v0.9.0 (2026-05-09)
5
13
 
6
14
  ### Chores
@@ -294,7 +294,7 @@ dependencies = [
294
294
 
295
295
  [[package]]
296
296
  name = "ferro"
297
- version = "0.9.0"
297
+ version = "0.9.1"
298
298
  dependencies = [
299
299
  "dashmap",
300
300
  "once_cell",
@@ -498,9 +498,9 @@ dependencies = [
498
498
 
499
499
  [[package]]
500
500
  name = "hashbrown"
501
- version = "0.17.0"
501
+ version = "0.17.1"
502
502
  source = "registry+https://github.com/rust-lang/crates.io-index"
503
- checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51"
503
+ checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a"
504
504
 
505
505
  [[package]]
506
506
  name = "hashlink"
@@ -678,7 +678,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
678
678
  checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9"
679
679
  dependencies = [
680
680
  "equivalent",
681
- "hashbrown 0.17.0",
681
+ "hashbrown 0.17.1",
682
682
  "serde",
683
683
  "serde_core",
684
684
  ]
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "ferro"
3
- version = "0.9.0"
3
+ version = "0.9.1"
4
4
  edition = "2024"
5
5
  readme = "README.md"
6
6
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ferro-orm
3
- Version: 0.9.0
3
+ Version: 0.9.1
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'
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ferro-orm"
3
- version = "0.9.0"
3
+ version = "0.9.1"
4
4
  description = "A high-performance, Rust-backed ORM for Python."
5
5
  readme = "README.md"
6
6
  authors = [
@@ -616,7 +616,13 @@ class ModelConnection[M: Model]:
616
616
  def select(self) -> Query[M]:
617
617
  return Query(self.model_cls, using=self._connection_name)
618
618
 
619
- def where(self, node: QueryNode) -> Query[M]:
619
+ @overload
620
+ def where(self, node: QueryNode) -> Query[M]: ...
621
+
622
+ @overload
623
+ def where(self, node: "Predicate[M]") -> Query[M]: ...
624
+
625
+ def where(self, node: "QueryNode | Predicate[M]") -> Query[M]:
620
626
  return self.select().where(node)
621
627
 
622
628
  async def get(self, pk: Any) -> M:
@@ -35,6 +35,10 @@ if TYPE_CHECKING:
35
35
  bound.where(NamedSmokeMarker.id == 1), # type: ignore[arg-type]
36
36
  "Query[NamedSmokeMarker]",
37
37
  )
38
+ assert_type(
39
+ bound.where(lambda t: t.id == 1), # type: ignore[arg-type]
40
+ "Query[NamedSmokeMarker]",
41
+ )
38
42
  assert_type(await bound.get(1), NamedSmokeMarker)
39
43
  assert_type(await bound.get_or_none(1), NamedSmokeMarker | None)
40
44
  assert_type(await bound.bulk_create([]), int)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes