changeset 68:5c3f592522ea

Added 'rev' property to get response and 'since_rev' queryarg option to get requests
author Atul Varma <avarma@mozilla.com>
date Tue, 29 Jun 2010 21:18:44 -0700
parents 8be999c3d066
children 4b260d4ca1d4
files summitidp/app.py tests/test_app.py
diffstat 2 files changed, 58 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/summitidp/app.py	Tue Jun 29 20:26:18 2010 -0700
+++ b/summitidp/app.py	Tue Jun 29 21:18:44 2010 -0700
@@ -91,19 +91,38 @@
         return self.__tokens[token]['contents']
 
 class ProfileStore(object):
-    def __init__(self, mapping=None):
+    def __init__(self, mapping=None, rev_mapping=None):
         if mapping is None:
             mapping = {}
+        if rev_mapping is None:
+            rev_mapping = {}
+        self.__rev_mapping = rev_mapping
         self.__profiles = mapping
+        all_revs = [self.__rev_mapping[rev]
+                    for rev in self.__rev_mapping]
+        if all_revs:
+            latest_rev = max(all_revs)
+        else:
+            latest_rev = 0
+        self.__latest_rev = latest_rev
 
     def set(self, user_id, contents):
-        self.__profiles[str(user_id)] = contents
+        user_id = str(user_id)
+        self.__profiles[user_id] = contents
+        self.__latest_rev += 1
+        self.__rev_mapping[user_id] = self.__latest_rev
 
-    def get(self):
-        everything = {}
-        for user_id in self.__profiles:
-            everything[user_id] = self.__profiles[user_id]
-        return everything
+    def get(self, since_rev=0):
+        result = {}
+        user_ids = [user_id for user_id in self.__profiles
+                    if self.__rev_mapping.get(user_id, 0) > since_rev]
+        for user_id in user_ids:
+            result[user_id] = self.__profiles[user_id]
+        return result
+
+    @property
+    def rev(self):
+        return self.__latest_rev
 
 class Server(object):
     request_challenge_path = '/challenge/request'
@@ -181,9 +200,17 @@
                         '400 Bad Request',
                         {'error': 'invalid or expired token'}
                         )
-                profile = self.profiles.get()
+                try:
+                    since_rev = int(req.qargs.get('since_rev', 0))
+                except ValueError:
+                    return req.json_response(
+                        '400 Bad Request',
+                        {'error': 'invalid since_rev value'}
+                        )
+                profile = self.profiles.get(since_rev)
                 return req.json_response('200 OK',
-                                         {'contents': profile})
+                                         {'rev': self.profiles.rev,
+                                          'contents': profile})
             elif req.method == 'POST':
                 body = req.get_body()
                 if body and 'token' in body and 'contents' in body:
--- a/tests/test_app.py	Tue Jun 29 20:26:18 2010 -0700
+++ b/tests/test_app.py	Tue Jun 29 21:18:44 2010 -0700
@@ -164,6 +164,15 @@
             status=400)
 
 @apptest
+def test_get_profile_with_invalid_since_rev():
+    token = server.auth_tokens.create(email='bob@foo.com',
+                                      user_id=0)
+    resp = app.get('%s?token=%s&since_rev=foo' %
+                   (server.profile_path, token),
+                   status=400)
+    assert resp.json == {"error": "invalid since_rev value"}
+
+@apptest
 def test_set_and_get_profile():
     token = server.auth_tokens.create(email='bob@foo.com',
                                       user_id=0)
@@ -171,7 +180,8 @@
               {'token': token,
                'contents': {'name': 'bob jones'}})
     resp = app.get('%s?token=%s' % (server.profile_path, token))
-    assert resp.json == {"contents": {"0": {"name": "bob jones"}}}
+    assert resp.json == {"rev": 1,
+                         "contents": {"0": {"name": "bob jones"}}}
 
     # Make sure it works twice.
 
@@ -179,7 +189,8 @@
               {'token': token,
                'contents': {'alias': 'blah'}})
     resp = app.get('%s?token=%s' % (server.profile_path, token))
-    assert resp.json == {"contents": {"0": {"alias": "blah"}}}
+    assert resp.json == {"rev": 2,
+                         "contents": {"0": {"alias": "blah"}}}
 
     # Add another user's profile.
 
@@ -189,5 +200,13 @@
               {'token': token2,
                'contents': {'name': 'jane person'}})
     resp = app.get('%s?token=%s' % (server.profile_path, token2))
-    assert resp.json == {"contents": {"0": {"alias": "blah"},
+    assert resp.json == {"rev": 3,
+                         "contents": {"0": {"alias": "blah"},
                                       "1": {"name": "jane person"}}}
+
+    # Ensure since_rev works.
+
+    resp = app.get('%s?token=%s&since_rev=2' %
+                   (server.profile_path, token2))
+    assert resp.json == {"rev": 3,
+                         "contents": {"1": {"name": "jane person"}}}