All notable changes to this project are documented here. The format follows Keep a Changelog, and the project uses Semantic Versioning.
0.1.0 - 2026-11-02
First public release.
Added
BoxTurtle.Schema.QueryandBoxTurtle.Schema.Change: generated read and write functions for Ecto schemas, with filters, sorting, pagination, preloads, grouping, distinct and pattern-scoped*_byextensions (extend/2,delegate/1).BoxTurtle.Schema.FiltersandBoxTurtle.Schema.Sort: working defaults plususebases for custom clauses. Filters supportnil(IS NULL) and lists (IN).BoxTurtle.Schema.Pagination:page: norpage: [number: n, size: s], with a per-module:page_size.BoxTurtle.Schema.Ecto.Ksuid: a KSUIDEcto.Type.BoxTurtle.Runtime.Config.Helper: the:maptype (JSON, via the standard library) and theunsafe_atomsoption.BoxTurtle.Runtime.DynamicInterface.ModuleDispatch: facade modules that forward a behaviour to a configurable implementation, or generate stubs.BoxTurtle.Security.Password.min_length/0.:distinctwith an adapter that has noDISTINCT ON(SQLite3, MyXQL, Tds) raises a clearArgumentErrorwhen the query is built. A:default_distinctlike that is rejected at compile time.
Changed (compared to the pre-release code)
:atomand:moduleconfig values must name existing atoms unlessunsafe_atoms: trueis given.Runtime.Configreads scripts with Elixir'sConfig.Reader; theexternal_configdependency is gone.Security.Passworduses a cryptographically secure random source and returns{:error, :too_short}. It also now honours the requested length; previously some lengths produced shorter passwords.Schema.Query.get/2returns{:error, :not_found}when no row matches.count/1usesCOUNT(*)and no longer requires aninserted_atcolumn.- The
:no_defaultsoption is now:ignore_defaults. :preloadsare loaded withLEFT JOINs in the same query instead of one query per association. With to-many preloads, paging anddistinctare applied to parent rows through a primary-key subquery. Preload queries and functions are no longer accepted.
Fixed
count(group_by: ["column"])with string column names crashed while building the select.Config.Helper.get_env/2crashed for an unset variable with a non-string:typeand no:default; it now returnsnil.
Removed
Application.Helper.conditional_applications/3,4,conditional_modules/3,4andconditional_children/3,4. Useconditional_append/3,4.Schema.Change.create/2, and the placeholder*_byfunctions (generate them withextend/2ordelegate/1).- Dependencies on poison, hackney, sweet_xml, cloak_ecto, earmark, atomic_map, jason and external_config.