- Simplify all imports - Update dependency version in setup.py - Change waitTime default from three seconds to twotags/v0.1^2
@@ -51,12 +51,18 @@ if not __release__: | |||
finally: | |||
del _get_git_commit_id | |||
from earwigbot import bot | |||
from earwigbot import commands | |||
from earwigbot import config | |||
from earwigbot import exceptions | |||
from earwigbot import irc | |||
from earwigbot import managers | |||
from earwigbot import tasks | |||
from earwigbot import util | |||
from earwigbot import wiki | |||
from earwigbot import lazy | |||
importer = lazy.LazyImporter() | |||
bot = importer.new("earwigbot.bot") | |||
commands = importer.new("earwigbot.commands") | |||
config = importer.new("earwigbot.config") | |||
exceptions = importer.new("earwigbot.exceptions") | |||
irc = importer.new("earwigbot.irc") | |||
managers = importer.new("earwigbot.managers") | |||
tasks = importer.new("earwigbot.tasks") | |||
util = importer.new("earwigbot.util") | |||
wiki = importer.new("earwigbot.wiki") | |||
del importer |
@@ -24,10 +24,7 @@ from datetime import datetime | |||
from math import floor | |||
from time import time | |||
try: | |||
import pytz | |||
except ImportError: | |||
pytz = None | |||
import pytz | |||
from earwigbot.commands import Command | |||
@@ -28,20 +28,9 @@ import logging.handlers | |||
from os import mkdir, path | |||
import stat | |||
try: | |||
from Crypto.Cipher import Blowfish | |||
except ImportError: | |||
Blowfish = None | |||
try: | |||
import bcrypt | |||
except ImportError: | |||
bcrypt = None | |||
try: | |||
import yaml | |||
except ImportError: | |||
yaml = None | |||
from Crypto.Cipher import Blowfish | |||
import bcrypt | |||
import yaml | |||
from earwigbot.config.formatter import BotFormatter | |||
from earwigbot.config.node import ConfigNode | |||
@@ -29,15 +29,11 @@ with modifications. | |||
from collections import OrderedDict | |||
try: | |||
import yaml | |||
from yaml import Loader, SafeDumper | |||
except ImportError: | |||
yaml = Loader = SafeDumper = None | |||
import yaml | |||
__all__ = ["OrderedLoader", "OrderedDumper"] | |||
class OrderedLoader(Loader): | |||
class OrderedLoader(yaml.Loader): | |||
"""A YAML loader that loads mappings into ordered dictionaries.""" | |||
def __init__(self, *args, **kwargs): | |||
@@ -75,7 +71,7 @@ class OrderedLoader(Loader): | |||
return mapping | |||
class OrderedDumper(SafeDumper): | |||
class OrderedDumper(yaml.SafeDumper): | |||
"""A YAML dumper that dumps ordered dictionaries into mappings.""" | |||
def __init__(self, *args, **kwargs): | |||
@@ -29,20 +29,9 @@ import stat | |||
import sys | |||
from textwrap import fill, wrap | |||
try: | |||
from Crypto.Cipher import Blowfish | |||
except ImportError: | |||
Blowfish = None | |||
try: | |||
import bcrypt | |||
except ImportError: | |||
bcrypt = None | |||
try: | |||
import yaml | |||
except ImportError: | |||
yaml = None | |||
from Crypto.Cipher import Blowfish | |||
import bcrypt | |||
import yaml | |||
from earwigbot import exceptions | |||
from earwigbot.config.ordered_yaml import OrderedDumper | |||
@@ -271,7 +260,7 @@ class ConfigScript(object): | |||
self.data["wiki"]["useHTTPS"] = True | |||
self.data["wiki"]["assert"] = "user" | |||
self.data["wiki"]["maxlag"] = 10 | |||
self.data["wiki"]["waitTime"] = 3 | |||
self.data["wiki"]["waitTime"] = 2 | |||
self.data["wiki"]["defaultSite"] = self._login(kwargs).name | |||
self.data["wiki"]["sql"] = {} | |||
@@ -0,0 +1,81 @@ | |||
# -*- coding: utf-8 -*- | |||
# | |||
# Copyright (C) 2009-2012 Ben Kurtovic <ben.kurtovic@verizon.net> | |||
# | |||
# Permission is hereby granted, free of charge, to any person obtaining a copy | |||
# of this software and associated documentation files (the "Software"), to deal | |||
# in the Software without restriction, including without limitation the rights | |||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
# copies of the Software, and to permit persons to whom the Software is | |||
# furnished to do so, subject to the following conditions: | |||
# | |||
# The above copyright notice and this permission notice shall be included in | |||
# all copies or substantial portions of the Software. | |||
# | |||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |||
# SOFTWARE. | |||
""" | |||
Implements a hierarchy of importing classes as defined in PEP 302 to load | |||
modules in a safe yet lazy manner. | |||
""" | |||
from imp import acquire_lock, release_lock | |||
import sys | |||
from types import ModuleType | |||
__all__ = ["LazyImporter"] | |||
def _getattribute(self, attr): | |||
_load(self) | |||
return self.__getattribute__(attr) | |||
def _setattr(self, attr, value): | |||
_load(self) | |||
self.__setattr__(attr, value) | |||
def _load(self): | |||
type(self).__getattribute__ = ModuleType.__getattribute__ | |||
type(self).__setattr__ = ModuleType.__setattr__ | |||
reload(self) | |||
class _LazyModule(type): | |||
def __new__(cls, name): | |||
acquire_lock() | |||
try: | |||
if name not in sys.modules: | |||
attributes = { | |||
"__name__": name, | |||
"__getattribute__": _getattribute, | |||
"__setattr__": _setattr | |||
} | |||
parents = (ModuleType,) | |||
klass = type.__new__(cls, "module", parents, attributes) | |||
sys.modules[name] = klass(name) | |||
return sys.modules[name] | |||
finally: | |||
release_lock() | |||
class LazyImporter(object): | |||
def __init__(self): | |||
self._modules = {} | |||
sys.meta_path.append(self) | |||
def new(self, name): | |||
module = _LazyModule(name) | |||
self._modules[name] = module | |||
return module | |||
def find_module(self, fullname, path=None): | |||
if fullname in self._modules and fullname not in sys.modules: | |||
return self | |||
def load_module(self, fullname): | |||
return self._modules.pop(fullname) |
@@ -26,10 +26,7 @@ from StringIO import StringIO | |||
from time import sleep, time | |||
from urllib2 import build_opener, URLError | |||
try: | |||
import oauth2 as oauth | |||
except ImportError: | |||
oauth = None | |||
import oauth2 as oauth | |||
from earwigbot import exceptions | |||
from earwigbot.wiki.copyvios.markov import MarkovChain, MarkovChainIntersection | |||
@@ -22,20 +22,9 @@ | |||
from os import path | |||
try: | |||
import bs4 | |||
except ImportError: | |||
bs4 = None | |||
try: | |||
import mwparserfromhell | |||
except ImportError: | |||
mwparserfromhell = None | |||
try: | |||
import nltk | |||
except ImportError: | |||
nltk = None | |||
import bs4 | |||
import mwparserfromhell | |||
import nltk | |||
__all__ = ["BaseTextParser", "ArticleTextParser", "HTMLTextParser"] | |||
@@ -23,10 +23,7 @@ | |||
from json import loads | |||
from urllib import quote_plus, urlencode | |||
try: | |||
import oauth2 as oauth | |||
except ImportError: | |||
oauth = None | |||
import oauth2 as oauth | |||
from earwigbot.exceptions import SearchQueryError | |||
@@ -26,10 +26,7 @@ import re | |||
from time import gmtime, strftime | |||
from urllib import quote | |||
try: | |||
import mwparserfromhell | |||
except ImportError: | |||
mwparserfromhell = None | |||
import mwparserfromhell | |||
from earwigbot import exceptions | |||
from earwigbot.wiki.copyvios import CopyvioMixIn | |||
@@ -32,10 +32,7 @@ from urllib import quote_plus, unquote_plus | |||
from urllib2 import build_opener, HTTPCookieProcessor, URLError | |||
from urlparse import urlparse | |||
try: | |||
import oursql | |||
except ImportError: | |||
oursql = None | |||
import oursql | |||
from earwigbot import exceptions | |||
from earwigbot.wiki import constants | |||
@@ -90,7 +87,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=3, logger=None, | |||
maxlag=None, wait_between_queries=2, logger=None, | |||
search_config=None): | |||
"""Constructor for new Site instances. | |||
@@ -191,7 +191,7 @@ class SitesDB(object): | |||
use_https = config.wiki.get("useHTTPS", False) | |||
assert_edit = config.wiki.get("assert") | |||
maxlag = config.wiki.get("maxlag") | |||
wait_between_queries = config.wiki.get("waitTime", 3) | |||
wait_between_queries = config.wiki.get("waitTime", 2) | |||
logger = self._logger.getChild(name) | |||
search_config = config.wiki.get("search", OrderedDict()).copy() | |||
@@ -390,7 +390,7 @@ class SitesDB(object): | |||
use_https = config.wiki.get("useHTTPS", True) | |||
assert_edit = config.wiki.get("assert") | |||
maxlag = config.wiki.get("maxlag") | |||
wait_between_queries = config.wiki.get("waitTime", 3) | |||
wait_between_queries = config.wiki.get("waitTime", 2) | |||
if user_agent: | |||
user_agent = user_agent.replace("$1", __version__) | |||
@@ -34,14 +34,14 @@ dependencies = [ | |||
"GitPython >= 0.3.2.RC1", # Interfacing with git for !git and __version__ | |||
"PyYAML >= 3.10", # Parsing config files | |||
"beautifulsoup4 >= 4.1.1", # Parsing/scraping HTML for copyvios | |||
"lxml >= 2.3.4", # Faster parser for BeautifulSoup | |||
"lxml >= 2.3.5", # Faster parser for BeautifulSoup | |||
"mwparserfromhell >= 0.1", # Parsing wikicode for manipulation | |||
"nltk >= 2.0.2", # Parsing sentences to split article content for copyvios | |||
"oursql >= 0.9.3", # Interfacing with MediaWiki databases | |||
"oauth2 >= 1.5.211", # Interfacing with Yahoo! BOSS Search for copyvios | |||
"oursql >= 0.9.3.1", # Interfacing with MediaWiki databases | |||
"py-bcrypt >= 0.2", # Hashing the bot key in the config file | |||
"pycrypto >= 2.5", # Storing bot passwords and keys in the config file | |||
"pytz >= 2012c", # Handling timezones for the !time IRC command | |||
"pycrypto >= 2.6", # Storing bot passwords and keys in the config file | |||
"pytz >= 2012d", # Handling timezones for the !time IRC command | |||
] | |||
with open("README.rst") as fp: | |||