jenkins-bot has submitted this change. ( 
https://gerrit.wikimedia.org/r/c/pywikibot/core/+/904903 )

Change subject: [IMPR] Move fix_1_double_redirect exception handling to a 
separate method
......................................................................

[IMPR] Move fix_1_double_redirect exception handling to a separate method

This change reduces code complexity.

Change-Id: Ifab48ce29971cfaa4238143939348f20d7285bee
---
M scripts/redirect.py
1 file changed, 69 insertions(+), 39 deletions(-)

Approvals:
  Xqt: Looks good to me, approved
  jenkins-bot: Verified




diff --git a/scripts/redirect.py b/scripts/redirect.py
index 45d138e..f27ba28 100755
--- a/scripts/redirect.py
+++ b/scripts/redirect.py
@@ -559,6 +559,48 @@
                                    "Won't delete anything."
                                    if self.opt.delete else 'Skipping.'))

+    def _skip_on_exception(self,
+                           error: Exception,
+                           loop_length: int,
+                           new_redir: pywikibot.Page) -> bool:
+        """Handle exceptions of fix_1_double_redirect."""
+        if isinstance(error, IsNotRedirectPageError):
+            if loop_length != 2:
+                return False  # do nothing
+
+            pywikibot.info(
+                f'Skipping: Redirect target {new_redir} is not a  redirect.')
+
+        elif isinstance(error, SectionError):
+            pywikibot.warning(
+                f"Redirect target section {new_redir} doesn't exist.")
+            return False
+
+        elif isinstance(error, UnsupportedPageError):
+            pywikibot.error(error)
+            pywikibot.info(f'Skipping {new_redir}.')
+
+        elif isinstance(error, NoPageError):
+            if not self.opt.always:
+                pywikibot.warning(
+                    f"Redirect target {new_redir} doesn't exist.")
+                return False
+
+            # skip if automatic
+            pywikibot.info(
+                f"Skipping: Redirect target {new_redir} doesn't exist.")
+
+        elif isinstance(error, ServerError):
+            pywikibot.info('Skipping due to server error: No textarea found')
+
+        else:
+            # all uncatched exceptions
+            # Note: elif statements are necessary above because all Errors
+            # above derive from Exception class
+            raise
+
+        return True
+
     def fix_1_double_redirect(self) -> None:
         """Treat one double redirect."""
         newRedir = redir = self.current_page
@@ -569,48 +611,23 @@
                                      newRedir.title(with_section=False)))
             try:
                 targetPage = self.get_redirect_target(newRedir)
-            except IsNotRedirectPageError:
-                if len(redirList) == 2:
-                    pywikibot.info(
-                        'Skipping: Redirect target {} is not a redirect.'
-                        .format(newRedir.title(as_link=True)))
-                    break  # do nothing
-            except SectionError:
-                pywikibot.warning(
-                    "Redirect target section {} doesn't exist."
-                    .format(newRedir.title(as_link=True)))
-            except UnsupportedPageError as e:
-                pywikibot.error(e)
-                pywikibot.info(f'Skipping {newRedir}.')
-                break
-            except NoPageError:
-                title = newRedir.title(as_link=True)
-                if self.opt.always:
-                    pywikibot.info(
-                        f"Skipping: Redirect target {title} doesn't exist.")
-                    break  # skip if automatic
-                pywikibot.warning(
-                    f"Redirect target {title} doesn't exist.")
-            except ServerError:
-                pywikibot.info(
-                    'Skipping due to server error: No textarea found')
-                break
+            except Exception as e:
+                if self._skip_on_exception(e, len(redirList), newRedir):
+                    break
             else:
                 if not targetPage:
                     break

                 pywikibot.info(f'   Links to: {targetPage}.')
-                try:
+                mw_msg = None
+                with suppress(KeyError):
                     mw_msg = targetPage.site.mediawiki_message(
                         'wikieditor-toolbar-tool-redirect-example')
-                except KeyError:
-                    pass
-                else:
-                    if targetPage.title() == mw_msg:
-                        pywikibot.info(
-                            'Skipping toolbar example: Redirect source is '
-                            'potentially vandalized.')
-                        break
+                if mw_msg and targetPage.title() == mw_msg:
+                    pywikibot.info('Skipping toolbar example: Redirect source '
+                                   'is potentially vandalized.')
+                    break
+
                 # watch out for redirect loops
                 if redirList.count('{}:{}'.format(
                     targetPage.site.lang,
@@ -618,6 +635,7 @@
                     pywikibot.warning(
                         f'Redirect target {targetPage} forms a redirect loop.')
                     break  # FIXME: doesn't work. edits twice!
+
                     if self.opt.delete:
                         # Delete the two redirects
                         # TODO: Check whether pages aren't vandalized
@@ -626,12 +644,14 @@
                                              'redirect-remove-loop')
                         self.delete_redirect(redir, 'redirect-remove-loop')
                     break
+
                 # redirect target found
                 if targetPage.isStaticRedirect():
                     pywikibot.info('   Redirect target is STATICREDIRECT.')
                 else:
                     newRedir = targetPage
                     continue
+
             oldText = redir.get(get_redirect=True)
             if self.is_repo and redir.namespace() == self.repo.item_namespace:
                 redir = pywikibot.ItemPage(self.repo, redir.title())
@@ -687,14 +707,13 @@
     gen_factory = pagegenerators.GeneratorFactory()

     local_args = pywikibot.handle_args(args)
+    shorts = {'do': 'double', 'br': 'broken'}
     for argument in local_args:
         arg, _, value = argument.partition(':')
         option = arg.partition('-')[2]
         # bot options
-        if arg == 'do':
-            action = 'double'
-        elif arg == 'br':
-            action = 'broken'
+        if arg in shorts:
+            action = shorts[arg]
         elif arg in ('both', 'broken', 'double'):
             action = arg
         elif option in ('always', 'delete'):

--
To view, visit https://gerrit.wikimedia.org/r/c/pywikibot/core/+/904903
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.wikimedia.org/r/settings

Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: Ifab48ce29971cfaa4238143939348f20d7285bee
Gerrit-Change-Number: 904903
Gerrit-PatchSet: 2
Gerrit-Owner: Xqt <i...@gno.de>
Gerrit-Reviewer: D3r1ck01 <xsavitar.w...@aol.com>
Gerrit-Reviewer: Xqt <i...@gno.de>
Gerrit-Reviewer: jenkins-bot
Gerrit-MessageType: merged
_______________________________________________
Pywikibot-commits mailing list -- pywikibot-commits@lists.wikimedia.org
To unsubscribe send an email to pywikibot-commits-le...@lists.wikimedia.org

Reply via email to