This release contains only bug fixes:
Elixir
* [Code] Make sure that bindings in the default context returned by
Code.eval_* functions are not returned as tagged tuples
* [Kernel] Do not crash when handling ambiguity errors
* [Range] Still match on old range patterns throughout the stdlib
IEx
* [IEx.Autocomplete] Do not error autocompletion with module
attribute
Mix
* [Mix] Rename inconsistent :exit_code option to :exit_status on
Mix.raise/2
1. Bug fixes
Elixir
[Kernel] Ensure deprecated macros emit warnings
Mix
[mix deps] Ensure unconstrained rebar deps generate valid mix specifications
2. Enhancements
Elixir
[elixirc] Change the output of --profile time to make it easier to detect outliers
[Application] Do not add compile time deps on args to Application.compile_env/2 and Application.compile_env!/2
[Enum] Optimize Enum.into/3 and Map.new/2
Mix
[mix compile] Compile most recently changed files first
[mix compile, mix run, mix test] Speed up the time taken to load dependencies. This should make the usage of Mix inside projects quite more responsive
This release introduces fixes for better support of Erlang/OTP 24+.
1. Enhancements
Elixir
[Kernel] Update formatting when printing warnings and errors from Erlang/OTP 24+
[Kernel] Support float-16 on bitstrings
Mix
[mix local.rebar] This task will now install rebar3 version 3.14.4, compiled with Erlang/OTP 21
v1.11.3
1. Enhancements
Elixir
[Macro] Add Macro.unique_var/2 and Macro.generate_unique_arguments/2
2. Bug fixes
Elixir
[Code] Do not raise when checking for operator ambiguity when :static_atoms_encoder is set in Code.string_to_quoted
[Kernel] Emit undefined function warnings from with
[Kernel] Do not fail type checking when literals are used in guards
[Module] Do not warn for attributes used in @after_compile
[Record] Make sure nested record names do not clobber each other
ExUnit
[ExUnit.Assertions] Do not crash if there are macros and module attributes on the left side of ++
IEx
[IEx.Helpers] Do not use Unicode chars if ANSI is disabled
Mix
[mix deps.compile] Fix compatibility with rebar v3.14
[mix release] Do not use private ram_file:compress/1
[mix xref] Do not crash when retrieving calls for modules in memory
Elixir
[Code] Do not crash when getting docs for missing erts appdir
[Kernel] Raise meaningful error if :erlang.is_record is used in guards
[Kernel] Prune tracers when fetching __ENV__ inside functions
Mix
[mix] Fix regression where aliases could not call themselves recursively
[mix compile] Do not discard tracers that are set programmatically
"Over the last releases, the Elixir team has been focusing on the compiler, both in terms of catching more mistakes at compilation time and making it faster. Elixir v1.11 has made excellent progress on both fronts. This release also includes many other goodies, such as tighter Erlang integration, support for more guard expressions, built-in datetime formatting, and other calendar enhancements."
## v1.10.4 (2020-07-04)
### 1. Bug fixes
#### Elixir
* [Kernel] Fix a bug where custom types were printed as built-in types
* [Kernel] Don't add compile-time dependency on `defdelegate`
* [Kernel] Add line numbers to warnings on deprecated imports
* [Kernel] Report the correct line number when raising inside a macro
* [Task] Include callers in translated Logger metadata for Task
* [Task] Fix Task PID and caller in Task Supervisor reports
#### ExUnit
* [ExUnit.Formatter] Avoid crashes when diffing guards when the pattern does not match
* [ExUnit.Formatter] Also blame exceptions that come from linked and trapped exits
#### IEx
* [IEx.Helpers] Do not crash when printing a type that cannot be code formatted
#### Mix
* [mix app.start] Fix reading `.app` file located in archives (`.ez` files)
* [mix local.hex] Provide more guidance when Hex can't be installed
* [mix release] Properly encode config in releases
## v1.10.3 (2020-04-25)
### 1. Bug fixes
#### Elixir
* [Code] Return `[{mod, bin}]` from `Code.compile_file/2`, `Code.require_file/2`, `Code.load_file/2`
* [Code] Make sure the formatter respects newlines before and after module attributes
* [Kernel.ParallelCompiler] Fix a bug where the parallel compiler would raise in long compilation cycles
* [Kernel.ParallelCompiler] Fix a bug where the parallel compiler would raise if some of the modules being compiled referred to a module that has been loaded directly to memory
* [Module] Fix accidental breaking change where bodiless clauses had their body value on `@on_definition` callbacks set to an empty list instead of `nil`
* [String] Undeprecate `String.normalize/2` normalize and fix infinite loop caused by certain invalid strings
#### ExUnit
* [ExUnit.Assertions] Fix pattern matching diff when matching on pinned variables
* [ExUnit.Assertions] Fix pattern matching diff when matching variable struct names
* [ExUnit.Assertions] Fix pattern matching diff when matching on the binary concat operator (`<>`) and the left side is not a literal string
* [ExUnit.Assertions] Fix pattern matching diff when matching on pseudo-vars (`__MODULE__`, `__DIR__`, etc)
#### Mix
* [mix release] Respect the `:path` option when creating a `:tar` file for releases
v1.10.2
Bug fixes
Elixir
[Macro] Fix a bug where Macro.to_string/1 would emit invalid code for sigils
[Task] Do not crash async_stream monitor if it receives spurious DOWN messages
Logger
[Logger] Fix a bug where the Logger formatter would fail when handling unknown metadata values
Mix
[mix compile] Do not write files to disk if --warnings-as-errors was given and warnings were emitted
v1.10.0
Support for Erlang/OTP 21+
Releases improvements
Elixir v1.9 introduced releases as a mechanism to package self-contained applications. Elixir v1.10 further improves releases with bug fixes and new enhancements based on feedback we got from the community. The highlights are:
* Allow the dual boot system of releases to be disabled on environments that are boot-time sensitive, such as embedded devices
* Track and raise if compile-time configuration is set or changes at runtime (more in the next section)
* Support for easily adding extra files to releases via overlays
* Allow RELEASE_DISTRIBUTION to be set to none in order to fully disable it
* Add a built-in :tar step that automatically packages releases
## v1.9.1 (2019-07-18)
### 1. Enhancements
#### Mix
* [mix format] Print relative paths in `--check-formatted` output
* [mix release] Support included applications
### 2. Bug fixes
#### Elixir
* [Code] Fix formatter wrongly removing nested parens in nested calls
#### Logger
* [Logger] Do not crash translator on poorly formatted supervisor names
#### Mix
* [mix compile] Raise readable error for mismatched sources during compilation
* [mix release] Preserve UTF8 encoding in release config files
## v1.9.0 (2019-06-24)
### 1. Enhancements
#### EEx
* [EEx] Allow more complex mixed expressions when tokenizing
#### Elixir
* [Access] Allow `Access.at/1` to handle negative index
* [CLI] Add support for `--boot`, `--boot-var`, `--erl-config`, `--pipe-to`, `--rpc-eval`, and `--vm-args` options
* [Code] Add `static_atom_encoder` option to `Code.string_to_quoted/2`
* [Code] Support `:force_do_end_blocks` on `Code.format_string!/2` and `Code.format_file!/2`
* [Code] Do not raise on deadlocks on `Code.ensure_compiled/1`
* [Config] Add `Config`, `Config.Reader`, and `Config.Provider` modules for working with configuration
* [File] Add `File.rename!/2`
* [Inspect] Add `:inspect_fun` and `:custom_options` to `Inspect.Opts`
* [Kernel] Add `~U` sigil for UTC date times
* [Kernel] Optimize `&super/arity` and `&super(&1)`
* [Kernel] Optimize generated code for `with` with a catch-all clause
* [Kernel] Validate `__struct__` key in map returned by `__struct__/0,1`
* [Module] Add `Module.get_attribute/3`
* [Protocol] Improve `Protocol.UndefinedError` messages to also include the type that was attempted to dispatch on
* [Protocol] Optimize performance of dynamic dispatching for non-consolidated protocols
* [Record] Include field names in generated type for records
* [Regex] Automatically recompile regexes
* [Registry] Add `Registry.select/2`
* [System] Add `System.restart/0`, `System.pid/0` and `System.no_halt/1`
* [System] Add `System.get_env/2`, `System.fetch_env/1`, and `System.fetch_env!/1`
* [System] Support `SOURCE_DATE_EPOCH` for reproducible builds
#### ExUnit
* [ExUnit] Allow multiple `:exclude` on configuration/CLI
* [ExUnit.DocTest] No longer wrap doctest errors in custom exceptions. They ended-up hiding more information than showing
* [ExUnit.DocTest] Display the actual doctest code when doctest fails
#### IEx
* [IEx.CLI] Copy ticktime from remote node on IEx `--remsh`
* [IEx.CLI] Automatically add a host on node given to `--remsh`
#### Logger
* [Logger] Use a decentralized mode computation for Logger which allows overloads to be detected more quickly
* [Logger] Use `persistent_term` to store configuration whenever available for performance
#### Mix
* [Mix] Follow XDG base dir specification in Mix for temporary and configuration files
* [Mix.Generator] Add `copy_file/3`, `copy_template/4`, and `overwite?/2`
* [Mix.Project] Add `preferred_cli_target` that works like `preferred_cli_env`
* [mix archive.uninstall] Allow `mix archive.uninstall APP` to uninstall any installed version of APP
* [mix new] No longer generate a `config/` directory for mix new
* [mix release] Add support for releases
* [mix release.init] Add templates for release configuration
* [mix test] Allow running tests for a given umbrella app from the umbrella root with `mix test apps/APP/test`. Test failures also include the `apps/APP` prefix in the test location
### 2. Bug fixes
#### EEx
* [EEx] Consistently trim newlines when you have a single EEx expression per line on multiple lines
#### Elixir
* [Code] Quote `::` in `Code.format_string!/1` to avoid ambiguity
* [Code] Do not crash formatter on false positive sigils
* [Enum] Ensure the first equal entry is returned by `Enum.min/2` and `Enum.max/2`
* [Kernel] Improve error message when string interpolation is used in a guard
* [Kernel] Properly merge and handle docs for callbacks with multiple clauses
* [Kernel] Guarantee reproducible builds on modules with dozens of specs
* [Kernel] Resolve `__MODULE__` accordingly in nested `defmodule` to avoid double nesting
* [Kernel] Type variables starting with an underscore (`_foo`) should not raise compile error
* [Kernel] Keep order of elements when macro `in/2` is expanded with a literal list on the right-hand side
* [Kernel] Print proper location on undefined function error from dynamically generated functions
* [Kernel] **Potentially breaking** Do not leak aliases when nesting module definitions that are fully namespaced modules. If you defined `defmodule Elixir.Foo.Bar` inside `defmodule Foo`, previous Elixir versions would automatically define an alias, but fully namespaced modules such as `Elixir.Foo.Bar` should never define or require an alias. If you were accidentally relying on this broken behaviour, your code may no longer work
* [System] Make sure `:init.get_status/0` is set to `{:started, :started}` once the system starts
* [Path] Do not expand `~` in `Path.expand/2` when not followed by a path separator
* [Protocol] Ensure `debug_info` is kept in protocols
* [Regex] Ensure inspect returns valid `~r//` expressions when they are manually compiled with backslashes
* [Registry] Fix ETS leak in `Registry.register/2` for already registered calls in unique registries while the process is still alive
#### ExUnit
* [ExUnit] Raise error if attempting to run single line tests on multiple files
* [ExUnit] Return proper error on duplicate child IDs on `start_supervised`
#### IEx
* [IEx] Automatically shut down IEx if we receive EOF
#### Logger
* [Logger] Don't discard Logger messages from other nodes as to leave a trail on both systems
#### Mix
* [mix compile] Ensure Erlang-based Mix compilers (erlang, leex, yecc) set valid position on diagnostics
* [mix compile] Ensure compilation halts in an umbrella project if one of the siblings fail to compile
* [mix deps] Raise an error if the umbrella app's dir name and `mix.exs` app name don't match
* [mix deps.compile] Fix subcommand splitting bug in rebar3
* [mix test] Do not consider modules that are no longer cover compiled when computing coverage report, which could lead to flawed reports
### 3. Soft-deprecations (no warnings emitted)
#### Mix
* [Mix.Config] `Mix.Config` has been deprecated in favor of the `Config` module that now ships as part of Elixir itself. Reading configuration files should now be done by the `Config.Reader` module
### 4. Hard-deprecations
#### Elixir
* [CLI] Deprecate `--detached` option, use `--erl "-detached"` instead
* [Map] Deprecate Enumerable keys in `Map.drop/2`, `Map.split/2`, and `Map.take/2`
* [String] The `:insert_replaced` option in `String.replace/4` has been deprecated. Instead you may pass a function as a replacement or use `:binary.replace/4` if you need to support earlier Elixir versions
#### Mix
* [Mix.Project] Deprecate `Mix.Project.load_paths/1` in favor of `Mix.Project.compile_path/1`
1. Enhancements
Elixir
[Kernel] Expand left..right at compile time in more cases, which leads to improved performance under different scenarios, especially on x in left..right expressions
Mix
[mix deps.loadpaths] Add --no-load-deps flag. This is useful for Rebar 3 compatibility
2. Bug fixes
Elixir
[Calendar] Fix for converting from negative iso days on New Year in a leap year
[Kernel] Ensure @spec, @callback, @type and friends can be read accordingly
[Module] Avoid warnings when using Module.eval_quoted in the middle of existing definitions
Mix
[mix archive.build] Unload previous archive versions before building
[mix format] Expand paths so mix format path\for\windows.ex works
[mix test] Ensure that --cover displays correct coverage in an umbrella app
v1.7.3
======
1. Bug fixes
ExUnit
- [ExUnit.Assertions] Do not attempt to expand `try/1` as it is a
special form
Mix
- [mix compile.app] Do not include applications with `runtime: false`
as a runtime dependency for applications coming from Hex
v1.7.2
======
1. Bug fixes
Elixir
- [DateTime] Take negative years into account in
`DateTime.from_iso8601/1`
- [Kernel] Do not emit warnings for repeated docs over different
clauses due to false positives
Mix
- [mix compile] Properly mark top-level dependencies as optional and
as runtime. This fixes a bug where Mix attempted to start optional
dependencies of a package when those optional dependencies were not
available
- [mix compile] Avoid deadlock when a config has a timestamp later
than current time
- [mix help] Show task and alias help when both are available
- [mix test] Do not fail suite if there are no test files
v1.7.1
======
1. Bug fixes
Elixir
- [Calendar] Work-around a Dialyzer bug that causes it to loop for a
long time, potentially indefinitely
v1.7.0
======
1. Enhancements
Elixir
- [Calendar.ISO] Support negative dates in `Calendar.ISO`
- [Calendar] Add `Calendar.months_in_year/1` callback
- [Code] Add `Code.compile_file/2` that compiles files without leaving
footprints on the system
- [Code] Add `Code.purge_compiler_modules/0` that purges any compiler
module left behind. This is useful for live systems dynamically
compiling code
- [Code] Add `Code.fetch_docs/1` that returns docs in the [EEP
48](http://erlang.org/eep/eeps/eep-0048.html) format
- [Date] Add `Date.months_in_year/1` function
- [DynamicSupervisor] Use the name of the `DynamicSupervisor` as the
ID whenever possible
- [Exception] Provide "did you mean" suggestions on KeyError
- [Exception] Provide more information on ArithmeticError on
Erlang/OTP 21+
- [Function] Add `Function` module with `capture/3`, `info/1` and
`info/2` functions
- [GenServer] Support the new `handle_continue/2` callback on
Erlang/OTP 21+
- [IO.ANSI] Add cursor movement to `IO.ANSI`
- [Kernel] Support adding arbitrary documentation metadata by passing
a keyword list to `@doc`, `@moduledoc` and `@typedoc`
- [Kernel] Introduce `__STACKTRACE__` to retrieve the current
stacktrace inside `catch`/`rescue` (this will be a requirement for
Erlang/OTP 21+)
- [Kernel] Raise on unsafe variables in order to allow us to better
track unused variables
- [Kernel] Warn when using `length` to check if a list is not empty on
guards
- [Kernel] Add hints on mismatched `do`/`end` and others pairs
- [Kernel] Warn when comparing structs using the `>`, `<`, `>=` and
`<=` operators
- [Kernel] Warn on unsupported nested comparisons such as `x < y < z`
- [Kernel] Warn if redefining documentation across clauses of the same
definition
- [Kernel] Warn on unnecessary quotes around atoms, keywords and calls
- [Macro] Add `Macro.special_form?/2` and `Macro.operator?/2` that
returns `true` if the given name/arity is a special form or operator
respectively
- [Macro.Env] Add `Macro.Env.vars/1` and `Macro.Env.has_var?/2` that
gives access to environment data without accessing private fields
- [Regex] Include endianness in the regex version. This allows regexes
to be recompiled when an archive is installed in a system with a
different endianness
- [Registry] Add `Registry.count/1` and `Registry.count_match/4`
- [String] Update to Unicode 11
- [StringIO] Add `StringIO.open/3`
- [System] Use ISO 8601 in `System.build_info/0`
ExUnit
- [ExUnit.Assertion] Print the arguments in error reports when
asserting on a function call. For example, if `assert is_list(arg)`
fails, the argument will be shown in the report
- [ExUnit.Diff] Improve diffing of lists when one list is a subset of
the other
- [ExUnit.DocTest] Show colored diffs on failed doctests
- [ExUnit.Formatter] Excluded tests, via the `--exclude` and `--only`
flags, are now shown as "Excluded" in reports. Tests skipped via
`@tag :skip` are now exclusively shown as "Skipped" and in yellow
IEx
- [IEx.Helpers] Add `use_if_available/2`
- [IEx.Helpers] Allow `force: true` option in `recompile/1`
- [IEx.Helpers] Add `:allocators` pane to `runtime_info/1`
- [IEx.Helpers] Show documentation metadata in `h/1` helpers
Logger
- [Logger] Ensure nil metadata is always pruned
- [Logger] Only evaluate Logger macro arguments when the message will
be logged
- [Logger] Add `:compile_time_purge_matching` to purge logger calls
that match certain compile time metadata, such as module names and
application names
- [Logger] Log to `:stderr` if a backend fails and there are no other
backends
- [Logger] Allow translators to return custom metadata
- [Logger] Return `:crash_reason`, `:initial_call` and
`:registered_name` as metadata in crash reports coming from
Erlang/OTP
Mix
- [mix archive.install] Add support for the Hex organization via
`--organization`
- [mix archive.uninstall] Support `--force` flag
- [mix compile] Improve support for external build tools such as
`rebar`
- [mix deps] Include `override: true` in rebar dependencies to make
the behaviour closer to how rebar3 works (although diverged deps are
still marked as diverged)
- [mix escript.install] Add support for the Hex organization via
`--organization`
- [mix escript.uninstall] Support `--force` flag
- [mix help] Also list aliases
- [mix local] Use ipv6 with auto fallback to ipv4 when downloading
data
- [mix profile] Allow all profiling tasks to run programatically
- [mix test] Add `--failed` option that only runs previously failed
tests
- [mix test] Print coverage summary by default when the `--cover` flag
is given
- [Mix.Project] Add `Mix.Project.clear_deps_cache/0`
- [Mix.Project] Add `Mix.Project.config_mtime/0` that caches the
config mtime values to avoid filesystem access
2. Bug fixes
Elixir
- [IO.ANSI.Docs] Fix table column alignment when converting docs to
ANSI escapes
- [Code] Ensure `string_to_quoted` returns error tuples instead of
raising in certain constructs
- [Code.Formatter] Consistently format keyword lists in function calls
with and without parens
- [Code.Formatter] Do not break after `->` when there are only
comments and one-line clauses
- [File] Allow the `:trim_bom` option to be used with `:encoding`
- [Kernel] Raise on unsafe variables as some of the code emitted with
unsafe variables would not correctly propagate variables or would
disable tail call optimization semantics
- [Kernel] Do not crash on dynamic sizes in binary generators with
collectable into in comprehensions
- [Kernel] Do not crash on literals with non-unary size in binary
generators with collectable into in comprehensions
- [Task] Improve error reports and exit reasons for failed tasks on
Erlang/OTP 20+
ExUnit
- [ExUnit.Case] Raise proper error if `@tag` and `@moduletag` are used
before `use ExUnit.Case`
- [ExUnit.Case] Raise proper error if `@describetag` is used outside
of `describe/2` blocks
- [ExUnit.DocTest] Emit proper assertion error on doctests with
invalid UTF-8
Mix
- [mix archive.install] Fetch optional dependencies when installing an
archive from Git/Hex
- [mix compile] Properly track config files in umbrella projects and
recompile when any relevant umbrella configuration changes
- [mix deps] Ensure the same dependency from different SCMs are tagged
as diverged when those SCMs are remote and non-remote
- [mix deps] Ensure we re-run dependency resolution when overriding a
skipped dep in umbrella
- [mix deps.compile] Perform clean builds for dependencies on outdated
locks to avoid old modules from affecting future compilation
- [mix escript.install] Fetch optional dependencies when installing an
escript from Git/Hex
3. Soft-deprecations (no warnings emitted)
Elixir
- [Code] Deprecate `Code.load_file/2` in favor of
`Code.compile_file/2`
- [Code] Deprecate `Code.loaded_files/0` in favor of
`Code.required_files/0`
- [Code] Deprecate `Code.unload_files/1` in favor of
`Code.unrequire_files/1`
Logger
- [Logger] `compile_time_purge_level` is deprecated in favor of
`compile_time_purge_matching`
4. Hard-deprecations
Elixir
- [Code] `Code.get_docs/2` is deprecated in favor of
`Code.fetch_docs/1`
- [Enum] `Enum.chunk/2/3/4` is deprecated in favor of
`Enum.chunk_every/2/3/4` - notice `chunk_every` does not discard
incomplete chunks by default
- [GenServer] Warn if `super` is used in any of the GenServer
callbacks
- [Kernel] `not left in right` is ambiguous and is deprecated in favor
of `left not in right`
- [Kernel] Warn on confusing operator sequences, such as `1+++1`
meaning `1 ++ +1` or `........` meaning `... .. ...`
- [OptionParser] Deprecate dynamic option parser mode that depended on
atoms to be previously loaded and therefore behaved inconsistently
- [Stream] `Stream.chunk/2/3/4` is deprecated in favor of
`Stream.chunk_every/2/3/4` - notice `chunk_every` does not discard
incomplete chunks by default
- [Code] Preserve the user's choice in the formatter on parens call
with next break fits
- [Code] Preserve the user's choice in the formatter on calls without
parens when we have one argument per line
- [Code] Fix formatting when there is a tilde in the first element of
a bitstring
- [Kernel] Support specsdiff flag on __info__ spec clauses
- [Kernel] Do not exclude hygienic vars in defguard
- [Kernel.SpecialForms] Mark for comprehensions as generated to avoid
dialyzer warnings
- [Macro] Make sure Macro.to_string/2 emits valid quoted expressions
- [Task] Support :infinity timeout on Task.yield_many/2
- [Task.Supervisor] Do not crash spawning supervised tasks when the
parent process is dead
- [URI] Fix parsing of URIs with trailing ?
Elixir
- [Code.Formatter] Support comments in the middle of pipelines,
when and | expressions
- [Code.Formatter] Consider commas when breaking groups
- [Code.Formatter] Ensure proper precedence between & and operators
- [Code.Formatter] Consider .formatter.exs when formatting stdin
Logger
- [Logger.Translator] Ensure logger doesn't crash when reporting
named DynamicSupervisor
1. Enhancements
Mix
- [mix compile.erlang] Teach Mix erlang compiler alternative spelling
for -behavior declaration
- [mix format] Support the :subdirectories configuration that points
to other directories with their own .formatter.exs file. This is
useful in umbrella applications. mix new --umbrella has also been
changed to use this new configuration by default
- [mix format] Include the current environment for missing dependency
errors
2. Bug fixes
Elixir
- [Code.Formatter] Ensure -> does not exceed line length
- [DynamicSupervisor] Properly tag error reports generated by dynamic
supervisors so they can be properly translated by Logger
- [DynamicSupervisor] Consider extra arguments during child restart
- [Kernel] Ensure arguments given to a guard defined with defguard are
evaluated in the correct order
- [Module] Do not remove docs for previous function declaration when
@impl true is used
- [Supervisor] Ensure use Supervisor properly adds the @behaviour
Supervisor annotation
Mix
- [Mix.Shell] Bring back Mix.Shell.cmd/2 - this arity was defined via
a default argument that was accidentally removed
1. Enhancements
Elixir
- [DynamicSupervisor] Implement child_spec/1 for DynamicSupervisor
- [Kernel] Raise better error messages on invalid map syntax
2. Bug fixes
Elixir
- [Code.Formatter] Only rearrange not in operator if explicitly
opted-in
- [Code.Formatter] Ensure do blocks do not exceed line length on calls
with a single argument
- [Collectable] Support bitstrings in Collectable and
for-comprehensions (regression in v1.6.0)
- [GenServer] Do not override user own @opts attribute
- [Enum] Reintroduce zipping of any enumerable of enumerables in
Enum.zip/1 (regression in v1.6.0)
- [Macro] Reorder kw blocks in Macro.to_string/1 to avoid warnings
- [Protocol] Fix protocol consolidation when some chunks may be
missing
- [Stream] Reintroduce zipping of any enumerable of enumerables in
Stream.zip/1 (regression in v1.6.0)
- [Supervisor] Do not override user own @opts attribute
- [Supervisor] Add @spec to second clause of start_link/2
ExUnit
- [ExUnit.Case] Reintroduce :case in ExUnit setup/setup_all/test
context
1. Enhancements
EEx
- [EEx] Allow markers `/` and `|` to be used in a custom EEx engine
Elixir
- [Calendar] Add truncate to `Time`, `DateTime` and `NaiveDateTime` to
facilitate microsecond precision pruning
- [Code] Add `format_string!/2` and `format_file!/2` for automatic
code formatting
- [Code] Support column annotations in quoted expressions with
`columns: true` in `Code.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
optional `blame/2` callback to exceptions
- [Exception] Improve the printing of guards on blamed exceptions
- [Enumerable] Add `Enumerable.slice/1` and optimize many `Enum`
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` and `next_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 before `rescue` in try
- [Kernel] Warn if heredoc is outdented compared to its closing quotes
- [Kernel] Add `defguard/1` and `defguardp/1` to make it easier to
build guard-safe macros
- [Kernel.ParallelCompiler] Add `compile/2`, `compile_to_path/3` and
`require/2` which provide detailed information about warnings and
errors
- [Kernel.SpecialForms] Support the `uniq: true` flag in `for`
comprehensions
- [Module] Introduce `@deprecated` and `@since` attributes
- [Module] Emit conflicting behaviour warnings if the same behaviour
is given more than once
- [List] Rearrange equals and inserts for shorter diff scripts in
`List.myers_difference/2`
- [Record] Allow `:macros` and `:includes` to be given to
`Record.extract/2`
- [Stream] Add `Stream.intersperse/2`
- [String] Update to Unicode 10
- [String] Allow passing empty string `match` to `String.replace/4`
- [String] Support context and language sensitive operations in
`String.upcase/2` and `String.downcase/2`. Currently only the
`:greek` context is supported
- [String] Support `:ascii` conversion in `String.upcase/2` and
`String.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` to `mix 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
- [Macro] Fix `Macro.to_string/2` for tuple calls, such as `alias
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 the `Regex` 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 the `String` 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
- [Inspect.Algebra] `surround/3` and `surround_many/6` are deprecated
in favor of `container_doc/6`
- [Kernel.ParallelCompiler] `files/2` and `files_to_path/3` are
deprecated in favor of `compile/2` and `compile_to_path/3`
- [Kernel.ParallelRequire] `files/2` is deprecated in favor of
`Kernel.ParallelCompiler.require/2`
- [GenServer] Warn if `init/1` is not defined in `GenServer`. This
brings GenServer closer to the implementation in OTP and aligns all
behaviours to require the `init/1` callback
ExUnit
- [ExUnit.Formatter] `:case_started` and `:case_finished` events are
deprecated in favor of `:module_started` and `:module_finished`
4. Deprecations
Elixir
- [Enum] `Enum.partition/2` is deprecated in favor of
`Enum.split_with/2`
- [Keyword] `Keyword.replace/3` is deprecated in favor of
`Keyword.fetch/2` and `Keyword.put/3`
- [Map] `Map.replace/3` is deprecated in favor of `Map.fetch/2` and
`Map.put/3`
- [Macro] `Macro.unescape_tokens/1` and `Macro.unescape_tokens/2` are
deprecated in favor of `Enum.map/2`
- [Range] Deprecate `Range.range?/1` in favor of pattern matching on
`_ .. _`
Elixir is a functional, meta-programming aware language built on top of the
Erlang VM. It is a dynamic language that focuses on tooling to leverage
Erlang's abilities to build concurrent, distributed and fault-tolerant
applications with hot code upgrades.