semantic-versioning: maybe this is more forgiving and simpler.

db4
John Benediktsson 2013-07-16 19:47:07 -07:00
parent 896d3fc460
commit 094e405713
2 changed files with 27 additions and 31 deletions

View File

@ -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 } [
{

View File

@ -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+ = ;