Skip to content
This repository was archived by the owner on Aug 7, 2024. It is now read-only.

Commit b431a38

Browse files
committed
Merge pull request #264 from jeremylow/python-v3
Updates Media object with new methods, adds id param, adds tests
2 parents 7457f1e + c63dab4 commit b431a38

2 files changed

Lines changed: 148 additions & 5 deletions

File tree

tests/test_media.py

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
import twitter
2+
import json
3+
import unittest
4+
5+
6+
class MediaTest(unittest.TestCase):
7+
8+
RAW_JSON = '''{"display_url": "pic.twitter.com/lX5LVZO", "expanded_url": "http://twitter.com/fakekurrik/status/244204973972410368/photo/1", "id": 244204973989187584, "id_str": "244204973989187584", "indices": [44,63], "media_url": "http://pbs.twimg.com/media/A2OXIUcCUAAXj9k.png", "media_url_https": "https://pbs.twimg.com/media/A2OXIUcCUAAXj9k.png", "sizes": {"large": {"h": 175, "resize": "fit", "w": 333}, "medium": {"h": 175, "resize": "fit", "w": 333}, "small": {"h": 175, "resize": "fit", "w": 333}, "thumb": {"h": 150, "resize": "crop", "w": 150}}, "type": "photo", "url": "http://t.co/lX5LVZO"}'''
9+
SAMPLE_JSON = '''{"display_url": "pic.twitter.com/lX5LVZO", "expanded_url": "http://twitter.com/fakekurrik/status/244204973972410368/photo/1", "id": 244204973989187584, "media_url": "http://pbs.twimg.com/media/A2OXIUcCUAAXj9k.png", "media_url_https": "https://pbs.twimg.com/media/A2OXIUcCUAAXj9k.png", "type": "photo", "url": "http://t.co/lX5LVZO"}'''
10+
11+
def _GetSampleMedia(self):
12+
return twitter.Media(
13+
id=244204973989187584,
14+
expanded_url='http://twitter.com/fakekurrik/status/244204973972410368/photo/1',
15+
display_url='pic.twitter.com/lX5LVZO',
16+
url='http://t.co/lX5LVZO',
17+
media_url_https='https://pbs.twimg.com/media/A2OXIUcCUAAXj9k.png',
18+
media_url='http://pbs.twimg.com/media/A2OXIUcCUAAXj9k.png',
19+
type='photo')
20+
21+
def testInit(self):
22+
'''Test the twitter.Media constructor'''
23+
media = twitter.Media(
24+
id=244204973989187584,
25+
display_url='pic.twitter.com/7a2z7S8tKL',
26+
expanded_url='http://twitter.com/NASAJPL/status/672830989895254016/photo/1',
27+
url='https://t.co/7a2z7S8tKL',
28+
media_url_https='https://pbs.twimg.com/media/CVZgOC3UEAELUcL.jpg',
29+
media_url='http://pbs.twimg.com/media/CVZgOC3UEAELUcL.jpg',
30+
type='photo')
31+
32+
def testProperties(self):
33+
'''Test all of the twitter.Media properties'''
34+
media = twitter.Media()
35+
36+
media.id = 244204973989187584
37+
media.display_url = 'pic.twitter.com/7a2z7S8tKL'
38+
media.expanded_url = 'http://twitter.com/NASAJPL/status/672830989895254016/photo/1'
39+
media.url = 'https://t.co/7a2z7S8tKL'
40+
media.media_url_https = 'https://pbs.twimg.com/media/CVZgOC3UEAELUcL.jpg'
41+
media.media_url = 'http://pbs.twimg.com/media/CVZgOC3UEAELUcL.jpg'
42+
media.type = 'photo'
43+
44+
self.assertEqual('pic.twitter.com/7a2z7S8tKL', media.display_url)
45+
self.assertEqual(
46+
'http://twitter.com/NASAJPL/status/672830989895254016/photo/1',
47+
media.expanded_url)
48+
self.assertEqual('https://t.co/7a2z7S8tKL', media.url)
49+
self.assertEqual(
50+
'https://pbs.twimg.com/media/CVZgOC3UEAELUcL.jpg',
51+
media.media_url_https)
52+
self.assertEqual(
53+
'http://pbs.twimg.com/media/CVZgOC3UEAELUcL.jpg',
54+
media.media_url)
55+
self.assertEqual('photo', media.type)
56+
57+
def testAsJsonString(self):
58+
'''Test the twitter.User AsJsonString method'''
59+
self.assertEqual(MediaTest.SAMPLE_JSON,
60+
self._GetSampleMedia().AsJsonString())
61+
62+
def testAsDict(self):
63+
'''Test the twitter.Media AsDict method'''
64+
media = self._GetSampleMedia()
65+
data = media.AsDict()
66+
67+
self.assertEqual(
68+
'pic.twitter.com/lX5LVZO',
69+
data['display_url'])
70+
self.assertEqual(
71+
'http://twitter.com/fakekurrik/status/244204973972410368/photo/1',
72+
data['expanded_url'])
73+
self.assertEqual('http://t.co/lX5LVZO', data['url'])
74+
self.assertEqual(
75+
'https://pbs.twimg.com/media/A2OXIUcCUAAXj9k.png',
76+
data['media_url_https'])
77+
self.assertEqual(
78+
'http://pbs.twimg.com/media/A2OXIUcCUAAXj9k.png',
79+
data['media_url'])
80+
81+
self.assertEqual('photo', data['type'])
82+
83+
def testEq(self):
84+
'''Test the twitter.Media __eq__ method'''
85+
media = twitter.Media()
86+
media.id = 244204973989187584
87+
media.display_url = 'pic.twitter.com/lX5LVZO'
88+
media.expanded_url = 'http://twitter.com/fakekurrik/status/244204973972410368/photo/1'
89+
media.url = 'http://t.co/lX5LVZO'
90+
media.media_url_https = 'https://pbs.twimg.com/media/A2OXIUcCUAAXj9k.png'
91+
media.media_url = 'http://pbs.twimg.com/media/A2OXIUcCUAAXj9k.png'
92+
media.type = 'photo'
93+
94+
self.assertEqual(media, self._GetSampleMedia())
95+
96+
def testNewFromJsonDict(self):
97+
'''Test the twitter.Media NewFromJsonDict method'''
98+
data = json.loads(MediaTest.RAW_JSON)
99+
media = twitter.Media.NewFromJsonDict(data)
100+
self.assertEqual(self._GetSampleMedia(), media)

twitter/media.py

Lines changed: 48 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
#!/usr/bin/env python
2+
import json
23

34

45
class Media(object):
6+
57
"""A class representing the Media component of a tweet.
68
79
The Media structure exposes the following properties:
@@ -20,6 +22,7 @@ def __init__(self, **kwargs):
2022
returned in a sequence.
2123
"""
2224
param_defaults = {
25+
'id': None,
2326
'expanded_url': None,
2427
'display_url': None,
2528
'url': None,
@@ -29,9 +32,13 @@ def __init__(self, **kwargs):
2932
'variants': None
3033
}
3134

32-
for (param, default) in param_defaults.iteritems():
35+
for (param, default) in param_defaults.items():
3336
setattr(self, param, kwargs.get(param, default))
3437

38+
@property
39+
def Id(self):
40+
return self.id or None
41+
3542
@property
3643
def Expanded_url(self):
3744
return self.expanded_url or False
@@ -59,9 +66,36 @@ def Variants(self):
5966
def __eq__(self, other):
6067
return other.Media_url == self.Media_url and other.Type == self.Type
6168

69+
def __ne__(self, other):
70+
return not self.__eq__(other)
71+
6272
def __hash__(self):
6373
return hash((self.Media_url, self.Type))
6474

75+
def __str__(self):
76+
"""A string representation of this twitter.Media instance.
77+
78+
The return value is the same as the JSON string representation.
79+
80+
Returns:
81+
A string representation of this twitter.Media instance.
82+
"""
83+
return self.AsJsonString()
84+
85+
def __repr__(self):
86+
"""
87+
A string representation of this twitter.Media instance.
88+
89+
The return value is the ID of status, username and datetime.
90+
91+
Returns:
92+
Media(ID=244204973989187584, type=photo, display_url='pic.twitter.com/lX5LVZO')
93+
"""
94+
return "Media(Id={id}, type={type}, display_url='{url}')".format(
95+
id=self.id,
96+
type=self.type,
97+
url=self.display_url)
98+
6599
def AsDict(self):
66100
"""A dict representation of this twitter.Media instance.
67101
@@ -71,6 +105,8 @@ def AsDict(self):
71105
A dict representing this twitter.Media instance
72106
"""
73107
data = {}
108+
if self.id:
109+
data['id'] = self.id
74110
if self.expanded_url:
75111
data['expanded_url'] = self.expanded_url
76112
if self.display_url:
@@ -87,7 +123,6 @@ def AsDict(self):
87123
data['variants'] = self.variants
88124
return data
89125

90-
91126
@staticmethod
92127
def NewFromJsonDict(data):
93128
"""Create a new instance based on a JSON dict.
@@ -101,11 +136,19 @@ def NewFromJsonDict(data):
101136
if 'video_info' in data:
102137
variants = data['video_info']['variants']
103138

104-
return Media(expanded_url=data.get('expanded_url', None),
139+
return Media(id=data.get('id', None),
140+
expanded_url=data.get('expanded_url', None),
105141
display_url=data.get('display_url', None),
106142
url=data.get('url', None),
107143
media_url_https=data.get('media_url_https', None),
108144
media_url=data.get('media_url', None),
109145
type=data.get('type', None),
110-
variants=variants
111-
)
146+
variants=variants)
147+
148+
def AsJsonString(self):
149+
"""A JSON string representation of this twitter.Media instance.
150+
151+
Returns:
152+
A JSON string representation of this twitter.Media instance
153+
"""
154+
return json.dumps(self.AsDict(), sort_keys=True)

0 commit comments

Comments
 (0)