Remove usersettings.py again
it's approach is too unflexible for my taste, e.g. I want to be able to use config sections.
This commit is contained in:
parent
930f84906e
commit
da7a95d6ec
@ -1,32 +0,0 @@
|
||||
Copyright (c) 2013, Benjamin Burke (galvanist.com) All rights
|
||||
reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following
|
||||
disclaimer in the documentation and/or other materials provided
|
||||
with the distribution.
|
||||
|
||||
3. Neither the names "Benjamin Burke" nor "galvanist" nor the
|
||||
names of any contributors may be used to endorse or promote
|
||||
products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
@ -1,103 +0,0 @@
|
||||
#!/usr/bin/python
|
||||
"""
|
||||
Provide interface for persistent portable editable user settings
|
||||
"""
|
||||
import os
|
||||
import configparser
|
||||
import ast
|
||||
|
||||
import qutebrowser.utils.appdirs as appdirs
|
||||
|
||||
|
||||
class Settings(dict):
|
||||
""" Provide interface for portable persistent user editable settings """
|
||||
app_id = None
|
||||
settings_directory = None
|
||||
settings_file = None
|
||||
_settings_types = {}
|
||||
_settings_defaults = {}
|
||||
|
||||
def __init__(self, app_id):
|
||||
"""
|
||||
Create the settings object, using the specified app id (a reversed rfc
|
||||
1034 identifier, e.g. com.example.apps.thisapp
|
||||
"""
|
||||
self.app_id = app_id
|
||||
self.settings_directory = appdirs.user_data_dir(app_id,
|
||||
appauthor=app_id,
|
||||
roaming=True)
|
||||
self.settings_file = os.path.join(self.settings_directory,
|
||||
"settings.cfg")
|
||||
super(Settings, self).__init__()
|
||||
|
||||
def add_setting(self, setting_name, setting_type=str, default=None):
|
||||
""" Define a settings option (and default value) """
|
||||
self._settings_types[setting_name] = setting_type
|
||||
self._settings_defaults[setting_name] = default
|
||||
|
||||
def load_settings(self):
|
||||
""" Set default values and parse stored settings file """
|
||||
# Set the defaults
|
||||
for key, value in list(self._settings_defaults.items()):
|
||||
if key not in self._settings_types:
|
||||
self._settings_types[key] = str
|
||||
super(Settings, self).__setitem__(key, value)
|
||||
|
||||
# Load the stored values
|
||||
parser = configparser.RawConfigParser()
|
||||
try:
|
||||
with open(self.settings_file, 'r') as settings_fp:
|
||||
parser.readfp(settings_fp)
|
||||
for key, value in parser.items('settings'):
|
||||
if key not in self._settings_types:
|
||||
self._settings_types[key] = str
|
||||
adjusted_value = value
|
||||
# There are some special helper functions in ConfigParser
|
||||
# for ints, floats, and booleans.
|
||||
if issubclass(self._settings_types[key], bool):
|
||||
# This needs to appear before int
|
||||
adjusted_value = parser.getboolean('settings', key)
|
||||
elif issubclass(self._settings_types[key], int):
|
||||
adjusted_value = parser.getint('settings', key)
|
||||
elif issubclass(self._settings_types[key], float):
|
||||
adjusted_value = parser.getfloat('settings', key)
|
||||
elif issubclass(self._settings_types[key],
|
||||
(dict, list, set)):
|
||||
adjusted_value = self._settings_types[key](
|
||||
ast.literal_eval(value))
|
||||
else:
|
||||
adjusted_value = self._settings_types[key](value)
|
||||
super(Settings, self).__setitem__(key, adjusted_value)
|
||||
except IOError:
|
||||
# No config file exists, or it is invalid
|
||||
pass
|
||||
|
||||
def save_settings(self):
|
||||
""" Write the settings data to disk """
|
||||
if not os.path.exists(self.settings_directory):
|
||||
os.makedirs(self.settings_directory, 0o755)
|
||||
parser = configparser.RawConfigParser()
|
||||
parser.add_section('settings')
|
||||
for key, value in list(self.items()):
|
||||
parser.set('settings', key, value)
|
||||
with open(self.settings_file, 'wb') as settings_fp:
|
||||
parser.write(settings_fp)
|
||||
|
||||
def __getattr__(self, setting_name):
|
||||
""" Provide attribute-based access to stored config data """
|
||||
try:
|
||||
return super(Settings, self).__getitem__(setting_name)
|
||||
except KeyError:
|
||||
raise AttributeError
|
||||
|
||||
def __setattr__(self, setting_name, setting_value):
|
||||
""" Provide attribute-based access to stored config data """
|
||||
if setting_name in self._settings_defaults:
|
||||
# This value will go to the internal dict
|
||||
try:
|
||||
return super(Settings, self).__setitem__(setting_name,
|
||||
setting_value)
|
||||
except KeyError:
|
||||
raise AttributeError
|
||||
# This value will be an attribute of self
|
||||
return super(Settings, self).__setattr__(setting_name, setting_value)
|
Loading…
Reference in New Issue
Block a user