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)
Exemple #2
0
    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)
Exemple #3
0
    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)
Exemple #4
0
    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)
Exemple #5
0
    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)
Exemple #6
0
    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)