Merge branch 'decompose-profiles'

This commit is contained in:
Jean Niklas L'orange 2014-01-27 16:33:04 +01:00
commit c845d45377
3 changed files with 67 additions and 12 deletions

View file

@ -291,10 +291,14 @@
(defn- setup-profile-with-empty (defn- setup-profile-with-empty
"Setup a profile map with empty defaults." "Setup a profile map with empty defaults."
[raw-profile-map] [raw-profile]
(let [empty-defaults (select-keys empty-meta-merge-defaults (if (composite-profile? raw-profile)
(keys raw-profile-map))] ;; TODO: drop support for partially-composite profiles in 3.0
(setup-map-defaults raw-profile-map empty-defaults))) (mapv #(cond-> % (composite-profile? %) setup-profile-with-empty)
raw-profile)
(let [empty-defaults (select-keys empty-meta-merge-defaults
(keys raw-profile))]
(setup-map-defaults raw-profile empty-defaults))))
(defn- setup-map-of-profiles (defn- setup-map-of-profiles
"Setup a map of profile maps with empty defaults." "Setup a map of profile maps with empty defaults."
@ -494,6 +498,18 @@
(keyword? profile) (keyword? profile)
(vary-meta update-in [:active-profiles] (fnil conj []) profile))) (vary-meta update-in [:active-profiles] (fnil conj []) profile)))
(defn- expand-profile* [profiles profile]
(let [content (get profiles profile)]
;; TODO: drop "support" for partially-composite profiles in 3.0
(if (or (nil? content) (map? content) (some map? content))
[profile]
(mapcat (partial expand-profile* profiles) content))))
(defn expand-profile
"Recursively expand the keyword `profile` in `project` to a sequence of
atomic (non-composite) profile keywords."
[project profile] (expand-profile* (:profiles project) profile))
(defn- warn-user-repos [profiles] (defn- warn-user-repos [profiles]
(let [has-url? (fn [entry] (or (string? entry) (:url entry))) (let [has-url? (fn [entry] (or (string? entry) (:url entry)))
repo-profiles (filter #(->> (second %) repo-profiles (filter #(->> (second %)

View file

@ -21,16 +21,21 @@
prefixes (map first profiles)] prefixes (map first profiles)]
(cond (cond
(every? #{\+ \-} prefixes) (every? #{\+ \-} prefixes)
(distinct (reduce (distinct
(fn [result profile] (reduce (fn [result profile]
(if (= \+ (first profile)) (let [pm (first profile), profile (keyword (subs profile 1))
(concat result [(keyword (subs profile 1))]) profiles (project/expand-profile project profile)]
(remove #(= (keyword (subs profile 1)) %) result))) (if (= \+ pm)
(:active-profiles (meta project)) (concat result profiles)
profiles)) (remove (set profiles) result))))
(mapcat (partial project/expand-profile project)
(:active-profiles (meta project)))
profiles))
(not-any? #{\+ \-} prefixes) (not-any? #{\+ \-} prefixes)
(map keyword profiles) (distinct
(mapcat (comp #(project/expand-profile project %) keyword)
profiles))
:else :else
(throw (throw

View file

@ -0,0 +1,34 @@
(ns leiningen.test.with-profile
(:use clojure.test leiningen.with-profile))
(defn- prj-map
([p] (prj-map p [:default]))
([p a]
(let [p {:profiles p}, m {:without-profiles p, :active-profiles a}]
(with-meta p m))))
(deftest test-profiles-in-group
(doseq [[project pgroup expected]
[[(prj-map {:default [:base :dev]}) "+foo" [:base, :dev, :foo]]
[(prj-map {:default [:base :dev]}) "-dev" [:base]]
[(prj-map {:default [:base :dev]}) "-dev,+foo" [:base, :foo]]
[(prj-map {:default [:base :dev]}) "-default,+foo" [:foo]]
[(prj-map {:default [:base :dev], :foo [:bar :baz]})
"-default,+foo" [:bar :baz]]
[(prj-map {:default [:base :dev], :dev [:foo]
:foo [:bar :baz], :baz [:zap]})
"-default,+foo" [:bar :zap]]
;; TODO: drop support for partially-composite profiles in 3.0
[(prj-map {:default [:base :dev], :foo [:bar {:gross true}]})
"-default,+foo" [:foo]]]]
(is (= expected (profiles-in-group project pgroup))))
(testing "no +/- prefixes in arg"
(let [project (prj-map {:default [:base :dev] :foo [:bar :baz]
:bar [:one :two] :baz [:three :four]})]
(doseq [[pgroup expected]
[["foo" [:one :two :three :four]]
["bar" [:one :two]]
["baz" [:three :four]]
["bar,baz" [:one :two :three :four]]
["baz,bar" [:three :four :one :two]]]]
(is (= expected (profiles-in-group project pgroup)))))))