update deps, reorg project files/config, and more

- remove lein-ring. focus on uberjar builds only (no war support now)
  while also allowing easy swapping out of standard jetty for
  jetty-async (thus, removal of lein-ring which does not support this)
- "downgrade" to clojure/tools.logging. mainly out of preference for
  having logging work with dependencies using older logging solutions
  "out of the box" and using plain old log4j configuration
This commit is contained in:
Gered 2014-12-27 14:18:43 -05:00
parent 43ec433f31
commit cad18b417f
25 changed files with 3139 additions and 3499 deletions

View file

@ -1,7 +1,8 @@
(ns leiningen.new.yawt
(:require [leiningen.new.templates :refer [renderer name-to-path sanitize sanitize-ns ->files]]
[leiningen.core.main :as main]
[clojure.string :as str]))
(:require
[leiningen.new.templates :refer [renderer name-to-path sanitize sanitize-ns ->files]]
[leiningen.core.main :as main]
[clojure.string :as str]))
(def render (renderer "yawt"))
@ -15,15 +16,15 @@
#{"webapp"})
(defn get-base-files [data]
[[".gitignore" (render "gitignore" data)]
["project.clj" (render "project.clj" data)]
["config/dev/config.edn" (render "config/dev/config.edn" data)]
["config/release/config.edn" (render "config/release/config.edn" data)]
["config/repl/config.edn" (render "config/repl/config.edn" data)]
["resources/log4j.properties" (render "resources/log4j.properties" data)]
["src/{{path}}/core.clj" (render "src/root_ns/core.clj" data)]
["src/{{path}}/utils.clj" (render "src/root_ns/utils.clj" data)]
["src/{{path}}/api/hello.clj" (render "src/root_ns/api/hello.clj" data)]])
[[".gitignore" (render "gitignore" data)]
["project.clj" (render "project.clj" data)]
["env-resources/dev/config.edn" (render "env-resources/dev/config.edn" data)]
["env-resources/uberjar/config.edn" (render "env-resources/uberjar/config.edn" data)]
["env-resources/repl/config.edn" (render "env-resources/repl/config.edn" data)]
["resources/log4j.properties" (render "resources/log4j.properties" data)]
["src/{{path}}/core.clj" (render "src/root_ns/core.clj" data)]
["src/{{path}}/utils.clj" (render "src/root_ns/utils.clj" data)]
["src/{{path}}/api/hello.clj" (render "src/root_ns/api/hello.clj" data)]])
(defn get-webapp-files [data]
["resources/public/cljs"
@ -48,11 +49,11 @@
["resources/views/index.html" (render "resources/views/index.html" data)]
["resources/views/error.html" (render "resources/views/error.html" data)]
["resources/views/notfound.html" (render "resources/views/notfound.html" data)]
["src-cljs/{{path}}/client/main.cljs" (render "src-cljs/root_ns/client/main.cljs" data)]
["src-cljs/{{path}}/client/page_components.cljs" (render "src-cljs/root_ns/client/page_components.cljs" data)]
["src-cljs/{{path}}/client/utils.cljs" (render "src-cljs/root_ns/client/utils.cljs" data)]
["src-cljs/{{path}}/client/routes/home.cljs" (render "src-cljs/root_ns/client/routes/home.cljs" data)]
["src-cljs/{{path}}/client/routes/misc.cljs" (render "src-cljs/root_ns/client/routes/misc.cljs" data)]
["src/{{path}}/client/main.cljs" (render "src/root_ns/client/main.cljs" data)]
["src/{{path}}/client/page_components.cljs" (render "src/root_ns/client/page_components.cljs" data)]
["src/{{path}}/client/utils.cljs" (render "src/root_ns/client/utils.cljs" data)]
["src/{{path}}/client/routes/home.cljs" (render "src/root_ns/client/routes/home.cljs" data)]
["src/{{path}}/client/routes/misc.cljs" (render "src/root_ns/client/routes/misc.cljs" data)]
["src/{{path}}/middleware.clj" (render "src/root_ns/middleware_webapp.clj" data)]
["src/{{path}}/routes.clj" (render "src/root_ns/routes_webapp.clj" data)]
["src/{{path}}/views.clj" (render "src/root_ns/views_webapp.clj" data)]

View file

@ -1,8 +1,10 @@
(ns user
(:require weasel.repl.websocket
cemerick.piggieback
[edn-config.core :refer [env]])
(:use {{root-ns}}.core))
(:require
weasel.repl.websocket
cemerick.piggieback
[edn-config.core :refer [env]])
(:use
{{root-ns}}.core))
(defn cljs-repl
"after establishing a normal repl with leiningen (e.g. by running 'lein repl') *and* after

View file

@ -1,6 +1,8 @@
(ns user
(:require [edn-config.core :refer [env]])
(:use {{root-ns}}.core))
(:require
[edn-config.core :refer [env]])
(:use
{{root-ns}}.core))
(if (env :auto-start-server?)
(.start (Thread. #(start-server))))

View file

@ -3,43 +3,44 @@
:url "http://example.com/FIXME"
:min-lein-version "2.0.0"
:source-paths ["src"{{#webapp}} "src-cljs"{{/webapp}}]
:main {{root-ns}}.core
:dependencies [[org.clojure/clojure "1.6.0"]
[compojure "1.2.1"]
[metosin/ring-http-response "0.4.0"]
[lib-noir "0.9.4"]
[compojure "1.3.1"]
[metosin/ring-http-response "0.5.2"]
[lib-noir "0.9.5" :exclusions [javax.servlet/servlet-api]]
[ring-custom-jetty-server "0.1.0"]
[ring-server "0.3.1"]
{{#webapp}}
[org.clojure/clojurescript "0.0-2371"]
[org.clojure/clojurescript "0.0-2511"]
[weasel "0.4.2"]
[clj-pebble "0.2.0"]
[secretary "1.2.1"]
[reagent "0.4.3"]
[reagent "0.5.0-alpha"]
[cljs-ajax "0.3.3"]
{{/webapp}}
{{#webservice}}
[hiccup "1.0.5"]
{{/webservice}}
{{#postgresql}}
[org.clojure/java.jdbc "0.3.5"]
[postgresql/postgresql "8.4-702.jdbc4"]
[ragtime "0.3.7"]
[org.clojure/java.jdbc "0.3.6"]
[org.postgresql/postgresql "9.2-1003-jdbc4"]
[clojurewerkz/ragtime "0.4.0"]
{{/postgresql}}
{{#couchdb}}
[com.ashafa/clutch "0.4.0"]
[com.cemerick/url "0.1.1"]
{{/couchdb}}
[com.taoensso/timbre "3.3.1"]
[org.clojure/tools.logging "0.3.1"]
[log4j "1.2.16"]
[org.slf4j/slf4j-log4j12 "1.7.1"]
[edn-config "0.2"]
[prone "0.6.0"]]
[prone "0.8.0"]]
:plugins [[lein-ring "0.8.13"]
:plugins [[lein-environ "1.0.0"]
{{#webapp}}
[lein-cljsbuild "1.0.3"]
{{/webapp}}
[lein-environ "1.0.0"]
[lein-pprint "1.1.1"]]
{{#webapp}}
@ -50,42 +51,42 @@
:repl-options {:init-ns user}
{{/webservice}}
:ring {:handler {{root-ns}}.core/app
:init {{root-ns}}.core/init
:destroy {{root-ns}}.core/destroy
:port 8080}
{{#webapp}}
:cljsbuild {:builds [{:id "dev"
:source-paths ["src-cljs"]
:compiler {:output-to "resources/public/cljs/main.js"
:source-map "resources/public/cljs/main.js.map"
:output-dir "resources/public/cljs/target"
:optimizations :none
:pretty-print true}}
{:id "release"
:source-paths ["src-cljs"]
:compiler {:output-to "resources/public/cljs/main.js"
:optimizations :advanced
:pretty-print false
:output-wrapper false
:externs ["externs/jquery.js"]
:closure-warnings {:non-standard-jsdoc :off}}}]}
:cljsbuild {:builds {:main
{:source-paths ["src/{{path}}/client"]
:compiler {:output-to "resources/public/cljs/main.js"
:source-map "resources/public/cljs/main.js.map"
:output-dir "resources/public/cljs/target"
:externs ["externs/jquery.js"]
:optimizations :none
:pretty-print true}}}}
{{/webapp}}
:profiles {:release {:resource-paths ["config/release"]
:profiles {:uberjar {:resource-paths ["env-resources/uberjar"]
:aot :all
:omit-source true
{{#webapp}}
:hooks [leiningen.cljsbuild]
:cljsbuild {:jar true
:builds {:main
{:compiler ^:replace
{:output-to "resources/public/cljs/main.js"
:optimizations :advanced
:pretty-print false}}}}
{{/webapp}}
:ring {:open-browser? false
:stacktraces? false
:auto-reload? false}}
:dev {:resource-paths ["config/dev"]
:dependencies [[ring-mock "0.1.5"]
[ring/ring-devel "1.3.1"]
{{#webapp}}
[com.cemerick/piggieback "0.1.3"]
{{/webapp}}
:dev {:resource-paths ["env-resources/dev"]
:dependencies [{{#webapp}}[com.cemerick/piggieback "0.1.3"]{{/webapp}}
[pjstadig/humane-test-output "0.6.0"]]
{{#postgresql}}
:ragtime {:migrations ragtime.sql.files/migrations
:database "jdbc:postgresql://localhost:5432/db_name?user=username&password=password"}
{{/postgresql}}
:injections [(require 'pjstadig.humane-test-output)
(pjstadig.humane-test-output/activate!)]}
:repl {:resource-paths ["config/repl"]
:source-paths ["dev"]}})
:repl {:resource-paths ["env-resources/repl"]
:source-paths ["dev"]}}
:aliases {"uberjar" ["do" "clean" {{#webapp}}["cljsbuild" "clean"]{{/webapp}} "uberjar"]{{#webapp}}
"mkcljs" ["do" ["cljsbuild" "clean"] ["cljsbuild" "once"] ["cljsbuild" "auto"]]{{/webapp}}})

View file

@ -1,16 +1,13 @@
### direct log messages to stdout ###
log4j.rootLogger=INFO, stdout, R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.rootLogger=info, stdout
log4j.appender.stdout.layout.ConversionPattern=%d %-5p %c - %m%n
### file appender log ###
log4j.logger.clojure.core=INFO, rollingFile
log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
log4j.appender.rollingFile.File=${log4j.logdir}{{root-ns}}.log
log4j.appender.rollingFile.MaxFileSize=1MB
log4j.appender.rollingFile.MaxBackupIndex=1000
log4j.appender.rollingFile.layout = org.apache.log4j.PatternLayout
log4j.appender.rollingFile.layout.ConversionPattern=%m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=${log4j.logdir}{{root-ns}}.log
log4j.appender.R.MaxFileSize=10MB
log4j.appender.R.MaxBackupIndex=20
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d %-5p %c - %m%n

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

View file

@ -1,11 +1,12 @@
(ns {{root-ns}}.client.main
(:require [weasel.repl :as ws-repl]
[reagent.core :as reagent]
[secretary.core :as secretary :refer-macros [defroute]]
[{{root-ns}}.client.page-components :refer [app-page]]
[{{root-ns}}.client.utils :refer [hook-browser-navigation! dev? supports-ws?]]
[{{root-ns}}.client.routes.home :refer [home-page]]
[{{root-ns}}.client.routes.misc :refer [notfound-page]]))
(:require
[weasel.repl :as ws-repl]
[reagent.core :as reagent]
[secretary.core :as secretary :refer-macros [defroute]]
[{{root-ns}}.client.page-components :refer [app-page]]
[{{root-ns}}.client.utils :refer [hook-browser-navigation! dev? supports-ws?]]
[{{root-ns}}.client.routes.home :refer [home-page]]
[{{root-ns}}.client.routes.misc :refer [notfound-page]]))
(defn page [page-component & args]
(reagent/render-component
@ -20,7 +21,7 @@
(defroute "*" [] (page notfound-page))
(defn init-app []
(defn init-app! []
(when (dev?)
(enable-console-print!)
(if (and (supports-ws?)
@ -29,4 +30,4 @@
(secretary/set-config! :prefix "#")
(hook-browser-navigation!))
(init-app)
(init-app!)

View file

@ -1,6 +1,7 @@
(ns {{root-ns}}.client.routes.home
(:require [reagent.core :refer [atom]]
[{{root-ns}}.client.utils :refer [api-fetch!]]))
(:require
[reagent.core :refer [atom]]
[{{root-ns}}.client.utils :refer [api-fetch!]]))
(defn home-page []
(let [hello-response (atom nil)]

View file

@ -1,11 +1,13 @@
(ns {{root-ns}}.client.utils
(:import goog.History)
(:require [clojure.string :as str]
[clojure.walk :refer [keywordize-keys]]
[ajax.core :refer [GET]]
[goog.events :as events]
[goog.history.EventType :as EventType]
[secretary.core :as secretary]))
(:import
goog.History)
(:require
[clojure.string :as str]
[clojure.walk :refer [keywordize-keys]]
[ajax.core :refer [GET]]
[goog.events :as events]
[goog.history.EventType :as EventType]
[secretary.core :as secretary]))
(defn dev?
"returns true if running in a dev build"

View file

@ -1,73 +1,73 @@
(ns {{root-ns}}.core
(:gen-class)
(:require [compojure.core :refer [defroutes]]
[compojure.route :as route]
[noir.util.middleware :refer [app-handler]]
[taoensso.timbre :refer [log set-config!]]
[ring.middleware.file-info :refer [wrap-file-info]]
[ring.server.standalone :refer [serve]]
[ring.middleware.file :refer [wrap-file]]
(:require
[compojure.core :refer [defroutes]]
[compojure.route :as route]
[noir.util.middleware :refer [app-handler]]
[clojure.tools.logging :refer [info]]
[ring-custom-jetty.server.standalone :refer [serve]]
[ring.adapter.jetty :refer [run-jetty]]
{{#webapp}}
[clj-pebble.core :as pebble]
[clj-pebble.web.middleware :refer [wrap-servlet-context-path]]
[clj-pebble.core :as pebble]
[clj-pebble.web.middleware :refer [wrap-servlet-context-path]]
{{/webapp}}
[edn-config.core :refer [env]]
[prone.middleware :as prone]
[edn-config.core :refer [env]]
[prone.middleware :as prone]
{{#postgresql}}
[{{root-ns}}.db :as db]
[{{root-ns}}.db :as db]
{{/postgresql}}
[{{root-ns}}.routes :refer [main-public-routes api-routes]]
[{{root-ns}}.middleware :refer [wrap-exceptions not-found-handler]]
[{{root-ns}}.utils :refer [log-formatter]]))
(defroutes default-handler-routes
(route/resources "/")
(not-found-handler))
(def app
(app-handler
[main-public-routes api-routes default-handler-routes]
:middleware [(if (env :dev)
prone/wrap-exceptions
wrap-exceptions){{#webapp}}
wrap-servlet-context-path{{/webapp}}]
:access-rules []
:formats [:json-kw :edn]))
[{{root-ns}}.routes :refer [main-public-routes api-routes]]
[{{root-ns}}.middleware :refer [wrap-exceptions not-found-handler]]))
(defn init []
(set-config! [:shared-appender-config :spit-filename] "{{root-ns}}.log")
(set-config! [:appenders :spit :enabled?] true)
(set-config! [:fmt-output-fn] log-formatter)
(log :info "Starting up ...")
(info "Starting up ...")
(if (env :repl)
(log :info "Running in REPL."))
(info "Running in REPL."))
{{#webapp}}
(when (env :dev)
(log :info "Running in :dev environment.")
(pebble/set-options! :cache false
:check-for-minified-web-resources false))
(info "Running in :dev environment.")
(pebble/set-options!
:cache false
:check-for-minified-web-resources false))
{{/webapp}}
{{#webservice}}
(when (env :dev)
(log :info "Running in :dev environment."))
(info "Running in :dev environment."))
{{/webservice}}
{{#postgresql}}
(try
(db/init!)
(log :info "Database access initialized.")
(info "Database access initialized.")
(catch Exception ex
(throw (Exception. "Database not available or bad connection information specified." ex))))
{{/postgresql}}
(log :info "Application init finished."))
(info "Application init finished."))
(defn destroy []
(log :info "Shutting down ..."))
(info "Shutting down ..."))
(defn wrap-env-middleware [handler]
(if (env :dev)
(-> handler (prone/wrap-exceptions))
(-> handler (wrap-exceptions))))
(defroutes default-handler-routes
(route/resources "/")
(not-found-handler))
(defn get-handler []
(app-handler
[main-public-routes
api-routes
default-handler-routes]
:middleware [wrap-env-middleware{{#webapp}}
wrap-servlet-context-path{{/webapp}}]
:access-rules []
:formats [:json-kw :edn]))
;; support functions for starting the web app in a REPL / running an uberjar directly
;; (not used otherwise)
@ -76,18 +76,18 @@
(defn start-server [& [port]]
(let [port (if port (Integer/parseInt port) 8080)]
(reset! server
(serve
(-> #'app
(wrap-file "resources")
(wrap-file-info))
{:port port
:init init
:auto-reload? true
:destroy destroy
:join? false
:open-browser? (not (env :dont-open-browser?))}))
(println (str "You can view the site at http://localhost:" port))))
(reset!
server
(serve
(get-handler)
{:run-server-fn run-jetty
:port port
:init init
:auto-reload? (env :dev)
:destroy destroy
:join? false
:open-browser? (not (env :dont-open-browser?))}))
(info (str "Serving app at http://localhost:" port "/"))))
(defn stop-server []
(.stop @server)

View file

@ -1,9 +1,9 @@
(ns {{root-ns}}.db
(:require [com.ashafa.clutch :as couch]
[com.ashafa.clutch.utils :as couch-utils]
[cemerick.url :as url]
[taoensso.timbre :refer [log]]
[edn-config.core :refer [env]]))
(:require
[com.ashafa.clutch :as couch]
[com.ashafa.clutch.utils :as couch-utils]
[cemerick.url :as url]
[edn-config.core :refer [env]]))
(defn db-url [db-name]
(let [db-config (env :db)

View file

@ -1,7 +1,9 @@
(ns {{root-ns}}.db
(:import (org.postgresql.ds PGPoolingDataSource))
(:require [clojure.java.jdbc :as sql]
[edn-config.core :refer [env]]))
(:import
(org.postgresql.ds PGPoolingDataSource))
(:require
[clojure.java.jdbc :as sql]
[edn-config.core :refer [env]]))
(defonce db (atom nil))

View file

@ -1,8 +1,10 @@
(ns {{root-ns}}.middleware
(:require [taoensso.timbre :refer [log]]
[noir.response :as response]
[{{root-ns}}.views :as views])
(:use {{root-ns}}.utils))
(:require
[clojure.tools.logging :refer [error]]
[noir.response :as response]
[{{root-ns}}.views :as views])
(:use
{{root-ns}}.utils))
(defn- api-request? [request]
(.startsWith
@ -16,7 +18,7 @@
(try
(handler request)
(catch Throwable ex
(log :error ex "Unhandled exception.")
(error ex "Unhandled exception.")
(if (api-request? request)
(->> (response/json
{:status "error"

View file

@ -1,8 +1,10 @@
(ns {{root-ns}}.middleware
(:require [taoensso.timbre :refer [log]]
[noir.response :as response]
[{{root-ns}}.views :as views])
(:use {{root-ns}}.utils))
(:require
[clojure.tools.logging :refer [error]]
[noir.response :as response]
[{{root-ns}}.views :as views])
(:use
{{root-ns}}.utils))
(defn- api-request? [request]
(.startsWith
@ -16,7 +18,7 @@
(try
(handler request)
(catch Throwable ex
(log :error ex "Unhandled exception.")
(error ex "Unhandled exception.")
(if (api-request? request)
(->> (response/json
{:status "error"

View file

@ -1,7 +1,8 @@
(ns {{root-ns}}.routes
(:require [compojure.core :refer [defroutes context GET]]
[{{root-ns}}.api.hello :as hello-api]
[{{root-ns}}.views :as views]))
(:require
[compojure.core :refer [defroutes context GET]]
[{{root-ns}}.api.hello :as hello-api]
[{{root-ns}}.views :as views]))
(defroutes
main-public-routes

View file

@ -1,7 +1,8 @@
(ns {{root-ns}}.routes
(:require [compojure.core :refer [defroutes context GET]]
[{{root-ns}}.api.hello :as hello-api]
[{{root-ns}}.views :as views]))
(:require
[compojure.core :refer [defroutes context GET]]
[{{root-ns}}.api.hello :as hello-api]
[{{root-ns}}.views :as views]))
(defroutes
main-public-routes

View file

@ -1,13 +1,8 @@
(ns {{root-ns}}.utils
(:require [clojure.string :as str]
[clojure.stacktrace :refer [print-stack-trace]]))
(:require
[clojure.stacktrace :refer [print-stack-trace]]))
(defn get-throwable-stack-trace [throwable]
(if throwable
(with-out-str
(print-stack-trace throwable))))
(defn log-formatter [{:keys [level throwable message timestamp hostname ns]} & [{:keys [nofonts?] :as appender-fmt-output-opts}]]
(format "%s %s %s [%s] - %s%s"
timestamp hostname (-> level name str/upper-case) ns (or message "")
(or (get-throwable-stack-trace throwable) "")))

View file

@ -1,10 +1,11 @@
(ns {{root-ns}}.views
(:require [clojure.string :as str]
[clj-pebble.core :as pebble]
[clj-pebble.web.middleware :refer [*servlet-context-path*]]
[ring.util.response :as response]
[compojure.response :refer [Renderable]]
[edn-config.core :refer [env]]))
(:require
[clojure.string :as str]
[clj-pebble.core :as pebble]
[clj-pebble.web.middleware :refer [*servlet-context-path*]]
[ring.util.response :as response]
[compojure.response :refer [Renderable]]
[edn-config.core :refer [env]]))
(def template-path "views/")

View file

@ -1,8 +1,10 @@
(ns {{root-ns}}.views
(:require [ring.util.response :as response]
[compojure.response :refer [Renderable]])
(:use hiccup.core
hiccup.page))
(:require
[ring.util.response :as response]
[compojure.response :refer [Renderable]])
(:use
hiccup.core
hiccup.page))
(defn render-response [request page-fn & {:keys [params status content-type]}]
(-> (page-fn request params)