Elixir release

1.14.0

Change breakdown

Organization at a glance

Detailed changelog

Enhancement

84 changes

Tool: EEx Module: EEx

Support multi-line comments to EEx via <%!-- --%>

Tool: EEx Module: EEx

Add EEx.tokenize/2

Tool: Elixir Module: Access

Add Access.slice/1

Tool: Elixir Module: Application

Add Application.compile_env/4 and Application.compile_env!/3 to read the compile-time environment inside macros

Tool: Elixir Module: Calendar

Support ISO8601 basic format parsing with DateTime.from_iso8601/2

Tool: Elixir Module: Calendar

Add day/hour/minute on add/diff across different calendar modules

Tool: Elixir Module: Code

Add :normalize_bitstring_modifiers to Code.format_string!/2

Tool: Elixir Module: Code

Emit deprecation and type warnings for invalid options in on Code.compile_string/2 and Code.compile_quoted/2

Tool: Elixir Module: Code

Warn if an outdated lexical tracker is given on eval

Tool: Elixir Module: Code

Add Code.env_for_eval/1 and Code.eval_quoted_with_env/3

Tool: Elixir Module: Code

Improve stacktraces from eval operations on Erlang/OTP 25+

Tool: Elixir Module: Code.Fragment

Add support for __MODULE__ in several functions

Tool: Elixir Module: Code.Fragment

Support surround and context suggestions across multiple lines

Tool: Elixir Module: Enum

Allow slicing with steps in Enum.slice/2

Tool: Elixir Module: File

Support dereference_symlinks: true in File.cp/3 and File.cp_r/3

Tool: Elixir Module: Float

Do not show floats in scientific notation if below 1.0e16 and the fractional value is precisely zero

Tool: Elixir Module: Float

Add Float.min_finite/0 and Float.max_finite/0

Tool: Elixir Module: Inspect

Improve error reporting when there is a faulty implementation of the Inspect protocol

Tool: Elixir Module: Inspect

Allow :optional when deriving the Inspect protocol for hiding fields that match their default value

Tool: Elixir Module: Inspect

Inspect struct fields in the order they are declared in defstruct

Tool: Elixir Module: Inspect

Use expression-based inspection for Date.Range, MapSet, and Version.Requirement

Tool: Elixir Module: IO

Support Macro.Env and keywords as stacktrace definitions in IO.warn/2

Tool: Elixir Module: IO

Add IO.ANSI.syntax_colors/0 and related configuration to be shared across IEx and dbg

Tool: Elixir Module: Kernel

Add new dbg/0-2 macro

Tool: Elixir Module: Kernel

Allow any guard expression as the size of a bitstring in a pattern match

Tool: Elixir Module: Kernel

Allow composite types with pins as the map key in a pattern match

Tool: Elixir Module: Kernel

Print escaped version of control chars when they show up as unexpected tokens

Tool: Elixir Module: Kernel

Warn on confusable non-ASCII identifiers

Tool: Elixir Module: Kernel

Add .. as a nullary operator that returns 0..-1//1

Tool: Elixir Module: Kernel

Implement Unicode Technical Standard #39 recommendations. In particular, we warn for confusable scripts and restrict identifiers to single-scripts or highly restrictive mixed-scripts

Tool: Elixir Module: Kernel

Automatically perform NFC conversion of identifiers

Tool: Elixir Module: Kernel

Add binary_slice/2 and binary_slice/3

Tool: Elixir Module: Kernel

Lazily expand module attributes to avoid compile-time deps

Tool: Elixir Module: Kernel

Automatically cascade generated: true annotations on macro expansion

Tool: Elixir Module: Keyword

Add Keyword.from_keys/2 and Keyword.replace_lazy/3

Tool: Elixir Module: List

Add List.keysort/3 with support for a sorter function

Tool: Elixir Module: Macro

Add Macro.classify_atom/1 and Macro.inspect_atom/2

Tool: Elixir Module: Macro

Add Macro.expand_literal/2 and Macro.path/2

Tool: Elixir Module: Macro.Env

Add Macro.Env.prune_compile_info/1

Tool: Elixir Module: Map

Add Map.from_keys/2 and Map.replace_lazy/3

Tool: Elixir Module: MapSet

Add MapSet.filter/2, MapSet.reject/2, and MapSet.symmetric_difference/2

Tool: Elixir Module: Node

Add Node.spawn_monitor/2 and Node.spawn_monitor/4

Tool: Elixir Module: Module

Support new @after_verify attribute for executing code whenever a module is verified

Tool: Elixir Module: PartitionSupervisor

Add PartitionSupervisor that starts multiple isolated partitions of the same child for scalability

Tool: Elixir Module: Path

Add Path.safe_relative/1 and Path.safe_relative_to/2

Tool: Elixir Module: Registry

Add Registry.count_select/2

Tool: Elixir Module: Stream

Add Stream.duplicate/2 and Stream.transform/5

Tool: Elixir Module: String

Support empty lookup lists in String.replace/3, String.split/3, and String.splitter/3

Tool: Elixir Module: String

Allow slicing with steps in String.slice/2

Tool: Elixir Module: Task

Add :zip_input_on_exit option to Task.async_stream/3

Tool: Elixir Module: Task

Store :mfa in the Task struct for reflection purposes

Tool: Elixir Module: URI

Add URI.append_query/2

Tool: Elixir Module: Version

Add Version.to_string/1

Tool: Elixir Module: Version

Colorize Version.Requirement source in the Inspect protocol

Tool: ExUnit Module: ExUnit

Add ExUnit.Callbacks.start_link_supervised!/2

Tool: ExUnit Module: ExUnit

Add ExUnit.run/1 to rerun test modules

Tool: ExUnit Module: ExUnit

Colorize summary in yellow with message when all tests are excluded

Tool: ExUnit Module: ExUnit

Display friendly error when test name is too long

Tool: IEx Module: IEx

Evaluate --dot-iex line by line

Tool: IEx Module: IEx

Add line-by-line evaluation of IEx breakpoints

Tool: IEx Module: IEx.Autocomplete

Autocomplete bitstrings modifiers (after :: inside <<...>>)

Tool: IEx Module: IEx.Helpers

Allow an atom to be given to pid/1

Tool: IEx Module: IEx.Helpers

Support sigils in h/1

Tool: Logger Module: Logger

Add Logger.put_process_level/2

Tool: Mix Module: Mix

Add :config_path and :lockfile options to Mix.install/2

Tool: Mix Module: mix compile

Add --no-optional-deps to skip optional dependencies to test compilation works without optional dependencies

Tool: Mix Module: mix compile

Include column information on error diagnostics when possible

Tool: Mix Module: mix deps

Mix.Dep.Converger now tells which deps formed a cycle

Tool: Mix Module: mix do

Support --app option to restrict recursive tasks in umbrella projects

Tool: Mix Module: mix do

Allow using + as a task separator instead of comma

Tool: Mix Module: mix format

Support filename in mix format - when reading from stdin

Tool: Mix Module: mix format

Compile if mix format plugins are missing

Tool: Mix Module: mix new

Do not allow projects to be created with application names that conflict with multi-arg Erlang VM switches

Tool: Mix Module: mix profile

Return the return value of the profiled function

Tool: Mix Module: mix release

Make BEAM compression opt-in

Tool: Mix Module: mix release

Let :runtime_config_path accept false to skip the config/runtime.exs

Tool: Mix Module: mix test

Improve error message when suite fails due to coverage

Tool: Mix Module: mix test

Support :test_elixirc_options and default to not generating docs nor debug info chunk for tests

Tool: Mix Module: mix xref

Support --group flag in mix xref graph

Tool: Elixir Module: File

Passing a callback as third argument to File.cp/3 and File.cp_r/3 is deprecated.

Tool: EEx Module: EEx

Using <%# ... %> for comments is deprecated. Please use <% # ... %> or the new multi-line comments with <%!-- ... --%>

Tool: Logger Module: Logger

Deprecate Logger.enable/1 and Logger.disable/1 in favor of Logger.put_process_level/2

Tool: Mix Module: mix cmd

The --app option in mix cmd CMD is deprecated in favor of the more efficient mix do --app app cmd CMD

Tool: Mix Module: mix local.rebar

Remove support for rebar2, which has not been updated in 5 years, and is no longer supported on recent Erlang/OTP versions

Bugfix

34 changes

Tool: Elixir Module: Calendar

Handle widths with "0" in them in Calendar.strftime/3

Tool: Elixir Module: CLI

Improve errors on incorrect --rpc-eval usage

Tool: Elixir Module: CLI

Return proper exit code on Windows

Tool: Elixir Module: Code

Do not emit warnings when formatting code

Tool: Elixir Module: Enum

Allow slices to overflow on both starting and ending positions

Tool: Elixir Module: Kernel

Do not allow restricted characters in identifiers according to UTS39

Tool: Elixir Module: Kernel

Define __exception__ field as true when expanding exceptions in typespecs

Tool: Elixir Module: Kernel

Warn if any of True, False, and Nil aliases are used

Tool: Elixir Module: Kernel

Warn on underived @derive attributes

Tool: Elixir Module: Kernel

Remove compile-time dependency from defimpl :for

Tool: Elixir Module: Kernel

Track all arities on imported functions

Tool: Elixir Module: Kernel

Fix equality in guards for dynamic ranges without steps

Tool: Elixir Module: Module

Fix loop while unifying type variables

Tool: Elixir Module: Protocol

Warn if a protocol has no definitions

Tool: Elixir Module: Regex

Show list options when inspecting a Regex manually defined with Regex.compile/2

Tool: Elixir Module: String

Allow slices to overflow on both starting and ending positions

Tool: Elixir Module: System

Raise non-generic exception on missing env in System.fetch_env!/1 to mirror map operations

Tool: ExUnit Module: ExUnit

Do not crash when diffing unknown bindings in guards

Tool: ExUnit Module: ExUnit

Properly print diffs when comparing improper lists with strings at the tail position

Tool: ExUnit Module: ExUnit

Add short hash to tmp_dir in ExUnit to avoid test name collision

Tool: ExUnit Module: ExUnit

Do not store logs in the CLI formatter (this reduces memory usage for suites with capture_log)

Tool: ExUnit Module: ExUnit

Run ExUnit.after_suite/1 callback even when no tests run

Tool: ExUnit Module: ExUnit

Fix scenario where setup with imported function from within describe failed to compile

Tool: IEx Module: IEx

Disallow short-hand pipe after matches

Tool: IEx Module: IEx

Fix exports/1 in IEx for long function names

Tool: Mix Module: mix compile.elixir

Fix --warnings-as-errors when used with --all-warnings

Tool: Mix Module: mix compile.elixir

Ensure semantic recompilation cascades to path dependencies

Tool: Mix Module: mix compile.elixir

Lock the compiler to avoid concurrent usage

Tool: Mix Module: mix format

Do not add new lines if the formatted file is empty

Tool: Mix Module: mix format

Properly compile dependencies on mix format

Tool: Mix Module: mix release

Only set RELEASE_MODE after env.{sh,bat} are executed

Tool: Mix Module: mix release

Allow application mode configuration to cascade to dependencies

Tool: Mix Module: mix xref

Do not emit already consolidated warnings during mix xref trace

Tool: Mix Module: Mix

Do not start apps with runtime: false on Mix.install/2

Hard Deprecation

8 changes

Tool: Elixir Module: Application

Calling Application.get_env/3 and friends in the module body is now discouraged, use Application.compile_env/3 instead

Tool: Elixir Module: Bitwise

use Bitwise is deprecated, use import Bitwise instead

Tool: Elixir Module: Bitwise

~~~ is deprecated in favor of bnot for clarity

Tool: Elixir Module: Kernel.ParallelCompiler

Returning a list or two-element tuple from :each_cycle is deprecated, return a {:compile | :runtime, modules, warnings} tuple instead

Tool: Elixir Module: Kernel

Deprecate the operator <|> to avoid ambiguity with upcoming extended numerical operators

Tool: Elixir Module: String

Deprecate passing a binary compiled pattern to String.starts_with?/2

Tool: Logger Module: Logger

Deprecate $levelpad on message formatting

Tool: Mix Module: Mix

Mix.Tasks.Xref.calls/1 is deprecated in favor of compilation tracers