Skip to content

Commit ecf7836

Browse files
committed
More robust Clojure startup, should always show session type now
1 parent 1b2e759 commit ecf7836

6 files changed

Lines changed: 486 additions & 149 deletions

File tree

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
(local {: describe : it} (require :plenary.busted))
2+
(local assert (require :luassert.assert))
3+
(local server (require :conjure.client.clojure.nrepl.server))
4+
(local state (require :conjure.client.clojure.nrepl.state))
5+
(local core (require :nfnl.core))
6+
7+
(fn make-conn [opts]
8+
"Create a minimal mock conn object for testing."
9+
(core.merge
10+
{:ready? false
11+
:pending-evals []
12+
:setup-timeout nil
13+
:host "localhost"
14+
:port 12345
15+
:session "test-session"
16+
:describe {}
17+
:seen-ns {}
18+
:send (fn [])
19+
:destroy (fn [])}
20+
opts))
21+
22+
(fn set-conn! [conn]
23+
(core.assoc (state.get) :conn conn))
24+
25+
(fn clear-conn! []
26+
(core.assoc (state.get) :conn nil))
27+
28+
(describe "client.clojure.nrepl.server"
29+
(fn []
30+
31+
(describe "with-conn-or-warn"
32+
(fn []
33+
(it "calls f when conn exists"
34+
(fn []
35+
(set-conn! (make-conn))
36+
(var called? false)
37+
(server.with-conn-or-warn (fn [_conn] (set called? true)))
38+
(assert.is_true called?)
39+
(clear-conn!)))
40+
41+
(it "does not call f when no conn"
42+
(fn []
43+
(clear-conn!)
44+
(var called? false)
45+
(server.with-conn-or-warn (fn [_conn] (set called? true)) {:silent? true})
46+
(assert.is_false called?)))))
47+
48+
(describe "with-conn-ready-or-queue"
49+
(fn []
50+
(it "calls f immediately when conn is ready"
51+
(fn []
52+
(set-conn! (make-conn {:ready? true}))
53+
(var called? false)
54+
(server.with-conn-ready-or-queue (fn [_conn] (set called? true)))
55+
(assert.is_true called?)
56+
(clear-conn!)))
57+
58+
(it "queues f when conn is not ready"
59+
(fn []
60+
(let [conn (make-conn {:ready? false})]
61+
(set-conn! conn)
62+
(var called? false)
63+
(server.with-conn-ready-or-queue (fn [_conn] (set called? true)))
64+
(assert.is_false called?)
65+
(assert.are.equals 1 (length conn.pending-evals))
66+
(clear-conn!))))
67+
68+
(it "does not call f or queue when no conn"
69+
(fn []
70+
(clear-conn!)
71+
(var called? false)
72+
(server.with-conn-ready-or-queue (fn [_conn] (set called? true)) {:silent? true})
73+
(assert.is_false called?)))))
74+
75+
(describe "mark-ready!"
76+
(fn []
77+
(it "sets ready? and drains pending evals in order"
78+
(fn []
79+
(let [conn (make-conn {:ready? false})
80+
results []]
81+
(set-conn! conn)
82+
(table.insert conn.pending-evals (fn [_conn] (table.insert results :first)))
83+
(table.insert conn.pending-evals (fn [_conn] (table.insert results :second)))
84+
(table.insert conn.pending-evals (fn [_conn] (table.insert results :third)))
85+
(server.mark-ready!)
86+
(assert.is_true conn.ready?)
87+
(assert.same [:first :second :third] results)
88+
(assert.are.equals 0 (length conn.pending-evals))
89+
(clear-conn!))))
90+
91+
(it "is idempotent — second call is a no-op"
92+
(fn []
93+
(let [conn (make-conn {:ready? false})
94+
call-count {:n 0}]
95+
(set-conn! conn)
96+
(table.insert conn.pending-evals (fn [_conn] (set call-count.n (+ call-count.n 1))))
97+
(server.mark-ready!)
98+
(assert.are.equals 1 call-count.n)
99+
;; Second call should not drain again.
100+
(table.insert conn.pending-evals (fn [_conn] (set call-count.n (+ call-count.n 1))))
101+
(server.mark-ready!)
102+
;; The second pending-eval should NOT have been drained by mark-ready!
103+
;; because ready? is already true.
104+
(assert.are.equals 1 call-count.n)
105+
(clear-conn!))))
106+
107+
(it "no-ops when no conn exists"
108+
(fn []
109+
(clear-conn!)
110+
;; Should not error.
111+
(server.mark-ready!)))))
112+
113+
(describe "connected?"
114+
(fn []
115+
(it "returns true when conn exists"
116+
(fn []
117+
(set-conn! (make-conn))
118+
(assert.is_true (server.connected?))
119+
(clear-conn!)))
120+
121+
(it "returns false when no conn"
122+
(fn []
123+
(clear-conn!)
124+
(assert.is_false (server.connected?))))))
125+
126+
(describe "un-comment"
127+
(fn []
128+
(it "strips leading #_ from code"
129+
(fn []
130+
(assert.are.equals "(+ 1 2)" (server.un-comment "#_(+ 1 2)"))))
131+
132+
(it "leaves code without #_ unchanged"
133+
(fn []
134+
(assert.are.equals "(+ 1 2)" (server.un-comment "(+ 1 2)"))))
135+
136+
(it "returns nil for nil input"
137+
(fn []
138+
(assert.are.equals nil (server.un-comment nil))))))))

fnl/conjure/client/clojure/nrepl/action.fnl

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,8 @@
275275
(editor.percent-width
276276
(cfg [:interrupt :sample_limit])))
277277
(.. "session: " (sess.str) "")))]
278-
{:break? true}))))]
278+
{:break? true}))
279+
server.session-type-timeout))]
279280

280281
(if (core.empty? msgs)
281282
(order-66 {:session conn.session})
@@ -345,14 +346,15 @@
345346
(fn [conn]
346347
(server.enrich-session-id
347348
(core.get conn :session)
348-
server.clone-session))))))
349+
server.clone-session
350+
server.session-type-timeout))))))
349351

350352
(fn M.clone-fresh-session []
351353
(try-ensure-conn
352354
(fn []
353355
(server.with-conn-or-warn
354356
(fn [conn]
355-
(server.clone-session))))))
357+
(server.clone-session nil nil server.session-type-timeout))))))
356358

357359
(fn M.close-current-session []
358360
(try-ensure-conn
@@ -365,14 +367,16 @@
365367
(core.assoc conn :session nil)
366368
(log.append [(.. "; Closed current session: " (sess.str))]
367369
{:break? true})
368-
(server.close-session sess #(server.assume-or-create-session)))))))))
370+
(server.close-session sess #(server.assume-or-create-session nil {:timeout server.session-type-timeout})))
371+
server.session-type-timeout))))))
369372

370373
(fn M.display-sessions [cb]
371374
(try-ensure-conn
372375
(fn []
373376
(server.with-sessions
374377
(fn [sessions]
375-
(ui.display-sessions sessions cb))))))
378+
(ui.display-sessions sessions cb))
379+
{:timeout server.session-type-timeout}))))
376380

377381
(fn M.close-all-sessions []
378382
(try-ensure-conn
@@ -382,7 +386,8 @@
382386
(core.run! server.close-session sessions)
383387
(log.append [(.. "; Closed all sessions (" (core.count sessions) ")")]
384388
{:break? true})
385-
(server.clone-session))))))
389+
(server.clone-session nil nil server.session-type-timeout))
390+
{:timeout server.session-type-timeout}))))
386391

387392
(fn cycle-session [f]
388393
(try-ensure-conn
@@ -399,7 +404,8 @@
399404
(ll.cycle)
400405
(ll.until #(f session $1))
401406
(ll.val)
402-
(server.assume-session)))))))))))
407+
(server.assume-session)))))
408+
{:timeout server.session-type-timeout}))))))
403409

404410
(fn M.next-session []
405411
(cycle-session
@@ -423,7 +429,8 @@
423429
{:prompt "Select an nREPL session:"
424430
:format_item #(.. $.name " (" $.pretty-type ", " $.id ")")}
425431
(fn [session]
426-
(server.assume-session session)))))))))
432+
(server.assume-session session)))))
433+
{:timeout server.session-type-timeout}))))
427434

428435
(set M.test-runners
429436
{:clojure

0 commit comments

Comments
 (0)