Skip to content

Commit

Permalink
Allow external profiles to modify configuration
Browse files Browse the repository at this point in the history
Adds more ways for external profiles to alter the configuration when
creating a new project.

Allows the use of the following keys: :modules, :profile-base,
:profile-dev and :repl-options.

Also adds :cascading-routes for customizing the cascading router.
  • Loading branch information
Damian Hryniewicz committed May 9, 2019
1 parent 439b36c commit 3fcb68a
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 3fcb68a

Please sign in to comment.