diff options
Diffstat (limited to 'configshell/prefs.py')
| -rw-r--r-- | configshell/prefs.py | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/configshell/prefs.py b/configshell/prefs.py new file mode 100644 index 0000000..248cc1d --- /dev/null +++ b/configshell/prefs.py @@ -0,0 +1,149 @@ +''' +This file is part of ConfigShell. +Copyright (c) 2011-2013 by Datera, Inc + +Licensed under the Apache License, Version 2.0 (the "License"); you may +not use this file except in compliance with the License. You may obtain +a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +License for the specific language governing permissions and limitations +under the License. +''' + +import six + +class Prefs(object): + ''' + This is a preferences backend object used to: + - Hold the ConfigShell preferences + - Handle persistent storage and retrieval of these preferences + - Share the preferences between the ConfigShell and ConfigNode objects + + As it is inherently destined to be shared between objects, this is a Borg. + ''' + _prefs = {} + filename = None + autosave = False + __borg_state = {} + + def __init__(self, filename=None): + ''' + Instanciates the ConfigShell preferences object. + @param filename: File to store the preferencces to. + @type filename: str + ''' + self.__dict__ = self.__borg_state + if filename is not None: + self.filename = filename + + def __getitem__(self, key): + ''' + Proxies dict-like references to prefs. + One specific behavior, though, is that if the key does not exists, + we will return None instead of raising an exception. + @param key: The preferences dictionnary key to get. + @type key: any valid dict key + @return: The key value + @rtype: n/a + ''' + if key in self._prefs: + return self._prefs[key] + else: + return None + + def __setitem__(self, key, value): + ''' + Proxies dict-like references to prefs. + @param key: The preferences dictionnary key to set. + @type key: any valid dict key + ''' + self._prefs[key] = value + if self.autosave: + self.save() + + def __contains__(self, key): + ''' + Do the preferences contain key ? + @param key: The preferences dictionnary key to check. + @type key: any valid dict key + ''' + if key in self._prefs: + return True + else: + return False + + def __delitem__(self, key): + ''' + Deletes a preference key. + @param key: The preference to delete. + @type key: any valid dict key + ''' + del self._prefs[key] + if self.autosave: + self.save() + + def __iter__(self): + ''' + Generic iterator for the preferences. + ''' + return self._prefs.__iter__() + + # Public methods + + def keys(self): + ''' + @return: Returns the list of keys in preferences. + @rtype: list + ''' + return self._prefs.keys() + + def items(self): + ''' + @return: Returns the list of items in preferences. + @rtype: list of (key, value) tuples + ''' + return self._prefs.items() + + def iteritems(self): + ''' + @return: Iterates on the items in preferences. + @rtype: yields items that are (key, value) pairs + ''' + return six.iteritems(self._prefs) + + def save(self, filename=None): + ''' + Saves the preferences to disk. If filename is not specified, + use the default one if it is set, else do nothing. + @param filename: Optional alternate file to use. + @type filename: str + ''' + if filename is None: + filename = self.filename + + if filename is not None: + fsock = open(filename, 'wb') + try: + six.moves.cPickle.dump(self._prefs, fsock, 2) + finally: + fsock.close() + + def load(self, filename=None): + ''' + Loads the preferences from file. Use either the supplied filename, + or the default one if set. Else, do nothing. + ''' + if filename is None: + filename = self.filename + + if filename is not None: + fsock = open(filename, 'rb') + try: + self._prefs = six.moves.cPickle.load(fsock) + finally: + fsock.close() |
