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)
pywikibot-commits@lists.wikimedia.org