use hash-table for storing env-data - no override slots!
This commit is contained in:
parent
966a56037e
commit
ebd7275b8a
3 changed files with 16 additions and 17 deletions
18
config.lisp
18
config.lisp
|
@ -5,12 +5,12 @@
|
|||
(defpackage :scopes/config
|
||||
(:use :common-lisp)
|
||||
(:export #:base
|
||||
#:override-keys #:env-prefix #:env-path))
|
||||
#:env-data #:env-keys #:env-prefix #:env-path))
|
||||
|
||||
(in-package :scopes/config)
|
||||
|
||||
(defclass base ()
|
||||
((override-keys :reader override-keys
|
||||
((env-keys :reader env-keys
|
||||
:initform nil
|
||||
:allocation :class)
|
||||
(env-prefix :reader env-prefix
|
||||
|
@ -18,17 +18,19 @@
|
|||
:initform "SCOPES_")
|
||||
(env-path :reader env-path
|
||||
:initarg :env-path
|
||||
:initform nil)))
|
||||
:initform nil)
|
||||
(env-data :accessor env-data
|
||||
:initform (make-hash-table))))
|
||||
|
||||
(defmethod initialize-instance :after ((cfg base) &key &allow-other-keys)
|
||||
(let* ((prefix (env-prefix cfg))
|
||||
(let* ((data (env-data cfg))
|
||||
(prefix (env-prefix cfg))
|
||||
(ep (env-path cfg))
|
||||
(dotenv-data (if ep (dotenv:read-env ep))))
|
||||
(dolist (sl (override-keys cfg))
|
||||
(dolist (sl (env-keys cfg))
|
||||
(let* ((key (str:concat prefix (string sl)))
|
||||
(env-val (uiop:getenv key))
|
||||
(dotenv-val (if dotenv-data (gethash key dotenv-data))))
|
||||
(if env-val
|
||||
(setf (slot-value cfg sl) env-val)
|
||||
(if dotenv-val
|
||||
(setf (slot-value cfg sl) dotenv-val)))))))
|
||||
(setf (gethash sl data) env-val)
|
||||
(setf (gethash sl data) dotenv-val))))))
|
||||
|
|
|
@ -5,6 +5,4 @@
|
|||
(in-package :scopes/test-config)
|
||||
|
||||
(setf *config*
|
||||
(make-instance 'test-config
|
||||
:user "default-user"
|
||||
:password "public"))
|
||||
(make-instance 'test-config))
|
||||
|
|
|
@ -15,10 +15,8 @@
|
|||
(defvar *config* nil)
|
||||
|
||||
(defclass test-config (config:base)
|
||||
((config:override-keys :initform '(user password))
|
||||
(config:env-path :initform (t:test-path ".test.env"))
|
||||
(user :initarg :user :reader user)
|
||||
(password :initarg :password :reader password)))
|
||||
((config:env-keys :initform '(:user :password))
|
||||
(config:env-path :initform (t:test-path ".test.env"))))
|
||||
|
||||
(defun run ()
|
||||
(let ((*config* nil)
|
||||
|
@ -35,5 +33,6 @@
|
|||
(== (pathname-name (util:home-path ".env.txt" "lisp" "cl-scopes")) ".env"))
|
||||
|
||||
(t:deftest test-env-override ()
|
||||
(== (user *config*) "user-from-env-file")
|
||||
(== (password *config*) "very_secret"))
|
||||
(let ((data (config:env-data *config*)))
|
||||
(== (gethash :user data) "user-from-env-file")
|
||||
(== (gethash :password data) "very_secret")))
|
||||
|
|
Loading…
Add table
Reference in a new issue