Skip to content

chore: update toolchain and dependencies#2

Merged
lostbean merged 1 commit into
mainfrom
chore/update-deps-and-toolchain
Jun 17, 2026
Merged

chore: update toolchain and dependencies#2
lostbean merged 1 commit into
mainfrom
chore/update-deps-and-toolchain

Conversation

@lostbean

Copy link
Copy Markdown
Owner

Summary

Modernizes the dev toolchain and Hex dependencies, and ensures the library builds cleanly on the latest compiler (Elixir 1.20.1 / OTP 28) with zero warnings.

Toolchain

Before After
Elixir 1.18.4 1.20.1
OTP 27 28
  • nix flake update refreshed nixpkgs (2025-10-04 → 2026-01-02) and nixpkgs-unstable (2025-10-04 → 2026-06-16).
  • The default elixir attr in unstable still tracks 1.18, so the flake now pins Elixir 1.20 on OTP 28 explicitly via beam.packages.erlang_28.elixir_1_20 (and erlang_28, beam.elixir-ls).
  • mix.exs elixir: requirement bumped ~> 1.14~> 1.20.

Dependencies (mix deps.update --all)

Package From To Notes
credo 1.7.12 1.7.19
decimal 2.3.0 3.1.1 major; transitive via ecto, compiles & tests pass
dialyxir 1.4.6 1.4.7
earmark_parser 1.4.44 1.4.45
ecto 3.13.3 3.14.0
erlex 0.2.7 0.2.9
ex_doc 0.38.4 0.40.3
jason 1.4.4 1.4.5
makeup_erlang 1.0.2 1.1.0
stream_data 1.2.0 1.3.0
telemetry 1.3.0 1.4.2

No deps held back — all updated to latest resolvable.

Mix 1.20 compatibility

  • Moved preferred_cli_env out of project/0 (deprecated in Mix 1.20) into the new cli/0 callback as preferred_envs.

CI confirmation (run locally inside the Nix flake)

  • mix compile --warnings-as-errors --forcezero warnings
  • mix test197 passed (11 properties, 186 tests), 8 excluded (:claude_code_acp, require an API key)
  • mix format --check-formatted — clean
  • mix credo — no issues

Known limitations / blockers

  • mix dialyzer reports pre-existing no_return / contract warnings on every schema changeset/1 function (the @spec changeset(t(), map()) combined with the struct \\ %__MODULE__{} default arg). These are not a regression — they reproduce identically on main with the new toolchain, and Dialyzer is not part of the CI workflow (ci.yml runs compile/test/format/credo only). Left out of scope for this dependency/toolchain PR; worth a separate follow-up to either relax the specs or add a Dialyzer ignore file and wire it into CI.

Bump the Nix-pinned toolchain to Elixir 1.20.1 / OTP 28 and refresh Hex
dependencies for compatibility.

Toolchain:
- nix flake update (nixpkgs + nixpkgs-unstable)
- Pin Elixir 1.20 on OTP 28 explicitly (the default `elixir` attr still
  tracks 1.18), via `beam.packages.erlang_28.elixir_1_20`
- Bump `mix.exs` elixir requirement to ~> 1.20

Dependencies (mix deps.update --all):
- credo 1.7.12 -> 1.7.19
- decimal 2.3.0 -> 3.1.1 (transitive via ecto)
- dialyxir 1.4.6 -> 1.4.7
- earmark_parser 1.4.44 -> 1.4.45
- ecto 3.13.3 -> 3.14.0
- erlex 0.2.7 -> 0.2.9
- ex_doc 0.38.4 -> 0.40.3
- jason 1.4.4 -> 1.4.5
- makeup_erlang 1.0.2 -> 1.1.0
- stream_data 1.2.0 -> 1.3.0
- telemetry 1.3.0 -> 1.4.2

Mix 1.20 compatibility:
- Move `preferred_cli_env` from `project/0` into the new `cli/0` callback
  as `preferred_envs` (the old location is deprecated in Mix 1.20)

Compiles with zero warnings under --warnings-as-errors; format, credo,
and the full test suite (197 passed) are green.
@lostbean lostbean merged commit 2dc8aa1 into main Jun 17, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant