diff --git a/sandbox/Debug/README.txt b/sandbox/Debug/README.txt new file mode 100644 index 000000000..d60b47a97 --- /dev/null +++ b/sandbox/Debug/README.txt @@ -0,0 +1 @@ +Insert a description of your plugin here, with any notes, etc. about using it. diff --git a/sandbox/Debug/__init__.py b/sandbox/Debug/__init__.py new file mode 100644 index 000000000..cb150cc48 --- /dev/null +++ b/sandbox/Debug/__init__.py @@ -0,0 +1,56 @@ +### +# Copyright (c) 2004, Jeremiah Fincher +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions, and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions, and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the author of this software nor the name of +# contributors to this software may be used to endorse or promote products +# derived from this software without specific prior written consent. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +### + +""" +Add a description of the plugin (to be presented to the user inside the wizard) +here. +""" + +import supybot +import supybot.world as world + +# XXX Replace this with an appropriate author or supybot.Author instance. +__author__ = supybot.authors.unknown + +# This is a dictionary mapping supybot.Author instances to lists of +# contributions. +__contributors__ = {} + +import config +import plugin +reload(plugin) # In case we're being reloaded. + +if world.testing: + import test + +Class = plugin.Class +configure = config.configure + + +# vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: diff --git a/sandbox/Debug/config.py b/sandbox/Debug/config.py new file mode 100644 index 000000000..a507be31f --- /dev/null +++ b/sandbox/Debug/config.py @@ -0,0 +1,48 @@ +### +# Copyright (c) 2004, Jeremiah Fincher +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions, and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions, and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the author of this software nor the name of +# contributors to this software may be used to endorse or promote products +# derived from this software without specific prior written consent. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +### + +import supybot.conf as conf +import supybot.registry as registry + +def configure(advanced): + # This will be called by supybot to configure this module. advanced is + # a bool that specifies whether the user identified himself as an advanced + # user or not. You should effect your configuration by manipulating the + # registry as appropriate. + from supybot.questions import expect, anything, something, yn + conf.registerPlugin('Debug', True) + + +Debug = conf.registerPlugin('Debug') +# This is where your configuration variables (if any) should go. For example: +# conf.registerGlobalValue(Debug, 'someConfigVariableName', +# registry.Boolean(False, """Help for someConfigVariableName.""")) + + +# vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78 diff --git a/sandbox/Debug/plugin.py b/sandbox/Debug/plugin.py new file mode 100644 index 000000000..29c76f414 --- /dev/null +++ b/sandbox/Debug/plugin.py @@ -0,0 +1,172 @@ +#!/usr/bin/python + +### +# Copyright (c) 2002-2005, Jeremiah Fincher +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions, and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions, and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the author of this software nor the name of +# contributors to this software may be used to endorse or promote products +# derived from this software without specific prior written consent. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +### + +""" +This is for jemfinch's debugging only. If this somehow gets added and +committed, remove it immediately. It must not be released with Supybot. +""" + +import supybot.plugins as plugins + +import gc +import sys +import exceptions + +import supybot.conf as conf +import supybot.utils as utils +from supybot.commands import * +import supybot.privmsgs as privmsgs +import supybot.callbacks as callbacks + +def getTracer(fd): + def tracer(frame, event, _): + if event == 'call': + code = frame.f_code + print >>fd, '%s: %s' % (code.co_filename, code.co_name) + return tracer + +class Debug(privmsgs.CapabilityCheckingPrivmsg): + capability = 'owner' + def __init__(self): + # Setup exec command. + setattr(self.__class__, 'exec', self.__class__._exec) + privmsgs.CapabilityCheckingPrivmsg.__init__(self) + + _evalEnv = {'_': None, + '__': None, + '___': None, + } + _evalEnv.update(globals()) + def eval(self, irc, msg, args, s): + """ + + Evaluates (which should be a Python expression) and + returns its value. If an exception is raised, reports the + exception (and logs the traceback to the bot's logfile). + """ + try: + self._evalEnv.update(locals()) + x = eval(s, self._evalEnv, self._evalEnv) + self._evalEnv['___'] = self._evalEnv['__'] + self._evalEnv['__'] = self._evalEnv['_'] + self._evalEnv['_'] = x + irc.reply(repr(x)) + except SyntaxError, e: + irc.reply('%s: %s' % (utils.exnToString(e), + utils.quoted(s))) + eval = wrap(eval, ['text']) + + def _exec(self, irc, msg, args, s): + """ + + Execs . Returns success if it didn't raise any exceptions. + """ + exec s + irc.replySuccess() + _exec = wrap(_exec, ['text']) + + def simpleeval(self, irc, msg, args, text): + """ + + Evaluates the given expression. + """ + try: + irc.reply(repr(eval(text))) + except Exception, e: + irc.reply(utils.exnToString(e)) + simpleeval = wrap(simpleeval, ['text']) + + def exn(self, irc, msg, args, name): + """ + + Raises the exception matching . + """ + exn = getattr(exceptions, name) + raise exn, msg.prefix + exn = wrap(exn, ['text']) + + def sendquote(self, irc, msg, args, text): + """ + + Sends (not queues) the raw IRC message given. + """ + msg = ircmsgs.IrcMsg(text) + irc.sendMsg(msg) + sendquote = wrap(sendquote, ['text']) + + def settrace(self, irc, msg, args, filename): + """[] + + Starts tracing function calls to . If is not + given, sys.stdout is used. This causes much output. + """ + if filename: + fd = file(filename, 'a') + else: + fd = sys.stdout + sys.settrace(getTracer(fd)) + irc.replySuccess() + settrace = wrap(settrace, [additional('filename')]) + + def unsettrace(self, irc, msg, args): + """takes no arguments + + Stops tracing function calls on stdout. + """ + sys.settrace(None) + irc.replySuccess() + unsettrace = wrap(unsettrace) + + def channeldb(self, irc, msg, args, channel): + """[] + + Returns the result of the channeldb converter. + """ + irc.reply(channel) + channeldb = wrap(channeldb, ['channeldb']) + + def collect(self, irc, msg, args, times): + """[] + + Does gc collections, returning the number of objects collected + each time. defaults to 1. + """ + L = [] + while times: + L.append(gc.collect()) + times -= 1 + irc.reply(utils.commaAndify(map(str, L))) + collect = wrap(collect, [additional('positiveInt', 1)]) + + +Class = Debug + +# vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: diff --git a/sandbox/Debug/test.py b/sandbox/Debug/test.py new file mode 100644 index 000000000..06e8da087 --- /dev/null +++ b/sandbox/Debug/test.py @@ -0,0 +1,36 @@ +### +# Copyright (c) 2004, Jeremiah Fincher +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions, and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions, and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the author of this software nor the name of +# contributors to this software may be used to endorse or promote products +# derived from this software without specific prior written consent. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +### + +from supybot.test import * + +class DebugTestCase(PluginTestCase): + plugins = ('Debug',) + + +# vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: