From b81c1975bb2517cafff161d0335658efbc837a26 Mon Sep 17 00:00:00 2001 From: Martin Frost Date: Mon, 1 Sep 2025 15:26:52 +0200 Subject: [PATCH] feat!: Use OTP json module instead of jsx This is a breaking change for OTP <27, so it should probably be a major version bump. --- .github/workflows/build.yml | 2 +- rebar.config | 2 +- rebar.lock | 9 +------ src/jsonformat.app.src | 3 +-- src/jsonformat.erl | 50 +++++++++++++++++++++++-------------- 5 files changed, 35 insertions(+), 31 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ea85f4f..a09e6ce 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,7 +12,7 @@ jobs: name: OTP ${{matrix.otp}} strategy: matrix: - otp: ["24", "25", "26"] + otp: ["27", "28"] fail-fast: false steps: - uses: actions/checkout@v4 diff --git a/rebar.config b/rebar.config index bb4685c..9011938 100644 --- a/rebar.config +++ b/rebar.config @@ -12,7 +12,7 @@ %% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF %% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -{deps, [jsx]}. +{minimum_otp_vsn, "27"}. {project_plugins, [ erlfmt diff --git a/rebar.lock b/rebar.lock index 072c702..57afcca 100644 --- a/rebar.lock +++ b/rebar.lock @@ -1,8 +1 @@ -{"1.2.0", -[{<<"jsx">>,{pkg,<<"jsx">>,<<"3.1.0">>},0}]}. -[ -{pkg_hash,[ - {<<"jsx">>, <<"D12516BAA0BB23A59BB35DCCAF02A1BD08243FCBB9EFE24F2D9D056CCFF71268">>}]}, -{pkg_hash_ext,[ - {<<"jsx">>, <<"0C5CC8FDC11B53CC25CF65AC6705AD39E54ECC56D1C22E4ADB8F5A53FB9427F3">>}]} -]. +[]. diff --git a/src/jsonformat.app.src b/src/jsonformat.app.src index 35c2579..5309dd5 100644 --- a/src/jsonformat.app.src +++ b/src/jsonformat.app.src @@ -21,8 +21,7 @@ {registered, []}, {applications, [ kernel, - stdlib, - jsx + stdlib ]}, {licenses, ["MIT"]}, {links, [{"Github", "https://github.com/kivra/jsonformat/"}]} diff --git a/src/jsonformat.erl b/src/jsonformat.erl index 6d82c05..ce418c5 100644 --- a/src/jsonformat.erl +++ b/src/jsonformat.erl @@ -96,7 +96,7 @@ merge_meta(Msg, Meta0, Config) -> maps:merge(Msg, Meta2). encode(Data, Config) -> - Json = jsx:encode(Data), + Json = json:encode(Data), case new_line(Config) of true -> [Json, new_line_type(Config)]; false -> Json @@ -174,17 +174,19 @@ meta_with(Meta, _ConfigNotPresent) -> -include_lib("eunit/include/eunit.hrl"). -define(assertJSONEqual(Expected, Actual), - ?assertEqual(jsx:decode(Expected, [return_maps]), jsx:decode(Actual, [return_maps])) + ?assertEqual(json:decode(Expected), json:decode(Actual)) ). format_test() -> ?assertJSONEqual( <<"{\"level\":\"alert\",\"text\":\"derp\"}">>, - format(#{level => alert, msg => {string, "derp"}, meta => #{}}, #{}) + iolist_to_binary(format(#{level => alert, msg => {string, "derp"}, meta => #{}}, #{})) ), ?assertJSONEqual( <<"{\"herp\":\"derp\",\"level\":\"alert\"}">>, - format(#{level => alert, msg => {report, #{herp => derp}}, meta => #{}}, #{}) + iolist_to_binary( + format(#{level => alert, msg => {report, #{herp => derp}}, meta => #{}}, #{}) + ) ). format_funs_test() -> @@ -196,7 +198,9 @@ format_funs_test() -> }, ?assertJSONEqual( <<"{\"level\":\"info\",\"text\":\"derp\",\"time\":2}">>, - format(#{level => alert, msg => {string, "derp"}, meta => #{time => 1}}, Config1) + iolist_to_binary( + format(#{level => alert, msg => {string, "derp"}, meta => #{time => 1}}, Config1) + ) ), Config2 = #{ @@ -207,7 +211,9 @@ format_funs_test() -> }, ?assertJSONEqual( <<"{\"level\":\"alert\",\"text\":\"derp\",\"time\":2}">>, - format(#{level => alert, msg => {string, "derp"}, meta => #{time => 1}}, Config2) + iolist_to_binary( + format(#{level => alert, msg => {string, "derp"}, meta => #{time => 1}}, Config2) + ) ). key_mapping_test() -> @@ -219,7 +225,7 @@ key_mapping_test() -> }, ?assertJSONEqual( <<"{\"lvl\":\"alert\",\"message\":\"derp\"}">>, - format(#{level => alert, msg => {string, "derp"}, meta => #{}}, Config1) + iolist_to_binary(format(#{level => alert, msg => {string, "derp"}, meta => #{}}, Config1)) ), Config2 = #{ @@ -230,7 +236,7 @@ key_mapping_test() -> }, ?assertJSONEqual( <<"{\"level\":\"derp\",\"lvl\":\"alert\"}">>, - format(#{level => alert, msg => {string, "derp"}, meta => #{}}, Config2) + iolist_to_binary(format(#{level => alert, msg => {string, "derp"}, meta => #{}}, Config2)) ), Config3 = #{ @@ -241,7 +247,7 @@ key_mapping_test() -> }, ?assertJSONEqual( <<"{\"lvl\":\"alert\",\"text\":\"derp\"}">>, - format(#{level => alert, msg => {string, "derp"}, meta => #{}}, Config3) + iolist_to_binary(format(#{level => alert, msg => {string, "derp"}, meta => #{}}, Config3)) ), Config4 = #{ @@ -250,7 +256,9 @@ key_mapping_test() -> }, ?assertJSONEqual( <<"{\"level\":\"alert\",\"text\":\"derp\",\"timestamp\":2}">>, - format(#{level => alert, msg => {string, "derp"}, meta => #{time => 1}}, Config4) + iolist_to_binary( + format(#{level => alert, msg => {string, "derp"}, meta => #{time => 1}}, Config4) + ) ). list_format_test() -> @@ -262,7 +270,7 @@ list_format_test() -> }, ?assertJSONEqual( <<"{\"level\":\"error\",\"report\":\"[{hej,\\\"hopp\\\"}]\",\"time\":1}">>, - format(ErrorReport, #{}) + iolist_to_binary(format(ErrorReport, #{})) ). meta_without_test() -> @@ -277,7 +285,7 @@ meta_without_test() -> <<"level">> => <<"info">>, <<"secret">> => <<"xyz">> }, - jsx:decode(format(Error, #{}), [return_maps]) + json:decode(iolist_to_binary(format(Error, #{}))) ), Config2 = #{meta_without => [secret]}, ?assertEqual( @@ -285,7 +293,7 @@ meta_without_test() -> <<"answer">> => 42, <<"level">> => <<"info">> }, - jsx:decode(format(Error, Config2), [return_maps]) + json:decode(iolist_to_binary(format(Error, Config2))) ), ok. @@ -301,7 +309,7 @@ meta_with_test() -> <<"level">> => <<"info">>, <<"secret">> => <<"xyz">> }, - jsx:decode(format(Error, #{}), [return_maps]) + json:decode(iolist_to_binary(format(Error, #{}))) ), Config2 = #{meta_with => [level]}, ?assertEqual( @@ -309,23 +317,27 @@ meta_with_test() -> <<"answer">> => 42, <<"level">> => <<"info">> }, - jsx:decode(format(Error, Config2), [return_maps]) + json:decode(iolist_to_binary(format(Error, Config2))) ), ok. newline_test() -> ConfigDefault = #{new_line => true}, ?assertEqual( - [<<"{\"level\":\"alert\",\"text\":\"derp\"}">>, <<"\n">>], - format(#{level => alert, msg => {string, "derp"}, meta => #{}}, ConfigDefault) + <<"{\"level\":\"alert\",\"text\":\"derp\"}\n">>, + iolist_to_binary( + format(#{level => alert, msg => {string, "derp"}, meta => #{}}, ConfigDefault) + ) ), ConfigCRLF = #{ new_line_type => crlf, new_line => true }, ?assertEqual( - [<<"{\"level\":\"alert\",\"text\":\"derp\"}">>, <<"\r\n">>], - format(#{level => alert, msg => {string, "derp"}, meta => #{}}, ConfigCRLF) + <<"{\"level\":\"alert\",\"text\":\"derp\"}\r\n">>, + iolist_to_binary( + format(#{level => alert, msg => {string, "derp"}, meta => #{}}, ConfigCRLF) + ) ). -endif.