Commit 56f1205e authored by Jim Fulton's avatar Jim Fulton

Integrated persistent metaclass with ZClasses and got basic ZClass

test to pass.
parent 5e1d9f08
......@@ -22,6 +22,7 @@ from ComputedAttribute import ComputedAttribute
from Products.PythonScripts.PythonScript import PythonScript
from zExceptions import BadRequest, Redirect
import webdav.Collection
import ZClasses._pmc
import marshal
......@@ -91,7 +92,18 @@ from OFS.misc_ import p_
p_.ZClass_Icon=Globals.ImageFile('class.gif', globals())
class PersistentClass(Base, webdav.Collection.Collection ):
def __class_init__(self): pass
__metaclass__ = ZClasses._pmc.ZClassPersistentMetaClass
# We need this class to be treated as a normal global class, even
# though it is an instance of ZClassPersistentMetaClass.
# Subclasses should be stored in the database. See
# _pmc._p_DataDescr.__get__.
__global_persistent_class_not_stored_in_DB__ = True
def __class_init__(self):
pass
manage_addZClassForm=Globals.DTMLFile(
'dtml/addZClass', globals(),
......
......@@ -6,11 +6,7 @@ ZClasses were designed mainly to be used from the web.
To do anything, we need a working Zope object space:
>>> from ZODB.DemoStorage import DemoStorage
>>> s = DemoStorage()
>>> import ZODB.DB
>>> db = ZODB.DB(s)
>>> conn = db.open()
>>> conn = some_database.open()
>>> from OFS.Application import Application
>>> app = Application()
>>> conn.root()['Application'] = app
......@@ -41,7 +37,8 @@ give them data by defining property sheets:
... 'x', 'hee ', 'string')
>>> app.c.x
'hee '
>>> test.C.propertysheets.common['basic'].manage_addProperty('y', 42, 'int')
>>> test.C.propertysheets.common['basic'].manage_addProperty(
... 'y', 42, 'int')
>>> app.c.y
42
......@@ -63,8 +60,32 @@ We can also add methods, such as Python scripts:
>>> app.c.eek()
'hi hi hi '
We're done, so clean up:
Let's commit our changes:
>>> import transaction
>>> transaction.commit()
>>> db.close()
We can access the class in another connection:
>>> import threading
>>> def run(func):
... thread = threading.Thread(target=func)
... thread.start()
... thread.join()
>>> def read_class():
... connection = some_database.open()
... app = connection.root()['Application']
... test = app.Control_Panel.Products['test']
... c2 = test.C()
... c2._setId('c')
... app._setObject('c2', c2)
... app.c2.x = '*'
... print app.c2.x, app.c2.y, app.c2.eek(), '!'
... print app.c.x, app.c.y, app.c.eek(), '!'
... connection.close()
... run(read_class)
hee 42 ****************************************** !
hi 3 hi hi hi !
......@@ -57,6 +57,9 @@ class _p_DataDescr(object):
def __get__(self, inst, cls):
if inst is None:
return self
if '__global_persistent_class_not_stored_in_DB__' in inst.__dict__:
raise AttributeError, self.__name__
return inst._p_class_dict.get(self.__name__)
def __set__(self, inst, v):
......
......@@ -44,11 +44,13 @@ def test_suite():
return unittest.TestSuite((
# To do:
# - test integration: doctest.DocFileSuite("ZClass.txt"),
# - Beef up basic test
# - Test working with old pickles
# - Test proper handling of __of__
# - Test export/import
doctest.DocFileSuite("_pmc.txt", setUp=setUp, tearDown=tearDown),
doctest.DocFileSuite("ZClass.txt", setUp=setUp, tearDown=tearDown),
))
if __name__ == '__main__':
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment