diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 35fbea1..4f23754 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -48,3 +48,34 @@ jobs: uses: ./.github/actions/install - name: Lint with Pylint run: make pylint + + build: + runs-on: ubuntu-24.04 + needs: [install] + steps: + - name: Check out repository + uses: actions/checkout@v4 + - name: Install dependencies + uses: ./.github/actions/install + - name: Build pdoc + id: build + run: make pdoc + - name: Upload pdoc + id: deploy + uses: actions/upload-pages-artifact@v3.0.1 + with: + path: docs + + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-24.04 + needs: build + steps: + - name: Deploy to GitHub Pages + id: deploy + uses: actions/deploy-pages@v4.0.5 + permissions: + id-token: write + pages: write diff --git a/docs/pdoc/bot.html b/docs/pdoc/bot.html deleted file mode 100644 index 122346e..0000000 --- a/docs/pdoc/bot.html +++ /dev/null @@ -1,520 +0,0 @@ - - - - - - - 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 deleted file mode 100644 index 5a08113..0000000 --- a/docs/pdoc/discord_bot.html +++ /dev/null @@ -1,548 +0,0 @@ - - - - - - - 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 deleted file mode 100644 index 5ff61a9..0000000 --- a/docs/pdoc/index.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - - 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 deleted file mode 100644 index 8f68184..0000000 --- a/docs/pdoc/irc_bot.html +++ /dev/null @@ -1,1239 +0,0 @@ - - - - - - - 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 deleted file mode 100644 index 50f44c4..0000000 --- a/docs/pdoc/main.html +++ /dev/null @@ -1,745 +0,0 @@ - - - - - - - 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 deleted file mode 100644 index 85fdf98..0000000 --- a/docs/pdoc/marvin_actions.html +++ /dev/null @@ -1,2115 +0,0 @@ - - - - - - - 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 deleted file mode 100644 index ca0911b..0000000 --- a/docs/pdoc/marvin_general_actions.html +++ /dev/null @@ -1,508 +0,0 @@ - - - - - - - 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 deleted file mode 100644 index 013a072..0000000 --- a/docs/pdoc/search.js +++ /dev/null @@ -1,46 +0,0 @@ -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 deleted file mode 100644 index be23ddc..0000000 --- a/docs/pdoc/test_main.html +++ /dev/null @@ -1,1966 +0,0 @@ - - - - - - - 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 deleted file mode 100644 index b02ab7b..0000000 --- a/docs/pdoc/test_marvin_actions.html +++ /dev/null @@ -1,1976 +0,0 @@ - - - - - - - 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