Announcement: https://elixir-lang.org/blog/2021/12/03/elixir-v1-13-0-released/
1. Enhancements
EEx
- [EEx] Add
:parser_options
to EEx functions
Elixir
- [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 - [CLI] Support
--short-version
on the CLI that does not boot the VM - [Code] Add
Code.string_to_quoted_with_comments/2
andCode.quoted_to_algebra/2
- [Code] Add more
:token_metadata
to aliases and remote calls when parsing strings - [Code] Add
Code.Fragment
module to provide best-effort information from code fragments. The module currently provides an updatedCode.Fragment.cursor_context/2
with operator support andCode.Fragment.surround_context/2
which looks at a given position in a fragment and find its surrounding delimiters - [Code] Allow custom sigil formatting on
Code.format_string!/2
- [Code] Add
{:on_module, bytecode, :none}
trace to compilation tracers - [Enum] Optimize
Enum.concat/1
for lists of lists - [Enum] Add
Enum.slide/3
- [Exception] Better format Elixir exceptions in Erlang
- [Inspect] Allow default inspect fun to be set globally with
Inspect.Opts.default_inspect_fun/1
- [IO] Allow
:eof
to be given as limit toIO.getn/2
- [Kernel] Support the
:sigils
option inimport Mod, only: :sigils
and allow the sigil modifiers to be also digits - [Kernel] Make
get_in
consistently abort whennil
values are found - [Kernel] Improve compilation times by reducing the amount of copies of the AST across compiler processes
- [Kernel] Raise if trying to define a module with a slash in its name
- [Kernel] Warn when
?\
is used and there is no need for a escape character - [Kernel] Track structs in typespecs as export deps instead of compile-time deps
- [Kernel] Add power operator (
**/2
) - [Keyword] Add
Keyword.validate/2
- [Keyword] Implement
Keyword.filter/2
andKeyword.map/2
- [List] Add
List.keyfind!/3
- [Macro] Add
Macro.prewalker/1
andMacro.postwalker/1
- [Macro.Env] Add the following reflection functions:
required?/2
,lookup_import/2
,fetch_alias/2
, andfetch_macro_alias/2
- [Map] Implement
Map.filter/2
andMap.map/2
- [Module] Support
:nillify_clauses
inModule.get_definition/3
- [Module] Add
Module.attributes_in/1
andModule.overridables_in/1
- [OptionParser] Add "did you mean?" suggestions to
OptionParser.ParseError
messages - [Record] Add record reflection via
@__records__
- [Task] Add
Task.completed/1
- [Task] Add
Task.ignore/1
to keep a task running but ignoring all of its results - [Task] Reduce the amount of copying
Task.async*
functions - [URI] Add
URI.new/1
andURI.new!/1
ExUnit
- [ExUnit] Show hint if comparing different but equivalent strings
- [ExUnit.CaptureIO] Add
with_io/3
to return result with captured io - [ExUnit.CaptureLog] Add
with_log/2
to return result with captured logs
IEx
- [IEx.Autocomplete] Add path autocompletion whenever when the cursor follows
"./
or"/
or"DRIVER:
whereDRIVER
is a single letter - [IEx.Autocomplete] Add autocompletion for sigils, struct names, and struct fields
- [IEx.Helpers] Allow multiple modules to be given to
r/1
Logger
- [Logger] Add
Logger.put_application_level/2
Mix
- [Mix] Add
MIX_INSTALL_FORCE
environment variable support - [Mix] Support
:config
and:system_env
inMix.install/2
- [Mix] Add
Mix.installed?/0
- [Mix.Shell] Add
:default
option toMix.Shell.yes?
- [mix archive.install] Run
loadconfig
before building archive - [mix compile] Move Elixir version check to before deps are compiled, in order to give feedback earlier
- [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
- [mix compile.elixir] Do not recompile all Elixir sources when Erlang modules change, only dependent ones
- [mix compile.elixir] Do not recompile Elixir files if
mix.exs
changes, instead recompile only files usingMix.Project
or trigger a recompilation if a compiler option changes - [mix compile.elixir] Only recompile needed files when a dependency is added, updated or removed
- [mix compile.elixir] Only recompile needed files when a dependency is configured
- [mix deps] Add
:subdir
option to git deps - [mix escript.install] Run
loadconfig
before building escript - [mix format] Support
:plugins
inmix format
that can hook into custom extensions and sigils - [mix format] Add
Mix.Tasks.Format.formatter_for_file/2
- [mix local.rebar] No longer support
sub_dirs
in Rebar 2 to help migration towards Rebar 3 - [mix local.rebar] Support
--if-missing
option when installing Rebar - [mix local.rebar] Set
REBAR_PROFILE=prod
when compiling Rebar dependencies - [mix test] Support
--profile-require=time
to profile the time loading test files themselves - [mix test] Allow filtering modules from coverage using regex
- [mix test] Allow the exit status of ExUnit to be configured and set the default to 2
- [mix test] Exit with a status of 3 when coverage falls below threshold
- [mix test] Write failed manifest when suite fails due to --warnings-as-errors
- [mix test] Ignore
MIX_TEST_PARTITION
when partitions set to 1 - [mix xref] Support multiple sinks and sources in
mix xref graph
- [mix xref] Add
trace
subcommand to print compilation dependencies between files - [mix xref] Add
--fail-above
option tomix xref
- [mix xref] Add
--label compile-connected
tomix xref
2. Bug fixes
EEx
- [EEx] Accept comments in EEx between do and the first clause
- [EEx] Accept EEx expressions where
->
is followed by newline
Elixir
- [Application] Allow any expression as first argument of
compile_env
- [Application] Warn if
Application.compile_env
orApplication.compile_env!
are called without a require - [Code] Make sure
:static_atoms_encoder
inCode.string_to_quoted/2
also applies to quoted keyword keys - [Code] Ensure bindings with no context are returned as atoms instead of
{binding, nil}
in eval operations - [Inspect] Fix a bug when inspecting a non-binary bitstring with colors
- [Kernel] Reject bidirectional formatting characters in strings and comments
- [Kernel] Support escaping of terminators in uppercase sigils heredocs for consistency
- [Kernel] Raise if
__CALLER__
or__ENV__
or__STACKTRACE__
are used in match - [Kernel] Improve error message on invalid argument for
byte_size
from binary concat - [Kernel] Raise when aliasing non-Elixir modules without
:as
- [Kernel] Allow
unquote_splicing
inside%{...}
without parens - [Kernel] Ensure that waiting on a struct expansion inside a typespec is correctly tracked as waiting time in the compiler
- [Kernel] Correctly parse the atom
.
as a keyword list key - [Kernel] Do not leak variables from the first generator in
with
andfor
special forms - [Kernel] Fix column number on strings with NFD characters
- [Kernel] Fix a bug where a combination of dynamic line in
quote
withunquote
of remote calls would emit invalid AST metadata - [OptionParser] Validate switch types/modifiers early on to give more precise feedback
- [Protocol] Add
defdelegate
to the list of unallowed macros inside protocols as protocols do not allow function definitions - [Protocol] Warn if
@callback
,@macrocallback
and@optional_callbacks
are defined inside protocol - [Protocol] Ensure protocol metadata is deterministic on consolidation
- [Range] Always show step when range is descending
- [String] Update Unicode database to version 14.0
- [URI] Only percent decode if followed by hex digits (according to https://url.spec.whatwg.org/#percent-decode)
- [Version] Ensure proper precedence of
and
/or
in version requirements
ExUnit
- [ExUnit] Fix formatter and counters from
ExUnit.run/0
to consider all tests in a module whenever if a module'ssetup_all
fails - [ExUnit] Allow doctests newlines to be terminated by CRLF
IEx
- [IEx] Fix the loss of
.iex.exs
context after a pry session - [IEx] Stop evaluator before exiting IEx server to avoid evaluators leaking
Logger
- [Logger] Raise clear error message for invalid
:compile_time_purge_matching
configuration - [Logger] Fix a bug where Logger would not reset its discard counter under some scenarios
Mix
- [mix compile.elixir] Track transitive runtime dependencies coming from local/path dependencies
- [mix compile.elixir] Recompile file if
@external_resource
is deleted - [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 - [mix deps] Raise if local dep is unavailable while compiling
- [mix deps.unlock] Fix blank output when unlocking a dependency that is not locked
- [mix local.install] Do not respect
MIX_DEPS_PATH
for install commands - [mix release] Improve release scripts by making sure shell errors cascade (this is done by avoiding exporting and defining variables in a single step)
- [mix release] Do not boot release if
RELEASE_COOKIE
is empty - [mix release] Allow releases running as a daemon to be restarted
- [mix release] Raise proper error message when non-serializable values are in configs
- [mix test] Fix coverage engine to also tag
case
,cond
, andreceive
branches where the right side is a literal
3. Soft-deprecations (no warnings emitted)
Elixir
- [Code] Environment options in
Code.eval_quoted/3
andCode.eval_string/3
, such as:aliases
and:tracers
, have been deprecated in favor of passing an environment - [IO]
:all
onIO.getn
is deprecated in favor of:eof
- [URI]
URI.parse/1
is deprecated in favor ofURI.new/1
andURI.new!/1
Mix
- [mix format]
Mix.Tasks.Format.formatter_opts_for_file/2
is deprecated in favor ofMix.Tasks.Format.formatter_for_file/2
4. Hard-deprecations
Elixir
- [Code]
Code.cursor_context/2
is deprecated, useCode.Fragment.cursor_context/2
instead - [Macro]
Macro.to_string/2
is deprecated, useMacro.to_string/1
instead - [System]
System.get_pid/0
is deprecated, useSystem.pid/0
instead - [Version] Using
!
or!=
in version requirements is deprecated, use~>
or>=
instead
Mix
- [mix escript.build]
:strip_beam
option is deprecated in favor of:strip_beams
- [Mix]
:exit_code
inMix.raise/2
has been deprecated in favor of:exit_status
- [Mix.Config]
Mix.Config
is deprecated in favor ofConfig
module
Checksums
- Precompiled.zip SHA1: 0f196f4de406882b5a3bcee7ac9e9b0c61ed1459
- Precompiled.zip SHA512: 58ffe87d6eb89435d8605aee04556aa1a1ba25cf2fa7688d0a5da162d7d7c57b47b2f726b365a7aeb18832bf08de3db5d3ec0ed45e13da276438679f29e5e3ac
- Docs.zip SHA1: c1aa5161ff3609d9fdda3a2e07f8cea9489622d2
- Docs.zip SHA512: 248fa58bffcee933fef1aafc6a7a2d8ab71d2163f958e610eda0fc5c2af0184b50c2fa0de453bd2ee343eeeb0ed3e94543a1b665dc6960eb064af20be6ea9b11