Как пересмотреть иерархию переменных в Clojure? - PullRequest
0 голосов
/ 13 октября 2018

В моем проекте Clojure я использую пространство имен для хранения конфигурации:

(ns clojure-bgproc.settings
  (:require [environ.core :refer [env]]
            [clojure.edn :as edn]))

(def ^:dynamic *app-env* (env :app-env "production"))

(def ^:private config-path
  (if (= *app-env* "test") "settings_test.edn" "settings.edn"))
(def config (-> config-path slurp edn/read-string))
(def db-config (:db config))

В тестовой среде я использую приспособление для переопределения *app-env*:

(ns helpers.config
  (:require [clojure-bgproc.settings :refer :all]))

(defn with-test-config [f]
  (with-redefs [*app-env* "test"]
    (f)))

И хотя *app-env* переопределено, все остальные переменные конфигурации не являются:

FAIL in (app-config-test) (core_test.clj:14)
expected: (s/ends-with? (:dbname db-config) "test")
  actual: (not (s/ends-with? "rmq-reports-development" "test"))

Есть ли способ для меня, чтобы легко переопределить все другие переменные конфигурации без необходимости их пересчета вручную?

1 Ответ

0 голосов
/ 13 октября 2018

Я думаю, что вы можете делать все, что вы хотите, просто используя профили и lein-environ.

Простая неправильная настройка environ.Обратите внимание, что также требуется плагин lein-environ.

Ваш project.clj:

  :dependencies [
    [environ "1.1.0"]  ...]      ; ********** REQUIRED  *********

  :plugins [[com.jakemccrary/lein-test-refresh "0.22.0"]
            [lein-ancient "0.6.15"]
            [lein-codox "0.10.3"]
            [lein-environ "1.1.0"]]   ; ********** REQUIRED  *********

  :db "jdbc:postgresql://localhost/default"  ; *** default vals ***
  :settings "settings-default.edn"

Затем сделайте profiles.clj:

{:dev  {:env {:db       "jdbc:postgresql://localhost/dev"
              :settings "settings-dev.edn"}}
 :test {:env {:db       "jdbc:postgresql://localhost/test"
              :settings "settings-test.edn"}}}

Затем в вашем proj.core ns:

(ns demo.core
  (:use tupelo.core)
  (:require
    [environ.core :as env]
    ))

(defn -main []
  (println "main -enter")
  (spyx (env/env :db))
  (spyx (env/env :settings)) )

И ваш тестовый файл:

(ns tst.demo.core
  (:use demo.core tupelo.core tupelo.test)
  (:require
    [clojure.string :as str]
    [environ.core :as env]))

(dotest
  (spyx (env/env :db))
  (spyx (env/env :settings))
  )

Запустите код:

~/expr/demo > lein run
main -enter
(env/env :db) => "jdbc:postgresql://localhost/dev"
(env/env :settings) => "settings-dev.edn"

Запустите тесты:

~ / expr / demo> lein test

lein test _bootstrap

--------------------------------------
   Clojure 1.10.0-alpha8    Java 11
--------------------------------------

lein test tst.demo.core
(env/env :db) => "jdbc:postgresql://localhost/test"
(env/env :settings) => "settings-test.edn"

Ran 2 tests containing 0 assertions.
0 failures, 0 errors.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...