Browse Source

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 years ago
parent
commit
fbb080f358

+ 4 - 4
searx/plugins/doai_rewrite.py

@@ -20,12 +20,12 @@ def extract_doi(url):
     return None
 
 
-def on_result(request, ctx):
-    doi = extract_doi(ctx['result']['parsed_url'])
+def on_result(request, search, result):
+    doi = extract_doi(result['parsed_url'])
     if doi and len(doi) < 50:
         for suffix in ('/', '.pdf', '/full', '/meta', '/abstract'):
             if doi.endswith(suffix):
                 doi = doi[:-len(suffix)]
-        ctx['result']['url'] = 'http://doai.io/' + doi
-        ctx['result']['parsed_url'] = urlparse(ctx['result']['url'])
+        result['url'] = 'http://doai.io/' + doi
+        result['parsed_url'] = urlparse(ctx['result']['url'])
     return True

+ 1 - 2
searx/plugins/https_rewrite.py

@@ -220,8 +220,7 @@ def https_url_rewrite(result):
     return result
 
 
-def on_result(request, ctx):
-    result = ctx['result']
+def on_result(request, search, result):
     if result['parsed_url'].scheme == 'http':
         https_url_rewrite(result)
     return True

+ 8 - 8
searx/plugins/self_info.py

@@ -28,19 +28,19 @@ p = re.compile('.*user[ -]agent.*', re.IGNORECASE)
 # attach callback to the post search hook
 #  request: flask request object
 #  ctx: the whole local context of the pre search hook
-def post_search(request, ctx):
-    if ctx['search'].pageno > 1:
+def post_search(request, search):
+    if search.search_query.pageno > 1:
         return True
-    if ctx['search'].query == 'ip':
+    if search.search_query.query == 'ip':
         x_forwarded_for = request.headers.getlist("X-Forwarded-For")
         if x_forwarded_for:
             ip = x_forwarded_for[0]
         else:
             ip = request.remote_addr
-        ctx['result_container'].answers.clear()
-        ctx['result_container'].answers.add(ip)
-    elif p.match(ctx['search'].query):
+        search.result_container.answers.clear()
+        search.result_container.answers.add(ip)
+    elif p.match(search.search_query.query):
         ua = request.user_agent
-        ctx['result_container'].answers.clear()
-        ctx['result_container'].answers.add(ua)
+        search.result_container.answers.clear()
+        search.result_container.answers.add(ua)
     return True

+ 5 - 5
searx/plugins/tracker_url_remover.py

@@ -28,8 +28,8 @@ description = gettext('Remove trackers arguments from the returned URL')
 default_on = True
 
 
-def on_result(request, ctx):
-    query = ctx['result']['parsed_url'].query
+def on_result(request, search, result):
+    query = result['parsed_url'].query
 
     if query == "":
         return True
@@ -37,8 +37,8 @@ def on_result(request, ctx):
     for reg in regexes:
         query = reg.sub('', query)
 
-    if query != ctx['result']['parsed_url'].query:
-        ctx['result']['parsed_url'] = ctx['result']['parsed_url']._replace(query=query)
-        ctx['result']['url'] = urlunparse(ctx['result']['parsed_url'])
+    if query != result['parsed_url'].query:
+        result['parsed_url'] = result['parsed_url']._replace(query=query)
+        result['url'] = urlunparse(result['parsed_url'])
 
     return True

+ 10 - 22
searx/search.py

@@ -357,35 +357,23 @@ class Search(object):
         return self.result_container
 
 
-def search_with_plugins(do_search, search_query, request, request_data, result_container):
-    """Search using the do_search function and with plugins filtering.
-    Standalone function to have a well define locals().
-    result_container contains the results after the function call.
-    """
-    search = search_query
-
-    if plugins.call('pre_search', request, locals()):
-        do_search()
-
-    plugins.call('post_search', request, locals())
-
-    results = result_container.get_ordered_results()
-
-    for result in results:
-        plugins.call('on_result', request, locals())
-
-
 class SearchWithPlugins(Search):
 
+    """Similar to the Search class but call the plugins."""
+
     def __init__(self, search_query, request):
         super(SearchWithPlugins, self).__init__(search_query)
         self.request = request
-        self.request_data = request.request_data
 
     def search(self):
-
-        def do_search():
+        if plugins.call('pre_search', self.request, self):
             super(SearchWithPlugins, self).search()
 
-        search_with_plugins(do_search, self.search_query, self.request, self.request_data, self.result_container)
+        plugins.call('post_search', self.request, self)
+
+        results = self.result_container.get_ordered_results()
+
+        for result in results:
+            plugins.call('on_result', self.request, self, result)
+
         return self.result_container

+ 26 - 26
tests/unit/test_plugins.py

@@ -6,8 +6,8 @@ from mock import Mock
 
 
 def get_search_mock(query, **kwargs):
-    return {'search': Mock(query=query, **kwargs),
-            'result_container': Mock(answers=set())}
+    return Mock(search_query=Mock(query=query, **kwargs),
+                result_container=Mock(answers=set()))
 
 
 class PluginStoreTest(SearxTestCase):
@@ -51,39 +51,39 @@ class SelfIPTest(SearxTestCase):
         request = Mock(user_plugins=store.plugins,
                        remote_addr='127.0.0.1')
         request.headers.getlist.return_value = []
-        ctx = get_search_mock(query='ip', pageno=1)
-        store.call('post_search', request, ctx)
-        self.assertTrue('127.0.0.1' in ctx['result_container'].answers)
+        search = get_search_mock(query='ip', pageno=1)
+        store.call('post_search', request, search)
+        self.assertTrue('127.0.0.1' in search.result_container.answers)
 
-        ctx = get_search_mock(query='ip', pageno=2)
-        store.call('post_search', request, ctx)
-        self.assertFalse('127.0.0.1' in ctx['result_container'].answers)
+        search = get_search_mock(query='ip', pageno=2)
+        store.call('post_search', request, search)
+        self.assertFalse('127.0.0.1' in search.result_container.answers)
 
         # User agent test
         request = Mock(user_plugins=store.plugins,
                        user_agent='Mock')
         request.headers.getlist.return_value = []
 
-        ctx = get_search_mock(query='user-agent', pageno=1)
-        store.call('post_search', request, ctx)
-        self.assertTrue('Mock' in ctx['result_container'].answers)
+        search = get_search_mock(query='user-agent', pageno=1)
+        store.call('post_search', request, search)
+        self.assertTrue('Mock' in search.result_container.answers)
 
-        ctx = get_search_mock(query='user-agent', pageno=2)
-        store.call('post_search', request, ctx)
-        self.assertFalse('Mock' in ctx['result_container'].answers)
+        search = get_search_mock(query='user-agent', pageno=2)
+        store.call('post_search', request, search)
+        self.assertFalse('Mock' in search.result_container.answers)
 
-        ctx = get_search_mock(query='user-agent', pageno=1)
-        store.call('post_search', request, ctx)
-        self.assertTrue('Mock' in ctx['result_container'].answers)
+        search = get_search_mock(query='user-agent', pageno=1)
+        store.call('post_search', request, search)
+        self.assertTrue('Mock' in search.result_container.answers)
 
-        ctx = get_search_mock(query='user-agent', pageno=2)
-        store.call('post_search', request, ctx)
-        self.assertFalse('Mock' in ctx['result_container'].answers)
+        search = get_search_mock(query='user-agent', pageno=2)
+        store.call('post_search', request, search)
+        self.assertFalse('Mock' in search.result_container.answers)
 
-        ctx = get_search_mock(query='What is my User-Agent?', pageno=1)
-        store.call('post_search', request, ctx)
-        self.assertTrue('Mock' in ctx['result_container'].answers)
+        search = get_search_mock(query='What is my User-Agent?', pageno=1)
+        store.call('post_search', request, search)
+        self.assertTrue('Mock' in search.result_container.answers)
 
-        ctx = get_search_mock(query='What is my User-Agent?', pageno=2)
-        store.call('post_search', request, ctx)
-        self.assertFalse('Mock' in ctx['result_container'].answers)
+        search = get_search_mock(query='What is my User-Agent?', pageno=2)
+        store.call('post_search', request, search)
+        self.assertFalse('Mock' in search.result_container.answers)