Releases: elixir-lang/elixir
Releases · elixir-lang/elixir
v0.12.1
Enhancements
- [ExUnit] Support 
:includeand:excludeconfiguration options to filter which tests should run based on their tags. Those options are also supported viamix testas--includeand--exclude - [ExUnit] Allow doctests to match against 
#MyModule<> 
Bug fixes
- [CLI] Abort when a pattern given to elixirc does not match any file
 - [Float] Fix 
Float.parse/1to handle numbers of the form "-0.x" - [IEx] Improve error message for 
IEx.Helpers.rwhen module does not exist - [Mix] Ensure 
deps.getupdates origin if lock origin and dep origin do not match - [Mix] Use relative symlinks in _build
 - [Typespec] Fix conversion of unary ops from typespec format to ast
 - [Typespec] Fix handling of 
tuple()and{} 
Deprecations
- [Kernel] Do not leak clause heads. Previously, a variable defined in a case/receive head clauses would leak to the outer scope. This behaviour is deprecated and will be removed in the next release.
 - [Kernel] Deprecate 
__FILE__in favor of__DIR__or__ENV__.file 
Backwards incompatible changes
- [GenFSM] GenServer now stops on unknown event/sync_event requests
 - [GenServer] GenServer now stops on unknown call/cast requests
 - [Kernel] Change how 
->is represented in AST. Now each clause is represented by its own AST node which makes composition easier. See commit 51aef55 for more information. 
v0.12.0
Enhancements
- [Exception] Allow 
exception/1to be overriden and promote it as the main mechanism to customize exceptions - [File] Add 
File.stream_to!/3 - [Float] Add 
Float.floor/1,Float.ceil/1andFloat.round/3 - [Kernel] Add 
List.delete_at/2andList.updated_at/3 - [Kernel] Add 
Enum.reverse/2 - [Kernel] Implement 
defmodule/2,@/1,def/2and friends in Elixir itself.case/2,try/2andreceive/1have been made special forms.var!/1,var!/2andalias!/1have also been implemented in Elixir and demoted from special forms - [Record] Support dynamic fields in 
defrecordp - [Stream] Add 
Stream.resource/3 - [Stream] Add 
Stream.zip/2,Stream.filter_map/3,Stream.each/2,Stream.take_every/2,Stream.chunk/2,Stream.chunk/3,Stream.chunk/4,Stream.chunk_by/2,Stream.scan/2,Stream.scan/3,Stream.uniq/2,Stream.after/2andStream.run/1 - [Stream] Support 
Stream.take/2andStream.drop/2with negative counts 
Bug fixes
- [HashDict] Ensure a 
HashDictstored in an attribute can be accessed via the attribute - [Enum] Fix bug in 
Enum.chunk/4where you'd get an extra element when the enumerable was a multiple of the counter and a pad was given - [IEx] Ensure 
c/2helper works with full paths - [Kernel] 
quote location: :keepnow only affects definitions in order to keep the proper trace in definition exceptions - [Mix] Also symlink 
includedirectories in _build dependencies - [Version] Fix 
Version.match?/2with~>and versions with alphanumeric build info (like-dev) 
Deprecations
- [Enum] 
Enumerable.count/1andEnumerable.member?/2should now return tagged tuples. Please seeEnumerabledocs for more info - [Enum] Deprecate 
Enum.chunks/2,Enum.chunks/4andEnum.chunks_by/2in favor ofEnum.chunk/2,Enum.chunk/4andEnum.chunk_by/2 - [File] 
File.binstream!/3is deprecated. Simply useFile.stream!/3which is able to figure out ifstreamorbinstreamoperations should be used - [Macro] 
Macro.extract_args/1is deprecated in favor ofMacro.decompose_call/1 
Backwards incompatible changes
- [Enum] Behaviour of 
Enum.drop/2andEnum.take/2has been switched when given negative counts - [Enum] Behaviour of 
Enum.zip/2has been changed to stop as soon as the first enumerable finishes - [Enum] 
Enumerable.reduce/3protocol has changed to support suspension. Please seeEnumerabledocs for more info - [Mix] Require 
:escript_main_moduleto be set before generating escripts - [Range] 
Range.Iteratorprotocol has changed in order to work with the newEnumerable.reduce/3. Please seeRange.Iteratordocs for more info - [Stream] The 
Stream.Lazystructure has changed to accumulate functions and accumulators as we go (its inspected representation has also changed) - [Typespec] 
whenclauses were moved to the outer part of the spec and should be in the keywords format. Soadd(a, b) when is_subtype(a, integer) and is_subtype(b, integer) :: integershould now be written asadd(a, b) :: integer when a: integer, b: integer 
v0.11.2
Enhancements
- [Mix] Add 
mix iexthat redirects users to the properiex -S mixcommand - [Mix] Support 
build_per_environment: truein project configuration that manages a separete build per environment, useful when you have per-environment behaviour/compilation 
Backwards incompatible changes
- [Mix] Mix now compiles files to 
_build. Projects should update just fine, however documentation and books may want to update to the latest information 
v0.11.1
Enhancements
- [Mix] Improve dependency convergence by explicitly checking each requirement instead of expecting all requirements to be equal
 - [Mix] Support optional dependencies with 
optional: true. Optional dependencies are downloaded for the current project but they are automatically skipped when such project is used as a dependency 
Bug fixes
- [Kernel] Set compilation status per ParallelCompiler and not globally
 - [Mix] Ensure Mix does not load previous dependencies versions before 
deps.get/deps.update - [Mix] Ensure umbrella apps are sorted before running recursive commands
 - [Mix] Ensure umbrella apps run in the same environment as the parent project
 - [Mix] Ensure dependency tree is topsorted before compiling
 - [Mix] Raise error when duplicated projects are pushed into the stack
 - [URI] Allow lowercase escapes in URI
 
Deprecations
- [Mix] Setting 
:load_pathsin your project configuration is deprecated 
v0.11.0
Enhancements
- [Code] Eval now returns variables from other contexts
 - [Dict] Document and enforce all dicts use the match operator (
===) when checking for keys - [Enum] Add 
Enum.slice/2with a range - [Enum] Document and enforce 
Enum.member?/2to use the match operator (===) - [IEx] Split 
IEx.EvaluatorfromIEx.Serverto allow custom evaluators - [IEx] Add support for 
IEx.prywhich halts a given process for inspection - [IO] Add specs and allow some IO APIs to receive any data that implements 
String.Chars - [Kernel] Improve stacktraces on command line interfaces
 - [Kernel] Sigils can now handle balanced tokens as in 
%s(f(o)o) - [Kernel] Emit warnings when an alias is not used
 - [Macro] Add 
Macro.pipe/3andMacro.unpipe/1for building pipelines - [Mix] Allow umbrella children to share dependencies between them
 - [Mix] Allow mix to be escriptize'd
 - [Mix] Speed mix projects compilation by relying on more manifests information
 - [Protocol] Protocols now provide 
impl_for/1andimpl_for!/1functions which receive a structure and returns its respective implementation, otherwise returns nil or an error - [Set] Document and enforce all sets use the match operator (
===) when checking for keys - [String] Update to Unicode 6.3.0
 - [String] Add 
String.slice/2with a range 
Bug fixes
- [Exception] Ensure 
defexceptionfields can be set dynamically - [Kernel] Guarantee aliases hygiene is respected when the current module name is not known upfront
 - [Kernel] 
Kernel.access/2no longer flattens lists - [Mix] Ensure cyclic dependencies are properly handled
 - [String] Implement the extended grapheme cluster algorithm for 
Stringoperations 
Deprecations
- [Kernel] 
pid_to_list/1,list_to_pid/1,binary_to_atom/2,binary_to_existing_atom/2andatom_to_binary/2are deprecated in favor of their counterparts in the:erlangmodule - [Kernel] 
insert_elem/3anddelete_elem/2are deprecated in favor ofTuple.insert_at/3andTuple.delete_at/2 - [Kernel] Use of 
ininside matches (as inx in [1,2,3] -> x) is deprecated in favor of the guard syntax (x when x in [1,2,3]) - [Macro] 
Macro.expand_all/2is deprecated - [Protocol] 
@onlyand@exceptin protocols are now deprecated - [Protocol] Protocols no longer fallback to 
Anyout of the box (this functionality needs to be explicitly enabled by setting@fallback_to_anyto true) - [String] 
String.to_integer/1andString.to_float/1are deprecated in favor ofInteger.parse/1andFloat.parse/1 
Backwards incompatible changes
- [CLI] Reading 
.elixirrchas been dropped in favor of setting env vars - [Kernel] 
Kernel.access/2now expects the second argument to be a compile time list - [Kernel] 
fn -> endquoted expression is no longer wrapped in adokeyword - [Kernel] Quoted variables from the same module must be explicitly shared. Previously, if a function returned 
quote do: a = 1, another function from the same module could access it asquote do: a. This has been fixed and the variables must be explicitly shared withvar!(a, __MODULE__) - [Mix] Umbrella apps now treat children apps as dependencies. This means all dependencies will be checked out in the umbrela 
depsdirectory. On upgrade, child apps need to point to the umbrella project by settingdeps_path: "../../deps_path", lockfile: "../../mix.lock"in their project config - [Process] 
Process.group_leader/2args have been reversed so the "subject" comes first - [Protocol] Protocol no longer dispatches to 
Number, but toIntegerandFloat 
v0.10.3
Enhancements
- [Enum] Add 
Enum.take_every/2 - [IEx] IEx now respects signals sent from the Ctrl+G menu
 - [Kernel] Allow documentation for types with 
@typedoc - [Mix] Allow apps to be selected in umbrella projects
 - [Record] Generated record functions 
newandupdatealso take options with strings as keys - [Stream] Add 
Stream.unfold/1 
Bug fixes
- [Dict] Fix a bug when a HashDict was marked as equal when one was actually a subset of the other
 - [EEx] Solve issue where 
doblocks inside templates were not properly aligned - [ExUnit] Improve checks and have better error reports on poorly aligned doctests
 - [Kernel] Fix handling of multiple heredocs on the same line
 - [Kernel] Provide better error messages for match, guard and quoting errors
 - [Kernel] Make 
Kernel.raise/2a macro to avoid messing up stacktraces - [Kernel] Ensure 
&()works on quoted blocks with only one expression - [Mix] Address an issue where a dependency was not compiled in the proper order when specified in different projects
 - [Mix] Ensure 
compile: falseis a valid mechanism for disabling the compilation of dependencies - [Regex] Fix bug on 
Regex.scan/3when capturing groups and the regex has no groups - [String] Fix a bug with 
String.split/2when given an empty pattern - [Typespec] Guarantee typespecs error reports point to the proper line
 
Deprecations
- [Kernel] The previous partial application syntax (without the 
&operator) has now been deprecated - [Regex] 
Regex.captures/3is deprecated in favor ofRegex.named_captures/3 - [String] 
String.valid_codepoint?/1is deprecated in favor of pattern matching with<<_ :: utf8 >> 
Backwards incompatible changes
- [IEx] The 
r/0helper has been removed as it caused surprising behaviour when many modules with dependencies were accumulated - [Mix] 
Mix.Versionwas renamed toVersion - [Mix] 
File.IteratorErrorwas renamed toIO.StreamError - [Mix] 
mix newnow defaults to the--supoption, use--bareto get the previous behaviour 
v0.10.2
Enhancements
- [CLI] Add 
--verboseto elixirc, which now is non-verbose by default - [Dict] Add 
Dict.Behaviouras a convenience to create your own dictionaries - [Enum] Add 
Enum.split/2,Enum.reduce/2,Enum.flat_map/2,Enum.chunks/2,Enum.chunks/4,Enum.chunks_by/2,Enum.concat/1andEnum.concat/2 - [Enum] Support negative indices in 
Enum.at/fetch/fetch! - [ExUnit] Show failures on CLIFormatter as soon as they pop up
 - [IEx] Allow for strings in 
hhelper - [IEx] Helpers 
randccan handle erlang sources - [Integer] Add 
odd?/1andeven?/1 - [IO] Added support to specifying a number of bytes to stream to 
IO.stream,IO.binstream,File.stream!andFile.binstream! - [Kernel] Include file and line on error report for overriding an existing function/macro
 - [Kernel] Convert external functions into quoted expressions. This allows record fields to contain functions as long as they point to an 
&Mod.fun/arity - [Kernel] Allow 
foo?andbar!as valid variable names - [List] Add 
List.replace_at/3 - [Macro] Improve printing of the access protocol on 
Macro.to_string/1 - [Macro] Add 
Macro.to_string/2to support annotations on the converted string - [Mix] Automatically recompile a project if the Elixir version changes
 - [Path] Add 
Path.relative_to_cwd/2 - [Regex] Allow erlang 
reoptions when compiling Elixir regexes - [Stream] Add 
Stream.concat/1,Stream.concat/2andStream.flat_map/2 - [String] Add regex pattern support to 
String.replace/3 - [String] Add 
String.ljust/2,String.rjust/2,String.ljust/3andString.rjust/3 - [URI] 
URI.parse/1supports IPv6 addresses 
Bug fixes
- [Behaviour] Do not compile behaviour docs if docs are disabled on compilation
 - [ExUnit] Doctests no longer eat too much space and provides detailed reports for poorly indented lines
 - [File] Fix a bug where 
File.touch(file, datetime)was not setting the proper datetime when the file did not exist - [Kernel] Limit 
inspectresults to 50 items by default to avoid printing too much data - [Kernel] Return a readable error on oversized atoms
 - [Kernel] Allow functions ending with 
?or!to be captured - [Kernel] Fix default shutdown of child supervisors to 
:infinity - [Kernel] Fix regression when calling a function/macro ending with bang, followed by 
do/endblocks - [List] Fix bug on 
List.insert_at/3that added the item at the wrong position for negative indexes - [Macro] 
Macro.escape/2can now escape improper lists - [Mix] Fix 
Mix.Versionmatching on pre-release info - [Mix] Ensure 
watch_extstrigger full recompilation on change withmix compile - [Mix] Fix regression on 
mix clean --all - [String] 
String.strip/2now supports removing unicode characters - [String] 
String.slice/3still returns the proper result when there is no length to be extracted - [System] 
System.get_env/0now returns a list of tuples as previously advertised 
Deprecations
- [Dict] 
Dict.update/3is deprecated in favor ofDict.update!/3 - [Enum] 
Enum.min/2andEnum.max/2are deprecated in favor ofEnum.min_by/2andEnum.max_by/2 - [Enum] 
Enum.join/2andEnum.map_join/3with a char list are deprecated - [IO] 
IO.stream(device)andIO.binstream(device)are deprecated in favor ofIO.stream(device, :line)andIO.binstream(device, :line) - [Kernel] 
list_to_binary/1,binary_to_list/1andbinary_to_list/3are deprecated in favor ofString.from_char_list!/1andString.to_char_list!/1for characters and:binary.list_to_bin/1,:binary.bin_to_list/1and:binary.bin_to_list/3for bytes - [Kernel] 
to_binary/1is deprecated in favor ofto_string/1 - [Kernel] Deprecate 
def/4and friends in favor ofdef/2with unquote and friends - [Kernel] Deprecate 
%band%Bin favor of%sand%S - [List] 
List.concat/2is deprecated in favor ofEnum.concat/2 - [Macro] 
Macro.unescape_binary/1andMacro.unescape_binary/2are deprecated in favor ofMacro.unescape_string/1andMacro.unescape_string/2 - [Mix] 
:umbrellaoption for umbrella paths has been deprecated in favor of:in_umbrella 
Backwards incompatible changes
- [IO] IO functions now only accept iolists as arguments
 - [Kernel] 
Binary.Charswas renamed toString.Chars - [Kernel] The previous ambiguous import syntax 
import :functions, Foowas removed in favor ofimport Foo, only: :functions - [OptionParser] 
parseandparse_headnow returns a tuple with three elements instead of two 
v0.10.1
Enhancements
- [Behaviour] Add support for 
defmacrocallback/1 - [Enum] Add 
Enum.shuffle/1 - [ExUnit] The 
:traceoption now also reports run time for each test - [ExUnit] Add support for 
:colorto enable/disable ANSI coloring - [IEx] Add the 
clearhelper to clear the screen. - [Kernel] Add the capture operator 
& - [Kernel] Add support for 
GenFSM.Behaviour - [Kernel] Functions now points to the module and function they were defined when inspected
 - [Kernel] A documentation attached to a function that is never defined now prints warnings
 - [List] Add 
List.keysort/2 - [Mix] 
:test_helperproject configuration did not affectmix testand was therefore removed. Atest/test_helper.exsfile is still necessary albeit it doesn't need to be automatically required in each test file - [Mix] Add manifests for yecc, leex and Erlang compilers, making it easier to detect dependencies in between compilers and providing a more useful clean behaviour
 - [Mix] 
mix helpnow outputs information about the default mix task - [Mix] Add 
--no-deps-checkoption tomix run,mix compileand friends to not check dependency status - [Mix] Add support for 
MIX_GIT_FORCE_HTTPSsystem environment that forces HTTPS for known providers, useful when the regular git port is blocked. This configuration does not affect themix.lockresults - [Mix] Allow coverage tool to be pluggable via the 
:test_coverageconfiguration - [Mix] Add 
mix cmdas a convenience to run a command recursively in child apps in an umbrella application - [Mix] Support 
umbrella: truein dependencies as a convenience for setting up umbrella path deps - [Mix] 
mix runnow behaves closer to theelixircommand and properly mangles the ARGV - [String] Add 
Regex.scan/3now supports capturing groups - [String] Add 
String.reverse/1 
Bug fix
- [Behaviour] Ensure callbacks are stored in the definition order
 - [CLI] Speed up boot time on Elixir .bat files
 - [IEx] Reduce cases where IEx parser can get stuck
 - [Kernel] Improve error messages when the use of an operator has no effect
 - [Kernel] Fix a bug where warnings were not being generated when imported macros conflicted with local functions or macros
 - [Kernel] Document that 
on_definitioncan only be a function as it is evaluated inside the function context - [Kernel] Ensure 
%wsigils with no interpolation are fully expanded at compile time - [Mix] 
mix deps.update,mix deps.cleanandmix deps.unlockno longer change all dependencies unless--allis given - [Mix] Always run 
mix loadpathsonmix app.start, even if--no-compileis given - [OptionParser] Do not add boolean flags to the end result if they were not given
 - [OptionParser] Do not parse non-boolean flags as booleans when true or false are given
 - [OptionParser] Ensure 
:keepand:integer|:floatcan be given together as options - [OptionParser] Ensure 
--no-flagsets:flagto false when:flagis a registered boolean switch 
Deprecations
- [Kernel] 
function(Mod.fun/arity)andfunction(fun/arity)are deprecated in favor of&Mod.fun/arityand&fun/arity - [Kernel] 
function/3is deprecated in favor ofModule.function/3 - [Kernel] 
Kernel.ParallelCompilernow receives a set of callbacks instead of a single one - [Mix] 
:test_coverageoption now expect keywords arguments and the--coverflag is now treated as a boolean 
Backwards incompatible changes
- [Regex] 
Regex.scan/3now always returns a list of lists, normalizing the result, instead of list with mixed lists and binaries - [System] 
System.halt/2was removed since the current Erlang implementation of such function is bugged 
v0.10.0
Enhancements
- [ExUnit] Support 
trace: trueoption which gives detailed reporting on test runs - [HashDict] Optimize 
HashDictto store pairs in a cons cell reducing storage per key by half - [Kernel] Add pretty printing support for inspect
 - [Kernel] Add document algebra library used as the foundation for pretty printing
 - [Kernel] Add 
defrecordp/3that enables specifying the first element of the tuple - [Kernel] Add the 
SetAPI and a hash based implementation viaHashSet - [Kernel] Add 
Streamas composable, lazy-enumerables - [Mix] 
mix archivenow includes the version of the generated archive - [Mix] Mix now requires explicit dependency overriding to be given with 
override: true - [Mix] Projects can now define an 
:elixirkey to outline supported Elixir versions - [Typespec] Improve error messages to contain file, line and the typespec itself
 
Bug fix
- [CLI] Elixir can now run on Unix directories with 
:in its path - [Kernel] 
match?/2does not leak variables to outer scope - [Kernel] Keep 
head|tailformat when splicing at the tail - [Kernel] Ensure variables defined in the module body are not passed to callbacks
 - [Mix] On dependencies conflict, show from where each source is coming from
 - [Mix] Empty projects no longer leave empty ebin files on 
mix compile - [Module] Calling 
Module.register_attribute/3no longer automatically changes it to persisted or accumulated 
Deprecations
- [Enum] Receiving the index of iteration in 
Enum.map/2andEnum.each/2is deprecated in favor ofStream.with_index/1 - [File] 
File.iterator/1andFile.biniterator/1are deprecated in favor ofIO.stream/1andIO.binstream/1 - [File] 
File.iterator!/2andFile.biniterator!/2are deprecated in favor ofFile.stream!/2andFile.binstream!/2 - [Kernel] Deprecate recently added 
quote binding: ...in favor of the clearerquote bind_quoted: ... - [Kernel] Deprecate 
Kernel.float/1in favor of a explicit conversion - [Mix] Deprecate 
mix run EXPRin favor ofmix run -e EXPR - [Record] 
Record.__index__/2deprecated in favor ofRecord.__record__(:index, key) 
Backwards incompatible changes
- 
[Kernel] The
Binary.Inspectprotocol has been renamed toInspect - 
[Kernel] Tighten up the grammar rules regarding parentheses omission, previously the examples below would compile but now they raise an error message:
do_something 1, is_list [], 3 [1, is_atom :foo, 3] - 
[Module] Calling
Module.register_attribute/3no longer automatically changes it to persisted or accumulated - 
[Record] First element of a record via
defrecordpis now thedefrecordpname and no longer the current atom - 
[URI] Remove custom URI parsers in favor of
URI.default_port/2