def load_config_file(cls, config_paths): """Load a yaml config file from path. Args: config_paths: List of paths to configuration.yaml files Returns: dict: Dict containing config fields """ config_path = "" for possible_path in config_paths: if not os.path.isfile(possible_path): _LOGGER.debug(_("Config file %s not found."), possible_path) else: config_path = possible_path break if not config_path: try: move_config_to_appdir(PRE_0_12_0_ROOT_PATH, DEFAULT_ROOT_PATH) except FileNotFoundError: _LOGGER.info( _("No configuration files found. " "Creating %s"), DEFAULT_CONFIG_PATH, ) config_path = cls.create_default_config(DEFAULT_CONFIG_PATH) env_var_pattern = re.compile(r"^\$([A-Z_]*)$") yaml.add_implicit_resolver("!envvar", env_var_pattern) def envvar_constructor(loader, node): """Yaml parser for env vars.""" value = loader.construct_scalar(node) [env_var] = env_var_pattern.match(value).groups() return os.environ[env_var] def include_constructor(loader, node): """Add a yaml file to be loaded inside another.""" main_yaml_path = os.path.split(stream.name)[0] included_yaml = os.path.join(main_yaml_path, loader.construct_scalar(node)) with open(included_yaml, "r") as included: return yaml.safe_load(included) yaml.add_constructor("!envvar", envvar_constructor) yaml.add_constructor("!include", include_constructor) try: with open(config_path, "r") as stream: _LOGGER.info(_("Loaded config from %s."), config_path) return yaml.load(stream, Loader=yaml.SafeLoader) except yaml.YAMLError as error: _LOGGER.critical(error) sys.exit(1) except FileNotFoundError as error: _LOGGER.critical(error) sys.exit(1)
def test_move_config(self): with mock.patch('os.mkdir') as mock_mkdir, \ mock.patch('os.path.isdir') as mock_isdir, \ mock.patch('os.remove') as mock_remove: mock_isdir.return_value = False move_config_to_appdir(os.path.abspath('tests/configs/'), tempfile.gettempdir()) self.assertTrue(mock_mkdir.called) self.assertLogs('_LOGGER', 'info') self.assertTrue(mock_remove.called)
def test_move_config(self): with mock.patch("os.mkdir") as mock_mkdir, mock.patch( "os.path.isdir") as mock_isdir, mock.patch( "os.remove") as mock_remove: mock_isdir.return_value = False move_config_to_appdir(os.path.abspath("tests/configs/"), tempfile.gettempdir()) self.assertTrue(mock_mkdir.called) self.assertLogs("_LOGGER", "info") self.assertTrue(mock_remove.called)
def test_move_config(self): with mock.patch('os.mkdir') as mock_mkdir, \ mock.patch('os.path.isdir') as mock_isdir, \ mock.patch('os.remove') as mock_remove: mock_isdir.return_value = False move_config_to_appdir( os.path.abspath('tests/configs/'), tempfile.gettempdir()) self.assertTrue(mock_mkdir.called) self.assertLogs('_LOGGER', 'info') self.assertTrue(mock_remove.called)
def load_config_file(cls, config_paths): """Load a yaml config file from path.""" config_path = "" for possible_path in config_paths: if not os.path.isfile(possible_path): _LOGGER.debug(_("Config file %s not found."), possible_path) else: config_path = possible_path break if not config_path: try: move_config_to_appdir(PRE_0_12_0_ROOT_PATH, DEFAULT_ROOT_PATH) except FileNotFoundError: _LOGGER.info(_("No configuration files found. " "Creating %s"), DEFAULT_CONFIG_PATH) config_path = cls.create_default_config(DEFAULT_CONFIG_PATH) env_var_pattern = re.compile(r'^\$([A-Z_]*)$') yaml.add_implicit_resolver("!envvar", env_var_pattern) def envvar_constructor(loader, node): """Yaml parser for env vars.""" value = loader.construct_scalar(node) [env_var] = env_var_pattern.match(value).groups() return os.environ[env_var] def include_constructor(loader, node): """Add a yaml file to be loaded inside another.""" main_yaml_path = os.path.split(stream.name)[0] included_yaml = os.path.join(main_yaml_path, loader.construct_scalar(node)) with open(included_yaml, 'r') as included: return yaml.safe_load(included) yaml.add_constructor('!envvar', envvar_constructor) yaml.add_constructor('!include', include_constructor) try: with open(config_path, 'r') as stream: _LOGGER.info(_("Loaded config from %s."), config_path) return yaml.load(stream, Loader=yaml.SafeLoader) except yaml.YAMLError as error: _LOGGER.critical(error) sys.exit(1) except FileNotFoundError as error: _LOGGER.critical(error) sys.exit(1)
def load_config_file(self, config_paths): """Load a yaml config file from path.""" config_path = "" for possible_path in config_paths: if not os.path.isfile(possible_path): _LOGGER.debug(_("Config file %s not found."), possible_path) else: config_path = possible_path break if not config_path: try: move_config_to_appdir(PRE_0_12_0_ROOT_PATH, DEFAULT_ROOT_PATH) except FileNotFoundError: _LOGGER.info(_("No configuration files found. " "Creating %s"), DEFAULT_CONFIG_PATH) config_path = self.create_default_config(DEFAULT_CONFIG_PATH) env_var_pattern = re.compile(r'^\$([A-Z_]*)$') yaml.add_implicit_resolver("!envvar", env_var_pattern) def envvar_constructor(loader, node): """Yaml parser for env vars.""" value = loader.construct_scalar(node) [env_var] = env_var_pattern.match(value).groups() return os.environ[env_var] def include_constructor(loader, node): """Add a yaml file to be loaded inside another.""" main_yaml_path = os.path.split(stream.name)[0] included_yaml = os.path.join(main_yaml_path, loader.construct_scalar(node)) with open(included_yaml, 'r') as included: return yaml.safe_load(included) yaml.add_constructor('!envvar', envvar_constructor) yaml.add_constructor('!include', include_constructor) try: with open(config_path, 'r') as stream: _LOGGER.info(_("Loaded config from %s."), config_path) return yaml.load(stream) except yaml.YAMLError as error: self.opsdroid.critical(error, 1) except FileNotFoundError as error: self.opsdroid.critical(str(error), 1)