From 25f31124db3b661f832be90182827b02a6265497 Mon Sep 17 00:00:00 2001 From: Ben Kurtovic Date: Sat, 5 May 2012 15:48:52 -0400 Subject: [PATCH] earwigbot.wiki.exceptions -> earwigbot.exceptions; cleanup --- earwigbot/__init__.py | 10 ++++++- earwigbot/{wiki => }/exceptions.py | 56 ++++++++++++++++++++------------------ earwigbot/wiki/__init__.py | 1 - earwigbot/wiki/constants.py | 3 +- earwigbot/wiki/copyright.py | 2 +- earwigbot/wiki/page.py | 42 ++++++++++++++-------------- earwigbot/wiki/site.py | 28 +++++++++---------- earwigbot/wiki/sitesdb.py | 2 +- earwigbot/wiki/user.py | 8 +++--- 9 files changed, 82 insertions(+), 70 deletions(-) rename earwigbot/{wiki => }/exceptions.py (82%) diff --git a/earwigbot/__init__.py b/earwigbot/__init__.py index fa766e0..236104c 100644 --- a/earwigbot/__init__.py +++ b/earwigbot/__init__.py @@ -49,4 +49,12 @@ if not __release__: finally: del _add_git_commit_id_to_version_string -from earwigbot import bot, commands, config, irc, managers, tasks, util, wiki +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 diff --git a/earwigbot/wiki/exceptions.py b/earwigbot/exceptions.py similarity index 82% rename from earwigbot/wiki/exceptions.py rename to earwigbot/exceptions.py index 41266df..05d8226 100644 --- a/earwigbot/wiki/exceptions.py +++ b/earwigbot/exceptions.py @@ -21,34 +21,38 @@ # SOFTWARE. """ -EarwigBot's Wiki Toolset: Exceptions - -This module contains all exceptions used by the wiki package. There are a lot: - --- WikiToolsetError - -- SiteNotFoundError - -- SiteAPIError - -- LoginError - -- NamespaceNotFoundError - -- PageNotFoundError - -- InvalidPageError - -- RedirectError - -- UserNotFoundError - -- EditError - -- PermissionsError - -- EditConflictError - -- NoContentError - -- ContentTooBigError - -- SpamDetectedError - -- FilteredError - -- SQLError - -- CopyvioCheckError - -- UnknownSearchEngineError - -- UnsupportedSearchEngineError - -- SearchQueryError +EarwigBot Exceptions + +This module contains all exceptions used by EarwigBot:: + +EarwigBotError + +-- WikiToolsetError + +-- SiteNotFoundError + +-- SiteAPIError + +-- LoginError + +-- NamespaceNotFoundError + +-- PageNotFoundError + +-- InvalidPageError + +-- RedirectError + +-- UserNotFoundError + +-- EditError + | +-- PermissionsError + | +-- EditConflictError + | +-- NoContentError + | +-- ContentTooBigError + | +-- SpamDetectedError + | +-- FilteredError + +-- SQLError + +-- CopyvioCheckError + +-- UnknownSearchEngineError + +-- UnsupportedSearchEngineError + +-- SearchQueryError """ -class WikiToolsetError(Exception): +class EarwigBotErorr(Exception): + """Base exception class for errors in EarwigBot.""" + +class WikiToolsetError(EarwigBotErorr): """Base exception class for errors in the Wiki Toolset.""" class SiteNotFoundError(WikiToolsetError): diff --git a/earwigbot/wiki/__init__.py b/earwigbot/wiki/__init__.py index 3c11724..9765239 100644 --- a/earwigbot/wiki/__init__.py +++ b/earwigbot/wiki/__init__.py @@ -37,7 +37,6 @@ Category, and User) needs. from earwigbot.wiki.category import * from earwigbot.wiki.constants import * -from earwigbot.wiki.exceptions import * from earwigbot.wiki.page import * from earwigbot.wiki.site import * from earwigbot.wiki.sitesdb import * diff --git a/earwigbot/wiki/constants.py b/earwigbot/wiki/constants.py index 8e818a6..7ccb136 100644 --- a/earwigbot/wiki/constants.py +++ b/earwigbot/wiki/constants.py @@ -35,7 +35,8 @@ earwigbot.wiki (e.g. `earwigbot.wiki.USER_AGENT`). # Default User Agent when making API queries: from earwigbot import __version__ as _v from platform import python_version as _p -USER_AGENT = "EarwigBot/{0} (Python/{1}; https://github.com/earwig/earwigbot)".format(_v, _p()) +USER_AGENT = "EarwigBot/{0} (Python/{1}; https://github.com/earwig/earwigbot)" +USER_AGENT = USER_AGENT.format(_v, _p()) del _v, _p # Default namespace IDs: diff --git a/earwigbot/wiki/copyright.py b/earwigbot/wiki/copyright.py index c003ebb..397c5c1 100644 --- a/earwigbot/wiki/copyright.py +++ b/earwigbot/wiki/copyright.py @@ -35,7 +35,7 @@ try: except ImportError: oauth = None -from earwigbot.wiki.exceptions import * +from earwigbot.exceptions import * class _CopyvioCheckResult(object): def __init__(self, violation, confidence, url, queries, article, chains): diff --git a/earwigbot/wiki/page.py b/earwigbot/wiki/page.py index e6e9a4f..1c7ab0f 100644 --- a/earwigbot/wiki/page.py +++ b/earwigbot/wiki/page.py @@ -25,8 +25,8 @@ import re from time import gmtime, strftime from urllib import quote +from earwigbot import exceptions from earwigbot.wiki.copyright import CopyrightMixin -from earwigbot.wiki.exceptions import * __all__ = ["Page"] @@ -132,7 +132,7 @@ class Page(CopyrightMixin): """ if self._exists == 1: e = "Page '{0}' is invalid.".format(self._title) - raise InvalidPageError(e) + raise exceptions.InvalidPageError(e) def _force_existence(self): """Used to ensure that our page exists. @@ -144,7 +144,7 @@ class Page(CopyrightMixin): self._force_validity() if self._exists == 2: e = "Page '{0}' does not exist.".format(self._title) - raise PageNotFoundError(e) + raise exceptions.PageNotFoundError(e) def _load_wrapper(self): """Calls _load_attributes() and follows redirects if we're supposed to. @@ -278,8 +278,8 @@ class Page(CopyrightMixin): self._load_attributes() if not self._token: e = "You don't have permission to edit this page." - raise PermissionsError(e) - + raise exceptions.PermissionsError(e) + # Weed out invalid pages before we get too far: self._force_validity() @@ -310,7 +310,7 @@ class Page(CopyrightMixin): try: assertion = result["edit"]["assert"] except KeyError: - raise EditError(result["edit"]) + raise exceptions.EditError(result["edit"]) self._handle_assert_edit(assertion, params, tries) def _build_edit_params(self, text, summary, minor, bot, force, section, @@ -353,13 +353,13 @@ class Page(CopyrightMixin): """ if error.code in ["noedit", "cantcreate", "protectedtitle", "noimageredirect"]: - raise PermissionsError(error.info) + raise exceptions.PermissionsError(error.info) elif error.code in ["noedit-anon", "cantcreate-anon", "noimageredirect-anon"]: if not all(self._site._login_info): # Insufficient login info: - raise PermissionsError(error.info) + raise exceptions.PermissionsError(error.info) if tries == 0: # We have login info; try to login: self._site._login(self._site._login_info) @@ -368,28 +368,28 @@ class Page(CopyrightMixin): else: # We already tried to log in and failed! e = "Although we should be logged in, we are not. This may be a cookie problem or an odd bug." - raise LoginError(e) + raise exceptions.LoginError(e) elif error.code in ["editconflict", "pagedeleted", "articleexists"]: # These attributes are now invalidated: self._content = None self._basetimestamp = None self._exists = 0 - raise EditConflictError(error.info) + raise exceptions.EditConflictError(error.info) elif error.code in ["emptypage", "emptynewsection"]: - raise NoContentError(error.info) + raise exceptions.NoContentError(error.info) elif error.code == "contenttoobig": - raise ContentTooBigError(error.info) + raise exceptions.ContentTooBigError(error.info) elif error.code == "spamdetected": - raise SpamDetectedError(error.info) + raise exceptions.SpamDetectedError(error.info) elif error.code == "filtered": - raise FilteredError(error.info) + raise exceptions.FilteredError(error.info) - raise EditError(": ".join((error.code, error.info))) + raise exceptions.EditError(": ".join((error.code, error.info))) def _handle_assert_edit(self, assertion, params, tries): """If we can't edit due to a failed AssertEdit assertion, handle that. @@ -401,7 +401,7 @@ class Page(CopyrightMixin): if not all(self._site._login_info): # Insufficient login info: e = "AssertEdit: user assertion failed, and no login info was provided." - raise PermissionsError(e) + raise exceptions.PermissionsError(e) if tries == 0: # We have login info; try to login: self._site._login(self._site._login_info) @@ -410,15 +410,15 @@ class Page(CopyrightMixin): else: # We already tried to log in and failed! e = "Although we should be logged in, we are not. This may be a cookie problem or an odd bug." - raise LoginError(e) + raise exceptions.LoginError(e) elif assertion == "bot": e = "AssertEdit: bot assertion failed; we don't have a bot flag!" - raise PermissionsError(e) + raise exceptions.PermissionsError(e) # Unknown assertion, maybe "true", "false", or "exists": e = "AssertEdit: assertion '{0}' failed.".format(assertion) - raise PermissionsError(e) + raise exceptions.PermissionsError(e) def title(self, force=False): """Returns the Page's title, or pagename. @@ -570,7 +570,7 @@ class Page(CopyrightMixin): if self._namespace < 0: ns = self._site.namespace_id_to_name(self._namespace) e = "Pages in the {0} namespace can't have talk pages.".format(ns) - raise InvalidPageError(e) + raise exceptions.InvalidPageError(e) if self._is_talkpage: new_ns = self._namespace - 1 @@ -650,7 +650,7 @@ class Page(CopyrightMixin): return re.findall(self.re_redirect, content, flags=re.I)[0] except IndexError: e = "The page does not appear to have a redirect target." - raise RedirectError(e) + raise exceptions.RedirectError(e) def edit(self, text, summary, minor=False, bot=True, force=False): """Replaces the page's content or creates a new page. diff --git a/earwigbot/wiki/site.py b/earwigbot/wiki/site.py index 6505965..f90a2cc 100644 --- a/earwigbot/wiki/site.py +++ b/earwigbot/wiki/site.py @@ -38,9 +38,9 @@ try: except ImportError: oursql = None +from earwigbot import exceptions +from earwigbot.wiki import constants from earwigbot.wiki.category import Category -from earwigbot.wiki.constants import * -from earwigbot.wiki.exceptions import * from earwigbot.wiki.page import Page from earwigbot.wiki.user import User @@ -128,7 +128,7 @@ class Site(object): else: self._cookiejar = CookieJar() if not user_agent: - user_agent = USER_AGENT # Set default UA from wiki.constants + user_agent = constants.USER_AGENT # Set default UA self._opener = build_opener(HTTPCookieProcessor(self._cookiejar)) self._opener.addheaders = [("User-Agent", user_agent), ("Accept-Encoding", "gzip")] @@ -232,7 +232,7 @@ class Site(object): e = e.format(error.code) else: e = "API query failed." - raise SiteAPIError(e) + raise exceptions.SiteAPIError(e) result = response.read() if response.headers.get("Content-Encoding") == "gzip": @@ -246,7 +246,7 @@ class Site(object): """Given API query params, return the URL to query and POST data.""" if not self._base_url or self._script_path is None: e = "Tried to do an API query, but no API URL is known." - raise SiteAPIError(e) + raise exceptions.SiteAPIError(e) base_url = self._base_url if base_url.startswith("//"): # Protocol-relative URLs from 1.18 @@ -271,7 +271,7 @@ class Site(object): res = loads(result) # Try to parse as a JSON object except ValueError: e = "API query failed: JSON could not be decoded." - raise SiteAPIError(e) + raise exceptions.SiteAPIError(e) try: code = res["error"]["code"] @@ -282,7 +282,7 @@ class Site(object): if code == "maxlag": # We've been throttled by the server if tries >= self._max_retries: e = "Maximum number of retries reached ({0})." - raise SiteAPIError(e.format(self._max_retries)) + raise exceptions.SiteAPIError(e.format(self._max_retries)) tries += 1 msg = 'Server says "{0}"; retrying in {1} seconds ({2}/{3})' self._logger.info(msg.format(info, wait, tries, self._max_retries)) @@ -290,7 +290,7 @@ class Site(object): return self._api_query(params, tries=tries, wait=wait*3) else: # Some unknown error occurred e = 'API query failed: got error "{0}"; server says: "{1}".' - error = SiteAPIError(e.format(code, info)) + error = earwigbot.SiteAPIError(e.format(code, info)) error.code, error.info = code, info raise error @@ -491,7 +491,7 @@ class Site(object): e = "The given password is incorrect." else: e = "Couldn't login; server says '{0}'.".format(res) - raise LoginError(e) + raise exceptions.LoginError(e) def _logout(self): """Safely logout through the API. @@ -518,7 +518,7 @@ class Site(object): """ if not oursql: e = "Module 'oursql' is required for SQL queries." - raise SQLError(e) + raise exceptions.SQLError(e) args = self._sql_data for key, value in kwargs.iteritems(): @@ -638,7 +638,7 @@ class Site(object): return self._namespaces[ns_id][0] except KeyError: e = "There is no namespace with id {0}.".format(ns_id) - raise NamespaceNotFoundError(e) + raise exceptions.NamespaceNotFoundError(e) def namespace_name_to_id(self, name): """Given a namespace name, returns the associated ID. @@ -655,7 +655,7 @@ class Site(object): return ns_id e = "There is no namespace with name '{0}'.".format(name) - raise NamespaceNotFoundError(e) + raise exceptions.NamespaceNotFoundError(e) def get_page(self, title, follow_redirects=False): """Returns a Page object for the given title (pagename). @@ -667,7 +667,7 @@ class Site(object): Note that this doesn't do any direct checks for existence or redirect-following - Page's methods provide that. """ - prefixes = self.namespace_id_to_name(NS_CATEGORY, all=True) + prefixes = self.namespace_id_to_name(constants.NS_CATEGORY, all=True) prefix = title.split(":", 1)[0] if prefix != title: # Avoid a page that is simply "Category" if prefix in prefixes: @@ -680,7 +680,7 @@ class Site(object): `catname` should be given *without* a namespace prefix. This method is really just shorthand for get_page("Category:" + catname). """ - prefix = self.namespace_id_to_name(NS_CATEGORY) + prefix = self.namespace_id_to_name(constants.NS_CATEGORY) pagename = ':'.join((prefix, catname)) return Category(self, pagename, follow_redirects) diff --git a/earwigbot/wiki/sitesdb.py b/earwigbot/wiki/sitesdb.py index 2a3cba5..c60fa13 100644 --- a/earwigbot/wiki/sitesdb.py +++ b/earwigbot/wiki/sitesdb.py @@ -28,7 +28,7 @@ import stat import sqlite3 as sqlite from earwigbot import __version__ -from earwigbot.wiki.exceptions import SiteNotFoundError +from earwigbot.exceptions import SiteNotFoundError from earwigbot.wiki.site import Site __all__ = ["SitesDB"] diff --git a/earwigbot/wiki/user.py b/earwigbot/wiki/user.py index 6c51051..67c9567 100644 --- a/earwigbot/wiki/user.py +++ b/earwigbot/wiki/user.py @@ -22,8 +22,8 @@ from time import gmtime, strptime -from earwigbot.wiki.constants import * -from earwigbot.wiki.exceptions import UserNotFoundError +from earwigbot.exceptions import UserNotFoundError +from earwigbot.wiki import constants from earwigbot.wiki.page import Page __all__ = ["User"] @@ -252,7 +252,7 @@ class User(object): No checks are made to see if it exists or not. Proper site namespace conventions are followed. """ - prefix = self._site.namespace_id_to_name(NS_USER) + prefix = self._site.namespace_id_to_name(constants.NS_USER) pagename = ':'.join((prefix, self._name)) return Page(self._site, pagename) @@ -262,6 +262,6 @@ class User(object): No checks are made to see if it exists or not. Proper site namespace conventions are followed. """ - prefix = self._site.namespace_id_to_name(NS_USER_TALK) + prefix = self._site.namespace_id_to_name(constants.NS_USER_TALK) pagename = ':'.join((prefix, self._name)) return Page(self._site, pagename)