From 4e3b177be7700c8afe38663eb88d953dd3c175cf Mon Sep 17 00:00:00 2001 From: Kuba Odias Date: Fri, 14 Dec 2018 14:21:34 +0100 Subject: [PATCH] Allow for extra hyphens in pre-release build version --- src/ec_semver.erl | 48 ++++++++++++++++++++++++++++++++++++++++ src/ec_semver_parser.erl | 2 +- 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/ec_semver.erl b/src/ec_semver.erl index 2982dfc..8141065 100644 --- a/src/ec_semver.erl +++ b/src/ec_semver.erl @@ -340,6 +340,8 @@ eql_test() -> "1.0.0.0-alpha.1+build.1")), ?assertMatch(true, eql("1.0-alpha.1+build.1", "v1.0.0.0-alpha.1+build.1")), + ?assertMatch(true, eql("1.0-pre-alpha.1", + "1.0.0-pre-alpha.1")), ?assertMatch(true, eql("aa", "aa")), ?assertMatch(true, eql("AA.BB", "AA.BB")), ?assertMatch(true, eql("BBB-super", "BBB-super")), @@ -367,6 +369,8 @@ gt_test() -> "1.0.0-alpha.1")), ?assertMatch(true, gt("1.0.0-beta.11", "1.0.0-beta.2")), + ?assertMatch(true, gt("1.0.0-pre-alpha.14", + "1.0.0-pre-alpha.3")), ?assertMatch(true, gt("1.0.0-beta.11", "1.0.0.0-beta.2")), ?assertMatch(true, gt("1.0.0-rc.1", "1.0.0-beta.11")), @@ -392,6 +396,8 @@ gt_test() -> "1.0.0-beta.11")), ?assertMatch(true, not gt("1.0.0-beta.11", "1.0.0-rc.1")), + ?assertMatch(true, not gt("1.0.0-pre-alpha.3", + "1.0.0-pre-alpha.14")), ?assertMatch(true, not gt("1.0.0-rc.1", "1.0.0-rc.1+build.1")), ?assertMatch(true, not gt("1.0.0-rc.1+build.1", @@ -430,6 +436,8 @@ lt_test() -> "1.0.0-beta.2")), ?assertMatch(true, lt("1.0.0-beta.2", "1.0.0-beta.11")), + ?assertMatch(true, lt("1.0.0-pre-alpha.3", + "1.0.0-pre-alpha.14")), ?assertMatch(true, lt("1.0.0-beta.11", "1.0.0-rc.1")), ?assertMatch(true, lt("1.0.0.1-beta.11", @@ -469,6 +477,8 @@ lt_test() -> "1.0.0-alpha.1")), ?assertMatch(true, not lt("1.0.0-beta.11", "1.0.0-beta.2")), + ?assertMatch(true, not lt("1.0.0-pre-alpha.14", + "1.0.0-pre-alpha.3")), ?assertMatch(true, not lt("1.0.0-rc.1", "1.0.0-beta.11")), ?assertMatch(true, not lt("1.0.0-rc.1+build.1", "1.0.0-rc.1")), ?assertMatch(true, not lt("1.0.0", "1.0.0-rc.1+build.1")), @@ -505,6 +515,8 @@ gte_test() -> "1.0.0.0-alpha.1+build.1")), ?assertMatch(true, gte("1.0.0-alpha.1", "1.0.0-alpha")), + ?assertMatch(true, gte("1.0.0-pre-alpha.2", + "1.0.0-pre-alpha")), ?assertMatch(true, gte("1.0.0-beta.2", "1.0.0-alpha.1")), ?assertMatch(true, gte("1.0.0-beta.11", @@ -522,6 +534,8 @@ gte_test() -> "1.3.7+build.2.b8f12d7")), ?assertMatch(true, not gte("1.0.0-alpha", "1.0.0-alpha.1")), + ?assertMatch(true, not gte("1.0.0-pre-alpha", + "1.0.0-pre-alpha.1")), ?assertMatch(true, not gte("CC", "DD")), ?assertMatch(true, not gte("1.0.0-alpha.1", "1.0.0-beta.2")), @@ -550,6 +564,8 @@ lte_test() -> "1.0.0-beta.2")), ?assertMatch(true, lte("1.0.0-beta.2", "1.0.0-beta.11")), + ?assertMatch(true, lte("1.0.0-pre-alpha.2", + "1.0.0-pre-alpha.11")), ?assertMatch(true, lte("1.0.0-beta.11", "1.0.0-rc.1")), ?assertMatch(true, lte("1.0.0-rc.1", @@ -582,6 +598,8 @@ lte_test() -> ?assertMatch(true, lte("cc","cc")), ?assertMatch(true, not lte("1.0.0-alpha.1", "1.0.0-alpha")), + ?assertMatch(true, not lte("1.0.0-pre-alpha.2", + "1.0.0-pre-alpha")), ?assertMatch(true, not lte("cc", "aa")), ?assertMatch(true, not lte("1.0.0-beta.2", "1.0.0-alpha.1")), @@ -607,6 +625,9 @@ between_test() -> ?assertMatch(true, between("1.0.0-beta.2", "1.0.0-beta.11", "1.0.0-beta.7")), + ?assertMatch(true, between("1.0.0-pre-alpha.2", + "1.0.0-pre-alpha.11", + "1.0.0-pre-alpha.7")), ?assertMatch(true, between("1.0.0-beta.11", "1.0.0-rc.3", "1.0.0-rc.1")), @@ -660,6 +681,9 @@ between_test() -> ?assertMatch(true, not between("1.0.0-alpha.1", "1.0.0-alpha.22", "1.0.0")), + ?assertMatch(true, not between("1.0.0-pre-alpha.1", + "1.0.0-pre-alpha.22", + "1.0.0")), ?assertMatch(true, not between("1.0.0", "1.0.0-alpha.1", "2.0")), @@ -693,6 +717,27 @@ pes_test() -> ?assertMatch(true, not pes("A.A", "A.B")), ?assertMatch(true, not pes("2.5", "2.6.5")). +parse_test() -> + ?assertEqual({1, {[],[]}}, parse(<<"1">>)), + ?assertEqual({{1,2,34},{[],[]}}, parse(<<"1.2.34">>)), + ?assertEqual({<<"a">>, {[],[]}}, parse(<<"a">>)), + ?assertEqual({{<<"a">>,<<"b">>}, {[],[]}}, parse(<<"a.b">>)), + ?assertEqual({1, {[],[]}}, parse(<<"1">>)), + ?assertEqual({{1,2}, {[],[]}}, parse(<<"1.2">>)), + ?assertEqual({{1,2,2}, {[],[]}}, parse(<<"1.2.2">>)), + ?assertEqual({{1,99,2}, {[],[]}}, parse(<<"1.99.2">>)), + ?assertEqual({{1,99,2}, {[<<"alpha">>],[]}}, parse(<<"1.99.2-alpha">>)), + ?assertEqual({{1,99,2}, {[<<"alpha">>,1], []}}, parse(<<"1.99.2-alpha.1">>)), + ?assertEqual({{1,99,2}, {[<<"pre-alpha">>,1], []}}, parse(<<"1.99.2-pre-alpha.1">>)), + ?assertEqual({{1,99,2}, {[], [<<"build">>, 1, <<"a36">>]}}, + parse(<<"1.99.2+build.1.a36">>)), + ?assertEqual({{1,99,2,44}, {[], [<<"build">>, 1, <<"a36">>]}}, + parse(<<"1.99.2.44+build.1.a36">>)), + ?assertEqual({{1,99,2}, {[<<"alpha">>, 1], [<<"build">>, 1, <<"a36">>]}}, + parse("1.99.2-alpha.1+build.1.a36")), + ?assertEqual({{1,99,2}, {[<<"pre-alpha">>, 1], [<<"build">>, 1, <<"a36">>]}}, + parse("1.99.2-pre-alpha.1+build.1.a36")). + version_format_test() -> ?assertEqual(["1", [], []], format({1, {[],[]}})), ?assertEqual(["1", ".", "2", ".", "34", [], []], format({{1,2,34},{[],[]}})), @@ -704,12 +749,15 @@ version_format_test() -> ?assertEqual(<<"1.99.2">>, erlang:iolist_to_binary(format({{1,99,2}, {[],[]}}))), ?assertEqual(<<"1.99.2-alpha">>, erlang:iolist_to_binary(format({{1,99,2}, {[<<"alpha">>],[]}}))), ?assertEqual(<<"1.99.2-alpha.1">>, erlang:iolist_to_binary(format({{1,99,2}, {[<<"alpha">>,1], []}}))), + ?assertEqual(<<"1.99.2-pre-alpha.1">>, erlang:iolist_to_binary(format({{1,99,2}, {[<<"pre-alpha">>,1], []}}))), ?assertEqual(<<"1.99.2+build.1.a36">>, erlang:iolist_to_binary(format({{1,99,2}, {[], [<<"build">>, 1, <<"a36">>]}}))), ?assertEqual(<<"1.99.2.44+build.1.a36">>, erlang:iolist_to_binary(format({{1,99,2,44}, {[], [<<"build">>, 1, <<"a36">>]}}))), ?assertEqual(<<"1.99.2-alpha.1+build.1.a36">>, erlang:iolist_to_binary(format({{1,99,2}, {[<<"alpha">>, 1], [<<"build">>, 1, <<"a36">>]}}))), + ?assertEqual(<<"1.99.2-pre-alpha.1+build.1.a36">>, + erlang:iolist_to_binary(format({{1,99,2}, {[<<"pre-alpha">>, 1], [<<"build">>, 1, <<"a36">>]}}))), ?assertEqual(<<"1">>, erlang:iolist_to_binary(format({1, {[],[]}}))). -endif. diff --git a/src/ec_semver_parser.erl b/src/ec_semver_parser.erl index 556f984..57b7264 100644 --- a/src/ec_semver_parser.erl +++ b/src/ec_semver_parser.erl @@ -44,7 +44,7 @@ parse(Input) when is_binary(Input) -> -spec 'alpha_part'(input(), index()) -> parse_result(). 'alpha_part'(Input, Index) -> - p(Input, Index, 'alpha_part', fun(I,D) -> (p_one_or_more(p_charclass(<<"[A-Za-z0-9]">>)))(I,D) end, fun(Node, _Idx) ->erlang:iolist_to_binary(Node) end). + p(Input, Index, 'alpha_part', fun(I,D) -> (p_one_or_more(p_charclass(<<"[A-Za-z0-9-]">>)))(I,D) end, fun(Node, _Idx) ->erlang:iolist_to_binary(Node) end). transform(_,Node,_Index) -> Node.