Elixir release

1.19.0

Change breakdown

Organization at a glance

Detailed changelog

Enhancement

48 changes

Tool: Elixir Module: Access

Add Access.values/0 for traversing maps and keyword lists values

Tool: Elixir Module: Base

Add functions to verify if an encoding is valid, such as valid16?, valid64?, and so forth

Tool: Elixir Module: Calendar

Support 2-arity options for Calendar.strftime/3 which receives the whole data type

Tool: Elixir Module: Code

Add :migrate_call_parens_on_pipe formatter option

Tool: Elixir Module: Code

Add :indentation option to Code.string_to_quoted/2

Tool: Elixir Module: Code.Fragment

Preserve more block content around cursor in container_cursor_to_quoted

Tool: Elixir Module: Code.Fragment

Add :block_keyword_or_binary_operator to Code.Fragment for more precise suggestions after operators and closing terminators

Tool: Elixir Module: Code.Fragment

Add Code.Fragment.lines/1

Tool: Elixir Module: Enum

Provide more information on Enum.OutOfBoundsError

Tool: Elixir Module: Inspect

Allow optional: :all when deriving Inspect

Tool: Elixir Module: Inspect.Algebra

Add optimistic/pessimistic groups as a simplified implementation of next_break_fits

Tool: Elixir Module: IO.ANSI

Add ANSI codes to turn off conceal and crossed_out

Tool: Elixir Module: Kernel

Raise when U+2028 and U+2029 characters are present in comments and strings to avoid line spoofing attacks

Tool: Elixir Module: Kernel

Include the line for the previous clause in errors/warnings related to conflicts between defaults on function definitions

Tool: Elixir Module: Kernel

Support min/2 and max/2 as guards

Tool: Elixir Module: Kernel.ParallelCompiler

Add each_long_verification_threshold which invokes a callback when type checking a module takes too long

Tool: Elixir Module: Kernel.ParallelCompiler

Include lines in == Compilation error in file ... == slogans

Tool: Elixir Module: Macro

Print debugging results from Macro.dbg/3 as they happen, instead of once at the end

Tool: Elixir Module: Macro

Add __escape__/1 callback so structs can escape references and other runtime data types in Macro.escape/1

Tool: Elixir Module: Module

Do not automatically load modules after their compilation, guaranteeing a more consistent compile time experience and drastically improving compilation times

Tool: Elixir Module: OptionParser

Support the :regex type

Tool: Elixir Module: OptionParser

Enhance parsing error to display available options

Tool: Elixir Module: Protocol

Type checking of protocols dispatch and implementations

Tool: Elixir Module: Regex

Add Regex.to_embed/2 which returns an embeddable representation of regex in another regex

Tool: Elixir Module: Regex

Raise error message when regexes are used as default values in struct fields for compatibility with Erlang/OTP 28

Tool: Elixir Module: Registry

Add key-based partitioning of duplicate registries

Tool: Elixir Module: String

Add String.count/2 to count occurrences of a pattern

Tool: Elixir Module: String

Update to Unicode 17.0.0

Tool: ExUnit Module: ExUnit

Set a process label for each test

Tool: ExUnit Module: ExUnit.CaptureLog

Parallelize log dispatch when multiple processes are capturing log

Tool: ExUnit Module: ExUnit.Case

Add :test_group to the test context

Tool: ExUnit Module: ExUnit.Doctest

Support ellipsis in doctest exceptions to match the remaining of the exception

Tool: ExUnit Module: ExUnit.Doctest

Add :inspect_opts option for doctest

Tool: IEx Module: IEx

Support multi-line prompts (due to this feature, :continuation_prompt and :alive_continuation_prompt are no longer supported as IEx configuration)

Tool: IEx Module: IEx.Autocomplete

Functions annotated with @doc group: "Name" metadata will appear within their own groups in autocompletion

Tool: Logger Module: Logger

Accept any enumerable in Logger.metadata/1

Tool: Mix Module: mix

Add support for MIX_PROFILE_FLAGS to configure MIX_PROFILE

Tool: Mix Module: mix compile

Debug the compiler and type checker PID when MIX_DEBUG=1 and compilation/verification thresholds are met

Tool: Mix Module: mix compile

Add Mix.Tasks.Compiler.reenable/1

Tool: Mix Module: mix deps.compile

Support MIX_OS_DEPS_COMPILE_PARTITION_COUNT for compiling deps concurrently across multiple operating system processes

Tool: Mix Module: mix help

Add mix help Mod, mix help :mod, mix help Mod.fun, mix help Mod.fun/arity, and mix help app:package

Tool: Mix Module: mix format

Add options to mix format to allow excluding of files

Tool: Mix Module: mix test

Add --name-pattern option to mix test

Tool: Mix Module: mix test

Allow to distinguish the exit status between warnings as errors and test failures

Tool: Mix Module: mix xref graph

Add support for --format json

Tool: Mix Module: mix xref graph

Emit a warning if --source is part of a cycle

Tool: Mix Module: Mix

Support the :compilers option

Tool: Mix Module: Mix.Task.Compiler

Add Mix.Task.Compiler.run/2

Bugfix

24 changes

Tool: Elixir Module: Code

Return error on invalid unicode sequences in Code.string_to_quoted/2 instead of raising

Tool: Elixir Module: Code

Properly handle column annotation for in in not in expressions

Tool: Elixir Module: DateTime

Do not truncate microseconds regardless of precision in DateTime.diff/3

Tool: Elixir Module: Enum

Fix infinite loop on Enum.take/2 with negative index on empty enumerable

Tool: Elixir Module: File

Properly handle permissions errors cascading from parent in File.mkdir_p/1

Tool: Elixir Module: Inspect

Inspect ill-formed structs as maps

Tool: Elixir Module: Kernel

Properly increment metadata newline when ? is followed by a literal newline character

Tool: Elixir Module: Kernel

not_a_map.key now raises BadMapError for consistency with other map operations

Tool: Elixir Module: Protocol

defstruct/1 and defexception/1 are now disabled inside defprotocol as to not allow defining structs/exceptions alongside a protocol

Tool: Elixir Module: Regex

Fix Regex.split/2 returning too many results when the chunk being split on was empty (which can happen when using features such as /K)

Tool: Elixir Module: Stream

Ensure Stream.transform/5 respects suspend command when its inner stream halts

Tool: Elixir Module: URI

Several fixes to URI.merge/2 related to trailing slashes, trailing dots, and hostless base URIs

Tool: ExUnit Module: ExUnit.Assertions

Fix order of pinned variables in failure reports

Tool: ExUnit Module: ExUnit.Assertions

Raise if attempting to raise an assertion error with invalid message (not a binary)

Tool: ExUnit Module: ExUnit.Case

Do not crash on empty test unit groups

Tool: IEx Module: IEx

Abort pipelines when there is an error in any step along the way

Tool: Mix Module: mix cmd

Preserve argument quoting in subcommands by no longer performing shell expansion. To revert to the previous behaviour, pass --shell before the command name

Tool: Mix Module: mix compile

Fix bug where reverting changes to an external resource (such as HEEx template) after a compilation error would make it so the source module would not be compiled

Tool: Mix Module: mix compile

Avoid failures when locking compilation across different users

Tool: Mix Module: mix compile

Fix race condition when renaming files used by the compilation lock

Tool: Mix Module: mix format

Ensure the formatter does not go over the specified limit in certain corner cases

Tool: Mix Module: mix release

Fix RELEASE_SYS_CONFIG for Windows 11

Tool: Mix Module: mix test

Ensure modules are preloaded in mix test --slowest-modules=N

Tool: Mix Module: mix xref graph

Provide more consistent output by considering strong connected components only when computing graphs

Soft Deprecation

4 changes

Tool: Elixir Module: Inspect.Algebra

next_break_fits is deprecated in favor of optimistic/pessimistic groups

Tool: Elixir Module: Node

Node.start/2-3 is deprecated in favor of Node.start/2 with a keyword list

Tool: Mix Module: mix compile

--no-protocol-consolidation is deprecated in favor of --no-consolidate-protocols for consistency with mix.exs configuration

Tool: Mix Module: mix compile.protocols

Protocol consolidation is now part of compile.elixir and the task itself has no effect

Hard Deprecation

9 changes

Tool: Elixir Module: Code

Warn if line-break characters outside of \r and \r\n are found in strings according to UX#55. This warning will be fast-tracked into an error for security reasons in Elixir v1.20, following a similar rule to bidirectional control characters. They will already raise if found in comments

Tool: Elixir Module: Code

The on_undefined_variable: :warn is deprecated. Relying on undefined variables becoming function calls will not be supported in the future

Tool: Elixir Module: File

Passing a callback as third argument to File.cp/3 is deprecated, pass it as a on_conflict: callback option instead

Tool: Elixir Module: File

Passing a callback as third argument to File.cp_r/3 is deprecated, pass it as a on_conflict: callback option instead

Tool: Elixir Module: Kernel

The struct update syntax, such as %URI{uri | path: "/foo/bar"}, now requires the given variable (or expression) to explicitly pattern match on the struct before it can be updated. This is because, thanks to the type system, pattern matching on structs can find more errors, more reliably, and we want to promote its usage. Once pattern matching is added, you may optionally convert the struct update syntax into the map update syntax %{uri | path: "/foo/bar"} with no less of typing guarantees

Tool: Elixir Module: Kernel.ParallelCompiler

Passing return_diagnostics: true as an option is required on compile, compile_to_path and require

Tool: Logger Module: Logger

The :backends configuration is deprecated, either set the :default_handler to false or start backends in your application start callback

Tool: Mix Module: mix

The :default_task, :preferred_cli_env, and :preferred_cli_target configuration inside def project in your mix.exs has been deprecated in favor of :default_task, :preferred_envs and :preferred_targets inside the def cli function

Tool: Mix Module: mix do

Using commas as task separator in mix do (such as mix do foo, bar) is deprecated, use + instead (as in mix do foo + bar)