BryanDavis has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/203985

Change subject: Fix PEP-8 style
......................................................................

Fix PEP-8 style

Remove the 120 column line length override and fix things to be 79
column max as PEP-8 intends.

Also removed class level member initialization anti-pattern in favor of
proper constructor based initialization.

Change-Id: Iffde5043102ebbe041755a7d3d9365e3efd483df
---
M deploypage.py
M jouncebot.py
M tox.ini
3 files changed, 73 insertions(+), 61 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/wikimedia/bots/jouncebot 
refs/changes/85/203985/1

diff --git a/deploypage.py b/deploypage.py
index 76624e1..dfe5cd9 100644
--- a/deploypage.py
+++ b/deploypage.py
@@ -7,25 +7,18 @@
 
 
 class DeployPage:
-    #: mwclient.Site mwcon: Connection to MediaWiki server that hosts the 
deployment calendar
-    mwcon = None
-    page = ""
-    logger = None
-    update_interval = 1
-
-    notify_callback = None
-    notify_timer = None
-    update_timer = None
-
-    deploy_items = {}
-
-    page_url = ''
+    XPATH_ITEM = '//tr[@class="deploycal-item"]'
+    XPATH_TIMES = 'td//span[@class="deploycal-time-utc"]/time'
+    XPATH_WINDOW = 'td//span[@class="deploycal-window"]'
+    XPATH_NICK = 'td//span[@class="ircnick-container"]/span[@class="ircnick"]'
 
     def __init__(self, mwcon, page, logger, update_interval=15):
         """ Create a DeployPage object
-        :param mwclient.Site mwcon: Connection to MediaWiki server that hosts 
:param page
+        :param mwclient.Site mwcon: Connection to MediaWiki server that
+            hosts :param page
         :param string page: Title of page that hosts the deployment calendar
-        :param int update_interval: Number of minutes between requests for the 
deployment page
+        :param int update_interval: Number of minutes between requests for
+            the deployment page
         """
         self.mwcon = mwcon
         self.page = page
@@ -35,8 +28,15 @@
         # Things I hate about the MW API right here...
         # This is getting the full URL of the deployments page so we can create
         # nice links in IRC messages
-        page_url_result = mwcon.api('query', **{'titles': 'Deployments', 
'prop': 'info', 'inprop': 'url'})
-        self.page_url = 
page_url_result['query']['pages'][page_url_result['query']['pages'].keys()[0]]['fullurl']
+        page_url_result = mwcon.api('query',
+            **{'titles': 'Deployments', 'prop': 'info', 'inprop': 'url'})
+        idx = page_url_result['query']['pages'].keys()[0]
+        self.page_url = page_url_result['query']['pages'][idx]['fullurl']
+
+        self.notify_callback = None
+        self.notify_timer = None
+        self.update_timer = None
+        self.deploy_items = {}
 
     def start(self, notify_callback):
         """Start all the various timers"""
@@ -56,28 +56,27 @@
             from itertools import chain
             parts = (
                 [node.text] +
-                list(chain(*(stringify_children(c) for c in 
node.getchildren()))) +
+                list(chain(
+                    *(stringify_children(c) for c in node.getchildren()))) +
                 [node.tail]
             )
             # filter removes possible Nones in texts and tails
             return ''.join(filter(None, parts))
 
-        self.logger.debug("Collecting new deployment information from the 
server")
+        self.logger.debug(
+            "Collecting new deployment information from the server")
         tree = etree.fromstring(self._get_page_html(), etree.HTMLParser())
-        for item in tree.xpath('//tr[@class="deploycal-item"]'):
+        for item in tree.xpath(self.XPATH_ITEM):
             id = item.get('id')
-            times = item.xpath('td//span[@class="deploycal-time-utc"]/time')
+            times = item.xpath(self.XPATH_TIMES)
             start_time = dateutil.parser.parse(times[0].get('datetime'))
             end_time = dateutil.parser.parse(times[1].get('datetime'))
-            window = 
stringify_children(item.xpath('td//span[@class="deploycal-window"]')[0]) \
-                .replace("\n", " ") \
-                .strip()
-            owners = map(
-                lambda x: x.text,
-                
item.xpath('td//span[@class="ircnick-container"]/span[@class="ircnick"]')
-            )
+            window = stringify_children(
+                item.xpath(self.XPATH_WINDOW)[0]).replace("\n", " ").strip()
+            owners = map(lambda x: x.text, item.xpath(self.XPATH_NICK))
 
-            item_obj = DeployItem(id, '%s#%s' % (self.page_url, id), 
start_time, end_time, window, owners)
+            item_obj = DeployItem(id, '%s#%s' % (self.page_url, id),
+                start_time, end_time, window, owners)
 
             if start_time in deploy_items:
                 deploy_items[start_time].append(item_obj)
@@ -114,9 +113,11 @@
 
     def _get_page_html(self):
         try:
-            return 
self.mwcon.parse(self.mwcon.pages[self.page].edit())['text']['*']
+            return self.mwcon.parse(
+                self.mwcon.pages[self.page].edit())['text']['*']
         except Exception as ex:
-            self.logger.error("Could not fetch page due to exception: " + 
repr(ex))
+            self.logger.error(
+                "Could not fetch page due to exception: " + repr(ex))
             return ""
 
     def _reparse_on_timer(self):
@@ -124,17 +125,20 @@
         if self.update_timer:
             self.update_timer.cancel()
 
-        self.update_timer = Timer(self.update_interval * 60, 
self._reparse_on_timer)
+        self.update_timer = Timer(
+            self.update_interval * 60, self._reparse_on_timer)
         self.update_timer.start()
 
     def _set_deploy_timer(self):
         next_events = self.get_next_events()
         if len(next_events) > 0:
-            td = math.floor((next_events[0].start - 
datetime.now(pytz.utc)).total_seconds()) + 5
+            now = datetime.now(pytz.utc)
+            td = 5 + math.floor((next_events[0].start - now).total_seconds())
             if self.notify_timer:
                 self.notify_timer.cancel()
 
-            self.logger.debug("Setting deploy timer to %s for %s" % (td, 
next_events[0]))
+            self.logger.debug(
+                "Setting deploy timer to %s for %s" % (td, next_events[0]))
             self.notify_timer = Timer(td, self._on_deploy_timer, [next_events])
             self.notify_timer.start()
 
diff --git a/jouncebot.py b/jouncebot.py
index 7e506ac..03e07cf 100755
--- a/jouncebot.py
+++ b/jouncebot.py
@@ -4,7 +4,8 @@
 
 The known commands are:
     stats -- Prints some channel information.
-    restart -- Disconnect the bot.  The bot will try to reconnect after 60 
seconds.
+    restart -- Disconnect the bot.
+               The bot will try to reconnect after 60 seconds.
 """
 
 import configloader
@@ -26,12 +27,6 @@
 
 
 class JounceBot(irc.bot.SingleServerIRCBot):
-    #: logging.Logger ... for logging things to syslog
-    logger = None
-    config = None
-
-    #: DeployPage
-    deploy_page = None
 
     def __init__(self, config, logger, deploy_page):
         self.config = config
@@ -46,18 +41,23 @@
         self.deploy_page = deploy_page
 
         # Don't even get me started on how stupid a pattern this is
-        irc.client.ServerConnection.buffer_class = 
irc.buffer.LenientDecodingLineBuffer
+        irc.client.ServerConnection.buffer_class = \
+            irc.buffer.LenientDecodingLineBuffer
 
     def on_nicknameinuse(self, conn, event):
-        self.logger.warning("Requested nickname %s already in use, appending 
_" % conn.get_nickname())
+        self.logger.warning(
+            "Requested nickname %s already in use, appending _" %
+            conn.get_nickname())
         conn.nick(conn.get_nickname() + "_")
 
     def on_welcome(self, conn, event):
         self.logger.info("Connected to server")
         self.logger.info("Authenticating with Nickserv")
-        conn.privmsg('NickServ', "identify %s %s" % 
(self.config['irc']['nick'], self.config['irc']['password']))
+        conn.privmsg('NickServ', "identify %s %s" % (
+            self.config['irc']['nick'], self.config['irc']['password']))
 
-        self.logger.info("Getting information about the wiki and starting 
event handler")
+        self.logger.info(
+            "Getting information about the wiki and starting event handler")
         self.deploy_page.start(self.on_deployment_event)
 
         self.logger.info("Attempting to join channel %s", self.channel)
@@ -72,9 +72,12 @@
     def on_pubmsg(self, conn, event):
         msg_parts = event.arguments[0].split(" ", 1)
         if len(msg_parts) > 1:
-            handle = re.match("^([a-z0-9_\-\|]+)", 
irc.strings.lower(msg_parts[0]))
-            if handle and handle.group(0) == 
irc.strings.lower(self.connection.get_nickname()):
-                self.do_command(conn, event, event.target, 
msg_parts[1].strip())
+            handle = re.match(r"^([a-z0-9_\-\|]+)",
+                irc.strings.lower(msg_parts[0]))
+            nick = irc.strings.lower(self.connection.get_nickname())
+            if handle and handle.group(0) == nick:
+                self.do_command(
+                    conn, event, event.target, msg_parts[1].strip())
         return
 
     def do_command(self, conn, event, source, cmd):
@@ -84,11 +87,13 @@
         :param string cmd: String given to the bot via IRC (without bot name)
         """
         nickmask = event.source.userhost
-        self.logger.debug("Received command from %s at %s!%s: %s" % (source, 
event.source.nick, nickmask, cmd))
+        self.logger.debug("Received command from %s at %s!%s: %s" % (
+            source, event.source.nick, nickmask, cmd))
 
         cmd = cmd.split(" ", 1)
         if cmd[0].lower() in self.brain:
-            self.brain[cmd[0].lower()](self, conn, event, cmd, source, 
nickmask)
+            self.brain[cmd[0].lower()](
+                self, conn, event, cmd, source, nickmask)
 
     def do_command_help(self, conn, event, cmd, source, nickmask):
         """Prints the list of all commands known to the server"""
@@ -102,7 +107,8 @@
             \x02Available commands:\x02"""
         )
         for cmd in sorted(self.brain):
-            self.multiline_notice(conn, source, " %-7s %s" % (cmd.upper(), 
self.brain[cmd].__doc__))
+            self.multiline_notice(conn, source, " %-7s %s" % (
+                cmd.upper(), self.brain[cmd].__doc__))
 
     def do_command_die(self, conn, event, cmd, nick, nickmask):
         """Kill this bot"""
@@ -122,12 +128,12 @@
         if len(next_events) > 0:
             for event in next_events:
                 td = event.start - ctime
-                conn.privmsg(source, "In %d hour(s) and %d minute(s): %s (%s)" 
% (
-                    td.days * 24 + td.seconds / 60 / 60,
-                    td.seconds % (60 * 60) / 60,
-                    event.window,
-                    event.url
-                ))
+                conn.privmsg(source,
+                    "In %d hour(s) and %d minute(s): %s (%s)" % (
+                        td.days * 24 + td.seconds / 60 / 60,
+                        td.seconds % (60 * 60) / 60,
+                        event.window,
+                        event.url))
 
     def on_deployment_event(self, next_events):
         if len(next_events) > 0:
@@ -168,7 +174,8 @@
 
 if __name__ == "__main__":
     parser = OptionParser(usage="usage: %prog [options]")
-    parser.add_option("-c", "--config", dest='configFile', 
default='jouncebot.yaml', help='Path to configuration file')
+    parser.add_option("-c", "--config", dest='configFile',
+        default='jouncebot.yaml', help='Path to configuration file')
     (options, args) = parser.parse_args()
 
     # Attempt to load the configuration
@@ -184,14 +191,16 @@
         # Just need to log to the console
         handler = logging.StreamHandler(sys.stdout)
         logger.addHandler(handler)
-        handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - 
%(message)s'))
+        handler.setFormatter(
+            logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
     else:
         # Log to syslog
         logger.addHandler(logging.handlers.SysLogHandler(address="/dev/log"))
 
     # Mwclient connection
     mw = mwclient.Site(host=('https', configloader.values['mwclient']['wiki']))
-    deploy_page = DeployPage(mw, configloader.values['mwclient']['calPage'], 
logger)
+    deploy_page = DeployPage(
+        mw, configloader.values['mwclient']['calPage'], logger)
 
     # Create the application
     bot = JounceBot(configloader.values, logger, deploy_page)
diff --git a/tox.ini b/tox.ini
index a6a0271..af8b5e5 100644
--- a/tox.ini
+++ b/tox.ini
@@ -7,7 +7,6 @@
 count = 1
 exclude = bin,lib,include,.venv,.tox,dist,doc,build,*.egg
 ignore = E128
-max-line-length = 120
 show-pep8 = 1
 show-source = 1
 statistics = 1

-- 
To view, visit https://gerrit.wikimedia.org/r/203985
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Iffde5043102ebbe041755a7d3d9365e3efd483df
Gerrit-PatchSet: 1
Gerrit-Project: wikimedia/bots/jouncebot
Gerrit-Branch: master
Gerrit-Owner: BryanDavis <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to