Elixir release

1.18.0

Change breakdown

Organization at a glance

Detailed changelog

Enhancement

48 changes

Tool: Elixir Module: CLI

Add experimental PowerShell scripts for elixir, elixirc, and mix on Windows. Those provide a safer entry point for running Elixir from other platforms

Tool: Elixir Module: Calendar

Add Duration.to_string/1

Tool: Elixir Module: Code

Support several migration options in Code.format_string!/2

Tool: Elixir Module: Code

Add parenthesis around -- and --- in Code.format_string!/2 to make precedence clearer

Tool: Elixir Module: Code

Include more metadata in Code.string_to_quoted/2 when token_metadata: true to help compute ranges from the AST

Tool: Elixir Module: Code.Fragment

Have :capture_arg as its own entry in Code.Fragment.surround_context/2

Tool: Elixir Module: Config

Add Config.read_config/1

Tool: Elixir Module: Enumerable

Add Enum.product_by/2 and Enum.sum_by/2

Tool: Elixir Module: Exception

Add MissingApplicationsError exception to denote missing applications

Tool: Elixir Module: JSON

Add a new JSON module with encoding and decoding functionality

Tool: Elixir Module: JSON

Implement JSON.Encoder for all Calendar types

Tool: Elixir Module: Kernel

Update source code parsing to match UTS #55 latest recommendations. In particular, mixed script is allowed in identifiers as long as they are separate by underscores (_), such as http_сервер. Previously allowed highly restrictive identifiers, which mixed Latin and other scripts, such as the japanese word for t-shirt, Tシャツ, now require the underscore as well

Tool: Elixir Module: Kernel

Warn on bidirectional confusability in identifiers

Tool: Elixir Module: Kernel

Verify the type of the binary generators

Tool: Elixir Module: Kernel

Track the type of tuples in patterns and inside elem/2

Tool: Elixir Module: Kernel

Perform validation of root AST nodes in unquote and unquote_splicing to catch bugs earlier

Tool: Elixir Module: Kernel

Add source, behaviour, and record information to Docs chunk metadata

Tool: Elixir Module: Kernel

Support deterministic builds in tandem with Erlang by setting ERL_COMPILER_OPTIONS=deterministic. Keep in mind deterministic builds strip source and other compile time information, which may be relevant for programs

Tool: Elixir Module: Kernel

Allow aliases and imports to be enabled conditionally in module body

Tool: Elixir Module: List

Add List.ends_with?/2

Tool: Elixir Module: Macro

Improve dbg handling of if/2, with/1 and of code blocks

Tool: Elixir Module: Macro

Add Macro.struct_info!/2 to return struct information mirroring mod.__info__(:struct)

Tool: Elixir Module: Registry

Add Registry.lock/3 for local locking

Tool: Elixir Module: PartitionSupervisor

Add PartitionSupervisor.resize!/2 to resize the number of partitions in a supervisor (up to the limit it was started with)

Tool: Elixir Module: Process

Handle arbitrarily high integer values in Process.sleep/1

Tool: Elixir Module: Protocol

Add @undefined_impl_description to customize error message when an implementation is undefined

Tool: Elixir Module: Protocol

Add __deriving__/1 as optional macro callback to Protocol, no longer requiring empty implementations

Tool: Elixir Module: String

Inspect special whitespace and zero-width characters using their Unicode representation

Tool: Elixir Module: String

Update Unicode to 16.0

Tool: ExUnit Module: ExUnit

Support parameterized tests on ExUnit.Case

Tool: ExUnit Module: ExUnit

Support test groups: tests in the same group never run concurrently

Tool: ExUnit Module: ExUnit.Case

Add test_pid as a tag

Tool: IEx Module: IEx

Add IEx.configure(auto_reload: true) to automatically pick up modules recompiled from other operating system processes

Tool: IEx Module: IEx

Add :dot_iex support to IEx.configure/1

Tool: IEx Module: IEx

Add report for normal/shutdown exits in IEx

Tool: Mix Module: mix compile

Ensure only a single operating system process can compile at a given time

Tool: Mix Module: mix deps.get

Ensure only a single operating system process can fetch deps at a given time

Tool: Mix Module: mix format

Add mix format --migrate to migrate from deprecated functionality

Tool: Mix Module: mix format

Add new options and metadata to improve formatting applying by editors and other environments

Tool: Mix Module: mix test

Taint failure manifest if requiring or compiling tests fail

Tool: Mix Module: Mix.Project

Add a :listeners configuration to listen to compilation events from the current and other operating system processes

Tool: Mix Module: Mix.Task.Compiler

Add API for fetching all persisted compiler diagnostics

Tool: Mix Module: Mix.Task.Compiler

Add API for fetching all compiler tasks

Tool: Elixir Module: Inspect.Algebra

color/3 is deprecated in favor of color_doc/3

Tool: Elixir Module: Inspect.Algebra

fold_doc/2 is deprecated in favor of fold/2

Tool: Elixir Module: Kernel

Deprecate unless in favor of if. Use mix format --migrate to automate the migration

Tool: Elixir Module: Macro

Macro.struct!/2 is deprecated in favor of Macro.struct_info!/2

Tool: Elixir Module: Protocol

Defining __deriving__/3 inside the Any implementation is deprecated, derive it inside the protocol definition itself

Bugfix

17 changes

Tool: Elixir Module: Code

Fix delimiter metadata for single quoted atoms and remote calls in Code.string_to_quoted/2

Tool: Elixir Module: Code.Formatter

Fix formatter adding extra escapes to quoted remote calls

Tool: Elixir Module: Code.Fragment

Properly handle keyword keys as their own entry

Tool: Elixir Module: Inspect.Algebra

Ensure next_break_fits respects line_length

Tool: Elixir Module: Kernel

Validate AST on unquote and unquote_splicing to provide better error reports instead of failing too late inside the compiler

Tool: Elixir Module: Kernel

Avoid crashes when emitting diagnostics on code using \t for indentation

Tool: Elixir Module: Module

Include module attribute line and name when tracing its aliases

Tool: Elixir Module: Stream

Do not halt streams twice in Stream.transform/5

Tool: Elixir Module: URI

Fix a bug when a schemaless URI is given to URI.merge/2

Tool: ExUnit Module: ExUnit.Assertions

Raise if guards are used in assert/1 with =

Tool: ExUnit Module: ExUnit.Assertions

Format inserted/deleted maps in list assertions

Tool: IEx Module: IEx.Helpers

IEx.Helpers.recompile/0 will reload modules changed by other operating system processes

Tool: Mix Module: mix compile

Ensure warnings from external resources are emitted with --all-warnings when files do not change

Tool: Mix Module: mix deps.compile

Fix escaping issues when invoking rebar3 in some cases

Tool: Mix Module: mix escript

Fix escript layout and support storing priv directories

Tool: Mix Module: mix release

Make .app files deterministic in releases

Tool: Mix Module: Mix.Shell

Fix Mix.Shell on Windows when outputting non UTF-8 characters

Hard Deprecation

12 changes

Tool: EEx Module: EEx

<%# is deprecated in favor of <%!-- or <% #

Tool: EEx Module: EEx

c:EEx.handle_text/2 is deprecated in favor of c:EEx.handle_text/3

Tool: Elixir Module: Code

Setting :warnings_as_errors is deprecated via Code.put_compiler_option/2. This must not affect developers, as the :warnings_as_errors option is managed by Mix tasks, and not directly used via the Code module

Tool: Elixir Module: Enumerable

Deprecate returning a two-arity function in Enumerable.slice/1

Tool: Elixir Module: List

List.zip/1 is deprecated in favor of Enum.zip/1

Tool: Elixir Module: Module

Deprecate Module.eval_quoted/3 in favor of Code.eval_quoted/3

Tool: Elixir Module: Range

Deprecate inferring negative ranges on Range.new/2

Tool: Elixir Module: Tuple

Tuple.append/2 is deprecated, use Tuple.insert_at/3 instead

Tool: Mix Module: mix cmd

Deprecate mix cmd --app APP in favor of mix do --app APP

Tool: Mix Module: mix compile

:warnings_as_errors configuration in :elixirc_options is deprecated. Instead pass the --warnings-as-errors flag to mix compile. Alternatively, you might alias the task: aliases: [compile: "compile --warnings-as-errors"]

Tool: Mix Module: mix test

:warnings_as_errors configuration in :test_elixirc_options is deprecated. Instead pass the --warnings-as-errors flag to mix test. Alternatively, you might alias the task: aliases: [test: "test --warnings-as-errors"]

Tool: Mix Module: Mix.Tasks.Compile

Deprecate compilers/0 in favor of Mix.Task.Compiler.compilers/0