Merge branch 'pvsr-navigate-count'
This commit is contained in:
commit
242dd4a6f7
@ -67,6 +67,7 @@ Changed
|
|||||||
- Completions for `:help` and `:bind` now also show hidden commands
|
- Completions for `:help` and `:bind` now also show hidden commands
|
||||||
- The `:buffer` completion now also filters using the first column (id).
|
- The `:buffer` completion now also filters using the first column (id).
|
||||||
- `:undo` has been improved to reopen tabs at the position they were closed.
|
- `:undo` has been improved to reopen tabs at the position they were closed.
|
||||||
|
- `:navigate` now takes a count for `up`/`increment`/`decrement`.
|
||||||
|
|
||||||
Deprecated
|
Deprecated
|
||||||
~~~~~~~~~~
|
~~~~~~~~~~
|
||||||
|
@ -183,6 +183,7 @@ Contributors, sorted by the number of commits in descending order:
|
|||||||
* skinnay
|
* skinnay
|
||||||
* Zach-Button
|
* Zach-Button
|
||||||
* Tomasz Kramkowski
|
* Tomasz Kramkowski
|
||||||
|
* Peter Rice
|
||||||
* Ismail S
|
* Ismail S
|
||||||
* Halfwit
|
* Halfwit
|
||||||
* David Vogt
|
* David Vogt
|
||||||
|
@ -481,6 +481,10 @@ This tries to automatically click on typical _Previous Page_ or _Next Page_ link
|
|||||||
* +*-b*+, +*--bg*+: Open in a background tab.
|
* +*-b*+, +*--bg*+: Open in a background tab.
|
||||||
* +*-w*+, +*--window*+: Open in a new window.
|
* +*-w*+, +*--window*+: Open in a new window.
|
||||||
|
|
||||||
|
==== count
|
||||||
|
For `increment` and `decrement`, the number to change the URL by. For `up`, the number of levels to go up in the URL.
|
||||||
|
|
||||||
|
|
||||||
[[open]]
|
[[open]]
|
||||||
=== open
|
=== open
|
||||||
Syntax: +:open [*--implicit*] [*--bg*] [*--tab*] [*--window*] ['url']+
|
Syntax: +:open [*--implicit*] [*--bg*] [*--tab*] [*--window*] ['url']+
|
||||||
|
@ -484,7 +484,8 @@ class CommandDispatcher:
|
|||||||
@cmdutils.register(instance='command-dispatcher', scope='window')
|
@cmdutils.register(instance='command-dispatcher', scope='window')
|
||||||
@cmdutils.argument('where', choices=['prev', 'next', 'up', 'increment',
|
@cmdutils.argument('where', choices=['prev', 'next', 'up', 'increment',
|
||||||
'decrement'])
|
'decrement'])
|
||||||
def navigate(self, where: str, tab=False, bg=False, window=False):
|
@cmdutils.argument('count', count=True)
|
||||||
|
def navigate(self, where: str, tab=False, bg=False, window=False, count=1):
|
||||||
"""Open typical prev/next links or navigate using the URL path.
|
"""Open typical prev/next links or navigate using the URL path.
|
||||||
|
|
||||||
This tries to automatically click on typical _Previous Page_ or
|
This tries to automatically click on typical _Previous Page_ or
|
||||||
@ -504,6 +505,8 @@ class CommandDispatcher:
|
|||||||
tab: Open in a new tab.
|
tab: Open in a new tab.
|
||||||
bg: Open in a background tab.
|
bg: Open in a background tab.
|
||||||
window: Open in a new window.
|
window: Open in a new window.
|
||||||
|
count: For `increment` and `decrement`, the number to change the URL
|
||||||
|
by. For `up`, the number of levels to go up in the URL.
|
||||||
"""
|
"""
|
||||||
# save the pre-jump position in the special ' mark
|
# save the pre-jump position in the special ' mark
|
||||||
self.set_mark("'")
|
self.set_mark("'")
|
||||||
@ -528,7 +531,7 @@ class CommandDispatcher:
|
|||||||
handler(browsertab=widget, win_id=self._win_id, baseurl=url,
|
handler(browsertab=widget, win_id=self._win_id, baseurl=url,
|
||||||
tab=tab, background=bg, window=window)
|
tab=tab, background=bg, window=window)
|
||||||
elif where in ['up', 'increment', 'decrement']:
|
elif where in ['up', 'increment', 'decrement']:
|
||||||
new_url = handlers[where](url)
|
new_url = handlers[where](url, count)
|
||||||
self._open(new_url, tab, bg, window)
|
self._open(new_url, tab, bg, window)
|
||||||
else: # pragma: no cover
|
else: # pragma: no cover
|
||||||
raise ValueError("Got called with invalid value {} for "
|
raise ValueError("Got called with invalid value {} for "
|
||||||
|
@ -31,11 +31,12 @@ class Error(Exception):
|
|||||||
"""Raised when the navigation can't be done."""
|
"""Raised when the navigation can't be done."""
|
||||||
|
|
||||||
|
|
||||||
def incdec(url, inc_or_dec):
|
def incdec(url, count, inc_or_dec):
|
||||||
"""Helper method for :navigate when `where' is increment/decrement.
|
"""Helper method for :navigate when `where' is increment/decrement.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
url: The current url.
|
url: The current url.
|
||||||
|
count: How much to increment or decrement by.
|
||||||
inc_or_dec: Either 'increment' or 'decrement'.
|
inc_or_dec: Either 'increment' or 'decrement'.
|
||||||
tab: Whether to open the link in a new tab.
|
tab: Whether to open the link in a new tab.
|
||||||
background: Open the link in a new background tab.
|
background: Open the link in a new background tab.
|
||||||
@ -43,23 +44,26 @@ def incdec(url, inc_or_dec):
|
|||||||
"""
|
"""
|
||||||
segments = set(config.get('general', 'url-incdec-segments'))
|
segments = set(config.get('general', 'url-incdec-segments'))
|
||||||
try:
|
try:
|
||||||
new_url = urlutils.incdec_number(url, inc_or_dec, segments=segments)
|
new_url = urlutils.incdec_number(url, inc_or_dec, count,
|
||||||
|
segments=segments)
|
||||||
except urlutils.IncDecError as error:
|
except urlutils.IncDecError as error:
|
||||||
raise Error(error.msg)
|
raise Error(error.msg)
|
||||||
return new_url
|
return new_url
|
||||||
|
|
||||||
|
|
||||||
def path_up(url):
|
def path_up(url, count):
|
||||||
"""Helper method for :navigate when `where' is up.
|
"""Helper method for :navigate when `where' is up.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
url: The current url.
|
url: The current url.
|
||||||
|
count: The number of levels to go up in the url.
|
||||||
"""
|
"""
|
||||||
path = url.path()
|
path = url.path()
|
||||||
if not path or path == '/':
|
if not path or path == '/':
|
||||||
raise Error("Can't go up!")
|
raise Error("Can't go up!")
|
||||||
new_path = posixpath.join(path, posixpath.pardir)
|
for _i in range(0, min(count, path.count('/'))):
|
||||||
url.setPath(new_path)
|
path = posixpath.join(path, posixpath.pardir)
|
||||||
|
url.setPath(path)
|
||||||
return url
|
return url
|
||||||
|
|
||||||
|
|
||||||
|
@ -499,7 +499,7 @@ class IncDecError(Exception):
|
|||||||
return '{}: {}'.format(self.msg, self.url.toString())
|
return '{}: {}'.format(self.msg, self.url.toString())
|
||||||
|
|
||||||
|
|
||||||
def _get_incdec_value(match, incdec, url):
|
def _get_incdec_value(match, incdec, url, count):
|
||||||
"""Get an incremented/decremented URL based on a URL match."""
|
"""Get an incremented/decremented URL based on a URL match."""
|
||||||
pre, zeroes, number, post = match.groups()
|
pre, zeroes, number, post = match.groups()
|
||||||
# This should always succeed because we match \d+
|
# This should always succeed because we match \d+
|
||||||
@ -507,9 +507,9 @@ def _get_incdec_value(match, incdec, url):
|
|||||||
if incdec == 'decrement':
|
if incdec == 'decrement':
|
||||||
if val <= 0:
|
if val <= 0:
|
||||||
raise IncDecError("Can't decrement {}!".format(val), url)
|
raise IncDecError("Can't decrement {}!".format(val), url)
|
||||||
val -= 1
|
val -= count
|
||||||
elif incdec == 'increment':
|
elif incdec == 'increment':
|
||||||
val += 1
|
val += count
|
||||||
else:
|
else:
|
||||||
raise ValueError("Invalid value {} for indec!".format(incdec))
|
raise ValueError("Invalid value {} for indec!".format(incdec))
|
||||||
if zeroes:
|
if zeroes:
|
||||||
@ -521,12 +521,13 @@ def _get_incdec_value(match, incdec, url):
|
|||||||
return ''.join([pre, zeroes, str(val), post])
|
return ''.join([pre, zeroes, str(val), post])
|
||||||
|
|
||||||
|
|
||||||
def incdec_number(url, incdec, segments=None):
|
def incdec_number(url, incdec, count=1, segments=None):
|
||||||
"""Find a number in the url and increment or decrement it.
|
"""Find a number in the url and increment or decrement it.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
url: The current url
|
url: The current url
|
||||||
incdec: Either 'increment' or 'decrement'
|
incdec: Either 'increment' or 'decrement'
|
||||||
|
count: The number to increment or decrement by
|
||||||
segments: A set of URL segments to search. Valid segments are:
|
segments: A set of URL segments to search. Valid segments are:
|
||||||
'host', 'path', 'query', 'anchor'.
|
'host', 'path', 'query', 'anchor'.
|
||||||
Default: {'path', 'query'}
|
Default: {'path', 'query'}
|
||||||
@ -566,7 +567,7 @@ def incdec_number(url, incdec, segments=None):
|
|||||||
if not match:
|
if not match:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
setter(_get_incdec_value(match, incdec, url))
|
setter(_get_incdec_value(match, incdec, url, count))
|
||||||
return url
|
return url
|
||||||
|
|
||||||
raise IncDecError("No number found in URL!", url)
|
raise IncDecError("No number found in URL!", url)
|
||||||
|
@ -11,6 +11,11 @@ Feature: Using :navigate
|
|||||||
And I run :navigate up
|
And I run :navigate up
|
||||||
Then data/navigate should be loaded
|
Then data/navigate should be loaded
|
||||||
|
|
||||||
|
Scenario: Navigating up by count
|
||||||
|
When I open data/navigate/sub/index.html
|
||||||
|
And I run :navigate up with count 2
|
||||||
|
Then data/navigate should be loaded
|
||||||
|
|
||||||
# prev/next
|
# prev/next
|
||||||
|
|
||||||
Scenario: Navigating to previous page
|
Scenario: Navigating to previous page
|
||||||
@ -60,6 +65,16 @@ Feature: Using :navigate
|
|||||||
And I run :navigate increment
|
And I run :navigate increment
|
||||||
Then the error "No number found in URL!" should be shown
|
Then the error "No number found in URL!" should be shown
|
||||||
|
|
||||||
|
Scenario: Incrementing number in URL by count
|
||||||
|
When I open data/numbers/3.txt
|
||||||
|
And I run :navigate increment with count 3
|
||||||
|
Then data/numbers/6.txt should be loaded
|
||||||
|
|
||||||
|
Scenario: Decrementing number in URL by count
|
||||||
|
When I open data/numbers/8.txt
|
||||||
|
And I run :navigate decrement with count 5
|
||||||
|
Then data/numbers/3.txt should be loaded
|
||||||
|
|
||||||
Scenario: Setting url-incdec-segments
|
Scenario: Setting url-incdec-segments
|
||||||
When I set general -> url-incdec-segments to anchor
|
When I set general -> url-incdec-segments to anchor
|
||||||
And I open data/numbers/1.txt
|
And I open data/numbers/1.txt
|
||||||
|
@ -620,6 +620,33 @@ class TestIncDecNumber:
|
|||||||
base_url, incdec, segments={'host', 'path', 'query', 'anchor'})
|
base_url, incdec, segments={'host', 'path', 'query', 'anchor'})
|
||||||
assert new_url == expected_url
|
assert new_url == expected_url
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('incdec', ['increment', 'decrement'])
|
||||||
|
@pytest.mark.parametrize('value', [
|
||||||
|
'{}foo', 'foo{}', 'foo{}bar', '42foo{}'
|
||||||
|
])
|
||||||
|
@pytest.mark.parametrize('url', [
|
||||||
|
'http://example.com:80/v1/path/{}/test',
|
||||||
|
'http://example.com:80/v1/query_test?value={}',
|
||||||
|
'http://example.com:80/v1/anchor_test#{}',
|
||||||
|
'http://host_{}_test.com:80',
|
||||||
|
'http://m4ny.c0m:80/number5/3very?where=yes#{}'
|
||||||
|
])
|
||||||
|
@pytest.mark.parametrize('count', [1, 5, 100])
|
||||||
|
def test_incdec_number_count(self, incdec, value, url, count):
|
||||||
|
"""Test incdec_number with valid URLs and a count."""
|
||||||
|
base_value = value.format(20)
|
||||||
|
if incdec == 'increment':
|
||||||
|
expected_value = value.format(20 + count)
|
||||||
|
else:
|
||||||
|
expected_value = value.format(20 - count)
|
||||||
|
|
||||||
|
base_url = QUrl(url.format(base_value))
|
||||||
|
expected_url = QUrl(url.format(expected_value))
|
||||||
|
new_url = urlutils.incdec_number(
|
||||||
|
base_url, incdec, count,
|
||||||
|
segments={'host', 'path', 'query', 'anchor'})
|
||||||
|
assert new_url == expected_url
|
||||||
|
|
||||||
@pytest.mark.parametrize('number, expected, incdec', [
|
@pytest.mark.parametrize('number, expected, incdec', [
|
||||||
('01', '02', 'increment'),
|
('01', '02', 'increment'),
|
||||||
('09', '10', 'increment'),
|
('09', '10', 'increment'),
|
||||||
|
Loading…
Reference in New Issue
Block a user