[CalendarServer-changes] [2298]
CalendarServer/branches/propfind-cache/twistedcaldav
source_changes at macosforge.org
source_changes at macosforge.org
Thu Apr 10 15:59:13 PDT 2008
Revision: 2298
http://trac.macosforge.org/projects/calendarserver/changeset/2298
Author: dreid at apple.com
Date: 2008-04-10 15:59:12 -0700 (Thu, 10 Apr 2008)
Log Message:
-----------
Refactor so changed returns a deferred, add test for the CalDAVFile implementation of changed which calls updateCTag then delegates to parent.
Modified Paths:
--------------
CalendarServer/branches/propfind-cache/twistedcaldav/resource.py
CalendarServer/branches/propfind-cache/twistedcaldav/static.py
CalendarServer/branches/propfind-cache/twistedcaldav/test/test_resource.py
CalendarServer/branches/propfind-cache/twistedcaldav/test/test_static.py
Modified: CalendarServer/branches/propfind-cache/twistedcaldav/resource.py
===================================================================
--- CalendarServer/branches/propfind-cache/twistedcaldav/resource.py 2008-04-10 21:10:30 UTC (rev 2297)
+++ CalendarServer/branches/propfind-cache/twistedcaldav/resource.py 2008-04-10 22:59:12 UTC (rev 2298)
@@ -507,6 +507,9 @@
Locates the parent resource of the resource with the given URI.
@param request: an L{IRequest} object for the request being processed.
@param uri: the URI whose parent resource is desired.
+
+ @return: A L{Deferred} that fires with an L{IResource} provider that is
+ the parent of the current URL.
"""
return request.locateResource(parentForURL(uri))
@@ -522,13 +525,20 @@
@param properties: A C{bool} indicating that properties on C{uri} have
changed.
@param data: A C{bool} indicating that data at C{uri} has changed.
+
+ @return: A L{Deferred} that fires with None.
"""
- return self.locateParent(request, uri).changed(request,
- uri,
- properties=properties,
- data=data)
+ def _gotParentResource(resource):
+ return resource.changed(request,
+ uri,
+ properties=properties,
+ data=data)
+ d = self.locateParent(request, uri)
+ d.addCallback(_gotParentResource)
+ return d
+
class CalendarPrincipalCollectionResource (DAVPrincipalCollectionResource, CalDAVResource):
"""
CalDAV principal collection.
Modified: CalendarServer/branches/propfind-cache/twistedcaldav/static.py
===================================================================
--- CalendarServer/branches/propfind-cache/twistedcaldav/static.py 2008-04-10 21:10:30 UTC (rev 2297)
+++ CalendarServer/branches/propfind-cache/twistedcaldav/static.py 2008-04-10 22:59:12 UTC (rev 2298)
@@ -288,6 +288,16 @@
assert self.isCollection()
self.writeDeadProperty(customxml.GETCTag(str(datetime.datetime.now())))
+ def changed(self, request, uri, properties=False, data=False):
+ if self.isCollection() and data:
+ self.updateCTag()
+
+ return super(CalDAVFile, self).changed(
+ request,
+ uri,
+ properties=properties,
+ data=data)
+
##
# Quota
##
@@ -585,8 +595,8 @@
self.writeDeadProperty(
CacheTokensProperty.fromString('%s:%s' % (propToken, dataToken)))
+ return succeed(None)
-
class ScheduleFile (AutoProvisioningFileMixIn, CalDAVFile):
def __init__(self, path, parent):
super(ScheduleFile, self).__init__(path, principalCollections=parent.principalCollections())
Modified: CalendarServer/branches/propfind-cache/twistedcaldav/test/test_resource.py
===================================================================
--- CalendarServer/branches/propfind-cache/twistedcaldav/test/test_resource.py 2008-04-10 21:10:30 UTC (rev 2297)
+++ CalendarServer/branches/propfind-cache/twistedcaldav/test/test_resource.py 2008-04-10 22:59:12 UTC (rev 2298)
@@ -21,6 +21,7 @@
from twisted.trial.unittest import TestCase
from twistedcaldav.resource import CalDAVResource
+from twisted.internet.defer import succeed
class StubLocatingRequest(object):
"""
@@ -31,7 +32,7 @@
self.resources = resources or {}
def locateResource(self, uri):
- return self.resources.get(uri)
+ return succeed(self.resources.get(uri))
@@ -45,6 +46,7 @@
def changed(self, *args, **kwargs):
self.changedArgs = args
self.changedKwArgs = kwargs
+ return succeed(None)
class ChangedNotificationTestCase(TestCase):
@@ -59,30 +61,33 @@
self.myCalendar = CalDAVResource()
self.myCalendarURI = '/calendars/users/dreid/calendar'
+
def _test(self, changedArgs, changedKwargs,
expectedArgs, expectedKwargs):
- self.myCalendar.changed(*changedArgs, **changedKwargs)
+ def _ranTest(result):
+ self.assertEquals(self.calendarHome.changedArgs,
+ expectedArgs)
+ self.assertEquals(self.calendarHome.changedKwArgs,
+ expectedKwargs)
- self.assertEquals(self.calendarHome.changedArgs,
- expectedArgs)
- self.assertEquals(self.calendarHome.changedKwArgs,
- expectedKwargs)
+ d = self.myCalendar.changed(*changedArgs, **changedKwargs)
+ d.addCallback(_ranTest)
+ return d
-
def test_notifiesParentResource(self):
- self._test((self.request, self.myCalendarURI),
- {},
- (self.request, self.myCalendarURI),
- {'properties': False, 'data': False})
+ return self._test((self.request, self.myCalendarURI),
+ {},
+ (self.request, self.myCalendarURI),
+ {'properties': False, 'data': False})
def test_propertiesChanged(self):
- self._test((self.request, self.myCalendarURI),
- {'properties': True},
- (self.request, self.myCalendarURI),
- {'properties': True, 'data': False})
+ return self._test((self.request, self.myCalendarURI),
+ {'properties': True},
+ (self.request, self.myCalendarURI),
+ {'properties': True, 'data': False})
def test_dataChanged(self):
- self._test((self.request, self.myCalendarURI),
- {'data': True},
- (self.request, self.myCalendarURI),
- {'properties': False, 'data': True})
+ return self._test((self.request, self.myCalendarURI),
+ {'data': True},
+ (self.request, self.myCalendarURI),
+ {'properties': False, 'data': True})
Modified: CalendarServer/branches/propfind-cache/twistedcaldav/test/test_static.py
===================================================================
--- CalendarServer/branches/propfind-cache/twistedcaldav/test/test_static.py 2008-04-10 21:10:30 UTC (rev 2297)
+++ CalendarServer/branches/propfind-cache/twistedcaldav/test/test_static.py 2008-04-10 22:59:12 UTC (rev 2298)
@@ -24,9 +24,13 @@
from twistedcaldav.test.test_resource import StubParentResource
from twistedcaldav.static import CalendarHomeFile
+from twistedcaldav.static import CalDAVFile
from twistedcaldav.static import CacheTokensProperty
+from twistedcaldav.customxml import GETCTag
+
from twisted.web2.http import HTTPError, StatusResponse
+
class InMemoryPropertyStore(object):
def __init__(self, resource):
self.resource = resource
@@ -57,6 +61,10 @@
class CalendarHomeChangedTests(TestCase):
+ """
+ Ensure that CalendarHomeFile's changed method updates the cache tokens when
+ called.
+ """
def setUp(self):
self.parent = StubParentResource()
self.parent.principalCollections = (lambda: [])
@@ -80,34 +88,95 @@
def test_doesntPropogateToParent(self):
- self.myCalendarHome.changed(self.request, '/calendars/users/dreid')
- self.assertEquals(self.parent.changedArgs, None)
- self.assertEquals(self.parent.changedKwArgs, None)
+ def _checkChanged(result):
+ self.assertEquals(self.parent.changedArgs, None)
+ self.assertEquals(self.parent.changedKwArgs, None)
+ self.assertEquals(result, None)
+ d = self.myCalendarHome.changed(self.request, '/calendars/users/dreid')
+ d.addCallback(_checkChanged)
+ return d
def _test(self, properties=False, data=False, expectedTokens=None):
- self.myCalendarHome.changed(self.request, '/calendars/users/dreid',
+ def _checkChanged(result):
+ tokens = self.properties._properties[CacheTokensProperty.qname()]
+ self.assertEquals(tokens.children[0].data, expectedTokens)
+ self.assertEquals(result, None)
+
+ d = self.myCalendarHome.changed(self.request, '/calendars/users/dreid',
properties=properties, data=data)
+ d.addCallback(_checkChanged)
+ return d
- tokens = self.properties._properties[CacheTokensProperty.qname()]
- self.assertEquals(tokens.children[0].data, expectedTokens)
-
-
def test_changesPropertyToken(self):
- self._test(properties=True, expectedTokens='propertyToken1:dataToken0')
+ return self._test(properties=True,
+ expectedTokens='propertyToken1:dataToken0')
def test_changesDataToken(self):
- self._test(data=True, expectedTokens='propertyToken0:dataToken1')
+ return self._test(data=True, expectedTokens='propertyToken0:dataToken1')
def test_changesBothTokens(self):
- self._test(properties=True, data=True,
+ return self._test(properties=True, data=True,
expectedTokens='propertyToken1:dataToken1')
def test_initializesNonExistantProperty(self):
self.properties._properties = {}
self.myCalendarHome._called = [0,0]
- self._test(properties=False, data=False,
- expectedTokens='propertyToken0:dataToken0')
+ return self._test(properties=False, data=False,
+ expectedTokens='propertyToken0:dataToken0')
+
+
+
+class CalDAVFileChangedTests(TestCase):
+ """
+ Ensure that CalDAVFile's changed method updates the ctag on collections
+ and delegates to the parent.
+ """
+ def setUp(self):
+ self.parent = StubParentResource()
+ self.parent.principalCollections = (lambda: [])
+ self.request = StubLocatingRequest({'/calendars/users/': self.parent})
+
+ self.myCalDAVFile = CalDAVFile(self.mktemp())
+ self.properties = InMemoryPropertyStore(self.myCalDAVFile)
+ self.myCalDAVFile._dead_properties = self.properties
+
+
+ def test_propogatesToParent(self):
+ def _checkParentChanged(result):
+ self.assertEquals(self.parent.changedArgs,
+ (self.request, '/calendars/users/dreid'))
+ self.assertEquals(self.parent.changedKwArgs,
+ {'properties': False, 'data': False})
+
+ d = self.myCalDAVFile.changed(self.request, '/calendars/users/dreid')
+ d.addCallback(_checkParentChanged)
+ return d
+
+
+ def test_updatesCTagOnCollection(self):
+ def _checkCTag(result):
+ ctag = self.properties._properties.get(GETCTag.qname())
+ self.failUnless(isinstance(ctag, GETCTag))
+
+ self.myCalDAVFile.isCollection = (lambda: True)
+ d = self.myCalDAVFile.changed(self.request, '/calendars/users/dreid',
+ data=True)
+ d.addCallback(_checkCTag)
+ return d
+
+
+ def test_doesNotUpdateCTagOnNonCollection(self):
+ self.myCalDAVFile.isCollection = (lambda: False)
+ d = self.myCalDAVFile.changed(self.request, '/calendars/users/dreid')
+ return d
+
+
+ def test_doesNotUpdateCTagOnPropertyChange(self):
+ self.myCalDAVFile.isCollection = (lambda: True)
+ d = self.myCalDAVFile.changed(self.request, '/calendars/users/dreid',
+ properties=True)
+ return d
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20080410/e2acca1c/attachment-0001.html
More information about the calendarserver-changes
mailing list