Skip to content

Release 2.0.0

Choose a tag to compare

@tarsil tarsil released this 08 Mar 11:19
· 41 commits to main since this release
e277b77

Saffier 2.0.0 marks the beginning of a new chapter for the project: a sharper,
fully modernized ORM with a pure-Python core, stronger query and relationship
capabilities, and a cleaner long-term foundation for framework-agnostic async applications.

This release focuses on the areas that matter most in real projects: model behavior,
queryset power, relation handling, migration tooling, tenancy support, compatibility,
and documentation.

Saffier became faster, better, cleaner. This is the same Saffier you know and love, but with a sharper edge and a stronger core
and... a lot of new features and improvements but also... Faster!

Added

  • QuerySet set operations: union, union_all, intersect, intersect_all, except_, and except_all.
  • QuerySet bulk_get_or_create with bulk_select_or_insert alias.
  • QuerySet local_or, batch_size, extra_select, and reference_select APIs.
  • Settings runtime helpers: configure_settings, reload_settings, and override_settings.
  • Edgy compatibility modules for legacy imports across queryset, tenancy, admin, Lilya middleware, and model helpers.
  • Pure-Python Model.model_json_schema(...) compatibility and richer tenancy helpers such as with_schema(...) and using(database=..., schema=...).

Changed

  • Saffier now ships with a fully pure-Python model/runtime layer and no longer depends on Pydantic internally (Like its sibling Edgy does).
  • Query and model delete() now return deleted row counts.
  • Documentation tooling now follows the Zensical workflow with Edgy-aligned Hatch/Taskfile docs commands (docs_prepare, docs_build, docs_clean, serve).
  • CLI, migration, and application-discovery flows were refreshed for the current runtime and template system.

Fixed

  • Tenant schema table metadata now keeps foreign-key relationships consistent across related models in non-default schemas.
  • QuerySet raw_delete() added and delete filtering now respects accumulated OR clauses.
  • Removed loguru; Saffier now uses Python standard-library logging in core modules.
  • QuerySet cache parity improved for all(clear_cache=True), cached get(), SQL rendering, and select_for_update(...).
  • Permission, pagination, lazy-import, and nested exclude_secrets() compatibility now align more closely with Edgy behavior.
  • Model save/create extraction now matches Edgy for nullable/default fields, explicit read-only primary-key values, and composite-key / related-field inserts.