Changeset 480

Show
Ignore:
Timestamp:
09/30/09 14:58:16 (5 years ago)
Author:
ged
Message:

- Provide our own Session.mapper equivalent to avoid SQLAlchemy 0.5.5+

deprecation warning. This mapper autosave object instances on init unless
save_on_init=False is passed as a mapper argument (closes #92).

- simplified a few tests in test_options.py

Location:
elixir/trunk
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • elixir/trunk/CHANGES

    r479 r480  
    5757- Default table_options (defined in options_defaults['table_options']) are now 
    5858  also used for ManyToMany tables (closes #94). 
     59- Provide our own Session.mapper equivalent to avoid SQLAlchemy 0.5.5+ 
     60  deprecation warning. This mapper autosave object instances on __init__ unless 
     61  save_on_init=False is passed as a mapper argument (closes #92). 
    5962 
    6063Bug fixes: 
  • elixir/trunk/elixir/entity.py

    r466 r480  
    3434 
    3535__doc_all__ = ['Entity', 'EntityMeta'] 
     36 
     37 
     38def session_mapper_factory(scoped_session): 
     39    def session_mapper(cls, *args, **kwargs): 
     40        if kwargs.pop('save_on_init', True): 
     41            old_init = cls.__init__ 
     42            def __init__(self, *args, **kwargs): 
     43                old_init(self, *args, **kwargs) 
     44                scoped_session.add(self) 
     45            cls.__init__ = __init__ 
     46        cls.query = scoped_session.query_property() 
     47        return mapper(cls, *args, **kwargs) 
     48    return session_mapper 
    3649 
    3750 
     
    441454            self.entity.mapper = mapper(self.entity, *args, **kwargs) 
    442455        elif isinstance(self.session, ScopedSession): 
    443             self.entity.mapper = self.session.mapper(self.entity, 
    444                                                     *args, **kwargs) 
     456            session_mapper = session_mapper_factory(self.session) 
     457            self.entity.mapper = session_mapper(self.entity, *args, **kwargs) 
    445458        else: 
    446459            raise Exception("Failed to map entity '%s' with its table or " 
  • elixir/trunk/tests/test_options.py

    r467 r480  
    117117        class Person(Entity): 
    118118            using_options(session=None) 
    119             firstname = Field(String(30)) 
    120             surname = Field(String(30)) 
     119            name = Field(String(30)) 
    121120 
    122121        setup_all() 
     
    126125        session = Session() 
    127126 
    128         homer = Person(firstname="Homer", surname='Simpson') 
    129         bart = Person(firstname="Bart", surname='Simpson') 
     127        homer = Person(name="Homer") 
     128        bart = Person(name="Bart") 
    130129 
    131130        session.add(homer) 
     
    136135        session.commit() 
    137136 
    138         assert session.query(Person).filter_by(firstname='Homer').one() is \ 
     137        assert session.query(Person).filter_by(name='Homer').one() is \ 
    139138               homer 
    140139        assert session.query(Person).count() == 1 
     
    146145        class Person(Entity): 
    147146            using_options(session=Session) 
    148             firstname = Field(String(30)) 
    149             surname = Field(String(30)) 
     147            name = Field(String(30)) 
    150148 
    151149        setup_all() 
    152150        create_all(engine) 
    153151 
    154         homer = Person(firstname="Homer", surname='Simpson') 
    155         bart = Person(firstname="Bart", surname='Simpson') 
     152        homer = Person(name="Homer") 
     153        bart = Person(name="Bart") 
    156154        Session.commit() 
    157155 
    158156        assert Person.query.session is Session() 
    159         assert Person.query.filter_by(firstname='Homer').one() is homer 
     157        assert Person.query.filter_by(name='Homer').one() is homer 
     158 
     159    def test_scoped_session_no_save_on_init(self): 
     160        metadata.bind = 'sqlite://' 
     161 
     162        class Person(Entity): 
     163            using_mapper_options(save_on_init=False) 
     164            name = Field(String(30)) 
     165 
     166        setup_all(True) 
     167 
     168        homer = Person(name="Homer") 
     169        bart = Person(name="Bart") 
     170        assert homer not in session 
     171        assert bart not in session 
     172        session.add(homer) 
     173        session.add(bart) 
     174        session.commit() 
     175 
     176        assert Person.query.filter_by(name='Homer').one() is homer 
    160177 
    161178    def test_global_scoped_session(self): 
     
    167184 
    168185        class Person(Entity): 
    169             firstname = Field(String(30)) 
    170             surname = Field(String(30)) 
     186            name = Field(String(30)) 
    171187 
    172188        setup_all() 
    173189        create_all(engine) 
    174190 
    175         homer = Person(firstname="Homer", surname='Simpson') 
    176         bart = Person(firstname="Bart", surname='Simpson') 
     191        homer = Person(name="Homer") 
     192        bart = Person(name="Bart") 
    177193        session.commit() 
    178194 
    179195        assert Person.query.session is session() 
    180         assert Person.query.filter_by(firstname='Homer').one() is homer 
     196        assert Person.query.filter_by(name='Homer').one() is homer 
    181197 
    182198        del __session__ 
     199 
    183200 
    184201class TestTableOptions(object):