From 0467f83314f504a51a2ae42d074fbbfa99dd4736 Mon Sep 17 00:00:00 2001
From: Marco Burstein <theskunkmb@gmail.com>
Date: Sat, 9 Dec 2017 12:35:16 -0800
Subject: [PATCH] mypy: Add annotations for xkcd Bot.

---
 tools/run-mypy                               |  2 ++
 zulip_bots/zulip_bots/bots/xkcd/test_xkcd.py | 10 +++++-----
 zulip_bots/zulip_bots/bots/xkcd/xkcd.py      | 11 ++++++-----
 3 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/tools/run-mypy b/tools/run-mypy
index 6fbab1da..c924ed94 100755
--- a/tools/run-mypy
+++ b/tools/run-mypy
@@ -60,6 +60,8 @@ force_include = [
     "zulip_bots/zulip_bots/bots/encrypt/test_encrypt.py",
     "zulip_bots/zulip_bots/bots/chess/chess.py",
     "zulip_bots/zulip_bots/bots/chess/test_chess.py",
+    "zulip_bots/zulip_bots/bots/xkcd/xkcd.py",
+    "zulip_bots/zulip_bots/bots/xkcd/test_xkcd.py",
 ]
 
 parser = argparse.ArgumentParser(description="Run mypy on files tracked by git.")
diff --git a/zulip_bots/zulip_bots/bots/xkcd/test_xkcd.py b/zulip_bots/zulip_bots/bots/xkcd/test_xkcd.py
index fec7393c..b83b8a2b 100755
--- a/zulip_bots/zulip_bots/bots/xkcd/test_xkcd.py
+++ b/zulip_bots/zulip_bots/bots/xkcd/test_xkcd.py
@@ -7,7 +7,7 @@ from zulip_bots.test_lib import StubBotTestCase
 class TestXkcdBot(StubBotTestCase):
     bot_name = "xkcd"
 
-    def test_latest_command(self):
+    def test_latest_command(self) -> None:
         bot_response = ("#1866: **Russell's Teapot**\n"
                         "[Unfortunately, NASA regulations state that Bertrand Russell-related "
                         "payloads can only be launched within launch vehicles which do not launch "
@@ -15,7 +15,7 @@ class TestXkcdBot(StubBotTestCase):
         with self.mock_http_conversation('test_latest'):
             self.verify_reply('latest', bot_response)
 
-    def test_random_command(self):
+    def test_random_command(self) -> None:
         bot_response = ("#1800: **Chess Notation**\n"
                         "[I've decided to score all my conversations using chess win-loss "
                         "notation. (??)](https://imgs.xkcd.com/comics/chess_notation.png)")
@@ -27,14 +27,14 @@ class TestXkcdBot(StubBotTestCase):
                 randint.return_value = mock_rand_value.return_value
                 self.verify_reply('random', bot_response)
 
-    def test_numeric_comic_id_command_1(self):
+    def test_numeric_comic_id_command_1(self) -> None:
         bot_response = ("#1: **Barrel - Part 1**\n[Don't we all.]"
                         "(https://imgs.xkcd.com/comics/barrel_cropped_(1).jpg)")
         with self.mock_http_conversation('test_specific_id'):
             self.verify_reply('1', bot_response)
 
     @mock.patch('logging.exception')
-    def test_invalid_comic_ids(self, mock_logging_exception):
+    def test_invalid_comic_ids(self, mock_logging_exception: mock.Mock) -> None:
         invalid_id_txt = "Sorry, there is likely no xkcd comic strip with id: #"
 
         for comic_id, fixture in (('0', 'test_not_existing_id_2'),
@@ -42,7 +42,7 @@ class TestXkcdBot(StubBotTestCase):
             with self.mock_http_conversation(fixture):
                 self.verify_reply(comic_id, invalid_id_txt + comic_id)
 
-    def test_help_responses(self):
+    def test_help_responses(self) -> None:
         help_txt = "xkcd bot supports these commands:"
         err_txt  = "xkcd bot only supports these commands, not `{}`:"
         commands = '''
diff --git a/zulip_bots/zulip_bots/bots/xkcd/xkcd.py b/zulip_bots/zulip_bots/bots/xkcd/xkcd.py
index 7bccf7b2..ec5f1984 100644
--- a/zulip_bots/zulip_bots/bots/xkcd/xkcd.py
+++ b/zulip_bots/zulip_bots/bots/xkcd/xkcd.py
@@ -2,6 +2,7 @@ import random
 
 import logging
 import requests
+from zulip_bots.lib import ExternalBotHandler
 
 XKCD_TEMPLATE_URL = 'https://xkcd.com/%s/info.0.json'
 LATEST_XKCD_URL = 'https://xkcd.com/info.0.json'
@@ -19,7 +20,7 @@ class XkcdHandler(object):
         'description': 'Fetches comic strips from https://xkcd.com.',
     }
 
-    def usage(self):
+    def usage(self) -> str:
         return '''
             This plugin allows users to fetch a comic strip provided by
             https://xkcd.com. Users should preface the command with "@mention-bot".
@@ -32,7 +33,7 @@ class XkcdHandler(object):
             `<comic_id>`, e.g `@mention-bot 1234`.
             '''
 
-    def handle_message(self, message, bot_handler):
+    def handle_message(self, message: dict, bot_handler: ExternalBotHandler) -> None:
         xkcd_bot_response = get_xkcd_bot_response(message)
         bot_handler.send_reply(message, xkcd_bot_response)
 
@@ -47,7 +48,7 @@ class XkcdNotFoundError(Exception):
 class XkcdServerError(Exception):
     pass
 
-def get_xkcd_bot_response(message):
+def get_xkcd_bot_response(message: dict) -> str:
     original_content = message['content'].strip()
     command = original_content.strip()
 
@@ -82,7 +83,7 @@ def get_xkcd_bot_response(message):
                                            fetched['alt'],
                                            fetched['img']))
 
-def fetch_xkcd_query(mode, comic_id=None):
+def fetch_xkcd_query(mode: int, comic_id: str = None) -> dict:
     try:
         if mode == XkcdBotCommand.LATEST:  # Fetch the latest comic strip.
             url = LATEST_XKCD_URL
@@ -111,7 +112,7 @@ def fetch_xkcd_query(mode, comic_id=None):
 
         xkcd_json = fetched.json()
     except requests.exceptions.ConnectionError as e:
-        logging.warning(e)
+        logging.exception("Connection Error")
         raise
 
     return xkcd_json