diff --git a/extra/semantic-versioning/semantic-versioning-tests.factor b/extra/semantic-versioning/semantic-versioning-tests.factor index b1ca786e67..a07a690916 100644 --- a/extra/semantic-versioning/semantic-versioning-tests.factor +++ b/extra/semantic-versioning/semantic-versioning-tests.factor @@ -1,16 +1,17 @@ -USING: math.order semantic-versioning tools.test ; +USING: kernel math.order random semantic-versioning sequences +sorting tools.test ; IN: semantic-versioning.tests { { - T{ version f 0 1 0 "" "" } - T{ version f 0 97 0 "" "" } - T{ version f 1 1 0 "" "" } - T{ version f 1 2 3 "" "" } - T{ version f 1 0 0 "dev1" "" } - T{ version f 1 0 0 "rc1" "build" } - T{ version f 1 0 0 "rc2" "" } - T{ version f 1 0 0 "rc2" "123456" } + { { 0 1 0 } f f } + { { 0 97 0 } f f } + { { 1 1 0 } f f } + { { 1 2 3 } f f } + { { 1 0 0 } "dev1" f } + { { 1 0 0 } "rc1" "build" } + { { 1 0 0 } "rc2" f } + { { 1 0 0 } "rc2" "123456" } } } [ { @@ -22,7 +23,7 @@ IN: semantic-versioning.tests "1.0.0rc1+build" "1.0.0-rc2" "1.0.0-rc2+123456" - } [ string>version ] map + } [ split-version ] map ] unit-test { +gt+ } [ "1.2.0dev1" "0.12.1dev2" version<=> ] unit-test @@ -33,6 +34,7 @@ IN: semantic-versioning.tests { +lt+ } [ "1.0.0-rc.1" "1.0.0-rc.11" version<=> ] unit-test { +lt+ } [ "1.0.0-rc.2" "1.0.0-rc.11" version<=> ] unit-test { +eq+ } [ "1.0.0+foo" "1.0.0+bar" version<=> ] unit-test +{ +eq+ } [ "1.0" "1.0.0" version<=> ] unit-test { t } [ { diff --git a/extra/semantic-versioning/semantic-versioning.factor b/extra/semantic-versioning/semantic-versioning.factor index 839cbbe509..8d6ad22410 100644 --- a/extra/semantic-versioning/semantic-versioning.factor +++ b/extra/semantic-versioning/semantic-versioning.factor @@ -1,38 +1,32 @@ ! Copyright (C) 2010 Maximilian Lupke. ! See http://factorcode.org/license.txt for BSD license. -USING: accessors arrays ascii kernel math.order math.parser -sequences sorting.human sorting.slots splitting ; +USING: arrays ascii kernel math math.order math.parser sequences +sorting.human splitting ; IN: semantic-versioning ( obj1 obj2 -- <=> ) + [ [ zero? ] trim-tail-slice ] bi@ <=> ; + : pre-release<=> ( obj1 obj2 -- <=> ) 2dup [ empty? ] either? [ [ length ] bi@ >=< ] [ human<=> ] if ; PRIVATE> -TUPLE: version major minor patch pre-release build ; - -C: version - -M: version <=> - { - { major>> <=> } - { minor>> <=> } - { patch>> <=> } - { pre-release>> pre-release<=> } - } compare-slots ; - -: string>version ( string -- version ) - "." split1 "." split1 dup [ digit? not ] find - [ [ cut ] [ CHAR: - = [ rest ] when ] bi* ] [ drop "" ] if* - [ [ string>number 0 or ] tri@ ] dip - CHAR: + over index [ cut rest ] [ "" ] if* - ; +: split-version ( string -- array ) + "+" split1 [ + dup [ [ digit? not ] [ CHAR: . = not ] bi and ] find [ + [ cut ] [ CHAR: - = [ rest [ f ] when-empty ] when ] bi* + ] [ drop f ] if* + [ "." split [ string>number 0 or ] map 3 0 pad-tail ] dip + ] dip 3array ; : version<=> ( version1 version2 -- <=> ) - [ string>version ] bi@ <=> ; + [ split-version ] bi@ + 2dup [ first ] bi@ number<=> dup +eq+ = + [ drop [ second ] bi@ pre-release<=> ] [ 2nip ] if ; : version< ( version1 version2 -- ? ) version<=> +lt+ = ;