summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/versioned_history/history_meta.py59
-rw-r--r--examples/versioned_history/test_versioning.py100
2 files changed, 106 insertions, 53 deletions
diff --git a/examples/versioned_history/history_meta.py b/examples/versioned_history/history_meta.py
index f9e979a6a..f10444e52 100644
--- a/examples/versioned_history/history_meta.py
+++ b/examples/versioned_history/history_meta.py
@@ -8,15 +8,18 @@ from sqlalchemy import event
import datetime
from sqlalchemy.orm.properties import RelationshipProperty
+
def col_references_table(col, table):
for fk in col.foreign_keys:
if fk.references(table):
return True
return False
+
def _is_versioning_col(col):
return "version_meta" in col.info
+
def _history_mapper(local_mapper):
cls = local_mapper.class_
@@ -38,7 +41,8 @@ def _history_mapper(local_mapper):
col.default = col.server_default = None
return col
- if not super_mapper or local_mapper.local_table is not super_mapper.local_table:
+ if not super_mapper or \
+ local_mapper.local_table is not super_mapper.local_table:
cols = []
for column in local_mapper.local_table.c:
if _is_versioning_col(column):
@@ -46,8 +50,14 @@ def _history_mapper(local_mapper):
col = _col_copy(column)
- if super_mapper and col_references_table(column, super_mapper.local_table):
- super_fks.append((col.key, list(super_history_mapper.local_table.primary_key)[0]))
+ if super_mapper and \
+ col_references_table(column, super_mapper.local_table):
+ super_fks.append(
+ (
+ col.key,
+ list(super_history_mapper.local_table.primary_key)[0]
+ )
+ )
cols.append(col)
@@ -55,15 +65,21 @@ def _history_mapper(local_mapper):
polymorphic_on = col
if super_mapper:
- super_fks.append(('version', super_history_mapper.local_table.c.version))
+ super_fks.append(
+ (
+ 'version', super_history_mapper.local_table.c.version
+ )
+ )
version_meta = {"version_meta": True} # add column.info to identify
# columns specific to versioning
# "version" stores the integer version id. This column is
# required.
- cols.append(Column('version', Integer, primary_key=True,
- autoincrement=False, info=version_meta))
+ cols.append(
+ Column(
+ 'version', Integer, primary_key=True,
+ autoincrement=False, info=version_meta))
# "changed" column stores the UTC timestamp of when the
# history row was created.
@@ -75,10 +91,11 @@ def _history_mapper(local_mapper):
if super_fks:
cols.append(ForeignKeyConstraint(*zip(*super_fks)))
- table = Table(local_mapper.local_table.name + '_history',
- local_mapper.local_table.metadata,
- *cols,
- schema=local_mapper.local_table.schema
+ table = Table(
+ local_mapper.local_table.name + '_history',
+ local_mapper.local_table.metadata,
+ *cols,
+ schema=local_mapper.local_table.schema
)
else:
# single table inheritance. take any additional columns that may have
@@ -108,7 +125,8 @@ def _history_mapper(local_mapper):
local_mapper.local_table.append_column(
Column('version', Integer, default=1, nullable=False)
)
- local_mapper.add_property("version", local_mapper.local_table.c.version)
+ local_mapper.add_property(
+ "version", local_mapper.local_table.c.version)
class Versioned(object):
@@ -126,6 +144,7 @@ def versioned_objects(iter):
if hasattr(obj, '__history_mapper__'):
yield obj
+
def create_version(obj, session, deleted=False):
obj_mapper = object_mapper(obj)
history_mapper = obj.__history_mapper__
@@ -137,7 +156,10 @@ def create_version(obj, session, deleted=False):
obj_changed = False
- for om, hm in zip(obj_mapper.iterate_to_root(), history_mapper.iterate_to_root()):
+ for om, hm in zip(
+ obj_mapper.iterate_to_root(),
+ history_mapper.iterate_to_root()
+ ):
if hm.single:
continue
@@ -157,11 +179,12 @@ def create_version(obj, session, deleted=False):
# in the case of single table inheritance, there may be
# columns on the mapped table intended for the subclass only.
# the "unmapped" status of the subclass column on the
- # base class is a feature of the declarative module as of sqla 0.5.2.
+ # base class is a feature of the declarative module.
continue
- # expired object attributes and also deferred cols might not be in the
- # dict. force it to load no matter what by using getattr().
+ # expired object attributes and also deferred cols might not
+ # be in the dict. force it to load no matter what by
+ # using getattr().
if prop.key not in obj_state.dict:
getattr(obj, prop.key)
@@ -182,8 +205,9 @@ def create_version(obj, session, deleted=False):
# check those too
for prop in obj_mapper.iterate_properties:
if isinstance(prop, RelationshipProperty) and \
- attributes.get_history(obj, prop.key,
- passive=attributes.PASSIVE_NO_INITIALIZE).has_changes():
+ attributes.get_history(
+ obj, prop.key,
+ passive=attributes.PASSIVE_NO_INITIALIZE).has_changes():
for p in prop.local_columns:
if p.foreign_keys:
obj_changed = True
@@ -201,6 +225,7 @@ def create_version(obj, session, deleted=False):
session.add(hist)
obj.version += 1
+
def versioned_session(session):
@event.listens_for(session, 'before_flush')
def before_flush(session, flush_context, instances):
diff --git a/examples/versioned_history/test_versioning.py b/examples/versioned_history/test_versioning.py
index 874223d62..ed6935eb7 100644
--- a/examples/versioned_history/test_versioning.py
+++ b/examples/versioned_history/test_versioning.py
@@ -1,4 +1,5 @@
-"""Unit tests illustrating usage of the ``history_meta.py`` module functions."""
+"""Unit tests illustrating usage of the ``history_meta.py``
+module functions."""
from unittest import TestCase
from sqlalchemy.ext.declarative import declarative_base
@@ -11,10 +12,12 @@ from sqlalchemy.orm import exc as orm_exc
engine = None
+
def setup_module():
global engine
engine = create_engine('sqlite://', echo=True)
+
class TestVersioning(TestCase, AssertsCompiledSQL):
__dialect__ = 'default'
@@ -52,14 +55,16 @@ class TestVersioning(TestCase, AssertsCompiledSQL):
SomeClassHistory = SomeClass.__history_mapper__.class_
eq_(
- sess.query(SomeClassHistory).filter(SomeClassHistory.version == 1).all(),
+ sess.query(SomeClassHistory).filter(
+ SomeClassHistory.version == 1).all(),
[SomeClassHistory(version=1, name='sc1')]
)
sc.name = 'sc1modified2'
eq_(
- sess.query(SomeClassHistory).order_by(SomeClassHistory.version).all(),
+ sess.query(SomeClassHistory).order_by(
+ SomeClassHistory.version).all(),
[
SomeClassHistory(version=1, name='sc1'),
SomeClassHistory(version=2, name='sc1modified')
@@ -76,7 +81,8 @@ class TestVersioning(TestCase, AssertsCompiledSQL):
sess.commit()
eq_(
- sess.query(SomeClassHistory).order_by(SomeClassHistory.version).all(),
+ sess.query(SomeClassHistory).order_by(
+ SomeClassHistory.version).all(),
[
SomeClassHistory(version=1, name='sc1'),
SomeClassHistory(version=2, name='sc1modified')
@@ -87,7 +93,8 @@ class TestVersioning(TestCase, AssertsCompiledSQL):
sess.commit()
eq_(
- sess.query(SomeClassHistory).order_by(SomeClassHistory.version).all(),
+ sess.query(SomeClassHistory).order_by(
+ SomeClassHistory.version).all(),
[
SomeClassHistory(version=1, name='sc1'),
SomeClassHistory(version=2, name='sc1modified'),
@@ -164,13 +171,13 @@ class TestVersioning(TestCase, AssertsCompiledSQL):
SomeClassHistory = SomeClass.__history_mapper__.class_
eq_(
- sess.query(SomeClassHistory.boole).order_by(SomeClassHistory.id).all(),
+ sess.query(SomeClassHistory.boole).order_by(
+ SomeClassHistory.id).all(),
[(True, ), (None, )]
)
eq_(sc.version, 3)
-
def test_deferred(self):
"""test versioning of unloaded, deferred columns."""
@@ -199,11 +206,11 @@ class TestVersioning(TestCase, AssertsCompiledSQL):
SomeClassHistory = SomeClass.__history_mapper__.class_
eq_(
- sess.query(SomeClassHistory).filter(SomeClassHistory.version == 1).all(),
+ sess.query(SomeClassHistory).filter(
+ SomeClassHistory.version == 1).all(),
[SomeClassHistory(version=1, name='sc1', data='somedata')]
)
-
def test_joined_inheritance(self):
class BaseClass(Versioned, self.Base, ComparableEntity):
__tablename__ = 'basetable'
@@ -212,7 +219,9 @@ class TestVersioning(TestCase, AssertsCompiledSQL):
name = Column(String(50))
type = Column(String(20))
- __mapper_args__ = {'polymorphic_on': type, 'polymorphic_identity': 'base'}
+ __mapper_args__ = {
+ 'polymorphic_on': type,
+ 'polymorphic_identity': 'base'}
class SubClassSeparatePk(BaseClass):
__tablename__ = 'subtable1'
@@ -246,38 +255,50 @@ class TestVersioning(TestCase, AssertsCompiledSQL):
sess.commit()
BaseClassHistory = BaseClass.__history_mapper__.class_
- SubClassSeparatePkHistory = SubClassSeparatePk.__history_mapper__.class_
+ SubClassSeparatePkHistory = \
+ SubClassSeparatePk.__history_mapper__.class_
SubClassSamePkHistory = SubClassSamePk.__history_mapper__.class_
eq_(
sess.query(BaseClassHistory).order_by(BaseClassHistory.id).all(),
[
- SubClassSeparatePkHistory(id=1, name='sep1', type='sep', version=1),
+ SubClassSeparatePkHistory(
+ id=1, name='sep1', type='sep', version=1),
BaseClassHistory(id=2, name='base1', type='base', version=1),
- SubClassSamePkHistory(id=3, name='same1', type='same', version=1)
+ SubClassSamePkHistory(
+ id=3, name='same1', type='same', version=1)
]
)
same1.subdata2 = 'same1subdatamod2'
eq_(
- sess.query(BaseClassHistory).order_by(BaseClassHistory.id, BaseClassHistory.version).all(),
+ sess.query(BaseClassHistory).order_by(
+ BaseClassHistory.id, BaseClassHistory.version).all(),
[
- SubClassSeparatePkHistory(id=1, name='sep1', type='sep', version=1),
+ SubClassSeparatePkHistory(
+ id=1, name='sep1', type='sep', version=1),
BaseClassHistory(id=2, name='base1', type='base', version=1),
- SubClassSamePkHistory(id=3, name='same1', type='same', version=1),
- SubClassSamePkHistory(id=3, name='same1', type='same', version=2)
+ SubClassSamePkHistory(
+ id=3, name='same1', type='same', version=1),
+ SubClassSamePkHistory(
+ id=3, name='same1', type='same', version=2)
]
)
base1.name = 'base1mod2'
eq_(
- sess.query(BaseClassHistory).order_by(BaseClassHistory.id, BaseClassHistory.version).all(),
+ sess.query(BaseClassHistory).order_by(
+ BaseClassHistory.id, BaseClassHistory.version).all(),
[
- SubClassSeparatePkHistory(id=1, name='sep1', type='sep', version=1),
+ SubClassSeparatePkHistory(
+ id=1, name='sep1', type='sep', version=1),
BaseClassHistory(id=2, name='base1', type='base', version=1),
- BaseClassHistory(id=2, name='base1mod', type='base', version=2),
- SubClassSamePkHistory(id=3, name='same1', type='same', version=1),
- SubClassSamePkHistory(id=3, name='same1', type='same', version=2)
+ BaseClassHistory(
+ id=2, name='base1mod', type='base', version=2),
+ SubClassSamePkHistory(
+ id=3, name='same1', type='same', version=1),
+ SubClassSamePkHistory(
+ id=3, name='same1', type='same', version=2)
]
)
@@ -289,8 +310,9 @@ class TestVersioning(TestCase, AssertsCompiledSQL):
name = Column(String(50))
type = Column(String(20))
- __mapper_args__ = {'polymorphic_on': type,
- 'polymorphic_identity': 'base'}
+ __mapper_args__ = {
+ 'polymorphic_on': type,
+ 'polymorphic_identity': 'base'}
class SubClass(BaseClass):
__tablename__ = 'subtable'
@@ -342,7 +364,8 @@ class TestVersioning(TestCase, AssertsCompiledSQL):
"ON basetable_history.id = subtable_history.base_id "
"AND basetable_history.version = subtable_history.version "
"JOIN subsubtable_history ON subtable_history.id = "
- "subsubtable_history.id AND subtable_history.version = subsubtable_history.version"
+ "subsubtable_history.id AND subtable_history.version = "
+ "subsubtable_history.version"
)
ssc = SubSubClass(name='ss1', subdata1='sd1', subdata2='sd2')
@@ -360,8 +383,9 @@ class TestVersioning(TestCase, AssertsCompiledSQL):
[SubSubHistory(name='ss1', subdata1='sd1',
subdata2='sd2', type='subsub', version=1)]
)
- eq_(ssc, SubSubClass(name='ss1', subdata1='sd11',
- subdata2='sd22', version=2))
+ eq_(ssc, SubSubClass(
+ name='ss1', subdata1='sd11',
+ subdata2='sd22', version=2))
@@ -372,8 +396,9 @@ class TestVersioning(TestCase, AssertsCompiledSQL):
id = Column(Integer, primary_key=True)
name = Column(String(50))
type = Column(String(50))
- __mapper_args__ = {'polymorphic_on': type,
- 'polymorphic_identity': 'base'}
+ __mapper_args__ = {
+ 'polymorphic_on': type,
+ 'polymorphic_identity': 'base'}
class SubClass(BaseClass):
@@ -396,8 +421,8 @@ class TestVersioning(TestCase, AssertsCompiledSQL):
SubClassHistory = SubClass.__history_mapper__.class_
eq_(
- sess.query(BaseClassHistory).order_by(BaseClassHistory.id,
- BaseClassHistory.version).all(),
+ sess.query(BaseClassHistory).order_by(
+ BaseClassHistory.id, BaseClassHistory.version).all(),
[BaseClassHistory(id=1, name='b1', type='base', version=1)]
)
@@ -405,11 +430,12 @@ class TestVersioning(TestCase, AssertsCompiledSQL):
b1.name = 'b1modified2'
eq_(
- sess.query(BaseClassHistory).order_by(BaseClassHistory.id,
- BaseClassHistory.version).all(),
+ sess.query(BaseClassHistory).order_by(
+ BaseClassHistory.id, BaseClassHistory.version).all(),
[
BaseClassHistory(id=1, name='b1', type='base', version=1),
- BaseClassHistory(id=1, name='b1modified', type='base', version=2),
+ BaseClassHistory(
+ id=1, name='b1modified', type='base', version=2),
SubClassHistory(id=2, name='s1', type='sub', version=1)
]
)
@@ -475,14 +501,16 @@ class TestVersioning(TestCase, AssertsCompiledSQL):
assert sc.version == 2
eq_(
- sess.query(SomeClassHistory).filter(SomeClassHistory.version == 1).all(),
+ sess.query(SomeClassHistory).filter(
+ SomeClassHistory.version == 1).all(),
[SomeClassHistory(version=1, name='sc1', related_id=None)]
)
sc.related = None
eq_(
- sess.query(SomeClassHistory).order_by(SomeClassHistory.version).all(),
+ sess.query(SomeClassHistory).order_by(
+ SomeClassHistory.version).all(),
[
SomeClassHistory(version=1, name='sc1', related_id=None),
SomeClassHistory(version=2, name='sc1', related_id=sr1.id)