[CalendarServer-changes] [6482] CalendarServer/trunk

source_changes at macosforge.org source_changes at macosforge.org
Thu Oct 28 13:39:24 PDT 2010


Revision: 6482
          http://trac.macosforge.org/projects/calendarserver/changeset/6482
Author:   wsanchez at apple.com
Date:     2010-10-28 13:39:22 -0700 (Thu, 28 Oct 2010)
Log Message:
-----------
Rename memoized to memoizedKey and move it to twext.

Modified Paths:
--------------
    CalendarServer/trunk/txdav/common/datastore/sql.py

Added Paths:
-----------
    CalendarServer/trunk/twext/internet/decorate.py

Removed Paths:
-------------
    CalendarServer/trunk/txdav/base/datastore/sql.py

Added: CalendarServer/trunk/twext/internet/decorate.py
===================================================================
--- CalendarServer/trunk/twext/internet/decorate.py	                        (rev 0)
+++ CalendarServer/trunk/twext/internet/decorate.py	2010-10-28 20:39:22 UTC (rev 6482)
@@ -0,0 +1,114 @@
+##
+# Copyright (c) 2010 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+
+"""
+Decorators.
+"""
+
+__all__ = [
+    "memoizedKey",
+]
+
+
+from inspect import getargspec
+
+from twisted.internet.defer import Deferred, succeed
+
+
+def memoizedKey(keyArgument, memoAttribute, deferredResult=True):
+    """
+    Decorator which memoizes the result of a method on that method's instance.
+
+    @param keyArgument: The name of the "key" argument.
+    @type keyArgument: C{str}
+
+    @param memoAttribute: The name of the attribute on the instance which
+        should be used for memoizing the result of this method; the attribute
+        itself must be a dictionary.
+    @type memoAttribute: C{str}
+
+    @param deferredResult: Whether the result must be a deferred.
+    @type keyArgument: C{bool}
+    """
+
+    def getarg(argname, argspec, args, kw):
+        """
+        Get an argument from some arguments.
+
+        @param argname: The name of the argument to retrieve.
+
+        @param argspec: The result of L{inspect.getargspec}.
+
+        @param args: positional arguments passed to the function specified by
+            argspec.
+
+        @param kw: keyword arguments passed to the function specified by
+            argspec.
+
+        @return: The value of the argument named by 'argname'.
+        """
+        argnames = argspec[0]
+        try:
+            argpos = argnames.index(argname)
+        except ValueError:
+            argpos = None
+        if argpos is not None:
+            if len(args) > argpos:
+                return args[argpos]
+        if argname in kw:
+            return kw[argname]
+        else:
+            raise TypeError("could not find key argument %r in %r/%r (%r)" %
+                (argname, args, kw, argpos)
+            )
+
+    def decorate(thunk):
+        # cheater move to try to get the right argspec from inlineCallbacks.
+        # This could probably be more robust, but the 'cell_contents' thing
+        # probably can't (that's the only real reference to the underlying
+        # function).
+        if thunk.func_code.co_name == "unwindGenerator":
+            specTarget = thunk.func_closure[0].cell_contents
+        else:
+            specTarget = thunk
+        spec = getargspec(specTarget)
+
+        def outer(*a, **kw):
+            self = a[0]
+            memo = getattr(self, memoAttribute)
+            key = getarg(keyArgument, spec, a, kw)
+            if key in memo:
+                memoed = memo[key]
+                if deferredResult:
+                    return succeed(memoed)
+                else:
+                    return memoed
+            result = thunk(*a, **kw)
+
+            if isinstance(result, Deferred):
+                def memoResult(finalResult):
+                    if finalResult is not None:
+                        memo[key] = finalResult
+                    return finalResult
+                result.addCallback(memoResult)
+            elif result is not None:
+                memo[key] = result
+
+            return result
+
+        return outer
+
+    return decorate

Deleted: CalendarServer/trunk/txdav/base/datastore/sql.py
===================================================================
--- CalendarServer/trunk/txdav/base/datastore/sql.py	2010-10-28 20:35:50 UTC (rev 6481)
+++ CalendarServer/trunk/txdav/base/datastore/sql.py	2010-10-28 20:39:22 UTC (rev 6482)
@@ -1,101 +0,0 @@
-##
-# Copyright (c) 2010 Apple Inc. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-##
-
-"""
-Logic common to SQL implementations.
-"""
-
-from twisted.internet.defer import Deferred, succeed
-from inspect import getargspec
-
-def _getarg(argname, argspec, args, kw):
-    """
-    Get an argument from some arguments.
-
-    @param argname: The name of the argument to retrieve.
-
-    @param argspec: The result of L{inspect.getargspec}.
-
-    @param args: positional arguments passed to the function specified by
-        argspec.
-
-    @param kw: keyword arguments passed to the function specified by
-        argspec.
-
-    @return: The value of the argument named by 'argname'.
-    """
-    argnames = argspec[0]
-    try:
-        argpos = argnames.index(argname)
-    except ValueError:
-        argpos = None
-    if argpos is not None:
-        if len(args) > argpos:
-            return args[argpos]
-    if argname in kw:
-        return kw[argname]
-    else:
-        raise TypeError("could not find key argument %r in %r/%r (%r)" %
-            (argname, args, kw, argpos)
-        )
-
-
-
-def memoized(keyArgument, memoAttribute, deferredResult=True):
-    """
-    Decorator which memoizes the result of a method on that method's instance.
-
-    @param keyArgument: The name of the 'key' argument.
-    @type keyArgument: C{str}
-
-    @param memoAttribute: The name of the attribute on the instance which
-        should be used for memoizing the result of this method; the attribute
-        itself must be a dictionary.
-    @type memoAttribute: C{str}
-
-    @param deferredResult: Whether the result must be a deferred.
-    @type keyArgument: C{bool}
-
-    """
-    def decorate(thunk):
-        # cheater move to try to get the right argspec from inlineCallbacks.
-        # This could probably be more robust, but the 'cell_contents' thing
-        # probably can't (that's the only real reference to the underlying
-        # function).
-        if thunk.func_code.co_name == 'unwindGenerator':
-            specTarget = thunk.func_closure[0].cell_contents
-        else:
-            specTarget = thunk
-        spec = getargspec(specTarget)
-        def outer(*a, **kw):
-            self = a[0]
-            memo = getattr(self, memoAttribute)
-            key = _getarg(keyArgument, spec, a, kw)
-            if key in memo:
-                memoed = memo[key]
-                return succeed(memoed) if deferredResult else memoed
-            result = thunk(*a, **kw)
-            if isinstance(result, Deferred):
-                def memoResult(finalResult):
-                    if finalResult is not None:
-                        memo[key] = finalResult
-                    return finalResult
-                result.addCallback(memoResult)
-            elif result is not None:
-                memo[key] = result
-            return result
-        return outer
-    return decorate

Modified: CalendarServer/trunk/txdav/common/datastore/sql.py
===================================================================
--- CalendarServer/trunk/txdav/common/datastore/sql.py	2010-10-28 20:35:50 UTC (rev 6481)
+++ CalendarServer/trunk/txdav/common/datastore/sql.py	2010-10-28 20:39:22 UTC (rev 6482)
@@ -26,25 +26,26 @@
 ]
 
 import sys
-
+import datetime
 from Queue import Queue
 
-from twext.python.log import Logger, LoggingMixIn
-from twext.web2.dav.element.rfc2518 import ResourceType
-from twext.web2.http_headers import MimeType
+from zope.interface.declarations import implements, directlyProvides
 
-from twisted.application.service import Service
 from twisted.python import hashlib
 from twisted.python.modules import getModule
 from twisted.python.util import FancyEqMixin
+from twisted.python.failure import Failure
 
 from twisted.internet import reactor
 from twisted.internet.defer import inlineCallbacks, returnValue, Deferred
-from twisted.python.failure import Failure
 
-from twistedcaldav.customxml import NotificationType
-from twistedcaldav.dateops import datetimeMktime
+from twisted.application.service import Service
 
+from twext.python.log import Logger, LoggingMixIn
+from twext.internet.decorate import memoizedKey
+from twext.web2.dav.element.rfc2518 import ResourceType
+from twext.web2.http_headers import MimeType
+
 from txdav.common.datastore.sql_legacy import PostgresLegacyNotificationsEmulator
 from txdav.caldav.icalendarstore import ICalendarTransaction, ICalendarStore
 
@@ -59,18 +60,16 @@
     NoSuchObjectResourceError
 from txdav.common.inotifications import INotificationCollection, \
     INotificationObject
-from txdav.base.datastore.sql import memoized
 
 from txdav.idav import AlreadyFinishedError
 from txdav.base.propertystore.base import PropertyName
 from txdav.base.propertystore.sql import PropertyStore
 
-from zope.interface.declarations import implements, directlyProvides
+from twistedcaldav.customxml import NotificationType
+from twistedcaldav.dateops import datetimeMktime
 
-import datetime
 
-v1_schema = getModule(__name__).filePath.sibling(
-    "sql_schema_v1.sql").getContent()
+v1_schema = getModule(__name__).filePath.sibling("sql_schema_v1.sql").getContent()
 
 log = Logger()
 
@@ -127,9 +126,9 @@
 
 _DONE = object()
 
-_STATE_STOPPED = 'STOPPED'
-_STATE_RUNNING = 'RUNNING'
-_STATE_STOPPING = 'STOPPING'
+_STATE_STOPPED = "STOPPED"
+_STATE_RUNNING = "RUNNING"
+_STATE_STOPPING = "STOPPING"
 
 class ThreadHolder(object):
     """
@@ -261,7 +260,7 @@
 
 
     def __repr__(self):
-        return 'PG-TXN<%s>' % (self._label,)
+        return "PG-TXN<%s>" % (self._label,)
 
 
     def _reallyExecSQL(self, sql, args=[], raiseOnZeroRowCount=None):
@@ -295,16 +294,16 @@
 
     def __del__(self):
         if not self._completed:
-            print 'CommonStoreTransaction.__del__: OK'
+            print "CommonStoreTransaction.__del__: OK"
             self.abort()
 
 
-    @memoized('uid', '_calendarHomes')
+    @memoizedKey("uid", "_calendarHomes")
     def calendarHomeWithUID(self, uid, create=False):
         return self.homeWithUID(ECALENDARTYPE, uid, create=create)
 
 
-    @memoized('uid', '_addressbookHomes')
+    @memoizedKey("uid", "_addressbookHomes")
     def addressbookHomeWithUID(self, uid, create=False):
         return self.homeWithUID(EADDRESSBOOKTYPE, uid, create=create)
 
@@ -360,7 +359,7 @@
         returnValue(homeObject)
 
 
-    @memoized('uid', '_notificationHomes')
+    @memoizedKey("uid", "_notificationHomes")
     @inlineCallbacks
     def notificationsWithUID(self, uid):
         """
@@ -419,7 +418,7 @@
 
     def postCommit(self, operation):
         """
-        Run things after 'commit.'
+        Run things after C{commit}.
         """
         self._postCommitOperations.append(operation)
 
@@ -539,7 +538,7 @@
         returnValue(names)
 
 
-    @memoized('name', '_children')
+    @memoizedKey("name", "_children")
     def childWithName(self, name):
         """
         Retrieve the child with the given C{name} contained in this
@@ -551,7 +550,7 @@
         return self._childWithName(name, owned=True)
 
 
-    @memoized('name', '_sharedChildren')
+    @memoizedKey("name", "_sharedChildren")
     def sharedChildWithName(self, name):
         """
         Retrieve the shared child with the given C{name} contained in this
@@ -851,7 +850,7 @@
     Common ancestor class of AddressBooks and Calendars.
     """
 
-    compareAttributes = '_name _home _resourceID'.split()
+    compareAttributes = "_name _home _resourceID".split()
 
     _objectResourceClass = None
     _bindTable = None
@@ -963,6 +962,7 @@
     def objectResourceWithUID(self, uid):
         return self._makeObjectResource(None, uid)
 
+
     @inlineCallbacks
     def _makeObjectResource(self, name, uid):
         """
@@ -1338,7 +1338,7 @@
     @type _path: L{FilePath}
     """
 
-    compareAttributes = '_name _parentCollection'.split()
+    compareAttributes = "_name _parentCollection".split()
 
     _objectTable = None
 
@@ -1504,7 +1504,7 @@
 
     implements(INotificationCollection)
 
-    compareAttributes = '_uid _resourceID'.split()
+    compareAttributes = "_uid _resourceID".split()
 
     _objectResourceClass = None
     _revisionsTable = NOTIFICATION_OBJECT_REVISIONS_TABLE
@@ -1536,7 +1536,7 @@
         return "<%s: %s>" % (self.__class__.__name__, self._resourceID)
 
     def name(self):
-        return 'notification'
+        return "notification"
 
     def uid(self):
         return self._uid
@@ -1571,7 +1571,7 @@
         return self.notificationObjectWithUID(self._nameToUID(name))
 
 
-    @memoized('uid', '_notifications')
+    @memoizedKey("uid", "_notifications")
     @inlineCallbacks
     def notificationObjectWithUID(self, uid):
         """
@@ -1759,7 +1759,7 @@
 
     implements(INotificationObject)
 
-    compareAttributes = '_resourceID _home'.split()
+    compareAttributes = "_resourceID _home".split()
 
     def __init__(self, home, uid):
         self._home = home
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20101028/b5549263/attachment-0001.html>


More information about the calendarserver-changes mailing list