diff --git a/.requirements.txt b/.requirements.txt index febea1a..4a264fb 100644 --- a/.requirements.txt +++ b/.requirements.txt @@ -12,3 +12,4 @@ coverage flake8 flake8-docstrings pycodestyle +pdoc diff --git a/Makefile b/Makefile index b3a2b91..63ff864 100644 --- a/Makefile +++ b/Makefile @@ -150,6 +150,14 @@ coverage: +# target: pdoc - Create documentation of the code. +.PHONY: pdoc +pdoc: + @$(call MESSAGE,$@) + pdoc --output-dir docs/pdoc *.py + + + # target: install-tools - Install needed devtools. .PHONY: install-tools install-tools: diff --git a/README.md b/README.md index 6b67c72..730cfca 100755 --- a/README.md +++ b/README.md @@ -98,6 +98,19 @@ Marvin will join your channel and then you can start playing. +API documentation +-------------------------- + +The code and API documentation is generated using pdoc and make. + +```bash +make pdoc +``` + +The docs are saved at `docs/pdoc` and can be [viewed online](https://mosbth.github.io/irc2phpbb/pdoc/). + + + History -------------------------- The python script, `irc2phpbb.py`, is a implementation of an irc bot. The bot can answer diff --git a/docs/pdoc/bot.html b/docs/pdoc/bot.html new file mode 100644 index 0000000..122346e --- /dev/null +++ b/docs/pdoc/bot.html @@ -0,0 +1,520 @@ + + + + + + + bot API documentation + + + + + + + + + +
+
+

+bot

+ +

Module for the common base class for all Bots

+
+ + + + + +
 1#! /usr/bin/env python3
+ 2# -*- coding: utf-8 -*-
+ 3
+ 4"""
+ 5Module for the common base class for all Bots
+ 6"""
+ 7
+ 8import re
+ 9
+10class Bot():
+11    """Base class for things common between different protocols"""
+12    def __init__(self):
+13        self.CONFIG = {}
+14        self.ACTIONS = []
+15        self.GENERAL_ACTIONS = []
+16
+17    def getConfig(self):
+18        """Return the current configuration"""
+19        return self.CONFIG
+20
+21    def setConfig(self, config):
+22        """Set the current configuration"""
+23        self.CONFIG = config
+24
+25    def registerActions(self, actions):
+26        """Register actions to use"""
+27        print("Adding actions:")
+28        for action in actions:
+29            print(" - " + action.__name__)
+30        self.ACTIONS.extend(actions)
+31
+32    def registerGeneralActions(self, actions):
+33        """Register general actions to use"""
+34        print("Adding general actions:")
+35        for action in actions:
+36            print(" - " + action.__name__)
+37        self.GENERAL_ACTIONS.extend(actions)
+38
+39    @staticmethod
+40    def tokenize(message):
+41        """Split a message into normalized tokens"""
+42        return re.sub("[,.?:]", " ", message).strip().lower().split()
+
+ + +
+
+ +
+ + class + Bot: + + + +
+ +
11class Bot():
+12    """Base class for things common between different protocols"""
+13    def __init__(self):
+14        self.CONFIG = {}
+15        self.ACTIONS = []
+16        self.GENERAL_ACTIONS = []
+17
+18    def getConfig(self):
+19        """Return the current configuration"""
+20        return self.CONFIG
+21
+22    def setConfig(self, config):
+23        """Set the current configuration"""
+24        self.CONFIG = config
+25
+26    def registerActions(self, actions):
+27        """Register actions to use"""
+28        print("Adding actions:")
+29        for action in actions:
+30            print(" - " + action.__name__)
+31        self.ACTIONS.extend(actions)
+32
+33    def registerGeneralActions(self, actions):
+34        """Register general actions to use"""
+35        print("Adding general actions:")
+36        for action in actions:
+37            print(" - " + action.__name__)
+38        self.GENERAL_ACTIONS.extend(actions)
+39
+40    @staticmethod
+41    def tokenize(message):
+42        """Split a message into normalized tokens"""
+43        return re.sub("[,.?:]", " ", message).strip().lower().split()
+
+ + +

Base class for things common between different protocols

+
+ + +
+
+ CONFIG + + +
+ + + + +
+
+
+ ACTIONS + + +
+ + + + +
+
+
+ GENERAL_ACTIONS + + +
+ + + + +
+
+ +
+ + def + getConfig(self): + + + +
+ +
18    def getConfig(self):
+19        """Return the current configuration"""
+20        return self.CONFIG
+
+ + +

Return the current configuration

+
+ + +
+
+ +
+ + def + setConfig(self, config): + + + +
+ +
22    def setConfig(self, config):
+23        """Set the current configuration"""
+24        self.CONFIG = config
+
+ + +

Set the current configuration

+
+ + +
+
+ +
+ + def + registerActions(self, actions): + + + +
+ +
26    def registerActions(self, actions):
+27        """Register actions to use"""
+28        print("Adding actions:")
+29        for action in actions:
+30            print(" - " + action.__name__)
+31        self.ACTIONS.extend(actions)
+
+ + +

Register actions to use

+
+ + +
+
+ +
+ + def + registerGeneralActions(self, actions): + + + +
+ +
33    def registerGeneralActions(self, actions):
+34        """Register general actions to use"""
+35        print("Adding general actions:")
+36        for action in actions:
+37            print(" - " + action.__name__)
+38        self.GENERAL_ACTIONS.extend(actions)
+
+ + +

Register general actions to use

+
+ + +
+
+ +
+
@staticmethod
+ + def + tokenize(message): + + + +
+ +
40    @staticmethod
+41    def tokenize(message):
+42        """Split a message into normalized tokens"""
+43        return re.sub("[,.?:]", " ", message).strip().lower().split()
+
+ + +

Split a message into normalized tokens

+
+ + +
+
+
+ + \ No newline at end of file diff --git a/docs/pdoc/discord_bot.html b/docs/pdoc/discord_bot.html new file mode 100644 index 0000000..5a08113 --- /dev/null +++ b/docs/pdoc/discord_bot.html @@ -0,0 +1,548 @@ + + + + + + + discord_bot API documentation + + + + + + + + + +
+
+

+discord_bot

+ +

Module for the Discord bot.

+ +

Connecting, sending and receiving messages and doing custom actions.

+
+ + + + + +
 1#! /usr/bin/env python3
+ 2# -*- coding: utf-8 -*-
+ 3
+ 4"""
+ 5Module for the Discord bot.
+ 6
+ 7Connecting, sending and receiving messages and doing custom actions.
+ 8"""
+ 9
+10import discord
+11
+12from bot import Bot
+13
+14class DiscordBot(discord.Client, Bot):
+15    """Bot implementing the discord protocol"""
+16    def __init__(self):
+17        Bot.__init__(self)
+18        self.CONFIG = {
+19            "token": ""
+20        }
+21        intents = discord.Intents.default()
+22        intents.message_content = True
+23        discord.Client.__init__(self, intents=intents)
+24
+25    def begin(self):
+26        """Start the bot"""
+27        self.run(self.CONFIG.get("token"))
+28
+29    async def checkMarvinActions(self, message):
+30        """Check if Marvin should perform any actions"""
+31        words = self.tokenize(message.content)
+32        if self.user.name.lower() in words:
+33            for action in self.ACTIONS:
+34                response = action(words)
+35                if response:
+36                    await message.channel.send(response)
+37        else:
+38            for action in self.GENERAL_ACTIONS:
+39                response = action(words)
+40                if response:
+41                    await message.channel.send(response)
+42
+43    async def on_message(self, message):
+44        """Hook run on every message"""
+45        print(f"#{message.channel.name} <{message.author}> {message.content}")
+46        if message.author.name == self.user.name:
+47            # don't react to own messages
+48            return
+49        await self.checkMarvinActions(message)
+
+ + +
+
+ +
+ + class + DiscordBot(discord.client.Client, bot.Bot): + + + +
+ +
15class DiscordBot(discord.Client, Bot):
+16    """Bot implementing the discord protocol"""
+17    def __init__(self):
+18        Bot.__init__(self)
+19        self.CONFIG = {
+20            "token": ""
+21        }
+22        intents = discord.Intents.default()
+23        intents.message_content = True
+24        discord.Client.__init__(self, intents=intents)
+25
+26    def begin(self):
+27        """Start the bot"""
+28        self.run(self.CONFIG.get("token"))
+29
+30    async def checkMarvinActions(self, message):
+31        """Check if Marvin should perform any actions"""
+32        words = self.tokenize(message.content)
+33        if self.user.name.lower() in words:
+34            for action in self.ACTIONS:
+35                response = action(words)
+36                if response:
+37                    await message.channel.send(response)
+38        else:
+39            for action in self.GENERAL_ACTIONS:
+40                response = action(words)
+41                if response:
+42                    await message.channel.send(response)
+43
+44    async def on_message(self, message):
+45        """Hook run on every message"""
+46        print(f"#{message.channel.name} <{message.author}> {message.content}")
+47        if message.author.name == self.user.name:
+48            # don't react to own messages
+49            return
+50        await self.checkMarvinActions(message)
+
+ + +

Bot implementing the discord protocol

+
+ + +
+
+ CONFIG + + +
+ + + + +
+
+ +
+ + def + begin(self): + + + +
+ +
26    def begin(self):
+27        """Start the bot"""
+28        self.run(self.CONFIG.get("token"))
+
+ + +

Start the bot

+
+ + +
+
+ +
+ + async def + checkMarvinActions(self, message): + + + +
+ +
30    async def checkMarvinActions(self, message):
+31        """Check if Marvin should perform any actions"""
+32        words = self.tokenize(message.content)
+33        if self.user.name.lower() in words:
+34            for action in self.ACTIONS:
+35                response = action(words)
+36                if response:
+37                    await message.channel.send(response)
+38        else:
+39            for action in self.GENERAL_ACTIONS:
+40                response = action(words)
+41                if response:
+42                    await message.channel.send(response)
+
+ + +

Check if Marvin should perform any actions

+
+ + +
+
+ +
+ + async def + on_message(self, message): + + + +
+ +
44    async def on_message(self, message):
+45        """Hook run on every message"""
+46        print(f"#{message.channel.name} <{message.author}> {message.content}")
+47        if message.author.name == self.user.name:
+48            # don't react to own messages
+49            return
+50        await self.checkMarvinActions(message)
+
+ + +

Hook run on every message

+
+ + +
+
+
Inherited Members
+
+
discord.client.Client
+
loop
+
ws
+
shard_id
+
shard_count
+
http
+
latency
+
is_ws_ratelimited
+
user
+
guilds
+
emojis
+
stickers
+
cached_messages
+
private_channels
+
voice_clients
+
application_id
+
application_flags
+
application
+
is_ready
+
dispatch
+
on_error
+
before_identify_hook
+
setup_hook
+
login
+
connect
+
close
+
clear
+
start
+
run
+
is_closed
+
activity
+
status
+
allowed_mentions
+
intents
+
users
+
get_channel
+
get_partial_messageable
+
get_stage_instance
+
get_guild
+
get_user
+
get_emoji
+
get_sticker
+
get_all_channels
+
get_all_members
+
wait_until_ready
+
wait_for
+
event
+
change_presence
+
fetch_guilds
+
fetch_template
+
fetch_guild
+
create_guild
+
fetch_stage_instance
+
fetch_invite
+
delete_invite
+
fetch_widget
+
application_info
+
fetch_user
+
fetch_channel
+
fetch_webhook
+
fetch_sticker
+
fetch_skus
+
fetch_entitlement
+
entitlements
+
create_entitlement
+
fetch_premium_sticker_packs
+
create_dm
+
add_dynamic_items
+
remove_dynamic_items
+
add_view
+
persistent_views
+ +
+
bot.Bot
+
ACTIONS
+
GENERAL_ACTIONS
+
getConfig
+
setConfig
+
registerActions
+
registerGeneralActions
+
tokenize
+ +
+
+
+
+
+ + \ No newline at end of file diff --git a/docs/pdoc/index.html b/docs/pdoc/index.html new file mode 100644 index 0000000..5ff61a9 --- /dev/null +++ b/docs/pdoc/index.html @@ -0,0 +1,223 @@ + + + + + + + Module List – pdoc 14.7.0 + + + + + + + + + + +
+ + pdoc + + +
+
+ + \ No newline at end of file diff --git a/docs/pdoc/irc_bot.html b/docs/pdoc/irc_bot.html new file mode 100644 index 0000000..8f68184 --- /dev/null +++ b/docs/pdoc/irc_bot.html @@ -0,0 +1,1239 @@ + + + + + + + irc_bot API documentation + + + + + + + + + +
+
+

+irc_bot

+ +

Module for the IRC bot.

+ +

Connecting, sending and receiving messages and doing custom actions.

+ +

Keeping a log and reading incoming material.

+
+ + + + + +
  1#! /usr/bin/env python3
+  2# -*- coding: utf-8 -*-
+  3
+  4"""
+  5Module for the IRC bot.
+  6
+  7Connecting, sending and receiving messages and doing custom actions.
+  8
+  9Keeping a log and reading incoming material.
+ 10"""
+ 11from collections import deque
+ 12from datetime import datetime
+ 13import json
+ 14import os
+ 15import re
+ 16import shutil
+ 17import socket
+ 18
+ 19import chardet
+ 20
+ 21from bot import Bot
+ 22
+ 23class IrcBot(Bot):
+ 24    """Bot implementing the IRC protocol"""
+ 25    def __init__(self):
+ 26        super().__init__()
+ 27        self.CONFIG = {
+ 28            "server": None,
+ 29            "port": 6667,
+ 30            "channel": None,
+ 31            "nick": "marvin",
+ 32            "realname": "Marvin The All Mighty dbwebb-bot",
+ 33            "ident": None,
+ 34            "irclogfile": "irclog.txt",
+ 35            "irclogmax": 20,
+ 36            "dirIncoming": "incoming",
+ 37            "dirDone": "done",
+ 38            "lastfm": None,
+ 39        }
+ 40
+ 41        # Socket for IRC server
+ 42        self.SOCKET = None
+ 43
+ 44        # Keep a log of the latest messages
+ 45        self.IRCLOG = None
+ 46
+ 47
+ 48    def connectToServer(self):
+ 49        """Connect to the IRC Server"""
+ 50
+ 51        # Create the socket  & Connect to the server
+ 52        server = self.CONFIG["server"]
+ 53        port = self.CONFIG["port"]
+ 54
+ 55        if server and port:
+ 56            self.SOCKET = socket.socket()
+ 57            print("Connecting: {SERVER}:{PORT}".format(SERVER=server, PORT=port))
+ 58            self.SOCKET.connect((server, port))
+ 59        else:
+ 60            print("Failed to connect, missing server or port in configuration.")
+ 61            return
+ 62
+ 63        # Send the nick to server
+ 64        nick = self.CONFIG["nick"]
+ 65        if nick:
+ 66            msg = 'NICK {NICK}\r\n'.format(NICK=nick)
+ 67            self.sendMsg(msg)
+ 68        else:
+ 69            print("Ignore sending nick, missing nick in configuration.")
+ 70
+ 71        # Present yourself
+ 72        realname = self.CONFIG["realname"]
+ 73        self.sendMsg('USER  {NICK} 0 * :{REALNAME}\r\n'.format(NICK=nick, REALNAME=realname))
+ 74
+ 75        # This is my nick, i promise!
+ 76        ident = self.CONFIG["ident"]
+ 77        if ident:
+ 78            self.sendMsg('PRIVMSG nick IDENTIFY {IDENT}\r\n'.format(IDENT=ident))
+ 79        else:
+ 80            print("Ignore identifying with password, ident is not set.")
+ 81
+ 82        # Join a channel
+ 83        channel = self.CONFIG["channel"]
+ 84        if channel:
+ 85            self.sendMsg('JOIN {CHANNEL}\r\n'.format(CHANNEL=channel))
+ 86        else:
+ 87            print("Ignore joining channel, missing channel name in configuration.")
+ 88
+ 89    def sendPrivMsg(self, message, channel):
+ 90        """Send and log a PRIV message"""
+ 91        if channel == self.CONFIG["channel"]:
+ 92            self.ircLogAppend(user=self.CONFIG["nick"].ljust(8), message=message)
+ 93
+ 94        msg = "PRIVMSG {CHANNEL} :{MSG}\r\n".format(CHANNEL=channel, MSG=message)
+ 95        self.sendMsg(msg)
+ 96
+ 97    def sendMsg(self, msg):
+ 98        """Send and occasionally print the message sent"""
+ 99        print("SEND: " + msg.rstrip('\r\n'))
+100        self.SOCKET.send(msg.encode())
+101
+102    def decode_irc(self, raw, preferred_encs=None):
+103        """
+104        Do character detection.
+105        You can send preferred encodings as a list through preferred_encs.
+106        http://stackoverflow.com/questions/938870/python-irc-bot-and-encoding-issue
+107        """
+108        if preferred_encs is None:
+109            preferred_encs = ["UTF-8", "CP1252", "ISO-8859-1"]
+110
+111        changed = False
+112        enc = None
+113        for enc in preferred_encs:
+114            try:
+115                res = raw.decode(enc)
+116                changed = True
+117                break
+118            except Exception:
+119                pass
+120
+121        if not changed:
+122            try:
+123                enc = chardet.detect(raw)['encoding']
+124                res = raw.decode(enc)
+125            except Exception:
+126                res = raw.decode(enc, 'ignore')
+127
+128        return res
+129
+130    def receive(self):
+131        """Read incoming message and guess encoding"""
+132        try:
+133            buf = self.SOCKET.recv(2048)
+134            lines = self.decode_irc(buf)
+135            lines = lines.split("\n")
+136            buf = lines.pop()
+137        except Exception as err:
+138            print("Error reading incoming message. " + err)
+139
+140        return lines
+141
+142    def ircLogAppend(self, line=None, user=None, message=None):
+143        """Read incoming message and guess encoding"""
+144        if not user:
+145            user = re.search(r"(?<=:)\w+", line[0]).group(0)
+146
+147        if not message:
+148            message = ' '.join(line[3:]).lstrip(':')
+149
+150        self.IRCLOG.append({
+151            'time': datetime.now().strftime("%H:%M").rjust(5),
+152            'user': user,
+153            'msg': message
+154        })
+155
+156    def ircLogWriteToFile(self):
+157        """Write IRClog to file"""
+158        with open(self.CONFIG["irclogfile"], 'w', encoding="UTF-8") as f:
+159            json.dump(list(self.IRCLOG), f, indent=2)
+160
+161    def readincoming(self):
+162        """
+163        Read all files in the directory incoming, send them as a message if
+164        they exists and then move the file to directory done.
+165        """
+166        if not os.path.isdir(self.CONFIG["dirIncoming"]):
+167            return
+168
+169        listing = os.listdir(self.CONFIG["dirIncoming"])
+170
+171        for infile in listing:
+172            filename = os.path.join(self.CONFIG["dirIncoming"], infile)
+173
+174            with open(filename, "r", encoding="UTF-8") as f:
+175                for msg in f:
+176                    self.sendPrivMsg(msg, self.CONFIG["channel"])
+177
+178            try:
+179                shutil.move(filename, self.CONFIG["dirDone"])
+180            except Exception:
+181                os.remove(filename)
+182
+183    def mainLoop(self):
+184        """For ever, listen and answer to incoming chats"""
+185        self.IRCLOG = deque([], self.CONFIG["irclogmax"])
+186
+187        while 1:
+188            # Write irclog
+189            self.ircLogWriteToFile()
+190
+191            # Check in any in the incoming directory
+192            self.readincoming()
+193
+194            for line in self.receive():
+195                print(line)
+196                words = line.strip().split()
+197
+198                if not words:
+199                    continue
+200
+201                self.checkIrcActions(words)
+202                self.checkMarvinActions(words)
+203
+204    def begin(self):
+205        """Start the bot"""
+206        self.connectToServer()
+207        self.mainLoop()
+208
+209    def checkIrcActions(self, words):
+210        """
+211        Check if Marvin should take action on any messages defined in the
+212        IRC protocol.
+213        """
+214        if words[0] == "PING":
+215            self.sendMsg("PONG {ARG}\r\n".format(ARG=words[1]))
+216
+217        if words[1] == 'INVITE':
+218            self.sendMsg('JOIN {CHANNEL}\r\n'.format(CHANNEL=words[3]))
+219
+220    def checkMarvinActions(self, words):
+221        """Check if Marvin should perform any actions"""
+222        if words[1] == 'PRIVMSG' and words[2] == self.CONFIG["channel"]:
+223            self.ircLogAppend(words)
+224
+225        if words[1] == 'PRIVMSG':
+226            raw = ' '.join(words[3:])
+227            row = self.tokenize(raw)
+228
+229            if self.CONFIG["nick"] in row:
+230                for action in self.ACTIONS:
+231                    msg = action(row)
+232                    if msg:
+233                        self.sendPrivMsg(msg, words[2])
+234                        break
+235            else:
+236                for action in self.GENERAL_ACTIONS:
+237                    msg = action(row)
+238                    if msg:
+239                        self.sendPrivMsg(msg, words[2])
+240                        break
+
+ + +
+
+ +
+ + class + IrcBot(bot.Bot): + + + +
+ +
 24class IrcBot(Bot):
+ 25    """Bot implementing the IRC protocol"""
+ 26    def __init__(self):
+ 27        super().__init__()
+ 28        self.CONFIG = {
+ 29            "server": None,
+ 30            "port": 6667,
+ 31            "channel": None,
+ 32            "nick": "marvin",
+ 33            "realname": "Marvin The All Mighty dbwebb-bot",
+ 34            "ident": None,
+ 35            "irclogfile": "irclog.txt",
+ 36            "irclogmax": 20,
+ 37            "dirIncoming": "incoming",
+ 38            "dirDone": "done",
+ 39            "lastfm": None,
+ 40        }
+ 41
+ 42        # Socket for IRC server
+ 43        self.SOCKET = None
+ 44
+ 45        # Keep a log of the latest messages
+ 46        self.IRCLOG = None
+ 47
+ 48
+ 49    def connectToServer(self):
+ 50        """Connect to the IRC Server"""
+ 51
+ 52        # Create the socket  & Connect to the server
+ 53        server = self.CONFIG["server"]
+ 54        port = self.CONFIG["port"]
+ 55
+ 56        if server and port:
+ 57            self.SOCKET = socket.socket()
+ 58            print("Connecting: {SERVER}:{PORT}".format(SERVER=server, PORT=port))
+ 59            self.SOCKET.connect((server, port))
+ 60        else:
+ 61            print("Failed to connect, missing server or port in configuration.")
+ 62            return
+ 63
+ 64        # Send the nick to server
+ 65        nick = self.CONFIG["nick"]
+ 66        if nick:
+ 67            msg = 'NICK {NICK}\r\n'.format(NICK=nick)
+ 68            self.sendMsg(msg)
+ 69        else:
+ 70            print("Ignore sending nick, missing nick in configuration.")
+ 71
+ 72        # Present yourself
+ 73        realname = self.CONFIG["realname"]
+ 74        self.sendMsg('USER  {NICK} 0 * :{REALNAME}\r\n'.format(NICK=nick, REALNAME=realname))
+ 75
+ 76        # This is my nick, i promise!
+ 77        ident = self.CONFIG["ident"]
+ 78        if ident:
+ 79            self.sendMsg('PRIVMSG nick IDENTIFY {IDENT}\r\n'.format(IDENT=ident))
+ 80        else:
+ 81            print("Ignore identifying with password, ident is not set.")
+ 82
+ 83        # Join a channel
+ 84        channel = self.CONFIG["channel"]
+ 85        if channel:
+ 86            self.sendMsg('JOIN {CHANNEL}\r\n'.format(CHANNEL=channel))
+ 87        else:
+ 88            print("Ignore joining channel, missing channel name in configuration.")
+ 89
+ 90    def sendPrivMsg(self, message, channel):
+ 91        """Send and log a PRIV message"""
+ 92        if channel == self.CONFIG["channel"]:
+ 93            self.ircLogAppend(user=self.CONFIG["nick"].ljust(8), message=message)
+ 94
+ 95        msg = "PRIVMSG {CHANNEL} :{MSG}\r\n".format(CHANNEL=channel, MSG=message)
+ 96        self.sendMsg(msg)
+ 97
+ 98    def sendMsg(self, msg):
+ 99        """Send and occasionally print the message sent"""
+100        print("SEND: " + msg.rstrip('\r\n'))
+101        self.SOCKET.send(msg.encode())
+102
+103    def decode_irc(self, raw, preferred_encs=None):
+104        """
+105        Do character detection.
+106        You can send preferred encodings as a list through preferred_encs.
+107        http://stackoverflow.com/questions/938870/python-irc-bot-and-encoding-issue
+108        """
+109        if preferred_encs is None:
+110            preferred_encs = ["UTF-8", "CP1252", "ISO-8859-1"]
+111
+112        changed = False
+113        enc = None
+114        for enc in preferred_encs:
+115            try:
+116                res = raw.decode(enc)
+117                changed = True
+118                break
+119            except Exception:
+120                pass
+121
+122        if not changed:
+123            try:
+124                enc = chardet.detect(raw)['encoding']
+125                res = raw.decode(enc)
+126            except Exception:
+127                res = raw.decode(enc, 'ignore')
+128
+129        return res
+130
+131    def receive(self):
+132        """Read incoming message and guess encoding"""
+133        try:
+134            buf = self.SOCKET.recv(2048)
+135            lines = self.decode_irc(buf)
+136            lines = lines.split("\n")
+137            buf = lines.pop()
+138        except Exception as err:
+139            print("Error reading incoming message. " + err)
+140
+141        return lines
+142
+143    def ircLogAppend(self, line=None, user=None, message=None):
+144        """Read incoming message and guess encoding"""
+145        if not user:
+146            user = re.search(r"(?<=:)\w+", line[0]).group(0)
+147
+148        if not message:
+149            message = ' '.join(line[3:]).lstrip(':')
+150
+151        self.IRCLOG.append({
+152            'time': datetime.now().strftime("%H:%M").rjust(5),
+153            'user': user,
+154            'msg': message
+155        })
+156
+157    def ircLogWriteToFile(self):
+158        """Write IRClog to file"""
+159        with open(self.CONFIG["irclogfile"], 'w', encoding="UTF-8") as f:
+160            json.dump(list(self.IRCLOG), f, indent=2)
+161
+162    def readincoming(self):
+163        """
+164        Read all files in the directory incoming, send them as a message if
+165        they exists and then move the file to directory done.
+166        """
+167        if not os.path.isdir(self.CONFIG["dirIncoming"]):
+168            return
+169
+170        listing = os.listdir(self.CONFIG["dirIncoming"])
+171
+172        for infile in listing:
+173            filename = os.path.join(self.CONFIG["dirIncoming"], infile)
+174
+175            with open(filename, "r", encoding="UTF-8") as f:
+176                for msg in f:
+177                    self.sendPrivMsg(msg, self.CONFIG["channel"])
+178
+179            try:
+180                shutil.move(filename, self.CONFIG["dirDone"])
+181            except Exception:
+182                os.remove(filename)
+183
+184    def mainLoop(self):
+185        """For ever, listen and answer to incoming chats"""
+186        self.IRCLOG = deque([], self.CONFIG["irclogmax"])
+187
+188        while 1:
+189            # Write irclog
+190            self.ircLogWriteToFile()
+191
+192            # Check in any in the incoming directory
+193            self.readincoming()
+194
+195            for line in self.receive():
+196                print(line)
+197                words = line.strip().split()
+198
+199                if not words:
+200                    continue
+201
+202                self.checkIrcActions(words)
+203                self.checkMarvinActions(words)
+204
+205    def begin(self):
+206        """Start the bot"""
+207        self.connectToServer()
+208        self.mainLoop()
+209
+210    def checkIrcActions(self, words):
+211        """
+212        Check if Marvin should take action on any messages defined in the
+213        IRC protocol.
+214        """
+215        if words[0] == "PING":
+216            self.sendMsg("PONG {ARG}\r\n".format(ARG=words[1]))
+217
+218        if words[1] == 'INVITE':
+219            self.sendMsg('JOIN {CHANNEL}\r\n'.format(CHANNEL=words[3]))
+220
+221    def checkMarvinActions(self, words):
+222        """Check if Marvin should perform any actions"""
+223        if words[1] == 'PRIVMSG' and words[2] == self.CONFIG["channel"]:
+224            self.ircLogAppend(words)
+225
+226        if words[1] == 'PRIVMSG':
+227            raw = ' '.join(words[3:])
+228            row = self.tokenize(raw)
+229
+230            if self.CONFIG["nick"] in row:
+231                for action in self.ACTIONS:
+232                    msg = action(row)
+233                    if msg:
+234                        self.sendPrivMsg(msg, words[2])
+235                        break
+236            else:
+237                for action in self.GENERAL_ACTIONS:
+238                    msg = action(row)
+239                    if msg:
+240                        self.sendPrivMsg(msg, words[2])
+241                        break
+
+ + +

Bot implementing the IRC protocol

+
+ + +
+
+ CONFIG + + +
+ + + + +
+
+
+ SOCKET + + +
+ + + + +
+
+
+ IRCLOG + + +
+ + + + +
+
+ +
+ + def + connectToServer(self): + + + +
+ +
49    def connectToServer(self):
+50        """Connect to the IRC Server"""
+51
+52        # Create the socket  & Connect to the server
+53        server = self.CONFIG["server"]
+54        port = self.CONFIG["port"]
+55
+56        if server and port:
+57            self.SOCKET = socket.socket()
+58            print("Connecting: {SERVER}:{PORT}".format(SERVER=server, PORT=port))
+59            self.SOCKET.connect((server, port))
+60        else:
+61            print("Failed to connect, missing server or port in configuration.")
+62            return
+63
+64        # Send the nick to server
+65        nick = self.CONFIG["nick"]
+66        if nick:
+67            msg = 'NICK {NICK}\r\n'.format(NICK=nick)
+68            self.sendMsg(msg)
+69        else:
+70            print("Ignore sending nick, missing nick in configuration.")
+71
+72        # Present yourself
+73        realname = self.CONFIG["realname"]
+74        self.sendMsg('USER  {NICK} 0 * :{REALNAME}\r\n'.format(NICK=nick, REALNAME=realname))
+75
+76        # This is my nick, i promise!
+77        ident = self.CONFIG["ident"]
+78        if ident:
+79            self.sendMsg('PRIVMSG nick IDENTIFY {IDENT}\r\n'.format(IDENT=ident))
+80        else:
+81            print("Ignore identifying with password, ident is not set.")
+82
+83        # Join a channel
+84        channel = self.CONFIG["channel"]
+85        if channel:
+86            self.sendMsg('JOIN {CHANNEL}\r\n'.format(CHANNEL=channel))
+87        else:
+88            print("Ignore joining channel, missing channel name in configuration.")
+
+ + +

Connect to the IRC Server

+
+ + +
+
+ +
+ + def + sendPrivMsg(self, message, channel): + + + +
+ +
90    def sendPrivMsg(self, message, channel):
+91        """Send and log a PRIV message"""
+92        if channel == self.CONFIG["channel"]:
+93            self.ircLogAppend(user=self.CONFIG["nick"].ljust(8), message=message)
+94
+95        msg = "PRIVMSG {CHANNEL} :{MSG}\r\n".format(CHANNEL=channel, MSG=message)
+96        self.sendMsg(msg)
+
+ + +

Send and log a PRIV message

+
+ + +
+
+ +
+ + def + sendMsg(self, msg): + + + +
+ +
 98    def sendMsg(self, msg):
+ 99        """Send and occasionally print the message sent"""
+100        print("SEND: " + msg.rstrip('\r\n'))
+101        self.SOCKET.send(msg.encode())
+
+ + +

Send and occasionally print the message sent

+
+ + +
+
+ +
+ + def + decode_irc(self, raw, preferred_encs=None): + + + +
+ +
103    def decode_irc(self, raw, preferred_encs=None):
+104        """
+105        Do character detection.
+106        You can send preferred encodings as a list through preferred_encs.
+107        http://stackoverflow.com/questions/938870/python-irc-bot-and-encoding-issue
+108        """
+109        if preferred_encs is None:
+110            preferred_encs = ["UTF-8", "CP1252", "ISO-8859-1"]
+111
+112        changed = False
+113        enc = None
+114        for enc in preferred_encs:
+115            try:
+116                res = raw.decode(enc)
+117                changed = True
+118                break
+119            except Exception:
+120                pass
+121
+122        if not changed:
+123            try:
+124                enc = chardet.detect(raw)['encoding']
+125                res = raw.decode(enc)
+126            except Exception:
+127                res = raw.decode(enc, 'ignore')
+128
+129        return res
+
+ + +

Do character detection. +You can send preferred encodings as a list through preferred_encs. +http://stackoverflow.com/questions/938870/python-irc-bot-and-encoding-issue

+
+ + +
+
+ +
+ + def + receive(self): + + + +
+ +
131    def receive(self):
+132        """Read incoming message and guess encoding"""
+133        try:
+134            buf = self.SOCKET.recv(2048)
+135            lines = self.decode_irc(buf)
+136            lines = lines.split("\n")
+137            buf = lines.pop()
+138        except Exception as err:
+139            print("Error reading incoming message. " + err)
+140
+141        return lines
+
+ + +

Read incoming message and guess encoding

+
+ + +
+
+ +
+ + def + ircLogAppend(self, line=None, user=None, message=None): + + + +
+ +
143    def ircLogAppend(self, line=None, user=None, message=None):
+144        """Read incoming message and guess encoding"""
+145        if not user:
+146            user = re.search(r"(?<=:)\w+", line[0]).group(0)
+147
+148        if not message:
+149            message = ' '.join(line[3:]).lstrip(':')
+150
+151        self.IRCLOG.append({
+152            'time': datetime.now().strftime("%H:%M").rjust(5),
+153            'user': user,
+154            'msg': message
+155        })
+
+ + +

Read incoming message and guess encoding

+
+ + +
+
+ +
+ + def + ircLogWriteToFile(self): + + + +
+ +
157    def ircLogWriteToFile(self):
+158        """Write IRClog to file"""
+159        with open(self.CONFIG["irclogfile"], 'w', encoding="UTF-8") as f:
+160            json.dump(list(self.IRCLOG), f, indent=2)
+
+ + +

Write IRClog to file

+
+ + +
+
+ +
+ + def + readincoming(self): + + + +
+ +
162    def readincoming(self):
+163        """
+164        Read all files in the directory incoming, send them as a message if
+165        they exists and then move the file to directory done.
+166        """
+167        if not os.path.isdir(self.CONFIG["dirIncoming"]):
+168            return
+169
+170        listing = os.listdir(self.CONFIG["dirIncoming"])
+171
+172        for infile in listing:
+173            filename = os.path.join(self.CONFIG["dirIncoming"], infile)
+174
+175            with open(filename, "r", encoding="UTF-8") as f:
+176                for msg in f:
+177                    self.sendPrivMsg(msg, self.CONFIG["channel"])
+178
+179            try:
+180                shutil.move(filename, self.CONFIG["dirDone"])
+181            except Exception:
+182                os.remove(filename)
+
+ + +

Read all files in the directory incoming, send them as a message if +they exists and then move the file to directory done.

+
+ + +
+
+ +
+ + def + mainLoop(self): + + + +
+ +
184    def mainLoop(self):
+185        """For ever, listen and answer to incoming chats"""
+186        self.IRCLOG = deque([], self.CONFIG["irclogmax"])
+187
+188        while 1:
+189            # Write irclog
+190            self.ircLogWriteToFile()
+191
+192            # Check in any in the incoming directory
+193            self.readincoming()
+194
+195            for line in self.receive():
+196                print(line)
+197                words = line.strip().split()
+198
+199                if not words:
+200                    continue
+201
+202                self.checkIrcActions(words)
+203                self.checkMarvinActions(words)
+
+ + +

For ever, listen and answer to incoming chats

+
+ + +
+
+ +
+ + def + begin(self): + + + +
+ +
205    def begin(self):
+206        """Start the bot"""
+207        self.connectToServer()
+208        self.mainLoop()
+
+ + +

Start the bot

+
+ + +
+
+ +
+ + def + checkIrcActions(self, words): + + + +
+ +
210    def checkIrcActions(self, words):
+211        """
+212        Check if Marvin should take action on any messages defined in the
+213        IRC protocol.
+214        """
+215        if words[0] == "PING":
+216            self.sendMsg("PONG {ARG}\r\n".format(ARG=words[1]))
+217
+218        if words[1] == 'INVITE':
+219            self.sendMsg('JOIN {CHANNEL}\r\n'.format(CHANNEL=words[3]))
+
+ + +

Check if Marvin should take action on any messages defined in the +IRC protocol.

+
+ + +
+
+ +
+ + def + checkMarvinActions(self, words): + + + +
+ +
221    def checkMarvinActions(self, words):
+222        """Check if Marvin should perform any actions"""
+223        if words[1] == 'PRIVMSG' and words[2] == self.CONFIG["channel"]:
+224            self.ircLogAppend(words)
+225
+226        if words[1] == 'PRIVMSG':
+227            raw = ' '.join(words[3:])
+228            row = self.tokenize(raw)
+229
+230            if self.CONFIG["nick"] in row:
+231                for action in self.ACTIONS:
+232                    msg = action(row)
+233                    if msg:
+234                        self.sendPrivMsg(msg, words[2])
+235                        break
+236            else:
+237                for action in self.GENERAL_ACTIONS:
+238                    msg = action(row)
+239                    if msg:
+240                        self.sendPrivMsg(msg, words[2])
+241                        break
+
+ + +

Check if Marvin should perform any actions

+
+ + +
+ +
+
+ + \ No newline at end of file diff --git a/docs/pdoc/main.html b/docs/pdoc/main.html new file mode 100644 index 0000000..50f44c4 --- /dev/null +++ b/docs/pdoc/main.html @@ -0,0 +1,745 @@ + + + + + + + main API documentation + + + + + + + + + +
+
+

+main

+ +

An IRC bot that answers random questions, keeps a log from the IRC-chat, +easy to integrate in a webpage and montores a phpBB forum for latest topics +by loggin in to the forum and checking the RSS-feed.

+ +

You need to install additional modules.

+ +

Install needed modules in local directory

+ +

pip3 install --target modules/ feedparser beautifulsoup4 chardet

+ +

Modules in modules/ will be loaded automatically. If you want to use a +different directory you can start the program like this instead:

+ +

PYTHONPATH=modules python3 main.py

+ +

To get help

+ +

PYTHONPATH=modules python3 main.py --help

+ +

Example of using options

+ +

--server=irc.bsnet.se --channel=#db-o-webb +--server=irc.bsnet.se --port=6667 --channel=#db-o-webb +--nick=marvin --ident=secret

+ +

Configuration

+ +

Check out the file 'marvin_config_default.json' on how to configure, instead +of using cli-options. The default configfile is 'marvin_config.json' but you +can change that using cli-options.

+ +

Make own actions

+ +

Check the file 'marvin_strings.json' for the file where most of the strings +are defined and check out 'marvin_actions.py' to see how to write your own +actions. Its just a small function.

+ +

Read from incoming

+ +

Marvin reads messages from the incoming/ directory, if it exists, and writes +it out the the irc channel.

+
+ + + + + +
  1#! /usr/bin/env python3
+  2# -*- coding: utf-8 -*-
+  3
+  4"""
+  5An IRC bot that answers random questions, keeps a log from the IRC-chat,
+  6easy to integrate in a webpage and montores a phpBB forum for latest topics
+  7by loggin in to the forum and checking the RSS-feed.
+  8
+  9You need to install additional modules.
+ 10
+ 11# Install needed modules in local directory
+ 12pip3 install --target modules/ feedparser beautifulsoup4 chardet
+ 13
+ 14Modules in modules/ will be loaded automatically. If you want to use a
+ 15different directory you can start the program like this instead:
+ 16
+ 17PYTHONPATH=modules python3 main.py
+ 18
+ 19# To get help
+ 20PYTHONPATH=modules python3 main.py --help
+ 21
+ 22# Example of using options
+ 23--server=irc.bsnet.se --channel=#db-o-webb
+ 24--server=irc.bsnet.se --port=6667 --channel=#db-o-webb
+ 25--nick=marvin --ident=secret
+ 26
+ 27# Configuration
+ 28Check out the file 'marvin_config_default.json' on how to configure, instead
+ 29of using cli-options. The default configfile is 'marvin_config.json' but you
+ 30can change that using cli-options.
+ 31
+ 32# Make own actions
+ 33Check the file 'marvin_strings.json' for the file where most of the strings
+ 34are defined and check out 'marvin_actions.py' to see how to write your own
+ 35actions. Its just a small function.
+ 36
+ 37# Read from incoming
+ 38Marvin reads messages from the incoming/ directory, if it exists, and writes
+ 39it out the the irc channel.
+ 40"""
+ 41
+ 42import argparse
+ 43import json
+ 44import os
+ 45import sys
+ 46
+ 47from discord_bot import DiscordBot
+ 48from irc_bot import IrcBot
+ 49
+ 50import marvin_actions
+ 51import marvin_general_actions
+ 52
+ 53#
+ 54# General stuff about this program
+ 55#
+ 56PROGRAM = "marvin"
+ 57AUTHOR = "Mikael Roos"
+ 58EMAIL = "mikael.t.h.roos@gmail.com"
+ 59VERSION = "0.3.0"
+ 60MSG_VERSION = "{program} version {version}.".format(program=PROGRAM, version=VERSION)
+ 61
+ 62
+ 63
+ 64def printVersion():
+ 65    """
+ 66    Print version information and exit.
+ 67    """
+ 68    print(MSG_VERSION)
+ 69    sys.exit(0)
+ 70
+ 71
+ 72def mergeOptionsWithConfigFile(options, configFile):
+ 73    """
+ 74    Read information from config file.
+ 75    """
+ 76    if os.path.isfile(configFile):
+ 77        with open(configFile, encoding="UTF-8") as f:
+ 78            data = json.load(f)
+ 79
+ 80        options.update(data)
+ 81        res = json.dumps(options, sort_keys=True, indent=4, separators=(',', ': '))
+ 82
+ 83        msg = "Read configuration from config file '{file}'. Current configuration is:\n{config}"
+ 84        print(msg.format(config=res, file=configFile))
+ 85
+ 86    else:
+ 87        print("Config file '{file}' is not readable, skipping.".format(file=configFile))
+ 88
+ 89    return options
+ 90
+ 91
+ 92def parseOptions(options):
+ 93    """
+ 94    Merge default options with incoming options and arguments and return them as a dictionary.
+ 95    """
+ 96
+ 97    parser = argparse.ArgumentParser()
+ 98    parser.add_argument("protocol", choices=["irc", "discord"], nargs="?", default="irc")
+ 99    parser.add_argument("-v", "--version", action="store_true")
+100    parser.add_argument("--config")
+101
+102    for key, value in options.items():
+103        parser.add_argument(f"--{key}", type=type(value))
+104
+105    args = vars(parser.parse_args())
+106    if args["version"]:
+107        printVersion()
+108    if args["config"]:
+109        mergeOptionsWithConfigFile(options, args["config"])
+110
+111    for parameter in options:
+112        if args[parameter]:
+113            options[parameter] = args[parameter]
+114
+115    res = json.dumps(options, sort_keys=True, indent=4, separators=(',', ': '))
+116    print("Configuration updated after cli options:\n{config}".format(config=res))
+117
+118    return options
+119
+120
+121def determineProtocol():
+122    """Parse the argument to determine what protocol to use"""
+123    parser = argparse.ArgumentParser()
+124    parser.add_argument("protocol", choices=["irc", "discord"], nargs="?", default="irc")
+125    arg, _ = parser.parse_known_args()
+126    return arg.protocol
+127
+128
+129def createBot(protocol):
+130    """Return an instance of a bot with the requested implementation"""
+131    if protocol == "irc":
+132        return IrcBot()
+133    if protocol == "discord":
+134        return DiscordBot()
+135    raise ValueError(f"Unsupported protocol: {protocol}")
+136
+137
+138def main():
+139    """
+140    Main function to carry out the work.
+141    """
+142    protocol = determineProtocol()
+143    bot = createBot(protocol)
+144    options = bot.getConfig()
+145    options.update(mergeOptionsWithConfigFile(options, "marvin_config.json"))
+146    config = parseOptions(options)
+147    bot.setConfig(config)
+148    marvin_actions.setConfig(options)
+149    marvin_general_actions.setConfig(options)
+150    actions = marvin_actions.getAllActions()
+151    general_actions = marvin_general_actions.getAllGeneralActions()
+152    bot.registerActions(actions)
+153    bot.registerGeneralActions(general_actions)
+154    bot.begin()
+155
+156    sys.exit(0)
+157
+158
+159if __name__ == "__main__":
+160    main()
+
+ + +
+
+
+ PROGRAM = +'marvin' + + +
+ + + + +
+
+
+ AUTHOR = +'Mikael Roos' + + +
+ + + + +
+
+
+ EMAIL = +'mikael.t.h.roos@gmail.com' + + +
+ + + + +
+
+
+ VERSION = +'0.3.0' + + +
+ + + + +
+
+
+ MSG_VERSION = +'marvin version 0.3.0.' + + +
+ + + + +
+
+ +
+ + def + printVersion(): + + + +
+ +
65def printVersion():
+66    """
+67    Print version information and exit.
+68    """
+69    print(MSG_VERSION)
+70    sys.exit(0)
+
+ + +

Print version information and exit.

+
+ + +
+
+ +
+ + def + mergeOptionsWithConfigFile(options, configFile): + + + +
+ +
73def mergeOptionsWithConfigFile(options, configFile):
+74    """
+75    Read information from config file.
+76    """
+77    if os.path.isfile(configFile):
+78        with open(configFile, encoding="UTF-8") as f:
+79            data = json.load(f)
+80
+81        options.update(data)
+82        res = json.dumps(options, sort_keys=True, indent=4, separators=(',', ': '))
+83
+84        msg = "Read configuration from config file '{file}'. Current configuration is:\n{config}"
+85        print(msg.format(config=res, file=configFile))
+86
+87    else:
+88        print("Config file '{file}' is not readable, skipping.".format(file=configFile))
+89
+90    return options
+
+ + +

Read information from config file.

+
+ + +
+
+ +
+ + def + parseOptions(options): + + + +
+ +
 93def parseOptions(options):
+ 94    """
+ 95    Merge default options with incoming options and arguments and return them as a dictionary.
+ 96    """
+ 97
+ 98    parser = argparse.ArgumentParser()
+ 99    parser.add_argument("protocol", choices=["irc", "discord"], nargs="?", default="irc")
+100    parser.add_argument("-v", "--version", action="store_true")
+101    parser.add_argument("--config")
+102
+103    for key, value in options.items():
+104        parser.add_argument(f"--{key}", type=type(value))
+105
+106    args = vars(parser.parse_args())
+107    if args["version"]:
+108        printVersion()
+109    if args["config"]:
+110        mergeOptionsWithConfigFile(options, args["config"])
+111
+112    for parameter in options:
+113        if args[parameter]:
+114            options[parameter] = args[parameter]
+115
+116    res = json.dumps(options, sort_keys=True, indent=4, separators=(',', ': '))
+117    print("Configuration updated after cli options:\n{config}".format(config=res))
+118
+119    return options
+
+ + +

Merge default options with incoming options and arguments and return them as a dictionary.

+
+ + +
+
+ +
+ + def + determineProtocol(): + + + +
+ +
122def determineProtocol():
+123    """Parse the argument to determine what protocol to use"""
+124    parser = argparse.ArgumentParser()
+125    parser.add_argument("protocol", choices=["irc", "discord"], nargs="?", default="irc")
+126    arg, _ = parser.parse_known_args()
+127    return arg.protocol
+
+ + +

Parse the argument to determine what protocol to use

+
+ + +
+
+ +
+ + def + createBot(protocol): + + + +
+ +
130def createBot(protocol):
+131    """Return an instance of a bot with the requested implementation"""
+132    if protocol == "irc":
+133        return IrcBot()
+134    if protocol == "discord":
+135        return DiscordBot()
+136    raise ValueError(f"Unsupported protocol: {protocol}")
+
+ + +

Return an instance of a bot with the requested implementation

+
+ + +
+
+ +
+ + def + main(): + + + +
+ +
139def main():
+140    """
+141    Main function to carry out the work.
+142    """
+143    protocol = determineProtocol()
+144    bot = createBot(protocol)
+145    options = bot.getConfig()
+146    options.update(mergeOptionsWithConfigFile(options, "marvin_config.json"))
+147    config = parseOptions(options)
+148    bot.setConfig(config)
+149    marvin_actions.setConfig(options)
+150    marvin_general_actions.setConfig(options)
+151    actions = marvin_actions.getAllActions()
+152    general_actions = marvin_general_actions.getAllGeneralActions()
+153    bot.registerActions(actions)
+154    bot.registerGeneralActions(general_actions)
+155    bot.begin()
+156
+157    sys.exit(0)
+
+ + +

Main function to carry out the work.

+
+ + +
+
+ + \ No newline at end of file diff --git a/docs/pdoc/marvin_actions.html b/docs/pdoc/marvin_actions.html new file mode 100644 index 0000000..85fdf98 --- /dev/null +++ b/docs/pdoc/marvin_actions.html @@ -0,0 +1,2115 @@ + + + + + + + marvin_actions API documentation + + + + + + + + + +
+
+

+marvin_actions

+ +

Make actions for Marvin, one function for each action.

+
+ + + + + +
  1#! /usr/bin/env python3
+  2# -*- coding: utf-8 -*-
+  3
+  4"""
+  5Make actions for Marvin, one function for each action.
+  6"""
+  7from urllib.parse import quote_plus
+  8from urllib.request import urlopen
+  9import calendar
+ 10import datetime
+ 11import json
+ 12import random
+ 13import requests
+ 14
+ 15from bs4 import BeautifulSoup
+ 16
+ 17
+ 18def getAllActions():
+ 19    """
+ 20    Return all actions in an array.
+ 21    """
+ 22    return [
+ 23        marvinExplainShell,
+ 24        marvinGoogle,
+ 25        marvinLunch,
+ 26        marvinVideoOfToday,
+ 27        marvinWhoIs,
+ 28        marvinHelp,
+ 29        marvinSource,
+ 30        marvinBudord,
+ 31        marvinQuote,
+ 32        marvinStats,
+ 33        marvinIrcLog,
+ 34        marvinListen,
+ 35        marvinWeather,
+ 36        marvinSun,
+ 37        marvinSayHi,
+ 38        marvinSmile,
+ 39        marvinStrip,
+ 40        marvinTimeToBBQ,
+ 41        marvinBirthday,
+ 42        marvinNameday,
+ 43        marvinUptime,
+ 44        marvinStream,
+ 45        marvinPrinciple,
+ 46        marvinJoke,
+ 47        marvinCommit
+ 48    ]
+ 49
+ 50
+ 51# Load all strings from file
+ 52with open("marvin_strings.json", encoding="utf-8") as f:
+ 53    STRINGS = json.load(f)
+ 54
+ 55# Configuration loaded
+ 56CONFIG = None
+ 57
+ 58def setConfig(config):
+ 59    """
+ 60    Keep reference to the loaded configuration.
+ 61    """
+ 62    global CONFIG
+ 63    CONFIG = config
+ 64
+ 65
+ 66def getString(key, key1=None):
+ 67    """
+ 68    Get a string from the string database.
+ 69    """
+ 70    data = STRINGS[key]
+ 71    if isinstance(data, list):
+ 72        res = data[random.randint(0, len(data) - 1)]
+ 73    elif isinstance(data, dict):
+ 74        if key1 is None:
+ 75            res = data
+ 76        else:
+ 77            res = data[key1]
+ 78            if isinstance(res, list):
+ 79                res = res[random.randint(0, len(res) - 1)]
+ 80    elif isinstance(data, str):
+ 81        res = data
+ 82
+ 83    return res
+ 84
+ 85
+ 86def marvinSmile(row):
+ 87    """
+ 88    Make Marvin smile.
+ 89    """
+ 90    msg = None
+ 91    if any(r in row for r in ["smile", "le", "skratta", "smilies"]):
+ 92        smilie = getString("smile")
+ 93        msg = "{SMILE}".format(SMILE=smilie)
+ 94    return msg
+ 95
+ 96
+ 97def wordsAfterKeyWords(words, keyWords):
+ 98    """
+ 99    Return all items in the words list after the first occurence
+100    of an item in the keyWords list.
+101    """
+102    kwIndex = []
+103    for kw in keyWords:
+104        if kw in words:
+105            kwIndex.append(words.index(kw))
+106
+107    if not kwIndex:
+108        return None
+109
+110    return words[min(kwIndex)+1:]
+111
+112
+113def marvinGoogle(row):
+114    """
+115    Let Marvin present an url to google.
+116    """
+117    query = wordsAfterKeyWords(row, ["google", "googla"])
+118    if not query:
+119        return None
+120
+121    searchStr = " ".join(query)
+122    url = "https://www.google.se/search?q="
+123    url += quote_plus(searchStr)
+124    msg = getString("google")
+125    return msg.format(url)
+126
+127
+128def marvinExplainShell(row):
+129    """
+130    Let Marvin present an url to the service explain shell to
+131    explain a shell command.
+132    """
+133    query = wordsAfterKeyWords(row, ["explain", "förklara"])
+134    if not query:
+135        return None
+136    cmd = " ".join(query)
+137    url = "http://explainshell.com/explain?cmd="
+138    url += quote_plus(cmd, "/:")
+139    msg = getString("explainShell")
+140    return msg.format(url)
+141
+142
+143def marvinSource(row):
+144    """
+145    State message about sourcecode.
+146    """
+147    msg = None
+148    if any(r in row for r in ["källkod", "source"]):
+149        msg = getString("source")
+150
+151    return msg
+152
+153
+154def marvinBudord(row):
+155    """
+156    What are the budord for Marvin?
+157    """
+158    msg = None
+159    if any(r in row for r in ["budord", "stentavla"]):
+160        if any(r in row for r in ["#1", "1"]):
+161            msg = getString("budord", "#1")
+162        elif any(r in row for r in ["#2", "2"]):
+163            msg = getString("budord", "#2")
+164        elif any(r in row for r in ["#3", "3"]):
+165            msg = getString("budord", "#3")
+166        elif any(r in row for r in ["#4", "4"]):
+167            msg = getString("budord", "#4")
+168        elif any(r in row for r in ["#5", "5"]):
+169            msg = getString("budord", "#5")
+170
+171    return msg
+172
+173
+174def marvinQuote(row):
+175    """
+176    Make a quote.
+177    """
+178    msg = None
+179    if any(r in row for r in ["quote", "citat", "filosofi", "filosofera"]):
+180        msg = getString("hitchhiker")
+181
+182    return msg
+183
+184
+185def videoOfToday():
+186    """
+187    Check what day it is and provide a url to a suitable video together with a greeting.
+188    """
+189    dayNum = datetime.date.weekday(datetime.date.today()) + 1
+190    msg = getString("weekdays", str(dayNum))
+191    video = getString("video-of-today", str(dayNum))
+192
+193    if video:
+194        msg += " En passande video är " + video
+195    else:
+196        msg += " Jag har ännu ingen passande video för denna dagen."
+197
+198    return msg
+199
+200
+201def marvinVideoOfToday(row):
+202    """
+203    Show the video of today.
+204    """
+205    msg = None
+206    if any(r in row for r in ["idag", "dagens"]):
+207        if any(r in row for r in ["video", "youtube", "tube"]):
+208            msg = videoOfToday()
+209
+210    return msg
+211
+212
+213def marvinWhoIs(row):
+214    """
+215    Who is Marvin.
+216    """
+217    msg = None
+218    if all(r in row for r in ["vem", "är"]):
+219        msg = getString("whois")
+220
+221    return msg
+222
+223
+224def marvinHelp(row):
+225    """
+226    Provide a menu.
+227    """
+228    msg = None
+229    if any(r in row for r in ["hjälp", "help", "menu", "meny"]):
+230        msg = getString("menu")
+231
+232    return msg
+233
+234
+235def marvinStats(row):
+236    """
+237    Provide a link to the stats.
+238    """
+239    msg = None
+240    if any(r in row for r in ["stats", "statistik", "ircstats"]):
+241        msg = getString("ircstats")
+242
+243    return msg
+244
+245
+246def marvinIrcLog(row):
+247    """
+248    Provide a link to the irclog
+249    """
+250    msg = None
+251    if any(r in row for r in ["irc", "irclog", "log", "irclogg", "logg", "historik"]):
+252        msg = getString("irclog")
+253
+254    return msg
+255
+256
+257def marvinSayHi(row):
+258    """
+259    Say hi with a nice message.
+260    """
+261    msg = None
+262    if any(r in row for r in [
+263            "snälla", "hej", "tjena", "morsning", "morrn", "mår", "hallå",
+264            "halloj", "läget", "snäll", "duktig", "träna", "träning",
+265            "utbildning", "tack", "tacka", "tackar", "tacksam"
+266    ]):
+267        smile = getString("smile")
+268        hello = getString("hello")
+269        friendly = getString("friendly")
+270        msg = "{} {} {}".format(smile, hello, friendly)
+271
+272    return msg
+273
+274
+275def marvinLunch(row):
+276    """
+277    Help decide where to eat.
+278    """
+279    lunchOptions = {
+280        'stan centrum karlskrona kna': 'lunch-karlskrona',
+281        'ängelholm angelholm engelholm': 'lunch-angelholm',
+282        'hässleholm hassleholm': 'lunch-hassleholm',
+283        'malmö malmo malmoe': 'lunch-malmo',
+284        'göteborg goteborg gbg': 'lunch-goteborg'
+285    }
+286
+287    if any(r in row for r in ["lunch", "mat", "äta", "luncha"]):
+288        lunchStr = getString('lunch-message')
+289
+290        for keys, value in lunchOptions.items():
+291            if any(r in row for r in keys.split(" ")):
+292                return lunchStr.format(getString(value))
+293
+294        return lunchStr.format(getString('lunch-bth'))
+295
+296    return None
+297
+298
+299def marvinListen(row):
+300    """
+301    Return music last listened to.
+302    """
+303    msg = None
+304    if any(r in row for r in ["lyssna", "lyssnar", "musik"]):
+305
+306        if not CONFIG["lastfm"]:
+307            return getString("listen", "disabled")
+308
+309        url = "http://ws.audioscrobbler.com/2.0/"
+310
+311        try:
+312            params = dict(
+313                method="user.getrecenttracks",
+314                user=CONFIG["lastfm"]["user"],
+315                api_key=CONFIG["lastfm"]["apikey"],
+316                format="json",
+317                limit="1"
+318            )
+319
+320            resp = requests.get(url=url, params=params, timeout=5)
+321            data = json.loads(resp.text)
+322
+323            artist = data["recenttracks"]["track"][0]["artist"]["#text"]
+324            title = data["recenttracks"]["track"][0]["name"]
+325            link = data["recenttracks"]["track"][0]["url"]
+326
+327            msg = getString("listen", "success").format(artist=artist, title=title, link=link)
+328
+329        except Exception:
+330            msg = getString("listen", "failed")
+331
+332    return msg
+333
+334
+335def marvinSun(row):
+336    """
+337    Check when the sun goes up and down.
+338    """
+339    msg = None
+340    if any(r in row for r in ["sol", "solen", "solnedgång", "soluppgång"]):
+341        try:
+342            soup = BeautifulSoup(urlopen('http://www.timeanddate.com/sun/sweden/jonkoping'))
+343            spans = soup.find_all("span", {"class": "three"})
+344            sunrise = spans[0].text
+345            sunset = spans[1].text
+346            msg = getString("sun").format(sunrise, sunset)
+347
+348        except Exception:
+349            msg = getString("sun-no")
+350
+351    return msg
+352
+353
+354def marvinWeather(row):
+355    """
+356    Check what the weather prognosis looks like.
+357    """
+358    msg = None
+359    if any(r in row for r in ["väder", "vädret", "prognos", "prognosen", "smhi"]):
+360        url = getString("smhi", "url")
+361        try:
+362            soup = BeautifulSoup(urlopen(url))
+363            msg = "{}. {}. {}".format(
+364                soup.h1.text,
+365                soup.h4.text,
+366                soup.h4.findNextSibling("p").text
+367            )
+368
+369        except Exception:
+370            msg = getString("smhi", "failed")
+371
+372    return msg
+373
+374
+375def marvinStrip(row):
+376    """
+377    Get a comic strip.
+378    """
+379    msg = None
+380    if any(r in row for r in ["strip", "comic", "nöje", "paus"]):
+381        msg = commitStrip(randomize=any(r in row for r in ["rand", "random", "slump", "lucky"]))
+382    return msg
+383
+384
+385def commitStrip(randomize=False):
+386    """
+387    Latest or random comic strip from CommitStrip.
+388    """
+389    msg = getString("commitstrip", "message")
+390
+391    if randomize:
+392        first = getString("commitstrip", "first")
+393        last = getString("commitstrip", "last")
+394        rand = random.randint(first, last)
+395        url = getString("commitstrip", "urlPage") + str(rand)
+396    else:
+397        url = getString("commitstrip", "url")
+398
+399    return msg.format(url=url)
+400
+401
+402def marvinTimeToBBQ(row):
+403    """
+404    Calcuate the time to next barbecue and print a appropriate msg
+405    """
+406    msg = None
+407    if any(r in row for r in ["grilla", "grill", "grillcon", "bbq"]):
+408        url = getString("barbecue", "url")
+409        nextDate = nextBBQ()
+410        today = datetime.date.today()
+411        daysRemaining = (nextDate - today).days
+412
+413        if daysRemaining == 0:
+414            msg = getString("barbecue", "today")
+415        elif daysRemaining == 1:
+416            msg = getString("barbecue", "tomorrow")
+417        elif 1 < daysRemaining < 14:
+418            msg = getString("barbecue", "week") % nextDate
+419        elif 14 < daysRemaining < 200:
+420            msg = getString("barbecue", "base") % nextDate
+421        else:
+422            msg = getString("barbecue", "eternity") % nextDate
+423
+424        msg = url + ". " + msg
+425    return msg
+426
+427def nextBBQ():
+428    """
+429    Calculate the next grillcon date after today
+430    """
+431
+432    MAY = 5
+433    SEPTEMBER = 9
+434
+435    after = datetime.date.today()
+436    spring = thirdFridayIn(after.year, MAY)
+437    if after <= spring:
+438        return spring
+439
+440    autumn = thirdFridayIn(after.year, SEPTEMBER)
+441    if after <= autumn:
+442        return autumn
+443
+444    return thirdFridayIn(after.year + 1, MAY)
+445
+446
+447def thirdFridayIn(y, m):
+448    """
+449    Get the third Friday in a given month and year
+450    """
+451    THIRD = 2
+452    FRIDAY = -1
+453
+454    # Start the weeks on saturday to prevent fridays from previous month
+455    cal = calendar.Calendar(firstweekday=calendar.SATURDAY)
+456
+457    # Return the friday in the third week
+458    return cal.monthdatescalendar(y, m)[THIRD][FRIDAY]
+459
+460
+461def marvinBirthday(row):
+462    """
+463    Check birthday info
+464    """
+465    msg = None
+466    if any(r in row for r in ["birthday", "födelsedag"]):
+467        try:
+468            url = getString("birthday", "url")
+469            soup = BeautifulSoup(urlopen(url), "html.parser")
+470            my_list = list()
+471
+472            for ana in soup.findAll('a'):
+473                if ana.parent.name == 'strong':
+474                    my_list.append(ana.getText())
+475
+476            my_list.pop()
+477            my_strings = ', '.join(my_list)
+478            if not my_strings:
+479                msg = getString("birthday", "nobody")
+480            else:
+481                msg = getString("birthday", "somebody").format(my_strings)
+482
+483        except Exception:
+484            msg = getString("birthday", "error")
+485
+486    return msg
+487
+488def marvinNameday(row):
+489    """
+490    Check current nameday
+491    """
+492    msg = None
+493    if any(r in row for r in ["nameday", "namnsdag"]):
+494        try:
+495            now = datetime.datetime.now()
+496            raw_url = "http://api.dryg.net/dagar/v2.1/{year}/{month}/{day}"
+497            url = raw_url.format(year=now.year, month=now.month, day=now.day)
+498            r = requests.get(url, timeout=5)
+499            nameday_data = r.json()
+500            names = nameday_data["dagar"][0]["namnsdag"]
+501            if names:
+502                msg = getString("nameday", "somebody").format(",".join(names))
+503            else:
+504                msg = getString("nameday", "nobody")
+505        except Exception:
+506            msg = getString("nameday", "error")
+507    return msg
+508
+509def marvinUptime(row):
+510    """
+511    Display info about uptime tournament
+512    """
+513    msg = None
+514    if "uptime" in row:
+515        msg = getString("uptime", "info")
+516    return msg
+517
+518def marvinStream(row):
+519    """
+520    Display info about stream
+521    """
+522    msg = None
+523    if any(r in row for r in ["stream", "streama", "ström", "strömma"]):
+524        msg = getString("stream", "info")
+525    return msg
+526
+527def marvinPrinciple(row):
+528    """
+529    Display one selected software principle, or provide one as random
+530    """
+531    msg = None
+532    if any(r in row for r in ["principle", "princip", "principer"]):
+533        principles = getString("principle")
+534        principleKeys = list(principles.keys())
+535        matchedKeys = [k for k in row if k in principleKeys]
+536        if matchedKeys:
+537            msg = principles[matchedKeys.pop()]
+538        else:
+539            msg = principles[random.choice(principleKeys)]
+540    return msg
+541
+542def getJoke():
+543    """
+544    Retrieves joke from api.chucknorris.io/jokes/random?category=dev
+545    """
+546    try:
+547        url = getString("joke", "url")
+548        r = requests.get(url, timeout=5)
+549        joke_data = r.json()
+550        return joke_data["value"]
+551    except Exception:
+552        return getString("joke", "error")
+553
+554def marvinJoke(row):
+555    """
+556    Display a random Chuck Norris joke
+557    """
+558    msg = None
+559    if any(r in row for r in ["joke", "skämt", "chuck norris", "chuck", "norris"]):
+560        msg = getJoke()
+561    return msg
+562
+563def getCommit():
+564    """
+565    Retrieves random commit message from whatthecommit.com/index.html
+566    """
+567    try:
+568        url = getString("commit", "url")
+569        r = requests.get(url, timeout=5)
+570        res = r.text.strip()
+571        return res
+572    except Exception:
+573        return getString("commit", "error")
+574
+575def marvinCommit(row):
+576    """
+577    Display a random commit message
+578    """
+579    msg = None
+580    if any(r in row for r in ["commit", "-m"]):
+581        commitMsg = getCommit()
+582        msg = "Använd detta meddelandet: '{}'".format(commitMsg)
+583    return msg
+
+ + +
+
+ +
+ + def + getAllActions(): + + + +
+ +
19def getAllActions():
+20    """
+21    Return all actions in an array.
+22    """
+23    return [
+24        marvinExplainShell,
+25        marvinGoogle,
+26        marvinLunch,
+27        marvinVideoOfToday,
+28        marvinWhoIs,
+29        marvinHelp,
+30        marvinSource,
+31        marvinBudord,
+32        marvinQuote,
+33        marvinStats,
+34        marvinIrcLog,
+35        marvinListen,
+36        marvinWeather,
+37        marvinSun,
+38        marvinSayHi,
+39        marvinSmile,
+40        marvinStrip,
+41        marvinTimeToBBQ,
+42        marvinBirthday,
+43        marvinNameday,
+44        marvinUptime,
+45        marvinStream,
+46        marvinPrinciple,
+47        marvinJoke,
+48        marvinCommit
+49    ]
+
+ + +

Return all actions in an array.

+
+ + +
+
+
+ CONFIG = +None + + +
+ + + + +
+
+ +
+ + def + setConfig(config): + + + +
+ +
59def setConfig(config):
+60    """
+61    Keep reference to the loaded configuration.
+62    """
+63    global CONFIG
+64    CONFIG = config
+
+ + +

Keep reference to the loaded configuration.

+
+ + +
+
+ +
+ + def + getString(key, key1=None): + + + +
+ +
67def getString(key, key1=None):
+68    """
+69    Get a string from the string database.
+70    """
+71    data = STRINGS[key]
+72    if isinstance(data, list):
+73        res = data[random.randint(0, len(data) - 1)]
+74    elif isinstance(data, dict):
+75        if key1 is None:
+76            res = data
+77        else:
+78            res = data[key1]
+79            if isinstance(res, list):
+80                res = res[random.randint(0, len(res) - 1)]
+81    elif isinstance(data, str):
+82        res = data
+83
+84    return res
+
+ + +

Get a string from the string database.

+
+ + +
+
+ +
+ + def + marvinSmile(row): + + + +
+ +
87def marvinSmile(row):
+88    """
+89    Make Marvin smile.
+90    """
+91    msg = None
+92    if any(r in row for r in ["smile", "le", "skratta", "smilies"]):
+93        smilie = getString("smile")
+94        msg = "{SMILE}".format(SMILE=smilie)
+95    return msg
+
+ + +

Make Marvin smile.

+
+ + +
+
+ +
+ + def + wordsAfterKeyWords(words, keyWords): + + + +
+ +
 98def wordsAfterKeyWords(words, keyWords):
+ 99    """
+100    Return all items in the words list after the first occurence
+101    of an item in the keyWords list.
+102    """
+103    kwIndex = []
+104    for kw in keyWords:
+105        if kw in words:
+106            kwIndex.append(words.index(kw))
+107
+108    if not kwIndex:
+109        return None
+110
+111    return words[min(kwIndex)+1:]
+
+ + +

Return all items in the words list after the first occurence +of an item in the keyWords list.

+
+ + +
+
+ +
+ + def + marvinGoogle(row): + + + +
+ +
114def marvinGoogle(row):
+115    """
+116    Let Marvin present an url to google.
+117    """
+118    query = wordsAfterKeyWords(row, ["google", "googla"])
+119    if not query:
+120        return None
+121
+122    searchStr = " ".join(query)
+123    url = "https://www.google.se/search?q="
+124    url += quote_plus(searchStr)
+125    msg = getString("google")
+126    return msg.format(url)
+
+ + +

Let Marvin present an url to google.

+
+ + +
+
+ +
+ + def + marvinExplainShell(row): + + + +
+ +
129def marvinExplainShell(row):
+130    """
+131    Let Marvin present an url to the service explain shell to
+132    explain a shell command.
+133    """
+134    query = wordsAfterKeyWords(row, ["explain", "förklara"])
+135    if not query:
+136        return None
+137    cmd = " ".join(query)
+138    url = "http://explainshell.com/explain?cmd="
+139    url += quote_plus(cmd, "/:")
+140    msg = getString("explainShell")
+141    return msg.format(url)
+
+ + +

Let Marvin present an url to the service explain shell to +explain a shell command.

+
+ + +
+
+ +
+ + def + marvinSource(row): + + + +
+ +
144def marvinSource(row):
+145    """
+146    State message about sourcecode.
+147    """
+148    msg = None
+149    if any(r in row for r in ["källkod", "source"]):
+150        msg = getString("source")
+151
+152    return msg
+
+ + +

State message about sourcecode.

+
+ + +
+
+ +
+ + def + marvinBudord(row): + + + +
+ +
155def marvinBudord(row):
+156    """
+157    What are the budord for Marvin?
+158    """
+159    msg = None
+160    if any(r in row for r in ["budord", "stentavla"]):
+161        if any(r in row for r in ["#1", "1"]):
+162            msg = getString("budord", "#1")
+163        elif any(r in row for r in ["#2", "2"]):
+164            msg = getString("budord", "#2")
+165        elif any(r in row for r in ["#3", "3"]):
+166            msg = getString("budord", "#3")
+167        elif any(r in row for r in ["#4", "4"]):
+168            msg = getString("budord", "#4")
+169        elif any(r in row for r in ["#5", "5"]):
+170            msg = getString("budord", "#5")
+171
+172    return msg
+
+ + +

What are the budord for Marvin?

+
+ + +
+
+ +
+ + def + marvinQuote(row): + + + +
+ +
175def marvinQuote(row):
+176    """
+177    Make a quote.
+178    """
+179    msg = None
+180    if any(r in row for r in ["quote", "citat", "filosofi", "filosofera"]):
+181        msg = getString("hitchhiker")
+182
+183    return msg
+
+ + +

Make a quote.

+
+ + +
+
+ +
+ + def + videoOfToday(): + + + +
+ +
186def videoOfToday():
+187    """
+188    Check what day it is and provide a url to a suitable video together with a greeting.
+189    """
+190    dayNum = datetime.date.weekday(datetime.date.today()) + 1
+191    msg = getString("weekdays", str(dayNum))
+192    video = getString("video-of-today", str(dayNum))
+193
+194    if video:
+195        msg += " En passande video är " + video
+196    else:
+197        msg += " Jag har ännu ingen passande video för denna dagen."
+198
+199    return msg
+
+ + +

Check what day it is and provide a url to a suitable video together with a greeting.

+
+ + +
+
+ +
+ + def + marvinVideoOfToday(row): + + + +
+ +
202def marvinVideoOfToday(row):
+203    """
+204    Show the video of today.
+205    """
+206    msg = None
+207    if any(r in row for r in ["idag", "dagens"]):
+208        if any(r in row for r in ["video", "youtube", "tube"]):
+209            msg = videoOfToday()
+210
+211    return msg
+
+ + +

Show the video of today.

+
+ + +
+
+ +
+ + def + marvinWhoIs(row): + + + +
+ +
214def marvinWhoIs(row):
+215    """
+216    Who is Marvin.
+217    """
+218    msg = None
+219    if all(r in row for r in ["vem", "är"]):
+220        msg = getString("whois")
+221
+222    return msg
+
+ + +

Who is Marvin.

+
+ + +
+
+ +
+ + def + marvinHelp(row): + + + +
+ +
225def marvinHelp(row):
+226    """
+227    Provide a menu.
+228    """
+229    msg = None
+230    if any(r in row for r in ["hjälp", "help", "menu", "meny"]):
+231        msg = getString("menu")
+232
+233    return msg
+
+ + +

Provide a menu.

+
+ + +
+
+ +
+ + def + marvinStats(row): + + + +
+ +
236def marvinStats(row):
+237    """
+238    Provide a link to the stats.
+239    """
+240    msg = None
+241    if any(r in row for r in ["stats", "statistik", "ircstats"]):
+242        msg = getString("ircstats")
+243
+244    return msg
+
+ + +

Provide a link to the stats.

+
+ + +
+
+ +
+ + def + marvinIrcLog(row): + + + +
+ +
247def marvinIrcLog(row):
+248    """
+249    Provide a link to the irclog
+250    """
+251    msg = None
+252    if any(r in row for r in ["irc", "irclog", "log", "irclogg", "logg", "historik"]):
+253        msg = getString("irclog")
+254
+255    return msg
+
+ + +

Provide a link to the irclog

+
+ + +
+
+ +
+ + def + marvinSayHi(row): + + + +
+ +
258def marvinSayHi(row):
+259    """
+260    Say hi with a nice message.
+261    """
+262    msg = None
+263    if any(r in row for r in [
+264            "snälla", "hej", "tjena", "morsning", "morrn", "mår", "hallå",
+265            "halloj", "läget", "snäll", "duktig", "träna", "träning",
+266            "utbildning", "tack", "tacka", "tackar", "tacksam"
+267    ]):
+268        smile = getString("smile")
+269        hello = getString("hello")
+270        friendly = getString("friendly")
+271        msg = "{} {} {}".format(smile, hello, friendly)
+272
+273    return msg
+
+ + +

Say hi with a nice message.

+
+ + +
+
+ +
+ + def + marvinLunch(row): + + + +
+ +
276def marvinLunch(row):
+277    """
+278    Help decide where to eat.
+279    """
+280    lunchOptions = {
+281        'stan centrum karlskrona kna': 'lunch-karlskrona',
+282        'ängelholm angelholm engelholm': 'lunch-angelholm',
+283        'hässleholm hassleholm': 'lunch-hassleholm',
+284        'malmö malmo malmoe': 'lunch-malmo',
+285        'göteborg goteborg gbg': 'lunch-goteborg'
+286    }
+287
+288    if any(r in row for r in ["lunch", "mat", "äta", "luncha"]):
+289        lunchStr = getString('lunch-message')
+290
+291        for keys, value in lunchOptions.items():
+292            if any(r in row for r in keys.split(" ")):
+293                return lunchStr.format(getString(value))
+294
+295        return lunchStr.format(getString('lunch-bth'))
+296
+297    return None
+
+ + +

Help decide where to eat.

+
+ + +
+
+ +
+ + def + marvinListen(row): + + + +
+ +
300def marvinListen(row):
+301    """
+302    Return music last listened to.
+303    """
+304    msg = None
+305    if any(r in row for r in ["lyssna", "lyssnar", "musik"]):
+306
+307        if not CONFIG["lastfm"]:
+308            return getString("listen", "disabled")
+309
+310        url = "http://ws.audioscrobbler.com/2.0/"
+311
+312        try:
+313            params = dict(
+314                method="user.getrecenttracks",
+315                user=CONFIG["lastfm"]["user"],
+316                api_key=CONFIG["lastfm"]["apikey"],
+317                format="json",
+318                limit="1"
+319            )
+320
+321            resp = requests.get(url=url, params=params, timeout=5)
+322            data = json.loads(resp.text)
+323
+324            artist = data["recenttracks"]["track"][0]["artist"]["#text"]
+325            title = data["recenttracks"]["track"][0]["name"]
+326            link = data["recenttracks"]["track"][0]["url"]
+327
+328            msg = getString("listen", "success").format(artist=artist, title=title, link=link)
+329
+330        except Exception:
+331            msg = getString("listen", "failed")
+332
+333    return msg
+
+ + +

Return music last listened to.

+
+ + +
+
+ +
+ + def + marvinSun(row): + + + +
+ +
336def marvinSun(row):
+337    """
+338    Check when the sun goes up and down.
+339    """
+340    msg = None
+341    if any(r in row for r in ["sol", "solen", "solnedgång", "soluppgång"]):
+342        try:
+343            soup = BeautifulSoup(urlopen('http://www.timeanddate.com/sun/sweden/jonkoping'))
+344            spans = soup.find_all("span", {"class": "three"})
+345            sunrise = spans[0].text
+346            sunset = spans[1].text
+347            msg = getString("sun").format(sunrise, sunset)
+348
+349        except Exception:
+350            msg = getString("sun-no")
+351
+352    return msg
+
+ + +

Check when the sun goes up and down.

+
+ + +
+
+ +
+ + def + marvinWeather(row): + + + +
+ +
355def marvinWeather(row):
+356    """
+357    Check what the weather prognosis looks like.
+358    """
+359    msg = None
+360    if any(r in row for r in ["väder", "vädret", "prognos", "prognosen", "smhi"]):
+361        url = getString("smhi", "url")
+362        try:
+363            soup = BeautifulSoup(urlopen(url))
+364            msg = "{}. {}. {}".format(
+365                soup.h1.text,
+366                soup.h4.text,
+367                soup.h4.findNextSibling("p").text
+368            )
+369
+370        except Exception:
+371            msg = getString("smhi", "failed")
+372
+373    return msg
+
+ + +

Check what the weather prognosis looks like.

+
+ + +
+
+ +
+ + def + marvinStrip(row): + + + +
+ +
376def marvinStrip(row):
+377    """
+378    Get a comic strip.
+379    """
+380    msg = None
+381    if any(r in row for r in ["strip", "comic", "nöje", "paus"]):
+382        msg = commitStrip(randomize=any(r in row for r in ["rand", "random", "slump", "lucky"]))
+383    return msg
+
+ + +

Get a comic strip.

+
+ + +
+
+ +
+ + def + commitStrip(randomize=False): + + + +
+ +
386def commitStrip(randomize=False):
+387    """
+388    Latest or random comic strip from CommitStrip.
+389    """
+390    msg = getString("commitstrip", "message")
+391
+392    if randomize:
+393        first = getString("commitstrip", "first")
+394        last = getString("commitstrip", "last")
+395        rand = random.randint(first, last)
+396        url = getString("commitstrip", "urlPage") + str(rand)
+397    else:
+398        url = getString("commitstrip", "url")
+399
+400    return msg.format(url=url)
+
+ + +

Latest or random comic strip from CommitStrip.

+
+ + +
+
+ +
+ + def + marvinTimeToBBQ(row): + + + +
+ +
403def marvinTimeToBBQ(row):
+404    """
+405    Calcuate the time to next barbecue and print a appropriate msg
+406    """
+407    msg = None
+408    if any(r in row for r in ["grilla", "grill", "grillcon", "bbq"]):
+409        url = getString("barbecue", "url")
+410        nextDate = nextBBQ()
+411        today = datetime.date.today()
+412        daysRemaining = (nextDate - today).days
+413
+414        if daysRemaining == 0:
+415            msg = getString("barbecue", "today")
+416        elif daysRemaining == 1:
+417            msg = getString("barbecue", "tomorrow")
+418        elif 1 < daysRemaining < 14:
+419            msg = getString("barbecue", "week") % nextDate
+420        elif 14 < daysRemaining < 200:
+421            msg = getString("barbecue", "base") % nextDate
+422        else:
+423            msg = getString("barbecue", "eternity") % nextDate
+424
+425        msg = url + ". " + msg
+426    return msg
+
+ + +

Calcuate the time to next barbecue and print a appropriate msg

+
+ + +
+
+ +
+ + def + nextBBQ(): + + + +
+ +
428def nextBBQ():
+429    """
+430    Calculate the next grillcon date after today
+431    """
+432
+433    MAY = 5
+434    SEPTEMBER = 9
+435
+436    after = datetime.date.today()
+437    spring = thirdFridayIn(after.year, MAY)
+438    if after <= spring:
+439        return spring
+440
+441    autumn = thirdFridayIn(after.year, SEPTEMBER)
+442    if after <= autumn:
+443        return autumn
+444
+445    return thirdFridayIn(after.year + 1, MAY)
+
+ + +

Calculate the next grillcon date after today

+
+ + +
+
+ +
+ + def + thirdFridayIn(y, m): + + + +
+ +
448def thirdFridayIn(y, m):
+449    """
+450    Get the third Friday in a given month and year
+451    """
+452    THIRD = 2
+453    FRIDAY = -1
+454
+455    # Start the weeks on saturday to prevent fridays from previous month
+456    cal = calendar.Calendar(firstweekday=calendar.SATURDAY)
+457
+458    # Return the friday in the third week
+459    return cal.monthdatescalendar(y, m)[THIRD][FRIDAY]
+
+ + +

Get the third Friday in a given month and year

+
+ + +
+
+ +
+ + def + marvinBirthday(row): + + + +
+ +
462def marvinBirthday(row):
+463    """
+464    Check birthday info
+465    """
+466    msg = None
+467    if any(r in row for r in ["birthday", "födelsedag"]):
+468        try:
+469            url = getString("birthday", "url")
+470            soup = BeautifulSoup(urlopen(url), "html.parser")
+471            my_list = list()
+472
+473            for ana in soup.findAll('a'):
+474                if ana.parent.name == 'strong':
+475                    my_list.append(ana.getText())
+476
+477            my_list.pop()
+478            my_strings = ', '.join(my_list)
+479            if not my_strings:
+480                msg = getString("birthday", "nobody")
+481            else:
+482                msg = getString("birthday", "somebody").format(my_strings)
+483
+484        except Exception:
+485            msg = getString("birthday", "error")
+486
+487    return msg
+
+ + +

Check birthday info

+
+ + +
+
+ +
+ + def + marvinNameday(row): + + + +
+ +
489def marvinNameday(row):
+490    """
+491    Check current nameday
+492    """
+493    msg = None
+494    if any(r in row for r in ["nameday", "namnsdag"]):
+495        try:
+496            now = datetime.datetime.now()
+497            raw_url = "http://api.dryg.net/dagar/v2.1/{year}/{month}/{day}"
+498            url = raw_url.format(year=now.year, month=now.month, day=now.day)
+499            r = requests.get(url, timeout=5)
+500            nameday_data = r.json()
+501            names = nameday_data["dagar"][0]["namnsdag"]
+502            if names:
+503                msg = getString("nameday", "somebody").format(",".join(names))
+504            else:
+505                msg = getString("nameday", "nobody")
+506        except Exception:
+507            msg = getString("nameday", "error")
+508    return msg
+
+ + +

Check current nameday

+
+ + +
+
+ +
+ + def + marvinUptime(row): + + + +
+ +
510def marvinUptime(row):
+511    """
+512    Display info about uptime tournament
+513    """
+514    msg = None
+515    if "uptime" in row:
+516        msg = getString("uptime", "info")
+517    return msg
+
+ + +

Display info about uptime tournament

+
+ + +
+
+ +
+ + def + marvinStream(row): + + + +
+ +
519def marvinStream(row):
+520    """
+521    Display info about stream
+522    """
+523    msg = None
+524    if any(r in row for r in ["stream", "streama", "ström", "strömma"]):
+525        msg = getString("stream", "info")
+526    return msg
+
+ + +

Display info about stream

+
+ + +
+
+ +
+ + def + marvinPrinciple(row): + + + +
+ +
528def marvinPrinciple(row):
+529    """
+530    Display one selected software principle, or provide one as random
+531    """
+532    msg = None
+533    if any(r in row for r in ["principle", "princip", "principer"]):
+534        principles = getString("principle")
+535        principleKeys = list(principles.keys())
+536        matchedKeys = [k for k in row if k in principleKeys]
+537        if matchedKeys:
+538            msg = principles[matchedKeys.pop()]
+539        else:
+540            msg = principles[random.choice(principleKeys)]
+541    return msg
+
+ + +

Display one selected software principle, or provide one as random

+
+ + +
+
+ +
+ + def + getJoke(): + + + +
+ +
543def getJoke():
+544    """
+545    Retrieves joke from api.chucknorris.io/jokes/random?category=dev
+546    """
+547    try:
+548        url = getString("joke", "url")
+549        r = requests.get(url, timeout=5)
+550        joke_data = r.json()
+551        return joke_data["value"]
+552    except Exception:
+553        return getString("joke", "error")
+
+ + +

Retrieves joke from api.chucknorris.io/jokes/random?category=dev

+
+ + +
+
+ +
+ + def + marvinJoke(row): + + + +
+ +
555def marvinJoke(row):
+556    """
+557    Display a random Chuck Norris joke
+558    """
+559    msg = None
+560    if any(r in row for r in ["joke", "skämt", "chuck norris", "chuck", "norris"]):
+561        msg = getJoke()
+562    return msg
+
+ + +

Display a random Chuck Norris joke

+
+ + +
+
+ +
+ + def + getCommit(): + + + +
+ +
564def getCommit():
+565    """
+566    Retrieves random commit message from whatthecommit.com/index.html
+567    """
+568    try:
+569        url = getString("commit", "url")
+570        r = requests.get(url, timeout=5)
+571        res = r.text.strip()
+572        return res
+573    except Exception:
+574        return getString("commit", "error")
+
+ + +

Retrieves random commit message from whatthecommit.com/index.html

+
+ + +
+
+ +
+ + def + marvinCommit(row): + + + +
+ +
576def marvinCommit(row):
+577    """
+578    Display a random commit message
+579    """
+580    msg = None
+581    if any(r in row for r in ["commit", "-m"]):
+582        commitMsg = getCommit()
+583        msg = "Använd detta meddelandet: '{}'".format(commitMsg)
+584    return msg
+
+ + +

Display a random commit message

+
+ + +
+
+ + \ No newline at end of file diff --git a/docs/pdoc/marvin_general_actions.html b/docs/pdoc/marvin_general_actions.html new file mode 100644 index 0000000..ca0911b --- /dev/null +++ b/docs/pdoc/marvin_general_actions.html @@ -0,0 +1,508 @@ + + + + + + + marvin_general_actions API documentation + + + + + + + + + +
+
+

+marvin_general_actions

+ +

Make general actions for Marvin, one function for each action.

+
+ + + + + +
 1#! /usr/bin/env python3
+ 2# -*- coding: utf-8 -*-
+ 3
+ 4"""
+ 5Make general actions for Marvin, one function for each action.
+ 6"""
+ 7import datetime
+ 8import json
+ 9import random
+10
+11# Load all strings from file
+12with open("marvin_strings.json", encoding="utf-8") as f:
+13    STRINGS = json.load(f)
+14
+15# Configuration loaded
+16CONFIG = None
+17
+18lastDateGreeted = None
+19
+20def setConfig(config):
+21    """
+22    Keep reference to the loaded configuration.
+23    """
+24    global CONFIG
+25    CONFIG = config
+26
+27
+28def getString(key, key1=None):
+29    """
+30    Get a string from the string database.
+31    """
+32    data = STRINGS[key]
+33    if isinstance(data, list):
+34        res = data[random.randint(0, len(data) - 1)]
+35    elif isinstance(data, dict):
+36        if key1 is None:
+37            res = data
+38        else:
+39            res = data[key1]
+40            if isinstance(res, list):
+41                res = res[random.randint(0, len(res) - 1)]
+42    elif isinstance(data, str):
+43        res = data
+44
+45    return res
+46
+47
+48def getAllGeneralActions():
+49    """
+50    Return all general actions as an array.
+51    """
+52    return [
+53        marvinMorning
+54    ]
+55
+56
+57def marvinMorning(row):
+58    """
+59    Marvin says Good morning after someone else says it
+60    """
+61    msg = None
+62    phrases = [
+63        "morgon",
+64        "godmorgon",
+65        "god morgon",
+66        "morrn",
+67        "morn"
+68    ]
+69
+70    morning_phrases = [
+71        "Godmorgon! :-)",
+72        "Morgon allesammans",
+73        "Morgon gott folk",
+74        "Guten morgen",
+75        "Morgon"
+76    ]
+77
+78    global lastDateGreeted
+79
+80    for phrase in phrases:
+81        if phrase in row:
+82            if lastDateGreeted != datetime.date.today():
+83                lastDateGreeted = datetime.date.today()
+84                msg = random.choice(morning_phrases)
+85    return msg
+
+ + +
+
+
+ CONFIG = +None + + +
+ + + + +
+
+
+ lastDateGreeted = +None + + +
+ + + + +
+
+ +
+ + def + setConfig(config): + + + +
+ +
21def setConfig(config):
+22    """
+23    Keep reference to the loaded configuration.
+24    """
+25    global CONFIG
+26    CONFIG = config
+
+ + +

Keep reference to the loaded configuration.

+
+ + +
+
+ +
+ + def + getString(key, key1=None): + + + +
+ +
29def getString(key, key1=None):
+30    """
+31    Get a string from the string database.
+32    """
+33    data = STRINGS[key]
+34    if isinstance(data, list):
+35        res = data[random.randint(0, len(data) - 1)]
+36    elif isinstance(data, dict):
+37        if key1 is None:
+38            res = data
+39        else:
+40            res = data[key1]
+41            if isinstance(res, list):
+42                res = res[random.randint(0, len(res) - 1)]
+43    elif isinstance(data, str):
+44        res = data
+45
+46    return res
+
+ + +

Get a string from the string database.

+
+ + +
+
+ +
+ + def + getAllGeneralActions(): + + + +
+ +
49def getAllGeneralActions():
+50    """
+51    Return all general actions as an array.
+52    """
+53    return [
+54        marvinMorning
+55    ]
+
+ + +

Return all general actions as an array.

+
+ + +
+
+ +
+ + def + marvinMorning(row): + + + +
+ +
58def marvinMorning(row):
+59    """
+60    Marvin says Good morning after someone else says it
+61    """
+62    msg = None
+63    phrases = [
+64        "morgon",
+65        "godmorgon",
+66        "god morgon",
+67        "morrn",
+68        "morn"
+69    ]
+70
+71    morning_phrases = [
+72        "Godmorgon! :-)",
+73        "Morgon allesammans",
+74        "Morgon gott folk",
+75        "Guten morgen",
+76        "Morgon"
+77    ]
+78
+79    global lastDateGreeted
+80
+81    for phrase in phrases:
+82        if phrase in row:
+83            if lastDateGreeted != datetime.date.today():
+84                lastDateGreeted = datetime.date.today()
+85                msg = random.choice(morning_phrases)
+86    return msg
+
+ + +

Marvin says Good morning after someone else says it

+
+ + +
+
+ + \ No newline at end of file diff --git a/docs/pdoc/search.js b/docs/pdoc/search.js new file mode 100644 index 0000000..013a072 --- /dev/null +++ b/docs/pdoc/search.js @@ -0,0 +1,46 @@ +window.pdocSearch = (function(){ +/** elasticlunr - http://weixsong.github.io * Copyright (C) 2017 Oliver Nightingale * Copyright (C) 2017 Wei Song * MIT Licensed */!function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),t.utils.toString=function(e){return void 0===e||null===e?"":e.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop(),n=e;if("function"!=typeof t)throw new TypeError("last argument must be a function");n.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},t.EventEmitter.prototype.removeListener=function(e,t){if(this.hasHandler(e)){var n=this.events[e].indexOf(t);-1!==n&&(this.events[e].splice(n,1),0==this.events[e].length&&delete this.events[e])}},t.EventEmitter.prototype.emit=function(e){if(this.hasHandler(e)){var t=Array.prototype.slice.call(arguments,1);this.events[e].forEach(function(e){e.apply(void 0,t)},this)}},t.EventEmitter.prototype.hasHandler=function(e){return e in this.events},t.tokenizer=function(e){if(!arguments.length||null===e||void 0===e)return[];if(Array.isArray(e)){var n=e.filter(function(e){return null===e||void 0===e?!1:!0});n=n.map(function(e){return t.utils.toString(e).toLowerCase()});var i=[];return n.forEach(function(e){var n=e.split(t.tokenizer.seperator);i=i.concat(n)},this),i}return e.toString().trim().toLowerCase().split(t.tokenizer.seperator)},t.tokenizer.defaultSeperator=/[\s\-]+/,t.tokenizer.seperator=t.tokenizer.defaultSeperator,t.tokenizer.setSeperator=function(e){null!==e&&void 0!==e&&"object"==typeof e&&(t.tokenizer.seperator=e)},t.tokenizer.resetSeperator=function(){t.tokenizer.seperator=t.tokenizer.defaultSeperator},t.tokenizer.getSeperator=function(){return t.tokenizer.seperator},t.Pipeline=function(){this._queue=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in t.Pipeline.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[n]=e},t.Pipeline.getRegisteredFunction=function(e){return e in t.Pipeline.registeredFunctions!=!0?null:t.Pipeline.registeredFunctions[e]},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.getRegisteredFunction(e);if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i+1,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i,0,n)},t.Pipeline.prototype.remove=function(e){var t=this._queue.indexOf(e);-1!==t&&this._queue.splice(t,1)},t.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._queue.length,o=0;n>o;o++){for(var r=e[o],s=0;i>s&&(r=this._queue[s](r,o,e),void 0!==r&&null!==r);s++);void 0!==r&&null!==r&&t.push(r)}return t},t.Pipeline.prototype.reset=function(){this._queue=[]},t.Pipeline.prototype.get=function(){return this._queue},t.Pipeline.prototype.toJSON=function(){return this._queue.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.DocumentStore,this.index={},this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},t.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;n._fields=e.fields,n._ref=e.ref,n.documentStore=t.DocumentStore.load(e.documentStore),n.pipeline=t.Pipeline.load(e.pipeline),n.index={};for(var i in e.index)n.index[i]=t.InvertedIndex.load(e.index[i]);return n},t.Index.prototype.addField=function(e){return this._fields.push(e),this.index[e]=new t.InvertedIndex,this},t.Index.prototype.setRef=function(e){return this._ref=e,this},t.Index.prototype.saveDocument=function(e){return this.documentStore=new t.DocumentStore(e),this},t.Index.prototype.addDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.addDoc(i,e),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));this.documentStore.addFieldLength(i,n,o.length);var r={};o.forEach(function(e){e in r?r[e]+=1:r[e]=1},this);for(var s in r){var u=r[s];u=Math.sqrt(u),this.index[n].addToken(s,{ref:i,tf:u})}},this),n&&this.eventEmitter.emit("add",e,this)}},t.Index.prototype.removeDocByRef=function(e){if(e&&this.documentStore.isDocStored()!==!1&&this.documentStore.hasDoc(e)){var t=this.documentStore.getDoc(e);this.removeDoc(t,!1)}},t.Index.prototype.removeDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.hasDoc(i)&&(this.documentStore.removeDoc(i),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));o.forEach(function(e){this.index[n].removeToken(e,i)},this)},this),n&&this.eventEmitter.emit("remove",e,this))}},t.Index.prototype.updateDoc=function(e,t){var t=void 0===t?!0:t;this.removeDocByRef(e[this._ref],!1),this.addDoc(e,!1),t&&this.eventEmitter.emit("update",e,this)},t.Index.prototype.idf=function(e,t){var n="@"+t+"/"+e;if(Object.prototype.hasOwnProperty.call(this._idfCache,n))return this._idfCache[n];var i=this.index[t].getDocFreq(e),o=1+Math.log(this.documentStore.length/(i+1));return this._idfCache[n]=o,o},t.Index.prototype.getFields=function(){return this._fields.slice()},t.Index.prototype.search=function(e,n){if(!e)return[];e="string"==typeof e?{any:e}:JSON.parse(JSON.stringify(e));var i=null;null!=n&&(i=JSON.stringify(n));for(var o=new t.Configuration(i,this.getFields()).get(),r={},s=Object.keys(e),u=0;u0&&t.push(e);for(var i in n)"docs"!==i&&"df"!==i&&this.expandToken(e+i,t,n[i]);return t},t.InvertedIndex.prototype.toJSON=function(){return{root:this.root}},t.Configuration=function(e,n){var e=e||"";if(void 0==n||null==n)throw new Error("fields should not be null");this.config={};var i;try{i=JSON.parse(e),this.buildUserConfig(i,n)}catch(o){t.utils.warn("user configuration parse failed, will use default configuration"),this.buildDefaultConfig(n)}},t.Configuration.prototype.buildDefaultConfig=function(e){this.reset(),e.forEach(function(e){this.config[e]={boost:1,bool:"OR",expand:!1}},this)},t.Configuration.prototype.buildUserConfig=function(e,n){var i="OR",o=!1;if(this.reset(),"bool"in e&&(i=e.bool||i),"expand"in e&&(o=e.expand||o),"fields"in e)for(var r in e.fields)if(n.indexOf(r)>-1){var s=e.fields[r],u=o;void 0!=s.expand&&(u=s.expand),this.config[r]={boost:s.boost||0===s.boost?s.boost:1,bool:s.bool||i,expand:u}}else t.utils.warn("field name in user configuration not found in index instance fields");else this.addAllFields2UserConfig(i,o,n)},t.Configuration.prototype.addAllFields2UserConfig=function(e,t,n){n.forEach(function(n){this.config[n]={boost:1,bool:e,expand:t}},this)},t.Configuration.prototype.get=function(){return this.config},t.Configuration.prototype.reset=function(){this.config={}},lunr.SortedSet=function(){this.length=0,this.elements=[]},lunr.SortedSet.load=function(e){var t=new this;return t.elements=e,t.length=e.length,t},lunr.SortedSet.prototype.add=function(){var e,t;for(e=0;e1;){if(r===e)return o;e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o]}return r===e?o:-1},lunr.SortedSet.prototype.locationFor=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;)e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o];return r>e?o:e>r?o+1:void 0},lunr.SortedSet.prototype.intersect=function(e){for(var t=new lunr.SortedSet,n=0,i=0,o=this.length,r=e.length,s=this.elements,u=e.elements;;){if(n>o-1||i>r-1)break;s[n]!==u[i]?s[n]u[i]&&i++:(t.add(s[n]),n++,i++)}return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){var t,n,i;this.length>=e.length?(t=this,n=e):(t=e,n=this),i=t.clone();for(var o=0,r=n.toArray();oModule for the common base class for all Bots

\n"}, "bot.Bot": {"fullname": "bot.Bot", "modulename": "bot", "qualname": "Bot", "kind": "class", "doc": "

Base class for things common between different protocols

\n"}, "bot.Bot.CONFIG": {"fullname": "bot.Bot.CONFIG", "modulename": "bot", "qualname": "Bot.CONFIG", "kind": "variable", "doc": "

\n"}, "bot.Bot.ACTIONS": {"fullname": "bot.Bot.ACTIONS", "modulename": "bot", "qualname": "Bot.ACTIONS", "kind": "variable", "doc": "

\n"}, "bot.Bot.GENERAL_ACTIONS": {"fullname": "bot.Bot.GENERAL_ACTIONS", "modulename": "bot", "qualname": "Bot.GENERAL_ACTIONS", "kind": "variable", "doc": "

\n"}, "bot.Bot.getConfig": {"fullname": "bot.Bot.getConfig", "modulename": "bot", "qualname": "Bot.getConfig", "kind": "function", "doc": "

Return the current configuration

\n", "signature": "(self):", "funcdef": "def"}, "bot.Bot.setConfig": {"fullname": "bot.Bot.setConfig", "modulename": "bot", "qualname": "Bot.setConfig", "kind": "function", "doc": "

Set the current configuration

\n", "signature": "(self, config):", "funcdef": "def"}, "bot.Bot.registerActions": {"fullname": "bot.Bot.registerActions", "modulename": "bot", "qualname": "Bot.registerActions", "kind": "function", "doc": "

Register actions to use

\n", "signature": "(self, actions):", "funcdef": "def"}, "bot.Bot.registerGeneralActions": {"fullname": "bot.Bot.registerGeneralActions", "modulename": "bot", "qualname": "Bot.registerGeneralActions", "kind": "function", "doc": "

Register general actions to use

\n", "signature": "(self, actions):", "funcdef": "def"}, "bot.Bot.tokenize": {"fullname": "bot.Bot.tokenize", "modulename": "bot", "qualname": "Bot.tokenize", "kind": "function", "doc": "

Split a message into normalized tokens

\n", "signature": "(message):", "funcdef": "def"}, "discord_bot": {"fullname": "discord_bot", "modulename": "discord_bot", "kind": "module", "doc": "

Module for the Discord bot.

\n\n

Connecting, sending and receiving messages and doing custom actions.

\n"}, "discord_bot.DiscordBot": {"fullname": "discord_bot.DiscordBot", "modulename": "discord_bot", "qualname": "DiscordBot", "kind": "class", "doc": "

Bot implementing the discord protocol

\n", "bases": "discord.client.Client, bot.Bot"}, "discord_bot.DiscordBot.CONFIG": {"fullname": "discord_bot.DiscordBot.CONFIG", "modulename": "discord_bot", "qualname": "DiscordBot.CONFIG", "kind": "variable", "doc": "

\n"}, "discord_bot.DiscordBot.begin": {"fullname": "discord_bot.DiscordBot.begin", "modulename": "discord_bot", "qualname": "DiscordBot.begin", "kind": "function", "doc": "

Start the bot

\n", "signature": "(self):", "funcdef": "def"}, "discord_bot.DiscordBot.checkMarvinActions": {"fullname": "discord_bot.DiscordBot.checkMarvinActions", "modulename": "discord_bot", "qualname": "DiscordBot.checkMarvinActions", "kind": "function", "doc": "

Check if Marvin should perform any actions

\n", "signature": "(self, message):", "funcdef": "async def"}, "discord_bot.DiscordBot.on_message": {"fullname": "discord_bot.DiscordBot.on_message", "modulename": "discord_bot", "qualname": "DiscordBot.on_message", "kind": "function", "doc": "

Hook run on every message

\n", "signature": "(self, message):", "funcdef": "async def"}, "irc_bot": {"fullname": "irc_bot", "modulename": "irc_bot", "kind": "module", "doc": "

Module for the IRC bot.

\n\n

Connecting, sending and receiving messages and doing custom actions.

\n\n

Keeping a log and reading incoming material.

\n"}, "irc_bot.IrcBot": {"fullname": "irc_bot.IrcBot", "modulename": "irc_bot", "qualname": "IrcBot", "kind": "class", "doc": "

Bot implementing the IRC protocol

\n", "bases": "bot.Bot"}, "irc_bot.IrcBot.CONFIG": {"fullname": "irc_bot.IrcBot.CONFIG", "modulename": "irc_bot", "qualname": "IrcBot.CONFIG", "kind": "variable", "doc": "

\n"}, "irc_bot.IrcBot.SOCKET": {"fullname": "irc_bot.IrcBot.SOCKET", "modulename": "irc_bot", "qualname": "IrcBot.SOCKET", "kind": "variable", "doc": "

\n"}, "irc_bot.IrcBot.IRCLOG": {"fullname": "irc_bot.IrcBot.IRCLOG", "modulename": "irc_bot", "qualname": "IrcBot.IRCLOG", "kind": "variable", "doc": "

\n"}, "irc_bot.IrcBot.connectToServer": {"fullname": "irc_bot.IrcBot.connectToServer", "modulename": "irc_bot", "qualname": "IrcBot.connectToServer", "kind": "function", "doc": "

Connect to the IRC Server

\n", "signature": "(self):", "funcdef": "def"}, "irc_bot.IrcBot.sendPrivMsg": {"fullname": "irc_bot.IrcBot.sendPrivMsg", "modulename": "irc_bot", "qualname": "IrcBot.sendPrivMsg", "kind": "function", "doc": "

Send and log a PRIV message

\n", "signature": "(self, message, channel):", "funcdef": "def"}, "irc_bot.IrcBot.sendMsg": {"fullname": "irc_bot.IrcBot.sendMsg", "modulename": "irc_bot", "qualname": "IrcBot.sendMsg", "kind": "function", "doc": "

Send and occasionally print the message sent

\n", "signature": "(self, msg):", "funcdef": "def"}, "irc_bot.IrcBot.decode_irc": {"fullname": "irc_bot.IrcBot.decode_irc", "modulename": "irc_bot", "qualname": "IrcBot.decode_irc", "kind": "function", "doc": "

Do character detection.\nYou can send preferred encodings as a list through preferred_encs.\nhttp://stackoverflow.com/questions/938870/python-irc-bot-and-encoding-issue

\n", "signature": "(self, raw, preferred_encs=None):", "funcdef": "def"}, "irc_bot.IrcBot.receive": {"fullname": "irc_bot.IrcBot.receive", "modulename": "irc_bot", "qualname": "IrcBot.receive", "kind": "function", "doc": "

Read incoming message and guess encoding

\n", "signature": "(self):", "funcdef": "def"}, "irc_bot.IrcBot.ircLogAppend": {"fullname": "irc_bot.IrcBot.ircLogAppend", "modulename": "irc_bot", "qualname": "IrcBot.ircLogAppend", "kind": "function", "doc": "

Read incoming message and guess encoding

\n", "signature": "(self, line=None, user=None, message=None):", "funcdef": "def"}, "irc_bot.IrcBot.ircLogWriteToFile": {"fullname": "irc_bot.IrcBot.ircLogWriteToFile", "modulename": "irc_bot", "qualname": "IrcBot.ircLogWriteToFile", "kind": "function", "doc": "

Write IRClog to file

\n", "signature": "(self):", "funcdef": "def"}, "irc_bot.IrcBot.readincoming": {"fullname": "irc_bot.IrcBot.readincoming", "modulename": "irc_bot", "qualname": "IrcBot.readincoming", "kind": "function", "doc": "

Read all files in the directory incoming, send them as a message if\nthey exists and then move the file to directory done.

\n", "signature": "(self):", "funcdef": "def"}, "irc_bot.IrcBot.mainLoop": {"fullname": "irc_bot.IrcBot.mainLoop", "modulename": "irc_bot", "qualname": "IrcBot.mainLoop", "kind": "function", "doc": "

For ever, listen and answer to incoming chats

\n", "signature": "(self):", "funcdef": "def"}, "irc_bot.IrcBot.begin": {"fullname": "irc_bot.IrcBot.begin", "modulename": "irc_bot", "qualname": "IrcBot.begin", "kind": "function", "doc": "

Start the bot

\n", "signature": "(self):", "funcdef": "def"}, "irc_bot.IrcBot.checkIrcActions": {"fullname": "irc_bot.IrcBot.checkIrcActions", "modulename": "irc_bot", "qualname": "IrcBot.checkIrcActions", "kind": "function", "doc": "

Check if Marvin should take action on any messages defined in the\nIRC protocol.

\n", "signature": "(self, words):", "funcdef": "def"}, "irc_bot.IrcBot.checkMarvinActions": {"fullname": "irc_bot.IrcBot.checkMarvinActions", "modulename": "irc_bot", "qualname": "IrcBot.checkMarvinActions", "kind": "function", "doc": "

Check if Marvin should perform any actions

\n", "signature": "(self, words):", "funcdef": "def"}, "main": {"fullname": "main", "modulename": "main", "kind": "module", "doc": "

An IRC bot that answers random questions, keeps a log from the IRC-chat,\neasy to integrate in a webpage and montores a phpBB forum for latest topics\nby loggin in to the forum and checking the RSS-feed.

\n\n

You need to install additional modules.

\n\n

Install needed modules in local directory

\n\n

pip3 install --target modules/ feedparser beautifulsoup4 chardet

\n\n

Modules in modules/ will be loaded automatically. If you want to use a\ndifferent directory you can start the program like this instead:

\n\n

PYTHONPATH=modules python3 main.py

\n\n

To get help

\n\n

PYTHONPATH=modules python3 main.py --help

\n\n

Example of using options

\n\n

--server=irc.bsnet.se --channel=#db-o-webb\n--server=irc.bsnet.se --port=6667 --channel=#db-o-webb\n--nick=marvin --ident=secret

\n\n

Configuration

\n\n

Check out the file 'marvin_config_default.json' on how to configure, instead\nof using cli-options. The default configfile is 'marvin_config.json' but you\ncan change that using cli-options.

\n\n

Make own actions

\n\n

Check the file 'marvin_strings.json' for the file where most of the strings\nare defined and check out 'marvin_actions.py' to see how to write your own\nactions. Its just a small function.

\n\n

Read from incoming

\n\n

Marvin reads messages from the incoming/ directory, if it exists, and writes\nit out the the irc channel.

\n"}, "main.PROGRAM": {"fullname": "main.PROGRAM", "modulename": "main", "qualname": "PROGRAM", "kind": "variable", "doc": "

\n", "default_value": "'marvin'"}, "main.AUTHOR": {"fullname": "main.AUTHOR", "modulename": "main", "qualname": "AUTHOR", "kind": "variable", "doc": "

\n", "default_value": "'Mikael Roos'"}, "main.EMAIL": {"fullname": "main.EMAIL", "modulename": "main", "qualname": "EMAIL", "kind": "variable", "doc": "

\n", "default_value": "'mikael.t.h.roos@gmail.com'"}, "main.VERSION": {"fullname": "main.VERSION", "modulename": "main", "qualname": "VERSION", "kind": "variable", "doc": "

\n", "default_value": "'0.3.0'"}, "main.MSG_VERSION": {"fullname": "main.MSG_VERSION", "modulename": "main", "qualname": "MSG_VERSION", "kind": "variable", "doc": "

\n", "default_value": "'marvin version 0.3.0.'"}, "main.printVersion": {"fullname": "main.printVersion", "modulename": "main", "qualname": "printVersion", "kind": "function", "doc": "

Print version information and exit.

\n", "signature": "():", "funcdef": "def"}, "main.mergeOptionsWithConfigFile": {"fullname": "main.mergeOptionsWithConfigFile", "modulename": "main", "qualname": "mergeOptionsWithConfigFile", "kind": "function", "doc": "

Read information from config file.

\n", "signature": "(options, configFile):", "funcdef": "def"}, "main.parseOptions": {"fullname": "main.parseOptions", "modulename": "main", "qualname": "parseOptions", "kind": "function", "doc": "

Merge default options with incoming options and arguments and return them as a dictionary.

\n", "signature": "(options):", "funcdef": "def"}, "main.determineProtocol": {"fullname": "main.determineProtocol", "modulename": "main", "qualname": "determineProtocol", "kind": "function", "doc": "

Parse the argument to determine what protocol to use

\n", "signature": "():", "funcdef": "def"}, "main.createBot": {"fullname": "main.createBot", "modulename": "main", "qualname": "createBot", "kind": "function", "doc": "

Return an instance of a bot with the requested implementation

\n", "signature": "(protocol):", "funcdef": "def"}, "main.main": {"fullname": "main.main", "modulename": "main", "qualname": "main", "kind": "function", "doc": "

Main function to carry out the work.

\n", "signature": "():", "funcdef": "def"}, "marvin_actions": {"fullname": "marvin_actions", "modulename": "marvin_actions", "kind": "module", "doc": "

Make actions for Marvin, one function for each action.

\n"}, "marvin_actions.getAllActions": {"fullname": "marvin_actions.getAllActions", "modulename": "marvin_actions", "qualname": "getAllActions", "kind": "function", "doc": "

Return all actions in an array.

\n", "signature": "():", "funcdef": "def"}, "marvin_actions.CONFIG": {"fullname": "marvin_actions.CONFIG", "modulename": "marvin_actions", "qualname": "CONFIG", "kind": "variable", "doc": "

\n", "default_value": "None"}, "marvin_actions.setConfig": {"fullname": "marvin_actions.setConfig", "modulename": "marvin_actions", "qualname": "setConfig", "kind": "function", "doc": "

Keep reference to the loaded configuration.

\n", "signature": "(config):", "funcdef": "def"}, "marvin_actions.getString": {"fullname": "marvin_actions.getString", "modulename": "marvin_actions", "qualname": "getString", "kind": "function", "doc": "

Get a string from the string database.

\n", "signature": "(key, key1=None):", "funcdef": "def"}, "marvin_actions.marvinSmile": {"fullname": "marvin_actions.marvinSmile", "modulename": "marvin_actions", "qualname": "marvinSmile", "kind": "function", "doc": "

Make Marvin smile.

\n", "signature": "(row):", "funcdef": "def"}, "marvin_actions.wordsAfterKeyWords": {"fullname": "marvin_actions.wordsAfterKeyWords", "modulename": "marvin_actions", "qualname": "wordsAfterKeyWords", "kind": "function", "doc": "

Return all items in the words list after the first occurence\nof an item in the keyWords list.

\n", "signature": "(words, keyWords):", "funcdef": "def"}, "marvin_actions.marvinGoogle": {"fullname": "marvin_actions.marvinGoogle", "modulename": "marvin_actions", "qualname": "marvinGoogle", "kind": "function", "doc": "

Let Marvin present an url to google.

\n", "signature": "(row):", "funcdef": "def"}, "marvin_actions.marvinExplainShell": {"fullname": "marvin_actions.marvinExplainShell", "modulename": "marvin_actions", "qualname": "marvinExplainShell", "kind": "function", "doc": "

Let Marvin present an url to the service explain shell to\nexplain a shell command.

\n", "signature": "(row):", "funcdef": "def"}, "marvin_actions.marvinSource": {"fullname": "marvin_actions.marvinSource", "modulename": "marvin_actions", "qualname": "marvinSource", "kind": "function", "doc": "

State message about sourcecode.

\n", "signature": "(row):", "funcdef": "def"}, "marvin_actions.marvinBudord": {"fullname": "marvin_actions.marvinBudord", "modulename": "marvin_actions", "qualname": "marvinBudord", "kind": "function", "doc": "

What are the budord for Marvin?

\n", "signature": "(row):", "funcdef": "def"}, "marvin_actions.marvinQuote": {"fullname": "marvin_actions.marvinQuote", "modulename": "marvin_actions", "qualname": "marvinQuote", "kind": "function", "doc": "

Make a quote.

\n", "signature": "(row):", "funcdef": "def"}, "marvin_actions.videoOfToday": {"fullname": "marvin_actions.videoOfToday", "modulename": "marvin_actions", "qualname": "videoOfToday", "kind": "function", "doc": "

Check what day it is and provide a url to a suitable video together with a greeting.

\n", "signature": "():", "funcdef": "def"}, "marvin_actions.marvinVideoOfToday": {"fullname": "marvin_actions.marvinVideoOfToday", "modulename": "marvin_actions", "qualname": "marvinVideoOfToday", "kind": "function", "doc": "

Show the video of today.

\n", "signature": "(row):", "funcdef": "def"}, "marvin_actions.marvinWhoIs": {"fullname": "marvin_actions.marvinWhoIs", "modulename": "marvin_actions", "qualname": "marvinWhoIs", "kind": "function", "doc": "

Who is Marvin.

\n", "signature": "(row):", "funcdef": "def"}, "marvin_actions.marvinHelp": {"fullname": "marvin_actions.marvinHelp", "modulename": "marvin_actions", "qualname": "marvinHelp", "kind": "function", "doc": "

Provide a menu.

\n", "signature": "(row):", "funcdef": "def"}, "marvin_actions.marvinStats": {"fullname": "marvin_actions.marvinStats", "modulename": "marvin_actions", "qualname": "marvinStats", "kind": "function", "doc": "

Provide a link to the stats.

\n", "signature": "(row):", "funcdef": "def"}, "marvin_actions.marvinIrcLog": {"fullname": "marvin_actions.marvinIrcLog", "modulename": "marvin_actions", "qualname": "marvinIrcLog", "kind": "function", "doc": "

Provide a link to the irclog

\n", "signature": "(row):", "funcdef": "def"}, "marvin_actions.marvinSayHi": {"fullname": "marvin_actions.marvinSayHi", "modulename": "marvin_actions", "qualname": "marvinSayHi", "kind": "function", "doc": "

Say hi with a nice message.

\n", "signature": "(row):", "funcdef": "def"}, "marvin_actions.marvinLunch": {"fullname": "marvin_actions.marvinLunch", "modulename": "marvin_actions", "qualname": "marvinLunch", "kind": "function", "doc": "

Help decide where to eat.

\n", "signature": "(row):", "funcdef": "def"}, "marvin_actions.marvinListen": {"fullname": "marvin_actions.marvinListen", "modulename": "marvin_actions", "qualname": "marvinListen", "kind": "function", "doc": "

Return music last listened to.

\n", "signature": "(row):", "funcdef": "def"}, "marvin_actions.marvinSun": {"fullname": "marvin_actions.marvinSun", "modulename": "marvin_actions", "qualname": "marvinSun", "kind": "function", "doc": "

Check when the sun goes up and down.

\n", "signature": "(row):", "funcdef": "def"}, "marvin_actions.marvinWeather": {"fullname": "marvin_actions.marvinWeather", "modulename": "marvin_actions", "qualname": "marvinWeather", "kind": "function", "doc": "

Check what the weather prognosis looks like.

\n", "signature": "(row):", "funcdef": "def"}, "marvin_actions.marvinStrip": {"fullname": "marvin_actions.marvinStrip", "modulename": "marvin_actions", "qualname": "marvinStrip", "kind": "function", "doc": "

Get a comic strip.

\n", "signature": "(row):", "funcdef": "def"}, "marvin_actions.commitStrip": {"fullname": "marvin_actions.commitStrip", "modulename": "marvin_actions", "qualname": "commitStrip", "kind": "function", "doc": "

Latest or random comic strip from CommitStrip.

\n", "signature": "(randomize=False):", "funcdef": "def"}, "marvin_actions.marvinTimeToBBQ": {"fullname": "marvin_actions.marvinTimeToBBQ", "modulename": "marvin_actions", "qualname": "marvinTimeToBBQ", "kind": "function", "doc": "

Calcuate the time to next barbecue and print a appropriate msg

\n", "signature": "(row):", "funcdef": "def"}, "marvin_actions.nextBBQ": {"fullname": "marvin_actions.nextBBQ", "modulename": "marvin_actions", "qualname": "nextBBQ", "kind": "function", "doc": "

Calculate the next grillcon date after today

\n", "signature": "():", "funcdef": "def"}, "marvin_actions.thirdFridayIn": {"fullname": "marvin_actions.thirdFridayIn", "modulename": "marvin_actions", "qualname": "thirdFridayIn", "kind": "function", "doc": "

Get the third Friday in a given month and year

\n", "signature": "(y, m):", "funcdef": "def"}, "marvin_actions.marvinBirthday": {"fullname": "marvin_actions.marvinBirthday", "modulename": "marvin_actions", "qualname": "marvinBirthday", "kind": "function", "doc": "

Check birthday info

\n", "signature": "(row):", "funcdef": "def"}, "marvin_actions.marvinNameday": {"fullname": "marvin_actions.marvinNameday", "modulename": "marvin_actions", "qualname": "marvinNameday", "kind": "function", "doc": "

Check current nameday

\n", "signature": "(row):", "funcdef": "def"}, "marvin_actions.marvinUptime": {"fullname": "marvin_actions.marvinUptime", "modulename": "marvin_actions", "qualname": "marvinUptime", "kind": "function", "doc": "

Display info about uptime tournament

\n", "signature": "(row):", "funcdef": "def"}, "marvin_actions.marvinStream": {"fullname": "marvin_actions.marvinStream", "modulename": "marvin_actions", "qualname": "marvinStream", "kind": "function", "doc": "

Display info about stream

\n", "signature": "(row):", "funcdef": "def"}, "marvin_actions.marvinPrinciple": {"fullname": "marvin_actions.marvinPrinciple", "modulename": "marvin_actions", "qualname": "marvinPrinciple", "kind": "function", "doc": "

Display one selected software principle, or provide one as random

\n", "signature": "(row):", "funcdef": "def"}, "marvin_actions.getJoke": {"fullname": "marvin_actions.getJoke", "modulename": "marvin_actions", "qualname": "getJoke", "kind": "function", "doc": "

Retrieves joke from api.chucknorris.io/jokes/random?category=dev

\n", "signature": "():", "funcdef": "def"}, "marvin_actions.marvinJoke": {"fullname": "marvin_actions.marvinJoke", "modulename": "marvin_actions", "qualname": "marvinJoke", "kind": "function", "doc": "

Display a random Chuck Norris joke

\n", "signature": "(row):", "funcdef": "def"}, "marvin_actions.getCommit": {"fullname": "marvin_actions.getCommit", "modulename": "marvin_actions", "qualname": "getCommit", "kind": "function", "doc": "

Retrieves random commit message from whatthecommit.com/index.html

\n", "signature": "():", "funcdef": "def"}, "marvin_actions.marvinCommit": {"fullname": "marvin_actions.marvinCommit", "modulename": "marvin_actions", "qualname": "marvinCommit", "kind": "function", "doc": "

Display a random commit message

\n", "signature": "(row):", "funcdef": "def"}, "marvin_general_actions": {"fullname": "marvin_general_actions", "modulename": "marvin_general_actions", "kind": "module", "doc": "

Make general actions for Marvin, one function for each action.

\n"}, "marvin_general_actions.CONFIG": {"fullname": "marvin_general_actions.CONFIG", "modulename": "marvin_general_actions", "qualname": "CONFIG", "kind": "variable", "doc": "

\n", "default_value": "None"}, "marvin_general_actions.lastDateGreeted": {"fullname": "marvin_general_actions.lastDateGreeted", "modulename": "marvin_general_actions", "qualname": "lastDateGreeted", "kind": "variable", "doc": "

\n", "default_value": "None"}, "marvin_general_actions.setConfig": {"fullname": "marvin_general_actions.setConfig", "modulename": "marvin_general_actions", "qualname": "setConfig", "kind": "function", "doc": "

Keep reference to the loaded configuration.

\n", "signature": "(config):", "funcdef": "def"}, "marvin_general_actions.getString": {"fullname": "marvin_general_actions.getString", "modulename": "marvin_general_actions", "qualname": "getString", "kind": "function", "doc": "

Get a string from the string database.

\n", "signature": "(key, key1=None):", "funcdef": "def"}, "marvin_general_actions.getAllGeneralActions": {"fullname": "marvin_general_actions.getAllGeneralActions", "modulename": "marvin_general_actions", "qualname": "getAllGeneralActions", "kind": "function", "doc": "

Return all general actions as an array.

\n", "signature": "():", "funcdef": "def"}, "marvin_general_actions.marvinMorning": {"fullname": "marvin_general_actions.marvinMorning", "modulename": "marvin_general_actions", "qualname": "marvinMorning", "kind": "function", "doc": "

Marvin says Good morning after someone else says it

\n", "signature": "(row):", "funcdef": "def"}, "test_main": {"fullname": "test_main", "modulename": "test_main", "kind": "module", "doc": "

Tests for the main launcher

\n"}, "test_main.ConfigMergeTest": {"fullname": "test_main.ConfigMergeTest", "modulename": "test_main", "qualname": "ConfigMergeTest", "kind": "class", "doc": "

Test merging a config file with a dict

\n", "bases": "unittest.case.TestCase"}, "test_main.ConfigMergeTest.assertMergedConfig": {"fullname": "test_main.ConfigMergeTest.assertMergedConfig", "modulename": "test_main", "qualname": "ConfigMergeTest.assertMergedConfig", "kind": "function", "doc": "

Merge dict with file and assert the result matches expected

\n", "signature": "(self, config, fileName, expected):", "funcdef": "def"}, "test_main.ConfigMergeTest.testEmpty": {"fullname": "test_main.ConfigMergeTest.testEmpty", "modulename": "test_main", "qualname": "ConfigMergeTest.testEmpty", "kind": "function", "doc": "

Empty into empty should equal empty

\n", "signature": "(self):", "funcdef": "def"}, "test_main.ConfigMergeTest.testAddSingleParameter": {"fullname": "test_main.ConfigMergeTest.testAddSingleParameter", "modulename": "test_main", "qualname": "ConfigMergeTest.testAddSingleParameter", "kind": "function", "doc": "

Add a single parameter to an empty config

\n", "signature": "(self):", "funcdef": "def"}, "test_main.ConfigMergeTest.testAddSingleParameterOverwrites": {"fullname": "test_main.ConfigMergeTest.testAddSingleParameterOverwrites", "modulename": "test_main", "qualname": "ConfigMergeTest.testAddSingleParameterOverwrites", "kind": "function", "doc": "

Add a single parameter to a config that contains it already

\n", "signature": "(self):", "funcdef": "def"}, "test_main.ConfigMergeTest.testAddSingleParameterMerges": {"fullname": "test_main.ConfigMergeTest.testAddSingleParameterMerges", "modulename": "test_main", "qualname": "ConfigMergeTest.testAddSingleParameterMerges", "kind": "function", "doc": "

Add a single parameter to a config that contains a different one

\n", "signature": "(self):", "funcdef": "def"}, "test_main.ConfigParseTest": {"fullname": "test_main.ConfigParseTest", "modulename": "test_main", "qualname": "ConfigParseTest", "kind": "class", "doc": "

Test parsing options into a config

\n", "bases": "unittest.case.TestCase"}, "test_main.ConfigParseTest.SAMPLE_CONFIG": {"fullname": "test_main.ConfigParseTest.SAMPLE_CONFIG", "modulename": "test_main", "qualname": "ConfigParseTest.SAMPLE_CONFIG", "kind": "variable", "doc": "

\n", "default_value": "{'server': 'localhost', 'port': 6667, 'channel': '#dbwebb', 'nick': 'marvin', 'realname': 'Marvin The All Mighty dbwebb-bot', 'ident': 'password'}"}, "test_main.ConfigParseTest.CHANGED_CONFIG": {"fullname": "test_main.ConfigParseTest.CHANGED_CONFIG", "modulename": "test_main", "qualname": "ConfigParseTest.CHANGED_CONFIG", "kind": "variable", "doc": "

\n", "default_value": "{'server': 'remotehost', 'port': 1234, 'channel': '#db-o-webb', 'nick': 'imposter', 'realname': 'where is marvin?', 'ident': 'identify'}"}, "test_main.ConfigParseTest.testOverrideHardcodedParameters": {"fullname": "test_main.ConfigParseTest.testOverrideHardcodedParameters", "modulename": "test_main", "qualname": "ConfigParseTest.testOverrideHardcodedParameters", "kind": "function", "doc": "

Test that all the hard coded parameters can be overridden from commandline

\n", "signature": "(self):", "funcdef": "def"}, "test_main.ConfigParseTest.testOverrideMultipleParameters": {"fullname": "test_main.ConfigParseTest.testOverrideMultipleParameters", "modulename": "test_main", "qualname": "ConfigParseTest.testOverrideMultipleParameters", "kind": "function", "doc": "

Test that multiple parameters can be overridden from commandline

\n", "signature": "(self):", "funcdef": "def"}, "test_main.ConfigParseTest.testOverrideWithFile": {"fullname": "test_main.ConfigParseTest.testOverrideWithFile", "modulename": "test_main", "qualname": "ConfigParseTest.testOverrideWithFile", "kind": "function", "doc": "

Test that parameters can be overridden with the --config option

\n", "signature": "(self):", "funcdef": "def"}, "test_main.ConfigParseTest.testOverridePrecedenceConfigFirst": {"fullname": "test_main.ConfigParseTest.testOverridePrecedenceConfigFirst", "modulename": "test_main", "qualname": "ConfigParseTest.testOverridePrecedenceConfigFirst", "kind": "function", "doc": "

Test that proper precedence is considered. From most to least significant it should be:\nexplicit parameter -> parameter in --config file -> default

\n", "signature": "(self):", "funcdef": "def"}, "test_main.ConfigParseTest.testOverridePrecedenceParameterFirst": {"fullname": "test_main.ConfigParseTest.testOverridePrecedenceParameterFirst", "modulename": "test_main", "qualname": "ConfigParseTest.testOverridePrecedenceParameterFirst", "kind": "function", "doc": "

Test that proper precedence is considered. From most to least significant it should be:\nexplicit parameter -> parameter in --config file -> default

\n", "signature": "(self):", "funcdef": "def"}, "test_main.ConfigParseTest.testBannedParameters": {"fullname": "test_main.ConfigParseTest.testBannedParameters", "modulename": "test_main", "qualname": "ConfigParseTest.testBannedParameters", "kind": "function", "doc": "

Don't allow config, help and version as parameters, as those options are special

\n", "signature": "(self):", "funcdef": "def"}, "test_main.FormattingTest": {"fullname": "test_main.FormattingTest", "modulename": "test_main", "qualname": "FormattingTest", "kind": "class", "doc": "

Test the parameters that cause printouts

\n", "bases": "unittest.case.TestCase"}, "test_main.FormattingTest.USAGE": {"fullname": "test_main.FormattingTest.USAGE", "modulename": "test_main", "qualname": "FormattingTest.USAGE", "kind": "variable", "doc": "

\n", "default_value": "'usage: main.py [-h] [-v] [--config CONFIG] [--server SERVER] [--port PORT] [--channel CHANNEL] [--nick NICK] [--realname REALNAME] [--ident IDENT]\\n [{irc,discord}]\\n'"}, "test_main.FormattingTest.OPTIONS": {"fullname": "test_main.FormattingTest.OPTIONS", "modulename": "test_main", "qualname": "FormattingTest.OPTIONS", "kind": "variable", "doc": "

\n", "default_value": "'positional arguments:\\n {irc,discord}\\n\\noptions:\\n -h, --help show this help message and exit\\n -v, --version\\n --config CONFIG\\n --server SERVER\\n --port PORT\\n --channel CHANNEL\\n --nick NICK\\n --realname REALNAME\\n --ident IDENT'"}, "test_main.FormattingTest.setUpClass": {"fullname": "test_main.FormattingTest.setUpClass", "modulename": "test_main", "qualname": "FormattingTest.setUpClass", "kind": "function", "doc": "

Set the terminal width to 160 to prevent the tests from failing on small terminals

\n", "signature": "(cls):", "funcdef": "def"}, "test_main.FormattingTest.assertPrintOption": {"fullname": "test_main.FormattingTest.assertPrintOption", "modulename": "test_main", "qualname": "FormattingTest.assertPrintOption", "kind": "function", "doc": "

Assert that parseOptions returns a certain code and prints a certain output

\n", "signature": "(self, options, returnCode, output):", "funcdef": "def"}, "test_main.FormattingTest.testHelpPrintout": {"fullname": "test_main.FormattingTest.testHelpPrintout", "modulename": "test_main", "qualname": "FormattingTest.testHelpPrintout", "kind": "function", "doc": "

Test that a help is printed when providing the --help flag

\n", "signature": "(self):", "funcdef": "def"}, "test_main.FormattingTest.testHelpPrintoutShort": {"fullname": "test_main.FormattingTest.testHelpPrintoutShort", "modulename": "test_main", "qualname": "FormattingTest.testHelpPrintoutShort", "kind": "function", "doc": "

Test that a help is printed when providing the -h flag

\n", "signature": "(self):", "funcdef": "def"}, "test_main.FormattingTest.testVersionPrintout": {"fullname": "test_main.FormattingTest.testVersionPrintout", "modulename": "test_main", "qualname": "FormattingTest.testVersionPrintout", "kind": "function", "doc": "

Test that the version is printed when provided the --version flag

\n", "signature": "(self):", "funcdef": "def"}, "test_main.FormattingTest.testVersionPrintoutShort": {"fullname": "test_main.FormattingTest.testVersionPrintoutShort", "modulename": "test_main", "qualname": "FormattingTest.testVersionPrintoutShort", "kind": "function", "doc": "

Test that the version is printed when provided the -v flag

\n", "signature": "(self):", "funcdef": "def"}, "test_main.FormattingTest.testUnhandledOption": {"fullname": "test_main.FormattingTest.testUnhandledOption", "modulename": "test_main", "qualname": "FormattingTest.testUnhandledOption", "kind": "function", "doc": "

Test that unknown options gives an error

\n", "signature": "(self):", "funcdef": "def"}, "test_main.FormattingTest.testUnhandledArgument": {"fullname": "test_main.FormattingTest.testUnhandledArgument", "modulename": "test_main", "qualname": "FormattingTest.testUnhandledArgument", "kind": "function", "doc": "

Test that any argument gives an error

\n", "signature": "(self):", "funcdef": "def"}, "test_main.TestArgumentParsing": {"fullname": "test_main.TestArgumentParsing", "modulename": "test_main", "qualname": "TestArgumentParsing", "kind": "class", "doc": "

Test parsing argument to determine whether to launch as irc or discord bot

\n", "bases": "unittest.case.TestCase"}, "test_main.TestArgumentParsing.testDetermineDiscordProtocol": {"fullname": "test_main.TestArgumentParsing.testDetermineDiscordProtocol", "modulename": "test_main", "qualname": "TestArgumentParsing.testDetermineDiscordProtocol", "kind": "function", "doc": "

Test that the it's possible to give argument to start the bot as a discord bot

\n", "signature": "(self):", "funcdef": "def"}, "test_main.TestArgumentParsing.testDetermineIRCProtocol": {"fullname": "test_main.TestArgumentParsing.testDetermineIRCProtocol", "modulename": "test_main", "qualname": "TestArgumentParsing.testDetermineIRCProtocol", "kind": "function", "doc": "

Test that the it's possible to give argument to start the bot as an irc bot

\n", "signature": "(self):", "funcdef": "def"}, "test_main.TestArgumentParsing.testDetermineIRCProtocolisDefault": {"fullname": "test_main.TestArgumentParsing.testDetermineIRCProtocolisDefault", "modulename": "test_main", "qualname": "TestArgumentParsing.testDetermineIRCProtocolisDefault", "kind": "function", "doc": "

Test that if no argument is given, irc is the default

\n", "signature": "(self):", "funcdef": "def"}, "test_main.TestArgumentParsing.testDetermineConfigThrowsOnInvalidProto": {"fullname": "test_main.TestArgumentParsing.testDetermineConfigThrowsOnInvalidProto", "modulename": "test_main", "qualname": "TestArgumentParsing.testDetermineConfigThrowsOnInvalidProto", "kind": "function", "doc": "

Test that determineProtocol throws error on unsupported protocols

\n", "signature": "(self):", "funcdef": "def"}, "test_main.TestBotFactoryMethod": {"fullname": "test_main.TestBotFactoryMethod", "modulename": "test_main", "qualname": "TestBotFactoryMethod", "kind": "class", "doc": "

Test that createBot returns expected instances of Bots

\n", "bases": "unittest.case.TestCase"}, "test_main.TestBotFactoryMethod.testCreateIRCBot": {"fullname": "test_main.TestBotFactoryMethod.testCreateIRCBot", "modulename": "test_main", "qualname": "TestBotFactoryMethod.testCreateIRCBot", "kind": "function", "doc": "

Test that an irc bot can be created

\n", "signature": "(self):", "funcdef": "def"}, "test_main.TestBotFactoryMethod.testCreateDiscordBot": {"fullname": "test_main.TestBotFactoryMethod.testCreateDiscordBot", "modulename": "test_main", "qualname": "TestBotFactoryMethod.testCreateDiscordBot", "kind": "function", "doc": "

Test that a discord bot can be created

\n", "signature": "(self):", "funcdef": "def"}, "test_main.TestBotFactoryMethod.testCreateUnsupportedProtocolThrows": {"fullname": "test_main.TestBotFactoryMethod.testCreateUnsupportedProtocolThrows", "modulename": "test_main", "qualname": "TestBotFactoryMethod.testCreateUnsupportedProtocolThrows", "kind": "function", "doc": "

Test that trying to create a bot with an unsupported protocol will throw exception

\n", "signature": "(self):", "funcdef": "def"}, "test_marvin_actions": {"fullname": "test_marvin_actions", "modulename": "test_marvin_actions", "kind": "module", "doc": "

Tests for all Marvin actions

\n"}, "test_marvin_actions.ActionTest": {"fullname": "test_marvin_actions.ActionTest", "modulename": "test_marvin_actions", "qualname": "ActionTest", "kind": "class", "doc": "

Test Marvin actions

\n", "bases": "unittest.case.TestCase"}, "test_marvin_actions.ActionTest.strings": {"fullname": "test_marvin_actions.ActionTest.strings", "modulename": "test_marvin_actions", "qualname": "ActionTest.strings", "kind": "variable", "doc": "

\n", "default_value": "{}"}, "test_marvin_actions.ActionTest.setUpClass": {"fullname": "test_marvin_actions.ActionTest.setUpClass", "modulename": "test_marvin_actions", "qualname": "ActionTest.setUpClass", "kind": "function", "doc": "

Hook method for setting up class fixture before running tests in the class.

\n", "signature": "(cls):", "funcdef": "def"}, "test_marvin_actions.ActionTest.executeAction": {"fullname": "test_marvin_actions.ActionTest.executeAction", "modulename": "test_marvin_actions", "qualname": "ActionTest.executeAction", "kind": "function", "doc": "

Execute an action for a message and return the response

\n", "signature": "(self, action, message):", "funcdef": "def"}, "test_marvin_actions.ActionTest.assertActionOutput": {"fullname": "test_marvin_actions.ActionTest.assertActionOutput", "modulename": "test_marvin_actions", "qualname": "ActionTest.assertActionOutput", "kind": "function", "doc": "

Call an action on message and assert expected output

\n", "signature": "(self, action, message, expectedOutput):", "funcdef": "def"}, "test_marvin_actions.ActionTest.assertActionSilent": {"fullname": "test_marvin_actions.ActionTest.assertActionSilent", "modulename": "test_marvin_actions", "qualname": "ActionTest.assertActionSilent", "kind": "function", "doc": "

Call an action with provided message and assert no output

\n", "signature": "(self, action, message):", "funcdef": "def"}, "test_marvin_actions.ActionTest.assertStringsOutput": {"fullname": "test_marvin_actions.ActionTest.assertStringsOutput", "modulename": "test_marvin_actions", "qualname": "ActionTest.assertStringsOutput", "kind": "function", "doc": "

Call an action with provided message and assert the output is equal to DB

\n", "signature": "(self, action, message, expectedoutputKey, subkey=None):", "funcdef": "def"}, "test_marvin_actions.ActionTest.assertBBQResponse": {"fullname": "test_marvin_actions.ActionTest.assertBBQResponse", "modulename": "test_marvin_actions", "qualname": "ActionTest.assertBBQResponse", "kind": "function", "doc": "

Assert that the proper bbq message is returned, given a date

\n", "signature": "(self, todaysDate, bbqDate, expectedMessageKey):", "funcdef": "def"}, "test_marvin_actions.ActionTest.assertNameDayOutput": {"fullname": "test_marvin_actions.ActionTest.assertNameDayOutput", "modulename": "test_marvin_actions", "qualname": "ActionTest.assertNameDayOutput", "kind": "function", "doc": "

Assert that the proper nameday message is returned, given an inputfile

\n", "signature": "(self, exampleFile, expectedOutput):", "funcdef": "def"}, "test_marvin_actions.ActionTest.assertJokeOutput": {"fullname": "test_marvin_actions.ActionTest.assertJokeOutput", "modulename": "test_marvin_actions", "qualname": "ActionTest.assertJokeOutput", "kind": "function", "doc": "

Assert that a joke is returned, given an input file

\n", "signature": "(self, exampleFile, expectedOutput):", "funcdef": "def"}, "test_marvin_actions.ActionTest.testSmile": {"fullname": "test_marvin_actions.ActionTest.testSmile", "modulename": "test_marvin_actions", "qualname": "ActionTest.testSmile", "kind": "function", "doc": "

Test that marvin can smile

\n", "signature": "(self):", "funcdef": "def"}, "test_marvin_actions.ActionTest.testWhois": {"fullname": "test_marvin_actions.ActionTest.testWhois", "modulename": "test_marvin_actions", "qualname": "ActionTest.testWhois", "kind": "function", "doc": "

Test that marvin responds to whois

\n", "signature": "(self):", "funcdef": "def"}, "test_marvin_actions.ActionTest.testGoogle": {"fullname": "test_marvin_actions.ActionTest.testGoogle", "modulename": "test_marvin_actions", "qualname": "ActionTest.testGoogle", "kind": "function", "doc": "

Test that marvin can help google stuff

\n", "signature": "(self):", "funcdef": "def"}, "test_marvin_actions.ActionTest.testExplainShell": {"fullname": "test_marvin_actions.ActionTest.testExplainShell", "modulename": "test_marvin_actions", "qualname": "ActionTest.testExplainShell", "kind": "function", "doc": "

Test that marvin can explain shell commands

\n", "signature": "(self):", "funcdef": "def"}, "test_marvin_actions.ActionTest.testSource": {"fullname": "test_marvin_actions.ActionTest.testSource", "modulename": "test_marvin_actions", "qualname": "ActionTest.testSource", "kind": "function", "doc": "

Test that marvin responds to questions about source code

\n", "signature": "(self):", "funcdef": "def"}, "test_marvin_actions.ActionTest.testBudord": {"fullname": "test_marvin_actions.ActionTest.testBudord", "modulename": "test_marvin_actions", "qualname": "ActionTest.testBudord", "kind": "function", "doc": "

Test that marvin knows all the commandments

\n", "signature": "(self):", "funcdef": "def"}, "test_marvin_actions.ActionTest.testQuote": {"fullname": "test_marvin_actions.ActionTest.testQuote", "modulename": "test_marvin_actions", "qualname": "ActionTest.testQuote", "kind": "function", "doc": "

Test that marvin can quote The Hitchhikers Guide to the Galaxy

\n", "signature": "(self):", "funcdef": "def"}, "test_marvin_actions.ActionTest.testVideoOfToday": {"fullname": "test_marvin_actions.ActionTest.testVideoOfToday", "modulename": "test_marvin_actions", "qualname": "ActionTest.testVideoOfToday", "kind": "function", "doc": "

Test that marvin can link to a different video each day of the week

\n", "signature": "(self):", "funcdef": "def"}, "test_marvin_actions.ActionTest.testHelp": {"fullname": "test_marvin_actions.ActionTest.testHelp", "modulename": "test_marvin_actions", "qualname": "ActionTest.testHelp", "kind": "function", "doc": "

Test that marvin can provide a help menu

\n", "signature": "(self):", "funcdef": "def"}, "test_marvin_actions.ActionTest.testStats": {"fullname": "test_marvin_actions.ActionTest.testStats", "modulename": "test_marvin_actions", "qualname": "ActionTest.testStats", "kind": "function", "doc": "

Test that marvin can provide a link to the IRC stats page

\n", "signature": "(self):", "funcdef": "def"}, "test_marvin_actions.ActionTest.testIRCLog": {"fullname": "test_marvin_actions.ActionTest.testIRCLog", "modulename": "test_marvin_actions", "qualname": "ActionTest.testIRCLog", "kind": "function", "doc": "

Test that marvin can provide a link to the IRC log

\n", "signature": "(self):", "funcdef": "def"}, "test_marvin_actions.ActionTest.testSayHi": {"fullname": "test_marvin_actions.ActionTest.testSayHi", "modulename": "test_marvin_actions", "qualname": "ActionTest.testSayHi", "kind": "function", "doc": "

Test that marvin responds to greetings

\n", "signature": "(self):", "funcdef": "def"}, "test_marvin_actions.ActionTest.testLunchLocations": {"fullname": "test_marvin_actions.ActionTest.testLunchLocations", "modulename": "test_marvin_actions", "qualname": "ActionTest.testLunchLocations", "kind": "function", "doc": "

Test that marvin can provide lunch suggestions for certain places

\n", "signature": "(self):", "funcdef": "def"}, "test_marvin_actions.ActionTest.testStrip": {"fullname": "test_marvin_actions.ActionTest.testStrip", "modulename": "test_marvin_actions", "qualname": "ActionTest.testStrip", "kind": "function", "doc": "

Test that marvin can recommend comics

\n", "signature": "(self):", "funcdef": "def"}, "test_marvin_actions.ActionTest.testRandomStrip": {"fullname": "test_marvin_actions.ActionTest.testRandomStrip", "modulename": "test_marvin_actions", "qualname": "ActionTest.testRandomStrip", "kind": "function", "doc": "

Test that marvin can recommend random comics

\n", "signature": "(self):", "funcdef": "def"}, "test_marvin_actions.ActionTest.testTimeToBBQ": {"fullname": "test_marvin_actions.ActionTest.testTimeToBBQ", "modulename": "test_marvin_actions", "qualname": "ActionTest.testTimeToBBQ", "kind": "function", "doc": "

Test that marvin knows when the next BBQ is

\n", "signature": "(self):", "funcdef": "def"}, "test_marvin_actions.ActionTest.testNameDayReaction": {"fullname": "test_marvin_actions.ActionTest.testNameDayReaction", "modulename": "test_marvin_actions", "qualname": "ActionTest.testNameDayReaction", "kind": "function", "doc": "

Test that marvin only responds to nameday when asked

\n", "signature": "(self):", "funcdef": "def"}, "test_marvin_actions.ActionTest.testNameDayRequest": {"fullname": "test_marvin_actions.ActionTest.testNameDayRequest", "modulename": "test_marvin_actions", "qualname": "ActionTest.testNameDayRequest", "kind": "function", "doc": "

Test that marvin sends a proper request for nameday info

\n", "signature": "(self):", "funcdef": "def"}, "test_marvin_actions.ActionTest.testNameDayResponse": {"fullname": "test_marvin_actions.ActionTest.testNameDayResponse", "modulename": "test_marvin_actions", "qualname": "ActionTest.testNameDayResponse", "kind": "function", "doc": "

Test that marvin properly parses nameday responses

\n", "signature": "(self):", "funcdef": "def"}, "test_marvin_actions.ActionTest.testJokeRequest": {"fullname": "test_marvin_actions.ActionTest.testJokeRequest", "modulename": "test_marvin_actions", "qualname": "ActionTest.testJokeRequest", "kind": "function", "doc": "

Test that marvin sends a proper request for a joke

\n", "signature": "(self):", "funcdef": "def"}, "test_marvin_actions.ActionTest.testJoke": {"fullname": "test_marvin_actions.ActionTest.testJoke", "modulename": "test_marvin_actions", "qualname": "ActionTest.testJoke", "kind": "function", "doc": "

Test that marvin sends a joke when requested

\n", "signature": "(self):", "funcdef": "def"}, "test_marvin_actions.ActionTest.testUptime": {"fullname": "test_marvin_actions.ActionTest.testUptime", "modulename": "test_marvin_actions", "qualname": "ActionTest.testUptime", "kind": "function", "doc": "

Test that marvin can provide the link to the uptime tournament

\n", "signature": "(self):", "funcdef": "def"}, "test_marvin_actions.ActionTest.testStream": {"fullname": "test_marvin_actions.ActionTest.testStream", "modulename": "test_marvin_actions", "qualname": "ActionTest.testStream", "kind": "function", "doc": "

Test that marvin can provide the link to the stream

\n", "signature": "(self):", "funcdef": "def"}, "test_marvin_actions.ActionTest.testPrinciple": {"fullname": "test_marvin_actions.ActionTest.testPrinciple", "modulename": "test_marvin_actions", "qualname": "ActionTest.testPrinciple", "kind": "function", "doc": "

Test that marvin can recite some software principles

\n", "signature": "(self):", "funcdef": "def"}, "test_marvin_actions.ActionTest.testCommitRequest": {"fullname": "test_marvin_actions.ActionTest.testCommitRequest", "modulename": "test_marvin_actions", "qualname": "ActionTest.testCommitRequest", "kind": "function", "doc": "

Test that marvin sends proper requests when generating commit messages

\n", "signature": "(self):", "funcdef": "def"}, "test_marvin_actions.ActionTest.testCommitResponse": {"fullname": "test_marvin_actions.ActionTest.testCommitResponse", "modulename": "test_marvin_actions", "qualname": "ActionTest.testCommitResponse", "kind": "function", "doc": "

Test that marvin properly handles responses when generating commit messages

\n", "signature": "(self):", "funcdef": "def"}, "test_marvin_actions.ActionTest.testMorning": {"fullname": "test_marvin_actions.ActionTest.testMorning", "modulename": "test_marvin_actions", "qualname": "ActionTest.testMorning", "kind": "function", "doc": "

Test that marvin wishes good morning, at most once per day

\n", "signature": "(self):", "funcdef": "def"}}, "docInfo": {"bot": {"qualname": 0, "fullname": 1, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 11}, "bot.Bot": {"qualname": 1, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 10}, "bot.Bot.CONFIG": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "bot.Bot.ACTIONS": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "bot.Bot.GENERAL_ACTIONS": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "bot.Bot.getConfig": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 6}, "bot.Bot.setConfig": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 16, "bases": 0, "doc": 6}, "bot.Bot.registerActions": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 16, "bases": 0, "doc": 6}, "bot.Bot.registerGeneralActions": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 16, "bases": 0, "doc": 7}, "bot.Bot.tokenize": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 8}, "discord_bot": {"qualname": 0, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 20}, "discord_bot.DiscordBot": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 5, "doc": 7}, "discord_bot.DiscordBot.CONFIG": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "discord_bot.DiscordBot.begin": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 5}, "discord_bot.DiscordBot.checkMarvinActions": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 16, "bases": 0, "doc": 9}, "discord_bot.DiscordBot.on_message": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 16, "bases": 0, "doc": 7}, "irc_bot": {"qualname": 0, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 30}, "irc_bot.IrcBot": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 2, "doc": 7}, "irc_bot.IrcBot.CONFIG": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "irc_bot.IrcBot.SOCKET": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "irc_bot.IrcBot.IRCLOG": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "irc_bot.IrcBot.connectToServer": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 7}, "irc_bot.IrcBot.sendPrivMsg": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 21, "bases": 0, "doc": 8}, "irc_bot.IrcBot.sendMsg": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 16, "bases": 0, "doc": 9}, "irc_bot.IrcBot.decode_irc": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 27, "bases": 0, "doc": 25}, "irc_bot.IrcBot.receive": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 8}, "irc_bot.IrcBot.ircLogAppend": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 41, "bases": 0, "doc": 8}, "irc_bot.IrcBot.ircLogWriteToFile": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 6}, "irc_bot.IrcBot.readincoming": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 26}, "irc_bot.IrcBot.mainLoop": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 10}, "irc_bot.IrcBot.begin": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 5}, "irc_bot.IrcBot.checkIrcActions": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 16, "bases": 0, "doc": 17}, "irc_bot.IrcBot.checkMarvinActions": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 16, "bases": 0, "doc": 9}, "main": {"qualname": 0, "fullname": 1, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 251}, "main.PROGRAM": {"qualname": 1, "fullname": 2, "annotation": 0, "default_value": 5, "signature": 0, "bases": 0, "doc": 3}, "main.AUTHOR": {"qualname": 1, "fullname": 2, "annotation": 0, "default_value": 6, "signature": 0, "bases": 0, "doc": 3}, "main.EMAIL": {"qualname": 1, "fullname": 2, "annotation": 0, "default_value": 9, "signature": 0, "bases": 0, "doc": 3}, "main.VERSION": {"qualname": 1, "fullname": 2, "annotation": 0, "default_value": 7, "signature": 0, "bases": 0, "doc": 3}, "main.MSG_VERSION": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 9, "signature": 0, "bases": 0, "doc": 3}, "main.printVersion": {"qualname": 1, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 7, "bases": 0, "doc": 8}, "main.mergeOptionsWithConfigFile": {"qualname": 1, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 16, "bases": 0, "doc": 8}, "main.parseOptions": {"qualname": 1, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 17}, "main.determineProtocol": {"qualname": 1, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 7, "bases": 0, "doc": 11}, "main.createBot": {"qualname": 1, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 12}, "main.main": {"qualname": 1, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 7, "bases": 0, "doc": 10}, "marvin_actions": {"qualname": 0, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 12}, "marvin_actions.getAllActions": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 7, "bases": 0, "doc": 9}, "marvin_actions.CONFIG": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "marvin_actions.setConfig": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 9}, "marvin_actions.getString": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 21, "bases": 0, "doc": 10}, "marvin_actions.marvinSmile": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 6}, "marvin_actions.wordsAfterKeyWords": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 16, "bases": 0, "doc": 21}, "marvin_actions.marvinGoogle": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 10}, "marvin_actions.marvinExplainShell": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 18}, "marvin_actions.marvinSource": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 7}, "marvin_actions.marvinBudord": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 8}, "marvin_actions.marvinQuote": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 6}, "marvin_actions.videoOfToday": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 7, "bases": 0, "doc": 20}, "marvin_actions.marvinVideoOfToday": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 8}, "marvin_actions.marvinWhoIs": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 6}, "marvin_actions.marvinHelp": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 6}, "marvin_actions.marvinStats": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 9}, "marvin_actions.marvinIrcLog": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 8}, "marvin_actions.marvinSayHi": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 9}, "marvin_actions.marvinLunch": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 8}, "marvin_actions.marvinListen": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 8}, "marvin_actions.marvinSun": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 11}, "marvin_actions.marvinWeather": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 10}, "marvin_actions.marvinStrip": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 7}, "marvin_actions.commitStrip": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 16, "bases": 0, "doc": 10}, "marvin_actions.marvinTimeToBBQ": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 13}, "marvin_actions.nextBBQ": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 7, "bases": 0, "doc": 9}, "marvin_actions.thirdFridayIn": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 16, "bases": 0, "doc": 12}, "marvin_actions.marvinBirthday": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 5}, "marvin_actions.marvinNameday": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 5}, "marvin_actions.marvinUptime": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 7}, "marvin_actions.marvinStream": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 6}, "marvin_actions.marvinPrinciple": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 12}, "marvin_actions.getJoke": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 7, "bases": 0, "doc": 9}, "marvin_actions.marvinJoke": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 8}, "marvin_actions.getCommit": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 7, "bases": 0, "doc": 10}, "marvin_actions.marvinCommit": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 7}, "marvin_general_actions": {"qualname": 0, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 13}, "marvin_general_actions.CONFIG": {"qualname": 1, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "marvin_general_actions.lastDateGreeted": {"qualname": 1, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "marvin_general_actions.setConfig": {"qualname": 1, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 9}, "marvin_general_actions.getString": {"qualname": 1, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 21, "bases": 0, "doc": 10}, "marvin_general_actions.getAllGeneralActions": {"qualname": 1, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 7, "bases": 0, "doc": 10}, "marvin_general_actions.marvinMorning": {"qualname": 1, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 11}, "test_main": {"qualname": 0, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 7}, "test_main.ConfigMergeTest": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 3, "doc": 10}, "test_main.ConfigMergeTest.assertMergedConfig": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 26, "bases": 0, "doc": 12}, "test_main.ConfigMergeTest.testEmpty": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 8}, "test_main.ConfigMergeTest.testAddSingleParameter": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 10}, "test_main.ConfigMergeTest.testAddSingleParameterOverwrites": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 13}, "test_main.ConfigMergeTest.testAddSingleParameterMerges": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 14}, "test_main.ConfigParseTest": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 3, "doc": 8}, "test_main.ConfigParseTest.SAMPLE_CONFIG": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 47, "signature": 0, "bases": 0, "doc": 3}, "test_main.ConfigParseTest.CHANGED_CONFIG": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 46, "signature": 0, "bases": 0, "doc": 3}, "test_main.ConfigParseTest.testOverrideHardcodedParameters": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 14}, "test_main.ConfigParseTest.testOverrideMultipleParameters": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 11}, "test_main.ConfigParseTest.testOverrideWithFile": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 12}, "test_main.ConfigParseTest.testOverridePrecedenceConfigFirst": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 25}, "test_main.ConfigParseTest.testOverridePrecedenceParameterFirst": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 25}, "test_main.ConfigParseTest.testBannedParameters": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 16}, "test_main.FormattingTest": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 3, "doc": 8}, "test_main.FormattingTest.USAGE": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 34, "signature": 0, "bases": 0, "doc": 3}, "test_main.FormattingTest.OPTIONS": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 32, "signature": 0, "bases": 0, "doc": 3}, "test_main.FormattingTest.setUpClass": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 17}, "test_main.FormattingTest.assertPrintOption": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 26, "bases": 0, "doc": 14}, "test_main.FormattingTest.testHelpPrintout": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 13}, "test_main.FormattingTest.testHelpPrintoutShort": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 13}, "test_main.FormattingTest.testVersionPrintout": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 13}, "test_main.FormattingTest.testVersionPrintoutShort": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 13}, "test_main.FormattingTest.testUnhandledOption": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 9}, "test_main.FormattingTest.testUnhandledArgument": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 9}, "test_main.TestArgumentParsing": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 3, "doc": 15}, "test_main.TestArgumentParsing.testDetermineDiscordProtocol": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 19}, "test_main.TestArgumentParsing.testDetermineIRCProtocol": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 19}, "test_main.TestArgumentParsing.testDetermineIRCProtocolisDefault": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 13}, "test_main.TestArgumentParsing.testDetermineConfigThrowsOnInvalidProto": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 10}, "test_main.TestBotFactoryMethod": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 3, "doc": 10}, "test_main.TestBotFactoryMethod.testCreateIRCBot": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 10}, "test_main.TestBotFactoryMethod.testCreateDiscordBot": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 10}, "test_main.TestBotFactoryMethod.testCreateUnsupportedProtocolThrows": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 16}, "test_marvin_actions": {"qualname": 0, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 7}, "test_marvin_actions.ActionTest": {"qualname": 1, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 3, "doc": 5}, "test_marvin_actions.ActionTest.strings": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "test_marvin_actions.ActionTest.setUpClass": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 16}, "test_marvin_actions.ActionTest.executeAction": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 21, "bases": 0, "doc": 12}, "test_marvin_actions.ActionTest.assertActionOutput": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 26, "bases": 0, "doc": 11}, "test_marvin_actions.ActionTest.assertActionSilent": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 21, "bases": 0, "doc": 12}, "test_marvin_actions.ActionTest.assertStringsOutput": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 36, "bases": 0, "doc": 16}, "test_marvin_actions.ActionTest.assertBBQResponse": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 26, "bases": 0, "doc": 13}, "test_marvin_actions.ActionTest.assertNameDayOutput": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 21, "bases": 0, "doc": 13}, "test_marvin_actions.ActionTest.assertJokeOutput": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 21, "bases": 0, "doc": 12}, "test_marvin_actions.ActionTest.testSmile": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 7}, "test_marvin_actions.ActionTest.testWhois": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 8}, "test_marvin_actions.ActionTest.testGoogle": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 9}, "test_marvin_actions.ActionTest.testExplainShell": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 9}, "test_marvin_actions.ActionTest.testSource": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 11}, "test_marvin_actions.ActionTest.testBudord": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 9}, "test_marvin_actions.ActionTest.testQuote": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 13}, "test_marvin_actions.ActionTest.testVideoOfToday": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 16}, "test_marvin_actions.ActionTest.testHelp": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 10}, "test_marvin_actions.ActionTest.testStats": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 14}, "test_marvin_actions.ActionTest.testIRCLog": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 13}, "test_marvin_actions.ActionTest.testSayHi": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 8}, "test_marvin_actions.ActionTest.testLunchLocations": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 12}, "test_marvin_actions.ActionTest.testStrip": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 8}, "test_marvin_actions.ActionTest.testRandomStrip": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 9}, "test_marvin_actions.ActionTest.testTimeToBBQ": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 11}, "test_marvin_actions.ActionTest.testNameDayReaction": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 11}, "test_marvin_actions.ActionTest.testNameDayRequest": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 12}, "test_marvin_actions.ActionTest.testNameDayResponse": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 9}, "test_marvin_actions.ActionTest.testJokeRequest": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 12}, "test_marvin_actions.ActionTest.testJoke": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 10}, "test_marvin_actions.ActionTest.testUptime": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 13}, "test_marvin_actions.ActionTest.testStream": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 12}, "test_marvin_actions.ActionTest.testPrinciple": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 10}, "test_marvin_actions.ActionTest.testCommitRequest": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 12}, "test_marvin_actions.ActionTest.testCommitResponse": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 12}, "test_marvin_actions.ActionTest.testMorning": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 13}}, "length": 163, "save": true}, "index": {"qualname": {"root": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"bot.Bot": {"tf": 1}, "bot.Bot.CONFIG": {"tf": 1}, "bot.Bot.ACTIONS": {"tf": 1}, "bot.Bot.GENERAL_ACTIONS": {"tf": 1}, "bot.Bot.getConfig": {"tf": 1}, "bot.Bot.setConfig": {"tf": 1}, "bot.Bot.registerActions": {"tf": 1}, "bot.Bot.registerGeneralActions": {"tf": 1}, "bot.Bot.tokenize": {"tf": 1}}, "df": 9}}, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"discord_bot.DiscordBot.begin": {"tf": 1}, "irc_bot.IrcBot.begin": {"tf": 1}}, "df": 2}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {"bot.Bot.CONFIG": {"tf": 1}, "discord_bot.DiscordBot.CONFIG": {"tf": 1}, "irc_bot.IrcBot.CONFIG": {"tf": 1}, "marvin_actions.CONFIG": {"tf": 1}, "marvin_general_actions.CONFIG": {"tf": 1}, "test_main.ConfigParseTest.SAMPLE_CONFIG": {"tf": 1}, "test_main.ConfigParseTest.CHANGED_CONFIG": {"tf": 1}}, "df": 7, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"test_main.ConfigMergeTest": {"tf": 1}, "test_main.ConfigMergeTest.assertMergedConfig": {"tf": 1}, "test_main.ConfigMergeTest.testEmpty": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameter": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameterOverwrites": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameterMerges": {"tf": 1}}, "df": 6}}}}}}}}}, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"test_main.ConfigParseTest": {"tf": 1}, "test_main.ConfigParseTest.SAMPLE_CONFIG": {"tf": 1}, "test_main.ConfigParseTest.CHANGED_CONFIG": {"tf": 1}, "test_main.ConfigParseTest.testOverrideHardcodedParameters": {"tf": 1}, "test_main.ConfigParseTest.testOverrideMultipleParameters": {"tf": 1}, "test_main.ConfigParseTest.testOverrideWithFile": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceConfigFirst": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceParameterFirst": {"tf": 1}, "test_main.ConfigParseTest.testBannedParameters": {"tf": 1}}, "df": 9}}}}}}}}}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"irc_bot.IrcBot.connectToServer": {"tf": 1}}, "df": 1}}}}}}}}}}}}}, "m": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {"marvin_actions.commitStrip": {"tf": 1}}, "df": 1}}}}}}}}}}, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"discord_bot.DiscordBot.checkMarvinActions": {"tf": 1}, "irc_bot.IrcBot.checkMarvinActions": {"tf": 1}}, "df": 2}}}}}}}}}}}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"irc_bot.IrcBot.checkIrcActions": {"tf": 1}}, "df": 1}}}}}}}}}}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"test_main.ConfigParseTest.CHANGED_CONFIG": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"main.createBot": {"tf": 1}}, "df": 1}}}}}}}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"bot.Bot.ACTIONS": {"tf": 1}, "bot.Bot.GENERAL_ACTIONS": {"tf": 1}}, "df": 2}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"test_marvin_actions.ActionTest": {"tf": 1}, "test_marvin_actions.ActionTest.strings": {"tf": 1}, "test_marvin_actions.ActionTest.setUpClass": {"tf": 1}, "test_marvin_actions.ActionTest.executeAction": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionSilent": {"tf": 1}, "test_marvin_actions.ActionTest.assertStringsOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertBBQResponse": {"tf": 1}, "test_marvin_actions.ActionTest.assertNameDayOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertJokeOutput": {"tf": 1}, "test_marvin_actions.ActionTest.testSmile": {"tf": 1}, "test_marvin_actions.ActionTest.testWhois": {"tf": 1}, "test_marvin_actions.ActionTest.testGoogle": {"tf": 1}, "test_marvin_actions.ActionTest.testExplainShell": {"tf": 1}, "test_marvin_actions.ActionTest.testSource": {"tf": 1}, "test_marvin_actions.ActionTest.testBudord": {"tf": 1}, "test_marvin_actions.ActionTest.testQuote": {"tf": 1}, "test_marvin_actions.ActionTest.testVideoOfToday": {"tf": 1}, "test_marvin_actions.ActionTest.testHelp": {"tf": 1}, "test_marvin_actions.ActionTest.testStats": {"tf": 1}, "test_marvin_actions.ActionTest.testIRCLog": {"tf": 1}, "test_marvin_actions.ActionTest.testSayHi": {"tf": 1}, "test_marvin_actions.ActionTest.testLunchLocations": {"tf": 1}, "test_marvin_actions.ActionTest.testStrip": {"tf": 1}, "test_marvin_actions.ActionTest.testRandomStrip": {"tf": 1}, "test_marvin_actions.ActionTest.testTimeToBBQ": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayReaction": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayResponse": {"tf": 1}, "test_marvin_actions.ActionTest.testJokeRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testJoke": {"tf": 1}, "test_marvin_actions.ActionTest.testUptime": {"tf": 1}, "test_marvin_actions.ActionTest.testStream": {"tf": 1}, "test_marvin_actions.ActionTest.testPrinciple": {"tf": 1}, "test_marvin_actions.ActionTest.testCommitRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testCommitResponse": {"tf": 1}, "test_marvin_actions.ActionTest.testMorning": {"tf": 1}}, "df": 37}}}}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"main.AUTHOR": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {"test_main.ConfigMergeTest.assertMergedConfig": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"test_main.FormattingTest.assertPrintOption": {"tf": 1}}, "df": 1}}}}}}}}}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"test_marvin_actions.ActionTest.assertActionOutput": {"tf": 1}}, "df": 1}}}}}}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"test_marvin_actions.ActionTest.assertActionSilent": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"test_marvin_actions.ActionTest.assertStringsOutput": {"tf": 1}}, "df": 1}}}}}}}}}}}}}, "b": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "q": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.assertBBQResponse": {"tf": 1}}, "df": 1}}}}}}}}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"test_marvin_actions.ActionTest.assertNameDayOutput": {"tf": 1}}, "df": 1}}}}}}}}}}}}}, "j": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"test_marvin_actions.ActionTest.assertJokeOutput": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"bot.Bot.GENERAL_ACTIONS": {"tf": 1}}, "df": 1}}}}}, "t": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {"bot.Bot.getConfig": {"tf": 1}}, "df": 1}}}}, "m": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"marvin_actions.getCommit": {"tf": 1}}, "df": 1}}}}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"marvin_actions.getAllActions": {"tf": 1}}, "df": 1}}}}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"marvin_general_actions.getAllGeneralActions": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"marvin_actions.getString": {"tf": 1}, "marvin_general_actions.getString": {"tf": 1}}, "df": 2}}}}}}, "j": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.getJoke": {"tf": 1}}, "df": 1}}}}}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {"bot.Bot.setConfig": {"tf": 1}, "marvin_actions.setConfig": {"tf": 1}, "marvin_general_actions.setConfig": {"tf": 1}}, "df": 3}}}}}}, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"test_main.FormattingTest.setUpClass": {"tf": 1}, "test_marvin_actions.ActionTest.setUpClass": {"tf": 1}}, "df": 2}}}}}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "g": {"docs": {"irc_bot.IrcBot.sendPrivMsg": {"tf": 1}}, "df": 1}}}}}}}, "m": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "g": {"docs": {"irc_bot.IrcBot.sendMsg": {"tf": 1}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"irc_bot.IrcBot.SOCKET": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"test_main.ConfigParseTest.SAMPLE_CONFIG": {"tf": 1}}, "df": 1}}}}}, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"test_marvin_actions.ActionTest.strings": {"tf": 1}}, "df": 1}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"bot.Bot.registerActions": {"tf": 1}}, "df": 1}}}}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"bot.Bot.registerGeneralActions": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"irc_bot.IrcBot.receive": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"irc_bot.IrcBot.readincoming": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"bot.Bot.tokenize": {"tf": 1}}, "df": 1}}}}}}}, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"marvin_actions.thirdFridayIn": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"test_main.ConfigMergeTest.testEmpty": {"tf": 1}}, "df": 1}}}}, "x": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"test_marvin_actions.ActionTest.testExplainShell": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"test_main.ConfigMergeTest.testAddSingleParameter": {"tf": 1}}, "df": 1, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"test_main.ConfigMergeTest.testAddSingleParameterOverwrites": {"tf": 1}}, "df": 1}}}}}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"test_main.ConfigMergeTest.testAddSingleParameterMerges": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}}}}}, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"test_main.TestArgumentParsing": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineDiscordProtocol": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineIRCProtocol": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineIRCProtocolisDefault": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineConfigThrowsOnInvalidProto": {"tf": 1}}, "df": 5}}}}}}}}}}}}}}}, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"test_main.ConfigParseTest.testOverrideHardcodedParameters": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}, "m": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"test_main.ConfigParseTest.testOverrideMultipleParameters": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"test_main.ConfigParseTest.testOverrideWithFile": {"tf": 1}}, "df": 1}}}}}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"test_main.ConfigParseTest.testOverridePrecedenceConfigFirst": {"tf": 1}}, "df": 1}}}}}}}}}}}, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"test_main.ConfigParseTest.testOverridePrecedenceParameterFirst": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, "b": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"test_main.ConfigParseTest.testBannedParameters": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {"test_main.TestBotFactoryMethod": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateIRCBot": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateDiscordBot": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateUnsupportedProtocolThrows": {"tf": 1}}, "df": 4}}}}}}}}}}}}}}}, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {"test_marvin_actions.ActionTest.testBudord": {"tf": 1}}, "df": 1}}}}}}, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "p": {"docs": {"test_marvin_actions.ActionTest.testHelp": {"tf": 1}}, "df": 1, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"test_main.FormattingTest.testHelpPrintout": {"tf": 1}}, "df": 1, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"test_main.FormattingTest.testHelpPrintoutShort": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"test_main.FormattingTest.testVersionPrintout": {"tf": 1}}, "df": 1, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"test_main.FormattingTest.testVersionPrintoutShort": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"test_marvin_actions.ActionTest.testVideoOfToday": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"test_main.FormattingTest.testUnhandledOption": {"tf": 1}}, "df": 1}}}}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"test_main.FormattingTest.testUnhandledArgument": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.testUptime": {"tf": 1}}, "df": 1}}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {"test_main.TestArgumentParsing.testDetermineDiscordProtocol": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {"test_main.TestArgumentParsing.testDetermineIRCProtocol": {"tf": 1}}, "df": 1, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"test_main.TestArgumentParsing.testDetermineIRCProtocolisDefault": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {"test_main.TestArgumentParsing.testDetermineConfigThrowsOnInvalidProto": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"test_main.TestBotFactoryMethod.testCreateIRCBot": {"tf": 1}}, "df": 1}}}}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"test_main.TestBotFactoryMethod.testCreateDiscordBot": {"tf": 1}}, "df": 1}}}}}}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "s": {"docs": {"test_main.TestBotFactoryMethod.testCreateUnsupportedProtocolThrows": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"test_marvin_actions.ActionTest.testCommitRequest": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.testCommitResponse": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}, "s": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.testSmile": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.testSource": {"tf": 1}}, "df": 1}}}}}, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"test_marvin_actions.ActionTest.testStats": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {"test_marvin_actions.ActionTest.testStrip": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"test_marvin_actions.ActionTest.testStream": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {"test_marvin_actions.ActionTest.testSayHi": {"tf": 1}}, "df": 1}}}}}, "w": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {"test_marvin_actions.ActionTest.testWhois": {"tf": 1}}, "df": 1}}}}}, "g": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.testGoogle": {"tf": 1}}, "df": 1}}}}}}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.testQuote": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {"test_marvin_actions.ActionTest.testIRCLog": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"test_marvin_actions.ActionTest.testLunchLocations": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {"test_marvin_actions.ActionTest.testRandomStrip": {"tf": 1}}, "df": 1}}}}}}}}}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "q": {"docs": {"test_marvin_actions.ActionTest.testTimeToBBQ": {"tf": 1}}, "df": 1}}}}}}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"test_marvin_actions.ActionTest.testNameDayReaction": {"tf": 1}}, "df": 1}}}}}}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"test_marvin_actions.ActionTest.testNameDayRequest": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.testNameDayResponse": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "j": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.testJoke": {"tf": 1}}, "df": 1, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"test_marvin_actions.ActionTest.testJokeRequest": {"tf": 1}}, "df": 1}}}}}}}}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.testPrinciple": {"tf": 1}}, "df": 1}}}}}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"test_marvin_actions.ActionTest.testMorning": {"tf": 1}}, "df": 1}}}}}}}}}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"discord_bot.DiscordBot": {"tf": 1}, "discord_bot.DiscordBot.CONFIG": {"tf": 1}, "discord_bot.DiscordBot.begin": {"tf": 1}, "discord_bot.DiscordBot.checkMarvinActions": {"tf": 1}, "discord_bot.DiscordBot.on_message": {"tf": 1}}, "df": 5}}}}}}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"irc_bot.IrcBot.decode_irc": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {"main.determineProtocol": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {"discord_bot.DiscordBot.on_message": {"tf": 1}}, "df": 1}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"test_main.FormattingTest.OPTIONS": {"tf": 1}}, "df": 1}}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"discord_bot.DiscordBot.on_message": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"main.mergeOptionsWithConfigFile": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}}}}}}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"main.main": {"tf": 1}}, "df": 1, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {"irc_bot.IrcBot.mainLoop": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.marvinSmile": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.marvinSource": {"tf": 1}}, "df": 1}}}}}, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"marvin_actions.marvinStats": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {"marvin_actions.marvinStrip": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"marvin_actions.marvinStream": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {"marvin_actions.marvinSayHi": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {"marvin_actions.marvinSun": {"tf": 1}}, "df": 1}}}, "g": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.marvinGoogle": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"marvin_actions.marvinExplainShell": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {"marvin_actions.marvinBudord": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"marvin_actions.marvinBirthday": {"tf": 1}}, "df": 1}}}}}}}}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.marvinQuote": {"tf": 1}}, "df": 1}}}}}, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"marvin_actions.marvinVideoOfToday": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "w": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {"marvin_actions.marvinWhoIs": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"marvin_actions.marvinWeather": {"tf": 1}}, "df": 1}}}}}}}, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "p": {"docs": {"marvin_actions.marvinHelp": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {"marvin_actions.marvinIrcLog": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"marvin_actions.marvinLunch": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"marvin_actions.marvinListen": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "q": {"docs": {"marvin_actions.marvinTimeToBBQ": {"tf": 1}}, "df": 1}}}}}}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"marvin_actions.marvinNameday": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.marvinUptime": {"tf": 1}}, "df": 1}}}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.marvinPrinciple": {"tf": 1}}, "df": 1}}}}}}}}}, "j": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.marvinJoke": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"marvin_actions.marvinCommit": {"tf": 1}}, "df": 1}}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"marvin_general_actions.marvinMorning": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "s": {"docs": {}, "df": 0, "g": {"docs": {"main.MSG_VERSION": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {"irc_bot.IrcBot.decode_irc": {"tf": 1}}, "df": 1, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"irc_bot.IrcBot": {"tf": 1}, "irc_bot.IrcBot.CONFIG": {"tf": 1}, "irc_bot.IrcBot.SOCKET": {"tf": 1}, "irc_bot.IrcBot.IRCLOG": {"tf": 1}, "irc_bot.IrcBot.connectToServer": {"tf": 1}, "irc_bot.IrcBot.sendPrivMsg": {"tf": 1}, "irc_bot.IrcBot.sendMsg": {"tf": 1}, "irc_bot.IrcBot.decode_irc": {"tf": 1}, "irc_bot.IrcBot.receive": {"tf": 1}, "irc_bot.IrcBot.ircLogAppend": {"tf": 1}, "irc_bot.IrcBot.ircLogWriteToFile": {"tf": 1}, "irc_bot.IrcBot.readincoming": {"tf": 1}, "irc_bot.IrcBot.mainLoop": {"tf": 1}, "irc_bot.IrcBot.begin": {"tf": 1}, "irc_bot.IrcBot.checkIrcActions": {"tf": 1}, "irc_bot.IrcBot.checkMarvinActions": {"tf": 1}}, "df": 16}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {"irc_bot.IrcBot.IRCLOG": {"tf": 1}}, "df": 1, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"irc_bot.IrcBot.ircLogAppend": {"tf": 1}}, "df": 1}}}}}}, "w": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"irc_bot.IrcBot.ircLogWriteToFile": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"main.PROGRAM": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"main.printVersion": {"tf": 1}}, "df": 1}}}}}}}}}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"main.parseOptions": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {"main.EMAIL": {"tf": 1}}, "df": 1}}}}, "x": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"test_marvin_actions.ActionTest.executeAction": {"tf": 1}}, "df": 1}}}}}}}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"main.VERSION": {"tf": 1}, "main.MSG_VERSION": {"tf": 1}}, "df": 2}}}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"marvin_actions.videoOfToday": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "s": {"docs": {"marvin_actions.wordsAfterKeyWords": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "q": {"docs": {"marvin_actions.nextBBQ": {"tf": 1}}, "df": 1}}}}}}}, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"marvin_general_actions.lastDateGreeted": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"test_main.FormattingTest": {"tf": 1}, "test_main.FormattingTest.USAGE": {"tf": 1}, "test_main.FormattingTest.OPTIONS": {"tf": 1}, "test_main.FormattingTest.setUpClass": {"tf": 1}, "test_main.FormattingTest.assertPrintOption": {"tf": 1}, "test_main.FormattingTest.testHelpPrintout": {"tf": 1}, "test_main.FormattingTest.testHelpPrintoutShort": {"tf": 1}, "test_main.FormattingTest.testVersionPrintout": {"tf": 1}, "test_main.FormattingTest.testVersionPrintoutShort": {"tf": 1}, "test_main.FormattingTest.testUnhandledOption": {"tf": 1}, "test_main.FormattingTest.testUnhandledArgument": {"tf": 1}}, "df": 11}}}}}}}}}}}}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"test_main.FormattingTest.USAGE": {"tf": 1}}, "df": 1}}}}}}}, "fullname": {"root": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"bot": {"tf": 1}, "bot.Bot": {"tf": 1.4142135623730951}, "bot.Bot.CONFIG": {"tf": 1.4142135623730951}, "bot.Bot.ACTIONS": {"tf": 1.4142135623730951}, "bot.Bot.GENERAL_ACTIONS": {"tf": 1.4142135623730951}, "bot.Bot.getConfig": {"tf": 1.4142135623730951}, "bot.Bot.setConfig": {"tf": 1.4142135623730951}, "bot.Bot.registerActions": {"tf": 1.4142135623730951}, "bot.Bot.registerGeneralActions": {"tf": 1.4142135623730951}, "bot.Bot.tokenize": {"tf": 1.4142135623730951}, "discord_bot": {"tf": 1}, "discord_bot.DiscordBot": {"tf": 1}, "discord_bot.DiscordBot.CONFIG": {"tf": 1}, "discord_bot.DiscordBot.begin": {"tf": 1}, "discord_bot.DiscordBot.checkMarvinActions": {"tf": 1}, "discord_bot.DiscordBot.on_message": {"tf": 1}, "irc_bot": {"tf": 1}, "irc_bot.IrcBot": {"tf": 1}, "irc_bot.IrcBot.CONFIG": {"tf": 1}, "irc_bot.IrcBot.SOCKET": {"tf": 1}, "irc_bot.IrcBot.IRCLOG": {"tf": 1}, "irc_bot.IrcBot.connectToServer": {"tf": 1}, "irc_bot.IrcBot.sendPrivMsg": {"tf": 1}, "irc_bot.IrcBot.sendMsg": {"tf": 1}, "irc_bot.IrcBot.decode_irc": {"tf": 1}, "irc_bot.IrcBot.receive": {"tf": 1}, "irc_bot.IrcBot.ircLogAppend": {"tf": 1}, "irc_bot.IrcBot.ircLogWriteToFile": {"tf": 1}, "irc_bot.IrcBot.readincoming": {"tf": 1}, "irc_bot.IrcBot.mainLoop": {"tf": 1}, "irc_bot.IrcBot.begin": {"tf": 1}, "irc_bot.IrcBot.checkIrcActions": {"tf": 1}, "irc_bot.IrcBot.checkMarvinActions": {"tf": 1}}, "df": 33}}, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"discord_bot.DiscordBot.begin": {"tf": 1}, "irc_bot.IrcBot.begin": {"tf": 1}}, "df": 2}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {"bot.Bot.CONFIG": {"tf": 1}, "discord_bot.DiscordBot.CONFIG": {"tf": 1}, "irc_bot.IrcBot.CONFIG": {"tf": 1}, "marvin_actions.CONFIG": {"tf": 1}, "marvin_general_actions.CONFIG": {"tf": 1}, "test_main.ConfigParseTest.SAMPLE_CONFIG": {"tf": 1}, "test_main.ConfigParseTest.CHANGED_CONFIG": {"tf": 1}}, "df": 7, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"test_main.ConfigMergeTest": {"tf": 1}, "test_main.ConfigMergeTest.assertMergedConfig": {"tf": 1}, "test_main.ConfigMergeTest.testEmpty": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameter": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameterOverwrites": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameterMerges": {"tf": 1}}, "df": 6}}}}}}}}}, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"test_main.ConfigParseTest": {"tf": 1}, "test_main.ConfigParseTest.SAMPLE_CONFIG": {"tf": 1}, "test_main.ConfigParseTest.CHANGED_CONFIG": {"tf": 1}, "test_main.ConfigParseTest.testOverrideHardcodedParameters": {"tf": 1}, "test_main.ConfigParseTest.testOverrideMultipleParameters": {"tf": 1}, "test_main.ConfigParseTest.testOverrideWithFile": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceConfigFirst": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceParameterFirst": {"tf": 1}, "test_main.ConfigParseTest.testBannedParameters": {"tf": 1}}, "df": 9}}}}}}}}}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"irc_bot.IrcBot.connectToServer": {"tf": 1}}, "df": 1}}}}}}}}}}}}}, "m": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {"marvin_actions.commitStrip": {"tf": 1}}, "df": 1}}}}}}}}}}, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"discord_bot.DiscordBot.checkMarvinActions": {"tf": 1}, "irc_bot.IrcBot.checkMarvinActions": {"tf": 1}}, "df": 2}}}}}}}}}}}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"irc_bot.IrcBot.checkIrcActions": {"tf": 1}}, "df": 1}}}}}}}}}}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"test_main.ConfigParseTest.CHANGED_CONFIG": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"main.createBot": {"tf": 1}}, "df": 1}}}}}}}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"bot.Bot.ACTIONS": {"tf": 1}, "bot.Bot.GENERAL_ACTIONS": {"tf": 1}, "marvin_actions": {"tf": 1}, "marvin_actions.getAllActions": {"tf": 1}, "marvin_actions.CONFIG": {"tf": 1}, "marvin_actions.setConfig": {"tf": 1}, "marvin_actions.getString": {"tf": 1}, "marvin_actions.marvinSmile": {"tf": 1}, "marvin_actions.wordsAfterKeyWords": {"tf": 1}, "marvin_actions.marvinGoogle": {"tf": 1}, "marvin_actions.marvinExplainShell": {"tf": 1}, "marvin_actions.marvinSource": {"tf": 1}, "marvin_actions.marvinBudord": {"tf": 1}, "marvin_actions.marvinQuote": {"tf": 1}, "marvin_actions.videoOfToday": {"tf": 1}, "marvin_actions.marvinVideoOfToday": {"tf": 1}, "marvin_actions.marvinWhoIs": {"tf": 1}, "marvin_actions.marvinHelp": {"tf": 1}, "marvin_actions.marvinStats": {"tf": 1}, "marvin_actions.marvinIrcLog": {"tf": 1}, "marvin_actions.marvinSayHi": {"tf": 1}, "marvin_actions.marvinLunch": {"tf": 1}, "marvin_actions.marvinListen": {"tf": 1}, "marvin_actions.marvinSun": {"tf": 1}, "marvin_actions.marvinWeather": {"tf": 1}, "marvin_actions.marvinStrip": {"tf": 1}, "marvin_actions.commitStrip": {"tf": 1}, "marvin_actions.marvinTimeToBBQ": {"tf": 1}, "marvin_actions.nextBBQ": {"tf": 1}, "marvin_actions.thirdFridayIn": {"tf": 1}, "marvin_actions.marvinBirthday": {"tf": 1}, "marvin_actions.marvinNameday": {"tf": 1}, "marvin_actions.marvinUptime": {"tf": 1}, "marvin_actions.marvinStream": {"tf": 1}, "marvin_actions.marvinPrinciple": {"tf": 1}, "marvin_actions.getJoke": {"tf": 1}, "marvin_actions.marvinJoke": {"tf": 1}, "marvin_actions.getCommit": {"tf": 1}, "marvin_actions.marvinCommit": {"tf": 1}, "marvin_general_actions": {"tf": 1}, "marvin_general_actions.CONFIG": {"tf": 1}, "marvin_general_actions.lastDateGreeted": {"tf": 1}, "marvin_general_actions.setConfig": {"tf": 1}, "marvin_general_actions.getString": {"tf": 1}, "marvin_general_actions.getAllGeneralActions": {"tf": 1}, "marvin_general_actions.marvinMorning": {"tf": 1}, "test_marvin_actions": {"tf": 1}, "test_marvin_actions.ActionTest": {"tf": 1}, "test_marvin_actions.ActionTest.strings": {"tf": 1}, "test_marvin_actions.ActionTest.setUpClass": {"tf": 1}, "test_marvin_actions.ActionTest.executeAction": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionSilent": {"tf": 1}, "test_marvin_actions.ActionTest.assertStringsOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertBBQResponse": {"tf": 1}, "test_marvin_actions.ActionTest.assertNameDayOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertJokeOutput": {"tf": 1}, "test_marvin_actions.ActionTest.testSmile": {"tf": 1}, "test_marvin_actions.ActionTest.testWhois": {"tf": 1}, "test_marvin_actions.ActionTest.testGoogle": {"tf": 1}, "test_marvin_actions.ActionTest.testExplainShell": {"tf": 1}, "test_marvin_actions.ActionTest.testSource": {"tf": 1}, "test_marvin_actions.ActionTest.testBudord": {"tf": 1}, "test_marvin_actions.ActionTest.testQuote": {"tf": 1}, "test_marvin_actions.ActionTest.testVideoOfToday": {"tf": 1}, "test_marvin_actions.ActionTest.testHelp": {"tf": 1}, "test_marvin_actions.ActionTest.testStats": {"tf": 1}, "test_marvin_actions.ActionTest.testIRCLog": {"tf": 1}, "test_marvin_actions.ActionTest.testSayHi": {"tf": 1}, "test_marvin_actions.ActionTest.testLunchLocations": {"tf": 1}, "test_marvin_actions.ActionTest.testStrip": {"tf": 1}, "test_marvin_actions.ActionTest.testRandomStrip": {"tf": 1}, "test_marvin_actions.ActionTest.testTimeToBBQ": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayReaction": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayResponse": {"tf": 1}, "test_marvin_actions.ActionTest.testJokeRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testJoke": {"tf": 1}, "test_marvin_actions.ActionTest.testUptime": {"tf": 1}, "test_marvin_actions.ActionTest.testStream": {"tf": 1}, "test_marvin_actions.ActionTest.testPrinciple": {"tf": 1}, "test_marvin_actions.ActionTest.testCommitRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testCommitResponse": {"tf": 1}, "test_marvin_actions.ActionTest.testMorning": {"tf": 1}}, "df": 84}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"test_marvin_actions.ActionTest": {"tf": 1}, "test_marvin_actions.ActionTest.strings": {"tf": 1}, "test_marvin_actions.ActionTest.setUpClass": {"tf": 1}, "test_marvin_actions.ActionTest.executeAction": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionSilent": {"tf": 1}, "test_marvin_actions.ActionTest.assertStringsOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertBBQResponse": {"tf": 1}, "test_marvin_actions.ActionTest.assertNameDayOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertJokeOutput": {"tf": 1}, "test_marvin_actions.ActionTest.testSmile": {"tf": 1}, "test_marvin_actions.ActionTest.testWhois": {"tf": 1}, "test_marvin_actions.ActionTest.testGoogle": {"tf": 1}, "test_marvin_actions.ActionTest.testExplainShell": {"tf": 1}, "test_marvin_actions.ActionTest.testSource": {"tf": 1}, "test_marvin_actions.ActionTest.testBudord": {"tf": 1}, "test_marvin_actions.ActionTest.testQuote": {"tf": 1}, "test_marvin_actions.ActionTest.testVideoOfToday": {"tf": 1}, "test_marvin_actions.ActionTest.testHelp": {"tf": 1}, "test_marvin_actions.ActionTest.testStats": {"tf": 1}, "test_marvin_actions.ActionTest.testIRCLog": {"tf": 1}, "test_marvin_actions.ActionTest.testSayHi": {"tf": 1}, "test_marvin_actions.ActionTest.testLunchLocations": {"tf": 1}, "test_marvin_actions.ActionTest.testStrip": {"tf": 1}, "test_marvin_actions.ActionTest.testRandomStrip": {"tf": 1}, "test_marvin_actions.ActionTest.testTimeToBBQ": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayReaction": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayResponse": {"tf": 1}, "test_marvin_actions.ActionTest.testJokeRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testJoke": {"tf": 1}, "test_marvin_actions.ActionTest.testUptime": {"tf": 1}, "test_marvin_actions.ActionTest.testStream": {"tf": 1}, "test_marvin_actions.ActionTest.testPrinciple": {"tf": 1}, "test_marvin_actions.ActionTest.testCommitRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testCommitResponse": {"tf": 1}, "test_marvin_actions.ActionTest.testMorning": {"tf": 1}}, "df": 37}}}}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"main.AUTHOR": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {"test_main.ConfigMergeTest.assertMergedConfig": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"test_main.FormattingTest.assertPrintOption": {"tf": 1}}, "df": 1}}}}}}}}}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"test_marvin_actions.ActionTest.assertActionOutput": {"tf": 1}}, "df": 1}}}}}}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"test_marvin_actions.ActionTest.assertActionSilent": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"test_marvin_actions.ActionTest.assertStringsOutput": {"tf": 1}}, "df": 1}}}}}}}}}}}}}, "b": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "q": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.assertBBQResponse": {"tf": 1}}, "df": 1}}}}}}}}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"test_marvin_actions.ActionTest.assertNameDayOutput": {"tf": 1}}, "df": 1}}}}}}}}}}}}}, "j": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"test_marvin_actions.ActionTest.assertJokeOutput": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"bot.Bot.GENERAL_ACTIONS": {"tf": 1}, "marvin_general_actions": {"tf": 1}, "marvin_general_actions.CONFIG": {"tf": 1}, "marvin_general_actions.lastDateGreeted": {"tf": 1}, "marvin_general_actions.setConfig": {"tf": 1}, "marvin_general_actions.getString": {"tf": 1}, "marvin_general_actions.getAllGeneralActions": {"tf": 1}, "marvin_general_actions.marvinMorning": {"tf": 1}}, "df": 8}}}}}, "t": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {"bot.Bot.getConfig": {"tf": 1}}, "df": 1}}}}, "m": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"marvin_actions.getCommit": {"tf": 1}}, "df": 1}}}}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"marvin_actions.getAllActions": {"tf": 1}}, "df": 1}}}}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"marvin_general_actions.getAllGeneralActions": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"marvin_actions.getString": {"tf": 1}, "marvin_general_actions.getString": {"tf": 1}}, "df": 2}}}}}}, "j": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.getJoke": {"tf": 1}}, "df": 1}}}}}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {"bot.Bot.setConfig": {"tf": 1}, "marvin_actions.setConfig": {"tf": 1}, "marvin_general_actions.setConfig": {"tf": 1}}, "df": 3}}}}}}, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"test_main.FormattingTest.setUpClass": {"tf": 1}, "test_marvin_actions.ActionTest.setUpClass": {"tf": 1}}, "df": 2}}}}}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "g": {"docs": {"irc_bot.IrcBot.sendPrivMsg": {"tf": 1}}, "df": 1}}}}}}}, "m": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "g": {"docs": {"irc_bot.IrcBot.sendMsg": {"tf": 1}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"irc_bot.IrcBot.SOCKET": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"test_main.ConfigParseTest.SAMPLE_CONFIG": {"tf": 1}}, "df": 1}}}}}, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"test_marvin_actions.ActionTest.strings": {"tf": 1}}, "df": 1}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"bot.Bot.registerActions": {"tf": 1}}, "df": 1}}}}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"bot.Bot.registerGeneralActions": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"irc_bot.IrcBot.receive": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"irc_bot.IrcBot.readincoming": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"bot.Bot.tokenize": {"tf": 1}}, "df": 1}}}}}}}, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"marvin_actions.thirdFridayIn": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"test_main": {"tf": 1}, "test_main.ConfigMergeTest": {"tf": 1}, "test_main.ConfigMergeTest.assertMergedConfig": {"tf": 1}, "test_main.ConfigMergeTest.testEmpty": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameter": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameterOverwrites": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameterMerges": {"tf": 1}, "test_main.ConfigParseTest": {"tf": 1}, "test_main.ConfigParseTest.SAMPLE_CONFIG": {"tf": 1}, "test_main.ConfigParseTest.CHANGED_CONFIG": {"tf": 1}, "test_main.ConfigParseTest.testOverrideHardcodedParameters": {"tf": 1}, "test_main.ConfigParseTest.testOverrideMultipleParameters": {"tf": 1}, "test_main.ConfigParseTest.testOverrideWithFile": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceConfigFirst": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceParameterFirst": {"tf": 1}, "test_main.ConfigParseTest.testBannedParameters": {"tf": 1}, "test_main.FormattingTest": {"tf": 1}, "test_main.FormattingTest.USAGE": {"tf": 1}, "test_main.FormattingTest.OPTIONS": {"tf": 1}, "test_main.FormattingTest.setUpClass": {"tf": 1}, "test_main.FormattingTest.assertPrintOption": {"tf": 1}, "test_main.FormattingTest.testHelpPrintout": {"tf": 1}, "test_main.FormattingTest.testHelpPrintoutShort": {"tf": 1}, "test_main.FormattingTest.testVersionPrintout": {"tf": 1}, "test_main.FormattingTest.testVersionPrintoutShort": {"tf": 1}, "test_main.FormattingTest.testUnhandledOption": {"tf": 1}, "test_main.FormattingTest.testUnhandledArgument": {"tf": 1}, "test_main.TestArgumentParsing": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineDiscordProtocol": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineIRCProtocol": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineIRCProtocolisDefault": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineConfigThrowsOnInvalidProto": {"tf": 1}, "test_main.TestBotFactoryMethod": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateIRCBot": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateDiscordBot": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateUnsupportedProtocolThrows": {"tf": 1}, "test_marvin_actions": {"tf": 1}, "test_marvin_actions.ActionTest": {"tf": 1}, "test_marvin_actions.ActionTest.strings": {"tf": 1}, "test_marvin_actions.ActionTest.setUpClass": {"tf": 1}, "test_marvin_actions.ActionTest.executeAction": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionSilent": {"tf": 1}, "test_marvin_actions.ActionTest.assertStringsOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertBBQResponse": {"tf": 1}, "test_marvin_actions.ActionTest.assertNameDayOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertJokeOutput": {"tf": 1}, "test_marvin_actions.ActionTest.testSmile": {"tf": 1}, "test_marvin_actions.ActionTest.testWhois": {"tf": 1}, "test_marvin_actions.ActionTest.testGoogle": {"tf": 1}, "test_marvin_actions.ActionTest.testExplainShell": {"tf": 1}, "test_marvin_actions.ActionTest.testSource": {"tf": 1}, "test_marvin_actions.ActionTest.testBudord": {"tf": 1}, "test_marvin_actions.ActionTest.testQuote": {"tf": 1}, "test_marvin_actions.ActionTest.testVideoOfToday": {"tf": 1}, "test_marvin_actions.ActionTest.testHelp": {"tf": 1}, "test_marvin_actions.ActionTest.testStats": {"tf": 1}, "test_marvin_actions.ActionTest.testIRCLog": {"tf": 1}, "test_marvin_actions.ActionTest.testSayHi": {"tf": 1}, "test_marvin_actions.ActionTest.testLunchLocations": {"tf": 1}, "test_marvin_actions.ActionTest.testStrip": {"tf": 1}, "test_marvin_actions.ActionTest.testRandomStrip": {"tf": 1}, "test_marvin_actions.ActionTest.testTimeToBBQ": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayReaction": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayResponse": {"tf": 1}, "test_marvin_actions.ActionTest.testJokeRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testJoke": {"tf": 1}, "test_marvin_actions.ActionTest.testUptime": {"tf": 1}, "test_marvin_actions.ActionTest.testStream": {"tf": 1}, "test_marvin_actions.ActionTest.testPrinciple": {"tf": 1}, "test_marvin_actions.ActionTest.testCommitRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testCommitResponse": {"tf": 1}, "test_marvin_actions.ActionTest.testMorning": {"tf": 1}}, "df": 74, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"test_main.ConfigMergeTest.testEmpty": {"tf": 1}}, "df": 1}}}}, "x": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"test_marvin_actions.ActionTest.testExplainShell": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"test_main.ConfigMergeTest.testAddSingleParameter": {"tf": 1}}, "df": 1, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"test_main.ConfigMergeTest.testAddSingleParameterOverwrites": {"tf": 1}}, "df": 1}}}}}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"test_main.ConfigMergeTest.testAddSingleParameterMerges": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}}}}}, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"test_main.TestArgumentParsing": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineDiscordProtocol": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineIRCProtocol": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineIRCProtocolisDefault": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineConfigThrowsOnInvalidProto": {"tf": 1}}, "df": 5}}}}}}}}}}}}}}}, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"test_main.ConfigParseTest.testOverrideHardcodedParameters": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}, "m": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"test_main.ConfigParseTest.testOverrideMultipleParameters": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"test_main.ConfigParseTest.testOverrideWithFile": {"tf": 1}}, "df": 1}}}}}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"test_main.ConfigParseTest.testOverridePrecedenceConfigFirst": {"tf": 1}}, "df": 1}}}}}}}}}}}, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"test_main.ConfigParseTest.testOverridePrecedenceParameterFirst": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, "b": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"test_main.ConfigParseTest.testBannedParameters": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {"test_main.TestBotFactoryMethod": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateIRCBot": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateDiscordBot": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateUnsupportedProtocolThrows": {"tf": 1}}, "df": 4}}}}}}}}}}}}}}}, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {"test_marvin_actions.ActionTest.testBudord": {"tf": 1}}, "df": 1}}}}}}, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "p": {"docs": {"test_marvin_actions.ActionTest.testHelp": {"tf": 1}}, "df": 1, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"test_main.FormattingTest.testHelpPrintout": {"tf": 1}}, "df": 1, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"test_main.FormattingTest.testHelpPrintoutShort": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"test_main.FormattingTest.testVersionPrintout": {"tf": 1}}, "df": 1, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"test_main.FormattingTest.testVersionPrintoutShort": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"test_marvin_actions.ActionTest.testVideoOfToday": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"test_main.FormattingTest.testUnhandledOption": {"tf": 1}}, "df": 1}}}}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"test_main.FormattingTest.testUnhandledArgument": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.testUptime": {"tf": 1}}, "df": 1}}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {"test_main.TestArgumentParsing.testDetermineDiscordProtocol": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {"test_main.TestArgumentParsing.testDetermineIRCProtocol": {"tf": 1}}, "df": 1, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"test_main.TestArgumentParsing.testDetermineIRCProtocolisDefault": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {"test_main.TestArgumentParsing.testDetermineConfigThrowsOnInvalidProto": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"test_main.TestBotFactoryMethod.testCreateIRCBot": {"tf": 1}}, "df": 1}}}}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"test_main.TestBotFactoryMethod.testCreateDiscordBot": {"tf": 1}}, "df": 1}}}}}}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "s": {"docs": {"test_main.TestBotFactoryMethod.testCreateUnsupportedProtocolThrows": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"test_marvin_actions.ActionTest.testCommitRequest": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.testCommitResponse": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}, "s": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.testSmile": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.testSource": {"tf": 1}}, "df": 1}}}}}, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"test_marvin_actions.ActionTest.testStats": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {"test_marvin_actions.ActionTest.testStrip": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"test_marvin_actions.ActionTest.testStream": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {"test_marvin_actions.ActionTest.testSayHi": {"tf": 1}}, "df": 1}}}}}, "w": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {"test_marvin_actions.ActionTest.testWhois": {"tf": 1}}, "df": 1}}}}}, "g": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.testGoogle": {"tf": 1}}, "df": 1}}}}}}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.testQuote": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {"test_marvin_actions.ActionTest.testIRCLog": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"test_marvin_actions.ActionTest.testLunchLocations": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {"test_marvin_actions.ActionTest.testRandomStrip": {"tf": 1}}, "df": 1}}}}}}}}}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "q": {"docs": {"test_marvin_actions.ActionTest.testTimeToBBQ": {"tf": 1}}, "df": 1}}}}}}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"test_marvin_actions.ActionTest.testNameDayReaction": {"tf": 1}}, "df": 1}}}}}}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"test_marvin_actions.ActionTest.testNameDayRequest": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.testNameDayResponse": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "j": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.testJoke": {"tf": 1}}, "df": 1, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"test_marvin_actions.ActionTest.testJokeRequest": {"tf": 1}}, "df": 1}}}}}}}}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.testPrinciple": {"tf": 1}}, "df": 1}}}}}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"test_marvin_actions.ActionTest.testMorning": {"tf": 1}}, "df": 1}}}}}}}}}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {"discord_bot": {"tf": 1}, "discord_bot.DiscordBot": {"tf": 1}, "discord_bot.DiscordBot.CONFIG": {"tf": 1}, "discord_bot.DiscordBot.begin": {"tf": 1}, "discord_bot.DiscordBot.checkMarvinActions": {"tf": 1}, "discord_bot.DiscordBot.on_message": {"tf": 1}}, "df": 6, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"discord_bot.DiscordBot": {"tf": 1}, "discord_bot.DiscordBot.CONFIG": {"tf": 1}, "discord_bot.DiscordBot.begin": {"tf": 1}, "discord_bot.DiscordBot.checkMarvinActions": {"tf": 1}, "discord_bot.DiscordBot.on_message": {"tf": 1}}, "df": 5}}}}}}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"irc_bot.IrcBot.decode_irc": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {"main.determineProtocol": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {"discord_bot.DiscordBot.on_message": {"tf": 1}}, "df": 1}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"test_main.FormattingTest.OPTIONS": {"tf": 1}}, "df": 1}}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"discord_bot.DiscordBot.on_message": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"main.mergeOptionsWithConfigFile": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}}}}}}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"main": {"tf": 1}, "main.PROGRAM": {"tf": 1}, "main.AUTHOR": {"tf": 1}, "main.EMAIL": {"tf": 1}, "main.VERSION": {"tf": 1}, "main.MSG_VERSION": {"tf": 1}, "main.printVersion": {"tf": 1}, "main.mergeOptionsWithConfigFile": {"tf": 1}, "main.parseOptions": {"tf": 1}, "main.determineProtocol": {"tf": 1}, "main.createBot": {"tf": 1}, "main.main": {"tf": 1.4142135623730951}, "test_main": {"tf": 1}, "test_main.ConfigMergeTest": {"tf": 1}, "test_main.ConfigMergeTest.assertMergedConfig": {"tf": 1}, "test_main.ConfigMergeTest.testEmpty": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameter": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameterOverwrites": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameterMerges": {"tf": 1}, "test_main.ConfigParseTest": {"tf": 1}, "test_main.ConfigParseTest.SAMPLE_CONFIG": {"tf": 1}, "test_main.ConfigParseTest.CHANGED_CONFIG": {"tf": 1}, "test_main.ConfigParseTest.testOverrideHardcodedParameters": {"tf": 1}, "test_main.ConfigParseTest.testOverrideMultipleParameters": {"tf": 1}, "test_main.ConfigParseTest.testOverrideWithFile": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceConfigFirst": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceParameterFirst": {"tf": 1}, "test_main.ConfigParseTest.testBannedParameters": {"tf": 1}, "test_main.FormattingTest": {"tf": 1}, "test_main.FormattingTest.USAGE": {"tf": 1}, "test_main.FormattingTest.OPTIONS": {"tf": 1}, "test_main.FormattingTest.setUpClass": {"tf": 1}, "test_main.FormattingTest.assertPrintOption": {"tf": 1}, "test_main.FormattingTest.testHelpPrintout": {"tf": 1}, "test_main.FormattingTest.testHelpPrintoutShort": {"tf": 1}, "test_main.FormattingTest.testVersionPrintout": {"tf": 1}, "test_main.FormattingTest.testVersionPrintoutShort": {"tf": 1}, "test_main.FormattingTest.testUnhandledOption": {"tf": 1}, "test_main.FormattingTest.testUnhandledArgument": {"tf": 1}, "test_main.TestArgumentParsing": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineDiscordProtocol": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineIRCProtocol": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineIRCProtocolisDefault": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineConfigThrowsOnInvalidProto": {"tf": 1}, "test_main.TestBotFactoryMethod": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateIRCBot": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateDiscordBot": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateUnsupportedProtocolThrows": {"tf": 1}}, "df": 48, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {"irc_bot.IrcBot.mainLoop": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"marvin_actions": {"tf": 1}, "marvin_actions.getAllActions": {"tf": 1}, "marvin_actions.CONFIG": {"tf": 1}, "marvin_actions.setConfig": {"tf": 1}, "marvin_actions.getString": {"tf": 1}, "marvin_actions.marvinSmile": {"tf": 1}, "marvin_actions.wordsAfterKeyWords": {"tf": 1}, "marvin_actions.marvinGoogle": {"tf": 1}, "marvin_actions.marvinExplainShell": {"tf": 1}, "marvin_actions.marvinSource": {"tf": 1}, "marvin_actions.marvinBudord": {"tf": 1}, "marvin_actions.marvinQuote": {"tf": 1}, "marvin_actions.videoOfToday": {"tf": 1}, "marvin_actions.marvinVideoOfToday": {"tf": 1}, "marvin_actions.marvinWhoIs": {"tf": 1}, "marvin_actions.marvinHelp": {"tf": 1}, "marvin_actions.marvinStats": {"tf": 1}, "marvin_actions.marvinIrcLog": {"tf": 1}, "marvin_actions.marvinSayHi": {"tf": 1}, "marvin_actions.marvinLunch": {"tf": 1}, "marvin_actions.marvinListen": {"tf": 1}, "marvin_actions.marvinSun": {"tf": 1}, "marvin_actions.marvinWeather": {"tf": 1}, "marvin_actions.marvinStrip": {"tf": 1}, "marvin_actions.commitStrip": {"tf": 1}, "marvin_actions.marvinTimeToBBQ": {"tf": 1}, "marvin_actions.nextBBQ": {"tf": 1}, "marvin_actions.thirdFridayIn": {"tf": 1}, "marvin_actions.marvinBirthday": {"tf": 1}, "marvin_actions.marvinNameday": {"tf": 1}, "marvin_actions.marvinUptime": {"tf": 1}, "marvin_actions.marvinStream": {"tf": 1}, "marvin_actions.marvinPrinciple": {"tf": 1}, "marvin_actions.getJoke": {"tf": 1}, "marvin_actions.marvinJoke": {"tf": 1}, "marvin_actions.getCommit": {"tf": 1}, "marvin_actions.marvinCommit": {"tf": 1}, "marvin_general_actions": {"tf": 1}, "marvin_general_actions.CONFIG": {"tf": 1}, "marvin_general_actions.lastDateGreeted": {"tf": 1}, "marvin_general_actions.setConfig": {"tf": 1}, "marvin_general_actions.getString": {"tf": 1}, "marvin_general_actions.getAllGeneralActions": {"tf": 1}, "marvin_general_actions.marvinMorning": {"tf": 1}, "test_marvin_actions": {"tf": 1}, "test_marvin_actions.ActionTest": {"tf": 1}, "test_marvin_actions.ActionTest.strings": {"tf": 1}, "test_marvin_actions.ActionTest.setUpClass": {"tf": 1}, "test_marvin_actions.ActionTest.executeAction": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionSilent": {"tf": 1}, "test_marvin_actions.ActionTest.assertStringsOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertBBQResponse": {"tf": 1}, "test_marvin_actions.ActionTest.assertNameDayOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertJokeOutput": {"tf": 1}, "test_marvin_actions.ActionTest.testSmile": {"tf": 1}, "test_marvin_actions.ActionTest.testWhois": {"tf": 1}, "test_marvin_actions.ActionTest.testGoogle": {"tf": 1}, "test_marvin_actions.ActionTest.testExplainShell": {"tf": 1}, "test_marvin_actions.ActionTest.testSource": {"tf": 1}, "test_marvin_actions.ActionTest.testBudord": {"tf": 1}, "test_marvin_actions.ActionTest.testQuote": {"tf": 1}, "test_marvin_actions.ActionTest.testVideoOfToday": {"tf": 1}, "test_marvin_actions.ActionTest.testHelp": {"tf": 1}, "test_marvin_actions.ActionTest.testStats": {"tf": 1}, "test_marvin_actions.ActionTest.testIRCLog": {"tf": 1}, "test_marvin_actions.ActionTest.testSayHi": {"tf": 1}, "test_marvin_actions.ActionTest.testLunchLocations": {"tf": 1}, "test_marvin_actions.ActionTest.testStrip": {"tf": 1}, "test_marvin_actions.ActionTest.testRandomStrip": {"tf": 1}, "test_marvin_actions.ActionTest.testTimeToBBQ": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayReaction": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayResponse": {"tf": 1}, "test_marvin_actions.ActionTest.testJokeRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testJoke": {"tf": 1}, "test_marvin_actions.ActionTest.testUptime": {"tf": 1}, "test_marvin_actions.ActionTest.testStream": {"tf": 1}, "test_marvin_actions.ActionTest.testPrinciple": {"tf": 1}, "test_marvin_actions.ActionTest.testCommitRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testCommitResponse": {"tf": 1}, "test_marvin_actions.ActionTest.testMorning": {"tf": 1}}, "df": 82, "s": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.marvinSmile": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.marvinSource": {"tf": 1}}, "df": 1}}}}}, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"marvin_actions.marvinStats": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {"marvin_actions.marvinStrip": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"marvin_actions.marvinStream": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {"marvin_actions.marvinSayHi": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {"marvin_actions.marvinSun": {"tf": 1}}, "df": 1}}}, "g": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.marvinGoogle": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"marvin_actions.marvinExplainShell": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {"marvin_actions.marvinBudord": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"marvin_actions.marvinBirthday": {"tf": 1}}, "df": 1}}}}}}}}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.marvinQuote": {"tf": 1}}, "df": 1}}}}}, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"marvin_actions.marvinVideoOfToday": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "w": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {"marvin_actions.marvinWhoIs": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"marvin_actions.marvinWeather": {"tf": 1}}, "df": 1}}}}}}}, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "p": {"docs": {"marvin_actions.marvinHelp": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {"marvin_actions.marvinIrcLog": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"marvin_actions.marvinLunch": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"marvin_actions.marvinListen": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "q": {"docs": {"marvin_actions.marvinTimeToBBQ": {"tf": 1}}, "df": 1}}}}}}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"marvin_actions.marvinNameday": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.marvinUptime": {"tf": 1}}, "df": 1}}}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.marvinPrinciple": {"tf": 1}}, "df": 1}}}}}}}}}, "j": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.marvinJoke": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"marvin_actions.marvinCommit": {"tf": 1}}, "df": 1}}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"marvin_general_actions.marvinMorning": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "s": {"docs": {}, "df": 0, "g": {"docs": {"main.MSG_VERSION": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {"irc_bot": {"tf": 1}, "irc_bot.IrcBot": {"tf": 1}, "irc_bot.IrcBot.CONFIG": {"tf": 1}, "irc_bot.IrcBot.SOCKET": {"tf": 1}, "irc_bot.IrcBot.IRCLOG": {"tf": 1}, "irc_bot.IrcBot.connectToServer": {"tf": 1}, "irc_bot.IrcBot.sendPrivMsg": {"tf": 1}, "irc_bot.IrcBot.sendMsg": {"tf": 1}, "irc_bot.IrcBot.decode_irc": {"tf": 1.4142135623730951}, "irc_bot.IrcBot.receive": {"tf": 1}, "irc_bot.IrcBot.ircLogAppend": {"tf": 1}, "irc_bot.IrcBot.ircLogWriteToFile": {"tf": 1}, "irc_bot.IrcBot.readincoming": {"tf": 1}, "irc_bot.IrcBot.mainLoop": {"tf": 1}, "irc_bot.IrcBot.begin": {"tf": 1}, "irc_bot.IrcBot.checkIrcActions": {"tf": 1}, "irc_bot.IrcBot.checkMarvinActions": {"tf": 1}}, "df": 17, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"irc_bot.IrcBot": {"tf": 1}, "irc_bot.IrcBot.CONFIG": {"tf": 1}, "irc_bot.IrcBot.SOCKET": {"tf": 1}, "irc_bot.IrcBot.IRCLOG": {"tf": 1}, "irc_bot.IrcBot.connectToServer": {"tf": 1}, "irc_bot.IrcBot.sendPrivMsg": {"tf": 1}, "irc_bot.IrcBot.sendMsg": {"tf": 1}, "irc_bot.IrcBot.decode_irc": {"tf": 1}, "irc_bot.IrcBot.receive": {"tf": 1}, "irc_bot.IrcBot.ircLogAppend": {"tf": 1}, "irc_bot.IrcBot.ircLogWriteToFile": {"tf": 1}, "irc_bot.IrcBot.readincoming": {"tf": 1}, "irc_bot.IrcBot.mainLoop": {"tf": 1}, "irc_bot.IrcBot.begin": {"tf": 1}, "irc_bot.IrcBot.checkIrcActions": {"tf": 1}, "irc_bot.IrcBot.checkMarvinActions": {"tf": 1}}, "df": 16}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {"irc_bot.IrcBot.IRCLOG": {"tf": 1}}, "df": 1, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"irc_bot.IrcBot.ircLogAppend": {"tf": 1}}, "df": 1}}}}}}, "w": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"irc_bot.IrcBot.ircLogWriteToFile": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"main.PROGRAM": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"main.printVersion": {"tf": 1}}, "df": 1}}}}}}}}}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"main.parseOptions": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {"main.EMAIL": {"tf": 1}}, "df": 1}}}}, "x": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"test_marvin_actions.ActionTest.executeAction": {"tf": 1}}, "df": 1}}}}}}}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"main.VERSION": {"tf": 1}, "main.MSG_VERSION": {"tf": 1}}, "df": 2}}}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"marvin_actions.videoOfToday": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "s": {"docs": {"marvin_actions.wordsAfterKeyWords": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "q": {"docs": {"marvin_actions.nextBBQ": {"tf": 1}}, "df": 1}}}}}}}, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"marvin_general_actions.lastDateGreeted": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"test_main.FormattingTest": {"tf": 1}, "test_main.FormattingTest.USAGE": {"tf": 1}, "test_main.FormattingTest.OPTIONS": {"tf": 1}, "test_main.FormattingTest.setUpClass": {"tf": 1}, "test_main.FormattingTest.assertPrintOption": {"tf": 1}, "test_main.FormattingTest.testHelpPrintout": {"tf": 1}, "test_main.FormattingTest.testHelpPrintoutShort": {"tf": 1}, "test_main.FormattingTest.testVersionPrintout": {"tf": 1}, "test_main.FormattingTest.testVersionPrintoutShort": {"tf": 1}, "test_main.FormattingTest.testUnhandledOption": {"tf": 1}, "test_main.FormattingTest.testUnhandledArgument": {"tf": 1}}, "df": 11}}}}}}}}}}}}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"test_main.FormattingTest.USAGE": {"tf": 1}}, "df": 1}}}}}}}, "annotation": {"root": {"docs": {}, "df": 0}}, "default_value": {"root": {"0": {"docs": {"main.VERSION": {"tf": 1.4142135623730951}, "main.MSG_VERSION": {"tf": 1.4142135623730951}}, "df": 2}, "1": {"2": {"3": {"4": {"docs": {"test_main.ConfigParseTest.CHANGED_CONFIG": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "3": {"docs": {"main.VERSION": {"tf": 1}, "main.MSG_VERSION": {"tf": 1}}, "df": 2}, "6": {"6": {"6": {"7": {"docs": {"test_main.ConfigParseTest.SAMPLE_CONFIG": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"main.PROGRAM": {"tf": 1.4142135623730951}, "main.AUTHOR": {"tf": 1.4142135623730951}, "main.EMAIL": {"tf": 1.4142135623730951}, "main.VERSION": {"tf": 1.4142135623730951}, "main.MSG_VERSION": {"tf": 1.4142135623730951}, "test_main.ConfigParseTest.SAMPLE_CONFIG": {"tf": 2.8284271247461903}, "test_main.ConfigParseTest.CHANGED_CONFIG": {"tf": 2.8284271247461903}, "test_main.FormattingTest.USAGE": {"tf": 3.3166247903554}, "test_main.FormattingTest.OPTIONS": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.strings": {"tf": 1}}, "df": 10, "x": {"2": {"7": {"docs": {"main.PROGRAM": {"tf": 1.4142135623730951}, "main.AUTHOR": {"tf": 1.4142135623730951}, "main.EMAIL": {"tf": 1.4142135623730951}, "main.VERSION": {"tf": 1.4142135623730951}, "main.MSG_VERSION": {"tf": 1.4142135623730951}, "test_main.ConfigParseTest.SAMPLE_CONFIG": {"tf": 4.69041575982343}, "test_main.ConfigParseTest.CHANGED_CONFIG": {"tf": 4.69041575982343}, "test_main.FormattingTest.USAGE": {"tf": 1.4142135623730951}, "test_main.FormattingTest.OPTIONS": {"tf": 1.4142135623730951}}, "df": 9}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"main.PROGRAM": {"tf": 1}, "main.MSG_VERSION": {"tf": 1}, "test_main.ConfigParseTest.SAMPLE_CONFIG": {"tf": 1.4142135623730951}, "test_main.ConfigParseTest.CHANGED_CONFIG": {"tf": 1}}, "df": 4}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {"test_main.FormattingTest.USAGE": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"main.AUTHOR": {"tf": 1}, "main.EMAIL": {"tf": 1}}, "df": 2}}}}, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"test_main.ConfigParseTest.SAMPLE_CONFIG": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"test_main.FormattingTest.OPTIONS": {"tf": 1}}, "df": 1}}}}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {"main.AUTHOR": {"tf": 1}}, "df": 1, "@": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {"main.EMAIL": {"tf": 1}}, "df": 1}}}}}}}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"test_main.ConfigParseTest.SAMPLE_CONFIG": {"tf": 1}, "test_main.ConfigParseTest.CHANGED_CONFIG": {"tf": 1}, "test_main.FormattingTest.USAGE": {"tf": 1.4142135623730951}, "test_main.FormattingTest.OPTIONS": {"tf": 1}}, "df": 4, "\\": {"docs": {}, "df": 0, "n": {"docs": {"test_main.FormattingTest.OPTIONS": {"tf": 1}}, "df": 1}}}}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"test_main.ConfigParseTest.CHANGED_CONFIG": {"tf": 1}}, "df": 1}}}}}}}}}}, "t": {"docs": {"main.EMAIL": {"tf": 1}}, "df": 1, "h": {"docs": {}, "df": 0, "e": {"docs": {"test_main.ConfigParseTest.SAMPLE_CONFIG": {"tf": 1}}, "df": 1}, "i": {"docs": {}, "df": 0, "s": {"docs": {"test_main.FormattingTest.OPTIONS": {"tf": 1}}, "df": 1}}}}, "h": {"docs": {"main.EMAIL": {"tf": 1}, "test_main.FormattingTest.USAGE": {"tf": 1}, "test_main.FormattingTest.OPTIONS": {"tf": 1}}, "df": 3, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "p": {"docs": {"test_main.FormattingTest.OPTIONS": {"tf": 1.4142135623730951}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"main.EMAIL": {"tf": 1}}, "df": 1}, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {"test_main.FormattingTest.USAGE": {"tf": 1.4142135623730951}, "test_main.FormattingTest.OPTIONS": {"tf": 1}}, "df": 2, "\\": {"docs": {}, "df": 0, "n": {"docs": {"test_main.FormattingTest.OPTIONS": {"tf": 1}}, "df": 1}}}}}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"test_main.ConfigParseTest.SAMPLE_CONFIG": {"tf": 1}, "test_main.ConfigParseTest.CHANGED_CONFIG": {"tf": 1}, "test_main.FormattingTest.USAGE": {"tf": 1.4142135623730951}, "test_main.FormattingTest.OPTIONS": {"tf": 1}}, "df": 4, "\\": {"docs": {}, "df": 0, "n": {"docs": {"test_main.FormattingTest.OPTIONS": {"tf": 1}}, "df": 1}}}}}}}}}, "v": {"docs": {"test_main.FormattingTest.USAGE": {"tf": 1}, "test_main.FormattingTest.OPTIONS": {"tf": 1}}, "df": 2, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"main.MSG_VERSION": {"tf": 1}}, "df": 1, "\\": {"docs": {}, "df": 0, "n": {"docs": {"test_main.FormattingTest.OPTIONS": {"tf": 1}}, "df": 1}}}}}}}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.CONFIG": {"tf": 1}, "marvin_general_actions.CONFIG": {"tf": 1}, "marvin_general_actions.lastDateGreeted": {"tf": 1}}, "df": 3}}}, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {"test_main.ConfigParseTest.SAMPLE_CONFIG": {"tf": 1}, "test_main.ConfigParseTest.CHANGED_CONFIG": {"tf": 1}, "test_main.FormattingTest.USAGE": {"tf": 1.4142135623730951}, "test_main.FormattingTest.OPTIONS": {"tf": 1}}, "df": 4, "\\": {"docs": {}, "df": 0, "n": {"docs": {"test_main.FormattingTest.OPTIONS": {"tf": 1}}, "df": 1}}}}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"test_main.ConfigParseTest.SAMPLE_CONFIG": {"tf": 1}, "test_main.ConfigParseTest.CHANGED_CONFIG": {"tf": 1}, "test_main.FormattingTest.USAGE": {"tf": 1.4142135623730951}, "test_main.FormattingTest.OPTIONS": {"tf": 1}}, "df": 4, "\\": {"docs": {}, "df": 0, "n": {"docs": {"test_main.FormattingTest.OPTIONS": {"tf": 1}}, "df": 1}}}}}}}, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {"test_main.FormattingTest.OPTIONS": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"test_main.ConfigParseTest.SAMPLE_CONFIG": {"tf": 1}}, "df": 1}}}}}}}}}, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"test_main.ConfigParseTest.SAMPLE_CONFIG": {"tf": 1}, "test_main.ConfigParseTest.CHANGED_CONFIG": {"tf": 1}, "test_main.FormattingTest.USAGE": {"tf": 1.4142135623730951}, "test_main.FormattingTest.OPTIONS": {"tf": 1}}, "df": 4, "\\": {"docs": {}, "df": 0, "n": {"docs": {"test_main.FormattingTest.OPTIONS": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"test_main.FormattingTest.OPTIONS": {"tf": 1}}, "df": 1}}}}}}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {"test_main.ConfigParseTest.SAMPLE_CONFIG": {"tf": 1}}, "df": 1}}}}}}}, "y": {"docs": {"test_main.FormattingTest.USAGE": {"tf": 1}}, "df": 1}}, "d": {"docs": {}, "df": 0, "b": {"docs": {"test_main.ConfigParseTest.CHANGED_CONFIG": {"tf": 1}}, "df": 1, "w": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "b": {"docs": {"test_main.ConfigParseTest.SAMPLE_CONFIG": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "}": {"docs": {}, "df": 0, "]": {"docs": {}, "df": 0, "\\": {"docs": {}, "df": 0, "n": {"docs": {"test_main.FormattingTest.USAGE": {"tf": 1}}, "df": 1}}}, "\\": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "\\": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, ":": {"docs": {}, "df": 0, "\\": {"docs": {}, "df": 0, "n": {"docs": {"test_main.FormattingTest.OPTIONS": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"test_main.ConfigParseTest.SAMPLE_CONFIG": {"tf": 1}}, "df": 1}}, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, ":": {"docs": {}, "df": 0, "\\": {"docs": {}, "df": 0, "n": {"docs": {"test_main.FormattingTest.OPTIONS": {"tf": 1}}, "df": 1}}}}}}}}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {"test_main.FormattingTest.OPTIONS": {"tf": 1}}, "df": 1}}}, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"test_main.ConfigParseTest.SAMPLE_CONFIG": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"test_main.ConfigParseTest.SAMPLE_CONFIG": {"tf": 1}, "test_main.ConfigParseTest.CHANGED_CONFIG": {"tf": 1}, "test_main.FormattingTest.USAGE": {"tf": 1}, "test_main.FormattingTest.OPTIONS": {"tf": 1.4142135623730951}}, "df": 4, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "y": {"docs": {"test_main.ConfigParseTest.CHANGED_CONFIG": {"tf": 1}}, "df": 1}}}, "]": {"docs": {}, "df": 0, "\\": {"docs": {}, "df": 0, "n": {"docs": {"test_main.FormattingTest.USAGE": {"tf": 1}}, "df": 1}}}}}}}, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"test_main.ConfigParseTest.CHANGED_CONFIG": {"tf": 1}}, "df": 1}}}}}}}, "s": {"docs": {"test_main.ConfigParseTest.CHANGED_CONFIG": {"tf": 1}}, "df": 1}, "r": {"docs": {}, "df": 0, "c": {"docs": {"test_main.FormattingTest.USAGE": {"tf": 1}, "test_main.FormattingTest.OPTIONS": {"tf": 1}}, "df": 2}}}, "o": {"docs": {"test_main.ConfigParseTest.CHANGED_CONFIG": {"tf": 1}}, "df": 1}, "w": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "b": {"docs": {"test_main.ConfigParseTest.CHANGED_CONFIG": {"tf": 1}}, "df": 1}}}, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"test_main.ConfigParseTest.CHANGED_CONFIG": {"tf": 1}}, "df": 1}}}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"test_main.FormattingTest.USAGE": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "\\": {"docs": {}, "df": 0, "n": {"docs": {"test_main.FormattingTest.OPTIONS": {"tf": 1}}, "df": 1}}}}}}}}, "signature": {"root": {"docs": {"bot.Bot.getConfig": {"tf": 3.1622776601683795}, "bot.Bot.setConfig": {"tf": 3.7416573867739413}, "bot.Bot.registerActions": {"tf": 3.7416573867739413}, "bot.Bot.registerGeneralActions": {"tf": 3.7416573867739413}, "bot.Bot.tokenize": {"tf": 3.1622776601683795}, "discord_bot.DiscordBot.begin": {"tf": 3.1622776601683795}, "discord_bot.DiscordBot.checkMarvinActions": {"tf": 3.7416573867739413}, "discord_bot.DiscordBot.on_message": {"tf": 3.7416573867739413}, "irc_bot.IrcBot.connectToServer": {"tf": 3.1622776601683795}, "irc_bot.IrcBot.sendPrivMsg": {"tf": 4.242640687119285}, "irc_bot.IrcBot.sendMsg": {"tf": 3.7416573867739413}, "irc_bot.IrcBot.decode_irc": {"tf": 4.69041575982343}, "irc_bot.IrcBot.receive": {"tf": 3.1622776601683795}, "irc_bot.IrcBot.ircLogAppend": {"tf": 5.830951894845301}, "irc_bot.IrcBot.ircLogWriteToFile": {"tf": 3.1622776601683795}, "irc_bot.IrcBot.readincoming": {"tf": 3.1622776601683795}, "irc_bot.IrcBot.mainLoop": {"tf": 3.1622776601683795}, "irc_bot.IrcBot.begin": {"tf": 3.1622776601683795}, "irc_bot.IrcBot.checkIrcActions": {"tf": 3.7416573867739413}, "irc_bot.IrcBot.checkMarvinActions": {"tf": 3.7416573867739413}, "main.printVersion": {"tf": 2.6457513110645907}, "main.mergeOptionsWithConfigFile": {"tf": 3.7416573867739413}, "main.parseOptions": {"tf": 3.1622776601683795}, "main.determineProtocol": {"tf": 2.6457513110645907}, "main.createBot": {"tf": 3.1622776601683795}, "main.main": {"tf": 2.6457513110645907}, "marvin_actions.getAllActions": {"tf": 2.6457513110645907}, "marvin_actions.setConfig": {"tf": 3.1622776601683795}, "marvin_actions.getString": {"tf": 4.242640687119285}, "marvin_actions.marvinSmile": {"tf": 3.1622776601683795}, "marvin_actions.wordsAfterKeyWords": {"tf": 3.7416573867739413}, "marvin_actions.marvinGoogle": {"tf": 3.1622776601683795}, "marvin_actions.marvinExplainShell": {"tf": 3.1622776601683795}, "marvin_actions.marvinSource": {"tf": 3.1622776601683795}, "marvin_actions.marvinBudord": {"tf": 3.1622776601683795}, "marvin_actions.marvinQuote": {"tf": 3.1622776601683795}, "marvin_actions.videoOfToday": {"tf": 2.6457513110645907}, "marvin_actions.marvinVideoOfToday": {"tf": 3.1622776601683795}, "marvin_actions.marvinWhoIs": {"tf": 3.1622776601683795}, "marvin_actions.marvinHelp": {"tf": 3.1622776601683795}, "marvin_actions.marvinStats": {"tf": 3.1622776601683795}, "marvin_actions.marvinIrcLog": {"tf": 3.1622776601683795}, "marvin_actions.marvinSayHi": {"tf": 3.1622776601683795}, "marvin_actions.marvinLunch": {"tf": 3.1622776601683795}, "marvin_actions.marvinListen": {"tf": 3.1622776601683795}, "marvin_actions.marvinSun": {"tf": 3.1622776601683795}, "marvin_actions.marvinWeather": {"tf": 3.1622776601683795}, "marvin_actions.marvinStrip": {"tf": 3.1622776601683795}, "marvin_actions.commitStrip": {"tf": 3.7416573867739413}, "marvin_actions.marvinTimeToBBQ": {"tf": 3.1622776601683795}, "marvin_actions.nextBBQ": {"tf": 2.6457513110645907}, "marvin_actions.thirdFridayIn": {"tf": 3.7416573867739413}, "marvin_actions.marvinBirthday": {"tf": 3.1622776601683795}, "marvin_actions.marvinNameday": {"tf": 3.1622776601683795}, "marvin_actions.marvinUptime": {"tf": 3.1622776601683795}, "marvin_actions.marvinStream": {"tf": 3.1622776601683795}, "marvin_actions.marvinPrinciple": {"tf": 3.1622776601683795}, "marvin_actions.getJoke": {"tf": 2.6457513110645907}, "marvin_actions.marvinJoke": {"tf": 3.1622776601683795}, "marvin_actions.getCommit": {"tf": 2.6457513110645907}, "marvin_actions.marvinCommit": {"tf": 3.1622776601683795}, "marvin_general_actions.setConfig": {"tf": 3.1622776601683795}, "marvin_general_actions.getString": {"tf": 4.242640687119285}, "marvin_general_actions.getAllGeneralActions": {"tf": 2.6457513110645907}, "marvin_general_actions.marvinMorning": {"tf": 3.1622776601683795}, "test_main.ConfigMergeTest.assertMergedConfig": {"tf": 4.69041575982343}, "test_main.ConfigMergeTest.testEmpty": {"tf": 3.1622776601683795}, "test_main.ConfigMergeTest.testAddSingleParameter": {"tf": 3.1622776601683795}, "test_main.ConfigMergeTest.testAddSingleParameterOverwrites": {"tf": 3.1622776601683795}, "test_main.ConfigMergeTest.testAddSingleParameterMerges": {"tf": 3.1622776601683795}, "test_main.ConfigParseTest.testOverrideHardcodedParameters": {"tf": 3.1622776601683795}, "test_main.ConfigParseTest.testOverrideMultipleParameters": {"tf": 3.1622776601683795}, "test_main.ConfigParseTest.testOverrideWithFile": {"tf": 3.1622776601683795}, "test_main.ConfigParseTest.testOverridePrecedenceConfigFirst": {"tf": 3.1622776601683795}, "test_main.ConfigParseTest.testOverridePrecedenceParameterFirst": {"tf": 3.1622776601683795}, "test_main.ConfigParseTest.testBannedParameters": {"tf": 3.1622776601683795}, "test_main.FormattingTest.setUpClass": {"tf": 3.1622776601683795}, "test_main.FormattingTest.assertPrintOption": {"tf": 4.69041575982343}, "test_main.FormattingTest.testHelpPrintout": {"tf": 3.1622776601683795}, "test_main.FormattingTest.testHelpPrintoutShort": {"tf": 3.1622776601683795}, "test_main.FormattingTest.testVersionPrintout": {"tf": 3.1622776601683795}, "test_main.FormattingTest.testVersionPrintoutShort": {"tf": 3.1622776601683795}, "test_main.FormattingTest.testUnhandledOption": {"tf": 3.1622776601683795}, "test_main.FormattingTest.testUnhandledArgument": {"tf": 3.1622776601683795}, "test_main.TestArgumentParsing.testDetermineDiscordProtocol": {"tf": 3.1622776601683795}, "test_main.TestArgumentParsing.testDetermineIRCProtocol": {"tf": 3.1622776601683795}, "test_main.TestArgumentParsing.testDetermineIRCProtocolisDefault": {"tf": 3.1622776601683795}, "test_main.TestArgumentParsing.testDetermineConfigThrowsOnInvalidProto": {"tf": 3.1622776601683795}, "test_main.TestBotFactoryMethod.testCreateIRCBot": {"tf": 3.1622776601683795}, "test_main.TestBotFactoryMethod.testCreateDiscordBot": {"tf": 3.1622776601683795}, "test_main.TestBotFactoryMethod.testCreateUnsupportedProtocolThrows": {"tf": 3.1622776601683795}, "test_marvin_actions.ActionTest.setUpClass": {"tf": 3.1622776601683795}, "test_marvin_actions.ActionTest.executeAction": {"tf": 4.242640687119285}, "test_marvin_actions.ActionTest.assertActionOutput": {"tf": 4.69041575982343}, "test_marvin_actions.ActionTest.assertActionSilent": {"tf": 4.242640687119285}, "test_marvin_actions.ActionTest.assertStringsOutput": {"tf": 5.477225575051661}, "test_marvin_actions.ActionTest.assertBBQResponse": {"tf": 4.69041575982343}, "test_marvin_actions.ActionTest.assertNameDayOutput": {"tf": 4.242640687119285}, "test_marvin_actions.ActionTest.assertJokeOutput": {"tf": 4.242640687119285}, "test_marvin_actions.ActionTest.testSmile": {"tf": 3.1622776601683795}, "test_marvin_actions.ActionTest.testWhois": {"tf": 3.1622776601683795}, "test_marvin_actions.ActionTest.testGoogle": {"tf": 3.1622776601683795}, "test_marvin_actions.ActionTest.testExplainShell": {"tf": 3.1622776601683795}, "test_marvin_actions.ActionTest.testSource": {"tf": 3.1622776601683795}, "test_marvin_actions.ActionTest.testBudord": {"tf": 3.1622776601683795}, "test_marvin_actions.ActionTest.testQuote": {"tf": 3.1622776601683795}, "test_marvin_actions.ActionTest.testVideoOfToday": {"tf": 3.1622776601683795}, "test_marvin_actions.ActionTest.testHelp": {"tf": 3.1622776601683795}, "test_marvin_actions.ActionTest.testStats": {"tf": 3.1622776601683795}, "test_marvin_actions.ActionTest.testIRCLog": {"tf": 3.1622776601683795}, "test_marvin_actions.ActionTest.testSayHi": {"tf": 3.1622776601683795}, "test_marvin_actions.ActionTest.testLunchLocations": {"tf": 3.1622776601683795}, "test_marvin_actions.ActionTest.testStrip": {"tf": 3.1622776601683795}, "test_marvin_actions.ActionTest.testRandomStrip": {"tf": 3.1622776601683795}, "test_marvin_actions.ActionTest.testTimeToBBQ": {"tf": 3.1622776601683795}, "test_marvin_actions.ActionTest.testNameDayReaction": {"tf": 3.1622776601683795}, "test_marvin_actions.ActionTest.testNameDayRequest": {"tf": 3.1622776601683795}, "test_marvin_actions.ActionTest.testNameDayResponse": {"tf": 3.1622776601683795}, "test_marvin_actions.ActionTest.testJokeRequest": {"tf": 3.1622776601683795}, "test_marvin_actions.ActionTest.testJoke": {"tf": 3.1622776601683795}, "test_marvin_actions.ActionTest.testUptime": {"tf": 3.1622776601683795}, "test_marvin_actions.ActionTest.testStream": {"tf": 3.1622776601683795}, "test_marvin_actions.ActionTest.testPrinciple": {"tf": 3.1622776601683795}, "test_marvin_actions.ActionTest.testCommitRequest": {"tf": 3.1622776601683795}, "test_marvin_actions.ActionTest.testCommitResponse": {"tf": 3.1622776601683795}, "test_marvin_actions.ActionTest.testMorning": {"tf": 3.1622776601683795}}, "df": 126, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "f": {"docs": {"bot.Bot.getConfig": {"tf": 1}, "bot.Bot.setConfig": {"tf": 1}, "bot.Bot.registerActions": {"tf": 1}, "bot.Bot.registerGeneralActions": {"tf": 1}, "discord_bot.DiscordBot.begin": {"tf": 1}, "discord_bot.DiscordBot.checkMarvinActions": {"tf": 1}, "discord_bot.DiscordBot.on_message": {"tf": 1}, "irc_bot.IrcBot.connectToServer": {"tf": 1}, "irc_bot.IrcBot.sendPrivMsg": {"tf": 1}, "irc_bot.IrcBot.sendMsg": {"tf": 1}, "irc_bot.IrcBot.decode_irc": {"tf": 1}, "irc_bot.IrcBot.receive": {"tf": 1}, "irc_bot.IrcBot.ircLogAppend": {"tf": 1}, "irc_bot.IrcBot.ircLogWriteToFile": {"tf": 1}, "irc_bot.IrcBot.readincoming": {"tf": 1}, "irc_bot.IrcBot.mainLoop": {"tf": 1}, "irc_bot.IrcBot.begin": {"tf": 1}, "irc_bot.IrcBot.checkIrcActions": {"tf": 1}, "irc_bot.IrcBot.checkMarvinActions": {"tf": 1}, "test_main.ConfigMergeTest.assertMergedConfig": {"tf": 1}, "test_main.ConfigMergeTest.testEmpty": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameter": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameterOverwrites": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameterMerges": {"tf": 1}, "test_main.ConfigParseTest.testOverrideHardcodedParameters": {"tf": 1}, "test_main.ConfigParseTest.testOverrideMultipleParameters": {"tf": 1}, "test_main.ConfigParseTest.testOverrideWithFile": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceConfigFirst": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceParameterFirst": {"tf": 1}, "test_main.ConfigParseTest.testBannedParameters": {"tf": 1}, "test_main.FormattingTest.assertPrintOption": {"tf": 1}, "test_main.FormattingTest.testHelpPrintout": {"tf": 1}, "test_main.FormattingTest.testHelpPrintoutShort": {"tf": 1}, "test_main.FormattingTest.testVersionPrintout": {"tf": 1}, "test_main.FormattingTest.testVersionPrintoutShort": {"tf": 1}, "test_main.FormattingTest.testUnhandledOption": {"tf": 1}, "test_main.FormattingTest.testUnhandledArgument": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineDiscordProtocol": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineIRCProtocol": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineIRCProtocolisDefault": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineConfigThrowsOnInvalidProto": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateIRCBot": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateDiscordBot": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateUnsupportedProtocolThrows": {"tf": 1}, "test_marvin_actions.ActionTest.executeAction": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionSilent": {"tf": 1}, "test_marvin_actions.ActionTest.assertStringsOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertBBQResponse": {"tf": 1}, "test_marvin_actions.ActionTest.assertNameDayOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertJokeOutput": {"tf": 1}, "test_marvin_actions.ActionTest.testSmile": {"tf": 1}, "test_marvin_actions.ActionTest.testWhois": {"tf": 1}, "test_marvin_actions.ActionTest.testGoogle": {"tf": 1}, "test_marvin_actions.ActionTest.testExplainShell": {"tf": 1}, "test_marvin_actions.ActionTest.testSource": {"tf": 1}, "test_marvin_actions.ActionTest.testBudord": {"tf": 1}, "test_marvin_actions.ActionTest.testQuote": {"tf": 1}, "test_marvin_actions.ActionTest.testVideoOfToday": {"tf": 1}, "test_marvin_actions.ActionTest.testHelp": {"tf": 1}, "test_marvin_actions.ActionTest.testStats": {"tf": 1}, "test_marvin_actions.ActionTest.testIRCLog": {"tf": 1}, "test_marvin_actions.ActionTest.testSayHi": {"tf": 1}, "test_marvin_actions.ActionTest.testLunchLocations": {"tf": 1}, "test_marvin_actions.ActionTest.testStrip": {"tf": 1}, "test_marvin_actions.ActionTest.testRandomStrip": {"tf": 1}, "test_marvin_actions.ActionTest.testTimeToBBQ": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayReaction": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayResponse": {"tf": 1}, "test_marvin_actions.ActionTest.testJokeRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testJoke": {"tf": 1}, "test_marvin_actions.ActionTest.testUptime": {"tf": 1}, "test_marvin_actions.ActionTest.testStream": {"tf": 1}, "test_marvin_actions.ActionTest.testPrinciple": {"tf": 1}, "test_marvin_actions.ActionTest.testCommitRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testCommitResponse": {"tf": 1}, "test_marvin_actions.ActionTest.testMorning": {"tf": 1}}, "df": 78}}}, "u": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "y": {"docs": {"test_marvin_actions.ActionTest.assertStringsOutput": {"tf": 1}}, "df": 1}}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {"bot.Bot.setConfig": {"tf": 1}, "marvin_actions.setConfig": {"tf": 1}, "marvin_general_actions.setConfig": {"tf": 1}, "test_main.ConfigMergeTest.assertMergedConfig": {"tf": 1}}, "df": 4, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"main.mergeOptionsWithConfigFile": {"tf": 1}}, "df": 1}}}}}}}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"irc_bot.IrcBot.sendPrivMsg": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {}, "df": 0, "s": {"docs": {"test_main.FormattingTest.setUpClass": {"tf": 1}, "test_marvin_actions.ActionTest.setUpClass": {"tf": 1}}, "df": 2}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"test_marvin_actions.ActionTest.executeAction": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionSilent": {"tf": 1}, "test_marvin_actions.ActionTest.assertStringsOutput": {"tf": 1}}, "df": 4, "s": {"docs": {"bot.Bot.registerActions": {"tf": 1}, "bot.Bot.registerGeneralActions": {"tf": 1}}, "df": 2}}}}}}}, "m": {"docs": {"marvin_actions.thirdFridayIn": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"bot.Bot.tokenize": {"tf": 1}, "discord_bot.DiscordBot.checkMarvinActions": {"tf": 1}, "discord_bot.DiscordBot.on_message": {"tf": 1}, "irc_bot.IrcBot.sendPrivMsg": {"tf": 1}, "irc_bot.IrcBot.ircLogAppend": {"tf": 1}, "test_marvin_actions.ActionTest.executeAction": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionSilent": {"tf": 1}, "test_marvin_actions.ActionTest.assertStringsOutput": {"tf": 1}}, "df": 9}}}}}}, "s": {"docs": {}, "df": 0, "g": {"docs": {"irc_bot.IrcBot.sendMsg": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "w": {"docs": {"irc_bot.IrcBot.decode_irc": {"tf": 1}}, "df": 1}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.commitStrip": {"tf": 1}}, "df": 1}}}}}}}}, "o": {"docs": {}, "df": 0, "w": {"docs": {"marvin_actions.marvinSmile": {"tf": 1}, "marvin_actions.marvinGoogle": {"tf": 1}, "marvin_actions.marvinExplainShell": {"tf": 1}, "marvin_actions.marvinSource": {"tf": 1}, "marvin_actions.marvinBudord": {"tf": 1}, "marvin_actions.marvinQuote": {"tf": 1}, "marvin_actions.marvinVideoOfToday": {"tf": 1}, "marvin_actions.marvinWhoIs": {"tf": 1}, "marvin_actions.marvinHelp": {"tf": 1}, "marvin_actions.marvinStats": {"tf": 1}, "marvin_actions.marvinIrcLog": {"tf": 1}, "marvin_actions.marvinSayHi": {"tf": 1}, "marvin_actions.marvinLunch": {"tf": 1}, "marvin_actions.marvinListen": {"tf": 1}, "marvin_actions.marvinSun": {"tf": 1}, "marvin_actions.marvinWeather": {"tf": 1}, "marvin_actions.marvinStrip": {"tf": 1}, "marvin_actions.marvinTimeToBBQ": {"tf": 1}, "marvin_actions.marvinBirthday": {"tf": 1}, "marvin_actions.marvinNameday": {"tf": 1}, "marvin_actions.marvinUptime": {"tf": 1}, "marvin_actions.marvinStream": {"tf": 1}, "marvin_actions.marvinPrinciple": {"tf": 1}, "marvin_actions.marvinJoke": {"tf": 1}, "marvin_actions.marvinCommit": {"tf": 1}, "marvin_general_actions.marvinMorning": {"tf": 1}}, "df": 26}}, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"test_main.FormattingTest.assertPrintOption": {"tf": 1}}, "df": 1}}}}}}}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"irc_bot.IrcBot.decode_irc": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {"main.createBot": {"tf": 1}}, "df": 1}}}}}}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "s": {"docs": {"irc_bot.IrcBot.decode_irc": {"tf": 1}}, "df": 1}}}, "x": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"test_main.ConfigMergeTest.assertMergedConfig": {"tf": 1}}, "df": 1, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"test_marvin_actions.ActionTest.assertActionOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertNameDayOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertJokeOutput": {"tf": 1}}, "df": 3, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "y": {"docs": {"test_marvin_actions.ActionTest.assertStringsOutput": {"tf": 1}}, "df": 1}}}}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "y": {"docs": {"test_marvin_actions.ActionTest.assertBBQResponse": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.assertNameDayOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertJokeOutput": {"tf": 1}}, "df": 2}}}}}}}}}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"irc_bot.IrcBot.decode_irc": {"tf": 1}, "irc_bot.IrcBot.ircLogAppend": {"tf": 1.7320508075688772}, "marvin_actions.getString": {"tf": 1}, "marvin_general_actions.getString": {"tf": 1}, "test_marvin_actions.ActionTest.assertStringsOutput": {"tf": 1}}, "df": 5}}}}, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"irc_bot.IrcBot.ircLogAppend": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"irc_bot.IrcBot.ircLogAppend": {"tf": 1}}, "df": 1}}}}, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "s": {"docs": {"irc_bot.IrcBot.checkIrcActions": {"tf": 1}, "irc_bot.IrcBot.checkMarvinActions": {"tf": 1}, "marvin_actions.wordsAfterKeyWords": {"tf": 1}}, "df": 3}}}}}, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"main.mergeOptionsWithConfigFile": {"tf": 1}, "main.parseOptions": {"tf": 1}, "test_main.FormattingTest.assertPrintOption": {"tf": 1}}, "df": 3}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"test_main.FormattingTest.assertPrintOption": {"tf": 1}}, "df": 1}}}}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "y": {"1": {"docs": {"marvin_actions.getString": {"tf": 1}, "marvin_general_actions.getString": {"tf": 1}}, "df": 2}, "docs": {"marvin_actions.getString": {"tf": 1}, "marvin_general_actions.getString": {"tf": 1}}, "df": 2, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "s": {"docs": {"marvin_actions.wordsAfterKeyWords": {"tf": 1}}, "df": 1}}}}}}}}, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.commitStrip": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"test_main.ConfigMergeTest.assertMergedConfig": {"tf": 1}}, "df": 1}}}}}}}}, "y": {"docs": {"marvin_actions.thirdFridayIn": {"tf": 1}}, "df": 1}, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.assertBBQResponse": {"tf": 1}}, "df": 1}}}}}}}}}}, "b": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "q": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.assertBBQResponse": {"tf": 1}}, "df": 1}}}}}}}}}, "bases": {"root": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {"discord_bot.DiscordBot": {"tf": 1}}, "df": 1}}}}}}}, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"discord_bot.DiscordBot": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"test_main.ConfigMergeTest": {"tf": 1}, "test_main.ConfigParseTest": {"tf": 1}, "test_main.FormattingTest": {"tf": 1}, "test_main.TestArgumentParsing": {"tf": 1}, "test_main.TestBotFactoryMethod": {"tf": 1}, "test_marvin_actions.ActionTest": {"tf": 1}}, "df": 6}}}}, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"discord_bot.DiscordBot": {"tf": 1.4142135623730951}, "irc_bot.IrcBot": {"tf": 1.4142135623730951}}, "df": 2}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"test_main.ConfigMergeTest": {"tf": 1}, "test_main.ConfigParseTest": {"tf": 1}, "test_main.FormattingTest": {"tf": 1}, "test_main.TestArgumentParsing": {"tf": 1}, "test_main.TestBotFactoryMethod": {"tf": 1}, "test_marvin_actions.ActionTest": {"tf": 1}}, "df": 6}}}}}}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"test_main.ConfigMergeTest": {"tf": 1}, "test_main.ConfigParseTest": {"tf": 1}, "test_main.FormattingTest": {"tf": 1}, "test_main.TestArgumentParsing": {"tf": 1}, "test_main.TestBotFactoryMethod": {"tf": 1}, "test_marvin_actions.ActionTest": {"tf": 1}}, "df": 6}}}}}}}}}}, "doc": {"root": {"1": {"6": {"0": {"docs": {"test_main.FormattingTest.setUpClass": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "6": {"6": {"6": {"7": {"docs": {"main": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"bot": {"tf": 1.4142135623730951}, "bot.Bot": {"tf": 1.4142135623730951}, "bot.Bot.CONFIG": {"tf": 1.7320508075688772}, "bot.Bot.ACTIONS": {"tf": 1.7320508075688772}, "bot.Bot.GENERAL_ACTIONS": {"tf": 1.7320508075688772}, "bot.Bot.getConfig": {"tf": 1.4142135623730951}, "bot.Bot.setConfig": {"tf": 1.4142135623730951}, "bot.Bot.registerActions": {"tf": 1.4142135623730951}, "bot.Bot.registerGeneralActions": {"tf": 1.4142135623730951}, "bot.Bot.tokenize": {"tf": 1.4142135623730951}, "discord_bot": {"tf": 2.449489742783178}, "discord_bot.DiscordBot": {"tf": 1.4142135623730951}, "discord_bot.DiscordBot.CONFIG": {"tf": 1.7320508075688772}, "discord_bot.DiscordBot.begin": {"tf": 1.4142135623730951}, "discord_bot.DiscordBot.checkMarvinActions": {"tf": 1.4142135623730951}, "discord_bot.DiscordBot.on_message": {"tf": 1.4142135623730951}, "irc_bot": {"tf": 3}, "irc_bot.IrcBot": {"tf": 1.4142135623730951}, "irc_bot.IrcBot.CONFIG": {"tf": 1.7320508075688772}, "irc_bot.IrcBot.SOCKET": {"tf": 1.7320508075688772}, "irc_bot.IrcBot.IRCLOG": {"tf": 1.7320508075688772}, "irc_bot.IrcBot.connectToServer": {"tf": 1.4142135623730951}, "irc_bot.IrcBot.sendPrivMsg": {"tf": 1.4142135623730951}, "irc_bot.IrcBot.sendMsg": {"tf": 1.4142135623730951}, "irc_bot.IrcBot.decode_irc": {"tf": 2}, "irc_bot.IrcBot.receive": {"tf": 1.4142135623730951}, "irc_bot.IrcBot.ircLogAppend": {"tf": 1.4142135623730951}, "irc_bot.IrcBot.ircLogWriteToFile": {"tf": 1.4142135623730951}, "irc_bot.IrcBot.readincoming": {"tf": 1.7320508075688772}, "irc_bot.IrcBot.mainLoop": {"tf": 1.4142135623730951}, "irc_bot.IrcBot.begin": {"tf": 1.4142135623730951}, "irc_bot.IrcBot.checkIrcActions": {"tf": 1.7320508075688772}, "irc_bot.IrcBot.checkMarvinActions": {"tf": 1.4142135623730951}, "main": {"tf": 6.164414002968976}, "main.PROGRAM": {"tf": 1.7320508075688772}, "main.AUTHOR": {"tf": 1.7320508075688772}, "main.EMAIL": {"tf": 1.7320508075688772}, "main.VERSION": {"tf": 1.7320508075688772}, "main.MSG_VERSION": {"tf": 1.7320508075688772}, "main.printVersion": {"tf": 1.7320508075688772}, "main.mergeOptionsWithConfigFile": {"tf": 1.7320508075688772}, "main.parseOptions": {"tf": 1.7320508075688772}, "main.determineProtocol": {"tf": 1.4142135623730951}, "main.createBot": {"tf": 1.4142135623730951}, "main.main": {"tf": 1.7320508075688772}, "marvin_actions": {"tf": 1.7320508075688772}, "marvin_actions.getAllActions": {"tf": 1.7320508075688772}, "marvin_actions.CONFIG": {"tf": 1.7320508075688772}, "marvin_actions.setConfig": {"tf": 1.7320508075688772}, "marvin_actions.getString": {"tf": 1.7320508075688772}, "marvin_actions.marvinSmile": {"tf": 1.7320508075688772}, "marvin_actions.wordsAfterKeyWords": {"tf": 1.7320508075688772}, "marvin_actions.marvinGoogle": {"tf": 1.7320508075688772}, "marvin_actions.marvinExplainShell": {"tf": 1.7320508075688772}, "marvin_actions.marvinSource": {"tf": 1.7320508075688772}, "marvin_actions.marvinBudord": {"tf": 1.4142135623730951}, "marvin_actions.marvinQuote": {"tf": 1.7320508075688772}, "marvin_actions.videoOfToday": {"tf": 1.7320508075688772}, "marvin_actions.marvinVideoOfToday": {"tf": 1.7320508075688772}, "marvin_actions.marvinWhoIs": {"tf": 1.7320508075688772}, "marvin_actions.marvinHelp": {"tf": 1.7320508075688772}, "marvin_actions.marvinStats": {"tf": 1.7320508075688772}, "marvin_actions.marvinIrcLog": {"tf": 1.4142135623730951}, "marvin_actions.marvinSayHi": {"tf": 1.7320508075688772}, "marvin_actions.marvinLunch": {"tf": 1.7320508075688772}, "marvin_actions.marvinListen": {"tf": 1.7320508075688772}, "marvin_actions.marvinSun": {"tf": 1.7320508075688772}, "marvin_actions.marvinWeather": {"tf": 1.7320508075688772}, "marvin_actions.marvinStrip": {"tf": 1.7320508075688772}, "marvin_actions.commitStrip": {"tf": 1.7320508075688772}, "marvin_actions.marvinTimeToBBQ": {"tf": 1.4142135623730951}, "marvin_actions.nextBBQ": {"tf": 1.4142135623730951}, "marvin_actions.thirdFridayIn": {"tf": 1.4142135623730951}, "marvin_actions.marvinBirthday": {"tf": 1.4142135623730951}, "marvin_actions.marvinNameday": {"tf": 1.4142135623730951}, "marvin_actions.marvinUptime": {"tf": 1.4142135623730951}, "marvin_actions.marvinStream": {"tf": 1.4142135623730951}, "marvin_actions.marvinPrinciple": {"tf": 1.4142135623730951}, "marvin_actions.getJoke": {"tf": 1.4142135623730951}, "marvin_actions.marvinJoke": {"tf": 1.4142135623730951}, "marvin_actions.getCommit": {"tf": 1.4142135623730951}, "marvin_actions.marvinCommit": {"tf": 1.4142135623730951}, "marvin_general_actions": {"tf": 1.7320508075688772}, "marvin_general_actions.CONFIG": {"tf": 1.7320508075688772}, "marvin_general_actions.lastDateGreeted": {"tf": 1.7320508075688772}, "marvin_general_actions.setConfig": {"tf": 1.7320508075688772}, "marvin_general_actions.getString": {"tf": 1.7320508075688772}, "marvin_general_actions.getAllGeneralActions": {"tf": 1.7320508075688772}, "marvin_general_actions.marvinMorning": {"tf": 1.4142135623730951}, "test_main": {"tf": 1.4142135623730951}, "test_main.ConfigMergeTest": {"tf": 1.4142135623730951}, "test_main.ConfigMergeTest.assertMergedConfig": {"tf": 1.4142135623730951}, "test_main.ConfigMergeTest.testEmpty": {"tf": 1.4142135623730951}, "test_main.ConfigMergeTest.testAddSingleParameter": {"tf": 1.4142135623730951}, "test_main.ConfigMergeTest.testAddSingleParameterOverwrites": {"tf": 1.4142135623730951}, "test_main.ConfigMergeTest.testAddSingleParameterMerges": {"tf": 1.4142135623730951}, "test_main.ConfigParseTest": {"tf": 1.4142135623730951}, "test_main.ConfigParseTest.SAMPLE_CONFIG": {"tf": 1.7320508075688772}, "test_main.ConfigParseTest.CHANGED_CONFIG": {"tf": 1.7320508075688772}, "test_main.ConfigParseTest.testOverrideHardcodedParameters": {"tf": 1.4142135623730951}, "test_main.ConfigParseTest.testOverrideMultipleParameters": {"tf": 1.4142135623730951}, "test_main.ConfigParseTest.testOverrideWithFile": {"tf": 1.4142135623730951}, "test_main.ConfigParseTest.testOverridePrecedenceConfigFirst": {"tf": 2}, "test_main.ConfigParseTest.testOverridePrecedenceParameterFirst": {"tf": 2}, "test_main.ConfigParseTest.testBannedParameters": {"tf": 1.4142135623730951}, "test_main.FormattingTest": {"tf": 1.4142135623730951}, "test_main.FormattingTest.USAGE": {"tf": 1.7320508075688772}, "test_main.FormattingTest.OPTIONS": {"tf": 1.7320508075688772}, "test_main.FormattingTest.setUpClass": {"tf": 1.4142135623730951}, "test_main.FormattingTest.assertPrintOption": {"tf": 1.4142135623730951}, "test_main.FormattingTest.testHelpPrintout": {"tf": 1.4142135623730951}, "test_main.FormattingTest.testHelpPrintoutShort": {"tf": 1.4142135623730951}, "test_main.FormattingTest.testVersionPrintout": {"tf": 1.4142135623730951}, "test_main.FormattingTest.testVersionPrintoutShort": {"tf": 1.4142135623730951}, "test_main.FormattingTest.testUnhandledOption": {"tf": 1.4142135623730951}, "test_main.FormattingTest.testUnhandledArgument": {"tf": 1.4142135623730951}, "test_main.TestArgumentParsing": {"tf": 1.4142135623730951}, "test_main.TestArgumentParsing.testDetermineDiscordProtocol": {"tf": 1.4142135623730951}, "test_main.TestArgumentParsing.testDetermineIRCProtocol": {"tf": 1.4142135623730951}, "test_main.TestArgumentParsing.testDetermineIRCProtocolisDefault": {"tf": 1.4142135623730951}, "test_main.TestArgumentParsing.testDetermineConfigThrowsOnInvalidProto": {"tf": 1.4142135623730951}, "test_main.TestBotFactoryMethod": {"tf": 1.4142135623730951}, "test_main.TestBotFactoryMethod.testCreateIRCBot": {"tf": 1.4142135623730951}, "test_main.TestBotFactoryMethod.testCreateDiscordBot": {"tf": 1.4142135623730951}, "test_main.TestBotFactoryMethod.testCreateUnsupportedProtocolThrows": {"tf": 1.4142135623730951}, "test_marvin_actions": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.strings": {"tf": 1.7320508075688772}, "test_marvin_actions.ActionTest.setUpClass": {"tf": 1.7320508075688772}, "test_marvin_actions.ActionTest.executeAction": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.assertActionOutput": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.assertActionSilent": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.assertStringsOutput": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.assertBBQResponse": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.assertNameDayOutput": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.assertJokeOutput": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testSmile": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testWhois": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testGoogle": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testExplainShell": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testSource": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testBudord": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testQuote": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testVideoOfToday": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testHelp": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testStats": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testIRCLog": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testSayHi": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testLunchLocations": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testStrip": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testRandomStrip": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testTimeToBBQ": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testNameDayReaction": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testNameDayRequest": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testNameDayResponse": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testJokeRequest": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testJoke": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testUptime": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testStream": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testPrinciple": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testCommitRequest": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testCommitResponse": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testMorning": {"tf": 1.4142135623730951}}, "df": 163, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"bot": {"tf": 1}, "discord_bot": {"tf": 1}, "irc_bot": {"tf": 1}}, "df": 3, "s": {"docs": {"main": {"tf": 2.6457513110645907}}, "df": 1}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {"irc_bot.IrcBot.readincoming": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"main": {"tf": 1}}, "df": 1}}}}, "h": {"docs": {"marvin_actions.thirdFridayIn": {"tf": 1}}, "df": 1}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"main": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceConfigFirst": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceParameterFirst": {"tf": 1}, "test_marvin_actions.ActionTest.testMorning": {"tf": 1}}, "df": 4}}, "r": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"marvin_general_actions.marvinMorning": {"tf": 1}, "test_marvin_actions.ActionTest.testMorning": {"tf": 1}}, "df": 2}}}}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"bot.Bot.tokenize": {"tf": 1}, "discord_bot.DiscordBot.on_message": {"tf": 1}, "irc_bot.IrcBot.sendPrivMsg": {"tf": 1}, "irc_bot.IrcBot.sendMsg": {"tf": 1}, "irc_bot.IrcBot.receive": {"tf": 1}, "irc_bot.IrcBot.ircLogAppend": {"tf": 1}, "irc_bot.IrcBot.readincoming": {"tf": 1}, "marvin_actions.marvinSource": {"tf": 1}, "marvin_actions.marvinSayHi": {"tf": 1}, "marvin_actions.getCommit": {"tf": 1}, "marvin_actions.marvinCommit": {"tf": 1}, "test_marvin_actions.ActionTest.executeAction": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionSilent": {"tf": 1}, "test_marvin_actions.ActionTest.assertStringsOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertBBQResponse": {"tf": 1}, "test_marvin_actions.ActionTest.assertNameDayOutput": {"tf": 1}}, "df": 17, "s": {"docs": {"discord_bot": {"tf": 1}, "irc_bot": {"tf": 1}, "irc_bot.IrcBot.checkIrcActions": {"tf": 1}, "main": {"tf": 1}, "test_marvin_actions.ActionTest.testCommitRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testCommitResponse": {"tf": 1}}, "df": 6}}}}}}, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"main.parseOptions": {"tf": 1}, "test_main.ConfigMergeTest.assertMergedConfig": {"tf": 1}}, "df": 2}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"test_main.ConfigMergeTest": {"tf": 1}}, "df": 1}}}}}, "n": {"docs": {}, "df": 0, "u": {"docs": {"marvin_actions.marvinHelp": {"tf": 1}, "test_marvin_actions.ActionTest.testHelp": {"tf": 1}}, "df": 2}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {"test_marvin_actions.ActionTest.setUpClass": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"discord_bot.DiscordBot.checkMarvinActions": {"tf": 1}, "irc_bot.IrcBot.checkIrcActions": {"tf": 1}, "irc_bot.IrcBot.checkMarvinActions": {"tf": 1}, "main": {"tf": 2.449489742783178}, "marvin_actions": {"tf": 1}, "marvin_actions.marvinSmile": {"tf": 1}, "marvin_actions.marvinGoogle": {"tf": 1}, "marvin_actions.marvinExplainShell": {"tf": 1}, "marvin_actions.marvinBudord": {"tf": 1}, "marvin_actions.marvinWhoIs": {"tf": 1}, "marvin_general_actions": {"tf": 1}, "marvin_general_actions.marvinMorning": {"tf": 1}, "test_marvin_actions": {"tf": 1}, "test_marvin_actions.ActionTest": {"tf": 1}, "test_marvin_actions.ActionTest.testSmile": {"tf": 1}, "test_marvin_actions.ActionTest.testWhois": {"tf": 1}, "test_marvin_actions.ActionTest.testGoogle": {"tf": 1}, "test_marvin_actions.ActionTest.testExplainShell": {"tf": 1}, "test_marvin_actions.ActionTest.testSource": {"tf": 1}, "test_marvin_actions.ActionTest.testBudord": {"tf": 1}, "test_marvin_actions.ActionTest.testQuote": {"tf": 1}, "test_marvin_actions.ActionTest.testVideoOfToday": {"tf": 1}, "test_marvin_actions.ActionTest.testHelp": {"tf": 1}, "test_marvin_actions.ActionTest.testStats": {"tf": 1}, "test_marvin_actions.ActionTest.testIRCLog": {"tf": 1}, "test_marvin_actions.ActionTest.testSayHi": {"tf": 1}, "test_marvin_actions.ActionTest.testLunchLocations": {"tf": 1}, "test_marvin_actions.ActionTest.testStrip": {"tf": 1}, "test_marvin_actions.ActionTest.testRandomStrip": {"tf": 1}, "test_marvin_actions.ActionTest.testTimeToBBQ": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayReaction": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayResponse": {"tf": 1}, "test_marvin_actions.ActionTest.testJokeRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testJoke": {"tf": 1}, "test_marvin_actions.ActionTest.testUptime": {"tf": 1}, "test_marvin_actions.ActionTest.testStream": {"tf": 1}, "test_marvin_actions.ActionTest.testPrinciple": {"tf": 1}, "test_marvin_actions.ActionTest.testCommitRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testCommitResponse": {"tf": 1}, "test_marvin_actions.ActionTest.testMorning": {"tf": 1}}, "df": 41}}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"irc_bot": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"test_main.ConfigMergeTest.assertMergedConfig": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {"main": {"tf": 1.4142135623730951}, "main.main": {"tf": 1}, "test_main": {"tf": 1}}, "df": 3}}, "k": {"docs": {}, "df": 0, "e": {"docs": {"main": {"tf": 1}, "marvin_actions": {"tf": 1}, "marvin_actions.marvinSmile": {"tf": 1}, "marvin_actions.marvinQuote": {"tf": 1}, "marvin_general_actions": {"tf": 1}}, "df": 5}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"marvin_actions.marvinListen": {"tf": 1}}, "df": 1}}}, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"test_main.ConfigParseTest.testOverrideMultipleParameters": {"tf": 1}}, "df": 1}}}}}}}, "s": {"docs": {}, "df": 0, "g": {"docs": {"marvin_actions.marvinTimeToBBQ": {"tf": 1}}, "df": 1}}}, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"bot": {"tf": 1.4142135623730951}, "bot.Bot": {"tf": 1}, "discord_bot": {"tf": 1}, "irc_bot": {"tf": 1}, "irc_bot.IrcBot.mainLoop": {"tf": 1}, "main": {"tf": 1.4142135623730951}, "marvin_actions": {"tf": 1.4142135623730951}, "marvin_actions.marvinBudord": {"tf": 1}, "marvin_general_actions": {"tf": 1.4142135623730951}, "test_main": {"tf": 1}, "test_marvin_actions": {"tf": 1}, "test_marvin_actions.ActionTest.setUpClass": {"tf": 1}, "test_marvin_actions.ActionTest.executeAction": {"tf": 1}, "test_marvin_actions.ActionTest.testLunchLocations": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testJokeRequest": {"tf": 1}}, "df": 16, "u": {"docs": {}, "df": 0, "m": {"docs": {"main": {"tf": 1.4142135623730951}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"irc_bot.IrcBot.ircLogWriteToFile": {"tf": 1}, "irc_bot.IrcBot.readincoming": {"tf": 1}, "main": {"tf": 1.7320508075688772}, "main.mergeOptionsWithConfigFile": {"tf": 1}, "test_main.ConfigMergeTest": {"tf": 1}, "test_main.ConfigMergeTest.assertMergedConfig": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceConfigFirst": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceParameterFirst": {"tf": 1}, "test_marvin_actions.ActionTest.assertJokeOutput": {"tf": 1}}, "df": 9, "s": {"docs": {"irc_bot.IrcBot.readincoming": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"marvin_actions.wordsAfterKeyWords": {"tf": 1}}, "df": 1}}}, "x": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.setUpClass": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"main": {"tf": 1.7320508075688772}, "main.mergeOptionsWithConfigFile": {"tf": 1}, "marvin_actions.getString": {"tf": 1}, "marvin_actions.commitStrip": {"tf": 1}, "marvin_actions.getJoke": {"tf": 1}, "marvin_actions.getCommit": {"tf": 1}, "marvin_general_actions.getString": {"tf": 1}, "test_main.ConfigParseTest.testOverrideHardcodedParameters": {"tf": 1}, "test_main.ConfigParseTest.testOverrideMultipleParameters": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceConfigFirst": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceParameterFirst": {"tf": 1}, "test_main.FormattingTest.setUpClass": {"tf": 1}}, "df": 12}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"marvin_actions.thirdFridayIn": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"main": {"tf": 1}}, "df": 1, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"main": {"tf": 1}}, "df": 1}}}}}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"main": {"tf": 1}, "main.main": {"tf": 1}, "marvin_actions": {"tf": 1}, "marvin_general_actions": {"tf": 1}}, "df": 4}}}}}}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"test_main.FormattingTest.setUpClass": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "g": {"docs": {"test_main.FormattingTest.testHelpPrintout": {"tf": 1}, "test_main.FormattingTest.testHelpPrintoutShort": {"tf": 1}, "test_main.FormattingTest.testVersionPrintout": {"tf": 1}, "test_main.FormattingTest.testVersionPrintoutShort": {"tf": 1}}, "df": 4}}}}, "t": {"docs": {"test_main.ConfigParseTest.testBannedParameters": {"tf": 1}}, "df": 1, "h": {"docs": {}, "df": 0, "e": {"docs": {"bot": {"tf": 1}, "bot.Bot.getConfig": {"tf": 1}, "bot.Bot.setConfig": {"tf": 1}, "discord_bot": {"tf": 1}, "discord_bot.DiscordBot": {"tf": 1}, "discord_bot.DiscordBot.begin": {"tf": 1}, "irc_bot": {"tf": 1}, "irc_bot.IrcBot": {"tf": 1}, "irc_bot.IrcBot.connectToServer": {"tf": 1}, "irc_bot.IrcBot.sendMsg": {"tf": 1}, "irc_bot.IrcBot.readincoming": {"tf": 1.4142135623730951}, "irc_bot.IrcBot.begin": {"tf": 1}, "irc_bot.IrcBot.checkIrcActions": {"tf": 1}, "main": {"tf": 3.4641016151377544}, "main.determineProtocol": {"tf": 1}, "main.createBot": {"tf": 1}, "main.main": {"tf": 1}, "marvin_actions.setConfig": {"tf": 1}, "marvin_actions.getString": {"tf": 1}, "marvin_actions.wordsAfterKeyWords": {"tf": 1.7320508075688772}, "marvin_actions.marvinExplainShell": {"tf": 1}, "marvin_actions.marvinBudord": {"tf": 1}, "marvin_actions.marvinVideoOfToday": {"tf": 1}, "marvin_actions.marvinStats": {"tf": 1}, "marvin_actions.marvinIrcLog": {"tf": 1}, "marvin_actions.marvinSun": {"tf": 1}, "marvin_actions.marvinWeather": {"tf": 1}, "marvin_actions.marvinTimeToBBQ": {"tf": 1}, "marvin_actions.nextBBQ": {"tf": 1}, "marvin_actions.thirdFridayIn": {"tf": 1}, "marvin_general_actions.setConfig": {"tf": 1}, "marvin_general_actions.getString": {"tf": 1}, "test_main": {"tf": 1}, "test_main.ConfigMergeTest.assertMergedConfig": {"tf": 1}, "test_main.ConfigParseTest.testOverrideHardcodedParameters": {"tf": 1}, "test_main.ConfigParseTest.testOverrideWithFile": {"tf": 1}, "test_main.FormattingTest": {"tf": 1}, "test_main.FormattingTest.setUpClass": {"tf": 1.4142135623730951}, "test_main.FormattingTest.testHelpPrintout": {"tf": 1}, "test_main.FormattingTest.testHelpPrintoutShort": {"tf": 1}, "test_main.FormattingTest.testVersionPrintout": {"tf": 1.4142135623730951}, "test_main.FormattingTest.testVersionPrintoutShort": {"tf": 1.4142135623730951}, "test_main.TestArgumentParsing.testDetermineDiscordProtocol": {"tf": 1.4142135623730951}, "test_main.TestArgumentParsing.testDetermineIRCProtocol": {"tf": 1.4142135623730951}, "test_main.TestArgumentParsing.testDetermineIRCProtocolisDefault": {"tf": 1}, "test_marvin_actions.ActionTest.setUpClass": {"tf": 1}, "test_marvin_actions.ActionTest.executeAction": {"tf": 1}, "test_marvin_actions.ActionTest.assertStringsOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertBBQResponse": {"tf": 1}, "test_marvin_actions.ActionTest.assertNameDayOutput": {"tf": 1}, "test_marvin_actions.ActionTest.testBudord": {"tf": 1}, "test_marvin_actions.ActionTest.testQuote": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testVideoOfToday": {"tf": 1}, "test_marvin_actions.ActionTest.testStats": {"tf": 1}, "test_marvin_actions.ActionTest.testIRCLog": {"tf": 1}, "test_marvin_actions.ActionTest.testTimeToBBQ": {"tf": 1}, "test_marvin_actions.ActionTest.testUptime": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testStream": {"tf": 1.4142135623730951}}, "df": 58, "m": {"docs": {"irc_bot.IrcBot.readincoming": {"tf": 1}, "main.parseOptions": {"tf": 1}}, "df": 2}, "y": {"docs": {"irc_bot.IrcBot.readincoming": {"tf": 1}}, "df": 1}, "n": {"docs": {"irc_bot.IrcBot.readincoming": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"bot.Bot": {"tf": 1}}, "df": 1}}}, "s": {"docs": {"main": {"tf": 1}}, "df": 1}, "r": {"docs": {}, "df": 0, "d": {"docs": {"marvin_actions.thirdFridayIn": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {"irc_bot.IrcBot.decode_irc": {"tf": 1}}, "df": 1}}}, "w": {"docs": {"test_main.TestBotFactoryMethod.testCreateUnsupportedProtocolThrows": {"tf": 1}}, "df": 1, "s": {"docs": {"test_main.TestArgumentParsing.testDetermineConfigThrowsOnInvalidProto": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {"main": {"tf": 1.4142135623730951}, "test_main.ConfigMergeTest.testAddSingleParameterOverwrites": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameterMerges": {"tf": 1}, "test_main.ConfigParseTest.testOverrideHardcodedParameters": {"tf": 1}, "test_main.ConfigParseTest.testOverrideMultipleParameters": {"tf": 1}, "test_main.ConfigParseTest.testOverrideWithFile": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceConfigFirst": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceParameterFirst": {"tf": 1}, "test_main.FormattingTest": {"tf": 1}, "test_main.FormattingTest.assertPrintOption": {"tf": 1}, "test_main.FormattingTest.testHelpPrintout": {"tf": 1}, "test_main.FormattingTest.testHelpPrintoutShort": {"tf": 1}, "test_main.FormattingTest.testVersionPrintout": {"tf": 1}, "test_main.FormattingTest.testVersionPrintoutShort": {"tf": 1}, "test_main.FormattingTest.testUnhandledOption": {"tf": 1}, "test_main.FormattingTest.testUnhandledArgument": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineDiscordProtocol": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineIRCProtocol": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineIRCProtocolisDefault": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineConfigThrowsOnInvalidProto": {"tf": 1}, "test_main.TestBotFactoryMethod": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateIRCBot": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateDiscordBot": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateUnsupportedProtocolThrows": {"tf": 1}, "test_marvin_actions.ActionTest.assertBBQResponse": {"tf": 1}, "test_marvin_actions.ActionTest.assertNameDayOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertJokeOutput": {"tf": 1}, "test_marvin_actions.ActionTest.testSmile": {"tf": 1}, "test_marvin_actions.ActionTest.testWhois": {"tf": 1}, "test_marvin_actions.ActionTest.testGoogle": {"tf": 1}, "test_marvin_actions.ActionTest.testExplainShell": {"tf": 1}, "test_marvin_actions.ActionTest.testSource": {"tf": 1}, "test_marvin_actions.ActionTest.testBudord": {"tf": 1}, "test_marvin_actions.ActionTest.testQuote": {"tf": 1}, "test_marvin_actions.ActionTest.testVideoOfToday": {"tf": 1}, "test_marvin_actions.ActionTest.testHelp": {"tf": 1}, "test_marvin_actions.ActionTest.testStats": {"tf": 1}, "test_marvin_actions.ActionTest.testIRCLog": {"tf": 1}, "test_marvin_actions.ActionTest.testSayHi": {"tf": 1}, "test_marvin_actions.ActionTest.testLunchLocations": {"tf": 1}, "test_marvin_actions.ActionTest.testStrip": {"tf": 1}, "test_marvin_actions.ActionTest.testRandomStrip": {"tf": 1}, "test_marvin_actions.ActionTest.testTimeToBBQ": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayReaction": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayResponse": {"tf": 1}, "test_marvin_actions.ActionTest.testJokeRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testJoke": {"tf": 1}, "test_marvin_actions.ActionTest.testUptime": {"tf": 1}, "test_marvin_actions.ActionTest.testStream": {"tf": 1}, "test_marvin_actions.ActionTest.testPrinciple": {"tf": 1}, "test_marvin_actions.ActionTest.testCommitRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testCommitResponse": {"tf": 1}, "test_marvin_actions.ActionTest.testMorning": {"tf": 1}}, "df": 54}}, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"test_main.ConfigParseTest.testBannedParameters": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {"bot.Bot.registerActions": {"tf": 1}, "bot.Bot.registerGeneralActions": {"tf": 1}, "irc_bot.IrcBot.connectToServer": {"tf": 1}, "irc_bot.IrcBot.ircLogWriteToFile": {"tf": 1}, "irc_bot.IrcBot.readincoming": {"tf": 1}, "irc_bot.IrcBot.mainLoop": {"tf": 1}, "main": {"tf": 2.8284271247461903}, "main.determineProtocol": {"tf": 1.4142135623730951}, "main.main": {"tf": 1}, "marvin_actions.setConfig": {"tf": 1}, "marvin_actions.marvinGoogle": {"tf": 1}, "marvin_actions.marvinExplainShell": {"tf": 1.4142135623730951}, "marvin_actions.videoOfToday": {"tf": 1}, "marvin_actions.marvinStats": {"tf": 1}, "marvin_actions.marvinIrcLog": {"tf": 1}, "marvin_actions.marvinLunch": {"tf": 1}, "marvin_actions.marvinListen": {"tf": 1}, "marvin_actions.marvinTimeToBBQ": {"tf": 1}, "marvin_general_actions.setConfig": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameter": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameterOverwrites": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameterMerges": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceConfigFirst": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceParameterFirst": {"tf": 1}, "test_main.FormattingTest.setUpClass": {"tf": 1.4142135623730951}, "test_main.TestArgumentParsing": {"tf": 1.4142135623730951}, "test_main.TestArgumentParsing.testDetermineDiscordProtocol": {"tf": 1.4142135623730951}, "test_main.TestArgumentParsing.testDetermineIRCProtocol": {"tf": 1.4142135623730951}, "test_main.TestBotFactoryMethod.testCreateUnsupportedProtocolThrows": {"tf": 1}, "test_marvin_actions.ActionTest.assertStringsOutput": {"tf": 1}, "test_marvin_actions.ActionTest.testWhois": {"tf": 1}, "test_marvin_actions.ActionTest.testSource": {"tf": 1}, "test_marvin_actions.ActionTest.testQuote": {"tf": 1}, "test_marvin_actions.ActionTest.testVideoOfToday": {"tf": 1}, "test_marvin_actions.ActionTest.testStats": {"tf": 1}, "test_marvin_actions.ActionTest.testIRCLog": {"tf": 1}, "test_marvin_actions.ActionTest.testSayHi": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayReaction": {"tf": 1}, "test_marvin_actions.ActionTest.testUptime": {"tf": 1}, "test_marvin_actions.ActionTest.testStream": {"tf": 1}}, "df": 40, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"bot.Bot.tokenize": {"tf": 1}}, "df": 1}}}}, "p": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "s": {"docs": {"main": {"tf": 1}}, "df": 1}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"marvin_actions.videoOfToday": {"tf": 1}}, "df": 1}}}}}}, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"marvin_actions.marvinVideoOfToday": {"tf": 1}, "marvin_actions.nextBBQ": {"tf": 1}}, "df": 2}}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"marvin_actions.marvinUptime": {"tf": 1}, "test_marvin_actions.ActionTest.testUptime": {"tf": 1}}, "df": 2}}}}}}}}}, "a": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {"irc_bot.IrcBot.checkIrcActions": {"tf": 1}}, "df": 1}}, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"main": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.marvinTimeToBBQ": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"test_main.ConfigMergeTest": {"tf": 1}, "test_main.ConfigParseTest": {"tf": 1}, "test_main.ConfigParseTest.testOverrideHardcodedParameters": {"tf": 1}, "test_main.ConfigParseTest.testOverrideMultipleParameters": {"tf": 1}, "test_main.ConfigParseTest.testOverrideWithFile": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceConfigFirst": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceParameterFirst": {"tf": 1}, "test_main.FormattingTest": {"tf": 1}, "test_main.FormattingTest.testHelpPrintout": {"tf": 1}, "test_main.FormattingTest.testHelpPrintoutShort": {"tf": 1}, "test_main.FormattingTest.testVersionPrintout": {"tf": 1}, "test_main.FormattingTest.testVersionPrintoutShort": {"tf": 1}, "test_main.FormattingTest.testUnhandledOption": {"tf": 1}, "test_main.FormattingTest.testUnhandledArgument": {"tf": 1}, "test_main.TestArgumentParsing": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineDiscordProtocol": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineIRCProtocol": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineIRCProtocolisDefault": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineConfigThrowsOnInvalidProto": {"tf": 1}, "test_main.TestBotFactoryMethod": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateIRCBot": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateDiscordBot": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateUnsupportedProtocolThrows": {"tf": 1}, "test_marvin_actions.ActionTest": {"tf": 1}, "test_marvin_actions.ActionTest.testSmile": {"tf": 1}, "test_marvin_actions.ActionTest.testWhois": {"tf": 1}, "test_marvin_actions.ActionTest.testGoogle": {"tf": 1}, "test_marvin_actions.ActionTest.testExplainShell": {"tf": 1}, "test_marvin_actions.ActionTest.testSource": {"tf": 1}, "test_marvin_actions.ActionTest.testBudord": {"tf": 1}, "test_marvin_actions.ActionTest.testQuote": {"tf": 1}, "test_marvin_actions.ActionTest.testVideoOfToday": {"tf": 1}, "test_marvin_actions.ActionTest.testHelp": {"tf": 1}, "test_marvin_actions.ActionTest.testStats": {"tf": 1}, "test_marvin_actions.ActionTest.testIRCLog": {"tf": 1}, "test_marvin_actions.ActionTest.testSayHi": {"tf": 1}, "test_marvin_actions.ActionTest.testLunchLocations": {"tf": 1}, "test_marvin_actions.ActionTest.testStrip": {"tf": 1}, "test_marvin_actions.ActionTest.testRandomStrip": {"tf": 1}, "test_marvin_actions.ActionTest.testTimeToBBQ": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayReaction": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayResponse": {"tf": 1}, "test_marvin_actions.ActionTest.testJokeRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testJoke": {"tf": 1}, "test_marvin_actions.ActionTest.testUptime": {"tf": 1}, "test_marvin_actions.ActionTest.testStream": {"tf": 1}, "test_marvin_actions.ActionTest.testPrinciple": {"tf": 1}, "test_marvin_actions.ActionTest.testCommitRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testCommitResponse": {"tf": 1}, "test_marvin_actions.ActionTest.testMorning": {"tf": 1}}, "df": 51, "s": {"docs": {"test_main": {"tf": 1}, "test_main.FormattingTest.setUpClass": {"tf": 1}, "test_marvin_actions": {"tf": 1}, "test_marvin_actions.ActionTest.setUpClass": {"tf": 1}}, "df": 4}}}, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"test_main.FormattingTest.setUpClass": {"tf": 1}}, "df": 1, "s": {"docs": {"test_main.FormattingTest.setUpClass": {"tf": 1}}, "df": 1}}}}}}}}, "r": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"test_main.TestBotFactoryMethod.testCreateUnsupportedProtocolThrows": {"tf": 1}}, "df": 1}}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"bot": {"tf": 1}, "bot.Bot": {"tf": 1}}, "df": 2}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"marvin_actions.marvinExplainShell": {"tf": 1}}, "df": 1, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"test_main.ConfigParseTest.testOverrideHardcodedParameters": {"tf": 1}, "test_main.ConfigParseTest.testOverrideMultipleParameters": {"tf": 1}}, "df": 2}}}}, "s": {"docs": {"test_marvin_actions.ActionTest.testExplainShell": {"tf": 1}}, "df": 1}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"test_marvin_actions.ActionTest.testBudord": {"tf": 1}}, "df": 1}}}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {"marvin_actions.getCommit": {"tf": 1}, "marvin_actions.marvinCommit": {"tf": 1}, "test_marvin_actions.ActionTest.testCommitRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testCommitResponse": {"tf": 1}}, "df": 4, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {"marvin_actions.commitStrip": {"tf": 1}}, "df": 1}}}}}}}}, "/": {"docs": {}, "df": 0, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "/": {"9": {"3": {"8": {"8": {"7": {"0": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"irc_bot.IrcBot.decode_irc": {"tf": 1}}, "df": 1}}}}}}}}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}}}}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "x": {"docs": {"marvin_actions.getCommit": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "c": {"docs": {"marvin_actions.marvinStrip": {"tf": 1}, "marvin_actions.commitStrip": {"tf": 1}}, "df": 2, "s": {"docs": {"test_marvin_actions.ActionTest.testStrip": {"tf": 1}, "test_marvin_actions.ActionTest.testRandomStrip": {"tf": 1}}, "df": 2}}}}, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {"main": {"tf": 1.4142135623730951}, "main.mergeOptionsWithConfigFile": {"tf": 1}, "test_main.ConfigMergeTest": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameter": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameterOverwrites": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameterMerges": {"tf": 1}, "test_main.ConfigParseTest": {"tf": 1}, "test_main.ConfigParseTest.testOverrideWithFile": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceConfigFirst": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceParameterFirst": {"tf": 1}, "test_main.ConfigParseTest.testBannedParameters": {"tf": 1}}, "df": 11, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"bot.Bot.getConfig": {"tf": 1}, "bot.Bot.setConfig": {"tf": 1}, "main": {"tf": 1}, "marvin_actions.setConfig": {"tf": 1}, "marvin_general_actions.setConfig": {"tf": 1}}, "df": 5}}}}}, "e": {"docs": {"main": {"tf": 1}}, "df": 1}}}, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"main": {"tf": 1}}, "df": 1}}}}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"irc_bot.IrcBot.connectToServer": {"tf": 1}}, "df": 1, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"discord_bot": {"tf": 1}, "irc_bot": {"tf": 1}}, "df": 2}}}}}}}, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"test_main.ConfigMergeTest.testAddSingleParameterOverwrites": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameterMerges": {"tf": 1}}, "df": 2}}}}}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"test_main.ConfigParseTest.testOverridePrecedenceConfigFirst": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceParameterFirst": {"tf": 1}}, "df": 2}}}}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {"test_main.FormattingTest.assertPrintOption": {"tf": 1}, "test_marvin_actions.ActionTest.testSource": {"tf": 1}}, "df": 2, "d": {"docs": {"test_main.ConfigParseTest.testOverrideHardcodedParameters": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"bot": {"tf": 1}, "bot.Bot": {"tf": 1}, "test_marvin_actions.ActionTest.setUpClass": {"tf": 1.4142135623730951}}, "df": 3}}}, "i": {"docs": {"main": {"tf": 1.4142135623730951}}, "df": 1}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"bot.Bot.getConfig": {"tf": 1}, "bot.Bot.setConfig": {"tf": 1}, "marvin_actions.marvinNameday": {"tf": 1}}, "df": 3}}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"discord_bot": {"tf": 1}, "irc_bot": {"tf": 1}}, "df": 2}}}}}, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {"discord_bot.DiscordBot.checkMarvinActions": {"tf": 1}, "irc_bot.IrcBot.checkIrcActions": {"tf": 1}, "irc_bot.IrcBot.checkMarvinActions": {"tf": 1}, "main": {"tf": 1.7320508075688772}, "marvin_actions.videoOfToday": {"tf": 1}, "marvin_actions.marvinSun": {"tf": 1}, "marvin_actions.marvinWeather": {"tf": 1}, "marvin_actions.marvinBirthday": {"tf": 1}, "marvin_actions.marvinNameday": {"tf": 1}}, "df": 9, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"main": {"tf": 1}}, "df": 1}}}}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"irc_bot.IrcBot.decode_irc": {"tf": 1}}, "df": 1}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"main": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {"main": {"tf": 1}}, "df": 1, "s": {"docs": {"irc_bot.IrcBot.mainLoop": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"main": {"tf": 1.7320508075688772}}, "df": 1}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {"main": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {"marvin_actions.marvinJoke": {"tf": 1}}, "df": 1, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {"marvin_actions.getJoke": {"tf": 1}}, "df": 1}}}}}}}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {"irc_bot.IrcBot.decode_irc": {"tf": 1}, "main": {"tf": 1.4142135623730951}, "test_main.ConfigParseTest.testOverrideHardcodedParameters": {"tf": 1}, "test_main.ConfigParseTest.testOverrideMultipleParameters": {"tf": 1}, "test_main.ConfigParseTest.testOverrideWithFile": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateIRCBot": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateDiscordBot": {"tf": 1}, "test_marvin_actions.ActionTest.testSmile": {"tf": 1}, "test_marvin_actions.ActionTest.testGoogle": {"tf": 1}, "test_marvin_actions.ActionTest.testExplainShell": {"tf": 1}, "test_marvin_actions.ActionTest.testQuote": {"tf": 1}, "test_marvin_actions.ActionTest.testVideoOfToday": {"tf": 1}, "test_marvin_actions.ActionTest.testHelp": {"tf": 1}, "test_marvin_actions.ActionTest.testStats": {"tf": 1}, "test_marvin_actions.ActionTest.testIRCLog": {"tf": 1}, "test_marvin_actions.ActionTest.testLunchLocations": {"tf": 1}, "test_marvin_actions.ActionTest.testStrip": {"tf": 1}, "test_marvin_actions.ActionTest.testRandomStrip": {"tf": 1}, "test_marvin_actions.ActionTest.testUptime": {"tf": 1}, "test_marvin_actions.ActionTest.testStream": {"tf": 1}, "test_marvin_actions.ActionTest.testPrinciple": {"tf": 1}}, "df": 21}, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"main.main": {"tf": 1}}, "df": 1}}}, "l": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.marvinTimeToBBQ": {"tf": 1}}, "df": 1}}}, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.nextBBQ": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {"test_marvin_actions.ActionTest.assertActionOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionSilent": {"tf": 1}, "test_marvin_actions.ActionTest.assertStringsOutput": {"tf": 1}}, "df": 3}}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"test_main.FormattingTest": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"test_main.FormattingTest.assertPrintOption": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testLunchLocations": {"tf": 1}}, "df": 2}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"test_main.TestBotFactoryMethod.testCreateUnsupportedProtocolThrows": {"tf": 1}}, "df": 1, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"test_main.TestBotFactoryMethod": {"tf": 1}}, "df": 1}}}, "d": {"docs": {"test_main.TestBotFactoryMethod.testCreateIRCBot": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateDiscordBot": {"tf": 1}}, "df": 2}}}}}}}, "b": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"bot": {"tf": 1}, "bot.Bot": {"tf": 1}}, "df": 2}}, "r": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.marvinTimeToBBQ": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "t": {"docs": {"discord_bot": {"tf": 1}, "discord_bot.DiscordBot": {"tf": 1}, "discord_bot.DiscordBot.begin": {"tf": 1}, "irc_bot": {"tf": 1}, "irc_bot.IrcBot": {"tf": 1}, "irc_bot.IrcBot.decode_irc": {"tf": 1}, "irc_bot.IrcBot.begin": {"tf": 1}, "main": {"tf": 1}, "main.createBot": {"tf": 1}, "test_main.TestArgumentParsing": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineDiscordProtocol": {"tf": 1.4142135623730951}, "test_main.TestArgumentParsing.testDetermineIRCProtocol": {"tf": 1.4142135623730951}, "test_main.TestBotFactoryMethod.testCreateIRCBot": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateDiscordBot": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateUnsupportedProtocolThrows": {"tf": 1}}, "df": 15, "s": {"docs": {"bot": {"tf": 1}, "test_main.TestBotFactoryMethod": {"tf": 1}}, "df": 2}}}, "e": {"docs": {"main": {"tf": 1}, "test_main.ConfigParseTest.testOverrideHardcodedParameters": {"tf": 1}, "test_main.ConfigParseTest.testOverrideMultipleParameters": {"tf": 1}, "test_main.ConfigParseTest.testOverrideWithFile": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceConfigFirst": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceParameterFirst": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateIRCBot": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateDiscordBot": {"tf": 1}}, "df": 8, "t": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"bot.Bot": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "p": {"4": {"docs": {"main": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}}}}}}}}}}}, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.setUpClass": {"tf": 1}}, "df": 1}}}}}, "y": {"docs": {"main": {"tf": 1}}, "df": 1}, "s": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"main": {"tf": 1.4142135623730951}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {"main": {"tf": 1}}, "df": 1}, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {"marvin_actions.marvinBudord": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"marvin_actions.marvinBirthday": {"tf": 1}}, "df": 1}}}}}}}, "b": {"docs": {}, "df": 0, "q": {"docs": {"test_marvin_actions.ActionTest.assertBBQResponse": {"tf": 1}, "test_marvin_actions.ActionTest.testTimeToBBQ": {"tf": 1}}, "df": 2}}}, "a": {"docs": {"bot.Bot.tokenize": {"tf": 1}, "irc_bot": {"tf": 1}, "irc_bot.IrcBot.sendPrivMsg": {"tf": 1}, "irc_bot.IrcBot.decode_irc": {"tf": 1}, "irc_bot.IrcBot.readincoming": {"tf": 1}, "main": {"tf": 2.23606797749979}, "main.parseOptions": {"tf": 1}, "main.createBot": {"tf": 1}, "marvin_actions.getString": {"tf": 1}, "marvin_actions.marvinExplainShell": {"tf": 1}, "marvin_actions.marvinQuote": {"tf": 1}, "marvin_actions.videoOfToday": {"tf": 1.7320508075688772}, "marvin_actions.marvinHelp": {"tf": 1}, "marvin_actions.marvinStats": {"tf": 1}, "marvin_actions.marvinIrcLog": {"tf": 1}, "marvin_actions.marvinSayHi": {"tf": 1}, "marvin_actions.marvinStrip": {"tf": 1}, "marvin_actions.marvinTimeToBBQ": {"tf": 1}, "marvin_actions.thirdFridayIn": {"tf": 1}, "marvin_actions.marvinJoke": {"tf": 1}, "marvin_actions.marvinCommit": {"tf": 1}, "marvin_general_actions.getString": {"tf": 1}, "test_main.ConfigMergeTest": {"tf": 1.4142135623730951}, "test_main.ConfigMergeTest.testAddSingleParameter": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameterOverwrites": {"tf": 1.4142135623730951}, "test_main.ConfigMergeTest.testAddSingleParameterMerges": {"tf": 1.7320508075688772}, "test_main.ConfigParseTest": {"tf": 1}, "test_main.FormattingTest.assertPrintOption": {"tf": 1.4142135623730951}, "test_main.FormattingTest.testHelpPrintout": {"tf": 1}, "test_main.FormattingTest.testHelpPrintoutShort": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineDiscordProtocol": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateDiscordBot": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateUnsupportedProtocolThrows": {"tf": 1}, "test_marvin_actions.ActionTest.executeAction": {"tf": 1}, "test_marvin_actions.ActionTest.assertBBQResponse": {"tf": 1}, "test_marvin_actions.ActionTest.assertJokeOutput": {"tf": 1}, "test_marvin_actions.ActionTest.testVideoOfToday": {"tf": 1}, "test_marvin_actions.ActionTest.testHelp": {"tf": 1}, "test_marvin_actions.ActionTest.testStats": {"tf": 1}, "test_marvin_actions.ActionTest.testIRCLog": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testJokeRequest": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testJoke": {"tf": 1}}, "df": 43, "l": {"docs": {}, "df": 0, "l": {"docs": {"bot": {"tf": 1}, "irc_bot.IrcBot.readincoming": {"tf": 1}, "marvin_actions.getAllActions": {"tf": 1}, "marvin_actions.wordsAfterKeyWords": {"tf": 1}, "marvin_general_actions.getAllGeneralActions": {"tf": 1}, "test_main.ConfigParseTest.testOverrideHardcodedParameters": {"tf": 1}, "test_marvin_actions": {"tf": 1}, "test_marvin_actions.ActionTest.testBudord": {"tf": 1}}, "df": 8, "o": {"docs": {}, "df": 0, "w": {"docs": {"test_main.ConfigParseTest.testBannedParameters": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "y": {"docs": {"test_main.ConfigMergeTest.testAddSingleParameterOverwrites": {"tf": 1}}, "df": 1}}}}}}, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"irc_bot.IrcBot.checkIrcActions": {"tf": 1}, "marvin_actions": {"tf": 1}, "marvin_general_actions": {"tf": 1}, "test_marvin_actions.ActionTest.executeAction": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionSilent": {"tf": 1}, "test_marvin_actions.ActionTest.assertStringsOutput": {"tf": 1}}, "df": 7, "s": {"docs": {"bot.Bot.registerActions": {"tf": 1}, "bot.Bot.registerGeneralActions": {"tf": 1}, "discord_bot": {"tf": 1}, "discord_bot.DiscordBot.checkMarvinActions": {"tf": 1}, "irc_bot": {"tf": 1}, "irc_bot.IrcBot.checkMarvinActions": {"tf": 1}, "main": {"tf": 1.7320508075688772}, "marvin_actions": {"tf": 1}, "marvin_actions.getAllActions": {"tf": 1}, "marvin_general_actions": {"tf": 1}, "marvin_general_actions.getAllGeneralActions": {"tf": 1}, "test_marvin_actions": {"tf": 1}, "test_marvin_actions.ActionTest": {"tf": 1}}, "df": 13}}}}}}, "n": {"docs": {"main": {"tf": 1}, "main.createBot": {"tf": 1}, "marvin_actions.getAllActions": {"tf": 1}, "marvin_actions.wordsAfterKeyWords": {"tf": 1}, "marvin_actions.marvinGoogle": {"tf": 1}, "marvin_actions.marvinExplainShell": {"tf": 1}, "marvin_general_actions.getAllGeneralActions": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameter": {"tf": 1}, "test_main.FormattingTest.testUnhandledOption": {"tf": 1}, "test_main.FormattingTest.testUnhandledArgument": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineIRCProtocol": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateIRCBot": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateUnsupportedProtocolThrows": {"tf": 1}, "test_marvin_actions.ActionTest.executeAction": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionSilent": {"tf": 1}, "test_marvin_actions.ActionTest.assertStringsOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertNameDayOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertJokeOutput": {"tf": 1}}, "df": 19, "d": {"docs": {"discord_bot": {"tf": 1.4142135623730951}, "irc_bot": {"tf": 1.7320508075688772}, "irc_bot.IrcBot.sendPrivMsg": {"tf": 1}, "irc_bot.IrcBot.sendMsg": {"tf": 1}, "irc_bot.IrcBot.decode_irc": {"tf": 1}, "irc_bot.IrcBot.receive": {"tf": 1}, "irc_bot.IrcBot.ircLogAppend": {"tf": 1}, "irc_bot.IrcBot.readincoming": {"tf": 1}, "irc_bot.IrcBot.mainLoop": {"tf": 1}, "main": {"tf": 2}, "main.printVersion": {"tf": 1}, "main.parseOptions": {"tf": 1.4142135623730951}, "marvin_actions.videoOfToday": {"tf": 1}, "marvin_actions.marvinSun": {"tf": 1}, "marvin_actions.marvinTimeToBBQ": {"tf": 1}, "marvin_actions.thirdFridayIn": {"tf": 1}, "test_main.ConfigMergeTest.assertMergedConfig": {"tf": 1}, "test_main.ConfigParseTest.testBannedParameters": {"tf": 1}, "test_main.FormattingTest.assertPrintOption": {"tf": 1}, "test_marvin_actions.ActionTest.executeAction": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionSilent": {"tf": 1}, "test_marvin_actions.ActionTest.assertStringsOutput": {"tf": 1}}, "df": 23}, "y": {"docs": {"discord_bot.DiscordBot.checkMarvinActions": {"tf": 1}, "irc_bot.IrcBot.checkIrcActions": {"tf": 1}, "irc_bot.IrcBot.checkMarvinActions": {"tf": 1}, "test_main.FormattingTest.testUnhandledArgument": {"tf": 1}}, "df": 4}, "s": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"irc_bot.IrcBot.mainLoop": {"tf": 1}}, "df": 1, "s": {"docs": {"main": {"tf": 1}}, "df": 1}}}}}}, "s": {"docs": {"irc_bot.IrcBot.decode_irc": {"tf": 1}, "irc_bot.IrcBot.readincoming": {"tf": 1}, "main.parseOptions": {"tf": 1}, "marvin_actions.marvinPrinciple": {"tf": 1}, "marvin_general_actions.getAllGeneralActions": {"tf": 1}, "test_main.ConfigParseTest.testBannedParameters": {"tf": 1.4142135623730951}, "test_main.TestArgumentParsing": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineDiscordProtocol": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineIRCProtocol": {"tf": 1}}, "df": 9, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"test_main.ConfigMergeTest.assertMergedConfig": {"tf": 1}, "test_main.FormattingTest.assertPrintOption": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionSilent": {"tf": 1}, "test_marvin_actions.ActionTest.assertStringsOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertBBQResponse": {"tf": 1}, "test_marvin_actions.ActionTest.assertNameDayOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertJokeOutput": {"tf": 1}}, "df": 8}}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"test_marvin_actions.ActionTest.testNameDayReaction": {"tf": 1}}, "df": 1}}}}, "d": {"docs": {}, "df": 0, "d": {"docs": {"test_main.ConfigMergeTest.testAddSingleParameter": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameterOverwrites": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameterMerges": {"tf": 1}}, "df": 3, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"main": {"tf": 1}}, "df": 1}}}}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"main": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {"main": {"tf": 1}, "marvin_actions.marvinBudord": {"tf": 1}, "test_main.ConfigParseTest.testBannedParameters": {"tf": 1}}, "df": 3}, "g": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"main.determineProtocol": {"tf": 1}, "test_main.FormattingTest.testUnhandledArgument": {"tf": 1}, "test_main.TestArgumentParsing": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineDiscordProtocol": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineIRCProtocol": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineIRCProtocolisDefault": {"tf": 1}}, "df": 6, "s": {"docs": {"main.parseOptions": {"tf": 1}}, "df": 1}}}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"marvin_actions.getAllActions": {"tf": 1}, "marvin_general_actions.getAllGeneralActions": {"tf": 1}}, "df": 2}}}}, "f": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"marvin_actions.wordsAfterKeyWords": {"tf": 1}, "marvin_actions.nextBBQ": {"tf": 1}, "marvin_general_actions.marvinMorning": {"tf": 1}}, "df": 3}}}}, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"marvin_actions.marvinSource": {"tf": 1}, "marvin_actions.marvinUptime": {"tf": 1}, "marvin_actions.marvinStream": {"tf": 1}, "test_marvin_actions.ActionTest.testSource": {"tf": 1}}, "df": 4}}}}, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.marvinTimeToBBQ": {"tf": 1}}, "df": 1}}}}}}}}}, "i": {"docs": {"marvin_actions.getJoke": {"tf": 1}}, "df": 1}}, "t": {"docs": {"test_marvin_actions.ActionTest.testMorning": {"tf": 1}}, "df": 1}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"bot.Bot": {"tf": 1}, "main": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameterMerges": {"tf": 1}, "test_marvin_actions.ActionTest.testVideoOfToday": {"tf": 1}}, "df": 4}}}}}}}, "s": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {"discord_bot": {"tf": 1}, "discord_bot.DiscordBot": {"tf": 1}, "test_main.TestArgumentParsing": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineDiscordProtocol": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateDiscordBot": {"tf": 1}}, "df": 5}}}}, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"marvin_actions.marvinUptime": {"tf": 1}, "marvin_actions.marvinStream": {"tf": 1}, "marvin_actions.marvinPrinciple": {"tf": 1}, "marvin_actions.marvinJoke": {"tf": 1}, "marvin_actions.marvinCommit": {"tf": 1}}, "df": 5}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"irc_bot.IrcBot.readincoming": {"tf": 1.4142135623730951}, "main": {"tf": 1.7320508075688772}}, "df": 2}}}}}}}, "c": {"docs": {}, "df": 0, "t": {"docs": {"test_main.ConfigMergeTest": {"tf": 1}, "test_main.ConfigMergeTest.assertMergedConfig": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"main.parseOptions": {"tf": 1}}, "df": 1}}}}}}}}}, "o": {"docs": {"irc_bot.IrcBot.decode_irc": {"tf": 1}}, "df": 1, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"discord_bot": {"tf": 1}, "irc_bot": {"tf": 1}}, "df": 2}}}, "n": {"docs": {"test_main.ConfigParseTest.testBannedParameters": {"tf": 1}}, "df": 1, "e": {"docs": {"irc_bot.IrcBot.readincoming": {"tf": 1}}, "df": 1}}, "w": {"docs": {}, "df": 0, "n": {"docs": {"marvin_actions.marvinSun": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"irc_bot.IrcBot.decode_irc": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"main.determineProtocol": {"tf": 1}, "test_main.TestArgumentParsing": {"tf": 1}}, "df": 2, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {"test_main.TestArgumentParsing.testDetermineConfigThrowsOnInvalidProto": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"irc_bot.IrcBot.checkIrcActions": {"tf": 1}, "main": {"tf": 1}}, "df": 2}}}}, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"main": {"tf": 1.4142135623730951}, "main.parseOptions": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceConfigFirst": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceParameterFirst": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineIRCProtocolisDefault": {"tf": 1}}, "df": 5}}}}}, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.marvinLunch": {"tf": 1}}, "df": 1}}}}, "v": {"docs": {"marvin_actions.getJoke": {"tf": 1}}, "df": 1}}, "b": {"docs": {"main": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.assertStringsOutput": {"tf": 1}}, "df": 2}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.getString": {"tf": 1}, "marvin_general_actions.getString": {"tf": 1}}, "df": 2}}}}}, "e": {"docs": {"marvin_actions.nextBBQ": {"tf": 1}, "test_marvin_actions.ActionTest.assertBBQResponse": {"tf": 1}}, "df": 2}}, "y": {"docs": {"marvin_actions.videoOfToday": {"tf": 1}, "test_marvin_actions.ActionTest.testVideoOfToday": {"tf": 1}, "test_marvin_actions.ActionTest.testMorning": {"tf": 1}}, "df": 3}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {"discord_bot.DiscordBot": {"tf": 1}, "irc_bot.IrcBot": {"tf": 1}, "irc_bot.IrcBot.checkIrcActions": {"tf": 1}, "main.determineProtocol": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateUnsupportedProtocolThrows": {"tf": 1}}, "df": 5, "s": {"docs": {"bot.Bot": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineConfigThrowsOnInvalidProto": {"tf": 1}}, "df": 2}}}}}}, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"main": {"tf": 1}}, "df": 1}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {"marvin_actions.marvinWeather": {"tf": 1}}, "df": 1}}}}}}, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.videoOfToday": {"tf": 1}, "marvin_actions.marvinHelp": {"tf": 1}, "marvin_actions.marvinStats": {"tf": 1}, "marvin_actions.marvinIrcLog": {"tf": 1}, "marvin_actions.marvinPrinciple": {"tf": 1}, "test_marvin_actions.ActionTest.testHelp": {"tf": 1}, "test_marvin_actions.ActionTest.testStats": {"tf": 1}, "test_marvin_actions.ActionTest.testIRCLog": {"tf": 1}, "test_marvin_actions.ActionTest.testLunchLocations": {"tf": 1}, "test_marvin_actions.ActionTest.testUptime": {"tf": 1}, "test_marvin_actions.ActionTest.testStream": {"tf": 1}}, "df": 11, "d": {"docs": {"test_main.FormattingTest.testVersionPrintout": {"tf": 1}, "test_main.FormattingTest.testVersionPrintoutShort": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionSilent": {"tf": 1}, "test_marvin_actions.ActionTest.assertStringsOutput": {"tf": 1}}, "df": 4}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"test_main.FormattingTest.testHelpPrintout": {"tf": 1}, "test_main.FormattingTest.testHelpPrintoutShort": {"tf": 1}}, "df": 2}}}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"test_main.ConfigParseTest.testOverridePrecedenceConfigFirst": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceParameterFirst": {"tf": 1}, "test_marvin_actions.ActionTest.assertBBQResponse": {"tf": 1}, "test_marvin_actions.ActionTest.assertNameDayOutput": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testJokeRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testCommitRequest": {"tf": 1}}, "df": 7, "l": {"docs": {}, "df": 0, "y": {"docs": {"test_marvin_actions.ActionTest.testNameDayResponse": {"tf": 1}, "test_marvin_actions.ActionTest.testCommitResponse": {"tf": 1}}, "df": 2}}}}}}, "i": {"docs": {}, "df": 0, "v": {"docs": {"irc_bot.IrcBot.sendPrivMsg": {"tf": 1}}, "df": 1}, "n": {"docs": {}, "df": 0, "t": {"docs": {"irc_bot.IrcBot.sendMsg": {"tf": 1}, "main.printVersion": {"tf": 1}, "marvin_actions.marvinTimeToBBQ": {"tf": 1}}, "df": 3, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"test_main.FormattingTest": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {"test_main.FormattingTest.assertPrintOption": {"tf": 1}}, "df": 1}, "e": {"docs": {}, "df": 0, "d": {"docs": {"test_main.FormattingTest.testHelpPrintout": {"tf": 1}, "test_main.FormattingTest.testHelpPrintoutShort": {"tf": 1}, "test_main.FormattingTest.testVersionPrintout": {"tf": 1}, "test_main.FormattingTest.testVersionPrintoutShort": {"tf": 1}}, "df": 4}}}, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.marvinPrinciple": {"tf": 1}}, "df": 1, "s": {"docs": {"test_marvin_actions.ActionTest.testPrinciple": {"tf": 1}}, "df": 1}}}}}}}}, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"irc_bot.IrcBot.decode_irc": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"marvin_actions.marvinGoogle": {"tf": 1}, "marvin_actions.marvinExplainShell": {"tf": 1}}, "df": 2}}}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"test_main.ConfigParseTest.testOverridePrecedenceConfigFirst": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceParameterFirst": {"tf": 1}}, "df": 2}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"test_main.FormattingTest.setUpClass": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {"test_marvin_actions.ActionTest.testMorning": {"tf": 1}}, "df": 1, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {"discord_bot.DiscordBot.checkMarvinActions": {"tf": 1}, "irc_bot.IrcBot.checkMarvinActions": {"tf": 1}}, "df": 2}}}}}}, "h": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "b": {"docs": {"main": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "p": {"3": {"docs": {"main": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}}, "y": {"docs": {"main": {"tf": 1.7320508075688772}}, "df": 1, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"3": {"docs": {"main": {"tf": 1.4142135623730951}}, "df": 1}, "docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"main": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"main": {"tf": 1}}, "df": 1}}, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"test_main.TestArgumentParsing.testDetermineDiscordProtocol": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineIRCProtocol": {"tf": 1}}, "df": 2}}}}}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"main.determineProtocol": {"tf": 1}}, "df": 1, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"test_main.FormattingTest.assertPrintOption": {"tf": 1}}, "df": 1}}}}}}}, "s": {"docs": {"test_marvin_actions.ActionTest.testNameDayResponse": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"test_main.ConfigParseTest": {"tf": 1}, "test_main.TestArgumentParsing": {"tf": 1}}, "df": 2}}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"test_main.ConfigMergeTest.testAddSingleParameter": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameterOverwrites": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameterMerges": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceConfigFirst": {"tf": 1.4142135623730951}, "test_main.ConfigParseTest.testOverridePrecedenceParameterFirst": {"tf": 1.4142135623730951}}, "df": 5, "s": {"docs": {"test_main.ConfigParseTest.testOverrideHardcodedParameters": {"tf": 1}, "test_main.ConfigParseTest.testOverrideMultipleParameters": {"tf": 1}, "test_main.ConfigParseTest.testOverrideWithFile": {"tf": 1}, "test_main.ConfigParseTest.testBannedParameters": {"tf": 1}, "test_main.FormattingTest": {"tf": 1}}, "df": 5}}}}}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.testStats": {"tf": 1}}, "df": 1}}}, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"test_marvin_actions.ActionTest.testLunchLocations": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {"bot.Bot.getConfig": {"tf": 1}, "main.parseOptions": {"tf": 1}, "main.createBot": {"tf": 1}, "marvin_actions.getAllActions": {"tf": 1}, "marvin_actions.wordsAfterKeyWords": {"tf": 1}, "marvin_actions.marvinListen": {"tf": 1}, "marvin_general_actions.getAllGeneralActions": {"tf": 1}, "test_marvin_actions.ActionTest.executeAction": {"tf": 1}}, "df": 8, "s": {"docs": {"test_main.FormattingTest.assertPrintOption": {"tf": 1}, "test_main.TestBotFactoryMethod": {"tf": 1}}, "df": 2}, "e": {"docs": {}, "df": 0, "d": {"docs": {"test_marvin_actions.ActionTest.assertBBQResponse": {"tf": 1}, "test_marvin_actions.ActionTest.assertNameDayOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertJokeOutput": {"tf": 1}}, "df": 3}}}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"marvin_actions.getJoke": {"tf": 1}, "marvin_actions.getCommit": {"tf": 1}}, "df": 2}}}}}}}, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"bot.Bot.registerActions": {"tf": 1}, "bot.Bot.registerGeneralActions": {"tf": 1}}, "df": 2}}}}}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"discord_bot": {"tf": 1}, "irc_bot": {"tf": 1}}, "df": 2}}}}}}, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"test_marvin_actions.ActionTest.testStrip": {"tf": 1}, "test_marvin_actions.ActionTest.testRandomStrip": {"tf": 1}}, "df": 2}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.testPrinciple": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "d": {"docs": {"irc_bot.IrcBot.receive": {"tf": 1}, "irc_bot.IrcBot.ircLogAppend": {"tf": 1}, "irc_bot.IrcBot.readincoming": {"tf": 1}, "main": {"tf": 1}, "main.mergeOptionsWithConfigFile": {"tf": 1}}, "df": 5, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"irc_bot": {"tf": 1}}, "df": 1}}}, "s": {"docs": {"main": {"tf": 1}}, "df": 1}}}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"test_marvin_actions.ActionTest.testNameDayRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testJokeRequest": {"tf": 1}}, "df": 2, "e": {"docs": {}, "df": 0, "d": {"docs": {"main.createBot": {"tf": 1}, "test_marvin_actions.ActionTest.testJoke": {"tf": 1}}, "df": 2}}, "s": {"docs": {"test_marvin_actions.ActionTest.testCommitRequest": {"tf": 1}}, "df": 1}}}}}}, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.setConfig": {"tf": 1}, "marvin_general_actions.setConfig": {"tf": 1}}, "df": 2}}}}}}}, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"test_main.ConfigMergeTest.assertMergedConfig": {"tf": 1}}, "df": 1}}}, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.executeAction": {"tf": 1}}, "df": 1, "s": {"docs": {"test_marvin_actions.ActionTest.testNameDayResponse": {"tf": 1}, "test_marvin_actions.ActionTest.testCommitResponse": {"tf": 1}}, "df": 2}}}, "d": {"docs": {}, "df": 0, "s": {"docs": {"test_marvin_actions.ActionTest.testWhois": {"tf": 1}, "test_marvin_actions.ActionTest.testSource": {"tf": 1}, "test_marvin_actions.ActionTest.testSayHi": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayReaction": {"tf": 1}}, "df": 4}}}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {"discord_bot.DiscordBot.on_message": {"tf": 1}}, "df": 1, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"test_marvin_actions.ActionTest.setUpClass": {"tf": 1}}, "df": 1}}}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"main": {"tf": 1}, "marvin_actions.commitStrip": {"tf": 1}, "marvin_actions.marvinPrinciple": {"tf": 1}, "marvin_actions.marvinJoke": {"tf": 1}, "marvin_actions.getCommit": {"tf": 1}, "marvin_actions.marvinCommit": {"tf": 1}, "test_marvin_actions.ActionTest.testRandomStrip": {"tf": 1}}, "df": 7}}}}}, "s": {"docs": {}, "df": 0, "s": {"docs": {"main": {"tf": 1}}, "df": 1}}}, "s": {"docs": {"test_main.TestArgumentParsing.testDetermineDiscordProtocol": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineIRCProtocol": {"tf": 1}}, "df": 2, "e": {"docs": {"main": {"tf": 1.4142135623730951}}, "df": 1, "t": {"docs": {"bot.Bot.setConfig": {"tf": 1}, "test_main.FormattingTest.setUpClass": {"tf": 1}}, "df": 2, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"test_marvin_actions.ActionTest.setUpClass": {"tf": 1}}, "df": 1}}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {"irc_bot.IrcBot.sendPrivMsg": {"tf": 1}, "irc_bot.IrcBot.sendMsg": {"tf": 1}, "irc_bot.IrcBot.decode_irc": {"tf": 1}, "irc_bot.IrcBot.readincoming": {"tf": 1}}, "df": 4, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"discord_bot": {"tf": 1}, "irc_bot": {"tf": 1}}, "df": 2}}}, "s": {"docs": {"test_marvin_actions.ActionTest.testNameDayRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testJokeRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testJoke": {"tf": 1}, "test_marvin_actions.ActionTest.testCommitRequest": {"tf": 1}}, "df": 4}}, "t": {"docs": {"irc_bot.IrcBot.sendMsg": {"tf": 1}}, "df": 1}}, "r": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"irc_bot.IrcBot.connectToServer": {"tf": 1}, "main": {"tf": 1.4142135623730951}}, "df": 2}}, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.marvinExplainShell": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"main": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {"main": {"tf": 1}}, "df": 1}, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"marvin_actions.marvinPrinciple": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"bot.Bot.tokenize": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"test_main.ConfigParseTest.testBannedParameters": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"discord_bot.DiscordBot.begin": {"tf": 1}, "irc_bot.IrcBot.begin": {"tf": 1}, "main": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineDiscordProtocol": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineIRCProtocol": {"tf": 1}}, "df": 5}}, "t": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.marvinSource": {"tf": 1}}, "df": 1}, "s": {"docs": {"marvin_actions.marvinStats": {"tf": 1}, "test_marvin_actions.ActionTest.testStats": {"tf": 1}}, "df": 2}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"marvin_actions.getString": {"tf": 1.4142135623730951}, "marvin_general_actions.getString": {"tf": 1.4142135623730951}}, "df": 2, "s": {"docs": {"main": {"tf": 1.4142135623730951}}, "df": 1}}}, "p": {"docs": {"marvin_actions.marvinStrip": {"tf": 1}, "marvin_actions.commitStrip": {"tf": 1}}, "df": 2}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"marvin_actions.marvinStream": {"tf": 1}, "test_marvin_actions.ActionTest.testStream": {"tf": 1}}, "df": 2}}}}, "u": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "f": {"docs": {"test_marvin_actions.ActionTest.testGoogle": {"tf": 1}}, "df": 1}}}}, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"discord_bot.DiscordBot.checkMarvinActions": {"tf": 1}, "irc_bot.IrcBot.checkIrcActions": {"tf": 1}, "irc_bot.IrcBot.checkMarvinActions": {"tf": 1}, "test_main.ConfigMergeTest.testEmpty": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceConfigFirst": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceParameterFirst": {"tf": 1}}, "df": 6}}}, "w": {"docs": {"marvin_actions.marvinVideoOfToday": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"marvin_actions.marvinExplainShell": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testExplainShell": {"tf": 1}}, "df": 2}}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"main": {"tf": 1}, "test_main.FormattingTest.setUpClass": {"tf": 1}}, "df": 2}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.marvinSmile": {"tf": 1}, "test_marvin_actions.ActionTest.testSmile": {"tf": 1}}, "df": 2}}}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.testSource": {"tf": 1}}, "df": 1, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.marvinSource": {"tf": 1}}, "df": 1}}}}}}}}, "f": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.marvinPrinciple": {"tf": 1}, "test_marvin_actions.ActionTest.testPrinciple": {"tf": 1}}, "df": 2}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.testPrinciple": {"tf": 1}}, "df": 1, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"marvin_general_actions.marvinMorning": {"tf": 1}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.videoOfToday": {"tf": 1}}, "df": 1}}}}}}, "n": {"docs": {"marvin_actions.marvinSun": {"tf": 1}}, "df": 1}, "g": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"test_marvin_actions.ActionTest.testLunchLocations": {"tf": 1}}, "df": 1}}}}}}}}}}, "a": {"docs": {}, "df": 0, "y": {"docs": {"marvin_actions.marvinSayHi": {"tf": 1}}, "df": 1, "s": {"docs": {"marvin_general_actions.marvinMorning": {"tf": 1.4142135623730951}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"test_main.ConfigMergeTest.testAddSingleParameter": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameterOverwrites": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameterMerges": {"tf": 1}}, "df": 3}}}}, "g": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"test_main.ConfigParseTest.testOverridePrecedenceConfigFirst": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceParameterFirst": {"tf": 1}}, "df": 2}}}}}}}}}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"bot.Bot.registerActions": {"tf": 1}, "bot.Bot.registerGeneralActions": {"tf": 1}, "main": {"tf": 1}, "main.determineProtocol": {"tf": 1}}, "df": 4}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"main": {"tf": 1.7320508075688772}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "l": {"docs": {"marvin_actions.marvinGoogle": {"tf": 1}, "marvin_actions.marvinExplainShell": {"tf": 1}, "marvin_actions.videoOfToday": {"tf": 1}}, "df": 3}}, "p": {"docs": {"marvin_actions.marvinSun": {"tf": 1}, "test_marvin_actions.ActionTest.setUpClass": {"tf": 1}}, "df": 2, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.marvinUptime": {"tf": 1}, "test_marvin_actions.ActionTest.testUptime": {"tf": 1}}, "df": 2}}}}}, "n": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "n": {"docs": {"test_main.FormattingTest.testUnhandledOption": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"test_main.TestArgumentParsing.testDetermineConfigThrowsOnInvalidProto": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateUnsupportedProtocolThrows": {"tf": 1}}, "df": 2}}}}}}}}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"bot.Bot.registerGeneralActions": {"tf": 1}, "marvin_general_actions": {"tf": 1}, "marvin_general_actions.getAllGeneralActions": {"tf": 1}}, "df": 3}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"test_marvin_actions.ActionTest.testCommitRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testCommitResponse": {"tf": 1}}, "df": 2}}}}}}}}, "t": {"docs": {"main": {"tf": 1}, "marvin_actions.getString": {"tf": 1}, "marvin_actions.marvinStrip": {"tf": 1}, "marvin_actions.thirdFridayIn": {"tf": 1}, "marvin_general_actions.getString": {"tf": 1}}, "df": 5}}, "u": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"irc_bot.IrcBot.receive": {"tf": 1}, "irc_bot.IrcBot.ircLogAppend": {"tf": 1}}, "df": 2}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.testQuote": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.marvinGoogle": {"tf": 1}, "test_marvin_actions.ActionTest.testGoogle": {"tf": 1}}, "df": 2}}}, "d": {"docs": {"marvin_general_actions.marvinMorning": {"tf": 1}, "test_marvin_actions.ActionTest.testMorning": {"tf": 1}}, "df": 2}}, "e": {"docs": {}, "df": 0, "s": {"docs": {"marvin_actions.marvinSun": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"marvin_actions.videoOfToday": {"tf": 1}}, "df": 1, "s": {"docs": {"test_marvin_actions.ActionTest.testSayHi": {"tf": 1}}, "df": 1}}}}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"marvin_actions.nextBBQ": {"tf": 1}}, "df": 1}}}}}}}, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"test_main.TestArgumentParsing.testDetermineDiscordProtocol": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineIRCProtocol": {"tf": 1}}, "df": 2, "n": {"docs": {"marvin_actions.thirdFridayIn": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineIRCProtocolisDefault": {"tf": 1}, "test_marvin_actions.ActionTest.assertBBQResponse": {"tf": 1}, "test_marvin_actions.ActionTest.assertNameDayOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertJokeOutput": {"tf": 1}}, "df": 5}, "s": {"docs": {"test_main.FormattingTest.testUnhandledOption": {"tf": 1}, "test_main.FormattingTest.testUnhandledArgument": {"tf": 1}}, "df": 2}}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "y": {"docs": {"test_marvin_actions.ActionTest.testQuote": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {"irc_bot.IrcBot.readincoming": {"tf": 1}, "irc_bot.IrcBot.checkIrcActions": {"tf": 1}, "main": {"tf": 2}, "marvin_actions.getAllActions": {"tf": 1}, "marvin_actions.wordsAfterKeyWords": {"tf": 1.4142135623730951}, "marvin_actions.thirdFridayIn": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceConfigFirst": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceParameterFirst": {"tf": 1}, "test_marvin_actions.ActionTest.setUpClass": {"tf": 1}}, "df": 9, "t": {"docs": {}, "df": 0, "o": {"docs": {"bot.Bot.tokenize": {"tf": 1}, "test_main.ConfigMergeTest.testEmpty": {"tf": 1}, "test_main.ConfigParseTest": {"tf": 1}}, "df": 3}, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"main": {"tf": 1}}, "df": 1}}}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"irc_bot": {"tf": 1}, "irc_bot.IrcBot.receive": {"tf": 1}, "irc_bot.IrcBot.ircLogAppend": {"tf": 1}, "irc_bot.IrcBot.readincoming": {"tf": 1}, "irc_bot.IrcBot.mainLoop": {"tf": 1}, "main": {"tf": 1.4142135623730951}, "main.parseOptions": {"tf": 1}}, "df": 7}}}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"main": {"tf": 1.7320508075688772}}, "df": 1}}, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"main.createBot": {"tf": 1}}, "df": 1, "s": {"docs": {"test_main.TestBotFactoryMethod": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {"main": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "f": {"docs": {}, "df": 0, "o": {"docs": {"marvin_actions.marvinBirthday": {"tf": 1}, "marvin_actions.marvinUptime": {"tf": 1}, "marvin_actions.marvinStream": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayRequest": {"tf": 1}}, "df": 4, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"main.printVersion": {"tf": 1}, "main.mergeOptionsWithConfigFile": {"tf": 1}}, "df": 2}}}}}}}}}, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"test_marvin_actions.ActionTest.assertJokeOutput": {"tf": 1}}, "df": 1, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.assertNameDayOutput": {"tf": 1}}, "df": 1}}}}}}}}, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"discord_bot.DiscordBot": {"tf": 1}, "irc_bot.IrcBot": {"tf": 1}}, "df": 2}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"main.createBot": {"tf": 1}}, "df": 1}}}}}}}}}}}}}, "f": {"docs": {"discord_bot.DiscordBot.checkMarvinActions": {"tf": 1}, "irc_bot.IrcBot.readincoming": {"tf": 1}, "irc_bot.IrcBot.checkIrcActions": {"tf": 1}, "irc_bot.IrcBot.checkMarvinActions": {"tf": 1}, "main": {"tf": 1.4142135623730951}, "test_main.TestArgumentParsing.testDetermineIRCProtocolisDefault": {"tf": 1}}, "df": 6}, "r": {"docs": {}, "df": 0, "c": {"docs": {"irc_bot": {"tf": 1}, "irc_bot.IrcBot": {"tf": 1}, "irc_bot.IrcBot.connectToServer": {"tf": 1}, "irc_bot.IrcBot.decode_irc": {"tf": 1}, "irc_bot.IrcBot.checkIrcActions": {"tf": 1}, "main": {"tf": 2.23606797749979}, "test_main.TestArgumentParsing": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineIRCProtocol": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineIRCProtocolisDefault": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateIRCBot": {"tf": 1}, "test_marvin_actions.ActionTest.testStats": {"tf": 1}, "test_marvin_actions.ActionTest.testIRCLog": {"tf": 1}}, "df": 12, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {"irc_bot.IrcBot.ircLogWriteToFile": {"tf": 1}, "marvin_actions.marvinIrcLog": {"tf": 1}}, "df": 2}}}}}, "s": {"docs": {"main": {"tf": 1}, "marvin_actions.videoOfToday": {"tf": 1}, "marvin_actions.marvinWhoIs": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceConfigFirst": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceParameterFirst": {"tf": 1}, "test_main.FormattingTest.testHelpPrintout": {"tf": 1}, "test_main.FormattingTest.testHelpPrintoutShort": {"tf": 1}, "test_main.FormattingTest.testVersionPrintout": {"tf": 1}, "test_main.FormattingTest.testVersionPrintoutShort": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineIRCProtocolisDefault": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.assertStringsOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertBBQResponse": {"tf": 1}, "test_marvin_actions.ActionTest.assertNameDayOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertJokeOutput": {"tf": 1}, "test_marvin_actions.ActionTest.testTimeToBBQ": {"tf": 1}}, "df": 15, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"irc_bot.IrcBot.decode_irc": {"tf": 1}}, "df": 1}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"main": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {"main": {"tf": 1.4142135623730951}, "marvin_actions.videoOfToday": {"tf": 1}, "marvin_general_actions.marvinMorning": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameterOverwrites": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceConfigFirst": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceParameterFirst": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineDiscordProtocol": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineIRCProtocol": {"tf": 1}}, "df": 8, "s": {"docs": {"main": {"tf": 1}}, "df": 1}, "e": {"docs": {}, "df": 0, "m": {"docs": {"marvin_actions.wordsAfterKeyWords": {"tf": 1}}, "df": 1, "s": {"docs": {"marvin_actions.wordsAfterKeyWords": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "j": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "?": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"marvin_actions.getJoke": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}}}}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {"test_main.TestArgumentParsing.testDetermineIRCProtocolisDefault": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionSilent": {"tf": 1}}, "df": 2, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"bot.Bot.tokenize": {"tf": 1}}, "df": 1}}}}}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {"marvin_actions.marvinJoke": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"main": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "d": {"docs": {"main": {"tf": 1}}, "df": 1}}}}, "x": {"docs": {}, "df": 0, "t": {"docs": {"marvin_actions.marvinTimeToBBQ": {"tf": 1}, "marvin_actions.nextBBQ": {"tf": 1}, "test_marvin_actions.ActionTest.testTimeToBBQ": {"tf": 1}}, "df": 3}}}, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {"main": {"tf": 1}}, "df": 1}, "e": {"docs": {"marvin_actions.marvinSayHi": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"marvin_actions.marvinNameday": {"tf": 1}, "test_marvin_actions.ActionTest.assertNameDayOutput": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayReaction": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayResponse": {"tf": 1}}, "df": 5}}}}}}}, "h": {"docs": {"test_main.FormattingTest.testHelpPrintoutShort": {"tf": 1}}, "df": 1, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "k": {"docs": {"discord_bot.DiscordBot.on_message": {"tf": 1}, "test_marvin_actions.ActionTest.setUpClass": {"tf": 1}}, "df": 2}}, "w": {"docs": {"main": {"tf": 1.4142135623730951}}, "df": 1}}, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, ":": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {"irc_bot.IrcBot.decode_irc": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}, "m": {"docs": {}, "df": 0, "l": {"docs": {"marvin_actions.getCommit": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "p": {"docs": {"main": {"tf": 1.4142135623730951}, "marvin_actions.marvinLunch": {"tf": 1}, "test_main.ConfigParseTest.testBannedParameters": {"tf": 1}, "test_main.FormattingTest.testHelpPrintout": {"tf": 1.4142135623730951}, "test_main.FormattingTest.testHelpPrintoutShort": {"tf": 1}, "test_marvin_actions.ActionTest.testGoogle": {"tf": 1}, "test_marvin_actions.ActionTest.testHelp": {"tf": 1}}, "df": 7}}}, "i": {"docs": {"marvin_actions.marvinSayHi": {"tf": 1}}, "df": 1, "t": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"test_marvin_actions.ActionTest.testQuote": {"tf": 1}}, "df": 1}}}}}}}}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {"test_main.ConfigParseTest.testOverrideHardcodedParameters": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"test_marvin_actions.ActionTest.testCommitResponse": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {"main": {"tf": 1.4142135623730951}}, "df": 1, "n": {"docs": {"discord_bot.DiscordBot.on_message": {"tf": 1}, "irc_bot.IrcBot.checkIrcActions": {"tf": 1}, "main": {"tf": 1}, "test_main.FormattingTest.setUpClass": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineConfigThrowsOnInvalidProto": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionOutput": {"tf": 1}}, "df": 6, "e": {"docs": {"marvin_actions": {"tf": 1}, "marvin_actions.marvinPrinciple": {"tf": 1.4142135623730951}, "marvin_general_actions": {"tf": 1}, "test_main.ConfigMergeTest.testAddSingleParameterMerges": {"tf": 1}}, "df": 4}, "l": {"docs": {}, "df": 0, "y": {"docs": {"test_marvin_actions.ActionTest.testNameDayReaction": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.testMorning": {"tf": 1}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"irc_bot.IrcBot.sendMsg": {"tf": 1}}, "df": 1}}}}}}}}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.wordsAfterKeyWords": {"tf": 1}}, "df": 1}}}}}}}}, "f": {"docs": {"main": {"tf": 1.7320508075688772}, "main.createBot": {"tf": 1}, "marvin_actions.wordsAfterKeyWords": {"tf": 1}, "marvin_actions.marvinVideoOfToday": {"tf": 1}, "test_main.TestBotFactoryMethod": {"tf": 1}, "test_marvin_actions.ActionTest.testVideoOfToday": {"tf": 1}}, "df": 6}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"test_main.ConfigParseTest.testOverrideWithFile": {"tf": 1}}, "df": 1, "s": {"docs": {"main": {"tf": 1.7320508075688772}, "main.parseOptions": {"tf": 1.4142135623730951}, "test_main.ConfigParseTest": {"tf": 1}, "test_main.ConfigParseTest.testBannedParameters": {"tf": 1}, "test_main.FormattingTest.testUnhandledOption": {"tf": 1}}, "df": 5}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {"main": {"tf": 1.7320508075688772}, "main.main": {"tf": 1}}, "df": 2, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"test_main.FormattingTest.assertPrintOption": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionOutput": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionSilent": {"tf": 1}, "test_marvin_actions.ActionTest.assertStringsOutput": {"tf": 1}}, "df": 4}}}}}, "w": {"docs": {}, "df": 0, "n": {"docs": {"main": {"tf": 1.4142135623730951}}, "df": 1}}, "r": {"docs": {"marvin_actions.commitStrip": {"tf": 1}, "marvin_actions.marvinPrinciple": {"tf": 1}, "test_main.TestArgumentParsing": {"tf": 1}}, "df": 3}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"test_main.ConfigParseTest.testOverrideHardcodedParameters": {"tf": 1}, "test_main.ConfigParseTest.testOverrideMultipleParameters": {"tf": 1}, "test_main.ConfigParseTest.testOverrideWithFile": {"tf": 1}}, "df": 3}}}}}}}}}}, "e": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"irc_bot.IrcBot.mainLoop": {"tf": 1}}, "df": 1, "y": {"docs": {"discord_bot.DiscordBot.on_message": {"tf": 1}}, "df": 1}}}}, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"irc_bot.IrcBot.decode_irc": {"tf": 1}, "irc_bot.IrcBot.receive": {"tf": 1}, "irc_bot.IrcBot.ircLogAppend": {"tf": 1}}, "df": 3, "s": {"docs": {"irc_bot.IrcBot.decode_irc": {"tf": 1}}, "df": 1}}}}}}, "s": {"docs": {"irc_bot.IrcBot.decode_irc": {"tf": 1}}, "df": 1}}}, "x": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"irc_bot.IrcBot.readincoming": {"tf": 1}, "main": {"tf": 1}}, "df": 2}}}, "t": {"docs": {"main.printVersion": {"tf": 1}}, "df": 1}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"main": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"marvin_actions.marvinExplainShell": {"tf": 1.4142135623730951}, "test_marvin_actions.ActionTest.testExplainShell": {"tf": 1}}, "df": 2}}}, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"test_main.ConfigParseTest.testOverridePrecedenceConfigFirst": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceParameterFirst": {"tf": 1}}, "df": 2}}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"test_main.ConfigMergeTest.assertMergedConfig": {"tf": 1}, "test_main.TestBotFactoryMethod": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionOutput": {"tf": 1}}, "df": 3}}}}}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"test_main.TestBotFactoryMethod.testCreateUnsupportedProtocolThrows": {"tf": 1}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"test_marvin_actions.ActionTest.executeAction": {"tf": 1}}, "df": 1}}}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "y": {"docs": {"main": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "h": {"docs": {"marvin_actions": {"tf": 1}, "marvin_general_actions": {"tf": 1}, "test_marvin_actions.ActionTest.testVideoOfToday": {"tf": 1}}, "df": 3}}, "t": {"docs": {"marvin_actions.marvinLunch": {"tf": 1}}, "df": 1}}, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"marvin_general_actions.marvinMorning": {"tf": 1}}, "df": 1}}}, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"test_main.ConfigMergeTest.testEmpty": {"tf": 1.7320508075688772}, "test_main.ConfigMergeTest.testAddSingleParameter": {"tf": 1}}, "df": 2}}}}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"test_main.ConfigMergeTest.testEmpty": {"tf": 1}, "test_marvin_actions.ActionTest.assertStringsOutput": {"tf": 1}}, "df": 2}}}}, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"test_main.FormattingTest.testUnhandledOption": {"tf": 1}, "test_main.FormattingTest.testUnhandledArgument": {"tf": 1}, "test_main.TestArgumentParsing.testDetermineConfigThrowsOnInvalidProto": {"tf": 1}}, "df": 3}}}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {"marvin_actions.setConfig": {"tf": 1}, "marvin_general_actions.setConfig": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"irc_bot": {"tf": 1}}, "df": 1}}}, "s": {"docs": {"main": {"tf": 1}}, "df": 1}}}, "y": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "s": {"docs": {"marvin_actions.wordsAfterKeyWords": {"tf": 1}}, "df": 1}}}}}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "s": {"docs": {"test_marvin_actions.ActionTest.testBudord": {"tf": 1}, "test_marvin_actions.ActionTest.testTimeToBBQ": {"tf": 1}}, "df": 2}}}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {"irc_bot": {"tf": 1}, "irc_bot.IrcBot.sendPrivMsg": {"tf": 1}, "main": {"tf": 1}, "test_marvin_actions.ActionTest.testIRCLog": {"tf": 1}}, "df": 4, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"main": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"main": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"main": {"tf": 1}, "marvin_actions.setConfig": {"tf": 1}, "marvin_general_actions.setConfig": {"tf": 1}}, "df": 3}}}}, "o": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "s": {"docs": {"marvin_actions.marvinWeather": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"irc_bot.IrcBot.decode_irc": {"tf": 1}, "marvin_actions.wordsAfterKeyWords": {"tf": 1.4142135623730951}}, "df": 2, "e": {"docs": {}, "df": 0, "n": {"docs": {"irc_bot.IrcBot.mainLoop": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "d": {"docs": {"marvin_actions.marvinListen": {"tf": 1}}, "df": 1}}}}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {"main": {"tf": 1}, "marvin_actions.marvinWeather": {"tf": 1}}, "df": 2}}, "n": {"docs": {}, "df": 0, "k": {"docs": {"marvin_actions.marvinStats": {"tf": 1}, "marvin_actions.marvinIrcLog": {"tf": 1}, "test_marvin_actions.ActionTest.testVideoOfToday": {"tf": 1}, "test_marvin_actions.ActionTest.testStats": {"tf": 1}, "test_marvin_actions.ActionTest.testIRCLog": {"tf": 1}, "test_marvin_actions.ActionTest.testUptime": {"tf": 1}, "test_marvin_actions.ActionTest.testStream": {"tf": 1}}, "df": 7}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"main": {"tf": 1}, "marvin_actions.commitStrip": {"tf": 1}}, "df": 2}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"marvin_actions.marvinListen": {"tf": 1}}, "df": 1}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"test_main.TestArgumentParsing": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {"test_main": {"tf": 1}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {"marvin_actions.marvinGoogle": {"tf": 1}, "marvin_actions.marvinExplainShell": {"tf": 1}}, "df": 2}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"test_main.ConfigParseTest.testOverridePrecedenceConfigFirst": {"tf": 1}, "test_main.ConfigParseTest.testOverridePrecedenceParameterFirst": {"tf": 1}}, "df": 2}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"test_marvin_actions.ActionTest.testLunchLocations": {"tf": 1}}, "df": 1}}}}}, "y": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {"irc_bot.IrcBot.decode_irc": {"tf": 1}, "main": {"tf": 2}}, "df": 2, "r": {"docs": {"main": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"marvin_actions.thirdFridayIn": {"tf": 1}}, "df": 1}}}}, "w": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"irc_bot.IrcBot.ircLogWriteToFile": {"tf": 1}, "main": {"tf": 1}}, "df": 2, "s": {"docs": {"main": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"main": {"tf": 1}}, "df": 1}}}}, "b": {"docs": {"main": {"tf": 1.4142135623730951}}, "df": 1}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"marvin_actions.marvinWeather": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "k": {"docs": {"test_marvin_actions.ActionTest.testVideoOfToday": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"main": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateUnsupportedProtocolThrows": {"tf": 1}}, "df": 2}}, "t": {"docs": {}, "df": 0, "h": {"docs": {"main.parseOptions": {"tf": 1}, "main.createBot": {"tf": 1}, "marvin_actions.videoOfToday": {"tf": 1}, "marvin_actions.marvinSayHi": {"tf": 1}, "test_main.ConfigMergeTest": {"tf": 1}, "test_main.ConfigMergeTest.assertMergedConfig": {"tf": 1}, "test_main.ConfigParseTest.testOverrideWithFile": {"tf": 1}, "test_main.TestBotFactoryMethod.testCreateUnsupportedProtocolThrows": {"tf": 1}, "test_marvin_actions.ActionTest.assertActionSilent": {"tf": 1}, "test_marvin_actions.ActionTest.assertStringsOutput": {"tf": 1}}, "df": 10}}, "d": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"test_main.FormattingTest.setUpClass": {"tf": 1}}, "df": 1}}}, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"test_marvin_actions.ActionTest.testMorning": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"main": {"tf": 1}}, "df": 1}}}, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"main": {"tf": 1}, "marvin_actions.marvinLunch": {"tf": 1}}, "df": 2}}, "n": {"docs": {"marvin_actions.marvinSun": {"tf": 1}, "test_main.FormattingTest.testHelpPrintout": {"tf": 1}, "test_main.FormattingTest.testHelpPrintoutShort": {"tf": 1}, "test_main.FormattingTest.testVersionPrintout": {"tf": 1}, "test_main.FormattingTest.testVersionPrintoutShort": {"tf": 1}, "test_marvin_actions.ActionTest.testTimeToBBQ": {"tf": 1}, "test_marvin_actions.ActionTest.testNameDayReaction": {"tf": 1}, "test_marvin_actions.ActionTest.testJoke": {"tf": 1}, "test_marvin_actions.ActionTest.testCommitRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testCommitResponse": {"tf": 1}}, "df": 10}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"test_main.TestArgumentParsing": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {"main.determineProtocol": {"tf": 1}, "marvin_actions.marvinBudord": {"tf": 1}, "marvin_actions.videoOfToday": {"tf": 1}, "marvin_actions.marvinWeather": {"tf": 1}}, "df": 4, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"marvin_actions.getCommit": {"tf": 1}}, "df": 1}}}}}}}}}}}, "o": {"docs": {"marvin_actions.marvinWhoIs": {"tf": 1}}, "df": 1, "i": {"docs": {}, "df": 0, "s": {"docs": {"test_marvin_actions.ActionTest.testWhois": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {"main.main": {"tf": 1}}, "df": 1}, "d": {"docs": {}, "df": 0, "s": {"docs": {"marvin_actions.wordsAfterKeyWords": {"tf": 1}}, "df": 1}}}}}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"main": {"tf": 1}, "test_marvin_actions.ActionTest.testSource": {"tf": 1}}, "df": 2}}}}}}}, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.marvinQuote": {"tf": 1}, "test_marvin_actions.ActionTest.testQuote": {"tf": 1}}, "df": 2}}}}}, "j": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"main": {"tf": 1.7320508075688772}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"main": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {"marvin_actions.getJoke": {"tf": 1}, "marvin_actions.marvinJoke": {"tf": 1}, "test_marvin_actions.ActionTest.assertJokeOutput": {"tf": 1}, "test_marvin_actions.ActionTest.testJokeRequest": {"tf": 1}, "test_marvin_actions.ActionTest.testJoke": {"tf": 1}}, "df": 5}}}}, "v": {"docs": {"test_main.FormattingTest.testVersionPrintoutShort": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"main.printVersion": {"tf": 1}, "test_main.ConfigParseTest.testBannedParameters": {"tf": 1}, "test_main.FormattingTest.testVersionPrintout": {"tf": 1.4142135623730951}, "test_main.FormattingTest.testVersionPrintoutShort": {"tf": 1}}, "df": 4}}}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "o": {"docs": {"marvin_actions.videoOfToday": {"tf": 1}, "marvin_actions.marvinVideoOfToday": {"tf": 1}, "test_marvin_actions.ActionTest.testVideoOfToday": {"tf": 1}}, "df": 3}}}}}}}}, "pipeline": ["trimmer"], "_isPrebuiltIndex": true}; + + // mirrored in build-search-index.js (part 1) + // Also split on html tags. this is a cheap heuristic, but good enough. + elasticlunr.tokenizer.setSeperator(/[\s\-.;&_'"=,()]+|<[^>]*>/); + + let searchIndex; + if (docs._isPrebuiltIndex) { + console.info("using precompiled search index"); + searchIndex = elasticlunr.Index.load(docs); + } else { + console.time("building search index"); + // mirrored in build-search-index.js (part 2) + searchIndex = elasticlunr(function () { + this.pipeline.remove(elasticlunr.stemmer); + this.pipeline.remove(elasticlunr.stopWordFilter); + this.addField("qualname"); + this.addField("fullname"); + this.addField("annotation"); + this.addField("default_value"); + this.addField("signature"); + this.addField("bases"); + this.addField("doc"); + this.setRef("fullname"); + }); + for (let doc of docs) { + searchIndex.addDoc(doc); + } + console.timeEnd("building search index"); + } + + return (term) => searchIndex.search(term, { + fields: { + qualname: {boost: 4}, + fullname: {boost: 2}, + annotation: {boost: 2}, + default_value: {boost: 2}, + signature: {boost: 2}, + bases: {boost: 2}, + doc: {boost: 1}, + }, + expand: true + }); +})(); \ No newline at end of file diff --git a/docs/pdoc/test_main.html b/docs/pdoc/test_main.html new file mode 100644 index 0000000..be23ddc --- /dev/null +++ b/docs/pdoc/test_main.html @@ -0,0 +1,1966 @@ + + + + + + + test_main API documentation + + + + + + + + + +
+
+

+test_main

+ +

Tests for the main launcher

+
+ + + + + +
  1#! /usr/bin/env python3
+  2# -*- coding: utf-8 -*-
+  3
+  4"""
+  5Tests for the main launcher
+  6"""
+  7
+  8import argparse
+  9import contextlib
+ 10import io
+ 11import os
+ 12import sys
+ 13from unittest import TestCase
+ 14
+ 15from main import mergeOptionsWithConfigFile, parseOptions, determineProtocol, MSG_VERSION, createBot
+ 16from irc_bot import IrcBot
+ 17from discord_bot import DiscordBot
+ 18
+ 19
+ 20class ConfigMergeTest(TestCase):
+ 21    """Test merging a config file with a dict"""
+ 22
+ 23    def assertMergedConfig(self, config, fileName, expected):
+ 24        """Merge dict with file and assert the result matches expected"""
+ 25        configFile = os.path.join("testConfigs", f"{fileName}.json")
+ 26        actualConfig = mergeOptionsWithConfigFile(config, configFile)
+ 27        self.assertEqual(actualConfig, expected)
+ 28
+ 29
+ 30    def testEmpty(self):
+ 31        """Empty into empty should equal empty"""
+ 32        self.assertMergedConfig({}, "empty", {})
+ 33
+ 34    def testAddSingleParameter(self):
+ 35        """Add a single parameter to an empty config"""
+ 36        new = {
+ 37            "single": "test"
+ 38        }
+ 39        expected = {
+ 40            "single": "test"
+ 41        }
+ 42        self.assertMergedConfig(new, "empty", expected)
+ 43
+ 44    def testAddSingleParameterOverwrites(self):
+ 45        """Add a single parameter to a config that contains it already"""
+ 46        new = {
+ 47            "single": "test"
+ 48        }
+ 49        expected = {
+ 50            "single": "original"
+ 51        }
+ 52        self.assertMergedConfig(new, "single", expected)
+ 53
+ 54    def testAddSingleParameterMerges(self):
+ 55        """Add a single parameter to a config that contains a different one"""
+ 56        new = {
+ 57            "new": "test"
+ 58        }
+ 59        expected = {
+ 60            "new" : "test",
+ 61            "single" : "original"
+ 62        }
+ 63        self.assertMergedConfig(new, "single", expected)
+ 64
+ 65class ConfigParseTest(TestCase):
+ 66    """Test parsing options into a config"""
+ 67
+ 68    SAMPLE_CONFIG = {
+ 69        "server": "localhost",
+ 70        "port": 6667,
+ 71        "channel": "#dbwebb",
+ 72        "nick": "marvin",
+ 73        "realname": "Marvin The All Mighty dbwebb-bot",
+ 74        "ident": "password"
+ 75    }
+ 76
+ 77    CHANGED_CONFIG = {
+ 78        "server": "remotehost",
+ 79        "port": 1234,
+ 80        "channel": "#db-o-webb",
+ 81        "nick": "imposter",
+ 82        "realname": "where is marvin?",
+ 83        "ident": "identify"
+ 84    }
+ 85
+ 86    def testOverrideHardcodedParameters(self):
+ 87        """Test that all the hard coded parameters can be overridden from commandline"""
+ 88        for parameter in ["server", "port", "channel", "nick", "realname", "ident"]:
+ 89            sys.argv = ["./main.py", f"--{parameter}", str(self.CHANGED_CONFIG.get(parameter))]
+ 90            actual = parseOptions(self.SAMPLE_CONFIG)
+ 91            self.assertEqual(actual.get(parameter), self.CHANGED_CONFIG.get(parameter))
+ 92
+ 93    def testOverrideMultipleParameters(self):
+ 94        """Test that multiple parameters can be overridden from commandline"""
+ 95        sys.argv = ["./main.py", "--server", "dbwebb.se", "--port", "5432"]
+ 96        actual = parseOptions(self.SAMPLE_CONFIG)
+ 97        self.assertEqual(actual.get("server"), "dbwebb.se")
+ 98        self.assertEqual(actual.get("port"), 5432)
+ 99
+100    def testOverrideWithFile(self):
+101        """Test that parameters can be overridden with the --config option"""
+102        configFile = os.path.join("testConfigs", "server.json")
+103        sys.argv = ["./main.py", "--config", configFile]
+104        actual = parseOptions(self.SAMPLE_CONFIG)
+105        self.assertEqual(actual.get("server"), "irc.dbwebb.se")
+106
+107    def testOverridePrecedenceConfigFirst(self):
+108        """Test that proper precedence is considered. From most to least significant it should be:
+109        explicit parameter -> parameter in --config file -> default """
+110
+111        configFile = os.path.join("testConfigs", "server.json")
+112        sys.argv = ["./main.py", "--config", configFile, "--server", "important.com"]
+113        actual = parseOptions(self.SAMPLE_CONFIG)
+114        self.assertEqual(actual.get("server"), "important.com")
+115
+116    def testOverridePrecedenceParameterFirst(self):
+117        """Test that proper precedence is considered. From most to least significant it should be:
+118        explicit parameter -> parameter in --config file -> default """
+119
+120        configFile = os.path.join("testConfigs", "server.json")
+121        sys.argv = ["./main.py", "--server", "important.com", "--config", configFile]
+122        actual = parseOptions(self.SAMPLE_CONFIG)
+123        self.assertEqual(actual.get("server"), "important.com")
+124
+125    def testBannedParameters(self):
+126        """Don't allow config, help and version as parameters, as those options are special"""
+127        for bannedParameter in ["config", "help", "version"]:
+128            with self.assertRaises(argparse.ArgumentError):
+129                parseOptions({bannedParameter: "test"})
+130
+131
+132class FormattingTest(TestCase):
+133    """Test the parameters that cause printouts"""
+134
+135    USAGE = ("usage: main.py [-h] [-v] [--config CONFIG] [--server SERVER] [--port PORT] "
+136             "[--channel CHANNEL] [--nick NICK] [--realname REALNAME] [--ident IDENT]\n"
+137             "               [{irc,discord}]\n")
+138
+139    OPTIONS = ("positional arguments:\n  {irc,discord}\n\n"
+140               "options:\n"
+141               "  -h, --help           show this help message and exit\n"
+142               "  -v, --version\n"
+143               "  --config CONFIG\n"
+144               "  --server SERVER\n"
+145               "  --port PORT\n"
+146               "  --channel CHANNEL\n"
+147               "  --nick NICK\n"
+148               "  --realname REALNAME\n"
+149               "  --ident IDENT")
+150
+151
+152    @classmethod
+153    def setUpClass(cls):
+154        """Set the terminal width to 160 to prevent the tests from failing on small terminals"""
+155        os.environ["COLUMNS"] = "160"
+156
+157
+158    def assertPrintOption(self, options, returnCode, output):
+159        """Assert that parseOptions returns a certain code and prints a certain output"""
+160        with self.assertRaises(SystemExit) as e:
+161            s = io.StringIO()
+162            with contextlib.redirect_stdout(s):
+163                sys.argv = ["./main.py"] + [options]
+164                parseOptions(ConfigParseTest.SAMPLE_CONFIG)
+165        self.assertEqual(e.exception.code, returnCode)
+166        self.assertEqual(s.getvalue(), output+"\n") # extra newline added by print()
+167
+168
+169    def testHelpPrintout(self):
+170        """Test that a help is printed when providing the --help flag"""
+171        self.assertPrintOption("--help", 0, f"{self.USAGE}\n{self.OPTIONS}")
+172
+173    def testHelpPrintoutShort(self):
+174        """Test that a help is printed when providing the -h flag"""
+175        self.assertPrintOption("-h", 0, f"{self.USAGE}\n{self.OPTIONS}")
+176
+177    def testVersionPrintout(self):
+178        """Test that the version is printed when provided the --version flag"""
+179        self.assertPrintOption("--version", 0, MSG_VERSION)
+180
+181    def testVersionPrintoutShort(self):
+182        """Test that the version is printed when provided the -v flag"""
+183        self.assertPrintOption("-v", 0, MSG_VERSION)
+184
+185    def testUnhandledOption(self):
+186        """Test that unknown options gives an error"""
+187        with self.assertRaises(SystemExit) as e:
+188            s = io.StringIO()
+189            expectedError = f"{self.USAGE}main.py: error: unrecognized arguments: -g\n"
+190            with contextlib.redirect_stderr(s):
+191                sys.argv = ["./main.py", "-g"]
+192                parseOptions(ConfigParseTest.SAMPLE_CONFIG)
+193        self.assertEqual(e.exception.code, 2)
+194        self.assertEqual(s.getvalue(), expectedError)
+195
+196    def testUnhandledArgument(self):
+197        """Test that any argument gives an error"""
+198        with self.assertRaises(SystemExit) as e:
+199            s = io.StringIO()
+200            expectedError = (f"{self.USAGE}main.py: error: argument protocol: "
+201                             "invalid choice: 'arg' (choose from 'irc', 'discord')\n")
+202            with contextlib.redirect_stderr(s):
+203                sys.argv = ["./main.py", "arg"]
+204                parseOptions(ConfigParseTest.SAMPLE_CONFIG)
+205        self.assertEqual(e.exception.code, 2)
+206        self.assertEqual(s.getvalue(), expectedError)
+207
+208class TestArgumentParsing(TestCase):
+209    """Test parsing argument to determine whether to launch as irc or discord bot """
+210    def testDetermineDiscordProtocol(self):
+211        """Test that the it's possible to give argument to start the bot as a discord bot"""
+212        sys.argv = ["main.py", "discord"]
+213        protocol = determineProtocol()
+214        self.assertEqual(protocol, "discord")
+215
+216    def testDetermineIRCProtocol(self):
+217        """Test that the it's possible to give argument to start the bot as an irc bot"""
+218        sys.argv = ["main.py", "irc"]
+219        protocol = determineProtocol()
+220        self.assertEqual(protocol, "irc")
+221
+222    def testDetermineIRCProtocolisDefault(self):
+223        """Test that if no argument is given, irc is the default"""
+224        sys.argv = ["main.py"]
+225        protocol = determineProtocol()
+226        self.assertEqual(protocol, "irc")
+227
+228    def testDetermineConfigThrowsOnInvalidProto(self):
+229        """Test that determineProtocol throws error on unsupported protocols"""
+230        sys.argv = ["main.py", "gopher"]
+231        with self.assertRaises(SystemExit) as e:
+232            determineProtocol()
+233        self.assertEqual(e.exception.code, 2)
+234
+235class TestBotFactoryMethod(TestCase):
+236    """Test that createBot returns expected instances of Bots"""
+237    def testCreateIRCBot(self):
+238        """Test that an irc bot can be created"""
+239        bot = createBot("irc")
+240        self.assertIsInstance(bot, IrcBot)
+241
+242    def testCreateDiscordBot(self):
+243        """Test that a discord bot can be created"""
+244        bot = createBot("discord")
+245        self.assertIsInstance(bot, DiscordBot)
+246
+247    def testCreateUnsupportedProtocolThrows(self):
+248        """Test that trying to create a bot with an unsupported protocol will throw exception"""
+249        with self.assertRaises(ValueError) as e:
+250            createBot("gopher")
+251        self.assertEqual(str(e.exception), "Unsupported protocol: gopher")
+
+ + +
+
+ +
+ + class + ConfigMergeTest(unittest.case.TestCase): + + + +
+ +
21class ConfigMergeTest(TestCase):
+22    """Test merging a config file with a dict"""
+23
+24    def assertMergedConfig(self, config, fileName, expected):
+25        """Merge dict with file and assert the result matches expected"""
+26        configFile = os.path.join("testConfigs", f"{fileName}.json")
+27        actualConfig = mergeOptionsWithConfigFile(config, configFile)
+28        self.assertEqual(actualConfig, expected)
+29
+30
+31    def testEmpty(self):
+32        """Empty into empty should equal empty"""
+33        self.assertMergedConfig({}, "empty", {})
+34
+35    def testAddSingleParameter(self):
+36        """Add a single parameter to an empty config"""
+37        new = {
+38            "single": "test"
+39        }
+40        expected = {
+41            "single": "test"
+42        }
+43        self.assertMergedConfig(new, "empty", expected)
+44
+45    def testAddSingleParameterOverwrites(self):
+46        """Add a single parameter to a config that contains it already"""
+47        new = {
+48            "single": "test"
+49        }
+50        expected = {
+51            "single": "original"
+52        }
+53        self.assertMergedConfig(new, "single", expected)
+54
+55    def testAddSingleParameterMerges(self):
+56        """Add a single parameter to a config that contains a different one"""
+57        new = {
+58            "new": "test"
+59        }
+60        expected = {
+61            "new" : "test",
+62            "single" : "original"
+63        }
+64        self.assertMergedConfig(new, "single", expected)
+
+ + +

Test merging a config file with a dict

+
+ + +
+ +
+ + def + assertMergedConfig(self, config, fileName, expected): + + + +
+ +
24    def assertMergedConfig(self, config, fileName, expected):
+25        """Merge dict with file and assert the result matches expected"""
+26        configFile = os.path.join("testConfigs", f"{fileName}.json")
+27        actualConfig = mergeOptionsWithConfigFile(config, configFile)
+28        self.assertEqual(actualConfig, expected)
+
+ + +

Merge dict with file and assert the result matches expected

+
+ + +
+
+ +
+ + def + testEmpty(self): + + + +
+ +
31    def testEmpty(self):
+32        """Empty into empty should equal empty"""
+33        self.assertMergedConfig({}, "empty", {})
+
+ + +

Empty into empty should equal empty

+
+ + +
+
+ +
+ + def + testAddSingleParameter(self): + + + +
+ +
35    def testAddSingleParameter(self):
+36        """Add a single parameter to an empty config"""
+37        new = {
+38            "single": "test"
+39        }
+40        expected = {
+41            "single": "test"
+42        }
+43        self.assertMergedConfig(new, "empty", expected)
+
+ + +

Add a single parameter to an empty config

+
+ + +
+
+ +
+ + def + testAddSingleParameterOverwrites(self): + + + +
+ +
45    def testAddSingleParameterOverwrites(self):
+46        """Add a single parameter to a config that contains it already"""
+47        new = {
+48            "single": "test"
+49        }
+50        expected = {
+51            "single": "original"
+52        }
+53        self.assertMergedConfig(new, "single", expected)
+
+ + +

Add a single parameter to a config that contains it already

+
+ + +
+
+ +
+ + def + testAddSingleParameterMerges(self): + + + +
+ +
55    def testAddSingleParameterMerges(self):
+56        """Add a single parameter to a config that contains a different one"""
+57        new = {
+58            "new": "test"
+59        }
+60        expected = {
+61            "new" : "test",
+62            "single" : "original"
+63        }
+64        self.assertMergedConfig(new, "single", expected)
+
+ + +

Add a single parameter to a config that contains a different one

+
+ + +
+
+
Inherited Members
+
+
unittest.case.TestCase
+
TestCase
+
failureException
+
longMessage
+
maxDiff
+
addTypeEqualityFunc
+
addCleanup
+
enterContext
+
addClassCleanup
+
enterClassContext
+
setUp
+
tearDown
+
setUpClass
+
tearDownClass
+
countTestCases
+
defaultTestResult
+
shortDescription
+
id
+
subTest
+
run
+
doCleanups
+
doClassCleanups
+
debug
+
skipTest
+
fail
+
assertFalse
+
assertTrue
+
assertRaises
+
assertWarns
+
assertLogs
+
assertNoLogs
+
assertEqual
+
assertNotEqual
+
assertAlmostEqual
+
assertNotAlmostEqual
+
assertSequenceEqual
+
assertListEqual
+
assertTupleEqual
+
assertSetEqual
+
assertIn
+
assertNotIn
+
assertIs
+
assertIsNot
+
assertDictEqual
+
assertCountEqual
+
assertMultiLineEqual
+
assertLess
+
assertLessEqual
+
assertGreater
+
assertGreaterEqual
+
assertIsNone
+
assertIsNotNone
+
assertIsInstance
+
assertNotIsInstance
+
assertRaisesRegex
+
assertWarnsRegex
+
assertRegex
+
assertNotRegex
+ +
+
+
+
+
+ +
+ + class + ConfigParseTest(unittest.case.TestCase): + + + +
+ +
 66class ConfigParseTest(TestCase):
+ 67    """Test parsing options into a config"""
+ 68
+ 69    SAMPLE_CONFIG = {
+ 70        "server": "localhost",
+ 71        "port": 6667,
+ 72        "channel": "#dbwebb",
+ 73        "nick": "marvin",
+ 74        "realname": "Marvin The All Mighty dbwebb-bot",
+ 75        "ident": "password"
+ 76    }
+ 77
+ 78    CHANGED_CONFIG = {
+ 79        "server": "remotehost",
+ 80        "port": 1234,
+ 81        "channel": "#db-o-webb",
+ 82        "nick": "imposter",
+ 83        "realname": "where is marvin?",
+ 84        "ident": "identify"
+ 85    }
+ 86
+ 87    def testOverrideHardcodedParameters(self):
+ 88        """Test that all the hard coded parameters can be overridden from commandline"""
+ 89        for parameter in ["server", "port", "channel", "nick", "realname", "ident"]:
+ 90            sys.argv = ["./main.py", f"--{parameter}", str(self.CHANGED_CONFIG.get(parameter))]
+ 91            actual = parseOptions(self.SAMPLE_CONFIG)
+ 92            self.assertEqual(actual.get(parameter), self.CHANGED_CONFIG.get(parameter))
+ 93
+ 94    def testOverrideMultipleParameters(self):
+ 95        """Test that multiple parameters can be overridden from commandline"""
+ 96        sys.argv = ["./main.py", "--server", "dbwebb.se", "--port", "5432"]
+ 97        actual = parseOptions(self.SAMPLE_CONFIG)
+ 98        self.assertEqual(actual.get("server"), "dbwebb.se")
+ 99        self.assertEqual(actual.get("port"), 5432)
+100
+101    def testOverrideWithFile(self):
+102        """Test that parameters can be overridden with the --config option"""
+103        configFile = os.path.join("testConfigs", "server.json")
+104        sys.argv = ["./main.py", "--config", configFile]
+105        actual = parseOptions(self.SAMPLE_CONFIG)
+106        self.assertEqual(actual.get("server"), "irc.dbwebb.se")
+107
+108    def testOverridePrecedenceConfigFirst(self):
+109        """Test that proper precedence is considered. From most to least significant it should be:
+110        explicit parameter -> parameter in --config file -> default """
+111
+112        configFile = os.path.join("testConfigs", "server.json")
+113        sys.argv = ["./main.py", "--config", configFile, "--server", "important.com"]
+114        actual = parseOptions(self.SAMPLE_CONFIG)
+115        self.assertEqual(actual.get("server"), "important.com")
+116
+117    def testOverridePrecedenceParameterFirst(self):
+118        """Test that proper precedence is considered. From most to least significant it should be:
+119        explicit parameter -> parameter in --config file -> default """
+120
+121        configFile = os.path.join("testConfigs", "server.json")
+122        sys.argv = ["./main.py", "--server", "important.com", "--config", configFile]
+123        actual = parseOptions(self.SAMPLE_CONFIG)
+124        self.assertEqual(actual.get("server"), "important.com")
+125
+126    def testBannedParameters(self):
+127        """Don't allow config, help and version as parameters, as those options are special"""
+128        for bannedParameter in ["config", "help", "version"]:
+129            with self.assertRaises(argparse.ArgumentError):
+130                parseOptions({bannedParameter: "test"})
+
+ + +

Test parsing options into a config

+
+ + +
+
+ SAMPLE_CONFIG = + + {'server': 'localhost', 'port': 6667, 'channel': '#dbwebb', 'nick': 'marvin', 'realname': 'Marvin The All Mighty dbwebb-bot', 'ident': 'password'} + + +
+ + + + +
+
+
+ CHANGED_CONFIG = + + {'server': 'remotehost', 'port': 1234, 'channel': '#db-o-webb', 'nick': 'imposter', 'realname': 'where is marvin?', 'ident': 'identify'} + + +
+ + + + +
+
+ +
+ + def + testOverrideHardcodedParameters(self): + + + +
+ +
87    def testOverrideHardcodedParameters(self):
+88        """Test that all the hard coded parameters can be overridden from commandline"""
+89        for parameter in ["server", "port", "channel", "nick", "realname", "ident"]:
+90            sys.argv = ["./main.py", f"--{parameter}", str(self.CHANGED_CONFIG.get(parameter))]
+91            actual = parseOptions(self.SAMPLE_CONFIG)
+92            self.assertEqual(actual.get(parameter), self.CHANGED_CONFIG.get(parameter))
+
+ + +

Test that all the hard coded parameters can be overridden from commandline

+
+ + +
+
+ +
+ + def + testOverrideMultipleParameters(self): + + + +
+ +
94    def testOverrideMultipleParameters(self):
+95        """Test that multiple parameters can be overridden from commandline"""
+96        sys.argv = ["./main.py", "--server", "dbwebb.se", "--port", "5432"]
+97        actual = parseOptions(self.SAMPLE_CONFIG)
+98        self.assertEqual(actual.get("server"), "dbwebb.se")
+99        self.assertEqual(actual.get("port"), 5432)
+
+ + +

Test that multiple parameters can be overridden from commandline

+
+ + +
+
+ +
+ + def + testOverrideWithFile(self): + + + +
+ +
101    def testOverrideWithFile(self):
+102        """Test that parameters can be overridden with the --config option"""
+103        configFile = os.path.join("testConfigs", "server.json")
+104        sys.argv = ["./main.py", "--config", configFile]
+105        actual = parseOptions(self.SAMPLE_CONFIG)
+106        self.assertEqual(actual.get("server"), "irc.dbwebb.se")
+
+ + +

Test that parameters can be overridden with the --config option

+
+ + +
+
+ +
+ + def + testOverridePrecedenceConfigFirst(self): + + + +
+ +
108    def testOverridePrecedenceConfigFirst(self):
+109        """Test that proper precedence is considered. From most to least significant it should be:
+110        explicit parameter -> parameter in --config file -> default """
+111
+112        configFile = os.path.join("testConfigs", "server.json")
+113        sys.argv = ["./main.py", "--config", configFile, "--server", "important.com"]
+114        actual = parseOptions(self.SAMPLE_CONFIG)
+115        self.assertEqual(actual.get("server"), "important.com")
+
+ + +

Test that proper precedence is considered. From most to least significant it should be: +explicit parameter -> parameter in --config file -> default

+
+ + +
+
+ +
+ + def + testOverridePrecedenceParameterFirst(self): + + + +
+ +
117    def testOverridePrecedenceParameterFirst(self):
+118        """Test that proper precedence is considered. From most to least significant it should be:
+119        explicit parameter -> parameter in --config file -> default """
+120
+121        configFile = os.path.join("testConfigs", "server.json")
+122        sys.argv = ["./main.py", "--server", "important.com", "--config", configFile]
+123        actual = parseOptions(self.SAMPLE_CONFIG)
+124        self.assertEqual(actual.get("server"), "important.com")
+
+ + +

Test that proper precedence is considered. From most to least significant it should be: +explicit parameter -> parameter in --config file -> default

+
+ + +
+
+ +
+ + def + testBannedParameters(self): + + + +
+ +
126    def testBannedParameters(self):
+127        """Don't allow config, help and version as parameters, as those options are special"""
+128        for bannedParameter in ["config", "help", "version"]:
+129            with self.assertRaises(argparse.ArgumentError):
+130                parseOptions({bannedParameter: "test"})
+
+ + +

Don't allow config, help and version as parameters, as those options are special

+
+ + +
+
+
Inherited Members
+
+
unittest.case.TestCase
+
TestCase
+
failureException
+
longMessage
+
maxDiff
+
addTypeEqualityFunc
+
addCleanup
+
enterContext
+
addClassCleanup
+
enterClassContext
+
setUp
+
tearDown
+
setUpClass
+
tearDownClass
+
countTestCases
+
defaultTestResult
+
shortDescription
+
id
+
subTest
+
run
+
doCleanups
+
doClassCleanups
+
debug
+
skipTest
+
fail
+
assertFalse
+
assertTrue
+
assertRaises
+
assertWarns
+
assertLogs
+
assertNoLogs
+
assertEqual
+
assertNotEqual
+
assertAlmostEqual
+
assertNotAlmostEqual
+
assertSequenceEqual
+
assertListEqual
+
assertTupleEqual
+
assertSetEqual
+
assertIn
+
assertNotIn
+
assertIs
+
assertIsNot
+
assertDictEqual
+
assertCountEqual
+
assertMultiLineEqual
+
assertLess
+
assertLessEqual
+
assertGreater
+
assertGreaterEqual
+
assertIsNone
+
assertIsNotNone
+
assertIsInstance
+
assertNotIsInstance
+
assertRaisesRegex
+
assertWarnsRegex
+
assertRegex
+
assertNotRegex
+ +
+
+
+
+
+ +
+ + class + FormattingTest(unittest.case.TestCase): + + + +
+ +
133class FormattingTest(TestCase):
+134    """Test the parameters that cause printouts"""
+135
+136    USAGE = ("usage: main.py [-h] [-v] [--config CONFIG] [--server SERVER] [--port PORT] "
+137             "[--channel CHANNEL] [--nick NICK] [--realname REALNAME] [--ident IDENT]\n"
+138             "               [{irc,discord}]\n")
+139
+140    OPTIONS = ("positional arguments:\n  {irc,discord}\n\n"
+141               "options:\n"
+142               "  -h, --help           show this help message and exit\n"
+143               "  -v, --version\n"
+144               "  --config CONFIG\n"
+145               "  --server SERVER\n"
+146               "  --port PORT\n"
+147               "  --channel CHANNEL\n"
+148               "  --nick NICK\n"
+149               "  --realname REALNAME\n"
+150               "  --ident IDENT")
+151
+152
+153    @classmethod
+154    def setUpClass(cls):
+155        """Set the terminal width to 160 to prevent the tests from failing on small terminals"""
+156        os.environ["COLUMNS"] = "160"
+157
+158
+159    def assertPrintOption(self, options, returnCode, output):
+160        """Assert that parseOptions returns a certain code and prints a certain output"""
+161        with self.assertRaises(SystemExit) as e:
+162            s = io.StringIO()
+163            with contextlib.redirect_stdout(s):
+164                sys.argv = ["./main.py"] + [options]
+165                parseOptions(ConfigParseTest.SAMPLE_CONFIG)
+166        self.assertEqual(e.exception.code, returnCode)
+167        self.assertEqual(s.getvalue(), output+"\n") # extra newline added by print()
+168
+169
+170    def testHelpPrintout(self):
+171        """Test that a help is printed when providing the --help flag"""
+172        self.assertPrintOption("--help", 0, f"{self.USAGE}\n{self.OPTIONS}")
+173
+174    def testHelpPrintoutShort(self):
+175        """Test that a help is printed when providing the -h flag"""
+176        self.assertPrintOption("-h", 0, f"{self.USAGE}\n{self.OPTIONS}")
+177
+178    def testVersionPrintout(self):
+179        """Test that the version is printed when provided the --version flag"""
+180        self.assertPrintOption("--version", 0, MSG_VERSION)
+181
+182    def testVersionPrintoutShort(self):
+183        """Test that the version is printed when provided the -v flag"""
+184        self.assertPrintOption("-v", 0, MSG_VERSION)
+185
+186    def testUnhandledOption(self):
+187        """Test that unknown options gives an error"""
+188        with self.assertRaises(SystemExit) as e:
+189            s = io.StringIO()
+190            expectedError = f"{self.USAGE}main.py: error: unrecognized arguments: -g\n"
+191            with contextlib.redirect_stderr(s):
+192                sys.argv = ["./main.py", "-g"]
+193                parseOptions(ConfigParseTest.SAMPLE_CONFIG)
+194        self.assertEqual(e.exception.code, 2)
+195        self.assertEqual(s.getvalue(), expectedError)
+196
+197    def testUnhandledArgument(self):
+198        """Test that any argument gives an error"""
+199        with self.assertRaises(SystemExit) as e:
+200            s = io.StringIO()
+201            expectedError = (f"{self.USAGE}main.py: error: argument protocol: "
+202                             "invalid choice: 'arg' (choose from 'irc', 'discord')\n")
+203            with contextlib.redirect_stderr(s):
+204                sys.argv = ["./main.py", "arg"]
+205                parseOptions(ConfigParseTest.SAMPLE_CONFIG)
+206        self.assertEqual(e.exception.code, 2)
+207        self.assertEqual(s.getvalue(), expectedError)
+
+ + +

Test the parameters that cause printouts

+
+ + +
+
+ USAGE = + + 'usage: main.py [-h] [-v] [--config CONFIG] [--server SERVER] [--port PORT] [--channel CHANNEL] [--nick NICK] [--realname REALNAME] [--ident IDENT]\n [{irc,discord}]\n' + + +
+ + + + +
+
+
+ OPTIONS = + + 'positional arguments:\n {irc,discord}\n\noptions:\n -h, --help show this help message and exit\n -v, --version\n --config CONFIG\n --server SERVER\n --port PORT\n --channel CHANNEL\n --nick NICK\n --realname REALNAME\n --ident IDENT' + + +
+ + + + +
+
+ +
+
@classmethod
+ + def + setUpClass(cls): + + + +
+ +
153    @classmethod
+154    def setUpClass(cls):
+155        """Set the terminal width to 160 to prevent the tests from failing on small terminals"""
+156        os.environ["COLUMNS"] = "160"
+
+ + +

Set the terminal width to 160 to prevent the tests from failing on small terminals

+
+ + +
+
+ +
+ + def + assertPrintOption(self, options, returnCode, output): + + + +
+ +
159    def assertPrintOption(self, options, returnCode, output):
+160        """Assert that parseOptions returns a certain code and prints a certain output"""
+161        with self.assertRaises(SystemExit) as e:
+162            s = io.StringIO()
+163            with contextlib.redirect_stdout(s):
+164                sys.argv = ["./main.py"] + [options]
+165                parseOptions(ConfigParseTest.SAMPLE_CONFIG)
+166        self.assertEqual(e.exception.code, returnCode)
+167        self.assertEqual(s.getvalue(), output+"\n") # extra newline added by print()
+
+ + +

Assert that parseOptions returns a certain code and prints a certain output

+
+ + +
+
+ +
+ + def + testHelpPrintout(self): + + + +
+ +
170    def testHelpPrintout(self):
+171        """Test that a help is printed when providing the --help flag"""
+172        self.assertPrintOption("--help", 0, f"{self.USAGE}\n{self.OPTIONS}")
+
+ + +

Test that a help is printed when providing the --help flag

+
+ + +
+
+ +
+ + def + testHelpPrintoutShort(self): + + + +
+ +
174    def testHelpPrintoutShort(self):
+175        """Test that a help is printed when providing the -h flag"""
+176        self.assertPrintOption("-h", 0, f"{self.USAGE}\n{self.OPTIONS}")
+
+ + +

Test that a help is printed when providing the -h flag

+
+ + +
+
+ +
+ + def + testVersionPrintout(self): + + + +
+ +
178    def testVersionPrintout(self):
+179        """Test that the version is printed when provided the --version flag"""
+180        self.assertPrintOption("--version", 0, MSG_VERSION)
+
+ + +

Test that the version is printed when provided the --version flag

+
+ + +
+
+ +
+ + def + testVersionPrintoutShort(self): + + + +
+ +
182    def testVersionPrintoutShort(self):
+183        """Test that the version is printed when provided the -v flag"""
+184        self.assertPrintOption("-v", 0, MSG_VERSION)
+
+ + +

Test that the version is printed when provided the -v flag

+
+ + +
+
+ +
+ + def + testUnhandledOption(self): + + + +
+ +
186    def testUnhandledOption(self):
+187        """Test that unknown options gives an error"""
+188        with self.assertRaises(SystemExit) as e:
+189            s = io.StringIO()
+190            expectedError = f"{self.USAGE}main.py: error: unrecognized arguments: -g\n"
+191            with contextlib.redirect_stderr(s):
+192                sys.argv = ["./main.py", "-g"]
+193                parseOptions(ConfigParseTest.SAMPLE_CONFIG)
+194        self.assertEqual(e.exception.code, 2)
+195        self.assertEqual(s.getvalue(), expectedError)
+
+ + +

Test that unknown options gives an error

+
+ + +
+
+ +
+ + def + testUnhandledArgument(self): + + + +
+ +
197    def testUnhandledArgument(self):
+198        """Test that any argument gives an error"""
+199        with self.assertRaises(SystemExit) as e:
+200            s = io.StringIO()
+201            expectedError = (f"{self.USAGE}main.py: error: argument protocol: "
+202                             "invalid choice: 'arg' (choose from 'irc', 'discord')\n")
+203            with contextlib.redirect_stderr(s):
+204                sys.argv = ["./main.py", "arg"]
+205                parseOptions(ConfigParseTest.SAMPLE_CONFIG)
+206        self.assertEqual(e.exception.code, 2)
+207        self.assertEqual(s.getvalue(), expectedError)
+
+ + +

Test that any argument gives an error

+
+ + +
+
+
Inherited Members
+
+
unittest.case.TestCase
+
TestCase
+
failureException
+
longMessage
+
maxDiff
+
addTypeEqualityFunc
+
addCleanup
+
enterContext
+
addClassCleanup
+
enterClassContext
+
setUp
+
tearDown
+
tearDownClass
+
countTestCases
+
defaultTestResult
+
shortDescription
+
id
+
subTest
+
run
+
doCleanups
+
doClassCleanups
+
debug
+
skipTest
+
fail
+
assertFalse
+
assertTrue
+
assertRaises
+
assertWarns
+
assertLogs
+
assertNoLogs
+
assertEqual
+
assertNotEqual
+
assertAlmostEqual
+
assertNotAlmostEqual
+
assertSequenceEqual
+
assertListEqual
+
assertTupleEqual
+
assertSetEqual
+
assertIn
+
assertNotIn
+
assertIs
+
assertIsNot
+
assertDictEqual
+
assertCountEqual
+
assertMultiLineEqual
+
assertLess
+
assertLessEqual
+
assertGreater
+
assertGreaterEqual
+
assertIsNone
+
assertIsNotNone
+
assertIsInstance
+
assertNotIsInstance
+
assertRaisesRegex
+
assertWarnsRegex
+
assertRegex
+
assertNotRegex
+ +
+
+
+
+
+ +
+ + class + TestArgumentParsing(unittest.case.TestCase): + + + +
+ +
209class TestArgumentParsing(TestCase):
+210    """Test parsing argument to determine whether to launch as irc or discord bot """
+211    def testDetermineDiscordProtocol(self):
+212        """Test that the it's possible to give argument to start the bot as a discord bot"""
+213        sys.argv = ["main.py", "discord"]
+214        protocol = determineProtocol()
+215        self.assertEqual(protocol, "discord")
+216
+217    def testDetermineIRCProtocol(self):
+218        """Test that the it's possible to give argument to start the bot as an irc bot"""
+219        sys.argv = ["main.py", "irc"]
+220        protocol = determineProtocol()
+221        self.assertEqual(protocol, "irc")
+222
+223    def testDetermineIRCProtocolisDefault(self):
+224        """Test that if no argument is given, irc is the default"""
+225        sys.argv = ["main.py"]
+226        protocol = determineProtocol()
+227        self.assertEqual(protocol, "irc")
+228
+229    def testDetermineConfigThrowsOnInvalidProto(self):
+230        """Test that determineProtocol throws error on unsupported protocols"""
+231        sys.argv = ["main.py", "gopher"]
+232        with self.assertRaises(SystemExit) as e:
+233            determineProtocol()
+234        self.assertEqual(e.exception.code, 2)
+
+ + +

Test parsing argument to determine whether to launch as irc or discord bot

+
+ + +
+ +
+ + def + testDetermineDiscordProtocol(self): + + + +
+ +
211    def testDetermineDiscordProtocol(self):
+212        """Test that the it's possible to give argument to start the bot as a discord bot"""
+213        sys.argv = ["main.py", "discord"]
+214        protocol = determineProtocol()
+215        self.assertEqual(protocol, "discord")
+
+ + +

Test that the it's possible to give argument to start the bot as a discord bot

+
+ + +
+
+ +
+ + def + testDetermineIRCProtocol(self): + + + +
+ +
217    def testDetermineIRCProtocol(self):
+218        """Test that the it's possible to give argument to start the bot as an irc bot"""
+219        sys.argv = ["main.py", "irc"]
+220        protocol = determineProtocol()
+221        self.assertEqual(protocol, "irc")
+
+ + +

Test that the it's possible to give argument to start the bot as an irc bot

+
+ + +
+
+ +
+ + def + testDetermineIRCProtocolisDefault(self): + + + +
+ +
223    def testDetermineIRCProtocolisDefault(self):
+224        """Test that if no argument is given, irc is the default"""
+225        sys.argv = ["main.py"]
+226        protocol = determineProtocol()
+227        self.assertEqual(protocol, "irc")
+
+ + +

Test that if no argument is given, irc is the default

+
+ + +
+
+ +
+ + def + testDetermineConfigThrowsOnInvalidProto(self): + + + +
+ +
229    def testDetermineConfigThrowsOnInvalidProto(self):
+230        """Test that determineProtocol throws error on unsupported protocols"""
+231        sys.argv = ["main.py", "gopher"]
+232        with self.assertRaises(SystemExit) as e:
+233            determineProtocol()
+234        self.assertEqual(e.exception.code, 2)
+
+ + +

Test that determineProtocol throws error on unsupported protocols

+
+ + +
+
+
Inherited Members
+
+
unittest.case.TestCase
+
TestCase
+
failureException
+
longMessage
+
maxDiff
+
addTypeEqualityFunc
+
addCleanup
+
enterContext
+
addClassCleanup
+
enterClassContext
+
setUp
+
tearDown
+
setUpClass
+
tearDownClass
+
countTestCases
+
defaultTestResult
+
shortDescription
+
id
+
subTest
+
run
+
doCleanups
+
doClassCleanups
+
debug
+
skipTest
+
fail
+
assertFalse
+
assertTrue
+
assertRaises
+
assertWarns
+
assertLogs
+
assertNoLogs
+
assertEqual
+
assertNotEqual
+
assertAlmostEqual
+
assertNotAlmostEqual
+
assertSequenceEqual
+
assertListEqual
+
assertTupleEqual
+
assertSetEqual
+
assertIn
+
assertNotIn
+
assertIs
+
assertIsNot
+
assertDictEqual
+
assertCountEqual
+
assertMultiLineEqual
+
assertLess
+
assertLessEqual
+
assertGreater
+
assertGreaterEqual
+
assertIsNone
+
assertIsNotNone
+
assertIsInstance
+
assertNotIsInstance
+
assertRaisesRegex
+
assertWarnsRegex
+
assertRegex
+
assertNotRegex
+ +
+
+
+
+
+ +
+ + class + TestBotFactoryMethod(unittest.case.TestCase): + + + +
+ +
236class TestBotFactoryMethod(TestCase):
+237    """Test that createBot returns expected instances of Bots"""
+238    def testCreateIRCBot(self):
+239        """Test that an irc bot can be created"""
+240        bot = createBot("irc")
+241        self.assertIsInstance(bot, IrcBot)
+242
+243    def testCreateDiscordBot(self):
+244        """Test that a discord bot can be created"""
+245        bot = createBot("discord")
+246        self.assertIsInstance(bot, DiscordBot)
+247
+248    def testCreateUnsupportedProtocolThrows(self):
+249        """Test that trying to create a bot with an unsupported protocol will throw exception"""
+250        with self.assertRaises(ValueError) as e:
+251            createBot("gopher")
+252        self.assertEqual(str(e.exception), "Unsupported protocol: gopher")
+
+ + +

Test that createBot returns expected instances of Bots

+
+ + +
+ +
+ + def + testCreateIRCBot(self): + + + +
+ +
238    def testCreateIRCBot(self):
+239        """Test that an irc bot can be created"""
+240        bot = createBot("irc")
+241        self.assertIsInstance(bot, IrcBot)
+
+ + +

Test that an irc bot can be created

+
+ + +
+
+ +
+ + def + testCreateDiscordBot(self): + + + +
+ +
243    def testCreateDiscordBot(self):
+244        """Test that a discord bot can be created"""
+245        bot = createBot("discord")
+246        self.assertIsInstance(bot, DiscordBot)
+
+ + +

Test that a discord bot can be created

+
+ + +
+
+ +
+ + def + testCreateUnsupportedProtocolThrows(self): + + + +
+ +
248    def testCreateUnsupportedProtocolThrows(self):
+249        """Test that trying to create a bot with an unsupported protocol will throw exception"""
+250        with self.assertRaises(ValueError) as e:
+251            createBot("gopher")
+252        self.assertEqual(str(e.exception), "Unsupported protocol: gopher")
+
+ + +

Test that trying to create a bot with an unsupported protocol will throw exception

+
+ + +
+
+
Inherited Members
+
+
unittest.case.TestCase
+
TestCase
+
failureException
+
longMessage
+
maxDiff
+
addTypeEqualityFunc
+
addCleanup
+
enterContext
+
addClassCleanup
+
enterClassContext
+
setUp
+
tearDown
+
setUpClass
+
tearDownClass
+
countTestCases
+
defaultTestResult
+
shortDescription
+
id
+
subTest
+
run
+
doCleanups
+
doClassCleanups
+
debug
+
skipTest
+
fail
+
assertFalse
+
assertTrue
+
assertRaises
+
assertWarns
+
assertLogs
+
assertNoLogs
+
assertEqual
+
assertNotEqual
+
assertAlmostEqual
+
assertNotAlmostEqual
+
assertSequenceEqual
+
assertListEqual
+
assertTupleEqual
+
assertSetEqual
+
assertIn
+
assertNotIn
+
assertIs
+
assertIsNot
+
assertDictEqual
+
assertCountEqual
+
assertMultiLineEqual
+
assertLess
+
assertLessEqual
+
assertGreater
+
assertGreaterEqual
+
assertIsNone
+
assertIsNotNone
+
assertIsInstance
+
assertNotIsInstance
+
assertRaisesRegex
+
assertWarnsRegex
+
assertRegex
+
assertNotRegex
+ +
+
+
+
+
+ + \ No newline at end of file diff --git a/docs/pdoc/test_marvin_actions.html b/docs/pdoc/test_marvin_actions.html new file mode 100644 index 0000000..b02ab7b --- /dev/null +++ b/docs/pdoc/test_marvin_actions.html @@ -0,0 +1,1976 @@ + + + + + + + test_marvin_actions API documentation + + + + + + + + + +
+
+

+test_marvin_actions

+ +

Tests for all Marvin actions

+
+ + + + + +
  1#! /usr/bin/env python3
+  2# -*- coding: utf-8 -*-
+  3
+  4"""
+  5Tests for all Marvin actions
+  6"""
+  7
+  8import json
+  9
+ 10from datetime import date
+ 11from unittest import mock, TestCase
+ 12
+ 13import requests
+ 14
+ 15from bot import Bot
+ 16import marvin_actions
+ 17import marvin_general_actions
+ 18
+ 19class ActionTest(TestCase):
+ 20    """Test Marvin actions"""
+ 21    strings = {}
+ 22
+ 23    @classmethod
+ 24    def setUpClass(cls):
+ 25        with open("marvin_strings.json", encoding="utf-8") as f:
+ 26            cls.strings = json.load(f)
+ 27
+ 28
+ 29    def executeAction(self, action, message):
+ 30        """Execute an action for a message and return the response"""
+ 31        return action(Bot.tokenize(message))
+ 32
+ 33
+ 34    def assertActionOutput(self, action, message, expectedOutput):
+ 35        """Call an action on message and assert expected output"""
+ 36        actualOutput = self.executeAction(action, message)
+ 37
+ 38        self.assertEqual(actualOutput, expectedOutput)
+ 39
+ 40
+ 41    def assertActionSilent(self, action, message):
+ 42        """Call an action with provided message and assert no output"""
+ 43        self.assertActionOutput(action, message, None)
+ 44
+ 45
+ 46    def assertStringsOutput(self, action, message, expectedoutputKey, subkey=None):
+ 47        """Call an action with provided message and assert the output is equal to DB"""
+ 48        expectedOutput = self.strings.get(expectedoutputKey)
+ 49        if subkey is not None:
+ 50            if isinstance(expectedOutput, list):
+ 51                expectedOutput = expectedOutput[subkey]
+ 52            else:
+ 53                expectedOutput = expectedOutput.get(subkey)
+ 54        self.assertActionOutput(action, message, expectedOutput)
+ 55
+ 56
+ 57    def assertBBQResponse(self, todaysDate, bbqDate, expectedMessageKey):
+ 58        """Assert that the proper bbq message is returned, given a date"""
+ 59        url = self.strings.get("barbecue").get("url")
+ 60        message = self.strings.get("barbecue").get(expectedMessageKey)
+ 61        if isinstance(message, list):
+ 62            message = message[1]
+ 63        if expectedMessageKey in ["base", "week", "eternity"]:
+ 64            message = message % bbqDate
+ 65
+ 66        with mock.patch("marvin_actions.datetime") as d:
+ 67            d.date.today.return_value = todaysDate
+ 68            with mock.patch("marvin_actions.random") as r:
+ 69                r.randint.return_value = 1
+ 70                expected = f"{url}. {message}"
+ 71                self.assertActionOutput(marvin_actions.marvinTimeToBBQ, "dags att grilla", expected)
+ 72
+ 73
+ 74    def assertNameDayOutput(self, exampleFile, expectedOutput):
+ 75        """Assert that the proper nameday message is returned, given an inputfile"""
+ 76        with open(f"namedayFiles/{exampleFile}.json", "r", encoding="UTF-8") as f:
+ 77            response = requests.models.Response()
+ 78            response._content = str.encode(json.dumps(json.load(f)))
+ 79            with mock.patch("marvin_actions.requests") as r:
+ 80                r.get.return_value = response
+ 81                self.assertActionOutput(marvin_actions.marvinNameday, "nameday", expectedOutput)
+ 82
+ 83    def assertJokeOutput(self, exampleFile, expectedOutput):
+ 84        """Assert that a joke is returned, given an input file"""
+ 85        with open(f"jokeFiles/{exampleFile}.json", "r", encoding="UTF-8") as f:
+ 86            response = requests.models.Response()
+ 87            response._content = str.encode(json.dumps(json.load(f)))
+ 88            with mock.patch("marvin_actions.requests") as r:
+ 89                r.get.return_value = response
+ 90                self.assertActionOutput(marvin_actions.marvinJoke, "joke", expectedOutput)
+ 91
+ 92    def testSmile(self):
+ 93        """Test that marvin can smile"""
+ 94        with mock.patch("marvin_actions.random") as r:
+ 95            r.randint.return_value = 1
+ 96            self.assertStringsOutput(marvin_actions.marvinSmile, "le lite?", "smile", 1)
+ 97        self.assertActionSilent(marvin_actions.marvinSmile, "sur idag?")
+ 98
+ 99    def testWhois(self):
+100        """Test that marvin responds to whois"""
+101        self.assertStringsOutput(marvin_actions.marvinWhoIs, "vem är marvin?", "whois")
+102        self.assertActionSilent(marvin_actions.marvinWhoIs, "vemär")
+103
+104    def testGoogle(self):
+105        """Test that marvin can help google stuff"""
+106        with mock.patch("marvin_actions.random") as r:
+107            r.randint.return_value = 1
+108            self.assertActionOutput(
+109                marvin_actions.marvinGoogle,
+110                "kan du googla mos",
+111                "LMGTFY https://www.google.se/search?q=mos")
+112            self.assertActionOutput(
+113                marvin_actions.marvinGoogle,
+114                "kan du googla google mos",
+115                "LMGTFY https://www.google.se/search?q=google+mos")
+116        self.assertActionSilent(marvin_actions.marvinGoogle, "du kan googla")
+117        self.assertActionSilent(marvin_actions.marvinGoogle, "gogool")
+118
+119    def testExplainShell(self):
+120        """Test that marvin can explain shell commands"""
+121        url = "http://explainshell.com/explain?cmd=pwd"
+122        self.assertActionOutput(marvin_actions.marvinExplainShell, "explain pwd", url)
+123        self.assertActionOutput(marvin_actions.marvinExplainShell, "can you explain pwd", url)
+124        self.assertActionOutput(
+125            marvin_actions.marvinExplainShell,
+126            "förklara pwd|grep -o $user",
+127            f"{url}%7Cgrep+-o+%24user")
+128
+129        self.assertActionSilent(marvin_actions.marvinExplainShell, "explains")
+130
+131    def testSource(self):
+132        """Test that marvin responds to questions about source code"""
+133        self.assertStringsOutput(marvin_actions.marvinSource, "source", "source")
+134        self.assertStringsOutput(marvin_actions.marvinSource, "källkod", "source")
+135        self.assertActionSilent(marvin_actions.marvinSource, "opensource")
+136
+137    def testBudord(self):
+138        """Test that marvin knows all the commandments"""
+139        for n in range(1, 5):
+140            self.assertStringsOutput(marvin_actions.marvinBudord, f"budord #{n}", "budord", f"#{n}")
+141
+142        self.assertStringsOutput(marvin_actions.marvinBudord,"visa stentavla 1", "budord", "#1")
+143        self.assertActionSilent(marvin_actions.marvinBudord, "var är stentavlan?")
+144
+145    def testQuote(self):
+146        """Test that marvin can quote The Hitchhikers Guide to the Galaxy"""
+147        with mock.patch("marvin_actions.random") as r:
+148            r.randint.return_value = 1
+149            self.assertStringsOutput(marvin_actions.marvinQuote, "ge os ett citat", "hitchhiker", 1)
+150            self.assertStringsOutput(marvin_actions.marvinQuote, "filosofi", "hitchhiker", 1)
+151            self.assertStringsOutput(marvin_actions.marvinQuote, "filosofera", "hitchhiker", 1)
+152            self.assertActionSilent(marvin_actions.marvinQuote, "noquote")
+153
+154            for i,_ in enumerate(self.strings.get("hitchhiker")):
+155                r.randint.return_value = i
+156                self.assertStringsOutput(marvin_actions.marvinQuote, "quote", "hitchhiker", i)
+157
+158    def testVideoOfToday(self):
+159        """Test that marvin can link to a different video each day of the week"""
+160        with mock.patch("marvin_actions.datetime") as dt:
+161            for d in range(1, 8):
+162                dt.date.weekday.return_value = d - 1
+163                day =  self.strings.get("weekdays").get(str(d))
+164                video = self.strings.get("video-of-today").get(str(d))
+165                response = f"{day} En passande video är {video}"
+166                self.assertActionOutput(marvin_actions.marvinVideoOfToday, "dagens video", response)
+167        self.assertActionSilent(marvin_actions.marvinVideoOfToday, "videoidag")
+168
+169    def testHelp(self):
+170        """Test that marvin can provide a help menu"""
+171        self.assertStringsOutput(marvin_actions.marvinHelp, "help", "menu")
+172        self.assertActionSilent(marvin_actions.marvinHelp, "halp")
+173
+174    def testStats(self):
+175        """Test that marvin can provide a link to the IRC stats page"""
+176        self.assertStringsOutput(marvin_actions.marvinStats, "stats", "ircstats")
+177        self.assertActionSilent(marvin_actions.marvinStats, "statistics")
+178
+179    def testIRCLog(self):
+180        """Test that marvin can provide a link to the IRC log"""
+181        self.assertStringsOutput(marvin_actions.marvinIrcLog, "irc", "irclog")
+182        self.assertActionSilent(marvin_actions.marvinIrcLog, "ircstats")
+183
+184    def testSayHi(self):
+185        """Test that marvin responds to greetings"""
+186        with mock.patch("marvin_actions.random") as r:
+187            for skey, s in enumerate(self.strings.get("smile")):
+188                for hkey, h in enumerate(self.strings.get("hello")):
+189                    for fkey, f in enumerate(self.strings.get("friendly")):
+190                        r.randint.side_effect = [skey, hkey, fkey]
+191                        self.assertActionOutput(marvin_actions.marvinSayHi, "hej", f"{s} {h} {f}")
+192        self.assertActionSilent(marvin_actions.marvinSayHi, "korsning")
+193
+194    def testLunchLocations(self):
+195        """Test that marvin can provide lunch suggestions for certain places"""
+196        locations = ["karlskrona", "goteborg", "angelholm", "hassleholm", "malmo"]
+197        with mock.patch("marvin_actions.random") as r:
+198            for location in locations:
+199                for index, place in enumerate(self.strings.get(f"lunch-{location}")):
+200                    r.randint.side_effect = [0, index]
+201                    self.assertActionOutput(
+202                        marvin_actions.marvinLunch, f"mat {location}", f"Ska vi ta {place}?")
+203            r.randint.side_effect = [1, 2]
+204            self.assertActionOutput(
+205                marvin_actions.marvinLunch, "dags att luncha", "Jag är lite sugen på Indiska?")
+206        self.assertActionSilent(marvin_actions.marvinLunch, "matdags")
+207
+208    def testStrip(self):
+209        """Test that marvin can recommend comics"""
+210        messageFormat = self.strings.get("commitstrip").get("message")
+211        expected = messageFormat.format(url=self.strings.get("commitstrip").get("url"))
+212        self.assertActionOutput(marvin_actions.marvinStrip, "lite strip kanske?", expected)
+213        self.assertActionSilent(marvin_actions.marvinStrip, "nostrip")
+214
+215    def testRandomStrip(self):
+216        """Test that marvin can recommend random comics"""
+217        messageFormat = self.strings.get("commitstrip").get("message")
+218        expected = messageFormat.format(url=self.strings.get("commitstrip").get("urlPage") + "123")
+219        with mock.patch("marvin_actions.random") as r:
+220            r.randint.return_value = 123
+221            self.assertActionOutput(marvin_actions.marvinStrip, "random strip kanske?", expected)
+222
+223    def testTimeToBBQ(self):
+224        """Test that marvin knows when the next BBQ is"""
+225        self.assertBBQResponse(date(2024, 5, 17), date(2024, 5, 17), "today")
+226        self.assertBBQResponse(date(2024, 5, 16), date(2024, 5, 17), "tomorrow")
+227        self.assertBBQResponse(date(2024, 5, 10), date(2024, 5, 17), "week")
+228        self.assertBBQResponse(date(2024, 5, 1), date(2024, 5, 17), "base")
+229        self.assertBBQResponse(date(2023, 10, 17), date(2024, 5, 17), "eternity")
+230
+231        self.assertBBQResponse(date(2024, 9, 20), date(2024, 9, 20), "today")
+232        self.assertBBQResponse(date(2024, 9, 19), date(2024, 9, 20), "tomorrow")
+233        self.assertBBQResponse(date(2024, 9, 13), date(2024, 9, 20), "week")
+234        self.assertBBQResponse(date(2024, 9, 4), date(2024, 9, 20), "base")
+235
+236    def testNameDayReaction(self):
+237        """Test that marvin only responds to nameday when asked"""
+238        self.assertActionSilent(marvin_actions.marvinNameday, "anything")
+239
+240    def testNameDayRequest(self):
+241        """Test that marvin sends a proper request for nameday info"""
+242        with mock.patch("marvin_actions.requests") as r:
+243            with mock.patch("marvin_actions.datetime") as d:
+244                d.datetime.now.return_value = date(2024, 1, 2)
+245                self.executeAction(marvin_actions.marvinNameday, "namnsdag")
+246                self.assertEqual(r.get.call_args.args[0], "http://api.dryg.net/dagar/v2.1/2024/1/2")
+247
+248    def testNameDayResponse(self):
+249        """Test that marvin properly parses nameday responses"""
+250        self.assertNameDayOutput("single", "Idag har Svea namnsdag")
+251        self.assertNameDayOutput("double", "Idag har Alfred,Alfrida namnsdag")
+252        self.assertNameDayOutput("nobody", "Ingen har namnsdag idag")
+253
+254    def testJokeRequest(self):
+255        """Test that marvin sends a proper request for a joke"""
+256        with mock.patch("marvin_actions.requests") as r:
+257            self.executeAction(marvin_actions.marvinJoke, "joke")
+258            self.assertEqual(r.get.call_args.args[0], "https://api.chucknorris.io/jokes/random?category=dev")
+259
+260    def testJoke(self):
+261        """Test that marvin sends a joke when requested"""
+262        self.assertJokeOutput("joke", "There is no Esc key on Chuck Norris' keyboard, because no one escapes Chuck Norris.")
+263
+264    def testUptime(self):
+265        """Test that marvin can provide the link to the uptime tournament"""
+266        self.assertStringsOutput(marvin_actions.marvinUptime, "visa lite uptime", "uptime", "info")
+267        self.assertActionSilent(marvin_actions.marvinUptime, "uptimetävling")
+268
+269    def testStream(self):
+270        """Test that marvin can provide the link to the stream"""
+271        self.assertStringsOutput(marvin_actions.marvinStream, "ska mos streama?", "stream", "info")
+272        self.assertActionSilent(marvin_actions.marvinStream, "är mos en streamer?")
+273
+274    def testPrinciple(self):
+275        """Test that marvin can recite some software principles"""
+276        principles = self.strings.get("principle")
+277        for key, value in principles.items():
+278            self.assertActionOutput(marvin_actions.marvinPrinciple, f"princip {key}", value)
+279        with mock.patch("marvin_actions.random") as r:
+280            r.choice.return_value = "dry"
+281            self.assertStringsOutput(marvin_actions.marvinPrinciple, "princip", "principle", "dry")
+282        self.assertActionSilent(marvin_actions.marvinPrinciple, "principlös")
+283
+284    def testCommitRequest(self):
+285        """Test that marvin sends proper requests when generating commit messages"""
+286        with mock.patch("marvin_actions.requests") as r:
+287            self.executeAction(marvin_actions.marvinCommit, "vad skriver man efter commit -m?")
+288            self.assertEqual(r.get.call_args.args[0], "http://whatthecommit.com/index.txt")
+289
+290    def testCommitResponse(self):
+291        """Test that marvin properly handles responses when generating commit messages"""
+292        message = "Secret sauce #9"
+293        response = requests.models.Response()
+294        response._content = str.encode(message)
+295        with mock.patch("marvin_actions.requests") as r:
+296            r.get.return_value = response
+297            expected = f"Använd detta meddelandet: '{message}'"
+298            self.assertActionOutput(marvin_actions.marvinCommit, "commit", expected)
+299
+300    def testMorning(self):
+301        """Test that marvin wishes good morning, at most once per day"""
+302        marvin_general_actions.lastDateGreeted = None
+303        with mock.patch("marvin_general_actions.datetime") as d:
+304            d.date.today.return_value = date(2024, 5, 17)
+305            with mock.patch("marvin_general_actions.random") as r:
+306                r.choice.return_value = "Morgon"
+307                self.assertActionOutput(marvin_general_actions.marvinMorning, "morrn", "Morgon")
+308                # Should only greet once per day
+309                self.assertActionSilent(marvin_general_actions.marvinMorning, "morgon")
+310                # Should greet again tomorrow
+311                d.date.today.return_value = date(2024, 5, 18)
+312                self.assertActionOutput(marvin_general_actions.marvinMorning, "godmorgon", "Morgon")
+
+ + +
+
+ +
+ + class + ActionTest(unittest.case.TestCase): + + + +
+ +
 20class ActionTest(TestCase):
+ 21    """Test Marvin actions"""
+ 22    strings = {}
+ 23
+ 24    @classmethod
+ 25    def setUpClass(cls):
+ 26        with open("marvin_strings.json", encoding="utf-8") as f:
+ 27            cls.strings = json.load(f)
+ 28
+ 29
+ 30    def executeAction(self, action, message):
+ 31        """Execute an action for a message and return the response"""
+ 32        return action(Bot.tokenize(message))
+ 33
+ 34
+ 35    def assertActionOutput(self, action, message, expectedOutput):
+ 36        """Call an action on message and assert expected output"""
+ 37        actualOutput = self.executeAction(action, message)
+ 38
+ 39        self.assertEqual(actualOutput, expectedOutput)
+ 40
+ 41
+ 42    def assertActionSilent(self, action, message):
+ 43        """Call an action with provided message and assert no output"""
+ 44        self.assertActionOutput(action, message, None)
+ 45
+ 46
+ 47    def assertStringsOutput(self, action, message, expectedoutputKey, subkey=None):
+ 48        """Call an action with provided message and assert the output is equal to DB"""
+ 49        expectedOutput = self.strings.get(expectedoutputKey)
+ 50        if subkey is not None:
+ 51            if isinstance(expectedOutput, list):
+ 52                expectedOutput = expectedOutput[subkey]
+ 53            else:
+ 54                expectedOutput = expectedOutput.get(subkey)
+ 55        self.assertActionOutput(action, message, expectedOutput)
+ 56
+ 57
+ 58    def assertBBQResponse(self, todaysDate, bbqDate, expectedMessageKey):
+ 59        """Assert that the proper bbq message is returned, given a date"""
+ 60        url = self.strings.get("barbecue").get("url")
+ 61        message = self.strings.get("barbecue").get(expectedMessageKey)
+ 62        if isinstance(message, list):
+ 63            message = message[1]
+ 64        if expectedMessageKey in ["base", "week", "eternity"]:
+ 65            message = message % bbqDate
+ 66
+ 67        with mock.patch("marvin_actions.datetime") as d:
+ 68            d.date.today.return_value = todaysDate
+ 69            with mock.patch("marvin_actions.random") as r:
+ 70                r.randint.return_value = 1
+ 71                expected = f"{url}. {message}"
+ 72                self.assertActionOutput(marvin_actions.marvinTimeToBBQ, "dags att grilla", expected)
+ 73
+ 74
+ 75    def assertNameDayOutput(self, exampleFile, expectedOutput):
+ 76        """Assert that the proper nameday message is returned, given an inputfile"""
+ 77        with open(f"namedayFiles/{exampleFile}.json", "r", encoding="UTF-8") as f:
+ 78            response = requests.models.Response()
+ 79            response._content = str.encode(json.dumps(json.load(f)))
+ 80            with mock.patch("marvin_actions.requests") as r:
+ 81                r.get.return_value = response
+ 82                self.assertActionOutput(marvin_actions.marvinNameday, "nameday", expectedOutput)
+ 83
+ 84    def assertJokeOutput(self, exampleFile, expectedOutput):
+ 85        """Assert that a joke is returned, given an input file"""
+ 86        with open(f"jokeFiles/{exampleFile}.json", "r", encoding="UTF-8") as f:
+ 87            response = requests.models.Response()
+ 88            response._content = str.encode(json.dumps(json.load(f)))
+ 89            with mock.patch("marvin_actions.requests") as r:
+ 90                r.get.return_value = response
+ 91                self.assertActionOutput(marvin_actions.marvinJoke, "joke", expectedOutput)
+ 92
+ 93    def testSmile(self):
+ 94        """Test that marvin can smile"""
+ 95        with mock.patch("marvin_actions.random") as r:
+ 96            r.randint.return_value = 1
+ 97            self.assertStringsOutput(marvin_actions.marvinSmile, "le lite?", "smile", 1)
+ 98        self.assertActionSilent(marvin_actions.marvinSmile, "sur idag?")
+ 99
+100    def testWhois(self):
+101        """Test that marvin responds to whois"""
+102        self.assertStringsOutput(marvin_actions.marvinWhoIs, "vem är marvin?", "whois")
+103        self.assertActionSilent(marvin_actions.marvinWhoIs, "vemär")
+104
+105    def testGoogle(self):
+106        """Test that marvin can help google stuff"""
+107        with mock.patch("marvin_actions.random") as r:
+108            r.randint.return_value = 1
+109            self.assertActionOutput(
+110                marvin_actions.marvinGoogle,
+111                "kan du googla mos",
+112                "LMGTFY https://www.google.se/search?q=mos")
+113            self.assertActionOutput(
+114                marvin_actions.marvinGoogle,
+115                "kan du googla google mos",
+116                "LMGTFY https://www.google.se/search?q=google+mos")
+117        self.assertActionSilent(marvin_actions.marvinGoogle, "du kan googla")
+118        self.assertActionSilent(marvin_actions.marvinGoogle, "gogool")
+119
+120    def testExplainShell(self):
+121        """Test that marvin can explain shell commands"""
+122        url = "http://explainshell.com/explain?cmd=pwd"
+123        self.assertActionOutput(marvin_actions.marvinExplainShell, "explain pwd", url)
+124        self.assertActionOutput(marvin_actions.marvinExplainShell, "can you explain pwd", url)
+125        self.assertActionOutput(
+126            marvin_actions.marvinExplainShell,
+127            "förklara pwd|grep -o $user",
+128            f"{url}%7Cgrep+-o+%24user")
+129
+130        self.assertActionSilent(marvin_actions.marvinExplainShell, "explains")
+131
+132    def testSource(self):
+133        """Test that marvin responds to questions about source code"""
+134        self.assertStringsOutput(marvin_actions.marvinSource, "source", "source")
+135        self.assertStringsOutput(marvin_actions.marvinSource, "källkod", "source")
+136        self.assertActionSilent(marvin_actions.marvinSource, "opensource")
+137
+138    def testBudord(self):
+139        """Test that marvin knows all the commandments"""
+140        for n in range(1, 5):
+141            self.assertStringsOutput(marvin_actions.marvinBudord, f"budord #{n}", "budord", f"#{n}")
+142
+143        self.assertStringsOutput(marvin_actions.marvinBudord,"visa stentavla 1", "budord", "#1")
+144        self.assertActionSilent(marvin_actions.marvinBudord, "var är stentavlan?")
+145
+146    def testQuote(self):
+147        """Test that marvin can quote The Hitchhikers Guide to the Galaxy"""
+148        with mock.patch("marvin_actions.random") as r:
+149            r.randint.return_value = 1
+150            self.assertStringsOutput(marvin_actions.marvinQuote, "ge os ett citat", "hitchhiker", 1)
+151            self.assertStringsOutput(marvin_actions.marvinQuote, "filosofi", "hitchhiker", 1)
+152            self.assertStringsOutput(marvin_actions.marvinQuote, "filosofera", "hitchhiker", 1)
+153            self.assertActionSilent(marvin_actions.marvinQuote, "noquote")
+154
+155            for i,_ in enumerate(self.strings.get("hitchhiker")):
+156                r.randint.return_value = i
+157                self.assertStringsOutput(marvin_actions.marvinQuote, "quote", "hitchhiker", i)
+158
+159    def testVideoOfToday(self):
+160        """Test that marvin can link to a different video each day of the week"""
+161        with mock.patch("marvin_actions.datetime") as dt:
+162            for d in range(1, 8):
+163                dt.date.weekday.return_value = d - 1
+164                day =  self.strings.get("weekdays").get(str(d))
+165                video = self.strings.get("video-of-today").get(str(d))
+166                response = f"{day} En passande video är {video}"
+167                self.assertActionOutput(marvin_actions.marvinVideoOfToday, "dagens video", response)
+168        self.assertActionSilent(marvin_actions.marvinVideoOfToday, "videoidag")
+169
+170    def testHelp(self):
+171        """Test that marvin can provide a help menu"""
+172        self.assertStringsOutput(marvin_actions.marvinHelp, "help", "menu")
+173        self.assertActionSilent(marvin_actions.marvinHelp, "halp")
+174
+175    def testStats(self):
+176        """Test that marvin can provide a link to the IRC stats page"""
+177        self.assertStringsOutput(marvin_actions.marvinStats, "stats", "ircstats")
+178        self.assertActionSilent(marvin_actions.marvinStats, "statistics")
+179
+180    def testIRCLog(self):
+181        """Test that marvin can provide a link to the IRC log"""
+182        self.assertStringsOutput(marvin_actions.marvinIrcLog, "irc", "irclog")
+183        self.assertActionSilent(marvin_actions.marvinIrcLog, "ircstats")
+184
+185    def testSayHi(self):
+186        """Test that marvin responds to greetings"""
+187        with mock.patch("marvin_actions.random") as r:
+188            for skey, s in enumerate(self.strings.get("smile")):
+189                for hkey, h in enumerate(self.strings.get("hello")):
+190                    for fkey, f in enumerate(self.strings.get("friendly")):
+191                        r.randint.side_effect = [skey, hkey, fkey]
+192                        self.assertActionOutput(marvin_actions.marvinSayHi, "hej", f"{s} {h} {f}")
+193        self.assertActionSilent(marvin_actions.marvinSayHi, "korsning")
+194
+195    def testLunchLocations(self):
+196        """Test that marvin can provide lunch suggestions for certain places"""
+197        locations = ["karlskrona", "goteborg", "angelholm", "hassleholm", "malmo"]
+198        with mock.patch("marvin_actions.random") as r:
+199            for location in locations:
+200                for index, place in enumerate(self.strings.get(f"lunch-{location}")):
+201                    r.randint.side_effect = [0, index]
+202                    self.assertActionOutput(
+203                        marvin_actions.marvinLunch, f"mat {location}", f"Ska vi ta {place}?")
+204            r.randint.side_effect = [1, 2]
+205            self.assertActionOutput(
+206                marvin_actions.marvinLunch, "dags att luncha", "Jag är lite sugen på Indiska?")
+207        self.assertActionSilent(marvin_actions.marvinLunch, "matdags")
+208
+209    def testStrip(self):
+210        """Test that marvin can recommend comics"""
+211        messageFormat = self.strings.get("commitstrip").get("message")
+212        expected = messageFormat.format(url=self.strings.get("commitstrip").get("url"))
+213        self.assertActionOutput(marvin_actions.marvinStrip, "lite strip kanske?", expected)
+214        self.assertActionSilent(marvin_actions.marvinStrip, "nostrip")
+215
+216    def testRandomStrip(self):
+217        """Test that marvin can recommend random comics"""
+218        messageFormat = self.strings.get("commitstrip").get("message")
+219        expected = messageFormat.format(url=self.strings.get("commitstrip").get("urlPage") + "123")
+220        with mock.patch("marvin_actions.random") as r:
+221            r.randint.return_value = 123
+222            self.assertActionOutput(marvin_actions.marvinStrip, "random strip kanske?", expected)
+223
+224    def testTimeToBBQ(self):
+225        """Test that marvin knows when the next BBQ is"""
+226        self.assertBBQResponse(date(2024, 5, 17), date(2024, 5, 17), "today")
+227        self.assertBBQResponse(date(2024, 5, 16), date(2024, 5, 17), "tomorrow")
+228        self.assertBBQResponse(date(2024, 5, 10), date(2024, 5, 17), "week")
+229        self.assertBBQResponse(date(2024, 5, 1), date(2024, 5, 17), "base")
+230        self.assertBBQResponse(date(2023, 10, 17), date(2024, 5, 17), "eternity")
+231
+232        self.assertBBQResponse(date(2024, 9, 20), date(2024, 9, 20), "today")
+233        self.assertBBQResponse(date(2024, 9, 19), date(2024, 9, 20), "tomorrow")
+234        self.assertBBQResponse(date(2024, 9, 13), date(2024, 9, 20), "week")
+235        self.assertBBQResponse(date(2024, 9, 4), date(2024, 9, 20), "base")
+236
+237    def testNameDayReaction(self):
+238        """Test that marvin only responds to nameday when asked"""
+239        self.assertActionSilent(marvin_actions.marvinNameday, "anything")
+240
+241    def testNameDayRequest(self):
+242        """Test that marvin sends a proper request for nameday info"""
+243        with mock.patch("marvin_actions.requests") as r:
+244            with mock.patch("marvin_actions.datetime") as d:
+245                d.datetime.now.return_value = date(2024, 1, 2)
+246                self.executeAction(marvin_actions.marvinNameday, "namnsdag")
+247                self.assertEqual(r.get.call_args.args[0], "http://api.dryg.net/dagar/v2.1/2024/1/2")
+248
+249    def testNameDayResponse(self):
+250        """Test that marvin properly parses nameday responses"""
+251        self.assertNameDayOutput("single", "Idag har Svea namnsdag")
+252        self.assertNameDayOutput("double", "Idag har Alfred,Alfrida namnsdag")
+253        self.assertNameDayOutput("nobody", "Ingen har namnsdag idag")
+254
+255    def testJokeRequest(self):
+256        """Test that marvin sends a proper request for a joke"""
+257        with mock.patch("marvin_actions.requests") as r:
+258            self.executeAction(marvin_actions.marvinJoke, "joke")
+259            self.assertEqual(r.get.call_args.args[0], "https://api.chucknorris.io/jokes/random?category=dev")
+260
+261    def testJoke(self):
+262        """Test that marvin sends a joke when requested"""
+263        self.assertJokeOutput("joke", "There is no Esc key on Chuck Norris' keyboard, because no one escapes Chuck Norris.")
+264
+265    def testUptime(self):
+266        """Test that marvin can provide the link to the uptime tournament"""
+267        self.assertStringsOutput(marvin_actions.marvinUptime, "visa lite uptime", "uptime", "info")
+268        self.assertActionSilent(marvin_actions.marvinUptime, "uptimetävling")
+269
+270    def testStream(self):
+271        """Test that marvin can provide the link to the stream"""
+272        self.assertStringsOutput(marvin_actions.marvinStream, "ska mos streama?", "stream", "info")
+273        self.assertActionSilent(marvin_actions.marvinStream, "är mos en streamer?")
+274
+275    def testPrinciple(self):
+276        """Test that marvin can recite some software principles"""
+277        principles = self.strings.get("principle")
+278        for key, value in principles.items():
+279            self.assertActionOutput(marvin_actions.marvinPrinciple, f"princip {key}", value)
+280        with mock.patch("marvin_actions.random") as r:
+281            r.choice.return_value = "dry"
+282            self.assertStringsOutput(marvin_actions.marvinPrinciple, "princip", "principle", "dry")
+283        self.assertActionSilent(marvin_actions.marvinPrinciple, "principlös")
+284
+285    def testCommitRequest(self):
+286        """Test that marvin sends proper requests when generating commit messages"""
+287        with mock.patch("marvin_actions.requests") as r:
+288            self.executeAction(marvin_actions.marvinCommit, "vad skriver man efter commit -m?")
+289            self.assertEqual(r.get.call_args.args[0], "http://whatthecommit.com/index.txt")
+290
+291    def testCommitResponse(self):
+292        """Test that marvin properly handles responses when generating commit messages"""
+293        message = "Secret sauce #9"
+294        response = requests.models.Response()
+295        response._content = str.encode(message)
+296        with mock.patch("marvin_actions.requests") as r:
+297            r.get.return_value = response
+298            expected = f"Använd detta meddelandet: '{message}'"
+299            self.assertActionOutput(marvin_actions.marvinCommit, "commit", expected)
+300
+301    def testMorning(self):
+302        """Test that marvin wishes good morning, at most once per day"""
+303        marvin_general_actions.lastDateGreeted = None
+304        with mock.patch("marvin_general_actions.datetime") as d:
+305            d.date.today.return_value = date(2024, 5, 17)
+306            with mock.patch("marvin_general_actions.random") as r:
+307                r.choice.return_value = "Morgon"
+308                self.assertActionOutput(marvin_general_actions.marvinMorning, "morrn", "Morgon")
+309                # Should only greet once per day
+310                self.assertActionSilent(marvin_general_actions.marvinMorning, "morgon")
+311                # Should greet again tomorrow
+312                d.date.today.return_value = date(2024, 5, 18)
+313                self.assertActionOutput(marvin_general_actions.marvinMorning, "godmorgon", "Morgon")
+
+ + +

Test Marvin actions

+
+ + +
+
+ strings = +{} + + +
+ + + + +
+
+ +
+
@classmethod
+ + def + setUpClass(cls): + + + +
+ +
24    @classmethod
+25    def setUpClass(cls):
+26        with open("marvin_strings.json", encoding="utf-8") as f:
+27            cls.strings = json.load(f)
+
+ + +

Hook method for setting up class fixture before running tests in the class.

+
+ + +
+
+ +
+ + def + executeAction(self, action, message): + + + +
+ +
30    def executeAction(self, action, message):
+31        """Execute an action for a message and return the response"""
+32        return action(Bot.tokenize(message))
+
+ + +

Execute an action for a message and return the response

+
+ + +
+
+ +
+ + def + assertActionOutput(self, action, message, expectedOutput): + + + +
+ +
35    def assertActionOutput(self, action, message, expectedOutput):
+36        """Call an action on message and assert expected output"""
+37        actualOutput = self.executeAction(action, message)
+38
+39        self.assertEqual(actualOutput, expectedOutput)
+
+ + +

Call an action on message and assert expected output

+
+ + +
+
+ +
+ + def + assertActionSilent(self, action, message): + + + +
+ +
42    def assertActionSilent(self, action, message):
+43        """Call an action with provided message and assert no output"""
+44        self.assertActionOutput(action, message, None)
+
+ + +

Call an action with provided message and assert no output

+
+ + +
+
+ +
+ + def + assertStringsOutput(self, action, message, expectedoutputKey, subkey=None): + + + +
+ +
47    def assertStringsOutput(self, action, message, expectedoutputKey, subkey=None):
+48        """Call an action with provided message and assert the output is equal to DB"""
+49        expectedOutput = self.strings.get(expectedoutputKey)
+50        if subkey is not None:
+51            if isinstance(expectedOutput, list):
+52                expectedOutput = expectedOutput[subkey]
+53            else:
+54                expectedOutput = expectedOutput.get(subkey)
+55        self.assertActionOutput(action, message, expectedOutput)
+
+ + +

Call an action with provided message and assert the output is equal to DB

+
+ + +
+
+ +
+ + def + assertBBQResponse(self, todaysDate, bbqDate, expectedMessageKey): + + + +
+ +
58    def assertBBQResponse(self, todaysDate, bbqDate, expectedMessageKey):
+59        """Assert that the proper bbq message is returned, given a date"""
+60        url = self.strings.get("barbecue").get("url")
+61        message = self.strings.get("barbecue").get(expectedMessageKey)
+62        if isinstance(message, list):
+63            message = message[1]
+64        if expectedMessageKey in ["base", "week", "eternity"]:
+65            message = message % bbqDate
+66
+67        with mock.patch("marvin_actions.datetime") as d:
+68            d.date.today.return_value = todaysDate
+69            with mock.patch("marvin_actions.random") as r:
+70                r.randint.return_value = 1
+71                expected = f"{url}. {message}"
+72                self.assertActionOutput(marvin_actions.marvinTimeToBBQ, "dags att grilla", expected)
+
+ + +

Assert that the proper bbq message is returned, given a date

+
+ + +
+
+ +
+ + def + assertNameDayOutput(self, exampleFile, expectedOutput): + + + +
+ +
75    def assertNameDayOutput(self, exampleFile, expectedOutput):
+76        """Assert that the proper nameday message is returned, given an inputfile"""
+77        with open(f"namedayFiles/{exampleFile}.json", "r", encoding="UTF-8") as f:
+78            response = requests.models.Response()
+79            response._content = str.encode(json.dumps(json.load(f)))
+80            with mock.patch("marvin_actions.requests") as r:
+81                r.get.return_value = response
+82                self.assertActionOutput(marvin_actions.marvinNameday, "nameday", expectedOutput)
+
+ + +

Assert that the proper nameday message is returned, given an inputfile

+
+ + +
+
+ +
+ + def + assertJokeOutput(self, exampleFile, expectedOutput): + + + +
+ +
84    def assertJokeOutput(self, exampleFile, expectedOutput):
+85        """Assert that a joke is returned, given an input file"""
+86        with open(f"jokeFiles/{exampleFile}.json", "r", encoding="UTF-8") as f:
+87            response = requests.models.Response()
+88            response._content = str.encode(json.dumps(json.load(f)))
+89            with mock.patch("marvin_actions.requests") as r:
+90                r.get.return_value = response
+91                self.assertActionOutput(marvin_actions.marvinJoke, "joke", expectedOutput)
+
+ + +

Assert that a joke is returned, given an input file

+
+ + +
+
+ +
+ + def + testSmile(self): + + + +
+ +
93    def testSmile(self):
+94        """Test that marvin can smile"""
+95        with mock.patch("marvin_actions.random") as r:
+96            r.randint.return_value = 1
+97            self.assertStringsOutput(marvin_actions.marvinSmile, "le lite?", "smile", 1)
+98        self.assertActionSilent(marvin_actions.marvinSmile, "sur idag?")
+
+ + +

Test that marvin can smile

+
+ + +
+
+ +
+ + def + testWhois(self): + + + +
+ +
100    def testWhois(self):
+101        """Test that marvin responds to whois"""
+102        self.assertStringsOutput(marvin_actions.marvinWhoIs, "vem är marvin?", "whois")
+103        self.assertActionSilent(marvin_actions.marvinWhoIs, "vemär")
+
+ + +

Test that marvin responds to whois

+
+ + +
+
+ +
+ + def + testGoogle(self): + + + +
+ +
105    def testGoogle(self):
+106        """Test that marvin can help google stuff"""
+107        with mock.patch("marvin_actions.random") as r:
+108            r.randint.return_value = 1
+109            self.assertActionOutput(
+110                marvin_actions.marvinGoogle,
+111                "kan du googla mos",
+112                "LMGTFY https://www.google.se/search?q=mos")
+113            self.assertActionOutput(
+114                marvin_actions.marvinGoogle,
+115                "kan du googla google mos",
+116                "LMGTFY https://www.google.se/search?q=google+mos")
+117        self.assertActionSilent(marvin_actions.marvinGoogle, "du kan googla")
+118        self.assertActionSilent(marvin_actions.marvinGoogle, "gogool")
+
+ + +

Test that marvin can help google stuff

+
+ + +
+
+ +
+ + def + testExplainShell(self): + + + +
+ +
120    def testExplainShell(self):
+121        """Test that marvin can explain shell commands"""
+122        url = "http://explainshell.com/explain?cmd=pwd"
+123        self.assertActionOutput(marvin_actions.marvinExplainShell, "explain pwd", url)
+124        self.assertActionOutput(marvin_actions.marvinExplainShell, "can you explain pwd", url)
+125        self.assertActionOutput(
+126            marvin_actions.marvinExplainShell,
+127            "förklara pwd|grep -o $user",
+128            f"{url}%7Cgrep+-o+%24user")
+129
+130        self.assertActionSilent(marvin_actions.marvinExplainShell, "explains")
+
+ + +

Test that marvin can explain shell commands

+
+ + +
+
+ +
+ + def + testSource(self): + + + +
+ +
132    def testSource(self):
+133        """Test that marvin responds to questions about source code"""
+134        self.assertStringsOutput(marvin_actions.marvinSource, "source", "source")
+135        self.assertStringsOutput(marvin_actions.marvinSource, "källkod", "source")
+136        self.assertActionSilent(marvin_actions.marvinSource, "opensource")
+
+ + +

Test that marvin responds to questions about source code

+
+ + +
+
+ +
+ + def + testBudord(self): + + + +
+ +
138    def testBudord(self):
+139        """Test that marvin knows all the commandments"""
+140        for n in range(1, 5):
+141            self.assertStringsOutput(marvin_actions.marvinBudord, f"budord #{n}", "budord", f"#{n}")
+142
+143        self.assertStringsOutput(marvin_actions.marvinBudord,"visa stentavla 1", "budord", "#1")
+144        self.assertActionSilent(marvin_actions.marvinBudord, "var är stentavlan?")
+
+ + +

Test that marvin knows all the commandments

+
+ + +
+
+ +
+ + def + testQuote(self): + + + +
+ +
146    def testQuote(self):
+147        """Test that marvin can quote The Hitchhikers Guide to the Galaxy"""
+148        with mock.patch("marvin_actions.random") as r:
+149            r.randint.return_value = 1
+150            self.assertStringsOutput(marvin_actions.marvinQuote, "ge os ett citat", "hitchhiker", 1)
+151            self.assertStringsOutput(marvin_actions.marvinQuote, "filosofi", "hitchhiker", 1)
+152            self.assertStringsOutput(marvin_actions.marvinQuote, "filosofera", "hitchhiker", 1)
+153            self.assertActionSilent(marvin_actions.marvinQuote, "noquote")
+154
+155            for i,_ in enumerate(self.strings.get("hitchhiker")):
+156                r.randint.return_value = i
+157                self.assertStringsOutput(marvin_actions.marvinQuote, "quote", "hitchhiker", i)
+
+ + +

Test that marvin can quote The Hitchhikers Guide to the Galaxy

+
+ + +
+
+ +
+ + def + testVideoOfToday(self): + + + +
+ +
159    def testVideoOfToday(self):
+160        """Test that marvin can link to a different video each day of the week"""
+161        with mock.patch("marvin_actions.datetime") as dt:
+162            for d in range(1, 8):
+163                dt.date.weekday.return_value = d - 1
+164                day =  self.strings.get("weekdays").get(str(d))
+165                video = self.strings.get("video-of-today").get(str(d))
+166                response = f"{day} En passande video är {video}"
+167                self.assertActionOutput(marvin_actions.marvinVideoOfToday, "dagens video", response)
+168        self.assertActionSilent(marvin_actions.marvinVideoOfToday, "videoidag")
+
+ + +

Test that marvin can link to a different video each day of the week

+
+ + +
+
+ +
+ + def + testHelp(self): + + + +
+ +
170    def testHelp(self):
+171        """Test that marvin can provide a help menu"""
+172        self.assertStringsOutput(marvin_actions.marvinHelp, "help", "menu")
+173        self.assertActionSilent(marvin_actions.marvinHelp, "halp")
+
+ + +

Test that marvin can provide a help menu

+
+ + +
+
+ +
+ + def + testStats(self): + + + +
+ +
175    def testStats(self):
+176        """Test that marvin can provide a link to the IRC stats page"""
+177        self.assertStringsOutput(marvin_actions.marvinStats, "stats", "ircstats")
+178        self.assertActionSilent(marvin_actions.marvinStats, "statistics")
+
+ + +

Test that marvin can provide a link to the IRC stats page

+
+ + +
+
+ +
+ + def + testIRCLog(self): + + + +
+ +
180    def testIRCLog(self):
+181        """Test that marvin can provide a link to the IRC log"""
+182        self.assertStringsOutput(marvin_actions.marvinIrcLog, "irc", "irclog")
+183        self.assertActionSilent(marvin_actions.marvinIrcLog, "ircstats")
+
+ + +

Test that marvin can provide a link to the IRC log

+
+ + +
+
+ +
+ + def + testSayHi(self): + + + +
+ +
185    def testSayHi(self):
+186        """Test that marvin responds to greetings"""
+187        with mock.patch("marvin_actions.random") as r:
+188            for skey, s in enumerate(self.strings.get("smile")):
+189                for hkey, h in enumerate(self.strings.get("hello")):
+190                    for fkey, f in enumerate(self.strings.get("friendly")):
+191                        r.randint.side_effect = [skey, hkey, fkey]
+192                        self.assertActionOutput(marvin_actions.marvinSayHi, "hej", f"{s} {h} {f}")
+193        self.assertActionSilent(marvin_actions.marvinSayHi, "korsning")
+
+ + +

Test that marvin responds to greetings

+
+ + +
+
+ +
+ + def + testLunchLocations(self): + + + +
+ +
195    def testLunchLocations(self):
+196        """Test that marvin can provide lunch suggestions for certain places"""
+197        locations = ["karlskrona", "goteborg", "angelholm", "hassleholm", "malmo"]
+198        with mock.patch("marvin_actions.random") as r:
+199            for location in locations:
+200                for index, place in enumerate(self.strings.get(f"lunch-{location}")):
+201                    r.randint.side_effect = [0, index]
+202                    self.assertActionOutput(
+203                        marvin_actions.marvinLunch, f"mat {location}", f"Ska vi ta {place}?")
+204            r.randint.side_effect = [1, 2]
+205            self.assertActionOutput(
+206                marvin_actions.marvinLunch, "dags att luncha", "Jag är lite sugen på Indiska?")
+207        self.assertActionSilent(marvin_actions.marvinLunch, "matdags")
+
+ + +

Test that marvin can provide lunch suggestions for certain places

+
+ + +
+
+ +
+ + def + testStrip(self): + + + +
+ +
209    def testStrip(self):
+210        """Test that marvin can recommend comics"""
+211        messageFormat = self.strings.get("commitstrip").get("message")
+212        expected = messageFormat.format(url=self.strings.get("commitstrip").get("url"))
+213        self.assertActionOutput(marvin_actions.marvinStrip, "lite strip kanske?", expected)
+214        self.assertActionSilent(marvin_actions.marvinStrip, "nostrip")
+
+ + +

Test that marvin can recommend comics

+
+ + +
+
+ +
+ + def + testRandomStrip(self): + + + +
+ +
216    def testRandomStrip(self):
+217        """Test that marvin can recommend random comics"""
+218        messageFormat = self.strings.get("commitstrip").get("message")
+219        expected = messageFormat.format(url=self.strings.get("commitstrip").get("urlPage") + "123")
+220        with mock.patch("marvin_actions.random") as r:
+221            r.randint.return_value = 123
+222            self.assertActionOutput(marvin_actions.marvinStrip, "random strip kanske?", expected)
+
+ + +

Test that marvin can recommend random comics

+
+ + +
+
+ +
+ + def + testTimeToBBQ(self): + + + +
+ +
224    def testTimeToBBQ(self):
+225        """Test that marvin knows when the next BBQ is"""
+226        self.assertBBQResponse(date(2024, 5, 17), date(2024, 5, 17), "today")
+227        self.assertBBQResponse(date(2024, 5, 16), date(2024, 5, 17), "tomorrow")
+228        self.assertBBQResponse(date(2024, 5, 10), date(2024, 5, 17), "week")
+229        self.assertBBQResponse(date(2024, 5, 1), date(2024, 5, 17), "base")
+230        self.assertBBQResponse(date(2023, 10, 17), date(2024, 5, 17), "eternity")
+231
+232        self.assertBBQResponse(date(2024, 9, 20), date(2024, 9, 20), "today")
+233        self.assertBBQResponse(date(2024, 9, 19), date(2024, 9, 20), "tomorrow")
+234        self.assertBBQResponse(date(2024, 9, 13), date(2024, 9, 20), "week")
+235        self.assertBBQResponse(date(2024, 9, 4), date(2024, 9, 20), "base")
+
+ + +

Test that marvin knows when the next BBQ is

+
+ + +
+
+ +
+ + def + testNameDayReaction(self): + + + +
+ +
237    def testNameDayReaction(self):
+238        """Test that marvin only responds to nameday when asked"""
+239        self.assertActionSilent(marvin_actions.marvinNameday, "anything")
+
+ + +

Test that marvin only responds to nameday when asked

+
+ + +
+
+ +
+ + def + testNameDayRequest(self): + + + +
+ +
241    def testNameDayRequest(self):
+242        """Test that marvin sends a proper request for nameday info"""
+243        with mock.patch("marvin_actions.requests") as r:
+244            with mock.patch("marvin_actions.datetime") as d:
+245                d.datetime.now.return_value = date(2024, 1, 2)
+246                self.executeAction(marvin_actions.marvinNameday, "namnsdag")
+247                self.assertEqual(r.get.call_args.args[0], "http://api.dryg.net/dagar/v2.1/2024/1/2")
+
+ + +

Test that marvin sends a proper request for nameday info

+
+ + +
+
+ +
+ + def + testNameDayResponse(self): + + + +
+ +
249    def testNameDayResponse(self):
+250        """Test that marvin properly parses nameday responses"""
+251        self.assertNameDayOutput("single", "Idag har Svea namnsdag")
+252        self.assertNameDayOutput("double", "Idag har Alfred,Alfrida namnsdag")
+253        self.assertNameDayOutput("nobody", "Ingen har namnsdag idag")
+
+ + +

Test that marvin properly parses nameday responses

+
+ + +
+
+ +
+ + def + testJokeRequest(self): + + + +
+ +
255    def testJokeRequest(self):
+256        """Test that marvin sends a proper request for a joke"""
+257        with mock.patch("marvin_actions.requests") as r:
+258            self.executeAction(marvin_actions.marvinJoke, "joke")
+259            self.assertEqual(r.get.call_args.args[0], "https://api.chucknorris.io/jokes/random?category=dev")
+
+ + +

Test that marvin sends a proper request for a joke

+
+ + +
+
+ +
+ + def + testJoke(self): + + + +
+ +
261    def testJoke(self):
+262        """Test that marvin sends a joke when requested"""
+263        self.assertJokeOutput("joke", "There is no Esc key on Chuck Norris' keyboard, because no one escapes Chuck Norris.")
+
+ + +

Test that marvin sends a joke when requested

+
+ + +
+
+ +
+ + def + testUptime(self): + + + +
+ +
265    def testUptime(self):
+266        """Test that marvin can provide the link to the uptime tournament"""
+267        self.assertStringsOutput(marvin_actions.marvinUptime, "visa lite uptime", "uptime", "info")
+268        self.assertActionSilent(marvin_actions.marvinUptime, "uptimetävling")
+
+ + +

Test that marvin can provide the link to the uptime tournament

+
+ + +
+
+ +
+ + def + testStream(self): + + + +
+ +
270    def testStream(self):
+271        """Test that marvin can provide the link to the stream"""
+272        self.assertStringsOutput(marvin_actions.marvinStream, "ska mos streama?", "stream", "info")
+273        self.assertActionSilent(marvin_actions.marvinStream, "är mos en streamer?")
+
+ + +

Test that marvin can provide the link to the stream

+
+ + +
+
+ +
+ + def + testPrinciple(self): + + + +
+ +
275    def testPrinciple(self):
+276        """Test that marvin can recite some software principles"""
+277        principles = self.strings.get("principle")
+278        for key, value in principles.items():
+279            self.assertActionOutput(marvin_actions.marvinPrinciple, f"princip {key}", value)
+280        with mock.patch("marvin_actions.random") as r:
+281            r.choice.return_value = "dry"
+282            self.assertStringsOutput(marvin_actions.marvinPrinciple, "princip", "principle", "dry")
+283        self.assertActionSilent(marvin_actions.marvinPrinciple, "principlös")
+
+ + +

Test that marvin can recite some software principles

+
+ + +
+
+ +
+ + def + testCommitRequest(self): + + + +
+ +
285    def testCommitRequest(self):
+286        """Test that marvin sends proper requests when generating commit messages"""
+287        with mock.patch("marvin_actions.requests") as r:
+288            self.executeAction(marvin_actions.marvinCommit, "vad skriver man efter commit -m?")
+289            self.assertEqual(r.get.call_args.args[0], "http://whatthecommit.com/index.txt")
+
+ + +

Test that marvin sends proper requests when generating commit messages

+
+ + +
+
+ +
+ + def + testCommitResponse(self): + + + +
+ +
291    def testCommitResponse(self):
+292        """Test that marvin properly handles responses when generating commit messages"""
+293        message = "Secret sauce #9"
+294        response = requests.models.Response()
+295        response._content = str.encode(message)
+296        with mock.patch("marvin_actions.requests") as r:
+297            r.get.return_value = response
+298            expected = f"Använd detta meddelandet: '{message}'"
+299            self.assertActionOutput(marvin_actions.marvinCommit, "commit", expected)
+
+ + +

Test that marvin properly handles responses when generating commit messages

+
+ + +
+
+ +
+ + def + testMorning(self): + + + +
+ +
301    def testMorning(self):
+302        """Test that marvin wishes good morning, at most once per day"""
+303        marvin_general_actions.lastDateGreeted = None
+304        with mock.patch("marvin_general_actions.datetime") as d:
+305            d.date.today.return_value = date(2024, 5, 17)
+306            with mock.patch("marvin_general_actions.random") as r:
+307                r.choice.return_value = "Morgon"
+308                self.assertActionOutput(marvin_general_actions.marvinMorning, "morrn", "Morgon")
+309                # Should only greet once per day
+310                self.assertActionSilent(marvin_general_actions.marvinMorning, "morgon")
+311                # Should greet again tomorrow
+312                d.date.today.return_value = date(2024, 5, 18)
+313                self.assertActionOutput(marvin_general_actions.marvinMorning, "godmorgon", "Morgon")
+
+ + +

Test that marvin wishes good morning, at most once per day

+
+ + +
+
+
Inherited Members
+
+
unittest.case.TestCase
+
TestCase
+
failureException
+
longMessage
+
maxDiff
+
addTypeEqualityFunc
+
addCleanup
+
enterContext
+
addClassCleanup
+
enterClassContext
+
setUp
+
tearDown
+
tearDownClass
+
countTestCases
+
defaultTestResult
+
shortDescription
+
id
+
subTest
+
run
+
doCleanups
+
doClassCleanups
+
debug
+
skipTest
+
fail
+
assertFalse
+
assertTrue
+
assertRaises
+
assertWarns
+
assertLogs
+
assertNoLogs
+
assertEqual
+
assertNotEqual
+
assertAlmostEqual
+
assertNotAlmostEqual
+
assertSequenceEqual
+
assertListEqual
+
assertTupleEqual
+
assertSetEqual
+
assertIn
+
assertNotIn
+
assertIs
+
assertIsNot
+
assertDictEqual
+
assertCountEqual
+
assertMultiLineEqual
+
assertLess
+
assertLessEqual
+
assertGreater
+
assertGreaterEqual
+
assertIsNone
+
assertIsNotNone
+
assertIsInstance
+
assertNotIsInstance
+
assertRaisesRegex
+
assertWarnsRegex
+
assertRegex
+
assertNotRegex
+ +
+
+
+
+
+ + \ No newline at end of file