<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[13793] CalendarServer/trunk</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.calendarserver.org//changeset/13793">13793</a></dd>
<dt>Author</dt> <dd>cdaboo@apple.com</dd>
<dt>Date</dt> <dd>2014-07-25 12:29:30 -0700 (Fri, 25 Jul 2014)</dd>
</dl>
<h3>Log Message</h3>
<pre>White space.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#CalendarServertrunkcalendarservercontrolsocketpy">CalendarServer/trunk/calendarserver/controlsocket.py</a></li>
<li><a href="#CalendarServertrunkcalendarserverplatformdarwinsaclpy">CalendarServer/trunk/calendarserver/platform/darwin/sacl.py</a></li>
<li><a href="#CalendarServertrunkcalendarserverprofilingpy">CalendarServer/trunk/calendarserver/profiling.py</a></li>
<li><a href="#CalendarServertrunkcalendarserverpushamppushpy">CalendarServer/trunk/calendarserver/push/amppush.py</a></li>
<li><a href="#CalendarServertrunkcalendarserverpushapplepushpy">CalendarServer/trunk/calendarserver/push/applepush.py</a></li>
<li><a href="#CalendarServertrunkcalendarserverpushnotifierpy">CalendarServer/trunk/calendarserver/push/notifier.py</a></li>
<li><a href="#CalendarServertrunkcalendarserverpushtesttest_amppushpy">CalendarServer/trunk/calendarserver/push/test/test_amppush.py</a></li>
<li><a href="#CalendarServertrunkcalendarserverpushtesttest_applepushpy">CalendarServer/trunk/calendarserver/push/test/test_applepush.py</a></li>
<li><a href="#CalendarServertrunkcalendarserverpushtesttest_notifierpy">CalendarServer/trunk/calendarserver/push/test/test_notifier.py</a></li>
<li><a href="#CalendarServertrunkcalendarserverpushutilpy">CalendarServer/trunk/calendarserver/push/util.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertapcaldavpy">CalendarServer/trunk/calendarserver/tap/caldav.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertaptesttest_utilpy">CalendarServer/trunk/calendarserver/tap/test/test_util.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertaputilpy">CalendarServer/trunk/calendarserver/tap/util.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolsanonymizepy">CalendarServer/trunk/calendarserver/tools/anonymize.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolscalverifypy">CalendarServer/trunk/calendarserver/tools/calverify.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolscmdlinepy">CalendarServer/trunk/calendarserver/tools/cmdline.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolsdbinspectpy">CalendarServer/trunk/calendarserver/tools/dbinspect.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolsnotificationspy">CalendarServer/trunk/calendarserver/tools/notifications.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolsobliteratepy">CalendarServer/trunk/calendarserver/tools/obliterate.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolsprincipalspy">CalendarServer/trunk/calendarserver/tools/principals.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolspurgepy">CalendarServer/trunk/calendarserver/tools/purge.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolsresourcespy">CalendarServer/trunk/calendarserver/tools/resources.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolsshellcmdpy">CalendarServer/trunk/calendarserver/tools/shell/cmd.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolsshelldirectorypy">CalendarServer/trunk/calendarserver/tools/shell/directory.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolsshellterminalpy">CalendarServer/trunk/calendarserver/tools/shell/terminal.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolsshellvfspy">CalendarServer/trunk/calendarserver/tools/shell/vfs.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolstesttest_calverifypy">CalendarServer/trunk/calendarserver/tools/test/test_calverify.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolstesttest_configpy">CalendarServer/trunk/calendarserver/tools/test/test_config.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolstesttest_exportpy">CalendarServer/trunk/calendarserver/tools/test/test_export.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolstesttest_gatewaypy">CalendarServer/trunk/calendarserver/tools/test/test_gateway.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolstesttest_purgepy">CalendarServer/trunk/calendarserver/tools/test/test_purge.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolstesttest_purge_old_eventspy">CalendarServer/trunk/calendarserver/tools/test/test_purge_old_events.py</a></li>
<li><a href="#CalendarServertrunkcalendarserverwebadminlandingpy">CalendarServer/trunk/calendarserver/webadmin/landing.py</a></li>
<li><a href="#CalendarServertrunkconfauthgenerate_test_accountspy">CalendarServer/trunk/conf/auth/generate_test_accounts.py</a></li>
<li><a href="#CalendarServertrunkcontriboddsattributespy">CalendarServer/trunk/contrib/od/dsattributes.py</a></li>
<li><a href="#CalendarServertrunkcontribododframeworkpy">CalendarServer/trunk/contrib/od/odframework.py</a></li>
<li><a href="#CalendarServertrunkcontribperformance_event_createpy">CalendarServer/trunk/contrib/performance/_event_create.py</a></li>
<li><a href="#CalendarServertrunkcontribperformancebenchlibpy">CalendarServer/trunk/contrib/performance/benchlib.py</a></li>
<li><a href="#CalendarServertrunkcontribperformancebenchmarkpy">CalendarServer/trunk/contrib/performance/benchmark.py</a></li>
<li><a href="#CalendarServertrunkcontribperformancebenchmarksfind_eventspy">CalendarServer/trunk/contrib/performance/benchmarks/find_events.py</a></li>
<li><a href="#CalendarServertrunkcontribperformancebenchmarksvfreebusypy">CalendarServer/trunk/contrib/performance/benchmarks/vfreebusy.py</a></li>
<li><a href="#CalendarServertrunkcontribperformancebenchmarksvfreebusy_vary_attendeespy">CalendarServer/trunk/contrib/performance/benchmarks/vfreebusy_vary_attendees.py</a></li>
<li><a href="#CalendarServertrunkcontribperformanceeventkitframeworkpy">CalendarServer/trunk/contrib/performance/eventkitframework.py</a></li>
<li><a href="#CalendarServertrunkcontribperformancehttpauthpy">CalendarServer/trunk/contrib/performance/httpauth.py</a></li>
<li><a href="#CalendarServertrunkcontribperformancestatspy">CalendarServer/trunk/contrib/performance/stats.py</a></li>
<li><a href="#CalendarServertrunkcontribperformancetest_benchmarkpy">CalendarServer/trunk/contrib/performance/test_benchmark.py</a></li>
<li><a href="#CalendarServertrunkcontribperformancetest_statspy">CalendarServer/trunk/contrib/performance/test_stats.py</a></li>
<li><a href="#CalendarServertrunkcontribperformanceuploadpy">CalendarServer/trunk/contrib/performance/upload.py</a></li>
<li><a href="#CalendarServertrunkcontribtoolsfakecalendardatapy">CalendarServer/trunk/contrib/tools/fakecalendardata.py</a></li>
<li><a href="#CalendarServertrunkcontribtoolsmonitoranalysispy">CalendarServer/trunk/contrib/tools/monitoranalysis.py</a></li>
<li><a href="#CalendarServertrunkcontribtoolspg_stats_analysispy">CalendarServer/trunk/contrib/tools/pg_stats_analysis.py</a></li>
<li><a href="#CalendarServertrunkcontribtoolsprotocolanalysispy">CalendarServer/trunk/contrib/tools/protocolanalysis.py</a></li>
<li><a href="#CalendarServertrunkcontribtoolsreadStatspy">CalendarServer/trunk/contrib/tools/readStats.py</a></li>
<li><a href="#CalendarServertrunkcontribtoolsrequest_monitorpy">CalendarServer/trunk/contrib/tools/request_monitor.py</a></li>
<li><a href="#CalendarServertrunkcontribtoolsstatsanalysispy">CalendarServer/trunk/contrib/tools/statsanalysis.py</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="CalendarServertrunkcalendarservercontrolsocketpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/controlsocket.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/controlsocket.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/controlsocket.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -91,7 +91,7 @@
</span><span class="cx"> Build a thing that will multiplex AMP to all the relevant sockets.
</span><span class="cx"> """
</span><span class="cx"> receiverMap = {}
</span><del>- for k, f in self._factoryMap.items():
</del><ins>+ for k, f in self._factoryMap.items():
</ins><span class="cx"> receiverMap[k] = f.buildProtocol(addr)
</span><span class="cx"> return BinaryBoxProtocol(DispatchingBoxReceiver(receiverMap))
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServertrunkcalendarserverplatformdarwinsaclpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/platform/darwin/sacl.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/platform/darwin/sacl.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/platform/darwin/sacl.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -39,6 +39,7 @@
</span><span class="cx"> raise ImportError(ve)
</span><span class="cx">
</span><span class="cx">
</span><ins>+
</ins><span class="cx"> def checkSACL(userOrGroupName, serviceName):
</span><span class="cx"> """
</span><span class="cx"> Check to see if a given user or group is a member of an OS X Server
</span></span></pre></div>
<a id="CalendarServertrunkcalendarserverprofilingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/profiling.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/profiling.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/profiling.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -38,6 +38,7 @@
</span><span class="cx"> return wrapper
</span><span class="cx">
</span><span class="cx">
</span><ins>+
</ins><span class="cx"> def profile_inline_callback():
</span><span class="cx"> """
</span><span class="cx"> Decorator to profile an inlineCallback function
</span></span></pre></div>
<a id="CalendarServertrunkcalendarserverpushamppushpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/push/amppush.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/push/amppush.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/push/amppush.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -85,12 +85,15 @@
</span><span class="cx">
</span><span class="cx">
</span><span class="cx"> @inlineCallbacks
</span><del>- def enqueue(self, transaction, id, dataChangedTimestamp=None,
- priority=PushPriority.high):
</del><ins>+ def enqueue(
+ self, transaction, id, dataChangedTimestamp=None,
+ priority=PushPriority.high
+ ):
</ins><span class="cx"> if dataChangedTimestamp is None:
</span><span class="cx"> dataChangedTimestamp = int(time.time())
</span><span class="cx"> for protocol in self.protocols:
</span><del>- yield protocol.callRemote(NotificationForID, id=id,
</del><ins>+ yield protocol.callRemote(
+ NotificationForID, id=id,
</ins><span class="cx"> dataChangedTimestamp=dataChangedTimestamp,
</span><span class="cx"> priority=priority.value)
</span><span class="cx">
</span><span class="lines">@@ -108,11 +111,14 @@
</span><span class="cx">
</span><span class="cx">
</span><span class="cx"> @NotificationForID.responder
</span><del>- def enqueueFromWorker(self, id, dataChangedTimestamp=None,
- priority=PushPriority.high.value):
</del><ins>+ def enqueueFromWorker(
+ self, id, dataChangedTimestamp=None,
+ priority=PushPriority.high.value
+ ):
</ins><span class="cx"> if dataChangedTimestamp is None:
</span><span class="cx"> dataChangedTimestamp = int(time.time())
</span><del>- self.master.enqueue(None, id, dataChangedTimestamp=dataChangedTimestamp,
</del><ins>+ self.master.enqueue(
+ None, id, dataChangedTimestamp=dataChangedTimestamp,
</ins><span class="cx"> priority=PushPriority.lookupByValue(priority))
</span><span class="cx"> return {"status" : "OK"}
</span><span class="cx">
</span><span class="lines">@@ -138,8 +144,10 @@
</span><span class="cx"> """
</span><span class="cx"> log = Logger()
</span><span class="cx">
</span><del>- def __init__(self, controlSocket, parentService, port, enableStaggering,
- staggerSeconds, reactor=None):
</del><ins>+ def __init__(
+ self, controlSocket, parentService, port, enableStaggering,
+ staggerSeconds, reactor=None
+ ):
</ins><span class="cx"> if reactor is None:
</span><span class="cx"> from twisted.internet import reactor
</span><span class="cx"> from twisted.application.strports import service as strPortsService
</span><span class="lines">@@ -147,18 +155,21 @@
</span><span class="cx"> if port:
</span><span class="cx"> # Service which listens for client subscriptions and sends
</span><span class="cx"> # notifications to them
</span><del>- strPortsService(str(port), AMPPushNotifierFactory(self),
</del><ins>+ strPortsService(
+ str(port), AMPPushNotifierFactory(self),
</ins><span class="cx"> reactor=reactor).setServiceParent(parentService)
</span><span class="cx">
</span><span class="cx"> if controlSocket is not None:
</span><span class="cx"> # Set up the listener which gets notifications from the slaves
</span><del>- controlSocket.addFactory(PUSH_ROUTE,
- AMPPushMasterListenerFactory(self))
</del><ins>+ controlSocket.addFactory(
+ PUSH_ROUTE, AMPPushMasterListenerFactory(self)
+ )
</ins><span class="cx">
</span><span class="cx"> self.subscribers = []
</span><span class="cx">
</span><span class="cx"> if enableStaggering:
</span><del>- self.scheduler = PushScheduler(reactor, self.sendNotification,
</del><ins>+ self.scheduler = PushScheduler(
+ reactor, self.sendNotification,
</ins><span class="cx"> staggerSeconds=staggerSeconds)
</span><span class="cx"> else:
</span><span class="cx"> self.scheduler = None
</span><span class="lines">@@ -174,8 +185,10 @@
</span><span class="cx"> self.subscribers.remove(p)
</span><span class="cx">
</span><span class="cx">
</span><del>- def enqueue(self, transaction, pushKey, dataChangedTimestamp=None,
- priority=PushPriority.high):
</del><ins>+ def enqueue(
+ self, transaction, pushKey, dataChangedTimestamp=None,
+ priority=PushPriority.high
+ ):
</ins><span class="cx"> """
</span><span class="cx"> Sends an AMP push notification to any clients subscribing to this pushKey.
</span><span class="cx">
</span><span class="lines">@@ -200,7 +213,8 @@
</span><span class="cx"> if token is not None:
</span><span class="cx"> tokens.append(token)
</span><span class="cx"> if tokens:
</span><del>- return self.scheduleNotifications(tokens, pushKey,
</del><ins>+ return self.scheduleNotifications(
+ tokens, pushKey,
</ins><span class="cx"> dataChangedTimestamp, priority)
</span><span class="cx">
</span><span class="cx">
</span><span class="lines">@@ -208,7 +222,8 @@
</span><span class="cx"> def sendNotification(self, token, id, dataChangedTimestamp, priority):
</span><span class="cx"> for subscriber in self.subscribers:
</span><span class="cx"> if subscriber.subscribedToID(id):
</span><del>- yield subscriber.notify(token, id, dataChangedTimestamp,
</del><ins>+ yield subscriber.notify(
+ token, id, dataChangedTimestamp,
</ins><span class="cx"> priority)
</span><span class="cx">
</span><span class="cx">
</span><span class="lines">@@ -218,7 +233,8 @@
</span><span class="cx"> self.scheduler.schedule(tokens, id, dataChangedTimestamp, priority)
</span><span class="cx"> else:
</span><span class="cx"> for token in tokens:
</span><del>- yield self.sendNotification(token, id, dataChangedTimestamp,
</del><ins>+ yield self.sendNotification(
+ token, id, dataChangedTimestamp,
</ins><span class="cx"> priority)
</span><span class="cx">
</span><span class="cx">
</span><span class="lines">@@ -252,7 +268,8 @@
</span><span class="cx"> def notify(self, token, id, dataChangedTimestamp, priority):
</span><span class="cx"> if self.subscribedToID(id) == token:
</span><span class="cx"> self.log.debug("Sending notification for %s to %s" % (id, token))
</span><del>- return self.callRemote(NotificationForID, id=id,
</del><ins>+ return self.callRemote(
+ NotificationForID, id=id,
</ins><span class="cx"> dataChangedTimestamp=dataChangedTimestamp,
</span><span class="cx"> priority=priority.value)
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServertrunkcalendarserverpushapplepushpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/push/applepush.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/push/applepush.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/push/applepush.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -71,8 +71,10 @@
</span><span class="cx"> log = Logger()
</span><span class="cx">
</span><span class="cx"> @classmethod
</span><del>- def makeService(cls, settings, store, testConnectorClass=None,
- reactor=None):
</del><ins>+ def makeService(
+ cls, settings, store, testConnectorClass=None,
+ reactor=None
+ ):
</ins><span class="cx"> """
</span><span class="cx"> Creates the various "subservices" that work together to implement
</span><span class="cx"> APN, including "provider" and "feedback" services for CalDAV and
</span><span class="lines">@@ -129,7 +131,8 @@
</span><span class="cx"> )
</span><span class="cx"> provider.setServiceParent(service)
</span><span class="cx"> service.providers[protocol] = provider
</span><del>- service.log.info("APNS %s topic: %s" %
</del><ins>+ service.log.info(
+ "APNS %s topic: %s" %
</ins><span class="cx"> (protocol, settings[protocol]["Topic"]))
</span><span class="cx">
</span><span class="cx"> feedback = APNFeedbackService(
</span><span class="lines">@@ -188,8 +191,10 @@
</span><span class="cx">
</span><span class="cx">
</span><span class="cx"> @inlineCallbacks
</span><del>- def enqueue(self, transaction, pushKey, dataChangedTimestamp=None,
- priority=PushPriority.high):
</del><ins>+ def enqueue(
+ self, transaction, pushKey, dataChangedTimestamp=None,
+ priority=PushPriority.high
+ ):
</ins><span class="cx"> """
</span><span class="cx"> Sends an Apple Push Notification to any device token subscribed to
</span><span class="cx"> this pushKey.
</span><span class="lines">@@ -226,14 +231,16 @@
</span><span class="cx">
</span><span class="cx"> numSubscriptions = len(subscriptions)
</span><span class="cx"> if numSubscriptions > 0:
</span><del>- self.log.debug("Sending %d APNS notifications for %s" %
</del><ins>+ self.log.debug(
+ "Sending %d APNS notifications for %s" %
</ins><span class="cx"> (numSubscriptions, pushKey))
</span><span class="cx"> tokens = []
</span><span class="cx"> for token, uid in subscriptions:
</span><span class="cx"> if token and uid:
</span><span class="cx"> tokens.append(token)
</span><span class="cx"> if tokens:
</span><del>- provider.scheduleNotifications(tokens, pushKey,
</del><ins>+ provider.scheduleNotifications(
+ tokens, pushKey,
</ins><span class="cx"> dataChangedTimestamp, priority)
</span><span class="cx">
</span><span class="cx">
</span><span class="lines">@@ -313,7 +320,8 @@
</span><span class="cx"> if command == self.COMMAND_ERROR:
</span><span class="cx"> yield fn(status, identifier)
</span><span class="cx"> except Exception, e:
</span><del>- self.log.warn("ProviderProtocol could not process error: %s (%s)" %
</del><ins>+ self.log.warn(
+ "ProviderProtocol could not process error: %s (%s)" %
</ins><span class="cx"> (message.encode("hex"), e))
</span><span class="cx">
</span><span class="cx">
</span><span class="lines">@@ -336,12 +344,14 @@
</span><span class="cx"> if status in self.TOKEN_REMOVAL_CODES:
</span><span class="cx"> token = self.history.extractIdentifier(identifier)
</span><span class="cx"> if token is not None:
</span><del>- self.log.debug("Removing subscriptions for bad token: %s" %
</del><ins>+ self.log.debug(
+ "Removing subscriptions for bad token: %s" %
</ins><span class="cx"> (token,))
</span><span class="cx"> txn = self.factory.store.newTransaction(label="APNProviderProtocol.processError")
</span><span class="cx"> subscriptions = (yield txn.apnSubscriptionsByToken(token))
</span><span class="cx"> for key, _ignore_modified, _ignore_uid in subscriptions:
</span><del>- self.log.debug("Removing subscription: %s %s" %
</del><ins>+ self.log.debug(
+ "Removing subscription: %s %s" %
</ins><span class="cx"> (token, key))
</span><span class="cx"> yield txn.removeAPNSubscription(token, key)
</span><span class="cx"> yield txn.commit()
</span><span class="lines">@@ -380,7 +390,8 @@
</span><span class="cx"> }
</span><span class="cx"> )
</span><span class="cx"> payloadLength = len(payload)
</span><del>- self.log.debug("Sending APNS notification to {token}: id={id} payload={payload} priority={priority}",
</del><ins>+ self.log.debug(
+ "Sending APNS notification to {token}: id={id} payload={payload} priority={priority}",
</ins><span class="cx"> token=token, id=identifier, payload=payload, priority=apnsPriority)
</span><span class="cx">
</span><span class="cx"> """
</span><span class="lines">@@ -397,34 +408,34 @@
</span><span class="cx"> at a time that conservces power on the device receiving it)
</span><span class="cx"> """
</span><span class="cx">
</span><del>- # Frame struct.pack format
- # ! Network byte order
</del><ins>+ # Frame struct.pack format ! Network byte order
</ins><span class="cx"> command = self.COMMAND_PROVIDER # B
</span><span class="cx"> frameLength = (# I
</span><span class="cx"> # Item 1 (Device token)
</span><del>- 1 + # Item number # B
- 2 + # Item length # H
</del><ins>+ 1 + # Item number # B
+ 2 + # Item length # H
</ins><span class="cx"> 32 + # device token # 32s
</span><span class="cx"> # Item 2 (Payload)
</span><del>- 1 + # Item number # B
- 2 + # Item length # H
</del><ins>+ 1 + # Item number # B
+ 2 + # Item length # H
</ins><span class="cx"> payloadLength + # the JSON payload # %d s
</span><span class="cx"> # Item 3 (Notification ID)
</span><del>- 1 + # Item number # B
- 2 + # Item length # H
- 4 + # Notification ID # I
</del><ins>+ 1 + # Item number # B
+ 2 + # Item length # H
+ 4 + # Notification ID # I
</ins><span class="cx"> # Item 4 (Expiration)
</span><del>- 1 + # Item number # B
- 2 + # Item length # H
- 4 + # Expiration seconds since epoch # I
</del><ins>+ 1 + # Item number # B
+ 2 + # Item length # H
+ 4 + # Expiration seconds since epoch # I
</ins><span class="cx"> # Item 5 (Priority)
</span><del>- 1 + # Item number # B
- 2 + # Item length # H
</del><ins>+ 1 + # Item number # B
+ 2 + # Item length # H
</ins><span class="cx"> 1 # Priority # B
</span><span class="cx"> )
</span><span class="cx">
</span><span class="cx"> self.transport.write(
</span><del>- struct.pack("!BIBH32sBH%dsBHIBHIBHB" % (payloadLength,),
</del><ins>+ struct.pack(
+ "!BIBH32sBH%dsBHIBHIBHB" % (payloadLength,),
</ins><span class="cx">
</span><span class="cx"> command, # Command
</span><span class="cx"> frameLength, # Frame length
</span><span class="lines">@@ -482,7 +493,8 @@
</span><span class="cx"> def clientConnectionFailed(self, connector, reason):
</span><span class="cx"> self.log.error("Unable to connect to APN server: %s" % (reason,))
</span><span class="cx"> self.connected = False
</span><del>- ReconnectingClientFactory.clientConnectionFailed(self, connector,
</del><ins>+ ReconnectingClientFactory.clientConnectionFailed(
+ self, connector,
</ins><span class="cx"> reason)
</span><span class="cx">
</span><span class="cx">
</span><span class="lines">@@ -500,9 +512,11 @@
</span><span class="cx"> class APNConnectionService(service.Service):
</span><span class="cx"> log = Logger()
</span><span class="cx">
</span><del>- def __init__(self, host, port, certPath, keyPath, chainPath="",
</del><ins>+ def __init__(
+ self, host, port, certPath, keyPath, chainPath="",
</ins><span class="cx"> passphrase="", sslMethod="TLSv1_METHOD", testConnector=None,
</span><del>- reactor=None):
</del><ins>+ reactor=None
+ ):
</ins><span class="cx">
</span><span class="cx"> self.host = host
</span><span class="cx"> self.port = port
</span><span class="lines">@@ -541,12 +555,15 @@
</span><span class="cx">
</span><span class="cx"> class APNProviderService(APNConnectionService):
</span><span class="cx">
</span><del>- def __init__(self, store, host, port, certPath, keyPath, chainPath="",
</del><ins>+ def __init__(
+ self, store, host, port, certPath, keyPath, chainPath="",
</ins><span class="cx"> passphrase="", sslMethod="TLSv1_METHOD",
</span><span class="cx"> staggerNotifications=False, staggerSeconds=3,
</span><del>- testConnector=None, reactor=None):
</del><ins>+ testConnector=None, reactor=None
+ ):
</ins><span class="cx">
</span><del>- APNConnectionService.__init__(self, host, port, certPath, keyPath,
</del><ins>+ APNConnectionService.__init__(
+ self, host, port, certPath, keyPath,
</ins><span class="cx"> chainPath=chainPath, passphrase=passphrase, sslMethod=sslMethod,
</span><span class="cx"> testConnector=testConnector, reactor=reactor)
</span><span class="cx">
</span><span class="lines">@@ -554,7 +571,8 @@
</span><span class="cx"> self.factory = None
</span><span class="cx"> self.queue = []
</span><span class="cx"> if staggerNotifications:
</span><del>- self.scheduler = PushScheduler(self.reactor, self.sendNotification,
</del><ins>+ self.scheduler = PushScheduler(
+ self.reactor, self.sendNotification,
</ins><span class="cx"> staggerSeconds=staggerSeconds)
</span><span class="cx"> else:
</span><span class="cx"> self.scheduler = None
</span><span class="lines">@@ -583,7 +601,8 @@
</span><span class="cx"> self.queue = []
</span><span class="cx"> for (token, key), dataChangedTimestamp, priority in queued:
</span><span class="cx"> if token and key and dataChangedTimestamp and priority:
</span><del>- self.sendNotification(token, key, dataChangedTimestamp,
</del><ins>+ self.sendNotification(
+ token, key, dataChangedTimestamp,
</ins><span class="cx"> priority)
</span><span class="cx">
</span><span class="cx">
</span><span class="lines">@@ -695,12 +714,14 @@
</span><span class="cx"> self.buffer = self.buffer[self.MESSAGE_LENGTH:]
</span><span class="cx">
</span><span class="cx"> try:
</span><del>- timestamp, _ignore_tokenLength, binaryToken = struct.unpack("!IH32s",
</del><ins>+ timestamp, _ignore_tokenLength, binaryToken = struct.unpack(
+ "!IH32s",
</ins><span class="cx"> message)
</span><span class="cx"> token = binaryToken.encode("hex").lower()
</span><span class="cx"> yield fn(timestamp, token)
</span><span class="cx"> except Exception, e:
</span><del>- self.log.warn("FeedbackProtocol could not process message: %s (%s)" %
</del><ins>+ self.log.warn(
+ "FeedbackProtocol could not process message: %s (%s)" %
</ins><span class="cx"> (message.encode("hex"), e))
</span><span class="cx">
</span><span class="cx">
</span><span class="lines">@@ -719,14 +740,16 @@
</span><span class="cx"> @type token: C{str}
</span><span class="cx"> """
</span><span class="cx">
</span><del>- self.log.debug("FeedbackProtocol processFeedback time=%d token=%s" %
</del><ins>+ self.log.debug(
+ "FeedbackProtocol processFeedback time=%d token=%s" %
</ins><span class="cx"> (timestamp, token))
</span><span class="cx"> txn = self.factory.store.newTransaction(label="APNFeedbackProtocol.processFeedback")
</span><span class="cx"> subscriptions = (yield txn.apnSubscriptionsByToken(token))
</span><span class="cx">
</span><span class="cx"> for key, modified, _ignore_uid in subscriptions:
</span><span class="cx"> if timestamp > modified:
</span><del>- self.log.debug("FeedbackProtocol removing subscription: %s %s" %
</del><ins>+ self.log.debug(
+ "FeedbackProtocol removing subscription: %s %s" %
</ins><span class="cx"> (token, key))
</span><span class="cx"> yield txn.removeAPNSubscription(token, key)
</span><span class="cx"> yield txn.commit()
</span><span class="lines">@@ -743,7 +766,8 @@
</span><span class="cx">
</span><span class="cx">
</span><span class="cx"> def clientConnectionFailed(self, connector, reason):
</span><del>- self.log.error("Unable to connect to APN feedback server: %s" %
</del><ins>+ self.log.error(
+ "Unable to connect to APN feedback server: %s" %
</ins><span class="cx"> (reason,))
</span><span class="cx"> self.connected = False
</span><span class="cx"> ClientFactory.clientConnectionFailed(self, connector, reason)
</span><span class="lines">@@ -752,11 +776,14 @@
</span><span class="cx">
</span><span class="cx"> class APNFeedbackService(APNConnectionService):
</span><span class="cx">
</span><del>- def __init__(self, store, updateSeconds, host, port,
</del><ins>+ def __init__(
+ self, store, updateSeconds, host, port,
</ins><span class="cx"> certPath, keyPath, chainPath="", passphrase="", sslMethod="TLSv1_METHOD",
</span><del>- testConnector=None, reactor=None):
</del><ins>+ testConnector=None, reactor=None
+ ):
</ins><span class="cx">
</span><del>- APNConnectionService.__init__(self, host, port, certPath, keyPath,
</del><ins>+ APNConnectionService.__init__(
+ self, host, port, certPath, keyPath,
</ins><span class="cx"> chainPath=chainPath, passphrase=passphrase, sslMethod=sslMethod,
</span><span class="cx"> testConnector=testConnector, reactor=reactor)
</span><span class="cx">
</span><span class="lines">@@ -780,13 +807,16 @@
</span><span class="cx"> self.nextCheck = None
</span><span class="cx"> self.log.debug("APNFeedbackService checkForFeedback")
</span><span class="cx"> self.connect(self.factory)
</span><del>- self.nextCheck = self.reactor.callLater(self.updateSeconds,
</del><ins>+ self.nextCheck = self.reactor.callLater(
+ self.updateSeconds,
</ins><span class="cx"> self.checkForFeedback)
</span><span class="cx">
</span><span class="cx">
</span><span class="cx">
</span><del>-class APNSubscriptionResource(ReadOnlyNoCopyResourceMixIn,
- DAVResourceWithoutChildrenMixin, DAVResource):
</del><ins>+class APNSubscriptionResource(
+ ReadOnlyNoCopyResourceMixIn,
+ DAVResourceWithoutChildrenMixin, DAVResource
+):
</ins><span class="cx"> """
</span><span class="cx"> The DAV resource allowing clients to subscribe to Apple push notifications.
</span><span class="cx"> To subscribe, a client should first determine the key they are interested
</span></span></pre></div>
<a id="CalendarServertrunkcalendarserverpushnotifierpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/push/notifier.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/push/notifier.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/push/notifier.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -50,7 +50,8 @@
</span><span class="cx">
</span><span class="cx"> # Find all work items with the same push ID and find the highest
</span><span class="cx"> # priority. Delete matching work items.
</span><del>- results = (yield Select([self.table.WORK_ID, self.table.JOB_ID, self.table.PUSH_PRIORITY],
</del><ins>+ results = (yield Select(
+ [self.table.WORK_ID, self.table.JOB_ID, self.table.PUSH_PRIORITY],
</ins><span class="cx"> From=self.table, Where=self.table.PUSH_ID == self.pushID).on(
</span><span class="cx"> self.transaction))
</span><span class="cx">
</span><span class="lines">@@ -132,12 +133,15 @@
</span><span class="cx">
</span><span class="cx"> for prefix, id in ids:
</span><span class="cx"> if self._notify:
</span><del>- self.log.debug("Notifications are enabled: %s %s/%s priority=%d" %
</del><ins>+ self.log.debug(
+ "Notifications are enabled: %s %s/%s priority=%d" %
</ins><span class="cx"> (self._storeObject, prefix, id, priority.value))
</span><del>- yield self._notifierFactory.send(prefix, id, txn,
</del><ins>+ yield self._notifierFactory.send(
+ prefix, id, txn,
</ins><span class="cx"> priority=priority)
</span><span class="cx"> else:
</span><del>- self.log.debug("Skipping notification for: %s %s/%s" %
</del><ins>+ self.log.debug(
+ "Skipping notification for: %s %s/%s" %
</ins><span class="cx"> (self._storeObject, prefix, id,))
</span><span class="cx">
</span><span class="cx">
</span><span class="lines">@@ -220,10 +224,12 @@
</span><span class="cx"> settings = {}
</span><span class="cx"> settings["APSBundleID"] = applePushSettings[protocol]["Topic"]
</span><span class="cx"> if config.EnableSSL:
</span><del>- url = "https://%s:%s/%s" % (config.ServerHostName, config.SSLPort,
</del><ins>+ url = "https://%s:%s/%s" % (
+ config.ServerHostName, config.SSLPort,
</ins><span class="cx"> applePushSettings.SubscriptionURL)
</span><span class="cx"> else:
</span><del>- url = "http://%s:%s/%s" % (config.ServerHostName, config.HTTPPort,
</del><ins>+ url = "http://%s:%s/%s" % (
+ config.ServerHostName, config.HTTPPort,
</ins><span class="cx"> applePushSettings.SubscriptionURL)
</span><span class="cx"> settings["SubscriptionURL"] = url
</span><span class="cx"> settings["SubscriptionRefreshIntervalSeconds"] = applePushSettings.SubscriptionRefreshIntervalSeconds
</span><span class="lines">@@ -263,5 +269,6 @@
</span><span class="cx"> @type priority: L{PushPriority}
</span><span class="cx"> """
</span><span class="cx"> for observer in self.observers:
</span><del>- yield observer.enqueue(transaction, pushKey,
</del><ins>+ yield observer.enqueue(
+ transaction, pushKey,
</ins><span class="cx"> dataChangedTimestamp=None, priority=priority)
</span></span></pre></div>
<a id="CalendarServertrunkcalendarserverpushtesttest_amppushpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/push/test/test_amppush.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/push/test/test_amppush.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/push/test/test_amppush.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -58,7 +58,8 @@
</span><span class="cx"> self.assertTrue(client3.subscribedToID("/CalDAV/localhost/user03/"))
</span><span class="cx">
</span><span class="cx"> dataChangedTimestamp = 1354815999
</span><del>- service.enqueue(None, "/CalDAV/localhost/user01/",
</del><ins>+ service.enqueue(
+ None, "/CalDAV/localhost/user01/",
</ins><span class="cx"> dataChangedTimestamp=dataChangedTimestamp,
</span><span class="cx"> priority=PushPriority.high)
</span><span class="cx"> self.assertEquals(len(client1.history), 0)
</span><span class="lines">@@ -114,7 +115,8 @@
</span><span class="cx"> client1.reset()
</span><span class="cx"> client2.reset()
</span><span class="cx"> client2.unsubscribe("token2", "/CalDAV/localhost/user01/")
</span><del>- service.enqueue(None, "/CalDAV/localhost/user01/",
</del><ins>+ service.enqueue(
+ None, "/CalDAV/localhost/user01/",
</ins><span class="cx"> dataChangedTimestamp=dataChangedTimestamp,
</span><span class="cx"> priority=PushPriority.low)
</span><span class="cx"> self.assertEquals(len(client1.history), 0)
</span><span class="lines">@@ -142,7 +144,8 @@
</span><span class="cx"> client1.reset()
</span><span class="cx"> client2.reset()
</span><span class="cx"> client2.subscribe("token2", "/CalDAV/localhost/user01/")
</span><del>- service.enqueue(None, "/CalDAV/localhost/user01/",
</del><ins>+ service.enqueue(
+ None, "/CalDAV/localhost/user01/",
</ins><span class="cx"> dataChangedTimestamp=dataChangedTimestamp,
</span><span class="cx"> priority=PushPriority.medium)
</span><span class="cx"> self.assertEquals(
</span></span></pre></div>
<a id="CalendarServertrunkcalendarserverpushtesttest_applepushpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/push/test/test_applepush.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/push/test/test_applepush.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/push/test/test_applepush.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -109,7 +109,8 @@
</span><span class="cx">
</span><span class="cx"> # Set up the service
</span><span class="cx"> clock = Clock()
</span><del>- service = (yield ApplePushNotifierService.makeService(settings,
</del><ins>+ service = (yield ApplePushNotifierService.makeService(
+ settings,
</ins><span class="cx"> self._sqlCalendarStore, testConnectorClass=TestConnector, reactor=clock))
</span><span class="cx"> self.assertEquals(set(service.providers.keys()), set(["CalDAV", "CardDAV"]))
</span><span class="cx"> self.assertEquals(set(service.feedbacks.keys()), set(["CalDAV", "CardDAV"]))
</span><span class="lines">@@ -120,14 +121,17 @@
</span><span class="cx"> # Notification arrives from calendar server
</span><span class="cx"> dataChangedTimestamp = 1354815999
</span><span class="cx"> txn = self._sqlCalendarStore.newTransaction()
</span><del>- yield service.enqueue(txn, "/CalDAV/calendars.example.com/user01/calendar/",
</del><ins>+ yield service.enqueue(
+ txn, "/CalDAV/calendars.example.com/user01/calendar/",
</ins><span class="cx"> dataChangedTimestamp=dataChangedTimestamp, priority=PushPriority.high)
</span><span class="cx"> yield txn.commit()
</span><span class="cx">
</span><span class="cx"> # The notifications should be in the queue
</span><del>- self.assertTrue(((token, key1), dataChangedTimestamp, PushPriority.high)
</del><ins>+ self.assertTrue(
+ ((token, key1), dataChangedTimestamp, PushPriority.high)
</ins><span class="cx"> in service.providers["CalDAV"].queue)
</span><del>- self.assertTrue(((token2, key1), dataChangedTimestamp, PushPriority.high)
</del><ins>+ self.assertTrue(
+ ((token2, key1), dataChangedTimestamp, PushPriority.high)
</ins><span class="cx"> in service.providers["CalDAV"].queue)
</span><span class="cx">
</span><span class="cx"> # Start the service, making the connection which should service the
</span><span class="lines">@@ -186,7 +190,8 @@
</span><span class="cx"> providerConnector.transport.data = None
</span><span class="cx"> # Send notification while service is connected
</span><span class="cx"> txn = self._sqlCalendarStore.newTransaction()
</span><del>- yield service.enqueue(txn, "/CalDAV/calendars.example.com/user01/calendar/",
</del><ins>+ yield service.enqueue(
+ txn, "/CalDAV/calendars.example.com/user01/calendar/",
</ins><span class="cx"> priority=PushPriority.low)
</span><span class="cx"> yield txn.commit()
</span><span class="cx"> clock.advance(1) # so that first push is sent
</span><span class="lines">@@ -217,7 +222,8 @@
</span><span class="cx"> # with amounts of data not fitting message boundaries
</span><span class="cx"> # Send 1st 4 bytes
</span><span class="cx"> history = []
</span><del>- errorData = struct.pack("!BBIBBI",
</del><ins>+ errorData = struct.pack(
+ "!BBIBBI",
</ins><span class="cx"> APNProviderProtocol.COMMAND_ERROR, 3, 4,
</span><span class="cx"> APNProviderProtocol.COMMAND_ERROR, 5, 6,
</span><span class="cx"> )
</span><span class="lines">@@ -243,7 +249,8 @@
</span><span class="cx"> feedbackConnector = service.feedbacks["CalDAV"].testConnector
</span><span class="cx"> timestamp = 2000
</span><span class="cx"> binaryToken = token.decode("hex")
</span><del>- feedbackData = struct.pack("!IH32s", timestamp, len(binaryToken),
</del><ins>+ feedbackData = struct.pack(
+ "!IH32s", timestamp, len(binaryToken),
</ins><span class="cx"> binaryToken)
</span><span class="cx"> yield feedbackConnector.receiveData(feedbackData)
</span><span class="cx">
</span><span class="lines">@@ -255,10 +262,11 @@
</span><span class="cx"> return succeed(None)
</span><span class="cx"> timestamp = 2000
</span><span class="cx"> binaryToken = token.decode("hex")
</span><del>- feedbackData = struct.pack("!IH32sIH32s",
</del><ins>+ feedbackData = struct.pack(
+ "!IH32sIH32s",
</ins><span class="cx"> timestamp, len(binaryToken), binaryToken,
</span><span class="cx"> timestamp, len(binaryToken), binaryToken,
</span><del>- )
</del><ins>+ )
</ins><span class="cx"> # Send 1st 10 bytes
</span><span class="cx"> yield feedbackConnector.receiveData(feedbackData[:10], fn=feedbackTestFunction)
</span><span class="cx"> # Send remaining bytes
</span><span class="lines">@@ -276,7 +284,8 @@
</span><span class="cx"> txn = self._sqlCalendarStore.newTransaction()
</span><span class="cx"> subscriptions = (yield txn.apnSubscriptionsByToken(token))
</span><span class="cx"> yield txn.commit()
</span><del>- self.assertEquals(subscriptions,
</del><ins>+ self.assertEquals(
+ subscriptions,
</ins><span class="cx"> [["/CalDAV/calendars.example.com/user02/calendar/", 3000, "D2256BCC-48E2-42D1-BD89-CBA1E4CCDFFB"]]
</span><span class="cx"> )
</span><span class="cx">
</span><span class="lines">@@ -333,8 +342,10 @@
</span><span class="cx"> history = TokenHistory(maxSize=5)
</span><span class="cx">
</span><span class="cx"> # Ensure returned identifiers increment
</span><del>- for id, token in enumerate(("one", "two", "three", "four", "five"),
- start=1):
</del><ins>+ for id, token in enumerate(
+ ("one", "two", "three", "four", "five"),
+ start=1
+ ):
</ins><span class="cx"> self.assertEquals(id, history.add(token))
</span><span class="cx"> self.assertEquals(len(history.history), 5)
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServertrunkcalendarserverpushtesttest_notifierpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/push/test/test_notifier.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/push/test/test_notifier.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/push/test/test_notifier.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -36,8 +36,10 @@
</span><span class="cx"> self.history = []
</span><span class="cx">
</span><span class="cx">
</span><del>- def enqueue(self, transaction, id, dataChangedTimestamp=None,
- priority=None):
</del><ins>+ def enqueue(
+ self, transaction, id, dataChangedTimestamp=None,
+ priority=None
+ ):
</ins><span class="cx"> self.history.append((id, priority))
</span><span class="cx"> return(succeed(None))
</span><span class="cx">
</span><span class="lines">@@ -95,8 +97,10 @@
</span><span class="cx"> self.history = []
</span><span class="cx">
</span><span class="cx">
</span><del>- def enqueue(self, transaction, pushID, dataChangedTimestamp=None,
- priority=None):
</del><ins>+ def enqueue(
+ self, transaction, pushID, dataChangedTimestamp=None,
+ priority=None
+ ):
</ins><span class="cx"> self.history.append((pushID, priority))
</span><span class="cx"> return(succeed(None))
</span><span class="cx">
</span><span class="lines">@@ -117,61 +121,75 @@
</span><span class="cx"> self._sqlCalendarStore.callWithNewTransactions(decorateTransaction)
</span><span class="cx">
</span><span class="cx"> txn = self._sqlCalendarStore.newTransaction()
</span><del>- yield txn.enqueue(PushNotificationWork,
</del><ins>+ yield txn.enqueue(
+ PushNotificationWork,
</ins><span class="cx"> pushID="/CalDAV/localhost/foo/",
</span><span class="cx"> pushPriority=PushPriority.high.value
</span><span class="cx"> )
</span><span class="cx"> yield txn.commit()
</span><span class="cx"> yield JobItem.waitEmpty(self.storeUnderTest().newTransaction, reactor, 60)
</span><del>- self.assertEquals(pushDistributor.history,
</del><ins>+ self.assertEquals(
+ pushDistributor.history,
</ins><span class="cx"> [("/CalDAV/localhost/foo/", PushPriority.high)])
</span><span class="cx">
</span><span class="cx"> pushDistributor.reset()
</span><span class="cx"> txn = self._sqlCalendarStore.newTransaction()
</span><del>- yield txn.enqueue(PushNotificationWork,
</del><ins>+ yield txn.enqueue(
+ PushNotificationWork,
</ins><span class="cx"> pushID="/CalDAV/localhost/bar/",
</span><span class="cx"> pushPriority=PushPriority.high.value
</span><span class="cx"> )
</span><del>- yield txn.enqueue(PushNotificationWork,
</del><ins>+ yield txn.enqueue(
+ PushNotificationWork,
</ins><span class="cx"> pushID="/CalDAV/localhost/bar/",
</span><span class="cx"> pushPriority=PushPriority.high.value
</span><span class="cx"> )
</span><del>- yield txn.enqueue(PushNotificationWork,
</del><ins>+ yield txn.enqueue(
+ PushNotificationWork,
</ins><span class="cx"> pushID="/CalDAV/localhost/bar/",
</span><span class="cx"> pushPriority=PushPriority.high.value
</span><span class="cx"> )
</span><span class="cx"> # Enqueue a different pushID to ensure those are not grouped with
</span><span class="cx"> # the others:
</span><del>- yield txn.enqueue(PushNotificationWork,
</del><ins>+ yield txn.enqueue(
+ PushNotificationWork,
</ins><span class="cx"> pushID="/CalDAV/localhost/baz/",
</span><span class="cx"> pushPriority=PushPriority.high.value
</span><span class="cx"> )
</span><span class="cx">
</span><span class="cx"> yield txn.commit()
</span><span class="cx"> yield JobItem.waitEmpty(self.storeUnderTest().newTransaction, reactor, 60)
</span><del>- self.assertEquals(set(pushDistributor.history),
- set([("/CalDAV/localhost/bar/", PushPriority.high),
- ("/CalDAV/localhost/baz/", PushPriority.high)]))
</del><ins>+ self.assertEquals(
+ set(pushDistributor.history),
+ set([
+ ("/CalDAV/localhost/bar/", PushPriority.high),
+ ("/CalDAV/localhost/baz/", PushPriority.high)
+ ])
+ )
</ins><span class="cx">
</span><span class="cx"> # Ensure only the high-water-mark priority push goes out, by
</span><span class="cx"> # enqueuing low, medium, and high notifications
</span><span class="cx"> pushDistributor.reset()
</span><span class="cx"> txn = self._sqlCalendarStore.newTransaction()
</span><del>- yield txn.enqueue(PushNotificationWork,
</del><ins>+ yield txn.enqueue(
+ PushNotificationWork,
</ins><span class="cx"> pushID="/CalDAV/localhost/bar/",
</span><span class="cx"> pushPriority=PushPriority.low.value
</span><span class="cx"> )
</span><del>- yield txn.enqueue(PushNotificationWork,
</del><ins>+ yield txn.enqueue(
+ PushNotificationWork,
</ins><span class="cx"> pushID="/CalDAV/localhost/bar/",
</span><span class="cx"> pushPriority=PushPriority.high.value
</span><span class="cx"> )
</span><del>- yield txn.enqueue(PushNotificationWork,
</del><ins>+ yield txn.enqueue(
+ PushNotificationWork,
</ins><span class="cx"> pushID="/CalDAV/localhost/bar/",
</span><span class="cx"> pushPriority=PushPriority.medium.value
</span><span class="cx"> )
</span><span class="cx"> yield txn.commit()
</span><span class="cx"> yield JobItem.waitEmpty(self.storeUnderTest().newTransaction, reactor, 60)
</span><del>- self.assertEquals(pushDistributor.history,
</del><ins>+ self.assertEquals(
+ pushDistributor.history,
</ins><span class="cx"> [("/CalDAV/localhost/bar/", PushPriority.high)])
</span><span class="cx">
</span><span class="cx">
</span><span class="lines">@@ -205,7 +223,8 @@
</span><span class="cx">
</span><span class="cx"> home = yield self.homeUnderTest(name="user01")
</span><span class="cx"> yield home.notifyChanged(category=ChangeCategory.default)
</span><del>- self.assertEquals(self.notifierFactory.history,
</del><ins>+ self.assertEquals(
+ self.notifierFactory.history,
</ins><span class="cx"> [("/CalDAV/example.com/user01/", PushPriority.high)])
</span><span class="cx"> yield self.commit()
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServertrunkcalendarserverpushutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/push/util.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/push/util.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/push/util.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -160,13 +160,15 @@
</span><span class="cx"> for token in tokens:
</span><span class="cx"> internalKey = (token, key)
</span><span class="cx"> if internalKey in self.outstanding:
</span><del>- self.log.debug("PushScheduler already has this scheduled: %s" %
</del><ins>+ self.log.debug(
+ "PushScheduler already has this scheduled: %s" %
</ins><span class="cx"> (internalKey,))
</span><span class="cx"> else:
</span><span class="cx"> self.outstanding[internalKey] = self.reactor.callLater(
</span><span class="cx"> scheduleTime, self.send, token, key, dataChangedTimestamp,
</span><span class="cx"> priority)
</span><del>- self.log.debug("PushScheduler scheduled: %s in %.0f sec" %
</del><ins>+ self.log.debug(
+ "PushScheduler scheduled: %s in %.0f sec" %
</ins><span class="cx"> (internalKey, scheduleTime))
</span><span class="cx"> scheduleTime += self.staggerSeconds
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertapcaldavpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tap/caldav.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tap/caldav.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tap/caldav.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -2470,7 +2470,7 @@
</span><span class="cx"> @param name: the name of the process to signal.
</span><span class="cx"> @type signal: C{str}
</span><span class="cx"> """
</span><del>- if not name in self.protocols:
</del><ins>+ if name not in self.protocols:
</ins><span class="cx"> return
</span><span class="cx"> proc = self.protocols[name].transport
</span><span class="cx"> try:
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertaptesttest_utilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tap/test/test_util.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tap/test/test_util.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tap/test/test_util.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -201,7 +201,8 @@
</span><span class="cx"> )
</span><span class="cx"> result = (yield self.stepper.start("abc"))
</span><span class="cx"> self.assertEquals(result, "abc") # original result passed through
</span><del>- self.assertEquals(self.history,
</del><ins>+ self.assertEquals(
+ self.history,
</ins><span class="cx"> ['one success', 'two success', 'three success', 'four success'])
</span><span class="cx">
</span><span class="cx">
</span><span class="lines">@@ -211,7 +212,8 @@
</span><span class="cx"> self.stepper.addStep(StepThree(self._record, True))
</span><span class="cx"> self.stepper.addStep(StepFour(self._record, True))
</span><span class="cx"> self.failUnlessFailure(self.stepper.start(), ZeroDivisionError)
</span><del>- self.assertEquals(self.history,
</del><ins>+ self.assertEquals(
+ self.history,
</ins><span class="cx"> ['one success', 'two failure', 'three failure', 'four failure'])
</span><span class="cx">
</span><span class="cx">
</span><span class="lines">@@ -223,5 +225,6 @@
</span><span class="cx"> self.stepper.addStep(StepFour(self._record, False))
</span><span class="cx"> result = (yield self.stepper.start("abc"))
</span><span class="cx"> self.assertEquals(result, None) # original result is gone
</span><del>- self.assertEquals(self.history,
</del><ins>+ self.assertEquals(
+ self.history,
</ins><span class="cx"> ['one success', 'two failure', 'three success', 'four failure'])
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertaputilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tap/util.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tap/util.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tap/util.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -289,7 +289,7 @@
</span><span class="cx"> "No such user: {user}".format(
</span><span class="cx"> user=credentials.credentials.username
</span><span class="cx"> )
</span><del>- )
</del><ins>+ )
</ins><span class="cx">
</span><span class="cx"> # See if record is enabledForLogin
</span><span class="cx"> if not credentials.authnPrincipal.record.isLoginEnabled():
</span><span class="lines">@@ -461,7 +461,8 @@
</span><span class="cx"> )
</span><span class="cx">
</span><span class="cx"> if config.DirectoryAddressBook.Enabled and config.EnableSearchAddressBook:
</span><del>- log.info("Setting up directory address book: {cls}",
</del><ins>+ log.info(
+ "Setting up directory address book: {cls}",
</ins><span class="cx"> cls=directoryBackedAddressBookResourceClass)
</span><span class="cx">
</span><span class="cx"> directoryBackedAddressBookCollection = directoryBackedAddressBookResourceClass(
</span><span class="lines">@@ -557,8 +558,9 @@
</span><span class="cx">
</span><span class="cx"> # Timezone service is optional
</span><span class="cx"> if config.EnableTimezoneService:
</span><del>- log.info("Setting up time zone service resource: {cls}",
- cls=timezoneServiceResourceClass)
</del><ins>+ log.info(
+ "Setting up time zone service resource: {cls}",
+ cls=timezoneServiceResourceClass)
</ins><span class="cx">
</span><span class="cx"> timezoneService = timezoneServiceResourceClass(
</span><span class="cx"> root,
</span><span class="lines">@@ -567,8 +569,9 @@
</span><span class="cx">
</span><span class="cx"> # Standard Timezone service is optional
</span><span class="cx"> if config.TimezoneService.Enabled:
</span><del>- log.info("Setting up standard time zone service resource: {cls}",
- cls=timezoneStdServiceResourceClass)
</del><ins>+ log.info(
+ "Setting up standard time zone service resource: {cls}",
+ cls=timezoneStdServiceResourceClass)
</ins><span class="cx">
</span><span class="cx"> timezoneStdService = timezoneStdServiceResourceClass(
</span><span class="cx"> root,
</span><span class="lines">@@ -630,8 +633,9 @@
</span><span class="cx"> # WebCal
</span><span class="cx"> #
</span><span class="cx"> if config.WebCalendarRoot:
</span><del>- log.info("Setting up WebCalendar resource: {res}",
- res=config.WebCalendarRoot)
</del><ins>+ log.info(
+ "Setting up WebCalendar resource: {res}",
+ res=config.WebCalendarRoot)
</ins><span class="cx"> webCalendar = webCalendarResourceClass(
</span><span class="cx"> config.WebCalendarRoot,
</span><span class="cx"> principalCollections=(principalCollection,),
</span><span class="lines">@@ -657,7 +661,8 @@
</span><span class="cx"> #
</span><span class="cx"> apnConfig = config.Notifications.Services.APNS
</span><span class="cx"> if apnConfig.Enabled:
</span><del>- log.info("Setting up APNS resource at /{url}",
</del><ins>+ log.info(
+ "Setting up APNS resource at /{url}",
</ins><span class="cx"> url=apnConfig["SubscriptionURL"])
</span><span class="cx"> apnResource = apnSubscriptionResourceClass(root, newStore)
</span><span class="cx"> root.putChild(apnConfig["SubscriptionURL"], apnResource)
</span><span class="lines">@@ -690,7 +695,8 @@
</span><span class="cx"> schemeConfig["Qop"],
</span><span class="cx"> realm,
</span><span class="cx"> ))
</span><del>- log.info("Overriding {path} with {cls} ({schemes})",
</del><ins>+ log.info(
+ "Overriding {path} with {cls} ({schemes})",
</ins><span class="cx"> path=path, cls=cls, schemes=schemes)
</span><span class="cx">
</span><span class="cx"> authWrapper = AuthenticationWrapper(
</span><span class="lines">@@ -917,11 +923,13 @@
</span><span class="cx"> try:
</span><span class="cx"> memory = self._memoryForPID(pid, self._residentOnly)
</span><span class="cx"> except Exception, e:
</span><del>- log.error("Unable to determine memory usage of PID: {pid} ({err})",
</del><ins>+ log.error(
+ "Unable to determine memory usage of PID: {pid} ({err})",
</ins><span class="cx"> pid=pid, err=e)
</span><span class="cx"> continue
</span><span class="cx"> if memory > self._bytes:
</span><del>- log.warn("Killing large process: {name} PID:{pid} {memtype}:{mem}",
</del><ins>+ log.warn(
+ "Killing large process: {name} PID:{pid} {memtype}:{mem}",
</ins><span class="cx"> name=name, pid=pid,
</span><span class="cx"> memtype=("Resident" if self._residentOnly else "Virtual"),
</span><span class="cx"> mem=memory)
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolsanonymizepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/anonymize.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/anonymize.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/anonymize.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -151,7 +151,8 @@
</span><span class="cx"> print("Couldn't find %s, skipping." % (home,))
</span><span class="cx"> continue
</span><span class="cx"> sourceHome = os.path.join(secondPath, home)
</span><del>- destHome = os.path.join(destUidHomes,
</del><ins>+ destHome = os.path.join(
+ destUidHomes,
</ins><span class="cx"> record['guid'][0:2], record['guid'][2:4],
</span><span class="cx"> record['guid'])
</span><span class="cx"> homeList.append((sourceHome, destHome, record))
</span><span class="lines">@@ -261,7 +262,8 @@
</span><span class="cx"> for freeBusy in freeBusies:
</span><span class="cx"> xml += "<href xmlns='DAV:'>/calendars/__uids__/%s/%s/</href>\n" % (record['guid'], freeBusy)
</span><span class="cx"> xml += "</calendar-free-busy-set>\n"
</span><del>- xattr.setxattr(destInbox,
</del><ins>+ xattr.setxattr(
+ destInbox,
</ins><span class="cx"> "WebDAV:{urn:ietf:params:xml:ns:caldav}calendar-free-busy-set",
</span><span class="cx"> zlib.compress(xml)
</span><span class="cx"> )
</span><span class="lines">@@ -399,7 +401,8 @@
</span><span class="cx"> origRecordNames = record['dsAttrTypeStandard:RecordName']
</span><span class="cx"> origEmails = record.get('dsAttrTypeStandard:EMailAddress', [])
</span><span class="cx"> origMembers = record.get('dsAttrTypeStandard:GroupMembers', [])
</span><del>- self.addRecord(internalType=internalType, guid=origGUID,
</del><ins>+ self.addRecord(
+ internalType=internalType, guid=origGUID,
</ins><span class="cx"> names=origRecordNames, emails=origEmails,
</span><span class="cx"> members=origMembers)
</span><span class="cx">
</span><span class="lines">@@ -407,8 +410,10 @@
</span><span class="cx"> print("")
</span><span class="cx">
</span><span class="cx">
</span><del>- def addRecord(self, internalType="users", guid=None, names=None,
- emails=None, members=None, cua=None):
</del><ins>+ def addRecord(
+ self, internalType="users", guid=None, names=None,
+ emails=None, members=None, cua=None
+ ):
</ins><span class="cx">
</span><span class="cx"> if cua:
</span><span class="cx"> keys = [self.cua2key(cua)]
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolscalverifypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/calverify.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/calverify.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/calverify.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -170,7 +170,8 @@
</span><span class="cx"> brokenRID = brokenComponent.propertyValue("RECURRENCE-ID")
</span><span class="cx"> if doFix:
</span><span class="cx"> master.addProperty(Property("RDATE", [brokenRID, ]))
</span><del>- fixed.append("Added RDATE for invalid occurrence: %s" %
</del><ins>+ fixed.append(
+ "Added RDATE for invalid occurrence: %s" %
</ins><span class="cx"> (brokenRID,))
</span><span class="cx"> else:
</span><span class="cx"> unfixed.append("Invalid occurrence: %s" % (brokenRID,))
</span><span class="lines">@@ -339,7 +340,7 @@
</span><span class="cx"> ['no-organizer', '', "Detect dark events without an organizer"],
</span><span class="cx"> ['invalid-organizer', '', "Detect dark events with an organizer not in the directory"],
</span><span class="cx"> ['disabled-organizer', '', "Detect dark events with a disabled organizer"],
</span><del>-]
</del><ins>+ ]
</ins><span class="cx">
</span><span class="cx"> optParameters = [
</span><span class="cx"> ['config', 'f', DEFAULT_CONFIG_FILE, "Specify caldavd.plist configuration path."],
</span><span class="lines">@@ -478,11 +479,11 @@
</span><span class="cx">
</span><span class="cx"> if inbox:
</span><span class="cx"> cojoin = (cb.CALENDAR_RESOURCE_ID == co.CALENDAR_RESOURCE_ID).And(
</span><del>- cb.BIND_MODE == _BIND_MODE_OWN)
</del><ins>+ cb.BIND_MODE == _BIND_MODE_OWN)
</ins><span class="cx"> else:
</span><span class="cx"> cojoin = (cb.CALENDAR_RESOURCE_ID == co.CALENDAR_RESOURCE_ID).And(
</span><del>- cb.BIND_MODE == _BIND_MODE_OWN).And(
- cb.CALENDAR_RESOURCE_NAME != "inbox")
</del><ins>+ cb.BIND_MODE == _BIND_MODE_OWN).And(
+ cb.CALENDAR_RESOURCE_NAME != "inbox")
</ins><span class="cx">
</span><span class="cx"> kwds = {}
</span><span class="cx"> rows = (yield Select(
</span><span class="lines">@@ -503,11 +504,11 @@
</span><span class="cx">
</span><span class="cx"> if inbox:
</span><span class="cx"> cojoin = (cb.CALENDAR_RESOURCE_ID == co.CALENDAR_RESOURCE_ID).And(
</span><del>- cb.BIND_MODE == _BIND_MODE_OWN)
</del><ins>+ cb.BIND_MODE == _BIND_MODE_OWN)
</ins><span class="cx"> else:
</span><span class="cx"> cojoin = (cb.CALENDAR_RESOURCE_ID == co.CALENDAR_RESOURCE_ID).And(
</span><del>- cb.BIND_MODE == _BIND_MODE_OWN).And(
- cb.CALENDAR_RESOURCE_NAME != "inbox")
</del><ins>+ cb.BIND_MODE == _BIND_MODE_OWN).And(
+ cb.CALENDAR_RESOURCE_NAME != "inbox")
</ins><span class="cx">
</span><span class="cx"> kwds = {"uuid": uuid}
</span><span class="cx"> if len(uuid) != 36:
</span><span class="lines">@@ -558,11 +559,11 @@
</span><span class="cx">
</span><span class="cx"> if inbox:
</span><span class="cx"> cojoin = (cb.CALENDAR_RESOURCE_ID == co.CALENDAR_RESOURCE_ID).And(
</span><del>- cb.BIND_MODE == _BIND_MODE_OWN)
</del><ins>+ cb.BIND_MODE == _BIND_MODE_OWN)
</ins><span class="cx"> else:
</span><span class="cx"> cojoin = (cb.CALENDAR_RESOURCE_ID == co.CALENDAR_RESOURCE_ID).And(
</span><del>- cb.BIND_MODE == _BIND_MODE_OWN).And(
- cb.CALENDAR_RESOURCE_NAME != "inbox")
</del><ins>+ cb.BIND_MODE == _BIND_MODE_OWN).And(
+ cb.CALENDAR_RESOURCE_NAME != "inbox")
</ins><span class="cx">
</span><span class="cx"> kwds = {
</span><span class="cx"> "UID" : uid,
</span><span class="lines">@@ -611,8 +612,8 @@
</span><span class="cx"> tr = schema.TIME_RANGE
</span><span class="cx">
</span><span class="cx"> cojoin = (cb.CALENDAR_RESOURCE_ID == co.CALENDAR_RESOURCE_ID).And(
</span><del>- cb.BIND_MODE == _BIND_MODE_OWN).And(
- cb.CALENDAR_RESOURCE_NAME != "inbox")
</del><ins>+ cb.BIND_MODE == _BIND_MODE_OWN).And(
+ cb.CALENDAR_RESOURCE_NAME != "inbox")
</ins><span class="cx">
</span><span class="cx"> kwds = {
</span><span class="cx"> "Start" : pyCalendarTodatetime(start),
</span><span class="lines">@@ -1543,7 +1544,7 @@
</span><span class="cx"> eachAttendeesOwnStatus[organizerAttendee] = self.buildAttendeeStates(calendar, self.start, self.end, attendee_only=organizerAttendee)
</span><span class="cx"> attendeeResIDs[(organizerAttendee, uid)] = attresid
</span><span class="cx"> attendeeCreatedModified[organizerAttendee] = (att_created, att_modified,)
</span><del>- #print("Reloaded missing attendee data")
</del><ins>+ # print("Reloaded missing attendee data")
</ins><span class="cx">
</span><span class="cx"> # If an entry for the attendee exists, then check whether attendee status matches
</span><span class="cx"> if organizerAttendee in eachAttendeesOwnStatus:
</span><span class="lines">@@ -1708,8 +1709,8 @@
</span><span class="cx"> rows = yield self.getAllResourceInfoWithUID(uid)
</span><span class="cx"> yield self.buildResourceInfo(rows, onlyOrganizer=True)
</span><span class="cx">
</span><del>- #if uid in self.organized_byuid:
- # print("Reloaded missing organizer data: %s" % (uid,))
</del><ins>+ # if uid in self.organized_byuid:
+ # print("Reloaded missing organizer data: %s" % (uid,))
</ins><span class="cx">
</span><span class="cx"> if uid not in self.organized_byuid:
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolscmdlinepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/cmdline.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/cmdline.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/cmdline.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -74,6 +74,7 @@
</span><span class="cx"> if serviceMaker is None:
</span><span class="cx"> serviceMaker = CalDAVServiceMaker
</span><span class="cx">
</span><ins>+
</ins><span class="cx"> # We want to validate that the actual service is always an instance of WorkerService, so wrap the
</span><span class="cx"> # service maker callback inside a function that does that check
</span><span class="cx"> def _makeValidService(store):
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolsdbinspectpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/dbinspect.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/dbinspect.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/dbinspect.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -101,6 +101,7 @@
</span><span class="cx"> returnValue(record.shortNames[0] if record else "(%s)" % (uid,))
</span><span class="cx">
</span><span class="cx">
</span><ins>+
</ins><span class="cx"> @inlineCallbacks
</span><span class="cx"> def UIDFromInput(txn, value):
</span><span class="cx"> try:
</span><span class="lines">@@ -755,14 +756,14 @@
</span><span class="cx">
</span><span class="cx"> # Create fake filter element to match time-range
</span><span class="cx"> filter = caldavxml.Filter(
</span><del>- caldavxml.ComponentFilter(
- caldavxml.ComponentFilter(
- timerange,
- name=("VEVENT",),
- ),
- name="VCALENDAR",
- )
- )
</del><ins>+ caldavxml.ComponentFilter(
+ caldavxml.ComponentFilter(
+ timerange,
+ name=("VEVENT",),
+ ),
+ name="VCALENDAR",
+ )
+ )
</ins><span class="cx"> filter = Filter(filter)
</span><span class="cx"> filter.settimezone(None)
</span><span class="cx">
</span><span class="lines">@@ -806,26 +807,26 @@
</span><span class="cx"> schema.CALENDAR_OBJECT_REVISIONS,
</span><span class="cx">
</span><span class="cx"> schema.CALENDAR,
</span><del>- #schema.CALENDAR_BIND, - cascades
- #schema.CALENDAR_OBJECT, - cascades
- #schema.TIME_RANGE, - cascades
- #schema.TRANSPARENCY, - cascades
</del><ins>+ # schema.CALENDAR_BIND, - cascades
+ # schema.CALENDAR_OBJECT, - cascades
+ # schema.TIME_RANGE, - cascades
+ # schema.TRANSPARENCY, - cascades
</ins><span class="cx">
</span><span class="cx">
</span><span class="cx"> schema.CALENDAR_HOME,
</span><del>- #schema.CALENDAR_HOME_METADATA - cascades
</del><ins>+ # schema.CALENDAR_HOME_METADATA - cascades
</ins><span class="cx"> schema.ATTACHMENT,
</span><span class="cx">
</span><span class="cx"> schema.ADDRESSBOOK_OBJECT_REVISIONS,
</span><span class="cx">
</span><span class="cx"> schema.ADDRESSBOOK_HOME,
</span><del>- #schema.ADDRESSBOOK_HOME_METADATA, - cascades
- #schema.ADDRESSBOOK_BIND, - cascades
- #schema.ADDRESSBOOK_OBJECT, - cascades
</del><ins>+ # schema.ADDRESSBOOK_HOME_METADATA, - cascades
+ # schema.ADDRESSBOOK_BIND, - cascades
+ # schema.ADDRESSBOOK_OBJECT, - cascades
</ins><span class="cx">
</span><span class="cx"> schema.NOTIFICATION_HOME,
</span><span class="cx"> schema.NOTIFICATION,
</span><del>- #schema.NOTIFICATION_OBJECT_REVISIONS - cascades,
</del><ins>+ # schema.NOTIFICATION_OBJECT_REVISIONS - cascades,
</ins><span class="cx"> )
</span><span class="cx">
</span><span class="cx"> for tableschema in wipeout:
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolsnotificationspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/notifications.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/notifications.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/notifications.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -143,11 +143,14 @@
</span><span class="cx"> password = getpass("Password for %s: " % (username,))
</span><span class="cx"> admin = username
</span><span class="cx">
</span><del>- monitorService = PushMonitorService(useSSL, host, port, nodes, admin,
</del><ins>+ monitorService = PushMonitorService(
+ useSSL, host, port, nodes, admin,
</ins><span class="cx"> username, password, verbose)
</span><del>- reactor.addSystemEventTrigger("during", "startup",
</del><ins>+ reactor.addSystemEventTrigger(
+ "during", "startup",
</ins><span class="cx"> monitorService.startService)
</span><del>- reactor.addSystemEventTrigger("before", "shutdown",
</del><ins>+ reactor.addSystemEventTrigger(
+ "before", "shutdown",
</ins><span class="cx"> monitorService.stopService)
</span><span class="cx">
</span><span class="cx"> reactor.run()
</span><span class="lines">@@ -177,17 +180,20 @@
</span><span class="cx"> self.xmlStream = None
</span><span class="cx"> self.doKeepAlive = True
</span><span class="cx">
</span><del>- xmlstream.XmlStreamFactory.__init__(self,
- XMPPAuthenticator(JID(self.jid), password))
</del><ins>+ xmlstream.XmlStreamFactory.__init__(
+ self,
+ XMPPAuthenticator(JID(self.jid), password))
</ins><span class="cx">
</span><span class="cx"> self.addBootstrap(xmlstream.STREAM_CONNECTED_EVENT, self.connected)
</span><span class="cx"> self.addBootstrap(xmlstream.STREAM_END_EVENT, self.disconnected)
</span><span class="cx"> self.addBootstrap(xmlstream.INIT_FAILED_EVENT, self.initFailed)
</span><span class="cx">
</span><span class="cx"> self.addBootstrap(xmlstream.STREAM_AUTHD_EVENT, self.authenticated)
</span><del>- self.addBootstrap(IQAuthInitializer.INVALID_USER_EVENT,
</del><ins>+ self.addBootstrap(
+ IQAuthInitializer.INVALID_USER_EVENT,
</ins><span class="cx"> self.authFailed)
</span><del>- self.addBootstrap(IQAuthInitializer.AUTH_FAILED_EVENT,
</del><ins>+ self.addBootstrap(
+ IQAuthInitializer.AUTH_FAILED_EVENT,
</ins><span class="cx"> self.authFailed)
</span><span class="cx">
</span><span class="cx"> if sigint:
</span><span class="lines">@@ -253,7 +259,8 @@
</span><span class="cx"> if self.doKeepAlive and self.xmlStream is not None:
</span><span class="cx"> presence = domish.Element(('jabber:client', 'presence'))
</span><span class="cx"> self.xmlStream.send(presence)
</span><del>- self.presenceCall = reactor.callLater(self.presenceSeconds,
</del><ins>+ self.presenceCall = reactor.callLater(
+ self.presenceSeconds,
</ins><span class="cx"> self.sendPresence)
</span><span class="cx">
</span><span class="cx">
</span><span class="lines">@@ -340,8 +347,10 @@
</span><span class="cx"> using XMPP and monitored for updates.
</span><span class="cx"> """
</span><span class="cx">
</span><del>- def __init__(self, useSSL, host, port, nodes, authname, username, password,
- verbose):
</del><ins>+ def __init__(
+ self, useSSL, host, port, nodes, authname, username, password,
+ verbose
+ ):
</ins><span class="cx"> self.useSSL = useSSL
</span><span class="cx"> self.host = host
</span><span class="cx"> self.port = port
</span><span class="lines">@@ -365,7 +374,8 @@
</span><span class="cx"> for home in homes:
</span><span class="cx"> paths.add(home)
</span><span class="cx"> for principal in (yield self.getProxyFor()):
</span><del>- name, homes = (yield self.getPrincipalDetails(principal,
</del><ins>+ name, homes = (yield self.getPrincipalDetails(
+ principal,
</ins><span class="cx"> includeCardDAV=False))
</span><span class="cx"> if self.verbose:
</span><span class="cx"> print(name, homes)
</span><span class="lines">@@ -421,7 +431,8 @@
</span><span class="cx"> """
</span><span class="cx">
</span><span class="cx"> try:
</span><del>- responseBody = (yield self.makeRequest(path, "PROPFIND", headers,
</del><ins>+ responseBody = (yield self.makeRequest(
+ path, "PROPFIND", headers,
</ins><span class="cx"> body))
</span><span class="cx"> try:
</span><span class="cx"> doc = ElementTree.fromstring(responseBody)
</span><span class="lines">@@ -485,7 +496,8 @@
</span><span class="cx"> path = "/principals/users/%s/" % (self.username,)
</span><span class="cx">
</span><span class="cx"> try:
</span><del>- responseBody = (yield self.makeRequest(path, "PROPFIND", headers,
</del><ins>+ responseBody = (yield self.makeRequest(
+ path, "PROPFIND", headers,
</ins><span class="cx"> body))
</span><span class="cx"> try:
</span><span class="cx"> doc = ElementTree.fromstring(responseBody)
</span><span class="lines">@@ -541,7 +553,8 @@
</span><span class="cx"> """
</span><span class="cx">
</span><span class="cx"> try:
</span><del>- responseBody = (yield self.makeRequest(path, "PROPFIND", headers,
</del><ins>+ responseBody = (yield self.makeRequest(
+ path, "PROPFIND", headers,
</ins><span class="cx"> body))
</span><span class="cx"> host = None
</span><span class="cx"> port = None
</span><span class="lines">@@ -617,7 +630,8 @@
</span><span class="cx"> service = "pubsub.%s" % (host,)
</span><span class="cx"> jid = "%s@%s" % (self.authname, host)
</span><span class="cx">
</span><del>- pubsubFactory = PubSubClientFactory(jid, self.password, service, nodes,
</del><ins>+ pubsubFactory = PubSubClientFactory(
+ jid, self.password, service, nodes,
</ins><span class="cx"> self.verbose)
</span><span class="cx"> connect(GAIEndpoint(reactor, host, port), pubsubFactory)
</span><span class="cx">
</span><span class="lines">@@ -625,7 +639,8 @@
</span><span class="cx"> def makeRequest(self, path, method, headers, body):
</span><span class="cx"> scheme = "https:" if self.useSSL else "http:"
</span><span class="cx"> url = "%s//%s:%d%s" % (scheme, self.host, self.port, path)
</span><del>- caldavFactory = client.HTTPClientFactory(url, method=method,
</del><ins>+ caldavFactory = client.HTTPClientFactory(
+ url, method=method,
</ins><span class="cx"> headers=headers, postdata=body, agent="Push Monitor")
</span><span class="cx"> caldavFactory.username = self.authname
</span><span class="cx"> caldavFactory.password = self.password
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolsobliteratepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/obliterate.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/obliterate.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/obliterate.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -296,8 +296,8 @@
</span><span class="cx"> self.output.write("Total Resources: %d\n" % (self.totalResources,))
</span><span class="cx"> if self.attachments:
</span><span class="cx"> self.output.write("Attachments removed: %s\n" % (len(self.attachments,)))
</span><del>- #for attachment in self.attachments:
- # self.output.write(" %s\n" % (attachment,))
</del><ins>+ # for attachment in self.attachments:
+ # self.output.write(" %s\n" % (attachment,))
</ins><span class="cx"> self.output.write("Obliteration time: %.1fs\n" % (time.time() - t,))
</span><span class="cx">
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolsprincipalspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/principals.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/principals.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/principals.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -63,7 +63,7 @@
</span><span class="cx"> print("")
</span><span class="cx"> print(" Principals are identified by one of the following:")
</span><span class="cx"> print(" Type and shortname (eg.: users:wsanchez)")
</span><del>- #print(" A principal path (eg.: /principals/users/wsanchez/)")
</del><ins>+ # print(" A principal path (eg.: /principals/users/wsanchez/)")
</ins><span class="cx"> print(" A GUID (eg.: E415DBA7-40B5-49F5-A7CC-ACC81E4DEC79)")
</span><span class="cx"> print("")
</span><span class="cx"> print("options:")
</span><span class="lines">@@ -791,7 +791,7 @@
</span><span class="cx"> groupUIDs = yield txn.allGroupDelegates()
</span><span class="cx"> for groupUID in groupUIDs:
</span><span class="cx"> (
</span><del>- groupID, name, _ignore_membershipHash, modified, extant
</del><ins>+ groupID, name, _ignore_membershipHash, modified, _ignore_extant
</ins><span class="cx"> ) = yield txn.groupByUID(
</span><span class="cx"> groupUID
</span><span class="cx"> )
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolspurgepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/purge.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/purge.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/purge.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -302,7 +302,7 @@
</span><span class="cx"> print(" -h --help: print this help and exit")
</span><span class="cx"> print(" -f --config <path>: Specify caldavd.plist configuration path")
</span><span class="cx"> print(" -d --days <number>: specify how many days in the past to retain (default=%d)" % (DEFAULT_RETAIN_DAYS,))
</span><del>- #print(" -b --batch <number>: number of events to remove in each transaction (default=%d)" % (DEFAULT_BATCH_SIZE,))
</del><ins>+ # print(" -b --batch <number>: number of events to remove in each transaction (default=%d)" % (DEFAULT_BATCH_SIZE,))
</ins><span class="cx"> print(" -n --dry-run: calculate how many events to purge, but do not purge data")
</span><span class="cx"> print(" -v --verbose: print progress information")
</span><span class="cx"> print(" -D --debug: debug logging")
</span><span class="lines">@@ -475,7 +475,7 @@
</span><span class="cx"> print(" -h --help: print this help and exit")
</span><span class="cx"> print(" -f --config <path>: Specify caldavd.plist configuration path")
</span><span class="cx"> print(" -u --uuid <owner uid>: target a specific user UID")
</span><del>- #print(" -b --batch <number>: number of attachments to remove in each transaction (default=%d)" % (DEFAULT_BATCH_SIZE,))
</del><ins>+ # print(" -b --batch <number>: number of attachments to remove in each transaction (default=%d)" % (DEFAULT_BATCH_SIZE,))
</ins><span class="cx"> print(" -d --days <number>: specify how many days in the past to retain (default=%d) zero means no removal of old attachments" % (DEFAULT_RETAIN_DAYS,))
</span><span class="cx"> print(" -n --dry-run: calculate how many attachments to purge, but do not purge data")
</span><span class="cx"> print(" -v --verbose: print progress information")
</span><span class="lines">@@ -680,7 +680,7 @@
</span><span class="cx"> table = tables.Table()
</span><span class="cx"> table.addHeader(("User", "Current Quota", "Orphan Size", "Orphan Count", "Dropbox Size", "Dropbox Count", "Managed Size", "Managed Count", "Total Size", "Total Count"))
</span><span class="cx"> table.setDefaultColumnFormats(
</span><del>- (
</del><ins>+ (
</ins><span class="cx"> tables.Table.ColumnFormat("%s", tables.Table.ColumnFormat.LEFT_JUSTIFY),
</span><span class="cx"> tables.Table.ColumnFormat("%d", tables.Table.ColumnFormat.RIGHT_JUSTIFY),
</span><span class="cx"> tables.Table.ColumnFormat("%d", tables.Table.ColumnFormat.RIGHT_JUSTIFY),
</span><span class="lines">@@ -1011,14 +1011,14 @@
</span><span class="cx"> # Anything in the past is left alone
</span><span class="cx"> whenString = self.when.getText()
</span><span class="cx"> query_filter = caldavxml.Filter(
</span><del>- caldavxml.ComponentFilter(
- caldavxml.ComponentFilter(
- caldavxml.TimeRange(start=whenString,),
- name=("VEVENT",),
- ),
- name="VCALENDAR",
- )
- )
</del><ins>+ caldavxml.ComponentFilter(
+ caldavxml.ComponentFilter(
+ caldavxml.TimeRange(start=whenString,),
+ name=("VEVENT",),
+ ),
+ name="VCALENDAR",
+ )
+ )
</ins><span class="cx"> query_filter = Filter(query_filter)
</span><span class="cx">
</span><span class="cx"> count = 0
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolsresourcespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/resources.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/resources.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/resources.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -54,6 +54,7 @@
</span><span class="cx"> yield migrateResources(sourceService, destService)
</span><span class="cx">
</span><span class="cx">
</span><ins>+
</ins><span class="cx"> def usage():
</span><span class="cx">
</span><span class="cx"> name = os.path.basename(sys.argv[0])
</span><span class="lines">@@ -101,10 +102,12 @@
</span><span class="cx"> utilityMain(configFileName, ResourceMigrationService, verbose=verbose)
</span><span class="cx">
</span><span class="cx">
</span><ins>+
</ins><span class="cx"> class DirectoryRecord(BaseDirectoryRecord, CalendarDirectoryRecordMixin):
</span><span class="cx"> pass
</span><span class="cx">
</span><span class="cx">
</span><ins>+
</ins><span class="cx"> @inlineCallbacks
</span><span class="cx"> def migrateResources(sourceService, destService, verbose=False):
</span><span class="cx"> """
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolsshellcmdpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/shell/cmd.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/shell/cmd.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/shell/cmd.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -472,7 +472,7 @@
</span><span class="cx"> if not isinstance(wd, Folder):
</span><span class="cx"> raise NotFoundError("Not a folder: %s" % (wd,))
</span><span class="cx">
</span><del>- #log.info("wd -> %s" % (wd,))
</del><ins>+ # log.info("wd -> %s" % (wd,))
</ins><span class="cx"> self.wd = wd
</span><span class="cx">
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolsshelldirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/shell/directory.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/shell/directory.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/shell/directory.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -72,16 +72,16 @@
</span><span class="cx"> if value:
</span><span class="cx"> table.addRow((name, value))
</span><span class="cx">
</span><del>- add("Service" , record.service )
</del><ins>+ add("Service" , record.service)
</ins><span class="cx"> add("Record Type", record.recordType)
</span><span class="cx">
</span><span class="cx"> for shortName in record.shortNames:
</span><span class="cx"> add("Short Name", shortName)
</span><span class="cx">
</span><del>- add("GUID" , record.guid )
- add("Full Name" , record.fullName )
</del><ins>+ add("GUID" , record.guid)
+ add("Full Name" , record.fullName)
</ins><span class="cx"> add("First Name", record.firstName)
</span><del>- add("Last Name" , record.lastName )
</del><ins>+ add("Last Name" , record.lastName)
</ins><span class="cx">
</span><span class="cx"> try:
</span><span class="cx"> for email in record.emailAddresses:
</span><span class="lines">@@ -116,7 +116,8 @@
</span><span class="cx"> if not rows:
</span><span class="cx"> return succeed(None)
</span><span class="cx">
</span><del>- rows = sorted(rows,
</del><ins>+ rows = sorted(
+ rows,
</ins><span class="cx"> key=lambda row: (row[1], row[2])
</span><span class="cx"> )
</span><span class="cx">
</span><span class="lines">@@ -162,7 +163,8 @@
</span><span class="cx"> if not rows:
</span><span class="cx"> returnValue(None)
</span><span class="cx">
</span><del>- rows = sorted(rows,
</del><ins>+ rows = sorted(
+ rows,
</ins><span class="cx"> key=lambda row: (row[1], row[2], row[4])
</span><span class="cx"> )
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolsshellterminalpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/shell/terminal.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/shell/terminal.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/shell/terminal.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -203,7 +203,7 @@
</span><span class="cx"> self.keyHandlers['\x04'] = self.handle_EOF # Control-D
</span><span class="cx"> self.keyHandlers['\x1c'] = self.handle_QUIT # Control-\
</span><span class="cx"> self.keyHandlers['\x0c'] = self.handle_FF # Control-L
</span><del>- #self.keyHandlers['\t' ] = self.handle_TAB # Tab
</del><ins>+ # self.keyHandlers['\t' ] = self.handle_TAB # Tab
</ins><span class="cx">
</span><span class="cx"> if self.emulate == "emacs":
</span><span class="cx"> # EMACS key bindinds
</span><span class="lines">@@ -320,7 +320,7 @@
</span><span class="cx"> self.characterReceived(c, True)
</span><span class="cx">
</span><span class="cx"> # FIXME: Add a space only if we know we've fully completed the term.
</span><del>- #self.characterReceived(" ", False)
</del><ins>+ # self.characterReceived(" ", False)
</ins><span class="cx"> else:
</span><span class="cx"> self.terminal.nextLine()
</span><span class="cx"> for completion in completions:
</span><span class="lines">@@ -363,7 +363,7 @@
</span><span class="cx">
</span><span class="cx"> if tokens:
</span><span class="cx"> cmd = tokens.pop(0)
</span><del>- #print("Arguments: %r" % (tokens,))
</del><ins>+ # print("Arguments: %r" % (tokens,))
</ins><span class="cx">
</span><span class="cx"> m = getattr(self.commands, "cmd_%s" % (cmd,), None)
</span><span class="cx"> if m:
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolsshellvfspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/shell/vfs.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/shell/vfs.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/shell/vfs.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -206,15 +206,15 @@
</span><span class="cx"> @inlineCallbacks
</span><span class="cx"> def child(self, name):
</span><span class="cx"> # FIXME: Move this logic to locate()
</span><del>- #if not name:
- # return succeed(self)
- #if name == ".":
- # return succeed(self)
- #if name == "..":
- # path = self.path[:-1]
- # if not path:
- # path = "/"
- # return RootFolder(self.service).locate(path)
</del><ins>+ # if not name:
+ # return succeed(self)
+ # if name == ".":
+ # return succeed(self)
+ # if name == "..":
+ # path = self.path[:-1]
+ # if not path:
+ # path = "/"
+ # return RootFolder(self.service).locate(path)
</ins><span class="cx">
</span><span class="cx"> if name in self._children:
</span><span class="cx"> returnValue(self._children[name])
</span><span class="lines">@@ -736,7 +736,7 @@
</span><span class="cx"> organizerName = organizer.parameterValue("CN")
</span><span class="cx"> organizerEmail = organizer.parameterValue("EMAIL")
</span><span class="cx">
</span><del>- name = " (%s)" % (organizerName ,) if organizerName else ""
</del><ins>+ name = " (%s)" % (organizerName ,) if organizerName else ""
</ins><span class="cx"> email = " <%s>" % (organizerEmail,) if organizerEmail else ""
</span><span class="cx">
</span><span class="cx"> rows.append(("Organizer", "%s%s%s" % (organizer.value(), name, email)))
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolstesttest_calverifypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/test/test_calverify.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/test/test_calverify.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/test/test_calverify.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -1030,14 +1030,14 @@
</span><span class="cx"> requirements = {
</span><span class="cx"> CalVerifyMismatchTestsBase.uuid1 : {
</span><span class="cx"> "calendar" : {
</span><del>- "missing_attendee.ics" : (MISSING_ATTENDEE_1_ICS, CalVerifyMismatchTestsBase.metadata,),
- "mismatched_attendee.ics" : (MISMATCH_ATTENDEE_1_ICS, CalVerifyMismatchTestsBase.metadata,),
- "mismatched2_attendee.ics" : (MISMATCH2_ATTENDEE_1_ICS, CalVerifyMismatchTestsBase.metadata,),
- "mismatched3_attendee.ics" : (MISMATCH3_ATTENDEE_1_ICS, CalVerifyMismatchTestsBase.metadata,),
- "mismatched_organizer.ics" : (MISMATCH_ORGANIZER_1_ICS, CalVerifyMismatchTestsBase.metadata,),
- "mismatched2_organizer.ics" : (MISMATCH2_ORGANIZER_1_ICS, CalVerifyMismatchTestsBase.metadata,),
- },
- "inbox" : {},
</del><ins>+ "missing_attendee.ics" : (MISSING_ATTENDEE_1_ICS, CalVerifyMismatchTestsBase.metadata,),
+ "mismatched_attendee.ics" : (MISMATCH_ATTENDEE_1_ICS, CalVerifyMismatchTestsBase.metadata,),
+ "mismatched2_attendee.ics" : (MISMATCH2_ATTENDEE_1_ICS, CalVerifyMismatchTestsBase.metadata,),
+ "mismatched3_attendee.ics" : (MISMATCH3_ATTENDEE_1_ICS, CalVerifyMismatchTestsBase.metadata,),
+ "mismatched_organizer.ics" : (MISMATCH_ORGANIZER_1_ICS, CalVerifyMismatchTestsBase.metadata,),
+ "mismatched2_organizer.ics" : (MISMATCH2_ORGANIZER_1_ICS, CalVerifyMismatchTestsBase.metadata,),
+ },
+ "inbox" : {},
</ins><span class="cx"> },
</span><span class="cx"> CalVerifyMismatchTestsBase.uuid2 : {
</span><span class="cx"> "calendar" : {
</span><span class="lines">@@ -1048,7 +1048,7 @@
</span><span class="cx"> "mismatched_organizer.ics" : (MISMATCH_ORGANIZER_2_ICS, CalVerifyMismatchTestsBase.metadata,),
</span><span class="cx"> "mismatched2_organizer.ics" : (MISMATCH2_ORGANIZER_2_ICS, CalVerifyMismatchTestsBase.metadata,),
</span><span class="cx"> },
</span><del>- "inbox" : {},
</del><ins>+ "inbox" : {},
</ins><span class="cx"> },
</span><span class="cx"> CalVerifyMismatchTestsBase.uuid3 : {
</span><span class="cx"> "calendar" : {
</span><span class="lines">@@ -1061,7 +1061,7 @@
</span><span class="cx"> "mismatched_organizer.ics" : (MISMATCH_ORGANIZER_3_ICS, CalVerifyMismatchTestsBase.metadata,),
</span><span class="cx"> "mismatched2_attendee.ics" : (MISMATCH2_ATTENDEE_3_ICS, CalVerifyMismatchTestsBase.metadata,),
</span><span class="cx"> },
</span><del>- "inbox" : {},
</del><ins>+ "inbox" : {},
</ins><span class="cx"> },
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -1331,10 +1331,10 @@
</span><span class="cx"> requirements = {
</span><span class="cx"> CalVerifyMismatchTestsBase.uuid1 : {
</span><span class="cx"> "calendar" : {
</span><del>- "missing_attendee.ics" : (MISSING_ATTENDEE_1_ICS, CalVerifyMismatchTestsBase.metadata,),
- "mismatched_attendee.ics" : (MISMATCH_ATTENDEE_1_ICS, CalVerifyMismatchTestsBase.metadata,),
- },
- "inbox" : {},
</del><ins>+ "missing_attendee.ics" : (MISSING_ATTENDEE_1_ICS, CalVerifyMismatchTestsBase.metadata,),
+ "mismatched_attendee.ics" : (MISMATCH_ATTENDEE_1_ICS, CalVerifyMismatchTestsBase.metadata,),
+ },
+ "inbox" : {},
</ins><span class="cx"> },
</span><span class="cx"> CalVerifyMismatchTestsBase.uuid2 : {
</span><span class="cx"> "calendar" : {},
</span><span class="lines">@@ -1558,10 +1558,10 @@
</span><span class="cx"> requirements = {
</span><span class="cx"> CalVerifyMismatchTestsBase.uuid1 : {
</span><span class="cx"> "calendar" : {
</span><del>- "missing_attendee.ics" : (MISSING_ATTENDEE_1_ICS, CalVerifyMismatchTestsBase.metadata,),
- "mismatched_attendee.ics" : (MISMATCH_ATTENDEE_1_ICS, CalVerifyMismatchTestsBase.metadata,),
- },
- "inbox" : {},
</del><ins>+ "missing_attendee.ics" : (MISSING_ATTENDEE_1_ICS, CalVerifyMismatchTestsBase.metadata,),
+ "mismatched_attendee.ics" : (MISMATCH_ATTENDEE_1_ICS, CalVerifyMismatchTestsBase.metadata,),
+ },
+ "inbox" : {},
</ins><span class="cx"> },
</span><span class="cx"> CalVerifyMismatchTestsBase.uuid2 : {
</span><span class="cx"> "calendar" : {},
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolstesttest_configpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/test/test_config.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/test/test_config.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/test/test_config.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -16,7 +16,8 @@
</span><span class="cx">
</span><span class="cx"> from twistedcaldav.test.util import TestCase
</span><span class="cx"> from twistedcaldav.config import ConfigDict
</span><del>-from calendarserver.tools.config import (WritableConfig, setKeyPath, getKeyPath,
</del><ins>+from calendarserver.tools.config import (
+ WritableConfig, setKeyPath, getKeyPath,
</ins><span class="cx"> flattenDictionary, processArgs)
</span><span class="cx"> from calendarserver.tools.test.test_gateway import RunCommandTestCase
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><span class="lines">@@ -118,7 +119,8 @@
</span><span class="cx"> """
</span><span class="cx"> Verify readConfig returns with only the writable keys
</span><span class="cx"> """
</span><del>- results = yield self.runCommand(command_readConfig,
</del><ins>+ results = yield self.runCommand(
+ command_readConfig,
</ins><span class="cx"> script="calendarserver_config")
</span><span class="cx">
</span><span class="cx"> self.assertEquals(results["result"]["RedirectHTTPToHTTPS"], False)
</span><span class="lines">@@ -140,7 +142,8 @@
</span><span class="cx"> """
</span><span class="cx"> Verify writeConfig updates the writable plist file only
</span><span class="cx"> """
</span><del>- results = yield self.runCommand(command_writeConfig,
</del><ins>+ results = yield self.runCommand(
+ command_writeConfig,
</ins><span class="cx"> script="calendarserver_config")
</span><span class="cx">
</span><span class="cx"> self.assertEquals(results["result"]["EnableCalDAV"], False)
</span><span class="lines">@@ -161,7 +164,8 @@
</span><span class="cx"> """
</span><span class="cx"> Verify sending a bogus command returns an error
</span><span class="cx"> """
</span><del>- results = yield self.runCommand(command_bogusCommand,
</del><ins>+ results = yield self.runCommand(
+ command_bogusCommand,
</ins><span class="cx"> script="calendarserver_config")
</span><span class="cx"> self.assertEquals(results["error"], "Unknown command 'bogus'")
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolstesttest_exportpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/test/test_export.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/test/test_export.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/test/test_export.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -48,8 +48,8 @@
</span><span class="cx"> def holiday(uid):
</span><span class="cx"> return (
</span><span class="cx"> getModule("twistedcaldav.test").filePath
</span><del>- .sibling("data").child("Holidays").child(uid + ".ics")
- .getContent()
</del><ins>+ .sibling("data").child("Holidays").child(uid + ".ics")
+ .getContent()
</ins><span class="cx"> )
</span><span class="cx">
</span><span class="cx">
</span><span class="lines">@@ -292,7 +292,7 @@
</span><span class="cx"> io = StringIO()
</span><span class="cx"> yield exportToFile(
</span><span class="cx"> [(yield self.txn().calendarHomeWithUID("user01"))
</span><del>- .calendarWithName("calendar1")], io
</del><ins>+ .calendarWithName("calendar1")], io
</ins><span class="cx"> )
</span><span class="cx"> self.assertEquals(Component.fromString(io.getvalue()),
</span><span class="cx"> expected)
</span><span class="lines">@@ -325,7 +325,7 @@
</span><span class="cx"> io = StringIO()
</span><span class="cx"> yield exportToFile(
</span><span class="cx"> [(yield self.txn().calendarHomeWithUID("user01"))
</span><del>- .calendarWithName("calendar1")], io
</del><ins>+ .calendarWithName("calendar1")], io
</ins><span class="cx"> )
</span><span class="cx"> self.assertEquals(Component.fromString(io.getvalue()),
</span><span class="cx"> expected)
</span><span class="lines">@@ -355,7 +355,7 @@
</span><span class="cx"> io = StringIO()
</span><span class="cx"> yield exportToFile(
</span><span class="cx"> [(yield self.txn().calendarHomeWithUID("user01"))
</span><del>- .calendarWithName("calendar1")], io
</del><ins>+ .calendarWithName("calendar1")], io
</ins><span class="cx"> )
</span><span class="cx"> result = Component.fromString(io.getvalue())
</span><span class="cx">
</span><span class="lines">@@ -396,7 +396,7 @@
</span><span class="cx"> io = StringIO()
</span><span class="cx"> yield exportToFile(
</span><span class="cx"> [(yield self.txn().calendarHomeWithUID("user02"))
</span><del>- .calendarWithName("calendar1")], io
</del><ins>+ .calendarWithName("calendar1")], io
</ins><span class="cx"> )
</span><span class="cx"> self.assertEquals(
</span><span class="cx"> Component.fromString(resultForUser2),
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolstesttest_gatewaypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/test/test_gateway.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/test/test_gateway.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/test/test_gateway.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -209,7 +209,8 @@
</span><span class="cx"> # self.assertEquals(results["result"]["Capacity"], "40")
</span><span class="cx"> # self.assertEquals(results["result"]["Description"], "Test Description")
</span><span class="cx"> self.assertEquals(results["result"]["RecordName"], ["createdlocation01"])
</span><del>- self.assertEquals(results["result"]["RealName"],
</del><ins>+ self.assertEquals(
+ results["result"]["RealName"],
</ins><span class="cx"> "Created Location 01 %s %s" % (unichr(208), u"\ud83d\udca3"))
</span><span class="cx"> # self.assertEquals(results["result"]["Comment"], "Test Comment")
</span><span class="cx"> self.assertEquals(results["result"]["AutoScheduleMode"], u"acceptIfFree")
</span><span class="lines">@@ -288,7 +289,8 @@
</span><span class="cx"> self._flush()
</span><span class="cx">
</span><span class="cx"> record = yield self.directory.recordWithUID("836B1B66-2E9A-4F46-8B1C-3DD6772C20B2")
</span><del>- self.assertEquals(record.fullNames[0],
</del><ins>+ self.assertEquals(
+ record.fullNames[0],
</ins><span class="cx"> u"Created Location 01 %s %s" % (unichr(208), u"\ud83d\udca3"))
</span><span class="cx">
</span><span class="cx"> self.assertNotEquals(record, None)
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolstesttest_purgepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/test/test_purge.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/test/test_purge.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/test/test_purge.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -383,7 +383,8 @@
</span><span class="cx"> self.assertTrue(";UNTIL=" not in str(comp))
</span><span class="cx"> yield self.commit()
</span><span class="cx">
</span><del>- count = (yield PurgePrincipalService.purgeUIDs(self.storeUnderTest(), self.directory,
</del><ins>+ count = (yield PurgePrincipalService.purgeUIDs(
+ self.storeUnderTest(), self.directory,
</ins><span class="cx"> (self.uid,), verbose=False, proxies=False))
</span><span class="cx"> self.assertEquals(count, 2) # 2 events
</span><span class="cx">
</span><span class="lines">@@ -480,7 +481,7 @@
</span><span class="cx"> self.assertTrue(home.purging())
</span><span class="cx">
</span><span class="cx"> yield self.commit()
</span><del>- #print len(work1), len(work2), len(work3), len(work4)
</del><ins>+ # print len(work1), len(work2), len(work3), len(work4)
</ins><span class="cx"> if len(work1) + len(work2) + len(work3) + len(work4) == 0:
</span><span class="cx"> break
</span><span class="cx"> d = Deferred()
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolstesttest_purge_old_eventspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/test/test_purge_old_events.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/test/test_purge_old_events.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/tools/test/test_purge_old_events.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -455,7 +455,8 @@
</span><span class="cx">
</span><span class="cx"> # Query for all old events
</span><span class="cx"> results = (yield txn.eventsOlderThan(cutoff))
</span><del>- self.assertEquals(sorted(results),
</del><ins>+ self.assertEquals(
+ sorted(results),
</ins><span class="cx"> sorted([
</span><span class="cx"> ['home1', 'calendar1', 'old.ics', '1901-01-01 01:00:00'],
</span><span class="cx"> ['home1', 'calendar1', 'oldattachment1.ics', '1901-01-01 01:00:00'],
</span><span class="lines">@@ -673,7 +674,8 @@
</span><span class="cx"> # Create an addressbook and one CardDAV resource
</span><span class="cx"> abHome = (yield txn.addressbookHomeWithUID("home1", create=True))
</span><span class="cx"> abColl = (yield abHome.addressbookWithName("addressbook"))
</span><del>- (yield abColl.createAddressBookObjectWithName("card1",
</del><ins>+ (yield abColl.createAddressBookObjectWithName(
+ "card1",
</ins><span class="cx"> VCardComponent.fromString(VCARD_1)))
</span><span class="cx"> self.assertEquals(len((yield abColl.addressbookObjects())), 1)
</span><span class="cx">
</span><span class="lines">@@ -686,7 +688,8 @@
</span><span class="cx"> (yield txn.commit())
</span><span class="cx">
</span><span class="cx"> # Purge home1 completely
</span><del>- total = yield PurgePrincipalService.purgeUIDs(self._sqlCalendarStore, self.directory,
</del><ins>+ total = yield PurgePrincipalService.purgeUIDs(
+ self._sqlCalendarStore, self.directory,
</ins><span class="cx"> ("home1",), verbose=False, proxies=False)
</span><span class="cx">
</span><span class="cx"> # Wait for queue to process
</span></span></pre></div>
<a id="CalendarServertrunkcalendarserverwebadminlandingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/webadmin/landing.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/webadmin/landing.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/calendarserver/webadmin/landing.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -65,11 +65,11 @@
</span><span class="cx"> # self._root = root
</span><span class="cx"> # self._principalCollections = principalCollections
</span><span class="cx">
</span><del>- #from .config import ConfigurationResource
- #self.putChild(u"config", ConfigurationResource(configuration, principalCollections))
</del><ins>+ # from .config import ConfigurationResource
+ # self.putChild(u"config", ConfigurationResource(configuration, principalCollections))
</ins><span class="cx">
</span><del>- #from .principals import PrincipalsResource
- #self.putChild(u"principals", PrincipalsResource(directory, store, principalCollections))
</del><ins>+ # from .principals import PrincipalsResource
+ # self.putChild(u"principals", PrincipalsResource(directory, store, principalCollections))
</ins><span class="cx">
</span><span class="cx"> # from .logs import LogsResource
</span><span class="cx"> # self.putChild(u"logs", LogsResource())
</span></span></pre></div>
<a id="CalendarServertrunkconfauthgenerate_test_accountspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/conf/auth/generate_test_accounts.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/conf/auth/generate_test_accounts.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/conf/auth/generate_test_accounts.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -96,618 +96,618 @@
</span><span class="cx">
</span><span class="cx"> if EXTRA_GROUPS:
</span><span class="cx"> members.update({
</span><del>- GROUPGUIDS % 8: (
- USERGUIDS % 1,
- USERGUIDS % 2,
- USERGUIDS % 3,
- USERGUIDS % 4,
- USERGUIDS % 5,
- ),
- GROUPGUIDS % 9: (
- USERGUIDS % 1,
- USERGUIDS % 2,
- USERGUIDS % 3,
- USERGUIDS % 4,
- USERGUIDS % 5,
- USERGUIDS % 6,
- USERGUIDS % 7,
- USERGUIDS % 8,
- USERGUIDS % 9,
- USERGUIDS % 10,
- USERGUIDS % 11,
- USERGUIDS % 12,
- USERGUIDS % 13,
- USERGUIDS % 14,
- USERGUIDS % 15,
- USERGUIDS % 16,
- USERGUIDS % 17,
- USERGUIDS % 18,
- USERGUIDS % 19,
- USERGUIDS % 20,
- USERGUIDS % 21,
- USERGUIDS % 22,
- USERGUIDS % 23,
- USERGUIDS % 24,
- USERGUIDS % 25,
- USERGUIDS % 26,
- USERGUIDS % 27,
- USERGUIDS % 28,
- USERGUIDS % 29,
- USERGUIDS % 30,
- USERGUIDS % 31,
- USERGUIDS % 32,
- USERGUIDS % 33,
- USERGUIDS % 34,
- USERGUIDS % 35,
- USERGUIDS % 36,
- USERGUIDS % 37,
- USERGUIDS % 38,
- USERGUIDS % 39,
- USERGUIDS % 40,
- USERGUIDS % 41,
- USERGUIDS % 42,
- USERGUIDS % 43,
- USERGUIDS % 44,
- USERGUIDS % 45,
- USERGUIDS % 46,
- USERGUIDS % 47,
- USERGUIDS % 48,
- USERGUIDS % 49,
- USERGUIDS % 50,
- USERGUIDS % 51,
- USERGUIDS % 52,
- USERGUIDS % 53,
- USERGUIDS % 54,
- USERGUIDS % 55,
- USERGUIDS % 56,
- USERGUIDS % 57,
- USERGUIDS % 58,
- USERGUIDS % 59,
- USERGUIDS % 60,
- USERGUIDS % 61,
- USERGUIDS % 62,
- USERGUIDS % 63,
- USERGUIDS % 64,
- USERGUIDS % 65,
- USERGUIDS % 66,
- USERGUIDS % 67,
- USERGUIDS % 68,
- USERGUIDS % 69,
- USERGUIDS % 70,
- USERGUIDS % 71,
- USERGUIDS % 72,
- USERGUIDS % 73,
- USERGUIDS % 74,
- USERGUIDS % 75,
- USERGUIDS % 76,
- USERGUIDS % 77,
- USERGUIDS % 78,
- USERGUIDS % 79,
- USERGUIDS % 80,
- USERGUIDS % 81,
- USERGUIDS % 82,
- USERGUIDS % 83,
- USERGUIDS % 84,
- USERGUIDS % 85,
- USERGUIDS % 86,
- USERGUIDS % 87,
- USERGUIDS % 88,
- USERGUIDS % 89,
- USERGUIDS % 90,
- USERGUIDS % 91,
- USERGUIDS % 92,
- USERGUIDS % 93,
- USERGUIDS % 94,
- USERGUIDS % 95,
- USERGUIDS % 96,
- USERGUIDS % 97,
- USERGUIDS % 98,
- USERGUIDS % 99,
- USERGUIDS % 100,
- ),
- GROUPGUIDS % 10: (
- USERGUIDS % 1,
- USERGUIDS % 2,
- USERGUIDS % 3,
- USERGUIDS % 4,
- USERGUIDS % 5,
- USERGUIDS % 6,
- USERGUIDS % 7,
- USERGUIDS % 8,
- USERGUIDS % 9,
- USERGUIDS % 10,
- USERGUIDS % 11,
- USERGUIDS % 12,
- USERGUIDS % 13,
- USERGUIDS % 14,
- USERGUIDS % 15,
- USERGUIDS % 16,
- USERGUIDS % 17,
- USERGUIDS % 18,
- USERGUIDS % 19,
- USERGUIDS % 20,
- USERGUIDS % 21,
- USERGUIDS % 22,
- USERGUIDS % 23,
- USERGUIDS % 24,
- USERGUIDS % 25,
- USERGUIDS % 26,
- USERGUIDS % 27,
- USERGUIDS % 28,
- USERGUIDS % 29,
- USERGUIDS % 30,
- USERGUIDS % 31,
- USERGUIDS % 32,
- USERGUIDS % 33,
- USERGUIDS % 34,
- USERGUIDS % 35,
- USERGUIDS % 36,
- USERGUIDS % 37,
- USERGUIDS % 38,
- USERGUIDS % 39,
- USERGUIDS % 40,
- USERGUIDS % 41,
- USERGUIDS % 42,
- USERGUIDS % 43,
- USERGUIDS % 44,
- USERGUIDS % 45,
- USERGUIDS % 46,
- USERGUIDS % 47,
- USERGUIDS % 48,
- USERGUIDS % 49,
- USERGUIDS % 50,
- USERGUIDS % 51,
- USERGUIDS % 52,
- USERGUIDS % 53,
- USERGUIDS % 54,
- USERGUIDS % 55,
- USERGUIDS % 56,
- USERGUIDS % 57,
- USERGUIDS % 58,
- USERGUIDS % 59,
- USERGUIDS % 60,
- USERGUIDS % 61,
- USERGUIDS % 62,
- USERGUIDS % 63,
- USERGUIDS % 64,
- USERGUIDS % 65,
- USERGUIDS % 66,
- USERGUIDS % 67,
- USERGUIDS % 68,
- USERGUIDS % 69,
- USERGUIDS % 70,
- USERGUIDS % 71,
- USERGUIDS % 72,
- USERGUIDS % 73,
- USERGUIDS % 74,
- USERGUIDS % 75,
- USERGUIDS % 76,
- USERGUIDS % 77,
- USERGUIDS % 78,
- USERGUIDS % 79,
- USERGUIDS % 80,
- USERGUIDS % 81,
- USERGUIDS % 82,
- USERGUIDS % 83,
- USERGUIDS % 84,
- USERGUIDS % 85,
- USERGUIDS % 86,
- USERGUIDS % 87,
- USERGUIDS % 88,
- USERGUIDS % 89,
- USERGUIDS % 90,
- USERGUIDS % 91,
- USERGUIDS % 92,
- USERGUIDS % 93,
- USERGUIDS % 94,
- USERGUIDS % 95,
- USERGUIDS % 96,
- USERGUIDS % 97,
- USERGUIDS % 98,
- USERGUIDS % 99,
- USERGUIDS % 100,
- USERGUIDS % 101,
- USERGUIDS % 102,
- USERGUIDS % 103,
- USERGUIDS % 104,
- USERGUIDS % 105,
- USERGUIDS % 106,
- USERGUIDS % 107,
- USERGUIDS % 108,
- USERGUIDS % 109,
- USERGUIDS % 110,
- USERGUIDS % 111,
- USERGUIDS % 112,
- USERGUIDS % 113,
- USERGUIDS % 114,
- USERGUIDS % 115,
- USERGUIDS % 116,
- USERGUIDS % 117,
- USERGUIDS % 118,
- USERGUIDS % 119,
- USERGUIDS % 120,
- USERGUIDS % 121,
- USERGUIDS % 122,
- USERGUIDS % 123,
- USERGUIDS % 124,
- USERGUIDS % 125,
- USERGUIDS % 126,
- USERGUIDS % 127,
- USERGUIDS % 128,
- USERGUIDS % 129,
- USERGUIDS % 130,
- USERGUIDS % 131,
- USERGUIDS % 132,
- USERGUIDS % 133,
- USERGUIDS % 134,
- USERGUIDS % 135,
- USERGUIDS % 136,
- USERGUIDS % 137,
- USERGUIDS % 138,
- USERGUIDS % 139,
- USERGUIDS % 140,
- USERGUIDS % 141,
- USERGUIDS % 142,
- USERGUIDS % 143,
- USERGUIDS % 144,
- USERGUIDS % 145,
- USERGUIDS % 146,
- USERGUIDS % 147,
- USERGUIDS % 148,
- USERGUIDS % 149,
- USERGUIDS % 150,
- USERGUIDS % 151,
- USERGUIDS % 152,
- USERGUIDS % 153,
- USERGUIDS % 154,
- USERGUIDS % 155,
- USERGUIDS % 156,
- USERGUIDS % 157,
- USERGUIDS % 158,
- USERGUIDS % 159,
- USERGUIDS % 160,
- USERGUIDS % 161,
- USERGUIDS % 162,
- USERGUIDS % 163,
- USERGUIDS % 164,
- USERGUIDS % 165,
- USERGUIDS % 166,
- USERGUIDS % 167,
- USERGUIDS % 168,
- USERGUIDS % 169,
- USERGUIDS % 170,
- USERGUIDS % 171,
- USERGUIDS % 172,
- USERGUIDS % 173,
- USERGUIDS % 174,
- USERGUIDS % 175,
- USERGUIDS % 176,
- USERGUIDS % 177,
- USERGUIDS % 178,
- USERGUIDS % 179,
- USERGUIDS % 180,
- USERGUIDS % 181,
- USERGUIDS % 182,
- USERGUIDS % 183,
- USERGUIDS % 184,
- USERGUIDS % 185,
- USERGUIDS % 186,
- USERGUIDS % 187,
- USERGUIDS % 188,
- USERGUIDS % 189,
- USERGUIDS % 190,
- USERGUIDS % 191,
- USERGUIDS % 192,
- USERGUIDS % 193,
- USERGUIDS % 194,
- USERGUIDS % 195,
- USERGUIDS % 196,
- USERGUIDS % 197,
- USERGUIDS % 198,
- USERGUIDS % 199,
- USERGUIDS % 200,
- USERGUIDS % 201,
- USERGUIDS % 202,
- USERGUIDS % 203,
- USERGUIDS % 204,
- USERGUIDS % 205,
- USERGUIDS % 206,
- USERGUIDS % 207,
- USERGUIDS % 208,
- USERGUIDS % 209,
- USERGUIDS % 210,
- USERGUIDS % 211,
- USERGUIDS % 212,
- USERGUIDS % 213,
- USERGUIDS % 214,
- USERGUIDS % 215,
- USERGUIDS % 216,
- USERGUIDS % 217,
- USERGUIDS % 218,
- USERGUIDS % 219,
- USERGUIDS % 220,
- USERGUIDS % 221,
- USERGUIDS % 222,
- USERGUIDS % 223,
- USERGUIDS % 224,
- USERGUIDS % 225,
- USERGUIDS % 226,
- USERGUIDS % 227,
- USERGUIDS % 228,
- USERGUIDS % 229,
- USERGUIDS % 230,
- USERGUIDS % 231,
- USERGUIDS % 232,
- USERGUIDS % 233,
- USERGUIDS % 234,
- USERGUIDS % 235,
- USERGUIDS % 236,
- USERGUIDS % 237,
- USERGUIDS % 238,
- USERGUIDS % 239,
- USERGUIDS % 240,
- USERGUIDS % 241,
- USERGUIDS % 242,
- USERGUIDS % 243,
- USERGUIDS % 244,
- USERGUIDS % 245,
- USERGUIDS % 246,
- USERGUIDS % 247,
- USERGUIDS % 248,
- USERGUIDS % 249,
- USERGUIDS % 250,
- USERGUIDS % 251,
- USERGUIDS % 252,
- USERGUIDS % 253,
- USERGUIDS % 254,
- USERGUIDS % 255,
- USERGUIDS % 256,
- USERGUIDS % 257,
- USERGUIDS % 258,
- USERGUIDS % 259,
- USERGUIDS % 260,
- USERGUIDS % 261,
- USERGUIDS % 262,
- USERGUIDS % 263,
- USERGUIDS % 264,
- USERGUIDS % 265,
- USERGUIDS % 266,
- USERGUIDS % 267,
- USERGUIDS % 268,
- USERGUIDS % 269,
- USERGUIDS % 270,
- USERGUIDS % 271,
- USERGUIDS % 272,
- USERGUIDS % 273,
- USERGUIDS % 274,
- USERGUIDS % 275,
- USERGUIDS % 276,
- USERGUIDS % 277,
- USERGUIDS % 278,
- USERGUIDS % 279,
- USERGUIDS % 280,
- USERGUIDS % 281,
- USERGUIDS % 282,
- USERGUIDS % 283,
- USERGUIDS % 284,
- USERGUIDS % 285,
- USERGUIDS % 286,
- USERGUIDS % 287,
- USERGUIDS % 288,
- USERGUIDS % 289,
- USERGUIDS % 290,
- USERGUIDS % 291,
- USERGUIDS % 292,
- USERGUIDS % 293,
- USERGUIDS % 294,
- USERGUIDS % 295,
- USERGUIDS % 296,
- USERGUIDS % 297,
- USERGUIDS % 298,
- USERGUIDS % 299,
- USERGUIDS % 300,
- USERGUIDS % 301,
- USERGUIDS % 302,
- USERGUIDS % 303,
- USERGUIDS % 304,
- USERGUIDS % 305,
- USERGUIDS % 306,
- USERGUIDS % 307,
- USERGUIDS % 308,
- USERGUIDS % 309,
- USERGUIDS % 310,
- USERGUIDS % 311,
- USERGUIDS % 312,
- USERGUIDS % 313,
- USERGUIDS % 314,
- USERGUIDS % 315,
- USERGUIDS % 316,
- USERGUIDS % 317,
- USERGUIDS % 318,
- USERGUIDS % 319,
- USERGUIDS % 320,
- USERGUIDS % 321,
- USERGUIDS % 322,
- USERGUIDS % 323,
- USERGUIDS % 324,
- USERGUIDS % 325,
- USERGUIDS % 326,
- USERGUIDS % 327,
- USERGUIDS % 328,
- USERGUIDS % 329,
- USERGUIDS % 330,
- USERGUIDS % 331,
- USERGUIDS % 332,
- USERGUIDS % 333,
- USERGUIDS % 334,
- USERGUIDS % 335,
- USERGUIDS % 336,
- USERGUIDS % 337,
- USERGUIDS % 338,
- USERGUIDS % 339,
- USERGUIDS % 340,
- USERGUIDS % 341,
- USERGUIDS % 342,
- USERGUIDS % 343,
- USERGUIDS % 344,
- USERGUIDS % 345,
- USERGUIDS % 346,
- USERGUIDS % 347,
- USERGUIDS % 348,
- USERGUIDS % 349,
- USERGUIDS % 350,
- USERGUIDS % 351,
- USERGUIDS % 352,
- USERGUIDS % 353,
- USERGUIDS % 354,
- USERGUIDS % 355,
- USERGUIDS % 356,
- USERGUIDS % 357,
- USERGUIDS % 358,
- USERGUIDS % 359,
- USERGUIDS % 360,
- USERGUIDS % 361,
- USERGUIDS % 362,
- USERGUIDS % 363,
- USERGUIDS % 364,
- USERGUIDS % 365,
- USERGUIDS % 366,
- USERGUIDS % 367,
- USERGUIDS % 368,
- USERGUIDS % 369,
- USERGUIDS % 370,
- USERGUIDS % 371,
- USERGUIDS % 372,
- USERGUIDS % 373,
- USERGUIDS % 374,
- USERGUIDS % 375,
- USERGUIDS % 376,
- USERGUIDS % 377,
- USERGUIDS % 378,
- USERGUIDS % 379,
- USERGUIDS % 380,
- USERGUIDS % 381,
- USERGUIDS % 382,
- USERGUIDS % 383,
- USERGUIDS % 384,
- USERGUIDS % 385,
- USERGUIDS % 386,
- USERGUIDS % 387,
- USERGUIDS % 388,
- USERGUIDS % 389,
- USERGUIDS % 390,
- USERGUIDS % 391,
- USERGUIDS % 392,
- USERGUIDS % 393,
- USERGUIDS % 394,
- USERGUIDS % 395,
- USERGUIDS % 396,
- USERGUIDS % 397,
- USERGUIDS % 398,
- USERGUIDS % 399,
- USERGUIDS % 400,
- USERGUIDS % 401,
- USERGUIDS % 402,
- USERGUIDS % 403,
- USERGUIDS % 404,
- USERGUIDS % 405,
- USERGUIDS % 406,
- USERGUIDS % 407,
- USERGUIDS % 408,
- USERGUIDS % 409,
- USERGUIDS % 410,
- USERGUIDS % 411,
- USERGUIDS % 412,
- USERGUIDS % 413,
- USERGUIDS % 414,
- USERGUIDS % 415,
- USERGUIDS % 416,
- USERGUIDS % 417,
- USERGUIDS % 418,
- USERGUIDS % 419,
- USERGUIDS % 420,
- USERGUIDS % 421,
- USERGUIDS % 422,
- USERGUIDS % 423,
- USERGUIDS % 424,
- USERGUIDS % 425,
- USERGUIDS % 426,
- USERGUIDS % 427,
- USERGUIDS % 428,
- USERGUIDS % 429,
- USERGUIDS % 430,
- USERGUIDS % 431,
- USERGUIDS % 432,
- USERGUIDS % 433,
- USERGUIDS % 434,
- USERGUIDS % 435,
- USERGUIDS % 436,
- USERGUIDS % 437,
- USERGUIDS % 438,
- USERGUIDS % 439,
- USERGUIDS % 440,
- USERGUIDS % 441,
- USERGUIDS % 442,
- USERGUIDS % 443,
- USERGUIDS % 444,
- USERGUIDS % 445,
- USERGUIDS % 446,
- USERGUIDS % 447,
- USERGUIDS % 448,
- USERGUIDS % 449,
- USERGUIDS % 450,
- USERGUIDS % 451,
- USERGUIDS % 452,
- USERGUIDS % 453,
- USERGUIDS % 454,
- USERGUIDS % 455,
- USERGUIDS % 456,
- USERGUIDS % 457,
- USERGUIDS % 458,
- USERGUIDS % 459,
- USERGUIDS % 460,
- USERGUIDS % 461,
- USERGUIDS % 462,
- USERGUIDS % 463,
- USERGUIDS % 464,
- USERGUIDS % 465,
- USERGUIDS % 466,
- USERGUIDS % 467,
- USERGUIDS % 468,
- USERGUIDS % 469,
- USERGUIDS % 470,
- USERGUIDS % 471,
- USERGUIDS % 472,
- USERGUIDS % 473,
- USERGUIDS % 474,
- USERGUIDS % 475,
- USERGUIDS % 476,
- USERGUIDS % 477,
- USERGUIDS % 478,
- USERGUIDS % 479,
- USERGUIDS % 480,
- USERGUIDS % 481,
- USERGUIDS % 482,
- USERGUIDS % 483,
- USERGUIDS % 484,
- USERGUIDS % 485,
- USERGUIDS % 486,
- USERGUIDS % 487,
- USERGUIDS % 488,
- USERGUIDS % 489,
- USERGUIDS % 490,
- USERGUIDS % 491,
- USERGUIDS % 492,
- USERGUIDS % 493,
- USERGUIDS % 494,
- USERGUIDS % 495,
- USERGUIDS % 496,
- USERGUIDS % 497,
- USERGUIDS % 498,
- USERGUIDS % 499,
- USERGUIDS % 500,
- ),
-})
</del><ins>+ GROUPGUIDS % 8: (
+ USERGUIDS % 1,
+ USERGUIDS % 2,
+ USERGUIDS % 3,
+ USERGUIDS % 4,
+ USERGUIDS % 5,
+ ),
+ GROUPGUIDS % 9: (
+ USERGUIDS % 1,
+ USERGUIDS % 2,
+ USERGUIDS % 3,
+ USERGUIDS % 4,
+ USERGUIDS % 5,
+ USERGUIDS % 6,
+ USERGUIDS % 7,
+ USERGUIDS % 8,
+ USERGUIDS % 9,
+ USERGUIDS % 10,
+ USERGUIDS % 11,
+ USERGUIDS % 12,
+ USERGUIDS % 13,
+ USERGUIDS % 14,
+ USERGUIDS % 15,
+ USERGUIDS % 16,
+ USERGUIDS % 17,
+ USERGUIDS % 18,
+ USERGUIDS % 19,
+ USERGUIDS % 20,
+ USERGUIDS % 21,
+ USERGUIDS % 22,
+ USERGUIDS % 23,
+ USERGUIDS % 24,
+ USERGUIDS % 25,
+ USERGUIDS % 26,
+ USERGUIDS % 27,
+ USERGUIDS % 28,
+ USERGUIDS % 29,
+ USERGUIDS % 30,
+ USERGUIDS % 31,
+ USERGUIDS % 32,
+ USERGUIDS % 33,
+ USERGUIDS % 34,
+ USERGUIDS % 35,
+ USERGUIDS % 36,
+ USERGUIDS % 37,
+ USERGUIDS % 38,
+ USERGUIDS % 39,
+ USERGUIDS % 40,
+ USERGUIDS % 41,
+ USERGUIDS % 42,
+ USERGUIDS % 43,
+ USERGUIDS % 44,
+ USERGUIDS % 45,
+ USERGUIDS % 46,
+ USERGUIDS % 47,
+ USERGUIDS % 48,
+ USERGUIDS % 49,
+ USERGUIDS % 50,
+ USERGUIDS % 51,
+ USERGUIDS % 52,
+ USERGUIDS % 53,
+ USERGUIDS % 54,
+ USERGUIDS % 55,
+ USERGUIDS % 56,
+ USERGUIDS % 57,
+ USERGUIDS % 58,
+ USERGUIDS % 59,
+ USERGUIDS % 60,
+ USERGUIDS % 61,
+ USERGUIDS % 62,
+ USERGUIDS % 63,
+ USERGUIDS % 64,
+ USERGUIDS % 65,
+ USERGUIDS % 66,
+ USERGUIDS % 67,
+ USERGUIDS % 68,
+ USERGUIDS % 69,
+ USERGUIDS % 70,
+ USERGUIDS % 71,
+ USERGUIDS % 72,
+ USERGUIDS % 73,
+ USERGUIDS % 74,
+ USERGUIDS % 75,
+ USERGUIDS % 76,
+ USERGUIDS % 77,
+ USERGUIDS % 78,
+ USERGUIDS % 79,
+ USERGUIDS % 80,
+ USERGUIDS % 81,
+ USERGUIDS % 82,
+ USERGUIDS % 83,
+ USERGUIDS % 84,
+ USERGUIDS % 85,
+ USERGUIDS % 86,
+ USERGUIDS % 87,
+ USERGUIDS % 88,
+ USERGUIDS % 89,
+ USERGUIDS % 90,
+ USERGUIDS % 91,
+ USERGUIDS % 92,
+ USERGUIDS % 93,
+ USERGUIDS % 94,
+ USERGUIDS % 95,
+ USERGUIDS % 96,
+ USERGUIDS % 97,
+ USERGUIDS % 98,
+ USERGUIDS % 99,
+ USERGUIDS % 100,
+ ),
+ GROUPGUIDS % 10: (
+ USERGUIDS % 1,
+ USERGUIDS % 2,
+ USERGUIDS % 3,
+ USERGUIDS % 4,
+ USERGUIDS % 5,
+ USERGUIDS % 6,
+ USERGUIDS % 7,
+ USERGUIDS % 8,
+ USERGUIDS % 9,
+ USERGUIDS % 10,
+ USERGUIDS % 11,
+ USERGUIDS % 12,
+ USERGUIDS % 13,
+ USERGUIDS % 14,
+ USERGUIDS % 15,
+ USERGUIDS % 16,
+ USERGUIDS % 17,
+ USERGUIDS % 18,
+ USERGUIDS % 19,
+ USERGUIDS % 20,
+ USERGUIDS % 21,
+ USERGUIDS % 22,
+ USERGUIDS % 23,
+ USERGUIDS % 24,
+ USERGUIDS % 25,
+ USERGUIDS % 26,
+ USERGUIDS % 27,
+ USERGUIDS % 28,
+ USERGUIDS % 29,
+ USERGUIDS % 30,
+ USERGUIDS % 31,
+ USERGUIDS % 32,
+ USERGUIDS % 33,
+ USERGUIDS % 34,
+ USERGUIDS % 35,
+ USERGUIDS % 36,
+ USERGUIDS % 37,
+ USERGUIDS % 38,
+ USERGUIDS % 39,
+ USERGUIDS % 40,
+ USERGUIDS % 41,
+ USERGUIDS % 42,
+ USERGUIDS % 43,
+ USERGUIDS % 44,
+ USERGUIDS % 45,
+ USERGUIDS % 46,
+ USERGUIDS % 47,
+ USERGUIDS % 48,
+ USERGUIDS % 49,
+ USERGUIDS % 50,
+ USERGUIDS % 51,
+ USERGUIDS % 52,
+ USERGUIDS % 53,
+ USERGUIDS % 54,
+ USERGUIDS % 55,
+ USERGUIDS % 56,
+ USERGUIDS % 57,
+ USERGUIDS % 58,
+ USERGUIDS % 59,
+ USERGUIDS % 60,
+ USERGUIDS % 61,
+ USERGUIDS % 62,
+ USERGUIDS % 63,
+ USERGUIDS % 64,
+ USERGUIDS % 65,
+ USERGUIDS % 66,
+ USERGUIDS % 67,
+ USERGUIDS % 68,
+ USERGUIDS % 69,
+ USERGUIDS % 70,
+ USERGUIDS % 71,
+ USERGUIDS % 72,
+ USERGUIDS % 73,
+ USERGUIDS % 74,
+ USERGUIDS % 75,
+ USERGUIDS % 76,
+ USERGUIDS % 77,
+ USERGUIDS % 78,
+ USERGUIDS % 79,
+ USERGUIDS % 80,
+ USERGUIDS % 81,
+ USERGUIDS % 82,
+ USERGUIDS % 83,
+ USERGUIDS % 84,
+ USERGUIDS % 85,
+ USERGUIDS % 86,
+ USERGUIDS % 87,
+ USERGUIDS % 88,
+ USERGUIDS % 89,
+ USERGUIDS % 90,
+ USERGUIDS % 91,
+ USERGUIDS % 92,
+ USERGUIDS % 93,
+ USERGUIDS % 94,
+ USERGUIDS % 95,
+ USERGUIDS % 96,
+ USERGUIDS % 97,
+ USERGUIDS % 98,
+ USERGUIDS % 99,
+ USERGUIDS % 100,
+ USERGUIDS % 101,
+ USERGUIDS % 102,
+ USERGUIDS % 103,
+ USERGUIDS % 104,
+ USERGUIDS % 105,
+ USERGUIDS % 106,
+ USERGUIDS % 107,
+ USERGUIDS % 108,
+ USERGUIDS % 109,
+ USERGUIDS % 110,
+ USERGUIDS % 111,
+ USERGUIDS % 112,
+ USERGUIDS % 113,
+ USERGUIDS % 114,
+ USERGUIDS % 115,
+ USERGUIDS % 116,
+ USERGUIDS % 117,
+ USERGUIDS % 118,
+ USERGUIDS % 119,
+ USERGUIDS % 120,
+ USERGUIDS % 121,
+ USERGUIDS % 122,
+ USERGUIDS % 123,
+ USERGUIDS % 124,
+ USERGUIDS % 125,
+ USERGUIDS % 126,
+ USERGUIDS % 127,
+ USERGUIDS % 128,
+ USERGUIDS % 129,
+ USERGUIDS % 130,
+ USERGUIDS % 131,
+ USERGUIDS % 132,
+ USERGUIDS % 133,
+ USERGUIDS % 134,
+ USERGUIDS % 135,
+ USERGUIDS % 136,
+ USERGUIDS % 137,
+ USERGUIDS % 138,
+ USERGUIDS % 139,
+ USERGUIDS % 140,
+ USERGUIDS % 141,
+ USERGUIDS % 142,
+ USERGUIDS % 143,
+ USERGUIDS % 144,
+ USERGUIDS % 145,
+ USERGUIDS % 146,
+ USERGUIDS % 147,
+ USERGUIDS % 148,
+ USERGUIDS % 149,
+ USERGUIDS % 150,
+ USERGUIDS % 151,
+ USERGUIDS % 152,
+ USERGUIDS % 153,
+ USERGUIDS % 154,
+ USERGUIDS % 155,
+ USERGUIDS % 156,
+ USERGUIDS % 157,
+ USERGUIDS % 158,
+ USERGUIDS % 159,
+ USERGUIDS % 160,
+ USERGUIDS % 161,
+ USERGUIDS % 162,
+ USERGUIDS % 163,
+ USERGUIDS % 164,
+ USERGUIDS % 165,
+ USERGUIDS % 166,
+ USERGUIDS % 167,
+ USERGUIDS % 168,
+ USERGUIDS % 169,
+ USERGUIDS % 170,
+ USERGUIDS % 171,
+ USERGUIDS % 172,
+ USERGUIDS % 173,
+ USERGUIDS % 174,
+ USERGUIDS % 175,
+ USERGUIDS % 176,
+ USERGUIDS % 177,
+ USERGUIDS % 178,
+ USERGUIDS % 179,
+ USERGUIDS % 180,
+ USERGUIDS % 181,
+ USERGUIDS % 182,
+ USERGUIDS % 183,
+ USERGUIDS % 184,
+ USERGUIDS % 185,
+ USERGUIDS % 186,
+ USERGUIDS % 187,
+ USERGUIDS % 188,
+ USERGUIDS % 189,
+ USERGUIDS % 190,
+ USERGUIDS % 191,
+ USERGUIDS % 192,
+ USERGUIDS % 193,
+ USERGUIDS % 194,
+ USERGUIDS % 195,
+ USERGUIDS % 196,
+ USERGUIDS % 197,
+ USERGUIDS % 198,
+ USERGUIDS % 199,
+ USERGUIDS % 200,
+ USERGUIDS % 201,
+ USERGUIDS % 202,
+ USERGUIDS % 203,
+ USERGUIDS % 204,
+ USERGUIDS % 205,
+ USERGUIDS % 206,
+ USERGUIDS % 207,
+ USERGUIDS % 208,
+ USERGUIDS % 209,
+ USERGUIDS % 210,
+ USERGUIDS % 211,
+ USERGUIDS % 212,
+ USERGUIDS % 213,
+ USERGUIDS % 214,
+ USERGUIDS % 215,
+ USERGUIDS % 216,
+ USERGUIDS % 217,
+ USERGUIDS % 218,
+ USERGUIDS % 219,
+ USERGUIDS % 220,
+ USERGUIDS % 221,
+ USERGUIDS % 222,
+ USERGUIDS % 223,
+ USERGUIDS % 224,
+ USERGUIDS % 225,
+ USERGUIDS % 226,
+ USERGUIDS % 227,
+ USERGUIDS % 228,
+ USERGUIDS % 229,
+ USERGUIDS % 230,
+ USERGUIDS % 231,
+ USERGUIDS % 232,
+ USERGUIDS % 233,
+ USERGUIDS % 234,
+ USERGUIDS % 235,
+ USERGUIDS % 236,
+ USERGUIDS % 237,
+ USERGUIDS % 238,
+ USERGUIDS % 239,
+ USERGUIDS % 240,
+ USERGUIDS % 241,
+ USERGUIDS % 242,
+ USERGUIDS % 243,
+ USERGUIDS % 244,
+ USERGUIDS % 245,
+ USERGUIDS % 246,
+ USERGUIDS % 247,
+ USERGUIDS % 248,
+ USERGUIDS % 249,
+ USERGUIDS % 250,
+ USERGUIDS % 251,
+ USERGUIDS % 252,
+ USERGUIDS % 253,
+ USERGUIDS % 254,
+ USERGUIDS % 255,
+ USERGUIDS % 256,
+ USERGUIDS % 257,
+ USERGUIDS % 258,
+ USERGUIDS % 259,
+ USERGUIDS % 260,
+ USERGUIDS % 261,
+ USERGUIDS % 262,
+ USERGUIDS % 263,
+ USERGUIDS % 264,
+ USERGUIDS % 265,
+ USERGUIDS % 266,
+ USERGUIDS % 267,
+ USERGUIDS % 268,
+ USERGUIDS % 269,
+ USERGUIDS % 270,
+ USERGUIDS % 271,
+ USERGUIDS % 272,
+ USERGUIDS % 273,
+ USERGUIDS % 274,
+ USERGUIDS % 275,
+ USERGUIDS % 276,
+ USERGUIDS % 277,
+ USERGUIDS % 278,
+ USERGUIDS % 279,
+ USERGUIDS % 280,
+ USERGUIDS % 281,
+ USERGUIDS % 282,
+ USERGUIDS % 283,
+ USERGUIDS % 284,
+ USERGUIDS % 285,
+ USERGUIDS % 286,
+ USERGUIDS % 287,
+ USERGUIDS % 288,
+ USERGUIDS % 289,
+ USERGUIDS % 290,
+ USERGUIDS % 291,
+ USERGUIDS % 292,
+ USERGUIDS % 293,
+ USERGUIDS % 294,
+ USERGUIDS % 295,
+ USERGUIDS % 296,
+ USERGUIDS % 297,
+ USERGUIDS % 298,
+ USERGUIDS % 299,
+ USERGUIDS % 300,
+ USERGUIDS % 301,
+ USERGUIDS % 302,
+ USERGUIDS % 303,
+ USERGUIDS % 304,
+ USERGUIDS % 305,
+ USERGUIDS % 306,
+ USERGUIDS % 307,
+ USERGUIDS % 308,
+ USERGUIDS % 309,
+ USERGUIDS % 310,
+ USERGUIDS % 311,
+ USERGUIDS % 312,
+ USERGUIDS % 313,
+ USERGUIDS % 314,
+ USERGUIDS % 315,
+ USERGUIDS % 316,
+ USERGUIDS % 317,
+ USERGUIDS % 318,
+ USERGUIDS % 319,
+ USERGUIDS % 320,
+ USERGUIDS % 321,
+ USERGUIDS % 322,
+ USERGUIDS % 323,
+ USERGUIDS % 324,
+ USERGUIDS % 325,
+ USERGUIDS % 326,
+ USERGUIDS % 327,
+ USERGUIDS % 328,
+ USERGUIDS % 329,
+ USERGUIDS % 330,
+ USERGUIDS % 331,
+ USERGUIDS % 332,
+ USERGUIDS % 333,
+ USERGUIDS % 334,
+ USERGUIDS % 335,
+ USERGUIDS % 336,
+ USERGUIDS % 337,
+ USERGUIDS % 338,
+ USERGUIDS % 339,
+ USERGUIDS % 340,
+ USERGUIDS % 341,
+ USERGUIDS % 342,
+ USERGUIDS % 343,
+ USERGUIDS % 344,
+ USERGUIDS % 345,
+ USERGUIDS % 346,
+ USERGUIDS % 347,
+ USERGUIDS % 348,
+ USERGUIDS % 349,
+ USERGUIDS % 350,
+ USERGUIDS % 351,
+ USERGUIDS % 352,
+ USERGUIDS % 353,
+ USERGUIDS % 354,
+ USERGUIDS % 355,
+ USERGUIDS % 356,
+ USERGUIDS % 357,
+ USERGUIDS % 358,
+ USERGUIDS % 359,
+ USERGUIDS % 360,
+ USERGUIDS % 361,
+ USERGUIDS % 362,
+ USERGUIDS % 363,
+ USERGUIDS % 364,
+ USERGUIDS % 365,
+ USERGUIDS % 366,
+ USERGUIDS % 367,
+ USERGUIDS % 368,
+ USERGUIDS % 369,
+ USERGUIDS % 370,
+ USERGUIDS % 371,
+ USERGUIDS % 372,
+ USERGUIDS % 373,
+ USERGUIDS % 374,
+ USERGUIDS % 375,
+ USERGUIDS % 376,
+ USERGUIDS % 377,
+ USERGUIDS % 378,
+ USERGUIDS % 379,
+ USERGUIDS % 380,
+ USERGUIDS % 381,
+ USERGUIDS % 382,
+ USERGUIDS % 383,
+ USERGUIDS % 384,
+ USERGUIDS % 385,
+ USERGUIDS % 386,
+ USERGUIDS % 387,
+ USERGUIDS % 388,
+ USERGUIDS % 389,
+ USERGUIDS % 390,
+ USERGUIDS % 391,
+ USERGUIDS % 392,
+ USERGUIDS % 393,
+ USERGUIDS % 394,
+ USERGUIDS % 395,
+ USERGUIDS % 396,
+ USERGUIDS % 397,
+ USERGUIDS % 398,
+ USERGUIDS % 399,
+ USERGUIDS % 400,
+ USERGUIDS % 401,
+ USERGUIDS % 402,
+ USERGUIDS % 403,
+ USERGUIDS % 404,
+ USERGUIDS % 405,
+ USERGUIDS % 406,
+ USERGUIDS % 407,
+ USERGUIDS % 408,
+ USERGUIDS % 409,
+ USERGUIDS % 410,
+ USERGUIDS % 411,
+ USERGUIDS % 412,
+ USERGUIDS % 413,
+ USERGUIDS % 414,
+ USERGUIDS % 415,
+ USERGUIDS % 416,
+ USERGUIDS % 417,
+ USERGUIDS % 418,
+ USERGUIDS % 419,
+ USERGUIDS % 420,
+ USERGUIDS % 421,
+ USERGUIDS % 422,
+ USERGUIDS % 423,
+ USERGUIDS % 424,
+ USERGUIDS % 425,
+ USERGUIDS % 426,
+ USERGUIDS % 427,
+ USERGUIDS % 428,
+ USERGUIDS % 429,
+ USERGUIDS % 430,
+ USERGUIDS % 431,
+ USERGUIDS % 432,
+ USERGUIDS % 433,
+ USERGUIDS % 434,
+ USERGUIDS % 435,
+ USERGUIDS % 436,
+ USERGUIDS % 437,
+ USERGUIDS % 438,
+ USERGUIDS % 439,
+ USERGUIDS % 440,
+ USERGUIDS % 441,
+ USERGUIDS % 442,
+ USERGUIDS % 443,
+ USERGUIDS % 444,
+ USERGUIDS % 445,
+ USERGUIDS % 446,
+ USERGUIDS % 447,
+ USERGUIDS % 448,
+ USERGUIDS % 449,
+ USERGUIDS % 450,
+ USERGUIDS % 451,
+ USERGUIDS % 452,
+ USERGUIDS % 453,
+ USERGUIDS % 454,
+ USERGUIDS % 455,
+ USERGUIDS % 456,
+ USERGUIDS % 457,
+ USERGUIDS % 458,
+ USERGUIDS % 459,
+ USERGUIDS % 460,
+ USERGUIDS % 461,
+ USERGUIDS % 462,
+ USERGUIDS % 463,
+ USERGUIDS % 464,
+ USERGUIDS % 465,
+ USERGUIDS % 466,
+ USERGUIDS % 467,
+ USERGUIDS % 468,
+ USERGUIDS % 469,
+ USERGUIDS % 470,
+ USERGUIDS % 471,
+ USERGUIDS % 472,
+ USERGUIDS % 473,
+ USERGUIDS % 474,
+ USERGUIDS % 475,
+ USERGUIDS % 476,
+ USERGUIDS % 477,
+ USERGUIDS % 478,
+ USERGUIDS % 479,
+ USERGUIDS % 480,
+ USERGUIDS % 481,
+ USERGUIDS % 482,
+ USERGUIDS % 483,
+ USERGUIDS % 484,
+ USERGUIDS % 485,
+ USERGUIDS % 486,
+ USERGUIDS % 487,
+ USERGUIDS % 488,
+ USERGUIDS % 489,
+ USERGUIDS % 490,
+ USERGUIDS % 491,
+ USERGUIDS % 492,
+ USERGUIDS % 493,
+ USERGUIDS % 494,
+ USERGUIDS % 495,
+ USERGUIDS % 496,
+ USERGUIDS % 497,
+ USERGUIDS % 498,
+ USERGUIDS % 499,
+ USERGUIDS % 500,
+ ),
+ })
</ins><span class="cx">
</span><span class="cx"> for i in xrange(1, 101):
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServertrunkcontriboddsattributespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/od/dsattributes.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/od/dsattributes.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/od/dsattributes.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -1,4 +1,4 @@
</span><del>-##
</del><ins>+# #
</ins><span class="cx"> # Copyright (c) 2006-2014 Apple Inc. All rights reserved.
</span><span class="cx"> #
</span><span class="cx"> # Licensed under the Apache License, Version 2.0 (the "License");
</span><span class="lines">@@ -12,7 +12,7 @@
</span><span class="cx"> # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
</span><span class="cx"> # See the License for the specific language governing permissions and
</span><span class="cx"> # limitations under the License.
</span><del>-##
</del><ins>+# #
</ins><span class="cx">
</span><span class="cx"> """
</span><span class="cx"> Record types and attribute names from Directory Service.
</span><span class="lines">@@ -21,22 +21,22 @@
</span><span class="cx">
</span><span class="cx"> # Specific match types
</span><span class="cx">
</span><del>-eDSExact = 0x2001
-eDSStartsWith = 0x2002
-eDSEndsWith = 0x2003
-eDSContains = 0x2004
</del><ins>+eDSExact = 0x2001
+eDSStartsWith = 0x2002
+eDSEndsWith = 0x2003
+eDSContains = 0x2004
</ins><span class="cx">
</span><del>-eDSLessThan = 0x2005
-eDSGreaterThan = 0x2006
-eDSLessEqual = 0x2007
-eDSGreaterEqual = 0x2008
</del><ins>+eDSLessThan = 0x2005
+eDSGreaterThan = 0x2006
+eDSLessEqual = 0x2007
+eDSGreaterEqual = 0x2008
</ins><span class="cx">
</span><span class="cx"> # Specific Record Type Constants
</span><span class="cx">
</span><span class="cx"> """
</span><span class="cx"> DirectoryService Specific Record Type Constants
</span><span class="cx"> """
</span><del>-
</del><ins>+
</ins><span class="cx"> """
</span><span class="cx"> kDSStdRecordTypeAccessControls
</span><span class="cx"> Record type that contains directory access control directives.
</span><span class="lines">@@ -129,7 +129,7 @@
</span><span class="cx">
</span><span class="cx"> """
</span><span class="cx"> kDSStdRecordTypeFileMakerServers
</span><del>- FileMaker servers record type. Describes available FileMaker servers,
</del><ins>+ FileMaker servers record type. Describes available FileMaker servers,
</ins><span class="cx"> used for service discovery.
</span><span class="cx"> """
</span><span class="cx"> kDSStdRecordTypeFileMakerServers = "dsRecTypeStandard:FileMakerServers"
</span><span class="lines">@@ -392,15 +392,15 @@
</span><span class="cx">
</span><span class="cx"> eDSNxxxxxx Multi-Valued Attribute
</span><span class="cx">
</span><del>- NOTE #1: Access controls may prevent any particular client from reading/writting
</del><ins>+ NOTE #1: Access controls may prevent any particular client from reading/writing
</ins><span class="cx"> various attribute types. In addition some attribute types may not be stored at
</span><span class="cx"> all and could also represent "real-time" data generated by the directory node
</span><span class="cx"> plug-in.
</span><span class="cx">
</span><span class="cx"> NOTE #2: Attributes in the model are available for records and directory nodes.
</span><span class="cx"> """
</span><del>-
</del><span class="cx">
</span><ins>+
</ins><span class="cx"> # Single Valued Specific Attribute Type Constants
</span><span class="cx">
</span><span class="cx">
</span><span class="lines">@@ -458,7 +458,7 @@
</span><span class="cx">
</span><span class="cx"> """
</span><span class="cx"> kDS1AttrBootFile
</span><del>- Attribute type in host or machine records for the name of the
</del><ins>+ Attribute type in host or machine records for the name of the
</ins><span class="cx"> kernel that this machine will use by default when NetBooting.
</span><span class="cx"> """
</span><span class="cx"> kDS1AttrBootFile = "dsAttrTypeStandard:BootFile"
</span><span class="lines">@@ -480,8 +480,8 @@
</span><span class="cx">
</span><span class="cx"> """
</span><span class="cx"> kDS1AttrCapacity
</span><del>- Attribute type for the capacity of a resource.
- found in resource records (kDSStdRecordTypeResources).
</del><ins>+ Attribute type for the capacity of a resource.
+ found in resource records (kDSStdRecordTypeResources).
</ins><span class="cx"> Example: 50
</span><span class="cx"> """
</span><span class="cx"> kDS1AttrCapacity = "dsAttrTypeStandard:Capacity"
</span><span class="lines">@@ -514,14 +514,14 @@
</span><span class="cx">
</span><span class="cx"> """
</span><span class="cx"> kDS1AttrContactGUID
</span><del>- Attribute type for the contact GUID of a group.
- found in group records (kDSStdRecordTypeGroups).
</del><ins>+ Attribute type for the contact GUID of a group.
+ found in group records (kDSStdRecordTypeGroups).
</ins><span class="cx"> """
</span><span class="cx"> kDS1AttrContactGUID = "dsAttrTypeStandard:ContactGUID"
</span><span class="cx">
</span><span class="cx"> """
</span><span class="cx"> kDS1AttrContactPerson
</span><del>- Attribute type for the contact person of the machine.
</del><ins>+ Attribute type for the contact person of the machine.
</ins><span class="cx"> Found in host or machine records.
</span><span class="cx"> """
</span><span class="cx"> kDS1AttrContactPerson = "dsAttrTypeStandard:ContactPerson"
</span><span class="lines">@@ -535,7 +535,7 @@
</span><span class="cx">
</span><span class="cx"> """
</span><span class="cx"> kDS1AttrCrossCertificatePair
</span><del>- Attribute containing the binary of a pair of certificates which
</del><ins>+ Attribute containing the binary of a pair of certificates which
</ins><span class="cx"> verify each other. Both certificates have the same level of authority.
</span><span class="cx"> Usually found in kDSStdRecordTypeCertificateAuthority records.
</span><span class="cx"> """
</span><span class="lines">@@ -587,7 +587,7 @@
</span><span class="cx">
</span><span class="cx"> """
</span><span class="cx"> kDS1AttrGeneratedUID
</span><del>- Used for 36 character (128 bit) unique ID. Usually found in user,
</del><ins>+ Used for 36 character (128 bit) unique ID. Usually found in user,
</ins><span class="cx"> group, and computer records. An example value is "A579E95E-CDFE-4EBC-B7E7-F2158562170F".
</span><span class="cx"> The standard format contains 32 hex characters and four hyphen characters.
</span><span class="cx"> """
</span><span class="lines">@@ -678,7 +678,7 @@
</span><span class="cx">
</span><span class="cx"> """
</span><span class="cx"> kDS1AttrMetaAutomountMap
</span><del>- Used to query for kDSStdRecordTypeAutomount entries associated with a specific
</del><ins>+ Used to query for kDSStdRecordTypeAutomount entries associated with a specific
</ins><span class="cx"> kDSStdRecordTypeAutomountMap.
</span><span class="cx"> """
</span><span class="cx"> kDS1AttrMetaAutomountMap = "dsAttrTypeStandard:MetaAutomountMap"
</span><span class="lines">@@ -728,15 +728,15 @@
</span><span class="cx">
</span><span class="cx"> """
</span><span class="cx"> kDS1AttrOwner
</span><del>- Attribute type for the owner of a record.
</del><ins>+ Attribute type for the owner of a record.
</ins><span class="cx"> Typically the value is a LDAP distinguished name.
</span><span class="cx"> """
</span><span class="cx"> kDS1AttrOwner = "dsAttrTypeStandard:Owner"
</span><span class="cx">
</span><span class="cx"> """
</span><span class="cx"> kDS1AttrOwnerGUID
</span><del>- Attribute type for the owner GUID of a group.
- found in group records (kDSStdRecordTypeGroups).
</del><ins>+ Attribute type for the owner GUID of a group.
+ found in group records (kDSStdRecordTypeGroups).
</ins><span class="cx"> """
</span><span class="cx"> kDS1AttrOwnerGUID = "dsAttrTypeStandard:OwnerGUID"
</span><span class="cx">
</span><span class="lines">@@ -796,7 +796,7 @@
</span><span class="cx">
</span><span class="cx"> """
</span><span class="cx"> kDS1AttrPrimaryComputerGUID
</span><del>- Single-valued attribute that defines a primary computer of the computer group.
</del><ins>+ Single-valued attribute that defines a primary computer of the computer group.
</ins><span class="cx"> added via extensible object for computer group record type (kDSStdRecordTypeComputerGroups)
</span><span class="cx"> """
</span><span class="cx"> kDS1AttrPrimaryComputerGUID = "dsAttrTypeStandard:PrimaryComputerGUID"
</span><span class="lines">@@ -809,7 +809,7 @@
</span><span class="cx">
</span><span class="cx"> """
</span><span class="cx"> kDS1AttrPrimaryGroupID
</span><del>- This is the 32 bit unique ID that represents the primary group
</del><ins>+ This is the 32 bit unique ID that represents the primary group
</ins><span class="cx"> a user is part of, or the ID of a group. Format is a signed 32 bit integer
</span><span class="cx"> represented as a string.
</span><span class="cx"> """
</span><span class="lines">@@ -860,7 +860,7 @@
</span><span class="cx"> """
</span><span class="cx"> kDS1AttrPrinterXRISupported
</span><span class="cx"> Multi-valued attribute that defines additional URIs supported by a printer.
</span><del>- This is used when configuring a printer. This attribute is based on the IPP
</del><ins>+ This is used when configuring a printer. This attribute is based on the IPP
</ins><span class="cx"> Printing Specification RFC and IETF IPP-LDAP Printer Record.
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrPrinterXRISupported = "dsAttrTypeStandard:PrinterXRISupported"
</span><span class="lines">@@ -912,14 +912,14 @@
</span><span class="cx">
</span><span class="cx"> """
</span><span class="cx"> kDS1AttrSMBHome
</span><del>-
</del><ins>+
</ins><span class="cx"> UNC address of Windows homedirectory mount point (\\server\\sharepoint).
</span><span class="cx"> """
</span><span class="cx"> kDS1AttrSMBHome = "dsAttrTypeStandard:SMBHome"
</span><span class="cx">
</span><span class="cx"> """
</span><span class="cx"> kDS1AttrSMBHomeDrive
</span><del>-
</del><ins>+
</ins><span class="cx"> Drive letter for homedirectory mount point.
</span><span class="cx"> """
</span><span class="cx"> kDS1AttrSMBHomeDrive = "dsAttrTypeStandard:SMBHomeDrive"
</span><span class="lines">@@ -977,7 +977,7 @@
</span><span class="cx"> """
</span><span class="cx"> kDS1AttrSMBSID
</span><span class="cx"> SMB Security ID, stored as a string attribute of up to 64 bytes.
</span><del>- Found in user, group, and computer records (kDSStdRecordTypeUsers,
</del><ins>+ Found in user, group, and computer records (kDSStdRecordTypeUsers,
</ins><span class="cx"> kDSStdRecordTypeGroups, kDSStdRecordTypeComputers).
</span><span class="cx"> """
</span><span class="cx"> kDS1AttrSMBSID = "dsAttrTypeStandard:SMBSID"
</span><span class="lines">@@ -991,7 +991,7 @@
</span><span class="cx"> """
</span><span class="cx"> kDS1AttrServiceType
</span><span class="cx"> Represents the service type for the service. This is the raw service type of the
</span><del>- service. For example a service record type of kDSStdRecordTypeWebServer
</del><ins>+ service. For example a service record type of kDSStdRecordTypeWebServer
</ins><span class="cx"> might have a service type of "http" or "https".
</span><span class="cx"> """
</span><span class="cx"> kDS1AttrServiceType = "dsAttrTypeStandard:ServiceType"
</span><span class="lines">@@ -1023,7 +1023,7 @@
</span><span class="cx"> """
</span><span class="cx"> kDS1AttrTimeToLive
</span><span class="cx"> Attribute recommending how long to cache the record's attribute values.
</span><del>- Format is an unsigned 32 bit representing seconds. ie. 300 is 5 minutes.
</del><ins>+ Format is an unsigned 32 bit representing seconds. i.e. 300 is 5 minutes.
</ins><span class="cx"> """
</span><span class="cx"> kDS1AttrTimeToLive = "dsAttrTypeStandard:TimeToLive"
</span><span class="cx">
</span><span class="lines">@@ -1038,14 +1038,14 @@
</span><span class="cx"> kDS1AttrUserCertificate
</span><span class="cx"> Attribute containing the binary of the user's certificate.
</span><span class="cx"> Usually found in user records. The certificate is data which identifies a user.
</span><del>- This data is attested to by a known party, and can be independently verified
</del><ins>+ This data is attested to by a known party, and can be independently verified
</ins><span class="cx"> by a third party.
</span><span class="cx"> """
</span><span class="cx"> kDS1AttrUserCertificate = "dsAttrTypeStandard:UserCertificate"
</span><span class="cx">
</span><span class="cx"> """
</span><span class="cx"> kDS1AttrUserPKCS12Data
</span><del>- Attribute containing binary data in PKCS #12 format.
</del><ins>+ Attribute containing binary data in PKCS #12 format.
</ins><span class="cx"> Usually found in user records. The value can contain keys, certificates,
</span><span class="cx"> and other related information and is encrypted with a passphrase.
</span><span class="cx"> """
</span><span class="lines">@@ -1061,7 +1061,7 @@
</span><span class="cx"> kDS1AttrUserSMIMECertificate
</span><span class="cx"> Attribute containing the binary of the user's SMIME certificate.
</span><span class="cx"> Usually found in user records. The certificate is data which identifies a user.
</span><del>- This data is attested to by a known party, and can be independently verified
</del><ins>+ This data is attested to by a known party, and can be independently verified
</ins><span class="cx"> by a third party. SMIME certificates are often used for signed or encrypted
</span><span class="cx"> emails.
</span><span class="cx"> """
</span><span class="lines">@@ -1094,7 +1094,7 @@
</span><span class="cx"> """
</span><span class="cx"> kDS1AttrWeblogURI
</span><span class="cx"> Single-valued attribute that defines the URI of a user's weblog.
</span><del>- Usually found in user records (kDSStdRecordTypeUsers).
</del><ins>+ Usually found in user records (kDSStdRecordTypeUsers).
</ins><span class="cx"> Example: http://example.com/blog/jsmith
</span><span class="cx"> """
</span><span class="cx"> kDS1AttrWeblogURI = "dsAttrTypeStandard:WeblogURI"
</span><span class="lines">@@ -1193,7 +1193,7 @@
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrBuilding
</span><span class="cx"> Represents the building name for a user or person record.
</span><del>- Usually found in user or people records (kDSStdRecordTypeUsers or
</del><ins>+ Usually found in user or people records (kDSStdRecordTypeUsers or
</ins><span class="cx"> kDSStdRecordTypePeople).
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrBuilding = "dsAttrTypeStandard:Building"
</span><span class="lines">@@ -1207,7 +1207,7 @@
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrCity
</span><span class="cx"> Usually, city for a user or person record.
</span><del>- Usually found in user or people records (kDSStdRecordTypeUsers or
</del><ins>+ Usually found in user or people records (kDSStdRecordTypeUsers or
</ins><span class="cx"> kDSStdRecordTypePeople).
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrCity = "dsAttrTypeStandard:City"
</span><span class="lines">@@ -1235,7 +1235,7 @@
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrCountry
</span><span class="cx"> Represents country of a record entry.
</span><del>- Usually found in user or people records (kDSStdRecordTypeUsers or
</del><ins>+ Usually found in user or people records (kDSStdRecordTypeUsers or
</ins><span class="cx"> kDSStdRecordTypePeople).
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrCountry = "dsAttrTypeStandard:Country"
</span><span class="lines">@@ -1243,7 +1243,7 @@
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrDepartment
</span><span class="cx"> Represents the department name of a user or person.
</span><del>- Usually found in user or people records (kDSStdRecordTypeUsers or
</del><ins>+ Usually found in user or people records (kDSStdRecordTypeUsers or
</ins><span class="cx"> kDSStdRecordTypePeople).
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrDepartment = "dsAttrTypeStandard:Department"
</span><span class="lines">@@ -1263,7 +1263,7 @@
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrEMailContacts
</span><span class="cx"> multi-valued attribute that defines a record's custom email addresses .
</span><del>- found in user records (kDSStdRecordTypeUsers).
</del><ins>+ found in user records (kDSStdRecordTypeUsers).
</ins><span class="cx"> Example: home:johndoe@mymail.com
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrEMailContacts = "dsAttrTypeStandard:EMailContacts"
</span><span class="lines">@@ -1271,7 +1271,7 @@
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrFaxNumber
</span><span class="cx"> Represents the FAX numbers of a user or person.
</span><del>- Usually found in user or people records (kDSStdRecordTypeUsers or
</del><ins>+ Usually found in user or people records (kDSStdRecordTypeUsers or
</ins><span class="cx"> kDSStdRecordTypePeople).
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrFaxNumber = "dsAttrTypeStandard:FAXNumber"
</span><span class="lines">@@ -1297,7 +1297,7 @@
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrGroupServices
</span><span class="cx"> xml-plist attribute that defines a group's services .
</span><del>- found in group records (kDSStdRecordTypeGroups).
</del><ins>+ found in group records (kDSStdRecordTypeGroups).
</ins><span class="cx"> """
</span><span class="cx"> kDSNAttrGroupServices = "dsAttrTypeStandard:GroupServices"
</span><span class="cx">
</span><span class="lines">@@ -1336,9 +1336,9 @@
</span><span class="cx">
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrIPAddressAndENetAddress
</span><del>- A pairing of IPv4 or IPv6 addresses with Ethernet addresses
- (e.g., "10.1.1.1/00:16:cb:92:56:41"). Usually found on kDSStdRecordTypeComputers for use by
- services that need specific pairing of the two values. This should be in addition to
</del><ins>+ A pairing of IPv4 or IPv6 addresses with Ethernet addresses
+ (e.g., "10.1.1.1/00:16:cb:92:56:41"). Usually found on kDSStdRecordTypeComputers for use by
+ services that need specific pairing of the two values. This should be in addition to
</ins><span class="cx"> kDSNAttrIPAddress, kDSNAttrIPv6Address and kDS1AttrENetAddress. This is necessary because not
</span><span class="cx"> all directories return attribute values in a guaranteed order.
</span><span class="cx"> """
</span><span class="lines">@@ -1347,15 +1347,15 @@
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrIPv6Address
</span><span class="cx"> IPv6 address expressed in the standard notation (e.g., "fe80::236:caff:fcc2:5641" )
</span><del>- Usually found on kDSStdRecordTypeComputers, kDSStdRecordTypeHosts, and
</del><ins>+ Usually found on kDSStdRecordTypeComputers, kDSStdRecordTypeHosts, and
</ins><span class="cx"> kDSStdRecordTypeMachines.
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrIPv6Address = "dsAttrTypeStandard:IPv6Address"
</span><span class="cx">
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrJPEGPhoto
</span><del>- Used to store binary picture data in JPEG format.
- Usually found in user, people or group records (kDSStdRecordTypeUsers,
</del><ins>+ Used to store binary picture data in JPEG format.
+ Usually found in user, people or group records (kDSStdRecordTypeUsers,
</ins><span class="cx"> kDSStdRecordTypePeople, kDSStdRecordTypeGroups).
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrJPEGPhoto = "dsAttrTypeStandard:JPEGPhoto"
</span><span class="lines">@@ -1363,7 +1363,7 @@
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrJobTitle
</span><span class="cx"> Represents the job title of a user.
</span><del>- Usually found in user or people records (kDSStdRecordTypeUsers or
</del><ins>+ Usually found in user or people records (kDSStdRecordTypeUsers or
</ins><span class="cx"> kDSStdRecordTypePeople).
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrJobTitle = "dsAttrTypeStandard:JobTitle"
</span><span class="lines">@@ -1394,7 +1394,7 @@
</span><span class="cx">
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrMachineServes
</span><del>- Attribute type in host or machine records for storing NetInfo
</del><ins>+ Attribute type in host or machine records for storing NetInfo
</ins><span class="cx"> domains served.
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrMachineServes = "dsAttrTypeStandard:MachineServes"
</span><span class="lines">@@ -1410,7 +1410,7 @@
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrMapURI
</span><span class="cx"> attribute that defines the URI of a user's location.
</span><del>- Usually found in user records (kDSStdRecordTypeUsers).
</del><ins>+ Usually found in user records (kDSStdRecordTypeUsers).
</ins><span class="cx"> Example: http://example.com/bldg1
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrMapURI = "dsAttrTypeStandard:MapURI"
</span><span class="lines">@@ -1423,20 +1423,20 @@
</span><span class="cx">
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrMIME
</span><del>- Data contained in this attribute type is a fully qualified MIME Type.
</del><ins>+ Data contained in this attribute type is a fully qualified MIME Type.
</ins><span class="cx"> """
</span><span class="cx"> kDSNAttrMIME = "dsAttrTypeStandard:MIME"
</span><span class="cx">
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrMember
</span><del>- List of member records.
</del><ins>+ List of member records.
</ins><span class="cx"> """
</span><span class="cx"> kDSNAttrMember = "dsAttrTypeStandard:Member"
</span><span class="cx">
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrMobileNumber
</span><span class="cx"> Represents the mobile numbers of a user or person.
</span><del>- Usually found in user or people records (kDSStdRecordTypeUsers or
</del><ins>+ Usually found in user or people records (kDSStdRecordTypeUsers or
</ins><span class="cx"> kDSStdRecordTypePeople).
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrMobileNumber = "dsAttrTypeStandard:MobileNumber"
</span><span class="lines">@@ -1463,7 +1463,7 @@
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrNickName
</span><span class="cx"> Represents the nickname of a user or person.
</span><del>- Usually found in user or people records (kDSStdRecordTypeUsers or
</del><ins>+ Usually found in user or people records (kDSStdRecordTypeUsers or
</ins><span class="cx"> kDSStdRecordTypePeople).
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrNickName = "dsAttrTypeStandard:NickName"
</span><span class="lines">@@ -1490,7 +1490,7 @@
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrPagerNumber
</span><span class="cx"> Represents the pager numbers of a user or person.
</span><del>- Usually found in user or people records (kDSStdRecordTypeUsers or
</del><ins>+ Usually found in user or people records (kDSStdRecordTypeUsers or
</ins><span class="cx"> kDSStdRecordTypePeople).
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrPagerNumber = "dsAttrTypeStandard:PagerNumber"
</span><span class="lines">@@ -1498,7 +1498,7 @@
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrPhoneContacts
</span><span class="cx"> multi-valued attribute that defines a record's custom phone numbers .
</span><del>- found in user records (kDSStdRecordTypeUsers).
</del><ins>+ found in user records (kDSStdRecordTypeUsers).
</ins><span class="cx"> Example: home fax:408-555-4444
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrPhoneContacts = "dsAttrTypeStandard:PhoneContacts"
</span><span class="lines">@@ -1539,7 +1539,7 @@
</span><span class="cx"> kDSNAttrNamePrefix
</span><span class="cx"> Represents the title prefix of a user or person.
</span><span class="cx"> ie. Mr., Ms., Mrs., Dr., etc.
</span><del>- Usually found in user or people records (kDSStdRecordTypeUsers or
</del><ins>+ Usually found in user or people records (kDSStdRecordTypeUsers or
</ins><span class="cx"> kDSStdRecordTypePeople).
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrNamePrefix = "dsAttrTypeStandard:NamePrefix"
</span><span class="lines">@@ -1559,7 +1559,7 @@
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrRelationships
</span><span class="cx"> multi-valued attribute that defines the relationship to the record type .
</span><del>- found in user records (kDSStdRecordTypeUsers).
</del><ins>+ found in user records (kDSStdRecordTypeUsers).
</ins><span class="cx"> Example: brother:John
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrRelationships = "dsAttrTypeStandard:Relationships"
</span><span class="lines">@@ -1572,8 +1572,8 @@
</span><span class="cx">
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrResourceType
</span><del>- Attribute type for the kind of resource.
- found in resource records (kDSStdRecordTypeResources).
</del><ins>+ Attribute type for the kind of resource.
+ found in resource records (kDSStdRecordTypeResources).
</ins><span class="cx"> Example: ConferenceRoom
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrResourceType = "dsAttrTypeStandard:ResourceType"
</span><span class="lines">@@ -1593,7 +1593,7 @@
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrStreet
</span><span class="cx"> Represents the street address of a user or person.
</span><del>- Usually found in user or people records (kDSStdRecordTypeUsers or
</del><ins>+ Usually found in user or people records (kDSStdRecordTypeUsers or
</ins><span class="cx"> kDSStdRecordTypePeople).
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrStreet = "dsAttrTypeStandard:Street"
</span><span class="lines">@@ -1602,7 +1602,7 @@
</span><span class="cx"> kDSNAttrNameSuffix
</span><span class="cx"> Represents the name suffix of a user or person.
</span><span class="cx"> ie. Jr., Sr., etc.
</span><del>- Usually found in user or people records (kDSStdRecordTypeUsers or
</del><ins>+ Usually found in user or people records (kDSStdRecordTypeUsers or
</ins><span class="cx"> kDSStdRecordTypePeople).
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrNameSuffix = "dsAttrTypeStandard:NameSuffix"
</span><span class="lines">@@ -1837,7 +1837,7 @@
</span><span class="cx"> """
</span><span class="cx"> Search Node attribute type Constants
</span><span class="cx"> """
</span><del>-
</del><ins>+
</ins><span class="cx"> """
</span><span class="cx"> kDS1AttrSearchPath
</span><span class="cx"> Search path used by the search node.
</span><span class="lines">@@ -1891,4 +1891,3 @@
</span><span class="cx"> Retained only for backward compatibility.
</span><span class="cx"> """
</span><span class="cx"> kDSNAttrCSPSearchPath = "dsAttrTypeStandard:CSPSearchPath"
</span><del>-
</del></span></pre></div>
<a id="CalendarServertrunkcontribododframeworkpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/od/odframework.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/od/odframework.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/od/odframework.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -1,8 +1,10 @@
</span><span class="cx"> import objc as _objc
</span><span class="cx">
</span><del>-__bundle__ = _objc.initFrameworkWrapper("OpenDirectory",
</del><ins>+__bundle__ = _objc.initFrameworkWrapper(
+ "OpenDirectory",
</ins><span class="cx"> frameworkIdentifier="com.apple.OpenDirectory",
</span><span class="cx"> frameworkPath=_objc.pathForFramework(
</span><del>- "/System/Library/Frameworks/OpenDirectory.framework"),
- globals=globals())
-
</del><ins>+ "/System/Library/Frameworks/OpenDirectory.framework"
+ ),
+ globals=globals()
+)
</ins></span></pre></div>
<a id="CalendarServertrunkcontribperformance_event_createpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/performance/_event_create.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/performance/_event_create.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/performance/_event_create.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -119,8 +119,8 @@
</span><span class="cx"> 'ORGANIZER': makeOrganizer(organizerSequence),
</span><span class="cx"> 'ATTENDEES': ''.join(attendees),
</span><span class="cx"> 'RRULE': rrule,
</span><del>- },
- }
</del><ins>+ },
+ }
</ins><span class="cx"> return cal.replace("\n", "\r\n")
</span><span class="cx">
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServertrunkcontribperformancebenchlibpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/performance/benchlib.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/performance/benchlib.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/performance/benchlib.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -88,8 +88,8 @@
</span><span class="cx"> root=root, principal=principal)
</span><span class="cx"> cal = "/calendars/users/%s/%s/" % (user, calendar)
</span><span class="cx"> d = _serial([
</span><del>- (account.deleteResource, (cal,)),
- (account.makeCalendar, (cal,))])
</del><ins>+ (account.deleteResource, (cal,)),
+ (account.makeCalendar, (cal,))])
</ins><span class="cx"> d.addCallback(lambda ignored: account)
</span><span class="cx"> return d
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServertrunkcontribperformancebenchmarkpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/performance/benchmark.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/performance/benchmark.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/performance/benchmark.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -211,7 +211,7 @@
</span><span class="cx"> SQLDuration('execute'): self._execute, # Time spent in the execute phase of SQL execution
</span><span class="cx"> SQLDuration('iternext'): self._iternext, # Time spent fetching rows from the execute phase
</span><span class="cx"> SQLDuration('SQL'): self._execute + self._iternext, # Combination of the previous two
</span><del>- }
</del><ins>+ }
</ins><span class="cx"> self._init_stats()
</span><span class="cx"> return results
</span><span class="cx">
</span><span class="lines">@@ -370,11 +370,11 @@
</span><span class="cx"> ('label', 'l', 'data', 'A descriptive string to attach to the output filename.'),
</span><span class="cx"> ('hosts-count', None, None, 'For distributed benchmark collection, the number of hosts participating in collection.', int),
</span><span class="cx"> ('host-index', None, None, 'For distributed benchmark collection, the (zero-based) index of this host in the collection.', int),
</span><del>- ]
</del><ins>+ ]
</ins><span class="cx">
</span><span class="cx"> optFlags = [
</span><span class="cx"> ('debug', None, 'Enable various debugging helpers'),
</span><del>- ]
</del><ins>+ ]
</ins><span class="cx">
</span><span class="cx"> def __init__(self):
</span><span class="cx"> Options.__init__(self)
</span></span></pre></div>
<a id="CalendarServertrunkcontribperformancebenchmarksfind_eventspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/performance/benchmarks/find_events.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/performance/benchmarks/find_events.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/performance/benchmarks/find_events.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -52,7 +52,7 @@
</span><span class="cx"> StringProducer(event))
</span><span class="cx"> worker = worker()
</span><span class="cx"> return gatherResults([
</span><del>- cooperate(worker).whenDone() for _ignore_i in range(3)])
</del><ins>+ cooperate(worker).whenDone() for _ignore_i in range(3)])
</ins><span class="cx">
</span><span class="cx">
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServertrunkcontribperformancebenchmarksvfreebusypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/performance/benchmarks/vfreebusy.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/performance/benchmarks/vfreebusy.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/performance/benchmarks/vfreebusy.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -110,8 +110,8 @@
</span><span class="cx"> 'START': formatDate(base + i * interval),
</span><span class="cx"> 'END': formatDate(base + i * interval + duration),
</span><span class="cx"> 'SEQUENCE': i,
</span><del>- },
- }
</del><ins>+ },
+ }
</ins><span class="cx"> return data.replace("\n", "\r\n")
</span><span class="cx">
</span><span class="cx">
</span><span class="lines">@@ -149,17 +149,17 @@
</span><span class="cx"> method = 'POST'
</span><span class="cx"> uri = 'http://%s:%d/calendars/__uids__/%s/outbox/' % (host, port, user)
</span><span class="cx"> headers = Headers({
</span><del>- "content-type": ["text/calendar"],
- "originator": ["mailto:%s@example.com" % (user,)],
- "recipient": ["urn:x-uid:%s, urn:x-uid:10000000-0000-0000-0000-000000000002" % (uid,)]})
</del><ins>+ "content-type": ["text/calendar"],
+ "originator": ["mailto:%s@example.com" % (user,)],
+ "recipient": ["urn:x-uid:%s, urn:x-uid:10000000-0000-0000-0000-000000000002" % (uid,)]})
</ins><span class="cx">
</span><span class="cx"> vfb = VFREEBUSY % {
</span><del>- "attendees": "".join([
- "ATTENDEE:urn:x-uid:%s\n" % (uid,),
- "ATTENDEE:urn:x-uid:10000000-0000-0000-0000-000000000002\n"]),
- "start": formatDate(baseTime.replace(hour=0, minute=0)) + 'Z',
- "end": formatDate(
- baseTime.replace(hour=0, minute=0) + timedelta(days=1)) + 'Z'}
</del><ins>+ "attendees": "".join([
+ "ATTENDEE:urn:x-uid:%s\n" % (uid,),
+ "ATTENDEE:urn:x-uid:10000000-0000-0000-0000-000000000002\n"]),
+ "start": formatDate(baseTime.replace(hour=0, minute=0)) + 'Z',
+ "end": formatDate(
+ baseTime.replace(hour=0, minute=0) + timedelta(days=1)) + 'Z'}
</ins><span class="cx"> body = StringProducer(vfb.replace("\n", "\r\n"))
</span><span class="cx">
</span><span class="cx"> samples = yield sample(
</span></span></pre></div>
<a id="CalendarServertrunkcontribperformancebenchmarksvfreebusy_vary_attendeespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/performance/benchmarks/vfreebusy_vary_attendees.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/performance/benchmarks/vfreebusy_vary_attendees.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/performance/benchmarks/vfreebusy_vary_attendees.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -78,16 +78,16 @@
</span><span class="cx"> method = 'POST'
</span><span class="cx"> uri = 'http://%s:%d/calendars/__uids__/10000000-0000-0000-0000-000000000001/outbox/' % (host, port)
</span><span class="cx"> headers = Headers({
</span><del>- "content-type": ["text/calendar"],
- "originator": ["mailto:%s@example.com" % (user,)],
- "recipient": [", ".join(["urn:x-uid:10000000-0000-0000-0000-000000000%03d" % (i,) for i in [userNumber] + targets])]})
</del><ins>+ "content-type": ["text/calendar"],
+ "originator": ["mailto:%s@example.com" % (user,)],
+ "recipient": [", ".join(["urn:x-uid:10000000-0000-0000-0000-000000000%03d" % (i,) for i in [userNumber] + targets])]})
</ins><span class="cx"> body = StringProducer(VFREEBUSY % {
</span><del>- "attendees": "".join([
- "ATTENDEE:urn:x-uid:10000000-0000-0000-0000-000000000%03d\n" % (i,)
- for i in [userNumber] + targets]),
- "start": formatDate(baseTime.replace(hour=0, minute=0)) + 'Z',
- "end": formatDate(
- baseTime.replace(hour=0, minute=0) + timedelta(days=1)) + 'Z'})
</del><ins>+ "attendees": "".join([
+ "ATTENDEE:urn:x-uid:10000000-0000-0000-0000-000000000%03d\n" % (i,)
+ for i in [userNumber] + targets]),
+ "start": formatDate(baseTime.replace(hour=0, minute=0)) + 'Z',
+ "end": formatDate(
+ baseTime.replace(hour=0, minute=0) + timedelta(days=1)) + 'Z'})
</ins><span class="cx">
</span><span class="cx"> samples = yield sample(
</span><span class="cx"> dtrace, samples,
</span></span></pre></div>
<a id="CalendarServertrunkcontribperformanceeventkitframeworkpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/performance/eventkitframework.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/performance/eventkitframework.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/performance/eventkitframework.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -1,7 +1,10 @@
</span><span class="cx"> import objc as _objc
</span><span class="cx">
</span><del>-__bundle__ = _objc.initFrameworkWrapper("EventKit",
</del><ins>+__bundle__ = _objc.initFrameworkWrapper(
+ "EventKit",
</ins><span class="cx"> frameworkIdentifier="com.apple.EventKit",
</span><span class="cx"> frameworkPath=_objc.pathForFramework(
</span><del>- "/System/Library/Frameworks/EventKit.framework"),
- globals=globals())
</del><ins>+ "/System/Library/Frameworks/EventKit.framework"
+ ),
+ globals=globals()
+)
</ins></span></pre></div>
<a id="CalendarServertrunkcontribperformancehttpauthpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/performance/httpauth.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/performance/httpauth.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/performance/httpauth.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -101,7 +101,7 @@
</span><span class="cx"> challengeType = {
</span><span class="cx"> 'basic': BasicChallenge,
</span><span class="cx"> 'digest': DigestChallenge,
</span><del>- }.get(scheme.lower())
</del><ins>+ }.get(scheme.lower())
</ins><span class="cx"> if challengeType is None:
</span><span class="cx"> return "", None
</span><span class="cx"> return scheme.lower(), challengeType(**args)
</span><span class="lines">@@ -125,7 +125,7 @@
</span><span class="cx"> else:
</span><span class="cx"> authorization = headers.getRawHeaders('authorization')
</span><span class="cx"> msg("UNAUTHORIZED response to %s %s (Authorization=%r)" % (
</span><del>- method, uri, authorization))
</del><ins>+ method, uri, authorization))
</ins><span class="cx"> # Look for a challenge
</span><span class="cx"> authorization = response.headers.getRawHeaders('www-authenticate')
</span><span class="cx"> if authorization is None:
</span></span></pre></div>
<a id="CalendarServertrunkcontribperformancestatspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/performance/stats.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/performance/stats.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/performance/stats.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -96,11 +96,11 @@
</span><span class="cx">
</span><span class="cx"> def summarize(self, data):
</span><span class="cx"> return ''.join([
</span><del>- self.name, ' mean ', str(mean(data)), '\n',
- self.name, ' median ', str(median(data)), '\n',
- self.name, ' stddev ', str(stddev(data)), '\n',
- self.name, ' median absolute deviation ', str(mad(data)), '\n',
- self.name, ' sum ', str(sum(data)), '\n'])
</del><ins>+ self.name, ' mean ', str(mean(data)), '\n',
+ self.name, ' median ', str(median(data)), '\n',
+ self.name, ' stddev ', str(stddev(data)), '\n',
+ self.name, ' median absolute deviation ', str(mad(data)), '\n',
+ self.name, ' sum ', str(sum(data)), '\n'])
</ins><span class="cx">
</span><span class="cx">
</span><span class="cx"> def write(self, basename, data):
</span><span class="lines">@@ -178,9 +178,9 @@
</span><span class="cx"> total += interval
</span><span class="cx"> times.append(total / NANO * 1000)
</span><span class="cx"> return ''.join([
</span><del>- '%d: %s\n' % (count, statement)
- for (statement, count)
- in statements.iteritems()]) + _Statistic.summarize(self, times)
</del><ins>+ '%d: %s\n' % (count, statement)
+ for (statement, count)
+ in statements.iteritems()]) + _Statistic.summarize(self, times)
</ins><span class="cx">
</span><span class="cx">
</span><span class="cx"> def statements(self, samples):
</span><span class="lines">@@ -230,7 +230,7 @@
</span><span class="cx"> discrete buckets (eg, as would be suitable for constructing a
</span><span class="cx"> histogram of the values).
</span><span class="cx"> """
</span><del>- #buckets = {}
</del><ins>+ # buckets = {}
</ins><span class="cx"> return []
</span><span class="cx">
</span><span class="cx">
</span></span></pre></div>
<a id="CalendarServertrunkcontribperformancetest_benchmarkpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/performance/test_benchmark.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/performance/test_benchmark.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/performance/test_benchmark.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -164,16 +164,16 @@
</span><span class="cx"> subset.
</span><span class="cx"> """
</span><span class="cx"> self.options.parseOptions([
</span><del>- "--hosts-count=3", "--host-index=0",
- "foo", "bar", "baz", "quux"])
</del><ins>+ "--hosts-count=3", "--host-index=0",
+ "foo", "bar", "baz", "quux"])
</ins><span class="cx"> self.assertEquals(self.options['benchmarks'], ["foo", "quux"])
</span><span class="cx">
</span><span class="cx"> self.options.parseOptions([
</span><del>- "--hosts-count=3", "--host-index=1",
- "foo", "bar", "baz", "quux"])
</del><ins>+ "--hosts-count=3", "--host-index=1",
+ "foo", "bar", "baz", "quux"])
</ins><span class="cx"> self.assertEquals(self.options['benchmarks'], ["bar"])
</span><span class="cx">
</span><span class="cx"> self.options.parseOptions([
</span><del>- "--hosts-count=3", "--host-index=2",
- "foo", "bar", "baz", "quux"])
</del><ins>+ "--hosts-count=3", "--host-index=2",
+ "foo", "bar", "baz", "quux"])
</ins><span class="cx"> self.assertEquals(self.options['benchmarks'], ["baz"])
</span></span></pre></div>
<a id="CalendarServertrunkcontribperformancetest_statspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/performance/test_stats.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/performance/test_stats.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/performance/test_stats.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -109,7 +109,7 @@
</span><span class="cx"> # twisted.trial.unittest.FailTest: not equal:
</span><span class="cx"> # a = datetime.datetime(2011, 6, 4, 15, 30, tzinfo=<DstTzInfo 'US/Eastern' EST-1 day, 19:00:00 STD>)
</span><span class="cx"> # b = datetime.datetime(2011, 6, 4, 19, 30, tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>)
</span><del>- #test_workdistribution.todo = "Somehow timezones mess this up"
</del><ins>+ # test_workdistribution.todo = "Somehow timezones mess this up"
</ins><span class="cx">
</span><span class="cx">
</span><span class="cx"> def test_recurrencedistribution(self):
</span></span></pre></div>
<a id="CalendarServertrunkcontribperformanceuploadpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/performance/upload.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/performance/upload.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/performance/upload.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -48,7 +48,7 @@
</span><span class="cx"> 'Identifier for the file/benchmark/parameter'),
</span><span class="cx"> ('backend', None, None,
</span><span class="cx"> 'Which storage backend produced this data.'),
</span><del>- ]
</del><ins>+ ]
</ins><span class="cx">
</span><span class="cx"> def postOptions(self):
</span><span class="cx"> assert self['url']
</span><span class="lines">@@ -71,7 +71,7 @@
</span><span class="cx"> 'std_dev': str(std_dev),
</span><span class="cx"> 'max': str(max_value),
</span><span class="cx"> 'min': str(min_value),
</span><del>- }
</del><ins>+ }
</ins><span class="cx"> print('uploading', data)
</span><span class="cx"> agent = Agent(reactor)
</span><span class="cx"> d = agent.request('POST', url, None, StringProducer(urlencode(data)))
</span></span></pre></div>
<a id="CalendarServertrunkcontribtoolsfakecalendardatapy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/tools/fakecalendardata.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/tools/fakecalendardata.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/tools/fakecalendardata.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -211,7 +211,7 @@
</span><span class="cx">
</span><span class="cx"> vevents = []
</span><span class="cx"> for count, (recurring, attendees, date, hour) in enumerate(eventTypes):
</span><del>- #print(recurring, attendees, date, hour)
</del><ins>+ # print(recurring, attendees, date, hour)
</ins><span class="cx"> vevents.append(makeVEVENT(recurring, attendees, date, hour, count + 1))
</span><span class="cx">
</span><span class="cx"> print(calendar_template % {"VEVENTS" : "".join(vevents)})
</span></span></pre></div>
<a id="CalendarServertrunkcontribtoolsmonitoranalysispy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/tools/monitoranalysis.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/tools/monitoranalysis.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/tools/monitoranalysis.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -78,7 +78,7 @@
</span><span class="cx">
</span><span class="cx"> if reqs <= 80:
</span><span class="cx"> data.append((dtstamp, reqs, resp, lqnon, cpu))
</span><del>- #print("%s %d %d %d %d" % (dtstamp, reqs, resp, lqnon, cpu))
</del><ins>+ # print("%s %d %d %d %d" % (dtstamp, reqs, resp, lqnon, cpu))
</ins><span class="cx"> except StopIteration:
</span><span class="cx"> break
</span><span class="cx">
</span><span class="lines">@@ -120,8 +120,10 @@
</span><span class="cx"> plt.plot(x1, y1, "b+", x2, y2, "g+", x3, y3, "y+")
</span><span class="cx">
</span><span class="cx"> if first:
</span><del>- plt.legend(('ListenQ at zero', 'ListenQ < 50', 'ListenQ >= 50'),
- 'upper left', shadow=True, fancybox=True)
</del><ins>+ plt.legend(
+ ('ListenQ at zero', 'ListenQ < 50', 'ListenQ >= 50'),
+ 'upper left', shadow=True, fancybox=True
+ )
</ins><span class="cx"> if last:
</span><span class="cx"> plt.xlabel("Requests/second")
</span><span class="cx"> plt.ylabel("Av. Response Time (ms)")
</span><span class="lines">@@ -156,8 +158,10 @@
</span><span class="cx"> )
</span><span class="cx">
</span><span class="cx"> if first:
</span><del>- plt.legend(('CPU < 1/4', 'CPU < 1/2', 'CPU < 3/4', "CPU High"),
- 'upper left', shadow=True, fancybox=True)
</del><ins>+ plt.legend(
+ ('CPU < 1/4', 'CPU < 1/2', 'CPU < 3/4', "CPU High"),
+ 'upper left', shadow=True, fancybox=True
+ )
</ins><span class="cx"> if last:
</span><span class="cx"> plt.xlabel("Requests/second")
</span><span class="cx"> plt.ylabel("Av. Response Time (ms)")
</span></span></pre></div>
<a id="CalendarServertrunkcontribtoolspg_stats_analysispy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/tools/pg_stats_analysis.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/tools/pg_stats_analysis.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/tools/pg_stats_analysis.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -185,8 +185,8 @@
</span><span class="cx"> entries.append(bits)
</span><span class="cx"> if verbose and divmod(len(entries), 1000)[1] == 0:
</span><span class="cx"> print("%d entries" % (len(entries),))
</span><del>- #if float(bits[COLUMN_total_time]) > 1:
- # print(bits[COLUMN_total_time], bits[COLUMN_query])
</del><ins>+ # if float(bits[COLUMN_total_time]) > 1:
+ # print(bits[COLUMN_total_time], bits[COLUMN_query])
</ins><span class="cx">
</span><span class="cx"> if verbose:
</span><span class="cx"> print("Read %d entries" % (len(entries,)))
</span></span></pre></div>
<a id="CalendarServertrunkcontribtoolsprotocolanalysispy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/tools/protocolanalysis.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/tools/protocolanalysis.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/tools/protocolanalysis.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -1039,14 +1039,14 @@
</span><span class="cx"> print("URI Counts")
</span><span class="cx"> self.printURICounts(doTabs)
</span><span class="cx">
</span><del>- #print("User Interaction Counts")
- #self.printUserInteractionCounts(doTabs)
</del><ins>+ # print("User Interaction Counts")
+ # self.printUserInteractionCounts(doTabs)
</ins><span class="cx">
</span><span class="cx"> print("User Weights (top 100)")
</span><span class="cx"> self.printUserWeights(doTabs)
</span><span class="cx">
</span><del>- #print("User Response times")
- #self.printUserResponseTimes(doTabs)
</del><ins>+ # print("User Response times")
+ # self.printUserResponseTimes(doTabs)
</ins><span class="cx">
</span><span class="cx"> print("Sim values")
</span><span class="cx"> self.printSimStats(doTabs)
</span><span class="lines">@@ -1555,10 +1555,10 @@
</span><span class="cx"> def printUserInteractionCounts(self, doTabs):
</span><span class="cx"> table = tables.Table()
</span><span class="cx"> table.setDefaultColumnFormats((
</span><del>- tables.Table.ColumnFormat("%s", tables.Table.ColumnFormat.RIGHT_JUSTIFY),
- tables.Table.ColumnFormat("%s", tables.Table.ColumnFormat.RIGHT_JUSTIFY),
- tables.Table.ColumnFormat("%0.2f", tables.Table.ColumnFormat.RIGHT_JUSTIFY),
- ))
</del><ins>+ tables.Table.ColumnFormat("%s", tables.Table.ColumnFormat.RIGHT_JUSTIFY),
+ tables.Table.ColumnFormat("%s", tables.Table.ColumnFormat.RIGHT_JUSTIFY),
+ tables.Table.ColumnFormat("%0.2f", tables.Table.ColumnFormat.RIGHT_JUSTIFY),
+ ))
</ins><span class="cx"> table.addHeader(("# users accessed", "# of users", "% of users"))
</span><span class="cx"> summary = self.summarizeUserInteraction(METHOD_PROPFIND_CALENDAR_HOME)
</span><span class="cx"> total = sum(summary.values())
</span><span class="lines">@@ -1574,11 +1574,11 @@
</span><span class="cx"> hours = self.timeCounts / self.resolutionMinutes / 60
</span><span class="cx"> table = tables.Table()
</span><span class="cx"> table.setDefaultColumnFormats((
</span><del>- tables.Table.ColumnFormat("%s", tables.Table.ColumnFormat.RIGHT_JUSTIFY),
- tables.Table.ColumnFormat("%s", tables.Table.ColumnFormat.RIGHT_JUSTIFY),
- tables.Table.ColumnFormat("%s", tables.Table.ColumnFormat.RIGHT_JUSTIFY),
- tables.Table.ColumnFormat("%s", tables.Table.ColumnFormat.RIGHT_JUSTIFY),
- ))
</del><ins>+ tables.Table.ColumnFormat("%s", tables.Table.ColumnFormat.RIGHT_JUSTIFY),
+ tables.Table.ColumnFormat("%s", tables.Table.ColumnFormat.RIGHT_JUSTIFY),
+ tables.Table.ColumnFormat("%s", tables.Table.ColumnFormat.RIGHT_JUSTIFY),
+ tables.Table.ColumnFormat("%s", tables.Table.ColumnFormat.RIGHT_JUSTIFY),
+ ))
</ins><span class="cx"> table.addHeader(("Item", "Value", "Items, per User, per Day", "Interval (sec), per item, per user"))
</span><span class="cx"> table.addRow(("Unique Users", users, "", ""))
</span><span class="cx">
</span><span class="lines">@@ -1673,7 +1673,7 @@
</span><span class="cx"> self.printInfo(doTabs)
</span><span class="cx">
</span><span class="cx"> print("Load Analysis Differences")
</span><del>- #self.printLoadAnalysisDetails(doTabs)
</del><ins>+ # self.printLoadAnalysisDetails(doTabs)
</ins><span class="cx"> self.printHourlyTotals(doTabs)
</span><span class="cx">
</span><span class="cx"> if not summary:
</span></span></pre></div>
<a id="CalendarServertrunkcontribtoolsreadStatspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/tools/readStats.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/tools/readStats.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/tools/readStats.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -188,7 +188,7 @@
</span><span class="cx"> ("", "", "per second", "(ms)", "no write(ms)", "(ms)", "Average", "Average", ""),
</span><span class="cx"> )
</span><span class="cx"> table.setDefaultColumnFormats(
</span><del>- (
</del><ins>+ (
</ins><span class="cx"> tables.Table.ColumnFormat("%s", tables.Table.ColumnFormat.LEFT_JUSTIFY),
</span><span class="cx"> tables.Table.ColumnFormat("%d", tables.Table.ColumnFormat.RIGHT_JUSTIFY),
</span><span class="cx"> tables.Table.ColumnFormat("%.1f", tables.Table.ColumnFormat.RIGHT_JUSTIFY),
</span><span class="lines">@@ -235,7 +235,7 @@
</span><span class="cx"> )
</span><span class="cx"> max_column = 5
</span><span class="cx"> table.setDefaultColumnFormats(
</span><del>- (
</del><ins>+ (
</ins><span class="cx"> tables.Table.ColumnFormat("%s", tables.Table.ColumnFormat.LEFT_JUSTIFY),
</span><span class="cx"> tables.Table.ColumnFormat("%d", tables.Table.ColumnFormat.RIGHT_JUSTIFY),
</span><span class="cx"> tables.Table.ColumnFormat("%.1f", tables.Table.ColumnFormat.RIGHT_JUSTIFY),
</span><span class="lines">@@ -295,7 +295,7 @@
</span><span class="cx"> ("", "<10ms", "10ms<->100ms", "100ms<->1s", "1s<->10s", "10s<->30s", "30s<->60s", ">60s", "Over 1s", "Over 10s"),
</span><span class="cx"> )
</span><span class="cx"> table.setDefaultColumnFormats(
</span><del>- (
</del><ins>+ (
</ins><span class="cx"> tables.Table.ColumnFormat("%s", tables.Table.ColumnFormat.LEFT_JUSTIFY),
</span><span class="cx"> tables.Table.ColumnFormat("%d (%.1f%%)", tables.Table.ColumnFormat.RIGHT_JUSTIFY),
</span><span class="cx"> tables.Table.ColumnFormat("%d (%.1f%%)", tables.Table.ColumnFormat.RIGHT_JUSTIFY),
</span><span class="lines">@@ -358,7 +358,7 @@
</span><span class="cx"> ("", "", "", "(ms)", "", ""),
</span><span class="cx"> )
</span><span class="cx"> table.setDefaultColumnFormats(
</span><del>- (
</del><ins>+ (
</ins><span class="cx"> tables.Table.ColumnFormat("%s", tables.Table.ColumnFormat.LEFT_JUSTIFY),
</span><span class="cx"> tables.Table.ColumnFormat("%d", tables.Table.ColumnFormat.RIGHT_JUSTIFY),
</span><span class="cx"> tables.Table.ColumnFormat("%.1f%%", tables.Table.ColumnFormat.RIGHT_JUSTIFY),
</span><span class="lines">@@ -453,7 +453,7 @@
</span><span class="cx"> ("User-Agent", "Total", "Percentage"),
</span><span class="cx"> )
</span><span class="cx"> table.setDefaultColumnFormats(
</span><del>- (
</del><ins>+ (
</ins><span class="cx"> tables.Table.ColumnFormat("%s", tables.Table.ColumnFormat.LEFT_JUSTIFY),
</span><span class="cx"> tables.Table.ColumnFormat("%d", tables.Table.ColumnFormat.RIGHT_JUSTIFY),
</span><span class="cx"> tables.Table.ColumnFormat("%.1f%%", tables.Table.ColumnFormat.RIGHT_JUSTIFY),
</span></span></pre></div>
<a id="CalendarServertrunkcontribtoolsrequest_monitorpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/tools/request_monitor.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/tools/request_monitor.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/tools/request_monitor.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -511,7 +511,7 @@
</span><span class="cx"> ("", "", "per second", "(ms)", "no write(ms)", "(ms)", "Average", "Time", "Time", ""),
</span><span class="cx"> )
</span><span class="cx"> table.setDefaultColumnFormats(
</span><del>- (
</del><ins>+ (
</ins><span class="cx"> tables.Table.ColumnFormat("%s", tables.Table.ColumnFormat.CENTER_JUSTIFY),
</span><span class="cx"> tables.Table.ColumnFormat("%d", tables.Table.ColumnFormat.RIGHT_JUSTIFY),
</span><span class="cx"> tables.Table.ColumnFormat("%.1f", tables.Table.ColumnFormat.RIGHT_JUSTIFY),
</span><span class="lines">@@ -599,7 +599,7 @@
</span><span class="cx"> ("", "<10ms", "10ms<->100ms", "100ms<->1s", "1s<->10s", "10s<->30s", "30s<->60s", ">60s", "Over 1s", "Over 10s"),
</span><span class="cx"> )
</span><span class="cx"> table.setDefaultColumnFormats(
</span><del>- (
</del><ins>+ (
</ins><span class="cx"> tables.Table.ColumnFormat("%s", tables.Table.ColumnFormat.CENTER_JUSTIFY),
</span><span class="cx"> tables.Table.ColumnFormat("%d (%.1f%%)", tables.Table.ColumnFormat.RIGHT_JUSTIFY),
</span><span class="cx"> tables.Table.ColumnFormat("%d (%.1f%%)", tables.Table.ColumnFormat.RIGHT_JUSTIFY),
</span></span></pre></div>
<a id="CalendarServertrunkcontribtoolsstatsanalysispy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/tools/statsanalysis.py (13792 => 13793)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/tools/statsanalysis.py        2014-07-25 18:08:32 UTC (rev 13792)
+++ CalendarServer/trunk/contrib/tools/statsanalysis.py        2014-07-25 19:29:30 UTC (rev 13793)
</span><span class="lines">@@ -29,6 +29,8 @@
</span><span class="cx"> def safeDivision(value, total, factor=1):
</span><span class="cx"> return value * factor / total if total else 0
</span><span class="cx">
</span><ins>+
+
</ins><span class="cx"> def analyze(fpath, title):
</span><span class="cx"> """
</span><span class="cx"> Analyze a readStats data file.
</span><span class="lines">@@ -63,6 +65,7 @@
</span><span class="cx"> print("Read %d data points\n" % (len(dataset[title]),))
</span><span class="cx">
</span><span class="cx">
</span><ins>+
</ins><span class="cx"> def analyzeTableFormat(f, title):
</span><span class="cx"> """
</span><span class="cx"> Analyze a "table" format output file. First line has already been tested.
</span><span class="lines">@@ -78,6 +81,7 @@
</span><span class="cx"> analyzeTableRecord(f, title)
</span><span class="cx">
</span><span class="cx">
</span><ins>+
</ins><span class="cx"> def analyzeTableRecord(liter, title):
</span><span class="cx"> """
</span><span class="cx"> Analyze one entry from the readStats data file.
</span><span class="lines">@@ -101,6 +105,7 @@
</span><span class="cx"> break
</span><span class="cx">
</span><span class="cx">
</span><ins>+
</ins><span class="cx"> def parseOverall(line):
</span><span class="cx"> """
</span><span class="cx"> Parse the "Overall:" stats summary line.
</span><span class="lines">@@ -130,6 +135,7 @@
</span><span class="cx"> return overall
</span><span class="cx">
</span><span class="cx">
</span><ins>+
</ins><span class="cx"> def parseMethods(liter):
</span><span class="cx"> """
</span><span class="cx"> Parse the "Method Count" table from a data file entry.
</span><span class="lines">@@ -160,6 +166,7 @@
</span><span class="cx"> return methods
</span><span class="cx">
</span><span class="cx">
</span><ins>+
</ins><span class="cx"> def analyzeJSONFormat(f, first, title):
</span><span class="cx"> """
</span><span class="cx"> Analyze a JSON format output file. First line has already been tested.
</span><span class="lines">@@ -175,10 +182,11 @@
</span><span class="cx"> analyzeJSONRecord(line, title)
</span><span class="cx">
</span><span class="cx">
</span><ins>+
</ins><span class="cx"> def analyzeJSONRecord(line, title):
</span><span class="cx"> """
</span><span class="cx"> Analyze a JSON record.
</span><del>-
</del><ins>+
</ins><span class="cx"> @param line: line of JSON data to parse
</span><span class="cx"> @type line: L{str}
</span><span class="cx"> @param title: title to use for data set
</span><span class="lines">@@ -197,6 +205,7 @@
</span><span class="cx"> analyzeJSONStatsMethods(allstats, title, seconds)
</span><span class="cx">
</span><span class="cx">
</span><ins>+
</ins><span class="cx"> def analyzeJSONStatsSummary(allstats, title, seconds):
</span><span class="cx"> """
</span><span class="cx"> Analyze all server JSON summary stats.
</span><span class="lines">@@ -233,6 +242,7 @@
</span><span class="cx"> dataset[title][seconds]["Overall:Max. Response"] = max(results["Max. Response"])
</span><span class="cx">
</span><span class="cx">
</span><ins>+
</ins><span class="cx"> def analyzeJSONStatsMethods(allstats, title, seconds):
</span><span class="cx"> """
</span><span class="cx"> Analyze all server JSON method stats.
</span><span class="lines">@@ -268,6 +278,7 @@
</span><span class="cx"> dataset[title][seconds]["Method:{}:Total Resp. %".format(method)] = safeDivision(method_times[method], total_response, 100.0)
</span><span class="cx">
</span><span class="cx">
</span><ins>+
</ins><span class="cx"> def plotSeries(key, ymin=None, ymax=None):
</span><span class="cx"> """
</span><span class="cx"> Plot the chosen dataset key for each scanned data file.
</span><span class="lines">@@ -284,7 +295,7 @@
</span><span class="cx"> for title, data in sorted(dataset.items(), key=lambda x: x[0]):
</span><span class="cx"> titles.append(title)
</span><span class="cx"> x, y = zip(*[(k / 3600.0, v[key]) for k, v in sorted(data.items(), key=lambda x: x[0]) if key in v])
</span><del>-
</del><ins>+
</ins><span class="cx"> plt.plot(x, y)
</span><span class="cx">
</span><span class="cx"> plt.xlabel("Hours")
</span><span class="lines">@@ -306,6 +317,7 @@
</span><span class="cx"> plt.show()
</span><span class="cx">
</span><span class="cx">
</span><ins>+
</ins><span class="cx"> def usage(error_msg=None):
</span><span class="cx"> if error_msg:
</span><span class="cx"> print(error_msg)
</span></span></pre>
</div>
</div>
</body>
</html>