on master help sign in
Change plugin API :

- pre_search(request, search) - post_search(request, search) - on_result(request, search, result) with - request is the Flask request - search a searx.Search instance - result a searx result as usual

commitfbb080f3588ad43bf896a569257f3a95e1181d7b authordalf <alex@al-f.net> dateSat 22 Oct 2016, 14:01 (10 years ago) parent67e11c4
6 files changed+54−67
searx/plugins/doai_rewrite.py+4−4 searx/plugins/https_rewrite.py+1−2 searx/plugins/self_info.py+8−8 searx/plugins/tracker_url_remover.py+5−5 searx/search.py+10−22 tests/unit/test_plugins.py+26−26
searx/plugins/doai_rewrite.py+4−4
@@ -20,12 +20,12 @@ def extract_doi(url):
2020 return None
2121
2222
23−def on_result(request, ctx):
24− doi = extract_doi(ctx['result']['parsed_url'])
23+def on_result(request, search, result):
24+ doi = extract_doi(result['parsed_url'])
2525 if doi and len(doi) < 50:
2626 for suffix in ('/', '.pdf', '/full', '/meta', '/abstract'):
2727 if doi.endswith(suffix):
2828 doi = doi[:-len(suffix)]
29− ctx['result']['url'] = 'http://doai.io/' + doi
30− ctx['result']['parsed_url'] = urlparse(ctx['result']['url'])
29+ result['url'] = 'http://doai.io/' + doi
30+ result['parsed_url'] = urlparse(ctx['result']['url'])
3131 return True
searx/plugins/https_rewrite.py+1−2
@@ -220,8 +220,7 @@ def https_url_rewrite(result):
220220 return result
221221
222222
223−def on_result(request, ctx):
224− result = ctx['result']
223+def on_result(request, search, result):
225224 if result['parsed_url'].scheme == 'http':
226225 https_url_rewrite(result)
227226 return True
searx/plugins/self_info.py+8−8
@@ -28,19 +28,19 @@ p = re.compile('.*user[ -]agent.*', re.IGNORECASE)
2828# attach callback to the post search hook
2929# request: flask request object
3030# ctx: the whole local context of the pre search hook
31−def post_search(request, ctx):
32− if ctx['search'].pageno > 1:
31+def post_search(request, search):
32+ if search.search_query.pageno > 1:
3333 return True
34− if ctx['search'].query == '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]
3838 else:
3939 ip = request.remote_addr
40− ctx['result_container'].answers.clear()
41− ctx['result_container'].answers.add(ip)
42− elif p.match(ctx['search'].query):
40+ search.result_container.answers.clear()
41+ search.result_container.answers.add(ip)
42+ elif p.match(search.search_query.query):
4343 ua = request.user_agent
44− ctx['result_container'].answers.clear()
45− ctx['result_container'].answers.add(ua)
44+ search.result_container.answers.clear()
45+ search.result_container.answers.add(ua)
4646 return True
searx/plugins/tracker_url_remover.py+5−5
@@ -28,8 +28,8 @@ description = gettext('Remove trackers arguments from the returned URL')
2828default_on = True
2929
3030
31−def on_result(request, ctx):
32− query = ctx['result']['parsed_url'].query
31+def on_result(request, search, result):
32+ query = result['parsed_url'].query
3333
3434 if query == "":
3535 return True
@@ -37,8 +37,8 @@ def on_result(request, ctx):
3737 for reg in regexes:
3838 query = reg.sub('', query)
3939
40− if query != ctx['result']['parsed_url'].query:
41− ctx['result']['parsed_url'] = ctx['result']['parsed_url']._replace(query=query)
42− ctx['result']['url'] = urlunparse(ctx['result']['parsed_url'])
40+ if query != result['parsed_url'].query:
41+ result['parsed_url'] = result['parsed_url']._replace(query=query)
42+ result['url'] = urlunparse(result['parsed_url'])
4343
4444 return True
searx/search.py+10−22
@@ -357,35 +357,23 @@ class Search(object):
357357 return self.result_container
358358
359359
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−
378360class SearchWithPlugins(Search):
379361
362+ """Similar to the Search class but call the plugins."""
363+
380364 def __init__(self, search_query, request):
381365 super(SearchWithPlugins, self).__init__(search_query)
382366 self.request = request
383− self.request_data = request.request_data
384367
385368 def search(self):
386−
387− def do_search():
369+ if plugins.call('pre_search', self.request, self):
388370 super(SearchWithPlugins, self).search()
389371
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+
391379 return self.result_container
tests/unit/test_plugins.py+26−26
@@ -6,8 +6,8 @@ from mock import Mock
66
77
88def get_search_mock(query, **kwargs):
9− return {'search': Mock(query=query, **kwargs),
10− 'result_container': Mock(answers=set())}
9+ return Mock(search_query=Mock(query=query, **kwargs),
10+ result_container=Mock(answers=set()))
1111
1212
1313class PluginStoreTest(SearxTestCase):
@@ -51,39 +51,39 @@ class SelfIPTest(SearxTestCase):
5151 request = Mock(user_plugins=store.plugins,
5252 remote_addr='127.0.0.1')
5353 request.headers.getlist.return_value = []
54− ctx = get_search_mock(query='ip', pageno=1)
55− store.call('post_search', request, ctx)
56− self.assertTrue('127.0.0.1' in ctx['result_container'].answers)
54+ search = get_search_mock(query='ip', pageno=1)
55+ store.call('post_search', request, search)
56+ self.assertTrue('127.0.0.1' in search.result_container.answers)
5757
58− ctx = get_search_mock(query='ip', pageno=2)
59− store.call('post_search', request, ctx)
60− self.assertFalse('127.0.0.1' in ctx['result_container'].answers)
58+ search = get_search_mock(query='ip', pageno=2)
59+ store.call('post_search', request, search)
60+ self.assertFalse('127.0.0.1' in search.result_container.answers)
6161
6262 # User agent test
6363 request = Mock(user_plugins=store.plugins,
6464 user_agent='Mock')
6565 request.headers.getlist.return_value = []
6666
67− ctx = get_search_mock(query='user-agent', pageno=1)
68− store.call('post_search', request, ctx)
69− self.assertTrue('Mock' in ctx['result_container'].answers)
67+ search = get_search_mock(query='user-agent', pageno=1)
68+ store.call('post_search', request, search)
69+ self.assertTrue('Mock' in search.result_container.answers)
7070
71− ctx = get_search_mock(query='user-agent', pageno=2)
72− store.call('post_search', request, ctx)
73− self.assertFalse('Mock' in ctx['result_container'].answers)
71+ search = get_search_mock(query='user-agent', pageno=2)
72+ store.call('post_search', request, search)
73+ self.assertFalse('Mock' in search.result_container.answers)
7474
75− ctx = get_search_mock(query='user-agent', pageno=1)
76− store.call('post_search', request, ctx)
77− self.assertTrue('Mock' in ctx['result_container'].answers)
75+ search = get_search_mock(query='user-agent', pageno=1)
76+ store.call('post_search', request, search)
77+ self.assertTrue('Mock' in search.result_container.answers)
7878
79− ctx = get_search_mock(query='user-agent', pageno=2)
80− store.call('post_search', request, ctx)
81− self.assertFalse('Mock' in ctx['result_container'].answers)
79+ search = get_search_mock(query='user-agent', pageno=2)
80+ store.call('post_search', request, search)
81+ self.assertFalse('Mock' in search.result_container.answers)
8282
83− ctx = get_search_mock(query='What is my User-Agent?', pageno=1)
84− store.call('post_search', request, ctx)
85− self.assertTrue('Mock' in ctx['result_container'].answers)
83+ search = get_search_mock(query='What is my User-Agent?', pageno=1)
84+ store.call('post_search', request, search)
85+ self.assertTrue('Mock' in search.result_container.answers)
8686
87− ctx = get_search_mock(query='What is my User-Agent?', pageno=2)
88− store.call('post_search', request, ctx)
89− self.assertFalse('Mock' in ctx['result_container'].answers)
87+ search = get_search_mock(query='What is my User-Agent?', pageno=2)
88+ store.call('post_search', request, search)
89+ self.assertFalse('Mock' in search.result_container.answers)