diff --git a/earwigbot/bot.py b/earwigbot/bot.py index bc8fbc4..b2f2dab 100644 --- a/earwigbot/bot.py +++ b/earwigbot/bot.py @@ -57,7 +57,7 @@ class Bot(object): self.logger = logging.getLogger("earwigbot") self.commands = CommandManager(self) self.tasks = TaskManager(self) - self.wiki = SitesDB(self.config) + self.wiki = SitesDB(self) self.frontend = None self.watcher = None diff --git a/earwigbot/wiki/__init__.py b/earwigbot/wiki/__init__.py index 558754b..3c11724 100644 --- a/earwigbot/wiki/__init__.py +++ b/earwigbot/wiki/__init__.py @@ -35,10 +35,6 @@ add_site, and remove_site that should handle all of your Site (and thus, Page, Category, and User) needs. """ -import logging as _log -logger = _log.getLogger("earwigbot.wiki") -logger.addHandler(_log.NullHandler()) - from earwigbot.wiki.category import * from earwigbot.wiki.constants import * from earwigbot.wiki.exceptions import * diff --git a/earwigbot/wiki/site.py b/earwigbot/wiki/site.py index 59d9706..a7a4c8a 100644 --- a/earwigbot/wiki/site.py +++ b/earwigbot/wiki/site.py @@ -23,6 +23,7 @@ from cookielib import CookieJar from gzip import GzipFile from json import loads +from logging import getLogger, NullHandler from os.path import expanduser from re import escape as re_escape, match as re_match from StringIO import StringIO @@ -36,7 +37,6 @@ try: except ImportError: oursql = None -from earwigbot.wiki import logger from earwigbot.wiki.category import Category from earwigbot.wiki.constants import * from earwigbot.wiki.exceptions import * @@ -74,7 +74,7 @@ class Site(object): article_path=None, script_path=None, sql=None, namespaces=None, login=(None, None), cookiejar=None, user_agent=None, use_https=False, assert_edit=None, - maxlag=None, wait_between_queries=5, + maxlag=None, wait_between_queries=5, logger=None, search_config=(None, None)): """Constructor for new Site instances. @@ -132,6 +132,13 @@ class Site(object): # Get all of the above attributes that were not specified as arguments: self._load_attributes() + # Set up our internal logger: + if logger: + self._logger = logger + else: # Just set up a null logger to eat up our messages: + self._logger = getLogger("earwigbot.wiki").getChild(self._name) + self._logger.addHandler(NullHandler()) + # If we have a name/pass and the API says we're not logged in, log in: self._login_info = name, password = login if name and password: @@ -193,12 +200,13 @@ class Site(object): since_last_query = time() - self._last_query_time # Throttling support if since_last_query < self._wait_between_queries: wait_time = self._wait_between_queries - since_last_query - logger.debug("Throttled: waiting {0} seconds".format(wait_time)) + log = "Throttled: waiting {0} seconds".format(wait_time) + self._logger.debug(log) sleep(wait_time) self._last_query_time = time() url, data = self._build_api_query(params) - logger.debug("{0} -> {1}".format(url, data)) + self._logger.debug("{0} -> {1}".format(url, data)) try: response = self._opener.open(url, data) @@ -263,7 +271,7 @@ class Site(object): raise SiteAPIError(e.format(self._max_retries)) tries += 1 msg = 'Server says "{0}"; retrying in {1} seconds ({2}/{3})' - logger.info(msg.format(info, wait, tries, self._max_retries)) + self._logger.info(msg.format(info, wait, tries, self._max_retries)) sleep(wait) return self._api_query(params, tries=tries, wait=wait*3) else: # Some unknown error occurred diff --git a/earwigbot/wiki/sitesdb.py b/earwigbot/wiki/sitesdb.py index a436609..2fbf1a2 100644 --- a/earwigbot/wiki/sitesdb.py +++ b/earwigbot/wiki/sitesdb.py @@ -52,9 +52,10 @@ class SitesDB(object): by importing the manager class (`from earwigbot.wiki import SitesDB`). """ - def __init__(self, config): - """Set up the manager with an attribute for the BotConfig object.""" - self.config = config + def __init__(self, bot): + """Set up the manager with an attribute for the base Bot object.""" + self.config = bot.config + self._logger = bot.logger.getChild("wiki") self._sites = {} # Internal site cache self._sitesdb = path.join(config.root_dir, "sites.db") self._cookie_file = path.join(config.root_dir, ".cookies") @@ -173,6 +174,7 @@ class SitesDB(object): assert_edit = config.wiki.get("assert") maxlag = config.wiki.get("maxlag") wait_between_queries = config.wiki.get("waitTime", 5) + logger = self._logger.getChild(name) search_config = config.wiki.get("search") if user_agent: @@ -185,7 +187,7 @@ class SitesDB(object): cookiejar=cookiejar, user_agent=user_agent, use_https=use_https, assert_edit=assert_edit, maxlag=maxlag, wait_between_queries=wait_between_queries, - search_config=search_config) + logger=logger, search_config=search_config) def _get_site_name_from_sitesdb(self, project, lang): """Return the name of the first site with the given project and lang. @@ -342,6 +344,7 @@ class SitesDB(object): assert_edit = config.wiki.get("assert") maxlag = config.wiki.get("maxlag") wait_between_queries = config.wiki.get("waitTime", 5) + logger = self._logger.getChild(name) search_config = config.wiki.get("search") # Create a Site object to log in and load the other attributes: @@ -349,7 +352,7 @@ class SitesDB(object): login=login, cookiejar=cookiejar, user_agent=user_agent, use_https=use_https, assert_edit=assert_edit, maxlag=maxlag, wait_between_queries=wait_between_queries, - search_config=search_config) + logger=logger, search_config=search_config) self._add_site_to_sitesdb(site) self._sites[site.name()] = site diff --git a/tests/__init__.py b/tests/__init__.py index 2cfeb0d..4677790 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -49,7 +49,7 @@ from earwigbot.commands import CommandManager from earwigbot.config import BotConfig from earwigbot.irc import IRCConnection, Data from earwigbot.tasks import TaskManager -from earwigbot.wiki import SitesDBManager +from earwigbot.wiki import SitesDB class CommandTestCase(TestCase): re_sender = re.compile(":(.*?)!(.*?)@(.*?)\Z") @@ -114,7 +114,7 @@ class FakeBot(Bot): self.logger = logging.getLogger("earwigbot") self.commands = CommandManager(self) self.tasks = TaskManager(self) - self.wiki = SitesDBManager(self.config) + self.wiki = SitesDB(self) self.frontend = FakeIRCConnection(self) self.watcher = FakeIRCConnection(self)