-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" }
}
} [
{
"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
{ +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 } [
{
! 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
<PRIVATE
+: number<=> ( 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> 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*
- <version> ;
+: 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+ = ;