diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2011-09-10 16:54:23 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2011-09-10 16:54:23 -0400 |
commit | bb62d80217e584acf3f899804bb66b19f71205e2 (patch) | |
tree | 72fb88a12bcf660be5408f5acd64518eb3381dbf /test/ext/test_declarative.py | |
parent | e61a4438493c812990382ec5f1fc46016b319a4c (diff) | |
download | sqlalchemy-bb62d80217e584acf3f899804bb66b19f71205e2.tar.gz |
- New event hook, MapperEvents.after_configured().
Called after a configure() step has completed and
mappers were in fact affected. Theoretically this
event is called once per application, unless new mappings
are constructed after existing ones have been used
already.
- New declarative features:
- __declare_last__() method, establishes an event
listener for the class method that will be called
when mappers are completed with the final "configure"
step.
- __abstract__ flag. The class will not be mapped
at all when this flag is present on the class.
- New helper classes ConcreteBase, AbstractConcreteBase.
Allow concrete mappings using declarative which automatically
set up the "polymorphic_union" when the "configure"
mapper step is invoked.
- The mapper itself has semi-private methods that allow
the "with_polymorphic" selectable to be assigned
to the mapper after it has already been configured.
[ticket:2239]
Diffstat (limited to 'test/ext/test_declarative.py')
-rw-r--r-- | test/ext/test_declarative.py | 116 |
1 files changed, 82 insertions, 34 deletions
diff --git a/test/ext/test_declarative.py b/test/ext/test_declarative.py index 22733223d..e338ef039 100644 --- a/test/ext/test_declarative.py +++ b/test/ext/test_declarative.py @@ -14,7 +14,7 @@ from sqlalchemy.orm import relationship, create_session, class_mapper, \ Session from test.lib.testing import eq_ from sqlalchemy.util import classproperty -from sqlalchemy.ext.declarative import declared_attr +from sqlalchemy.ext.declarative import declared_attr, AbstractConcreteBase, ConcreteBase from test.lib import fixtures class DeclarativeTestBase(fixtures.TestBase, testing.AssertsExecutionResults): @@ -2014,7 +2014,30 @@ class DeclarativeInheritanceTest(DeclarativeTestBase): assert A.__mapper__.inherits is a_1.__mapper__ - def test_concrete(self): +from test.orm.test_events import _RemoveListeners +class ConcreteInhTest(_RemoveListeners, DeclarativeTestBase): + def _roundtrip(self, Employee, Manager, Engineer, polymorphic=True): + Base.metadata.create_all() + sess = create_session() + e1 = Engineer(name='dilbert', primary_language='java') + e2 = Engineer(name='wally', primary_language='c++') + m1 = Manager(name='dogbert', golf_swing='fore!') + e3 = Engineer(name='vlad', primary_language='cobol') + sess.add_all([e1, e2, m1, e3]) + sess.flush() + sess.expunge_all() + if polymorphic: + eq_(sess.query(Employee).order_by(Employee.name).all(), + [Engineer(name='dilbert'), Manager(name='dogbert'), + Engineer(name='vlad'), Engineer(name='wally')]) + else: + eq_(sess.query(Engineer).order_by(Engineer.name).all(), + [Engineer(name='dilbert'), Engineer(name='vlad'), + Engineer(name='wally')]) + eq_(sess.query(Manager).all(), [Manager(name='dogbert')]) + + + def test_explicit(self): engineers = Table('engineers', Base.metadata, Column('id', Integer, primary_key=True, test_needs_autoincrement=True), Column('name' @@ -2027,47 +2050,35 @@ class DeclarativeInheritanceTest(DeclarativeTestBase): punion = polymorphic_union({'engineer': engineers, 'manager' : managers}, 'type', 'punion') - class Person(Base, fixtures.ComparableEntity): + class Employee(Base, fixtures.ComparableEntity): __table__ = punion __mapper_args__ = {'polymorphic_on': punion.c.type} - class Engineer(Person): + class Engineer(Employee): __table__ = engineers __mapper_args__ = {'polymorphic_identity': 'engineer', 'concrete': True} - class Manager(Person): + class Manager(Employee): __table__ = managers __mapper_args__ = {'polymorphic_identity': 'manager', 'concrete': True} - - Base.metadata.create_all() - sess = create_session() - e1 = Engineer(name='dilbert', primary_language='java') - e2 = Engineer(name='wally', primary_language='c++') - m1 = Manager(name='dogbert', golf_swing='fore!') - e3 = Engineer(name='vlad', primary_language='cobol') - sess.add_all([e1, e2, m1, e3]) - sess.flush() - sess.expunge_all() - eq_(sess.query(Person).order_by(Person.name).all(), - [Engineer(name='dilbert'), Manager(name='dogbert'), - Engineer(name='vlad'), Engineer(name='wally')]) + self._roundtrip(Employee, Manager, Engineer) def test_concrete_inline_non_polymorphic(self): """test the example from the declarative docs.""" - class Person(Base, fixtures.ComparableEntity): + class Employee(Base, fixtures.ComparableEntity): __tablename__ = 'people' id = Column(Integer, primary_key=True, test_needs_autoincrement=True) name = Column(String(50)) - class Engineer(Person): + class Engineer(Employee): __tablename__ = 'engineers' __mapper_args__ = {'concrete': True} @@ -2076,7 +2087,7 @@ class DeclarativeInheritanceTest(DeclarativeTestBase): primary_language = Column(String(50)) name = Column(String(50)) - class Manager(Person): + class Manager(Employee): __tablename__ = 'manager' __mapper_args__ = {'concrete': True} @@ -2084,20 +2095,57 @@ class DeclarativeInheritanceTest(DeclarativeTestBase): test_needs_autoincrement=True) golf_swing = Column(String(50)) name = Column(String(50)) + self._roundtrip(Employee, Manager, Engineer, polymorphic=False) + + def test_abstract_concrete_extension(self): + class Employee(AbstractConcreteBase, Base, fixtures.ComparableEntity): + pass + + class Manager(Employee): + __tablename__ = 'manager' + employee_id = Column(Integer, primary_key=True) + name = Column(String(50)) + golf_swing = Column(String(40)) + __mapper_args__ = { + 'polymorphic_identity':'manager', + 'concrete':True} + + class Engineer(Employee): + __tablename__ = 'engineer' + employee_id = Column(Integer, primary_key=True) + name = Column(String(50)) + primary_language = Column(String(40)) + __mapper_args__ = {'polymorphic_identity':'engineer', + 'concrete':True} + + self._roundtrip(Employee, Manager, Engineer) + + def test_concrete_extension(self): + class Employee(ConcreteBase, Base, fixtures.ComparableEntity): + __tablename__ = 'employee' + employee_id = Column(Integer, primary_key=True) + name = Column(String(50)) + __mapper_args__ = { + 'polymorphic_identity':'employee', + 'concrete':True} + class Manager(Employee): + __tablename__ = 'manager' + employee_id = Column(Integer, primary_key=True) + name = Column(String(50)) + golf_swing = Column(String(40)) + __mapper_args__ = { + 'polymorphic_identity':'manager', + 'concrete':True} + + class Engineer(Employee): + __tablename__ = 'engineer' + employee_id = Column(Integer, primary_key=True) + name = Column(String(50)) + primary_language = Column(String(40)) + __mapper_args__ = {'polymorphic_identity':'engineer', + 'concrete':True} + self._roundtrip(Employee, Manager, Engineer) - Base.metadata.create_all() - sess = create_session() - e1 = Engineer(name='dilbert', primary_language='java') - e2 = Engineer(name='wally', primary_language='c++') - m1 = Manager(name='dogbert', golf_swing='fore!') - e3 = Engineer(name='vlad', primary_language='cobol') - sess.add_all([e1, e2, m1, e3]) - sess.flush() - sess.expunge_all() - eq_(sess.query(Engineer).order_by(Engineer.name).all(), - [Engineer(name='dilbert'), Engineer(name='vlad'), - Engineer(name='wally')]) - eq_(sess.query(Manager).all(), [Manager(name='dogbert')]) def _produce_test(inline, stringbased): |