Fix up version parsing code.
Now with working tests! Signed-off-by: Wayne <wayne@puppetlabs.com>
This commit is contained in:
parent
88aa1ac009
commit
7cae821956
2 changed files with 105 additions and 128 deletions
|
@ -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)
|
||||||
|
|
|
@ -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))))))))))
|
||||||
|
|
Loading…
Reference in a new issue