Skip to content

Commit 772d67a

Browse files
zampinoborkdudemk
authored
Add compatibility with Babashka (#232)
Currently requires a dev build of Babashka ([6b89b78](babashka/babashka@6b89b78) or newer). --------- Co-authored-by: Michiel Borkent <[email protected]> Co-authored-by: Martin Kavalar <[email protected]>
1 parent db26c83 commit 772d67a

25 files changed

+605
-296
lines changed

.clj-kondo/config.edn

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
taoensso.encore/defonce clojure.core/defonce
88
taoensso.encore/defalias clojure.core/def
99
promesa.core/let clojure.core/let
10-
shadow.cljs.modern/defclass clojure.core/defprotocol}
10+
shadow.cljs.modern/defclass clojure.core/defprotocol
11+
nextjournal.clerk.utils/if-bb clojure.core/if}
1112
:linters {:clojure-lsp/unused-public-var {:level :off}
1213
:consistent-alias {:aliases {datomic.api datomic
1314
clojure.string str

.github/workflows/main.yml

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ jobs:
7171
- { os: windows-latest, shell: powershell }
7272
clojure:
7373
- 1.10.3
74-
- 1.12.0
74+
- 1.12.1
7575
defaults:
7676
run:
7777
shell: ${{matrix.sys.shell}}
@@ -105,6 +105,53 @@ jobs:
105105
bb test:clj :kaocha/reporter '[kaocha.report/documentation]' \
106106
:clojure '"${{ matrix.clojure }}"'
107107
108+
test-bb:
109+
runs-on: ${{matrix.sys.os}}
110+
111+
strategy:
112+
matrix:
113+
sys:
114+
- { os: macos-latest, shell: bash }
115+
- { os: ubuntu-latest, shell: bash }
116+
- { os: windows-latest, shell: powershell }
117+
defaults:
118+
run:
119+
shell: ${{matrix.sys.shell}}
120+
121+
steps:
122+
- uses: actions/checkout@v2
123+
124+
- name: 🔧 Install java
125+
uses: actions/setup-java@v4
126+
with:
127+
java-version: '21'
128+
distribution: 'temurin'
129+
130+
- name: 🔧 Install clojure
131+
uses: DeLaGuardo/setup-clojure@master
132+
with:
133+
bb: latest
134+
135+
- name: 🗝 maven cache
136+
uses: actions/cache@v3
137+
with:
138+
path: |
139+
~/.m2
140+
~/.gitlibs
141+
~/.deps.clj
142+
key: ${{ runner.os }}-maven-test-${{ hashFiles('deps.edn') }}-${{ hashFiles('bb.edn') }}
143+
- name: 🔧 Install bb from dev build (until next release)
144+
shell: bash
145+
run: |
146+
curl -sLO https://raw.githubusercontent.com/babashka/babashka/master/install
147+
chmod +x ./install
148+
./install --dev-build --dir /tmp
149+
cp /tmp/bb "$(which bb)"
150+
- name: 🧪 Run tests
151+
shell: bash
152+
run: |
153+
bb test:bb
154+
108155
static-build:
109156
runs-on: ubuntu-latest
110157
needs: [build-and-upload-viewer-resources]

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ Changes can be:
88

99
## Unreleased
1010

11+
* 🌟 Add compatibility with Babashka
12+
13+
Currently requires a dev build of Babashka ([6b89b78](https://github.com/babashka/babashka/commit/6b89b78c38e72d296f211e024d4079bf1504f3e4)
14+
or newer).
15+
1116
* 🕵🏻 New dependency analyzer implementation
1217

1318
Based on the analyzer from [hyperfiddle/rfc](https://github.com/hyperfiddle/rcf). This replaces `tools.analyzer` and drops the dependency.

bb.edn

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
{:min-bb-version "0.9.159"
1+
{:min-bb-version "1.12.202"
22
:paths ["bb"]
3-
:deps {io.github.nextjournal/dejavu {:git/sha "4980e0cc18c9b09fb220874ace94ba6b57a749ca"}
4-
io.github.nextjournal/cas-client {:git/sha "d9f838937ebc8b645fe5764949e72a6df8e344de"}
5-
mvxcvi/multiformats {:git/url "https://github.com/greglook/clj-multiformats"
6-
:git/sha "1189f1fb26db180cd8dcfd50518cdf553c0ff9e1"}}
3+
:deps {io.github.nextjournal/dejavu {:git/sha "7276cd9cec1bad001d595b52cee9e83a60d43bf0"}
4+
io.github.nextjournal/cas-client {:git/sha "114d3d88d38a2068ec844b0e6c808eaaa6aa64ef"}}
75
:tasks
86
{:requires
97
([tasks :as t]
@@ -56,6 +54,22 @@
5654
clojure (str ":" clojure-version))
5755
*command-line-args*))}
5856

57+
test:bb {:doc "Run babashka tests"
58+
:extra-paths ["test"]
59+
:extra-deps {io.github.nextjournal/clerk {:local/root "."}
60+
nubank/matcher-combinators {:mvn/version "3.5.1"}
61+
org.clojure/test.check {:mvn/version "1.1.1"}
62+
io.github.cognitect-labs/test-runner {:git/tag "v0.5.1" :git/sha "dfb30dd"}}
63+
:task cognitect.test-runner/-main}
64+
65+
dev:bb {:extra-deps {io.github.nextjournal/clerk {:local/root "."}}
66+
:extra-paths ["notebooks" "resources" "test"]
67+
:task (exec 'tasks/bb-nrepl)}
68+
69+
build:bb {:extra-deps {io.github.nextjournal/clerk {:local/root "."}}
70+
:extra-paths ["notebooks" "resources" "test"]
71+
:task (exec 'nextjournal.clerk/build!)}
72+
5973
playwright:version {:doc "Print used playwright version from ui_tests/yarn.json"
6074
:task (print (->> (babashka.process/shell {:out :string} "grep -E 'playwright-core \"(.*)\"' ui_tests/yarn.lock")
6175
:out

bb/tasks.clj

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,14 @@
7070

7171
(defn version []
7272
(shared/version))
73+
74+
(defn bb-nrepl [args]
75+
(System/setProperty "clerk.resource_manifest" (str {"/js/viewer.js" "/js/viewer.js"}))
76+
((requiring-resolve 'babashka.nrepl.server/start-server!) {:host "localhost" :port 1339})
77+
(spit ".nrepl-port" "1339")
78+
((requiring-resolve 'nextjournal.clerk/serve!) args)
79+
(-> (Runtime/getRuntime)
80+
(.addShutdownHook (Thread. (fn []
81+
((requiring-resolve 'nextjournal.clerk/halt!))
82+
(fs/delete ".nrepl-port")))))
83+
(deref (promise)))

deps.edn

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
{:paths ["src" "resources" "bb"]
2-
:deps {org.clojure/clojure {:mvn/version "1.10.3"}
2+
:deps {org.clojure/clojure {:mvn/version "1.11.1"}
33
org.clojure/java.classpath {:mvn/version "1.0.0"}
44
babashka/fs {:mvn/version "0.5.22"}
55
borkdude/edamame {:mvn/version "1.4.28"}
66
weavejester/dependency {:mvn/version "0.2.1"}
77
com.nextjournal/beholder {:mvn/version "1.0.2"}
88
org.flatland/ordered {:mvn/version "1.15.12"}
9-
io.github.nextjournal/markdown {:mvn/version "0.7.184"}
9+
io.github.nextjournal/markdown {:mvn/version "0.7.186"}
1010
babashka/process {:mvn/version "0.4.16"}
11-
io.github.nextjournal/dejavu {:git/sha "4980e0cc18c9b09fb220874ace94ba6b57a749ca"}
11+
io.github.nextjournal/dejavu {:git/sha "7276cd9cec1bad001d595b52cee9e83a60d43bf0"}
1212
io.github.babashka/sci.nrepl {:mvn/version "0.0.2"}
1313

1414
com.taoensso/nippy {:mvn/version "3.4.2"}
1515

16-
mvxcvi/multiformats {:mvn/version "0.3.107"}
16+
mvxcvi/multiformats {:mvn/version "1.0.125"}
17+
mvxcvi/alphabase {:mvn/version "3.0.185"}
1718
com.pngencoder/pngencoder {:mvn/version "0.13.1"}
1819

1920
http-kit/http-kit {:mvn/version "2.8.0"}
@@ -41,7 +42,7 @@
4142
cider/cider-nrepl {:mvn/version "0.55.7"}
4243
nrepl/nrepl {:mvn/version "1.3.1"}
4344
com.clojure-goes-fast/clj-async-profiler {:mvn/version "1.3.0"}
44-
io.github.nextjournal/cas-client {:git/sha "d9f838937ebc8b645fe5764949e72a6df8e344de"}
45+
io.github.nextjournal/cas-client {:git/sha "114d3d88d38a2068ec844b0e6c808eaaa6aa64ef"}
4546
org.slf4j/slf4j-nop {:mvn/version "2.0.7"}
4647
org.babashka/cli {:mvn/version "0.5.40"}
4748
org.clojure/data.int-map {:mvn/version "1.3.0"}}
@@ -93,7 +94,7 @@
9394
:nextjournal.garden/aliases [:demo]}
9495

9596
:build {:deps {io.github.nextjournal/clerk {:local/root "."}
96-
io.github.nextjournal/cas-client {:git/sha "d9f838937ebc8b645fe5764949e72a6df8e344de"}
97+
io.github.nextjournal/cas-client {:git/sha "114d3d88d38a2068ec844b0e6c808eaaa6aa64ef"}
9798
io.github.clojure/tools.build {:git/tag "v0.10.3" :git/sha "15ead66"}
9899
io.github.slipset/deps-deploy {:git/sha "b4359c5d67ca002d9ed0c4b41b710d7e5a82e3bf"}}
99100
:extra-paths ["bb" "src" "resources"] ;; for loading lookup-url in build

notebooks/babashka.clj

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
(ns babashka
2+
; {:nextjournal.clerk/no-cache true}
3+
(:require [babashka.fs :as fs]
4+
[nextjournal.clerk :as clerk]))
5+
6+
(System/getProperty "babashka.version")
7+
8+
*file*
9+
10+
(fs/exists? *file*)
11+
12+
;;;;
13+
14+
;;;; dude
15+
16+
(+ 1 2 3)
17+
18+
(prn :dude)
19+
20+
java.io.File
21+
22+
(def x 2)
23+
24+
(prn x)
25+
26+
(clerk/with-viewer
27+
{
28+
:render-fn '(fn [_]
29+
[:div {:style {:color "green"}}
30+
"Hello"])}
31+
nil)

src/nextjournal/beholder.bb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
(ns nextjournal.beholder
2+
"Babashka runtime no-op stubs")
3+
4+
(defn watch [cb & args] nil)
5+
(defn stop [w] nil)

src/nextjournal/clerk.clj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -662,3 +662,7 @@
662662
(clear-cache!)
663663
(halt!)
664664
)
665+
666+
(comment
667+
(with-cache 1)
668+
)

src/nextjournal/clerk/always_array_map.clj

Lines changed: 89 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
(ns nextjournal.clerk.always-array-map
22
"A persistent data structure that is based on array-map, but doesn't turn into a hash-map by using assoc etc.
3-
Prints like a normal Clojure map in the order of insertion.")
3+
Prints like a normal Clojure map in the order of insertion."
4+
(:require [nextjournal.clerk.utils :as utils]))
45

56
(set! *warn-on-reflection* true)
67

@@ -9,72 +10,100 @@
910

1011
(declare ->AlwaysArrayMap)
1112

12-
(deftype AlwaysArrayMap [^clojure.lang.PersistentArrayMap the-map]
13-
clojure.lang.ILookup
14-
(valAt [_ k]
15-
(get the-map k))
16-
17-
clojure.lang.Seqable
18-
(seq [_]
19-
(seq the-map))
20-
21-
clojure.lang.IPersistentMap
22-
(assoc [_ k v]
23-
(if (< (count the-map) 8)
24-
(->AlwaysArrayMap (assoc the-map k v))
25-
(->AlwaysArrayMap (assoc-after the-map k v))))
26-
27-
(assocEx [_ _k _v]
28-
(throw (ex-info "Not implemented" {})))
29-
30-
(without [_ k]
31-
(->AlwaysArrayMap (dissoc the-map k)))
32-
33-
clojure.lang.Associative
34-
(containsKey [_ k]
35-
(contains? the-map k))
36-
37-
clojure.lang.IPersistentCollection
38-
(equiv [_ other]
39-
(= the-map other))
40-
(count [_]
41-
(count the-map))
42-
43-
java.lang.Iterable
44-
(iterator [_]
45-
(.iterator the-map))
46-
47-
clojure.lang.IMeta
48-
(meta [_]
49-
(meta the-map))
50-
51-
clojure.lang.IObj
52-
(withMeta [_ meta]
53-
(->AlwaysArrayMap (with-meta the-map meta)))
54-
55-
Object
56-
(toString [_]
57-
"<always-array-map>"))
13+
(utils/if-bb
14+
(defn ->AlwaysArrayMap [m]
15+
(proxy [clojure.lang.APersistentMap clojure.lang.IMeta clojure.lang.IObj]
16+
[]
17+
(valAt
18+
([k]
19+
(get m k))
20+
([k default-value]
21+
(get m k default-value)))
22+
(iterator []
23+
(.iterator ^java.lang.Iterable m))
24+
25+
(containsKey [k] (contains? m k))
26+
(entryAt [k] (when (contains? m k)
27+
(get this k)))
28+
(equiv [other] (= m other))
29+
(empty [] (empty m))
30+
(count [] (count m))
31+
(assoc [k v] (if (< (count m) 8)
32+
(->AlwaysArrayMap (assoc m k v))
33+
(->AlwaysArrayMap (assoc-after m k v))))
34+
(without [k] (->AlwaysArrayMap (dissoc m k)))
35+
(seq [] (seq m))
36+
; a lot of map users expect meta to work
37+
(meta [] (meta m))
38+
(withMeta [meta] (->AlwaysArrayMap (with-meta m meta)))))
39+
40+
(deftype AlwaysArrayMap [^clojure.lang.PersistentArrayMap the-map]
41+
clojure.lang.ILookup
42+
(valAt [_ k]
43+
(get the-map k))
44+
45+
clojure.lang.Seqable
46+
(seq [_]
47+
(seq the-map))
48+
49+
clojure.lang.IPersistentMap
50+
(assoc [_ k v]
51+
(if (< (count the-map) 8)
52+
(->AlwaysArrayMap (assoc the-map k v))
53+
(->AlwaysArrayMap (assoc-after the-map k v))))
54+
55+
(assocEx [_ _k _v]
56+
(throw (ex-info "Not implemented" {})))
57+
58+
(without [_ k]
59+
(->AlwaysArrayMap (dissoc the-map k)))
60+
61+
clojure.lang.Associative
62+
(containsKey [_ k]
63+
(contains? the-map k))
64+
65+
clojure.lang.IPersistentCollection
66+
(equiv [_ other]
67+
(= the-map other))
68+
(count [_]
69+
(count the-map))
70+
71+
java.lang.Iterable
72+
(iterator [_]
73+
(.iterator the-map))
74+
75+
clojure.lang.IMeta
76+
(meta [_]
77+
(meta the-map))
78+
79+
clojure.lang.IObj
80+
(withMeta [_ meta]
81+
(->AlwaysArrayMap (with-meta the-map meta)))
82+
83+
Object
84+
(toString [_]
85+
"<always-array-map>")))
5886

5987
(defn assoc-before [aam k v]
6088
(->AlwaysArrayMap (apply array-map (list* k v (interleave (keys aam) (vals aam))))))
6189

6290
(defn always-array-map [& kvs]
6391
(->AlwaysArrayMap (apply array-map kvs)))
6492

65-
(defmethod print-method AlwaysArrayMap
66-
[v ^java.io.Writer writer]
67-
(.write writer "{")
68-
(let [write-kv! (fn [k v]
69-
(.write writer (pr-str k))
70-
(.write writer " ")
71-
(.write writer (pr-str v)))]
72-
(doseq [[k v] (butlast v)]
73-
(write-kv! k v)
74-
(.write writer ", "))
75-
(let [[k v] (last v)]
76-
(write-kv! k v)))
77-
(.write writer "}"))
93+
(utils/when-not-bb
94+
(defmethod print-method AlwaysArrayMap
95+
[v ^java.io.Writer writer]
96+
(.write writer "{")
97+
(let [write-kv! (fn [k v]
98+
(.write writer (pr-str k))
99+
(.write writer " ")
100+
(.write writer (pr-str v)))]
101+
(doseq [[k v] (butlast v)]
102+
(write-kv! k v)
103+
(.write writer ", "))
104+
(let [[k v] (last v)]
105+
(write-kv! k v)))
106+
(.write writer "}")))
78107

79108
(comment
80109
(pr-str (always-array-map 1 2))

0 commit comments

Comments
 (0)