@@ -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', '')