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.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)
|
||||
|
|
|
@ -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]
|
||||
(def valid-semver-version-values
|
||||
[["1.0.0"
|
||||
{:major 1
|
||||
:minor 0
|
||||
:patch 0
|
||||
: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"]
|
||||
"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]
|
||||
{:major 1
|
||||
:minor 2
|
||||
:patch 3
|
||||
:qualifier nil}
|
||||
"1.2.3"]
|
||||
"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]
|
||||
["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.0.0-SNAPSHOT"
|
||||
{:major 1
|
||||
:minor 0
|
||||
:patch 0
|
||||
:qualifier "SNAPSHOT"}
|
||||
"1.2.3"]
|
||||
"1.0.0"
|
||||
{:major "2.0.0"
|
||||
:minor "1.1.0"
|
||||
:patch "1.0.1"}]])
|
||||
|
||||
["1.2.3-b123"
|
||||
{:format :major-minor-and-incremental,
|
||||
:version [1 2 3]
|
||||
:qualifier "b123"}
|
||||
"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)))))
|
||||
|
||||
["1.2.3-rc1"
|
||||
{:format :major-minor-and-incremental,
|
||||
:version [1 2 3]
|
||||
:qualifier "rc1"}
|
||||
"1.2.3"]])
|
||||
|
||||
(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))))))))))
|
||||
|
|
Loading…
Reference in a new issue