diff options
| author | Tres Seaver <tseaver@palladion.com> | 2012-06-29 14:47:56 +0000 |
|---|---|---|
| committer | Tres Seaver <tseaver@palladion.com> | 2012-06-29 14:47:56 +0000 |
| commit | 2e39b26054c8c1da36886b7ba8ba0d346d62d2d7 (patch) | |
| tree | 370e3c664f4bec9fb91effde230daf4cd56c6688 /docs/api/persistent.rst | |
| parent | 33d9fc041301b310e4cf28f8e28b0f915c58d4fd (diff) | |
| download | zope-component-2e39b26054c8c1da36886b7ba8ba0d346d62d2d7.tar.gz | |
Merge tseaver-test_cleanup branch.
Diffstat (limited to 'docs/api/persistent.rst')
| -rw-r--r-- | docs/api/persistent.rst | 236 |
1 files changed, 236 insertions, 0 deletions
diff --git a/docs/api/persistent.rst b/docs/api/persistent.rst new file mode 100644 index 0000000..69c9e4b --- /dev/null +++ b/docs/api/persistent.rst @@ -0,0 +1,236 @@ +Persistent Registries +===================== + +.. testsetup:: + + from zope.component.testing import setUp + setUp() + +Conforming Adapter Lookup +------------------------- +Here, we'll demonstrate that changes work even when data are stored in +a database and when accessed from multiple connections. + +Start by setting up a database and creating two transaction +managers and database connections to work with. + +.. doctest:: + + >>> import ZODB.tests.util + >>> db = ZODB.tests.util.DB() + >>> import transaction + >>> t1 = transaction.TransactionManager() + >>> c1 = db.open(transaction_manager=t1) + >>> r1 = c1.root() + >>> t2 = transaction.TransactionManager() + >>> c2 = db.open(transaction_manager=t2) + >>> r2 = c2.root() + +Create a set of components registries in the database, alternating +connections. + +.. doctest:: + + >>> from zope.component.persistentregistry import PersistentComponents + >>> from zope.component.tests.examples import I1 + >>> from zope.component.tests.examples import I2 + >>> from zope.component.tests.examples import U + >>> from zope.component.tests.examples import U1 + >>> from zope.component.tests.examples import U12 + >>> from zope.component.tests.examples import handle1 + >>> from zope.component.tests.examples import handle2 + >>> from zope.component.tests.examples import handle3 + >>> from zope.component.tests.examples import handle4 + + >>> _ = t1.begin() + >>> r1[1] = PersistentComponents('1') + >>> t1.commit() + + >>> _ = t2.begin() + >>> r2[2] = PersistentComponents('2', (r2[1], )) + >>> t2.commit() + + >>> _ = t1.begin() + >>> r1[3] = PersistentComponents('3', (r1[1], )) + >>> t1.commit() + + >>> _ = t2.begin() + >>> r2[4] = PersistentComponents('4', (r2[2], r2[3])) + >>> t2.commit() + + >>> _ = t1.begin() + >>> r1[1].__bases__ + () + >>> r1[2].__bases__ == (r1[1], ) + True + + >>> r1[1].registerUtility(U1(1)) + >>> r1[1].queryUtility(I1) + U1(1) + >>> r1[2].queryUtility(I1) + U1(1) + >>> t1.commit() + + >>> _ = t2.begin() + >>> r2[1].registerUtility(U1(2)) + >>> r2[2].queryUtility(I1) + U1(2) + + >>> r2[4].queryUtility(I1) + U1(2) + >>> t2.commit() + + + >>> _ = t1.begin() + >>> r1[1].registerUtility(U12(1), I2) + >>> r1[4].queryUtility(I2) + U12(1) + >>> t1.commit() + + + >>> _ = t2.begin() + >>> r2[3].registerUtility(U12(3), I2) + >>> r2[4].queryUtility(I2) + U12(3) + >>> t2.commit() + + >>> _ = t1.begin() + + >>> r1[1].registerHandler(handle1, info="First handler") + >>> r1[2].registerHandler(handle2, required=[U]) + + >>> r1[3].registerHandler(handle3) + + >>> r1[4].registerHandler(handle4) + + >>> r1[4].handle(U1(1)) + handle1 U1(1) + handle3 U1(1) + handle2 (U1(1),) + handle4 U1(1) + + >>> t1.commit() + + >>> _ = t2.begin() + >>> r2[4].handle(U1(1)) + handle1 U1(1) + handle3 U1(1) + handle2 (U1(1),) + handle4 U1(1) + >>> t2.abort() + + >>> db.close() + +Subscription to Events in Persistent Registries +----------------------------------------------- + +.. doctest:: + + >>> import ZODB.tests.util + >>> db = ZODB.tests.util.DB() + >>> import transaction + >>> t1 = transaction.TransactionManager() + >>> c1 = db.open(transaction_manager=t1) + >>> r1 = c1.root() + >>> t2 = transaction.TransactionManager() + >>> c2 = db.open(transaction_manager=t2) + >>> r2 = c2.root() + + >>> from zope.component.persistentregistry import PersistentComponents + + >>> _ = t1.begin() + >>> r1[1] = PersistentComponents('1') + >>> r1[1].registerHandler(handle1) + >>> r1[1].registerSubscriptionAdapter(handle1, provided=I2) + >>> _ = r1[1].unregisterHandler(handle1) + >>> _ = r1[1].unregisterSubscriptionAdapter(handle1, provided=I2) + >>> t1.commit() + >>> _ = t1.begin() + >>> r1[1].registerHandler(handle1) + >>> r1[1].registerSubscriptionAdapter(handle1, provided=I2) + >>> t1.commit() + + >>> _ = t2.begin() + >>> len(list(r2[1].registeredHandlers())) + 1 + >>> len(list(r2[1].registeredSubscriptionAdapters())) + 1 + >>> t2.abort() + +Adapter Registrations after Serialization / Deserialization +----------------------------------------------------------- + +We want to make sure that we see updates corrextly. + +.. doctest:: + + >>> import persistent + >>> import transaction + >>> from zope.interface import Interface + >>> from zope.interface import implements + >>> class IFoo(Interface): + ... pass + >>> class Foo(persistent.Persistent): + ... implements(IFoo) + ... name = '' + ... def __init__(self, name=''): + ... self.name = name + ... def __repr__(self): + ... return 'Foo(%r)' % self.name + + >>> from zope.component.tests.examples import base + >>> from zope.component.tests.examples import clear_base + >>> len(base._v_subregistries) + 0 + + >>> import ZODB.tests.util + >>> db = ZODB.tests.util.DB() + >>> tm1 = transaction.TransactionManager() + >>> c1 = db.open(transaction_manager=tm1) + >>> from zope.component.persistentregistry import PersistentAdapterRegistry + >>> r1 = PersistentAdapterRegistry((base,)) + >>> r2 = PersistentAdapterRegistry((r1,)) + >>> c1.root()[1] = r1 + >>> c1.root()[2] = r2 + >>> tm1.commit() + >>> r1._p_deactivate() + + >>> len(base._v_subregistries) + 0 + + >>> tm2 = transaction.TransactionManager() + >>> c2 = db.open(transaction_manager=tm2) + >>> r1 = c2.root()[1] + >>> r2 = c2.root()[2] + + >>> r1.lookup((), IFoo, '') + + >>> base.register((), IFoo, '', Foo('')) + >>> r1.lookup((), IFoo, '') + Foo('') + + >>> r2.lookup((), IFoo, '1') + + >>> r1.register((), IFoo, '1', Foo('1')) + + >>> r2.lookup((), IFoo, '1') + Foo('1') + + >>> r1.lookup((), IFoo, '2') + >>> r2.lookup((), IFoo, '2') + + >>> base.register((), IFoo, '2', Foo('2')) + + >>> r1.lookup((), IFoo, '2') + Foo('2') + + >>> r2.lookup((), IFoo, '2') + Foo('2') + + >>> db.close() + >>> clear_base() + +.. testcleanup:: + + from zope.component.testing import tearDown + tearDown() |
