on master help sign in
[mod] add typing and __slots__
commit485a502b886bc7fb8a806ffc576b0eec99990a5c authorAlexandre Flament <alex@al-f.net> dateThu 10 Sep 2020, 18:08 (6 years ago) parent678699b
4 files changed+36−12
searx/search.py+22−4 searx/webadapter.py+12−8 tests/unit/test_search.py+1 utils/standalone_searx.py+1
searx/search.py+22−4
@@ -15,6 +15,7 @@ along with searx. If not, see < http://www.gnu.org/licenses/ >.
1515(C) 2013- by Adam Tauber, <asciimoo@gmail.com>
1616'''
1717
18+import typing
1819import gc
1920import threading
2021from time import time
@@ -49,7 +50,9 @@ else:
4950
5051class EngineRef:
5152
52− def __init__(self, name, category, from_bang=False):
53+ __slots__ = 'name', 'category', 'from_bang'
54+
55+ def __init__(self, name: str, category: str, from_bang: bool=False):
5356 self.name = name
5457 self.category = category
5558 self.from_bang = from_bang
@@ -61,8 +64,19 @@ class EngineRef:
6164class SearchQuery:
6265 """container for all the search parameters (query, language, etc...)"""
6366
64− def __init__(self, query, engineref_list, categories, lang, safesearch, pageno, time_range,
65− timeout_limit=None, external_bang=None):
67+ __slots__ = 'query', 'engineref_list', 'categories', 'lang', 'safesearch', 'pageno', 'time_range',\
68+ 'timeout_limit', 'external_bang'
69+
70+ def __init__(self,
71+ query: str,
72+ engineref_list: typing.List[EngineRef],
73+ categories: typing.List[str],
74+ lang: str,
75+ safesearch: bool,
76+ pageno: int,
77+ time_range: typing.Optional[str],
78+ timeout_limit: typing.Optional[float]=None,
79+ external_bang: typing.Optional[str]=False):
6680 self.query = query
6781 self.engineref_list = engineref_list
6882 self.categories = categories
@@ -274,6 +288,8 @@ def default_request_params():
274288class Search:
275289 """Search information container"""
276290
291+ __slots__ = "search_query", "result_container", "start_time", "actual_timeout"
292+
277293 def __init__(self, search_query):
278294 # init vars
279295 super().__init__()
@@ -396,7 +412,7 @@ class Search:
396412 actual_timeout = min(query_timeout, max_request_timeout)
397413
398414 logger.debug("actual_timeout={0} (default_timeout={1}, ?timeout_limit={2}, max_request_timeout={3})"
399− .format(self.actual_timeout, default_timeout, query_timeout, max_request_timeout))
415+ .format(actual_timeout, default_timeout, query_timeout, max_request_timeout))
400416
401417 return requests, actual_timeout
402418
@@ -428,6 +444,8 @@ class Search:
428444class SearchWithPlugins(Search):
429445 """Similar to the Search class but call the plugins."""
430446
447+ __slots__ = 'ordered_plugin_list', 'request'
448+
431449 def __init__(self, search_query, ordered_plugin_list, request):
432450 super().__init__(search_query)
433451 self.ordered_plugin_list = ordered_plugin_list
searx/webadapter.py+12−8
@@ -1,19 +1,22 @@
1+import typing
12from searx.exceptions import SearxParameterException
23from searx.query import RawTextQuery, VALID_LANGUAGE_CODE
34from searx.engines import categories, engines
45from searx.search import SearchQuery, EngineRef
6+from searx.preferences import Preferences
57
68
79# remove duplicate queries.
810# FIXME: does not fix "!music !soundcloud", because the categories are 'none' and 'music'
9−def deduplicate_engineref_list(engineref_list):
11+def deduplicate_engineref_list(engineref_list: typing.List[EngineRef]) -> typing.List[EngineRef]:
1012 engineref_dict = {q.category + '|' + q.name: q for q in engineref_list}
1113 return engineref_dict.values()
1214
1315
14−def validate_engineref_list(engineref_list, preferences):
16+def validate_engineref_list(engineref_list: typing.List[EngineRef], preferences: Preferences):
1517 """
1618 Validate query_engines according to the preferences
19+
1720 Returns:
1821 list of existing engines with a validated token
1922 list of unknown engine
@@ -36,14 +39,14 @@ def validate_engineref_list(engineref_list, preferences):
3639 return valid, unknown, no_token
3740
3841
39−def parse_pageno(form):
42+def parse_pageno(form: typing.Dict[str, str]) -> int:
4043 pageno_param = form.get('pageno', '1')
4144 if not pageno_param.isdigit() or int(pageno_param) < 1:
4245 raise SearxParameterException('pageno', pageno_param)
4346 return int(pageno_param)
4447
4548
46−def parse_lang(raw_text_query, form, preferences):
49+def parse_lang(raw_text_query: RawTextQuery, form: typing.Dict[str, str], preferences: Preferences) -> str:
4750 # get language
4851 # set specific language if set on request, query or preferences
4952 # TODO support search with multible languages
@@ -61,7 +64,7 @@ def parse_lang(raw_text_query, form, preferences):
6164 return query_lang
6265
6366
64−def parse_safesearch(form, preferences):
67+def parse_safesearch(form: typing.Dict[str, str], preferences: Preferences) -> int:
6568 if 'safesearch' in form:
6669 query_safesearch = form.get('safesearch')
6770 # first check safesearch
@@ -78,7 +81,7 @@ def parse_safesearch(form, preferences):
7881 return query_safesearch
7982
8083
81−def parse_time_range(form):
84+def parse_time_range(form: typing.Dict[str, str]) -> str:
8285 query_time_range = form.get('time_range')
8386 # check time_range
8487 query_time_range = None if query_time_range in ('', 'None') else query_time_range
@@ -87,7 +90,7 @@ def parse_time_range(form):
8790 return query_time_range
8891
8992
90−def parse_timeout(raw_text_query, form):
93+def parse_timeout(raw_text_query: RawTextQuery, form: typing.Dict[str, str]) -> typing.Optional[float]:
9194 query_timeout = raw_text_query.timeout_limit
9295 if query_timeout is None and 'timeout_limit' in form:
9396 raw_time_limit = form.get('timeout_limit')
@@ -187,7 +190,8 @@ def parse_generic(form, preferences, disabled_engines):
187190 return query_engineref_list, query_categories
188191
189192
190−def get_search_query_from_webapp(preferences, form):
193+def get_search_query_from_webapp(preferences: Preferences, form: typing.Dict[str, str])\
194+ -> typing.Tuple[SearchQuery, RawTextQuery, typing.List[EngineRef], typing.List[EngineRef]]:
191195 # no text for the query ?
192196 if not form.get('q'):
193197 raise SearxParameterException('q', '')
tests/unit/test_search.py+1
@@ -3,6 +3,7 @@
33from searx.testing import SearxTestCase
44from searx.search import SearchQuery, EngineRef
55import searx.search
6+import searx.engines
67
78
89SAFESEARCH = 0
utils/standalone_searx.py+1
@@ -30,6 +30,7 @@ import codecs
3030import searx.query
3131import searx.search
3232import searx.engines
33+import searx.webapdater
3334import searx.preferences
3435import searx.webadapter
3536import argparse