From 6a40cbf1608ad8e4c6dc8cef6f52a567dc25a812 Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Mon, 22 Jan 2018 21:26:20 +0100 Subject: [PATCH 1/2] incdec_number: add support for port --- doc/help/commands.asciidoc | 2 ++ doc/help/settings.asciidoc | 1 + qutebrowser/browser/commands.py | 2 ++ qutebrowser/config/configdata.yml | 2 +- qutebrowser/utils/urlutils.py | 5 +++-- tests/unit/utils/test_urlutils.py | 11 +++++++++++ 6 files changed, 20 insertions(+), 3 deletions(-) diff --git a/doc/help/commands.asciidoc b/doc/help/commands.asciidoc index be7f4d557..9d7ce77fe 100644 --- a/doc/help/commands.asciidoc +++ b/doc/help/commands.asciidoc @@ -742,7 +742,9 @@ This tries to automatically click on typical _Previous Page_ or _Next Page_ link - `next`: Open a _next_ link. - `up`: Go up a level in the current URL. - `increment`: Increment the last number in the URL. + Uses the link:settings.html#url.incdec_segments[url.incdec_segments] config option. - `decrement`: Decrement the last number in the URL. + Uses the link:settings.html#url.incdec_segments[url.incdec_segments] config option. diff --git a/doc/help/settings.asciidoc b/doc/help/settings.asciidoc index 53af8399d..a1b13f09f 100644 --- a/doc/help/settings.asciidoc +++ b/doc/help/settings.asciidoc @@ -2993,6 +2993,7 @@ Type: <> Valid values: * +host+ + * +port+ * +path+ * +query+ * +anchor+ diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index 6ddb72636..6eaa3e167 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -638,7 +638,9 @@ class CommandDispatcher: - `next`: Open a _next_ link. - `up`: Go up a level in the current URL. - `increment`: Increment the last number in the URL. + Uses the link:settings.html#url.incdec_segments[url.incdec_segments] config option. - `decrement`: Decrement the last number in the URL. + Uses the link:settings.html#url.incdec_segments[url.incdec_segments] config option. tab: Open in a new tab. bg: Open in a background tab. diff --git a/qutebrowser/config/configdata.yml b/qutebrowser/config/configdata.yml index a118a8b59..2d99af729 100644 --- a/qutebrowser/config/configdata.yml +++ b/qutebrowser/config/configdata.yml @@ -1418,7 +1418,7 @@ url.default_page: url.incdec_segments: type: name: FlagList - valid_values: [host, path, query, anchor] + valid_values: [host, port, path, query, anchor] default: [path, query] desc: URL segments where `:navigate increment/decrement` will search for a number. diff --git a/qutebrowser/utils/urlutils.py b/qutebrowser/utils/urlutils.py index 97e03c072..46bdee15c 100644 --- a/qutebrowser/utils/urlutils.py +++ b/qutebrowser/utils/urlutils.py @@ -537,7 +537,7 @@ def incdec_number(url, incdec, count=1, segments=None): incdec: Either 'increment' or 'decrement' count: The number to increment or decrement by segments: A set of URL segments to search. Valid segments are: - 'host', 'path', 'query', 'anchor'. + 'host', 'port', 'path', 'query', 'anchor'. Default: {'path', 'query'} Return: @@ -550,7 +550,7 @@ def incdec_number(url, incdec, count=1, segments=None): if segments is None: segments = {'path', 'query'} - valid_segments = {'host', 'path', 'query', 'anchor'} + valid_segments = {'host', 'port', 'path', 'query', 'anchor'} if segments - valid_segments: extra_elements = segments - valid_segments raise IncDecError("Invalid segments: {}".format( @@ -561,6 +561,7 @@ def incdec_number(url, incdec, count=1, segments=None): # Order as they appear in a URL segment_modifiers = [ ('host', url.host, url.setHost), + ('port', lambda: str(url.port()), lambda x: url.setPort(int(x))), ('path', url.path, url.setPath), ('query', url.query, url.setQuery), ('anchor', url.fragment, url.setFragment), diff --git a/tests/unit/utils/test_urlutils.py b/tests/unit/utils/test_urlutils.py index 4d9b3ba0a..6b005f402 100644 --- a/tests/unit/utils/test_urlutils.py +++ b/tests/unit/utils/test_urlutils.py @@ -622,6 +622,17 @@ class TestIncDecNumber: base_url, incdec, segments={'host', 'path', 'query', 'anchor'}) assert new_url == expected_url + def test_incdec_port(self): + """Test incdec_number with port.""" + + base_url = QUrl('http://localhost:8000') + new_url = urlutils.incdec_number( + base_url, 'increment', segments={'port'}) + assert new_url == QUrl('http://localhost:8001') + new_url = urlutils.incdec_number( + base_url, 'decrement', segments={'port'}) + assert new_url == QUrl('http://localhost:7999') + @pytest.mark.parametrize('incdec', ['increment', 'decrement']) @pytest.mark.parametrize('value', [ '{}foo', 'foo{}', 'foo{}bar', '42foo{}' From 9f14ae184ff5f2a782424627e552e4feb8c10539 Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Mon, 22 Jan 2018 21:48:21 +0100 Subject: [PATCH 2/2] fixup! incdec_number: add support for port --- qutebrowser/utils/urlutils.py | 2 +- tests/unit/utils/test_urlutils.py | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/qutebrowser/utils/urlutils.py b/qutebrowser/utils/urlutils.py index 46bdee15c..88853483e 100644 --- a/qutebrowser/utils/urlutils.py +++ b/qutebrowser/utils/urlutils.py @@ -561,7 +561,7 @@ def incdec_number(url, incdec, count=1, segments=None): # Order as they appear in a URL segment_modifiers = [ ('host', url.host, url.setHost), - ('port', lambda: str(url.port()), lambda x: url.setPort(int(x))), + ('port', lambda: str(url.port()) if url.port() > 0 else '', lambda x: url.setPort(int(x))), ('path', url.path, url.setPath), ('query', url.query, url.setQuery), ('anchor', url.fragment, url.setFragment), diff --git a/tests/unit/utils/test_urlutils.py b/tests/unit/utils/test_urlutils.py index 6b005f402..de83ba7bf 100644 --- a/tests/unit/utils/test_urlutils.py +++ b/tests/unit/utils/test_urlutils.py @@ -633,6 +633,12 @@ class TestIncDecNumber: base_url, 'decrement', segments={'port'}) assert new_url == QUrl('http://localhost:7999') + def test_incdec_port_default(self): + """Test that a default port (with url.port() == -1) is not touched.""" + base_url = QUrl('http://localhost') + with pytest.raises(urlutils.IncDecError): + urlutils.incdec_number(base_url, 'increment', segments={'port'}) + @pytest.mark.parametrize('incdec', ['increment', 'decrement']) @pytest.mark.parametrize('value', [ '{}foo', 'foo{}', 'foo{}bar', '42foo{}'