From 0934e217f82f11873d12dd7b4d1a3e2c336682c7 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sat, 8 May 2010 15:08:48 -0400 Subject: [PATCH] - the SqlSoup constructor accepts a `base` argument which specifies the base class to use for mapped classes, the default being `object`. [ticket:1783] --- CHANGES | 7 ++++++- lib/sqlalchemy/ext/sqlsoup.py | 13 ++++++++----- test/ext/test_sqlsoup.py | 8 +++++++- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/CHANGES b/CHANGES index 9bd3095101..6d4a2c1d10 100644 --- a/CHANGES +++ b/CHANGES @@ -50,7 +50,12 @@ CHANGES - Added integer coercion to the "type_conv" attribute when passed via query string, so that it is properly interpreted by Kinterbasdb. [ticket:1779] - + +- sqlsoup + - the SqlSoup constructor accepts a `base` argument which specifies + the base class to use for mapped classes, the default being + `object`. [ticket:1783] + 0.6.0 ===== diff --git a/lib/sqlalchemy/ext/sqlsoup.py b/lib/sqlalchemy/ext/sqlsoup.py index 4d5f4b76f5..e54cde3ed3 100644 --- a/lib/sqlalchemy/ext/sqlsoup.py +++ b/lib/sqlalchemy/ext/sqlsoup.py @@ -395,7 +395,7 @@ def _selectable_name(selectable): x = x[1:] return x -def _class_for_table(session, engine, selectable, **mapper_kwargs): +def _class_for_table(session, engine, selectable, base_cls=object, **mapper_kwargs): selectable = expression._clause_element_as_expr(selectable) mapname = 'Mapped' + _selectable_name(selectable) # Py2K @@ -405,9 +405,9 @@ def _class_for_table(session, engine, selectable, **mapper_kwargs): # end Py2K if isinstance(selectable, Table): - klass = TableClassType(mapname, (object,), {}) + klass = TableClassType(mapname, (base_cls,), {}) else: - klass = SelectableClassType(mapname, (object,), {}) + klass = SelectableClassType(mapname, (base_cls,), {}) def _compare(self, o): L = list(self.__class__.c.keys()) @@ -451,14 +451,17 @@ def _class_for_table(session, engine, selectable, **mapper_kwargs): return klass class SqlSoup(object): - def __init__(self, engine_or_metadata, **kw): + def __init__(self, engine_or_metadata, base=object, **kw): """Initialize a new ``SqlSoup``. + `base` is the class that all created entity classes should subclass. + `args` may either be an ``SQLEngine`` or a set of arguments suitable for passing to ``create_engine``. """ self.session = kw.pop('session', Session) + self.base=base if isinstance(engine_or_metadata, MetaData): self._metadata = engine_or_metadata @@ -537,7 +540,7 @@ class SqlSoup(object): if not table.primary_key.columns: raise PKNotFoundError('table %r does not have a primary key defined [columns: %s]' % (attr, ','.join(table.c.keys()))) if table.columns: - t = _class_for_table(self.session, self.engine, table) + t = _class_for_table(self.session, self.engine, table, self.base) else: t = None self._cache[attr] = t diff --git a/test/ext/test_sqlsoup.py b/test/ext/test_sqlsoup.py index 86344eb7a6..9216af96f7 100644 --- a/test/ext/test_sqlsoup.py +++ b/test/ext/test_sqlsoup.py @@ -283,6 +283,12 @@ class SQLSoupTest(TestBase): db = sqlsoup.SqlSoup(engine) tablename = 'loans' eq_(db.entity(tablename), db.loans) + + def test_entity_with_different_base(self): + class subclass(object): + pass + db = sqlsoup.SqlSoup(engine, base=subclass) + assert issubclass(db.entity('loans'), subclass) def test_filter_by_order_by(self): db = sqlsoup.SqlSoup(engine) @@ -381,4 +387,4 @@ delete from loans; delete from books; delete from users; delete from nopk; -""".split(";") \ No newline at end of file +""".split(";") -- 2.47.2