@@ -64,5 +64,3 @@ managers = importer.new("earwigbot.managers") | |||||
tasks = importer.new("earwigbot.tasks") | tasks = importer.new("earwigbot.tasks") | ||||
util = importer.new("earwigbot.util") | util = importer.new("earwigbot.util") | ||||
wiki = importer.new("earwigbot.wiki") | wiki = importer.new("earwigbot.wiki") | ||||
del importer |
@@ -21,8 +21,10 @@ | |||||
# SOFTWARE. | # SOFTWARE. | ||||
""" | """ | ||||
Implements a hierarchy of importing classes as defined in PEP 302 to load | |||||
modules in a safe yet lazy manner. | |||||
Implements a hierarchy of importing classes as defined in `PEP 302 | |||||
<http://www.python.org/dev/peps/pep-0302/>`_ to load modules in a safe yet lazy | |||||
manner, so that they can be referred to by name but are not actually loaded | |||||
until they are used (i.e. their attributes are read or modified). | |||||
""" | """ | ||||
from imp import acquire_lock, release_lock | from imp import acquire_lock, release_lock | ||||
@@ -64,6 +66,11 @@ class _LazyModule(type): | |||||
class LazyImporter(object): | class LazyImporter(object): | ||||
"""An importer for modules that are loaded lazily. | |||||
This inserts itself into :py:data:`sys.meta_path`, storing a dictionary of | |||||
:py:class:`_LazyModule`\ s (which is added to with :py:meth:`new`). | |||||
""" | |||||
def __init__(self): | def __init__(self): | ||||
self._modules = {} | self._modules = {} | ||||
sys.meta_path.append(self) | sys.meta_path.append(self) | ||||
@@ -26,14 +26,14 @@ 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 | ||||
import oauth2 as oauth | |||||
from earwigbot import exceptions | |||||
from earwigbot import exceptions, importer | |||||
from earwigbot.wiki.copyvios.markov import MarkovChain, MarkovChainIntersection | from earwigbot.wiki.copyvios.markov import MarkovChain, MarkovChainIntersection | ||||
from earwigbot.wiki.copyvios.parsers import ArticleTextParser, HTMLTextParser | from earwigbot.wiki.copyvios.parsers import ArticleTextParser, HTMLTextParser | ||||
from earwigbot.wiki.copyvios.result import CopyvioCheckResult | from earwigbot.wiki.copyvios.result import CopyvioCheckResult | ||||
from earwigbot.wiki.copyvios.search import YahooBOSSSearchEngine | from earwigbot.wiki.copyvios.search import YahooBOSSSearchEngine | ||||
oauth = importer.new("oauth2") | |||||
__all__ = ["CopyvioMixIn"] | __all__ = ["CopyvioMixIn"] | ||||
class CopyvioMixIn(object): | class CopyvioMixIn(object): | ||||
@@ -93,7 +93,9 @@ class CopyvioMixIn(object): | |||||
credentials = self._search_config["credentials"] | credentials = self._search_config["credentials"] | ||||
if engine == "Yahoo! BOSS": | if engine == "Yahoo! BOSS": | ||||
if not oauth: | |||||
try: | |||||
oauth.__version__ # Force-load the lazy module | |||||
except (ImportError, AttributeError): | |||||
e = "The package 'oauth2' could not be imported" | e = "The package 'oauth2' could not be imported" | ||||
raise exceptions.UnsupportedSearchEngineError(e) | raise exceptions.UnsupportedSearchEngineError(e) | ||||
return YahooBOSSSearchEngine(credentials) | return YahooBOSSSearchEngine(credentials) | ||||
@@ -22,9 +22,12 @@ | |||||
from os import path | from os import path | ||||
import bs4 | |||||
import mwparserfromhell | import mwparserfromhell | ||||
import nltk | |||||
from earwigbot import importer | |||||
bs4 = importer.new("bs4") | |||||
nltk = importer.new("nltk") | |||||
__all__ = ["BaseTextParser", "ArticleTextParser", "HTMLTextParser"] | __all__ = ["BaseTextParser", "ArticleTextParser", "HTMLTextParser"] | ||||
@@ -23,10 +23,11 @@ | |||||
from json import loads | from json import loads | ||||
from urllib import quote_plus, urlencode | from urllib import quote_plus, urlencode | ||||
import oauth2 as oauth | |||||
from earwigbot import importer | |||||
from earwigbot.exceptions import SearchQueryError | from earwigbot.exceptions import SearchQueryError | ||||
oauth = importer.new("oauth2") | |||||
__all__ = ["BaseSearchEngine", "YahooBOSSSearchEngine"] | __all__ = ["BaseSearchEngine", "YahooBOSSSearchEngine"] | ||||
class BaseSearchEngine(object): | class BaseSearchEngine(object): | ||||