jenkins-bot has submitted this change and it was merged. (
https://gerrit.wikimedia.org/r/272327 )
Change subject: [IMPR] Improve redirect.py
......................................................................
[IMPR] Improve redirect.py
- Enable direct iteration for RedirectGenerator
- setup the generator in generator constructor using action parameter
- derive RedirectRobot from SingleSiteBot
- overwrite super class' init_page, just pass
- setup action threat in bot constructor using action parameter
- treat pages or page titles and call action_treat method to handle it
- implement -total option for all actions
- remove obsolete methods
- use super class' run method. This fixes T153883
Bug: T153883
Change-Id: I94e3b920d4086ebf22fd8a8f41c2a0b33c6605fa
---
M scripts/redirect.py
1 file changed, 45 insertions(+), 44 deletions(-)
Approvals:
Dalba: Looks good to me, approved
jenkins-bot: Verified
diff --git a/scripts/redirect.py b/scripts/redirect.py
index f1cb2b7..fabe715 100755
--- a/scripts/redirect.py
+++ b/scripts/redirect.py
@@ -88,8 +88,8 @@
import pywikibot
-from pywikibot import i18n, xmlreader, Bot
-from pywikibot.bot import OptionHandler
+from pywikibot import i18n, xmlreader
+from pywikibot.bot import OptionHandler, SingleSiteBot
from pywikibot.exceptions import ArgumentDeprecationWarning
from pywikibot.textlib import extract_templates_and_params_regex_simple
from pywikibot.tools.formatter import color_format
@@ -121,7 +121,7 @@
'xml': None,
}
- def __init__(self, **kwargs):
+ def __init__(self, action, **kwargs):
"""Constructor."""
super(RedirectGenerator, self).__init__(**kwargs)
self.site = pywikibot.Site()
@@ -134,6 +134,15 @@
self.api_number = self.getOption('total')
self.api_until = self.getOption('until')
self.xmlFilename = self.getOption('xml')
+
+ # connect the generator selected by 'action' parameter
+ cls = self.__class__
+ if action == 'double':
+ cls.__iter__ = lambda slf: slf.retrieve_double_redirects()
+ elif action == 'broken':
+ cls.__iter__ = lambda slf: slf.retrieve_broken_redirects()
+ elif action == 'both':
+ cls.__iter__ = lambda slf: slf.get_redirects_via_api(maxlen=2)
def get_redirects_from_dump(self, alsoGetPageTitles=False):
"""
@@ -392,7 +401,7 @@
continue
-class RedirectRobot(Bot):
+class RedirectRobot(SingleSiteBot):
"""Redirect bot."""
@@ -407,9 +416,19 @@
self.site = pywikibot.Site()
self.repo = self.site.data_repository()
self.is_repo = self.repo if self.repo == self.site else None
- self.action = action
self.exiting = False
self.sdtemplate = self.get_sd_template()
+
+ # connect the action treat
+ if action == 'double':
+ self.action_treat = self.fix_1_double_redirect
+ elif action == 'broken':
+ self.action_treat = self.delete_1_broken_redirect
+ elif action == 'both':
+ self.action_treat = self.fix_double_or_delete_broken_redirect
+ else:
+ raise NotImplementedError('No valid action "{0}" found.'
+ ''.format(action))
def get_sd_template(self):
"""Look for speedy deletion template and return it.
@@ -439,6 +458,10 @@
''.format('"{0}" '.format(title) if title else
''))
return None
+ def init_page(self, page):
+ """Overwrite super class method."""
+ pass
+
def delete_redirect(self, page, summary_key):
"""Delete the redirect page."""
assert page.site == self.site, (
@@ -460,12 +483,6 @@
page.put(content, reason)
except pywikibot.PageSaveRelatedError as e:
pywikibot.error(e)
-
- def delete_broken_redirects(self):
- """Process all broken redirects."""
- # get reason for deletion text
- for redir_name in self.generator.retrieve_broken_redirects():
- self.delete_1_broken_redirect(redir_name)
def delete_1_broken_redirect(self, redir_name):
"""Treat one broken redirect."""
@@ -566,11 +583,6 @@
targetPage.title(asLink=True),
"Won't delete anything."
if self.getOption('delete') else "Skipping."))
-
- def fix_double_redirects(self):
- """Process double redirects."""
- for redir_name in self.generator.retrieve_double_redirects():
- self.fix_1_double_redirect(redir_name)
def fix_1_double_redirect(self, redir_name):
"""Treat one double redirect."""
@@ -711,34 +723,23 @@
% (redir.title(), error))
break
- def fix_double_or_delete_broken_redirects(self):
- """Process all redirects for 'both'
action."""
- # TODO: part of this should be moved to generator, the rest merged into
- # self.run()
- count = 0
- for (redir_name, code, target, final)\
- in self.generator.get_redirects_via_api(maxlen=2):
- if code == 1:
- continue
- elif code == 0:
- self.delete_1_broken_redirect(redir_name)
- count += 1
- else:
- self.fix_1_double_redirect(redir_name)
- count += 1
- if count >= self.getOption('total'):
- break
+ def fix_double_or_delete_broken_redirect(self, page):
+ """Treat one broken or double redirect."""
+ redir_name, code, target, final = page
+ if code == 1:
+ return
+ elif code == 0:
+ self.delete_1_broken_redirect(redir_name)
+ else:
+ self.fix_1_double_redirect(redir_name)
- def run(self):
- """Run the script method selected by 'action'
parameter."""
- # TODO: make all generators return a redirect type indicator,
- # thus make them usable with 'both'
- if self.action == 'double':
- self.fix_double_redirects()
- elif self.action == 'broken':
- self.delete_broken_redirects()
- elif self.action == 'both':
- self.fix_double_or_delete_broken_redirects()
+ def treat(self, page):
+ """Treat a single page."""
+ self.action_treat(page)
+ if self._treat_counter >= self.getOption('total'):
+ pywikibot.output('\nNumber of pages reached the total limit. '
+ 'Script terminated.')
+ self.quit()
def main(*args):
@@ -821,7 +822,7 @@
pywikibot.bot.suggest_help(missing_action=True)
else:
pywikibot.Site().login()
- options['generator'] = RedirectGenerator(**gen_options)
+ options['generator'] = RedirectGenerator(action, **gen_options)
bot = RedirectRobot(action, **options)
bot.run()
--
To view, visit
https://gerrit.wikimedia.org/r/272327
To unsubscribe, visit
https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I94e3b920d4086ebf22fd8a8f41c2a0b33c6605fa
Gerrit-PatchSet: 10
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Owner: Xqt <info(a)gno.de>
Gerrit-Reviewer: Dalba <dalba.wiki(a)gmail.com>
Gerrit-Reviewer: John Vandenberg <jayvdb(a)gmail.com>
Gerrit-Reviewer: Magul <tomasz.magulski(a)gmail.com>
Gerrit-Reviewer: Xqt <info(a)gno.de>
Gerrit-Reviewer: jenkins-bot <>