From 7d89236aa5bbec387765c741cb4450e9f50e9612 Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Sat, 8 Jun 2024 18:02:20 +0100 Subject: [PATCH 01/16] Update dep.s and plugins --- rebar.config | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rebar.config b/rebar.config index 706b4e0..77cf524 100644 --- a/rebar.config +++ b/rebar.config @@ -6,7 +6,7 @@ {xref_checks, [undefined_function_calls,locals_not_used]}. {profiles, [ {docs, [ - {deps, [{edown, "0.8.1"}]}, + {deps, [{edown, "0.9.1"}]}, {edoc_opts, [ {preprocess, true}, {def, [ @@ -16,15 +16,15 @@ ]} ]}, {test, [ - {deps, [{hackney, "1.17.4"}]} + {deps, [{hackney, "1.20.1"}]} ]} ]}. {shell, [{script_file, "bin/shell.escript"}]}. {project_plugins, [ - {covertool, "2.0.3"}%, - %{rebar3_lint, "v0.1.10"} + {covertool, "2.0.6"}, + {rebar3_lint, "3.2.5"} ]}. %{provider_hooks, [{pre, [{eunit, lint}]}]}. From 6f9d28ed2615332820219d6722b56d0b7de563cd Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Sat, 8 Jun 2024 18:25:46 +0100 Subject: [PATCH 02/16] Handle rebar3_lint -issued warning for no_block_expressions --- src/elli.erl | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/elli.erl b/src/elli.erl index 9f233ce..dc2903c 100644 --- a/src/elli.erl +++ b/src/elli.erl @@ -162,11 +162,7 @@ init([Opts]) -> | SSLSockOpts]), Acceptors = ets:new(acceptors, [private, set]), - [begin - Pid = elli_http:start_link(self(), Socket, Options, - {Callback, CallbackArgs}), - ets:insert(Acceptors, {Pid}) - end + [http_start(Socket, Options, Callback, CallbackArgs, Acceptors) || _ <- lists:seq(1, MinAcceptors)], {ok, #state{socket = Socket, @@ -175,6 +171,9 @@ init([Opts]) -> options = Options, callback = {Callback, CallbackArgs}}}. +http_start(Socket, Options, Callback, CallbackArgs, Acceptors) -> + Pid = elli_http:start_link(self(), Socket, Options, {Callback, CallbackArgs}), + ets:insert(Acceptors, {Pid}). %% @hidden -spec handle_call(get_acceptors, {pid(), _Tag}, state()) -> From ac4aaec9ee6f5679580375bf66de32c3c89dd303 Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Sat, 8 Jun 2024 18:26:21 +0100 Subject: [PATCH 03/16] Handle rebar3_lint -issued warning for private_data_types --- src/elli.erl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/elli.erl b/src/elli.erl index dc2903c..3cfcdfc 100644 --- a/src/elli.erl +++ b/src/elli.erl @@ -28,6 +28,7 @@ %% @type req(). A record representing an HTTP request. -type req() :: #req{}. +-elvis([{elvis_style, private_data_types, disable}]). %% @type http_method(). An uppercase atom representing a known HTTP verb or a %% binary for other verbs. From 4f7d2a77ec62d0e6d1eed22b40bf937db44d1b74 Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Sat, 8 Jun 2024 18:27:25 +0100 Subject: [PATCH 04/16] Handle rebar3_lint -issued warning for no_catch_expressions I don't see where catch was actually used, since all the clauses derive not from exceptions, but simple function returns --- src/elli_http.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/elli_http.erl b/src/elli_http.erl index cd549e4..ca73180 100644 --- a/src/elli_http.erl +++ b/src/elli_http.erl @@ -58,7 +58,7 @@ start_link(Server, ListenSocket, Options, Callback) -> Options :: proplists:proplist(), Callback :: elli_handler:callback(). accept(Server, ListenSocket, Options, Callback) -> - case catch elli_tcp:accept(ListenSocket, Server, accept_timeout(Options)) of + case elli_tcp:accept(ListenSocket, Server, accept_timeout(Options)) of {ok, Socket} -> t(accepted), ?MODULE:keepalive_loop(Socket, Options, Callback); From 752d90d3a341a421a75618577ae9bbdfa8c0459b Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Sat, 8 Jun 2024 18:31:12 +0100 Subject: [PATCH 05/16] Handle rebar3_lint -issued warning for atom_naming_convention --- src/elli_http.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/elli_http.erl b/src/elli_http.erl index ca73180..6d224f6 100644 --- a/src/elli_http.erl +++ b/src/elli_http.erl @@ -729,7 +729,7 @@ parse_path({abs_path, FullPath}) -> Query = maps:get(query, URIMap, <<>>), Port = maps:get(port, URIMap, case Scheme of http -> 80; https -> 443; _ -> undefined end), {ok, {Scheme, Host, Port}, {Path, split_path(Path), uri_string:dissect_query(Query)}}; -parse_path({absoluteURI, Scheme, Host, Port, Path}) -> +parse_path({'absoluteURI', Scheme, Host, Port, Path}) -> setelement(2, parse_path({abs_path, Path}), {Scheme, Host, Port}); parse_path(_) -> {error, unsupported_uri}. From bdccf31ea024c96ef92fb5b008e0e3a79b99b1f8 Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Sat, 8 Jun 2024 18:31:50 +0100 Subject: [PATCH 06/16] Handle rebar3_lint -issued warning for max_function_arity --- src/elli_http.erl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/elli_http.erl b/src/elli_http.erl index 6d224f6..d733e88 100644 --- a/src/elli_http.erl +++ b/src/elli_http.erl @@ -36,6 +36,8 @@ -define(CONNECTION_HEADER, <<"connection">>). -define(TRANSFER_ENCODING_HEADER, <<"Transfer-Encoding">>). +-elvis([{elvis_style, max_function_arity, disable}]). + %% TODO: use this %% -type connection_token() :: keep_alive | close. From e3aa3dbc24686e8a647b76981593f94aedbfa8f8 Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Sat, 8 Jun 2024 18:32:44 +0100 Subject: [PATCH 07/16] Handle rebar3_lint -issued warning for god_modules --- src/elli_request.erl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/elli_request.erl b/src/elli_request.erl index 6500ee2..bc235ed 100644 --- a/src/elli_request.erl +++ b/src/elli_request.erl @@ -44,6 +44,7 @@ | {offset, Offset::non_neg_integer()} | {suffix, Length::pos_integer()}. +-elvis([{elvis_style, god_modules, disable}]). %% %% Helpers for working with a #req{} From 86ef1a76011dd6930e7e00869a69733fdeaf2dc4 Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Sat, 8 Jun 2024 18:34:01 +0100 Subject: [PATCH 08/16] Handle rebar3_lint -issued warning for export_used_types --- src/elli_sendfile.erl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/elli_sendfile.erl b/src/elli_sendfile.erl index d67ded4..5a11a67 100644 --- a/src/elli_sendfile.erl +++ b/src/elli_sendfile.erl @@ -6,6 +6,7 @@ -export([sendfile/5]). -type sendfile_opts() :: [{chunk_size, non_neg_integer()}]. +-export_type([sendfile_opts/0]). %% @doc Send part of a file on a socket. %% From 3908309c234d301f6f23d8fa120d8e0362442450 Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Sat, 8 Jun 2024 18:34:50 +0100 Subject: [PATCH 09/16] Handle rebar3_lint -issued warning for consistent_variable_casing --- test/elli_middleware_tests.erl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/elli_middleware_tests.erl b/test/elli_middleware_tests.erl index ea303ee..8761643 100644 --- a/test/elli_middleware_tests.erl +++ b/test/elli_middleware_tests.erl @@ -28,9 +28,9 @@ hello_world() -> ?assertMatch(<<"Hello World!">>, body(Response)). compress() -> - Url = "http://localhost:3002/compressed", + URL = "http://localhost:3002/compressed", Headers = [{<<"Accept-Encoding">>, <<"gzip">>}], - Response = hackney:get(Url, Headers), + Response = hackney:get(URL, Headers), ?assertHeadersEqual([{<<"Connection">>, <<"Keep-Alive">>}, {<<"Content-Encoding">>, <<"gzip">>}, {<<"Content-Length">>, <<"41">>}], From d82dcd9c195011079e9e25b1a9d79c900e4dc22f Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Sat, 8 Jun 2024 18:36:29 +0100 Subject: [PATCH 10/16] Handle rebar3_lint -issued warning for no_single_clause_case --- test/elli_tests.erl | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/test/elli_tests.erl b/test/elli_tests.erl index fb62ed1..364641a 100644 --- a/test/elli_tests.erl +++ b/test/elli_tests.erl @@ -735,7 +735,8 @@ register_test() -> ok. invalid_callback_test() -> - case catch elli:start_link([{callback, elli}]) of - E -> - ?assertMatch(invalid_callback, E) + try + elli:start_link([{callback, elli}]) + catch throw:E -> + ?assertMatch(invalid_callback, E) end. From 4a70eaac79e2448586cc5d61d7e5f93297430e99 Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Sat, 8 Jun 2024 18:37:31 +0100 Subject: [PATCH 11/16] Handle rebar3_lint -issued warning for line_length --- test/elli_tests.erl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/elli_tests.erl b/test/elli_tests.erl index 364641a..07cfdbf 100644 --- a/test/elli_tests.erl +++ b/test/elli_tests.erl @@ -472,7 +472,8 @@ sendfile_range() -> ?assertMatch(206, status(Response)), ?assertHeadersEqual([{<<"connection">>, <<"Keep-Alive">>}, {<<"content-length">>, <<"400">>}, - {<<"Content-Range">>, iolist_to_binary(["bytes 300-699/", integer_to_binary(Size)])}], + {<<"Content-Range">>, + iolist_to_binary(["bytes 300-699/", integer_to_binary(Size)])}], headers(Response)), ?assertEqual(Expected, body(Response)). From b1f60caf025edfe92d5e75869d796988375071df Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Sat, 8 Jun 2024 18:37:46 +0100 Subject: [PATCH 12/16] rebar3_lint: update elvis.config ... to most recently expected format --- elvis.config | 67 ++++++++++++++++++---------------------------------- 1 file changed, 23 insertions(+), 44 deletions(-) diff --git a/elvis.config b/elvis.config index c96c782..346a11b 100644 --- a/elvis.config +++ b/elvis.config @@ -1,48 +1,27 @@ [ - { - elvis, - [ - {config, - [#{dirs => [ - "src" - %% TODO: "test" - ], - filter => "*.erl", - rules => [ - {elvis_style, no_tabs}, - {elvis_style, no_trailing_whitespace}, - {elvis_style, no_if_expression}, - {elvis_style, no_nested_try_catch}, - {elvis_style, invalid_dynamic_call, - #{ignore => [ - elli, - elli_http, - elli_middleware, - elli_test - ]}}, - {elvis_style, used_ignored_variable}, - {elvis_style, no_behavior_info}, - {elvis_style, state_record_and_type}, - {elvis_style, no_spec_with_records}, - {elvis_style, dont_repeat_yourself}, - {elvis_style, no_debug_call} - ], - ruleset => erl_files - }, - #{dirs => ["."], - filter => "Makefile", - ruleset => makefiles - }, - #{dirs => ["."], - filter => "rebar.config", + {elvis, [ + {config, [ + #{ + dirs => ["src/**", "test/**"], + filter => "*.erl", + ruleset => erl_files, + rules => [ + {elvis_style, operator_spaces, disable}, + {elvis_style, invalid_dynamic_call, disable}, + {elvis_style, dont_repeat_yourself, disable}, + {elvis_style, no_throw, disable} + ] + }, + #{ + dirs => ["."], + filter => "rebar.config", ruleset => rebar_config - }, - #{dirs => ["."], - filter => "elvis.config", + }, + #{ + dirs => ["."], + filter => "elvis.config", ruleset => elvis_config - } - ] - } - ] - } + } + ]} + ]} ]. From 78e5efa66120d4e34a566bcce5792b73b47adbb6 Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Sat, 8 Jun 2024 19:18:31 +0100 Subject: [PATCH 13/16] Try to find a rebar3_lint version that acts on 22+ --- rebar.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rebar.config b/rebar.config index 77cf524..4095644 100644 --- a/rebar.config +++ b/rebar.config @@ -24,7 +24,7 @@ {project_plugins, [ {covertool, "2.0.6"}, - {rebar3_lint, "3.2.5"} + {rebar3_lint, "1.0.2"} ]}. %{provider_hooks, [{pre, [{eunit, lint}]}]}. From 00df5b4f1eca5b607da3d1bfdc9ec0d56931229a Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Sat, 8 Jun 2024 19:24:47 +0100 Subject: [PATCH 14/16] Separate rebar3_lint and eunit in CI rebar3_lint is 24+, these days, and adding more exceptions to CI just makes it more complex to maintain, I believe --- .github/workflows/main.yml | 3 +++ rebar.config | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index bbed24e..6749c63 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -20,6 +20,7 @@ jobs: - otp_version: 25 os: ubuntu-22.04 rebar3_version: 3.22 + latest: true - otp_version: 24 os: ubuntu-22.04 rebar3_version: 3.22 @@ -61,6 +62,8 @@ jobs: - name: Compile run: rebar3 compile + - name: Lint + run: if [[ "${{ matrix.latest }}" == "true" ]]; then rebar3 lint; fi - name: EUnit tests run: rebar3 eunit - name: Dialyzer diff --git a/rebar.config b/rebar.config index 4095644..9b2278a 100644 --- a/rebar.config +++ b/rebar.config @@ -24,10 +24,10 @@ {project_plugins, [ {covertool, "2.0.6"}, - {rebar3_lint, "1.0.2"} + {rebar3_lint, "3.2.5"} ]}. -%{provider_hooks, [{pre, [{eunit, lint}]}]}. +{provider_hooks, [{pre, [{eunit, lint}]}]}. {dialyzer, [{plt_extra_apps, [ssl]}]}. {cover_enabled, true}. From bd8806c77cb1a3f1cf1aa73e086f5fed1a8d181d Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Thu, 13 Jun 2024 12:59:31 +0100 Subject: [PATCH 15/16] Move minimum_otp_vsn and CI to 24+ --- .github/workflows/main.yml | 19 +++---------------- rebar.config | 2 +- 2 files changed, 4 insertions(+), 17 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 6749c63..b946079 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -16,20 +16,9 @@ jobs: strategy: fail-fast: false matrix: - include: - - otp_version: 25 - os: ubuntu-22.04 - rebar3_version: 3.22 - latest: true - - otp_version: 24 - os: ubuntu-22.04 - rebar3_version: 3.22 - - otp_version: 23 - os: ubuntu-20.04 - rebar3_version: 3.18 - - otp_version: 22 - os: ubuntu-20.04 - rebar3_version: 3.18 + otp_version: [24, 25] + os: [ubuntu-22.04] + rebar3_version: [3.22] steps: - uses: actions/checkout@v4 @@ -62,8 +51,6 @@ jobs: - name: Compile run: rebar3 compile - - name: Lint - run: if [[ "${{ matrix.latest }}" == "true" ]]; then rebar3 lint; fi - name: EUnit tests run: rebar3 eunit - name: Dialyzer diff --git a/rebar.config b/rebar.config index 9b2278a..fae2cba 100644 --- a/rebar.config +++ b/rebar.config @@ -1,7 +1,7 @@ {erl_first_files, ["src/elli_handler.erl"]}. {erl_opts, [debug_info, {i, "include"}]}. -{minimum_otp_vsn, "22.0"}. +{minimum_otp_vsn, "24"}. {deps, []}. {xref_checks, [undefined_function_calls,locals_not_used]}. {profiles, [ From 4e9012f15d154f4614f71e911730209292d7b91f Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Fri, 28 Jun 2024 21:29:25 +0100 Subject: [PATCH 16/16] Act on review comments: keep test as-was Co-authored-by: Tristan Sloughter --- test/elli_tests.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/elli_tests.erl b/test/elli_tests.erl index 07cfdbf..266808c 100644 --- a/test/elli_tests.erl +++ b/test/elli_tests.erl @@ -738,6 +738,6 @@ register_test() -> invalid_callback_test() -> try elli:start_link([{callback, elli}]) - catch throw:E -> + catch _:E -> ?assertMatch(invalid_callback, E) end.