Fix up version parsing code.

Now with working tests!

Signed-off-by: Wayne <wayne@puppetlabs.com>
This commit is contained in:
Wayne 2014-05-19 19:43:03 -07:00
parent 88aa1ac009
commit 7cae821956
2 changed files with 105 additions and 128 deletions

View file

@ -3,57 +3,49 @@
[clojure.edn :as edn]
[clojure.string :as string]))
(def maven-version-regexes
{:major-only #"(\d+)(?:-(.+))?"
:major-and-minor #"(\d+)\.(\d+)(?:-(.+))?"
:major-minor-and-incremental #"(\d+)\.(\d+)\.(\d+)(?:-(.+))?"})
(defn parse-semantic-version [version-string]
"Create map representing the given version string. Raise exception if the
string does not follow guidelines setforth by Semantic Versioning 2.0.0,
http://semver.org/"
;; <MajorVersion>.<MinorVersion>.<PatchVersion>[-<BuildNumber | Qualifier >]
(let [version-map (zipmap [:major :minor :patch]
(map #(Integer/parseInt %)
(drop 1 (re-matches #"(\d+).(\d+).(\d+).*"
version-string))))
qualifier (last (re-matches #".*-(.+)?" version-string))]
(if-not (empty? version-map)
(merge version-map {:qualifier qualifier})
(throw (Exception. "Unrecognized version string.")))))
(defn parse-maven-version [version-string]
"Create map representing the given version string."
;; <MajorVersion [> . <MinorVersion [> . <IncrementalVersion ] ] [> - <BuildNumber | Qualifier ]>
(cond
(re-matches (:major-only maven-version-regexes) version-string)
(let [[[_ major qualifier]]
(re-seq (:major-only maven-version-regexes) version-string)]
{:format :major-only
:version (map edn/read-string [major])
:qualifier qualifier})
(re-matches (:major-and-minor maven-version-regexes) version-string)
(let [[[_ major minor qualifier]]
(re-seq (:major-and-minor maven-version-regexes) version-string)]
{:format :major-and-minor
:version (map edn/read-string [major minor])
:qualifier qualifier})
(re-matches (:major-minor-and-incremental maven-version-regexes) version-string)
(let [[[_ major minor incremental qualifier]]
(re-seq (:major-minor-and-incremental maven-version-regexes) version-string)]
{:format :major-minor-and-incremental
:version (map edn/read-string [major minor incremental])
:qualifier qualifier})
:else
{:format :not-recognized
:version version-string}))
(defn version-map->string
"Given a version-map, return a proper string of the :version array."
(defn version-map->string
"Given a version-map, return a string representing the version."
[version-map]
(if (= (:format version-map) :not-recognized)
(:version version-map)
(string/join "." (:version version-map))))
(let [{:keys [major minor patch qualifier]} version-map]
(str major "." minor "." patch)))
(defn increment-version
"Given version as a map of the sort returned by parse-maven-version, return
incremented version as a map. Always assume version level to be incremented is
the least significant position, ie incremental if it's available, minor if
not, major if neither incremental nor minor are available. Let user manually
adjust major/minor if necessary."
[version-map]
(if (= (:format version-map) :not-recognized)
(throw (Exception. "Unrecognized Maven version string."))
(assoc! version-map :version (conj (butlast (:version version-map)) 0))))
"Given version as a map of the sort returned by parse-semantic-version, return
incremented version as a map."
([version-map]
(increment-version version-map (:format version-map)))
([version-map version-level]
(let [{:keys [major minor patch qualifier]} version-map]
(cond
(= version-level :major)
{:major (inc major)
:minor 0
:patch 0
:qualifier qualifier}
(= version-level :minor)
{:major major
:minor (inc minor)
:patch 0
:qualifier qualifier}
(= version-level :patch)
{:major major
:minor minor
:patch (inc patch)
:qualifier qualifier}))))
(defn release
"Bump release version, tag commit, and deploy to maven repository.
@ -66,7 +58,7 @@ This task is intended to perform the following roughly-outlined tasks:
* Commit new version number to SCM.
"
[project]
(let [current-version (parse-maven-version (:version project))
(let [current-version (parse-semantic-version (:version project))
new-dev-version (increment-version current-version)
release-version-string (version-map->string current-version)
new-dev-version-string (str (version-map->string new-dev-version)

View file

@ -1,96 +1,81 @@
(ns leiningen.test.release
(:use [clojure.test]
[clojure.pprint :as pprint]
[leiningen.release]))
(def invalid-maven-version-values
[ ["-1"
{:format :not-recognized,
:version "-1"}
"-1"]
(def invalid-semver-version-values
[["1.0"
"1.0"]
["derpin"
{:format :not-recognized
:version "derpin"}
"derpin"]])
(def valid-maven-version-values
[["1"
{:format :major-only,
:version [1]
:qualifier nil}
"1"]
["1-SNAPSHOT"
{:format :major-only,
:version [1]
:qualifier "SNAPSHOT"}
"1"]
["1-b123"
{:format :major-only,
:version [1]
:qualifier "b123"}
"1"]
["1.2"
{:format :major-and-minor,
:version [1 2]
:qualifier nil}
"1.2"]
["1.2-SNAPSHOT"
{:format :major-and-minor,
:version [1 2]
:qualifier "SNAPSHOT"}
"1.2"]
["1.2-b123"
{:format :major-and-minor,
:version [1 2]
:qualifier "b123"}
"1.2"]
(def valid-semver-version-values
[["1.0.0"
{:major 1
:minor 0
:patch 0
:qualifier nil}
"1.0.0"
{:major "2.0.0"
:minor "1.1.0"
:patch "1.0.1"}]
["1.2.3"
{:format :major-minor-and-incremental,
:version [1 2 3]
:qualifier nil}
"1.2.3"]
{:major 1
:minor 2
:patch 3
:qualifier nil}
"1.2.3"
{:major "2.0.0"
:minor "1.3.0"
:patch "1.2.4"}]
["1.2.3-SNAPSHOT"
{:format :major-minor-and-incremental,
:version [1 2 3]
:qualifier "SNAPSHOT"}
"1.2.3"]
["1.2.3-herp"
{:major 1
:minor 2
:patch 3
:qualifier "herp"}
"1.2.3"
{:major "2.0.0"
:minor "1.3.0"
:patch "1.2.4"}]
["1.2.3-b123"
{:format :major-minor-and-incremental,
:version [1 2 3]
:qualifier "b123"}
"1.2.3"]
["1.0.0-SNAPSHOT"
{:major 1
:minor 0
:patch 0
:qualifier "SNAPSHOT"}
"1.0.0"
{:major "2.0.0"
:minor "1.1.0"
:patch "1.0.1"}]])
["1.2.3-rc1"
{:format :major-minor-and-incremental,
:version [1 2 3]
:qualifier "rc1"}
"1.2.3"]])
(deftest test-parse-semver-version
(testing "Testing semantic version string parsing"
(doseq [semver-test-data valid-semver-version-values]
(testing (format "with valid version strings: %s"
(first semver-test-data))
(is (= (parse-semantic-version (first semver-test-data))
(second semver-test-data)))))
(deftest parse-valid-maven-version
(doseq [maven-test-data valid-maven-version-values]
(is (= (parse-maven-version (first maven-test-data))
(second maven-test-data)))))
(deftest parse-invalid-maven-version
(doseq [maven-test-data invalid-maven-version-values]
(is (= (parse-maven-version (first maven-test-data))
(second maven-test-data)))))
(testing "with invalid version strings."
(doseq [semver-test-data invalid-semver-version-values]
(is (thrown-with-msg?
Exception #"Unrecognized version string"
(parse-semantic-version (first semver-test-data))))))))
(deftest version-map->string-valid
(doseq [maven-test-data valid-maven-version-values]
(is (= (nth maven-test-data 2)
(version-map->string (second maven-test-data))))))
(doseq [semver-test-data valid-semver-version-values]
(is (= (nth semver-test-data 2)
(version-map->string (second semver-test-data))))))
(deftest version-map->string-invalid
(doseq [maven-test-data invalid-maven-version-values]
(is (= (nth maven-test-data 2)
(version-map->string (second maven-test-data))))))
;; TODO increment-version test
(deftest test-increment-version
(testing "Testing semantic version increment"
(doseq [semver-test-data valid-semver-version-values]
(testing (format "with valid version: %s\n"
semver-test-data)
(doseq [[k v] (map identity (nth semver-test-data 3))]
(testing (format "version-level %s" (name k))
(is (= v (version-map->string
(increment-version
(nth semver-test-data 1) k))))))))))