From 26aab7a2cd65022e5eefdfd95abd54606de7ddc1 Mon Sep 17 00:00:00 2001 From: Tobin Date: Tue, 31 Mar 2015 10:47:15 -0500 Subject: [PATCH 1/6] implemented subreddit search. search for posts --- rtv/content.py | 55 +++++++++++++++++++++++++----------------------- rtv/subreddit.py | 17 +++++++++++++++ 2 files changed, 46 insertions(+), 26 deletions(-) diff --git a/rtv/content.py b/rtv/content.py index 72899e9..12f9f56 100644 --- a/rtv/content.py +++ b/rtv/content.py @@ -245,7 +245,7 @@ class SubredditContent(BaseContent): self._submission_data = [] @classmethod - def from_name(cls, reddit, name, loader, order='hot'): + def from_name(cls, reddit, name, loader, order='hot', search=None): if name is None: name = 'front' @@ -263,34 +263,37 @@ class SubredditContent(BaseContent): 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 SubredditError(display_name) + if search: + submissions = reddit.search(search, name, order) 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) + 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 SubredditError(display_name) else: - raise SubredditError(display_name) + 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 SubredditError(display_name) # Verify that content exists for the given submission generator. # This is necessary because PRAW loads submissions lazily, and diff --git a/rtv/subreddit.py b/rtv/subreddit.py index 5dfe990..1f1785b 100644 --- a/rtv/subreddit.py +++ b/rtv/subreddit.py @@ -50,6 +50,23 @@ class SubredditPage(BasePage): else: self.nav = Navigator(self.content.get) + @SubredditController.register('f') + def search_subreddit(self, name=None): + name = name or self.content.name + attr = curses.A_BOLD | Color.CYAN + prompt = 'Search this Subreddit: ' + n_rows, n_cols = self.stdscr.getmaxyx() + self.stdscr.addstr(n_rows - 1, 0, prompt, attr) + self.stdscr.refresh() + window = self.stdscr.derwin(1, n_cols - len(prompt), + n_rows - 1, len(prompt)) + window.attrset(attr) + + search = text_input(window) + if search is not None: + self.content = SubredditContent.from_name(self.reddit, name, + self.loader, search=search) + @SubredditController.register('/') def prompt_subreddit(self): "Open a prompt to type in a new subreddit" From f9265fd33b3bbe074890cd8fb7679cc45f2c4836 Mon Sep 17 00:00:00 2001 From: Tobin Date: Tue, 31 Mar 2015 10:49:56 -0500 Subject: [PATCH 2/6] catch error when there are no results --- rtv/subreddit.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/rtv/subreddit.py b/rtv/subreddit.py index 1f1785b..b13833d 100644 --- a/rtv/subreddit.py +++ b/rtv/subreddit.py @@ -64,8 +64,11 @@ class SubredditPage(BasePage): search = text_input(window) if search is not None: - self.content = SubredditContent.from_name(self.reddit, name, + try: + self.content = SubredditContent.from_name(self.reddit, name, self.loader, search=search) + except: + show_notification(self.stdscr, ['No results found']) @SubredditController.register('/') def prompt_subreddit(self): From a1fdd2a93abd474a7a6fd1b452c3fa14658e9fe8 Mon Sep 17 00:00:00 2001 From: Tobin Date: Tue, 31 Mar 2015 13:24:33 -0500 Subject: [PATCH 3/6] move cursor to top after search, prompt_input method --- rtv/page.py | 15 ++++++++++++++- rtv/subreddit.py | 31 ++++++++----------------------- 2 files changed, 22 insertions(+), 24 deletions(-) diff --git a/rtv/page.py b/rtv/page.py index be55910..4a30465 100644 --- a/rtv/page.py +++ b/rtv/page.py @@ -5,7 +5,7 @@ import sys import praw.errors from .helpers import clean -from .curses_helpers import Color, show_notification, show_help +from .curses_helpers import Color, show_notification, show_help, text_input __all__ = ['Navigator'] @@ -226,6 +226,19 @@ class BasePage(object): except praw.errors.LoginOrScopeRequired: show_notification(self.stdscr, ['Login to vote']) + def prompt_input(self, prompt): + """Prompt the user for input""" + attr = curses.A_BOLD | Color.CYAN + n_rows, n_cols = self.stdscr.getmaxyx() + self.stdscr.addstr(n_rows - 1, 0, prompt, attr) + self.stdscr.refresh() + window = self.stdscr.derwin(1, n_cols - len(prompt), + n_rows - 1, len(prompt)) + window.attrset(attr) + + out = text_input(window) + return out + def draw(self): n_rows, n_cols = self.stdscr.getmaxyx() diff --git a/rtv/subreddit.py b/rtv/subreddit.py index b13833d..103f667 100644 --- a/rtv/subreddit.py +++ b/rtv/subreddit.py @@ -8,7 +8,7 @@ from .submission import SubmissionPage from .content import SubredditContent from .helpers import clean, open_browser from .curses_helpers import (BULLET, UARROW, DARROW, Color, LoadScreen, - text_input, show_notification) + show_notification) __all__ = ['opened_links', 'SubredditController', 'SubredditPage'] @@ -52,19 +52,13 @@ class SubredditPage(BasePage): @SubredditController.register('f') def search_subreddit(self, name=None): + """Open a prompt to search the subreddit""" name = name or self.content.name - attr = curses.A_BOLD | Color.CYAN prompt = 'Search this Subreddit: ' - n_rows, n_cols = self.stdscr.getmaxyx() - self.stdscr.addstr(n_rows - 1, 0, prompt, attr) - self.stdscr.refresh() - window = self.stdscr.derwin(1, n_cols - len(prompt), - n_rows - 1, len(prompt)) - window.attrset(attr) - - search = text_input(window) + search = self.prompt_input(prompt) if search is not None: try: + self.nav.cursor_index = 0 self.content = SubredditContent.from_name(self.reddit, name, self.loader, search=search) except: @@ -72,20 +66,11 @@ class SubredditPage(BasePage): @SubredditController.register('/') def prompt_subreddit(self): - "Open a prompt to type in a new subreddit" - - attr = curses.A_BOLD | Color.CYAN + """Open a prompt to type in a new subreddit""" prompt = 'Enter Subreddit: /r/' - n_rows, n_cols = self.stdscr.getmaxyx() - self.stdscr.addstr(n_rows - 1, 0, prompt, attr) - self.stdscr.refresh() - window = self.stdscr.derwin(1, n_cols - len(prompt), - n_rows - 1, len(prompt)) - window.attrset(attr) - - out = text_input(window) - if out is not None: - self.refresh_content(name=out) + name = self.prompt_input(prompt) + if name is not None: + self.refresh_content(name=name) @SubredditController.register(curses.KEY_RIGHT, 'l') def open_submission(self): From 2a7525debd06e5ae148968d2fbdc8d79bb7103c0 Mon Sep 17 00:00:00 2001 From: Tobin Date: Tue, 31 Mar 2015 13:45:57 -0500 Subject: [PATCH 4/6] fixed for searching of front page --- rtv/content.py | 62 +++++++++++++++++++++++++------------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/rtv/content.py b/rtv/content.py index 12f9f56..e79b398 100644 --- a/rtv/content.py +++ b/rtv/content.py @@ -262,38 +262,38 @@ class SubredditContent(BaseContent): display_name = '/r/{}'.format(name) else: display_name = '/r/{}/{}'.format(name, order) - - if search: - submissions = reddit.search(search, name, order) - - else: - 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 SubredditError(display_name) + + if name == 'front': + if search: + submissions = reddit.search(search, None, order) + elif 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: - 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 SubredditError(display_name) + raise SubredditError(display_name) + else: + subreddit = reddit.get_subreddit(name) + if search: + submissions = reddit.search(search, name, order) + elif 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 SubredditError(display_name) # Verify that content exists for the given submission generator. # This is necessary because PRAW loads submissions lazily, and From 31526483fdbfe2a36bd49adca79c6cc43f2534b3 Mon Sep 17 00:00:00 2001 From: Tobin Date: Tue, 31 Mar 2015 13:52:09 -0500 Subject: [PATCH 5/6] catch IndexError when the search returns no results --- rtv/subreddit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtv/subreddit.py b/rtv/subreddit.py index 103f667..97d292f 100644 --- a/rtv/subreddit.py +++ b/rtv/subreddit.py @@ -61,7 +61,7 @@ class SubredditPage(BasePage): self.nav.cursor_index = 0 self.content = SubredditContent.from_name(self.reddit, name, self.loader, search=search) - except: + except IndexError: # if there are no submissions show_notification(self.stdscr, ['No results found']) @SubredditController.register('/') From 37c43559df699d7119df9e83d8c39bbd9194d63f Mon Sep 17 00:00:00 2001 From: Tobin Date: Tue, 31 Mar 2015 14:02:25 -0500 Subject: [PATCH 6/6] updated help and docs for search command --- README.rst | 1 + rtv/docs.py | 1 + 2 files changed, 2 insertions(+) diff --git a/README.rst b/README.rst index 85f21f4..c6e5a5f 100644 --- a/README.rst +++ b/README.rst @@ -70,6 +70,7 @@ In subreddit mode you can browse through the top submissions on either the front :``►`` or ``l``: View comments for the selected submission :``/``: Open a prompt to switch subreddits +:``f``: Open a prompt to search the current subreddit The ``/`` prompt accepts subreddits in the following formats diff --git a/rtv/docs.py b/rtv/docs.py index b47a31b..895584e 100644 --- a/rtv/docs.py +++ b/rtv/docs.py @@ -38,6 +38,7 @@ Global Commands Subreddit Mode `RIGHT` or `l` : View comments for the selected submission `/` : Open a prompt to switch subreddits + `f` : Open a prompt to search the current subreddit Submission Mode `LEFT` or `h` : Return to subreddit mode