From 42ac3dcda010f0f2191f5dcc15d3da644d4a478e Mon Sep 17 00:00:00 2001 From: gammelon Date: Sat, 17 Feb 2018 11:13:54 +0100 Subject: [PATCH 1/7] Add Option url.open_base_url when set to true, invoking a searchengine shortcut without argument opens the baseurl of that searchengine instead of DEFAULT searchengine --- qutebrowser/config/configdata.yml | 6 ++++++ qutebrowser/utils/urlutils.py | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/qutebrowser/config/configdata.yml b/qutebrowser/config/configdata.yml index 72450978b..23ff271f0 100644 --- a/qutebrowser/config/configdata.yml +++ b/qutebrowser/config/configdata.yml @@ -1445,6 +1445,12 @@ url.incdec_segments: desc: URL segments where `:navigate increment/decrement` will search for a number. +url.open_base_url: + type: Bool + default: false + desc: Invoking `:open {shortcut}` (without argument), where {shortcut} is a search engine shortcut + will open the base url of the shortcut instead of using the default search engine. + url.searchengines: default: DEFAULT: https://duckduckgo.com/?q={} diff --git a/qutebrowser/utils/urlutils.py b/qutebrowser/utils/urlutils.py index 2ed466dd1..1bb062f3f 100644 --- a/qutebrowser/utils/urlutils.py +++ b/qutebrowser/utils/urlutils.py @@ -102,6 +102,13 @@ def _get_search_url(txt): engine = 'DEFAULT' template = config.val.url.searchengines[engine] url = qurl_from_user_input(template.format(urllib.parse.quote(term))) + + if config.val.url.open_base_url: + try: + search_url = urllib.parse.urlparse(config.val.url.searchengines[term]) + url = QUrl('{}://{}'.format(search_url.scheme, search_url.netloc)) + except KeyError: + pass qtutils.ensure_valid(url) return url From 16218a990006652b7b9aec3c3f29b67b16d97c8a Mon Sep 17 00:00:00 2001 From: gammelon Date: Tue, 20 Feb 2018 18:11:50 +0100 Subject: [PATCH 2/7] Remove unnecessary try, rephrase to imperative mood --- qutebrowser/config/configdata.yml | 3 +-- qutebrowser/utils/urlutils.py | 10 ++++------ 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/qutebrowser/config/configdata.yml b/qutebrowser/config/configdata.yml index 23ff271f0..2cb36abcc 100644 --- a/qutebrowser/config/configdata.yml +++ b/qutebrowser/config/configdata.yml @@ -1448,8 +1448,7 @@ url.incdec_segments: url.open_base_url: type: Bool default: false - desc: Invoking `:open {shortcut}` (without argument), where {shortcut} is a search engine shortcut - will open the base url of the shortcut instead of using the default search engine. + desc: Open base URL of the searchengine if a searchengine shortcut is invoked without parameters. url.searchengines: default: diff --git a/qutebrowser/utils/urlutils.py b/qutebrowser/utils/urlutils.py index 1bb062f3f..5f502e6fd 100644 --- a/qutebrowser/utils/urlutils.py +++ b/qutebrowser/utils/urlutils.py @@ -103,12 +103,10 @@ def _get_search_url(txt): template = config.val.url.searchengines[engine] url = qurl_from_user_input(template.format(urllib.parse.quote(term))) - if config.val.url.open_base_url: - try: - search_url = urllib.parse.urlparse(config.val.url.searchengines[term]) - url = QUrl('{}://{}'.format(search_url.scheme, search_url.netloc)) - except KeyError: - pass + if config.val.url.open_base_url and \ + term in config.val.url.searchengines.keys(): + search_url = urllib.parse.urlparse(config.val.url.searchengines[term]) + url = QUrl('{}://{}'.format(search_url.scheme, search_url.netloc)) qtutils.ensure_valid(url) return url From a730290d409b7e53770addcf0a1159a8ea736869 Mon Sep 17 00:00:00 2001 From: gammelon Date: Mon, 5 Mar 2018 16:32:41 +0100 Subject: [PATCH 3/7] Use QUrl for parsing, add tests --- qutebrowser/utils/urlutils.py | 6 ++++-- tests/unit/utils/test_urlutils.py | 36 +++++++++++++++++++++---------- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/qutebrowser/utils/urlutils.py b/qutebrowser/utils/urlutils.py index 5f502e6fd..8bbf5b362 100644 --- a/qutebrowser/utils/urlutils.py +++ b/qutebrowser/utils/urlutils.py @@ -105,8 +105,10 @@ def _get_search_url(txt): if config.val.url.open_base_url and \ term in config.val.url.searchengines.keys(): - search_url = urllib.parse.urlparse(config.val.url.searchengines[term]) - url = QUrl('{}://{}'.format(search_url.scheme, search_url.netloc)) + url = qurl_from_user_input(config.val.url.searchengines[term]) + url.setPath(None) + url.setFragment(None) + url.setQuery(None) qtutils.ensure_valid(url) return url diff --git a/tests/unit/utils/test_urlutils.py b/tests/unit/utils/test_urlutils.py index 6621edfed..a96236f6e 100644 --- a/tests/unit/utils/test_urlutils.py +++ b/tests/unit/utils/test_urlutils.py @@ -277,18 +277,27 @@ class TestFuzzyUrl: def test_special_urls(url, special): assert urlutils.is_special_url(QUrl(url)) == special - -@pytest.mark.parametrize('url, host, query', [ - ('testfoo', 'www.example.com', 'q=testfoo'), - ('test testfoo', 'www.qutebrowser.org', 'q=testfoo'), - ('test testfoo bar foo', 'www.qutebrowser.org', 'q=testfoo bar foo'), - ('test testfoo ', 'www.qutebrowser.org', 'q=testfoo'), - ('!python testfoo', 'www.example.com', 'q=%21python testfoo'), - ('blub testfoo', 'www.example.com', 'q=blub testfoo'), - ('stripped ', 'www.example.com', 'q=stripped'), - ('test-with-dash testfoo', 'www.example.org', 'q=testfoo'), +@pytest.mark.parametrize('url, host, query, open_base_url', [ + ('testfoo', 'www.example.com', 'q=testfoo', False), + ('test testfoo', 'www.qutebrowser.org', 'q=testfoo', False), + ('test testfoo bar foo', 'www.qutebrowser.org', 'q=testfoo bar foo', False), + ('test testfoo ', 'www.qutebrowser.org', 'q=testfoo', False), + ('!python testfoo', 'www.example.com', 'q=%21python testfoo', False), + ('blub testfoo', 'www.example.com', 'q=blub testfoo', False), + ('stripped ', 'www.example.com', 'q=stripped', False), + ('test-with-dash testfoo', 'www.example.org', 'q=testfoo', False), + ('testfoo', 'www.example.com', 'q=testfoo', True), + ('test testfoo', 'www.qutebrowser.org', 'q=testfoo', True), + ('test testfoo bar foo', 'www.qutebrowser.org', 'q=testfoo bar foo', True), + ('test testfoo ', 'www.qutebrowser.org', 'q=testfoo', True), + ('!python testfoo', 'www.example.com', 'q=%21python testfoo', True), + ('blub testfoo', 'www.example.com', 'q=blub testfoo', True), + ('stripped ', 'www.example.com', 'q=stripped', True), + ('test-with-dash testfoo', 'www.example.org', 'q=testfoo', True), + ('test', 'www.qutebrowser.org', '', True), + ('test-with-dash', 'www.example.org', '', True), ]) -def test_get_search_url(url, host, query): +def test_get_search_url(config_stub, url, host, query, open_base_url): """Test _get_search_url(). Args: @@ -296,7 +305,12 @@ def test_get_search_url(url, host, query): host: The expected search machine host. query: The expected search query. """ + config_stub.val.url.open_base_url = open_base_url url = urlutils._get_search_url(url) + if open_base_url and query == '': + assert url.path() == '' + assert url.fragment() == '' + assert url.host() == host assert url.query() == query From 7e3c966afeca64d99f9623a12a4286197fbd29d5 Mon Sep 17 00:00:00 2001 From: gammelon Date: Fri, 9 Mar 2018 15:52:03 +0100 Subject: [PATCH 4/7] rewrite tests --- qutebrowser/utils/urlutils.py | 3 +- tests/unit/utils/test_urlutils.py | 49 ++++++++++++++++++------------- 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/qutebrowser/utils/urlutils.py b/qutebrowser/utils/urlutils.py index 8bbf5b362..0c77a5d0f 100644 --- a/qutebrowser/utils/urlutils.py +++ b/qutebrowser/utils/urlutils.py @@ -103,8 +103,7 @@ def _get_search_url(txt): template = config.val.url.searchengines[engine] url = qurl_from_user_input(template.format(urllib.parse.quote(term))) - if config.val.url.open_base_url and \ - term in config.val.url.searchengines.keys(): + if config.val.url.open_base_url and term in config.val.url.searchengines: url = qurl_from_user_input(config.val.url.searchengines[term]) url.setPath(None) url.setFragment(None) diff --git a/tests/unit/utils/test_urlutils.py b/tests/unit/utils/test_urlutils.py index a96236f6e..d2da02d0f 100644 --- a/tests/unit/utils/test_urlutils.py +++ b/tests/unit/utils/test_urlutils.py @@ -277,25 +277,17 @@ class TestFuzzyUrl: def test_special_urls(url, special): assert urlutils.is_special_url(QUrl(url)) == special -@pytest.mark.parametrize('url, host, query, open_base_url', [ - ('testfoo', 'www.example.com', 'q=testfoo', False), - ('test testfoo', 'www.qutebrowser.org', 'q=testfoo', False), - ('test testfoo bar foo', 'www.qutebrowser.org', 'q=testfoo bar foo', False), - ('test testfoo ', 'www.qutebrowser.org', 'q=testfoo', False), - ('!python testfoo', 'www.example.com', 'q=%21python testfoo', False), - ('blub testfoo', 'www.example.com', 'q=blub testfoo', False), - ('stripped ', 'www.example.com', 'q=stripped', False), - ('test-with-dash testfoo', 'www.example.org', 'q=testfoo', False), - ('testfoo', 'www.example.com', 'q=testfoo', True), - ('test testfoo', 'www.qutebrowser.org', 'q=testfoo', True), - ('test testfoo bar foo', 'www.qutebrowser.org', 'q=testfoo bar foo', True), - ('test testfoo ', 'www.qutebrowser.org', 'q=testfoo', True), - ('!python testfoo', 'www.example.com', 'q=%21python testfoo', True), - ('blub testfoo', 'www.example.com', 'q=blub testfoo', True), - ('stripped ', 'www.example.com', 'q=stripped', True), - ('test-with-dash testfoo', 'www.example.org', 'q=testfoo', True), - ('test', 'www.qutebrowser.org', '', True), - ('test-with-dash', 'www.example.org', '', True), +@pytest.mark.parametrize('open_base_url', [True, False]) + +@pytest.mark.parametrize('url, host, query', [ + ('testfoo', 'www.example.com', 'q=testfoo'), + ('test testfoo', 'www.qutebrowser.org', 'q=testfoo'), + ('test testfoo bar foo', 'www.qutebrowser.org', 'q=testfoo bar foo'), + ('test testfoo ', 'www.qutebrowser.org', 'q=testfoo'), + ('!python testfoo', 'www.example.com', 'q=%21python testfoo'), + ('blub testfoo', 'www.example.com', 'q=blub testfoo'), + ('stripped ', 'www.example.com', 'q=stripped'), + ('test-with-dash testfoo', 'www.example.org', 'q=testfoo'), ]) def test_get_search_url(config_stub, url, host, query, open_base_url): """Test _get_search_url(). @@ -308,13 +300,28 @@ def test_get_search_url(config_stub, url, host, query, open_base_url): config_stub.val.url.open_base_url = open_base_url url = urlutils._get_search_url(url) if open_base_url and query == '': - assert url.path() == '' - assert url.fragment() == '' + assert not url.path() + assert not url.fragment() assert url.host() == host assert url.query() == query +@pytest.mark.parametrize('url, host, query', [ + ('test', 'www.qutebrowser.org', ''), + ('test-with-dash', 'www.example.org', ''), +]) + +def test_get_search_url_open_base_url(config_stub, url, host, query): + """Test _get_search_url() with url.open_base_url_enabled. + + Args: + url: The "URL" to enter. + host: The expected search machine host. + query: The expected search query. + """ + test_get_search_url(config_stub, url, host, query, True) + @pytest.mark.parametrize('url', ['\n', ' ', '\n ']) def test_get_search_url_invalid(url): with pytest.raises(ValueError): From 0ce94dae1cde3b5ac3dfca79385e8fad9e592677 Mon Sep 17 00:00:00 2001 From: gammelon Date: Fri, 9 Mar 2018 15:55:40 +0100 Subject: [PATCH 5/7] forgot one bit --- tests/unit/utils/test_urlutils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/utils/test_urlutils.py b/tests/unit/utils/test_urlutils.py index d2da02d0f..5fc897497 100644 --- a/tests/unit/utils/test_urlutils.py +++ b/tests/unit/utils/test_urlutils.py @@ -299,7 +299,7 @@ def test_get_search_url(config_stub, url, host, query, open_base_url): """ config_stub.val.url.open_base_url = open_base_url url = urlutils._get_search_url(url) - if open_base_url and query == '': + if open_base_url and not query: assert not url.path() assert not url.fragment() From 455f6b8a702a0d770fccf38cf387bb5b2d468573 Mon Sep 17 00:00:00 2001 From: gammelon Date: Mon, 12 Mar 2018 12:37:52 +0100 Subject: [PATCH 6/7] Fix blank lines --- tests/unit/utils/test_urlutils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/utils/test_urlutils.py b/tests/unit/utils/test_urlutils.py index 5fc897497..03c5239fa 100644 --- a/tests/unit/utils/test_urlutils.py +++ b/tests/unit/utils/test_urlutils.py @@ -277,8 +277,8 @@ class TestFuzzyUrl: def test_special_urls(url, special): assert urlutils.is_special_url(QUrl(url)) == special -@pytest.mark.parametrize('open_base_url', [True, False]) +@pytest.mark.parametrize('open_base_url', [True, False]) @pytest.mark.parametrize('url, host, query', [ ('testfoo', 'www.example.com', 'q=testfoo'), ('test testfoo', 'www.qutebrowser.org', 'q=testfoo'), @@ -311,7 +311,6 @@ def test_get_search_url(config_stub, url, host, query, open_base_url): ('test', 'www.qutebrowser.org', ''), ('test-with-dash', 'www.example.org', ''), ]) - def test_get_search_url_open_base_url(config_stub, url, host, query): """Test _get_search_url() with url.open_base_url_enabled. @@ -322,6 +321,7 @@ def test_get_search_url_open_base_url(config_stub, url, host, query): """ test_get_search_url(config_stub, url, host, query, True) + @pytest.mark.parametrize('url', ['\n', ' ', '\n ']) def test_get_search_url_invalid(url): with pytest.raises(ValueError): From f57e47c7423be68fdde2c2bd2a922c584e13f499 Mon Sep 17 00:00:00 2001 From: gammelon Date: Fri, 16 Mar 2018 11:42:51 +0100 Subject: [PATCH 7/7] Separate tests for _get_search_url --- tests/unit/utils/test_urlutils.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/tests/unit/utils/test_urlutils.py b/tests/unit/utils/test_urlutils.py index 03c5239fa..9df7ed0d0 100644 --- a/tests/unit/utils/test_urlutils.py +++ b/tests/unit/utils/test_urlutils.py @@ -299,19 +299,15 @@ def test_get_search_url(config_stub, url, host, query, open_base_url): """ config_stub.val.url.open_base_url = open_base_url url = urlutils._get_search_url(url) - if open_base_url and not query: - assert not url.path() - assert not url.fragment() - assert url.host() == host assert url.query() == query -@pytest.mark.parametrize('url, host, query', [ - ('test', 'www.qutebrowser.org', ''), - ('test-with-dash', 'www.example.org', ''), +@pytest.mark.parametrize('url, host', [ + ('test', 'www.qutebrowser.org'), + ('test-with-dash', 'www.example.org'), ]) -def test_get_search_url_open_base_url(config_stub, url, host, query): +def test_get_search_url_open_base_url(config_stub, url, host): """Test _get_search_url() with url.open_base_url_enabled. Args: @@ -319,7 +315,12 @@ def test_get_search_url_open_base_url(config_stub, url, host, query): host: The expected search machine host. query: The expected search query. """ - test_get_search_url(config_stub, url, host, query, True) + config_stub.val.url.open_base_url = True + url = urlutils._get_search_url(url) + assert not url.path() + assert not url.fragment() + assert not url.query() + assert url.host() == host @pytest.mark.parametrize('url', ['\n', ' ', '\n '])