Elixir release

1.13.0

Change breakdown

Organization at a glance

Detailed changelog

Enhancement

80 changes

Tool: EEx Module: EEx

Add :parser_options to EEx functions

Tool: Elixir Module: Calendar

Add c:Calendar.year_of_era/3 to support calendars where the beginning of a new era does not align with the beginning of a new year

Tool: Elixir Module: CLI

Support --short-version on the CLI that does not boot the VM

Tool: Elixir Module: Code

Add Code.string_to_quoted_with_comments/2 and Code.quoted_to_algebra/2

Tool: Elixir Module: Code

Add more :token_metadata to aliases and remote calls when parsing strings

Tool: Elixir Module: Code

Add Code.Fragment module to provide best-effort information from code fragments. The module currently provides an updated Code.Fragment.cursor_context/2 with operator support and Code.Fragment.surround_context/2 which looks at a given position in a fragment and find its surrounding delimiters

Tool: Elixir Module: Code

Allow custom sigil formatting on Code.format_string!/2

Tool: Elixir Module: Code

Add {:on_module, bytecode, :none} trace to compilation tracers

Tool: Elixir Module: Enum

Optimize Enum.concat/1 for lists of lists

Tool: Elixir Module: Enum

Add Enum.slide/3

Tool: Elixir Module: Exception

Better format Elixir exceptions in Erlang

Tool: Elixir Module: Inspect

Allow default inspect fun to be set globally with Inspect.Opts.default_inspect_fun/1

Tool: Elixir Module: IO

Allow :eof to be given as limit to IO.getn/2

Tool: Elixir Module: Kernel

Support the :sigils option in import Mod, only: :sigils and allow the sigil modifiers to be also digits

Tool: Elixir Module: Kernel

Make get_in consistently abort when nil values are found

Tool: Elixir Module: Kernel

Improve compilation times by reducing the amount of copies of the AST across compiler processes

Tool: Elixir Module: Kernel

Raise if trying to define a module with a slash in its name

Tool: Elixir Module: Kernel

Warn when ?\ is used and there is no need for a escape character

Tool: Elixir Module: Kernel

Track structs in typespecs as export deps instead of compile-time deps

Tool: Elixir Module: Kernel

Add power operator (**/2)

Tool: Elixir Module: Keyword

Add Keyword.validate/2

Tool: Elixir Module: Keyword

Implement Keyword.filter/2 and Keyword.map/2

Tool: Elixir Module: List

Add List.keyfind!/3

Tool: Elixir Module: Macro

Add Macro.prewalker/1 and Macro.postwalker/1

Tool: Elixir Module: Macro.Env

Add the following reflection functions: required?/2, lookup_import/2, fetch_alias/2, and fetch_macro_alias/2

Tool: Elixir Module: Map

Implement Map.filter/2 and Map.map/2

Tool: Elixir Module: Module

Support :nillify_clauses in Module.get_definition/3

Tool: Elixir Module: Module

Add Module.attributes_in/1 and Module.overridables_in/1

Tool: Elixir Module: OptionParser

Add "did you mean?" suggestions to OptionParser.ParseError messages

Tool: Elixir Module: Record

Add record reflection via @__records__

Tool: Elixir Module: Task

Add Task.completed/1

Tool: Elixir Module: Task

Add Task.ignore/1 to keep a task running but ignoring all of its results

Tool: Elixir Module: Task

Reduce the amount of copying Task.async* functions

Tool: Elixir Module: URI

Add URI.new/1 and URI.new!/1

Tool: ExUnit Module: ExUnit

Show hint if comparing different but equivalent strings

Tool: ExUnit Module: ExUnit.CaptureIO

Add with_io/3 to return result with captured io

Tool: ExUnit Module: ExUnit.CaptureLog

Add with_log/2 to return result with captured logs

Tool: IEx Module: IEx.Autocomplete

Add path autocompletion whenever when the cursor follows "./ or "/ or "DRIVER: where DRIVER is a single letter

Tool: IEx Module: IEx.Autocomplete

Add autocompletion for sigils, struct names, and struct fields

Tool: IEx Module: IEx.Helpers

Allow multiple modules to be given to r/1

Tool: Logger Module: Logger

Add Logger.put_application_level/2

Tool: Mix Module: Mix

Add MIX_INSTALL_FORCE environment variable support

Tool: Mix Module: Mix

Support :config and :system_env in Mix.install/2

Tool: Mix Module: Mix

Add Mix.installed?/0

Tool: Mix Module: Mix.Shell

Add :default option to Mix.Shell.yes?

Tool: Mix Module: mix archive.install

Run loadconfig before building archive

Tool: Mix Module: mix compile

Move Elixir version check to before deps are compiled, in order to give feedback earlier

Tool: Mix Module: mix compile.elixir

Do not recompile files if their modification time change but their contents are still the same and the .beam files are still on disk

Tool: Mix Module: mix compile.elixir

Do not recompile all Elixir sources when Erlang modules change, only dependent ones

Tool: Mix Module: mix compile.elixir

Do not recompile Elixir files if mix.exs changes, instead recompile only files using Mix.Project or trigger a recompilation if a compiler option changes

Tool: Mix Module: mix compile.elixir

Only recompile needed files when a dependency is added, updated or removed

Tool: Mix Module: mix compile.elixir

Only recompile needed files when a dependency is configured

Tool: Mix Module: mix deps

Add :subdir option to git deps

Tool: Mix Module: mix escript.install

Run loadconfig before building escript

Tool: Mix Module: mix format

Support :plugins in mix format that can hook into custom extensions and sigils

Tool: Mix Module: mix format

Add Mix.Tasks.Format.formatter_for_file/2

Tool: Mix Module: mix local.rebar

No longer support sub_dirs in Rebar 2 to help migration towards Rebar 3

Tool: Mix Module: mix local.rebar

Support --if-missing option when installing Rebar

Tool: Mix Module: mix local.rebar

Set REBAR_PROFILE=prod when compiling Rebar dependencies

Tool: Mix Module: mix test

Support --profile-require=time to profile the time loading test files themselves

Tool: Mix Module: mix test

Allow filtering modules from coverage using regex

Tool: Mix Module: mix test

Allow the exit status of ExUnit to be configured and set the default to 2

Tool: Mix Module: mix test

Exit with a status of 3 when coverage falls below threshold

Tool: Mix Module: mix test

Write failed manifest when suite fails due to --warnings-as-errors

Tool: Mix Module: mix test

Ignore MIX_TEST_PARTITION when partitions set to 1

Tool: Mix Module: mix xref

Support multiple sinks and sources in mix xref graph

Tool: Mix Module: mix xref

Add trace subcommand to print compilation dependencies between files

Tool: Mix Module: mix xref

Add --fail-above option to mix xref

Tool: Mix Module: mix xref

Add --label compile-connected to mix xref

Tool: Elixir Module: Code

Environment options in Code.eval_quoted/3 and Code.eval_string/3, such as :aliases and :tracers, have been deprecated in favor of passing an environment

Tool: Elixir Module: IO

:all on IO.getn is deprecated in favor of :eof

Tool: Elixir Module: URI

URI.parse/1 is deprecated in favor of URI.new/1 and URI.new!/1

Tool: Mix Module: mix format

Mix.Tasks.Format.formatter_opts_for_file/2 is deprecated in favor of Mix.Tasks.Format.formatter_for_file/2

Tool: Elixir Module: Code

Code.cursor_context/2 is deprecated, use Code.Fragment.cursor_context/2 instead

Tool: Elixir Module: Macro

Macro.to_string/2 is deprecated, use Macro.to_string/1 instead

Tool: Elixir Module: System

System.get_pid/0 is deprecated, use System.pid/0 instead

Tool: Elixir Module: Version

Using ! or != in version requirements is deprecated, use ~> or >= instead

Tool: Mix Module: mix escript.build

:strip_beam option is deprecated in favor of :strip_beams

Tool: Mix Module: Mix

:exit_code in Mix.raise/2 has been deprecated in favor of :exit_status

Tool: Mix Module: Mix.Config

Mix.Config is deprecated in favor of Config module

Bugfix

43 changes

Tool: EEx Module: EEx

Accept comments in EEx between do and the first clause

Tool: EEx Module: EEx

Accept EEx expressions where -> is followed by newline

Tool: Elixir Module: Application

Allow any expression as first argument of compile_env

Tool: Elixir Module: Application

Warn if Application.compile_env or Application.compile_env! are called without a require

Tool: Elixir Module: Code

Make sure :static_atoms_encoder in Code.string_to_quoted/2 also applies to quoted keyword keys

Tool: Elixir Module: Code

Ensure bindings with no context are returned as atoms instead of {binding, nil} in eval operations

Tool: Elixir Module: Inspect

Fix a bug when inspecting a non-binary bitstring with colors

Tool: Elixir Module: Kernel

Reject bidirectional formatting characters in strings and comments

Tool: Elixir Module: Kernel

Support escaping of terminators in uppercase sigils heredocs for consistency

Tool: Elixir Module: Kernel

Raise if __CALLER__ or __ENV__ or __STACKTRACE__ are used in match

Tool: Elixir Module: Kernel

Improve error message on invalid argument for byte_size from binary concat

Tool: Elixir Module: Kernel

Raise when aliasing non-Elixir modules without :as

Tool: Elixir Module: Kernel

Allow unquote_splicing inside %{...} without parens

Tool: Elixir Module: Kernel

Ensure that waiting on a struct expansion inside a typespec is correctly tracked as waiting time in the compiler

Tool: Elixir Module: Kernel

Correctly parse the atom . as a keyword list key

Tool: Elixir Module: Kernel

Do not leak variables from the first generator in with and for special forms

Tool: Elixir Module: Kernel

Fix column number on strings with NFD characters

Tool: Elixir Module: Kernel

Fix a bug where a combination of dynamic line in quote with unquote of remote calls would emit invalid AST metadata

Tool: Elixir Module: OptionParser

Validate switch types/modifiers early on to give more precise feedback

Tool: Elixir Module: Protocol

Add defdelegate to the list of unallowed macros inside protocols as protocols do not allow function definitions

Tool: Elixir Module: Protocol

Warn if @callback, @macrocallback and @optional_callbacks are defined inside protocol

Tool: Elixir Module: Protocol

Ensure protocol metadata is deterministic on consolidation

Tool: Elixir Module: Range

Always show step when range is descending

Tool: Elixir Module: String

Update Unicode database to version 14.0

Tool: Elixir Module: URI

Only percent decode if followed by hex digits (according to https://url.spec.whatwg.org/#percent-decode)

Tool: Elixir Module: Version

Ensure proper precedence of and/or in version requirements

Tool: ExUnit Module: ExUnit

Fix formatter and counters from ExUnit.run/0 to consider all tests in a module whenever if a module's setup_all fails

Tool: ExUnit Module: ExUnit

Allow doctests newlines to be terminated by CRLF

Tool: IEx Module: IEx

Fix the loss of .iex.exs context after a pry session

Tool: IEx Module: IEx

Stop evaluator before exiting IEx server to avoid evaluators leaking

Tool: Logger Module: Logger

Raise clear error message for invalid :compile_time_purge_matching configuration

Tool: Logger Module: Logger

Fix a bug where Logger would not reset its discard counter under some scenarios

Tool: Mix Module: mix compile.elixir

Track transitive runtime dependencies coming from local/path dependencies

Tool: Mix Module: mix compile.elixir

Recompile file if @external_resource is deleted

Tool: Mix Module: mix compile.elixir

Print number of compiling files on all compiler cycles. This will make the Compiling N files (.ex) show up multiple times if necessary

Tool: Mix Module: mix deps

Raise if local dep is unavailable while compiling

Tool: Mix Module: mix deps.unlock

Fix blank output when unlocking a dependency that is not locked

Tool: Mix Module: mix local.install

Do not respect MIX_DEPS_PATH for install commands

Tool: Mix Module: mix release

Improve release scripts by making sure shell errors cascade (this is done by avoiding exporting and defining variables in a single step)

Tool: Mix Module: mix release

Do not boot release if RELEASE_COOKIE is empty

Tool: Mix Module: mix release

Allow releases running as a daemon to be restarted

Tool: Mix Module: mix release

Raise proper error message when non-serializable values are in configs

Tool: Mix Module: mix test

Fix coverage engine to also tag case, cond, and receive branches where the right side is a literal