Elixir Changelog

What's new in Elixir 1.7.3

Sep 1, 2018
  • BUG FIXES:
  • ExUnit:
  • [ExUnit.Assertions] Do not attempt to expand try/1 as it is a special form
  • Mix:
  • [mix compile.app] Do not include applications with runtime: false as a runtime dependency for applications coming from Hex

New in Elixir 1.5.2 (Oct 4, 2017)

  • ENHANCEMENTS:
  • Elixir:
  • [Kernel] Optimize function definition with multiple clauses by not traversing the internal clauses table
  • [Kernel] Warn if unary operators are followed by new lines
  • [Registry] Use the name of the Registry as its :id in the child_spec/1 function
  • BUG FIXES:
  • Elixir:
  • [DateTime] Fix negative microsecond result when passing negative Unix epochs to from_unix/2
  • [Kernel] Improve error message for oversized atoms
  • [Kernel] Ensure @impl attribute also propagates to clauses from default arguments
  • [Kernel] Emit proper error for unknown vars inside binary pattern in match
  • IEx:
  • [IEx] Do not crash IEx unexpectedly on System.stop/0
  • [IEx.Helpers] Ensure exiting a breakpoint set inside a breakpoint does not terminate the shell unexpectedly
  • Mix:
  • [mix local.hex] Ensure --if-missing flag works as advertised
  • [mix test] Do not trigger additional error reports when there is a failure when loading test files
  • [Mix.SCM.Git] Ensure errors when invoking git propagate correctly

New in Elixir 1.5.1 (Aug 2, 2017)

  • ENHANCEMENTS:
  • EEx:
  • [EEx.Engine] Add handle_begin and handle_end to EEx
  • Elixir:
  • [Kernel] Do not use references on function/macro definitions - this provides large improvements in compilation times in some rare corner cases
  • [Supervisor] Support mixing old and new typespecs in Supervisor.init/2 and Supevisor.start_link/2
  • Mix:
  • [mix profile.*] Allow profile tasks to run without a project
  • BUG FIXES:
  • EEx:
  • [EEx.Engine] Do not re-use the value of the init/1 callback throughout the compilation stack
  • Elixir:
  • [Kernel] Ensure dialyzer does not emit warnings in some uses of with
  • [Kernel] Fix dialyzer warnings when defmacrop is used in modules
  • [Kernel] Ensure Elixir modules can be dialyzed without starting the Elixir application
  • [Kernel] Do not serialize references in quoted expressions
  • [Kernel] Make sure structs expansion use the latest definition available when struct modules are recompiled
  • [Task] Support :infinity timeout on Task streams
  • [Typespec] Ensure typespecs allow tuple to be used as variable names

New in Elixir 1.5.0 (Jul 26, 2017)

  • ENHANCEMENTS:
  • Elixir:
  • [Access] Optimize Access.get/2
  • [Base] Optimize Base encode/decode
  • [Calendar] Implement Inspect for DateTime with Calendar.ISO
  • [Calendar] Add "ISO days" format for conversions between Calendars and Date.convert/2, Time.convert/2, NaiveDateTime.convert/2 and DateTime.convert/2 (as well as bang variants)
  • [Calendar] Add :calendar field to Time struct
  • [Calendar] Add Time.diff/3, Date.add/2, Date.diff/2, DateTime.diff/3
  • [Calendar] Add Date.range/2
  • [Calendar] Add Date.new/4, DateTime.utc_now/1, NaiveDateTime.new/8 and Time.new/5 that allow specifing calendar
  • [Enum] Add Enum.chunk_by/4 and Stream.chunk_by/4
  • [Enum] Add Enum.chunk_every/2 and Enum.chunk_every/4 with a more explicit API than Enum.chunk/2 and Enum.chunk/4
  • [Exception] Add Exception.blame/3 that adds metadata to exceptions
  • [File] Add File.read_link/1 and File.read_link!/1
  • [File] Introduce :trim_bom option for File.stream!/2
  • [Inspect] Add :printable_limit to control the limit of printable structures
  • [Integer] Add Integer.gcd/2
  • [Kernel] Add left not in right to check that the left side is not in the enumerable on the right
  • [Kernel] Use the new debug_info chunk in OTP 20. This provides a mechanism for tools to retrieve the Elixir AST from beam files
  • [Kernel] defoverridable/1 accepts a module name as argument and marks all callbacks as overridable
  • [Kernel] Allow non-quoted Unicode atoms and variables according to Unicode Annex #31 (see Unicode Syntax document)
  • [Kernel] Warn when a :__struct__ key is used when building/updating structs
  • [Kernel] Cache the AST on definitions. This speeds up the compilation time from 10% to 15% measured across different projects
  • [Kernel] Improve compiler error message on invalid patterns and guards
  • [Keyword] Add replace/3 and replace!/3 for replacing an existing key
  • [List] List.starts_with?/2
  • [Macro] Introduce Macro.generate_arguments/2
  • [Map] Optimize Map.merge/3 by choosing merging direction
  • [Map] Add replace/3 and replace!/3 for replacing an existing key
  • [Map] Raise BadMapError in Map.equal?/2 when either of the two arguments is not a map
  • [MapSet] Reduce MapSet size when serialized to approximately half
  • [Process] Add Process.cancel_timer/2
  • [Protocol] Show available implementations on Protocol.UndefinedError if the protocol has been consolidated
  • [Registry] Support ETS guard conditions in Registry.match/3
  • [Registry] Support parallel: true in Registry.dispatch/3
  • [Registry] Introduce Registry.unregister_match/4
  • [Stream] Add Stream.chunk_every/2 and Stream.chunk_every/4 with a more explicit API than Stream.chunk/2 and Stream.chunk/4
  • [String] Optimise binary pattern matching in String.split/1 and String.trim_*/1
  • [Supervisor] Add Supervisor.init/2 and Supervisor.child_spec/2
  • [Supervisor] Allow module and {module, arg} to be given to Supervisor.start_link/2 and invoke module.child_spec(arg) on each argument
  • [Task] Support :on_timeout in Task.async_stream to control how tasks are terminated
  • [Task] Add ordered: false support to Task.async_stream
  • ExUnit:
  • [ExUnit] Show code snippet from test source file in case of test errors
  • [ExUnit] Use Exception.blame/3 when formatting test errors
  • [ExUnit] Make assert_raise/2 fail if the underlying exception has a broken message/1 implementation
  • [ExUnit] Add start_supervised/2 and stop_supervised/1 to ExUnit. Processes started by this function are automatically shut down when the test exits
  • IEx:
  • [IEx.Autocomplete] Support autocompletion of variable names
  • [IEx.Autocomplete] Support autocompletion of functions imported using import Mod, only: [...]
  • [IEx.Evaluator] Use Exception.blame/3 when showing errors in the terminal
  • [IEx.Helpers] Add exports/1 IEx helper to list all exports in a module
  • [IEx.Helpers] Add break!/2, break!/4, breaks/0, continue/0, open/0, remove_breaks/0, remove_breaks/1, reset_break/1, reset_break/3 and whereami/1 for code debugging
  • [IEx.Helpers] No longer emit warnings for IEx commands without parentheses
  • [IEx.Helpers] Add runtime_info/0 for printing runtime system information
  • [IEx.Helpers] Add open/1 to open the source of a given module/function in your editor
  • [IEx.Info] Implement IEx.Info protocol for calendar types
  • Logger:
  • [Logger] Add metadata: :all configuration to log all metadata
  • Mix:
  • [mix compile.elixir] Add --all-warnings option to Elixir compiler that shows all warnings from the previous compilation (instead of just of the files being compiled)
  • [mix escript.build] Strip debug information from escripts by default and add option :strip_beam which defaults to true
  • [mix loadpaths] Ensure --no-deps-check do not trigger SCM callbacks (such as git)
  • [mix local.hex] Add --if-missing flag to local.hex mix task
  • [mix profile.cprof] Add Mix.Tasks.Profile.Cprof for count-based profiling
  • [mix new] New styling for generated applications
  • BUG FIXES:
  • Elixir:
  • [Calendar] Ensure Calendar.ISO raises a readable error when reaching up the year 10000 restriction
  • [Calendar] Return {:error, :invalid_time} for wrong precision instead of crashing when parsing ISO dates
  • [Enumerable] Raise Protocol.UndefinedError on bad functions in Enumerable implementation
  • [File] Ensure recursive file operations raise on paths with null bytes (security issue reported by Griffin Byatt)
  • [File] Support :ram/:raw files in File.copy/2
  • [Inspect] Do not use colors when inspecting error messages
  • [Kernel] Support guards on anonymous functions of zero arity
  • [Kernel] Fix compilation of maps used as maps keys inside matches
  • [Kernel] Ensure do clause in with is tail call optimizable
  • [Module] on_definition/6 callback receives body wrapped in a keyword list, such as [do: body]. This solves a bug where it was impossible to distinguish between a bodyless clause and a function that returns nil.
  • [Path] Ensure recursive path operations raise on paths with null bytes (security issue reported by Griffin Byatt)
  • [Protocol] Do not lose source compile info on protocol consolidation
  • [Record] Properly escape quoted expressions passed to defrecord
  • [Regex] Fix inspect/2 for regexes with / terminator in them
  • [Registry] Ensure Registry.match/4 works with :_ as key
  • [Stream] Fix stream cycle over empty enumerable
  • [String] Consider Unicode non-characters valid according to the specification in String.valid?/1
  • [StringIO] Fix encoding and performance issues in StringIO.get_until
  • [System] Raise on paths with null bytes in System.cmd/2 and in System.find_executable/1 (security issue reported by Griffin Byatt)
  • [System] Raise on ill-formed environment variables (security issue reported by Griffin Byatt)
  • ExUnit:
  • [ExUnit] Properly account failed tests when setup_all fails
  • IEx:
  • [IEx] Skip autocompletion of module names that are invalid without being quoted
  • [IEx] Skip autocompletion of functions with default arguments with @doc false
  • [IEx] Do not start oldshell alongside IEx
  • Mix:
  • [mix compile.elixir] Store multiple sources in case of module conflicts. This solves an issue where _build would get corrupted when compiling Elixir projects with module conflicts
  • [mix compile.erlang] Do not silently discard Erlang compile errors
  • [mix compile.erlang] Properly track -compile module attribute when specified as a list
  • [mix compile.protocols] Ensure protocol implementations do not "disappear" when switching between applications in umbrella projects by having separate consolidation paths per project
  • [mix compile.protocols] Do not raise when consolidating a protocol that was converted into a module
  • SOFT DEPRECATIONS (NO WARNINGS EMITTED):
  • Elixir:
  • [Kernel] not left in right is soft-deprecated in favor of left not in right
  • DEPRECATIONS:
  • Elixir
  • Atom.to_char_list/1, Float.to_char_list/1, Integer.to_char_list/1, Integer.to_char_list/2, Kernel.to_char_list/1, List.Chars.to_char_list/1, String.to_char_list/1 have been deprecated in favor of their to_charlist version. This aligns with the naming conventions in both Erlang and Elixir
  • [Enum] Deprecate Enum.filter_map/3 in favor of Enum.filter/2 + Enum.map/2 or for-comprehensions
  • [GenEvent] Deprecate GenEvent and provide alternatives in its docs
  • [Kernel] Using () to mean nil is deprecated
  • [Kernel] :as_char_lists value in Inspect.Opts.t/0 type, in favor of :as_charlists
  • [Kernel] :char_lists key in Inspect.Opts.t/0 type, in favor of :charlists
  • [Module] Using Erlang parse transforms via @compile {:parse_transform, _} is deprecated
  • [Stream] Deprecate Stream.filter_map/3 in favor of Stream.filter/2 + Stream.map/2
  • [String] String.ljust/3 and String.rjust/3 are deprecated in favor of String.pad_leading/3 and String.pad_trailing/3 with a binary padding
  • [String] String.strip/1 and String.strip/2 are deprecated in favor of String.trim/1 and String.trim/2
  • [String] String.lstrip/1 and String.rstrip/1 are deprecated in favor of String.trim_leading/1 and String.trim_trailing/1
  • [String] String.lstrip/2 and String.rstrip/2 are deprecated in favor of String.trim_leading/2 and String.trim_trailing/2 with a binary as second argument
  • [Typespec] char_list/0 type is deprecated in favor of charlist/0
  • EEx:
  • [EEx] Deprecate

New in Elixir 1.4.2 (Feb 17, 2017)

  • EEx:
  • [EEx] Support middle expressions on trim mode
  • Elixir:
  • [Calendar] Correct typo on Calendar types
  • [Kernel] Ensure redefined functions point to the proper source
  • [OptionParser] Add :allow_nonexistent_atoms to support unsafe behaviour prior to v1.4
  • [Stream] Allow consuming multiple items from suspended enumerable in Stream.transform/3
  • [String] Incorporate new grapheme rules in Unicode 9
  • IEx:
  • [IEx.Autocomplete] Do not crash on aliases which are not known at compile time
  • Mix:
  • [Mix.Umbrella] Ensure umbrella projects can depend on other umbrella projects
  • [Mix.Archive] Ensure previous archives with .ez extension are deleted

New in Elixir 1.4.1 (Jan 26, 2017)

  • BUG FIXES:
  • Elixir:
  • [Kernel] Remove warning when making private functions overridable
  • [Path] Ensure Path.join/1 returns strings for lists of one element
  • [Regex] Ensure Regex.escape/1 also escapes -
  • IEx:
  • [IEx] Disable ANSI detection for powershell to avoid false positives
  • Mix:
  • [Mix.Make] Run make clean for erlang.mk
  • [Mix.Rebar] Support all of rebar3 dependency package declaration
  • [Mix.Rebar] Only pass overrides from parent to child in Rebar dep

New in Elixir 1.4.0 (Jan 20, 2017)

  • ENHANCEMENTS:
  • Elixir:
  • [Calendar] Add Date.compare/2, Time.compare/2, NaiveDateTime.compare/2 and DateTime.compare/2
  • [Calendar] Support NaiveDateTime.add/3 and NaiveDateTime.diff/3 for adding seconds (up to microseconds) as well as the difference between two NaiveDateTimes in seconds (up to microseconds)
  • [Calendar] Add Date.leap_year?/1 and Date.day_of_week/1
  • [Calendar] Ensure Date, Time and NaiveDateTime APIs work with any struct that provides the same set of fields as their respective struct. For example, a NaiveDateTime can be given to Date since it contains a superset of the fields in the Date struct
  • [Enum] Add Enum.map_every/2 that invokes the given function with every nth item
  • [Enum] Add min/2, max/2, min_max/2, min_by/3, max_by/3, and min_max_by/3 that allow a function specifying the default value when the enumerable is empty
  • [Enum] Introduce Enum.zip/1 to zip multiple entries at once
  • [Float] Introduce Float.ratio/1 that returns a tuple with the numerator and denominator as integers to retrieve the given float
  • [GenServer] Log warn on default handle_info/2 implementation
  • [Inspect] Support syntax coloring via the :syntax_color option
  • [Integer] Integer.digits/2 now accepts negative integers
  • [Integer] Add Integer.mod/2 and Integer.floor_div/2
  • [IO] Add :label option to IO.inspect/2 to help distinguish multiple IO.inspect/2 calls.
  • [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 BadBooleanError when a non-boolean is given on the left-hand side of and/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/2 errors
  • [Registry] Add a local, decentralized and scalable key-value process storage
  • [Stream] Add Stream.map_every/2 that invokes the given function with every nth item
  • [Stream] Introduce Stream.zip/1 to lazily zip multiple entries at once
  • [String] Update to Unicode 9.0.0
  • [Task] Add Task.async_stream/3 and Task.async_stream/5 as well as the supervised versions Task.Supervisor.async_stream/4 and Task.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/1 now compiles in memory by default to avoid common issue where .beam files 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 archive as 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 apps directory for umbrella projects
  • [mix deps] Add warning for invalid paths on mix deps.clean
  • [mix deps] Add Mix.Project.apps_paths that returns the paths to children applications in umbrella projects
  • [mix deps] Add MIX_REBAR environment variable for overriding local rebar
  • [mix escript] Install from SCM
  • [mix new] Check directory existence in mix new and ask how to proceed if one exists
  • [mix new] Applications built with the --sup flag now have an individual module to work as application callback
  • [mix test] Add --formatter option to mix test
  • [mix xref] Provide "did you mean?" suggestions for mix xref
  • BUG FIXES:
  • Elixir:
  • [Access] Do not accept nils in Access.key/1 and Access.key/2 in 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/2 and Float.round/2
  • [Kernel] Don't crash in macro_exported?/3 when 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/2 to ensure :count switches are correctly encoded
  • [Stream] Ensure Stream.take/2 does not consume next element on :suspend
  • [String] Fix infinite recursion in String.replace_leading/3 and String.replace_trailing/3 when given an empty string
  • [Task] Fix Task.shutdown/1,2 infinite block when task has no monitor
  • [Task] Ensure task cannot link after parents unlinks
  • ExUnit:
  • [ExUnit] Fix a race condition in assert_receive where 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 gmake on FreeBSD instead of make when 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
  • SOFT DEPRECATIONS (NO WARNINGS EMITTED):
  • Elixir:
  • [Enum] Enum.partition/2 has been deprecated in favor of Enum.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 GenServer based formatters instead
  • DEPRECATIONS:
  • Elixir:
  • [Access] Access.key/1 is deprecated due to erratic behaviour for missing keys, please use Access.key/2 instead with proper default values
  • [Behaviour] The Behaviour module is deprecated. Callbacks may now be defined directly via the @callback attribute
  • [Enum] Deprecate Enum.uniq/2 in favor of Enum.uniq_by/2
  • [Float] Float.to_char_list/2 and Float.to_string/2 are 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 Set module
  • [Stream] Deprecate Stream.uniq/2 in favor of Stream.uniq_by/2
  • IEx:
  • [IEx.Helpers] import_file/2 is deprecated in favor of import_file_if_available/1
  • Mix:
  • [Mix.Utils] underscore/1 and camelize/1 are deprecated

New in Elixir 1.4.0 RC 1 (Dec 8, 2016)

  • ENHANCEMENTS:
  • Elixir:
  • [Calendar] Add Date.compare/2, Time.compare/2, NaiveDateTime.compare/2 and DateTime.compare/2
  • [Calendar] Support NaiveDateTime.add/3 and NaiveDateTime.diff/3 for adding seconds (up to microseconds) as well as the difference between two NaiveDateTimes in seconds (up to microseconds)
  • [Calendar] Add Date.leap_year?/1 and Date.day_of_week/1
  • [Calendar] Ensure Date, Time and NaiveDateTime APIs work with any struct that provides the same set of fields as their respective struct. For example, a NaiveDateTime can be given to Date since it contains a superset of the fields in the Date struct
  • [Enum] Add Enum.map_every/2 that invokes the given function with every nth item
  • [Enum] Add min/2, max/2, min_max/2, min_by/3, max_by/3, and min_max_by/3 that allow a function specifying the default value when the enumerable is empty
  • [Enum] Introduce Enum.zip/1 to zip multiple entries at once
  • [Float] Introduce Float.ratio/1 that returns a tuple with the numerator and denominator as integers to retrieve the given float
  • [GenServer] Log error on default handle_info/2 implementation
  • [Inspect] Support syntax coloring via the :syntax_color option
  • [Integer] Integer.digits/2 now accepts negative integers
  • [Integer] Add Integer.mod/2 and Integer.floor_div/2
  • [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 BadBooleanError when a non-boolean is given on the left-hand side of and/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/2 errors
  • [Registry] Add a local, decentralized and scalable key-value process storage
  • [Stream] Add Stream.map_every/2 that invokes the given function with every nth item
  • [Stream] Introduce Stream.zip/1 to lazily zip multiple entries at once
  • [String] Update to Unicode 9.0.0
  • [Task] Add Task.async_stream/3 and Task.async_stream/5 as well as the supervised versions Task.Supervisor.async_stream/4 and Task.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/1 now compiles in memory by default to avoid common issue where .beam files 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 archive as they are now unzipped during installation
  • [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 apps directory for umbrella projects
  • [mix deps] Add warning for invalid paths on mix deps.clean
  • [mix deps] Add Mix.Project.apps_paths that returns the paths to children applications in umbrella projects
  • [mix deps] Add MIX_REBAR environment variable for overriding local rebar
  • [mix new] Check directory existence in mix new and ask how to proceed if one exists
  • [mix new] Applications built with the --sup flag now have an individual module to work as application callback
  • [mix test] Add --formatter option to mix test
  • [mix xref] Provide "did you mean?" suggestions for mix xref
  • BUG FIXES:
  • Elixir:
  • [Float] Avoid multiple roundings in Float.ceil/2, Float.floor/2 and Float.round/2
  • [Kernel] Don't crash in macro_exported?/3 when 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/2 to ensure :count switches are correctly encoded
  • [Stream] Ensure Stream.take/2 does not consume next element on :suspend
  • [String] Fix infinite recursion in String.replace_leading/3 and String.replace_trailing/3 when given an empty string
  • [Task] Fix Task.shutdown/1,2 infinite block when task has no monitor
  • [Task] Ensure task cannot link after parents unlinks
  • ExUnit:
  • [ExUnit] Fix a race condition in assert_receive where 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 gmake on FreeBSD instead of make when 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
  • SOFT DEPRECATIONS (NO WARNINGS EMITTED):
  • Elixir:
  • [Enum] Enum.partition/2 has been deprecated in favor of Enum.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 GenServer based formatters instead
  • DEPRECATIONS:
  • Elixir:
  • [Behaviour] The Behaviour module is deprecated. Callbacks may now be defined directly via the @callback attribute
  • [Enum] Deprecate Enum.uniq/2 in favor of Enum.uniq_by/2
  • [Float] Float.to_char_list/2 and Float.to_string/2 are 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 Set module
  • [Stream] Deprecate Stream.uniq/2 in favor of Stream.uniq_by/2
  • IEx:
  • [IEx.Helpers] import_file/2 is deprecated in favor of import_file_if_available/1
  • Mix:
  • [Mix.Utils] underscore/1 and camelize/1 are deprecated

New in Elixir 1.3.4 (Oct 12, 2016)

  • 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 raise checks 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_logger before capturing to avoid mixed messages

New in Elixir 1.3.3 (Sep 17, 2016)

  • 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_color if one is available in metadata
  • Mix:
  • [Mix] Add support for the :sparse option in Mix.SCM.Git
  • [Mix] Skip dependendency loading if MIX_NO_DEPS is set to 1
  • BUG FIXES:
  • Elixir:
  • [System] Use NUL instead of /dev/null on Windows when building System.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

New in Elixir 1.3.2 (Jul 17, 2016)

  • ENHANCEMENTS:
  • Elixir:
  • [Kernel] Support guards in else clauses in with
  • Mix:
  • [Mix] Add MIX_NO_DEPS env var for disabling dep loading. Used for third-party scripts and tools like Nix package manager
  • [Mix] Add mix test --listen-on-stdin that automatically reruns tests on stdin
  • [Mix] Disable --warnings-as-errors when compiling dependencies
  • [Mix] Add --filter option to mix deps.unlock to unlock only matching dependencies
  • BUG FIXES:
  • Elixir:
  • [Enum] Return nil if enumerable halts in Enum.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

New in Elixir 1.3.1 (Jun 28, 2016)

  • ENHANCEMENTS:
  • IEx:
  • [IEx.Helpers] Add import_file_if_available for importing files only if they are available
  • [IEx.Helpers] Add import_if_available for importing modules only if they are available
  • 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 h helper for operators
  • Mix:
  • [Mix] Do not load modules for xref purposes, instead use BEAM info
  • [Mix] Ensure deps.check does 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

New in Elixir 1.3.0 (Jun 21, 2016)

  • ENHANCEMENTS:
  • EEx:
  • [EEx.Engine] Support an init/1 function 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/2 and Access.key!/1 for traversing nested data structures
  • [Calendar] Add Calendar and Date, Time, NaiveDateTime and DateTime types
  • [CLI] Add --logger-otp-reports BOOL and --logger-sasl-reports BOOL switches
  • [Compiler] Emit a summary of compilation errors when modules are missing
  • [Enum] Add Enum.group_by/3 that allows developers to map on the value being grouped
  • [Enum] Make list values in maps returned by Enum.group_by/2 and Enum.group_by/3 preserve the order of the input enumerable instead of reversing it.
  • [Enum] Add Enum.drop_every/2 that drops every nth, including the first one
  • [Exception] Suggest possible functions on UndefinedFunctionError for 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/3 yourself
  • [Inspect] Support :base option when inspecting binaries
  • [IO] Add IO.warn/2 that 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: true in quote
  • [Kernel] Support Kernel.pop_in/1 and Kernel.pop_in/2 for 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 bar} and %{optional(foo) => bar} forms (Erlang 19 only)
  • [Typespec] Add support for @optional_callbacks to 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 = right and assert match?(^left, right) assertions
  • [ExUnit] Add ExUnit.Case.register_attribute which allow attributes to be cleaned up whenever a test is defined
  • [ExUnit] Add ExUnit.Case.register_test and 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 == in assert
  • [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 setup and setup_all
  • [ExUnit] Support for bundling tests together with describe/2
  • IEx:
  • [IEx] Add nl/2 that 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 xref and mix compile.xref that runs cross-reference checks, with the latter running after compilation by default
  • [Mix] Add mix app.tree and mix deps.tree
  • [Mix] Add Mix.Task.rerun/2 that reenables and re-runs a task
  • [Mix] Integrate OptionParser.ParseError into Mix, automatically converting such exceptions into Mix.Error and embedding the task information
  • [Mix] Support @preferred_cli_env attribute when defining tasks
  • [Mix] Support mix test --raise that 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.install to install escripts
  • [Mix] Print stacktraces for Mix.Error when MIX_DEBUG=1 is 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-threshold flag and the previous behaviour can be reenabled by giving --verbose to mix compile
  • [Mix] Add mix test --stale that 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
  • BUG FIXES:
  • Elixir:
  • [Application] Ensure Application.spec/2 returns nil for unknown applications
  • [GenServer] Ensures cast/2 returns :ok if 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 defstruct is called multiple times
  • [Kernel] Ensure Module.create/3 respects var/alias hygiene
  • [Kernel] Support non-literal ranges on the right side of in/2
  • [Macro] Fix Macro.to_string/1 on a call of a capture argument, for example &(&1).(:x)
  • [OptionParser] Allow OptionParser to parse negative numbers
  • [Record] Fix Record.is_record/2 when dealing with non-record tuples
  • [String] Ensure strip also removes non-breaking whitespaces (and ensure split still 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 :env option 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
  • SOFT DEPRECATIONS (NO WARNINGS EMITTED):
  • [Float] Float.to_string/2 and Float.to_char_list/2 has 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/2 and :erlang.float_to_list/2 if they need the previous functionality
  • [Kernel] to_char_list functions have been soft-deprecated in favor of to_charlist. This aligns with the naming conventions in both Erlang and Elixir
  • [String] The confusing String.strip/2, String.lstrip/2 and String.rstrip/2 API has been soft deprecated in favor of String.trim/2, String.trim_leading/2 and String.trim_trailing/2
  • [String] The confusing String.ljust/3 and String.rjust/3 API has been soft deprecated in favor of String.pad_leading/3 and String.pad_trailing/3
  • [Typespec] char_list is soft-deprecated in favor of charlist
  • DEPRECATIONS:
  • This release deprecates many APIs that have been soft-deprecated in previous Elixir versions.
  • Elixir:
  • [Dict] Dict is no longer a behaviour and its functions will be deprecated in upcoming releases
  • [Enum] Passing a dictionary to Enum.group_by/3 is deprecated
  • [Kernel] x{H*} in strings/sigils/charlists is deprecated
  • [Kernel] Add deprecation for defdelegate list arguments and :append_first option. 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/1 is deprecated in favor of Kernel.length/1
  • [Map] Map.size/1 is deprecated in favor of Kernel.map_size/1
  • [Regex] The option /r (for ungreedy) has been deprecated in favor of /U
  • [Set] Set is no longer a behaviour and its functions will be deprecated in upcoming releases
  • [String] String.valid_character?/1 is deprecated in favor of String.valid?/1 with pattern matching
  • [Task] Task.find/2 is deprecated in favor of explicit message matching
  • [URI] Passing a non-map to URI.decode_query/2 is deprecated

New in Elixir 1.3.0 RC 1 (Jun 9, 2016)

  • ENHANCEMENTS:
  • EEx:
  • [EEx.Engine] Support an init/1 function 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/2 and Access.key!/1 for traversing nested data structures
  • [Calendar] Add Calendar and Date, Time, NaiveDateTime and DateTime types
  • [CLI] Add --logger-otp-reports BOOL and --logger-sasl-reports BOOL switches
  • [Compiler] Emit a summary of compilation errors when modules are missing
  • [Enum] Add Enum.group_by/3 that allows developers to map on the value being grouped
  • [Enum] Add Enum.drop_every/2 that drops every nth, including the first one
  • [Exception] Suggest possible functions on UndefinedFunctionError for 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/3 yourself
  • [Inspect] Support :base option when inspecting binaries
  • [IO] Add IO.warn/2 that 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: true in quote
  • [Kernel] Support Kernel.pop_in/1 and Kernel.pop_in/2 for 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 bar} and %{optional(foo) => bar} forms (Erlang 19 only)
  • [Typespec] Add support for @optional_callbacks to 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 = right and assert match?(^left, right) assertions
  • [ExUnit] Add ExUnit.Case.register_attribute which allow attributes to be cleaned up whenever a test is defined
  • [ExUnit] Add ExUnit.Case.register_test and 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 == in assert
  • [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 setup and setup_all
  • [ExUnit] Support for bundling tests together with describe/2
  • IEx:
  • [IEx] Add nl/2 that loads a given modules 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 xref and mix compile.xref that runs cross-reference checks, with the latter running after compilation by default
  • [Mix] Add mix app.tree and mix deps.tree
  • [Mix] Add Mix.Task.rerun/2 that reenables and re-runs a task
  • [Mix] Integrate OptionParser.ParseError into Mix, automatically converting such exceptions into Mix.Error and embedding the task information
  • [Mix] Support @preferred_cli_env attribute when defining tasks
  • [Mix] Support mix test --raise that 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.install to install escripts
  • [Mix] Print stacktraces for Mix.Error when MIX_DEBUG=1 is 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-threshold flag and the previous behaviour can be reenabled by giving --verbose to mix compile
  • [Mix] Add mix test --stale that 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
  • BUG FIXES:
  • Elixir:
  • [Application] Ensure Application.spec/2 returns nil for unknown applications
  • [GenServer] Ensures cast/2 returns :ok if 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 defstruct is called multiple times
  • [Kernel] Ensure Module.create/3 respects var/alias hygiene
  • [Kernel] Support non-literal ranges on the right side of in/2
  • [Macro] Fix Macro.to_string/1 on a call of a capture argument, for example &(&1).(:x)
  • [OptionParser] Allow OptionParser to parse negative numbers
  • [Record] Fix Record.is_record/2 when dealing with non-record tuples
  • [String] Ensure strip also removes non-breaking whitespaces (and ensure split still 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 :env option 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
  • SOFT DEPRECATIONS (NO WARNINGS EMITTED):
  • [Float] Float.to_string/2 and Float.to_char_list/2 has 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/2 and :erlang.float_to_list/2 if they need the previous functionality
  • [Kernel] to_char_list functions have been soft-deprecated in favor of to_charlist. This aligns with the naming conventions in both Erlang and Elixir
  • [String] The confusing String.strip/2, String.lstrip/2 and String.rstrip/2 API has been soft deprecated in favor of String.trim/2, String.trim_leading/2 and String.trim_trailing/2
  • [String] The confusing String.ljust/3 and String.rjust/3 API has been soft deprecated in favor of String.pad_leading/3 and String.pad_trailing/3
  • [Typespec] char_list is soft-deprecated in favor of charlist
  • DEPRECATIONS:
  • Elixir:
  • [Dict] Dict is no longer a behaviour and its functions will be deprecated in upcoming releases
  • [Enum] Passing a dictionary to Enum.group_by/3 is deprecated
  • [Kernel] \x{H*} in strings/sigils/charlists is deprecated
  • [Kernel] Add deprecation for defdelegate list arguments and :append_first option
  • [Kernel] Warn if a variable is assigned inside case/if/etc and used outside the block
  • [Keyword] Keyword.size/1 is deprecated in favor of Kernel.length/1
  • [Map] Map.size/1 is deprecated in favor of Kernel.map_size/1
  • [Regex] The option /r (for ungreedy) has been deprecated in favor of /U
  • [Set] Set is no longer a behaviour and its functions will be deprecated in upcoming releases
  • [String] String.valid_character?/1 is deprecated in favor of String.valid?/1 with pattern matching
  • [Task] Task.find/2 is deprecated in favor of explicit message matching
  • [URI] Passing a non-map to URI.decode_query/3 is deprecated

New in Elixir 1.2.6 (Jun 6, 2016)

  • Enhancements:
  • [Kernel] Support Erlang 19
  • [Kernel] Supported generated: true in the quote special form
  • 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 syntax

New in Elixir 1.3.0 RC 0 (May 30, 2016)

  • ENHANCEMENTS:
  • EEx:
  • [EEx.Engine] Support an init/1 function 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/2 and Access.key!/1 for traversing nested data structures
  • [Calendar] Add Calendar and Date, Time, NaiveDateTime and DateTime types
  • [CLI] Add --logger-otp-reports BOOL and --logger-sasl-reports BOOL switches
  • [Compiler] Emit a summary of compilation errors when modules are missing
  • [Enum] Add Enum.group_by/3 that allows developers to map on the value being grouped
  • [Enum] Add Enum.drop_every/2 that drops every nth, including the first one
  • [Exception] Suggest possible functions on UndefinedFunctionError for 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/3 yourself
  • [Inspect] Support :base option when inspecting binaries
  • [IO] Add IO.warn/2 that 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: true in quote
  • [Kernel] Support Kernel.pop_in/1 and Kernel.pop_in/2 for 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 bar} and %{optional(foo) => bar} forms (Erlang 19 only)
  • [Typespec] Add support for @optional_callbacks to 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 = right and assert match?(^left, right) assertions
  • [ExUnit] Add ExUnit.Case.register_attribute which allow attributes to be cleaned up whenever a test is defined
  • [ExUnit] Add ExUnit.Case.register_test and 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 == in assert
  • [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 setup and setup_all
  • [ExUnit] Support for bundling tests together with describe/2
  • IEx:
  • [IEx] Add nl/2 that loads a given modules 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 xref and mix compile.xref that runs cross-reference checks, with the latter running after compilation by default
  • [Mix] Add mix app.tree and mix deps.tree
  • [Mix] Add Mix.Task.rerun/2 that reenables and re-runs a task
  • [Mix] Integrate OptionParser.ParseError into Mix, automatically converting such exceptions into Mix.Error and embedding the task information
  • [Mix] Support @preferred_cli_env attribute when defining tasks
  • [Mix] Support mix test --raise that 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.install to install escripts
  • [Mix] Print stacktraces for Mix.Error when MIX_DEBUG=1 is 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-threshold flag and the previous behaviour can be reenabled by giving --verbose to mix compile
  • [Mix] Add mix test --stale that 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
  • BUG FIXES:
  • Elixir:
  • [Application] Ensure Application.spec/2 returns nil for unknown applications
  • [GenServer] Ensures cast/2 returns :ok if 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 defstruct is called multiple times
  • [Kernel] Ensure Module.create/3 respects var/alias hygiene
  • [Kernel] Support non-literal ranges on the right side of in/2
  • [Macro] Fix Macro.to_string/1 on a call of a capture argument, for example &(&1).(:x)
  • [OptionParser] Allow OptionParser to parse negative numbers
  • [Record] Fix Record.is_record/2 when dealing with non-record tuples
  • [String] Ensure strip also removes non-breaking whitespaces (and ensure split still 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 :env option 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
  • SOFT DEPRECATIONS (NO WARNINGS EMITTED):
  • [Float] Float.to_string/2 and Float.to_char_list/2 has 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/2 and :erlang.float_to_list/2 if they need the previous functionality
  • [Kernel] to_char_list functions have been soft-deprecated in favor of to_charlist. This aligns with the naming conventions in both Erlang and Elixir
  • [String] The confusing String.strip/2, String.lstrip/2 and String.rstrip/2 API has been soft deprecated in favor of String.trim/2, String.trim_leading/2 and String.trim_trailing/2
  • [String] The confusing String.ljust/3 and String.rjust/3 API has been soft deprecated in favor of String.pad_leading/3 and String.pad_trailing/3
  • [Typespec] char_list is soft-deprecated in favor of charlist
  • DEPRECATIONS:
  • Elixir:
  • [Dict] Dict is no longer a behaviour and its functions will be deprecated in upcoming releases
  • [Enum] Passing a dictionary to Enum.group_by/3 is deprecated
  • [Kernel] \x{H*} in strings/sigils/charlists is deprecated
  • [Kernel] Add deprecation for defdelegate list arguments and :append_first option
  • [Kernel] Warn if a variable is assigned inside case/if/etc and used outside the block
  • [Keyword] Keyword.size/1 is deprecated in favor of Kernel.length/1
  • [Map] Map.size/1 is deprecated in favor of Kernel.map_size/1
  • [Regex] The option /r (for ungreedy) has been deprecated in favor of /U
  • [Set] Set is no longer a behaviour and its functions will be deprecated in upcoming releases
  • [String] String.valid_character?/1 is deprecated in favor of String.valid?/1 with pattern matching
  • [Task] Task.find/2 is deprecated in favor of explicit message matching
  • [URI] Passing a non-map to URI.decode_query/3 is deprecated

New in Elixir 1.2.5 (May 5, 2016)

  • Bug fixes:
  • [Logger] Stringify truncated function data in Logger
  • [Logger] Ensure poorly formatted char data can also be logged by using the replacement character "�" (diamond question mark)
  • [Mix] Do not assume @impl is always a list
  • [String] Fix bugs in String.replace_* functions where it would not include the accumulated value for certain replacements

New in Elixir 1.2.4 (Apr 1, 2016)

  • Enhancements:
  • [Mix] Add :archives configuration to def project that allows projects to list archive dependencies. --no-archives-check (as well as --no-deps-check) will disable the archive check. The :archives option is not checked for dependencies.
  • [Mix] Add deps.precompile task as hook
  • [Mix] Support --include-children in mix deps.compile option
  • [String] Update version of the Unicode database to 8.0.0
  • Bug fixes:
  • [Application] Ensure spec/2 returns nil for unknown applications
  • [Integer] Fix a possible binary leak in parse/1
  • [Mix] Purge Erlang modules on recompilation
  • [String] Ensure split/1 does not break on non-breakable whitespace
  • [String] Ensure NFC and NFD normalization pass all of Unicode 8.0.0 tests
  • [Version] Allow dots in build info for versions in Version.parse/1

New in Elixir 1.2.3 (Feb 22, 2016)

  • Enhancements:
  • [Base] Add :ignore and :padding option to encoding/decoding functions
  • [Mix] Add Mix.Projects.deps_paths that returns the dependencies path as a map
  • Bug fixes:
  • [ExUnit] Do not provide negative line numbers without generated annotation (for compatibility with Erlang 19)
  • [Mix] Reject non fullfilled optional dependencies later on in the convergence resolution for proper dependency sorting
  • [String] Fix incomplete data trimming on both String.replace_trailing and String.rstrip
  • [String] Attach debug_info back into Unicode modules for Dialyzer support

New in Elixir 1.2.2 (Jan 31, 2016)

  • Enhancements:
  • [Kernel] Support @compile {:autoload, false} to disable automatic loading after compilation
  • Bug fixes:
  • [ExUnit] Raise if trying to override reserved tag in setup blocks
  • [Mix] Ensure retrieve compile manifests do fail if some compilers are not yet available
  • [Mix] Automatically merge managers according to the mix > rebar3 > rebar > make order
  • [Mix] Force recompilation if dependency was recently fetched

New in Elixir 1.2.1 (Jan 14, 2016)

  • Enhancements:
  • [IEx] Support remote pids/ports with IEx helper i/1
  • [Protocol] Warn when defimpl is called for a consolidated protocol
  • Bug fixes:
  • [ExUnit] Ensure assert macros can be used from quoted code
  • [ExUnit] Do not warn in match assertion if variable is reused in pattern
  • [Macro] Fix a bug in Macro.to_string/1 where a remote function could be accidentally interpreted as a sigil
  • [Mix] Ensure dependencies are properly skipped when --only option is given to mix deps.get

New in Elixir 1.2.0 (Jan 3, 2016)

  • ENHANCEMENTS:
  • Elixir:
  • [Application] Add spec/1 and spec/2 to retrieve application specification
  • [Application] Add get_application/1 to retrieve the application a given module belongs to
  • [Base] Optimize encode and decode operations about 10 times
  • [Enum] Use the faster and auto-seeding :rand instead of :random in Enum.shuffle/1 and Enum.random/1 and Enum.take_random/2
  • [Enum] Add Enum.with_index/2
  • [GenServer] Add GenServer.stop/1 for shutting down servers reliably
  • [IO] Add color related functions to IO.ANSI
  • [Kernel] Support multiple aliases in alias, import, require and use. For example, alias MyApp.{Foo, Bar, Baz}
  • [Kernel] Add struct!/2. Similar to struct/2 but raises on invalid keys
  • [Kernel] Warn if @doc/@typedoc/@moduledoc attributes are redefined
  • [Kernel] Warn if non-variables are used in defdelegate/2 (as they have no effect)
  • [Kernel] Mark quoted expressions as generated, avoiding false positives on dialyzer
  • [Kernel] Allow variables as map keys on creation %{key => value} and on matches %{^key => value}
  • [Kernel] Allow the pin operator ^ in fn clauses and on the left side of does not provide any expression
  • [Kernel] Warn if the Elixir was compiled with a different endianness than the one currently available at runtime
  • [Kernel] Warn if a variable is used after being defined exclusively in a nested context
  • [Kernel] Warn if piping into an expression without parentheses
  • [Macro] Add Macro.traverse/4 that performs pre and post-walk at once
  • [Macro] Add Macro.camelize/1 and Macro.underscore/1
  • [Process] Add Process.get_keys/0
  • [Stream] Add Stream.with_index/2
  • [String] Introduce String.replace_{prefix,suffix,leading,trailing}/2. The first two will replace only the first occurrence of the given match in string. The last two will replace all occurrences of the given match
  • [String] Support String.normalize/2 and String.equivalent?/2 that perform NFD and NFC normalization
  • [System] Add System.time_offset, System.monotonic_time, System.system_time, System.convert_time_unit and System.unique_integer
  • [System] Allow System.cmd/3 to remove variables by specifying nil values
  • [Task] Add Task.Supervisor.async_nolink/1/3 that spawns a supervised task without linking to the caller process
  • [Task] Introduce Task.yield_many/2
  • [Task] Raise an error when a task is queried from a non-owning process (instead of waiting forever)
  • ExUnit:
  • [ExUnit] Allow one test to raise multiple errors. The goal is to enable tools in the ecosystem to emit multiple failure reports from the same test
  • [ExUnit] Support @tag report: [:foo, :bar] which will include the values for tags :foo and :bar whenever a test fails
  • IEx:
  • [IEx] Allow IEX_WITH_WERL to be set on Windows to always run on WERL mode
  • [IEx] Display type docs for t(Module.type) and t(Module.type/arity)
  • [IEx] Add i/1 helper that prints information about any data type
  • [IEx] Show source code snippet whenever there is a request to pry a given process
  • Logger:
  • [Logger] Add file to logger metadata
  • Mix:
  • [Mix] Cache and always consolidate protocols
  • [Mix] Add warn_test_pattern to mix test that will warn on potentially misconfigured test files
  • [Mix] Introduce MIX_QUIET environment variable that configures the underlying Mix task to output only error messages
  • [Mix] Introduce MIX_DEBUG environment variable that prints information about the task being run
  • [Mix] Validate git options and warn on conflicting ref, branch or tags
  • [Mix] New umbrella applications will now share configuration and build files
  • [Mix] Add experimental support for Rebar 3
  • [Mix] Do not warn when an optional dependency has a conflicting :only option with another dependency
  • [Mix] Raise readable error message when parsertools is not available
  • [Mix] Add --build flag to mix deps.clean DEP to only remove artifacts from _build
  • BUG FIXES:
  • Kernel:
  • [Access] Improve error messages when using Access on non-valid key-value structures
  • [Kernel] Raise when conflicting :only and :except are given to import
  • [Kernel] Change __ENV__.file if @file is set for the given function
  • [Kernel] Make Kernel.ParallelRequire aware of :warning_as_errors
  • [Kernel] Improve error message for invalid do/do:
  • [Macro] Ensure Macro.to_string/2 respects operator precedence when using the access operator
  • [Path] Do not crash when expanding paths that go beyond the root, for example, Path.expand("/../..")
  • [String] Ensure UnicodeConversionError does not contain invalid string in its error message
  • IEx:
  • [IEx] Do not start apps on recompile helper if --no-start was given
  • [IEx] Avoid copying of data when evaluating every expression in IEx
  • Mix:
  • [Mix] Always run non-recursive tasks at the umbrella root
  • [Mix] Ensure rebar projects work on directory names that contain non-latin characters
  • [Mix] Ignore directories inside apps in umbrellas that do not have a mix.exs file
  • [Mix] Ensure Mix can be used with path dependencies where the app name is different than the path basename
  • [Mix] Ensure dependencies won't crash when updating from a git repository to a hex repository and the git version did not respect SemVer
  • [Mix] Do not run remote converger if dependencies have diverged
  • [Mix] Ensure umbrella dependencies across all environments are loaded on parent deps.get/deps.update
  • ExUnit:
  • [ExUnit] Include file and line in all compilation errors for doctests
  • SOFT DEPRECATIONS (NO WARNINGS EMITTED):
  • Kernel:
  • [Dict] Dict and HashDict are soft deprecated in favor of Map
  • [Keyword] Keyword.size/1 is deprecated in favor of length/1
  • [Map] Map.size/1 is deprecated in favor of map_size/1
  • [Set] Set and HashSet are soft deprecated in favor of MapSet
  • Mix:
  • [Mix] Mix.Utils.camelize/1 and Mix.Utils.underscore/1 are soft deprecated in favor of Macro.camelize/1 and Macro.underscore/1

New in Elixir 1.2.0 RC 1 (Dec 21, 2015)

  • Enhancements:
  • [Mix] Raise readable error message when parsertools is not available
  • [Mix] Add --build flag to mix deps.clean to only clean --build artifacts
  • [Typespec] Improve error message on invalid maps on typespecs
  • Bug fixes:
  • [Access] Improve error messages when using Access on non-valid key-value structures
  • [Mix] Do not run remote converger if dependencies have diverged
  • [Mix] Generate proper config/config.exs for umbrella projects
  • [Mix] Ensure umbrella dependencies across all environments are loaded on parent deps.get/deps.update
  • [Logger] Check for :name or :id in Logger translator to support old OTP projects
  • [String] Ensure UnicodeConversionError does not contain invalid string in its error message

New in Elixir 1.1.0 Beta (Sep 7, 2015)

  • ENHANCEMENTS:
  • Elixir:
  • [Application] Add Application.fetch_env!/2, Application.loaded_applications/0 and Application.started_applications/0
  • [CLI] Add support for --werl in Windows bash-like shells
  • [Dict] Add Dict.get_and_update/3 which behaves similar to the now deprecated Access protocol
  • [Dict] Add Dict.get_lazy/3, Dict.pop_lazy/3 and Dict.put_new_lazy/3
  • [Enum] Add Enum.random/1, Enum.take_random/2, Enum.min_max/1, Enum.min_max_by/2, Enum.reverse_slice/3, Enum.dedup/1 and Enum.dedup_by/2
  • [Enum] Inline common map usage in Enum functions for performance
  • [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)
  • [File] Add File.rename/2
  • [Integer] Add Integer.digits/2 and Integer.undigits/2
  • [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
  • [IO] Support fenced code blocks on IO.ANSI.Docs
  • [GenServer] Add GenServer.whereis/1 that expands GenServer dispatches into a proper pid
  • [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
  • [Kernel] Raise when var.Alias syntax is used and it does not expand to an atom at compile time (previously it emitted warnings)
  • [Kernel] Improve generation of argument names for function signatures
  • [Kernel] ::/2 is now a special form
  • [Kernel] Warn when a variable with underscore is used
  • [Kernel] Allow underscores in binary, octal and hex literals
  • [Kernel] Warn when module attributes, variables, strings and numbers are used in code but the expression has no effect
  • [Kernel] Support \uXXXX and \u{X*} in strings and char lists to map to Unicode codepoints
  • [List] Add List.keytake/3
  • [Module] Improve name inference for function signatures in documentation metadata
  • [Process] Add Process.hibernate/3
  • [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
  • [Stream] Add Stream.dedup/1, Stream.dedup_by/2 and Stream.transform/4
  • [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
  • [String] Add String.splitter/3 that splits strings as a stream
  • [StringIO] StringIO.flush/1 was added to flush the output of a StringIO device
  • [Task] Introduce Task.yield/2 and Task.shutdown/2 to check if a task is still executing and shutdown otherwise
  • [Tuple] Add Tuple.append/2
  • [URI] Default ports were added for "ws" and "wss" schemas
  • [URI] Add URI.to_string/1
  • EEx:
  • [EEx] Add :trim option to EEx that automatically trims the left side of if only spaces and new lines preceed/follow them
  • ExUnit:
  • [ExUnit] Add number of skipped tests to ExUnit output
  • [ExUnit] Make timeout configurable for the whole test suite via the :timeout configuration
  • [ExUnit] Allow moduledoc to be filtered/skipped in doctests
  • [ExUnit] Provide built-in log capturing functionality
  • [ExUnit] Allow assert_receive_timeout and refute_receive_timeout to be configured in the ExUnit application
  • [ExUnit] Allow tests to be skipped with @tag :skip or @tag skip: "reason"
  • IEx:
  • [IEx] Support IEx.pry with --remsh for remote debugging
  • [IEx] Add b/1 helper that shows documentation for behaviour modules and its callback functions
  • [IEx] Provide tab completion for aliases and allow aliases like Foo.Bar.Baz to autocomplete even if Foo.Bar is not defined
  • [IEx] Provide a pid/3 helper for buildings pids from numbers
  • Logger:
  • [Logger] Support printing pids and refs in Logger metadata
  • [Logger] Allow logger metadata to be removed from pdict by setting it to nil
  • [Logger] Add application configuration translator_inspect_opts for logger to customize how state and message are formatted when translating OTP errors and reports
  • [Logger] Automatically include the current application in metadata when compiled via Mix
  • Mix:
  • [Mix] Check Elixir version right after archive installation and provide feedback if there is a mismatch
  • [Mix] Allow rebar dependencies with mix.exs to be compiled with Mix
  • [Mix] Allow rebar dependencies to be specified via :path
  • [Mix] Also consider subdirectories in config directory for Mix.Project.config_files/0
  • [Mix] Allow dynamic configuration in Mix projects by storing config in an agent
  • [Mix] Support rebar3 style git refs in rebar.config files
  • [Mix] Only recompile compile time dependencies in mix projects. This should considerably speed up recompilation times in Elixir projects
  • [Mix] Warn when configuring an application that is not available
  • [Mix] Add mix profile.fprof for easy code profiling
  • [Mix] Abort when dependencies have conflicting :only definitions
  • [Mix] Fully recompile projects if Elixir or SCM changes
  • [Mix] Allow checksum to be checked on archive install via --sha512 option
  • [Mix] Add mix local.public_keys to safely manage installation of Hex and Rebar dependencies
  • BUG FIXES:
  • Elixir:
  • [CLI] Ensure Logger messages are flushed when executing commands
  • [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
  • [Code] Store the documentation line in the metadata returned by Code.get_docs/2
  • [Exception] Do not fail when calculating an exception message, even if the message is invalid
  • [Kernel] Do not expand in/2 argument in module body
  • [Kernel] Throw syntax error for undefind atom/alias syntax :foo.Bar
  • [Kernel] Improve error message when we can't compile because the target directory is not writeable
  • [Kernel] Allow capture of non-symbolic operators like &and/2, ¬/1 and others
  • [Kernel] Raise if heredoc terminal is accidentally found in the middle of a line without escaping
  • [Kernel] Don't warn on missing imports if nothing was imported
  • [Macro] Properly convert captures in Macro.to_string/1
  • [Module] Do not accept non-Elixir module names in Module.split/1
  • [Protocol] Guarantee that derived protocols go through Any instead of Map
  • [Range] Restrict ranges to integers to fix diverse bugs of values being included in the range when they should not (false positives)
  • [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
  • [Regex] Fix Regex.replace/4 so it doesn't discard escape characters
  • EEx:
  • [EEx] Allow EEx interpolation to also apply inside quotations
  • ExUnit:
  • [ExUnit] Skipped tests now correctly count towards the total of tests in the result returned by ExUnit.run/0
  • [ExUnit] Fix a bug where failures when inspecting data structure or retrieving error messages could bring the whole ExUnit runner down
  • [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
  • [ExUnit] Report proper line number for doctest failures
  • Logger:
  • [Logger] Include metadata in Logger.log/3, use Logger.bare_log/3 for runtime-only, with no metadata behaviour
  • Mix:
  • [Mix] Use the safer https protocol instead of git for :github dependencies
  • [Mix] Ensure automatic protocol consolidation via :consolidate_protocols is triggered in umbrella apps
  • [Mix] Do not raise if wildcard given to import_config does not match any file
  • [Mix] Applications with :build_embedded set to true require explicit compilation step
  • [Mix] Also remove consolidated protocols on mix clean
  • [Mix] Ensure --exclude in mix test concatenates with test helper excludes
  • SOFT DEPRECATIONS (NO WARNINGS EMITTED):
  • Elixir:
  • [Behaviour] The module Behaviour is deprecated. Instead of defcallback, one can simply use @callback. Instead of defmacrocallback, one can simply use @macrocallback
  • [Enum] Enum.uniq/2 is deprecated in favor of Enum.uniq_by/2
  • [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
  • [Regex] Ungreedy option r is deprecated in favor of U (which is standard in regular expressions in other languages)
  • DEPRECATIONS
  • Elixir:
  • [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
  • [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
  • [Kernel] Giving as: true | false to alias/2 and require/2 have been deprecated (it was undocumented behaviour)
  • [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

New in Elixir 1.0.5 (Jul 6, 2015)

  • Enhancements:
  • [Elixir] Support Erlang 18.0
  • [IEx] Rely only on loaded applications for autocompletion on IEx
  • [Record] Expand attributes and macros in record extractor
  • [String] Optimize String.rstrip/1
  • [String] Optimize String.downcase/1
  • [String] Optimize String.upcase/1
  • Bug fixes:
  • [EEx] Ensure blocks do not clobber EEx buffers
  • [Enum] Ensure Enum.take/2 does not consume one extra item when halting on the last emittable item
  • [ExUnit] Fix StringIO processes leakage in the ExUnit.CaptureIO when there are errors inside the capture_io block
  • [Float] Avoid rounding errors on Float.parse/1
  • [GenEvent] Fix GenEvent detection of modules that aren't loaded
  • [IO] Read 4K blocks instead of lines in IO.binread/2. This fixes a bug where CRLF were being ignored and is also going to improve performance
  • [Logger] Handle :undefined arity in Logger.Translator (we get :undefined when a temporary worker of a simple_one_for_one supervisor crashes)
  • [Mix] Ensure config is escaped before being injected into escripts. This fixes a bug where escripts failed to build when containing values like maps in config files
  • [Mix] Ensure we properly underscore acronyms followed by paths, for example, HTTP.Foo
  • [Stream] Ensure Stream.flat_map/2 does not consume more items than necessary when piped to another Stream.flat_map/2 that halts in the inner stream
  • [Version] Fix to_string for versions with numeric pre releases

New in Elixir 1.0.4 (Apr 8, 2015)

  • Enhancements:
  • [Elixir] Support Erlang 17.5 and 18.0
  • [Mix] Support "--search PATTERN" in "mix help"
  • [Mix] Support :start_permanent that starts the application as permanent
  • [Mix] Support :build_embedded that compile protocols, avoid symlinks and ensure protocols are loaded on boot
  • [Mix] Make "mix app.start" public and support "--permanent" and "--temporary" options
  • [URI] Speed decoding operations
  • Bug fixes:
  • [Elixir] Produce clearer error messages for syntax errors before a sigil
  • [Elixir] Return value when matching on _ in the last line of a block
  • [Elixir] Ensure changes in child deps forces the parent to recompile
  • [Kernel] Fix a bug where =~/2 returned false when matching on an empty string. The current behaviour was changed to match the behaviour of String.contains?/2
  • [Mix] Store relative paths in erlang manifests
  • [Mix] Fix httpc proxy option profile for downloading hex and other safe packges
  • [Mix] Fix missing behaviour warning when compiling Erlang modules

New in Elixir 1.0.3 (Feb 12, 2015)

  • Enhancements:
  • [Elixir] Do not show exported vars warning
  • [Elixir] Improve error messages when using invalid expressions inside maps
  • [Elixir] Skip aliases and import warnings when code cannot compile
  • [IEx] Improve autocompletion for Erlang/Elixir based on loaded applications
  • [IO] Make IO.ANSI.Docs readable on white background
  • [Mix] Provide clearer error message when updating archives on Windows
  • [Mix] Don't go through hex.pm API server to install Hex
  • Bug fixes:
  • [Elixir] Ensure all Elixir applications work with code upgrades
  • [Elixir] Don't leave spurious processes and stale data when the parallel compiler fails
  • [Inspect] Keep original stacktrace on Inspect errors
  • [IO] Fix IO.ANSI.Docs handling of *, **, _ where they would be activated in the middle of words
  • [Logger] Fix logging with metadata[:function]
  • [Mix] Don't show hex update message on mix local.hex
  • [Mix] Ensure tasks are properly underscored and camelized
  • [Mix] Ensure Mix does not use ANSI escapes on Windows unless ANSI is enabled
  • [Mix] Only shutdown Logger if the Mix application is being actually started
  • [Mix] Ensure priv/include are copied on Windows even if source did not change
  • [Mix] Ensure rebar dependencies work when user path has a space on Windows
  • [Regex] Fix Regex.replace/4 failures when the number of substitutions in pattern is more than the number of matches and support \g{...} patterns
  • [String] Fix LFCR being treated as a grapheme instead of CRLF
  • [URI] Do more strict matching on URI schema

New in Elixir 1.0.2 (Jan 5, 2015)

  • Bug fixes:
  • [EEx] Remove invalid warning when attempting to inline code in EEx
  • [EEx] Unify syntax errors to always include file:line:
  • [IEx] Set null prompt function in dumb term mode
  • [Kernel] Do not define an ets table with the same name as the module as it clashes with user code
  • [Kernel] Fail compiling try expressions if they lack one of catch/after/rescue/else clauses
  • [Kernel] Improve error messages when parsing fails on aliases
  • [Kernel] Improve warnings coming from compile-time evaluation of arguments
  • [String] Fix String.replace/4 typespec

New in Elixir 1.0.1 (Oct 7, 2014)

  • Enhancements:
  • [Mix] Add MIX_ENV output to archive.build (as on escript.build)
  • Bug fixes:
  • [CLI] Fix Elixir CLI when running on Cygwin
  • [ExUnit] Include stacktraces in ExUnit timeouts
  • [Mix] Load dependencies before deps.check compiles dependencies
  • [Mix] Ensure Mix.Config is deep merged
  • [Mix] Change version requirement in new apps to ~> MAJOR.MINOR
  • [Mix] Report correct location if local.hex fails and give higher priority to powershell install on Windows
  • [Mix] Ensure --elixirc-paths option for compile.elixir is a subset of the project :elixirc_paths configuration and it does not remove skipped entries from the manifest
  • [Mix] Ensure compile.elixir writes to manifest when files are removed
  • [Mix] Ensure compile.elixir purges and deletes modules before compiling
  • [Mix] Do not crash on malformed proxy env var
  • [Stream] Ensure chunk/4 works correctly when halted
  • [System] Do not allow relative paths in System.cmd/3 as documented
  • [System] Fix :stderr_to_stdout option in System.cmd/3

New in Elixir 1.0.0 (Sep 10, 2014)

  • Enhancements:
  • [Logger] Add Logger.enable/1 and Logger.disable/1
  • Backwards incompatible changes:
  • [GenEvent] No longer support {:swap_handler, ...} as callback return value
  • [List] List.unzip/2 was removed

New in Elixir 1.0.0 RC 2 (Sep 8, 2014)

  • Enhancements:
  • [ExUnit] Print process mailbox on failing assert_receive
  • [ExUnit] Tag all doctests with the :doctest tag
  • [Kernel] Friendlier unquote_splicing error on inline quote
  • [Kernel] Add , , , as operators
  • [Mix] mix deps.unlock warns when given a missing dependency
  • [Mix] Fetch hex using HTTPS
  • Bug fixes:
  • [File] Ensure File.cwd generates lowercase drive letters on Windows
  • [GenEvent] Ensure the event manager does not crash on :sys.replace_state/3
  • [GenEvent] Do not consider swap handlers to be failures in a stream
  • [Logger] Fix Logger.log/2 not to raise on Logger exit
  • [Logger] Recompute sync/async mode on Logger configuration
  • [System] Ensure System.cwd generates lowercase drive letters on Windows
  • Deprecations:
  • [GenEvent] The :monitor option in add_handler/4 and swap_handler/6 is deprecated in favor of add_mon_handler/3 and swap_mon_handler/5
  • Backwards incompatible changes:
  • [Supervisor] Make max_restarts default to 3 (closer to upcoming Erlang defaults)

New in Elixir 1.0.0 RC 1 (Sep 5, 2014)

  • Enhancements:
  • [ExUnit] Add timeouts to tests (which is configurable via tags)
  • [GenEvent] Add support for GenEvent.ack_notify/2
  • [GenEvent] Add support for monitored handlers to GenEvent.add_handler/4 that removes the drawbacks in the previous linked handlers
  • [Logger] Allow any value that implements String.Chars to be logger
  • [Logger] Allow Logger.log/3 timeout to be configured
  • [Mix] Add --force option to mix local.rebar
  • [Mix] Fix --no-color/--color option for mix test
  • [Mix] Add a :language option to improve the usability of Erlang projects using Mix
  • [Mix] Accept wildcards on Mix.Config.import_config/1
  • [Mix] Support protocol consolidation on escripts
  • Bug fixes:
  • [IEx] Do not print the underlying type for @opaque in the t helper
  • [GenEvent] Do not allow a handler to be added more than once
  • [GenServer] Do not treat bad arguments as exits in GenServer.call/2
  • [GenServer] Do not deliver out of order messages on GenServer.cast/2 on distributed mode
  • [Mix] Do not pre-compile a Mix project if an alias was found
  • [Mix] Properly handle compilation errors in the Erlang compiler
  • [Mix] Always try to compile project if task cannot be found
  • [Mix] Purge in memory modules before consolidating
  • [Mix] Always compile a project if a task cannot be found
  • Deprecations:
  • [Collectable] Deprecate Collectable.empty/1 and Enum.traverse/2
  • [Integer] odd?/1 and even?/1 are deprecated in favor of is_odd/1 and is_even/1
  • [Kernel] nil?/1 is deprecated in favor of is_nil/1
  • [Kernel] x.Alias is deprecated in favor of an explicit Module.concat/2
  • [Record] record?/1 and record?/2 are deprecated in favor of is_record/1 and is_record/2
  • [Stream] Returning {item, acc} | nil from Stream.resource/2 is deprecated, instead return {[item], acc} | {:halt, acc} (similar to Stream.transform/3)
  • Backwards incompatible changes:
  • [GenEvent] GenEvent.cancel_stream/1 no longer is
  • [GenEvent] The :mode and :duration options are deprecated and no longer supported in GenEvent.stream/2 (the mode is now a property of the sender)
  • [GenEvent] The :linked option is deprecated and no longer supported in GenEvent.add_handler/4 (check monitored handlers instead)

New in Elixir 0.15.1 (Aug 11, 2014)

  • Enhancements:
  • [GenEvent] Support :ack mode for GenEvent streams
  • [Inspect] Support :base option in inspect/2 to choose the base (:binary, :octal, :decimal or :hex) numbers a printed
  • [kernel] Print warnings when used ? with characters with escape codes
  • [Logger] Add SASL log forwarding option to Logger
  • [Logger] Add $padlevel to option Logger formatter
  • [Logger] Backends receive the exact handler value when added, allowing a key to be passed for configuration lookup
  • [Logger] Add Logger.flush/0 to flush the Logger (useful for testing)
  • [Logger] Persist backends dynamically added or removed via add_backend/2 and remove_backend/2
  • [Macro] Add Macro.validate/1 to recursively check if a value is a valid quoted expression
  • [Mix] Load mix deps only when there is a need to use them (this improves the timing for the majority of tasks in a Mix project)
  • [Mix] Make the environment explicit on the success message generated after escript.build is invoked
  • [Mix] Load config/config.exs inside escripts
  • [Mix] Store and check Elixir version requirement for generated archives
  • Bug fixes:
  • [CLI] Fix shell bugs when running on Windows with Cygwin or MinGW
  • [Kernel] Modules compiled by Elixir now report the correct beam location when :code.which/1 is invoked. If the bytecode is only available in memory, :code.which/1 returns :in_memory
  • [Kernel] Do not expand args for unknown functions/macros
  • [Kernel] Ensure defstruct, @attr inside and friends raise a nice error messages when values cannot be properly escaped
  • [Kernel] Do not raise conflicts on imports used from inside quotes
  • [Logger] Metadata is now correctly merged on each Logger.metadata/1 call
  • [Logger] Use the Logger PID on :error_logger wrapper to avoid race conditions on shutdown
  • [Macro] Ensure bitstrings work with Macro.escape/1
  • [Mix] Ensure aliases are invoked on umbrella recursive tasks
  • [Mix] Leave it up to the application to start the Logger after compilation
  • [Mix] Accept more forms of git versions (like "git version 1.9.3 (Apple Git-50)")
  • [Path] Do not normalize paths in Path.join/2 as normalization is beyond the scope of such function
  • [URI] to_string/1 now properly converts URI to strings when the schema is missing
  • Deprecations:
  • [Collectable] Having a function as collectable is deprecated
  • [Module] Module.function/3 is deprecated, please use :erlang.make_fun/3 instead

New in Elixir 0.15.0 (Aug 5, 2014)

  • Enhancements:
  • [Agent] Improve the Agent API to also accept functions that receive explicit module, function and arguments
  • [IEx] Support --werl call on Windows
  • [Logger] Add Logger
  • [Map] Add Map.from_struct/1
  • [Mix] Allow --app flag to be passed to mix new
  • [Mix] Support lowercase http(s)_proxy environment variables
  • [Mix] Allow elixirc_paths to also be given through the command line to mix compile.elixir
  • [String] String.slice/2 and String.slice/3 have been optimized
  • Bug fixes:
  • [IEx] Ensure functions in Kernel.SpecialForms and IEx.Helpers are also auto-completed
  • [IEx] Ensure remote shells can be started with --remsh
  • [Kernel] Correctly parse unary/binary operators regardless of number of spaces
  • [Kernel] Ensure private functions are not exported
  • [Protocol] Do not expose protocol convention on assert_impl!/2
  • [Regex] Do not consider include captures on Regex.split/3 results
  • [Stream] Implement the Inspect protocol for Streams so we do not leak the Stream representation
  • Deprecations:
  • [IEx] IEx color configuration expects a list of atoms instead of a string with colors separated by comma
  • [Inspect] Inspect.Algebra.surround_many/6 now expects Inspect.Opts instead of an integer limit
  • [Inspect] Inspect.Algebra.pretty/2 is deprecated in favor of Inspect.Algebra.format/2 that instead returns iodata. This function was used only by documentation examples and it is unlikely to affect actual code
  • [IO] IO.ANSI.terminal? is deprecated in favor of IO.ANSI.enabled?
  • [IO] IO.ANSI.escape/2 and IO.ANSI.escape_fragment/2 is deprecated in favor of IO.ANSI.format/2 and IO.ANSI.format_fragment/2
  • [Kernel] Leading 0 for octals is deprecated in favor of 0o
  • [Kernel] 0X for hexadecimals is deprecated in favor of 0x
  • [Kernel] 0B for binaries is deprecated in favor of 0b
  • [Mix] Mix color configuration expects a list of atoms instead of a string with colors separated by comma
  • [String] \NNN, \NN and \N for octals are deprecated inside string, sigils and chars in favor of hexadecimal entries with \x
  • Backwards incompatible changes:
  • [Kernel] binding/1 and binding/2 expecting a list were removed
  • [Regex] Do not consider include captures on Regex.split/3 results

New in Elixir 0.14.3 (Jul 14, 2014)

  • Enhancements:
  • [Access] Allow function access on get_in/2 and get_and_update_in/3
  • [Enum] Add Enum.sort_by/3
  • [ExUnit] Match the line filter by proximity instead of exact match
  • [Float] Support precision in Float.ceil/1 and Float.floor/1
  • [IO] Add IO.(bin)read(device, :all)
  • [Kernel] Print a warning if a dangling @doc clause is found
  • [Mix] Use absolute symbolic links on Windows for _build instead of copying
  • [Mix] Add Mix.compilers that returns all default compilers used by mix tasks
  • [Mix] Issue warning and reset mtime for source files from the future
  • [Mix] Support task aliases in Mix
  • [OptionParser] Add OptionParser.split/1 that splits a string into argv
  • [Record] Allow a record to be converted to a keyword list with record(some_record)
  • [String] Improve performance of String.split/1
  • [Typespec] Allow %Struct{} syntax to be used in typespecs
  • [Typespec] Allow record(:record, fields) syntax to be used in typespecs
  • Bug fixes:
  • [IEx] Do not print ANSI sequences on IEx.Helpers.clear/0 if ANSI sequences are not supported
  • [Inspect] Ensure Inspect.Algebra.to_doc/2 doesn't go into a loop when there is a failure printing a struct
  • [Kernel] |>, and ^^^ made left associative in operator table
  • [Kernel] , = given higher precedence than comparison operators (==, !=, etc) in the operator table
  • [Kernel] Run command line and escripts in a process that does not trap exits
  • [Kernel] Fix a bug where Mix paths had higher priority than CLI ones, causing protocol consolidations to not be properly loaded
  • [Kernel] Fix wording on error messages when a check/guard always passes or always fails
  • [Kernel] Fix a bug where an unused function warning was printed even when the function was used via defoverridable
  • [Kernel] Improve typespecs so they don't generate supertype dialyzer warnings
  • [Macro] to_string correctly displays sigils
  • [Mix] Ensure Mix dependencies are not compiled every second time when mix deps.compile is invoked
  • [Mix] Fix a bug where Mix.shell.error/1 and friends choked when printing a map
  • [Mix] Ensure multiple @external_resource entries are read by Mix compilers
  • [Mix] Fix a bug where tasks for umbrella projects were not properly reenabled
  • [Stream] Fix bug when flat_map is used inside another flat_map with an Enumerable
  • [Typespec] Fix a bug where the list typespec was incorrectly rendered as []
  • Soft deprecations (no warnings emitted):
  • [Kernel] Using a list for bitstring modifiers is deprecated (as in ), please use - as the separator instead (as in )
  • [System] System.cmd/1 is deprecated in favor of System.cmd/3
  • Deprecations:
  • [Mix] mix escriptize is deprecated in favor of escript.build
  • [Mix] mix local.install and mix local.uninstall have been deprecated in favor of mix archive.install and mix archive.uninstall respectively
  • [Mix] :embed_extra_apps for escripts is deprecated, instead list the dependencies inside def application
  • [System] Giving a char list to System.find_executable/1 is deprecated
  • Backwards incompatible changes:
  • [Access] No longer fill in missing intermediate values with empty maps
  • [Float] Float.ceil/2 and Float.floor/2 now always returns floats and no longer accept integers
  • [Kernel] defstruct no longer automatically defines a type
  • [Kernel] exit(integer) is no longer supported from scripts to configure the exit signal. Use exit({:shutdown, integer}) instead
  • [Kernel] Default argument values have to be defined in a function head if the function has multiple clauses
  • [Mix] mix archive.build replaces the functionality of mix archive, mix archive now lists locally installed archives
  • [Mix] Mix.shell.info/1 no longer automatically escape ANSI sequences. Instead if has to be explicitly enabled with the ansi: true option
  • [OptionParser] --no-SWITCH are only allowed for declared booleans switches

New in Elixir 0.14.2 (Jul 4, 2014)

  • Enhancements:
  • [Enum] Improve performance of Enum.join/2 and Enum.map_join/3 by using iolists
  • [Kernel] Ensure compatibility with Erlang 17.1
  • [Kernel] Support @external_resource attribute to external dependencies to a module
  • [Mix] Allow built Git dependencies to run on a system without Git by passing --no-deps-check
  • [Mix] Add MIX_ARCHIVES env variable (it is recommended for Elixir build tools to swap this environment)
  • [Task] Set :proc_lib initial call on task to aid debugging
  • [Typespec] Delay typespec compilation to after expansion
  • [URI] Allow parse/1 now accepts %URI{} as argument and return the uri itself
  • Bug fixes:
  • [CLI] Support paths inside archives in -pa and -pz options
  • [IEx] Remove delay when printing data from the an application start callback
  • [IEx] Ensure we show a consistent error when we cannot evaluate .iex.exs
  • [Kernel] Ensure derived protocols are defined with a file
  • [Kernel] Change precedence of & to not special case /
  • [Kernel] Ensure we can only use variables and \\ as arguments of bodyless clause
  • Soft deprecations (no warnings emitted):
  • [EEx] Using EEx.TransformerEngine and EEx.AssignsEngine are deprecated in favor of function composition with Macro.prewalk/1 (see EEx.SmartEngine for an example)
  • [Kernel] Kernel.xor/2 is deprecated
  • [Mix] Mix.Generator.from_file/1 is deprecated in favor of passing from_file: file option to embed_text/2 and embed_template/2 (note though that from_file/1 expects a path relative to the current file while the from_file: file expects one relative to the current working directory)
  • Deprecations:
  • [Kernel] size/1 is deprecated in favor of byte_size/1 and tuple_size/1 (this change was soft deprecated two releases ago)
  • Backwards incompatible changes:
  • [CLI] Remove support for the --gen-debug option as its usage is not documented by OTP
  • [Kernel] Sigils no longer balance start and end tokens, e.g. the sigil ~s(f(o)o) is no longer valid as it finishes in the first closing )
  • [Kernel] Variables set in cond clause heads are no longer available outside of that particular cond clause (this is the behaviour also found in case, receive and friends)
  • [System] build_info/0 now returns a map

New in Elixir 0.14.1 (Jul 4, 2014)

  • Enhancements:
  • [Base] Decoding and encoding functions now accept the :case as an option
  • [ExUnit] The test process now exits with :shutdown reason
  • [GenEvent] GenEvent.stream/2 now accepts :sync and :async modes
  • [Node] Add Node.start/3 and Node.stop/0
  • [String] Updated Unicode database to 7.0
  • [Task] Log when tasks crash
  • Bug fixes:
  • [Enum] Enum.slice/2 and Enum.slice/3 always returns a list (and never nil)
  • [Kernel] Disambiguate (w)erl to (w)erl.exe
  • [Mix] Ensure umbrella project is recompiled when a dependency inside an umbrella child changes
  • [OptionParser] Do not allow underscores in option names
  • [Path] Fix path expansion of "/.."
  • [Path] Do not match files starting with . in Path.wildcard/2 by default
  • [Process] Process.info(pid, :registered_name) returns {:registered_name, nil} if there is no registered name
  • [String] String.slice/2 and String.slice/3 always returns a list (and never nil)
  • [URI] encode/1 does not escape reserved/unreserved characters by default nor encodes whitespace as + (check URI.encode_www_form/1 and URI.decode_www_form/1 for previous behaviour)
  • Deprecations:
  • [Mix] :escript_* options were moved into a single :escript group
  • Backwards incompatible changes:
  • [GenEvent] GenEvent.stream/2 defaults to :sync mode
  • [Kernel] Remove get_in/1

New in Elixir 0.14.0 (Jun 9, 2014)

  • Enhancements:
  • [ExUnit] Add on_exit/1 callbacks that are guaranteed to run once the test process exits and always in another process
  • [Kernel] Store documentation in the abstract code to avoid loading them when the module is loaded
  • [Kernel] Add get_in/2, put_in/3, update_in/3 and get_and_update_in/3 to handle nested data structure operations
  • [Kernel] Add get_in/1, put_in/2, update_in/2 and get_and_update_in/2 to handle nested data structure operations via paths
  • [Mix] Add Mix.Config to ease definition of configuration files
  • [Mix] Add mix loadconfig task that can be called multiple times to load external configs
  • [Mix] Support --config option on mix run
  • [Mix] Support HTTP_PROXY and HTTPS_PROXY on Mix url commands
  • [Mix] Support --names options in mix help which emit only names (useful for autocompletion)
  • [Protocol] Add Protocol.consolidate/2, Protocol.consolidated?/1 and a mix compile.protocols task for protocol consolidation
  • [Protocol] Add Protocol.derive/3 for runtime deriving of a struct
  • [String] Add String.chunk/2
  • [Struct] Add support for @derive before defstruct/2 definitions
  • Bug fixes:
  • [File] File.rm now consistently deletes read-only across operating systems
  • [Kernel] Ensure Mix _build structure works on Windows when copying projects
  • [Kernel] Ensure 1.0E10 (with uppercase E) is also valid syntax
  • [Mix] Fix mix do task for Windows' powershell users
  • [Path] Fix Path.absname("/") and Path.expand("/") to return the absolute path "/".
  • Soft deprecations (no warnings emitted):
  • [Kernel] size/1 is deprecated, please use byte_size/1 or tuple_size/1 instead
  • [ExUnit] teardown/2 and teardown_all/2 are deprecated in favor of on_exit/1 callbacks
  • Deprecations:
  • [Access] Access.access/2 is deprecated in favor of Access.get/2
  • [Dict] Dict.Behaviour is deprecated in favor of Dict
  • [Kernel] Application.Behaviour, GenEvent.Behaviour, GenServer.Behaviour and Supervisor.Behaviour are deprecated in favor of Application, GenEvent, GenServer and Supervisor
  • [Kernel] defexception/3 is deprecated in favor of defexception/1
  • [Kernel] raise/3 is deprecated in favor of reraise/2
  • [Kernel] set_elem/3 is deprecated in favor of put_elem/3
  • [Kernel] Passing an atom var!/1 is deprecated, variables can be built dynamically with Macro.var/2
  • [Mix] Exceptions that define a :mix_error field to be compatible with Mix are no longer supported. Instead please provide a :mix field and use Mix.raise/1 and Mix.raise/2
  • Backwards incompatible changes:
  • [Access] Kernel.access/2 no longer exists and the Access protocol now requires get/2 (instead of access/2) and get_and_update/3 to be implemented
  • [Kernel] Retrieving docs as module.__info__(:docs) is no longer supported, please use Code.get_docs/2 instead
  • [Kernel] Code.compiler_options/1 no longer accepts custom options, only the ones specified by Elixir (use mix config instead)
  • [Mix] mix new no longer generates a supevision tree by default, please pass --sup instead
  • [Task] Tasks are automatically linked to callers and a failure in the task will crash the caller directly

New in Elixir 0.13.3 (May 26, 2014)

  • Enhancements:
  • [OptionParser] Add :strict option that only parses known switches
  • [OptionParser] Add next/2 useful for manual parsing of options
  • [Macro] Add Macro.prewalk/2/3 and Macro.postwalk/2/3
  • [Kernel] GenEvent, GenServer, Supervisor, Agent and Task modules added
  • [Kernel] Make deprecations compiler warnings to avoid the same deprecation being printed multiple times
  • Bug fixes:
  • [Enum] Fix Enum.join/2 and Enum.map_join/3 for empty binaries at the beginning of the collection
  • [ExUnit] Ensure the formatter doesn't error when printing :EXITs
  • [Kernel] Rename ELIXIR_ERL_OPTS to ELIXIR_ERL_OPTIONS for consistency with ERL_COMPILER_OPTIONS
  • [OptionParser] Parse - as a plain argument
  • [OptionParser] -- is always removed from argument list on parse/2 and when it is the leading entry on parse_head/2
  • [Regex] Properly escape regex (previously regex controls were double escaped)
  • Soft deprecations (no warnings emitted):
  • [Dict] Dict.Behaviour is deprecated in favor of Dict
  • [Kernel] Application.Behaviour, GenEvent.Behaviour, GenServer.Behaviour and Supervisor.Behaviour are deprecated in favor of Application, GenEvent, GenServer and Supervisor
  • [Kernel] defexception/3 is deprecated in favor of defexception/1
  • [Kernel] raise/3 is deprecated in favor of reraise/2
  • [Kernel] set_elem/3 is deprecated in favor of put_elem/3
  • Soft deprecations for conversions (no warnings emitted):
  • [Kernel] atom_to_binary/1 and atom_to_list/1 are deprecated in favor of Atom.to_string/1 and Atom.to_char_list/1
  • [Kernel] bitstring_to_list/1 and list_to_bitstring/1 are deprecated in favor of the :erlang ones
  • [Kernel] binary_to_atom/1, binary_to_existing_atom/1, binary_to_float/1, binary_to_integer/1 and binary_to_integer/2 are deprecated in favor of conversion functions in String
  • [Kernel] float_to_binary/* and float_to_list/* are deprecated in favor of Float.to_string/* and Float.to_char_list/*
  • [Kernel] integer_to_binary/* and integer_to_list/* are deprecated in favor of Integer.to_string/* and Integer.to_char_list/*
  • [Kernel] iodata_to_binary/1 and iodata_length/1 are deprecated IO.iodata_to_binary/1 and IO.iodata_length/1
  • [Kernel] list_to_atom/1, list_to_existing_atom/1, list_to_float/1, list_to_integer/1, list_to_integer/2 and list_to_tuple/1 are deprecated in favor of conversion functions in List
  • [Kernel] tuple_to_list/1 is deprecated in favor of Tuple.to_list/1
  • [List] List.from_char_data/1 and List.from_char_data!/1 deprecated in favor of String.to_char_list/1
  • [String] String.from_char_data/1 and String.from_char_data!/1 deprecated in favor of List.to_string/1
  • Deprecations:
  • [Kernel] is_exception/1, is_record/1 and is_record/2 are deprecated in favor of Exception.exception?1, Record.record?/1 and Record.record?/2
  • [Kernel] defrecord/3 is deprecated in favor of structs
  • [Kernel] :hygiene in quote is deprecated
  • [Mix] Mix.project/0 is deprecated in favor of Mix.Project.config/0
  • [Process] Process.spawn/1, Process.spawn/3, Process.spawn_link/1, Process.spawn_link/3, Process.spawn_monitor/1, Process.spawn_monitor/3, Process.send/2 and Process.self/0 are deprecated in favor of the ones in Kernel
  • Backwards incompatible changes:
  • [Exception] Exceptions now generate structs instead of records
  • [OptionParser] Errors on parsing returns the switch and value as binaries (unparsed)
  • [String] String.to_char_list/1 (previously deprecated) no longer returns a tuple but the char list only and raises in case of failure

New in Elixir 0.13.2 (May 12, 2014)

  • Enhancements:
  • [Application] Add an Application module with common functions to work with OTP applications
  • [Exception] Add Exception.message/1, Exception.format_banner/1, Exception.format_exit/1 and Exception.format/1
  • [File] Add File.ln_s/1
  • [Mix] mix deps.clean now works accross environments
  • [Mix] Support line numbers in mix test, e.g. test/some/file_test.exs:12
  • [Mix] Use @file attributes to detect dependencies in between .ex and external files. This means changing an .eex file will no longer recompile the whole project only the files that depend directly on it
  • [Mix] Support application configurations in config/config.exs which can be customized by specifying your own :config_path
  • [Mix] Support user-wide configuration with ~/.mix/config.exs
  • [Mix] mix help now uses ANSI formatting to print guides
  • [Regex] Support functions in Regex.replace/4
  • [String] Support :parts in String.split/3
  • Bug fixes:
  • [Code] Ensure we don't lose the caller stacktrace on code evaluation
  • [IEx] Exit signals now exits the IEx evaluator and a new one is spawned on its place
  • [IEx] Ensure we don't prune too much stacktrace when reporting failures
  • [IEx] Fix an issue where iex.bat on Windows was not passing the proper parameters forward
  • [Kernel] Ensure modules defined on root respect defined aliases
  • [Kernel] Do not wrap single lists in :__block__
  • [Kernel] Ensure emitted beam code works nicely with dialyzer
  • [Kernel] Do not allow a module named Elixir to be defined
  • [Kernel] Create remote funs even if mod is a variable in capture &mod.fun/arity
  • [Kernel] Improve compiler message when duplicated modules are detected
  • [Mix] Generate .gitignore for --umbrella projects
  • [Mix] Verify if a git dependency in deps has a proper git checkout and clean it automatically when it doesn't
  • [Mix] Ensure mix test works with IEx.pry/0
  • [System] Convert remaining functions in System to rely on char data
  • Soft deprecations (no warnings emitted):
  • [Application] use Application.Behaviour is deprecated in favor of use Application
  • [Exception] exception.message is deprecated in favor Exception.message/1 for retrieving exception messages
  • [Kernel] is_exception/1, is_record/1 and is_record/2 are deprecated in favor of Exception.exception?1, Record.record?/1 and Record.record?/2
  • [Mix] Mix.project/0 is deprecated in favor of Mix.Project.config/0
  • [Process] Process.spawn/1, Process.spawn/3, Process.spawn_link/1, Process.spawn_link/3, Process.spawn_monitor/1, Process.spawn_monitor/3, Process.send/2 and Process.self/0 are deprecated in favor of the ones in Kernel
  • Deprecations:
  • [IEx] IEx.Options is deprecated in favor of IEx.configure/1 and IEx.configuration/0
  • [Kernel] lc and bc comprehensions are deprecated in favor of for
  • [Macro] Macro.safe_terms/1 is deprecated
  • [Process] Process.delete/0 is deprecated
  • [Regex] Deprecate :global option in Regex.split/3 in favor of parts: :infinity
  • [String] Deprecate :global option in String.split/3 in favor of parts: :infinity
  • Backwards incompatible changes:
  • [ExUnit] ExUnit.Test and ExUnit.TestCase has been converted to structs
  • [ExUnit] The test and callback context has been converted to maps
  • [Kernel] File.Stat, HashDict, HashSet, Inspect.Opts, Macro.Env, Range, Regex and Version.Requirement have been converted to structs. This means is_record/2 checks will no longer work, instead, you can pattern match on them using %Range{} and similar
  • [URI] The URI.Info record has now become the URI struct
  • [Version] The Version.Schema record has now become the Version struct

New in Elixir 0.13.1 (Apr 28, 2014)

  • Enhancements:
  • [Mix] Support MIX_EXS as configuration for running the current mix.exs file
  • [Mix] Support Hex out of the box. This means users do not need to install Hex directly, instead, Mix will prompt whenever there is a need to have Hex installed
  • Bug fixes:
  • [ExUnit] Ensure doctest failures are properly reported
  • [Kernel] Fix a bug where comprehensions arguments were not properly take into account in the variable scope
  • [Mix] Fix issue on rebar install when the endpoint was redirecting to a relative uri
  • Deprecations:
  • [Kernel] iolist_size and iolist_to_binary are deprecated in favor of iodata_size and iodata_to_binary (this is a soft deprecation, no warnings will be emitted)
  • [Mix] :env key in project configuration is deprecated
  • [Regex] Regex.groups/1 is deprecated in favor of Regex.names/1
  • [String] String.to_char_list/1 is deprecated in favor of List.from_char_data/1 (this is a soft deprecation, no warnings will be emitted)
  • [String] String.from_char_list/1 is deprecated in favor of String.from_char_data/1 (this is a soft deprecation, no warnings will be emitted)
  • Backwards incompatible changes:
  • [Macro] Macro.unpipe/1 now returns tuples and Macro.pipe/2 was removed in favor of Macro.pipe/3 which explicitly expects the second element of the tuple returned by the new Macro.unpipe/1
  • [Path] The functions in Path now only emit strings as result, regardless if the input was a char list or a string
  • [Path] Atoms are no longer supported in Path functions
  • [Regex] Regexes are no longer unicode by default. Instead, they must be explicitly marked with the u option

New in Elixir 0.13.0 (Apr 22, 2014)

  • Enhancements:
  • [Base] Add Base module which does conversions to bases 16, 32, hex32, 64 and url64
  • [Code] Add Code.eval_file/2
  • [Collectable] Add the Collectable protocol that empowers Enum.into/2 and Stream.into/2 and the :into option in comprehensions
  • [Collectable] Implement Collectable for lists, dicts, bitstrings, functions and provide both File.Stream and IO.Stream
  • [EEx] Add handle_body/1 callback to EEx.Engine
  • [Enum] Add Enum.group_by/2, Enum.into/2, Enum.into/3, Enum.traverse/2 and Enum.sum/2
  • [ExUnit] Randomize cases and tests suite runs, allow seed configuration and the --seed flag via mix test
  • [ExUnit] Support --only for filtering when running tests with mix test
  • [ExUnit] Raise an error if another capture_io process already captured the device
  • [ExUnit] Improve formatter to show source code and rely on lhs and rhs (instead of expected and actual)
  • [IEx] Allow prompt configuration with the :prompt option
  • [IEx] Use werl on Windows
  • [Kernel] Support ERL_PATH in bin/elixir
  • [Kernel] Support interpolation in keyword syntax
  • [Map] Add a Map module and support 17.0 maps and structs
  • [Mix] Add dependency option :only to specify the dependency environment. mix deps.get and mix deps.update works accross all environment unless --only is specified
  • [Mix] Add Mix.Shell.prompt/1
  • [Mix] Ensure the project is compiled in case Mix' CLI cannot find a task
  • [Node] Add Node.ping/1
  • [Process] Include Process.send/3 and support the --gen-debug option
  • [Regex] Regexes no longer need the "g" option when there is a need to use named captures
  • [Stream] Add Stream.into/2 and Stream.into/3
  • [StringIO] Add a StringIO module that allows a String to be used as IO device
  • [System] Add System.delete_env/1 to remove a variable from the environment
  • Bug fixes:
  • [CLI] Ensure --app is handled as an atom before processing
  • [ExUnit] Ensure ExUnit.Assertions does not emit compiler warnings for assert_receive
  • [Kernel] Ensure the same pid is not queued twice in the parallel compiler
  • [Macro] Macro.to_string/2 considers proper precedence when translating !(foo > bar) into a string
  • [Mix] Automatically recompile on outdated Elixir version and show proper error messages
  • [Mix] Ensure generated .app file includes core dependencies
  • [Mix] Allow a dependency with no SCM to be overridden
  • [Mix] Allow queries in mix local.install URL
  • [OptionParser] Do not recognize undefined aliases as switches
  • Deprecations:
  • [Dict] Dict.empty/1, Dict.new/1 and Dict.new/2 are deprecated
  • [Exception] Exception.normalize/1 is deprecated in favor of Exception.normalize/2
  • [Kernel] lc and bc comprehensions are deprecated in favor of for (this is a soft deprecation, no warning will be emitted)
  • [ListDict] ListDict is deprecated in favor of Map (this is a soft deprecation, no warning will be emitted)
  • [Record] defrecord/2, defrecordp/3, is_record/1 and is_record/2 macros in Kernel are deprecated. Instead, use the new macros and API defined in the Record module (this is a soft deprecation, no warnings will be emitted)
  • Backwards incompatible changes:
  • [ExUnit] Formatters are now required to be a GenEvent and ExUnit.run/2 returns a map with results

New in Elixir 0.12.4 (Feb 12, 2014)

  • Enhancements:
  • [Mix] mix deps.get and mix deps.update no longer compile dependencies afterwards. Instead, they mark the dependencies which are going to be automatically compiled next time deps.check is invoked (which is done automatically by most mix tasks). This means users should have a better workflow when migrating in between environments
  • Deprecations:
  • [Kernel] // for default arguments is deprecated in favor of \\
  • [Kernel] Using % for sigils is deprecated in favor of ~. This is a soft deprecation, no warnings will be emitted for it in this release
  • [Kernel] Using ^ inside function clause heads is deprecated, please use a guard instead
  • Backwards incompatible changes:
  • [ExUnit] CaptureIO returns an empty string instead of nil when there is no capture
  • [Version] The Version module now only works with SemVer. The functions Version.parse/1 and Version.parse_requirement/1 now return {:ok,res} | :error for the cases you want to handle non SemVer cases manually. All other functions will trigger errors on non semantics versions

New in Elixir 0.12.3 (Feb 3, 2014)

  • Enhancements:
  • [Kernel] Warnings now are explicitly tagged with "warning:" in messages
  • [Kernel] Explicit functions inlined by the compiler, including operators. This means that Kernel.+/2 will now expand to :erlang.+/2 and so on
  • [Mix] Do not fail if a Mix dependency relies on an outdated Elixir version
  • [Process] Add Process.send/2 and Process.send_after/3
  • [Version] Add Version.compare/2
  • Bug fixes:
  • [Atom] Inspect :... and :foo@bar without quoting
  • [Keyword] The list [1, 2, three: :four] now correctly expands to [1, 2, {:three, :four}]
  • [Kernel] Ensure undefined @attributes shows proper stacktrace in warnings
  • [Kernel] Guarantee nullary funs/macros are allowed in guards
  • [Process] Ensure monitoring functions are inlined by the compiler
  • Deprecations:
  • [IEx] The helper m/0 has been deprecated. The goal is to group all runtime statistic related helpers into a single module
  • [Kernel] binary_to_term/1, binary_to_term/2, term_to_binary/1 and term_to_binary/2 are deprecated in favor of their counterparts in the :erlang module
  • [Kernel] // for default arguments is deprecated in favor of \\. This is a soft deprecation, no warnings will be emitted for it in this release
  • [Kernel] Deprecated @behavior in favor of @behaviour
  • [Record] to_keywords, getter and list getter functionalities in defrecordp are deprecated
  • [Record] Record.import/2 is deprecated
  • Backwards incompatible changes:
  • [Dict] Implementations of equal?/2 and merge/2 in HashDict and ListDict are no longer polymorphic. To get polymorphism, use the functions in Dict instead
  • [File] File.cp/3 and File.cp_r/3 no longer carry Unix semantics where the function behaves differently if the destination is an existing previous directory or not. It now always copies source to destination, doing it recursively in the latter
  • [IEx] IEx now loads the .iex.exs file instead of .iex
  • [Kernel] Remove ** from the list of allowed operators
  • [Kernel] Limit sigils delimiters to one of the following: , {}, [], (), ||, //, " and '
  • [Range] Range is no longer a record, instead use first .. last if you need pattern matching
  • [Set] Implementations of difference/2, disjoint?/2, equal?/2, intersection/2, subset?/2 and union/2 in HashSet are no longer polymorphic. To get polymorphism, use the functions in Set instead

New in Elixir 0.12.2 (Jan 15, 2014)

  • Enhancements:
  • [EEx] Allow EEx.AssignsEngine to accept any Dict
  • [Enum] Add Enum.flat_map_reduce/3
  • [ExUnit] Support @moduletag in ExUnit cases
  • [Kernel] Improve stacktraces to be relative to the compilation path and include the related application
  • [Stream] Add Stream.transform/3
  • Bug fixes:
  • [ExUnit] :include in ExUnit only has effect if a test was previously excluded with :exclude
  • [ExUnit] Only run setup_all and teardown_all if there are tests in the case
  • [Kernel] Ensure bitstring modifier arguments are expanded
  • [Kernel] Ensure compiler does not block on missing modules
  • [Kernel] Ensure /2 works only with binaries
  • [Kernel] Fix usage of string literals inside when utf8/utf16/utf32 is used as specifier
  • [Mix] Ensure mix properly copies _build dependencies on Windows
  • Deprecations:
  • [Enum] Deprecate Enum.first/1 in favor of Enum.at/2 and List.first/1
  • [Kernel] Deprecate continuable heredocs. In previous versions, Elixir would continue parsing on the same line the heredoc started, this behavior has been deprecated
  • [Kernel] is_alive/0 is deprecated in favor of Node.alive?
  • [Kernel] Kernel.inspect/2 with Inspect.Opts[] is deprecated in favor of Inspect.Algebra.to_doc/2
  • [Kernel] Kernel.inspect/2 with :raw option is deprecated, use :records option instead
  • [Kernel] Deprecate

New in Elixir 0.12.1 (Jan 6, 2014)

  • Enhancements:
  • [ExUnit] Support :include and :exclude configuration options to filter which tests should run based on their tags. Those options are also supported via mix test as --include and --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/1 to handle numbers of the form "-0.x"
  • [IEx] Improve error message for IEx.Helpers.r when module does not exist
  • [Mix] Ensure deps.get updates 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.

New in Elixir 0.12.0 (Dec 16, 2013)

  • Enhancements:
  • [Exception] Allow exception/1 to 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/1 and Float.round/3
  • [Kernel] Add List.delete_at/2 and List.updated_at/3
  • [Kernel] Add Enum.reverse/2
  • [Kernel] Implement defmodule/2, @/1, def/2 and friends in Elixir itself. case/2, try/2 and receive/1 have been made special forms. var!/1, var!/2 and alias!/1 have 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/2 and Stream.run/1
  • [Stream] Support Stream.take/2 and Stream.drop/2 with negative counts
  • Bug fixes:
  • [HashDict] Ensure a HashDict stored in an attribute can be accessed via the attribute
  • [Enum] Fix bug in Enum.chunk/4 where you'd get an extra element when the enumerable was a multiple of the counter and a pad was given
  • [IEx] Ensure c/2 helper works with full paths
  • [Kernel] quote location: :keep now only affects definitions in order to keep the proper trace in definition exceptions
  • [Mix] Also symlink include directories in _build dependencies
  • [Version] Fix Version.match?/2 with ~> and versions with alphanumeric build info (like -dev)
  • Deprecations:
  • [Enum] Enumerable.count/1 and Enumerable.member?/2 should now return tagged tuples. Please see Enumerable docs for more info
  • [Enum] Deprecate Enum.chunks/2, Enum.chunks/4 and Enum.chunks_by/2 in favor of Enum.chunk/2, Enum.chunk/4 and Enum.chunk_by/2
  • [File] File.binstream!/3 is deprecated. Simply use File.stream!/3 which is able to figure out if stream or binstream operations should be used
  • [Macro] Macro.extract_args/1 is deprecated in favor of Macro.decompose_call/1
  • Backwards incompatible changes:
  • [Enum] Behaviour of Enum.drop/2 and Enum.take/2 has been switched when given negative counts
  • [Enum] Behaviour of Enum.zip/2 has been changed to stop as soon as the first enumerable finishes
  • [Enum] Enumerable.reduce/3 protocol has changed to support suspension. Please see Enumerable docs for more info
  • [Mix] Require :escript_main_module to be set before generating escripts
  • [Range] Range.Iterator protocol has changed in order to work with the new Enumerable.reduce/3. Please see Range.Iterator docs for more info
  • [Stream] The Stream.Lazy structure has changed to accumulate functions and accumulators as we go (its inspected representation has also changed)
  • [Typespec] when clauses were moved to the outer part of the spec and should be in the keywords format. So add(a, b) when is_subtype(a, integer) and is_subtype(b, integer) :: integer should now be written as add(a, b) :: integer when a: integer, b: integer

New in Elixir 0.11.2 (Nov 14, 2013)

  • Enhancements:
  • [Mix] Add mix iex that redirects users to the proper iex -S mix command
  • [Mix] Support build_per_environment: true in 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

New in Elixir 0.11.1 (Nov 8, 2013)

  • 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
  • Backwards incompatible changes:
  • [Mix] Setting :load_paths in your project configuration is deprecated

New in Elixir 0.10.3 (Oct 3, 2013)

  • 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 new and update also 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 do blocks 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/2 a 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: false is a valid mechanism for disabling the compilation of dependencies
  • [Regex] Fix bug on Regex.scan/3 when capturing groups and the regex has no groups
  • [String] Fix a bug with String.split/2 when 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/3 is deprecated in favor of Regex.named_captures/3
  • [String] String.valid_codepoint?/1 is deprecated in favor of pattern matching with
  • Backwards incompatible changes:
  • [IEx] The r/0 helper has been removed as it caused surprising behaviour when many modules with dependencies were accumulated
  • [Mix] Mix.Version was renamed to Version
  • [Mix] File.IteratorError was renamed to IO.StreamError
  • [Mix] mix new now defaults to the --sup option, use --bare to get the previous behaviour

New in Elixir 0.10.2 (Sep 4, 2013)

  • Enhancements:
  • [CLI] Add --verbose to elixirc, which now is non-verbose by default
  • [Dict] Add Dict.Behaviour as 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/1 and Enum.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 h helper
  • [IEx] Helpers r and c can handle erlang sources
  • [Integer] Add odd?/1 and even?/1
  • [IO] Added support to specifying a number of bytes to stream to IO.stream, IO.binstream, File.stream! and File.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? and bar! 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/2 to 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 re options when compiling Elixir regexes
  • [Stream] Add Stream.concat/1, Stream.concat/2 and Stream.flat_map/2
  • [String] Add regex pattern support to String.replace/3
  • [String] Add String.ljust/2, String.rjust/2, String.ljust/3 and String.rjust/3
  • [URI] URI.parse/1 supports 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 inspect results 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/end blocks
  • [List] Fix bug on List.insert_at/3 that added the item at the wrong position for negative indexes
  • [Macro] Macro.escape/2 can now escape improper lists
  • [Mix] Fix Mix.Version matching on pre-release info
  • [Mix] Ensure watch_exts trigger full recompilation on change with mix compile
  • [Mix] Fix regression on mix clean --all
  • [String] String.strip/2 now supports removing unicode characters
  • [String] String.slice/3 still returns the proper result when there is no length to be extracted
  • [System] System.get_env/0 now returns a list of tuples as previously advertised
  • Deprecations:
  • [Dict] Dict.update/3 is deprecated in favor of Dict.update!/3
  • [Enum] Enum.min/2 and Enum.max/2 are deprecated in favor of Enum.min_by/2 and Enum.max_by/2
  • [Enum] Enum.join/2 and Enum.map_join/3 with a char list are deprecated
  • [IO] IO.stream(device) and IO.binstream(device) are deprecated in favor of IO.stream(device, :line) and IO.binstream(device, :line)
  • [Kernel] list_to_binary/1, binary_to_list/1 and binary_to_list/3 are deprecated in favor of String.from_char_list!/1 and String.to_char_list!/1 for characters and :binary.list_to_bin/1, :binary.bin_to_list/1 and :binary.bin_to_list/3 for bytes
  • [Kernel] to_binary/1 is deprecated in favor of to_string/1
  • [Kernel] Deprecate def/4 and friends in favor of def/2 with unquote and friends
  • [Kernel] Deprecate %b and %B in favor of %s and %S
  • [List] List.concat/2 is deprecated in favor of Enum.concat/2
  • [Macro] Macro.unescape_binary/1 and Macro.unescape_binary/2 are deprecated in favor of Macro.unescape_string/1 and Macro.unescape_string/2
  • [Mix] :umbrella option 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.Chars was renamed to String.Chars
  • [Kernel] The previous ambiguous import syntax import :functions, Foo was removed in favor of import Foo, only: :functions
  • [OptionParser] parse and parse_head now returns a tuple with three elements instead of two

New in Elixir 0.10.1 (Aug 5, 2013)

  • Enhancements:
  • [Behavior] Add support for defmacrocallback/1
  • [Enum] Add Enum.shuffle/1
  • [ExUnit] The :trace option now also reports run time for each test
  • [ExUnit] Add support for :color to enable/disable ANSI coloring
  • [IEx] Add the clear helper 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_helper project configuration did not affect mix test and was therefore removed. A test/test_helper.exs file 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 help now outputs information about the default mix task
  • [Mix] Add --no-deps-check option to mix run, mix compile and friends to not check dependency status
  • [Mix] Add support for MIX_GIT_FORCE_HTTPS system environment that forces HTTPS for known providers, useful when the regular git port is blocked. This configuration does not affect the mix.lock results
  • [Mix] Allow coverage tool to be pluggable via the :test_coverage configuration
  • [Mix] Add mix cmd as a convenience to run a command recursively in child apps in an umbrella application
  • [Mix] Support umbrella: true in dependencies as a convenience for setting up umbrella path deps
  • [Mix] mix run now behaves closer to the elixir command and properly mangles the ARGV
  • [String] Add Regex.scan/3 now supports capturing groups
  • [String] Add String.reverse/1
  • Bug fix:
  • [Behavior] 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_definition can only be a function as it is evaluated inside the function context
  • [Kernel] Ensure %w sigils with no interpolation are fully expanded at compile time
  • [Mix] mix deps.update, mix deps.clean and mix deps.unlock no longer change all dependencies unless --all is given
  • [Mix] Always run mix loadpaths on mix app.start, even if --no-compile is 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 :keep and :integer|:float can be given together as options
  • [OptionParser] Ensure --no-flag sets :flag to false when :flag is a registered boolean switch
  • Deprecations:
  • [Kernel] function(Mod.fun/arity) and function(fun/arity) are deprecated in favor of &Mod.fun/arity and &fun/arity
  • [Kernel] function/3 is deprecated in favor of Module.function/3
  • [Kernel] Kernel.ParallelCompiler now receives a set of callbacks instead of a single one
  • [Mix] :test_coverage option now expect keywords arguments and the --cover flag is now treated as a boolean
  • Backwards incompatible changes:
  • [Regex] Regex.scan/3 now always returns a list of lists, normalizing the result, instead of list with mixed lists and binaries
  • [System] System.halt/2 was removed since the current Erlang implementation of such function is bugged

New in Elixir 0.10.0 (Jul 17, 2013)

  • Enhancements:
  • [ExUnit] Support trace: true option which gives detailed reporting on test runs
  • [HashDict] Optimize HashDict to 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/3 that enables specifying the first element of the tuple
  • [Kernel] Add the Set API and a hash based implementation via HashSet
  • [Kernel] Add Stream as composable, lazy-enumerables
  • [Mix] mix archive now 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 :elixir key 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?/2 does not leak variables to outer scope
  • [Kernel] Keep head|tail format 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/3 no longer automatically changes it to persisted or accumulated
  • Deprecations:
  • [Enum] Receiving the index of iteration in Enum.map/2 and Enum.each/2 is deprecated in favor of Stream.with_index/1
  • [File] File.iterator/1 and File.biniterator/1 are deprecated in favor of IO.stream/1 and IO.binstream/1
  • [File] File.iterator!/2 and File.biniterator!/2 are deprecated in favor of File.stream!/2 and File.binstream!/2
  • [Kernel] Deprecate recently added quote binding: ... in favor of the clearer quote bind_quoted: ...
  • [Kernel] Deprecate Kernel.float/1 in favor of a explicit conversion
  • [Mix] Deprecate mix run EXPR in favor of mix run -e EXPR
  • [Record] Record.__index__/2 deprecated in favor of Record.__record__(:index, key)
  • Backwards incompatible changes:
  • [Kernel] The Binary.Inspect protocol has been renamed to Inspect
  • [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/3 no longer automatically changes it to persisted or accumulated
  • [Record] First element of a record via defrecordp is now the defrecordp name and no longer the current atom
  • [URI] Remove custom URI parsers in favor of URI.default_port/2

New in Elixir 0.9.3 (Jul 2, 2013)

  • enhancements:
  • [File] Add File.chgrp, File.chmod and File.chown
  • [Kernel] Add --warnings-as-errors to Elixir's compiler options
  • [Kernel] Print warnings to stderr
  • [Kernel] Warn on undefined module attributes
  • [Kernel] Emit warning for x in [] in guards
  • [Kernel] Add binding/0 and binding/1 for retrieving bindings
  • [Kernel] quote now allows a binding as an option
  • [Macro] Add Macro.expand_once/2 and Macro.expand_all/2
  • [Mix] Implement Mix.Version for basic versioning semantics
  • [Mix] Support creation and installation of archives (.ez files)
  • [Mix] github: ... shortcut now uses the faster git schema instead of https
  • [Record] Allow types to be given to defrecord and defrecordp
  • bug fix:
  • [Kernel] The elixir executable on Windows now supports the same options as the UNIX one
  • [Kernel] Improve error messages on default clauses clash
  • [Kernel] __MODULE__.Foo now returns Foo when outside of a Module
  • [Kernel] Improve error messages when default clauses from different definitions collide
  • [Kernel] ^x variables should always refer to the value before the expression
  • [Kernel] Allow (x, y) when z in function clauses and try expressions
  • [Mix] Mix now properly evaluates rebar scripts
  • deprecations:
  • [Code] Code.string_to_ast/1 has been deprecated in favor of Code.string_to_quoted/1
  • [Macro] Macro.to_binary/1 has been deprecated in favor of Macro.to_string/1
  • [Typespec] Deprecate (fun(...) -> ...) in favor of (... -> ...)
  • backwards incompatible changes:
  • [Bitwise] Precedence of operators used by the Bitwise module were changed. Check elixir_parser.yrl for more information.
  • [File] rm_rf and cp_r now returns a tuple with three elements on failures
  • [Kernel] The quoted representation for -> clauses changed from a tuple with two elements to a tuple with three elements to support metadata
  • [Kernel] Sigils now dispatch to sigil_$ instead of __$__ where $ is the sigil caracter
  • [Macro] Macro.expand/2 now expands until final form. Although this is backwards incompatible, it is very likely you do not need to change your code, since expansion until its final form is recommended, particularly if you are expecting an atom out of it
  • [Mix] No longer support beam files on mix local

New in Elixir 0.9.2 (Jun 13, 2013)

  • enhancements:
  • [ExUnit] capture_io now captures prompt by default
  • [Mix] Automatically import git dependencies from Rebar
  • [Mix] Support for dependencies directly from the umbrella application
  • [Regex] Add Regex.escape
  • [String] Add String.contains?
  • [URI] Implement Binary.Chars (aka to_binary) for URI.Info
  • bug fix:
  • [HashDict] Ensure HashDict uses exact match throughout its implementation
  • [IEx] Do not interpret ANSI codes in IEx results
  • [IEx] Ensure --cookie is set before accessing remote shell
  • [Kernel] Do not ignore nil when dispatching protocols to avoid infinite loops
  • [Mix] Fix usage of shell expressions in Mix.Shell.cmd
  • [Mix] Start the application by default on escripts
  • deprecations:
  • [Regex] Regex.index/2 is deprecated in favor Regex.run/3
  • [Kernel] super no longer supports implicit arguments
  • backwards incompatible changes:
  • [Kernel] The =~ operator now returns true or false instead of an index

New in Elixir 0.9.1 (Jun 7, 2013)

  • enhancements:
  • [IEx] Limit the number of entries kept in history and allow it to be configured
  • [Kernel] Add String.start_with? and String.end_with?
  • [Typespec] Allow keywords, e.g. [foo: integer, bar: boolean | module], in typespecs
  • bug fix:
  • [Dict] Enum.to_list and Dict.to_list now return the same results for dicts
  • [IEx] Enable shell customization via the IEx.Options module
  • [Kernel] Fix a bug where unquote_splicing did not work on the left side of a stab op
  • [Kernel] Unused functions with cyclic dependencies are now also warned as unused
  • [Mix] Fix a bug where mix deps.get was not retrieving nested dependencies
  • [Record] Fix a bug where nested records cannot be defined
  • [Record] Fix a bug where a record named Record cannot be defined

New in Elixir 0.9.0 (May 24, 2013)

  • enhancements:
  • [ExUnit] ExUnit.CaptureIO now accepts an input to be used during capture
  • [IEx] Add support for .iex files that are loaded during shell's boot process
  • [IEx] Add import_file/1 helper
  • backwards incompatible changes:
  • [Enum] Enum.Iterator was replaced by the more composable and functional Enumerable protocol which supports reductions
  • [File] File.iterator/1 and File.biniterator/1 have been removed in favor of the safe File.iterator!/1 and File.biniterator!/1 ones
  • [Kernel] Erlang R15 is no longer supported
  • [Kernel] Elixir modules are now represented as Elixir.ModuleName (using . instead of - as separator)

New in Elixir 0.8.3 (May 22, 2013)

  • enhancements:
  • [CLI] Flags `-p` and `-pr` fails if pattern match no files
  • [CLI] Support `--hidden` and `--cookie` flags for distributed Erlang
  • [Enum] Add `Enum.to_list/1`, `Enum.member?/2`, `Enum.uniq/2`, `Enum.max/1`, `Enum.max/2`, `Enum.min/1` and `Enum.min/2`
  • [ExUnit] Add `ExUnit.CaptureIO` for IO capturing during tests
  • [ExUnit] Consider load time on ExUnit time reports
  • [IEx] Support `ls` with colored output
  • [IEx] Add `#iex:break` to break incomplete expressions
  • [Kernel] Add `Enum.at`, `Enum.fetch` and `Enum.fetch!`
  • [Kernel] Add `String.to_integer` and `String.to_float`
  • [Kernel] Add `Dict.take`, `Dict.drop`, `Dict.split`, `Dict.pop` and `Dict.fetch!`
  • [Kernel] Many optimizations for code compilation
  • [Kernel] `in` can be used with right side expression outside guards
  • [Kernel] Add `Node.get_cookie/0` and `Node.set_cookie/2`
  • [Kernel] Add `__DIR__`
  • [Kernel] Expand macros and attributes on quote, import, alias and require
  • [Kernel] Improve warnings related to default arguments
  • [Keyword] Add `Keyword.delete_first/2`
  • [Mix] Add `local.rebar` to download a local copy of rebar, and change `deps.compile` to use it if needed
  • [Mix] Support umbrella applications
  • [Mix] Load beam files available at `MIX_PATH` on CLI usage
  • [String] Add `String.valid?` and `String.valid_character?`
  • bug fix:
  • [ExUnit] Handle exit messages from in ExUnit
  • [ExUnit] Failures on ExUnit's setup_all now invalidates all tests
  • [Kernel] Ensure we don't splice keyword args unecessarily
  • [Kernel] Private functions used by private macros no longer emit an unused warning
  • [Kernel] Ensure Elixir won't trip on empty receive blocks
  • [Kernel] `String.slice` now returns an empty string when out of range by 1
  • [Mix] Generate manifest files after compilation to avoid depending on directory timestamps and to remove unused .beam files
  • [Path] `Path.expand/2` now correctly expands `~` in the second argument
  • [Regex] Fix badmatch with `Regex.captures(%r/(.)/g, "cat")`
  • [URI] Downcase host and scheme and URIs
  • deprecations:
  • [Code] `Code.eval` is deprecated in favor of `Code.eval_string`
  • [Exception] `Exception.format_entry` is deprecated in favor of `Exception.format_stacktrace_entry`
  • [ExUnit] `assert left inlist right` is deprecated in favor of `assert left in right`
  • [IO] `IO.getb` is deprecated in favor of `IO.getn`
  • [List] `List.member?/2` is deprecated in favor of `Enum.member?/2`
  • [Kernel] `var_context` in quote was deprecated in favor of `context`
  • [Kernel] `Enum.at!` and `Dict.get!` is deprecated in favor of `Enum.fetch!` and `Dict.fetch!`
  • backwards incompatible changes:
  • [Dict] `List.Dict` was moved to `ListDict`
  • [IO] `IO.gets`, `IO.getn` and friends now return binaries when reading from stdio
  • [Kernel] Precedence of `|>` has changed to lower to support constructs like `1..5 |> Enum.to_list`
  • [Mix] `mix escriptize` now receives arguments as binaries

New in Elixir 0.8.2 (Apr 22, 2013)

  • enhancements:
  • [ExUnit] Use ANSI escape codes in CLI output
  • [ExUnit] Include suite run time on CLI results
  • [ExUnit] Add support to doctests, allowing test cases to be generated from code samples
  • [File] Add `File.ls` and `File.ls!`
  • [IEx] Support `pwd` and `cd` helpers
  • [Kernel] Better error reporting for invalid bitstring generators
  • [Kernel] Improve meta-programming by allowing `unquote` on `def/2`, `defp/2`, `defmacro/2` and `defmacrop/2`
  • [Kernel] Add support to R16B new functions: `insert_elem/3` and `delete_elem/2`
  • [Kernel] Import conflicts are now lazily handled. If two modules import the same functions, it will fail only if the function is invoked
  • [Mix] Support `--cover` on mix test and `test_coverage` on Mixfiles
  • [Record] Each record now provides `Record.options` with the options supported by its `new` and `update` functions
  • bug fix:
  • [Binary] inspect no longer escapes standalone hash `#`
  • [IEx] The `h` helper can now retrieve docs for special forms
  • [Kernel] Record optimizations were not being triggered in functions inside the record module
  • [Kernel] Aliases defined inside macros should be carried over
  • [Kernel] Fix a bug where nested records could not use the Record[] syntax
  • [Path] Fix a bug on `Path.expand` when expanding paths starting with `~`
  • deprecations:
  • [Kernel] `setelem/3` is deprecated in favor of `set_elem/3`
  • [Kernel] `function(:is_atom, 1)` is deprecated in favor of `function(is_atom/1)`

New in Elixir 0.8.1 (Feb 18, 2013)

  • enhancements:
  • [ExUnit] Tests can now receive metadata set on setup/teardown callbacks
  • [ExUnit] Add support to ExUnit.CaseTemplate to share callbacks in between test cases
  • [IO] Add IO.ANSI to make it easy to write ANSI escape codes
  • [Kernel] Better support for Unicode lists
  • [Kernel] Reduce variables footprint in case/receive clauses
  • [Kernel] Disable native compilation when on_load attributes is present to work around an Erlang bug
  • [Macro] Macro.expand also considers macros from the current __ENV__ module
  • [Mix] Improve support for compilation of .erl files
  • [Mix] Add support for compilation of .yrl and .xrl files
  • [OptionParser] Switches are now overridden by default but can be kept in order if chosen
  • [Typespec] Better error reporting for invalid typespecs
  • bug fix:
  • [Mix] Allow Mix projects to be generated with just one letter
  • backwards incompatible changes:
  • [Kernel] before_compile and after_compile callbacks now receive the environment as first argument instead of the module
  • deprecations:
  • [ExUnit] Explicitly defined test/setup/teardown functions are deprecated
  • [Kernel] Tidy up and clean quote API
  • [Kernel] Old :local.(args) syntax is deprecated
  • [Process] Process.self is deprecated in favor Kernel.self

New in Elixir 0.8.0 (Jan 29, 2013)

  • enhancements:
  • [Binary] Support > as in Erlang
  • [Binary] Support \a escape character in binaries
  • [Binary] Support syntax shortcut for specifying size in bit syntax
  • [CLI] Support --app option to start an application and its dependencies
  • [Dict] Support put_new in Dict and Keyword
  • [Dict] Add List.Dict and a faster HashDict implementation
  • [ExUnit] ExUnit now supports multiple runs in the same process
  • [ExUnit] Failures in ExUnit now shows a tailored stacktrace
  • [ExUnit] Introduce ExUnit.ExpectationError to provide better error messages
  • [Kernel] Introduce Application.Behaviour to define application module callbacks
  • [Kernel] Introduce Supervisor.Behaviour to define supervisors callbacks
  • [Kernel] More optimizations were added to Record handling
  • [Kernel] ?\x and ?\ are now supported ways to retrieve a codepoint
  • [Kernel] Octal numbers can now be defined as 0777
  • [Kernel] Improve macros hygiene regarding variables, aliases and imports
  • [Mix] Mix now starts the current application before run, iex, test and friends
  • [Mix] Mix now provides basic support for compiling .erl files
  • [Mix] mix escriptize only generates escript if necessary and accept --force and --no-compile as options
  • [Path] Introduce Path module to hold filesystem paths related functions
  • [String] Add String.capitalize and String.slice
  • [System] Add System.tmp_dir, System.cwd and System.user_home
  • bug fix:
  • [Kernel] import with only accepts functions starting with underscore
  • [String] String.first and String.last return nil for empty binaries
  • [String] String.rstrip and String.lstrip now verify if argument is a binary
  • [Typespec] Support ... inside typespec's lists
  • backwards incompatible changes:
  • [Kernel] The AST now allows metadata to be attached to each node. This means the second item in the AST is no longer an integer (representing the line), but a keywords list. Code that relies on the line information from AST or that manually generate AST nodes need to be properly updated
  • deprecations:
  • [Dict] Deprecate Binary.Dict and OrdDict in favor of HashDict and List.Dict
  • [File] Deprecate path related functions in favor of the module Path
  • [Kernel] The /> operator has been deprecated in favor of |>
  • [Mix] Mix.Project.sources is deprecated in favor of Mix.Project.config_files
  • [Mix] mix iex is no longer functional, please use iex -S mix
  • [OptionParser] :flags option was deprecated in favor of :switches to support many types

New in Elixir 0.7.2 (Dec 5, 2012)

  • enhancements:
  • [CLI] --debug-info is now true by default
  • [ExUnit] Make ExUnit exit happen in two steps allowing developers to add custom at_exit hooks
  • [IEx] Many improvements to helpers functions h/1, s/1 and others
  • [Kernel] Functions defined with fn can now handle many clauses
  • [Kernel] Raise an error if clauses with different arities are defined in the same function
  • [Kernel] function macro now accepts arguments in M.f/a and f/a formats
  • [Macro] Improvements to Macro.to_binary
  • [Mix] Mix now echoes the output as it comes when executing external commands such as git or rebar
  • [Mix] Mix now validates application callback's values
  • [Record] Record accessors are now optimized and can be up to 6x faster in some cases
  • [String] Support \xXX and \x{HEX} escape sequences in strings, char lists and regexes
  • bug fix:
  • [Bootstrap] Compiling Elixir source no longer fails if environment variables contain utf-8 entries
  • [IEx] IEx will now wait for all command line options to be processed before starting
  • [Kernel] Ensure proper stacktraces when showing deprecations
  • deprecations:
  • [Enum] Enum.qsort is deprecated in favor of Enum.sort
  • [ExUnit] assert left in right is deprecated in favor of assert left inlist right
  • [List] List.sort and List.uniq have been deprecated in favor of their Enum counterparts
  • [Record] Default-based generated functions are deprecated
  • [Typespec] Enhancements and deprecations to the @spec/@callback and the fun type syntax

New in Elixir 0.6.0 (Sep 5, 2012)

  • incompatible changes:
  • [Kernel] Compiled files now follow Elixir-ModuleName convention to solve issues with Erlang embedded mode. This removes the __MAIN__ pseudo-variable as modules are now located inside Elixir namespace
  • [Kernel] __using__ callback triggered by use now receives just one argument. Caller information can be accessed via macros using __CALLER__
  • [Module] Removed data functions in favor of unifying the attributes API
  • [Kernel] Comprehensions syntax changed to be more compatible with Erlang behavior
  • [Kernel] loop and recur were removed in favor of recursion with named functions
  • deprecations:
  • [Access] The semantics of the access protocol were reduced from a broad query API to simple data structure key-based access
  • [Module] Module.add_compile_callback(module, target, callback) was deprecated in favor of Module.add_attribute(module, :before_compile, { target, callback })
  • [Module] Module.function_defined? was deprecated in favor of Module.defines?
  • [Module] Module.defined_functions was deprecated in favor of Module.definitions_in
  • [File] File.read_info was deprecated in favor of File.stat
  • [IO] IO.print was deprecated in favor of IO.write
  • [Kernel] Deprecated __LINE__ and __FUNCTION__ in favor of __ENV__.line and __ENV__.function
  • [Kernel] Deprecated in_guard in favor of __CALLER__.in_guard?
  • [Kernel] refer is deprecated in favor of alias
  • [ExUnit] Some assertions were deprecated in favor of simply using assert()
  • enhancements:
  • [OptionParser] Make OptionParser public, add support to flags and improved switch parsing
  • [Kernel] Operator ! is now allowed in guard clauses
  • [IEx] IEx now provides autocomplete if the OS supports tty
  • [IEx] IEx now supports remsh
  • [Mix] First Mix public release
  • [Regex] Back references are now properly supported
  • [IEx] Elixir now defaults to compile with documentation and d can be used in IEx to print modules and functions documentation
  • [ExUnit] Support setup and teardown callbacks
  • [Kernel] Introduced operator =~ for regular expression matches
  • [Kernel] Compiled docs now include the function signature
  • [Kernel] defmodule do not start a new variable scope, this improves meta-programming capabilities
  • [Range] Added a Range module with support to in operator (x in 1..3) and iterators
  • [Enum] Enhanced Enum protocol to support Enum.count
  • [Module] Added support to @before_compile and @after_compile callbacks. The first receives the module name while the latter receives the module name and its object code
  • [Kernel] quote special form now supports line and unquote as options
  • [Record] Allow Record[_: value] to set a default value to all records fields, as in Erlang
  • [IEx] Functions c and m are available in IEx to compile and print available module information. Functions h and v are available to show history and print previous commands values
  • [Enum] Optimized functions when a list is given as collection
  • [System] Added System.find_executable
  • [Kernel] Document the macro @ and allow attributes to be read inside functions
  • [IO/File] Many improvements to File and IO modules
  • [Macro] Added Macro.expand, useful for debugging what a macro expands to
  • [Enum] Added find_index, nth! and others
  • [Record] Records now provide a to_keywords function
  • [Kernel] Added support to the %R sigil. The same as %r, but without interpolation or escaping. Both implementations were also optimized to generate the regex at compilation time
  • [Kernel] Added __ENV__ which returns a Macro.Env record with information about the compilation environment
  • [Kernel] Added __CALLER__ inside macros which returns a Macro.Env record with information about the calling site