Follow separator convention, reorganise, and add some comments

This commit is contained in:
Chris Truter 2014-05-24 04:58:05 +02:00
parent c071b8bd37
commit a10fbc569e

View file

@ -4,7 +4,7 @@
[net.cgrand.sjacket :refer [str-pt]] [net.cgrand.sjacket :refer [str-pt]]
[net.cgrand.sjacket.parser :refer [parser]])) [net.cgrand.sjacket.parser :refer [parser]]))
;;-- helpers ;;-- Helpers
(defn- wrap-string [str] ["\"" str "\""]) (defn- wrap-string [str] ["\"" str "\""])
@ -20,16 +20,7 @@
(defn- fail-argument! [msg] (defn- fail-argument! [msg]
(throw (IllegalArgumentException. msg))) (throw (IllegalArgumentException. msg)))
;;-- operations ;;-- Traversal
(defn- bump-version [version]
;; NOTE: technically http://semver.org/ defines 'prelease' and 'meta' data
;; TODO: better error handling here (wrong structure? not a number?)
(let [[major minor patch meta] (str/split version #"\.|\-")
new-patch (inc (Long/parseLong patch))]
(format "%s.%s.%d-%s" major minor new-patch meta)))
;;-- traversal
(defn- defproject? [loc] (defn- defproject? [loc]
(let [{:keys [tag content]} (zip/node loc)] (let [{:keys [tag content]} (zip/node loc)]
@ -57,7 +48,7 @@
(or (fail-argument! "Project definition not found")) (or (fail-argument! "Project definition not found"))
zip/up)) zip/up))
;;-- mutation ;;-- Modifiers
(defn- swap-version [project-str fn & args] (defn- swap-version [project-str fn & args]
(str-pt (-> (get-project project-str) (str-pt (-> (get-project project-str)
@ -66,7 +57,9 @@
(#(apply zip/edit % fn args)) (#(apply zip/edit % fn args))
zip/root))) zip/root)))
;;-- tasks ;; TODO: the regular case, eg [:description]
;; TODO: the nested case, eg [:license :name]
(defn- run-reset-str [target value] (defn- run-reset-str [target value]
(assoc target :content (wrap-string value))) (assoc target :content (wrap-string value)))
@ -74,10 +67,7 @@
(defn- run-swap-str [target fn & args] (defn- run-swap-str [target fn & args]
(update-in target [:content] (comp wrap-string fn unwrap-string))) (update-in target [:content] (comp wrap-string fn unwrap-string)))
(defn run-bump-version [target] ;;; Public API
(run-swap-str target bump-version))
;;-- public API
(defn change* (defn change*
[project-str key & [fn & args]] [project-str key & [fn & args]]
@ -92,3 +82,18 @@
;; cannot work with project, as want to preserve formatting, comments, etc ;; cannot work with project, as want to preserve formatting, comments, etc
(let [source (slurp "project.clj")] (let [source (slurp "project.clj")]
(spit "project.clj" (apply change* source key args)))) (spit "project.clj" (apply change* source key args))))
;;; SANDBOX
;;; useful for driving dev, too naive an implementation
(defn- bump-version [version]
(let [[major minor patch meta] (str/split version #"\.|\-")
new-patch (inc (Long/parseLong patch))]
(format "%s.%s.%d-%s" major minor new-patch meta)))
;; note the type awkwardness here.
;; we should probably just go in/out through sjacket's reader/parser, always
(defn run-bump-version [target]
(run-swap-str target bump-version))