From 3fad8df8d39030c9e3b1f493c5ac1032b81f04cf Mon Sep 17 00:00:00 2001 From: "Jose E. Cribeiro Aneiros" Date: Mon, 25 Aug 2025 15:23:39 +0200 Subject: [PATCH 1/8] ci: update CI to use erlang 28 --- .github/workflows/ci.yml | 25 ++++++++++++++++--------- rebar.config | 8 ++++---- rebar.lock | 8 ++++---- 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index beeac13..5223137 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,21 +5,28 @@ on: branches: [main] pull_request: -env: - OTP-VERSION: 25.2.3 - REBAR3-VERSION: 3.20.0 - jobs: check: runs-on: ubuntu-latest + strategy: + matrix: + combo: + - otp-version: '25.2' + rebar3-version: '3.18.0' + - otp-version: '26.2' + rebar3-version: '3.23.0' + - otp-version: '27.2' + rebar3-version: '3.24.0' + - otp-version: '28.0' + rebar3-version: '3.25.0' steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - uses: erlef/setup-beam@v1 + - uses: erlef/setup-beam@v1.18 with: - otp-version: ${{ env.OTP-VERSION }} - rebar3-version: ${{ env.REBAR3-VERSION }} + otp-version: ${{ matrix.combo.otp-version }} + rebar3-version: ${{ matrix.combo.rebar3-version }} - uses: actions/cache@v4 id: rebar3-cache @@ -27,7 +34,7 @@ jobs: path: | ~/.cache/rebar3 _build - key: ${{ runner.os }}-${{ env.OTP-VERSION }}-${{ env.REBAR3-VERSION }}-${{ hashFiles('rebar.lock') }} + key: ${{ runner.os }}-${{ runner.arch }}-${{ matrix.combo.otp-version }}-${{ matrix.combo.rebar3-version }}-${{ hashFiles('rebar.lock') }} - name: Compile run: | diff --git a/rebar.config b/rebar.config index 8297b6b..23ef9e0 100644 --- a/rebar.config +++ b/rebar.config @@ -5,12 +5,12 @@ {deps, [ {elli, {git, "https://github.com/elli-lib/elli.git", {branch, "main"}}}, - {ndto, {git, "https://github.com/nomasystems/ndto.git", {tag, "0.3.1"}}}, - {njson, {git, "https://github.com/nomasystems/njson.git", {tag, "2.0.0"}}} + {ndto, {git, "https://github.com/nomasystems/ndto.git", {branch, "main"}}}, + {njson, {git, "https://github.com/nomasystems/njson.git", {branch, "main"}}} ]}. {plugins, [ - {rebar3_ndto, {git, "https://github.com/nomasystems/rebar3_ndto.git", {tag, "0.3.1"}}} + {rebar3_ndto, {git, "https://github.com/nomasystems/rebar3_ndto.git", {branch, "main"}}} ]}. {ndto, [ {specs, [ @@ -27,7 +27,7 @@ {project_plugins, [ erlfmt, - {gradualizer, {git, "https://github.com/josefs/Gradualizer.git", {tag, "0.3.0"}}}, + gradualizer, rebar3_ex_doc ]}. {erlfmt, [write]}. diff --git a/rebar.lock b/rebar.lock index dbc5a56..689c23a 100644 --- a/rebar.lock +++ b/rebar.lock @@ -1,16 +1,16 @@ [{<<"elli">>, {git,"https://github.com/elli-lib/elli.git", - {ref,"3ec352293ef493c142767127f4113c85541c32cc"}}, + {ref,"c874c42b5d5c1fb7477bc1655134d1de9cbe0223"}}, 0}, {<<"ncalendar">>, {git,"https://github.com/nomasystems/ncalendar.git", - {ref,"aa5615f6723585e45e82fa5524cb976cdfe3d7f7"}}, + {ref,"3a36a9cfe85da197f5032ce9e4c0a4a4dea9e38e"}}, 1}, {<<"ndto">>, {git,"https://github.com/nomasystems/ndto.git", - {ref,"295281b72ea4ac85e7c4d5ca42337c68b1aac137"}}, + {ref,"e90a034e0a76deec775abdded2951adbaa54258f"}}, 0}, {<<"njson">>, {git,"https://github.com/nomasystems/njson.git", - {ref,"94c586b92a7e24c403089cdbe2994b7e7c87b9cc"}}, + {ref,"42ce1fb20f43d50b5b5fdec1f3265b79c51fb632"}}, 0}]. From cd19f5f03d1cd4afc8685c028503a5d1383529dc Mon Sep 17 00:00:00 2001 From: "Jose E. Cribeiro Aneiros" Date: Tue, 26 Aug 2025 12:50:10 +0200 Subject: [PATCH 2/8] fix: Fixes empty json spec --- src/erf_parser/erf_parser_oas_3_0.erl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/erf_parser/erf_parser_oas_3_0.erl b/src/erf_parser/erf_parser_oas_3_0.erl index 7a4143f..29706ef 100644 --- a/src/erf_parser/erf_parser_oas_3_0.erl +++ b/src/erf_parser/erf_parser_oas_3_0.erl @@ -483,12 +483,10 @@ parse_response(_Response, CTX) -> Reason :: term(). parse_spec(SpecPath) -> case file:read_file(SpecPath) of - {ok, BinSpec} -> + {ok, BinSpec} when is_binary(BinSpec), byte_size(BinSpec) > 0 -> case filename:extension(SpecPath) of JSON when JSON =:= <<".json">> orelse JSON =:= ".json" -> case njson:decode(BinSpec) of - {ok, undefined} -> - {error, {invalid_spec, BinSpec}}; {ok, Spec} -> {ok, Spec}; {error, Reason} -> @@ -497,6 +495,8 @@ parse_spec(SpecPath) -> Extension -> {error, {unsupported_extension, Extension}} end; + {ok, EmptyBinSpec} -> + {error, {invalid_spec, EmptyBinSpec}}; {error, Reason} -> {error, {invalid_spec, Reason}} end. From 4cc5b653c36cf388f7bbc60f986827d589a3d1ee Mon Sep 17 00:00:00 2001 From: "Jose E. Cribeiro Aneiros" Date: Tue, 26 Aug 2025 14:28:00 +0200 Subject: [PATCH 3/8] fixes: dialyzer check --- rebar.config | 4 ++++ src/erf.erl | 23 +++++++++++++++++------ src/erf_parser/erf_parser_oas_3_0.erl | 7 ++++++- src/erf_telemetry.erl | 17 +++++++++++++---- test/erf_SUITE.erl | 16 ++++++++-------- test/erf_parser_oas_3_0_SUITE.erl | 4 ++-- 6 files changed, 50 insertions(+), 21 deletions(-) diff --git a/rebar.config b/rebar.config index 23ef9e0..418fe93 100644 --- a/rebar.config +++ b/rebar.config @@ -82,6 +82,10 @@ erf_static ]}. +{dialyzer, [ + {exclude_mods, [elli, elli_tcp, elli_handler, erf_http_server_elli]} +]}. + {xref_ignores, [ erf, {erf_http_server, start_link, 4}, diff --git a/src/erf.erl b/src/erf.erl index 14e8c4a..9903201 100644 --- a/src/erf.erl +++ b/src/erf.erl @@ -90,7 +90,13 @@ Headers :: [header()], Body :: body() | {file, binary()} }. +%% Conditional type definition for OTP 26 compatibility issue +%% https://github.com/erlang/otp/issues/5280 +-if(?OTP_RELEASE == 26). +-type route_patterns() :: [{Route :: binary(), RouteRegEx :: term()}]. +-else. -type route_patterns() :: [{Route :: binary(), RouteRegEx :: re:mp()}]. +-endif. -type static_dir() :: {dir, binary()}. -type static_file() :: {file, binary()}. -type static_route() :: {Path :: binary(), Resource :: static_file() | static_dir()}. @@ -405,18 +411,22 @@ route_patterns(API, StaticRoutes, SwaggerUI) -> lists:map( fun ({Path, {file, _ResourcePath}}) -> - {Path, <<"^", Path/binary, "$">>}; + {ok, RegEx} = re:compile(<<"^", Path/binary, "$">>), + {Path, RegEx}; ({Path, {dir, _ResourcePath}}) -> - {Path, <<"^", Path/binary>>} + {ok, RegEx} = re:compile(<<"^", Path/binary>>), + {Path, RegEx} end, StaticRoutes ), Acc1 = case SwaggerUI of true -> + {ok, SwaggerRegEx} = re:compile(<<"^/swagger$">>), + {ok, SpecRegEx} = re:compile(<<"^/swagger/spec.json$">>), [ - {<<"/swagger">>, <<"^/swagger$">>}, - {<<"/swagger/spec.json">>, <<"^/swagger/spec.json$">>} + {<<"/swagger">>, SwaggerRegEx}, + {<<"/swagger/spec.json">>, SpecRegEx} | Acc ]; _false -> @@ -427,7 +437,7 @@ route_patterns(API, StaticRoutes, SwaggerUI) -> -spec route_patterns(RawRoutes, Acc) -> RoutePatterns when RawRoutes :: [binary()], - Acc :: list(), + Acc :: route_patterns(), RoutePatterns :: route_patterns(). route_patterns([], Acc) -> Acc; @@ -441,9 +451,10 @@ route_patterns([Route | Routes], Acc) -> end, erlang:tl(string:split(Route, <<"/">>, all)) ), - RegEx = + RegExBinary = <<"^", (erlang:list_to_binary([ <<"/">> | lists:join(<<"/">>, RegExParts) ]))/binary, "$">>, + {ok, RegEx} = re:compile(RegExBinary), route_patterns(Routes, [{Route, RegEx} | Acc]). diff --git a/src/erf_parser/erf_parser_oas_3_0.erl b/src/erf_parser/erf_parser_oas_3_0.erl index 29706ef..fe93241 100644 --- a/src/erf_parser/erf_parser_oas_3_0.erl +++ b/src/erf_parser/erf_parser_oas_3_0.erl @@ -15,6 +15,8 @@ %% @doc An OpenAPI Specification 3.0 erf_parser. -module(erf_parser_oas_3_0). +-dialyzer({nowarn_function, oas_3_is_valid/1}). + %%% BEHAVIOURS -behaviour(erf_parser). @@ -57,7 +59,7 @@ parse(SpecPath) -> case parse_spec(SpecPath) of {ok, OAS} -> - case oas_3_0:is_valid(OAS) of + case oas_3_is_valid(OAS) of true -> BasePath = filename:dirname(SpecPath), BaseName = filename:rootname(filename:basename(SpecPath)), @@ -80,6 +82,9 @@ parse(SpecPath) -> %%%----------------------------------------------------------------------------- %%% INTERNAL FUNCTIONS %%%----------------------------------------------------------------------------- +oas_3_is_valid(OAS) -> + oas_3_0:is_valid(OAS). + -spec parse_api(OAS, CTX) -> Result when OAS :: spec(), CTX :: ctx(), diff --git a/src/erf_telemetry.erl b/src/erf_telemetry.erl index 0ce9499..5a9469b 100644 --- a/src/erf_telemetry.erl +++ b/src/erf_telemetry.erl @@ -15,6 +15,8 @@ %% erf's telemetry module. -module(erf_telemetry). +-dialyzer({nowarn_function, execute/3}). + %%% EXTERNAL EXPORTS -export([ event/4 @@ -60,8 +62,8 @@ event({request_exception, ExceptionData} = Event, Name, Req, Resp) -> case code:is_loaded(telemetry) of {file, _TelemetryBeam} -> - telemetry:execute( - metric(Event), + execute( + Event, [], metadata(Name, Req, Resp, ExceptionData) ); @@ -71,8 +73,8 @@ event({request_exception, ExceptionData} = Event, Name, Req, Resp) -> event({_EventName, Measurements} = Event, Name, Req, Resp) -> case code:is_loaded(telemetry) of {file, _TelemetryBeam} -> - telemetry:execute( - metric(Event), + execute( + Event, Measurements, metadata(Name, Req, Resp, #{}) ); @@ -83,6 +85,13 @@ event({_EventName, Measurements} = Event, Name, Req, Resp) -> %%%----------------------------------------------------------------------------- %%% INTERNAL FUNCTIONS %%%----------------------------------------------------------------------------- +execute(Event, Measurements, Metadata) -> + telemetry:execute( + metric(Event), + Measurements, + Metadata + ). + metadata(Name, Req, undefined, RawMetadata) -> RawMetadata#{ name => Name, diff --git a/test/erf_SUITE.erl b/test/erf_SUITE.erl index f219f96..c4c07fa 100644 --- a/test/erf_SUITE.erl +++ b/test/erf_SUITE.erl @@ -83,7 +83,7 @@ foo(_Conf) -> {ok, _Pid} = erf:start_link(#{ spec_path => filename:join( - code:lib_dir(erf, test), <<"fixtures/with_refs_oas_3_0_spec.json">> + [code:lib_dir(erf), "test", <<"fixtures/with_refs_oas_3_0_spec.json">>] ), callback => erf_callback, port => 8789, @@ -363,7 +363,7 @@ middlewares(_Conf) -> {ok, _Pid} = erf:start_link(#{ spec_path => filename:join( - code:lib_dir(erf, test), <<"fixtures/with_refs_oas_3_0_spec.json">> + [code:lib_dir(erf), "test", <<"fixtures/with_refs_oas_3_0_spec.json">>] ), preprocess_middlewares => [erf_preprocess_middleware, erf_preprocess_stop_middleware], callback => erf_callback, @@ -412,16 +412,16 @@ middlewares(_Conf) -> statics(_Conf) -> {ok, _Pid} = erf:start_link(#{ spec_path => filename:join( - code:lib_dir(erf, test), <<"fixtures/with_refs_oas_3_0_spec.json">> + [code:lib_dir(erf), "test", <<"fixtures/with_refs_oas_3_0_spec.json">>] ), callback => erf_callback, port => 8789, static_routes => [ - {<<"/static">>, {dir, filename:join(code:lib_dir(erf, test), <<"fixtures">>)}}, + {<<"/static">>, {dir, filename:join([code:lib_dir(erf), "test", <<"fixtures">>])}}, {<<"/common">>, {file, filename:join( - code:lib_dir(erf, test), <<"fixtures/common_oas_3_0_spec.json">> + [code:lib_dir(erf), "test", <<"fixtures/common_oas_3_0_spec.json">>] )}} ], name => erf_server @@ -429,7 +429,7 @@ statics(_Conf) -> {ok, Common} = file:read_file( filename:join( - code:lib_dir(erf, test), <<"fixtures/common_oas_3_0_spec.json">> + [code:lib_dir(erf), "test", <<"fixtures/common_oas_3_0_spec.json">>] ) ), @@ -499,7 +499,7 @@ swagger_ui(_Conf) -> start_stop(_Conf) -> {ok, Pid} = erf:start_link(#{ spec_path => filename:join( - code:lib_dir(erf, test), <<"fixtures/with_refs_oas_3_0_spec.json">> + [code:lib_dir(erf), "test", <<"fixtures/with_refs_oas_3_0_spec.json">>] ), callback => erf_callback, port => 8789, @@ -542,7 +542,7 @@ reload_conf(_Conf) -> {ok, _Pid} = erf:start_link(#{ spec_path => filename:join( - code:lib_dir(erf, test), <<"fixtures/with_refs_oas_3_0_spec.json">> + [code:lib_dir(erf), "test", <<"fixtures/with_refs_oas_3_0_spec.json">>] ), callback => erf_callback, port => 8789, diff --git a/test/erf_parser_oas_3_0_SUITE.erl b/test/erf_parser_oas_3_0_SUITE.erl index 3cecea1..b38ff9d 100644 --- a/test/erf_parser_oas_3_0_SUITE.erl +++ b/test/erf_parser_oas_3_0_SUITE.erl @@ -239,7 +239,7 @@ petstore(_Conf) -> with_refs(_Conf) -> WithRefsOAS = unicode:characters_to_binary( - code:lib_dir(erf, test) ++ "/fixtures/with_refs_oas_3_0_spec.json" + code:lib_dir(erf) ++ "/test" ++ "/fixtures/with_refs_oas_3_0_spec.json" ), {ok, WithRefsAPI} = erf_parser:parse(WithRefsOAS, erf_parser_oas_3_0), @@ -271,7 +271,7 @@ with_refs(_Conf) -> invalid(_Conf) -> Invalid = unicode:characters_to_binary( - code:lib_dir(erf, test) ++ "/fixtures/invalid_oas_3_0_spec.json" + code:lib_dir(erf) ++ "/test" ++ "/fixtures/invalid_oas_3_0_spec.json" ), ?assertMatch( From 8792c16029694779d8fdd59fe0115f16daaa8458 Mon Sep 17 00:00:00 2001 From: "Jose E. Cribeiro Aneiros" Date: Tue, 26 Aug 2025 15:33:26 +0200 Subject: [PATCH 4/8] fixes: remove re:compile --- src/erf.erl | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/src/erf.erl b/src/erf.erl index 9903201..3bffc22 100644 --- a/src/erf.erl +++ b/src/erf.erl @@ -90,13 +90,8 @@ Headers :: [header()], Body :: body() | {file, binary()} }. -%% Conditional type definition for OTP 26 compatibility issue -%% https://github.com/erlang/otp/issues/5280 --if(?OTP_RELEASE == 26). --type route_patterns() :: [{Route :: binary(), RouteRegEx :: term()}]. --else. --type route_patterns() :: [{Route :: binary(), RouteRegEx :: re:mp()}]. --endif. + +-type route_patterns() :: [{Route :: binary(), RouteRegEx :: binary()}]. -type static_dir() :: {dir, binary()}. -type static_file() :: {file, binary()}. -type static_route() :: {Path :: binary(), Resource :: static_file() | static_dir()}. @@ -411,22 +406,18 @@ route_patterns(API, StaticRoutes, SwaggerUI) -> lists:map( fun ({Path, {file, _ResourcePath}}) -> - {ok, RegEx} = re:compile(<<"^", Path/binary, "$">>), - {Path, RegEx}; + {Path, <<"^", Path/binary, "$">>}; ({Path, {dir, _ResourcePath}}) -> - {ok, RegEx} = re:compile(<<"^", Path/binary>>), - {Path, RegEx} + {Path, <<"^", Path/binary>>} end, StaticRoutes ), Acc1 = case SwaggerUI of true -> - {ok, SwaggerRegEx} = re:compile(<<"^/swagger$">>), - {ok, SpecRegEx} = re:compile(<<"^/swagger/spec.json$">>), [ - {<<"/swagger">>, SwaggerRegEx}, - {<<"/swagger/spec.json">>, SpecRegEx} + {<<"/swagger">>, <<"^/swagger$">>}, + {<<"/swagger/spec.json">>, <<"^/swagger/spec.json$">>} | Acc ]; _false -> @@ -456,5 +447,4 @@ route_patterns([Route | Routes], Acc) -> (erlang:list_to_binary([ <<"/">> | lists:join(<<"/">>, RegExParts) ]))/binary, "$">>, - {ok, RegEx} = re:compile(RegExBinary), - route_patterns(Routes, [{Route, RegEx} | Acc]). + route_patterns(Routes, [{Route, RegExBinary} | Acc]). From 8e388372a0fa676a5930eb73548c07058c5637a5 Mon Sep 17 00:00:00 2001 From: "Jose E. Cribeiro Aneiros" Date: Tue, 26 Aug 2025 15:44:43 +0200 Subject: [PATCH 5/8] fix: Remove function warnings and and no_unkwnown to dialyzer --- rebar.config | 2 +- src/erf_parser/erf_parser_oas_3_0.erl | 7 +------ src/erf_telemetry.erl | 17 ++++------------- 3 files changed, 6 insertions(+), 20 deletions(-) diff --git a/rebar.config b/rebar.config index 418fe93..1fb4c0e 100644 --- a/rebar.config +++ b/rebar.config @@ -83,7 +83,7 @@ ]}. {dialyzer, [ - {exclude_mods, [elli, elli_tcp, elli_handler, erf_http_server_elli]} + {warnings, [no_unknown]} ]}. {xref_ignores, [ diff --git a/src/erf_parser/erf_parser_oas_3_0.erl b/src/erf_parser/erf_parser_oas_3_0.erl index fe93241..29706ef 100644 --- a/src/erf_parser/erf_parser_oas_3_0.erl +++ b/src/erf_parser/erf_parser_oas_3_0.erl @@ -15,8 +15,6 @@ %% @doc An OpenAPI Specification 3.0 erf_parser. -module(erf_parser_oas_3_0). --dialyzer({nowarn_function, oas_3_is_valid/1}). - %%% BEHAVIOURS -behaviour(erf_parser). @@ -59,7 +57,7 @@ parse(SpecPath) -> case parse_spec(SpecPath) of {ok, OAS} -> - case oas_3_is_valid(OAS) of + case oas_3_0:is_valid(OAS) of true -> BasePath = filename:dirname(SpecPath), BaseName = filename:rootname(filename:basename(SpecPath)), @@ -82,9 +80,6 @@ parse(SpecPath) -> %%%----------------------------------------------------------------------------- %%% INTERNAL FUNCTIONS %%%----------------------------------------------------------------------------- -oas_3_is_valid(OAS) -> - oas_3_0:is_valid(OAS). - -spec parse_api(OAS, CTX) -> Result when OAS :: spec(), CTX :: ctx(), diff --git a/src/erf_telemetry.erl b/src/erf_telemetry.erl index 5a9469b..0ce9499 100644 --- a/src/erf_telemetry.erl +++ b/src/erf_telemetry.erl @@ -15,8 +15,6 @@ %% erf's telemetry module. -module(erf_telemetry). --dialyzer({nowarn_function, execute/3}). - %%% EXTERNAL EXPORTS -export([ event/4 @@ -62,8 +60,8 @@ event({request_exception, ExceptionData} = Event, Name, Req, Resp) -> case code:is_loaded(telemetry) of {file, _TelemetryBeam} -> - execute( - Event, + telemetry:execute( + metric(Event), [], metadata(Name, Req, Resp, ExceptionData) ); @@ -73,8 +71,8 @@ event({request_exception, ExceptionData} = Event, Name, Req, Resp) -> event({_EventName, Measurements} = Event, Name, Req, Resp) -> case code:is_loaded(telemetry) of {file, _TelemetryBeam} -> - execute( - Event, + telemetry:execute( + metric(Event), Measurements, metadata(Name, Req, Resp, #{}) ); @@ -85,13 +83,6 @@ event({_EventName, Measurements} = Event, Name, Req, Resp) -> %%%----------------------------------------------------------------------------- %%% INTERNAL FUNCTIONS %%%----------------------------------------------------------------------------- -execute(Event, Measurements, Metadata) -> - telemetry:execute( - metric(Event), - Measurements, - Metadata - ). - metadata(Name, Req, undefined, RawMetadata) -> RawMetadata#{ name => Name, From 84b683ed5c41b0c5641490eb8a094357286c1c52 Mon Sep 17 00:00:00 2001 From: "Jose E. Cribeiro Aneiros" Date: Wed, 27 Aug 2025 09:02:01 +0200 Subject: [PATCH 6/8] ci: upgrade rebar3 version to 3.23.0 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5223137..25bafad 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,7 +12,7 @@ jobs: matrix: combo: - otp-version: '25.2' - rebar3-version: '3.18.0' + rebar3-version: '3.23.0' - otp-version: '26.2' rebar3-version: '3.23.0' - otp-version: '27.2' From ae4df9cbb7be09f0584db1dd291491055b183f22 Mon Sep 17 00:00:00 2001 From: "Jose E. Cribeiro Aneiros" Date: Wed, 27 Aug 2025 09:09:39 +0200 Subject: [PATCH 7/8] revert: aesthetic changes --- src/erf.erl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/erf.erl b/src/erf.erl index 3bffc22..0a760cf 100644 --- a/src/erf.erl +++ b/src/erf.erl @@ -90,8 +90,8 @@ Headers :: [header()], Body :: body() | {file, binary()} }. - -type route_patterns() :: [{Route :: binary(), RouteRegEx :: binary()}]. + -type static_dir() :: {dir, binary()}. -type static_file() :: {file, binary()}. -type static_route() :: {Path :: binary(), Resource :: static_file() | static_dir()}. @@ -442,9 +442,9 @@ route_patterns([Route | Routes], Acc) -> end, erlang:tl(string:split(Route, <<"/">>, all)) ), - RegExBinary = + RegEx = <<"^", (erlang:list_to_binary([ <<"/">> | lists:join(<<"/">>, RegExParts) ]))/binary, "$">>, - route_patterns(Routes, [{Route, RegExBinary} | Acc]). + route_patterns(Routes, [{Route, RegEx} | Acc]). From f6f3df7d2a6de7558adb370c61802d07f6b5c58c Mon Sep 17 00:00:00 2001 From: "Jose E. Cribeiro Aneiros" Date: Wed, 27 Aug 2025 09:15:22 +0200 Subject: [PATCH 8/8] Apply suggestions from code review Co-authored-by: Javier Garea --- src/erf.erl | 1 - 1 file changed, 1 deletion(-) diff --git a/src/erf.erl b/src/erf.erl index 0a760cf..ba37463 100644 --- a/src/erf.erl +++ b/src/erf.erl @@ -91,7 +91,6 @@ Body :: body() | {file, binary()} }. -type route_patterns() :: [{Route :: binary(), RouteRegEx :: binary()}]. - -type static_dir() :: {dir, binary()}. -type static_file() :: {file, binary()}. -type static_route() :: {Path :: binary(), Resource :: static_file() | static_dir()}.