Skip to content

Commit

Permalink
Merge pull request duct-framework#89 from magnetcoop/master
Browse files Browse the repository at this point in the history
Allow external profiles to modify configuration
  • Loading branch information
weavejester authored May 11, 2019
2 parents 439b36c + 3fcb68a commit 3bfa255
Show file tree
Hide file tree
Showing 5 changed files with 82 additions and 52 deletions.
21 changes: 10 additions & 11 deletions lein-template/resources/leiningen/new/duct/base/config.edn
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,20 @@
{:duct.core/project-ns <<namespace>><<#ataraxy?>>

:duct.router/ataraxy
{:routes {<<#example?>>[:get "/example"] [:<<namespace>>.handler/example]<</example?>>}}<</ataraxy?>><<#web?>><<^ataraxy?>>
{:routes {<<#example?>>[:get "/example"] [:<<namespace>>.handler/example]<</example?>>}}<</ataraxy?>><<#web?>><<^ataraxy?>><<#cascading-routes>>

:duct.router/cascading
[<<#example?>>#ig/ref :<<namespace>>.handler/example<</example?>>]<</ataraxy?>><</web?>><<#example?>>
:duct.router/cascading<<&.>><</cascading-routes>><<^cascading-routes>>

:<<namespace>>.<<#web?>>handler<</web?>><<^web?>>service<</web?>>/example
{<<#jdbc?>>:db #ig/ref :duct.database/sql<</jdbc?>>}<</example?>>}
:duct.router/cascading []<</cascading-routes>><</ataraxy?>><</web?>><<#example?>>

:<<namespace>>.<<#web?>>handler<</web?>><<^web?>>service<</web?>>/example<<^jdbc?>> {}<</jdbc?>><<#jdbc?>>
{:db #ig/ref :duct.database/sql}<</jdbc?>><</example?>><<#profile-base>>
<<&.>><</profile-base>>}

:duct.profile/dev #duct/include "dev"
:duct.profile/local #duct/include "local"
:duct.profile/prod {}

:duct.module/logging {}<<#api?>>
:duct.module.web/api {}<</api?>><<#site?>>
:duct.module.web/site {}<</site?>><<#web?>><<^site?>><<^api?>>
:duct.module/web {}<</api?>><</site?>><</web?>><<#jdbc?>>
:duct.module/sql {}<</jdbc?>><<#cljs?>>
:duct.module/cljs {:main <<namespace>>.client}<</cljs?>>}
:duct.module/logging {}<<#web?>><<^site?>><<^api?>>
:duct.module/web {}<</api?>><</site?>><</web?>><<#modules>>
<<&.>><</modules>>}
4 changes: 2 additions & 2 deletions lein-template/resources/leiningen/new/duct/base/dev.edn
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{{=<< >>=}}
{<<#jdbc?>>:duct.database/sql
{:connection-uri "<<dev-database>>"}<</jdbc?>>}
{<<#profile-dev>><<&.>>
<</profile-dev>>}
5 changes: 2 additions & 3 deletions lein-template/resources/leiningen/new/duct/base/project.clj
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,8 @@
:profiles
{:dev [:project/dev :profiles/dev]
:repl {:prep-tasks ^:replace ["javac" "compile"]{{#cljs?}}
:dependencies [[cider/piggieback "0.4.0"]]{{/cljs?}}
:repl-options {:init-ns user{{#cljs?}}
:nrepl-middleware [cider.piggieback/wrap-cljs-repl]{{/cljs?}}}}
:dependencies [[cider/piggieback "0.4.0"]]{{/cljs?}}{{#repl-options}}
:repl-options {{&.}}{{/repl-options}}}
:uberjar {:aot :all}
:profiles/dev {}
:project/dev {:source-paths ["dev/src"]
Expand Down
57 changes: 35 additions & 22 deletions lein-template/src/duct/duct_template.clj
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,15 @@
"src/{{dirs}}/handler"
"test/{{dirs}}/handler"])

(defn example-profile [{:keys [profiles]}]
{:vars {:example? true}
(defn example-profile [{:keys [profiles project-ns]}]
{:vars
{:example? true
:cascading-routes (format "\n [#ig/ref [:%s.handler/example]]" project-ns)}
:templates
(cond
(profiles :site)
{"src/{{dirs}}/handler/example.clj" (resource "example/handler.clj")
"test/{{dirs}}/handler/example_test.clj" (resource "example/handler_test.clj")
{"src/{{dirs}}/handler/example.clj" (resource "example/handler.clj")
"test/{{dirs}}/handler/example_test.clj" (resource "example/handler_test.clj")
"resources/{{dirs}}/handler/example/example.html" (resource "example/example.html")}

(profiles :api)
Expand All @@ -30,40 +32,51 @@
{:deps '[[duct/module.web "0.7.0"]]
:dev-deps '[[kerodon "0.9.0"]]
:vars {:web? true, :api? true}
:modules {:duct.module.web/api {}}
:dirs web-directories})

(defn site-profile [_]
{:deps '[[duct/module.web "0.7.0"]]
:dev-deps '[[kerodon "0.9.0"]]
:vars {:web? true, :site? true}
:modules {:duct.module.web/site {}}
:dirs web-directories})

(defn cljs-profile [_]
{:deps '[[duct/module.web "0.7.0"]
[duct/module.cljs "0.4.1"]]
:dev-deps '[[kerodon "0.9.0"]]
:vars {:cljs? true}
:dirs web-directories
:templates {"src/{{dirs}}/client.cljs" (resource "cljs/client.cljs")}})
(defn cljs-profile [{:keys [project-ns]}]
{:deps '[[duct/module.web "0.7.0"]
[duct/module.cljs "0.4.1"]]
:dev-deps '[[kerodon "0.9.0"]]
:vars {:cljs? true, :web? true}
:dirs web-directories
:modules {:duct.module/cljs {:main (symbol (str project-ns ".client"))}}
:templates {"src/{{dirs}}/client.cljs" (resource "cljs/client.cljs")}
:repl-options {:nrepl-middleware '[cider.piggieback/wrap-cljs-repl]}})

(defn heroku-profile [{:keys [project-name]}]
{:vars {:uberjar-name (str project-name "-standalone.jar")}
:templates {"Procfile" (resource "heroku/Procfile")}})

(defn postgres-profile [_]
{:deps '[[duct/module.sql "0.5.0"]
[org.postgresql/postgresql "42.2.5"]]
:vars {:jdbc? true
:postgres? true
:dev-database "jdbc:postgresql://localhost/postgres"}})
(let [postgresql-uri "jdbc:postgresql://localhost/postgres"]
{:deps '[[duct/module.sql "0.5.0"]
[org.postgresql/postgresql "42.2.5"]]
:modules {:duct.module/sql {}}
:profile-dev {:duct.database/sql {:connection-uri postgresql-uri}}
:vars {:jdbc? true
:postgres? true
:dev-database postgresql-uri}}))

(defn sqlite-profile [_]
{:deps '[[duct/module.sql "0.5.0"]
[org.xerial/sqlite-jdbc "3.27.2"]]
:dirs ["db"]
:vars {:jdbc? true
:sqlite? true
:dev-database "jdbc:sqlite:db/dev.sqlite"}})
(let [sqlite-uri "jdbc:sqlite:db/dev.sqlite"]
{:deps '[[duct/module.sql "0.5.0"]
[org.xerial/sqlite-jdbc "3.27.2"]]
:dirs ["db"]
:modules {:duct.module/sql {}}
:profile-dev {:duct.database/sql
{:connection-uri sqlite-uri}}
:vars {:jdbc? true
:sqlite? true
:dev-database sqlite-uri}}))

(defn ataraxy-profile [_]
{:deps '[[duct/module.ataraxy "0.3.0"]]
Expand Down
47 changes: 33 additions & 14 deletions lein-template/src/leiningen/new/duct.clj
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
(ns leiningen.new.duct
(:require [clojure.java.io :as io]
[clojure.pprint :refer [pprint]]
[clojure.string :as str]
[leiningen.core.classpath :as cp]
[leiningen.core.main :as main]
[leiningen.core.project :as project]
Expand All @@ -18,13 +20,14 @@
:profiles (set profiles)}))

(defn base-profile [{:keys [project-name project-ns project-path raw-name]}]
{:deps '[[duct/module.logging "0.4.0"]]
{:deps
'[[duct/module.logging "0.4.0"]]
:vars
{:raw-name raw-name
:name project-name
:namespace project-ns
:dirs project-path
:year (templates/year)}
{:raw-name raw-name
:name project-name
:namespace project-ns
:dirs project-path
:year (templates/year)}
:dirs
["test/{{dirs}}"]
:templates
Expand All @@ -36,7 +39,9 @@
"dev/resources/dev.edn" (resource "base/dev.edn")
"resources/{{dirs}}/config.edn" (resource "base/config.edn")
"src/{{dirs}}/main.clj" (resource "base/main.clj")
"src/duct_hierarchy.edn" (resource "base/duct_hierarchy.edn")}})
"src/duct_hierarchy.edn" (resource "base/duct_hierarchy.edn")}
:repl-options
{:init-ns 'user}})

(defn profile-names [hints]
(for [hint hints :when (re-matches #"\+[A-Za-z0-9-/.]+" hint)]
Expand Down Expand Up @@ -85,11 +90,15 @@
(-> (sorted-map) (into a) (into b) vec))

(defn merge-profiles [a b]
{:vars (merge (:vars a) (:vars b))
:dirs (into (set (:dirs a)) (:dirs b))
:deps (merge-deps (:deps a) (:deps b))
:dev-deps (merge-deps (:dev-deps a) (:dev-deps b))
:templates (into (:templates a) (:templates b))})
{:vars (merge (:vars a) (:vars b))
:dirs (into (set (:dirs a)) (:dirs b))
:deps (merge-deps (:deps a) (:deps b))
:dev-deps (merge-deps (:dev-deps a) (:dev-deps b))
:templates (into (:templates a) (:templates b))
:modules (merge (:modules a) (:modules b))
:profile-base (merge (:profile-base a) (:profile-base b))
:profile-dev (merge (:profile-dev a) (:profile-dev b))
:repl-options (merge (:repl-options a) (:repl-options b))})

(defn project-template [name hints]
(let [profiles (profile-names hints)
Expand All @@ -107,8 +116,18 @@
(sort-by key)
(map (fn [[path temp]] [path (render-resource data temp)]))))

(defn generate-project [{:keys [vars templates dirs] :as profile}]
(let [data (merge vars (select-keys profile [:deps :dev-deps]))
(defn- format-kv [[k v]]
(if (string? v)
[(str k v)]
[(str k) (str/trim-newline (with-out-str (pprint v)))]))

(defn generate-project
[{:keys [vars templates dirs modules profile-base profile-dev] :as profile}]
(let [data (-> vars
(merge (select-keys profile [:deps :dev-deps :repl-options]))
(assoc :modules (mapcat format-kv modules))
(assoc :profile-base (mapcat format-kv profile-base))
(assoc :profile-dev (mapcat format-kv profile-dev)))
files (render-templates data templates)]
(apply templates/->files data (concat files dirs))))

Expand Down

0 comments on commit 3bfa255

Please sign in to comment.