v1.6.0
Official announcement: https://elixir-lang.org/blog/2018/01/17/elixir-v1-6-0-released/
1. Enhancements
EEx
- [EEx] Allow markers
/
and|
to be used in a custom EEx engine
Elixir
- [Calendar] Add truncate to
Time
,DateTime
andNaiveDateTime
to facilitate microsecond precision pruning - [Code] Add
format_string!/2
andformat_file!/2
for automatic code formatting - [Code] Support column annotations in quoted expressions with
columns: true
inCode.string_to_quoted/2
- [DynamicSupervisor] Add
DynamicSupervisor
designed to manage children that are added and removed dynamically - [Exception] Make
Exception.blame/3
extensible by adding an optionalblame/2
callback to exceptions - [Exception] Improve the printing of guards on blamed exceptions
- [Enumerable] Add
Enumerable.slice/1
and optimize manyEnum
operations with the new protocol. This allows data-structures with index-based random access to provide a non-linear implementation - [Inspect] Show UTF-8 BOM on inspected strings
- [Inspect.Algebra] Add
:strict
and:flex
breaks - this gives more control over the document fitting - [Inspect.Algebra] Allow a group to inherit the parent group break
- [Inspect.Algebra] Add
force_unfit/1
andnext_break_fits/2
which give more control over document fitting - [Inspect.Algebra] Add
collapse_lines/1
for collapsing multiple lines to a maximum value - [Inspect.Algebra] Allow
nest/2
to be:reset
or be set to the current:cursor
position - [Kernel] Prefix variables with V when emitting Erlang code. This improves the integration with tools such as Erlang code formatters and the GUI debugger
- [Kernel] Warn on the use of
length(x) == 0
in guards - [Kernel] Warn if
catch
comes beforerescue
in try - [Kernel] Warn if heredoc is outdented compared to its closing quotes
- [Kernel] Add
defguard/1
anddefguardp/1
to make it easier to build guard-safe macros - [Kernel.ParallelCompiler] Add
compile/2
,compile_to_path/3
andrequire/2
which provide detailed information about warnings and errors - [Kernel.SpecialForms] Support the
uniq: true
flag infor
comprehensions - [Module] Introduce
@deprecated
and@since
attributes - [List] Rearrange equals and inserts for shorter diff scripts in
List.myers_difference/2
- [Record] Allow
:macros
and:includes
to be given toRecord.extract/2
- [Stream] Add
Stream.intersperse/2
- [String] Update to Unicode 10
- [String] Allow passing empty string
match
toString.replace/4
- [String] Support context and language sensitive operations in
String.upcase/2
andString.downcase/2
. Currently only the:greek
context is supported - [String] Support
:ascii
conversion inString.upcase/2
andString.downcase/2
- [Time] Add
Time.add/3
ExUnit
- [ExUnit.Assertions] Perform inclusive checks in
assert_in_delta
- [ExUnit.Callbacks] Add
ExUnit.Callbacks.start_supervised!/2
- [ExUnit.Case] Generate a random seed per test based on the test suite seed
IEx
- [IEx.Autocomplete] Provide contextual autocompletion:
t Enum.
will autocomplete types,b Enum
will autocomplete callbacks - [IEx.CLI] Provide hints for developers when a bad host name is given to
--remsh
- [IEx.Helpers] Automatically include specs when showing documentation for functions/macros
- [IEx.Helpers] Improve formatting of behaviours and typespecs by using the formatter
- [IEx.Helpers] Allow pattern matching and guard expressions when on
IEx.break!
Logger
- [Logger] Add
:discard_threshold
to Logger to help with message queue overflow
Mix
- [mix app.start] Add
--preload-modules
tomix app.start
- [mix archive.build] Allow
mix archive.build
to bundle dot files via an option - [mix compile] Define a behavior for Mix compiler tasks and return diagnostics from compiler tasks
- [mix compile] Track struct dependencies between files and recompile them only if the struct changes
- [mix deps] Support
:system_env
option when specifying dependencies - [mix format] Add a
mix format
task that formats the given files (or the files specified in a.formatter.exs
file) - [mix profile.eprof] Add a new task for time-based profiling with eprof
- [mix test] Run all functions in a describe block by giving the
file:line
the describe block starts - [mix test] Report the top N slowest tests with the
--slowest N
flag - [mix test] Report the number of doctests and tests separately
- [mix xref] Support
--include-siblings
in reports for umbrella support - [mix xref] Add
mix xref graph --format stats
- [mix xref] Add
--only-nodes
and--label
filters to mix xref graph - [mix xref] Add
mix xref deprecated
that shows the callsite of deprecated functions
2. Bug fixes
Elixir
- [CLI] Support path with spaces as argument to elixir.bat
- [Inspect] Properly handle minus signal for non-decimal negative integers
- [Integer] Do not raise on non-integer values in
is_odd
/is_even
- [Kernel] Solve a precedence issue between
&
and|
, such as[&Foo.bar/1 | &Baz.bat/2]
- [Kernel] Do not load dynamic Elixir modules as
:in_memory
as this value is not officially supported by the code server. Instead, use an empty list, which is the same value used by Erlang. - [Kernel] Validate variable struct name is atom when used in pattern matching
- [Kernel] No longer generate documentation for
defdelegate
functions automatically to avoid overriding previously specified@doc
- [Macro] Fix
Macro.to_string/2
for tuple calls, such asalias Foo.{Bar, Baz}
- [MapSet] Return valid MapSet when unioning a legacy MapSet
- [Regex] Return a leading empty space when splitting on empty pattern. This makes the
split
operation consistent with the other operations in theRegex
module - [Stream] Ensure
Stream.chunk_while/4
does not emit more elements than necessary when halted - [String] Return a leading empty space when splitting on empty string. This makes the
split
operation consistent with the other operations in theString
module - [URI] Preserve empty fragments in
URI.parse/1
Mix
- [mix app.start] Improve the quality of reports if app fails to boot
- [mix cmd] Allow
mix cmd
to be invoked multiple times without marking it as executed - [mix deps] Ensure optional dependencies in umbrella applications are loaded
- [mix deps.update] Ensure transitive new non-Hex dependencies are also fetched when a repo is updated
- [mix xref] Take compile dependencies with higher priority than runtime ones when building a graph
- [mix xref] Handle external files for xref callers and warnings
3. Soft deprecations (no warnings emitted)
Elixir
- [GenServer] Warn if
init/1
is not defined inGenServer
. This brings GenServer closer to the implementation in OTP and aligns all behaviours to require theinit/1
callback - [Inspect.Algebra]
surround/3
andsurround_many/6
are deprecated in favor ofcontainer_doc/6
- [Kernel] Specifying map types with variable keys without defining the type as required/optional is deprecated
- [Kernel.ParallelCompiler]
files/2
andfiles_to_path/3
are deprecated in favor ofcompile/2
andcompile_to_path/3
- [Kernel.ParallelRequire]
files/2
is deprecated in favor ofKernel.ParallelCompiler.require/2
- [Supervisor] The
:simple_one_for_one
strategy is deprecated in favor ofDynamicSupervisor
- [Supervisor] Passing a list of args to
Supervisor.start_child/2
is deprecated in favor ofDynamicSupervisor
- [Task.Supervisor] Passing
:restart
and:shutdown
toTask.Supervisor.start_link/2
is deprecated (it should be passed on start child instead)
ExUnit
- [ExUnit.Formatter]
:case_started
and:case_finished
events are deprecated in favor of:module_started
and:module_finished
Mix
- [Mix.Compilers.Erlang] Returning
{:ok, val} | :error
from custom Erlang compilers is deprecated in favor of{:ok, val, warnings} | {:error, errors, warnings}
4. Deprecations
Elixir
- [Enum]
Enum.partition/2
is deprecated in favor ofEnum.split_with/2
- [Keyword]
Keyword.replace/3
is deprecated in favor ofKeyword.fetch/2
andKeyword.put/3
- [Map]
Map.replace/3
is deprecated in favor ofMap.fetch/2
andMap.put/3
- [Macro]
Macro.unescape_tokens/1
andMacro.unescape_tokens/2
are deprecated in favor ofEnum.map/2
- [Range] Deprecate
Range.range?/1
in favor of pattern matching on_ .. _