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

Change subject: [IMPR] run _generate_submodules multiple times instead for a 
generator
......................................................................

[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(-)

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



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 https://gerrit.wikimedia.org/r/c/pywikibot/core/+/759882
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: I710216411adfa843f60c96ddca102ccae5ce9e47
Gerrit-Change-Number: 759882
Gerrit-PatchSet: 2
Gerrit-Owner: Xqt <[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