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