Skip to content

Commit 99caca3

Browse files
committed
Refactor config.clj
1 parent 592a24a commit 99caca3

File tree

4 files changed

+34
-38
lines changed

4 files changed

+34
-38
lines changed

src/eca/config.clj

Lines changed: 29 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -184,13 +184,14 @@
184184
"walk through config parsing dynamic string contents if value is a string."
185185
[config cwd]
186186
(walk/postwalk
187-
(fn [x]
188-
(if (string? x)
189-
(parse-dynamic-string x cwd config)
190-
x))
191-
config))
187+
(fn [x]
188+
(if (string? x)
189+
(parse-dynamic-string x cwd config)
190+
x))
191+
config))
192192

193-
(def initial-config (memoize #(parse-dynamic-string-values initial-config* nil)))
193+
(defn initial-config []
194+
(parse-dynamic-string-values initial-config* (io/file ".")))
194195

195196
(def ^:private fallback-behavior "agent")
196197

@@ -216,13 +217,11 @@
216217
(alter-var-root config-dyn-var (constantly true))
217218
(logger/warn logger-tag "Error parsing config json:" (.getMessage e)))))
218219

219-
(defn ^:private config-from-envvar* []
220+
(defn ^:private config-from-envvar []
220221
(some-> (System/getenv "ECA_CONFIG")
221222
(safe-read-json-string (var *env-var-config-error*))
222223
(parse-dynamic-string-values (io/file "."))))
223224

224-
(def ^:private config-from-envvar (memoize config-from-envvar*))
225-
226225
(defn ^:private config-from-custom* []
227226
(when-some [path @custom-config-file-path*]
228227
(let [config-file (io/file path)]
@@ -240,15 +239,13 @@
240239
(defn global-config-file ^File []
241240
(io/file (global-config-dir) "config.json"))
242241

243-
(defn ^:private config-from-global-file* []
242+
(defn ^:private config-from-global-file []
244243
(let [config-file (global-config-file)]
245244
(when (.exists config-file)
246245
(some-> (safe-read-json-string (slurp config-file) (var *global-config-error*))
247246
(parse-dynamic-string-values (global-config-dir))))))
248247

249-
(def ^:private config-from-global-file (memoize/ttl config-from-global-file* :ttl/threshold ttl-cache-config-ms))
250-
251-
(defn ^:private config-from-local-file* [roots]
248+
(defn ^:private config-from-local-file [roots]
252249
(reduce
253250
(fn [final-config {:keys [uri]}]
254251
(merge
@@ -261,8 +258,6 @@
261258
{}
262259
roots))
263260

264-
(def ^:private config-from-local-file (memoize/ttl config-from-local-file* :ttl/threshold ttl-cache-config-ms))
265-
266261
(def initialization-config* (atom {}))
267262

268263
(defn ^:private deep-merge [& maps]
@@ -324,7 +319,7 @@
324319
:else m*))]
325320
(normalize-map [] m)))
326321

327-
(def ^:private eca-config-normalization-rules
322+
(def ^:private normalization-rules
328323
{:kebab-case
329324
[[:providers]]
330325
:stringfy
@@ -349,22 +344,23 @@
349344
[:behavior :ANY :toolCall :approval :deny :ANY :argsMatchers]
350345
[:otlp]]})
351346

352-
(defn ^:private config-from-custom-or-default-location [pure-config? db]
353-
(if-some [config-from-custom (config-from-custom)]
354-
(when-not pure-config? config-from-custom)
355-
(deep-merge
356-
(when-not pure-config? (config-from-global-file))
357-
(when-not pure-config? (config-from-local-file (:workspace-folders db))))))
358-
359-
(defn all [db]
347+
(defn ^:private all* [db]
360348
(let [initialization-config @initialization-config*
361-
pure-config? (:pureConfig initialization-config)]
362-
(deep-merge (initial-config)
363-
(normalize-fields
364-
eca-config-normalization-rules
365-
(deep-merge initialization-config
366-
(when-not pure-config? (config-from-envvar))
367-
(config-from-custom-or-default-location pure-config? db))))))
349+
pure-config? (:pureConfig initialization-config)
350+
merge-config (fn [c1 c2]
351+
(deep-merge c1 (normalize-fields normalization-rules c2)))]
352+
(as-> {} $
353+
(merge-config $ (initial-config))
354+
(merge-config $ initialization-config)
355+
(merge-config $ (when-not pure-config?
356+
(config-from-envvar)))
357+
(if-let [custom-config (config-from-custom)]
358+
(merge-config $ (when-not pure-config? custom-config))
359+
(-> $
360+
(merge-config (when-not pure-config? (config-from-global-file)))
361+
(merge-config (when-not pure-config? (config-from-local-file (:workspace-folders db)))))))))
362+
363+
(def all (memoize/ttl all* :ttl/threshold ttl-cache-config-ms))
368364

369365
(defn validation-error []
370366
(cond
@@ -440,9 +436,9 @@
440436

441437
(defn update-global-config! [config]
442438
(let [global-config-file (global-config-file)
443-
current-config (normalize-fields eca-config-normalization-rules (config-from-global-file))
439+
current-config (normalize-fields normalization-rules (config-from-global-file))
444440
new-config (deep-merge current-config
445-
(normalize-fields eca-config-normalization-rules config))
441+
(normalize-fields normalization-rules config))
446442
new-config-json (json/generate-string new-config {:pretty true})]
447443
(io/make-parents global-config-file)
448444
(spit global-config-file new-config-json)))

test/eca/config_test.clj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,15 @@
1818
{:pureConfig true
1919
:providers {"github-copilot" {:key nil
2020
:models {"gpt-5" {}}}}}
21-
(config/all {}))))
21+
(#'config/all* {}))))
2222
(testing "deep merging initializationOptions with initial config"
2323
(reset! config/initialization-config* {:pureConfig true
2424
:providers {"githubCopilot" {:key "123"}}})
2525
(is (match?
2626
{:pureConfig true
2727
:providers {"github-copilot" {:key "123"
2828
:models {"gpt-5" {}}}}}
29-
(config/all {}))))
29+
(#'config/all* {}))))
3030
(testing "providers and models are updated correctly"
3131
(reset! config/initialization-config* {:pureConfig true
3232
:providers {"customProvider" {:key "123"
@@ -37,7 +37,7 @@
3737
:providers {"custom-provider" {:key "123"
3838
:models {"gpt-5" {}}}
3939
"openrouter" {:models {"openai/o4-mini" {}}}}}
40-
(config/all {})))))
40+
(#'config/all* {})))))
4141

4242
(deftest deep-merge-test
4343
(testing "basic merge"

test/eca/handlers_test.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
:models {"gpt-5" {:a 1}
2929
"gpt-5-mini" {}}
3030
:url string?}}}
31-
(config/all @db*)))))))
31+
(#'config/all* @db*)))))))
3232

3333
(deftest chat-selected-behavior-changed-test
3434
(testing "Switching to behavior with defaultModel updates model"

test/eca/test_helper.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
{:db* (atom db/initial-db)
4141
:messenger (->TestMessenger (atom {}) (atom []))
4242
:metrics (metrics/->NoopMetrics)
43-
:config (config/initial-config)})
43+
:config config/initial-config})
4444

4545
(def components* (atom (make-components)))
4646
(defn components [] @components*)

0 commit comments

Comments
 (0)