From d90759bd3e9cb9a954a623d4d385634e2d6b9753 Mon Sep 17 00:00:00 2001 From: amalbuquerque Date: Sun, 22 Sep 2019 23:57:30 +0100 Subject: [PATCH 1/2] Allow arguments using `"prefix" <> abc` We weren't allowing it previously. --- lib/function_arguments.ex | 2 +- .../annotated_interceptor_edge_cases_test.exs | 16 ++++++++++++++++ test/do_block/interceptor_edge_cases_test.exs | 16 ++++++++++++++++ test/function_arguments_test.exs | 18 ++++++++++++++++++ .../annotated_intercepted_edge_cases.ex | 3 +++ .../do_block/intercepted_edge_cases.ex | 2 ++ test/intercepted_modules/intercept_config.ex | 2 ++ 7 files changed, 58 insertions(+), 1 deletion(-) diff --git a/lib/function_arguments.ex b/lib/function_arguments.ex index 64e7f7a..22d6475 100644 --- a/lib/function_arguments.ex +++ b/lib/function_arguments.ex @@ -135,7 +135,7 @@ defmodule Interceptor.FunctionArguments do # in this case, `arg_ast` doesn't contain an assignment, so we are "manually" # placing it inside an assignment statement defp get_arg_name_and_its_ast({arg_name, _metadata, _context} = arg_ast) - when arg_name in [:<<>>, :{}, :%{}, :%] do + when arg_name in [:<<>>, :{}, :%{}, :%, :<>] do random_name = Utils.random_atom() # arg variables always have their context as nil diff --git a/test/annotated/annotated_interceptor_edge_cases_test.exs b/test/annotated/annotated_interceptor_edge_cases_test.exs index cc869d2..2803b62 100644 --- a/test/annotated/annotated_interceptor_edge_cases_test.exs +++ b/test/annotated/annotated_interceptor_edge_cases_test.exs @@ -3,6 +3,22 @@ defmodule AnnotatedInterceptorEdgeCasesTest do @process_name :annotated_edge_cases_test_process + describe "functions with argument using `<>`" do + test "it passes the argument with the prefix before `<>`" do + {:ok, _pid} = spawn_agent() + + result = AnnotatedInterceptedEdgeCases1.intercept_with_prefix("some_prefix:blabla") + + callback_calls = get_agent_messages() + + [{_started_at, _ended_at, callback_result, intercepted_mfa}] = callback_calls + + assert length(callback_calls) == 1 + assert result == callback_result + assert intercepted_mfa == {AnnotatedInterceptedEdgeCases1, :intercept_with_prefix, ["some_prefix:blabla"]} + end + end + describe "module with functions with ignored arguments" do test "it passes the ignored arguments as `:arg_cant_be_intercepted`" do {:ok, _pid} = spawn_agent() diff --git a/test/do_block/interceptor_edge_cases_test.exs b/test/do_block/interceptor_edge_cases_test.exs index 27990d7..65cf13f 100644 --- a/test/do_block/interceptor_edge_cases_test.exs +++ b/test/do_block/interceptor_edge_cases_test.exs @@ -3,6 +3,22 @@ defmodule InterceptorEdgeCasesTest do @process_name :edge_cases_test_process + describe "functions with argument using `<>`" do + test "it passes the argument with the prefix before `<>`" do + {:ok, _pid} = spawn_agent() + + result = InterceptedEdgeCases1.intercept_with_prefix("some_prefix:blabla") + + callback_calls = get_agent_messages() + + [{_started_at, _ended_at, callback_result, intercepted_mfa}] = callback_calls + + assert length(callback_calls) == 1 + assert result == callback_result + assert intercepted_mfa == {InterceptedEdgeCases1, :intercept_with_prefix, ["some_prefix:blabla"]} + end + end + describe "module with functions with ignored arguments" do test "it passes the ignored arguments as `:arg_cant_be_intercepted`" do {:ok, _pid} = spawn_agent() diff --git a/test/function_arguments_test.exs b/test/function_arguments_test.exs index edde639..b622787 100644 --- a/test/function_arguments_test.exs +++ b/test/function_arguments_test.exs @@ -63,6 +63,24 @@ defmodule FunctionArgumentsTest do assert_ast_match(random_var_ast, expected_random_var_ast) end + test "it handles binary destructure with `<>`" do + function_header = get_function_header(~s/def abc("a prefix" <> hallo), do: hallo/) + result = FunctionArguments.get_args_names_and_new_args_list(function_header) + + {args_names, args_ast} = result + + assert length(args_names) == length(args_ast) + assert length(args_ast) == 1 + + [{:=, _metadata, [arg_ast, random_var_ast]}] = args_ast + + expected_arg_ast = quote do: "a prefix" <> hallo + expected_random_var_ast = Macro.var(hd(args_names), nil) + + assert_ast_match(arg_ast, expected_arg_ast) + assert_ast_match(random_var_ast, expected_random_var_ast) + end + test "it handles map destructure" do function_header = get_function_header("def abc(%{a: x, b: y, c: z}), do: [x,y,z]") result = FunctionArguments.get_args_names_and_new_args_list(function_header) diff --git a/test/intercepted_modules/annotated/annotated_intercepted_edge_cases.ex b/test/intercepted_modules/annotated/annotated_intercepted_edge_cases.ex index 3af8d26..c54e9db 100644 --- a/test/intercepted_modules/annotated/annotated_intercepted_edge_cases.ex +++ b/test/intercepted_modules/annotated/annotated_intercepted_edge_cases.ex @@ -19,4 +19,7 @@ defmodule AnnotatedInterceptedEdgeCases1 do @intercept true def to_intercept(a, b, _to_ignore), do: "#{a} #{b}" + + @intercept true + def intercept_with_prefix("some_prefix:" <> abc), do: abc end diff --git a/test/intercepted_modules/do_block/intercepted_edge_cases.ex b/test/intercepted_modules/do_block/intercepted_edge_cases.ex index f7f24ac..97d0977 100644 --- a/test/intercepted_modules/do_block/intercepted_edge_cases.ex +++ b/test/intercepted_modules/do_block/intercepted_edge_cases.ex @@ -19,5 +19,7 @@ defmodule InterceptedEdgeCases1 do I.intercept do def to_intercept(a, b, _to_ignore), do: "#{a} #{b}" + + def intercept_with_prefix("some_prefix:" <> suffix), do: suffix end end diff --git a/test/intercepted_modules/intercept_config.ex b/test/intercepted_modules/intercept_config.ex index 6b81267..4a4f5fc 100644 --- a/test/intercepted_modules/intercept_config.ex +++ b/test/intercepted_modules/intercept_config.ex @@ -43,6 +43,7 @@ defmodule InterceptConfig do # edge cases {InterceptedEdgeCases1, :to_intercept, 3} => [on_success: {EdgeCases.Callbacks, :success_cb, 3}, on_error: {EdgeCases.Callbacks, :error_cb, 3}], + {InterceptedEdgeCases1, :intercept_with_prefix, 1} => [on_success: {EdgeCases.Callbacks, :success_cb, 3}, on_error: {EdgeCases.Callbacks, :error_cb, 3}], # these configs will be overridden by the module own configuration {InterceptedOnAfterOwnConfiguration1, :to_intercept, 0} => [after: {After.Callback, :right_after, 2}], @@ -90,6 +91,7 @@ defmodule InterceptConfig do # edge cases {AnnotatedInterceptedEdgeCases1, :to_intercept, 3} => [on_success: {AnnotatedEdgeCases.Callbacks, :success_cb, 3}, on_error: {AnnotatedEdgeCases.Callbacks, :error_cb, 3}], + {AnnotatedInterceptedEdgeCases1, :intercept_with_prefix, 1} => [on_success: {AnnotatedEdgeCases.Callbacks, :success_cb, 3}, on_error: {AnnotatedEdgeCases.Callbacks, :error_cb, 3}], # these configs will be overridden by the module own configuration {AnnotatedInterceptedOnAfterOwnConfiguration1, :to_intercept, 0} => [after: {After.Callback, :right_after, 2}], From 516c384d782acce4f5dd556b7e7ae2f368d9d6ed Mon Sep 17 00:00:00 2001 From: amalbuquerque Date: Mon, 23 Sep 2019 00:00:45 +0100 Subject: [PATCH 2/2] Release v0.5.1 Let's release the fix asap. There's no breaking change. --- CHANGELOG.md | 2 +- README.md | 2 +- mix.exs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ac9a851..d4e49ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ * intercepted functions without arguments that don't have `()` isn't working (e.g. `def foo, do: 123`) -# Changelog for v0.5.0 +# Changelog for v0.5.1 ## Changes diff --git a/README.md b/README.md index 1744dd3..79caca1 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ dependencies in `mix.exs`: ```elixir def deps do [ - {:interceptor, "~> 0.5.0"} + {:interceptor, "~> 0.5.1"} ] end ``` diff --git a/mix.exs b/mix.exs index 3aed663..6a8a234 100644 --- a/mix.exs +++ b/mix.exs @@ -6,7 +6,7 @@ defmodule Interceptor.MixProject do app: :interceptor, package: package(), source_url: "https://github.com/amalbuquerque/interceptor", - version: "0.5.0", + version: "0.5.1", elixir: "~> 1.7", start_permanent: Mix.env() == :prod, deps: deps(),