Browse Source

[refactor] make group_engines_in_tab more readable

Martin Fischer 3 years ago
parent
commit
3dd534e5c0
1 changed files with 15 additions and 14 deletions
  1. 15 14
      searx/webutils.py

+ 15 - 14
searx/webutils.py

@@ -6,12 +6,13 @@ import hmac
 import re
 import re
 import inspect
 import inspect
 import itertools
 import itertools
+from typing import Iterable, List, Tuple
 
 
 from io import StringIO
 from io import StringIO
 from codecs import getincrementalencoder
 from codecs import getincrementalencoder
 
 
 from searx import logger, settings
 from searx import logger, settings
-from searx.engines import OTHER_CATEGORY
+from searx.engines import Engine, OTHER_CATEGORY
 
 
 
 
 VALID_LANGUAGE_CODE = re.compile(r'^[a-z]{2,3}(-[a-zA-Z]{2})?$')
 VALID_LANGUAGE_CODE = re.compile(r'^[a-z]{2,3}(-[a-zA-Z]{2})?$')
@@ -141,21 +142,21 @@ def is_flask_run_cmdline():
 DEFAULT_GROUP_NAME = 'others'
 DEFAULT_GROUP_NAME = 'others'
 
 
 
 
-def group_engines_in_tab(engines):
-    def engine_sort_key(engine):
-        return (engine.about.get('language', ''), engine.name)
-
-    def group_sort_key(group):
-        return (group[0] == DEFAULT_GROUP_NAME, group[0].lower())
+def group_engines_in_tab(engines: Iterable[Engine]) -> List[Tuple[str, Iterable[Engine]]]:
+    """Groups an Iterable of engines by their first non tab category"""
 
 
     def get_group(eng):
     def get_group(eng):
         non_tab_categories = [c for c in eng.categories if c not in settings['categories_as_tabs'] + [OTHER_CATEGORY]]
         non_tab_categories = [c for c in eng.categories if c not in settings['categories_as_tabs'] + [OTHER_CATEGORY]]
         return non_tab_categories[0] if len(non_tab_categories) > 0 else DEFAULT_GROUP_NAME
         return non_tab_categories[0] if len(non_tab_categories) > 0 else DEFAULT_GROUP_NAME
 
 
-    return [
-        (groupname, sorted(engines, key=engine_sort_key))
-        for groupname, engines in sorted(
-            ((name, list(engines)) for name, engines in itertools.groupby(sorted(engines, key=get_group), get_group)),
-            key=group_sort_key,
-        )
-    ]
+    groups = itertools.groupby(sorted(engines, key=get_group), get_group)
+
+    def group_sort_key(group):
+        return (group[0] == DEFAULT_GROUP_NAME, group[0].lower())
+
+    sorted_groups = sorted(((name, list(engines)) for name, engines in groups), key=group_sort_key)
+
+    def engine_sort_key(engine):
+        return (engine.about.get('language', ''), engine.name)
+
+    return [(groupname, sorted(engines, key=engine_sort_key)) for groupname, engines in sorted_groups]