diff --git a/config.lisp b/config.lisp index f9a1056..585f7d7 100644 --- a/config.lisp +++ b/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)))))) diff --git a/test/etc/config-dummy.lisp b/test/etc/config-dummy.lisp index 546509d..6de6834 100644 --- a/test/etc/config-dummy.lisp +++ b/test/etc/config-dummy.lisp @@ -5,6 +5,4 @@ (in-package :scopes/test-config) (setf *config* - (make-instance 'test-config - :user "default-user" - :password "public")) + (make-instance 'test-config)) diff --git a/test/test-config.lisp b/test/test-config.lisp index 8577623..38a3317 100644 --- a/test/test-config.lisp +++ b/test/test-config.lisp @@ -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")))