v1.15.0
Official announcement: https://elixir-lang.org/blog/2023/06/19/elixir-v1-15-0-released/
1. Enhancements
EEx
- [EEx] Include source code snippets in syntax errors
Elixir
- [Calendar] Add support for epoch time (
%s
) toCalendar.strftime/2
- [Code]
Code.format_string!/2
now converts'charlists'
into~c"charlists"
by default - [Code] Add
:on_undefined_variable
to the compiler options to preserve the warning behaviour which was deprecated back in Elixir v1.4 - [Code] Add
Code.loaded?/1
andCode.ensure_all_loaded(!)/1
- [Code] Add
Code.prepend_paths/1
,Code.append_paths/1
, andCode.delete_paths/1
- [Code] Add
Code.with_diagnostics/2
to return diagnostics when compiling and evaluating code - [Code.Fragment] Support nested expressions in
Code.Fragment.cursor_context/1
- [Code.Fragment] Keep operators and no paren calls in
Code.Fragment.container_cursor_to_quoted/1
- [Date] Add
Date.before?/2
andDate.after?/2
- [DateTime] Add
DateTime.before?/2
andDateTime.after?/2
- [DateTime] Support precision in
DateTime.utc_now/2
- [File] Support distributed
File.Stream
- [Inspect]
Inspect
now renders'charlists'
as~c"charlists"
by default - [Kernel] Break down
case
andcond
insidedbg/2
- [Kernel] Add
t:nonempty_binary/0
andt:nonempty_bitstring/0
- [Kernel] Treat
@behaviour
s as runtime dependencies - [Kernel] Do not add runtime dependencies for alias references in patterns and guards
- [Kernel] Warn for nested calls without parens inside keywords
- [Kernel] Support for multi-letter uppercase sigils
- [Kernel] Introduce mechanism to collect several errors in a module. Previously, as soon as there was a compilation error, compilation would fail. Now the compiler became a bit smarter and will report multiple errors whenever possible as multiple
error: ...
messages, similar towarning: ...
- [Kernel] Raise instead of warning on undefined variables. Previously, an undefined variable would attempt to invoke a function of the same name, which led to confusing error messages, especially to newcomers. To enable the previous behaviour, invoke
Code.compiler_options(on_undefined_variable: :warn)
at the top of yourmix.exs
- [Kernel.CLI] Support
--sname undefined
/--name undefined
so a name is automatically generated - [Keyword] Add
Keyword.split_with/2
- [Macro] Improve error message when piping into an expression ending in bracket-based access
- [Macro.Env] Add
Macro.Env.lookup_alias_as/2
- [Map] Add
Map.split_with/2
- [Map] Add
Map.intersect/2
andMap.intersect/3
- [MapSet] Add
MapSet.split_with/2
- [MapSet] Optimize most functions
- [NaiveDateTime] Add
NaiveDateTime.beginning_of_day/1
andNaiveDateTime.end_of_day/1
- [NaiveDateTime] Add
NaiveDateTime.before?/2
andNaiveDateTime.after?/2
- [NaiveDateTime] Support precision in
NaiveDateTime.utc_now/2
- [Module] Mark functions as generated in "Docs" chunk
- [Module] Add
Module.get_last_attribute/3
- [OptionParser] Support
:return_separator
option - [Process] Add
Process.alias/0,1
andProcess.unalias/1
- [Range] Add
Range.split/2
- [String] Update Unicode to version 15.0.0
- [String] Add
:fast_ascii
mode toString.valid?/2
- [Supervisor] Add support for automatic shutdown in
Supervisor
- [System] Support
:lines
inSystem.cmd/3
to capture output line by line - [Task] Remove head of line blocking on
Task.yield_many/2
- [Task] Enable selective receive optimizations in Erlang/OTP 26+
- [Task] Reduce tasks footprint by avoiding unecessary work during spawning
- [Task.Supervisor] Do not copy args on temporary
Task.Supervisor.start_child/2
- [Time] Add
Time.before?/2
andTime.after?/2
- [URI] Add
URI.append_path/2
ExUnit
- [ExUnit] Add more color configuration to ExUnit CLI formatter
- [ExUnit.Callbacks] Accept
{module, function}
tuples in ExUnitsetup
callbacks - [ExUnit.Case] Add
ExUnit.Case.get_last_registered_test/1
- [ExUnit.Doctest] Add
ExUnit.DocTest.doctest_file/2
- [ExUnit.Doctest] Include
doctest_data
in doctest tags - [ExUnit.Formatter] When comparing two anonymous functions, defined at the same place but capturing a different environment, we will now also diff the environments
IEx
- [IEx] Make pry opt-in on dbg with
--dbg pry
- [IEX] Support
IEX_HOME
- [IEx.Autocomplete] Only provide aliases when autocompleting
alias
,import
, andrequire
- [IEx.Autocomplete] Provide field completion on map and struct updates
- [IEx.Helpers] Add
runtime_info(:allocators)
- [IEx.Info] Implement protocol for
Range
,DateTime
, andRegex
Logger
- [Logger] Add
Logger.add_handlers/1
andLogger.default_formatter/1
- [Logger] Introduce
default_formatter
anddefault_handler
configuration for Logger which configures Erlang/OTP logger - [Logger] Add
:always_evaluate_messages
configuration to Logger - [Logger.Formatter] Implement the Erlang Logger formatter API
- [Logger.Formatter] Add support for ports in Logger metadata
Mix
- [mix app.start] Allow applications to be started concurrently via the
:start_concurrently
configuration - [mix compile] Set
--all-warnings
by default - [mix compile] Reduce the amount of filesystem lookups for path dependencies by storing timestamps in manifests
- [mix compile] Track digests of
@external_resources
- [mix compile.app] Write
optional_applications
to.app
file - [mix compile.elixir] Add
--purge-consolidation-path-if-stale
which will purge the given consolidation path if compilation is required - [mix deps.compile] Automatically recompile dependencies if their compile env changes
- [mix deps.get] Automatically install Hex and Rebar on
mix deps.get
/mix deps.update
- [mix deps.get] Support
--check-locked
which raises if changes to the lockfile are required - [mix eval] Allow passing additional arguments
- [mix format] Support
--no-exit
option - [mix format] Allow multiple formatters per file extension and sigil
- [mix format] Show diffs whenever
--check-formatted
fails - [mix format] Allow the formatting root to be configured
- [mix loadpaths] Cache deps and archive loadpaths in Erlang/OTP 26
- [mix profile.fprof] Support
--trace-to-file
to improve performance when working with large outputs - [mix release] Allow passing additional arguments to the
eval
command - [mix xref graph] Support
--output
flag - [Mix.Project] Support
def cli
to unify all CLI defaults in a single place - [Mix.Project] Add
Mix.Project.deps_tree/1
2. Bug fixes
Elixir
- [Code.Formatter] Fix a scenario where a keyword followed by parenthesis could go above the maximum line length
- [Code.Formatter] Remove unnecessary parens in nullary type funs
- [Exception] Fix operator precedence when printing guards in
Exception.blame/3
- [File] Do not raise if there are file system race conditions in
File.cp/2
- [File] Do not raise when deleting write-only empty directories on
File.rm_rf/1
- [Kernel] Expand macros on the left side of -> in
try/rescue
- [Kernel] Raise on misplaced
...
inside typespecs - [Kernel] Do not import
behaviour_info
andmodule_info
functions from Erlang modules - [Kernel] Raise when macros are given to dialyzer
- [Kernel.ParallelCompiler] Make sure compiler doesn't crash when there are stray messages in the inbox
- [Kernel.ParallelCompiler] Track compile and runtime warnings separately
- [Module] Ensure that
Module.get_attribute/3
returnsnil
and not the given default value when an attribute has been explicitly set asnil
- [System] Fix race condition when a script would terminate before
System.stop/1
executes - [Task] Do not double log Task failure reports
- [URI] Make sure
URI.merge/2
works accordingly with relative paths
ExUnit
- [ExUnit] Fix crash when
@tag capture_log: true
was set to true and the Logger application was shut down in the middle of the test - [ExUnit] Do not merge context as tags inside the runner to reduce memory usage when emitting events to formatters
- [ExUnit] Mark test cases as invalid when an exit occurs during
setup_all
- [ExUnit] Do not expand or collect vars from quote in ExUnit assertions
- [ExUnit.DocTest] Ensure proper line is returned when failing to parse doctest results
- [ExUnit.Doctest] Fix line information when a doctest with multiple assertions fails
IEx
- [IEx] Do not spawn a process to read IO. This fixes a bug where multiline paste stopped working
whenever the input reader was killed - [IEx] Do not perform completion for prompts triggered during code evaluation
Mix
- [mix compile] Include
cwd
in compiler cache key - [mix release] Fix Windows service when invoking
erlsrv.exe
in path with spaces - [mix xref] Raise early if
mix xref
is used at the umbrella root
3. Soft deprecations (no warnings emitted)
Elixir
- [File]
File.cp/3
andFile.cp_r/3
with a function as third argument
is deprecated in favor of a keyword list - [Kernel] Require pin variable when accessing variable inside binary size in match
- [Kernel.ParallelCompiler] Require the
:return_diagnostics
option to be
set to true when compiling or requiring code
Logger
- [Logger]
add_backend/2
,remove_backend/2
, andconfigure_backend/2
have been deprecated
in favor of the new:logger_backends
dependency - [Logger] The
:console
configuration has been deprecated in favor of:default_formatter
- [Logger] The
:backends
configuration has been deprecated in favor ofLogger.add_handlers/1
Mix
- [Mix.Project]
:preferred_cli_env
is deprecated in favor of:preferred_envs
indef cli
- [Mix.Project]
:preferred_cli_target
is deprecated in favor of:preferred_targets
indef cli
- [mix local] The environment variable
HEX_MIRROR
is deprecated in favor ofHEX_BUILDS_URL
4. Hard deprecations
Elixir
- [Calendar]
Calendar.ISO.day_of_week/3
is deprecated in favor ofCalendar.ISO.day_of_week/4
- [Exception]
Exception.exception?/1
is deprecated in favor ofKernel.is_exception/1
- [Kernel] Deprecate
...
as a valid function call identifier - [Regex]
Regex.regex?/1
is deprecated in favor ofKernel.is_struct/2
Logger
- [Logger]
Logger.warn/2
is deprecated in favor ofLogger.warning/2