Skip to content

Releases: elixir-lang/elixir

v1.2.3

21 Feb 21:36
Compare
Choose a tag to compare

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

v1.2.2

31 Jan 09:39
Compare
Choose a tag to compare

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

v1.2.1

14 Jan 18:32
Compare
Choose a tag to compare

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

v1.2.0

01 Jan 10:58
Compare
Choose a tag to compare

Official announcement: https://elixir-lang.org/blog/2016/01/03/elixir-v1-2-0-released/

1. 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 <- in for comprehensions
  • [Kernel] Introduce with as a special form that allows matching on right side parameters
  • [Kernel] Warn when right hand 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

2. 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

3. 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

v1.1.1

28 Sep 21:37
Compare
Choose a tag to compare

Bug fixes

  • [Enum] Fix non-integer member checks with ranges
  • [ExUnit] Fix assertion errors with more than 1 pinned var
  • [Mix] Ensure umbrella apps can boot when build_embedded is true

v1.1.0

25 Sep 08:57
Compare
Choose a tag to compare

Official announcement: https://elixir-lang.org/blog/2015/09/28/elixir-v1-1-0-released/

1. 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.reduce_while/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
  • [Process] Allow a list of specs in Process.info/2
  • [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 <% and right side %> 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"
  • [ExUnit] Add tests without implementation (missing the do block) which automatically fail. Such tests are also automatically tagged as :not_implemented, allowing them to be skipped
  • [ExUnit] Increase by default stacktrace depth to 20 (this value is also configurable)
  • [ExUnit] Improve formatting on assert_raise errors for message mismatch
  • [ExUnit] Improve formatting on assert_receive when using pinned variables

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

2. 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
  • [File] Ensure File.touch/2 and File.stat/2 receive and return universal times. Previously they would work with local times which are not monotonically increasing, which could present issues on scripts. If the times are being shown to the user, time: :local can be given as argument
  • [Float] Support complete scientific notation in Float.parse/1
  • [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, &not/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
  • [Kernel] Raise if arity bigger than 255 is given to capture operator
  • [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
  • [Stream] Ensure suspending Stream.flat_map/2 and Stream.transform/3 does not consume unecessary items from the given enumerable

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

3. 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 cha...
Read more

v1.0.5

29 Jun 08:04
Compare
Choose a tag to compare

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

v1.0.4

07 Apr 21:40
Compare
Choose a tag to compare

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

v1.0.3

12 Feb 10:12
Compare
Choose a tag to compare

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

v1.0.2

21 Oct 17:36
Compare
Choose a tag to compare

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