Hopefully made safe_call() more pythonic.
This commit is contained in:
65
rtv/page.py
65
rtv/page.py
@@ -107,6 +107,32 @@ class Navigator(object):
|
|||||||
else:
|
else:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
class SafeCaller(object):
|
||||||
|
|
||||||
|
def __init__(self, window):
|
||||||
|
self.window = window
|
||||||
|
self.catch = True
|
||||||
|
|
||||||
|
def __enter__(self):
|
||||||
|
return self
|
||||||
|
|
||||||
|
def __exit__(self, exc_type, e, exc_tb):
|
||||||
|
|
||||||
|
if self.catch:
|
||||||
|
if exc_type is praw.errors.APIException:
|
||||||
|
message = ['Error: {}'.format(e.error_type), e.message]
|
||||||
|
show_notification(self.window, message)
|
||||||
|
_logger.exception(e)
|
||||||
|
return True
|
||||||
|
elif exc_type is praw.errors.ClientException:
|
||||||
|
message = ['Error: Client Exception', e.message]
|
||||||
|
show_notification(self.window, message)
|
||||||
|
_logger.exception(e)
|
||||||
|
return True
|
||||||
|
elif exc_type in (requests.HTTPError, requests.ConnectionError):
|
||||||
|
show_notification(self.window, ['Unexpected Error'])
|
||||||
|
_logger.exception(e)
|
||||||
|
return True
|
||||||
|
|
||||||
class BaseController(object):
|
class BaseController(object):
|
||||||
"""
|
"""
|
||||||
@@ -277,11 +303,12 @@ class BasePage(object):
|
|||||||
show_notification(self.stdscr, ['Aborted'])
|
show_notification(self.stdscr, ['Aborted'])
|
||||||
return
|
return
|
||||||
|
|
||||||
with self.safe_call():
|
with self.safe_call as s:
|
||||||
with self.loader(message='Deleting', delay=0):
|
with self.loader(message='Deleting', delay=0):
|
||||||
data['object'].delete()
|
data['object'].delete()
|
||||||
time.sleep(2.0)
|
time.sleep(2.0)
|
||||||
self.refresh_content()
|
s.catch = False
|
||||||
|
self.refresh_content()
|
||||||
|
|
||||||
@BaseController.register('e')
|
@BaseController.register('e')
|
||||||
def edit(self):
|
def edit(self):
|
||||||
@@ -316,11 +343,12 @@ class BasePage(object):
|
|||||||
show_notification(self.stdscr, ['Aborted'])
|
show_notification(self.stdscr, ['Aborted'])
|
||||||
return
|
return
|
||||||
|
|
||||||
with self.safe_call():
|
with self.safe_call as s:
|
||||||
with self.loader(message='Editing', delay=0):
|
with self.loader(message='Editing', delay=0):
|
||||||
data['object'].edit(text)
|
data['object'].edit(text)
|
||||||
time.sleep(2.0)
|
time.sleep(2.0)
|
||||||
self.refresh_content()
|
s.catch = False
|
||||||
|
self.refresh_content()
|
||||||
|
|
||||||
def clear_input_queue(self):
|
def clear_input_queue(self):
|
||||||
"Clear excessive input caused by the scroll wheel or holding down a key"
|
"Clear excessive input caused by the scroll wheel or holding down a key"
|
||||||
@@ -340,7 +368,7 @@ class BasePage(object):
|
|||||||
elif ch != 'n':
|
elif ch != 'n':
|
||||||
curses.flash()
|
curses.flash()
|
||||||
|
|
||||||
@contextmanager
|
@property
|
||||||
def safe_call(self):
|
def safe_call(self):
|
||||||
"""
|
"""
|
||||||
Wrap praw calls with extended error handling.
|
Wrap praw calls with extended error handling.
|
||||||
@@ -350,31 +378,12 @@ class BasePage(object):
|
|||||||
can be used to check the status of the call.
|
can be used to check the status of the call.
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
#>>> with self.safe_call() as check_status:
|
#>>> with self.safe_call as s:
|
||||||
#>>> self.reddit.submit(...)
|
#>>> self.reddit.submit(...)
|
||||||
#>>> success = check_status()
|
#>>> s.catch = False
|
||||||
|
#>>> on_success()
|
||||||
"""
|
"""
|
||||||
|
return SafeCaller(self.stdscr)
|
||||||
success = None
|
|
||||||
check_status = lambda: success
|
|
||||||
try:
|
|
||||||
yield check_status
|
|
||||||
except praw.errors.APIException as e:
|
|
||||||
message = ['Error: {}'.format(e.error_type), e.message]
|
|
||||||
show_notification(self.stdscr, message)
|
|
||||||
_logger.exception(e)
|
|
||||||
success = False
|
|
||||||
except praw.errors.ClientException as e:
|
|
||||||
message = ['Error: Client Exception', e.message]
|
|
||||||
show_notification(self.stdscr, message)
|
|
||||||
_logger.exception(e)
|
|
||||||
success = False
|
|
||||||
except (requests.HTTPError, requests.ConnectionError) as e:
|
|
||||||
show_notification(self.stdscr, ['Unexpected Error'])
|
|
||||||
_logger.exception(e)
|
|
||||||
success = False
|
|
||||||
else:
|
|
||||||
success = True
|
|
||||||
|
|
||||||
def draw(self):
|
def draw(self):
|
||||||
|
|
||||||
|
|||||||
@@ -115,14 +115,15 @@ class SubmissionPage(BasePage):
|
|||||||
show_notification(self.stdscr, ['Aborted'])
|
show_notification(self.stdscr, ['Aborted'])
|
||||||
return
|
return
|
||||||
|
|
||||||
with self.safe_call():
|
with self.safe_call as s:
|
||||||
with self.loader(message='Posting', delay=0):
|
with self.loader(message='Posting', delay=0):
|
||||||
if data['type'] == 'Submission':
|
if data['type'] == 'Submission':
|
||||||
data['object'].add_comment(comment_text)
|
data['object'].add_comment(comment_text)
|
||||||
else:
|
else:
|
||||||
data['object'].reply(comment_text)
|
data['object'].reply(comment_text)
|
||||||
time.sleep(2.0)
|
time.sleep(2.0)
|
||||||
self.refresh_content()
|
s.catch = False
|
||||||
|
self.refresh_content()
|
||||||
|
|
||||||
@SubmissionController.register('d')
|
@SubmissionController.register('d')
|
||||||
def delete_comment(self):
|
def delete_comment(self):
|
||||||
|
|||||||
@@ -140,13 +140,12 @@ class SubredditPage(BasePage):
|
|||||||
return
|
return
|
||||||
|
|
||||||
title, content = submission_text.split('\n', 1)
|
title, content = submission_text.split('\n', 1)
|
||||||
with self.safe_call() as check_status:
|
with self.safe_call as s:
|
||||||
with self.loader(message='Posting', delay=0):
|
with self.loader(message='Posting', delay=0):
|
||||||
post = self.reddit.submit(sub, title, text=content)
|
post = self.reddit.submit(sub, title, text=content)
|
||||||
time.sleep(2.0)
|
time.sleep(2.0)
|
||||||
|
|
||||||
if check_status():
|
|
||||||
# Open the newly created post
|
# Open the newly created post
|
||||||
|
s.catch = False
|
||||||
page = SubmissionPage(self.stdscr, self.reddit, submission=post)
|
page = SubmissionPage(self.stdscr, self.reddit, submission=post)
|
||||||
page.loop()
|
page.loop()
|
||||||
self.refresh_content()
|
self.refresh_content()
|
||||||
|
|||||||
Reference in New Issue
Block a user