diff options
Diffstat (limited to 'portato/session.py')
-rw-r--r-- | portato/session.py | 134 |
1 files changed, 61 insertions, 73 deletions
diff --git a/portato/session.py b/portato/session.py index 2017544..aadf6c4 100644 --- a/portato/session.py +++ b/portato/session.py @@ -3,7 +3,7 @@ # File: portato/session.py # This file is part of the Portato-Project, a graphical portage-frontend. # -# Copyright (C) 2006-2009 René 'Necoro' Neumann +# Copyright (C) 2006-2010 René 'Necoro' Neumann # This is free software. You may redistribute copies of it under the terms of # the GNU General Public License version 2. # There is NO WARRANTY, to the extent permitted by law. @@ -15,10 +15,12 @@ from __future__ import absolute_import, with_statement import os from UserDict import DictMixin -from .config_parser import ConfigParser, SectionNotFoundException +from ConfigParser import SafeConfigParser, NoSectionError, NoOptionError from .constants import SESSION_DIR from .helper import debug, info +from .odict import OrderedDict +NoSuchThing = (NoSectionError, NoOptionError) sessionlist = [] class Session (object): @@ -26,9 +28,6 @@ class Session (object): A small class allowing to save certain states of a program. This class works in a quite abstract manner, as it works with handlers, which define what options to use out of the config file and how to apply them to the program. - - Note: This class currently does not work with boolean config options. If you - want to define boolean values, use 0 and 1. This is future proof. """ # the current session format version @@ -44,38 +43,32 @@ class Session (object): @param register: register in the global sessionlist, which is closed at the end """ - self._cfg = None + self._cfg = SafeConfigParser({}, OrderedDict) self._handlers = [] self._name = name if name else "MAIN" + self._file = os.path.join(SESSION_DIR, file) if not (os.path.exists(SESSION_DIR) and os.path.isdir(SESSION_DIR)): os.mkdir(SESSION_DIR) - file = os.path.join(SESSION_DIR, file) oldfiles = [os.path.join(SESSION_DIR, x) for x in oldfiles] - if not os.path.exists(file): + if not os.path.exists(self._file): for o in oldfiles: if os.path.exists(o): debug("Moving old session file '%s' to '%s'." % (o, file)) - os.rename(o,file) + os.rename(o,self._file) break - self._cfg = ConfigParser(file) + self._cfg.read([self._file]) if name: - i = _("Loading '%s' session from %s.") % (name, self._cfg.file) + i = _("Loading '%s' session from %s.") % (name, self._file) else: - i = _("Loading session from %s.") % self._cfg.file + i = _("Loading session from %s.") % self._file info(i) - try: - self._cfg.parse() - except IOError, e: - if e.errno == 2: pass - else: raise - # register if register: sessionlist.append(self) @@ -90,7 +83,8 @@ class Session (object): - a function returning the number of option return values - getting them out of the program """ - options = map(lambda x: (x, self._name) if not hasattr(x, "__iter__") else x, options) + convert = lambda (x,y): (unicode(y).upper(), unicode(x).lower()) + options = map(lambda x: (self._name, unicode(x).lower()) if not hasattr(x, "__iter__") else convert(x), options) self._handlers.append((options, load_fn, save_fn, default)) def load (self, defaults_only = False): @@ -109,7 +103,7 @@ class Session (object): else: try: loaded = [self._cfg.get(*x) for x in options] - except KeyError: # does not exist -> ignore + except NoSuchThing: # does not exist -> ignore debug("No values for %s.", options) ldefault(options, lfn, default) else: @@ -124,97 +118,91 @@ class Session (object): for options, lfn, sfn, default in self._handlers: vals = sfn() - # map into list if necessairy + # map into list if necessary if not hasattr(vals, "__iter__"): vals = [vals] debug("Saving %s with values %s", options, vals) - for value, (option, section) in zip(vals, options): + for value, (section, option) in zip(vals, options): self.set(option, str(value), section) - self._cfg.write() + with open(self._file, "w") as f: + self._cfg.write(f) @classmethod def close (cls): for s in sessionlist: if s._name != "MAIN": - info(_("Saving '%s' session to %s.") % (s._name, s._cfg.file)) + info(_("Saving '%s' session to %s.") % (s._name, s._file)) else: - info(_("Saving session to %s.") % s._cfg.file) + info(_("Saving session to %s.") % s._file) s.save() - def set (self, key, value, section = ""): - if not section: section = self._name + def set (self, key, value, section = None): + if section is None: section = self._name + section = unicode(section).upper() try: - self._cfg.add(key, value, section, with_blankline = False) - except SectionNotFoundException: + self._cfg.set(section, key, value) + except NoSectionError: self._cfg.add_section(section) - self._cfg.add(key, value, section, with_blankline = False) + self._cfg.set(section, key, value) - def get (self, key, section = ""): - if not section: section = self._name + def get (self, key, section = None): + if section is None: section = self._name + section = unicode(section).upper() try: - return self._cfg.get(key, section) - except KeyError: + return self._cfg.get(section, key) + except NoSuchThing: return None - - def get_boolean (self, key, section = ""): - if not section: section = self._name + + def get_bool (self, key, section = None): + if section is None: section = self._name + section = unicode(section).upper() try: - return self._cfg.get_boolean(key, section) - except KeyError: + return self._cfg.getboolean(section, key) + except NoSuchThing, ValueError: return None + + def remove (self, key, section = None): + if section is None: section = self._name + section = unicode(section).upper() - def remove (self, key, section = ""): - if not section: section = self._name - - section = section.upper() - key = key.lower() - - val = self._cfg._access(key, section) - del self._cfg.cache[val.line] - - self._cfg.write() + self._cfg.remove_option(section, key) def remove_section (self, section): - section = section.upper() + section = unicode(section).upper() + self._cfg.remove_section(section) - sline = self._cfg.sections[section] + def rename (self, old, new, section = None): + if section is None: section = self._name + section = unicode(section).upper() - try: - mline = max(v.line for v in self._cfg.vars[section].itervalues()) - except ValueError: # nothing in the section - mline = sline - - sline = max(sline - 1, 0) # remove blank line too - but only if there is one ;) - - del self._cfg.cache[sline:mline+1] - self._cfg.write() - - def rename (self, old, new, section = ""): - if not section: section = self._name - val = self.get(old, section) - self.remove(old, section) - self._cfg.add(new, val, section, with_blankline = False) + + if val is not None: + self.remove(old, section) + self.set(new, val, section) def rename_section (self, old, new): - old = old.upper() - line = self._cfg.sections[old] - self._cfg.cache[line] = "[%s]\n" % new.upper() - self._cfg.write() + new = unicode(new).upper() + + values = self._cfg.items(old) + self.remove_section(old) + for k,v in values: + self.set(k,v,new) def check_version (self, vers): pass # do nothing atm + class SectionDict (DictMixin): """A class, which maps a specific section of a session to a dictionary.""" def __init__ (self, session, section): - self._section = section.upper() + self._section = unicode(section).upper() self._session = session def __getitem__ (self, name): @@ -231,7 +219,7 @@ class SectionDict (DictMixin): self._session.remove(name, self._section) def keys (self): - return self._session._cfg.vars[self._section].keys() + return self._session._cfg.options(self._section) def __contains__ (self, name): - return self._session.get(name, self._section) is not None + return self._session._cfg.has_option(self._section, name) |