
import re

class sortdict(dict):
    '''a very simple append-only sorted dictionary'''
    def __init__(self):
        self._list = []
    def __setitem__(self, key, val):
        if key in self:
            self._list.remove(key)
        self._list.append(key)
        dict.__setitem__(self, key, val)
    def items(self):
        return [(k,self[k]) for k in self._list]

class config:
    def __init__(self):
        self._data = {True:{}, False:{}}
    def _get(self, section, item, default, trusted):
        return self._data[trusted].get(section, {}).get(item, (default, ""))
    def get(self, section, item, default=None, trusted=True):
        return self._get(section, item, default, trusted)[0]
    def source(self, section, item, trusted=True):
        return self._get(section, item, trusted)[1]
    def sections(self, trusted=True):
        return self._data[trusted].keys()
    def items(self, section, trusted=True):
        for k,v in self._data[trusted].get(section, {}).items():
            yield k,v[0]
    def add(self, section, item, value, trusted=True, source=""):
        if trusted:
            if section not in self._data[True]:
                self._data[True][section] = sortdict()
            self._data[True][section][item] = (value, source)
        if section not in self._data[False]:
            self._data[False][section] = sortdict()
        self._data[False][section][item] = (value, source)
    def read(self, path, trusted):
        sectionre = re.compile(r'\[([^\[]+)\]')
        itemre = re.compile(r'([^=\s]+)\s*=\s*(.*)')
        contre = re.compile(r'\s*(.*)')
        section = ""
        item = None
        line = 0
        for l in file(path):
            line += 1
            if cont:
                m = contre.match(l)
                if m:
                    self.add(section, item, m.group(1), trusted,
                             "%s:%d" % (path, line))
                    continue
                item = None
            if not l or l[0:1] in ";#":
                continue
            m = sectionre.match(l)
            if m:
                section = m.group(1)
                continue
            m = itemre.match(l)
            if m:
                item = m.group(1)
                self.add(section, item, m.group(2), trusted,
                         "%s:%d" % (path, line))
                continue
