Changeset 305
- Timestamp:
- 02/03/08 19:36:55 (10 months ago)
- Files:
-
- trunk/src/dm/db.py (modified) (10 diffs)
- trunk/src/dm/dom/base.py (modified) (7 diffs)
- trunk/src/dm/dom/meta.py (modified) (5 diffs)
- trunk/src/dm/dom/registry.py (modified) (3 diffs)
- trunk/src/dm/dom/temporal.py (modified) (5 diffs)
- trunk/src/dm/dom/temporaltest.py (modified) (9 diffs)
- trunk/src/dm/migrate.py (modified) (1 diff)
- trunk/src/dm/testunit.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/src/dm/db.py
r304 r305 1 """KForge Data Mapper. Follows 'Data Mapper (165)', [Fowler, 2003] 2 3 This module provides relational database persistence to the Domain Model. 4 5 It is responsible for moving data between domain model objects and database 6 objects. SQLObject is used as an object-relational mapper to move data 7 between database objects and a relational database management system. 1 """Model Persistence Data Mapper. Follows 'Data Mapper (165)', [Fowler, 2003] 2 3 This module provides persistence data mapping services to the domain model. 4 5 Responsible for moving values between domain objects and database objects. 8 6 9 7 This module works by using domain model meta data objects to construct data … … 16 14 It also provides various features for making selections from the domain model, 17 15 such as after-before intervals for times, and search for text attributes. 18 19 20 # create facade 21 import dm.db 22 db = dm.db.DatabaseFacade() 23 24 # define mapper class 25 db.createMapperClass(metaDomainObject) 26 27 # create records 28 project = db.createRecord('Project', name='projekt') 29 person = db.createRecord('Person', name='joe') 30 member = db.createRecord('Member', project=project, person=person) 31 32 # read records 33 project = db.findRecord('Project', name='projekt') 34 person = db.findRecord('Person', name='joe') 35 member = db.findRecord('Member', project=project, person=person) 16 The temporal aspects of domain models are also provided by this module, which 17 has the opportunity to direct persistence of temporal values to the temporal 18 model, confusing this with neither the domain model or the ORM. 19 20 At the moment SQLObject is used as an object-relational mapper to move between 21 database objects and a relational database management system. We want to add 22 support for other Object Relational Mappers (such as SQLAlchemy and Elixir). 23 36 24 """ 37 25 … … 555 543 self.default = None 556 544 self.isDomainObjectRef = self.dom.isDomainObjectRef 545 self.isValueRef = self.dom.isValueRef 546 self.isAssociateList = self.dom.isAssociateList 557 547 558 548 def createMapperClassAttribute(self): … … 755 745 currentVersion = None 756 746 if self.domainObject.meta.isTemporal: 757 r = self.domainObject.meta.createTemporalCollection(self.domainObject) 758 loadedList = {self.domainObject: self.domainObject} 759 currentVersion = r.findFirstDomainObject(loadedList=loadedList) 747 currentVersion = self.domainObject.temporalHistory.getCurrent() 760 748 self.domainObject.id = self.id 761 749 for metaAttr in self.meta.attributes: … … 777 765 # - we need to look in the temporal model. 778 766 if self.domainObject.meta.isTemporal: 779 r = self.domainObject.meta.createTemporalCollection(self.domainObject) 780 current = r.findFirstDomainObject(loadedList) 781 if current: 782 mappedValue = getattr(current, domName) 767 if currentVersion: 768 mappedValue = getattr(currentVersion, domName) 783 769 else: 784 770 mappedValue = metaAttr.dom.createInitialValue( … … 786 772 ) 787 773 else: 788 r = metaAttr.dom.createTemporalCollection(self.domainObject) 789 current = r.findFirstDomainObject(loadedList) 790 if current: 791 mappedValue = current.recordedValue 774 # Temporal property histories are virtual ATM. 775 p = metaAttr.dom.createTemporalCollection(self.domainObject) 776 currentPropertyVersion = p.findFirstDomainObject(loadedList) 777 if currentPropertyVersion: 778 mappedValue = currentPropertyVersion.recordedValue 792 779 else: 793 780 mappedValue = metaAttr.dom.createInitialValue( … … 818 805 mappedValue = getattr(self, dbName) 819 806 setattr(self.domainObject, domName, mappedValue) 807 820 808 if moddebug and debug: 821 809 message = "Loaded %s from record #%s" % ( … … 830 818 currentVersion = None 831 819 if self.domainObject.meta.isTemporal: 832 r = self.domainObject.meta.createTemporalCollection(self.domainObject) 833 loadedList = {self.domainObject: self.domainObject} 834 currentVersion = r.findFirstDomainObject(loadedList=loadedList) 820 currentVersion = self.domainObject.temporalHistory.getCurrent() 835 821 if not currentVersion: 836 currentVersion = r.create(loadedList=loadedList)837 822 isChangedTemporal = True 838 else: 823 824 if not isChangedTemporal: 839 825 for metaAttr in self.domainObject.meta.attributes: 840 826 if metaAttr.isTemporal: 841 domName = metaAttr.name 842 recordedValue = getattr(currentVersion, domName) 843 actualValue = getattr(self.domainObject, domName) 844 if actualValue != recordedValue: 845 isChangedTemporal = True 846 if isChangedTemporal: 847 currentVersion = r.create(loadedList=loadedList) 827 if metaAttr.isAssociateList: 828 recordedRegister = getattr(currentVersion, metaAttr.name) 829 recordedList = recordedRegister.getObjectList() 830 actualRegister = getattr(self.domainObject, metaAttr.name) 831 actualList = actualRegister.getObjectList() 832 recordedLen = len(recordedList) 833 actualLen = len(actualList) 834 print "Checking association list values for changes..." 835 print "Recorded: %s, actual: %s)...." % (recordedLen, actualLen) 836 if recordedLen == actualLen: 837 for i in recordedList: 838 if i.recordedValue not in actualList: 839 print "Missing item: %s" % i.recordedValue 840 isChangedTemporal = True 841 break 842 else: 843 print "Found item in record: %s" % i.recordedValue 844 if isChangedTemporal: 845 break 846 else: 847 print "Length mismatch!" 848 isChangedTemporal = True 849 break 850 else: 851 domName = metaAttr.name 852 recordedValue = getattr(currentVersion, domName) 853 actualValue = getattr(self.domainObject, domName) 854 if actualValue != recordedValue: 855 isChangedTemporal = True 856 break 857 if isChangedTemporal: 858 print "Is changed!!!!!!! Creating new current version of associate list." 859 loadedList = {self.domainObject: self.domainObject} 860 history = self.domainObject.temporalHistory 861 currentVersion = history.create(loadedList=loadedList) 862 863 for metaAttr in self.domainObject.meta.attributes: 864 if metaAttr.isTemporal and metaAttr.isAssociateList: 865 isListChanged = False 866 recordedRegister = getattr(currentVersion, metaAttr.name) 867 recordedList = recordedRegister.getObjectList() 868 actualRegister = getattr(self.domainObject, metaAttr.name) 869 actualList = actualRegister.getObjectList() 870 recordedLen = len(recordedList) 871 actualLen = len(actualList) 872 print "Checking association list values for changes..." 873 print "Recorded: %s, actual: %s)...." % (recordedLen, actualLen) 874 if recordedLen == actualLen: 875 for i in recordedList: 876 if i.recordedValue not in actualList: 877 print "Missing item: %s" % i.recordedValue 878 isListChanged = True 879 break 880 else: 881 print "Found item in record: %s" % i.recordedValue 882 else: 883 print "Length mismatch!" 884 isListChanged = True 885 886 if isListChanged: 887 print "List is changed...." 888 for item in actualRegister: 889 print "Adding list item to temporal record: %s" % item 890 key = actualRegister.getRegisterKey(item) 891 try: 892 listItem = recordedRegister.create( 893 recordedValue=item, 894 recordedKey=key 895 ) 896 print "Created: %s" % listItem 897 898 except TypeError, inst: 899 msg = "Couldn't add item %s with key %s to temporal associate list register %s: %s" % (item, key, recordedRegister, inst) 900 print msg 901 raise Exception, msg 902 print "Recorded register now: %s" % [i for i in recordedRegister] 903 848 904 for metaAttr in self.meta.attributes: 849 905 domValue = getattr(self.domainObject, metaAttr.domName) … … 853 909 # - we need to look in the temporal model. 854 910 if self.domainObject.meta.isTemporal: 855 if isChangedTemporal: 856 setattr(currentVersion, metaAttr.domName, domValue) 911 setattr(currentVersion, metaAttr.domName, domValue) 857 912 else: 858 r = metaAttr.dom.createTemporalCollection(self.domainObject) 913 # Temporal property histories are virtual ATM. 914 p = metaAttr.dom.createTemporalCollection(self.domainObject) 859 915 loadedList = {self.domainObject: self.domainObject} 860 current = r.findFirstDomainObject(loadedList=loadedList)916 current = p.findFirstDomainObject(loadedList=loadedList) 861 917 if current == None or current.recordedValue != domValue: 862 r.create(recordedValue=domValue, loadedList=loadedList)918 p.create(recordedValue=domValue, loadedList=loadedList) 863 919 elif metaAttr.isDomainObjectRef: 864 920 domainObject = domValue … … 871 927 setattr(self, metaAttr.dbName, domRecord) 872 928 isChanged = True 873 el se:929 elif metaAttr.isValueRef: 874 930 dbValue = getattr(self, metaAttr.dbName) 875 931 if domValue != dbValue: 876 932 setattr(self, metaAttr.dbName, domValue) 877 933 isChanged = True 934 878 935 if isChangedTemporal: 879 936 currentVersion.save() trunk/src/dm/dom/base.py
r304 r305 19 19 20 20 21 class AbstractList(DomainBase): 21 # Todo: Rename as AbstractRegister - this class is NOT a list. :-) 22 class AbstractList(DomainBase): 22 23 """ 23 24 Supertype for domain model registers. … … 42 43 43 44 def __contains__(self, key): 44 " Supports: if key in register:"45 "NB: Use item's key to test containment of item in register." 45 46 return self.has_key(key) 46 47 47 48 def __getitem__(self, key): 48 "Supports: item = register[key]"49 49 item = self.find(key) 50 50 return item 51 51 52 52 def get(self, key, default=None): 53 "Implements: register[key] if key in register, else default (None)."54 53 try: 55 54 return self.__getitem__(key) … … 58 57 59 58 def has_key(self, key): 60 "Tests existence of register entity with key."61 59 if self.isCached: 62 60 if key in self.cache: … … 94 92 def beginTransaction(self): 95 93 "Begins a transaction." 94 # Commit, commit, commit, rollback, begin, commit, commit. 96 95 return self.database.beginTransaction() 97 96 … … 123 122 def __init__(self, typeName='', keyName='id', metaAttr=None, **kwds): 124 123 super(DomainObjectRegister, self).__init__(**kwds) 125 self.typeName = typeName 124 # Recorded domain class name. 125 self.typeName = typeName 126 # Attribute used to key register. 126 127 self.keyName = keyName 128 # Meta object for supported model attribute. 127 129 self.metaAttr = metaAttr 130 # Attributes used in basic search. 128 131 if 'searchAttributeNames' in kwds: 129 132 self.searchAttributeNames = kwds['searchAttributeNames'] … … 174 177 175 178 def __iter__(self, **kwds): 176 "Returns iterator for registered items ."179 "Returns iterator for registered items (not keys!)." 177 180 self.coerceKwds(kwds) 178 181 self.switchToRecords(kwds) … … 629 632 raise DomainClassRegistrationError(message) 630 633 if len(self.meta.attributesDeferred): 631 message = "Class '%s' has mismatched attributes: %s" % (634 message = "Class '%s' has mismatched (deferred) attributes: %s" % ( 632 635 className, str(self.meta.attributesDeferred)) 633 636 raise DomainClassRegistrationError(message) trunk/src/dm/dom/meta.py
r304 r305 16 16 moddebug = False 17 17 18 # todo: Add Email attribute class. 18 19 20 # todo: Add Email attribute meta class. 19 21 20 22 class NotDefined(object): … … 185 187 return False 186 188 189 # Todo: Remove; apparently redundant given isAssociateList attribute?. 187 190 def isList(self): 188 191 return False … … 633 636 634 637 638 class TemporalRegisterMixin(object): 639 640 def __iter__(self): 641 return iter([]) 642 643 635 644 class AssociateList(DomainObjectAssociation): 636 645 "Models aquaintance with several domain objects." … … 644 653 self.key = key 645 654 self.owner = owner 646 655 656 # Todo: Remove; apparently redundant given isAssociateList attribute?. 647 657 def isList(self): 648 658 return True … … 671 681 672 682 def createInitialValue(self, domainObject): 673 className = self.typeName 674 recordClass = self.registry.getDomainClass(className) 683 # Just instantiate a register for this attribute on this object. 684 return self.createRegister(domainObject) 685 686 def createRegister(self, domainObject): 687 recordClass = self.registry.getDomainClass(self.typeName) 675 688 registerClass = recordClass.registerClass 689 if self.isTemporal: 690 className = "Temporal%s" % registerClass.__name__ 691 classBases = (TemporalRegisterMixin, registerClass) 692 registerClass = type(className, classBases, {}) 676 693 register = registerClass( 677 694 typeName=self.typeName, trunk/src/dm/dom/registry.py
r304 r305 2 2 from dm.dom.base import * 3 3 from dm.dom.stateful import * 4 from dm.dom.temporal import TemporalProperty, BitemporalProperty, BitemporalActual, TemporalRevision 4 from dm.dom.temporal import TemporalProperty 5 from dm.dom.temporal import BitemporalProperty 6 from dm.dom.temporal import BitemporalActual 7 from dm.dom.temporal import TemporalRevision 8 from dm.dom.temporal import TemporalAssociateList 5 9 from dm.ioc import * 6 10 from dm.exceptions import * … … 36 40 if domainClass.dbName: 37 41 domainClass.meta.dbName = domainClass.dbName 42 43 if domainClass.isTemporal==True: 44 temporalClassName = self.makeTemporalRevisionClassName(domainClass.meta) 45 domainClass.temporalHistory = HasMany(temporalClassName, 'id', 'parent') 38 46 39 47 # … … 66 74 for attrMeta in domainClass.meta.attributes: 67 75 if attrMeta.isTemporal: 68 parentMeta = domainClass.meta 69 self.generateTemporalPropertyClass(parentMeta, attrMeta) 76 if attrMeta.isAssociateList: 77 raise Exception, "No support for independently temporal associate lists at this time. Try setting the class isTemporal to true? %s on %s" % (attrMeta, domainClass.meta) 78 else: 79 parentMeta = domainClass.meta 80 self.generateTemporalPropertyClass(parentMeta, attrMeta) 81 82 def makeTemporalRevisionClassName(self, classMeta): 83 return TemporalRevision.makeTemporalName(classMeta.name) 70 84 71 85 def generateTemporalRevisionClass(self, parentMeta, metaAttrs): 72 # No support for bitemporal revisions yet!86 # No support for bitemporal object revisions yet! 73 87 temporalBase = TemporalRevision 74 temporalClassName = TemporalRevision.makeTemporalName(parentMeta.name)88 temporalClassName = self.makeTemporalRevisionClassName(parentMeta) 75 89 temporalMeta = temporalBase.metaClass(temporalClassName) 90 todoParams = [] 76 91 for metaAttr in metaAttrs: 77 newAttr = metaAttr.duplicateTemporal() 92 if metaAttr.isAssociateList: 93 temporalListClassName = temporalBase.makeTemporalName( 94 parentMeta.name, metaAttr.name) 95 96 todoParams.append((temporalMeta, metaAttr, temporalListClassName)) 97 newAttr = AggregatesMany(temporalListClassName, 'id', 'parent') 98 else: 99 newAttr = metaAttr.duplicateTemporal() 78 100 setattr(temporalMeta, metaAttr.name, newAttr) 79 101 temporalMeta.parent = HasA(parentMeta.name, isRequired=True) 80 102 temporalClass = self.createDomainClass(temporalMeta, temporalBase) 81 103 parentMeta.setTemporalDomainClass(temporalClass) 104 for params in todoParams: 105 self.generateTemporalAssociateListClass(params[0], params[1], params[2]) 106 107 def generateTemporalAssociateListClass(self, parentMeta, attrMeta, temporalClassName): 108 # No support for bitemporal associate lists yet! 109 temporalBase = TemporalAssociateList 110 temporalMeta = temporalBase.metaClass(temporalClassName) 111 keyMeta = attrMeta.getKeyMetaAttribute() 112 if keyMeta: 113 temporalMeta.recordedKey = keyMeta.duplicateTemporal() 114 else: 115 temporalMeta.recordedKey = Integer(isRequired=True) 116 temporalMeta.recordedValue = HasA(attrMeta.typeName, isRequired=True) 117 temporalMeta.parent = HasA(parentMeta.name, isRequired=True) 118 temporalClass = self.createDomainClass(temporalMeta, temporalBase) 119 attrMeta.setTemporalDomainClass(temporalClass) 82 120 83 121 def generateTemporalPropertyClass(self, parentMeta, attrMeta): trunk/src/dm/dom/temporal.py
r304 r305 2 2 from dm.dom.meta import DateTime, String, Integer 3 3 from dm.ioc import RequiredFeature 4 import mx.DateTime5 4 5 6 # Todo: Constraints regarding stateful requirements of temporal objects. 6 7 7 8 class BaseTemporalCollection(DomainObjectRegister): … … 10 11 timepoint = RequiredFeature('Timepoint') 11 12 12 def getReferenceTime(self): 13 def getCreateTime(self): 14 return self.timepoint.now() 15 16 def getFindTime(self): 13 17 return self.timepoint.recorded 14 18 15 19 def create(self, dateCreated=None, loadedList={}, **kwds): 16 20 if dateCreated == None: 17 dateCreated = self.get ReferenceTime()21 dateCreated = self.getCreateTime() 18 22 return super(BaseTemporalCollection, self).create( 19 23 dateCreated=dateCreated, __loadedList__=loadedList, **kwds … … 21 25 22 26 def findFirstDomainObject(self, loadedList={}): 23 referenceTime = self.get ReferenceTime()27 referenceTime = self.getFindTime() 24 28 return super(BaseTemporalCollection, self).findFirstDomainObject( 25 29 __loadedList__=loadedList, 26 30 __dateCreatedOnOrBefore__=referenceTime 27 31 ) 32 33 def getCurrent(self): 34 loadedList = {self.owner: self.owner} 35 return self.findFirstDomainObject(loadedList=loadedList) 28 36 29 37 … … 40 48 class BitemporalActualCollection(TemporalCollection): 41 49 42 def getReferenceTime(self): 50 def getCreateTime(self): 51 return self.timepoint.actual 52 53 def getFindTime(self): 43 54 return self.timepoint.actual 44 55 … … 141 152 142 153 154 class TemporalAssociateListCollection(BaseTemporalCollection): 155 156 def create(self, recordedValue, recordedKey, loadedList={}, dateCreated=None): 157 return super(TemporalAssociateListCollection, self).create( 158 recordedKey=recordedKey, 159 recordedValue=recordedValue, 160 loadedList=loadedList, 161 dateCreated=dateCreated, 162 ) 163 164 165 class TemporalAssociateList(BaseTemporal): 166 167 registerClass = TemporalAssociateListCollection 168 169 trunk/src/dm/dom/temporaltest.py
r304 r305 2 2 from dm.dom.testunit import TestCase 3 3 from dm.exceptions import * 4 from dm.dom.stateful import Simple NamedObject, String, DateTime, HasA4 from dm.dom.stateful import SimpleObject, SimpleNamedObject, NamedStatefulObject, StatefulObject, String, DateTime, HasA, HasMany, AggregatesMany 5 5 from dm.dom.base import DomainObjectRegister 6 6 from dm.ioc import RequiredFeature … … 24 24 25 25 26 class TemporalObjectExample(SimpleNamedObject): 26 class TemporalObjectExampleGrant(StatefulObject): 27 28 example = HasA('TemporalObjectExample', isRequired=True) 29 permission = HasA('Permission', isRequire=True) 30 31 32 class TemporalObjectExample(NamedStatefulObject): 27 33 28 34 isTemporal = True … … 30 36 title = String(default='Baby Title', isTemporal=True) 31 37 address = String(default='Baby Address', isTemporal=True) 38 person = HasA('Person', isRequired=False, isTemporal=True) 39 grants = AggregatesMany('TemporalObjectExampleGrant', 'permission', 'example', isTemporal=True) 32 40 33 41 … … 48 56 self.timepoint.reset() 49 57 50 def test_instance(self): 58 def test_title(self): 59 self.timepoint.reset() 51 60 self.instance = self.collection.create() 52 61 title1 = "Title1" … … 80 89 self.failUnlessEqual(instance.title, title4) 81 90 91 def _test_grants(self): 92 permissions = self.registry.permissions.getSortedList() 93 permission1 = permissions[0] 94 permission2 = permissions[1] 95 permission3 = permissions[2] 96 permission4 = permissions[3] 97 98 self.timepoint.reset() 99 self.instance = self.collection.create() 100 self.instance.grants.create(permission1) 101 self.instance.save() 102 revision1 = mx.DateTime.now() 103 instance = self.collection[''] 104 self.failUnless(permission1 in instance.grants) 105 self.failIf(permission2 in instance.grants) 106 self.failIf(permission3 in instance.grants) 107 self.failIf(permission4 in instance.grants) 108 sleep(1) 109 del(self.instance.grants[permission1]) 110 self.instance.grants.create(permission2) 111 self.instance.save() 112 self.instance.grants.create(permission3) 113 self.instance.save() 114 revision3 = mx.DateTime.now() 115 sleep(1) 116 self.instance.grants.create(permission4) 117 self.instance.save() 118 revision4 = mx.DateTime.now() 119 120 print "Sleeping" 121 sleep(5) 122 123 self.timepoint.reset() 124 grants = self.getGrants() 125 self.failIf(permission1 in grants, grants) 126 self.failUnless(permission2 in grants, grants) 127 self.failUnless(permission3 in grants, grants) 128 self.failUnless(permission4 in grants, grants) 129 130 self.timepoint.recorded = revision3 131 grants = self.getGrants() 132 self.failIf(permission1 in grants, grants) 133 self.failUnless(permission2 in grants, grants) 134 self.failUnless(permission3 in grants, grants) 135 self.failIf(permission4 in grants, (permission4, grants)) 136 137 self.timepoint.recorded = revision1 138 grants = self.getGrants() 139 self.failUnless(permission1 in grants, grants) 140 self.failIf(permission2 in grants, grants) 141 self.failIf(permission3 in grants, grants) 142 self.failIf(permission4 in grants, grants) 143 144 self.timepoint.recorded = revision4 145 grants = self.getGrants() 146 self.failIf(permission1 in grants, grants) 147 self.failUnless(permission2 in grants, grants) 148 self.failUnless(permission3 in grants, grants) 149 self.failUnless(permission4 in grants, grants) 150 151 self.timepoint.reset() 152 grants = self.getGrants() 153 self.failIf(permission1 in grants, grants) 154 self.failUnless(permission2 in grants, grants) 155 self.failUnless(permission3 in grants, grants) 156 self.failUnless(permission4 in grants, grants) 157 158 # Wow! 159 160 161 def getGrants(self): 162 return [i.permission for i in self.collection[''].grants] 82 163 83 164 class TestTemporalProperty(TestCase): … … 114 195 self.failUnlessEqual(self.property.getSortOnValue(), (self.property.dateCreated, self.property.id)) 115 196 116 def test_get ReferenceTime(self):197 def test_getFindTime(self): 117 198 time1 = mx.DateTime.DateTime(2003, 6, 1) 118 199 self.timepoint.recorded = time1 119 self.failUnlessEqual(self.collection.getReferenceTime(), time1) 200 self.failUnlessEqual(self.collection.getFindTime(), time1) 201 sleep(0.1) 202 self.failUnlessEqual(self.collection.getFindTime(), time1) 203 204 def test_getCreateTime(self): 205 time1 = mx.DateTime.DateTime(2003, 6, 1) 206 self.timepoint.recorded = time1 207 sleep(0.1) 208 self.failUnless(self.collection.getCreateTime() > time1) 120 209 121 210 … … 128 217 self.collection = BitemporalActual.createRegister(ownerName='parent') 129 218 self.property = None 219 self.timepoint.reset() 130 220 131 221 def tearDown(self): … … 175 265 property1.delete() 176 266 177 def test_get ReferenceTime(self):267 def test_getFindTime(self): 178 268 time1 = mx.DateTime.DateTime(2003, 6, 1) 179 269 self.timepoint.actual = time1 180 self.failUnlessEqual(self.collection.getReferenceTime(), time1) 181 270 self.failUnlessEqual(self.collection.getFindTime(), time1) 271 self.timepoint.reset() 272 self.timepoint.recorded = time1 273 self.failIfEqual(self.collection.getFindTime(), time1) 274 275 def test_getCreateTime(self): 276 time1 = mx.DateTime.DateTime(2003, 6, 1) 277 self.timepoint.actual = time1 278 self.failUnlessEqual(self.collection.getCreateTime(), time1) 279 self.timepoint.reset() 280 self.timepoint.recorded = time1 281 self.failIfEqual(self.collection.getCreateTime(), time1) 182 282 183 283 … … 262 362 # property1.delete() 263 363 264 def test_get ReferenceTime(self):364 def test_getFindTime(self): 265 365 time1 = mx.DateTime.DateTime(2003, 6, 1) 266 366 self.timepoint.recorded = time1 267 self.failUnlessEqual(self.collection.getReferenceTime(), time1) 367 self.failUnlessEqual(self.collection.getFindTime(), time1) 368 sleep(0.1) 369 self.failUnlessEqual(self.collection.getFindTime(), time1) 370 371 def test_getCreateTime(self): 372 time1 = mx.DateTime.DateTime(2003, 6, 1) 373 self.timepoint.recorded = time1 374 sleep(0.1) 375 self.failUnless(self.collection.getCreateTime() > time1) 268 376 269 377 trunk/src/dm/migrate.py
r294 r305 27 27 classData = {} 28 28 domainClass = domainClassRegister[className] 29 print "Dumping register %s" % className 29 30 # Dumping class meta data 30 31 metaClassData = {} trunk/src/dm/testunit.py
r303 r305 27 27 from dm.dom.temporaltest import Temporal 28 28 self.registry.registerDomainClass(Temporal) 29 from dm.dom.temporaltest import TemporalObjectExampleGrant 30 self.registry.registerDomainClass(TemporalObjectExampleGrant) 29 31 from dm.dom.temporaltest import TemporalObjectExample 30 32 self.registry.registerDomainClass(TemporalObjectExample)
