Contributing
View SourceThanks for considering a contribution.
Development setup
This project uses Mise for tool versions and task running. With Mise installed, all tooling resolves automatically.
Required tools:
- Erlang/OTP 27 or newer (managed via Mise)
- rebar3 (managed via Mise)
elponPATHfor eqwalizer checks (not managed by Mise; install from releases)
Workflow
$ mise compile # compile
$ mise test # eunit + proper
$ mise dialyzer # static analysis
$ mise eq-all # eqwalizer (requires elp)
$ mise format # apply erlfmt
$ mise check # everything above, in sequence
Run mise check before opening a pull request. CI runs the same
checks on OTP 27 and 28.
Conventions
- Formatting:
erlfmt— CI enforces withrebar3 fmt --check. - Type checking: dialyzer must report 0 warnings; eqwalizer must
report
NO ERRORS. - Tests: prefer one focused EUnit function per behaviour. Use PropEr for property-based coverage where it adds signal.
- Commits: short imperative subject lines (e.g.
Add tuple/1,Fix list/2 length guard). Reference an issue if relevant.
Releasing (maintainers)
- Bump
vsninsrc/zz.app.srcand convert the[Unreleased]heading inCHANGELOG.mdto the new version. Update the version reference inREADME.md. Commit and push. - Run
mise checkto confirm everything is green. - Run
mise publish. This publishes to Hex (requiresrebar3 hex user authonce), tagsvX.Y.Z, and pushes the tag.