semantic-versioning: maybe this is more forgiving and simpler.
parent
896d3fc460
commit
094e405713
|
|
@ -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 } [
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
<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+ = ;
|
||||
|
|
|
|||
Loading…
Reference in New Issue