Merge lp:~eday/burrow/cleanup into lp:burrow

Proposed by Eric Day
Status: Merged
Approved by: Eric Day
Approved revision: 11
Merged at revision: 11
Proposed branch: lp:~eday/burrow/cleanup
Merge into: lp:burrow
Diff against target: 637 lines (+207/-111)
9 files modified
.bzrignore (+2/-0)
burrow/__init__.py (+1/-1)
burrow/backend/http.py (+14/-13)
burrow/client.py (+61/-0)
burrow/frontend/wsgi.py (+2/-4)
burrow/shell.py (+58/-22)
doc/source/index.rst (+1/-1)
doc/source/misc.rst (+6/-6)
test/frontend/test_wsgi.py (+62/-64)
To merge this branch: bzr merge lp:~eday/burrow/cleanup
Reviewer Review Type Date Requested Status
Burrow Core Team Pending
Review via email: mp+58552@code.launchpad.net

Description of the change

Added client API interfaces (Account and Queue), modified HTTP response formatting, misc doc/code cleanup.

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file '.bzrignore'
2--- .bzrignore 2011-04-20 05:14:30 +0000
3+++ .bzrignore 2011-04-20 18:31:01 +0000
4@@ -1,4 +1,6 @@
5+.coverage
6 burrow.egg-info
7 ChangeLog
8+coverage
9 dist
10 doc/build/*
11
12=== modified file 'burrow/__init__.py'
13--- burrow/__init__.py 2011-04-20 05:14:30 +0000
14+++ burrow/__init__.py 2011-04-20 18:31:01 +0000
15@@ -17,7 +17,7 @@
16
17 import gettext
18
19-from burrow.client import Client
20+from burrow.client import Client, Account, Queue
21 from burrow.server import Server
22
23 __version__ = '2011.2'
24
25=== modified file 'burrow/backend/http.py'
26--- burrow/backend/http.py 2011-04-18 20:07:11 +0000
27+++ burrow/backend/http.py 2011-04-20 18:31:01 +0000
28@@ -15,6 +15,7 @@
29 '''HTTP backend for burrow using httplib.'''
30
31 import httplib
32+import json
33
34 import burrow.backend
35
36@@ -29,52 +30,52 @@
37
38 def delete_accounts(self, filters={}):
39 url = self._add_parameters('', filters=filters)
40- self._request('DELETE', url)
41+ return self._request('DELETE', url)
42
43 def get_accounts(self, filters={}):
44 url = self._add_parameters('', filters=filters)
45- self._request('GET', url)
46+ return self._request('GET', url)
47
48 def delete_queues(self, account, filters={}):
49 url = self._add_parameters('/%s' % account, filters=filters)
50- self._request('DELETE', url)
51+ return self._request('DELETE', url)
52
53 def get_queues(self, account, filters={}):
54 url = self._add_parameters('/%s' % account, filters=filters)
55- self._request('GET', url)
56+ return self._request('GET', url)
57
58 def delete_messages(self, account, queue, filters={}):
59 url = '/%s/%s' % (account, queue)
60 url = self._add_parameters(url, filters=filters)
61- self._request('DELETE', url)
62+ return self._request('DELETE', url)
63
64 def get_messages(self, account, queue, filters={}):
65 url = '/%s/%s' % (account, queue)
66 url = self._add_parameters(url, filters=filters)
67- self._request('GET', url)
68+ return self._request('GET', url)
69
70 def update_messages(self, account, queue, attributes={}, filters={}):
71 url = '/%s/%s' % (account, queue)
72 url = self._add_parameters(url, attributes, filters)
73- self._request('POST', url)
74+ return self._request('POST', url)
75
76 def create_message(self, account, queue, message, body, attributes={}):
77 url = '/%s/%s/%s' % (account, queue, message)
78 url = self._add_parameters(url, attributes)
79- self._request('PUT', url, body=body)
80+ return self._request('PUT', url, body=body)
81
82 def delete_message(self, account, queue, message):
83 url = '/%s/%s/%s' % (account, queue, message)
84- self._request('DELETE', url)
85+ return self._request('DELETE', url)
86
87 def get_message(self, account, queue, message):
88 url = '/%s/%s/%s' % (account, queue, message)
89- self._request('GET', url)
90+ return self._request('GET', url)
91
92 def update_message(self, account, queue, message, attributes={}):
93 url = '/%s/%s/%s' % (account, queue, message)
94 url = self._add_parameters(url, attributes)
95- self._request('POST', url)
96+ return self._request('POST', url)
97
98 def clean(self):
99 pass
100@@ -98,6 +99,6 @@
101 connection.request(method, '/v1.0' + url, *args, **kwargs)
102 response = connection.getresponse()
103 if response.status == 200:
104- print response.read()
105+ return json.loads(response.read())
106 if response.status >= 400:
107- print response.reason
108+ raise Exception(response.reason)
109
110=== modified file 'burrow/client.py'
111--- burrow/client.py 2011-04-20 05:14:30 +0000
112+++ burrow/client.py 2011-04-20 18:31:01 +0000
113@@ -43,3 +43,64 @@
114 backend = self.config.get('backend', DEFAULT_BACKEND)
115 config = (self._config, backend)
116 return burrow.common.import_class(backend, 'Backend')(config)
117+
118+ def __getattr__(self, name):
119+ return getattr(self.backend, name)
120+
121+
122+class Account(object):
123+ '''Convenience wrapper around the Client class that saves the
124+ account setting. This allows you to use methods without specifying
125+ the 'account' parameter every time.'''
126+
127+ account_methods = [
128+ 'delete_queues',
129+ 'get_queues',
130+ 'delete_messages',
131+ 'get_messages',
132+ 'update_messages',
133+ 'create_message',
134+ 'delete_message',
135+ 'get_message',
136+ 'update_message']
137+
138+ def __init__(self, account, client=None, **kwargs):
139+ self.account = account
140+ if client is None:
141+ self.client = Client(**kwargs)
142+ else:
143+ self.client = client
144+
145+ def __getattr__(self, name):
146+ '''If the requested method is an account method, return a
147+ wrapper with the given account parameters.'''
148+ if name not in self.account_methods:
149+ return getattr(self.client, name)
150+
151+ def function(*args, **kwargs):
152+ '''Call the client method with the account.'''
153+ return getattr(self.client, name)(self.account, *args, **kwargs)
154+ return function
155+
156+
157+class Queue(Account):
158+ '''Convenience wrapper around the Client class that saves the
159+ account and queue setting. This allows you to use methods without
160+ specifying the 'account' and 'queue' parameter every time.'''
161+
162+ def __init__(self, account, queue, **kwargs):
163+ super(Queue, self).__init__(account, **kwargs)
164+ self.queue = queue
165+ self.queue_methods = self.account_methods[2:]
166+
167+ def __getattr__(self, name):
168+ '''If the requested method is a queue method, return a wrapper
169+ with the given account and queue parameters.'''
170+ if name not in self.queue_methods:
171+ return super(Queue, self).__getattr__(name)
172+
173+ def function(*args, **kwargs):
174+ '''Call the client method with the account and queue.'''
175+ return getattr(self.client, name)(self.account, self.queue, *args,
176+ **kwargs)
177+ return function
178
179=== modified file 'burrow/frontend/wsgi.py'
180--- burrow/frontend/wsgi.py 2011-04-20 05:14:30 +0000
181+++ burrow/frontend/wsgi.py 2011-04-20 18:31:01 +0000
182@@ -226,8 +226,7 @@
183 detail = req.params['detail']
184 message = self._filter_message(detail, message)
185 if message is not None:
186- body = {account: {queue: [message]}}
187- return webob.exc.HTTPOk(body=json.dumps(body, indent=2))
188+ return webob.exc.HTTPOk(body=json.dumps(message, indent=2))
189 return webob.exc.HTTPNoContent()
190
191 def _return_messages(self, req, account, queue, messages, detail):
192@@ -242,8 +241,7 @@
193 filtered_messages.append(message)
194 if len(filtered_messages) == 0:
195 return webob.exc.HTTPNoContent()
196- body = {account: {queue: filtered_messages}}
197- return webob.exc.HTTPOk(body=json.dumps(body, indent=2))
198+ return webob.exc.HTTPOk(body=json.dumps(filtered_messages, indent=2))
199
200 def _parse_filters(self, req):
201 filters = {}
202
203=== modified file 'burrow/shell.py'
204--- burrow/shell.py 2011-04-20 05:14:30 +0000
205+++ burrow/shell.py 2011-04-20 18:31:01 +0000
206@@ -100,6 +100,7 @@
207 (self.options, self.args) = self.parser.parse_args()
208 if self.options.commands:
209 self.print_help()
210+ sys.exit(1)
211 if self.options.files is None:
212 files = []
213 else:
214@@ -136,6 +137,9 @@
215 command = command.split()
216 if len(command) == 0:
217 continue
218+ if command[0] == 'help':
219+ self.print_help(print_options_help=False)
220+ continue
221 if command[0] == 'exit' or command[0] == 'quit':
222 break
223 yield command
224@@ -147,29 +151,24 @@
225 print _('Command not found: %s') % command
226 return
227 if len(args) != len(section['args']):
228- print _('Wrong number of arguments')
229+ for arg in section['args']:
230+ command += ' <%s>' % arg
231+ print _('Wrong number of arguments: %s') % command
232 return
233 if section.get('account', None):
234 args.insert(0, self.options.account)
235 if command in self.stdin_commands:
236 args.append(sys.stdin.read())
237 if command in self.attribute_commands:
238- attributes = {}
239- if self.options.ttl is not None:
240- attributes['ttl'] = self.options.ttl
241- if self.options.hide is not None:
242- attributes['hide'] = self.options.hide
243- args.append(attributes)
244+ args.append(self._pack_attributes())
245 if section.get('filters', None):
246- filters = {}
247- if self.options.limit is not None:
248- filters['limit'] = self.options.limit
249- if self.options.marker is not None:
250- filters['marker'] = self.options.marker
251- if self.options.all is not None:
252- filters['match_hidden'] = self.options.all
253- args.append(filters)
254- getattr(self.client.backend, command)(*args)
255+ args.append(self._pack_filters())
256+ try:
257+ result = getattr(self.client, command)(*args)
258+ except Exception, exception:
259+ print exception
260+ return
261+ self._print_result(result)
262
263 def _get_section(self, command):
264 '''Lookup command in the defined command sections.'''
265@@ -178,13 +177,51 @@
266 return section
267 return None
268
269- def print_help(self, message=None):
270+ def _pack_attributes(self):
271+ '''Pack attributes given in command line options.'''
272+ attributes = {}
273+ if self.options.ttl is not None:
274+ attributes['ttl'] = self.options.ttl
275+ if self.options.hide is not None:
276+ attributes['hide'] = self.options.hide
277+ return attributes
278+
279+ def _pack_filters(self):
280+ '''Pack filters given in command line options.'''
281+ filters = {}
282+ if self.options.limit is not None:
283+ filters['limit'] = self.options.limit
284+ if self.options.marker is not None:
285+ filters['marker'] = self.options.marker
286+ if self.options.all is not None:
287+ filters['match_hidden'] = self.options.all
288+ return filters
289+
290+ def _print_result(self, result):
291+ '''Format and print the result.'''
292+ if isinstance(result, list):
293+ for item in result:
294+ if isinstance(item, dict):
295+ self._print_message(item)
296+ else:
297+ print item
298+ elif isinstance(result, dict):
299+ self._print_message(result)
300+ elif result is not None:
301+ print result
302+
303+ def _print_message(self, item):
304+ '''Format and print message.'''
305+ print 'id =', item['id']
306+ for key, value in item.iteritems():
307+ if key != 'id':
308+ print ' ', key, '=', value
309+
310+ def print_help(self, print_options_help=True):
311 '''Print the parser generated help along with burrow command help.'''
312- if message:
313- print message
314+ if print_options_help:
315+ self.parser.print_help()
316 print
317- self.parser.print_help()
318- print
319 for section in self.sections:
320 print '%s commands:' % section['name']
321 for command in section['commands']:
322@@ -197,7 +234,6 @@
323 help_string += ' <%s>' % arg
324 print ' %s%s' % (command, help_string)
325 print
326- sys.exit(1)
327
328
329 if __name__ == '__main__':
330
331=== modified file 'doc/source/index.rst'
332--- doc/source/index.rst 2011-04-18 20:07:11 +0000
333+++ doc/source/index.rst 2011-04-20 18:31:01 +0000
334@@ -61,6 +61,6 @@
335 server
336 frontends
337 backends
338- common
339+ misc
340
341 * :ref:`modindex`
342
343=== renamed file 'doc/source/common.rst' => 'doc/source/misc.rst'
344--- doc/source/common.rst 2011-04-08 02:31:30 +0000
345+++ doc/source/misc.rst 2011-04-20 18:31:01 +0000
346@@ -13,13 +13,13 @@
347 See the License for the specific language governing permissions and
348 limitations under the License.
349
350+Miscellaneous
351+*************
352+
353 Common
354-******
355-
356-Core
357-====
358-
359-.. automodule:: burrow
360+======
361+
362+.. automodule:: burrow.common
363 :members:
364 :undoc-members:
365 :show-inheritance:
366
367=== modified file 'test/frontend/test_wsgi.py'
368--- test/frontend/test_wsgi.py 2011-04-18 20:07:11 +0000
369+++ test/frontend/test_wsgi.py 2011-04-20 18:31:01 +0000
370@@ -45,30 +45,30 @@
371
372 def test_account(self):
373 self._put_url('/a/q/1')
374- accounts = self._get_url('')
375- self.assertEquals(accounts, ['a'])
376+ result = self._get_url('')
377+ self.assertEquals(result, ['a'])
378 self._delete_url('/a')
379
380 def test_queue(self):
381 self._put_url('/a/q/1')
382- accounts = self._get_url('/a')
383- self.assertEquals(accounts, ['q'])
384+ result = self._get_url('/a')
385+ self.assertEquals(result, ['q'])
386 self._delete_url('/a/q')
387
388 def test_message(self):
389 self._put_url('/a/q/1', body='b')
390- accounts = self._get_url('/a/q')
391- self.assertMessages(accounts, 'a', 'q', [self.message('1', body='b')])
392+ result = self._get_url('/a/q')
393+ self.assertMessages(result, [self.message('1', body='b')])
394 self._delete_url('/a/q/1')
395
396 def test_message_post(self):
397 self._put_url('/a/q/1', body='b')
398 for x in range(0, 3):
399- accounts = self._post_url('/a/q/1?ttl=%d&hide=%d' % (x, x))
400- self.assertEquals(accounts, {'a': {'q': [{'id': '1'}]}})
401- accounts = self._get_url('/a/q?hidden=true')
402+ result = self._post_url('/a/q/1?ttl=%d&hide=%d' % (x, x))
403+ self.assertEquals(result, {'id': '1'})
404+ result = self._get_url('/a/q?hidden=true')
405 message = self.message('1', x, x, body='b')
406- self.assertMessages(accounts, 'a', 'q', [message])
407+ self.assertMessages(result, [message])
408 self._delete_url('/a/q/1')
409
410 def test_message_put(self):
411@@ -76,151 +76,151 @@
412 url = '/a/q/1?ttl=%d&hide=%d' % (x, x)
413 status = 201 if x == 0 else 204
414 self._put_url(url, body=str(x), status=status)
415- accounts = self._get_url('/a/q?hidden=true')
416+ result = self._get_url('/a/q?hidden=true')
417 message = self.message('1', x, x, body=str(x))
418- self.assertMessages(accounts, 'a', 'q', [message])
419+ self.assertMessages(result, [message])
420 self._delete_url('/a/q/1')
421
422 def test_message_delete_limit(self):
423 [self._put_url('/a/q/%d' % x) for x in range(1, 5)]
424- accounts = self._delete_url('/a/q?limit=3&detail=all', status=200)
425+ result = self._delete_url('/a/q?limit=3&detail=all', status=200)
426 messages = []
427 messages.append(self.message('1'))
428 messages.append(self.message('2'))
429 messages.append(self.message('3'))
430- self.assertMessages(accounts, 'a', 'q', messages)
431- accounts = self._delete_url('/a/q?limit=3&detail=all', status=200)
432+ self.assertMessages(result, messages)
433+ result = self._delete_url('/a/q?limit=3&detail=all', status=200)
434 message = self.message('4')
435- self.assertMessages(accounts, 'a', 'q', [message])
436+ self.assertMessages(result, [message])
437
438 def test_message_get_limit(self):
439 [self._put_url('/a/q/%d' % x) for x in range(1, 5)]
440 for x in range(0, 4):
441- accounts = self._get_url('/a/q?limit=3')
442+ result = self._get_url('/a/q?limit=3')
443 messages = []
444 for y in range(x, 4)[:3]:
445 messages.append(self.message(str(y + 1)))
446- self.assertMessages(accounts, 'a', 'q', messages)
447+ self.assertMessages(result, messages)
448 self._delete_url('/a/q/%d' % (x + 1))
449
450 def test_message_post_limit(self):
451 [self._put_url('/a/q/%d' % x) for x in range(1, 5)]
452 for x in range(0, 4):
453- accounts = self._post_url('/a/q?limit=3&ttl=%d&detail=all' % x)
454+ result = self._post_url('/a/q?limit=3&ttl=%d&detail=all' % x)
455 messages = []
456 for y in range(x, 4)[:3]:
457 messages.append(self.message(str(y + 1), x))
458- self.assertMessages(accounts, 'a', 'q', messages)
459+ self.assertMessages(result, messages)
460 self._delete_url('/a/q/%d' % (x + 1))
461
462 def test_message_delete_marker(self):
463 [self._put_url('/a/q/%d' % x) for x in range(1, 5)]
464- accounts = self._delete_url('/a/q?marker=2&detail=all', status=200)
465+ result = self._delete_url('/a/q?marker=2&detail=all', status=200)
466 messages = []
467 messages.append(self.message('3'))
468 messages.append(self.message('4'))
469- self.assertMessages(accounts, 'a', 'q', messages)
470- accounts = self._delete_url('/a/q?marker=5&detail=all', status=200)
471+ self.assertMessages(result, messages)
472+ result = self._delete_url('/a/q?marker=5&detail=all', status=200)
473 messages = []
474 messages.append(self.message('1'))
475 messages.append(self.message('2'))
476- self.assertMessages(accounts, 'a', 'q', messages)
477+ self.assertMessages(result, messages)
478
479 def test_message_get_marker(self):
480 [self._put_url('/a/q/%d' % x) for x in range(1, 5)]
481 for x in range(0, 4):
482- accounts = self._get_url('/a/q?marker=%d' % x)
483+ result = self._get_url('/a/q?marker=%d' % x)
484 messages = []
485 for y in range(x, 4):
486 messages.append(self.message(str(y + 1)))
487- self.assertMessages(accounts, 'a', 'q', messages)
488+ self.assertMessages(result, messages)
489 self._delete_url('/a/q/%d' % (x + 1))
490
491 def test_message_post_marker(self):
492 [self._put_url('/a/q/%d' % x) for x in range(1, 5)]
493 for x in range(0, 4):
494 url = '/a/q?marker=%d&ttl=%d&detail=all' % (x, x)
495- accounts = self._post_url(url)
496+ result = self._post_url(url)
497 messages = []
498 for y in range(x, 4):
499 messages.append(self.message(str(y + 1), x))
500- self.assertMessages(accounts, 'a', 'q', messages)
501+ self.assertMessages(result, messages)
502 self._delete_url('/a/q/%d' % (x + 1))
503
504 def test_message_delete_limit_marker(self):
505 [self._put_url('/a/q/%d' % x) for x in range(1, 5)]
506 url = '/a/q?limit=2&marker=1&detail=all'
507- accounts = self._delete_url(url, status=200)
508+ result = self._delete_url(url, status=200)
509 messages = []
510 messages.append(self.message('2'))
511 messages.append(self.message('3'))
512- self.assertMessages(accounts, 'a', 'q', messages)
513+ self.assertMessages(result, messages)
514 url = '/a/q?limit=2&marker=5&detail=all'
515- accounts = self._delete_url(url, status=200)
516+ result = self._delete_url(url, status=200)
517 messages = []
518 messages.append(self.message('1'))
519 messages.append(self.message('4'))
520- self.assertMessages(accounts, 'a', 'q', messages)
521+ self.assertMessages(result, messages)
522
523 def test_message_get_limit_marker(self):
524 [self._put_url('/a/q/%d' % x) for x in range(1, 5)]
525 for x in range(0, 4):
526- accounts = self._get_url('/a/q?limit=2&marker=%d' % x)
527+ result = self._get_url('/a/q?limit=2&marker=%d' % x)
528 messages = []
529 for y in range(x, 4)[:2]:
530 messages.append(self.message(str(y + 1)))
531- self.assertMessages(accounts, 'a', 'q', messages)
532+ self.assertMessages(result, messages)
533 self._delete_url('/a/q/%d' % (x + 1))
534
535 def test_message_post_limit_marker(self):
536 [self._put_url('/a/q/%d' % x) for x in range(1, 5)]
537 for x in range(0, 4):
538 url = '/a/q?limit=2&marker=%d&ttl=%d&detail=all' % (x, x)
539- accounts = self._post_url(url)
540+ result = self._post_url(url)
541 messages = []
542 for y in range(x, 4)[:2]:
543 messages.append(self.message(str(y + 1), x))
544- self.assertMessages(accounts, 'a', 'q', messages)
545+ self.assertMessages(result, messages)
546 self._delete_url('/a/q/%d' % (x + 1))
547
548 def test_message_ttl(self):
549 self._put_url('/a/q/1?ttl=1')
550- accounts = self._get_url('/a/q/1')
551+ result = self._get_url('/a/q/1')
552 message = self.message('1', 1)
553- self.assertMessages(accounts, 'a', 'q', [self.message('1', 1)])
554+ self.assertMessages([result], [self.message('1', 1)])
555 time.sleep(1)
556 self.backend.clean()
557 self._get_url('/a/q/1', status=404)
558 self._put_url('/a/q/1')
559- accounts = self._get_url('/a/q/1')
560- self.assertMessages(accounts, 'a', 'q', [self.message('1')])
561+ result = self._get_url('/a/q/1')
562+ self.assertMessages([result], [self.message('1')])
563 self._post_url('/a/q/1?ttl=1')
564- accounts = self._get_url('/a/q/1')
565- self.assertMessages(accounts, 'a', 'q', [self.message('1', 1)])
566+ result = self._get_url('/a/q/1')
567+ self.assertMessages([result], [self.message('1', 1)])
568 time.sleep(1)
569 self.backend.clean()
570 self._get_url('/a/q/1', status=404)
571
572 def test_message_hide(self):
573 self._put_url('/a/q/1?hide=1')
574- accounts = self._get_url('/a/q/1')
575- self.assertMessages(accounts, 'a', 'q', [self.message('1', hide=1)])
576+ result = self._get_url('/a/q/1')
577+ self.assertMessages([result], [self.message('1', hide=1)])
578 time.sleep(1)
579 self.backend.clean()
580- accounts = self._get_url('/a/q/1')
581- self.assertMessages(accounts, 'a', 'q', [self.message('1')])
582+ result = self._get_url('/a/q/1')
583+ self.assertMessages([result], [self.message('1')])
584 self._post_url('/a/q/1?hide=1')
585- accounts = self._get_url('/a/q/1')
586- self.assertMessages(accounts, 'a', 'q', [self.message('1', hide=1)])
587+ result = self._get_url('/a/q/1')
588+ self.assertMessages([result], [self.message('1', hide=1)])
589 time.sleep(1)
590 self.backend.clean()
591- accounts = self._get_url('/a/q/1')
592- self.assertMessages(accounts, 'a', 'q', [self.message('1')])
593+ result = self._get_url('/a/q/1')
594+ self.assertMessages([result], [self.message('1')])
595 self._delete_url('/a/q/1')
596
597 def _message_wait(self):
598- accounts = self._get_url('/a/q?wait=2')
599- self.assertMessages(accounts, 'a', 'q', [self.message('1')])
600+ result = self._get_url('/a/q?wait=2')
601+ self.assertMessages(result, [self.message('1')])
602 self.success = True
603
604 def test_message_put_wait(self):
605@@ -270,22 +270,20 @@
606 def message(self, id, ttl=0, hide=0, body=''):
607 return dict(id=id, ttl=ttl, hide=hide, body=body)
608
609- def assertMessages(self, accounts, account, queue, messages):
610- self.assertEquals(len(accounts), 1)
611- self.assertEquals(len(accounts['a']), 1)
612- self.assertEquals(len(accounts['a']['q']), len(messages))
613- for x in range(0, len(messages)):
614- self.assertEquals(accounts['a']['q'][x]['id'], messages[x]['id'])
615- ttl = messages[x]['ttl']
616+ def assertMessages(self, first, second):
617+ self.assertEquals(len(first), len(second))
618+ for x in xrange(0, len(second)):
619+ self.assertEquals(first[x]['id'], second[x]['id'])
620+ ttl = second[x]['ttl']
621 if ttl > 0:
622 ttl += int(time.time())
623- self.assertAlmostEquals(accounts['a']['q'][0]['ttl'], ttl)
624- hide = messages[x]['hide']
625+ self.assertAlmostEquals(first[x]['ttl'], ttl)
626+ hide = second[x]['hide']
627 if hide > 0:
628 hide += int(time.time())
629- self.assertAlmostEquals(accounts['a']['q'][0]['hide'], hide)
630- body = messages[x]['body']
631- self.assertEquals(accounts['a']['q'][x]['body'], body)
632+ self.assertAlmostEquals(first[x]['hide'], hide)
633+ body = second[x]['body']
634+ self.assertEquals(first[x]['body'], body)
635
636 def _delete_url(self, url, status=204, **kwargs):
637 return self._url('DELETE', url, status=status, **kwargs)

Subscribers

People subscribed via source and target branches