import logging
import os
import re
from configparser import ConfigParser
from pathlib import Path
[docs]class ConfigHandler:
    """
        :Description:
            Base class for handling *.ini configs.
        :param config_file_name: Name of config file.
        :type config_file_name: str, optional
        :raises ValueError:
            -- Config file name does not end with '.ini'.\n
            -- Config file name contains disallowed symbols.\n
        :raises FileNotFoundError:
            Config file with given name does not exist.
    """
    def __init__(self, config_file_name):
        # Check config file name
        self.check_config_file(config_file_name)
        self.config_file_name = config_file_name
        self.config = ConfigParser()
        self.setup_config()
[docs]    def setup_config(self):
        """
            :Description:
                Load config and save number of config sections.
        """
        path = Path(__file__).parent.absolute()
        self.file_path = str(path) + "/" + self.config_file_name
        self.config.read(self.file_path)
        self.number_of_data_configs = len(self.config.sections()) 
[docs]    def save_config(self):
        """
            :Description:
                Save updated config.
        """
        with open(self.file_path, "w") as configfile:
            self.config.write(configfile) 
[docs]    @staticmethod
    def check_config_file(config_file_name):
        """
            :Description:
                Check if config file exists and name ends with '.ini' and contains only allowed symbols A-Z, a-z ,0-9.
            :param config_file_name: Name of config file.
            :type config_file_name: str
            :raises ValueError:
                -- Config file name does not end with '.ini'.\n
                -- Config file name contains disallowed symbols.
            :raises FileNotFoundError:
                Config file with given name does not exist.
        """
        try:
            if not config_file_name.endswith(".ini"):
                raise ValueError
            if len(re.findall(r'[^A-Za-z0-9_\-\\]', config_file_name)) > 1:
                raise ValueError
            if not os.path.isfile(str(Path(__file__).parent.absolute()) + "/" + config_file_name):
                raise FileNotFoundError
        except ValueError:
            error_msg = "Config file can contain only A-Z, a-z , 0-9, _ and must ends with '.ini'"
            logging.exception(error_msg)
            raise ValueError(error_msg)
        except FileNotFoundError:
            error_msg = config_file_name + " does not exist"
            logging.exception(error_msg)
            raise FileNotFoundError(error_msg)