From bdce9cb4b5484db9abda70f908798f4d7a2c7da0 Mon Sep 17 00:00:00 2001 From: a-tal Date: Tue, 31 Mar 2015 07:58:48 -0700 Subject: [PATCH 01/13] requests raises an error when the useragent starts with \n --- rtv/docs.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/rtv/docs.py b/rtv/docs.py index 4089ee7..6637ac4 100644 --- a/rtv/docs.py +++ b/rtv/docs.py @@ -2,9 +2,7 @@ from .__version__ import __version__ __all__ = ['AGENT', 'SUMMARY', 'AUTH', 'CONTROLS', 'HELP'] -AGENT = """ -desktop:https://github.com/michael-lazar/rtv:{} (by /u/civilization_phaze_3) -""".format(__version__) +AGENT = "desktop:https://github.com/michael-lazar/rtv:{} (by /u/civilization_phaze_3)".format(__version__) SUMMARY = """ Reddit Terminal Viewer is a lightweight browser for www.reddit.com built into a @@ -42,7 +40,7 @@ Subreddit Mode Submission Mode `LEFT` or `h` : Return to subreddit mode `RIGHT` or `l` : Fold the selected comment, or load additional comments - `c` : Comment/reply on the selected item + `c` : Comment/reply on the selected item """ COMMENT_FILE = """ From 26aab7a2cd65022e5eefdfd95abd54606de7ddc1 Mon Sep 17 00:00:00 2001 From: Tobin Date: Tue, 31 Mar 2015 10:47:15 -0500 Subject: [PATCH 02/13] 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 03/13] 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 04/13] 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 05/13] 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 06/13] 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 07/13] 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 From 8c56211d947863a858d3e2573a9a9a5a965f9ffd Mon Sep 17 00:00:00 2001 From: ysakamoto Date: Wed, 1 Apr 2015 18:58:06 -0500 Subject: [PATCH 08/13] login with '+' key --- rtv/docs.py | 1 + rtv/page.py | 40 +++++++++++++++++++++++++++++++++------- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/rtv/docs.py b/rtv/docs.py index 025a9e6..f6b0e3c 100644 --- a/rtv/docs.py +++ b/rtv/docs.py @@ -31,6 +31,7 @@ Global Commands `r` : Refresh the current page `q` : Quit the program `ENTER` or `o` : Open the selected item in the default web browser + `+` : Log in `?` : Show this help message Subreddit Mode diff --git a/rtv/page.py b/rtv/page.py index 4a30465..43f26c3 100644 --- a/rtv/page.py +++ b/rtv/page.py @@ -226,17 +226,43 @@ class BasePage(object): except praw.errors.LoginOrScopeRequired: show_notification(self.stdscr, ['Login to vote']) - def prompt_input(self, prompt): + @BaseController.register('+') + def login(self): + username = self.prompt_input('Enter username: ') + password = self.prompt_input('Enter password: ', hide=True) + + if (username == '') or (password == ''): + curses.flash() + return + try: + self.reddit.login(username, password) + + except praw.errors.InvalidUserPass: + show_notification(self.stdscr, + ['Invalid password for username: {}'.format(username)]) + else: + show_notification(self.stdscr, + ['Successfully logged in as: {}'.format(username)]) + + return + + def prompt_input(self, prompt, hide=False): """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) + if hide: + self.stdscr.addstr(n_rows - 1, 0, prompt+' '*(n_rows-1-len(prompt)), attr) + out = self.stdscr.getstr(n_rows-1, 1) + else: + 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): From ca41b77d83abc415cd60060c43b65a3580d24ed4 Mon Sep 17 00:00:00 2001 From: Michael Lazar Date: Wed, 1 Apr 2015 19:49:14 -0700 Subject: [PATCH 09/13] Submission selfpost now partially displays if not enough space. --- rtv/submission.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/rtv/submission.py b/rtv/submission.py index 43899d6..70850fa 100644 --- a/rtv/submission.py +++ b/rtv/submission.py @@ -205,11 +205,6 @@ class SubmissionPage(BasePage): n_rows, n_cols = win.getmaxyx() n_cols -= 3 # one for each side of the border + one for offset - # Don't print at all if there is not enough room to fit the whole sub - if data['n_rows'] > n_rows: - win.addnstr(0, 0, '(Not enough space to display)', n_cols) - return - for row, text in enumerate(data['split_title'], start=1): text = clean(text) win.addnstr(row, 1, text, n_cols, curses.A_BOLD) @@ -228,13 +223,20 @@ class SubmissionPage(BasePage): attr = curses.A_UNDERLINE | Color.BLUE text = clean('{url}'.format(**data)) win.addnstr(row, 1, text, n_cols, attr) - offset = len(data['split_title']) + 3 - for row, text in enumerate(data['split_text'], start=offset): + + # Cut off text if there is not enough room to display the whole post + split_text = data['split_text'] + if data['n_rows'] > n_rows: + cutoff = data['n_rows'] - n_rows + 1 + split_text = split_text[:-cutoff] + split_text.append('(Not enough space to display)') + + for row, text in enumerate(split_text, start=offset): text = clean(text) win.addnstr(row, 1, text, n_cols) - row = len(data['split_title']) + len(data['split_text']) + 3 + row = len(data['split_title']) + len(split_text) + 3 text = clean('{score} {comments}'.format(**data)) win.addnstr(row, 1, text, n_cols, curses.A_BOLD) From 59b657de37a26d7c86fe47a517b60b576e11186a Mon Sep 17 00:00:00 2001 From: ysakamoto Date: Wed, 1 Apr 2015 21:56:25 -0500 Subject: [PATCH 10/13] check username/password before real login --- rtv/docs.py | 2 +- rtv/page.py | 22 +++++++++++++++++----- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/rtv/docs.py b/rtv/docs.py index f6b0e3c..988583a 100644 --- a/rtv/docs.py +++ b/rtv/docs.py @@ -31,7 +31,7 @@ Global Commands `r` : Refresh the current page `q` : Quit the program `ENTER` or `o` : Open the selected item in the default web browser - `+` : Log in + `u` : Log in `?` : Show this help message Subreddit Mode diff --git a/rtv/page.py b/rtv/page.py index 43f26c3..0cda610 100644 --- a/rtv/page.py +++ b/rtv/page.py @@ -6,6 +6,7 @@ import praw.errors from .helpers import clean from .curses_helpers import Color, show_notification, show_help, text_input +from .docs import AGENT __all__ = ['Navigator'] @@ -226,21 +227,31 @@ class BasePage(object): except praw.errors.LoginOrScopeRequired: show_notification(self.stdscr, ['Login to vote']) - @BaseController.register('+') + @BaseController.register('u') def login(self): username = self.prompt_input('Enter username: ') password = self.prompt_input('Enter password: ', hide=True) - if (username == '') or (password == ''): + if username == '' or username is None: + self.reddit.clear_authentication() + show_notification(self.stdscr, + ['Logged out']) + return + elif password == '' or password is None: curses.flash() return + try: - self.reddit.login(username, password) - + curses.endwin() + print('Connecting...') + _reddit = praw.Reddit(user_agent=AGENT) + _reddit.login(username, password) + curses.doupdate() except praw.errors.InvalidUserPass: show_notification(self.stdscr, ['Invalid password for username: {}'.format(username)]) else: + self.reddit.login(username, password) show_notification(self.stdscr, ['Successfully logged in as: {}'.format(username)]) @@ -252,7 +263,8 @@ class BasePage(object): n_rows, n_cols = self.stdscr.getmaxyx() if hide: - self.stdscr.addstr(n_rows - 1, 0, prompt+' '*(n_rows-1-len(prompt)), attr) + self.stdscr.addstr(n_rows - 1, 0, prompt+' '*(n_cols-1-len(prompt)), + attr) out = self.stdscr.getstr(n_rows-1, 1) else: self.stdscr.addstr(n_rows - 1, 0, prompt, attr) From c7a760791a6e9c168f5ff73dc614853bfdc89d0f Mon Sep 17 00:00:00 2001 From: ysakamoto Date: Thu, 2 Apr 2015 02:11:03 -0500 Subject: [PATCH 11/13] prompt to log out/in when logged in/out --- rtv/curses_helpers.py | 4 +++- rtv/page.py | 55 ++++++++++++++++++++++++------------------- 2 files changed, 34 insertions(+), 25 deletions(-) diff --git a/rtv/curses_helpers.py b/rtv/curses_helpers.py index f9a2085..ee9fdaf 100644 --- a/rtv/curses_helpers.py +++ b/rtv/curses_helpers.py @@ -52,12 +52,14 @@ def show_notification(stdscr, message): for index, line in enumerate(message, start=1): window.addstr(index, 1, line) window.refresh() - stdscr.getch() + ch = stdscr.getch() window.clear() window = None stdscr.refresh() + return ch + def show_help(stdscr): """ diff --git a/rtv/page.py b/rtv/page.py index 0cda610..65e21c3 100644 --- a/rtv/page.py +++ b/rtv/page.py @@ -229,34 +229,41 @@ class BasePage(object): @BaseController.register('u') def login(self): - username = self.prompt_input('Enter username: ') - password = self.prompt_input('Enter password: ', hide=True) + """ + Prompt to log out if logged in. + Prompt to log in if looged out. + """ + + if self.reddit.is_logged_in(): + ch = show_notification(self.stdscr, ["Log out? (y/N)"]) + + if ch == 121: # 'y' + self.reddit.clear_authentication() + show_notification(self.stdscr, + ['Logged out']) + else: + curses.flash() - if username == '' or username is None: - self.reddit.clear_authentication() - show_notification(self.stdscr, - ['Logged out']) - return - elif password == '' or password is None: - curses.flash() - return - - try: - curses.endwin() - print('Connecting...') - _reddit = praw.Reddit(user_agent=AGENT) - _reddit.login(username, password) - curses.doupdate() - except praw.errors.InvalidUserPass: - show_notification(self.stdscr, - ['Invalid password for username: {}'.format(username)]) else: - self.reddit.login(username, password) - show_notification(self.stdscr, - ['Successfully logged in as: {}'.format(username)]) + username = self.prompt_input('Enter username: ') + password = self.prompt_input('Enter password: ', hide=True) + + if (username == '' or username is None) \ + or (password == '' or password is None): + curses.flash() + return + + try: + self.reddit.login(username, password) + except praw.errors.InvalidUserPass: + show_notification(self.stdscr, + ['Invalid password for username: {}'.format(username)]) + else: + show_notification(self.stdscr, + ['Successfully logged in as: {}'.format(username)]) return - + def prompt_input(self, prompt, hide=False): """Prompt the user for input""" attr = curses.A_BOLD | Color.CYAN From 2141fe6e31e03d956a8f3d7c66621042adde87d5 Mon Sep 17 00:00:00 2001 From: Michael Lazar Date: Thu, 2 Apr 2015 09:59:23 -0700 Subject: [PATCH 12/13] Cleaned up user login. --- rtv/page.py | 58 ++++++++++++++++++++++++++--------------------------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/rtv/page.py b/rtv/page.py index 65e21c3..70d13f6 100644 --- a/rtv/page.py +++ b/rtv/page.py @@ -230,39 +230,38 @@ class BasePage(object): @BaseController.register('u') def login(self): """ - Prompt to log out if logged in. - Prompt to log in if looged out. + Prompt to log into the user's account. Log out if the user is already + logged in. """ if self.reddit.is_logged_in(): - ch = show_notification(self.stdscr, ["Log out? (y/N)"]) + self.logout() + return - if ch == 121: # 'y' - self.reddit.clear_authentication() - show_notification(self.stdscr, - ['Logged out']) - else: - curses.flash() + username = self.prompt_input('Enter username:') + password = self.prompt_input('Enter password:', hide=True) + if not username or not password: + curses.flash() + return + try: + self.reddit.login(username, password) + except praw.errors.InvalidUserPass: + show_notification(self.stdscr, ['Invalid user/pass']) else: - username = self.prompt_input('Enter username: ') - password = self.prompt_input('Enter password: ', hide=True) + show_notification(self.stdscr, ['Logged in']) - if (username == '' or username is None) \ - or (password == '' or password is None): - curses.flash() - return + def logout(self): + """ + Prompt to log out of the user's account. + """ - try: - self.reddit.login(username, password) - except praw.errors.InvalidUserPass: - show_notification(self.stdscr, - ['Invalid password for username: {}'.format(username)]) - else: - show_notification(self.stdscr, - ['Successfully logged in as: {}'.format(username)]) - - return + ch = self.prompt_input("Log out? (y/n):") + if ch == 'y': + self.reddit.clear_authentication() + show_notification(self.stdscr, ['Logged out']) + elif ch != 'n': + curses.flash() def prompt_input(self, prompt, hide=False): """Prompt the user for input""" @@ -270,18 +269,17 @@ class BasePage(object): n_rows, n_cols = self.stdscr.getmaxyx() if hide: - self.stdscr.addstr(n_rows - 1, 0, prompt+' '*(n_cols-1-len(prompt)), - attr) + prompt += ' ' * (n_cols - len(prompt) - 1) + self.stdscr.addstr(n_rows-1, 0, prompt, attr) out = self.stdscr.getstr(n_rows-1, 1) else: 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)) + n_rows - 1, len(prompt)) window.attrset(attr) - out = text_input(window) - + return out def draw(self): From a6035933819ab4dbc2881e43977511dd389a631b Mon Sep 17 00:00:00 2001 From: Michael Lazar Date: Thu, 2 Apr 2015 20:52:39 -0700 Subject: [PATCH 13/13] #67, Fixed unicode bug on python2. --- rtv/submission.py | 20 ++++++++++---------- rtv/subreddit.py | 12 ++++++------ 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/rtv/submission.py b/rtv/submission.py index 70850fa..461fc67 100644 --- a/rtv/submission.py +++ b/rtv/submission.py @@ -139,13 +139,13 @@ class SubmissionPage(BasePage): row = offset if row in valid_rows: - text = clean('{author} '.format(**data)) + text = clean(u'{author} '.format(**data)) attr = curses.A_BOLD attr |= (Color.BLUE if not data['is_author'] else Color.GREEN) win.addnstr(row, 1, text, n_cols - 1, attr) if data['flair']: - text = clean('{flair} '.format(**data)) + text = clean(u'{flair} '.format(**data)) attr = curses.A_BOLD | Color.YELLOW win.addnstr(text, n_cols - win.getyx()[1], attr) @@ -157,7 +157,7 @@ class SubmissionPage(BasePage): text, attr = DARROW, (curses.A_BOLD | Color.RED) win.addnstr(text, n_cols - win.getyx()[1], attr) - text = clean(' {score} {created}'.format(**data)) + text = clean(u' {score} {created}'.format(**data)) win.addnstr(text, n_cols - win.getyx()[1]) n_body = len(data['split_body']) @@ -187,9 +187,9 @@ class SubmissionPage(BasePage): n_rows, n_cols = win.getmaxyx() n_cols -= 1 - text = clean('{body}'.format(**data)) + text = clean(u'{body}'.format(**data)) win.addnstr(0, 1, text, n_cols - 1) - text = clean(' [{count}]'.format(**data)) + text = clean(u' [{count}]'.format(**data)) win.addnstr(text, n_cols - win.getyx()[1], curses.A_BOLD) # Unfortunately vline() doesn't support custom color so we have to @@ -211,17 +211,17 @@ class SubmissionPage(BasePage): row = len(data['split_title']) + 1 attr = curses.A_BOLD | Color.GREEN - text = clean('{author}'.format(**data)) + text = clean(u'{author}'.format(**data)) win.addnstr(row, 1, text, n_cols, attr) attr = curses.A_BOLD | Color.YELLOW - text = clean(' {flair}'.format(**data)) + text = clean(u' {flair}'.format(**data)) win.addnstr(text, n_cols - win.getyx()[1], attr) - text = clean(' {created} {subreddit}'.format(**data)) + text = clean(u' {created} {subreddit}'.format(**data)) win.addnstr(text, n_cols - win.getyx()[1]) row = len(data['split_title']) + 2 attr = curses.A_UNDERLINE | Color.BLUE - text = clean('{url}'.format(**data)) + text = clean(u'{url}'.format(**data)) win.addnstr(row, 1, text, n_cols, attr) offset = len(data['split_title']) + 3 @@ -237,7 +237,7 @@ class SubmissionPage(BasePage): win.addnstr(row, 1, text, n_cols) row = len(data['split_title']) + len(split_text) + 3 - text = clean('{score} {comments}'.format(**data)) + text = clean(u'{score} {comments}'.format(**data)) win.addnstr(row, 1, text, n_cols, curses.A_BOLD) win.border() diff --git a/rtv/subreddit.py b/rtv/subreddit.py index 97d292f..85282e8 100644 --- a/rtv/subreddit.py +++ b/rtv/subreddit.py @@ -115,12 +115,12 @@ class SubredditPage(BasePage): seen = (data['url_full'] in opened_links) link_color = Color.MAGENTA if seen else Color.BLUE attr = curses.A_UNDERLINE | link_color - text = clean('{url}'.format(**data)) + text = clean(u'{url}'.format(**data)) win.addnstr(row, 1, text, n_cols - 1, attr) row = n_title + offset + 1 if row in valid_rows: - text = clean('{score} '.format(**data)) + text = clean(u'{score} '.format(**data)) win.addnstr(row, 1, text, n_cols - 1) if data['likes'] is None: @@ -131,14 +131,14 @@ class SubredditPage(BasePage): text, attr = DARROW, curses.A_BOLD | Color.RED win.addnstr(text, n_cols - win.getyx()[1], attr) - text = clean(' {created} {comments}'.format(**data)) + text = clean(u' {created} {comments}'.format(**data)) win.addnstr(text, n_cols - win.getyx()[1]) row = n_title + offset + 2 if row in valid_rows: - text = clean('{author}'.format(**data)) + text = clean(u'{author}'.format(**data)) win.addnstr(row, 1, text, n_cols - 1, curses.A_BOLD) - text = clean(' {subreddit}'.format(**data)) + text = clean(u' {subreddit}'.format(**data)) win.addnstr(text, n_cols - win.getyx()[1], Color.YELLOW) - text = clean(' {flair}'.format(**data)) + text = clean(u' {flair}'.format(**data)) win.addnstr(text, n_cols - win.getyx()[1], Color.RED)