iro/offer/provider.py
author Sandro Knauß <knauss@netzguerilla.net>
Thu, 23 Feb 2012 16:59:49 +0100
branchdevel
changeset 185 8ad6c097bc5b
parent 183 07ee5543751b
child 186 b381eaa774ab
permissions -rw-r--r--
config is now cleaned in tearDown

from functools import partial

from ..error import NoRoute, NoTyp, ValidateException, NoProvider, NeededOption
from ..config import Option

class Provider():
    def __init__(self, name, config, typs={}):
        self.name = name
        self.config = config
        self.typs=typs
        self.testmode = False
        
        self.options = {
                "typ":Option(vProvider, long="One available provider typ.", must=True)
                }

    def loadConfig(self):
        c=dict(self.config)
        for o in self.options:
            try:
                value = self.options[o].validate(c[o],o)
                setattr(self, o, value)
            except (KeyError):
                if self.options[o].must:
                    raise NeededOption(self.name, o) 
                elif self.options[o].default is not None:
                    setattr(self,o,self.options[o].default)

        for (n, v) in self.config:
            if n == "typ":
                self.typ = v

    def send(self, typ, route, recipient, message):
        pass

    def getSendFunc(self, typ, route):
        try:
            if route not in self.typs[typ]:
                raise NoRoute(route)
        except KeyError:
            raise NoTyp(route)
        return partial(self.send, typ, route)

def getProvider(name, typ, config):
    try:
        return providers[typ](name,config)
    except KeyError:
        raise NoProvider(typ)

def vProvider(typ, field):
    if typ not in providers.keys():
        raise ValidateException()
    return typ

providers={}