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

Change subject: [IMPR] Improvements for interwiki.py
......................................................................

[IMPR] Improvements for interwiki.py

- add some type hints
- use dict comprehensions to create dicts
- remove While loop in Subject.assemble() because input_choice only
  continues if the given input is valid. Therefore 'r'ecject answer
  may not be handled because it just continues the for loop.
- simplify sanity check and use error() to print the message
- no OSError is expected in Subject.reportBacklinks(); remove try statement
- simplify InterwikiBot.firstSubject()
- remove InterwikiBot.__len__ and use self.subjects directly in
  InterwikiBot.isDone()

Change-Id: I583b002e26db9a6701ee00a53482a4f725e21ee8
---
M scripts/interwiki.py
1 file changed, 81 insertions(+), 108 deletions(-)

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



diff --git a/scripts/interwiki.py b/scripts/interwiki.py
index 76e75ad..c353b17 100755
--- a/scripts/interwiki.py
+++ b/scripts/interwiki.py
@@ -339,6 +339,7 @@
 from collections import Counter, defaultdict
 from contextlib import suppress
 from textwrap import fill
+from typing import Optional

 import pywikibot
 from pywikibot import (
@@ -349,6 +350,7 @@
     textlib,
     titletranslate,
 )
+from pywikibot.backports import Iterable
 from pywikibot.bot import ListOption, OptionHandler, StandardOption
 from pywikibot.cosmetic_changes import moved_links
 from pywikibot.exceptions import (
@@ -457,17 +459,16 @@
     summary = ''
     repository = False

-    def note(self, text) -> None:
+    def note(self, text: str) -> None:
         """Output a notification message with.

         The text will be printed only if conf.quiet isn't set.
         :param text: text to be shown
-        :type text: str
         """
         if not self.quiet:
             pywikibot.output('NOTE: ' + text)

-    def readOptions(self, option) -> bool:
+    def readOptions(self, option: str) -> bool:
         """Read all commandline parameters for the global container."""
         arg, _, value = option.partition(':')
         if not arg.startswith('-'):
@@ -1337,7 +1338,6 @@
                     errorCount += 1

         # See if new{} contains any problematic values
-        result = {}
         for site, pages in new.items():
             if len(pages) > 1:
                 errorCount += 1
@@ -1345,9 +1345,7 @@

         if not errorCount and not self.conf.select:
             # no errors, so all lists have only one item
-            for site, pages in new.items():
-                result[site] = pages[0]
-            return result
+            return {site: pages[0] for site, pages in new.items()}

         # There are any errors.
         if config.interwiki_graph:
@@ -1359,6 +1357,7 @@
         if self.conf.autonomous:
             return None

+        result = {}
         # First loop over the ones that have more solutions
         for site, pages in new.items():
             if len(pages) <= 1:
@@ -1394,28 +1393,24 @@
                 page2 = pages[0]
                 pywikibot.output('Found link to {} in:'.format(page2))
                 self.whereReport(page2, indent=4)
-            while True:
-                if acceptall:
-                    answer = 'a'
-                else:
-                    # TODO: allow answer to repeat previous or go back
-                    # after a mistake
-                    answer = pywikibot.input_choice(
-                        'What should be done?',
-                        [('accept', 'a'), ('reject', 'r'),
-                         ('give up', 'g'), ('accept all', 'l')], 'a',
-                        automatic_quit=False)
-                if answer == 'l':  # accept all
-                    acceptall = True
-                    answer = 'a'
-                if answer == 'a':  # accept this one
-                    result[site] = pages[0]
-                    break
-                if answer == 'g':  # give up
-                    return None
-                if answer == 'r':  # reject
-                    # None acceptable
-                    break
+
+            # TODO: allow answer to repeat previous or go back
+            # after a mistake
+            answer = 'a' if acceptall else pywikibot.input_choice(
+                'What should be done?',
+                [('accept', 'a'), ('reject', 'r'), ('give up', 'g'),
+                 ('accept all', 'l')], 'a', automatic_quit=False)
+
+            if answer == 'l':  # accept all
+                acceptall = True
+                answer = 'a'
+
+            if answer == 'a':  # accept this one
+                result[site] = pages[0]
+            elif answer == 'g':  # give up
+                return None
+            # else reject if None acceptable
+
         return result

     def finish(self):
@@ -1593,12 +1588,8 @@
         # site.
         pltmp = new[page.site]
         if pltmp != page:
-            s = 'None'
-            if pltmp is not None:
-                s = pltmp
-            pywikibot.output(
-                'BUG>>> {} is not in the list of new links! Found {}.'
-                .format(page, s))
+            pywikibot.error('{} is not in the list of new links! Found {}.'
+                            .format(page, pltmp))
             raise SaveError('BUG: sanity check failed')

         # Avoid adding an iw link back to itself
@@ -1611,9 +1602,7 @@
                 del new[stmp]

         # Put interwiki links into a map
-        old = {}
-        for page2 in interwikis:
-            old[page2.site] = page2
+        old = {p.site: p for p in interwikis}

         # Check what needs to get done
         mods, mcomment, adding, removing, modifying = compareLanguages(
@@ -1642,9 +1631,9 @@
             self.conf.note('No changes needed on page {}'.format(page))
             return False

-        pywikibot.output('<<lightpurple>>Updating links on page {}.<<default>>'
-                         .format(page))
-        pywikibot.output('Changes to be made: {}'.format(mods))
+        pywikibot.info('<<lightpurple>>Updating links on page {}.'
+                       .format(page))
+        pywikibot.info('Changes to be made: {}'.format(mods))
         oldtext = page.get()
         template = (page.namespace() == 10)
         newtext = textlib.replaceLanguageLinks(oldtext, new,
@@ -1653,14 +1642,12 @@
         # This is for now. Later there should be different funktions for each
         # kind
         if not botMayEdit(page):
+            pywikibot.info('SKIPPING: {} '.format(page), newline=False)
             if template:
-                pywikibot.output(
-                    'SKIPPING: {} should have interwiki links on subpage.'
-                    .format(page))
+                msg = 'should have interwiki links on subpage.'
             else:
-                pywikibot.output(
-                    'SKIPPING: {} is under construction or to be deleted.'
-                    .format(page))
+                msg = 'is under construction or to be deleted.'
+            pywikibot.info(msg)
             return False

         if newtext == oldtext:
@@ -1773,54 +1760,49 @@
         # use sets because searching an element is faster than in lists
         expectedPages = set(new.values())
         expectedSites = set(new)
-        try:
-            for site in expectedSites - set(updatedSites):
-                page = new[site]
-                if page.section():
+
+        for site in expectedSites - set(updatedSites):
+            page = new[site]
+            if page.section():
+                continue
+
+            try:
+                linkedPages = {pywikibot.Page(link)
+                               for link in page.iterlanglinks()}
+            except NoPageError:
+                pywikibot.warning('Page {} does no longer exist?!'
+                                  .format(page))
+                break
+
+            # To speed things up, create a dictionary which maps sites
+            # to pages. This assumes that there is only one interwiki
+            # link per language.
+            linkedPagesDict = {p.site: p for p in linkedPages}
+            for expectedPage in expectedPages - linkedPages:
+                if expectedPage == page:
                     continue
-
                 try:
-                    linkedPages = {pywikibot.Page(link)
-                                   for link in page.iterlanglinks()}
-                except NoPageError:
+                    linkedPage = linkedPagesDict[expectedPage.site]
                     pywikibot.warning(
-                        'Page {} does no longer exist?!'.format(page))
-                    break
-
-                # To speed things up, create a dictionary which maps sites
-                # to pages. This assumes that there is only one interwiki
-                # link per language.
-                linkedPagesDict = {}
-                for linkedPage in linkedPages:
-                    linkedPagesDict[linkedPage.site] = linkedPage
-                for expectedPage in expectedPages - linkedPages:
-                    if expectedPage == page:
-                        continue
-                    try:
-                        linkedPage = linkedPagesDict[expectedPage.site]
-                        pywikibot.warning(
-                            '{}: {} does not link to {} but to {}'
-                            .format(page.site.family.name,
-                                    page, expectedPage, linkedPage))
-                    except KeyError:
-                        if not expectedPage.site.is_data_repository():
-                            pywikibot.warning('{}: {} does not link to {}'
-                                              .format(page.site.family.name,
-                                                      page, expectedPage))
-                # Check for superfluous links
-                for linkedPage in linkedPages:
-                    if linkedPage in expectedPages:
-                        continue
-                    # Check whether there is an alternative page on
-                    # that language.
-                    # In this case, it was already reported above.
-                    if linkedPage.site not in expectedSites:
-                        pywikibot.warning('{}: {} links to incorrect {}'
+                        '{}: {} does not link to {} but to {}'
+                        .format(page.site.family.name,
+                                page, expectedPage, linkedPage))
+                except KeyError:
+                    if not expectedPage.site.is_data_repository():
+                        pywikibot.warning('{}: {} does not link to {}'
                                           .format(page.site.family.name,
-                                                  page, linkedPage))
-
-        except OSError:
-            pywikibot.error('could not report backlinks')
+                                                  page, expectedPage))
+            # Check for superfluous links
+            for linkedPage in linkedPages:
+                if linkedPage in expectedPages:
+                    continue
+                # Check whether there is an alternative page on
+                # that language.
+                # In this case, it was already reported above.
+                if linkedPage.site not in expectedSites:
+                    pywikibot.warning('{}: {} links to incorrect {}'
+                                      .format(page.site.family.name,
+                                              page, linkedPage))


 class InterwikiBot:
@@ -1935,11 +1917,9 @@
         # for loop was exited by break statement
         self.pageGenerator = None

-    def firstSubject(self):
+    def firstSubject(self) -> Optional[Subject]:
         """Return the first subject that is still being worked on."""
-        if self.subjects:
-            return self.subjects[0]
-        return None
+        return self.subjects[0] if self.subjects else None

     def maxOpenSite(self):
         """
@@ -1982,10 +1962,9 @@
                         self.generateMore(self.conf.maxquerysize - mycount)
                     except ServerError:
                         # Could not extract allpages special page?
-                        pywikibot.output(
-                            'ERROR: could not retrieve more pages. '
-                            'Will try again in {} seconds'
-                            .format(timeout))
+                        pywikibot.error('could not retrieve more pages. '
+                                        'Will try again in {} seconds'
+                                        .format(timeout))
                         pywikibot.sleep(timeout)
                         timeout *= 2
                     else:
@@ -2049,9 +2028,9 @@
                 subj.finish()
                 del self.subjects[i]

-    def isDone(self):
+    def isDone(self) -> bool:
         """Check whether there is still more work to do."""
-        return not self and self.pageGenerator is None
+        return not self.subjects and self.pageGenerator is None

     def plus(self, site, count: int = 1) -> None:
         """Helper routine that the Subject class expects in a counter."""
@@ -2067,10 +2046,6 @@
         while not self.isDone():
             self.queryStep()

-    def __len__(self) -> int:
-        """Return length of subjects."""
-        return len(self.subjects)
-

 def compareLanguages(old, new, insite, summary):
     """Compare changes and setup i18n message."""
@@ -2090,7 +2065,6 @@
             return str(d[site])
     else:
         # Use short format, just the language code
-
         def fmt(d, site):
             return site.code

@@ -2262,11 +2236,10 @@
                                           namespace=self.next_namespace,
                                           filterredir=False)

-    def write_dump(self, iterable, append: bool = True) -> None:
+    def write_dump(self, iterable: Iterable, append: bool = True) -> None:
         """Write dump file.

         :param iterable: an iterable of page titles to be dumped.
-        :type iterable: iterable
         :param append: if a dump already exits, append the page titles to it
             if True else overwrite it.
         """

--
To view, visit https://gerrit.wikimedia.org/r/c/pywikibot/core/+/806493
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: I583b002e26db9a6701ee00a53482a4f725e21ee8
Gerrit-Change-Number: 806493
Gerrit-PatchSet: 2
Gerrit-Owner: Xqt <[email protected]>
Gerrit-Reviewer: D3r1ck01 <[email protected]>
Gerrit-Reviewer: Xqt <[email protected]>
Gerrit-Reviewer: jenkins-bot
Gerrit-MessageType: merged
_______________________________________________
Pywikibot-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to