jenkins-bot submitted this change.

View Change

Approvals: Xqt: Looks good to me, approved jenkins-bot: Verified
[IMPR] run _generate_submodules multiple times instead for a generator

- call _generate_submodules for each module instead passing the
generator to it and iterate through it again
- decrease nested flow statements
- update tests

Change-Id: I710216411adfa843f60c96ddca102ccae5ce9e47
---
M pywikibot/data/api.py
M tests/api_tests.py
2 files changed, 53 insertions(+), 67 deletions(-)

diff --git a/pywikibot/data/api.py b/pywikibot/data/api.py
index 47c1a6e..ca9f047 100644
--- a/pywikibot/data/api.py
+++ b/pywikibot/data/api.py
@@ -373,67 +373,65 @@
del normalized_result[path]

self._paraminfo.update(normalized_result)
- self._generate_submodules(mod['path']
- for mod in normalized_result.values())
+ for mod in normalized_result.values():
+ self._generate_submodules(mod['path'])

if 'pageset' in modules and 'pageset' not in self._paraminfo:
self._emulate_pageset()

- def _generate_submodules(self, modules):
- """Check and generate submodules for the given modules."""
- for module in modules:
- parameters = self._paraminfo[module].get('parameters', [])
- submodules = set()
- # Advanced submodule into added to MW API in df80f1ea
- if self.site.mw_version >= '1.26wmf9':
- # This is supplying submodules even if they aren't submodules
- # of the given module so skip those
- for param in parameters:
- if ((module == 'main' and param['name'] == 'format')
- or 'submodules' not in param):
- continue
- for submodule in param['submodules'].values():
- if '+' in submodule:
- parent, child = submodule.rsplit('+', 1)
- else:
- parent = 'main'
- child = submodule
- if parent == module:
- submodules.add(child)
- else:
- # Boolean submodule info added to MW API in afa153ae
- if self.site.mw_version < '1.24wmf18':
- if module == 'main':
- params = {'action'}
- elif module == 'query':
- params = {'prop', 'list', 'meta'}
+ def _generate_submodules(self, module):
+ """Check and generate submodules for the given module."""
+ parameters = self._paraminfo[module].get('parameters', [])
+ submodules = set()
+ # Advanced submodule into added to MW API in df80f1ea
+ if self.site.mw_version >= '1.26wmf9':
+ # This is supplying submodules even if they aren't submodules
+ # of the given module so skip those
+ for param in parameters:
+ if module == 'main' and param['name'] == 'format' \
+ or 'submodules' not in param:
+ continue
+
+ for submodule in param['submodules'].values():
+ if '+' in submodule:
+ parent, child = submodule.rsplit('+', 1)
else:
- params = set()
- for param in parameters:
- if param['name'] in params:
- param['submodules'] = ''
-
- for param in parameters:
- # Do not add format modules
- if ('submodules' in param
- and (module != 'main'
- or param['name'] != 'format')):
- submodules |= set(param['type'])
-
- if submodules:
- self._add_submodules(module, submodules)
- if module == 'query':
- # Previously also modules from generator were used as query
- # modules, but verify that those are just a subset of the
- # prop/list/meta modules. There is no sanity check as this
- # needs to be revisited if query has no generator parameter
- for param in parameters:
- if param['name'] == 'generator':
- break
+ parent, child = 'main', submodule
+ if parent == module:
+ submodules.add(child)
+ else:
+ # Boolean submodule info added to MW API in afa153ae
+ if self.site.mw_version < '1.24wmf18':
+ if module == 'main':
+ params = {'action'}
+ elif module == 'query':
+ params = {'prop', 'list', 'meta'}
else:
- param = {}
- assert param['name'] == 'generator' \
- and submodules >= set(param['type'])
+ params = set()
+ for param in parameters:
+ if param['name'] in params:
+ param['submodules'] = ''
+
+ for param in parameters:
+ # Do not add format modules
+ if 'submodules' in param \
+ and (module != 'main' or param['name'] != 'format'):
+ submodules |= set(param['type'])
+
+ if submodules:
+ self._add_submodules(module, submodules)
+ if module == 'query':
+ # Previously also modules from generator were used as query
+ # modules, but verify that those are just a subset of the
+ # prop/list/meta modules. There is no sanity check as this
+ # needs to be revisited if query has no generator parameter
+ for param in parameters:
+ if param['name'] == 'generator':
+ break
+ else:
+ param = {}
+ assert param['name'] == 'generator' \
+ and submodules >= set(param['type'])

def _normalize_modules(self, modules) -> set:
"""Add query+ to any query module name not also in action modules."""
diff --git a/tests/api_tests.py b/tests/api_tests.py
index ae1d958..75e3d3b 100644
--- a/tests/api_tests.py
+++ b/tests/api_tests.py
@@ -98,20 +98,8 @@

def test_init_query_first(self):
"""Test init where it first adds query and then main."""
- def patched_generate_submodules(modules):
- # Change the query such that query is handled before main
- modules = set(modules)
- if 'main' in modules:
- assert 'query' in modules
- modules.discard('main')
- modules = list(modules) + ['main']
- else:
- assert 'query' not in modules
- original_generate_submodules(modules)
pi = api.ParamInfo(self.site, {'query', 'main'})
self.assertIsEmpty(pi)
- original_generate_submodules = pi._generate_submodules
- pi._generate_submodules = patched_generate_submodules
pi._init()
self.assertIn('main', pi._paraminfo)
self.assertIn('query', pi._paraminfo)

To view, visit change 759882. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: I710216411adfa843f60c96ddca102ccae5ce9e47
Gerrit-Change-Number: 759882
Gerrit-PatchSet: 2
Gerrit-Owner: Xqt <info@gno.de>
Gerrit-Reviewer: Xqt <info@gno.de>
Gerrit-Reviewer: jenkins-bot
Gerrit-MessageType: merged