Skip to content

Commit efd00e9

Browse files
authored
Merge pull request #65 from esl/enable-elixir-11-and-13-in-ci
Enable elixir 11 and 13 in ci
2 parents a1d31e4 + 7be307d commit efd00e9

File tree

12 files changed

+177
-41
lines changed

12 files changed

+177
-41
lines changed

.github/workflows/build-and-test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ jobs:
1414
strategy:
1515
matrix:
1616
otp: ['23.3.4.7', '24.1']
17-
elixir: ['1.12.3']
17+
elixir: ['1.11.4', '1.12.3', '1.13.3']
1818
steps:
1919
- uses: actions/checkout@v2
2020
- uses: erlef/setup-beam@v1

.tool-versions

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
elixir 1.12.2-otp-23
1+
elixir 1.12.3
2+
erlang 24.1

lib/gradient/elixir_expr.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ defmodule Gradient.ElixirExpr do
106106
"reraise " <> pp_expr(var) <> ", " <> pp_expr(var_stacktrace)
107107
end
108108

109-
def pp_expr({:call, _, {:remote, _, {:atom, _, :erlang}, {:atom, _, :error}}, [arg]}) do
109+
def pp_expr({:call, _, {:remote, _, {:atom, _, :erlang}, {:atom, _, :error}}, [arg | _]}) do
110110
"raise " <> pp_raise_arg(arg)
111111
end
112112

@@ -405,7 +405,7 @@ defmodule Gradient.ElixirExpr do
405405
defp bin_pp_value(val), do: pp_expr(val)
406406

407407
defp bin_set_value("", value), do: value
408-
defp bin_set_value(sufix, value), do: value <> "::" <> sufix
408+
defp bin_set_value(sufix, value), do: "(" <> value <> ")::" <> sufix
409409

410410
defp bin_set_size("", :default), do: ""
411411
defp bin_set_size("", {:integer, _, size}), do: Integer.to_string(size)

mix.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ defmodule Gradient.MixProject do
55
[
66
app: :gradient,
77
version: "0.1.0",
8-
elixir: "~> 1.12",
8+
elixir: "~> 1.11",
99
elixirc_paths: elixirc_paths(Mix.env()),
1010
start_permanent: Mix.env() == :prod,
1111
deps: deps(),

test/examples/range.ex renamed to test/examples/1.12/range_step.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
defmodule RangeEx do
1+
defmodule RangeStep do
22
def range do
33
1..12
44
end

test/examples/simple_range.ex

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
defmodule SimpleRange do
2+
def range do
3+
1..12
4+
end
5+
end

test/examples/tuple.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
defmodule Tuple do
1+
defmodule TupleEx do
22
def tuple do
33
{:ok, 12}
44
end

test/gradient/ast_specifier_test.exs

Lines changed: 55 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ defmodule Gradient.AstSpecifierTest do
101101
end
102102

103103
test "tuple" do
104-
{tokens, ast} = load("Elixir.Tuple.beam", "tuple.ex")
104+
{tokens, ast} = load("Elixir.TupleEx.beam", "tuple.ex")
105105

106106
[tuple_in_str2, tuple_in_str, tuple_in_list, _list_in_tuple, tuple | _] =
107107
AstSpecifier.run_mappers(ast, tokens) |> Enum.reverse()
@@ -625,8 +625,29 @@ defmodule Gradient.AstSpecifierTest do
625625
]} = guarded_case
626626
end
627627

628+
@tag :ex_lt_1_12
628629
test "range" do
629-
{tokens, ast} = load("Elixir.RangeEx.beam", "range.ex")
630+
{tokens, ast} = load("Elixir.SimpleRange.beam", "simple_range.ex")
631+
632+
[range | _] = AstSpecifier.run_mappers(ast, tokens) |> Enum.reverse()
633+
634+
assert {:function, 2, :range, 0,
635+
[
636+
{:clause, 2, [], [],
637+
[
638+
{:map, 3,
639+
[
640+
{:map_field_assoc, 3, {:atom, 3, :__struct__}, {:atom, 3, Range}},
641+
{:map_field_assoc, 3, {:atom, 3, :first}, {:integer, 3, 1}},
642+
{:map_field_assoc, 3, {:atom, 3, :last}, {:integer, 3, 12}}
643+
]}
644+
]}
645+
]} = range
646+
end
647+
648+
@tag :ex_gt_1_11
649+
test "step range" do
650+
{tokens, ast} = load("Elixir.RangeStep.beam", "1.12/range_step.ex")
630651

631652
[to_list, match_range, rev_range_step, range_step, range | _] =
632653
AstSpecifier.run_mappers(ast, tokens) |> Enum.reverse()
@@ -711,6 +732,24 @@ defmodule Gradient.AstSpecifierTest do
711732

712733
[block | _] = AstSpecifier.run_mappers(ast, tokens) |> Enum.reverse()
713734

735+
range =
736+
if System.version() >= "1.12" do
737+
{:map, 11,
738+
[
739+
{:map_field_assoc, 11, {:atom, 11, :__struct__}, {:atom, 11, Range}},
740+
{:map_field_assoc, 11, {:atom, 11, :first}, {:integer, 11, 0}},
741+
{:map_field_assoc, 11, {:atom, 11, :last}, {:integer, 11, 5}},
742+
{:map_field_assoc, 11, {:atom, 11, :step}, {:integer, 11, 1}}
743+
]}
744+
else
745+
{:map, 11,
746+
[
747+
{:map_field_assoc, 11, {:atom, 11, :__struct__}, {:atom, 11, Range}},
748+
{:map_field_assoc, 11, {:atom, 11, :first}, {:integer, 11, 0}},
749+
{:map_field_assoc, 11, {:atom, 11, :last}, {:integer, 11, 5}}
750+
]}
751+
end
752+
714753
assert {:function, 10, :lc_complex, 0,
715754
[
716755
{:clause, 10, [], [],
@@ -719,13 +758,7 @@ defmodule Gradient.AstSpecifierTest do
719758
[
720759
{:call, 11, {:remote, 11, {:atom, 11, Enum}, {:atom, 11, :reduce}},
721760
[
722-
{:map, 11,
723-
[
724-
{:map_field_assoc, 11, {:atom, 11, :__struct__}, {:atom, 11, Range}},
725-
{:map_field_assoc, 11, {:atom, 11, :first}, {:integer, 11, 0}},
726-
{:map_field_assoc, 11, {:atom, 11, :last}, {:integer, 11, 5}},
727-
{:map_field_assoc, 11, {:atom, 11, :step}, {:integer, 11, 1}}
728-
]},
761+
^range,
729762
{nil, 11},
730763
{:fun, 11,
731764
{:clauses,
@@ -823,6 +856,7 @@ defmodule Gradient.AstSpecifierTest do
823856
{:bin_element, 7, {:string, 7, 'oops'}, :default, :default}
824857
]}
825858
]}
859+
| _
826860
]}
827861
]},
828862
{:clause, [generated: true, location: 4],
@@ -950,6 +984,7 @@ defmodule Gradient.AstSpecifierTest do
950984
:default, :default}
951985
]}
952986
]}
987+
| _
953988
]}
954989
], [], [],
955990
[
@@ -972,6 +1007,7 @@ defmodule Gradient.AstSpecifierTest do
9721007
{:cons, 52, {:integer, 52, 49},
9731008
{:cons, 52, {:integer, 52, 50}, {nil, 52}}}
9741009
]}
1010+
| _
9751011
]},
9761012
{:integer, 53, 1}
9771013
], [], [], [{:op, 55, :-, {:integer, 55, 1}}]}
@@ -1049,6 +1085,8 @@ defmodule Gradient.AstSpecifierTest do
10491085
[get2, get, update, empty, struct | _] =
10501086
AstSpecifier.run_mappers(ast, tokens) |> Enum.reverse()
10511087

1088+
anno_line_17 = if(System.version() >= "1.12", do: [generated: true, location: 17], else: 17)
1089+
10521090
assert {:function, 8, :update, 0,
10531091
[
10541092
{:clause, 8, [], [],
@@ -1070,18 +1108,17 @@ defmodule Gradient.AstSpecifierTest do
10701108
{:map, 17,
10711109
[
10721110
{:map_field_exact, 17, {:atom, [generated: true, location: 17], :x},
1073-
{:var, [generated: true, location: 17], :_@1}}
1111+
{:var, ^anno_line_17, :_@1}}
10741112
]}
1075-
], [], [{:var, [generated: true, location: 17], :_@1}]},
1076-
{:clause, [generated: true, location: 17],
1077-
[{:var, [generated: true, location: 17], :_@1}],
1113+
], [], [{:var, ^anno_line_17, :_@1}]},
1114+
{:clause, [generated: true, location: 17], [{:var, ^anno_line_17, :_@1}],
10781115
[
10791116
[
10801117
{:call, [generated: true, location: 17],
10811118
{:remote, [generated: true, location: 17],
10821119
{:atom, [generated: true, location: 17], :erlang},
10831120
{:atom, [generated: true, location: 17], :is_map}},
1084-
[{:var, [generated: true, location: 17], :_@1}]}
1121+
[{:var, ^anno_line_17, :_@1}]}
10851122
]
10861123
],
10871124
[
@@ -1091,16 +1128,15 @@ defmodule Gradient.AstSpecifierTest do
10911128
[
10921129
{:atom, 17, :badkey},
10931130
{:atom, 17, :x},
1094-
{:var, [generated: true, location: 17], :_@1}
1131+
{:var, ^anno_line_17, :_@1}
10951132
]}
10961133
]}
10971134
]},
1098-
{:clause, [generated: true, location: 17],
1099-
[{:var, [generated: true, location: 17], :_@1}], [],
1135+
{:clause, [generated: true, location: 17], [{:var, ^anno_line_17, :_@1}], [],
11001136
[
11011137
{:call, [generated: true, location: 17],
1102-
{:remote, [generated: true, location: 17],
1103-
{:var, [generated: true, location: 17], :_@1}, {:atom, 17, :x}}, []}
1138+
{:remote, [generated: true, location: 17], {:var, ^anno_line_17, :_@1},
1139+
{:atom, 17, :x}}, []}
11041140
]}
11051141
]}}
11061142
]}

test/gradient/elixir_expr_test.exs

Lines changed: 57 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ defmodule Gradient.ElixirExprTest do
5656
end
5757
|> ElixirExpr.pp_expr()
5858

59-
assert "pixels = <<213, 45, 132, 64, 76, 32, 76, 0, 0, 234, 32, 15>>; for <<r::8, g::8, b::8 <- pixels >>, do: {r, g, b}" ==
59+
assert "pixels = <<213, 45, 132, 64, 76, 32, 76, 0, 0, 234, 32, 15>>; for <<(r)::8, (g)::8, (b)::8 <- pixels >>, do: {r, g, b}" ==
6060
actual
6161
end
6262

@@ -67,7 +67,7 @@ defmodule Gradient.ElixirExprTest do
6767
end
6868
|> ElixirExpr.pp_expr()
6969

70-
assert "for <<one, _rest::binary-size(3) <- <<1, 2, 3, 4>> >>, do: one" == actual
70+
assert "for <<one, (_rest)::binary-size(3) <- <<1, 2, 3, 4>> >>, do: one" == actual
7171
end
7272

7373
test "receive" do
@@ -328,8 +328,7 @@ defmodule Gradient.ElixirExprTest do
328328
end
329329

330330
test "pp and format complex try expression" do
331-
{_tokens, ast} =
332-
Gradient.TestHelpers.load("Elixir.CallRemoteException.beam", "call_remote_exception.ex")
331+
ast = Gradient.TestHelpers.load("Elixir.CallRemoteException.beam")
333332

334333
{:function, _, :call, 2, [{:clause, _ann, _args, _guards, [try_expr]}]} =
335334
Enum.reverse(ast) |> List.first()
@@ -338,7 +337,58 @@ defmodule Gradient.ElixirExprTest do
338337

339338
# FIXME `raise {:badkey, :stack, _gen}` is not correct
340339

341-
expected = ~s"""
340+
expected_v1_11 = ~s"""
341+
try do
342+
:ok
343+
catch
344+
:error, %Plug.Conn.WrapperError{} = e ->
345+
exception =
346+
Exception.normalize(
347+
:error,
348+
case e do
349+
%{reason: _} -> _
350+
_ when :erlang.is_map(_) -> raise {:badkey, :reason, _}
351+
_ -> _.reason()
352+
end,
353+
case e do
354+
%{stack: _} -> _
355+
_ when :erlang.is_map(_) -> raise {:badkey, :stack, _}
356+
_ -> _.stack()
357+
end
358+
)
359+
360+
_ =
361+
Sentry.capture_exception(exception, [
362+
{:stacktrace,
363+
case e do
364+
%{stack: _} -> _
365+
_ when :erlang.is_map(_) -> raise {:badkey, :stack, _}
366+
_ -> _.stack()
367+
end},
368+
{:event_source, :plug}
369+
])
370+
371+
Plug.Conn.WrapperError.reraise(e)
372+
373+
:error, e ->
374+
_ = Sentry.capture_exception(e, [{:stacktrace, __STACKTRACE__}, {:event_source, :plug}])
375+
:erlang.raise(:error, e, __STACKTRACE__)
376+
377+
kind, reason ->
378+
message =
379+
<<"Uncaught ",
380+
case kind do
381+
_gen when :erlang.is_binary(_gen) -> _gen
382+
_gen -> String.Chars.to_string(_gen)
383+
end::binary, " - ", Kernel.inspect(reason)::binary>>
384+
385+
stack = __STACKTRACE__
386+
_ = Sentry.capture_message(message, [{:stacktrace, stack}, {:event_source, :plug}])
387+
:erlang.raise(kind, reason, stack)
388+
end
389+
"""
390+
391+
expected_v1_12 = ~s"""
342392
try do
343393
:ok
344394
catch
@@ -389,6 +439,8 @@ defmodule Gradient.ElixirExprTest do
389439
end
390440
"""
391441

442+
expected = if(System.version() >= "1.12", do: expected_v1_12, else: expected_v1_11)
443+
392444
assert expected == :erlang.iolist_to_binary(res) <> "\n"
393445
end
394446
end

test/mix/tasks/gradient_test.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ defmodule Mix.Tasks.GradientTest do
103103
assert not String.contains?(output, ex_spec_error_msg)
104104
end
105105

106-
@tag if(System.version() >= "1.13", do: :skip, else: :ok)
106+
@tag :ex_lt_1_13
107107
test "--no-specify option" do
108108
output = run_task(test_opts([@s_wrong_ret_beam]))
109109
assert String.contains?(output, "on line 3")

0 commit comments

Comments
 (0)