From 6ad24904385fc7c4162e04fcb47a2b625b505079 Mon Sep 17 00:00:00 2001 From: Josue Gomez Date: Wed, 13 Nov 2019 17:16:00 -0600 Subject: [PATCH] v2.6 fix search dir for localenv first load --- dist/pyutl-2.6.tar.gz | Bin 0 -> 4377 bytes pyutl.egg-info/PKG-INFO | 2 +- pyutl/__init__.py | 2 +- pyutl/localenv.py | 34 ++++++++++++++++++++++++---------- 4 files changed, 26 insertions(+), 12 deletions(-) create mode 100644 dist/pyutl-2.6.tar.gz diff --git a/dist/pyutl-2.6.tar.gz b/dist/pyutl-2.6.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..e97a5078b9923209e01e4c2cae1b9d3832d9aa0e GIT binary patch literal 4377 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 THnpiu|D^PPX3xK~0C)fZ8}h2q literal 0 HcmV?d00001 diff --git a/pyutl.egg-info/PKG-INFO b/pyutl.egg-info/PKG-INFO index 777c804..7d87c0f 100644 --- a/pyutl.egg-info/PKG-INFO +++ b/pyutl.egg-info/PKG-INFO @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: pyutl -Version: 2.5 +Version: 2.6 Summary: functions and utilities to recycle code Home-page: https://git.binkfe.com/jesrat/pyutl Author: Josue Gomez diff --git a/pyutl/__init__.py b/pyutl/__init__.py index ee0d56c..045668b 100644 --- a/pyutl/__init__.py +++ b/pyutl/__init__.py @@ -11,7 +11,7 @@ shellExecute can receive a cmd as str or arr example __title__ = 'pyutl' __description__ = 'functions and utilities to recycle code' __url__ = 'https://git.binkfe.com/jesrat/pyutl' -__version__ = '2.5' +__version__ = '2.6' __author__ = 'Josue Gomez ' __email__ = "jgomez@binkfe.com" __maintainer__ = "Josue Gomez" diff --git a/pyutl/localenv.py b/pyutl/localenv.py index 6f8e517..9f829e8 100644 --- a/pyutl/localenv.py +++ b/pyutl/localenv.py @@ -15,19 +15,23 @@ DEFAULT = object() class LocalEnv: + _BOOLEANS = {'1': True, 'yes': True, 'true': True, 'on': True, + '0': False, 'no': False, 'false': False, 'off': False, '': False} + def __init__(self): self.files = [] self.data = {} + self.first_load = False def load(self, file=None): """ If no file is defined, the .env file will be searched in invoker module's directory """ - if file is not None: - self.files.append({'file': file, 'exists': '', 'loaded': False}) - else: - self.files.append({'file': self._invoker(), 'exists': '', 'loaded': False}) + if file is None: + file = self._invoker() + + self.files.append({'file': file, 'exists': '', 'loaded': False}) # search all files given and load them for file_dict in self.files: @@ -45,26 +49,36 @@ class LocalEnv: self.data[key] = value file_dict['loaded'] = True + def _cast(self, cast, data): + if cast is bool and str(data).lower() not in self._BOOLEANS: + raise ValueError(f'value can not be parsed as boolean') + elif cast is bool: + return self._BOOLEANS[str(data).lower()] + else: + return cast(data) + def get(self, key, default=DEFAULT, cast=None): + if not self.first_load: + self.load() + self.first_load = True + try: - ret_val = self.data[key] if cast is None else cast(self.data[key]) + ret_val = self.data[key] if cast is None else self._cast(cast, self.data[key]) except KeyError: if default != DEFAULT: - ret_val = default if cast is None else cast(default) + ret_val = default if cast is None else self._cast(cast, default) else: raise KeyNotFound(f'value not found in files: \n{json.dumps(self.files, indent=4)}') return ret_val - @staticmethod - def _invoker(): + def _invoker(self): # tip from: # https://github.com/henriquebastos/python-decouple/blob/master/decouple.py # MAGIC! Get the caller's module path. frame = sys._getframe() - path = os.path.dirname(frame.f_back.f_back.f_code.co_filename) + path = os.path.dirname(frame.f_back.f_back.f_back.f_code.co_filename) file = os.path.join(path, '.env') return file localenv = LocalEnv() -localenv.load()