+class VerboseStatusFormatter(object):
+ def __call__(self, status):
+ return (u"-- %s (%s) on %s\n%s\n" %(
+ status['user']['screen_name'],
+ status['user']['location'],
+ status['created_at'],
+ status['text']))
+
+class URLStatusFormatter(object):
+ urlmatch = re.compile(r'https?://\S+')
+ def __call__(self, status):
+ urls = self.urlmatch.findall(status['text'])
+ return u'\n'.join(urls) if urls else ""
+
+formatters = {
+ 'default': StatusFormatter,
+ 'verbose': VerboseStatusFormatter,
+ 'urls': URLStatusFormatter
+}
+
+def get_status_formatter(options):
+ sf = formatters.get(options['format'])
+ if (not sf):
+ raise TwitterError(
+ "Unknown formatter '%s'" %(options['format']))
+ return sf()
+
+class Action(object):
+ pass
+
+class NoSuchAction(Action):
+ def __call__(self, twitter, options):
+ print >> sys.stderr, "No such action: ", options['action']
+ sys.exit(1)
+
+class StatusAction(Action):
+ def __call__(self, twitter, options):
+ statuses = self.getStatuses(twitter)
+ sf = get_status_formatter(options)
+ for status in statuses:
+ statusStr = sf(status)
+ if statusStr.strip():
+ print statusStr.encode(sys.stdout.encoding, 'replace')
+
+class FriendsAction(StatusAction):
+ def getStatuses(self, twitter):
+ return reversed(twitter.statuses.friends_timeline())