├── .gitignore ├── README.md ├── project.clj └── src └── leiningen └── new ├── compojure_app.clj └── compojure_app ├── README.md ├── gitignore ├── handler.clj ├── handler_test.clj ├── home.clj ├── layout.clj ├── project.clj ├── repl.clj └── screen.css /.gitignore: -------------------------------------------------------------------------------- 1 | pom.xml 2 | *jar 3 | /lib/ 4 | /classes/ 5 | /targets/ 6 | /target/ 7 | .lein-deps-sum 8 | .lein-failures 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Compojure-Template 2 | 3 | A Leiningen template for projects using [Compojure][1]. 4 | 5 | This tempate is a batteries included version of the official [compojure-template](https://github.com/weavejester/compojure-template). 6 | The template sets up several useful wrappers, such as the ones for serving static resources and handling mime types. 7 | It also provides a main for running standalone and a handler for WAR deployment which provides correct context resolution. 8 | 9 | 10 | [1]: http://compojure.org 11 | 12 | ## Usage 13 | 14 | Run the following command to create a new Compojure project: 15 | 16 | lein new compojure-app 17 | 18 | To create a standalone executable from your project inside the project directory: 19 | 20 | ```bash 21 | lein ring uberjar 22 | ``` 23 | 24 | You can then run the resulting jar as you would with any other Java executable: 25 | 26 | ```bash 27 | java -jar target/myapp-0.1.0-SNAPSHOT-standalone.jar 28 | 29 | 2012-12-15 19:17:23.471:INFO:oejs.Server:jetty-7.x.y-SNAPSHOT 30 | 2012-12-15 19:17:23.512:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:8080 31 | Server started on port [ 8080 ]. 32 | You can view the site at http://localhost:8080 33 | ``` 34 | 35 | To build a WAR run: 36 | ```bash 37 | lein ring uberwar 38 | ``` 39 | Then you can deploy the resulting WAR to Tomcat or any other Java application server. 40 | 41 | ## License 42 | 43 | Copyright © 2012 Yogthos 44 | 45 | Distributed under the Eclipse Public License, the same as Clojure. 46 | -------------------------------------------------------------------------------- /project.clj: -------------------------------------------------------------------------------- 1 | (defproject compojure-app/lein-template "0.4.9" 2 | :description "Compojure project template for Leiningen" 3 | :url "https://github.com/yogthos/compojure-template" 4 | :eval-in-leiningen true 5 | :license {:name "Eclipse Public License" 6 | :url "http://www.eclipse.org/legal/epl-v10.html"} 7 | ) 8 | -------------------------------------------------------------------------------- /src/leiningen/new/compojure_app.clj: -------------------------------------------------------------------------------- 1 | (ns leiningen.new.compojure-app 2 | (:use [leiningen.new.templates :only [renderer sanitize year ->files]])) 3 | 4 | (defn compojure-app 5 | "Create a new Compojure project" 6 | [name] 7 | (let [data {:name name 8 | :sanitized (sanitize name) 9 | :year (year)} 10 | render #((renderer "compojure_app") % data)] 11 | (println "Generating a lovely new Compojure project named" (str name "...")) 12 | (->files data 13 | [".gitignore" (render "gitignore")] 14 | ["project.clj" (render "project.clj")] 15 | ["README.md" (render "README.md")] 16 | ["src/{{sanitized}}/repl.clj" (render "repl.clj")] 17 | ["src/{{sanitized}}/handler.clj" (render "handler.clj")] 18 | ["src/{{sanitized}}/routes/home.clj" (render "home.clj")] 19 | ["src/{{sanitized}}/views/layout.clj" (render "layout.clj")] 20 | ["resources/public/css/screen.css" (render "screen.css")] 21 | "resources/public/js" 22 | "resources/public/img" 23 | "src/{{sanitized}}/models" 24 | ["test/{{sanitized}}/test/handler.clj" (render "handler_test.clj")]))) 25 | -------------------------------------------------------------------------------- /src/leiningen/new/compojure_app/README.md: -------------------------------------------------------------------------------- 1 | # {{name}} 2 | 3 | FIXME 4 | 5 | ## Prerequisites 6 | 7 | You will need [Leiningen][1] 1.7.0 or above installed. 8 | 9 | [1]: https://github.com/technomancy/leiningen 10 | 11 | ## Running 12 | 13 | To start a web server for the application, run: 14 | 15 | lein ring server 16 | 17 | ## License 18 | 19 | Copyright © {{year}} FIXME 20 | -------------------------------------------------------------------------------- /src/leiningen/new/compojure_app/gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /lib 3 | /classes 4 | /checkouts 5 | pom.xml 6 | *.jar 7 | *.class 8 | .lein-deps-sum 9 | .lein-failures 10 | .lein-plugins 11 | .lein-env 12 | -------------------------------------------------------------------------------- /src/leiningen/new/compojure_app/handler.clj: -------------------------------------------------------------------------------- 1 | (ns {{name}}.handler 2 | (:require [compojure.core :refer [defroutes routes]] 3 | [ring.middleware.resource :refer [wrap-resource]] 4 | [ring.middleware.file-info :refer [wrap-file-info]] 5 | [hiccup.middleware :refer [wrap-base-url]] 6 | [compojure.handler :as handler] 7 | [compojure.route :as route] 8 | [{{name}}.routes.home :refer [home-routes]])) 9 | 10 | (defn init [] 11 | (println "{{name}} is starting")) 12 | 13 | (defn destroy [] 14 | (println "{{name}} is shutting down")) 15 | 16 | (defroutes app-routes 17 | (route/resources "/") 18 | (route/not-found "Not Found")) 19 | 20 | (def app 21 | (-> (routes home-routes app-routes) 22 | (handler/site) 23 | (wrap-base-url))) 24 | -------------------------------------------------------------------------------- /src/leiningen/new/compojure_app/handler_test.clj: -------------------------------------------------------------------------------- 1 | (ns {{name}}.test.handler 2 | (:use clojure.test 3 | ring.mock.request 4 | {{name}}.handler)) 5 | 6 | (deftest test-app 7 | (testing "main route" 8 | (let [response (app (request :get "/"))] 9 | (is (= (:status response) 200)) 10 | (is (.contains (:body response) "Hello World")))) 11 | 12 | (testing "not-found route" 13 | (let [response (app (request :get "/invalid"))] 14 | (is (= (:status response) 404))))) 15 | -------------------------------------------------------------------------------- /src/leiningen/new/compojure_app/home.clj: -------------------------------------------------------------------------------- 1 | (ns {{name}}.routes.home 2 | (:require [compojure.core :refer :all] 3 | [{{name}}.views.layout :as layout])) 4 | 5 | (defn home [] 6 | (layout/common [:h1 "Hello World!"])) 7 | 8 | (defroutes home-routes 9 | (GET "/" [] (home))) 10 | -------------------------------------------------------------------------------- /src/leiningen/new/compojure_app/layout.clj: -------------------------------------------------------------------------------- 1 | (ns {{name}}.views.layout 2 | (:require [hiccup.page :refer [html5 include-css]])) 3 | 4 | (defn common [& body] 5 | (html5 6 | [:head 7 | [:title "Welcome to {{name}}"] 8 | (include-css "/css/screen.css")] 9 | [:body body])) 10 | -------------------------------------------------------------------------------- /src/leiningen/new/compojure_app/project.clj: -------------------------------------------------------------------------------- 1 | (defproject {{name}} "0.1.0-SNAPSHOT" 2 | :description "FIXME: write description" 3 | :url "http://example.com/FIXME" 4 | :dependencies [[org.clojure/clojure "1.10.0"] 5 | [compojure "1.6.1"] 6 | [hiccup "1.0.5"] 7 | [ring-server "0.5.0"]] 8 | :plugins [[lein-ring "0.12.5"]] 9 | :ring {:handler {{name}}.handler/app 10 | :init {{name}}.handler/init 11 | :destroy {{name}}.handler/destroy} 12 | :profiles 13 | {:uberjar {:aot :all} 14 | :production 15 | {:ring 16 | {:open-browser? false, :stacktraces? false, :auto-reload? false}} 17 | :dev 18 | {:dependencies [[ring/ring-mock "0.4.0"] [ring/ring-devel "1.7.1"]]}}) 19 | -------------------------------------------------------------------------------- /src/leiningen/new/compojure_app/repl.clj: -------------------------------------------------------------------------------- 1 | (ns {{name}}.repl 2 | (:use {{name}}.handler 3 | ring.server.standalone 4 | [ring.middleware file-info file])) 5 | 6 | (defonce server (atom nil)) 7 | 8 | (defn get-handler [] 9 | ;; #'app expands to (var app) so that when we reload our code, 10 | ;; the server is forced to re-resolve the symbol in the var 11 | ;; rather than having its own copy. When the root binding 12 | ;; changes, the server picks it up without having to restart. 13 | (-> #'app 14 | ; Makes static assets in $PROJECT_DIR/resources/public/ available. 15 | (wrap-file "resources") 16 | ; Content-Type, Content-Length, and Last Modified headers for files in body 17 | (wrap-file-info))) 18 | 19 | (defn start-server 20 | "used for starting the server in development mode from REPL" 21 | [& [port]] 22 | (let [port (if port (Integer/parseInt port) 8080)] 23 | (reset! server 24 | (serve (get-handler) 25 | {:port port 26 | :init init 27 | :auto-reload? true 28 | :destroy destroy 29 | :join true})) 30 | (println (str "You can view the site at http://localhost:" port)))) 31 | 32 | (defn stop-server [] 33 | (.stop @server) 34 | (reset! server nil)) 35 | -------------------------------------------------------------------------------- /src/leiningen/new/compojure_app/screen.css: -------------------------------------------------------------------------------- 1 | body { 2 | color: #555; 3 | font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; 4 | font-size: 13px; 5 | } 6 | 7 | h1 { 8 | text-align: center; 9 | } 10 | 11 | --------------------------------------------------------------------------------