XZise has uploaded a new change for review.
https://gerrit.wikimedia.org/r/171978
Change subject: [FEAT] Bot: Add 'CurrentPageBot' which automatically sets
current_page
......................................................................
[FEAT] Bot: Add 'CurrentPageBot' which automatically sets current_page
Change-Id: I80164eaca587d2fc92c8eed6c71440f833412cac
---
M pywikibot/__init__.py
M pywikibot/bot.py
M scripts/capitalize_redirects.py
M scripts/cosmetic_changes.py
M scripts/create_categories.py
M scripts/delete.py
6 files changed, 87 insertions(+), 50 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/pywikibot/core
refs/changes/78/171978/1
diff --git a/pywikibot/__init__.py b/pywikibot/__init__.py
index e20d7c4..1080426 100644
--- a/pywikibot/__init__.py
+++ b/pywikibot/__init__.py
@@ -29,7 +29,7 @@
from pywikibot.bot import (
output, warning, error, critical, debug, stdout, exception,
input, input_choice, input_yn, inputChoice, handle_args, showHelp, ui, log,
- calledModuleName, Bot, WikidataBot, QuitKeyboardInterrupt,
+ calledModuleName, Bot, CurrentPageBot, WikidataBot, QuitKeyboardInterrupt,
# the following are flagged as deprecated on usage
handleArgs,
)
@@ -70,7 +70,7 @@
'stdout', 'output', 'warning', 'error', 'critical', 'debug',
'exception', 'input_choice', 'input', 'input_yn', 'inputChoice',
'handle_args', 'handleArgs', 'showHelp', 'ui', 'log',
- 'calledModuleName', 'Bot', 'WikidataBot',
+ 'calledModuleName', 'Bot', 'CurrentPageBot', 'WikidataBot',
'Error', 'InvalidTitle', 'BadTitle', 'NoPage', 'SectionError',
'SiteDefinitionError', 'NoSuchSite', 'UnknownSite', 'UnknownFamily',
'NoUsername', 'UserBlocked',
diff --git a/pywikibot/bot.py b/pywikibot/bot.py
index 99c6b8f..8990e8d 100644
--- a/pywikibot/bot.py
+++ b/pywikibot/bot.py
@@ -1068,6 +1068,43 @@
self.__class__.__name__)
+class CurrentPageBot(Bot):
+
+ """A bot which automatically sets 'current_page' on each treat()."""
+
+ def treat_page(self):
+ """Process one page (Abstract method)."""
+ raise NotImplementedError('Method %s.treat_page() not implemented.'
+ % self.__class__.__name__)
+
+ def treat(self, page):
+ """Set page to current page an treat that page."""
+ self.current_page = page
+ self.treat_page()
+
+ def put_current(self, new_text=None, old_text=None, **kwargs):
+ """
+ Call L{Bot.userPut} but use the current page.
+
+ It uses the current page's text if the old or new text is set to None.
+ Both values may not set to None at the same time.
+
+ @param new_text: The new text
+ @type new_text: basestring or None
+ @param old_text: The old text
+ @type old_text: basestring or None
+ @param kwargs: Additional parameters directly given to L{Bot.userPut}.
+ @type kwargs: dict
+ """
+ if new_text is None and old_text is None:
+ raise ValueError('Either the new text or old text must be
defined.')
+ if new_text is None:
+ new_text = self.current_page.text
+ elif old_text is None:
+ old_text = self.current_page.text
+ self.userPut(self.current_page, old_text, new_text, **kwargs)
+
+
class WikidataBot(Bot):
"""
diff --git a/scripts/capitalize_redirects.py b/scripts/capitalize_redirects.py
index a86b6e9..e5d595f 100644
--- a/scripts/capitalize_redirects.py
+++ b/scripts/capitalize_redirects.py
@@ -33,14 +33,14 @@
#
import pywikibot
-from pywikibot import i18n, pagegenerators, Bot
+from pywikibot import i18n, pagegenerators, CurrentPageBot
docuReplacements = {
'¶ms;': pagegenerators.parameterHelp
}
-class CapitalizeBot(Bot):
+class CapitalizeBot(CurrentPageBot):
"""Capitalization Bot."""
@@ -57,12 +57,16 @@
return
if page.isRedirectPage():
page = page.getRedirectTarget()
- page_t = page.title()
- self.current_page = page
+ super(CurrentPageBot, self).treat(page)
+
+ def treat_page(self):
+ """Capitalize redirects of the current page."""
+ page_t = self.current_page.title()
+ site = self.current_page.site
if self.getOption('titlecase'):
- page_cap = pywikibot.Page(page.site, page_t.title())
+ page_cap = pywikibot.Page(site, page_t.title())
else:
- page_cap = pywikibot.Page(page.site, page_t.capitalize())
+ page_cap = pywikibot.Page(site, page_t.capitalize())
if page_cap.exists():
pywikibot.output(u'%s already exists, skipping...\n'
% page_cap.title(asLink=True))
@@ -77,12 +81,12 @@
self.options['always'] = True
if self.getOption('always') or choice == 'y':
comment = i18n.twtranslate(
- page.site,
+ site,
'capitalize_redirects-create-redirect',
{'to': page_t})
- page_cap.text = u"#%s %s" % (page.site.redirect(),
- page.title(asLink=True,
- textlink=True))
+ page_cap.text = u"#%s %s" % (site.redirect(),
+ self.current_page.title(
+ asLink=True, textlink=True))
try:
page_cap.save(comment)
except:
diff --git a/scripts/cosmetic_changes.py b/scripts/cosmetic_changes.py
index 5776a6e..d2a69c1 100755
--- a/scripts/cosmetic_changes.py
+++ b/scripts/cosmetic_changes.py
@@ -196,6 +196,13 @@
self.fixArabicLetters,
)
+ @classmethod
+ def from_page(cls, page, debug, ignore):
+ """Create tookkit based on the page."""
+ return cls(page.site, diff=False, debug=True,
+ namespace=page.namespace(), pageTitle=page.title(),
+ ignore=ignore)
+
def safe_execute(self, method, text):
"""Execute the method and catch exceptions if enabled."""
result = None
@@ -906,29 +913,28 @@
self.generator = generator
- def treat(self, page):
+ def treat_page(self):
+ """Treat page with the cosmetic toolkit."""
try:
- self.current_page = page
- ccToolkit = CosmeticChangesToolkit(page.site, diff=False,
- namespace=page.namespace(),
- pageTitle=page.title(),
- ignore=self.getOption('ignore'))
- changedText = ccToolkit.change(page.get())
+ ccToolkit = CosmeticChangesToolkit.from_page(
+ self.current_page, True, self.getOption('ignore'))
+ changedText = ccToolkit.change(self.current_page.get())
if changedText is not False:
- self.userPut(page, page.text, changedText,
- comment=self.getOption('comment'),
- async=self.getOption('async'))
+ self.put_current(newtext=changedText,
+ comment=self.getOption('comment'),
+ async=self.getOption('async'))
except pywikibot.NoPage:
pywikibot.output("Page %s does not exist?!"
- % page.title(asLink=True))
+ % self.current_page.title(asLink=True))
except pywikibot.IsRedirectPage:
pywikibot.output("Page %s is a redirect; skipping."
- % page.title(asLink=True))
+ % self.current_page.title(asLink=True))
except pywikibot.LockedPage:
- pywikibot.output("Page %s is locked?!" % page.title(asLink=True))
+ pywikibot.output("Page %s is locked?!"
+ % self.current_page.title(asLink=True))
except pywikibot.EditConflict:
pywikibot.output("An edit conflict has occured at %s."
- % page.title(asLink=True))
+ % self.current_page.title(asLink=True))
def main(*args):
diff --git a/scripts/create_categories.py b/scripts/create_categories.py
index f6ef329..6318bbf 100755
--- a/scripts/create_categories.py
+++ b/scripts/create_categories.py
@@ -33,10 +33,10 @@
# Distributed under the terms of the MIT license.
#
import pywikibot
-from pywikibot import pagegenerators, Bot
+from pywikibot import pagegenerators, CurrentPageBot
-class CreateCategoriesBot(Bot):
+class CreateCategoriesBot(CurrentPageBot):
"""Category creator bot."""
@@ -47,7 +47,8 @@
self.basename = basename
self.comment = u'Creating new category'
- def create_category(self, page):
+ def treat(self, page):
+ """Create category in commons for that page."""
title = page.title(withNamespace=False)
newpage = pywikibot.Category(pywikibot.Site('commons', 'commons'),
@@ -69,10 +70,6 @@
else:
# FIXME: Add overwrite option
pywikibot.output(u'%s already exists, skipping' % newpage.title())
-
- def run(self):
- for page in self.generator:
- self.create_category(page)
def main(*args):
diff --git a/scripts/delete.py b/scripts/delete.py
index 5307598..5f98411 100644
--- a/scripts/delete.py
+++ b/scripts/delete.py
@@ -34,7 +34,7 @@
#
import pywikibot
-from pywikibot import i18n, pagegenerators, Bot
+from pywikibot import i18n, pagegenerators, CurrentPageBot
# This is required for the text that is shown when you run this script
# with the parameter -help.
@@ -43,7 +43,7 @@
}
-class DeletionRobot(Bot):
+class DeletionRobot(CurrentPageBot):
""" This robot allows deletion of pages en masse. """
@@ -64,22 +64,15 @@
self.generator = generator
self.summary = summary
- def run(self):
- """
- Run bot.
-
- Loop through everything in the page generator and delete it.
- """
- for page in self.generator:
- self.current_page = page
-
- if self.getOption('undelete'):
- page.undelete(self.summary)
+ def treat_page(self):
+ """Delete or undelete each page."""
+ if self.getOption('undelete'):
+ self.current_page.undelete(self.summary)
+ else:
+ if self.current_page.exists():
+ self.current_page.delete(self.summary, not
self.getOption('always'))
else:
- if page.exists():
- page.delete(self.summary, not self.getOption('always'))
- else:
- pywikibot.output(u'Skipping: %s does not exist.' % page)
+ pywikibot.output(u'Skipping: %s does not exist.' %
self.current_page)
def main(*args):
--
To view, visit https://gerrit.wikimedia.org/r/171978
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I80164eaca587d2fc92c8eed6c71440f833412cac
Gerrit-PatchSet: 1
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Owner: XZise <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits