Merge branch 'multireddit'

This commit is contained in:
Michael Lazar
2015-03-07 23:05:21 -08:00
3 changed files with 54 additions and 70 deletions

View File

@@ -4,6 +4,7 @@ from contextlib import contextmanager
import praw import praw
import six import six
import requests
from .errors import SubmissionURLError, SubredditNameError from .errors import SubmissionURLError, SubredditNameError
@@ -68,22 +69,6 @@ def humanize_timestamp(utc_timestamp, verbose=False):
years = months // 12 years = months // 12
return ('%d years ago' % years) if verbose else ('%dyr' % years) return ('%d years ago' % years) if verbose else ('%dyr' % years)
def validate_backslashes(name):
"""
Makes sure backslashes in subreddit name work with for_name()
"""
if name[0] == '/':
raise SubredditNameError(name)
if name[-1] == '/':
name = name[:-1]
if name.count('/') > 1:
raise SubredditNameError(name)
return name
@contextmanager @contextmanager
def default_loader(self): def default_loader(self):
yield yield
@@ -318,7 +303,7 @@ class SubredditContent(BaseContent):
list for repeat access. list for repeat access.
""" """
def __init__(self, name, submissions, loader=default_loader): def __init__(self, name, submissions, loader):
self.name = name self.name = name
self._loader = loader self._loader = loader
@@ -326,62 +311,61 @@ class SubredditContent(BaseContent):
self._submission_data = [] self._submission_data = []
@classmethod @classmethod
def from_name(cls, reddit, name, loader=default_loader, display_type = 'hot'): def from_name(cls, reddit, name, loader, order='hot'):
if name == 'new': name = name.strip(' /') # Strip leading and trailing backslashes
return cls('New', reddit.get_new(limit=None), loader) if name.startswith('r/'):
name = name[2:]
if name == 'all': # Grab the display type e.g. "python/new"
sub = reddit.get_subreddit(name) if '/' in name:
name, order = name.split('/')
if order == 'hot':
display_name = '/r/{}'.format(name)
else:
display_name = '/r/{}/{}'.format(name, order)
if name == 'front':
if order == 'hot':
submissions = reddit.get_front_page(limit=None)
elif order == 'top':
submissions = reddit.get_top(limit=None)
elif order == 'rising':
submissions = reddit.get_rising(limit=None)
elif order == 'new':
submissions = reddit.get_new(limit=None)
elif order == 'controversial':
submissions = reddit.get_controversial(limit=None)
else:
raise SubredditNameError(display_name)
else: else:
subreddit = reddit.get_subreddit(name)
if order == 'hot':
submissions = subreddit.get_hot(limit=None)
elif order == 'top':
submissions = subreddit.get_top(limit=None)
elif order == 'rising':
submissions = subreddit.get_rising(limit=None)
elif order == 'new':
submissions = subreddit.get_new(limit=None)
elif order == 'controversial':
submissions = subreddit.get_controversial(limit=None)
else:
raise SubredditNameError(display_name)
name = validate_backslashes(name) # Verify that content exists for the given submission generator.
# This is necessary because PRAW loads submissions lazily, and
if '/' in name: # there is is no other way to check things like multireddits that
name, display_type = name.split('/') # don't have a real corresponding subreddit object.
content = cls(display_name, submissions, loader)
if display_type not in ['new', 'top', 'hot', 'rising', 'controversial']: try:
raise SubredditNameError(name) content.get(0)
except:
if name == 'front': raise SubredditNameError(display_name)
if display_type == 'new':
return cls('New', reddit.get_new(limit=None), loader)
elif display_type == 'top':
return cls('Top', reddit.get_top(limit=None), loader)
elif display_type == 'hot':
return cls('Front Page', reddit.get_front_page(limit=None), loader)
elif display_type == 'rising':
return cls('Rising', reddit.get_rising(limit=None), loader)
elif display_type == 'controversial':
return cls('Controversial', reddit.get_controversial(limit=None), loader)
try:
with loader():
sub = reddit.get_subreddit(name, fetch=True)
except praw.errors.ClientException:
raise SubredditNameError(name)
if display_type == 'new':
return cls('/r/'+sub.display_name+'/new', sub.get_new(limit=None), loader)
elif display_type == 'top':
return cls('/r/'+sub.display_name+'/top', sub.get_top_from_all(limit=None), loader)
elif display_type == 'hot':
return cls('/r/'+sub.display_name, sub.get_hot(limit=None), loader)
elif display_type == 'rising':
return cls('/r/'+sub.display_name+'/rising', sub.get_rising(limit=None), loader)
elif display_type == 'controversial':
return cls('/r/'+sub.display_name+'/controversial', sub.get_controversial(limit=None), loader)
return content
def get(self, index, n_cols=70): def get(self, index, n_cols=70):
""" """

View File

@@ -216,7 +216,7 @@ class LoadScreen(object):
message_len = len(message) + len(trail) message_len = len(message) + len(trail)
n_rows, n_cols = self._stdscr.getmaxyx() n_rows, n_cols = self._stdscr.getmaxyx()
s_row = (n_rows - 2) // 2 s_row = (n_rows - 3) // 2
s_col = (n_cols - message_len - 1) // 2 s_col = (n_cols - message_len - 1) // 2
window = self._stdscr.derwin(3, message_len+2, s_row, s_col) window = self._stdscr.derwin(3, message_len+2, s_row, s_col)
@@ -276,7 +276,7 @@ def curses_session():
# Hide blinking cursor # Hide blinking cursor
curses.curs_set(0) curses.curs_set(0)
hide_stderr() # hide_stderr()
yield stdscr yield stdscr

View File

@@ -20,7 +20,7 @@ setup(
license='MIT', license='MIT',
keywords='reddit terminal praw curses', keywords='reddit terminal praw curses',
packages=['rtv'], packages=['rtv'],
install_requires=['praw', 'six'], install_requires=['praw', 'six', 'requests'],
entry_points={'console_scripts': ['rtv=rtv.main:main']}, entry_points={'console_scripts': ['rtv=rtv.main:main']},
classifiers=[ classifiers=[
'Intended Audience :: End Users/Desktop', 'Intended Audience :: End Users/Desktop',