Changeset 185
- Timestamp:
- 08/18/07 18:00:17 (6 years ago)
- Location:
- elixir/trunk
- Files:
-
- 5 modified
-
elixir/__init__.py (modified) (2 diffs)
-
elixir/entity.py (modified) (5 diffs)
-
elixir/ext/versioned.py (modified) (4 diffs)
-
elixir/options.py (modified) (1 diff)
-
tests/test_options.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
elixir/trunk/elixir/__init__.py
r183 r185 24 24 from elixir.options import using_options, using_table_options, \ 25 25 using_mapper_options, options_defaults 26 from elixir.entity import Entity, EntityMeta, EntityDescriptor 26 from elixir.entity import Entity, EntityMeta, EntityDescriptor, Objectstore 27 27 from elixir.fields import has_field, with_fields, Field 28 28 from elixir.relationships import belongs_to, has_one, has_many, \ … … 56 56 objectstore = sqlalchemy.objectstore 57 57 except AttributeError: 58 # thread local SessionContext 59 class Objectstore(object): 60 61 def __init__(self, *args, **kwargs): 62 self.context = SessionContext(*args, **kwargs) 63 64 def __getattr__(self, name): 65 return getattr(self.context.current, name) 66 67 session = property(lambda s:s.context.current) 68 69 objectstore = Objectstore(sqlalchemy.orm.create_session) 58 objectstore = Objectstore(SessionContext(sqlalchemy.orm.create_session)) 70 59 71 60 metadatas = set() 72 61 73 62 74 def create_all( ):63 def create_all(engine=None): 75 64 'Create all necessary tables for all declared entities' 76 65 for md in metadatas: 77 md.create_all( )66 md.create_all(bind=engine) 78 67 79 68 80 def drop_all( ):69 def drop_all(engine=None): 81 70 'Drop all tables for all declared entities' 82 71 for md in metadatas: 83 md.drop_all( )72 md.drop_all(bind=engine) 84 73 85 74 _delayed_descriptors = list() -
elixir/trunk/elixir/entity.py
r183 r185 7 7 from sqlalchemy.orm import deferred, Query, MapperExtension 8 8 from sqlalchemy.ext.assignmapper import assign_mapper 9 from sqlalchemy.ext.sessioncontext import SessionContext 9 10 from sqlalchemy.util import OrderedDict 10 11 import sqlalchemy … … 156 157 return 157 158 158 session = getattr(self.module, 'session', elixir.objectstore) 159 # look for a 'session' attribute assigned to the entity 160 # (or entity's base class) 161 session = getattr(self, 'session', None) 162 if session is None: 163 session = getattr(self.module, 'session', elixir.objectstore) 164 if not isinstance(session, Objectstore): 165 session = Objectstore(session) 166 167 self.objectstore = session 159 168 160 169 kwargs = self.mapper_options … … 213 222 args = [self.entity.table] 214 223 215 assign_mapper(session.context,self.entity, properties=properties,224 self.objectstore.mapper(self.entity, properties=properties, 216 225 *args, **kwargs) 217 226 … … 496 505 497 506 def q(cls): 498 return Query(cls, session= elixir.objectstore.session)507 return Query(cls, session=cls._descriptor.objectstore.session) 499 508 q = property(q) 500 509 … … 544 553 545 554 555 class Objectstore(object): 556 """a wrapper for a SQLAlchemy session-making object, such as 557 SessionContext or ScopedSession. 558 559 Uses the ``registry`` attribute present on both objects 560 (versions 0.3 and 0.4) in order to return the current 561 contextual session. 562 """ 563 564 def __init__(self, ctx): 565 self.context = ctx 566 self.is_ctx = isinstance(ctx, SessionContext) 567 568 def __getattr__(self, name): 569 return getattr(self.context.registry(), name) 570 571 def mapper(self, cls, *args, **kwargs): 572 if self.is_ctx: 573 assign_mapper(self.context, cls, *args, **kwargs) 574 else: 575 cls.mapper = self.context.mapper(cls, *args, **kwargs) 576 577 session = property(lambda s:s.context.registry()) 578 -
elixir/trunk/elixir/ext/versioned.py
r181 r185 40 40 ''' 41 41 42 from elixir import Integer, objectstore,DateTime42 from elixir import Integer, DateTime 43 43 from elixir.statements import Statement 44 44 from elixir.fields import Field … … 143 143 # attach utility methods and properties to the entity 144 144 def get_versions(self): 145 return objectstore.query(Version).select(get_history_where(self))145 return entity._descriptor.objectstore.query(Version).select(get_history_where(self)) 146 146 147 147 def get_as_of(self, dt): … … 152 152 # otherwise, we need to look to the history table to get our 153 153 # older version 154 items = objectstore.query(Version).select(154 items = entity._descriptor.objectstore.query(Version).select( 155 155 and_(get_history_where(self), Version.c.timestamp <= dt), 156 156 order_by=desc(Version.c.timestamp), … … 168 168 169 169 entity.table.update(get_entity_where(self)).execute( 170 **dict(old_version.items())170 dict(old_version.items()) 171 171 ) 172 172 -
elixir/trunk/elixir/options.py
r175 r185 137 137 'metadata', 138 138 'order_by', 139 'session', 139 140 ) 140 141 -
elixir/trunk/tests/test_options.py
r178 r185 7 7 from sqlalchemy.exceptions import SQLError, ConcurrentModificationError 8 8 from elixir import * 9 10 9 11 10 class TestOptions(object): … … 77 76 78 77 79 78 class TestSessionOptions(object): 79 def setup(self): 80 metadata.bind = None 81 82 def teardown(self): 83 cleanup_all() 84 85 def test_session_context(self): 86 from sqlalchemy.ext.sessioncontext import SessionContext 87 from sqlalchemy.orm import create_session 88 from sqlalchemy import create_engine 89 90 engine = create_engine('sqlite:///') 91 92 ctx = SessionContext(lambda: create_session(bind=engine)) 93 94 class Person(Entity): 95 using_options(session=ctx) 96 has_field('firstname', Unicode(30)) 97 has_field('surname', Unicode(30)) 98 99 create_all(engine) 100 101 homer = Person(firstname="Homer", surname='Simpson') 102 bart = Person(firstname="Bart", surname='Simpson') 103 ctx.current.flush() 104 105 assert Person.query().session is ctx.current 106 107 assert Person.query().filter_by(firstname='Homer').one() is homer 108 109 def test_scoped_session(self): 110 try: 111 from sqlalchemy.orm import scoped_session, sessionmaker 112 except ImportError: 113 print "Not on version 0.4 of sqlalchemy" 114 return 115 116 from sqlalchemy import create_engine 117 118 engine = create_engine('sqlite:///') 119 120 Session = scoped_session(sessionmaker(bind=engine)) 121 122 class Person(Entity): 123 using_options(session=Session) 124 has_field('firstname', Unicode(30)) 125 has_field('surname', Unicode(30)) 126 127 create_all(engine) 128 129 homer = Person(firstname="Homer", surname='Simpson') 130 bart = Person(firstname="Bart", surname='Simpson') 131 Session.flush() 132 133 assert Person.query().session is Session() 134 135 assert Person.query().filter_by(firstname='Homer').one() is homer 136 137 def test_global_scoped_session(self): 138 try: 139 from sqlalchemy.orm import scoped_session, sessionmaker 140 except ImportError: 141 print "Not on version 0.4 of sqlalchemy" 142 return 143 144 from sqlalchemy import create_engine 145 146 global session 147 148 engine = create_engine('sqlite:///') 149 150 session = scoped_session(sessionmaker(bind=engine)) 151 152 class Person(Entity): 153 has_field('firstname', Unicode(30)) 154 has_field('surname', Unicode(30)) 155 156 create_all(engine) 157 158 homer = Person(firstname="Homer", surname='Simpson') 159 bart = Person(firstname="Bart", surname='Simpson') 160 session.flush() 161 162 assert Person.query().session is session() 163 164 assert Person.query().filter_by(firstname='Homer').one() is homer 165 166 del session 167 80 168 class TestTableOptions(object): 81 169 def setup(self):
