v1.4.0

@josevalim josevalim released this Jan 4, 2017 · 175 commits to master since this release

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

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

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

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

Downloads