@@ -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 | |||
@@ -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 * | |||
@@ -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 | |||
@@ -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 | |||
@@ -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) | |||