From cb5d730d39943b130abec75d4c8c20e54ec7ac54 Mon Sep 17 00:00:00 2001 From: tobywhughes Date: Tue, 3 Mar 2015 18:48:38 -0800 Subject: [PATCH 1/3] Fixes / bug --- rtv/content.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rtv/content.py b/rtv/content.py index 9466370..b2a4aa9 100644 --- a/rtv/content.py +++ b/rtv/content.py @@ -325,6 +325,9 @@ class SubredditContent(BaseContent): else: if '/' in name: + if name[0] == '/': + raise SubredditNameError(name) + name, display_type = name.split('/') try: From 3253c81a3ed3a859a6869b4e0f73aef322c413db Mon Sep 17 00:00:00 2001 From: tobywhughes Date: Wed, 4 Mar 2015 01:31:11 -0800 Subject: [PATCH 2/3] Fixes (what seems like) all backslash issues --- rtv/content.py | 62 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 51 insertions(+), 11 deletions(-) diff --git a/rtv/content.py b/rtv/content.py index b2a4aa9..914899b 100644 --- a/rtv/content.py +++ b/rtv/content.py @@ -68,6 +68,22 @@ def humanize_timestamp(utc_timestamp, verbose=False): years = months // 12 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 def default_loader(self): yield @@ -309,9 +325,7 @@ class SubredditContent(BaseContent): self._submission_data = [] @classmethod - def from_name(cls, reddit, name, loader=default_loader): - - display_type = 'normal' + def from_name(cls, reddit, name, loader=default_loader, display_type = 'hot'): if name == 'front': return cls('Front Page', reddit.get_front_page(limit=None), loader) @@ -324,27 +338,53 @@ class SubredditContent(BaseContent): else: - if '/' in name: - if name[0] == '/': - raise SubredditNameError(name) + name = validate_backslashes(name) + if '/' in name: name, display_type = name.split('/') + if display_type not in ['new', 'top', 'hot', 'rising', 'controversial']: + raise SubredditNameError(name) + + if name == 'front': + + 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 == 'top': - return cls('/r/'+sub.display_name+'/top', sub.get_top_from_all(limit=None), loader) - - elif display_type == 'new': + if display_type == 'new': return cls('/r/'+sub.display_name+'/new', sub.get_new(limit=None), loader) - else: + 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) + + def get(self, index, n_cols=70): """ Grab the `i`th submission, with the title field formatted to fit inside From 73af45f4a20cda0392dad41dd3e6f37d4c470ec3 Mon Sep 17 00:00:00 2001 From: Toby Hughes Date: Wed, 4 Mar 2015 18:05:07 -0800 Subject: [PATCH 3/3] Update content.py Removed unneeded if statement --- rtv/content.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/rtv/content.py b/rtv/content.py index 914899b..d7a8b97 100644 --- a/rtv/content.py +++ b/rtv/content.py @@ -327,9 +327,6 @@ class SubredditContent(BaseContent): @classmethod def from_name(cls, reddit, name, loader=default_loader, display_type = 'hot'): - if name == 'front': - return cls('Front Page', reddit.get_front_page(limit=None), loader) - if name == 'new': return cls('New', reddit.get_new(limit=None), loader)