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

Change subject: Add ParamInfo support for v1.15-18
......................................................................


Add ParamInfo support for v1.15-18

Version before 1.19 need to obtain the query modules from the
paraminfo for the query module.

In earlier versions, for modules which do not have any parameters,
such as categoryinfo, the parameters member may be missing from the
paraminfo structure.

Bug: T85786
Change-Id: I779c7637d11a218ba389b05b222a384a0296b822
---
M pywikibot/data/api.py
M tests/api_tests.py
2 files changed, 38 insertions(+), 16 deletions(-)

Approvals:
  XZise: Looks good to me, but someone else must approve
  Mpaa: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/pywikibot/data/api.py b/pywikibot/data/api.py
index 5225322..04245ce 100644
--- a/pywikibot/data/api.py
+++ b/pywikibot/data/api.py
@@ -187,22 +187,29 @@
             self.paraminfo_keys = frozenset(['modules'])
 
     def _init(self):
+        _mw_ver = MediaWikiVersion(self.site.version())
         # The paraminfo api deprecated the old request syntax of
         # querymodules='info'; to avoid warnings sites with 1.25wmf4+
         # must only use 'modules' parameter.
         if self.modules_only_mode is None:
-            self.modules_only_mode = MediaWikiVersion(self.site.version()) >= 
MediaWikiVersion('1.25wmf4')
+            self.modules_only_mode = _mw_ver >= MediaWikiVersion('1.25wmf4')
             if self.modules_only_mode:
                 self.paraminfo_keys = frozenset(['modules'])
-            # Assume that by v1.26, it will be desirable to prefetch 'query'
-            if MediaWikiVersion(self.site.version()) > 
MediaWikiVersion('1.26'):
-                self.preloaded_modules |= set(['query'])
+
+        # v1.18 and earlier paraminfo doesnt include modules; must use 'query'
+        # Assume that by v1.26, it will be desirable to prefetch 'query'
+        if _mw_ver > MediaWikiVersion('1.26') or _mw_ver < 
MediaWikiVersion('1.19'):
+            self.preloaded_modules |= set(['query'])
 
         self.fetch(self.preloaded_modules, _init=True)
+
+        # paraminfo 'mainmodule' was added 1.15
+        assert('main' in self._paraminfo)
         main_modules_param = self.parameter('main', 'action')
 
         assert(main_modules_param)
         assert('type' in main_modules_param)
+        assert(isinstance(main_modules_param['type'], list))
         self._action_modules = frozenset(main_modules_param['type'])
 
         # While deprecated with warning in 1.25, paraminfo param 'querymodules'
@@ -214,26 +221,35 @@
         assert('limit' in query_modules_param)
         self._limit = query_modules_param['limit']
 
-        if query_modules_param:
-            assert('type' in query_modules_param)
-            self._query_modules = frozenset(query_modules_param['type'])
-        else:
+        if query_modules_param and 'type' in query_modules_param:
+            # 1.19+ 'type' is the list of modules; on 1.18, it is 'string'
+            if isinstance(query_modules_param['type'], list):
+                self._query_modules = frozenset(query_modules_param['type'])
+
+        if not self._query_modules:
             if 'query' not in self._paraminfo:
                 self.fetch(set(['query']), _init=True)
 
+            meta_param = self.parameter('query', 'meta')
             prop_param = self.parameter('query', 'prop')
             list_param = self.parameter('query', 'list')
             generator_param = self.parameter('query', 'generator')
 
+            assert(meta_param)
             assert(prop_param)
             assert(list_param)
             assert(generator_param)
+            assert('type' in meta_param)
             assert('type' in prop_param)
             assert('type' in list_param)
             assert('type' in generator_param)
+            assert(isinstance(meta_param['type'], list))
+            assert(isinstance(prop_param['type'], list))
+            assert(isinstance(list_param['type'], list))
+            assert(isinstance(generator_param['type'], list))
 
             self._query_modules = frozenset(
-                prop_param['type'] + list_param['type'] +
+                meta_param['type'] + prop_param['type'] + list_param['type'] +
                 generator_param['type']
             )
 
@@ -343,7 +359,8 @@
                       for paraminfo_key, modules_data
                       in data['paraminfo'].items()
                       if modules_data and paraminfo_key in cls.paraminfo_keys]
-                     for mod_data in modules_data])
+                     for mod_data in modules_data
+                     if 'missing' not in mod_data])
 
     def __getitem__(self, key):
         """Return a paraminfo property, caching it."""
@@ -377,7 +394,14 @@
         # also params which are common to many modules, such as those provided
         # by the ApiPageSet php class: titles, pageids, redirects, etc.
         self.fetch(set([module]))
-        param_data = [param for param in self._paraminfo[module]['parameters']
+        if module not in self._paraminfo:
+            raise ValueError("paraminfo for '%s' not loaded" % module)
+        if 'parameters' not in self._paraminfo[module]:
+            pywikibot.warning("module '%s' has no parameters" % module)
+            return
+
+        params = self._paraminfo[module]['parameters']
+        param_data = [param for param in params
                       if param['name'] == param_name]
         return param_data[0] if len(param_data) else None
 
diff --git a/tests/api_tests.py b/tests/api_tests.py
index de05bed..c417356 100644
--- a/tests/api_tests.py
+++ b/tests/api_tests.py
@@ -69,16 +69,16 @@
         self.assertIn('main', pi)
         self.assertIn('paraminfo', pi)
         self.assertEqual(len(pi),
-                         len(pi.init_modules))
+                         len(pi.preloaded_modules))
 
         self.assertIn('info', pi._query_modules)
+        self.assertIn('login', pi._action_modules)
 
     def test_init_pageset(self):
         site = self.get_site()
         self.assertNotIn('query', api.ParamInfo.init_modules)
         pi = api.ParamInfo(site, set(['pageset']))
         self.assertNotIn('query', api.ParamInfo.init_modules)
-        self.assertNotIn('query', pi.preloaded_modules)
         self.assertEqual(len(pi), 0)
         pi._init()
 
@@ -86,12 +86,10 @@
         self.assertIn('paraminfo', pi)
         self.assertIn('pageset', pi)
 
-        if pi.modules_only_mode:
-            self.assertIn('query', pi.preloaded_modules)
+        if 'query' in pi.preloaded_modules:
             self.assertIn('query', pi)
             self.assertEqual(len(pi), 4)
         else:
-            self.assertNotIn('query', pi.preloaded_modules)
             self.assertNotIn('query', pi)
             self.assertEqual(len(pi), 3)
 

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

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

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

Reply via email to