Ladsgroup has submitted this change and it was merged.
Change subject: Use pagegenerators for clean_sandbox.py ......................................................................
Use pagegenerators for clean_sandbox.py
Bug: T87634 Change-Id: If6de6b1a3df60b762d8dc99f1310602eee61d03f --- M scripts/clean_sandbox.py 1 file changed, 34 insertions(+), 79 deletions(-)
Approvals: John Vandenberg: Looks good to me, approved XZise: Looks good to me, but someone else must approve Ladsgroup: Looks good to me, approved
Objections: Xqt: There's a problem with this change, please improve
diff --git a/scripts/clean_sandbox.py b/scripts/clean_sandbox.py index 9d42220..527da31 100755 --- a/scripts/clean_sandbox.py +++ b/scripts/clean_sandbox.py @@ -5,6 +5,10 @@
This script understands the following command-line arguments:
+¶ms; + +Furthermore, the following command line parameters are supported: + -hours:# Use this parameter if to make the script repeat itself after # hours. Hours can be defined as a decimal. 0.01 hours are 36 seconds; 0.1 are 6 minutes. @@ -13,20 +17,6 @@ was made. If no parameter is given it takes it from hours and limits it between 5 and 15 minutes. The minimum delay time is 5 minutes. - - -user Use this parameter to run the script in the user name- - space. - > ATTENTION: on most wiki THIS IS FORBIDEN FOR BOTS ! < - > (please talk with your admin first) < - Since it is considered bad style to edit user page with- - out permission, the 'user_sandboxTemplate' for given - language has to be set-up (no fall-back will be used). - All pages containing that template will get cleaned. - Please be also aware that the rules when to clean the - user sandbox differ from those for project sandbox. - - -page Run the bot on specific page, you can use this when - you haven't configured clean_candbox for your wiki.
-text The text that substitutes in the sandbox, you can use this when you haven't configured clean_candbox for your wiki. @@ -51,9 +41,8 @@
import time import datetime -import sys import pywikibot -from pywikibot import i18n, Bot +from pywikibot import i18n, Bot, pagegenerators
content = { 'commons': u'{{Sandbox}}\n<!-- Please edit only below this line. -->', @@ -143,12 +132,10 @@ 'zh': u'Project:沙盒', }
-user_content = { - 'de': u'{{Benutzer:DrTrigonBot/Spielwiese}}', -} - -user_sandboxTemplate = { - 'de': u'User:DrTrigonBot/Spielwiese', +# This is required for the text that is shown when you run this script +# with the parameter -help. +docuReplacements = { + '¶ms;': pagegenerators.parameterHelp, }
@@ -161,9 +148,7 @@ 'no_repeat': True, 'delay': None, 'delay_td': None, - 'user': False, 'text': "", - 'page': None, 'summary': "", }
@@ -178,23 +163,19 @@ self.availableOptions['delay_td'] = datetime.timedelta(minutes=d)
self.site = pywikibot.Site() - if self.getOption('user'): - localSandboxTitle = i18n.translate(self.site, - user_sandboxTemplate) - localSandbox = pywikibot.Page(self.site, localSandboxTitle) - content.update(user_content) - sandboxTitle[self.site.code] = [item.title() for item in - localSandbox.getReferences( - onlyTemplateInclusion=True)] - if self.site.code not in user_sandboxTemplate: - content[self.site.code] = None - pywikibot.output( - u'Not properly set-up to run in user namespace!') - if (not sandboxTitle.get(self.site.code) and not self.getOption('page')) or (not content.get( - self.site.code) and not self.getOption('text')): - pywikibot.output(u'This bot is not configured for the given site ' - u'(%s), exiting.' % self.site) - sys.exit(0) + if not content.get(self.site.code) and not self.getOption('text'): + pywikibot.error(u'No content is given for pages, exiting.') + raise RuntimeError + if not self.generator: + if self.site.code not in sandboxTitle: + pywikibot.error(u'No generator is given for this site' + u'(%s), exiting.' % self.site) + raise RuntimeError + local_sandbox_title = sandboxTitle[self.site.code] + if not isinstance(local_sandbox_title, list): + local_sandbox_title = [local_sandbox_title] + self.generator = [pywikibot.Page(self.site, page_name) for + page_name in local_sandbox_title]
def run(self): """Run bot.""" @@ -202,16 +183,7 @@ while True: wait = False now = time.strftime("%d %b %Y %H:%M:%S (UTC)", time.gmtime()) - if self.getOption('page'): - localSandboxTitle = self.getOption('page') - else: - localSandboxTitle = i18n.translate(self.site, sandboxTitle) - if isinstance(localSandboxTitle, list): - titles = localSandboxTitle - else: - titles = [localSandboxTitle] - for title in titles: - sandboxPage = pywikibot.Page(self.site, title) + for sandboxPage in self.generator: pywikibot.output(u'Preparing to process sandbox page %s' % sandboxPage.title(asLink=True)) if sandboxPage.isRedirectPage(): @@ -239,22 +211,10 @@ pywikibot.output( u'The sandbox might be clean, no change necessary.') elif pos != 0 and not subst: - if self.getOption('user'): - endpos = pos + len(translatedContent.strip()) - if (pos < 0) or (endpos == len(text)): - pywikibot.output(u'The user sandbox is still ' - u'clean, no change necessary.') - else: - sandboxPage.put(text[:endpos], translatedMsg) - pywikibot.showDiff(text, text[:endpos]) - pywikibot.output( - u'Standard content was changed, user ' - u'sandbox cleaned.') - else: - sandboxPage.put(translatedContent, translatedMsg) - pywikibot.showDiff(text, translatedContent) - pywikibot.output(u'Standard content was changed, ' - u'sandbox cleaned.') + sandboxPage.put(translatedContent, translatedMsg) + pywikibot.showDiff(text, translatedContent) + pywikibot.output(u'Standard content was changed, ' + u'sandbox cleaned.') else: edit_delta = (datetime.datetime.utcnow() - sandboxPage.editTime()) @@ -303,36 +263,31 @@ @type args: list of unicode """ opts = {} - for arg in pywikibot.handle_args(args): + local_args = pywikibot.handle_args(args) + gen_factory = pagegenerators.GeneratorFactory() + for arg in local_args: if arg.startswith('-hours:'): opts['hours'] = float(arg[7:]) opts['no_repeat'] = False elif arg.startswith('-delay:'): opts['delay'] = int(arg[7:]) - elif arg.startswith('-page'): - if len(arg) == 5: - opts['page'] = pywikibot.input( - u'Which page do you want to change?') - else: - opts['page'] = arg[6:] elif arg.startswith('-text'): if len(arg) == 5: opts['text'] = pywikibot.input( u'What text do you want to substitute?') else: opts['text'] = arg[6:] - elif arg == '-user': - opts['user'] = True elif arg.startswith('-summary'): if len(arg) == len('-summary'): opts['summary'] = pywikibot.input(u'Enter the summary:') else: opts['summary'] = arg[9:] else: - pywikibot.showHelp('clean_sandbox') - return + gen_factory.handleArg(arg)
- bot = SandboxBot(**opts) + generator = gen_factory.getCombinedGenerator() + + bot = SandboxBot(generator=generator, **opts) bot.run()
if __name__ == "__main__":