- 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: | finally: | ||||
del _get_git_commit_id | 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 math import floor | ||||
from time import time | from time import time | ||||
try: | |||||
import pytz | |||||
except ImportError: | |||||
pytz = None | |||||
import pytz | |||||
from earwigbot.commands import Command | from earwigbot.commands import Command | ||||
@@ -28,20 +28,9 @@ import logging.handlers | |||||
from os import mkdir, path | from os import mkdir, path | ||||
import stat | 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.formatter import BotFormatter | ||||
from earwigbot.config.node import ConfigNode | from earwigbot.config.node import ConfigNode | ||||
@@ -29,15 +29,11 @@ with modifications. | |||||
from collections import OrderedDict | from collections import OrderedDict | ||||
try: | |||||
import yaml | |||||
from yaml import Loader, SafeDumper | |||||
except ImportError: | |||||
yaml = Loader = SafeDumper = None | |||||
import yaml | |||||
__all__ = ["OrderedLoader", "OrderedDumper"] | __all__ = ["OrderedLoader", "OrderedDumper"] | ||||
class OrderedLoader(Loader): | |||||
class OrderedLoader(yaml.Loader): | |||||
"""A YAML loader that loads mappings into ordered dictionaries.""" | """A YAML loader that loads mappings into ordered dictionaries.""" | ||||
def __init__(self, *args, **kwargs): | def __init__(self, *args, **kwargs): | ||||
@@ -75,7 +71,7 @@ class OrderedLoader(Loader): | |||||
return mapping | return mapping | ||||
class OrderedDumper(SafeDumper): | |||||
class OrderedDumper(yaml.SafeDumper): | |||||
"""A YAML dumper that dumps ordered dictionaries into mappings.""" | """A YAML dumper that dumps ordered dictionaries into mappings.""" | ||||
def __init__(self, *args, **kwargs): | def __init__(self, *args, **kwargs): | ||||
@@ -29,20 +29,9 @@ import stat | |||||
import sys | import sys | ||||
from textwrap import fill, wrap | 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 import exceptions | ||||
from earwigbot.config.ordered_yaml import OrderedDumper | from earwigbot.config.ordered_yaml import OrderedDumper | ||||
@@ -271,7 +260,7 @@ class ConfigScript(object): | |||||
self.data["wiki"]["useHTTPS"] = True | self.data["wiki"]["useHTTPS"] = True | ||||
self.data["wiki"]["assert"] = "user" | self.data["wiki"]["assert"] = "user" | ||||
self.data["wiki"]["maxlag"] = 10 | 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"]["defaultSite"] = self._login(kwargs).name | ||||
self.data["wiki"]["sql"] = {} | 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 time import sleep, time | ||||
from urllib2 import build_opener, URLError | 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 import exceptions | ||||
from earwigbot.wiki.copyvios.markov import MarkovChain, MarkovChainIntersection | from earwigbot.wiki.copyvios.markov import MarkovChain, MarkovChainIntersection | ||||
@@ -22,20 +22,9 @@ | |||||
from os import path | 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"] | __all__ = ["BaseTextParser", "ArticleTextParser", "HTMLTextParser"] | ||||
@@ -23,10 +23,7 @@ | |||||
from json import loads | from json import loads | ||||
from urllib import quote_plus, urlencode | from urllib import quote_plus, urlencode | ||||
try: | |||||
import oauth2 as oauth | |||||
except ImportError: | |||||
oauth = None | |||||
import oauth2 as oauth | |||||
from earwigbot.exceptions import SearchQueryError | from earwigbot.exceptions import SearchQueryError | ||||
@@ -26,10 +26,7 @@ import re | |||||
from time import gmtime, strftime | from time import gmtime, strftime | ||||
from urllib import quote | from urllib import quote | ||||
try: | |||||
import mwparserfromhell | |||||
except ImportError: | |||||
mwparserfromhell = None | |||||
import mwparserfromhell | |||||
from earwigbot import exceptions | from earwigbot import exceptions | ||||
from earwigbot.wiki.copyvios import CopyvioMixIn | 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 urllib2 import build_opener, HTTPCookieProcessor, URLError | ||||
from urlparse import urlparse | from urlparse import urlparse | ||||
try: | |||||
import oursql | |||||
except ImportError: | |||||
oursql = None | |||||
import oursql | |||||
from earwigbot import exceptions | from earwigbot import exceptions | ||||
from earwigbot.wiki import constants | from earwigbot.wiki import constants | ||||
@@ -90,7 +87,7 @@ class Site(object): | |||||
article_path=None, script_path=None, sql=None, | article_path=None, script_path=None, sql=None, | ||||
namespaces=None, login=(None, None), cookiejar=None, | namespaces=None, login=(None, None), cookiejar=None, | ||||
user_agent=None, use_https=False, assert_edit=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): | search_config=None): | ||||
"""Constructor for new Site instances. | """Constructor for new Site instances. | ||||
@@ -191,7 +191,7 @@ class SitesDB(object): | |||||
use_https = config.wiki.get("useHTTPS", False) | use_https = config.wiki.get("useHTTPS", False) | ||||
assert_edit = config.wiki.get("assert") | assert_edit = config.wiki.get("assert") | ||||
maxlag = config.wiki.get("maxlag") | 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) | logger = self._logger.getChild(name) | ||||
search_config = config.wiki.get("search", OrderedDict()).copy() | search_config = config.wiki.get("search", OrderedDict()).copy() | ||||
@@ -390,7 +390,7 @@ class SitesDB(object): | |||||
use_https = config.wiki.get("useHTTPS", True) | use_https = config.wiki.get("useHTTPS", True) | ||||
assert_edit = config.wiki.get("assert") | assert_edit = config.wiki.get("assert") | ||||
maxlag = config.wiki.get("maxlag") | maxlag = config.wiki.get("maxlag") | ||||
wait_between_queries = config.wiki.get("waitTime", 3) | |||||
wait_between_queries = config.wiki.get("waitTime", 2) | |||||
if user_agent: | if user_agent: | ||||
user_agent = user_agent.replace("$1", __version__) | user_agent = user_agent.replace("$1", __version__) | ||||
@@ -34,14 +34,14 @@ dependencies = [ | |||||
"GitPython >= 0.3.2.RC1", # Interfacing with git for !git and __version__ | "GitPython >= 0.3.2.RC1", # Interfacing with git for !git and __version__ | ||||
"PyYAML >= 3.10", # Parsing config files | "PyYAML >= 3.10", # Parsing config files | ||||
"beautifulsoup4 >= 4.1.1", # Parsing/scraping HTML for copyvios | "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 | "mwparserfromhell >= 0.1", # Parsing wikicode for manipulation | ||||
"nltk >= 2.0.2", # Parsing sentences to split article content for copyvios | "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 | "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 | "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: | with open("README.rst") as fp: | ||||