A Python robot that edits Wikipedia and interacts with people over IRC https://en.wikipedia.org/wiki/User:EarwigBot
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

253 rader
8.5 KiB

  1. # -*- coding: utf-8 -*-
  2. #
  3. # Copyright (C) 2009-2012 by Ben Kurtovic <ben.kurtovic@verizon.net>
  4. #
  5. # Permission is hereby granted, free of charge, to any person obtaining a copy
  6. # of this software and associated documentation files (the "Software"), to deal
  7. # in the Software without restriction, including without limitation the rights
  8. # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  9. # copies of the Software, and to permit persons to whom the Software is
  10. # furnished to do so, subject to the following conditions:
  11. #
  12. # The above copyright notice and this permission notice shall be included in
  13. # all copies or substantial portions of the Software.
  14. #
  15. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  18. # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20. # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  21. # SOFTWARE.
  22. """
  23. EarwigBot Exceptions
  24. This module contains all exceptions used by EarwigBot::
  25. EarwigBotError
  26. +-- NoConfigError
  27. +-- IRCError
  28. | +-- BrokenSocketError
  29. | +-- KwargParseError
  30. +-- WikiToolsetError
  31. +-- SiteNotFoundError
  32. +-- SiteAPIError
  33. +-- LoginError
  34. +-- NamespaceNotFoundError
  35. +-- PageNotFoundError
  36. +-- InvalidPageError
  37. +-- RedirectError
  38. +-- UserNotFoundError
  39. +-- EditError
  40. | +-- PermissionsError
  41. | +-- EditConflictError
  42. | +-- NoContentError
  43. | +-- ContentTooBigError
  44. | +-- SpamDetectedError
  45. | +-- FilteredError
  46. +-- SQLError
  47. +-- CopyvioCheckError
  48. +-- UnknownSearchEngineError
  49. +-- UnsupportedSearchEngineError
  50. +-- SearchQueryError
  51. """
  52. class EarwigBotError(Exception):
  53. """Base exception class for errors in EarwigBot."""
  54. class NoConfigError(EarwigBotError):
  55. """The bot cannot be run without a config file.
  56. This occurs if no config file exists, and the user said they did not want
  57. one to be created.
  58. """
  59. class IRCError(EarwigBotError):
  60. """Base exception class for errors in IRC-relation sections of the bot."""
  61. class BrokenSocketError(IRCError):
  62. """A socket has broken, because it is not sending data.
  63. Raised by :py:meth:`IRCConnection._get
  64. <earwigbot.irc.connection.IRCConnection._get>`.
  65. """
  66. class KwargParseError(IRCError):
  67. """Couldn't parse a certain keyword argument in an IRC message.
  68. This is usually caused by it being given incorrectly: e.g., no value (abc),
  69. just a value (=xyz), just an equal sign (=), instead of the correct form
  70. (abc=xyz).
  71. Raised by :py:meth:`Data.parse_kwargs
  72. <earwigbot.irc.data.Data.parse_kwargs>`.
  73. """
  74. class WikiToolsetError(EarwigBotError):
  75. """Base exception class for errors in the Wiki Toolset."""
  76. class SiteNotFoundError(WikiToolsetError):
  77. """A particular site could not be found in the sites database.
  78. Raised by :py:class:`~earwigbot.wiki.sitesdb.SitesDB`.
  79. """
  80. class SiteAPIError(WikiToolsetError):
  81. """Couldn't connect to a site's API.
  82. Perhaps the server doesn't exist, our URL is wrong or incomplete, or
  83. there are temporary problems on their end.
  84. Raised by :py:meth:`Site.api_query <earwigbot.wiki.site.Site.api_query>`.
  85. """
  86. class LoginError(WikiToolsetError):
  87. """An error occured while trying to login.
  88. Perhaps the username/password is incorrect.
  89. Raised by :py:meth:`Site._login <earwigbot.wiki.site.Site._login>`.
  90. """
  91. class NamespaceNotFoundError(WikiToolsetError):
  92. """A requested namespace name or namespace ID does not exist.
  93. Raised by :py:meth:`Site.namespace_id_to_name
  94. <earwigbot.wiki.site.Site.namespace_id_to_name>` and
  95. :py:meth:`Site.namespace_name_to_id
  96. <earwigbot.wiki.site.Site.namespace_name_to_id>`.
  97. """
  98. class PageNotFoundError(WikiToolsetError):
  99. """Attempted to get information about a page that does not exist.
  100. Raised by :py:class:`~earwigbot.wiki.page.Page`.
  101. """
  102. class InvalidPageError(WikiToolsetError):
  103. """Attempted to get information about a page whose title is invalid.
  104. Raised by :py:class:`~earwigbot.wiki.page.Page`.
  105. """
  106. class RedirectError(WikiToolsetError):
  107. """A redirect-only method was called on a malformed or non-redirect page.
  108. Raised by :py:meth:`Page.get_redirect_target
  109. <earwigbot.wiki.page.Page.get_redirect_target>`.
  110. """
  111. class UserNotFoundError(WikiToolsetError):
  112. """Attempted to get certain information about a user that does not exist.
  113. Raised by :py:class:`~earwigbot.wiki.user.User`.
  114. """
  115. class EditError(WikiToolsetError):
  116. """An error occured while editing.
  117. This is used as a base class for all editing errors; this one specifically
  118. is used only when a generic error occurs that we don't know about.
  119. Raised by :py:meth:`Page.edit <earwigbot.wiki.page.Page.edit>` and
  120. :py:meth:`Page.add_section <earwigbot.wiki.page.Page.add_section>`.
  121. """
  122. class PermissionsError(EditError):
  123. """A permissions error ocurred while editing.
  124. We tried to do something we don't have permission to, like trying to delete
  125. a page as a non-admin, or trying to edit a page without login information
  126. and AssertEdit enabled.
  127. Raised by :py:meth:`Page.edit <earwigbot.wiki.page.Page.edit>` and
  128. :py:meth:`Page.add_section <earwigbot.wiki.page.Page.add_section>`.
  129. """
  130. class EditConflictError(EditError):
  131. """We gotten an edit conflict or a (rarer) delete/recreate conflict.
  132. Raised by :py:meth:`Page.edit <earwigbot.wiki.page.Page.edit>` and
  133. :py:meth:`Page.add_section <earwigbot.wiki.page.Page.add_section>`.
  134. """
  135. class NoContentError(EditError):
  136. """We tried to create a page or new section with no content.
  137. Raised by :py:meth:`Page.edit <earwigbot.wiki.page.Page.edit>` and
  138. :py:meth:`Page.add_section <earwigbot.wiki.page.Page.add_section>`.
  139. """
  140. class ContentTooBigError(EditError):
  141. """The edit we tried to push exceeded the article size limit.
  142. Raised by :py:meth:`Page.edit <earwigbot.wiki.page.Page.edit>` and
  143. :py:meth:`Page.add_section <earwigbot.wiki.page.Page.add_section>`.
  144. """
  145. class SpamDetectedError(EditError):
  146. """The spam filter refused our edit.
  147. Raised by :py:meth:`Page.edit <earwigbot.wiki.page.Page.edit>` and
  148. :py:meth:`Page.add_section <earwigbot.wiki.page.Page.add_section>`.
  149. """
  150. class FilteredError(EditError):
  151. """The edit filter refused our edit.
  152. Raised by :py:meth:`Page.edit <earwigbot.wiki.page.Page.edit>` and
  153. :py:meth:`Page.add_section <earwigbot.wiki.page.Page.add_section>`.
  154. """
  155. class SQLError(WikiToolsetError):
  156. """Some error involving SQL querying occurred.
  157. Raised by :py:meth:`Site.sql_query <earwigbot.wiki.site.Site.sql_query>`.
  158. """
  159. class CopyvioCheckError(WikiToolsetError):
  160. """An error occured when checking a page for copyright violations.
  161. This is a base class for multiple exceptions; usually one of those will be
  162. raised instead of this.
  163. Raised by :py:meth:`Page.copyvio_check
  164. <earwigbot.wiki.copyvios.CopyvioMixin.copyvio_check>` and
  165. :py:meth:`Page.copyvio_compare
  166. <earwigbot.wiki.copyvios.CopyvioMixin.copyvio_compare>`.
  167. """
  168. class UnknownSearchEngineError(CopyvioCheckError):
  169. """Attempted to do a copyvio check with an unknown search engine.
  170. Search engines are specified in :file:`config.yml` as
  171. :py:attr:`config.wiki["search"]["engine"]`.
  172. Raised by :py:meth:`Page.copyvio_check
  173. <earwigbot.wiki.copyvios.CopyvioMixin.copyvio_check>` and
  174. :py:meth:`Page.copyvio_compare
  175. <earwigbot.wiki.copyvios.CopyvioMixin.copyvio_compare>`.
  176. """
  177. class UnsupportedSearchEngineError(CopyvioCheckError):
  178. """Attmpted to do a copyvio check using an unavailable engine.
  179. This might occur if, for example, an engine requires oauth2 but the package
  180. couldn't be imported.
  181. Raised by :py:meth:`Page.copyvio_check
  182. <earwigbot.wiki.copyvios.CopyvioMixin.copyvio_check>` and
  183. :py:meth:`Page.copyvio_compare
  184. <earwigbot.wiki.copyvios.CopyvioMixin.copyvio_compare>`.
  185. """
  186. class SearchQueryError(CopyvioCheckError):
  187. """Some error ocurred while doing a search query.
  188. Raised by :py:meth:`Page.copyvio_check
  189. <earwigbot.wiki.copyvios.CopyvioMixin.copyvio_check>` and
  190. :py:meth:`Page.copyvio_compare
  191. <earwigbot.wiki.copyvios.CopyvioMixin.copyvio_compare>`.
  192. """