diff --git a/contrib/__init__.py b/contrib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/contrib/buzz/__init__.py b/contrib/buzz/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/contrib/buzz/simple_buzz_wrapper.py b/contrib/buzz/simple_buzz_wrapper.py new file mode 100644 index 0000000..91c0cd0 --- /dev/null +++ b/contrib/buzz/simple_buzz_wrapper.py @@ -0,0 +1,71 @@ +# Copyright (C) 2010 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import buzz_gae_client +import logging + +class SimpleBuzzWrapper(object): + "Simple client that exposes the bare minimum set of common Buzz operations" + + def __init__(self, api_key=None, consumer_key='anonymous', consumer_secret='anonymous', + oauth_token=None, oauth_token_secret=None): + + self.builder = buzz_gae_client.BuzzGaeClient(consumer_key, consumer_secret, api_key=api_key) + if oauth_token and oauth_token_secret: + logging.info('Using api_client with authorisation') + oauth_params_dict = {} + oauth_params_dict['consumer_key'] = consumer_key + oauth_params_dict['consumer_secret'] = consumer_secret + oauth_params_dict['oauth_token'] = oauth_token + oauth_params_dict['oauth_token_secret'] = oauth_token_secret + self.api_client = self.builder.build_api_client(oauth_params=oauth_params_dict) + else: + logging.info('Using api_client that doesn\'t have authorisation') + self.api_client = self.builder.build_api_client() + + def search(self, query, user_token=None, max_results=10): + if query is None or query.strip() is '': + return None + + json = self.api_client.activities().search(q=query, max_results=max_results).execute() + if json.has_key('items'): + return json['items'] + return [] + + def post(self, sender, message_body): + if message_body is None or message_body.strip() is '': + return None + + #TODO(ade) What happens with users who have hidden their email address? + # Maybe we should switch to @me so it won't matter? + user_id = sender.split('@')[0] + + activities = self.api_client.activities() + logging.info('Retrieved activities for: %s' % user_id) + activity = activities.insert(userId=user_id, body={ + 'data' : { + 'title': message_body, + 'object': { + 'content': message_body, + 'type': 'note'} + } + } + ).execute() + url = activity['links']['alternate'][0]['href'] + logging.info('Just created: %s' % url) + return url + + def get_profile(self, user_id='@me'): + user_profile_data = self.api_client.people().get(userId=user_id).execute() + return user_profile_data + diff --git a/contrib_tests/__init__.py b/contrib_tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/contrib_tests/test_simple_buzz_wrapper.py b/contrib_tests/test_simple_buzz_wrapper.py new file mode 100644 index 0000000..6ccb0d9 --- /dev/null +++ b/contrib_tests/test_simple_buzz_wrapper.py @@ -0,0 +1,68 @@ +# Copyright (C) 2010 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from contrib.buzz.simple_buzz_wrapper import SimpleBuzzWrapper +import unittest + +class SimpleBuzzWrapperTest(unittest.TestCase): +# None of these tests make a remote call. We assume the underlying libraries +# and servers are working. + + def test_wrapper_rejects_empty_post(self): + wrapper = SimpleBuzzWrapper() + self.assertEquals(None, wrapper.post('sender@example.org', '')) + + def test_wrapper_rejects_post_containing_only_whitespace(self): + wrapper = SimpleBuzzWrapper() + self.assertEquals(None, wrapper.post('sender@example.org', ' ')) + + def test_wrapper_rejects_none_post(self): + wrapper = SimpleBuzzWrapper() + self.assertEquals(None, wrapper.post('sender@example.org', None)) + + def test_wrapper_rejects_empty_search(self): + wrapper = SimpleBuzzWrapper() + self.assertEquals(None, wrapper.search('')) + + def test_wrapper_rejects_search_containing_only_whitespace(self): + wrapper = SimpleBuzzWrapper() + self.assertEquals(None, wrapper.search(' ')) + + def test_wrapper_rejects_search_with_none(self): + wrapper = SimpleBuzzWrapper() + self.assertEquals(None, wrapper.search(None)) + +class SimpleBuzzWrapperRemoteTest(unittest.TestCase): +# These tests make remote calls + def test_searching_returns_results(self): + wrapper = SimpleBuzzWrapper() + results = wrapper.search('oshineye') + self.assertTrue(results is not None) + + def test_searching_honours_max_results(self): + wrapper = SimpleBuzzWrapper() + max = 5 + results = wrapper.search('oshineye', max_results=max) + self.assertEquals(max, len(results)) + + def test_can_fetch_profile(self): + wrapper = SimpleBuzzWrapper() + profile = wrapper.get_profile('googlebuzz') + self.assertTrue(profile is not None) + + profile = wrapper.get_profile(user_id = 'adewale') + self.assertTrue(profile is not None) + +if __name__ == '__main__': + unittest.main() \ No newline at end of file