View Source Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
[0.9.1] - 2026-05-21
A patch release covering documentation cleanup left over from the 0.9.0 refactor plus a handful of usability improvements.
Added
.formatter.exsis now published with the Hex package and declareslocals_without_parensforcheck/1,check/2, andold/1. Downstream projects can pick these up withimport_deps: [:bond]in their own.formatter.exs.- Assertion-failure messages now include an
at: <file>:<line>line so the source location is clickable in editors.
Changed
binding/0captured in assertion-failure info is sorted by name so failure messages are reproducible across runs.
Fixed
- README/moduledoc no longer references the removed Bond.def/2 and
Bond.defp/2 macros, eliminating
mix docscross-reference warnings. - The
getting-startedguide installation hint now references the current version. - CHANGELOG no longer auto-links the removed
define_function_with_contract/4helper.
Internal
- Removed the vestigial
:contextfield fromBond.Compiler.Assertion. - Tightened the
Bond.Compiler.AnnotatedFunctionmoduledoc.
[0.9.0] - 2026-05-21
This release is a large internal refactor with no breaking changes to the
public API. @pre, @post, and check/1,2 all behave the same as in 0.8.x.
Changed
- Bond no longer overrides
Kernel.def/2andKernel.defp/2. Contracts are now applied via Elixir compiler hooks (@on_definition,@before_compile,@after_compile). This makes Bond more robust against changes in Elixir's macro expansion semantics, eliminates a class of macro-hygiene issues, and plays nicer with other macros that produce function definitions. - Multi-clause functions are now wrapped by a single override clause that
delegates to
super/1rather than having contract logic inlined into each clause. Elixir's normal pattern matching handles dispatch inside thesupercall. - Assertion failures are signalled by a throw / catch instead of being
raised inline. Each
@pre/@postgroup compiles to an anonymous function that throws{:assertion_failure, info}on the first failure;Bond.Runtime.Evalcatches it and raises the appropriate exception type. - Functions with contracts now get auto-generated
PreconditionsandPostconditionssections in their documentation even if the user did not attach a@docthemselves. Previously contract documentation was only emitted when a@docwas present. - Internal modules are reorganised into
Bond.Compiler.*(compile-time) andBond.Runtime.*(run-time) namespaces.
Internal
- New modules:
Bond.Compiler.AnnotatedFunction(multi-clause function model),Bond.Compiler.FunctionDefinition,Bond.Compiler.CompileStateFSM(rewritten),Bond.Runtime.Eval. - Removed internal modules
Bond.Compiler.AnnotatedFunctionClauseandBond.Compiler.LegacyCompileStateFSM, along with thedefine_function_with_contract/4helper they used. Bond.Compiler.Assertionnow carries a stable random:idfor use in error reporting and future internal tooling.
Requirements
- Unchanged. Elixir
~> 1.14.
[0.8.3] - 2024-11-08
Released before this changelog was established. See the git history for details.