diff --git a/lein-template/resources/leiningen/new/duct/base/config.edn b/lein-template/resources/leiningen/new/duct/base/config.edn index 0a6e983..cc1b955 100644 --- a/lein-template/resources/leiningen/new/duct/base/config.edn +++ b/lein-template/resources/leiningen/new/duct/base/config.edn @@ -3,21 +3,20 @@ {:duct.core/project-ns <><<#ataraxy?>> :duct.router/ataraxy - {:routes {<<#example?>>[:get "/example"] [:<>.handler/example]<>}}<><<#web?>><<^ataraxy?>> + {:routes {<<#example?>>[:get "/example"] [:<>.handler/example]<>}}<><<#web?>><<^ataraxy?>><<#cascading-routes>> - :duct.router/cascading - [<<#example?>>#ig/ref :<>.handler/example<>]<><><<#example?>> + :duct.router/cascading<<&.>><><<^cascading-routes>> - :<>.<<#web?>>handler<><<^web?>>service<>/example - {<<#jdbc?>>:db #ig/ref :duct.database/sql<>}<>} + :duct.router/cascading []<><><><<#example?>> + + :<>.<<#web?>>handler<><<^web?>>service<>/example<<^jdbc?>> {}<><<#jdbc?>> + {:db #ig/ref :duct.database/sql}<><><<#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 {}<><<#site?>> - :duct.module.web/site {}<><<#web?>><<^site?>><<^api?>> - :duct.module/web {}<><><><<#jdbc?>> - :duct.module/sql {}<><<#cljs?>> - :duct.module/cljs {:main <>.client}<>} + :duct.module/logging {}<<#web?>><<^site?>><<^api?>> + :duct.module/web {}<><><><<#modules>> + <<&.>><>} diff --git a/lein-template/resources/leiningen/new/duct/base/dev.edn b/lein-template/resources/leiningen/new/duct/base/dev.edn index 36cf08d..2fad397 100644 --- a/lein-template/resources/leiningen/new/duct/base/dev.edn +++ b/lein-template/resources/leiningen/new/duct/base/dev.edn @@ -1,3 +1,3 @@ {{=<< >>=}} -{<<#jdbc?>>:duct.database/sql - {:connection-uri "<>"}<>} +{<<#profile-dev>><<&.>> + <>} diff --git a/lein-template/resources/leiningen/new/duct/base/project.clj b/lein-template/resources/leiningen/new/duct/base/project.clj index 2e9f2bd..af1faa0 100644 --- a/lein-template/resources/leiningen/new/duct/base/project.clj +++ b/lein-template/resources/leiningen/new/duct/base/project.clj @@ -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"] diff --git a/lein-template/src/duct/duct_template.clj b/lein-template/src/duct/duct_template.clj index 236e764..0bcdc39 100644 --- a/lein-template/src/duct/duct_template.clj +++ b/lein-template/src/duct/duct_template.clj @@ -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) @@ -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"]] diff --git a/lein-template/src/leiningen/new/duct.clj b/lein-template/src/leiningen/new/duct.clj index 38bc3ff..bf7bd22 100644 --- a/lein-template/src/leiningen/new/duct.clj +++ b/lein-template/src/leiningen/new/duct.clj @@ -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] @@ -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 @@ -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)] @@ -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) @@ -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))))