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 = {
     '&params;': 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

Reply via email to