Procházet zdrojové kódy

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 před 8 roky
rodič
revize
fbb080f358

+ 4
- 4
searx/plugins/doai_rewrite.py Zobrazit soubor

@@ -20,12 +20,12 @@ def extract_doi(url):
20 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 25
     if doi and len(doi) < 50:
26 26
         for suffix in ('/', '.pdf', '/full', '/meta', '/abstract'):
27 27
             if doi.endswith(suffix):
28 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 31
     return True

+ 1
- 2
searx/plugins/https_rewrite.py Zobrazit soubor

@@ -220,8 +220,7 @@ def https_url_rewrite(result):
220 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 224
     if result['parsed_url'].scheme == 'http':
226 225
         https_url_rewrite(result)
227 226
     return True

+ 8
- 8
searx/plugins/self_info.py Zobrazit soubor

@@ -28,19 +28,19 @@ p = re.compile('.*user[ -]agent.*', re.IGNORECASE)
28 28
 # attach callback to the post search hook
29 29
 #  request: flask request object
30 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 33
         return True
34
-    if ctx['search'].query == 'ip':
34
+    if search.search_query.query == 'ip':
35 35
         x_forwarded_for = request.headers.getlist("X-Forwarded-For")
36 36
         if x_forwarded_for:
37 37
             ip = x_forwarded_for[0]
38 38
         else:
39 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 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 46
     return True

+ 5
- 5
searx/plugins/tracker_url_remover.py Zobrazit soubor

@@ -28,8 +28,8 @@ description = gettext('Remove trackers arguments from the returned URL')
28 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 34
     if query == "":
35 35
         return True
@@ -37,8 +37,8 @@ def on_result(request, ctx):
37 37
     for reg in regexes:
38 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 44
     return True

+ 10
- 22
searx/search.py Zobrazit soubor

@@ -357,35 +357,23 @@ class Search(object):
357 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 360
 class SearchWithPlugins(Search):
379 361
 
362
+    """Similar to the Search class but call the plugins."""
363
+
380 364
     def __init__(self, search_query, request):
381 365
         super(SearchWithPlugins, self).__init__(search_query)
382 366
         self.request = request
383
-        self.request_data = request.request_data
384 367
 
385 368
     def search(self):
386
-
387
-        def do_search():
369
+        if plugins.call('pre_search', self.request, self):
388 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 379
         return self.result_container

+ 26
- 26
tests/unit/test_plugins.py Zobrazit soubor

@@ -6,8 +6,8 @@ from mock import Mock
6 6
 
7 7
 
8 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 13
 class PluginStoreTest(SearxTestCase):
@@ -51,39 +51,39 @@ class SelfIPTest(SearxTestCase):
51 51
         request = Mock(user_plugins=store.plugins,
52 52
                        remote_addr='127.0.0.1')
53 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 62
         # User agent test
63 63
         request = Mock(user_plugins=store.plugins,
64 64
                        user_agent='Mock')
65 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)