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

View file

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