|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- # Copyright 2019 Huawei Technologies Co., Ltd
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
- # You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software
- # distributed under the License is distributed on an "AS IS" BASIS,
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- # See the License for the specific language governing permissions and
- # limitations under the License.
- # ============================================================================
- """Conf module."""
-
- import os
- import json
- import types
- from importlib import import_module
-
-
- class Settings:
- """
- Definition of Settings class.
-
- Examples:
- >>> from mindinsight.conf import settings
- >>> print(settings.PORT)
- """
-
- _prefix = 'MINDINSIGHT_'
- _explicit_settings = set()
- _default_settings = set()
-
- def __init__(self):
- """Initialization of Settings."""
- self.load_from_defaults()
- self.load_from_constants()
- self.refresh()
-
- def refresh(self):
- """Refresh settings from config file and environment variables."""
- self.update_from_file()
- self.update_from_env()
-
- def load_from_defaults(self):
- """Update settings from defaults module."""
- default_settings = import_module('mindinsight.conf.defaults')
- for setting in dir(default_settings):
- if setting.isupper():
- setattr(self, setting, getattr(default_settings, setting))
- self._default_settings.add(setting)
-
- def load_from_constants(self):
- """Update settings from constants module"""
- constant_settings = import_module('mindinsight.conf.constants')
- for setting in dir(constant_settings):
- if setting.isupper():
- setattr(self, setting, getattr(constant_settings, setting))
-
- def update_from_file(self):
- """Update settings from config file."""
- config_path = os.environ.get('MINDINSIGHT_CONFIG', '')
- if not config_path:
- return
-
- config_module = None
-
- # python:full.path.for.config.module
- if config_path.startswith('python:'):
- config_module = import_module(config_path[len('python:'):])
-
- # file:full/path/for/config.py
- elif config_path.startswith('file:'):
- config_path = config_path[len('file:'):]
- module_name = '__mindinsightconfig__'
- config_module = types.ModuleType(module_name)
- machinery = import_module('importlib.machinery')
- loader = machinery.SourceFileLoader(module_name, config_path)
- loader.exec_module(config_module)
-
- if config_module is None:
- return
-
- for setting in dir(config_module):
- if setting.isupper() and setting in self._default_settings:
- setting_value = getattr(config_module, setting)
- setattr(self, setting, setting_value)
- self._explicit_settings.add(setting)
-
- def update_from_env(self):
- """Update settings from environment variables."""
- for key, value in os.environ.items():
- if not key.startswith(self._prefix):
- continue
-
- setting = key[len(self._prefix):]
- if setting not in self._default_settings:
- continue
-
- setting_value = getattr(self, setting)
- if isinstance(setting_value, bool):
- value = (value == 'True')
- elif isinstance(setting_value, (int, float)):
- value = type(setting_value)(value)
- elif isinstance(setting_value, (list, dict)):
- value = json.loads(value)
-
- setattr(self, setting, value)
- self._explicit_settings.add(setting)
-
- def config_workspace(self, workspace):
- """
- Config workspace value.
-
- Args:
- workspace (str): Path of workspace.
- """
- setattr(self, 'WORKSPACE', workspace)
- self._explicit_settings.add('WORKSPACE')
-
- def is_overridden(self, setting_name):
- """
- Check if specified setting is overridden.
-
- Args:
- setting_name (str): Setting name to be checked.
-
- Returns:
- bool, indicate whether given setting name is overridden.
- """
- return setting_name in self._explicit_settings
-
- def dump(self):
- """
- Dump settings data.
-
- Returns:
- dict, json formatted data of settings.
- """
- config = {}
- for setting in dir(self):
- if setting.isupper():
- config[setting] = getattr(self, setting)
-
- return config
-
-
- settings = Settings()
|