]> gitweb.factorcode.org Git - factor.git/commitdiff
semantic-versioning: maybe this is more forgiving and simpler.
authorJohn Benediktsson <mrjbq7@gmail.com>
Wed, 17 Jul 2013 02:47:07 +0000 (19:47 -0700)
committerJohn Benediktsson <mrjbq7@gmail.com>
Wed, 17 Jul 2013 02:47:07 +0000 (19:47 -0700)
extra/semantic-versioning/semantic-versioning-tests.factor
extra/semantic-versioning/semantic-versioning.factor

index b1ca786e6762bd5f63d533fb00e367366356f0ec..a07a690916930db8772d4894b9f9284b97bc01ce 100644 (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 } [
     {
index 839cbbe509ca80b2f0bcc6b51fe8c211dcb44640..8d6ad224104caa2ecdf3d2e42cbd7a8da450b1ef 100644 (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+ = ;