Elixir release

1.15.0

Change breakdown

Organization at a glance

Detailed changelog

Enhancement

94 changes

Tool: EEx Module: EEx

Include source code snippets in syntax errors

Tool: Elixir Module: Calendar

Add support for epoch time (%s) to Calendar.strftime/2

Tool: Elixir Module: Code

Code.format_string!/2 now converts 'charlists' into ~c"charlists" by default

Tool: Elixir Module: Code

Add :on_undefined_variable to the compiler options to preserve the warning behaviour which was deprecated back in Elixir v1.4

Tool: Elixir Module: Code

Add Code.loaded?/1 and Code.ensure_all_loaded(!)/1

Tool: Elixir Module: Code

Add Code.prepend_paths/1, Code.append_paths/1, and Code.delete_paths/1

Tool: Elixir Module: Code

Add Code.with_diagnostics/2 to return diagnostics when compiling and evaluating code

Tool: Elixir Module: Code.Fragment

Support nested expressions in Code.Fragment.cursor_context/1

Tool: Elixir Module: Code.Fragment

Keep operators and no paren calls in Code.Fragment.container_cursor_to_quoted/1

Tool: Elixir Module: Date

Add Date.before?/2 and Date.after?/2

Tool: Elixir Module: DateTime

Add DateTime.before?/2 and DateTime.after?/2

Tool: Elixir Module: DateTime

Support precision in DateTime.utc_now/2

Tool: Elixir Module: File

Support distributed File.Stream

Tool: Elixir Module: Inspect

Inspect now renders 'charlists' as ~c"charlists" by default

Tool: Elixir Module: Kernel

Break down case and cond inside dbg/2

Tool: Elixir Module: Kernel

Add t:nonempty_binary/0 and t:nonempty_bitstring/0

Tool: Elixir Module: Kernel

Treat @behaviours as runtime dependencies

Tool: Elixir Module: Kernel

Do not add runtime dependencies for alias references in patterns and guards

Tool: Elixir Module: Kernel

Warn for nested calls without parens inside keywords

Tool: Elixir Module: Kernel

Support for multi-letter uppercase sigils

Tool: Elixir Module: 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 to warning: ...

Tool: Elixir Module: 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 your mix.exs

Tool: Elixir Module: Kernel.CLI

Support --sname undefined/--name undefined so a name is automatically generated

Tool: Elixir Module: Keyword

Add Keyword.split_with/2

Tool: Elixir Module: Macro

Improve error message when piping into an expression ending in bracket-based access

Tool: Elixir Module: Macro.Env

Add Macro.Env.lookup_alias_as/2

Tool: Elixir Module: Map

Add Map.split_with/2

Tool: Elixir Module: Map

Add Map.intersect/2 and Map.intersect/3

Tool: Elixir Module: MapSet

Add MapSet.split_with/2

Tool: Elixir Module: MapSet

Optimize most functions

Tool: Elixir Module: NaiveDateTime

Add NaiveDateTime.beginning_of_day/1 and NaiveDateTime.end_of_day/1

Tool: Elixir Module: NaiveDateTime

Add NaiveDateTime.before?/2 and NaiveDateTime.after?/2

Tool: Elixir Module: NaiveDateTime

Support precision in NaiveDateTime.utc_now/2

Tool: Elixir Module: Module

Mark functions as generated in "Docs" chunk

Tool: Elixir Module: Module

Add Module.get_last_attribute/3

Tool: Elixir Module: OptionParser

Support :return_separator option

Tool: Elixir Module: Process

Add Process.alias/0,1 and Process.unalias/1

Tool: Elixir Module: Range

Add Range.split/2

Tool: Elixir Module: String

Update Unicode to version 15.0.0

Tool: Elixir Module: String

Add :fast_ascii mode to String.valid?/2

Tool: Elixir Module: Supervisor

Add support for automatic shutdown in Supervisor

Tool: Elixir Module: System

Support :lines in System.cmd/3 to capture output line by line

Tool: Elixir Module: Task

Remove head of line blocking on Task.yield_many/2

Tool: Elixir Module: Task

Enable selective receive optimizations in Erlang/OTP 26+

Tool: Elixir Module: Task

Reduce tasks footprint by avoiding unecessary work during spawning

Tool: Elixir Module: Task.Supervisor

Do not copy args on temporary Task.Supervisor.start_child/2

Tool: Elixir Module: Time

Add Time.before?/2 and Time.after?/2

Tool: Elixir Module: URI

Add URI.append_path/2

Tool: ExUnit Module: ExUnit

Add more color configuration to ExUnit CLI formatter

Tool: ExUnit Module: ExUnit.Callbacks

Accept {module, function} tuples in ExUnit setup callbacks

Tool: ExUnit Module: ExUnit.Case

Add ExUnit.Case.get_last_registered_test/1

Tool: ExUnit Module: ExUnit.Doctest

Add ExUnit.DocTest.doctest_file/2

Tool: ExUnit Module: ExUnit.Doctest

Include doctest_data in doctest tags

Tool: ExUnit Module: ExUnit.Formatter

When comparing two anonymous functions, defined at the same place but capturing a different environment, we will now also diff the environments

Tool: IEx Module: IEx

Make pry opt-in on dbg with --dbg pry

Tool: IEx Module: IEX

Support IEX_HOME

Tool: IEx Module: IEx.Autocomplete

Only provide aliases when autocompleting alias, import, and require

Tool: IEx Module: IEx.Autocomplete

Provide field completion on map and struct updates

Tool: IEx Module: IEx.Helpers

Add runtime_info(:allocators)

Tool: IEx Module: IEx.Info

Implement protocol for Range, DateTime, and Regex

Tool: Logger Module: Logger

Add Logger.add_handlers/1 and Logger.default_formatter/1

Tool: Logger Module: Logger

Introduce default_formatter and default_handler configuration for Logger which configures Erlang/OTP logger

Tool: Logger Module: Logger

Add :always_evaluate_messages configuration to Logger

Tool: Logger Module: Logger.Formatter

Implement the Erlang Logger formatter API

Tool: Logger Module: Logger.Formatter

Add support for ports in Logger metadata

Tool: Mix Module: mix app.start

Allow applications to be started concurrently via the :start_concurrently configuration

Tool: Mix Module: mix compile

Set --all-warnings by default

Tool: Mix Module: mix compile

Reduce the amount of filesystem lookups for path dependencies by storing timestamps in manifests

Tool: Mix Module: mix compile

Track digests of @external_resources

Tool: Mix Module: mix compile.app

Write optional_applications to .app file

Tool: Mix Module: mix compile.elixir

Add --purge-consolidation-path-if-stale which will purge the given consolidation path if compilation is required

Tool: Mix Module: mix deps.compile

Automatically recompile dependencies if their compile env changes

Tool: Mix Module: mix deps.get

Automatically install Hex and Rebar on mix deps.get/mix deps.update

Tool: Mix Module: mix deps.get

Support --check-locked which raises if changes to the lockfile are required

Tool: Mix Module: mix eval

Allow passing additional arguments

Tool: Mix Module: mix format

Support --no-exit option

Tool: Mix Module: mix format

Allow multiple formatters per file extension and sigil

Tool: Mix Module: mix format

Show diffs whenever --check-formatted fails

Tool: Mix Module: mix format

Allow the formatting root to be configured

Tool: Mix Module: mix loadpaths

Cache deps and archive loadpaths in Erlang/OTP 26

Tool: Mix Module: mix profile.fprof

Support --trace-to-file to improve performance when working with large outputs

Tool: Mix Module: mix release

Allow passing additional arguments to the eval command

Tool: Mix Module: mix xref graph

Support --output flag

Tool: Mix Module: Mix.Project

Support def cli to unify all CLI defaults in a single place

Tool: Mix Module: Mix.Project

Add Mix.Project.deps_tree/1

Tool: Elixir Module: File

File.cp/3 and File.cp_r/3 with a function as third argument

Tool: Elixir Module: Kernel

Require pin variable when accessing variable inside binary size in match

Tool: Elixir Module: Kernel.ParallelCompiler

Require the :return_diagnostics option to be

Tool: Logger Module: Logger

add_backend/2, remove_backend/2, and configure_backend/2 have been deprecated

Tool: Logger Module: Logger

The :console configuration has been deprecated in favor of :default_formatter

Tool: Logger Module: Logger

The :backends configuration has been deprecated in favor of Logger.add_handlers/1

Tool: Mix Module: Mix.Project

:preferred_cli_env is deprecated in favor of :preferred_envs in def cli

Tool: Mix Module: Mix.Project

:preferred_cli_target is deprecated in favor of :preferred_targets in def cli

Tool: Mix Module: mix local

The environment variable HEX_MIRROR is deprecated in favor of HEX_BUILDS_URL

Bugfix

26 changes

Tool: Elixir Module: Code.Formatter

Fix a scenario where a keyword followed by parenthesis could go above the maximum line length

Tool: Elixir Module: Code.Formatter

Remove unnecessary parens in nullary type funs

Tool: Elixir Module: Exception

Fix operator precedence when printing guards in Exception.blame/3

Tool: Elixir Module: File

Do not raise if there are file system race conditions in File.cp/2

Tool: Elixir Module: File

Do not raise when deleting write-only empty directories on File.rm_rf/1

Tool: Elixir Module: Kernel

Expand macros on the left side of -> in try/rescue

Tool: Elixir Module: Kernel

Raise on misplaced ... inside typespecs

Tool: Elixir Module: Kernel

Do not import behaviour_info and module_info functions from Erlang modules

Tool: Elixir Module: Kernel

Raise when macros are given to dialyzer

Tool: Elixir Module: Kernel.ParallelCompiler

Make sure compiler doesn't crash when there are stray messages in the inbox

Tool: Elixir Module: Kernel.ParallelCompiler

Track compile and runtime warnings separately

Tool: Elixir Module: Module

Ensure that Module.get_attribute/3 returns nil and not the given default value when an attribute has been explicitly set as nil

Tool: Elixir Module: System

Fix race condition when a script would terminate before System.stop/1 executes

Tool: Elixir Module: Task

Do not double log Task failure reports

Tool: Elixir Module: URI

Make sure URI.merge/2 works accordingly with relative paths

Tool: ExUnit Module: 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

Tool: ExUnit Module: ExUnit

Do not merge context as tags inside the runner to reduce memory usage when emitting events to formatters

Tool: ExUnit Module: ExUnit

Mark test cases as invalid when an exit occurs during setup_all

Tool: ExUnit Module: ExUnit

Do not expand or collect vars from quote in ExUnit assertions

Tool: ExUnit Module: ExUnit.DocTest

Ensure proper line is returned when failing to parse doctest results

Tool: ExUnit Module: ExUnit.Doctest

Fix line information when a doctest with multiple assertions fails

Tool: IEx Module: IEx

Do not spawn a process to read IO. This fixes a bug where multiline paste stopped working

Tool: IEx Module: IEx

Do not perform completion for prompts triggered during code evaluation

Tool: Mix Module: mix compile

Include cwd in compiler cache key

Tool: Mix Module: mix release

Fix Windows service when invoking erlsrv.exe in path with spaces

Tool: Mix Module: mix xref

Raise early if mix xref is used at the umbrella root

Hard Deprecation

5 changes

Tool: Elixir Module: Calendar

Calendar.ISO.day_of_week/3 is deprecated in favor of Calendar.ISO.day_of_week/4

Tool: Elixir Module: Exception

Exception.exception?/1 is deprecated in favor of Kernel.is_exception/1

Tool: Elixir Module: Kernel

Deprecate ... as a valid function call identifier

Tool: Elixir Module: Regex

Regex.regex?/1 is deprecated in favor of Kernel.is_struct/2

Tool: Logger Module: Logger

Logger.warn/2 is deprecated in favor of Logger.warning/2