summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoreltrac <hi@eltr.ac>2026-10-06 18:04:31 +0800
committereltrac <hi@eltr.ac>2026-10-06 18:41:19 +0800
commitfd654982376da9d913c4867f70aade62a75abe01 (patch)
tree2e97947091cba885a1321625035cf6e73700bf30
parent4030d4d921fed3e9abea28268fe499fbaedb5dfc (diff)
dev: hot reloading
- add start/stop/restart/watch functions in 'user namespace (dev profile) - add lein alias `dev` that starts file watcher and REPL - every time source code is changed, `lein dev` reloads modified namespaces and restarts system - add `lein dev` to Contributors' Guide
-rw-r--r--dev/user.clj27
-rw-r--r--doc/CONTRIBUTING.md4
-rw-r--r--project.clj35
3 files changed, 37 insertions, 29 deletions
diff --git a/dev/user.clj b/dev/user.clj
new file mode 100644
index 0000000..2ebcdb0
--- /dev/null
+++ b/dev/user.clj
@@ -0,0 +1,27 @@
+(ns user
+ (:require [clj-reload.core :as reload]
+ [nextjournal.beholder :as beholder]
+ [weepinbell.core]))
+
+(reload/init
+ {:dirs ["src" "dev" "test"]})
+
+(defonce stop-fn (atom nil))
+
+(defn start []
+ {:pre [(nil? @stop-fn)]}
+ (reset! stop-fn (@(resolve 'weepinbell.core/start-system))))
+
+(defn stop []
+ {:pre [(fn? @stop-fn)]}
+ (@stop-fn)
+ (reset! stop-fn nil))
+
+(defn restart []
+ (stop)
+ (reload/reload)
+ (start))
+
+(defn watch []
+ (beholder/watch (fn [_] ((requiring-resolve 'user/restart))) "src"))
+
diff --git a/doc/CONTRIBUTING.md b/doc/CONTRIBUTING.md
index 010a3ca..cb82836 100644
--- a/doc/CONTRIBUTING.md
+++ b/doc/CONTRIBUTING.md
@@ -43,10 +43,10 @@ To start REPL:
lein repl
```
-To start a dev server:
+To start a dev server (and an REPL):
```
-lein ring server
+lein dev
```
To run project:
diff --git a/project.clj b/project.clj
index 60b0b01..fa2d666 100644
--- a/project.clj
+++ b/project.clj
@@ -19,39 +19,20 @@
[com.taoensso/timbre "6.8.0"]
[clj-rss "0.4.0"]]
:managed-dependencies [[org.clojure/tools.reader "1.6.0"]
- [org.ow2.asm/asm "9.8"]]
+ [org.ow2.asm/asm "9.8"]]
:profiles {:uberjar {:aot :all}
:test {:dependencies [[ring/ring-mock "0.6.2"]]}
- :cljsbuild {:dependencies [[org.clojure/clojurescript "1.11.132"]]}}
+ :dev {:source-paths ["dev"]
+ :repl-options {:init-ns user
+ :init (do (start) (watch))}
+ :dependencies [[io.github.tonsky/clj-reload "1.0.0"]
+ [com.nextjournal/beholder "1.0.3"]]}}
+ :aliases {"dev" ["with-profile" "+dev" "repl"]}
:main ^:skip-aot weepinbell.core
;; plugins
:plugins [[lein-ancient "0.6.15"]
- [lein-ring "0.12.6"]
;; latest commits of cloverage were "co-authored" by Claude
;; we'll keep it on this version for now
[lein-cloverage "1.2.2"]
- [dev.weavejester/lein-cljfmt "0.16.5"]
- ;; for frontend
- [lein-cljsbuild "1.1.8"]]
- :ring {:handler weepinbell.handler/app}
- :cljsbuild
- {:builds
- {:dev
- {:source-paths ["src-fe"]
- :compiler
- {:main bellsprout.core
- :output-to "resources/public/js/main.js"
- :output-dir "resources/public/js/out"
- :asset-path "js/out"
- :optimizations :none
- :source-map true
- :target :browser}}
- :prod
- {:source-paths ["src-fe"]
- :compiler
- {:main bellsprout.core
- :output-to "resources/public/js/main.js"
- :output-dir "target/cljsbuild"
- :optimizations :advanced
- :pretty-print false}}}})
+ [dev.weavejester/lein-cljfmt "0.16.5"]])