Changeset 299

Show
Ignore:
Timestamp:
01/31/08 16:45:34 (10 months ago)
Author:
johnbywater
Message:

Refactored temporal properties, added temporal property object and register classes.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/src/dm/db.py

    r297 r299  
    495495        for a in self.attributes: 
    496496            if a.dom.isTemporal: 
     497                # We don't persist temporal attributes on the parent. 
    497498                continue 
    498499            mapperClassAttribute = a.createMapperClassAttribute() 
     
    756757                    mapperValue = self.parent.domainObject 
    757758                    self.domainObject.parent = mapperValue 
    758                     message = "Continuing with loaded parent: %s" % ( 
    759                         self.domainObject.parent 
    760                    
    761                     logger.debug(message) 
     759                    #message = "Continuing with loaded parent: %s" % ( 
     760                    #    self.domainObject.parent 
     761                    #
     762                    #logger.debug(message) 
    762763                    continue 
    763             if metaAttr.dom.isTemporal or metaAttr.dom.isBitemporalActual: 
     764            if metaAttr.dom.isTemporal: 
     765                # We don't persist temporal attributes on the parent. 
    764766                r = metaAttr.dom.createTemporalCollection(self.domainObject) 
    765                 if metaAttr.dom.isBitemporalActual: 
    766                     r.sortOnName = 'dateCreated' 
    767                     referenceTime = timepoint.actual 
    768                     mostRecents = r.findDomainObjects( 
    769                         __loadedList__=loadedList, 
    770                         __dateCreatedOnOrBefore__=referenceTime 
    771                     ) 
    772                     mostRecent = r.findFirstDomainObject( 
    773                         __loadedList__=loadedList, 
    774                         __dateCreatedOnOrBefore__=referenceTime 
    775                     ) 
    776                     #print "LOAD: Bitemporal actual %s at %s" % ([i for i in mostRecents], referenceTime) 
    777                     if mostRecent: 
    778                         print "!!!!!! Bitemporal actuals for recorded time: %s" % timepoint.recorded 
    779                         print "" 
    780                         print [i for i in mostRecents] 
    781                         print "" 
    782                         print "!!!!!! Bitemporal latest for actual time: %s" % timepoint.actual 
    783                         print "" 
    784                         print mostRecent 
    785                         print "" 
    786                         print "!!!!!!" 
    787  
    788                 elif metaAttr.dom.isBitemporal: 
    789                     referenceTime = timepoint.recorded 
    790                     #print "LOAD: Bitemporal recorded at %s " % referenceTime 
    791                 else: 
    792                     referenceTime = timepoint.recorded 
    793                     #print "LOAD: Temporal recorded at %s" % referenceTime 
    794                 mostRecent = r.findFirstDomainObject( 
    795                     __loadedList__=loadedList, 
    796                     __dateCreatedOnOrBefore__=referenceTime 
    797                 ) 
     767                mostRecent = r.findFirstDomainObject(loadedList) 
    798768                if mostRecent: 
    799769                    mappedValue = mostRecent.recordedValue 
    800770                else: 
    801                     #print "LOAD: No record, creating initial value..." 
    802771                    mappedValue = metaAttr.dom.createInitialValue( 
    803772                        self.domainObject 
    804773                    ) 
    805                 #print "LOAD: Temporal '%s' value: %s" % (metaAttr.dom.name, mappedValue) 
    806774            elif metaAttr.isDomainObjectRef: 
    807775                mapper = getattr(self, dbName) 
     
    838806        isChanged = False 
    839807        for metaAttr in self.meta.attributes: 
    840             if metaAttr.dom.isTemporal or metaAttr.dom.isBitemporalActual: 
    841                 domValue = getattr(self.domainObject, metaAttr.domName) 
     808            domValue = getattr(self.domainObject, metaAttr.domName) 
     809            # Check value with most recent record. 
     810            if metaAttr.dom.isTemporal: 
     811                # We don't persist temporal attributes on the parent. 
    842812                r = metaAttr.dom.createTemporalCollection(self.domainObject) 
    843                 loadedList = {} 
    844                 loadedList[self.domainObject] = self.domainObject 
    845                 mostRecent = r.findFirstDomainObject(__loadedList__=loadedList) 
    846                 print "SAVE: Attribute '%s' value: %s" % (metaAttr.dom.name, domValue) 
    847                 if (r.ownerName != 'parent') or (r.owner != self.domainObject): 
    848                     msg = "r: %s %s %s" % (r, r.ownerName, r.owner) 
    849                     raise Exception, msg 
    850                 if mostRecent != None: 
    851                     print "SAVE: Recorded value: %s" % mostRecent.recordedValue 
    852                     if metaAttr.dom.isBitemporal or (domValue != mostRecent.recordedValue): 
    853                         if metaAttr.dom.isBitemporal: 
    854                             print "SAVE: Creating new bitemporal history." 
    855                             newRecorded = r.create(__loadedList__=loadedList) 
    856                             #newRecorded.parent = self.domainObject 
    857                             #newRecorded.save() 
    858                             print "SAVE: %s" % newRecorded 
    859                             actualsMeta = mostRecent.meta.attributeNames['recordedValue'] 
    860                             newActuals = actualsMeta.createTemporalCollection(newRecorded) 
    861                             print "SAVE: Copying old bitemporal actual records...." 
    862                             oldActuals = actualsMeta.createTemporalCollection(mostRecent) 
    863                             #msg = "newActuals: %s %s %s" % (newActuals, newActuals.ownerName, newActuals.owner) 
    864                             #raise Exception, msg 
    865  
    866                             for oldActual in oldActuals: 
    867                                 print "SAVE: Copying old bitemporal actual: %s" % oldActual.recordedValue 
    868                                 newActual = newActuals.create( 
    869                                     recordedValue=oldActual.recordedValue, 
    870                                     dateCreated=oldActual.dateCreated, 
    871                                     __loadedList__=loadedList 
    872                                 ) 
    873                                 print "SAVE: %s" % newActual 
    874                             print "SAVE: Setting new bitemporal actual.." 
    875                             newRecorded.recordedValue = domValue 
    876                             newRecorded.save() 
    877                         elif metaAttr.dom.isBitemporalActual: 
    878                             print "SAVE: Creating new bitemporal actual: %s" % domValue 
    879                             newActual = r.create( 
    880                                 recordedValue=domValue, 
    881                                 dateCreated=timepoint.actual, 
    882                                 __loadedList__=loadedList 
    883                             ) 
    884                             print "SAVE: %s" % newActual 
    885                         else: 
    886                             print "SAVE: Creating new temporal: %s" % domValue 
    887                             r.create( 
    888                                 recordedValue=domValue, 
    889                                 __loadedList__=loadedList 
    890                             ) 
    891                     else: 
    892                         print "SAVE: Fresh version record. No change needed." 
    893                 else: 
    894                     print "SAVE: No version record. Creating first." 
    895                     #r.ownerName = 'parent' 
    896                     #r.owner = self.domainObject 
    897                     if metaAttr.dom.isBitemporal: 
    898                         first = r.create( 
    899                             __loadedList__=loadedList 
    900                         ) 
    901                         first.recordedValue = domValue 
    902                         #first.parent = self.domainObject 
    903                         #first.save() 
    904                         print "SAVE: Created first bitemporal recorded record: %s" % first 
    905  
    906                     elif metaAttr.dom.isBitemporalActual: 
    907                         first = r.create( 
    908                             recordedValue=domValue, 
    909                             dateCreated=timepoint.actual, 
    910                             __loadedList__=loadedList 
    911                         ) 
    912                         print "SAVE: Created first bitemporal actual record: %s" % first 
    913                     else: 
    914                         first = r.create( 
    915                             recordedValue=domValue, 
    916                             __loadedList__=loadedList 
    917                         ) 
    918                         print "SAVE: Created first temporal record: %s" % first 
    919                      
     813                loadedList = {self.domainObject: self.domainObject} 
     814                mostRecent = r.findFirstDomainObject(loadedList=loadedList) 
     815                if (mostRecent==None) or (domValue!=mostRecent.recordedValue): 
     816                    r.create(recordedValue=domValue, loadedList=loadedList) 
    920817            elif metaAttr.isDomainObjectRef: 
    921                 domainObject = getattr(self.domainObject, metaAttr.domName) 
     818                domainObject = domValue 
    922819                if domainObject and hasattr(domainObject, 'record'): 
    923820                    domRecord = domainObject.record 
     
    929826                    isChanged = True 
    930827            else: 
    931                 domValue = getattr(self.domainObject, metaAttr.domName) 
    932828                dbValue = getattr(self, metaAttr.dbName) 
    933829                if domValue != dbValue: 
  • trunk/src/dm/dom/base.py

    r296 r299  
    556556        return reprAttrs 
    557557 
    558  
    559558    def getSortOnValue(self): 
    560559        if self.sortOnName: 
  • trunk/src/dm/dom/meta.py

    r297 r299  
    9696        classAttrs = { 
    9797            'meta': self, 
    98             'isUnique': self.isUnique, 
    99             'isCached': self.isCached, 
    10098        } 
    10199        return self.createClass(className, baseClass, classAttrs) 
     
    176174    def setTemporalDomainClass(self, domainClass): 
    177175        self.temporalDomainClass = domainClass 
    178         self.temporalDomainClass.registerKeyName = 'id' 
    179         self.temporalDomainClass.isUnique = False 
    180         self.temporalDomainClass.isCached = True 
    181         if self.isBitemporalActual: 
    182             self.temporalDomainClass.sortOnName = 'dateCreated' 
    183         else: 
    184             self.temporalDomainClass.sortOnName = 'id' 
    185         self.temporalDomainClass.sortAscending = False 
    186176 
    187177    def createTemporalCollection(self, domainObject): 
    188178        if not domainObject: 
    189179            raise Exception, "Need a domain object! %s" % domainObject 
    190         register = self.temporalDomainClass.createRegister() 
    191         register.owner = domainObject 
    192         register.ownerName = 'parent' 
     180        register = self.temporalDomainClass.createRegister( 
     181            ownerName='parent', 
     182            owner=domainObject, 
     183            metaAttr=self 
     184        ) 
    193185        return register 
    194186         
     
    259251    def duplicateTemporal(self): 
    260252        attrMeta = self.duplicateSelf() 
    261         # Not bitemporal ATM. Just an idea for 'stepping down' the temporal:  
    262253        if self.isBitemporal: 
    263              attrMeta.isTemporal = True 
    264254             attrMeta.isBitemporal = False 
    265255             attrMeta.isBitemporalActual = True 
     256             attrMeta.isTemporal = True 
    266257        else: 
    267258             attrMeta.isTemporal = False 
  • trunk/src/dm/dom/registry.py

    r297 r299  
    22from dm.dom.base import * 
    33from dm.dom.stateful import * 
     4from dm.dom.temporal import TemporalProperty, BitemporalProperty, BitemporalActual 
    45from dm.ioc import *  
    56from dm.exceptions import *  
     
    1516        self.domainClassRegister = None 
    1617        self.backgroundObjectCache = [] 
    17  
    18     def registerCoreDomainClasses(self): 
    19         pass 
    20           
    21     def loadBackgroundObjects(self): 
    22         "Creates and caches refs to all background domain objects." 
    23         pass 
    24          
    25     def retrieveItem(self, key): 
    26         return getattr(self, key) 
    27  
    28     def createDomainClass(self, metaDomainObject): 
    29         baseClass = DomainObject 
    30         domainClass = metaDomainObject.createDomainClass(baseClass) 
    31         self.registerDomainClass(domainClass) 
    32         return domainClass 
    33  
    34     def getDomainClassRegister(self): 
    35         if not self.domainClassRegister: 
    36             self.domainClassRegister = DomainClassRegister() 
    37         return self.domainClassRegister 
    38  
    39     def isDomainClassRegistered(self, className): 
    40         if className.__class__.__name__ != 'str': 
    41             message = 'className is not a str: %s' % str(className) 
    42             raise Exception, message 
    43         classRegister = self.getDomainClassRegister() 
    44         return className in classRegister 
    45      
    46     def getDomainClass(self, className): 
    47         classRegister = self.getDomainClassRegister() 
    48         if not className in classRegister: 
    49             raise Exception, "Domain class '%s' is not defined." % className 
    50         return classRegister[className] 
    5118 
    5219    def registerDomainClass(self, domainClass): 
     
    8552            self.checkHasAsForHasManys(classRegister[name]) 
    8653        temporalAttrs = [] 
    87         for a in domainClass.meta.attributes: 
    88             if a.isTemporal: 
    89                 temporalMeta = domainClass.meta 
    90                 if a.isBitemporal: 
    91                     new = self.createBitemporalDomainClass(temporalMeta, a) 
    92                 else: 
    93                     new = self.createTemporalDomainClass(temporalMeta, a) 
    94                 a.setTemporalDomainClass(new) 
    95  
    96     def createBitemporalDomainClass(self, classMeta, attrMeta): 
    97         temporalClassName = self.createTemporalDomainClassName(classMeta.name, attrMeta.name) 
    98         temporalMetaObject = DomainObject.metaClass(temporalClassName) 
    99         temporalMetaObject.recordedValue = attrMeta.duplicateTemporal() 
    100         temporalMetaObject.parent = HasA(classMeta.name, isRequired=True) 
    101         temporalMetaObject.dateCreated = DateTime(isIndexed=True, 
    102             isRequired=True, default=mx.DateTime.now) 
    103         temporalMetaObject.isUnique = False 
    104         temporalMetaObject.isCached = True 
    105         return self.createDomainClass(temporalMetaObject) 
    106  
    107     def createTemporalDomainClass(self, classMeta, attrMeta): 
    108         temporalClassName = self.createTemporalDomainClassName(classMeta.name, attrMeta.name) 
    109         temporalMetaObject = DomainObject.metaClass(temporalClassName) 
    110         temporalMetaObject.recordedValue = attrMeta.duplicateTemporal() 
    111         temporalMetaObject.parent = HasA(classMeta.name, isRequired=True) 
    112         temporalMetaObject.dateCreated = DateTime(isIndexed=True, 
    113             isRequired=True, default=mx.DateTime.now) 
    114         temporalMetaObject.isUnique = False 
    115         temporalMetaObject.isCached = True 
    116         return self.createDomainClass(temporalMetaObject) 
    117  
    118     def createTemporalDomainClassName(self, className, attrName): 
    119         return className + '_t_' + attrName 
     54        for attrMeta in domainClass.meta.attributes: 
     55            if attrMeta.isTemporal: 
     56                parentMeta = domainClass.meta 
     57                self.generateTemporalClass(parentMeta, attrMeta) 
     58 
     59    def getDomainClassRegister(self): 
     60        if not self.domainClassRegister: 
     61            self.domainClassRegister = DomainClassRegister() 
     62        return self.domainClassRegister 
     63 
     64    def registerCoreDomainClasses(self): 
     65        pass 
     66          
     67    def loadBackgroundObjects(self): 
     68        "Creates and caches refs to all background domain objects." 
     69        pass 
     70         
     71    def retrieveItem(self, key): 
     72        return getattr(self, key) 
     73 
     74    def createDomainClass(self, metaDomainObject, baseClass=DomainObject): 
     75        domainClass = metaDomainObject.createDomainClass(baseClass) 
     76        self.registerDomainClass(domainClass) 
     77        return domainClass 
     78 
     79    def isDomainClassRegistered(self, className): 
     80        if className.__class__.__name__ != 'str': 
     81            message = 'className is not a str: %s' % str(className) 
     82            raise Exception, message 
     83        classRegister = self.getDomainClassRegister() 
     84        return className in classRegister 
     85     
     86    def getDomainClass(self, className): 
     87        classRegister = self.getDomainClassRegister() 
     88        if not className in classRegister: 
     89            raise Exception, "Domain class '%s' is not defined." % className 
     90        return classRegister[className] 
     91 
     92    def generateTemporalClass(self, parentMeta, attrMeta): 
     93        if attrMeta.isBitemporalActual: 
     94            temporalBase = BitemporalActual 
     95        elif attrMeta.isBitemporal: 
     96            temporalBase = BitemporalProperty 
     97        else: 
     98            temporalBase = TemporalProperty 
     99        temporalClassName = "%s_tmpr_%s" % (parentMeta.name, attrMeta.name) 
     100        temporalMeta = temporalBase.metaClass(temporalClassName) 
     101        temporalMeta.recordedValue = attrMeta.duplicateTemporal() 
     102        temporalMeta.parent = HasA(parentMeta.name, isRequired=True) 
     103        temporalClass = self.createDomainClass(temporalMeta, temporalBase) 
     104        attrMeta.setTemporalDomainClass(temporalClass) 
    120105 
    121106    def setMetaAttributesFromClass(self, domainClass, domainClassMeta): 
  • trunk/src/dm/dom/temporaltest.py

    r297 r299  
    77import mx.DateTime 
    88from time import sleep 
    9 from dm.dom.temporal import TemporalProperty, BitemporalProperty 
    10 from dm.dom.temporal import TemporalCollection, BitemporalCollection 
     9from dm.dom.temporal import TemporalProperty, BitemporalProperty, BitemporalActual 
     10from dm.dom.temporal import TemporalCollection, BitemporalCollection, BitemporalActualCollection 
    1111 
    1212def suite(): 
     
    1414        unittest.makeSuite(TestTemporal),  # Example 
    1515        unittest.makeSuite(TestTemporalProperty), 
     16        unittest.makeSuite(TestBitemporalActual), 
    1617        unittest.makeSuite(TestBitemporalProperty), 
    1718    ] 
     
    3435class TestTemporalProperty(TestCase): 
    3536 
     37    timepoint = RequiredFeature('Timepoint') 
     38 
    3639    def setUp(self): 
    3740        super(TestTemporalProperty, self).setUp() 
    38         self.collection = TemporalProperty.createRegister() 
     41        self.collection = TemporalProperty.createRegister(ownerName='parent') 
     42        self.property = None 
    3943 
    4044    def tearDown(self): 
     45        self.timepoint.reset() 
    4146        self.collection = None 
     47        if self.property: 
     48            self.property.delete() 
    4249 
    4350    def test_collection(self): 
    4451        self.failUnlessEqual(type(self.collection), TemporalCollection) 
     52        self.failUnlessEqual(self.collection.ownerName, 'parent') 
     53        self.failUnlessEqual(self.collection.isCached, True) 
     54        self.failUnlessEqual(self.collection.getDomainClass(), TemporalProperty) 
     55        self.failUnlessEqual(TemporalProperty.isUnique, False) 
     56        self.failUnlessEqual(TemporalProperty.isConstant, True) 
     57        self.failUnlessEqual(TemporalProperty.registerKeyName, 'id') 
     58        self.failUnlessEqual(TemporalProperty.sortOnName, 'id') 
     59        self.failUnlessEqual(TemporalProperty.sortAscending, False) 
     60 
     61    def test_instance(self): 
     62        self.property = self.collection.create(recordedValue='') 
     63        self.failUnless(self.property.dateCreated) 
     64        self.failUnlessEqual(self.property.getSortOnValue(), self.property.id) 
     65 
     66    def test_getReferenceTime(self): 
     67        time1 = mx.DateTime.DateTime(2003, 6, 1) 
     68        self.timepoint.recorded = time1 
     69        self.failUnlessEqual(self.collection.getReferenceTime(), time1) 
     70 
     71 
     72class TestBitemporalActual(TestCase): 
     73 
     74    timepoint = RequiredFeature('Timepoint') 
     75 
     76    def setUp(self): 
     77        super(TestBitemporalActual, self).setUp() 
     78        self.collection = BitemporalActual.createRegister(ownerName='parent') 
     79        self.property = None 
     80 
     81    def tearDown(self): 
     82        self.timepoint.reset() 
     83        self.collection = None 
     84        if self.property: 
     85            self.property.delete() 
     86 
     87    def test_collection(self): 
     88        self.failUnlessEqual(type(self.collection), BitemporalActualCollection) 
     89        self.failUnlessEqual(self.collection.ownerName, 'parent') 
     90        self.failUnlessEqual(self.collection.isCached, True) 
     91        self.failUnlessEqual(self.collection.getDomainClass(), BitemporalActual) 
     92        self.failUnlessEqual(BitemporalActual.isUnique, False) 
     93        self.failUnlessEqual(BitemporalActual.isConstant, True) 
     94        self.failUnlessEqual(BitemporalActual.registerKeyName, 'id') 
     95        self.failUnlessEqual(BitemporalActual.sortOnName, 'dateCreated') 
     96        self.failUnlessEqual(BitemporalActual.sortAscending, False) 
     97 
     98    def test_instance(self): 
     99        time1 = mx.DateTime.DateTime(2003, 6, 1) 
     100        time2 = mx.DateTime.DateTime(2003, 7, 1) 
     101        time3 = mx.DateTime.DateTime(2003, 8, 1) 
     102        time4 = mx.DateTime.DateTime(2003, 8, 1) 
     103        property1 = self.collection.create(dateCreated=time1, recordedValue="1") 
     104        property2 = self.collection.create(dateCreated=time3, recordedValue="2") 
     105        property3 = self.collection.create(dateCreated=time2, recordedValue="3") 
     106        property4 = None 
     107        try: 
     108            self.failUnless(property1.dateCreated) 
     109            self.failUnlessEqual(property1.getSortOnValue(), (property1.dateCreated, property1.id)) 
     110            sortedList = self.collection.findDomainObjects() 
     111            self.failUnlessEqual(sortedList, [property2, property3, property1]) 
     112            self.failUnlessEqual(sortedList[0].dateCreated, time3) 
     113            self.failUnlessEqual(sortedList[1].dateCreated, time2) 
     114            self.failUnlessEqual(sortedList[2].dateCreated, time1) 
     115            self.failUnlessEqual(sortedList[0].recordedValue, "2") 
     116            property4 = self.collection.create(dateCreated=time3, recordedValue="4") 
     117            sortedList = self.collection.findDomainObjects() 
     118            self.failUnlessEqual(sortedList[0].dateCreated, time3) 
     119            self.failUnlessEqual(sortedList[0].recordedValue, "4", sortedList) 
     120        finally: 
     121            if property4: 
     122                property4.delete() 
     123            property3.delete() 
     124            property2.delete() 
     125            property1.delete() 
     126 
     127    def test_getReferenceTime(self): 
     128        time1 = mx.DateTime.DateTime(2003, 6, 1) 
     129        self.timepoint.actual = time1 
     130        self.failUnlessEqual(self.collection.getReferenceTime(), time1) 
    45131         
    46          
     132 
     133 
    47134class TestBitemporalProperty(TestCase): 
     135 
     136    timepoint = RequiredFeature('Timepoint') 
    48137 
    49138    def setUp(self): 
    50139        super(TestBitemporalProperty, self).setUp() 
    51         self.collection = BitemporalProperty.createRegister(
     140        self.collection = BitemporalProperty.createRegister(ownerName='parent'
    52141 
    53142    def tearDown(self): 
     143        self.timepoint.reset() 
    54144        self.collection = None 
    55145 
    56146    def test_collection(self): 
    57147        self.failUnlessEqual(type(self.collection), BitemporalCollection) 
    58          
    59          
     148        self.failUnlessEqual(self.collection.ownerName, 'parent') 
     149        self.failUnlessEqual(self.collection.isCached, True) 
     150        self.failUnlessEqual(self.collection.getDomainClass(), BitemporalProperty) 
     151        self.failUnlessEqual(TemporalProperty.isUnique, False) 
     152        self.failUnlessEqual(TemporalProperty.isConstant, True) 
     153        self.failUnlessEqual(TemporalProperty.registerKeyName, 'id') 
     154        self.failUnlessEqual(TemporalProperty.sortOnName, 'id') 
     155        self.failUnlessEqual(TemporalProperty.sortAscending, False) 
     156 
     157    def test_instance(self): 
     158        time1 = mx.DateTime.DateTime(2003, 6, 1) 
     159        time2 = mx.DateTime.DateTime(2003, 7, 1) 
     160        time3 = mx.DateTime.DateTime(2003, 8, 1) 
     161        time4 = mx.DateTime.DateTime(2003, 8, 1) 
     162#        property1 = self.collection.create(recordedValue="1") 
     163#        property2 = self.collection.create(recordedValue="2") 
     164#        property3 = self.collection.create(recordedValue="3") 
     165#        property4 = None 
     166#        try: 
     167#            self.failUnless(property1.dateCreated) 
     168#            self.failUnlessEqual(property1.getSortOnValue(), (property1.id)) 
     169#            sortedList = self.collection.findDomainObjects() 
     170#            self.failUnlessEqual(sortedList, [property3, property2, property1]) 
     171#            self.failUnlessEqual(sortedList[0].recordedValue, "3") 
     172#            property4 = self.collection.create(recordedValue="4") 
     173#            sortedList = self.collection.findDomainObjects() 
     174#            self.failUnlessEqual(sortedList[0].recordedValue, "4", sortedList) 
     175#        finally: 
     176#            if property4: 
     177#                property4.delete() 
     178#            property3.delete() 
     179#            property2.delete() 
     180#            property1.delete() 
     181 
     182    def test_instance_actualtime_changes(self): 
     183        time1 = mx.DateTime.DateTime(2003, 6, 1) 
     184        time2 = mx.DateTime.DateTime(2003, 7, 1) 
     185        time3 = mx.DateTime.DateTime(2003, 8, 1) 
     186        time4 = mx.DateTime.DateTime(2003, 8, 1) 
     187#        property1 = self.collection.create() 
     188#        property1.recordedValue = "1" 
     189#        property1.save() 
     190#        self.timepoint.actual = time1 
     191#        property2 = self.collection.create(recordedValue="2") 
     192#        property3 = self.collection.create(recordedValue="3") 
     193#        property4 = None 
     194#        try: 
     195#            self.failUnless(property1.dateCreated) 
     196#            self.failUnlessEqual(property1.getSortOnValue(), (property1.dateCreated, property1.id)) 
     197#            sortedList = self.collection.findDomainObjects() 
     198#            self.failUnlessEqual(sortedList, [property2, property3, property1]) 
     199#            self.failUnlessEqual(sortedList[0].dateCreated, time3) 
     200#            self.failUnlessEqual(sortedList[1].dateCreated, time2) 
     201#            self.failUnlessEqual(sortedList[2].dateCreated, time1) 
     202#            self.failUnlessEqual(sortedList[0].recordedValue, "2") 
     203#            property4 = self.collection.create(dateCreated=time3, recordedValue="4") 
     204#            sortedList = self.collection.findDomainObjects() 
     205#            self.failUnlessEqual(sortedList[0].dateCreated, time3) 
     206#            self.failUnlessEqual(sortedList[0].recordedValue, "4", sortedList) 
     207#        finally: 
     208#            if property4: 
     209#                property4.delete() 
     210#            property3.delete() 
     211#            property2.delete() 
     212#            property1.delete() 
     213 
     214    def test_getReferenceTime(self): 
     215        time1 = mx.DateTime.DateTime(2003, 6, 1) 
     216        self.timepoint.recorded = time1 
     217        self.failUnlessEqual(self.collection.getReferenceTime(), time1) 
    60218 
    61219 
     
    159317        temporal.haircolor = haircolor2 
    160318        temporal.save() 
    161         print "Sleeping now!" 
    162         import time 
    163         time.sleep(5) 
    164319        #  - check present is most recent 
    165320        self.timepoint.reset() 
     
    209364        self.timepoint.reset() 
    210365        temporal = self.temporals[self.fixtureName] 
    211         print "Sleeping... %s" % temporal.haircolor 
    212         sleep(5) 
    213366        self.failUnlessEqual(temporal.haircolor, haircolor3) 
    214367        self.timepoint.actual = yearsAgo 
     
    221374        self.timepoint.actual = yearsAgo 
    222375        temporal = self.temporals[self.fixtureName] 
    223         self.failUnlessEqual(temporal.haircolor, '') 
     376        self.failUnlessEqual(temporal.haircolor, 'My Natural Color') 
    224377        self.timepoint.reset() 
    225378        self.timepoint.recorded = revisionTime 
  • trunk/src/dm/testunit.py

    r296 r299  
    2828        self.registry.registerDomainClass(Temporal) 
    2929        self.registry.temporals = Temporal.createRegister() 
     30        from dm.dom.temporal import TemporalProperty, BitemporalProperty, BitemporalActual 
     31        self.registry.registerDomainClass(TemporalProperty) 
     32        self.registry.registerDomainClass(BitemporalProperty) 
     33        self.registry.registerDomainClass(BitemporalActual) 
    3034 
    3135 
  • trunk/src/dm/timepoint.py

    r296 r299  
    3838        return mx.DateTime.now() 
    3939 
     40    def isActualPresent(self): 
     41        return (self._actual == None) 
     42 
  • trunk/src/dm/timepointtest.py

    r296 r299  
    1919 
    2020    def tearDown(self): 
     21        self.timepoint.reset() 
    2122        self.timepoint = None 
    2223 
     
    4546        self.failUnless(now2 > now1) 
    4647 
     48    def test_isActualNow(self): 
     49        self.timepoint.reset() 
     50        self.failUnless(self.timepoint.isActualPresent()) 
     51        self.timepoint.actual = self.lastweek 
     52        self.failIf(self.timepoint.isActualPresent()) 
     53        self.timepoint.reset() 
     54        self.failUnless(self.timepoint.isActualPresent()) 
     55         
    4756 
    4857 
     58 
     59