コード例 #1
0
ファイル: setting.py プロジェクト: aweal/Translate
class SettingManager:
    def __init__(self):
        self.lgr = logging.getLogger('setting')
        self.trans = TranslateIt('')
        self.__ROOT_CFG_PATH = os.path.expanduser("~")
        self.__CONFIG_NAME = ".trans"
        self.__config = _DEFAULT_CONFIG

        self.check_path()

        if self.loadConfig():
            if self.keyIsValid(self.yandex_api_key):
                self.status_key = True
            else:
                self.status_key = False

    def check_path(self):
        if not os.path.exists(self.__ROOT_CFG_PATH):
            raise OSError(2, 'No such file or directory')
        if not os.path.isdir(self.__ROOT_CFG_PATH):
            raise Exception('Invalid config path')

        if not os.access(self.__ROOT_CFG_PATH, os.W_OK):
            raise Exception('Access wrote in path fail')

        if not os.path.exists(self.config_name):
            self.lgr.warning('No config file try create: ')
            self.saveConfig()
            # raise Exception('No config file!')
        return True

    @property
    def config_name(self):
        return self.__ROOT_CFG_PATH + '/' + self.__CONFIG_NAME

    @config_name.setter
    # @debug
    def config_name(self, new_name):
        """
        ONLY FOR DEBUG!
        :param new_name: string  $HOME full path cfg is($HOME + /.trans)
        :return:
        """
        # set invalid name!
        self.__ROOT_CFG_PATH = new_name

    def get_cfg_value(self, key):
        if key not in self.config:
            self.lgr.error("No key '%s' in config... ", key)
            # warning!
            return None
        else:
            return self.config[key]

    def set_cfg_value(self, key, val):
        if val is None:
            self.lgr.error("Skip null value for key %s", key)
            return False

        if key not in self.config:
            if key in _DEFAULT_CONFIG:
                self.lgr.debug('CFG without key %s - add new', key)
                self.config[key] = val
                return True
            else:
                self.lgr.error('Key %s invalid for $VERSION: %s', key, _VERSION)
                return False
        else:
            self.config[key] = val
            return True

    @property
    def config(self):
        """
        setup cfg from config file
        :return: dict{} example see _DEFAULT_CONFIG
        """
        if self.__config is None:
            self.lgr.error("config is None... halt?...")
        return self.__config

    @config.setter
    def config(self, cfg):
        if cfg is not None:
            self.__config = cfg

    @property
    def window_size(self):
        """
        Setup main wnd size width and height
            :return: wingeometry.Size()
        """
        return Size(self.get_cfg_value('WIDTH'), self.get_cfg_value('HEIGHT'))

    @window_size.setter
    def window_size(self, _size):
        if not type(_size) is Size:
            self.lgr.debug("The Size param required  '%s' received ", type(_size))
            raise ValueError()

        if not self.set_cfg_value('WIDTH', _size.WIDTH):
            self.lgr.warning("Fail save width window...")

        if not self.set_cfg_value('HEIGHT', _size.HEIGHT):
            self.lgr.warning("Fail save HEIGHT window...")

    @property
    def window_position(self):
        """
        Setup Position Main window (TOP / LEFT)
            :return: wingeometry.Pos()
        """
        return Pos(self.get_cfg_value('POS_TOP'), self.get_cfg_value('POS_LEFT'))

    @window_position.setter
    def window_position(self, new_pos):
        if not self.set_cfg_value('POS_TOP', new_pos.TOP):
            self.lgr.warning("Failed save '%d' top position window ", new_pos.TOP)

        if not self.set_cfg_value('POS_LEFT', new_pos.LEFT):
            self.lgr.warning("Failed save '%d' top position window ", new_pos.LEFT)

    @property
    def switch(self):
        """
        Store status switch in setting
            :return: Boolean True / False
        """
        switch = self.get_cfg_value('SWITCH')

        if switch is not None:
            type_val = type(switch)
            if type_val is bool:
                return self.get_cfg_value('SWITCH')
            else:
                self.lgr.error('Wrong type of switch `%s`, Boolean required!', type_val)
        else:
            self.lgr.error('Switch not determined in the configuration file')
        # by default
        return False

    @switch.setter
    def switch(self, state=0):
        self.set_cfg_value('SWITCH', state)

    @property
    def single_mode(self):
        """
        store View All / Single
            :return: Boolean True / False
        """
        show_all = self.get_cfg_value('SHOW_ALL')
        if show_all is not None:
            if type(show_all) is bool:
                return show_all
            else:
                self.lgr.debug('wrong cfg value, use default')

        return False

    @single_mode.setter
    def single_mode(self, state):
        self.set_cfg_value('SHOW_ALL', state)

    @property
    def yandex_api_key(self):
        """
        Store yandex Key need for translation
            :return: string
        """
        return self.get_cfg_value('API_KEY')

    @yandex_api_key.setter
    def yandex_api_key(self, __key):
        if not self.keyIsValid(__key):
            raise ValueError('Invalid key API')
        else:
            self.set_cfg_value('API_KEY', __key)
        self.saveConfig()

    def keyIsValid(self, __key):
        return self.trans.valid_key(__key)

    def loadConfig(self):
        self.lgr.debug('load from %s', self.config_name)
        config_name = self.config_name

        try:
            if not os.path.exists(config_name):
                self.lgr.debug('File "%s" doesnt exist...', config_name)
                return False

            with open(config_name, 'r') as f:
                config = json.load(f)
        except Exception as err:
            self.lgr.exception('Failed load "%s" cfg: %s',
                               config_name, err)
            return False

        if config is not None:
            self.config = config
        else:
            self.lgr.error('Error load setting!')
        return True

    def saveConfig(self):
        self.lgr.debug('Save config %s', self.config_name)

        try:
            with open(self.config_name, 'w') as f:
                status = json.dump(self.config, f)
        except Exception as err:
            self.lgr.exception('Failed save "%s": %s ',
                               self.config_name, err)
            return False

        return True