From: Mike Bayer Date: Wed, 31 Dec 2008 05:28:53 +0000 (+0000) Subject: yes ive been watching the IRC channel. restored setup_instance() to ClassManager... X-Git-Tag: rel_0_5_0~48 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7391c7bd4d1d5260d3f4143d7226ec9190dc997b;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git yes ive been watching the IRC channel. restored setup_instance() to ClassManager and added coverage for mapper's usage of it. --- diff --git a/lib/sqlalchemy/orm/attributes.py b/lib/sqlalchemy/orm/attributes.py index f113a4eb95..df607adf87 100644 --- a/lib/sqlalchemy/orm/attributes.py +++ b/lib/sqlalchemy/orm/attributes.py @@ -1246,6 +1246,9 @@ class ClassManager(dict): setattr(instance, self.STATE_ATTR, state or self.instance_state_factory(instance, self)) return instance + def setup_instance(self, instance, state=None): + setattr(instance, self.STATE_ATTR, state or self.instance_state_factory(instance, self)) + def _new_state_if_none(self, instance): """Install a default InstanceState if none is present. @@ -1333,7 +1336,7 @@ class _ClassInstrumentationAdapter(ClassManager): def new_instance(self, state=None): instance = self.class_.__new__(self.class_) - self._setup_instance(instance, state) + self.setup_instance(instance, state) return instance def _new_state_if_none(self, instance): @@ -1344,9 +1347,9 @@ class _ClassInstrumentationAdapter(ClassManager): if self.has_state(instance): return False else: - return self._setup_instance(instance) + return self.setup_instance(instance) - def _setup_instance(self, instance, state=None): + def setup_instance(self, instance, state=None): self._adapted.initialize_instance_dict(self.class_, instance) if state is None: diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py index c3ff4e47c2..0dc3465327 100644 --- a/lib/sqlalchemy/orm/mapper.py +++ b/lib/sqlalchemy/orm/mapper.py @@ -1616,7 +1616,6 @@ class Mapper(object): if instance is EXT_CONTINUE: instance = self.class_manager.new_instance() else: - # TODO: don't think theres coverage here manager = attributes.manager_of_class(instance.__class__) # TODO: if manager is None, raise a friendly error about # returning instances of unmapped types diff --git a/test/orm/mapper.py b/test/orm/mapper.py index 35d6272699..4e8412bd93 100644 --- a/test/orm/mapper.py +++ b/test/orm/mapper.py @@ -2101,7 +2101,22 @@ class MapperExtensionTest(_fixtures.FixtureTest): 'create_instance', 'populate_instance', 'reconstruct_instance', 'append_result', 'before_update', 'after_update', 'before_delete', 'after_delete']) - + + @testing.resolve_artifact_names + def test_create_instance(self): + class CreateUserExt(sa.orm.MapperExtension): + def create_instance(self, mapper, selectcontext, row, class_): + return User.__new__(User) + + mapper(User, users, extension=CreateUserExt()) + sess = create_session() + u1 = User() + u1.name = 'ed' + sess.add(u1) + sess.flush() + sess.clear() + assert sess.query(User).first() + class RequirementsTest(_base.MappedTest): """Tests the contract for user classes."""