on master help sign in
Drop Python 2 (4/n): SearchQuery.query is a str instead of bytes
commitc225db45c8a4ab466bff049216f7e0189dc1b067 authorDalf <alex@al-f.net> dateTue 11 Aug 2020, 16:25 (6 years ago) parent7888377
20 files changed+48−48
searx/answerers/__init__.py+2−2 searx/answerers/random/answerer.py+6−6 searx/answerers/statistics/answerer.py+5−5 searx/engines/archlinux.py+1−1 searx/engines/arxiv.py+1−1 searx/engines/base.py+1−1 searx/engines/bing.py+1−1 searx/engines/currency_convert.py+2−2 searx/engines/dictzone.py+2−2 searx/engines/gentoo.py+1−1 searx/engines/openstreetmap.py+2−2 searx/engines/scanr_structures.py+1−1 searx/engines/translated.py+3−3 searx/external_bang.py+1−1 searx/plugins/self_info.py+2−2 searx/query.py+4−3 searx/utils.py−1 searx/webapp.py+3−3 tests/unit/test_plugins.py+8−8 tests/unit/test_utils.py+2−2
searx/answerers/__init__.py+2−2
@@ -32,10 +32,10 @@ def ask(query):
3232 results = []
3333 query_parts = list(filter(None, query.query.split()))
3434
35− if query_parts[0].decode() not in answerers_by_keywords:
35+ if query_parts[0] not in answerers_by_keywords:
3636 return results
3737
38− for answerer in answerers_by_keywords[query_parts[0].decode()]:
38+ for answerer in answerers_by_keywords[query_parts[0]]:
3939 result = answerer(query)
4040 if result:
4141 results.append(result)
searx/answerers/random/answerer.py+6−6
@@ -39,11 +39,11 @@ def random_uuid():
3939 return str(uuid.uuid4())
4040
4141
42−random_types = {b'string': random_string,
43− b'int': random_int,
44− b'float': random_float,
45− b'sha256': random_sha256,
46− b'uuid': random_uuid}
42+random_types = {'string': random_string,
43+ 'int': random_int,
44+ 'float': random_float,
45+ 'sha256': random_sha256,
46+ 'uuid': random_uuid}
4747
4848
4949# required answerer function
@@ -64,4 +64,4 @@ def answer(query):
6464def self_info():
6565 return {'name': gettext('Random value generator'),
6666 'description': gettext('Generate different random values'),
67− 'examples': ['random {}'.format(x.decode()) for x in random_types]}
67+ 'examples': ['random {}'.format(x) for x in random_types]}
searx/answerers/statistics/answerer.py+5−5
@@ -27,15 +27,15 @@ def answer(query):
2727 func = parts[0]
2828 answer = None
2929
30− if func == b'min':
30+ if func == 'min':
3131 answer = min(args)
32− elif func == b'max':
32+ elif func == 'max':
3333 answer = max(args)
34− elif func == b'avg':
34+ elif func == 'avg':
3535 answer = sum(args) / len(args)
36− elif func == b'sum':
36+ elif func == 'sum':
3737 answer = sum(args)
38− elif func == b'prod':
38+ elif func == 'prod':
3939 answer = reduce(mul, args, 1)
4040
4141 if answer is None:
searx/engines/archlinux.py+1−1
@@ -105,7 +105,7 @@ def request(query, params):
105105 # if our language is hosted on the main site, we need to add its name
106106 # to the query in order to narrow the results to that language
107107 if language in main_langs:
108− query += b' (' + main_langs[language] + b')'
108+ query += ' (' + main_langs[language] + ')'
109109
110110 # prepare the request parameters
111111 query = urlencode({'search': query})
searx/engines/arxiv.py+1−1
@@ -30,7 +30,7 @@ def request(query, params):
3030 # basic search
3131 offset = (params['pageno'] - 1) * number_of_results
3232
33− string_args = dict(query=query.decode(),
33+ string_args = dict(query=query,
3434 offset=offset,
3535 number_of_results=number_of_results)
3636
searx/engines/base.py+1−1
@@ -55,7 +55,7 @@ shorcut_dict = {
5555def request(query, params):
5656 # replace shortcuts with API advanced search keywords
5757 for key in shorcut_dict.keys():
58− query = re.sub(key, shorcut_dict[key], str(query))
58+ query = re.sub(key, shorcut_dict[key], query)
5959
6060 # basic search
6161 offset = (params['pageno'] - 1) * number_of_results
searx/engines/bing.py+1−1
@@ -47,7 +47,7 @@ def request(query, params):
4747 else:
4848 lang = match_language(params['language'], supported_languages, language_aliases)
4949
50− query = 'language:{} {}'.format(lang.split('-')[0].upper(), query.decode()).encode()
50+ query = 'language:{} {}'.format(lang.split('-')[0].upper(), query)
5151
5252 search_path = search_string.format(
5353 query=urlencode({'q': query}),
searx/engines/currency_convert.py+2−2
@@ -11,13 +11,13 @@ categories = []
1111url = 'https://duckduckgo.com/js/spice/currency/1/{0}/{1}'
1212weight = 100
1313
14−parser_re = re.compile(b'.*?(\\d+(?:\\.\\d+)?) ([^.0-9]+) (?:in|to) ([^.0-9]+)', re.I)
14+parser_re = re.compile('.*?(\\d+(?:\\.\\d+)?) ([^.0-9]+) (?:in|to) ([^.0-9]+)', re.I)
1515
1616db = 1
1717
1818
1919def normalize_name(name):
20− name = name.decode().lower().replace('-', ' ').rstrip('s')
20+ name = name.lower().replace('-', ' ').rstrip('s')
2121 name = re.sub(' +', ' ', name)
2222 return unicodedata.normalize('NFKD', name).lower()
2323
searx/engines/dictzone.py+2−2
@@ -18,7 +18,7 @@ categories = ['general']
1818url = 'https://dictzone.com/{from_lang}-{to_lang}-dictionary/{query}'
1919weight = 100
2020
21−parser_re = re.compile(b'.*?([a-z]+)-([a-z]+) ([^ ]+)$', re.I)
21+parser_re = re.compile('.*?([a-z]+)-([a-z]+) ([^ ]+)$', re.I)
2222results_xpath = './/table[@id="r"]/tr'
2323
2424
@@ -37,7 +37,7 @@ def request(query, params):
3737
3838 params['url'] = url.format(from_lang=from_lang[2],
3939 to_lang=to_lang[2],
40− query=query.decode())
40+ query=query)
4141
4242 return params
4343
searx/engines/gentoo.py+1−1
@@ -90,7 +90,7 @@ def request(query, params):
9090 # if our language is hosted on the main site, we need to add its name
9191 # to the query in order to narrow the results to that language
9292 if language in main_langs:
93− query += b' (' + (main_langs[language]).encode() + b')'
93+ query += ' (' + main_langs[language] + ')'
9494
9595 # prepare the request parameters
9696 query = urlencode({'search': query})
searx/engines/openstreetmap.py+2−2
@@ -30,8 +30,8 @@ route_re = re.compile('(?:from )?(.+) to (.+)')
3030# do search-request
3131def request(query, params):
3232
33− params['url'] = base_url + search_string.format(query=query.decode())
34− params['route'] = route_re.match(query.decode())
33+ params['url'] = base_url + search_string.format(query=query)
34+ params['route'] = route_re.match(query)
3535
3636 return params
3737
searx/engines/scanr_structures.py+1−1
@@ -29,7 +29,7 @@ def request(query, params):
2929 params['url'] = search_url
3030 params['method'] = 'POST'
3131 params['headers']['Content-type'] = "application/json"
32− params['data'] = dumps({"query": query.decode(),
32+ params['data'] = dumps({"query": query,
3333 "searchField": "ALL",
3434 "sortDirection": "ASC",
3535 "sortOrder": "RELEVANCY",
searx/engines/translated.py+3−3
@@ -16,7 +16,7 @@ url = 'https://api.mymemory.translated.net/get?q={query}&langpair={from_lang}|{t
1616web_url = 'https://mymemory.translated.net/en/{from_lang}/{to_lang}/{query}'
1717weight = 100
1818
19−parser_re = re.compile(b'.*?([a-z]+)-([a-z]+) (.{2,})$', re.I)
19+parser_re = re.compile('.*?([a-z]+)-([a-z]+) (.{2,})$', re.I)
2020api_key = ''
2121
2222
@@ -39,9 +39,9 @@ def request(query, params):
3939 key_form = ''
4040 params['url'] = url.format(from_lang=from_lang[1],
4141 to_lang=to_lang[1],
42− query=query.decode(),
42+ query=query,
4343 key=key_form)
44− params['query'] = query.decode()
44+ params['query'] = query
4545 params['from_lang'] = from_lang
4646 params['to_lang'] = to_lang
4747
searx/external_bang.py+1−1
@@ -23,7 +23,7 @@ def get_bang_url(search_query):
2323 """
2424
2525 if search_query.external_bang:
26− query = search_query.query.decode(errors='ignore')
26+ query = search_query.query
2727 bang = _get_bang(search_query.external_bang)
2828
2929 if bang and query:
searx/plugins/self_info.py+2−2
@@ -22,7 +22,7 @@ default_on = True
2222
2323
2424# Self User Agent regex
25−p = re.compile(b'.*user[ -]agent.*', re.IGNORECASE)
25+p = re.compile('.*user[ -]agent.*', re.IGNORECASE)
2626
2727
2828# attach callback to the post search hook
@@ -31,7 +31,7 @@ p = re.compile(b'.*user[ -]agent.*', re.IGNORECASE)
3131def post_search(request, search):
3232 if search.search_query.pageno > 1:
3333 return True
34− if search.search_query.query == b'ip':
34+ if search.search_query.query == 'ip':
3535 x_forwarded_for = request.headers.getlist("X-Forwarded-For")
3636 if x_forwarded_for:
3737 ip = x_forwarded_for[0]
searx/query.py+4−3
@@ -32,6 +32,7 @@ class RawTextQuery:
3232 """parse raw text query (the value from the html input)"""
3333
3434 def __init__(self, query, disabled_engines):
35+ assert isinstance(query, str)
3536 self.query = query
3637 self.disabled_engines = []
3738
@@ -51,7 +52,7 @@ class RawTextQuery:
5152 self.query_parts = []
5253
5354 # split query, including whitespaces
54− raw_query_parts = re.split(r'(\s+)' if isinstance(self.query, str) else b'(\s+)', self.query)
55+ raw_query_parts = re.split(r'(\s+)', self.query)
5556
5657 parse_next = True
5758
@@ -183,7 +184,7 @@ class SearchQuery:
183184
184185 def __init__(self, query, engines, categories, lang, safesearch, pageno, time_range,
185186 timeout_limit=None, preferences=None, external_bang=None):
186− self.query = query.encode()
187+ self.query = query
187188 self.engines = engines
188189 self.categories = categories
189190 self.lang = lang
@@ -195,4 +196,4 @@ class SearchQuery:
195196 self.external_bang = external_bang
196197
197198 def __str__(self):
198− return str(self.query) + ";" + str(self.engines)
199+ return self.query + ";" + str(self.engines)
searx/utils.py−1
@@ -59,7 +59,6 @@ def highlight_content(content, query):
5959 if content.find('<') != -1:
6060 return content
6161
62− query = query.decode()
6362 if content.lower().find(query.lower()) > -1:
6463 query_regex = '({0})'.format(re.escape(query))
6564 content = re.sub(query_regex, '<span class="highlight">\\1</span>',
searx/webapp.py+3−3
@@ -623,7 +623,7 @@ def index():
623623 result['publishedDate'] = format_date(result['publishedDate'])
624624
625625 if output_format == 'json':
626− return Response(json.dumps({'query': search_query.query.decode(),
626+ return Response(json.dumps({'query': search_query.query,
627627 'number_of_results': number_of_results,
628628 'results': results,
629629 'answers': list(result_container.answers),
@@ -652,7 +652,7 @@ def index():
652652 csv.writerow([row.get(key, '') for key in keys])
653653 csv.stream.seek(0)
654654 response = Response(csv.stream.read(), mimetype='application/csv')
655− cont_disp = 'attachment;Filename=searx_-_{0}.csv'.format(search_query.query.decode())
655+ cont_disp = 'attachment;Filename=searx_-_{0}.csv'.format(search_query.query)
656656 response.headers.add('Content-Disposition', cont_disp)
657657 return response
658658
@@ -736,7 +736,7 @@ def autocompleter():
736736 disabled_engines = request.preferences.engines.get_disabled()
737737
738738 # parse query
739− raw_text_query = RawTextQuery(request.form.get('q', b''), disabled_engines)
739+ raw_text_query = RawTextQuery(str(request.form.get('q', b'')), disabled_engines)
740740 raw_text_query.parse_query()
741741
742742 # check if search query is set
tests/unit/test_plugins.py+8−8
@@ -48,11 +48,11 @@ class SelfIPTest(SearxTestCase):
4848 # IP test
4949 request = Mock(remote_addr='127.0.0.1')
5050 request.headers.getlist.return_value = []
51− search = get_search_mock(query=b'ip', pageno=1)
51+ search = get_search_mock(query='ip', pageno=1)
5252 store.call(store.plugins, 'post_search', request, search)
5353 self.assertTrue('127.0.0.1' in search.result_container.answers["ip"]["answer"])
5454
55− search = get_search_mock(query=b'ip', pageno=2)
55+ search = get_search_mock(query='ip', pageno=2)
5656 store.call(store.plugins, 'post_search', request, search)
5757 self.assertFalse('ip' in search.result_container.answers)
5858
@@ -60,26 +60,26 @@ class SelfIPTest(SearxTestCase):
6060 request = Mock(user_agent='Mock')
6161 request.headers.getlist.return_value = []
6262
63− search = get_search_mock(query=b'user-agent', pageno=1)
63+ search = get_search_mock(query='user-agent', pageno=1)
6464 store.call(store.plugins, 'post_search', request, search)
6565 self.assertTrue('Mock' in search.result_container.answers["user-agent"]["answer"])
6666
67− search = get_search_mock(query=b'user-agent', pageno=2)
67+ search = get_search_mock(query='user-agent', pageno=2)
6868 store.call(store.plugins, 'post_search', request, search)
6969 self.assertFalse('user-agent' in search.result_container.answers)
7070
71− search = get_search_mock(query=b'user-agent', pageno=1)
71+ search = get_search_mock(query='user-agent', pageno=1)
7272 store.call(store.plugins, 'post_search', request, search)
7373 self.assertTrue('Mock' in search.result_container.answers["user-agent"]["answer"])
7474
75− search = get_search_mock(query=b'user-agent', pageno=2)
75+ search = get_search_mock(query='user-agent', pageno=2)
7676 store.call(store.plugins, 'post_search', request, search)
7777 self.assertFalse('user-agent' in search.result_container.answers)
7878
79− search = get_search_mock(query=b'What is my User-Agent?', pageno=1)
79+ search = get_search_mock(query='What is my User-Agent?', pageno=1)
8080 store.call(store.plugins, 'post_search', request, search)
8181 self.assertTrue('Mock' in search.result_container.answers["user-agent"]["answer"])
8282
83− search = get_search_mock(query=b'What is my User-Agent?', pageno=2)
83+ search = get_search_mock(query='What is my User-Agent?', pageno=2)
8484 store.call(store.plugins, 'post_search', request, search)
8585 self.assertFalse('user-agent' in search.result_container.answers)
tests/unit/test_utils.py+2−2
@@ -30,9 +30,9 @@ class TestUtils(SearxTestCase):
3030 self.assertEqual(utils.highlight_content(content, None), content)
3131
3232 content = 'a'
33− query = b'test'
33+ query = 'test'
3434 self.assertEqual(utils.highlight_content(content, query), content)
35− query = b'a test'
35+ query = 'a test'
3636 self.assertEqual(utils.highlight_content(content, query), content)
3737
3838 def test_html_to_text(self):