v1.4.0
Official announcement: https://elixir-lang.org/blog/2017/01/05/elixir-v1-4-0-released/
1. Enhancements
Elixir
- [Calendar] Add
Date.compare/2,Time.compare/2,NaiveDateTime.compare/2andDateTime.compare/2 - [Calendar] Support
NaiveDateTime.add/3andNaiveDateTime.diff/3for adding seconds (up to microseconds) as well as the difference between two NaiveDateTimes in seconds (up to microseconds) - [Calendar] Add
Date.leap_year?/1andDate.day_of_week/1 - [Calendar] Ensure
Date,TimeandNaiveDateTimeAPIs work with any struct that provides the same set of fields as their respective struct. For example, aNaiveDateTimecan be given toDatesince it contains a superset of the fields in theDatestruct - [Enum] Add
Enum.map_every/2that invokes the given function with every nth item - [Enum] Add
min/2,max/2,min_max/2,min_by/3,max_by/3, andmin_max_by/3that allow a function specifying the default value when the enumerable is empty - [Enum] Introduce
Enum.zip/1to zip multiple entries at once - [Float] Introduce
Float.ratio/1that returns a tuple with the numerator and denominator as integers to retrieve the given float - [GenServer] Log warn on default
handle_info/2implementation - [Inspect] Support syntax coloring via the
:syntax_coloroption - [Integer]
Integer.digits/2now accepts negative integers - [Integer] Add
Integer.mod/2andInteger.floor_div/2 - [IO] Add
:labeloption toIO.inspect/2to help distinguish multipleIO.inspect/2calls. - [Kernel] Recognize merge conflict markers in source and provide a readable error message
- [Kernel] Warn on unused module attributes
- [Kernel] Improve compiler message on unexpected end of line
- [Kernel] Raise
BadBooleanErrorwhen a non-boolean is given on the left-hand side ofand/or - [List] Add
List.pop_at/3 - [List] Add
List.myers_difference/2 - [OptionParser] Expand multi-letter aliases in
OptionParser - [Process] Add
Process.send_after/4 - [Process] Improve error messages on
Process.register/2errors - [Registry] Add a local, decentralized and scalable key-value process storage
- [Stream] Add
Stream.map_every/2that invokes the given function with every nth item - [Stream] Introduce
Stream.zip/1to lazily zip multiple entries at once - [String] Update to Unicode 9.0.0
- [Task] Add
Task.async_stream/3andTask.async_stream/5as well as the supervised versionsTask.Supervisor.async_stream/4andTask.Supervisor.async_stream/6 - [URI] Allow 0 as URI scheme default port
ExUnit
- [ExUnit.Diff] Use red or green background for whitespace-only diffs
- [ExUnit.Doctest] Allow inspected structures with multiples lines and unicode characters in the doctest result
- [ExUnit.Formatter] Replace lhs/rhs with left/right in the formatter for clarity
IEx
- [IEx.Autocomplete] Stop appending a trailing dot when autocompleting modules in IEx
- [IEx.Autocomplete] Support autocompletion for structs
- [IEx.Autocomplete] Improve IEx autocomplete to support navigating map atom keys
- [IEx.Helpers]
c/1now compiles in memory by default to avoid common issue where.beamfiles remain at projects root directory - [IEx.Helpers] Add info about protocols in
i/1 - [IEx.Server] Support interrupting IEx evaluation through the Ctrl+G prompt
Mix
- [mix archive] Compress archive files built by
mix archiveas they are now unzipped during installation - [mix archive] Install from SCM
- [mix compile] Automatically infer the list of applications for Mix projects
- [mix cmd] Add the ability to specify one or more apps in
mix cmd - [mix deps] Warn if there are non-applications in the
appsdirectory for umbrella projects - [mix deps] Add warning for invalid paths on
mix deps.clean - [mix deps] Add
Mix.Project.apps_pathsthat returns the paths to children applications in umbrella projects - [mix deps] Add
MIX_REBARenvironment variable for overriding local rebar - [mix escript] Install from SCM
- [mix new] Check directory existence in
mix newand ask how to proceed if one exists - [mix new] Applications built with the
--supflag now have an individual module to work as application callback - [mix test] Add
--formatteroption tomix test - [mix xref] Provide "did you mean?" suggestions for
mix xref
2. Bug fixes
Elixir
- [Access] Do not accept nils in
Access.key/1andAccess.key/2in favor of explicit default values (or Access.key!/1 if you expect the key to always be available) - [Float] Avoid multiple roundings in
Float.ceil/2,Float.floor/2andFloat.round/2 - [Kernel] Don't crash in
macro_exported?/3when dealing with Erlang modules - [Kernel] Ensure locals calls are rewritten when calling a local function or macro from inside a module
- [Kernel] Annotate the context for variables as zero-arity funs in quotes
- [Kernel.SpecialForms] Ensure comprehensions with guards and filters keep proper ordering,
- [Kernel.SpecialForms] Produce meaningful warning when with's else clauses have no effect
- [Macro] Wrap fn calls in parens in
Macro.to_string/2 - [Macro] Do not print aliases as keys inside keyword lists in
Macro.to_string/2 - [OptionParser] Support options in
OptionParser.to_argv/2to ensure:countswitches are correctly encoded - [Stream] Ensure
Stream.take/2does not consume next element on:suspend - [String] Fix infinite recursion in
String.replace_leading/3andString.replace_trailing/3when given an empty string - [Task] Fix
Task.shutdown/1,2infinite block when task has no monitor - [Task] Ensure task cannot link after parents unlinks
ExUnit
- [ExUnit] Fix a race condition in
assert_receivewhere we would assert a message was not received but show it in the list of messages when the message is delivered right after the timeout value
IEx
- [IEx.Helpers] Purge consolidated protocols before and after
recompile/0
Mix
- [Mix.Dep] Use
gmakeon FreeBSD instead ofmakewhen compiling make dependencies - [Mix.Project] Only copy files from source when they're newer than destination (for Windows machines)
- [Mix.Task] Ensure non-recursive tasks inside umbrella are reenabled
3. Soft deprecations (no warnings emitted)
Elixir
- [Enum]
Enum.partition/2has been deprecated in favor ofEnum.split_with/2 - [System] Deprecate plural time units in favor of singular ones to align with future Erlang releases
ExUnit
- [ExUnit] Using GenEvent to implement ExUnit formatters is deprecated. Please use the new
GenServerbased formatters instead
4. Deprecations
Elixir
- [Access]
Access.key/1is deprecated due to erratic behaviour for missing keys, please use Access.key/2 instead with proper default values - [Behaviour] The
Behaviourmodule is deprecated. Callbacks may now be defined directly via the@callbackattribute - [Enum] Deprecate
Enum.uniq/2in favor ofEnum.uniq_by/2 - [Float]
Float.to_char_list/2andFloat.to_string/2are deprecated (use the :erlang functions if such conversions are desired) - [Kernel] Deprecate support for making private functions overridable. Overridable functions must always be public as they must be contracts
- [Kernel] Warn if variable is used as a function call
- [OptionParser] Deprecate aliases with multiple letters, such as
-abc - [Set] Deprecate the
Setmodule - [Stream] Deprecate
Stream.uniq/2in favor ofStream.uniq_by/2
IEx
- [IEx.Helpers]
import_file/2is deprecated in favor ofimport_file_if_available/1
Mix
- [Mix.Utils]
underscore/1andcamelize/1are deprecated