浏览代码

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
dalf 8 年前
父节点
当前提交
fbb080f358

+ 4
- 4
searx/plugins/doai_rewrite.py 查看文件

20
     return None
20
     return None
21
 
21
 
22
 
22
 
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'])
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
30
-        ctx['result']['parsed_url'] = urlparse(ctx['result']['url'])
29
+        result['url'] = 'http://doai.io/' + doi
30
+        result['parsed_url'] = urlparse(ctx['result']['url'])
31
     return True
31
     return True

+ 1
- 2
searx/plugins/https_rewrite.py 查看文件

220
     return result
220
     return result
221
 
221
 
222
 
222
 
223
-def on_result(request, ctx):
224
-    result = ctx['result']
223
+def on_result(request, search, 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

+ 8
- 8
searx/plugins/self_info.py 查看文件

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):
32
-    if ctx['search'].pageno > 1:
31
+def post_search(request, search):
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()
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):
43
         ua = request.user_agent
43
         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)
46
     return True
46
     return True

+ 5
- 5
searx/plugins/tracker_url_remover.py 查看文件

28
 default_on = True
28
 default_on = True
29
 
29
 
30
 
30
 
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
33
 
33
 
34
     if query == "":
34
     if query == "":
35
         return True
35
         return True
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:
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'])
43
 
43
 
44
     return True
44
     return True

+ 10
- 22
searx/search.py 查看文件

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
-
378
 class SearchWithPlugins(Search):
360
 class 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
-
387
-        def do_search():
369
+        if plugins.call('pre_search', self.request, self):
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

+ 26
- 26
tests/unit/test_plugins.py 查看文件

6
 
6
 
7
 
7
 
8
 def get_search_mock(query, **kwargs):
8
 def 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()))
11
 
11
 
12
 
12
 
13
 class PluginStoreTest(SearxTestCase):
13
 class PluginStoreTest(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)
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)
57
 
57
 
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)
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)
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)
70
 
70
 
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)
74
 
74
 
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)
78
 
78
 
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)
82
 
82
 
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)
86
 
86
 
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)