diff --git a/embedly/models.py b/embedly/models.py index 008bd43..0898679 100644 --- a/embedly/models.py +++ b/embedly/models.py @@ -1,65 +1,16 @@ -""" -Models - -Creates a sudo model class that makes it easy to access attributes -""" from __future__ import unicode_literals -class AttrDict(object): - """ - UserDict is a pain in the ass. Let's just make our own. - """ - def __init__(self, data=None): - if data is None: - data = {} - - for key, value in data.items(): - if isinstance(value, dict): - data[key] = AttrDict(value) - elif isinstance(value, list): - values = [] - for v in value: - if isinstance(v, dict): - values.append(AttrDict(v)) - else: - values.append(v) - data[key] = values - - self.data = data - - def __getattr__(self, name): - if name in ['data', 'method']: - return object.__getattr__(self, name) - try: - return self.data[name] - except KeyError as e: - return None +from UserDict import IterableUserDict - def __setattr__(self, name, value): - if name in ['data', 'method']: - object.__setattr__(self, name, value) - else: - self.data[name] = value - def __getitem__(self, name): return self.data[name] - def __setitem__(self, name, value): self.data[name] = value - def __delitem__(self, name): del self.data[name] - def __len__(self): return len(self.data) - def get(self, name): return self.data.get(name) - def keys(self): return self.data.keys() - def values(self): return self.data.values() - def items(self): return self.data.items() - - @property - def dict(self): - return self.data - - -class Url(AttrDict): +class Url(IterableUserDict, object): + """ + A dictionary with two additional attributes for the method and url. + UserDict provides a dictionary interface along with the regular + dictionary accsesible via the `data` attribute. - def __init__(self, data=None, method=None, original_url=None): - if data is None: - data = {} - super(Url, self).__init__(data) + """ + def __init__(self, data=None, method=None, original_url=None, **kwargs): + super(Url, self).__init__(data, **kwargs) self.method = method or 'url' self.original_url = original_url diff --git a/embedly/tests.py b/embedly/tests.py index 0d74045..7aabd28 100644 --- a/embedly/tests.py +++ b/embedly/tests.py @@ -1,5 +1,6 @@ from __future__ import unicode_literals import unittest +import json from embedly.client import Embedly from embedly.models import Url @@ -41,98 +42,100 @@ def test_model(self): 'embeds': [] } - obj = Url(data, 'preview', 'http://google.com/') + obj = Url(data, 'preview', 'http://original.url.com/') self.assertTrue(len(obj) is 17) self.assertTrue(len(obj.values()) is 17) self.assertTrue(len(obj.keys()) is 17) self.assertTrue(len(obj.items()) is 17) + # check for expected data self.assertTrue('type' in obj.keys()) self.assertTrue('html' in obj.values()) - - #Get the object - self.assertTrue(obj.type == 'html') - self.assertTrue(obj['type'] == 'html') - self.assertTrue(obj.get('type') == 'html') - - #nope - self.assertTrue(obj.nothing is None) - - obj.nothing = 'something' - self.assertTrue(obj.nothing == 'something') - - obj['nothing'] = 'maybe' - self.assertTrue(obj['nothing'] == 'maybe') - - del obj['nothing'] - self.assertTrue(obj.nothing is None) - - #Deep Get attrs - self.assertTrue(obj.images[0].width is 275) - self.assertTrue(obj.images[0].nothing is None) - self.assertTrue(obj.object.type is None) + self.assertEqual(obj['type'], 'html') + self.assertEqual(obj.get('type'), 'html') + self.assertEqual(obj.data['type'], 'html') + self.assertEqual(obj.data.get('type'), 'html') + + # our special attrs shouldn't be in the data dict + self.assertFalse('method' in obj.keys()) + with self.assertRaises(KeyError): + obj['method'] + + # attrs and data dict values should be separate + self.assertEqual(obj['original_url'], 'http://google.com/') + self.assertEqual(obj.original_url, 'http://original.url.com/') + + obj.new_attr = 'attr value' + obj['new_key'] = 'dict value' + self.assertEqual(obj.new_attr, 'attr value') + self.assertEqual(obj['new_key'], 'dict value') + + def test_model_data_can_serialize(self): + obj = Url({'a': {'key': 'value'}}) + unserialzed = json.loads(json.dumps(obj.data)) + self.assertDictEqual(obj.data, unserialzed) def test_provider(self): http = Embedly(self.key) obj = http.oembed('http://www.scribd.com/doc/13994900/Easter') - self.assertTrue(obj.provider_url == 'http://www.scribd.com/') + self.assertEqual(obj['provider_url'], 'http://www.scribd.com/') obj = http.oembed('http://www.scribd.com/doc/28452730/Easter-Cards') - self.assertTrue(obj.provider_url == 'http://www.scribd.com/') + self.assertEqual(obj['provider_url'], 'http://www.scribd.com/') obj = http.oembed('http://www.youtube.com/watch?v=Zk7dDekYej0') - self.assertTrue(obj.provider_url == 'http://www.youtube.com/') + self.assertEqual(obj['provider_url'], 'http://www.youtube.com/') obj = http.oembed('http://yfrog.com/h22eu4j') - self.assertTrue(obj.provider_url == 'http://yfrog.com') + self.assertEqual(obj['provider_url'], 'http://yfrog.com') def test_providers(self): http = Embedly(self.key) objs = list(http.oembed(['http://www.scribd.com/doc/13994900/Easter', 'http://www.scribd.com/doc/28452730/Easter-Cards'])) - self.assertTrue(objs[0].provider_url == 'http://www.scribd.com/') - self.assertTrue(objs[1].provider_url == 'http://www.scribd.com/') + self.assertEqual(objs[0]['provider_url'], 'http://www.scribd.com/') + self.assertEqual(objs[1]['provider_url'], 'http://www.scribd.com/') objs = list(http.oembed(['http://www.youtube.com/watch?v=Zk7dDekYej0', 'http://yfrog.com/h22eu4'])) - self.assertTrue(objs[0].provider_url == 'http://www.youtube.com/') - self.assertTrue(objs[1].provider_url == 'http://yfrog.com') + self.assertEqual(objs[0]['provider_url'], 'http://www.youtube.com/') + self.assertEqual(objs[1]['provider_url'], 'http://yfrog.com') def test_error(self): http = Embedly(self.key) obj = http.oembed('http://www.embedly.com/this/is/a/bad/url') - self.assertTrue(obj.error is True, obj.dict) + self.assertTrue(obj['error']) obj = http.oembed('http://blog.embed.ly/lsbsdlfldsf/asdfkljlas/klajsdlfkasdf') - self.assertTrue(obj.error is True, obj.dict) + self.assertTrue(obj['error']) obj = http.oembed('http://twitpic/nothing/to/see/here') - self.assertTrue(obj.error is True, obj.dict) + self.assertTrue(obj['error']) def test_multi_errors(self): http = Embedly(self.key) objs = list(http.oembed(['http://www.embedly.com/this/is/a/bad/url', 'http://blog.embed.ly/alsd/slsdlf/asdlfj'])) - self.assertTrue(objs[0].type == 'error', objs[0].dict) - self.assertTrue(objs[1].type == 'error', objs[1].dict) + self.assertEqual(objs[0]['type'], 'error') + self.assertEqual(objs[1]['type'], 'error') objs = list(http.oembed(['http://blog.embed.ly/lsbsdlfldsf/asdf/kl', 'http://twitpic.com/nothing/to/see/here'])) - self.assertTrue(objs[0].type == 'error',objs[0].dict) - self.assertTrue(objs[1].type == 'error',objs[1].dict) + self.assertEqual(objs[0]['type'], 'error') + self.assertEqual(objs[1]['type'], 'error') objs = list(http.oembed(['http://blog.embed.ly/lsbsdlfldsf/asdf/kl', 'http://yfrog.com/h22eu4j'])) - self.assertTrue(objs[0].type == 'error',objs[0].dict) - self.assertTrue(objs[1].type == 'photo',objs[1].dict) + self.assertEqual(objs[0]['type'], 'error') + self.assertEqual(objs[1]['type'], 'photo') objs = list(http.oembed(['http://yfrog.com/h22eu4j', 'http://www.scribd.com/asdf/asdf/asdfasdf'])) - self.assertTrue(objs[0].type == 'photo',objs[0].dict) - self.assertTrue(objs[1].type == 'error',objs[1].dict) + self.assertEqual(objs[0]['type'], 'photo') + self.assertEqual(objs[1]['type'], 'error') def test_too_many_urls(self): http = Embedly(self.key) @@ -146,4 +149,4 @@ def test_too_many_urls(self): if __name__ == '__main__': - unittest.main() \ No newline at end of file + unittest.main()