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