from sqlplain.dispatcher import generic_on, TagType from nose.tools import assert_raises driver = TagType() driver.register('psycopg2') driver.register('sqlite3') class Row(object): pass @generic_on('driver', 'row') def convert(driver, row): raise NotImplementedError @convert.when_type(driver.psycopg2, Row) def convert_psycopg2_Row(driver, row): print 'psycopg2' @convert.when_type(driver.sqlite3, Row) def convert_sqlite3_Row(driver, row): print 'sqlite3' def test(): convert(driver.psycopg2.instance, Row()) convert(driver.sqlite3.instance, Row()) assert_raises(NotImplementedError, convert,
import os import uuid import tempfile from sqlplain.dispatcher import generic_on, TagType class Driver(object): @property def module(self): return __import__(self.tag) driver = TagType(Driver) sqlite3 = driver.register('sqlite3').instance psycopg2 = driver.register('psycopg2').instance mysqldb = driver.register('MySQLdb').instance mock = driver.register('mock').instance #################### multidispatch functions ###################### # works for psycopg2 (and for pymssql, except the autocommit syntax) @generic_on("uridict['driver']") def driverconnect(uridict, autocommit, extras): "Return a low-level connection by using directly the driver" extras.update(uridict) for param in ('host', 'port', 'user', 'password'): if not extras[param]: del extras[param] driver = __import__(extras['name']) del extras['name'] del extras['driver']