Merge branch 'master' into add-posts

This commit is contained in:
Charlotte Allen 2020-01-27 19:15:20 -08:00
commit 8ad5be6cc2
No known key found for this signature in database
GPG Key ID: 3A64C3A6C69860B0
12 changed files with 123 additions and 128 deletions

View File

@ -1,8 +1,8 @@
(ns shapey-shifty.dev-middleware (ns shapey-shifty.dev-middleware
(:require (:require
[ring.middleware.reload :refer [wrap-reload]] [ring.middleware.reload :refer [wrap-reload]]
[selmer.middleware :refer [wrap-error-page]] [selmer.middleware :refer [wrap-error-page]]
[prone.middleware :refer [wrap-exceptions]])) [prone.middleware :refer [wrap-exceptions]]))
(defn wrap-dev [handler] (defn wrap-dev [handler]
(-> handler (-> handler

View File

@ -1,8 +1,8 @@
(ns shapey-shifty.env (ns shapey-shifty.env
(:require (:require
[selmer.parser :as parser] [selmer.parser :as parser]
[clojure.tools.logging :as log] [clojure.tools.logging :as log]
[shapey-shifty.dev-middleware :refer [wrap-dev]])) [shapey-shifty.dev-middleware :refer [wrap-dev]]))
(def defaults (def defaults
{:init {:init

16
env/dev/clj/user.clj vendored
View File

@ -2,14 +2,14 @@
"Userspace functions you can run by default in your local REPL." "Userspace functions you can run by default in your local REPL."
(:require (:require
[shapey-shifty.config :refer [env]] [shapey-shifty.config :refer [env]]
[clojure.pprint] [clojure.pprint]
[clojure.spec.alpha :as s] [clojure.spec.alpha :as s]
[expound.alpha :as expound] [expound.alpha :as expound]
[mount.core :as mount] [mount.core :as mount]
[shapey-shifty.core :refer [start-app]] [shapey-shifty.core :refer [start-app]]
[shapey-shifty.db.core] [shapey-shifty.db.core]
[conman.core :as conman] [conman.core :as conman]
[luminus-migrations.core :as migrations])) [luminus-migrations.core :as migrations]))
(alter-var-root #'s/*explain-out* (constantly expound/printer)) (alter-var-root #'s/*explain-out* (constantly expound/printer))

View File

@ -1,13 +1,13 @@
(ns shapey-shifty.config (ns shapey-shifty.config
(:require (:require
[cprop.core :refer [load-config]] [cprop.core :refer [load-config]]
[cprop.source :as source] [cprop.source :as source]
[mount.core :refer [args defstate]])) [mount.core :refer [args defstate]]))
(defstate env (defstate env
:start :start
(load-config (load-config
:merge :merge
[(args) [(args)
(source/from-system-props) (source/from-system-props)
(source/from-env)])) (source/from-env)]))

View File

@ -1,22 +1,22 @@
(ns shapey-shifty.core (ns shapey-shifty.core
(:require (:require
[shapey-shifty.handler :as handler] [shapey-shifty.handler :as handler]
[shapey-shifty.nrepl :as nrepl] [shapey-shifty.nrepl :as nrepl]
[luminus.http-server :as http] [luminus.http-server :as http]
[luminus-migrations.core :as migrations] [luminus-migrations.core :as migrations]
[shapey-shifty.config :refer [env]] [shapey-shifty.config :refer [env]]
[clojure.tools.cli :refer [parse-opts]] [clojure.tools.cli :refer [parse-opts]]
[clojure.tools.logging :as log] [clojure.tools.logging :as log]
[mount.core :as mount]) [mount.core :as mount])
(:gen-class)) (:gen-class))
;; log uncaught exceptions in threads ;; log uncaught exceptions in threads
(Thread/setDefaultUncaughtExceptionHandler (Thread/setDefaultUncaughtExceptionHandler
(reify Thread$UncaughtExceptionHandler (reify Thread$UncaughtExceptionHandler
(uncaughtException [_ thread ex] (uncaughtException [_ thread ex]
(log/error {:what :uncaught-exception (log/error {:what :uncaught-exception
:exception ex :exception ex
:where (str "Uncaught exception on" (.getName thread))})))) :where (str "Uncaught exception on" (.getName thread))}))))
(def cli-options (def cli-options
[["-p" "--port PORT" "Port number" [["-p" "--port PORT" "Port number"
@ -25,10 +25,10 @@
(mount/defstate ^{:on-reload :noop} http-server (mount/defstate ^{:on-reload :noop} http-server
:start :start
(http/start (http/start
(-> env (-> env
(assoc :handler (handler/app)) (assoc :handler (handler/app))
(update :io-threads #(or % (* 2 (.availableProcessors (Runtime/getRuntime))))) (update :io-threads #(or % (* 2 (.availableProcessors (Runtime/getRuntime)))))
(update :port #(or (-> env :options :port) %)))) (update :port #(or (-> env :options :port) %))))
:stop :stop
(http/stop http-server)) (http/stop http-server))
@ -41,7 +41,6 @@
(when repl-server (when repl-server
(nrepl/stop repl-server))) (nrepl/stop repl-server)))
(defn stop-app [] (defn stop-app []
(doseq [component (:stopped (mount/stop))] (doseq [component (:stopped (mount/stop))]
(log/info component "stopped")) (log/info component "stopped"))
@ -72,4 +71,4 @@
(System/exit 0)) (System/exit 0))
:else :else
(start-app args))) (start-app args)))

View File

@ -1,13 +1,13 @@
(ns shapey-shifty.db.core (ns shapey-shifty.db.core
(:require (:require
[cheshire.core :refer [generate-string parse-string]] [cheshire.core :refer [generate-string parse-string]]
[clojure.java.jdbc :as jdbc] [clojure.java.jdbc :as jdbc]
[clojure.tools.logging :as log] [clojure.tools.logging :as log]
[conman.core :as conman] [conman.core :as conman]
[java-time :as jt] [java-time :as jt]
[java-time.pre-java8] [java-time.pre-java8]
[shapey-shifty.config :refer [env]] [shapey-shifty.config :refer [env]]
[mount.core :refer [defstate]]) [mount.core :refer [defstate]])
(:import org.postgresql.util.PGobject (:import org.postgresql.util.PGobject
java.sql.Array java.sql.Array
clojure.lang.IPersistentMap clojure.lang.IPersistentMap
@ -25,9 +25,8 @@
(conman/bind-connection *db* "sql/queries.sql") (conman/bind-connection *db* "sql/queries.sql")
(extend-protocol jdbc/IResultSetReadColumn (extend-protocol jdbc/IResultSetReadColumn
java.sql.Timestamp java.sql.Timestamp
(result-set-read-column [v _2 _3] (result-set-read-column [v _2 _3]
(.toLocalDateTime v)) (.toLocalDateTime v))
java.sql.Date java.sql.Date
@ -64,7 +63,7 @@
(.setObject stmt idx (to-pg-json v)))))) (.setObject stmt idx (to-pg-json v))))))
(extend-protocol jdbc/ISQLValue (extend-protocol jdbc/ISQLValue
java.util.Date java.util.Date
(sql-value [v] (sql-value [v]
(java.sql.Timestamp. (.getTime v))) (java.sql.Timestamp. (.getTime v)))
java.time.LocalTime java.time.LocalTime

View File

@ -1,13 +1,13 @@
(ns shapey-shifty.handler (ns shapey-shifty.handler
(:require (:require
[shapey-shifty.middleware :as middleware] [shapey-shifty.middleware :as middleware]
[shapey-shifty.layout :refer [error-page]] [shapey-shifty.layout :refer [error-page]]
[shapey-shifty.routes.home :refer [home-routes]] [shapey-shifty.routes.home :refer [home-routes]]
[reitit.ring :as ring] [reitit.ring :as ring]
[ring.middleware.content-type :refer [wrap-content-type]] [ring.middleware.content-type :refer [wrap-content-type]]
[ring.middleware.webjars :refer [wrap-webjars]] [ring.middleware.webjars :refer [wrap-webjars]]
[shapey-shifty.env :refer [defaults]] [shapey-shifty.env :refer [defaults]]
[mount.core :as mount])) [mount.core :as mount]))
(mount/defstate init-app (mount/defstate init-app
:start ((or (:init defaults) (fn []))) :start ((or (:init defaults) (fn [])))
@ -16,20 +16,20 @@
(mount/defstate app-routes (mount/defstate app-routes
:start :start
(ring/ring-handler (ring/ring-handler
(ring/router (ring/router
[(home-routes)]) [(home-routes)])
(ring/routes (ring/routes
(ring/create-resource-handler (ring/create-resource-handler
{:path "/"}) {:path "/"})
(wrap-content-type (wrap-content-type
(wrap-webjars (constantly nil))) (wrap-webjars (constantly nil)))
(ring/create-default-handler (ring/create-default-handler
{:not-found {:not-found
(constantly (error-page {:status 404, :title "404 - Page not found"})) (constantly (error-page {:status 404, :title "404 - Page not found"}))
:method-not-allowed :method-not-allowed
(constantly (error-page {:status 405, :title "405 - Not allowed"})) (constantly (error-page {:status 405, :title "405 - Not allowed"}))
:not-acceptable :not-acceptable
(constantly (error-page {:status 406, :title "406 - Not acceptable"}))})))) (constantly (error-page {:status 406, :title "406 - Not acceptable"}))}))))
(defn app [] (defn app []
(middleware/wrap-base #'app-routes)) (middleware/wrap-base #'app-routes))

View File

@ -1,13 +1,13 @@
(ns shapey-shifty.layout (ns shapey-shifty.layout
(:require (:require
[clojure.java.io] [clojure.java.io]
[selmer.parser :as parser] [selmer.parser :as parser]
[selmer.filters :as filters] [selmer.filters :as filters]
[markdown.core :refer [md-to-html-string]] [markdown.core :refer [md-to-html-string]]
[ring.util.http-response :refer [content-type ok]] [ring.util.http-response :refer [content-type ok]]
[ring.util.anti-forgery :refer [anti-forgery-field]] [ring.util.anti-forgery :refer [anti-forgery-field]]
[ring.middleware.anti-forgery :refer [*anti-forgery-token*]] [ring.middleware.anti-forgery :refer [*anti-forgery-token*]]
[ring.util.response])) [ring.util.response]))
(parser/set-resource-path! (clojure.java.io/resource "html")) (parser/set-resource-path! (clojure.java.io/resource "html"))
(parser/add-tag! :csrf-field (fn [_ _] (anti-forgery-field))) (parser/add-tag! :csrf-field (fn [_ _] (anti-forgery-field)))
@ -17,13 +17,13 @@
"renders the HTML template located relative to resources/html" "renders the HTML template located relative to resources/html"
[request template & [params]] [request template & [params]]
(content-type (content-type
(ok (ok
(parser/render-file (parser/render-file
template template
(assoc params (assoc params
:page template :page template
:csrf-token *anti-forgery-token*))) :csrf-token *anti-forgery-token*)))
"text/html; charset=utf-8")) "text/html; charset=utf-8"))
(defn error-page (defn error-page
"error-details should be a map containing the following keys: "error-details should be a map containing the following keys:

View File

@ -1,18 +1,16 @@
(ns shapey-shifty.middleware (ns shapey-shifty.middleware
(:require (:require
[shapey-shifty.env :refer [defaults]] [shapey-shifty.env :refer [defaults]]
[cheshire.generate :as cheshire] [cheshire.generate :as cheshire]
[cognitect.transit :as transit] [cognitect.transit :as transit]
[clojure.tools.logging :as log] [clojure.tools.logging :as log]
[shapey-shifty.layout :refer [error-page]] [shapey-shifty.layout :refer [error-page]]
[ring.middleware.anti-forgery :refer [wrap-anti-forgery]] [ring.middleware.anti-forgery :refer [wrap-anti-forgery]]
[shapey-shifty.middleware.formats :as formats] [shapey-shifty.middleware.formats :as formats]
[muuntaja.middleware :refer [wrap-format wrap-params]] [muuntaja.middleware :refer [wrap-format wrap-params]]
[shapey-shifty.config :refer [env]] [shapey-shifty.config :refer [env]]
[ring-ttl-session.core :refer [ttl-memory-store]] [ring-ttl-session.core :refer [ttl-memory-store]]
[ring.middleware.defaults :refer [site-defaults wrap-defaults]]) [ring.middleware.defaults :refer [site-defaults wrap-defaults]]))
)
(defn wrap-internal-error [handler] (defn wrap-internal-error [handler]
(fn [req] (fn [req]
@ -26,12 +24,11 @@
(defn wrap-csrf [handler] (defn wrap-csrf [handler]
(wrap-anti-forgery (wrap-anti-forgery
handler handler
{:error-response {:error-response
(error-page (error-page
{:status 403 {:status 403
:title "Invalid anti-forgery token"})})) :title "Invalid anti-forgery token"})}))
(defn wrap-formats [handler] (defn wrap-formats [handler]
(let [wrapped (-> handler wrap-params (wrap-format formats/instance))] (let [wrapped (-> handler wrap-params (wrap-format formats/instance))]
@ -43,7 +40,7 @@
(defn wrap-base [handler] (defn wrap-base [handler]
(-> ((:middleware defaults) handler) (-> ((:middleware defaults) handler)
(wrap-defaults (wrap-defaults
(-> site-defaults (-> site-defaults
(assoc-in [:security :anti-forgery] false) (assoc-in [:security :anti-forgery] false)
(assoc-in [:session :store] (ttl-memory-store (* 60 30))))) (assoc-in [:session :store] (ttl-memory-store (* 60 30)))))
wrap-internal-error)) wrap-internal-error))

View File

@ -1,15 +1,15 @@
(ns shapey-shifty.middleware.formats (ns shapey-shifty.middleware.formats
(:require (:require
[cognitect.transit :as transit] [cognitect.transit :as transit]
[luminus-transit.time :as time] [luminus-transit.time :as time]
[muuntaja.core :as m])) [muuntaja.core :as m]))
(def instance (def instance
(m/create (m/create
(-> m/default-options (-> m/default-options
(update-in (update-in
[:formats "application/transit+json" :decoder-opts] [:formats "application/transit+json" :decoder-opts]
(partial merge time/time-deserialization-handlers)) (partial merge time/time-deserialization-handlers))
(update-in (update-in
[:formats "application/transit+json" :encoder-opts] [:formats "application/transit+json" :encoder-opts]
(partial merge time/time-serialization-handlers))))) (partial merge time/time-serialization-handlers)))))

View File

@ -1,7 +1,7 @@
(ns shapey-shifty.nrepl (ns shapey-shifty.nrepl
(:require (:require
[nrepl.server :as nrepl] [nrepl.server :as nrepl]
[clojure.tools.logging :as log])) [clojure.tools.logging :as log]))
(defn start (defn start
"Start a network repl for debugging on specified port followed by "Start a network repl for debugging on specified port followed by

View File

@ -1,11 +1,11 @@
(ns shapey-shifty.test.handler (ns shapey-shifty.test.handler
(:require (:require
[clojure.test :refer :all] [clojure.test :refer :all]
[ring.mock.request :refer :all] [ring.mock.request :refer :all]
[shapey-shifty.handler :refer :all] [shapey-shifty.handler :refer :all]
[shapey-shifty.middleware.formats :as formats] [shapey-shifty.middleware.formats :as formats]
[muuntaja.core :as m] [muuntaja.core :as m]
[mount.core :as mount])) [mount.core :as mount]))
(defn parse-json [body] (defn parse-json [body]
(m/decode formats/instance "application/json" body)) (m/decode formats/instance "application/json" body))