Releases: elixir-lang/elixir
Releases · elixir-lang/elixir
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
v1.4.0-rc.1
Release v1.4.0-rc.1
v1.4.0-rc.0
Release v1.4.0-rc.0
v1.3.4
1. Bug fixes
Elixir
- [Kernel] Ensure the compiler does not generate unecessary variable bindings inside case statements. This improves the code emitted and make sure "unused variable warnings" are not mistakenly silenced
- [Kernel] Move
raisechecks to runtime to avoid crashing cover on Erlang 19.1 - [Protocol] Do not emit warnings when using protocols on opaque types
ExUnit
- [ExUnit.CaptureLog] Flush Erlang's
:error_loggerbefore capturing to avoid mixed messages
v1.3.3
1. Enhancements
Elixir
- [DateTime] Support negative integer in
DateTime.from_unix/2 - [Kernel.LexicalTracker] Do not consider remote typespecs as a compile-time dependency
- [Kernel.ParallelCompiler] Do not emit deadlock messages when the process is waiting on itself
- [Kernel.Typespec] Mark struct update syntax as generated to avoid false positives from dialyzer
ExUnit
- [ExUnit] Make ExUnit server timeout configurable
Logger
- [Logger] Use
:ansi_colorif one is available in metadata
Mix
- [Mix] Add support for the
:sparseoption inMix.SCM.Git - [Mix] Skip dependendency loading if
MIX_NO_DEPSis set to1
2. Bug fixes
Elixir
- [System] Use
NULinstead of/dev/nullon Windows when buildingSystem.build_info
IEx
- [IEx.Autocomplete] Resolves issue with autocompletion on structs not working
Mix
- [Mix] Also store external resources that are not part of the current working directory in compilation manifest
- [Mix] Always include the compiled file source in manifests
v1.3.2
1. Enhancements
Elixir
- [Kernel] Support guards in
elseclauses inwith
Mix
- [Mix] Add
MIX_NO_DEPSenv var for disabling dep loading. Used for third-party scripts and tools like Nix package manager - [Mix] Add
mix test --listen-on-stdinthat automatically reruns tests on stdin - [Mix] Disable
--warnings-as-errorswhen compiling dependencies - [Mix] Add
--filteroption tomix deps.unlockto unlock only matching dependencies
2. Bug fixes
Elixir
- [Enum] Return
nilif enumerable halts inEnum.find_index/3 - [Kernel] Do not attempt to load modules that have not been required when invoking regular functions, otherwise this invalidates the
@compile {:autoload, false}directive.
Mix
- [Mix] Ensure missing protocol dependencies are discarded in umbrella projects with shared build
ExUnit
- [ExUnit.Diff] Ensure no leading or trailing when diffing some maps
v1.3.1
1. Enhancements
IEx
- [IEx.Helpers]
Add import_file_if_availablefor importing files only if they are available - [IEx.Helpers]
Add import_if_availablefor importing modules only if they are available
2. Bug fixes
Elixir
- [Kernel] Ensure structs can be expanded in dynamic module names
- [Kernel] Ensure aliases warnings are not accidentally discarded when the same module is imported
- [Kernel.ParallelCompiler] Ensure two modules with cyclic struct dependencies cannot run into a deadlock when compiling
- [Kernel.Typespec] Support module attributes in remote types
- [Module] Do not expect stacktraces to be always present when dispatching to locals during the module compilation
IEx
- [IEx.Helpers] Fix
hhelper for operators
Mix
- [Mix] Do not load modules for xref purposes, instead use BEAM info
- [Mix] Ensure
deps.checkdoes not check archives (that's done in loadpaths) - [Mix] Validate application properties before traversing them
- [Mix] Check for proper Makefile when compiling on Windows
- [Mix] Enforce space after comma in
mix do
v1.3.0
Official announcement: https://elixir-lang.org/blog/2016/06/21/elixir-v1-3-0-released/
1. Enhancements
EEx
- [EEx.Engine] Support an
init/1function in engines that will return the initial buffer (defaults to an empty string)
Elixir
- [Access] Add support for
Access.all/0,Access.elem/1,Access.key/2andAccess.key!/1for traversing nested data structures - [Calendar] Add
CalendarandDate,Time,NaiveDateTimeandDateTimetypes - [CLI] Add
--logger-otp-reports BOOLand--logger-sasl-reports BOOLswitches - [Compiler] Emit a summary of compilation errors when modules are missing
- [Enum] Add
Enum.group_by/3that allows developers to map on the value being grouped - [Enum] Make list values in maps returned by
Enum.group_by/2andEnum.group_by/3preserve the order of the input enumerable instead of reversing it. - [Enum] Add
Enum.drop_every/2that drops everynth, including the first one - [Exception] Suggest possible functions on
UndefinedFunctionErrorfor existing modules - [Exception] Warn if unknown fields are given to
raise/2 - [File] Support IO devices in
File.copy/3 - [GenServer] Raise a more meaningful exit if you try to
GenServer.call/3yourself - [Inspect] Support
:baseoption when inspecting binaries - [IO] Add
IO.warn/2that will print a warning message with stacktrace and notify the compiler a warning was printed (in case --warnings-as-errors was enabled) - [Kernel] Support
generated: truein quote - [Kernel] Support
Kernel.pop_in/1andKernel.pop_in/2for yanking a value from a nested data structure - [Kernel] Allow variable struct names when matching, for example,
%module{key: "value"} = struct - [Kernel] Allow guards on the left side of
<-inforandwithspecial forms - [Kernel] Support
elsechunks inwith - [Kernel] Track
{module, function, arity}imports and warn on unused ones when such are specified in:only - [Kernel] Add
keyword/0andkeyword/1built-in types to typespecs - [Kernel] Add sigils for date (
~D[2015-04-17]), time (~T[08:00:00]) and naive date times~N[2015-04-17 08:00:00] - [Kernel] Support
@enforce_keysondefstruct/1to guarantee some keys are explicitly given when building structs - [OptionParser] Add support for
:countswitch type - [OptionParser] Add
parse!/2andparse_head!/2that raiseOptionParser.ParseErrorin case of errors - [Process] Add
Process.sleep/1 - [Range]
Range.range?/1now checks the validity of a range. - [Regex] Support
:include_capturesinRegex.split/3 - [String] Add
String.myers_difference/2for calculating the difference between two strings - [System] Add
System.os_time/0andSystem.os_time/1 - [Typespec] Add support for
%{required(foo) => bar}and%{optional(foo) => bar}forms (Erlang 19 only) - [Typespec] Add support for
@optional_callbacksto mark certain that certain callbacks may be optionally implemented - [Typespec] Introduce
%{...}to mean any map (Erlang 19 only) - [URI] Add
URI.merge/2 - [Version] Add
Version.parse!/1
ExUnit
- [ExUnit] Show pinned variables on failed
assert ^left = rightandassert match?(^left, right)assertions - [ExUnit] Add
ExUnit.Case.register_attributewhich allow attributes to be cleaned up whenever a test is defined - [ExUnit] Add
ExUnit.Case.register_testand support the ability to tag "tests" by type. This will allow projects like QuickCheck to change the wording in formatters to say "10 properties" instead of "10 tests" - [ExUnit] Support diffing of values when using
==inassert - [ExUnit] Start running tests as soon as cases are loaded. This feature is enabled by default when running tests through Mix
- [ExUnit] Raise a straight-forward error message in case a duplicate test name is defined
- [ExUnit] Bump the default number of max cases to double of schedulers to support both IO and CPU bound tests
- [ExUnit] Support for named setups in
setupandsetup_all - [ExUnit] Support for bundling tests together with
describe/2
IEx
- [IEx] Add
nl/2that loads a given module on a list of nodes - [IEx.Helpers] No longer restart applications on
recompile/1 - [IEx.Autocomplete] Improve IEx expand to handle functions after
&
Logger
- [Logger] Introduce
Logger.reset_metadata/0,1
Mix
- [Mix] Add
mix xrefandmix compile.xrefthat runs cross-reference checks, with the latter running after compilation by default - [Mix] Add
mix app.treeandmix deps.tree - [Mix] Add
Mix.Task.rerun/2that reenables and re-runs a task - [Mix] Integrate
OptionParser.ParseErrorinto Mix, automatically converting such exceptions intoMix.Errorand embedding the task information - [Mix] Support
@preferred_cli_envattribute when defining tasks - [Mix] Support
mix test --raisethat will raise when a test suite fails (instead of setting the exit code to 1) - [Mix] Enable rebar3 manager by default for Hex dependencies
- [Mix] Add
mix escript.installto install escripts - [Mix] Print stacktraces for
Mix.ErrorwhenMIX_DEBUG=1is set - [Mix] Add a user friendly error for merge conflicts on
mix.lock - [Mix] Track files between path dependencies. This means umbrella applications will no longer trigger full recompilation when a sibling changes. Instead it will only recompile the files affected by the sibling changes
- [Mix] No longer print every file being compiled. Instead a generic "Compiling N files (.ext)" will be printed and files will only be logged in case they take more than 5 seconds to compile. This threshold can be customized by passing the
--long-compilation-thresholdflag and the previous behaviour can be reenabled by giving--verbosetomix compile - [Mix] Add
mix test --stalethat uses static analysis on source files to know which tests should run when source files changes. If any test file changes, it will also re-run. Changing a configuration file or the test helper will trigger a full recompilation
2. Bug fixes
Elixir
- [Application] Ensure
Application.spec/2returns nil for unknown applications - [GenServer] Ensures
cast/2returns:okif locally registered process is not found - [Inspect] Ensure binaries break into new lines when inspected
- [Kernel] Do not choke on capture operator with argument above
&191 - [Kernel] Raise if
defstructis called multiple times - [Kernel] Ensure
Module.create/3respects var/alias hygiene - [Kernel] Support non-literal ranges on the right side of
in/2 - [Macro] Fix
Macro.to_string/1on a call of a capture argument, for example&(&1).(:x) - [OptionParser] Allow
OptionParserto parse negative numbers - [Record] Fix
Record.is_record/2when dealing with non-record tuples - [String] Ensure
stripalso removes non-breaking whitespaces (and ensuresplitstill does not split on them) - [URI] Use square brackets for IPv6 in
URI.to_string/1
Mix
- [Mix] Improve task not found message when Mix would include the not found task as a suggestion due to different casing
- [Mix] Ignore lock revision when the lock is out of date when updating Mix dependencies. Before this fix, Git tags and branches in the lock file would erroneously take higher precedence than the one in
mix.exs - [Mix] Only recompile empty Elixir files if they change instead of recompiling them on every run
- [Mix] Ensure .app file is written in UTF-8 (this allows app descriptions to contain UTF-8 characters)
- [Mix.Dep] Always specify the
:envoption internally for dependencies to avoid false positives in the dependency resolution - [Mix.Dep] Correctly detect conflict from cousin optional dependencies in the dependency resolution algorithm
3. Soft deprecations (no warnings emitted)
- [Float]
Float.to_string/2andFloat.to_char_list/2has been soft-deprecated as Elixir will now attempt to print the shortest and most accurate representation by default. Developers can always fallback to:erlang.float_to_binary/2and:erlang.float_to_list/2if they need the previous functionality - [Kernel]
to_char_listfunctions have been soft-deprecated in favor ofto_charlist. This aligns with the naming conventions in both Erlang and Elixir - [String] The confusing
String.strip/2,String.lstrip/2andString.rstrip/2API has been soft deprecated in favor ofString.trim/2,String.trim_leading/2andString.trim_trailing/2 - [String] The confusing
String.ljust/3andString.rjust/3API has been soft deprecated in favor ofString.pad_leading/3andString.pad_trailing/3 - [Typespec]
char_listis soft-deprecated in favor ofcharlist
4. Deprecations
This release deprecates many APIs that have been soft-deprecated in previous Elixir versions.
Elixir
- [Dict]
Dictis no longer a behaviour and its functions will be deprecated in upcoming releases - [Enum] Passing a dictionary to
Enum.group_by/3is deprecated - [Kernel]
\x{H*}in strings/sigils/charlists is deprecated - [Kernel] Add deprecation for
defdelegatelist arguments and:append_firstoption. The previously undocumented and deprecated support for matching has been removed - [Kernel] Warn if a variable is assigned inside
case/if/etc and used outside the block - [Keyword]
Keyword.size/1is deprecated in favor ofKernel.length/1 - [Map]
Map.size/1is deprecated in favor ofKernel.map_size/1 - [Regex] The option
/r(for ungreedy) has been deprecated in favor of/U - [Set]
Setis no longer a behaviour and its functions will be deprecated in upcoming releases - [String]
String.valid_character?/1is deprecated in favor ofString.valid?/1with pattern matching - [Task]
Task.find/2is deprecated in favor of explicit message matching - [URI] Passing a non-map to
URI.decode_query/2is deprecated
v1.3.0-rc.1
Release v1.3.0-rc.1
v1.2.6
1. Enhancements
- [Kernel] Support Erlang 19
- [Kernel] Supported generated: true in the
quotespecial form
2. Bug fixes
- [Path] Fix a bug in path join with "/" followed by empty segments
- [String] Fix a bug in NFD normalization when followed by one-byte sized graphemes
- [Typespec] Correctly support
<<_::size, _::_*unit>>syntax