2022-03-07 09:17:45 -06:00
|
|
|
"""Tests for :mod:`sphinx.ext.napoleon.iterators` module."""
|
2014-01-18 12:56:23 -06:00
|
|
|
|
2022-06-26 06:40:42 -05:00
|
|
|
import sys
|
2014-01-18 12:56:23 -06:00
|
|
|
|
2023-02-01 05:15:05 -06:00
|
|
|
import pytest
|
|
|
|
|
2022-06-26 06:40:42 -05:00
|
|
|
from sphinx.deprecation import RemovedInSphinx70Warning
|
2023-02-01 05:15:05 -06:00
|
|
|
|
|
|
|
with pytest.warns(DeprecationWarning,
|
|
|
|
match="sphinx.ext.napoleon.iterators is deprecated."):
|
|
|
|
from sphinx.ext.napoleon.iterators import modify_iter, peek_iter
|
2018-02-19 07:39:14 -06:00
|
|
|
|
2014-01-18 12:56:23 -06:00
|
|
|
|
2023-02-17 17:05:57 -06:00
|
|
|
class TestModuleIsDeprecated:
|
2022-06-26 06:40:42 -05:00
|
|
|
def test_module_is_deprecated(self):
|
|
|
|
sys.modules.pop("sphinx.ext.napoleon.iterators")
|
2023-02-17 17:05:57 -06:00
|
|
|
with pytest.warns(RemovedInSphinx70Warning,
|
|
|
|
match="sphinx.ext.napoleon.iterators is deprecated."):
|
2022-12-15 11:22:07 -06:00
|
|
|
import sphinx.ext.napoleon.iterators # noqa: F401
|
2022-06-26 06:40:42 -05:00
|
|
|
|
|
|
|
|
2023-02-17 17:05:57 -06:00
|
|
|
def _assert_equal_twice(expected, func, *args):
|
|
|
|
assert expected == func(*args)
|
|
|
|
assert expected == func(*args)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
|
2023-02-17 17:05:57 -06:00
|
|
|
def _assert_false_twice(func, *args):
|
|
|
|
assert not func(*args)
|
|
|
|
assert not func(*args)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
|
2023-02-17 17:05:57 -06:00
|
|
|
def _assert_next(it, expected, is_last):
|
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
_assert_equal_twice(expected, it.peek)
|
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
_assert_equal_twice(expected, it.peek)
|
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
assert expected == next(it)
|
|
|
|
if is_last:
|
|
|
|
_assert_false_twice(it.has_next)
|
|
|
|
_assert_raises_twice(StopIteration, it.next)
|
|
|
|
else:
|
|
|
|
_assert_true_twice(it.has_next)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
|
2023-02-17 17:05:57 -06:00
|
|
|
def _assert_raises_twice(exc, func, *args):
|
|
|
|
with pytest.raises(exc):
|
|
|
|
func(*args)
|
|
|
|
with pytest.raises(exc):
|
|
|
|
func(*args)
|
|
|
|
|
|
|
|
|
|
|
|
def _assert_true_twice(func, *args):
|
|
|
|
assert func(*args)
|
|
|
|
assert func(*args)
|
|
|
|
|
|
|
|
|
|
|
|
class TestPeekIter:
|
2014-01-18 12:56:23 -06:00
|
|
|
def test_init_with_sentinel(self):
|
|
|
|
a = iter(['1', '2', 'DONE'])
|
|
|
|
sentinel = 'DONE'
|
2023-02-17 17:05:57 -06:00
|
|
|
with pytest.raises(TypeError):
|
|
|
|
peek_iter(a, sentinel)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
def get_next():
|
|
|
|
return next(a)
|
|
|
|
it = peek_iter(get_next, sentinel)
|
2023-02-17 17:05:57 -06:00
|
|
|
assert it.sentinel == sentinel
|
|
|
|
_assert_next(it, '1', is_last=False)
|
|
|
|
_assert_next(it, '2', is_last=True)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
def test_iter(self):
|
|
|
|
a = ['1', '2', '3']
|
|
|
|
it = peek_iter(a)
|
2023-02-17 17:05:57 -06:00
|
|
|
assert it is it.__iter__()
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
a = []
|
2022-01-09 10:55:12 -06:00
|
|
|
b = list(peek_iter(a))
|
2023-02-17 17:05:57 -06:00
|
|
|
assert [] == b
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
a = ['1']
|
2022-01-09 10:55:12 -06:00
|
|
|
b = list(peek_iter(a))
|
2023-02-17 17:05:57 -06:00
|
|
|
assert ["1"] == b
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
a = ['1', '2']
|
2022-01-09 10:55:12 -06:00
|
|
|
b = list(peek_iter(a))
|
2023-02-17 17:05:57 -06:00
|
|
|
assert ["1", "2"] == b
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
a = ['1', '2', '3']
|
2022-01-09 10:55:12 -06:00
|
|
|
b = list(peek_iter(a))
|
2023-02-17 17:05:57 -06:00
|
|
|
assert ["1", "2", "3"] == b
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
def test_next_with_multi(self):
|
|
|
|
a = []
|
|
|
|
it = peek_iter(a)
|
2023-02-17 17:05:57 -06:00
|
|
|
_assert_false_twice(it.has_next)
|
|
|
|
_assert_raises_twice(StopIteration, it.next, 2)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
a = ['1']
|
|
|
|
it = peek_iter(a)
|
2023-02-17 17:05:57 -06:00
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
_assert_raises_twice(StopIteration, it.next, 2)
|
|
|
|
_assert_true_twice(it.has_next)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
a = ['1', '2']
|
|
|
|
it = peek_iter(a)
|
2023-02-17 17:05:57 -06:00
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
assert ["1", "2"] == it.next(2)
|
|
|
|
_assert_false_twice(it.has_next)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
a = ['1', '2', '3']
|
|
|
|
it = peek_iter(a)
|
2023-02-17 17:05:57 -06:00
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
assert ["1", "2"] == it.next(2)
|
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
_assert_raises_twice(StopIteration, it.next, 2)
|
|
|
|
_assert_true_twice(it.has_next)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
a = ['1', '2', '3', '4']
|
|
|
|
it = peek_iter(a)
|
2023-02-17 17:05:57 -06:00
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
assert ["1", "2"] == it.next(2)
|
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
assert ["3", "4"] == it.next(2)
|
|
|
|
_assert_false_twice(it.has_next)
|
|
|
|
_assert_raises_twice(StopIteration, it.next, 2)
|
|
|
|
_assert_false_twice(it.has_next)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
def test_next_with_none(self):
|
|
|
|
a = []
|
|
|
|
it = peek_iter(a)
|
2023-02-17 17:05:57 -06:00
|
|
|
_assert_false_twice(it.has_next)
|
|
|
|
_assert_raises_twice(StopIteration, it.next)
|
|
|
|
_assert_false_twice(it.has_next)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
a = ['1']
|
|
|
|
it = peek_iter(a)
|
2023-02-17 17:05:57 -06:00
|
|
|
assert it.__next__() == "1"
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
a = ['1']
|
|
|
|
it = peek_iter(a)
|
2023-02-17 17:05:57 -06:00
|
|
|
_assert_next(it, '1', is_last=True)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
a = ['1', '2']
|
|
|
|
it = peek_iter(a)
|
2023-02-17 17:05:57 -06:00
|
|
|
_assert_next(it, '1', is_last=False)
|
|
|
|
_assert_next(it, '2', is_last=True)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
a = ['1', '2', '3']
|
|
|
|
it = peek_iter(a)
|
2023-02-17 17:05:57 -06:00
|
|
|
_assert_next(it, '1', is_last=False)
|
|
|
|
_assert_next(it, '2', is_last=False)
|
|
|
|
_assert_next(it, '3', is_last=True)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
def test_next_with_one(self):
|
|
|
|
a = []
|
|
|
|
it = peek_iter(a)
|
2023-02-17 17:05:57 -06:00
|
|
|
_assert_false_twice(it.has_next)
|
|
|
|
_assert_raises_twice(StopIteration, it.next, 1)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
a = ['1']
|
|
|
|
it = peek_iter(a)
|
2023-02-17 17:05:57 -06:00
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
assert ["1"] == it.next(1)
|
|
|
|
_assert_false_twice(it.has_next)
|
|
|
|
_assert_raises_twice(StopIteration, it.next, 1)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
a = ['1', '2']
|
|
|
|
it = peek_iter(a)
|
2023-02-17 17:05:57 -06:00
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
assert ["1"] == it.next(1)
|
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
assert ["2"] == it.next(1)
|
|
|
|
_assert_false_twice(it.has_next)
|
|
|
|
_assert_raises_twice(StopIteration, it.next, 1)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
def test_next_with_zero(self):
|
|
|
|
a = []
|
|
|
|
it = peek_iter(a)
|
2023-02-17 17:05:57 -06:00
|
|
|
_assert_false_twice(it.has_next)
|
|
|
|
_assert_raises_twice(StopIteration, it.next, 0)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
a = ['1']
|
|
|
|
it = peek_iter(a)
|
2023-02-17 17:05:57 -06:00
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
_assert_equal_twice([], it.next, 0)
|
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
_assert_equal_twice([], it.next, 0)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
a = ['1', '2']
|
|
|
|
it = peek_iter(a)
|
2023-02-17 17:05:57 -06:00
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
_assert_equal_twice([], it.next, 0)
|
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
_assert_equal_twice([], it.next, 0)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
def test_peek_with_multi(self):
|
|
|
|
a = []
|
|
|
|
it = peek_iter(a)
|
2023-02-17 17:05:57 -06:00
|
|
|
_assert_false_twice(it.has_next)
|
|
|
|
_assert_equal_twice([it.sentinel, it.sentinel], it.peek, 2)
|
|
|
|
_assert_false_twice(it.has_next)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
a = ['1']
|
|
|
|
it = peek_iter(a)
|
2023-02-17 17:05:57 -06:00
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
_assert_equal_twice(['1', it.sentinel], it.peek, 2)
|
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
_assert_equal_twice(['1', it.sentinel, it.sentinel], it.peek, 3)
|
|
|
|
_assert_true_twice(it.has_next)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
a = ['1', '2']
|
|
|
|
it = peek_iter(a)
|
2023-02-17 17:05:57 -06:00
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
_assert_equal_twice(['1', '2'], it.peek, 2)
|
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
_assert_equal_twice(['1', '2', it.sentinel], it.peek, 3)
|
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
_assert_equal_twice(['1', '2', it.sentinel, it.sentinel], it.peek, 4)
|
|
|
|
_assert_true_twice(it.has_next)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
a = ['1', '2', '3']
|
|
|
|
it = peek_iter(a)
|
2023-02-17 17:05:57 -06:00
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
_assert_equal_twice(['1', '2'], it.peek, 2)
|
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
_assert_equal_twice(['1', '2', '3'], it.peek, 3)
|
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
_assert_equal_twice(['1', '2', '3', it.sentinel], it.peek, 4)
|
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
assert next(it) == "1"
|
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
_assert_equal_twice(['2', '3'], it.peek, 2)
|
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
_assert_equal_twice(['2', '3', it.sentinel], it.peek, 3)
|
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
_assert_equal_twice(['2', '3', it.sentinel, it.sentinel], it.peek, 4)
|
|
|
|
_assert_true_twice(it.has_next)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
def test_peek_with_none(self):
|
|
|
|
a = []
|
|
|
|
it = peek_iter(a)
|
2023-02-17 17:05:57 -06:00
|
|
|
_assert_false_twice(it.has_next)
|
|
|
|
_assert_equal_twice(it.sentinel, it.peek)
|
|
|
|
_assert_false_twice(it.has_next)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
a = ['1']
|
|
|
|
it = peek_iter(a)
|
2023-02-17 17:05:57 -06:00
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
_assert_equal_twice('1', it.peek)
|
|
|
|
assert next(it) == "1"
|
|
|
|
_assert_false_twice(it.has_next)
|
|
|
|
_assert_equal_twice(it.sentinel, it.peek)
|
|
|
|
_assert_false_twice(it.has_next)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
a = ['1', '2']
|
|
|
|
it = peek_iter(a)
|
2023-02-17 17:05:57 -06:00
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
_assert_equal_twice('1', it.peek)
|
|
|
|
assert next(it) == "1"
|
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
_assert_equal_twice('2', it.peek)
|
|
|
|
assert next(it) == "2"
|
|
|
|
_assert_false_twice(it.has_next)
|
|
|
|
_assert_equal_twice(it.sentinel, it.peek)
|
|
|
|
_assert_false_twice(it.has_next)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
def test_peek_with_one(self):
|
|
|
|
a = []
|
|
|
|
it = peek_iter(a)
|
2023-02-17 17:05:57 -06:00
|
|
|
_assert_false_twice(it.has_next)
|
|
|
|
_assert_equal_twice([it.sentinel], it.peek, 1)
|
|
|
|
_assert_false_twice(it.has_next)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
a = ['1']
|
|
|
|
it = peek_iter(a)
|
2023-02-17 17:05:57 -06:00
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
_assert_equal_twice(['1'], it.peek, 1)
|
|
|
|
assert next(it) == "1"
|
|
|
|
_assert_false_twice(it.has_next)
|
|
|
|
_assert_equal_twice([it.sentinel], it.peek, 1)
|
|
|
|
_assert_false_twice(it.has_next)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
a = ['1', '2']
|
|
|
|
it = peek_iter(a)
|
2023-02-17 17:05:57 -06:00
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
_assert_equal_twice(['1'], it.peek, 1)
|
|
|
|
assert next(it) == "1"
|
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
_assert_equal_twice(['2'], it.peek, 1)
|
|
|
|
assert next(it) == "2"
|
|
|
|
_assert_false_twice(it.has_next)
|
|
|
|
_assert_equal_twice([it.sentinel], it.peek, 1)
|
|
|
|
_assert_false_twice(it.has_next)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
def test_peek_with_zero(self):
|
|
|
|
a = []
|
|
|
|
it = peek_iter(a)
|
2023-02-17 17:05:57 -06:00
|
|
|
_assert_false_twice(it.has_next)
|
|
|
|
_assert_equal_twice([], it.peek, 0)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
a = ['1']
|
|
|
|
it = peek_iter(a)
|
2023-02-17 17:05:57 -06:00
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
_assert_equal_twice([], it.peek, 0)
|
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
_assert_equal_twice([], it.peek, 0)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
a = ['1', '2']
|
|
|
|
it = peek_iter(a)
|
2023-02-17 17:05:57 -06:00
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
_assert_equal_twice([], it.peek, 0)
|
|
|
|
_assert_true_twice(it.has_next)
|
|
|
|
_assert_equal_twice([], it.peek, 0)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
|
2023-02-17 17:05:57 -06:00
|
|
|
class TestModifyIter:
|
2014-01-18 12:56:23 -06:00
|
|
|
def test_init_with_sentinel_args(self):
|
|
|
|
a = iter(['1', '2', '3', 'DONE'])
|
|
|
|
sentinel = 'DONE'
|
|
|
|
|
|
|
|
def get_next():
|
|
|
|
return next(a)
|
|
|
|
it = modify_iter(get_next, sentinel, int)
|
|
|
|
expected = [1, 2, 3]
|
2023-02-17 17:05:57 -06:00
|
|
|
assert expected == list(it)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
def test_init_with_sentinel_kwargs(self):
|
|
|
|
a = iter([1, 2, 3, 4])
|
|
|
|
sentinel = 4
|
|
|
|
|
|
|
|
def get_next():
|
|
|
|
return next(a)
|
|
|
|
it = modify_iter(get_next, sentinel, modifier=str)
|
|
|
|
expected = ['1', '2', '3']
|
2023-02-17 17:05:57 -06:00
|
|
|
assert expected == list(it)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
def test_modifier_default(self):
|
|
|
|
a = ['', ' ', ' a ', 'b ', ' c', ' ', '']
|
|
|
|
it = modify_iter(a)
|
|
|
|
expected = ['', ' ', ' a ', 'b ', ' c', ' ', '']
|
2023-02-17 17:05:57 -06:00
|
|
|
assert expected == list(it)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
def test_modifier_not_callable(self):
|
2023-02-17 17:05:57 -06:00
|
|
|
with pytest.raises(TypeError):
|
|
|
|
modify_iter([1], modifier='not_callable')
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
def test_modifier_rstrip(self):
|
|
|
|
a = ['', ' ', ' a ', 'b ', ' c', ' ', '']
|
|
|
|
it = modify_iter(a, modifier=lambda s: s.rstrip())
|
|
|
|
expected = ['', '', ' a', 'b', ' c', '', '']
|
2023-02-17 17:05:57 -06:00
|
|
|
assert expected == list(it)
|
2014-01-18 12:56:23 -06:00
|
|
|
|
|
|
|
def test_modifier_rstrip_unicode(self):
|
2018-12-15 08:02:28 -06:00
|
|
|
a = ['', ' ', ' a ', 'b ', ' c', ' ', '']
|
2014-01-18 12:56:23 -06:00
|
|
|
it = modify_iter(a, modifier=lambda s: s.rstrip())
|
2018-12-15 08:02:28 -06:00
|
|
|
expected = ['', '', ' a', 'b', ' c', '', '']
|
2023-02-17 17:05:57 -06:00
|
|
|
assert expected == list(it)
|