Skip to content

Commit 09dcbf7

Browse files
committed
Introduce deprecations scheduled for Elixir v1.20
1 parent c001cbd commit 09dcbf7

File tree

17 files changed

+152
-111
lines changed

17 files changed

+152
-111
lines changed

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,17 @@ The type system was made possible thanks to a partnership between [CNRS](https:/
4444

4545
### 4. Hard deprecations
4646

47+
#### Elixir
48+
49+
* [File] `File.stream!(path, modes, lines_or_bytes)` is deprecated in favor of the correct order in `File.stream!(path, lines_or_bytes, modes)`
50+
* [Kernel] Matching on the size inside a bit pattern now requires the pin operator for consistency, such as `<<x::size(^existing_var)>>`
51+
* [Kernel.ParallelCompiler] `Kernel.ParallelCompiler.async/1` is deprecated in favor of `Kernel.ParallelCompiler.pmap/2`, which is more performant and deals better with edge cases
52+
53+
#### Logger
54+
55+
* [Logger] `Logger.*_backend` functions are deprecated in favor of handlers. If you really want to keep on using backends, see the `:logger_backends` package
56+
* [Logger] `Logger.enable/1` and `Logger.disable/1` have been deprecated in favor of `Logger.put_process_level/1` and `Logger.delete_process_level/1`
57+
4758
## v1.19
4859

4960
The CHANGELOG for v1.19 releases can be found [in the v1.19 branch](https://github.com/elixir-lang/elixir/blob/v1.19/CHANGELOG.md).

lib/elixir/lib/file.ex

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2159,7 +2159,12 @@ defmodule File do
21592159
def stream!(path, line_or_bytes, modes)
21602160

21612161
def stream!(path, modes, line_or_bytes) when is_list(modes) do
2162-
# TODO: Deprecate this on Elixir v1.20
2162+
# TODO: Remove me on Elixir 2.0
2163+
IO.warn(
2164+
"File.stream!(path, modes, line_or_byte) is deprecated, " <>
2165+
"invoke File.stream!(path, line_or_bytes, modes) instead"
2166+
)
2167+
21632168
stream!(path, line_or_bytes, modes)
21642169
end
21652170

lib/elixir/lib/kernel/parallel_compiler.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ defmodule Kernel.ParallelCompiler do
1919
@doc """
2020
Starts a task for parallel compilation.
2121
"""
22-
# TODO: Deprecate this on Elixir v1.20.
23-
@doc deprecated: "Use `pmap/2` instead"
22+
# TODO: Remove me on Elixir 2.0
23+
@deprecated "Use `pmap/2` instead"
2424
def async(fun) when is_function(fun, 0) do
2525
{ref, task} = inner_async(fun)
2626
send(task.pid, ref)

lib/elixir/pages/references/compatibility-and-deprecations.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,11 @@ The first column is the version the feature was hard deprecated. The second colu
9090

9191
Version | Deprecated feature | Replaced by (available since)
9292
:-------| :-------------------------------------------------- | :---------------------------------------------------------------
93+
[v1.20] | `<<x::size(y)>>` in patterns without `^` | `<<x::size(^y)>>`
94+
[v1.20] | `File.stream!(path, modes, lines_or_bytes)` | `File.stream!(path, lines_or_bytes, modes)`
95+
[v1.20] | `Kernel.ParallelCompiler.async/1` | `Kernel.ParallelCompiler.pmap/2`
96+
[v1.20] | `Logger.*_backend` functions | The `LoggerBackends` module from `:logger_backends` package
97+
[v1.20] | `Logger.enable/1` / `Logger.disable/1` | `Logger.put_process_level/1` and `Logger.delete_process_level/1`
9398
[v1.19] | CLI configuration in `def project` inside `mix.exs` | Moving it to `def cli` (v1.14)
9499
[v1.19] | Using `,` to separate tasks in `mix do` | Using `+` (v1.14)
95100
[v1.19] | Logger's `:backends` configuration | Logger's `:default_handler` configuration (v1.15)

lib/elixir/src/elixir_expand.erl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -424,8 +424,7 @@ expand({Name, Meta, Kind}, S, E) when is_atom(Name), is_atom(Kind) ->
424424

425425
is_map_key(Pair, Pre) ->
426426
%% TODO: Remove me on Elixir 2.0
427-
%% TODO: Deprecate me on Elixir 1.20
428-
%% elixir_errors:file_warn(Meta, E, ?MODULE, {unpinned_bitsize_var, Name, Kind}),
427+
elixir_errors:file_warn(Meta, E, ?MODULE, {unpinned_bitsize_var, Name, Kind}),
429428
{ok, CurrentVersion};
430429

431430
not is_map_key(Pair, Original) ->

lib/elixir/test/elixir/file/stream_test.exs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ defmodule File.StreamTest do
1717
:erpc.call(node, File, :stream!, [src, lines_or_bytes_or_modes])
1818
end
1919

20-
defp stream!(node, src, lines_or_bytes, modes) do
21-
:erpc.call(node, File, :stream!, [src, lines_or_bytes, modes])
20+
defp stream!(node, src, modes, lines_or_bytes) do
21+
:erpc.call(node, File, :stream!, [src, modes, lines_or_bytes])
2222
end
2323

2424
distributed_node = :"secondary@#{node() |> Atom.to_string() |> :binary.split("@") |> tl()}"
@@ -46,7 +46,7 @@ defmodule File.StreamTest do
4646
assert stream.modes == [:raw, {:read_ahead, 5000}, :binary]
4747
assert stream.raw
4848

49-
stream = stream!(@node, src, [:utf8], 10)
49+
stream = stream!(@node, src, 10, [:utf8])
5050
assert %File.Stream{} = stream
5151
assert stream.modes == [{:encoding, :utf8}, :binary]
5252
refute stream.raw
@@ -148,29 +148,29 @@ defmodule File.StreamTest do
148148
src = fixture_path("file.txt")
149149

150150
assert @node
151-
|> stream!(src, [{:read_offset, 0}])
151+
|> stream!(src, read_offset: 0)
152152
|> Enum.take(1) == ["FOO\n"]
153153

154154
assert @node
155-
|> stream!(src, [{:read_offset, 1}])
155+
|> stream!(src, read_offset: 1)
156156
|> Enum.take(1) == ["OO\n"]
157157

158158
assert @node
159-
|> stream!(src, [{:read_offset, 4}])
159+
|> stream!(src, read_offset: 4)
160160
|> Enum.take(1) == []
161161

162-
assert @node |> stream!(src, 1, [{:read_offset, 1}]) |> Enum.count() == 3
163-
assert @node |> stream!(src, 1, [{:read_offset, 4}]) |> Enum.count() == 0
162+
assert @node |> stream!(src, 1, read_offset: 1) |> Enum.count() == 3
163+
assert @node |> stream!(src, 1, read_offset: 4) |> Enum.count() == 0
164164
end
165165

166166
test "applies offset after trimming BOM" do
167167
src = fixture_path("utf8_bom.txt")
168168

169169
assert @node
170-
|> stream!(src, [:trim_bom, {:read_offset, 4}])
170+
|> stream!(src, [:trim_bom, read_offset: 4])
171171
|> Enum.take(1) == ["сский\n"]
172172

173-
assert @node |> stream!(src, 1, [:trim_bom, {:read_offset, 4}]) |> Enum.count() == 15
173+
assert @node |> stream!(src, 1, [:trim_bom, read_offset: 4]) |> Enum.count() == 15
174174
end
175175

176176
test "keeps BOM when raw" do
@@ -196,7 +196,7 @@ defmodule File.StreamTest do
196196
|> Enum.take(1) == ["Русский\n"]
197197

198198
assert @node
199-
|> stream!(src, [:trim_bom], 1)
199+
|> stream!(src, 1, [:trim_bom])
200200
|> Enum.take(5) == [<<208>>, <<160>>, <<209>>, <<131>>, <<209>>]
201201

202202
assert @node |> stream!(src, [:trim_bom]) |> Enum.count() == 2
@@ -208,11 +208,11 @@ defmodule File.StreamTest do
208208
src = fixture_path("utf8_bom.txt")
209209

210210
assert @node
211-
|> stream!(src, [{:encoding, :utf8}])
211+
|> stream!(src, encoding: :utf8)
212212
|> Enum.take(1) == [<<239, 187, 191>> <> "Русский\n"]
213213

214214
assert @node
215-
|> stream!(src, 1, [{:encoding, :utf8}])
215+
|> stream!(src, 1, encoding: :utf8)
216216
|> Enum.take(9) == ["\uFEFF", "Р", "у", "с", "с", "к", "и", "й", "\n"]
217217
end
218218

lib/ex_unit/lib/ex_unit/filters.ex

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,24 +12,20 @@ defmodule ExUnit.Filters do
1212
@type location :: {:location, {String.t(), pos_integer | [pos_integer, ...]}}
1313
@type ex_unit_opts :: [exclude: [:test], include: [location, ...]] | []
1414

15-
@doc """
16-
Parses filters out of a path.
17-
18-
Determines whether a given file path (supplied to ExUnit/Mix as arguments
19-
on the command line) includes a line number filter, and if so returns the
20-
appropriate ExUnit configuration options.
21-
"""
22-
@spec parse_path(String.t()) :: {String.t(), ex_unit_opts}
23-
# TODO: Deprecate this on Elixir v1.20
15+
# TODO: Remove me on Elixir v2.0
16+
@doc false
17+
@deprecated "Use parse_paths/1 instead"
2418
def parse_path(file_path) do
2519
{[parsed_path], ex_unit_opts} = parse_paths([file_path])
2620
{parsed_path, ex_unit_opts}
2721
end
2822

2923
@doc """
30-
Like `parse_path/1` but for multiple paths.
24+
Parses filters out of a path.
3125
32-
ExUnit filter options are combined.
26+
Determines whether a given file path (supplied to ExUnit/Mix as arguments
27+
on the command line) includes a line number filter, and if so returns the
28+
appropriate ExUnit configuration options.
3329
"""
3430
@spec parse_paths([String.t()]) :: {[String.t()], ex_unit_opts}
3531
def parse_paths(file_paths) do

lib/ex_unit/test/ex_unit/filters_test.exs

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -242,31 +242,33 @@ defmodule ExUnit.FiltersTest do
242242
for path <- [unix_path, windows_path, unix_path_with_dot] do
243243
fixed_path = path |> Path.split() |> Path.join() |> Path.relative_to_cwd()
244244

245-
assert ExUnit.Filters.parse_path("#{path}:123") ==
246-
{fixed_path, [exclude: [:test], include: [location: {fixed_path, 123}]]}
245+
assert ExUnit.Filters.parse_paths(["#{path}:123"]) ==
246+
{[fixed_path], [exclude: [:test], include: [location: {fixed_path, 123}]]}
247247

248-
assert ExUnit.Filters.parse_path(path) == {fixed_path, []}
248+
assert ExUnit.Filters.parse_paths([path]) == {[fixed_path], []}
249249

250-
assert ExUnit.Filters.parse_path("#{path}:123notreallyalinenumber123") ==
251-
{"#{fixed_path}:123notreallyalinenumber123", []}
250+
assert ExUnit.Filters.parse_paths(["#{path}:123notreallyalinenumber123"]) ==
251+
{["#{fixed_path}:123notreallyalinenumber123"], []}
252252

253-
assert ExUnit.Filters.parse_path("#{path}:123:456") ==
254-
{fixed_path, [exclude: [:test], include: [location: {fixed_path, [123, 456]}]]}
253+
assert ExUnit.Filters.parse_paths(["#{path}:123:456"]) ==
254+
{[fixed_path], [exclude: [:test], include: [location: {fixed_path, [123, 456]}]]}
255255

256-
assert ExUnit.Filters.parse_path("#{path}:123notalinenumber123:456") ==
257-
{"#{fixed_path}:123notalinenumber123",
256+
assert ExUnit.Filters.parse_paths(["#{path}:123notalinenumber123:456"]) ==
257+
{["#{fixed_path}:123notalinenumber123"],
258258
[
259259
exclude: [:test],
260260
include: [location: {"#{fixed_path}:123notalinenumber123", 456}]
261261
]}
262262

263263
output =
264264
ExUnit.CaptureIO.capture_io(:stderr, fn ->
265-
assert ExUnit.Filters.parse_path("#{path}:123:456notalinenumber456") ==
266-
{fixed_path, [{:exclude, [:test]}, {:include, [location: {fixed_path, 123}]}]}
265+
assert ExUnit.Filters.parse_paths(["#{path}:123:456notalinenumber456"]) ==
266+
{[fixed_path],
267+
[{:exclude, [:test]}, {:include, [location: {fixed_path, 123}]}]}
267268

268-
assert ExUnit.Filters.parse_path("#{path}:123:0:-789:456") ==
269-
{fixed_path, [exclude: [:test], include: [location: {fixed_path, [123, 456]}]]}
269+
assert ExUnit.Filters.parse_paths(["#{path}:123:0:-789:456"]) ==
270+
{[fixed_path],
271+
[exclude: [:test], include: [location: {fixed_path, [123, 456]}]]}
270272
end)
271273

272274
assert output =~ "invalid line number given as ExUnit filter: 456notalinenumber456"

lib/ex_unit/test/test_helper.exs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
# SPDX-FileCopyrightText: 2021 The Elixir Team
33
# SPDX-FileCopyrightText: 2012 Plataformatec
44

5-
Logger.configure_backend(:console, colors: [enabled: false])
6-
75
{line_exclude, line_include} =
86
if line = System.get_env("LINE"), do: {[:test], [line: line]}, else: {[], []}
97

lib/iex/lib/iex.ex

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -867,13 +867,4 @@ defmodule IEx do
867867

868868
@doc false
869869
def dont_display_result, do: :"do not show this result in output"
870-
871-
## CLI
872-
873-
# TODO: Remove me on Elixir v1.20+
874-
@doc false
875-
def start do
876-
IO.warn("Use \"s iex\" instead")
877-
:iex.start()
878-
end
879870
end

lib/logger/lib/logger.ex

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -621,8 +621,8 @@ defmodule Logger do
621621
622622
delete_process_level(pid)
623623
"""
624-
# TODO: Deprecate me on v1.20
625-
@doc deprecated: "Use Logger.delete_process_level(pid) instead"
624+
# TODO: Remove me on v2.0
625+
@deprecated "Use Logger.delete_process_level(pid) instead"
626626
@spec enable(pid) :: :ok
627627
def enable(pid) when pid == self() do
628628
delete_process_level(pid)
@@ -637,8 +637,8 @@ defmodule Logger do
637637
638638
put_process_level(pid, :none)
639639
"""
640-
# TODO: Deprecate me on v1.20
641-
@doc deprecated: "Use Logger.put_process_level(pid, :none) instead"
640+
# TODO: Remove me on v2.0
641+
@deprecated "Use Logger.put_process_level(pid, :none) instead"
642642
@spec disable(pid) :: :ok
643643
def disable(pid) when pid == self() do
644644
put_process_level(pid, :none)
@@ -649,8 +649,8 @@ defmodule Logger do
649649
650650
Currently the only accepted PID is `self()`.
651651
"""
652-
# TODO: Deprecate me on v1.20
653-
@doc deprecated: "Use Logger.get_process_level(pid) instead"
652+
# TODO: Remove me on v2.0
653+
@deprecated "Use Logger.get_process_level(pid) instead"
654654
@spec enabled?(pid) :: boolean
655655
def enabled?(pid) when pid == self() do
656656
get_process_level(pid) != :none
@@ -902,26 +902,26 @@ defmodule Logger do
902902
@doc """
903903
Adds a new backend.
904904
"""
905-
# TODO: Deprecate this on Elixir v1.20
906-
@doc deprecated: "Use LoggerBackends.add/2 from :logger_backends dependency"
905+
# TODO: Remove me on v2.0
906+
@deprecated "Use LoggerBackends.add/2 from :logger_backends dependency"
907907
def add_backend(backend, opts \\ []) do
908908
Logger.Backends.Internal.add(backend, opts)
909909
end
910910

911911
@doc """
912912
Removes a backend.
913913
"""
914-
# TODO: Deprecate this on Elixir v1.20
915-
@doc deprecated: "Use LoggerBackends.remove/2 from :logger_backends dependency"
914+
# TODO: Remove me on v2.0
915+
@deprecated "Use LoggerBackends.remove/2 from :logger_backends dependency"
916916
def remove_backend(backend, opts \\ []) do
917917
Logger.Backends.Internal.remove(backend, opts)
918918
end
919919

920920
@doc """
921921
Configures the given backend.
922922
"""
923-
# TODO: Deprecate this on Elixir v1.20
924-
@doc deprecated: "Use LoggerBackends.configure/2 from :logger_backends dependency"
923+
# TODO: Remove me on v2.0
924+
@deprecated "Use LoggerBackends.configure/2 from :logger_backends dependency"
925925
def configure_backend(:console, options) when is_list(options) do
926926
options = Keyword.merge(Application.get_env(:logger, :console, []), options)
927927
Application.put_env(:logger, :console, options)

lib/logger/lib/logger/backends/console.ex

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ defmodule Logger.Backends.Console do
3535
# TODO: Deprecate me on Elixir v1.20
3636
@impl true
3737
def init(atom) when is_atom(atom) do
38+
IO.warn(
39+
"Logger.Backends.Console is deprecated, " <>
40+
"you should migrate to the new :console handler, " <>
41+
"see Logger.Backends.Console docs for more information"
42+
)
43+
3844
config = read_env()
3945
device = Keyword.get(config, :device, :user)
4046

0 commit comments

Comments
 (0)