Elixir release

1.1.0

Change breakdown

Organization at a glance

Detailed changelog

Enhancement

73 changes

Tool: Elixir Module: Application

Add Application.fetch_env!/2, Application.loaded_applications/0 and Application.started_applications/0

Tool: Elixir Module: CLI

Add support for --werl in Windows bash-like shells

Tool: Elixir Module: Dict

Add Dict.get_and_update/3 which behaves similar to the now deprecated Access protocol

Tool: Elixir Module: Dict

Add Dict.get_lazy/3, Dict.pop_lazy/3 and Dict.put_new_lazy/3

Tool: Elixir Module: Enum

Add Enum.random/1, Enum.take_random/2, Enum.min_max/1, Enum.min_max_by/2, Enum.reverse_slice/3, Enum.reduce_while/3, Enum.dedup/1 and Enum.dedup_by/2

Tool: Elixir Module: Enum

Inline common map usage in Enum functions for performance

Tool: Elixir Module: File

Add File.lstat/1 and File.lstat/1 that works like File.stat/1 but is able to return symlink information (i.e. it does not traverse symlinks)

Tool: Elixir Module: File

Add File.rename/2

Tool: Elixir Module: Integer

Add Integer.digits/2 and Integer.undigits/2

Tool: Elixir Module: Inspect

Add the :safe option to inspect/2 and make it safe by default, meaning failures while inspecting won't trigger other failures. Instead, it will be wrapped in an exception which is properly formatted

Tool: Elixir Module: IO

Support fenced code blocks on IO.ANSI.Docs

Tool: Elixir Module: GenServer

Add GenServer.whereis/1 that expands GenServer dispatches into a proper pid

Tool: Elixir Module: Kernel

No longer include :crypto and :syntax_tools as dependencies. The former is only needed if you have encrypted debug info (therefore you can add :crypto as a dependency manually) and the latter is no longer used

Tool: Elixir Module: Kernel

Raise when var.Alias syntax is used and it does not expand to an atom at compile time (previously it emitted warnings)

Tool: Elixir Module: Kernel

Improve generation of argument names for function signatures

Tool: Elixir Module: Kernel

::/2 is now a special form

Tool: Elixir Module: Kernel

Warn when a variable with underscore is used

Tool: Elixir Module: Kernel

Allow underscores in binary, octal and hex literals

Tool: Elixir Module: Kernel

Warn when module attributes, variables, strings and numbers are used in code but the expression has no effect

Tool: Elixir Module: Kernel

Support \uXXXX and \u{X*} in strings and char lists to map to Unicode codepoints

Tool: Elixir Module: List

Add List.keytake/3

Tool: Elixir Module: Module

Improve name inference for function signatures in documentation metadata

Tool: Elixir Module: Process

Add Process.hibernate/3

Tool: Elixir Module: Process

Allow a list of specs in Process.info/2

Tool: Elixir Module: Set

Introduce MapSet data type. This new data type uses maps behind the scenes and is useful for storing a dozens of items in Erlang 17. In future versions when maps efficiently support large collections, it is meant to be the main Set abstraction in Elixir

Tool: Elixir Module: Stream

Add Stream.dedup/1, Stream.dedup_by/2 and Stream.transform/4

Tool: Elixir Module: String

Support calculation of the jaro distance between strings (usually names) via String.jaro_distance/2. This is used by Mix to support "Did you mean?" feature when a task does not exist

Tool: Elixir Module: String

Add String.splitter/3 that splits strings as a stream

Tool: Elixir Module: StringIO

StringIO.flush/1 was added to flush the output of a StringIO device

Tool: Elixir Module: Task

Introduce Task.yield/2 and Task.shutdown/2 to check if a task is still executing and shutdown otherwise

Tool: Elixir Module: Tuple

Add Tuple.append/2

Tool: Elixir Module: URI

Default ports were added for "ws" and "wss" schemas

Tool: Elixir Module: URI

Add URI.to_string/1

Tool: EEx Module: EEx

Add :trim option to EEx that automatically trims the left side of <% and right side %> if only spaces and new lines preceed/follow them

Tool: ExUnit Module: ExUnit

Add number of skipped tests to ExUnit output

Tool: ExUnit Module: ExUnit

Make timeout configurable for the whole test suite via the :timeout configuration

Tool: ExUnit Module: ExUnit

Allow moduledoc to be filtered/skipped in doctests

Tool: ExUnit Module: ExUnit

Provide built-in log capturing functionality

Tool: ExUnit Module: ExUnit

Allow assert_receive_timeout and refute_receive_timeout to be configured in the ExUnit application

Tool: ExUnit Module: ExUnit

Allow tests to be skipped with @tag :skip or @tag skip: "reason"

Tool: ExUnit Module: ExUnit

Add tests without implementation (missing the do block) which automatically fail. Such tests are also automatically tagged as :not_implemented, allowing them to be skipped

Tool: ExUnit Module: ExUnit

Increase by default stacktrace depth to 20 (this value is also configurable)

Tool: ExUnit Module: ExUnit

Improve formatting on assert_raise errors for message mismatch

Tool: ExUnit Module: ExUnit

Improve formatting on assert_receive when using pinned variables

Tool: IEx Module: IEx

Support IEx.pry with --remsh for remote debugging

Tool: IEx Module: IEx

Add b/1 helper that shows documentation for behaviour modules and its callback functions

Tool: IEx Module: IEx

Provide tab completion for aliases and allow aliases like Foo.Bar.Baz to autocomplete even if Foo.Bar is not defined

Tool: IEx Module: IEx

Provide a pid/3 helper for buildings pids from numbers

Tool: Logger Module: Logger

Support printing pids and refs in Logger metadata

Tool: Logger Module: Logger

Allow Logger metadata to be removed from pdict by setting it to nil

Tool: Logger Module: Logger

Add application configuration translator_inspect_opts for logger to customize how state and message are formatted when translating OTP errors and reports

Tool: Logger Module: Logger

Automatically include the current application in metadata when compiled via Mix

Tool: Mix Module: Mix

Check Elixir version right after archive installation and provide feedback if there is a mismatch

Tool: Mix Module: Mix

Allow rebar dependencies with mix.exs to be compiled with Mix

Tool: Mix Module: Mix

Allow rebar dependencies to be specified via :path

Tool: Mix Module: Mix

Also consider subdirectories in config directory for Mix.Project.config_files/0

Tool: Mix Module: Mix

Allow dynamic configuration in Mix projects by storing config in an agent

Tool: Mix Module: Mix

Support rebar3 style Git refs in rebar.config files

Tool: Mix Module: Mix

Only recompile compile time dependencies in mix projects. This should considerably speed up recompilation times in Elixir projects

Tool: Mix Module: Mix

Warn when configuring an application that is not available

Tool: Mix Module: Mix

Add mix profile.fprof for easy code profiling

Tool: Mix Module: Mix

Abort when dependencies have conflicting :only definitions

Tool: Mix Module: Mix

Fully recompile projects if Elixir or SCM changes

Tool: Mix Module: Mix

Allow checksum to be checked on archive install via --sha512 option

Tool: Mix Module: Mix

Add mix local.public_keys to safely manage installation of Hex and Rebar dependencies

Tool: Elixir Module: Behaviour

The module Behaviour is deprecated. Instead of defcallback, one can simply use @callback. Instead of defmacrocallback, one can simply use @macrocallback

Tool: Elixir Module: Enum

Enum.uniq/2 is deprecated in favor of Enum.uniq_by/2

Tool: Elixir Module: Kernel

\x inside strings and charlists is deprecated in favor of \uXXXX and \u{X*}. The values emitted by \x are unfortunately wrong (they should be bytes but currently it emits codepoints). \u is meant to correctly map to codepoints and \x will be fixed in the future to map to bytes

Tool: Elixir Module: Regex

Ungreedy option r is deprecated in favor of U (which is standard in regular expressions in other languages)

Tool: Elixir Module: Access

Implementing the Access protocol is deprecated. The Access protocol relies on the code server in development and test mode (when protocol consolidation is not applied) and it generated a bottleneck when working with multiple processes and the Access protocol was invoked hundreds of times (which is not uncommon). Note the Access module and the opts[key] syntax are not affected and they are not deprecated, only the underlying protocol dispatch

Tool: Elixir Module: Kernel

?\xHEX is deprecated in favor of 0xHEX. There is no situation where the former should be used in favor of the latter and the latter is always cleaner

Tool: Elixir Module: Kernel

Giving as: true | false to alias/2 and require/2 have been deprecated (it was undocumented behaviour)

Tool: Elixir Module: String

Passing an empty string to starts_with?, contains? and ends_with? had dubious behaviour and have been deprecated to help developers identify possible bugs in their source code

Bugfix

32 changes

Tool: Elixir Module: CLI

Ensure Logger messages are flushed when executing commands

Tool: Elixir Module: Code

:delegate_locals_to failed to delegate to the chosen module in many situations and messed up stacktraces. This option has therefore been replaced by imports

Tool: Elixir Module: Code

Store the documentation line in the metadata returned by Code.get_docs/2

Tool: Elixir Module: Exception

Do not fail when calculating an exception message, even if the message is invalid

Tool: Elixir Module: File

Ensure File.touch/2 and File.stat/2 receive and return universal times. Previously they would work with local times which are not monotonically increasing, which could present issues on scripts. If the times are being shown to the user, time: :local can be given as argument

Tool: Elixir Module: Float

Support complete scientific notation in Float.parse/1

Tool: Elixir Module: Kernel

Do not expand in/2 argument in module body

Tool: Elixir Module: Kernel

Throw syntax error for undefind atom/alias syntax :foo.Bar

Tool: Elixir Module: Kernel

Improve error message when we can't compile because the target directory is not writeable

Tool: Elixir Module: Kernel

Allow capture of non-symbolic operators like &and/2, &not/1 and others

Tool: Elixir Module: Kernel

Raise if heredoc terminal is accidentally found in the middle of a line without escaping

Tool: Elixir Module: Kernel

Don't warn on missing imports if nothing was imported

Tool: Elixir Module: Kernel

Raise if arity bigger than 255 is given to capture operator

Tool: Elixir Module: Macro

Properly convert captures in Macro.to_string/1

Tool: Elixir Module: Module

Do not accept non-Elixir module names in Module.split/1

Tool: Elixir Module: Protocol

Guarantee that derived protocols go through Any instead of Map

Tool: Elixir Module: Range

Restrict ranges to integers to fix diverse bugs of values being included in the range when they should not (false positives)

Tool: Elixir Module: Regex

Fix splitting of empty strings with regexes when trim is set to true. Now both String.split/3 and Regex.split/3 return an empty list when called with an empty string and trim is enabled

Tool: Elixir Module: Regex

Fix Regex.replace/4 so it doesn't discard escape characters

Tool: Elixir Module: Stream

Ensure suspending Stream.flat_map/2 and Stream.transform/3 does not consume unecessary items from the given enumerable

Tool: EEx Module: EEx

Allow EEx interpolation to also apply inside quotations <%%= ... %>

Tool: ExUnit Module: ExUnit

Skipped tests now correctly count towards the total of tests in the result returned by ExUnit.run/0

Tool: ExUnit Module: ExUnit

Fix a bug where failures when inspecting data structure or retrieving error messages could bring the whole ExUnit runner down

Tool: ExUnit Module: ExUnit

Do not change the semantics of evaluated code with assert/refute. For example, from now on, assert nil = some_expr() will now raise as expected, as the expression still evaluates to a falsy value

Tool: ExUnit Module: ExUnit

Report proper line number for doctest failures

Tool: Logger Module: Logger

Include metadata in Logger.log/3, use Logger.bare_log/3 for runtime-only, with no metadata behaviour

Tool: Mix Module: Mix

Use the safer https protocol instead of git for :github dependencies

Tool: Mix Module: Mix

Ensure automatic protocol consolidation via :consolidate_protocols is triggered in umbrella apps

Tool: Mix Module: Mix

Do not raise if wildcard given to import_config does not match any file

Tool: Mix Module: Mix

Applications with :build_embedded set to true require explicit compilation step

Tool: Mix Module: Mix

Also remove consolidated protocols on mix clean

Tool: Mix Module: Mix

Ensure --exclude in mix test concatenates with test helper excludes