| @@ -26,14 +26,16 @@ The most useful attributes are: | |||||
| - :py:attr:`~earwigbot.bot.Bot.commands`: the bot's | - :py:attr:`~earwigbot.bot.Bot.commands`: the bot's | ||||
| :py:class:`~earwigbot.managers.CommandManager`, which is used internally to | :py:class:`~earwigbot.managers.CommandManager`, which is used internally to | ||||
| run IRC commands (through :py:meth:`bot.commands.call`, which you shouldn't | |||||
| have to use); you can safely reload all commands with | |||||
| :py:meth:`~earwigbot.bot.Bot.commands.load`. | |||||
| run IRC commands (through | |||||
| :py:meth:`commands.call() <earwigbot.managers.CommandManager.call>`, which | |||||
| you shouldn't have to use); you can safely reload all commands with | |||||
| :py:meth:`commands.load() <earwigbot.bot.Bot.commands.load>`. | |||||
| - :py:attr:`~earwigbot.bot.Bot.tasks`: the bot's | - :py:attr:`~earwigbot.bot.Bot.tasks`: the bot's | ||||
| :py:class:`~earwigbot.managers.TaskManager`, which can be used to start tasks | :py:class:`~earwigbot.managers.TaskManager`, which can be used to start tasks | ||||
| with :py:attr:`~earwigbot.bot.Bot.tasks.start(task_name, **kwargs)`. | |||||
| :py:meth:`~earwigbot.bot.Bot.tasks.load` can be used to safely reload all | |||||
| with :py:meth:`tasks.start(task_name, **kwargs) | |||||
| <earwigbot.managers.TaskManager.start>`. :py:meth:`tasks.load() | |||||
| <earwigbot.managers.TaskManager.load>` can be used to safely reload all | |||||
| tasks. | tasks. | ||||
| - :py:attr:`~earwigbot.bot.Bot.frontend` / | - :py:attr:`~earwigbot.bot.Bot.frontend` / | ||||
| @@ -41,8 +43,8 @@ The most useful attributes are: | |||||
| :py:class:`earwigbot.irc.Frontend` and :py:class:`earwigbot.irc.Watcher`, | :py:class:`earwigbot.irc.Frontend` and :py:class:`earwigbot.irc.Watcher`, | ||||
| respectively, which represent the bot's connections to these two servers; you | respectively, which represent the bot's connections to these two servers; you | ||||
| can, for example, send a message to the frontend with | can, for example, send a message to the frontend with | ||||
| :py:attr:`~earwigbot.bot.Bot.frontend.say(chan, msg)` (more on communicating | |||||
| with IRC below). | |||||
| :py:meth:`frontend.say(chan, msg) <earwigbot.irc.IRConnection.say>` (more on | |||||
| communicating with IRC below). | |||||
| - :py:attr:`~earwigbot.bot.Bot.wiki`: interface with the | - :py:attr:`~earwigbot.bot.Bot.wiki`: interface with the | ||||
| :doc:`Wiki Toolset <toolset>`. | :doc:`Wiki Toolset <toolset>`. | ||||
| @@ -113,12 +115,14 @@ these are the basics: | |||||
| :py:class:`~earwigbot.commands.BaseCommand`'s | :py:class:`~earwigbot.commands.BaseCommand`'s | ||||
| :py:meth:`~earwigbot.commands.BaseCommand.__init__` method for the full list. | :py:meth:`~earwigbot.commands.BaseCommand.__init__` method for the full list. | ||||
| The most common ones are :py:attr:`self.say(chan_or_user, msg)`, | |||||
| :py:attr:`self.reply(data, msg)` (convenience function; sends a reply to the | |||||
| The most common ones are :py:meth:`say(chan_or_user, msg) | |||||
| <bot.irc.IRCConnection.say>`, :py:meth:`reply(data, msg) | |||||
| <bot.irc.IRCConnection.reply>` (convenience function; sends a reply to the | |||||
| issuer of the command in the channel it was received), | issuer of the command in the channel it was received), | ||||
| :py:attr:`self.action(chan_or_user, msg)`, | |||||
| :py:attr:`self.notice(chan_or_user, msg)`, :py:attr:`self.join(chan)`, and | |||||
| :py:attr:`self.part(chan)`. | |||||
| :py:meth:`action(chan_or_user, msg) <bot.irc.IRCConnection.action>`, | |||||
| :py:meth:`notice(chan_or_user, msg) <bot.irc.IRCConnection.notice>`, | |||||
| :py:meth:`join(chan) <bot.irc.IRCConnection.join>`, and | |||||
| :py:meth:`part(chan) <bot.irc.IRCConnection.part>`. | |||||
| It's important to name the command class :py:class:`Command` within the file, | It's important to name the command class :py:class:`Command` within the file, | ||||
| or else the bot might not recognize it as a command. The name of the file | or else the bot might not recognize it as a command. The name of the file | ||||
| @@ -149,9 +153,9 @@ are the basics: | |||||
| generated with :py:meth:`~earwigbot.tasks.BaseTask.make_summary`). For | generated with :py:meth:`~earwigbot.tasks.BaseTask.make_summary`). For | ||||
| example, EarwigBot's :py:attr:`config.wiki["summary"]` is | example, EarwigBot's :py:attr:`config.wiki["summary"]` is | ||||
| ``"([[WP:BOT|Bot]]; [[User:EarwigBot#Task $1|Task $1]]): $2"``, which the | ``"([[WP:BOT|Bot]]; [[User:EarwigBot#Task $1|Task $1]]): $2"``, which the | ||||
| task class's :py:attr:`~earwigbot.tasks.BaseTask.make_summary(comment)` | |||||
| method will take and replace ``$1`` with the task number and ``$2`` with the | |||||
| details of the edit. | |||||
| task class's :py:meth:`make_summary(comment) | |||||
| <earwigbot.tasks.BaseTask.make_summary>` method will take and replace | |||||
| ``$1`` with the task number and ``$2`` with the details of the edit. | |||||
| Additionally, :py:meth:`~earwigbot.tasks.BaseTask.shutoff_enabled` (which | Additionally, :py:meth:`~earwigbot.tasks.BaseTask.shutoff_enabled` (which | ||||
| checks whether the bot has been told to stop on-wiki by checking the content | checks whether the bot has been told to stop on-wiki by checking the content | ||||
| @@ -175,9 +179,10 @@ are the basics: | |||||
| - Method :py:meth:`~earwigbot.tasks.BaseTask.run` is called with any number of | - Method :py:meth:`~earwigbot.tasks.BaseTask.run` is called with any number of | ||||
| keyword arguments every time the task is executed (by | keyword arguments every time the task is executed (by | ||||
| :py:attr:`bot.tasks.start(task_name, **kwargs)`, usually). This is where the | |||||
| bulk of the task's code goes. For interfacing with MediaWiki sites, read up | |||||
| on the :doc:`Wiki Toolset <toolset>`. | |||||
| :py:meth:`tasks.start(task_name, **kwargs) | |||||
| <earwigbot.managers.TaskManager.start>`, usually). This is where the bulk of | |||||
| the task's code goes. For interfacing with MediaWiki sites, read up on the | |||||
| :doc:`Wiki Toolset <toolset>`. | |||||
| Tasks have access to :py:attr:`config.tasks[task_name]` for config information, | Tasks have access to :py:attr:`config.tasks[task_name]` for config information, | ||||
| which is a node in :file:`config.yml` like every other attribute of | which is a node in :file:`config.yml` like every other attribute of | ||||
| @@ -45,4 +45,3 @@ Indices and tables | |||||
| * :ref:`genindex` | * :ref:`genindex` | ||||
| * :ref:`modindex` | * :ref:`modindex` | ||||
| * :ref:`search` | * :ref:`search` | ||||
| @@ -1,23 +1,23 @@ | |||||
| Installation | Installation | ||||
| ============ | ============ | ||||
| This package contains the core ``earwigbot``, abstracted enough that it should | |||||
| be usable and customizable by anyone running a bot on a MediaWiki site. Since | |||||
| it is component-based, the IRC components can be disabled if desired. IRC | |||||
| This package contains the core :py:mod:`earwigbot`, abstracted enough that it | |||||
| should be usable and customizable by anyone running a bot on a MediaWiki site. | |||||
| Since it is component-based, the IRC components can be disabled if desired. IRC | |||||
| commands and bot tasks specific to `my instance of EarwigBot`_ that I don't | commands and bot tasks specific to `my instance of EarwigBot`_ that I don't | ||||
| feel the average user will need are available from the repository | feel the average user will need are available from the repository | ||||
| `earwigbot-plugins`_. | `earwigbot-plugins`_. | ||||
| It's recommended to run the bot's unit tests before installing. Run ``python | |||||
| setup.py test`` from the project's root directory. Note that some | |||||
| tests require an internet connection, and others may take a while to run. | |||||
| It's recommended to run the bot's unit tests before installing. Run | |||||
| :command:`python setup.py test` from the project's root directory. Note that | |||||
| some tests require an internet connection, and others may take a while to run. | |||||
| Coverage is currently rather incomplete. | Coverage is currently rather incomplete. | ||||
| Latest release (v0.1) | Latest release (v0.1) | ||||
| --------------------- | --------------------- | ||||
| EarwigBot is available from the `Python Package Index`_, so you can install the | EarwigBot is available from the `Python Package Index`_, so you can install the | ||||
| latest release with ``pip install earwigbot`` (`get pip`_). | |||||
| latest release with :command:`pip install earwigbot` (`get pip`_). | |||||
| You can also install it from source [1]_ directly:: | You can also install it from source [1]_ directly:: | ||||
| @@ -31,11 +31,11 @@ You can also install it from source [1]_ directly:: | |||||
| Development version | Development version | ||||
| ------------------- | ------------------- | ||||
| You can install the development version of the bot from ``git`` by using | |||||
| setuptools/distribute's ``develop`` command [1]_, probably on the ``develop`` | |||||
| branch which contains (usually) working code. ``master`` contains the latest | |||||
| release. EarwigBot uses `git flow`_, so you're free to | |||||
| browse by tags or by new features (``feature/*`` branches):: | |||||
| You can install the development version of the bot from :command:`git` by using | |||||
| setuptools/`distribute`_'s :command:`develop` command [1]_, probably on the | |||||
| ``develop`` branch which contains (usually) working code. ``master`` contains | |||||
| the latest release. EarwigBot uses `git flow`_, so you're free to browse by | |||||
| tags or by new features (``feature/*`` branches):: | |||||
| git clone git://github.com/earwig/earwigbot.git earwigbot | git clone git://github.com/earwig/earwigbot.git earwigbot | ||||
| cd earwigbot | cd earwigbot | ||||
| @@ -46,8 +46,9 @@ browse by tags or by new features (``feature/*`` branches):: | |||||
| .. [1] ``python setup.py install``/``develop`` may require root, or use the | .. [1] ``python setup.py install``/``develop`` may require root, or use the | ||||
| ``--user`` switch to install for the current user only. | ``--user`` switch to install for the current user only. | ||||
| .. _my instance of EarwigBot: http://en.wikipedia.org/wiki/User:EarwigBot | |||||
| .. _earwigbot-plugins: https://github.com/earwig/earwigbot-plugins | |||||
| .. _Python Package Index: http://pypi.python.org | |||||
| .. _get pip: http://pypi.python.org/pypi/pip | |||||
| .. _git flow: http://nvie.com/posts/a-successful-git-branching-model/ | |||||
| .. _my instance of EarwigBot: http://en.wikipedia.org/wiki/User:EarwigBot | |||||
| .. _earwigbot-plugins: https://github.com/earwig/earwigbot-plugins | |||||
| .. _Python Package Index: http://pypi.python.org | |||||
| .. _get pip: http://pypi.python.org/pypi/pip | |||||
| .. _distribute: http://pypi.python.org/pypi/distribute | |||||
| .. _git flow: http://nvie.com/posts/a-successful-git-branching-model/ | |||||
| @@ -25,4 +25,4 @@ You can stop the bot at any time with :kbd:`Control-c`, same as you stop a | |||||
| normal Python program, and it will try to exit safely. You can also use the | normal Python program, and it will try to exit safely. You can also use the | ||||
| "``!quit``" command on IRC. | "``!quit``" command on IRC. | ||||
| .. _explanation of YAML: http://en.wikipedia.org/wiki/YAML | |||||
| .. _explanation of YAML: http://en.wikipedia.org/wiki/YAML | |||||
| @@ -3,21 +3,24 @@ Tips | |||||
| - Logging_ is a fantastic way to monitor the bot's progress as it runs. It has | - Logging_ is a fantastic way to monitor the bot's progress as it runs. It has | ||||
| a slew of built-in loggers, and enabling log retention (so logs are saved to | a slew of built-in loggers, and enabling log retention (so logs are saved to | ||||
| ``logs/`` in the working directory) is highly recommended. In the normal | |||||
| :file:`logs/` in the working directory) is highly recommended. In the normal | |||||
| setup, there are three log files, each of which "rotate" at a specific time | setup, there are three log files, each of which "rotate" at a specific time | ||||
| (``filename.log`` becomes ``filename.log.2012-04-10``, for example). The | |||||
| ``debug.log`` file rotates every hour, and maintains six hours of logs of | |||||
| every level (``DEBUG`` and up). ``bot.log`` rotates every day at midnight, | |||||
| and maintains seven days of non-debug logs (``INFO`` and up). Finally, | |||||
| ``error.log`` rotates every Sunday night, and maintains four weeks of logs | |||||
| indicating unexpected events (``WARNING`` and up). | |||||
| To use logging in your commands or tasks (recommended), ``BaseCommand`` and | |||||
| ``BaseTask`` provide ``logger`` attributes configured for the specific | |||||
| command or task. If you're working with other classes, ``bot.logger`` is the | |||||
| root logger (``logging.getLogger("earwigbot")`` by default), so you can use | |||||
| ``getChild`` to make your logger. For example, task loggers are essentially | |||||
| ``bot.logger.getChild("tasks").getChild(task.name)``. | |||||
| (:file:`filename.log` becomes :file:`filename.log.2012-04-10`, for example). | |||||
| The :file:`debug.log` file rotates every hour, and maintains six hours of | |||||
| logs of every level (``DEBUG`` and up). :file:`bot.log` rotates every day at | |||||
| midnight, and maintains seven days of non-debug logs (``INFO`` and up). | |||||
| Finally, :file:`error.log` rotates every Sunday night, and maintains four | |||||
| weeks of logs indicating unexpected events (``WARNING`` and up). | |||||
| To use logging in your commands or tasks (recommended), | |||||
| :py:class:~earwigbot.commands.BaseCommand` and | |||||
| :py:class:~earwigbot.tasks.BaseTask` provide :py:attr:`logger` attributes | |||||
| configured for the specific command or task. If you're working with other | |||||
| classes, :py:attr:`bot.logger` is the root logger | |||||
| (:py:obj:`logging.getLogger("earwigbot")` by default), so you can use | |||||
| :py:func:`~logging.Logger.getChild` to make your logger. For example, task | |||||
| loggers are essentially | |||||
| :py:attr:`bot.logger.getChild("tasks").getChild(task.name) <bot.logger>`. | |||||
| - A very useful IRC command is "``!reload``", which reloads all commands and | - A very useful IRC command is "``!reload``", which reloads all commands and | ||||
| tasks without restarting the bot. [1]_ Combined with using the `!git plugin`_ | tasks without restarting the bot. [1]_ Combined with using the `!git plugin`_ | ||||
| @@ -25,17 +28,19 @@ Tips | |||||
| development workflow if the bot runs on an external server and you set up | development workflow if the bot runs on an external server and you set up | ||||
| its working directory as a git repo. | its working directory as a git repo. | ||||
| - You can run a task by itself instead of the entire bot with ``earwigbot | |||||
| path/to/working/dir --task task_name``. | |||||
| - You can run a task by itself instead of the entire bot with | |||||
| :command:`earwigbot path/to/working/dir --task task_name`. | |||||
| - Questions, comments, or suggestions about the documentation? `Let me know`_ | |||||
| so I can improve it for other people. | |||||
| - Questions, comments, or suggestions about the documentation? `Let me know`_, | |||||
| or `create an issue`_ so I can improve it for other people. | |||||
| .. rubric:: Footnotes | .. rubric:: Footnotes | ||||
| .. [1] In reality, all this does is call ``bot.commands.load()`` and | |||||
| ``bot.tasks.load()``! | |||||
| .. [1] In reality, all this does is call :py:meth:`bot.commands.load() | |||||
| <earwigbot.commands.BaseCommand.load>` and | |||||
| :py:meth:`bot.tasks.load() <earwigbot.tasks.BaseTask.load>`! | |||||
| .. _logging: http://docs.python.org/library/logging.html | |||||
| .. _Let me know: ben.kurtovic@verizon.net | |||||
| .. _!git plugin: https://github.com/earwig/earwigbot-plugins/blob/develop/commands/git.py | |||||
| .. _logging: http://docs.python.org/library/logging.html | |||||
| .. _!git plugin: https://github.com/earwig/earwigbot-plugins/blob/develop/commands/git.py | |||||
| .. _Let me know: ben.kurtovic@verizon.net | |||||
| .. _create an issue: https://github.com/earwig/earwigbot/issues | |||||
| @@ -166,5 +166,5 @@ docstrings`_ to learn how to use it in a more hands-on fashion. For reference, | |||||
| ``bot.wiki`` is an instance of ``earwigbot.wiki.SitesDB`` tied to the | ``bot.wiki`` is an instance of ``earwigbot.wiki.SitesDB`` tied to the | ||||
| ``sites.db`` file in the bot's working directory. | ``sites.db`` file in the bot's working directory. | ||||
| .. _Pywikipedia framework: http://pywikipediabot.sourceforge.net/ | |||||
| .. _its code and docstrings: https://github.com/earwig/earwigbot/tree/develop/earwigbot/wiki | |||||
| .. _Pywikipedia framework: http://pywikipediabot.sourceforge.net/ | |||||
| .. _its code and docstrings: https://github.com/earwig/earwigbot/tree/develop/earwigbot/wiki | |||||