jenkins-bot has submitted this change and it was merged.

Change subject: Support compat names in pagegenerators and site
......................................................................


Support compat names in pagegenerators and site

Add support for object and argument names used in compat, deprecating
them or raising NotImplementedError.

Implemented a few simple features from compat that were missing in core.

Also fixes numerous bugs in existing deprecations, requiring HttpRequest
to emulate urllib2.urlopen's return type.

And deprecate some features which have dubious meanings or implementation
* NewpagesPageGenerator argument get_redirect

Change-Id: I69d436f708ebe2f955b68e8405005d34a7af2026
---
M pywikibot/family.py
M pywikibot/pagegenerators.py
M pywikibot/site.py
M tests/site_tests.py
4 files changed, 149 insertions(+), 84 deletions(-)

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



diff --git a/pywikibot/family.py b/pywikibot/family.py
index f112f76..467651a 100644
--- a/pywikibot/family.py
+++ b/pywikibot/family.py
@@ -1355,14 +1355,14 @@
         """Return the shared Wikibase repository, if any."""
         return (None, None)
 
-    @deprecated("Site.getcurrenttime()")
+    @deprecated("Site.server_time()")
     def server_time(self, code):
         """
-        DEPRECATED, use Site.getcurrenttime() instead.
+        DEPRECATED, use Site.server_time instead.
 
         Return a datetime object representing server time.
         """
-        return pywikibot.Site(code, self).getcurrenttime()
+        return pywikibot.Site(code, self).server_time()
 
     def isPublic(self, code):
         """Check the wiki require logging in before viewing it."""
diff --git a/pywikibot/pagegenerators.py b/pywikibot/pagegenerators.py
index 92231c3..d1a714c 100644
--- a/pywikibot/pagegenerators.py
+++ b/pywikibot/pagegenerators.py
@@ -37,6 +37,7 @@
 from pywikibot.tools import (
     deprecated,
     deprecated_args,
+    redirect_func,
     DequeGenerator,
     intersect_generators,
     filter_unique,
@@ -922,9 +923,9 @@
                                   site=site, namespace=namespace)
 
 
-@deprecated_args(number="total", namespace="namespaces", repeat=None)
-def NewpagesPageGenerator(get_redirect=False, site=None,
-                          namespaces=[0, ], step=None, total=None):
+@deprecated_args(number='total', namespace='namespaces', repeat=None,
+                 get_redirect=None)
+def NewpagesPageGenerator(site=None, namespaces=[0], step=None, total=None):
     """
     Iterate Page objects for all new titles in a single namespace.
 
@@ -940,12 +941,12 @@
     # defaults to namespace 0 because that's how Special:Newpages defaults
     if site is None:
         site = pywikibot.Site()
-    for item in site.recentchanges(showRedirects=get_redirect,
-                                   changetype="new", namespaces=namespaces,
+    for item in site.recentchanges(changetype='new', namespaces=namespaces,
                                    step=step, total=total):
         yield pywikibot.Page(pywikibot.Link(item["title"], site))
 
 
+@deprecated_args(nobots=None)
 def RecentChangesPageGenerator(start=None, end=None, reverse=False,
                                namespaces=None, pagelist=None,
                                changetype=None, showMinor=None,
@@ -1015,6 +1016,7 @@
     return gen
 
 
+@deprecated_args(referredImagePage='referredFilePage')
 def FileLinksGenerator(referredFilePage, step=None, total=None, content=False):
     """Yield Pages on which the file referredFilePage is displayed."""
     return referredFilePage.usingPages(step=step, total=total, content=content)
@@ -1506,9 +1508,6 @@
         yield pywikibot.FilePage(page)
 
 
-ImageGenerator = FileGenerator
-
-
 def PageWithTalkPageGenerator(generator, return_talk_only=False):
     """Yield pages and associated talk pages from another generator.
 
@@ -1653,7 +1652,7 @@
                 yield i
 
 
-@deprecated_args(number="total")
+@deprecated_args(number='total', repeat=None)
 def NewimagesPageGenerator(step=None, total=None, site=None):
     """
     New file generator.
@@ -1694,9 +1693,6 @@
             yield pywikibot.ItemPage.fromPage(page)
 
 
-WikidataItemGenerator = WikibaseItemGenerator
-
-
 def WikibaseItemFilterPageGenerator(generator, has_item=True,
                                     show_filtered=False):
     """
@@ -1734,9 +1730,8 @@
         yield page
 
 
-# TODO below
 @deprecated_args(extension=None, number="total", repeat=None)
-def UnusedFilesGenerator(total=100, site=None, extension=None):
+def UnusedFilesGenerator(total=100, site=None):
     """
     Unused files generator.
 
@@ -1814,6 +1809,7 @@
         yield page
 
 
+@deprecated_args(number='total', repeat=None)
 def UnCategorizedTemplateGenerator(total=100, site=None):
     """
     Uncategorized template generator.
@@ -1972,8 +1968,9 @@
         yield page
 
 
+@deprecated_args(euprotocol='protocol')
 def LinksearchPageGenerator(link, namespaces=None, step=None, total=None,
-                            site=None):
+                            site=None, protocol='http'):
     """Yield all pages that include a specified link.
 
     Obtains data from [[Special:Linksearch]].
@@ -1987,10 +1984,11 @@
     """
     if site is None:
         site = pywikibot.Site()
-    return site.exturlusage(link, namespaces=namespaces, step=step,
-                                 total=total, content=False)
+    return site.exturlusage(link, namespaces=namespaces, protocol=protocol,
+                            step=step, total=total, content=False)
 
 
+@deprecated_args(number='total')
 def SearchPageGenerator(query, step=None, total=None, namespaces=None,
                         site=None):
     """
@@ -2084,7 +2082,8 @@
     """
 
     # values larger than 100 fail
-    def __init__(self, query=None, count=100, site=None):
+    @deprecated_args(count='total')
+    def __init__(self, query=None, total=100, site=None):
         """
         Constructor.
 
@@ -2092,7 +2091,7 @@
         @type site: L{pywikibot.site.BaseSite}
         """
         self.query = query or pywikibot.input(u'Please enter the search 
query:')
-        self.count = count
+        self.total = total
         if site is None:
             site = pywikibot.Site()
         self.site = site
@@ -2107,7 +2106,7 @@
                             "To install, please run: pip install pYsearch")
             exit(1)
 
-        srch = WebSearch(config.yahoo_appid, query=query, results=self.count)
+        srch = WebSearch(config.yahoo_appid, query=query, results=self.total)
         dom = srch.get_results()
         results = srch.parse_results(dom)
         for res in results:
@@ -2345,6 +2344,16 @@
         yield pywikibot.ItemPage(repo, item['id'])
 
 
+# Deprecated old names available for compatibility with compat.
+ImageGenerator = redirect_func(FileGenerator, old_name='ImageGenerator')
+UnCategorizedTemplatesGenerator = redirect_func(
+    UnCategorizedTemplateGenerator, old_name='UnCategorizedTemplatesGenerator')
+RecentchangesPageGenerator = redirect_func(
+    RecentChangesPageGenerator, old_name='RecentchangesPageGenerator')
+# Deprecated old names from Pywikibot 2.0 beta1
+WikidataItemGenerator = redirect_func(
+    WikibaseItemGenerator, old_name='WikidataItemGenerator')
+
 if __name__ == "__main__":
     pywikibot.output(u'Pagegenerators cannot be run as script - are you '
                      u'looking for listpages.py?')
diff --git a/pywikibot/site.py b/pywikibot/site.py
index 4d3e34c..ea063f4 100644
--- a/pywikibot/site.py
+++ b/pywikibot/site.py
@@ -571,6 +571,11 @@
         self._pagemutex = threading.Lock()
         self._locked_pages = []
 
+    @deprecated
+    def has_api(self):
+        """Return whether this site has an API."""
+        return False
+
     @property
     @deprecated("APISite.siteinfo['case'] or Namespace.case == 
'case-sensitive'")
     def nocapitalize(self):
@@ -992,6 +997,7 @@
     # site-specific formatting preferences
 
     def category_on_one_line(self):
+        # TODO: is this even needed?  No family in the framework uses it.
         """Return True if this site wants all category links on one line."""
         return self.code in self.family.category_on_one_line
 
@@ -1034,15 +1040,19 @@
         """DEPRECATED."""
         return urlencode(query)
 
-    @deprecated("pywikibot.comms.http.request")
-    def getUrl(self, path, retry=True, sysop=False, data=None,
-               compress=True, no_hostname=False, cookie_only=False):
+    @deprecated('pywikibot.data.api.Request or pywikibot.comms.http.request')
+    @deprecated_args(compress=None, no_hostname=None, cookies_only=None,
+                     refer=None, back_response=None)
+    def getUrl(self, path, retry=None, sysop=None, data=None):
         """DEPRECATED.
 
         Retained for compatibility only. All arguments except path and data
         are ignored.
 
         """
+        if retry is not None or sysop is not None:
+            warn('APISite.getUrl parameters retry and sysop are not supported',
+                 UserWarning)
         from pywikibot.comms import http
         if data:
             if not isinstance(data, basestring):
@@ -1051,16 +1061,36 @@
         else:
             return http.request(self, path)
 
-    @deprecated()
+    @deprecated
     def postForm(self, address, predata, sysop=False, cookies=None):
         """DEPRECATED."""
         return self.getUrl(address, data=predata)
 
-    @deprecated()
+    @deprecated
     def postData(self, address, data, contentType=None, sysop=False,
                  compress=True, cookies=None):
         """DEPRECATED."""
         return self.getUrl(address, data=data)
+
+    @deprecated
+    def checkCharset(self, charset):
+        """DEPRECATED."""
+        raise NotImplementedError
+
+    @deprecated
+    def cookies(self, sysop=False):
+        """DEPRECATED."""
+        raise NotImplementedError
+
+    @deprecated
+    def updateCookies(self, datas, sysop=False):
+        """DEPRECATED."""
+        raise NotImplementedError
+
+    @deprecated
+    def solveCaptcha(self, data):
+        """DEPRECATED."""
+        raise NotImplementedError
 
 
 def must_be(group=None, right=None):
@@ -1539,28 +1569,9 @@
 
     """API interface to MediaWiki site.
 
-    Do not use directly; use pywikibot.Site function.
+    Do not instantiate directly; use pywikibot.Site function.
 
     """
-
-#    Site methods from version 1.0 (as these are implemented in this file,
-#    or declared deprecated/obsolete, they will be removed from this list)
-#########
-#    cookies: return user's cookies as a string
-#
-#    urlEncode: Encode a query to be sent using an http POST request.
-#    postForm: Post form data to an address at this site.
-#    postData: Post encoded form data to an http address at this site.
-#
-#    checkCharset(charset): Warn if charset doesn't match family file.
-#
-#    linktrail: Return regex for trailing chars displayed as part of a link.
-#    disambcategory: Category in which disambiguation pages are listed.
-#
-#    Methods that yield Page objects derived from a wiki's Special: pages
-#    (note, some methods yield other information in a tuple along with the
-#    Pages; see method docs for details) --
-#
 
     def __init__(self, code, fam=None, user=None, sysop=None):
         """Constructor."""
@@ -1604,6 +1615,11 @@
                     if site['dbname'] == dbname:
                         return cls(site['code'], site['code'])
         raise ValueError("Cannot parse a site out of %s." % dbname)
+
+    @deprecated
+    def has_api(self):
+        """Return whether this site has an API."""
+        return True
 
     def _generator(self, gen_class, type_arg=None, namespaces=None,
                    step=None, total=None, **args):
@@ -2008,6 +2024,7 @@
 
         return dict((_key, self._msgcache[_key]) for _key in keys)
 
+    @deprecated_args(forceReload=None)
     def mediawiki_message(self, key):
         """Fetch the text for a MediaWiki message.
 
@@ -2102,6 +2119,7 @@
         return msgs['comma-separator'].join(args[:-2] + 
[concat.join(args[-2:])])
 
     @need_version("1.12")
+    @deprecated_args(string='text')
     def expand_text(self, text, title=None, includecomments=None):
         """Parse the given text for preprocessing and rendering.
 
@@ -2135,19 +2153,22 @@
             key = '*'
         return req.submit()['expandtemplates'][key]
 
+    getExpandedString = redirect_func(expand_text, 
old_name='getExpandedString',
+                                      class_name='APISite')
+
     def getcurrenttimestamp(self):
         """
         Return the server time as a MediaWiki timestamp string.
 
-        It calls L{getcurrenttime} first so it queries the server to get the
+        It calls L{server_time} first so it queries the server to get the
         current server time.
 
         @return: the server time
         @rtype: str (as 'yyyymmddhhmmss')
         """
-        return self.getcurrenttime().totimestampformat()
+        return self.server_time().totimestampformat()
 
-    def getcurrenttime(self):
+    def server_time(self):
         """
         Return a Timestamp object representing the current server time.
 
@@ -2166,6 +2187,9 @@
             return pywikibot.Timestamp.fromtimestampformat(
                 self.expand_text("{{CURRENTTIMESTAMP}}"))
 
+    getcurrenttime = redirect_func(server_time, old_name='getcurrenttime',
+                                   class_name='APISite')
+
     @need_version("1.14")
     def getmagicwords(self, word):
         """Return list of localized "word" magic words for the site."""
@@ -2178,6 +2202,10 @@
             return self._magicwords[word]
         else:
             return [word]
+
+    @deprecated
+    def resolvemagicwords(self, wikitext):
+        return NotImplementedError
 
     @remove_last_args(('default', ))
     def redirect(self):
@@ -2945,6 +2973,13 @@
                              'token for {1} can be retrieved.'.format(
                              self.username(sysop), self.user()))
         return self.tokens['patrol']
+
+    def getParsedString(self, string, keeptags=None):
+        """Deprecated.
+
+        compat defined keeptags as ['*'].
+        """
+        return NotImplementedError
 
     # following group of methods map more-or-less directly to API queries
 
@@ -3856,6 +3891,18 @@
             legen.request["lenamespace"] = namespace
         return legen
 
+    @deprecated('APISite.logevents()')
+    def logpages(self, number=50, mode='', title=None, user=None, repeat=False,
+                 namespace=[], start=None, end=None, tag=None, newer=False,
+                 dump=False, offset=None):
+        # TODO: implement using logevents
+        raise NotImplementedError
+
+    @deprecated_args(returndict=None, nobots=None, rcshow=None, rcprop=None,
+                     rctype='changetype', revision=None, repeat=None,
+                     rcstart='start', rcend='end', rcdir=None,
+                     includeredirects='showRedirects', namespace='namespaces',
+                     rcnamespace='namespaces', number='total', rclimit='total')
     def recentchanges(self, start=None, end=None, reverse=False,
                       namespaces=None, pagelist=None, changetype=None,
                       showMinor=None, showBot=None, showAnon=None,
@@ -3948,9 +3995,10 @@
 
         return rcgen
 
-    @deprecated_args(number="total")
+    @deprecated_args(number='total', key='searchstring',
+                     getredirects='get_redirects')
     def search(self, searchstring, namespaces=None, where="text",
-               getredirects=False, step=None, total=None, content=False):
+               get_redirects=False, step=None, total=None, content=False):
         """Iterate Pages that contain the searchstring.
 
         Note that this may include non-existing Pages if the wiki's database
@@ -3964,7 +4012,7 @@
         @type namespaces: iterable of basestring or Namespace key,
             or a single instance of those types.  May be a '|' separated
             list of namespace identifiers.
-        @param getredirects: if True, include redirects in results. Since
+        @param get_redirects: if True, include redirects in results. Since
             version MediaWiki 1.23 it will always return redirects.
         @param content: if True, load the current content of each iterated page
             (default False)
@@ -3986,7 +4034,7 @@
                                 namespaces=namespaces, step=step,
                                 total=total, g_content=content)
         if MediaWikiVersion(self.version()) < MediaWikiVersion('1.23'):
-            srgen.request['gsrredirects'] = getredirects
+            srgen.request['gsrredirects'] = get_redirects
         return srgen
 
     def usercontribs(self, user=None, userprefix=None, start=None, end=None,
@@ -4763,6 +4811,7 @@
         "notpatrollable": "The revision %(revid)s can't be patrolled as it's 
too old."
     }
 
+    @deprecated_args(token=None)
     def patrol(self, rcid=None, revid=None, revision=None):
         """Return a generator of patrolled pages.
 
@@ -4963,9 +5012,9 @@
         return all(purged)
 
     @deprecated("Site().exturlusage")
-    def linksearch(self, siteurl, limit=None):
+    def linksearch(self, siteurl, limit=None, euprotocol=None):
         """Backwards-compatible interface to exturlusage()."""
-        return self.exturlusage(siteurl, total=limit)
+        return self.exturlusage(siteurl, total=limit, protocol=euprotocol)
 
     def _get_titles_with_hash(self, hash_found=None):
         """Helper for the deprecated method get(Files|Images)FromAnHash."""
@@ -5238,11 +5287,13 @@
                 filepage._load_file_revisions([result["imageinfo"]])
             return
 
-    @deprecated_args(number="step",
+    @deprecated_args(number='total',
                      repeat=None,
                      namespace="namespaces",
+                     returndict=None,
+                     rcshow=None,
                      rc_show=None,
-                     get_redirect=None)  # 20120822
+                     get_redirect=None)
     def newpages(self, user=None, returndict=False,
                  start=None, end=None, reverse=False, showBot=False,
                  showRedirects=False, excludeuser=None,
@@ -5287,6 +5338,8 @@
                 yield (newpage, pageitem['timestamp'], pageitem['newlen'],
                        u'', pageitem['user'], pageitem['comment'])
 
+    @deprecated_args(lestart='start', leend='end', leuser='user', letitle=None,
+                     repeat=None, number='total')
     def newfiles(self, user=None, start=None, end=None, reverse=False,
                  step=None, total=None):
         """Yield information about newly uploaded files.
@@ -5309,7 +5362,7 @@
             yield (filepage, date, user, comment)
 
     @deprecated("Site().newfiles()")
-    @deprecated_args(number=None, repeat=None)
+    @deprecated_args(number='total', repeat=None)
     def newimages(self, *args, **kwargs):
         """
         Yield information about newly uploaded files.
@@ -5318,7 +5371,7 @@
         """
         return self.newfiles(*args, **kwargs)
 
-    @deprecated_args(number=None, repeat=None)
+    @deprecated_args(number='total', repeat=None)
     def longpages(self, step=None, total=None):
         """Yield Pages and lengths from Special:Longpages.
 
@@ -5350,7 +5403,7 @@
             yield (pywikibot.Page(self, pageitem['title']),
                    int(pageitem['value']))
 
-    @deprecated_args(number=None, repeat=None)
+    @deprecated_args(number='total', repeat=None)
     def deadendpages(self, step=None, total=None):
         """Yield Page objects retrieved from Special:Deadendpages.
 
@@ -5362,7 +5415,7 @@
                                 step=step, total=total)
         return degen
 
-    @deprecated_args(number=None, repeat=None)
+    @deprecated_args(number='total', repeat=None)
     def ancientpages(self, step=None, total=None):
         """Yield Pages, datestamps from Special:Ancientpages.
 
@@ -5376,7 +5429,7 @@
             yield (pywikibot.Page(self, pageitem['title']),
                    pywikibot.Timestamp.fromISOformat(pageitem['timestamp']))
 
-    @deprecated_args(number=None, repeat=None)
+    @deprecated_args(number='total', repeat=None)
     def lonelypages(self, step=None, total=None):
         """Yield Pages retrieved from Special:Lonelypages.
 
@@ -5388,7 +5441,7 @@
                                 step=step, total=total)
         return lpgen
 
-    @deprecated_args(number=None, repeat=None)
+    @deprecated_args(number='total', repeat=None)
     def unwatchedpages(self, step=None, total=None):
         """Yield Pages from Special:Unwatchedpages (requires Admin privileges).
 
@@ -5411,6 +5464,7 @@
                                 step=step, total=total)
         return wpgen
 
+    @deprecated_args(number='total', repeat=None)
     def wantedcategories(self, step=None, total=None):
         """Yield Pages from Special:Wantedcategories.
 
@@ -5423,9 +5477,8 @@
 
         return wcgen
 
-    @deprecated_args(number=None, repeat=None)
-    def uncategorizedcategories(self, number=None, repeat=True,
-                                step=None, total=None):
+    @deprecated_args(number='total', repeat=None)
+    def uncategorizedcategories(self, step=None, total=None):
         """Yield Categories from Special:Uncategorizedcategories.
 
         @param step: request batch size
@@ -5437,9 +5490,8 @@
                                 step=step, total=total)
         return ucgen
 
-    @deprecated_args(number=None, repeat=None)
-    def uncategorizedimages(self, number=None, repeat=True,
-                            step=None, total=None):
+    @deprecated_args(number='total', repeat=None)
+    def uncategorizedimages(self, step=None, total=None):
         """Yield FilePages from Special:Uncategorizedimages.
 
         @param step: request batch size
@@ -5454,9 +5506,8 @@
     # synonym
     uncategorizedfiles = uncategorizedimages
 
-    @deprecated_args(number=None, repeat=None)
-    def uncategorizedpages(self, number=None, repeat=True,
-                           step=None, total=None):
+    @deprecated_args(number='total', repeat=None)
+    def uncategorizedpages(self, step=None, total=None):
         """Yield Pages from Special:Uncategorizedpages.
 
         @param step: request batch size
@@ -5468,9 +5519,8 @@
                                 step=step, total=total)
         return upgen
 
-    @deprecated_args(number=None, repeat=None)
-    def uncategorizedtemplates(self, number=None, repeat=True, step=None,
-                               total=None):
+    @deprecated_args(number='total', repeat=None)
+    def uncategorizedtemplates(self, step=None, total=None):
         """Yield Pages from Special:Uncategorizedtemplates.
 
         @param step: request batch size
@@ -5482,7 +5532,7 @@
                                 step=step, total=total)
         return utgen
 
-    @deprecated_args(number=None, repeat=None)
+    @deprecated_args(number='total', repeat=None)
     def unusedcategories(self, step=None, total=None):
         """Yield Category objects from Special:Unusedcategories.
 
@@ -5495,6 +5545,7 @@
                                 step=step, total=total)
         return ucgen
 
+    @deprecated_args(extension=None, number='total', repeat=None)
     def unusedfiles(self, step=None, total=None):
         """Yield FilePage objects from Special:Unusedimages.
 
@@ -5508,15 +5559,15 @@
         return uigen
 
     @deprecated("Site().unusedfiles()")
-    @deprecated_args(number=None, repeat=None)
-    def unusedimages(self, *args, **kwargs):
+    @deprecated_args(extension=None, number='total', repeat=None)
+    def unusedimages(self, step=None, total=None):
         """Yield FilePage objects from Special:Unusedimages.
 
         DEPRECATED: Use L{APISite.unusedfiles} instead.
         """
-        return self.unusedfiles(*args, **kwargs)
+        return self.unusedfiles(step, total)
 
-    @deprecated_args(number=None, repeat=None)
+    @deprecated_args(number='total', repeat=None)
     def withoutinterwiki(self, step=None, total=None):
         """Yield Pages without language links from Special:Withoutinterwiki.
 
diff --git a/tests/site_tests.py b/tests/site_tests.py
index 6a2c530..14a6e0f 100644
--- a/tests/site_tests.py
+++ b/tests/site_tests.py
@@ -58,6 +58,11 @@
         self.assertIsInstance(ver[2], basestring)
         self.assertDeprecation()
 
+    def test_getcurrenttime(self):
+        """Test live_version."""
+        self.assertEqual(self.site.getcurrenttime(), self.site.server_time())
+        self.assertDeprecation()
+
     def test_token(self):
         """Test ability to get page tokens."""
         # FIXME: deprecation filename is incorrect
@@ -296,7 +301,7 @@
         self.assertGreater(len(mysite.mediawiki_messages(['*'])), 10)
         self.assertNotIn('*', mysite.mediawiki_messages(['*']))
 
-        self.assertIsInstance(mysite.getcurrenttime(), pywikibot.Timestamp)
+        self.assertIsInstance(mysite.server_time(), pywikibot.Timestamp)
         ts = mysite.getcurrenttimestamp()
         self.assertIsInstance(ts, basestring)
         self.assertRegex(ts, r'(19|20)\d\d[0-1]\d[0-3]\d[0-2]\d[0-5]\d[0-5]\d')
@@ -1045,7 +1050,7 @@
                 self.assertIsInstance(hit, pywikibot.Page)
                 self.assertIn(hit.namespace(), [8, 9, 10])
             for hit in mysite.search("wiki", namespaces=0, total=10,
-                                     getredirects=True):
+                                     get_redirects=True):
                 self.assertIsInstance(hit, pywikibot.Page)
                 self.assertEqual(hit.namespace(), 0)
         except pywikibot.data.api.APIError as e:

-- 
To view, visit https://gerrit.wikimedia.org/r/181792
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I69d436f708ebe2f955b68e8405005d34a7af2026
Gerrit-PatchSet: 19
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Owner: John Vandenberg <[email protected]>
Gerrit-Reviewer: John Vandenberg <[email protected]>
Gerrit-Reviewer: Ladsgroup <[email protected]>
Gerrit-Reviewer: Merlijn van Deen <[email protected]>
Gerrit-Reviewer: Mpaa <[email protected]>
Gerrit-Reviewer: XZise <[email protected]>
Gerrit-Reviewer: Xqt <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
Pywikibot-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/pywikibot-commits

Reply via email to