jenkins-bot has submitted this change and it was merged.
Change subject: Subclass ReplaceRobot ......................................................................
Subclass ReplaceRobot
Update image and template bots to be simple subclasses of the replace bot.
Bot superclass can now accept a site parameter.
Update replace bot __init__ to accept standard 'always' argument instead of now deprecated 'acceptall'.
Change-Id: I687fcfb2f06872a91d5fe999acdac8557e0c0ede --- M pywikibot/bot.py M scripts/image.py M scripts/replace.py M scripts/template.py 4 files changed, 50 insertions(+), 42 deletions(-)
Approvals: John Vandenberg: Looks good to me, but someone else must approve Ricordisamoa: Looks good to me, approved jenkins-bot: Verified
diff --git a/pywikibot/bot.py b/pywikibot/bot.py index b319e3c..57e4721 100644 --- a/pywikibot/bot.py +++ b/pywikibot/bot.py @@ -1004,9 +1004,13 @@ if 'generator' in kwargs: self.generator = kwargs.pop('generator')
+ # TODO: add warning if site is specified and generator + # contains pages from a different site. + self._site = kwargs.pop('site', None) + self._sites = set([self._site] if self._site else []) + self.setOptions(**kwargs) - self._site = None - self._sites = set() + self._treat_counter = 0 self._save_counter = 0
@@ -1193,6 +1197,7 @@ """Site that the bot is using.""" if not self._site: warning('Bot.site was not set before being retrieved.') + # TODO: peak at a page from the generator to determine the site self.site = pywikibot.Site() warning('Using the default site: %s' % self.site) return self._site diff --git a/scripts/image.py b/scripts/image.py index 16026c3..d7b61a2 100755 --- a/scripts/image.py +++ b/scripts/image.py @@ -35,7 +35,7 @@
""" # -# (C) Pywikibot team, 2013-2014 +# (C) Pywikibot team, 2013-2015 # # Distributed under the terms of the MIT license. # @@ -43,13 +43,16 @@
__version__ = '$Id$' # -import pywikibot -import replace -from pywikibot import i18n, pagegenerators, Bot import re
+import pywikibot
-class ImageRobot(Bot): +from pywikibot import i18n, pagegenerators, Bot + +from scripts.replace import ReplaceRobot as ReplaceBot + + +class ImageRobot(ReplaceBot):
"""This bot will replace or remove all occurrences of an old image."""
@@ -113,9 +116,9 @@ 'summary': None, 'loose': False, }) - super(ImageRobot, self).__init__(**kwargs)
- self.generator = generator + Bot.__init__(self, generator=generator, **kwargs) + self.old_image = old_image self.new_image = new_image
@@ -126,8 +129,6 @@ else self.old_image, fallback=True)
- def run(self): - """Start the bot's action.""" # regular expression to find the original template. # {{vfd}} does the same thing as {{Vfd}}, so both will be found. # The old syntax, {{msg:vfd}}, will also be found. @@ -164,10 +165,9 @@ else: replacements.append((image_regex, ''))
- replaceBot = replace.ReplaceRobot(self.generator, replacements, - acceptall=self.getOption('always'), - summary=self.getOption('summary')) - replaceBot.run() + super(ImageRobot, self).__init__(self.generator, replacements, + always=self.getOption('always'), + summary=self.getOption('summary'))
def main(*args): diff --git a/scripts/replace.py b/scripts/replace.py index 73c73aa..b3f6470 100755 --- a/scripts/replace.py +++ b/scripts/replace.py @@ -139,13 +139,14 @@ import sys
import pywikibot + from pywikibot import i18n, textlib, pagegenerators, Bot from pywikibot import editor as editarticle
# Imports predefined replacements tasks from fixes.py from pywikibot import fixes
-from pywikibot.tools import chars +from pywikibot.tools import chars, deprecated_args
if sys.version_info[0] > 2: basestring = (str, ) @@ -405,9 +406,10 @@
"""A bot that can do text replacements."""
+ @deprecated_args(acceptall='always') def __init__(self, generator, replacements, exceptions={}, - acceptall=False, allowoverlap=False, recursive=False, - addedCat=None, sleep=None, summary='', site=None): + always=False, allowoverlap=False, recursive=False, + addedCat=None, sleep=None, summary='', **kwargs): """ Constructor.
@@ -419,7 +421,7 @@ string). * exceptions - A dictionary which defines when not to change an occurrence. See below. - * acceptall - If True, the user won't be prompted before changes + * always - If True, the user won't be prompted before changes are made. * allowoverlap - If True, when matches overlap, all of them are replaced. @@ -446,7 +448,10 @@ exceptionRegexes dictionary in textlib.replaceExcept().
""" - super(ReplaceRobot, self).__init__(generator=generator) + super(ReplaceRobot, self).__init__(generator=generator, + always=always, + **kwargs) + for i, replacement in enumerate(replacements): if isinstance(replacement, collections.Sequence): if len(replacement) != 2: @@ -458,11 +463,9 @@ replacement[1]) self.replacements = replacements self.exceptions = exceptions - self.acceptall = acceptall + self.acceptall = always # deprecated self.allowoverlap = allowoverlap self.recursive = recursive - if site: - self.site = site
if addedCat: if isinstance(addedCat, pywikibot.Category): @@ -613,7 +616,7 @@ pywikibot.output(u"\n\n>>> \03{lightpurple}%s\03{default} <<<" % page.title()) pywikibot.showDiff(original_text, new_text) - if self.acceptall: + if self.getOption('always'): break choice = pywikibot.input_choice( u'Do you want to accept these changes?', @@ -638,12 +641,12 @@ new_text = original_text continue if choice == 'a': - self.acceptall = True + self.options['always'] = True if choice == 'y': page.put_async(new_text, self.generate_summary(applied), callback=self.count_changes) # choice must be 'N' break - if self.acceptall and new_text != original_text: + if self.getOption('always') and new_text != original_text: try: page.put(new_text, self.generate_summary(applied), callback=self.count_changes) except pywikibot.EditConflict: diff --git a/scripts/template.py b/scripts/template.py index 999b22f..8b09314 100755 --- a/scripts/template.py +++ b/scripts/template.py @@ -111,9 +111,12 @@ #
import re + import pywikibot + from pywikibot import i18n, pagegenerators, xmlreader, Bot -from scripts import replace + +from scripts.replace import ReplaceRobot as ReplaceBot
def UserEditFilterGenerator(generator, username, timestamp=None, skip=False, @@ -193,7 +196,7 @@ yield page
-class TemplateRobot(Bot): +class TemplateRobot(ReplaceBot):
"""This bot will replace, remove or subst all occurrences of a template."""
@@ -214,20 +217,19 @@ 'summary': None, 'addedCat': None, }) - super(TemplateRobot, self).__init__(**kwargs)
- self.generator = generator + Bot.__init__(self, generator=generator, **kwargs) + self.templates = templates - site = pywikibot.Site() - if self.getOption('addedCat'): - self.options['addedCat'] = pywikibot.Category(site, self.getOption('addedCat')) - - comma = site.mediawiki_message('comma-separator')
# get edit summary message if it's empty if not self.getOption('summary'): + comma = self.site.mediawiki_message('comma-separator') params = {'list': comma.join(self.templates.keys()), 'num': len(self.templates)} + + site = self.site + if self.getOption('remove'): self.options['summary'] = i18n.twntranslate( site, 'template-removing', params) @@ -238,8 +240,6 @@ self.options['summary'] = i18n.twntranslate( site, 'template-changing', params)
- def run(self): - """Start the robot's action.""" # regular expression to find the original template. # {{vfd}} does the same thing as {{Vfd}}, so both will be found. # The old syntax, {{msg:vfd}}, will also be found. @@ -283,11 +283,11 @@ replacements.append((templateRegex, r'{{%s\g<parameters>}}' % new))
- replaceBot = replace.ReplaceRobot(self.generator, replacements, - exceptions, acceptall=self.getOption('always'), - addedCat=self.getOption('addedCat'), - summary=self.getOption('summary')) - replaceBot.run() + super(TemplateRobot, self).__init__( + generator, replacements, exceptions, + always=self.getOption('always'), + addedCat=self.getOption('addedCat'), + summary=self.getOption('summary'))
def main(*args):
pywikibot-commits@lists.wikimedia.org