on master help sign in
Change plugin API :
fbb080fdalf
searx/plugins/doai_rewrite.py+4−4
@@ -20,12 +20,12 @@ def extract_doi(url):
20 return None
20 return None
21
21
22
22
23−def on_result(request, ctx):
23+def on_result(request, search, result):
24− doi = extract_doi(ctx['result']['parsed_url'])
24+ doi = extract_doi(result['parsed_url'])
25 if doi and len(doi) < 50:
25 if doi and len(doi) < 50:
26 for suffix in ('/', '.pdf', '/full', '/meta', '/abstract'):
26 for suffix in ('/', '.pdf', '/full', '/meta', '/abstract'):
27 if doi.endswith(suffix):
27 if doi.endswith(suffix):
28 doi = doi[:-len(suffix)]
28 doi = doi[:-len(suffix)]
29− ctx['result']['url'] = 'http://doai.io/' + doi
29+ result['url'] = 'http://doai.io/' + doi
30− ctx['result']['parsed_url'] = urlparse(ctx['result']['url'])
30+ result['parsed_url'] = urlparse(ctx['result']['url'])
31 return True
31 return True
searx/plugins/https_rewrite.py+1−2
@@ -220,8 +220,7 @@ def https_url_rewrite(result):
220 return result
220 return result
221
221
222
222
223−def on_result(request, ctx):
223+def on_result(request, search, result):
224− result = ctx['result']
225 if result['parsed_url'].scheme == 'http':
224 if result['parsed_url'].scheme == 'http':
226 https_url_rewrite(result)
225 https_url_rewrite(result)
227 return True
226 return True
searx/plugins/self_info.py+8−8
@@ -28,19 +28,19 @@ p = re.compile('.*user[ -]agent.*', re.IGNORECASE)
28# attach callback to the post search hook
28# attach callback to the post search hook
29# request: flask request object
29# request: flask request object
30# ctx: the whole local context of the pre search hook
30# ctx: the whole local context of the pre search hook
31−def post_search(request, ctx):
31+def post_search(request, search):
32− if ctx['search'].pageno > 1:
32+ if search.search_query.pageno > 1:
33 return True
33 return True
34− if ctx['search'].query == 'ip':
34+ if search.search_query.query == 'ip':
35 x_forwarded_for = request.headers.getlist("X-Forwarded-For")
35 x_forwarded_for = request.headers.getlist("X-Forwarded-For")
36 if x_forwarded_for:
36 if x_forwarded_for:
37 ip = x_forwarded_for[0]
37 ip = x_forwarded_for[0]
38 else:
38 else:
39 ip = request.remote_addr
39 ip = request.remote_addr
40− ctx['result_container'].answers.clear()
40+ search.result_container.answers.clear()
41− ctx['result_container'].answers.add(ip)
41+ search.result_container.answers.add(ip)
42− elif p.match(ctx['search'].query):
42+ elif p.match(search.search_query.query):
43 ua = request.user_agent
43 ua = request.user_agent
44− ctx['result_container'].answers.clear()
44+ search.result_container.answers.clear()
45− ctx['result_container'].answers.add(ua)
45+ search.result_container.answers.add(ua)
46 return True
46 return True
searx/plugins/tracker_url_remover.py+5−5
@@ -28,8 +28,8 @@ description = gettext('Remove trackers arguments from the returned URL')
28default_on = True
28default_on = True
29
29
30
30
31−def on_result(request, ctx):
31+def on_result(request, search, result):
32− query = ctx['result']['parsed_url'].query
32+ query = result['parsed_url'].query
33
33
34 if query == "":
34 if query == "":
35 return True
35 return True
@@ -37,8 +37,8 @@ def on_result(request, ctx):
37 for reg in regexes:
37 for reg in regexes:
38 query = reg.sub('', query)
38 query = reg.sub('', query)
39
39
40− if query != ctx['result']['parsed_url'].query:
40+ if query != result['parsed_url'].query:
41− ctx['result']['parsed_url'] = ctx['result']['parsed_url']._replace(query=query)
41+ result['parsed_url'] = result['parsed_url']._replace(query=query)
42− ctx['result']['url'] = urlunparse(ctx['result']['parsed_url'])
42+ result['url'] = urlunparse(result['parsed_url'])
43
43
44 return True
44 return True
searx/search.py+10−22
@@ -357,35 +357,23 @@ class Search(object):
357 return self.result_container
357 return self.result_container
358
358
359
359
360−def search_with_plugins(do_search, search_query, request, request_data, result_container):
361− """Search using the do_search function and with plugins filtering.
362− Standalone function to have a well define locals().
363− result_container contains the results after the function call.
364− """
365− search = search_query
366−
367− if plugins.call('pre_search', request, locals()):
368− do_search()
369−
370− plugins.call('post_search', request, locals())
371−
372− results = result_container.get_ordered_results()
373−
374− for result in results:
375− plugins.call('on_result', request, locals())
376−
377−
378class SearchWithPlugins(Search):
360class SearchWithPlugins(Search):
379
361
362+ """Similar to the Search class but call the plugins."""
363+
380 def __init__(self, search_query, request):
364 def __init__(self, search_query, request):
381 super(SearchWithPlugins, self).__init__(search_query)
365 super(SearchWithPlugins, self).__init__(search_query)
382 self.request = request
366 self.request = request
383− self.request_data = request.request_data
384
367
385 def search(self):
368 def search(self):
386−
369+ if plugins.call('pre_search', self.request, self):
387− def do_search():
388 super(SearchWithPlugins, self).search()
370 super(SearchWithPlugins, self).search()
389
371
390− search_with_plugins(do_search, self.search_query, self.request, self.request_data, self.result_container)
372+ plugins.call('post_search', self.request, self)
373+
374+ results = self.result_container.get_ordered_results()
375+
376+ for result in results:
377+ plugins.call('on_result', self.request, self, result)
378+
391 return self.result_container
379 return self.result_container
tests/unit/test_plugins.py+26−26
@@ -6,8 +6,8 @@ from mock import Mock
6
6
7
7
8def get_search_mock(query, **kwargs):
8def get_search_mock(query, **kwargs):
9− return {'search': Mock(query=query, **kwargs),
9+ return Mock(search_query=Mock(query=query, **kwargs),
10− 'result_container': Mock(answers=set())}
10+ result_container=Mock(answers=set()))
11
11
12
12
13class PluginStoreTest(SearxTestCase):
13class PluginStoreTest(SearxTestCase):
@@ -51,39 +51,39 @@ class SelfIPTest(SearxTestCase):
51 request = Mock(user_plugins=store.plugins,
51 request = Mock(user_plugins=store.plugins,
52 remote_addr='127.0.0.1')
52 remote_addr='127.0.0.1')
53 request.headers.getlist.return_value = []
53 request.headers.getlist.return_value = []
54− ctx = get_search_mock(query='ip', pageno=1)
54+ search = get_search_mock(query='ip', pageno=1)
55− store.call('post_search', request, ctx)
55+ store.call('post_search', request, search)
56− self.assertTrue('127.0.0.1' in ctx['result_container'].answers)
56+ self.assertTrue('127.0.0.1' in search.result_container.answers)
57
57
58− ctx = get_search_mock(query='ip', pageno=2)
58+ search = get_search_mock(query='ip', pageno=2)
59− store.call('post_search', request, ctx)
59+ store.call('post_search', request, search)
60− self.assertFalse('127.0.0.1' in ctx['result_container'].answers)
60+ self.assertFalse('127.0.0.1' in search.result_container.answers)
61
61
62 # User agent test
62 # User agent test
63 request = Mock(user_plugins=store.plugins,
63 request = Mock(user_plugins=store.plugins,
64 user_agent='Mock')
64 user_agent='Mock')
65 request.headers.getlist.return_value = []
65 request.headers.getlist.return_value = []
66
66
67− ctx = get_search_mock(query='user-agent', pageno=1)
67+ search = get_search_mock(query='user-agent', pageno=1)
68− store.call('post_search', request, ctx)
68+ store.call('post_search', request, search)
69− self.assertTrue('Mock' in ctx['result_container'].answers)
69+ self.assertTrue('Mock' in search.result_container.answers)
70
70
71− ctx = get_search_mock(query='user-agent', pageno=2)
71+ search = get_search_mock(query='user-agent', pageno=2)
72− store.call('post_search', request, ctx)
72+ store.call('post_search', request, search)
73− self.assertFalse('Mock' in ctx['result_container'].answers)
73+ self.assertFalse('Mock' in search.result_container.answers)
74
74
75− ctx = get_search_mock(query='user-agent', pageno=1)
75+ search = get_search_mock(query='user-agent', pageno=1)
76− store.call('post_search', request, ctx)
76+ store.call('post_search', request, search)
77− self.assertTrue('Mock' in ctx['result_container'].answers)
77+ self.assertTrue('Mock' in search.result_container.answers)
78
78
79− ctx = get_search_mock(query='user-agent', pageno=2)
79+ search = get_search_mock(query='user-agent', pageno=2)
80− store.call('post_search', request, ctx)
80+ store.call('post_search', request, search)
81− self.assertFalse('Mock' in ctx['result_container'].answers)
81+ self.assertFalse('Mock' in search.result_container.answers)
82
82
83− ctx = get_search_mock(query='What is my User-Agent?', pageno=1)
83+ search = get_search_mock(query='What is my User-Agent?', pageno=1)
84− store.call('post_search', request, ctx)
84+ store.call('post_search', request, search)
85− self.assertTrue('Mock' in ctx['result_container'].answers)
85+ self.assertTrue('Mock' in search.result_container.answers)
86
86
87− ctx = get_search_mock(query='What is my User-Agent?', pageno=2)
87+ search = get_search_mock(query='What is my User-Agent?', pageno=2)
88− store.call('post_search', request, ctx)
88+ store.call('post_search', request, search)
89− self.assertFalse('Mock' in ctx['result_container'].answers)
89+ self.assertFalse('Mock' in search.result_container.answers)