mirror of
https://github.com/Textualize/textual.git
synced 2025-10-17 02:38:12 +03:00
Rename ImmutableSequence to ImmutableSequenceView
Also, in doing so, drop support for unrolling iterators and making them into indexable sequences. See the following feedback: https://github.com/Textualize/textual/pull/1495#pullrequestreview-1238616797 https://github.com/Textualize/textual/pull/1495#issuecomment-1373553580
This commit is contained in:
committed by
Rodrigo Girão Serrão
parent
12c6129150
commit
53df47b401
@@ -1,35 +1,35 @@
|
|||||||
"""Provides collection-based utility code."""
|
"""Provides an immutable sequence view class."""
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
from typing import Generic, TypeVar, Iterator, overload, Iterable, Sequence
|
from typing import Generic, TypeVar, Iterator, overload, Sequence
|
||||||
|
|
||||||
T = TypeVar("T")
|
T = TypeVar("T")
|
||||||
|
|
||||||
|
|
||||||
class ImmutableSequence(Generic[T]):
|
class ImmutableSequenceView(Generic[T]):
|
||||||
"""Class to wrap a sequence of some sort, but not allow modification."""
|
"""Class to wrap a sequence of some sort, but not allow modification."""
|
||||||
|
|
||||||
def __init__(self, wrap: Iterable[T]) -> None:
|
def __init__(self, wrap: Sequence[T]) -> None:
|
||||||
"""Initialise the immutable sequence.
|
"""Initialise the immutable sequence.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
wrap (Iterable[T]): The iterable value being wrapped.
|
wrap (Sequence[T]): The sequence being wrapped.
|
||||||
"""
|
"""
|
||||||
self._wrap = wrap if isinstance(wrap, Sequence) else tuple(wrap)
|
self._wrap = wrap
|
||||||
|
|
||||||
@overload
|
@overload
|
||||||
def __getitem__(self, index: int) -> T:
|
def __getitem__(self, index: int) -> T:
|
||||||
...
|
...
|
||||||
|
|
||||||
@overload
|
@overload
|
||||||
def __getitem__(self, index: slice) -> ImmutableSequence[T]:
|
def __getitem__(self, index: slice) -> ImmutableSequenceView[T]:
|
||||||
...
|
...
|
||||||
|
|
||||||
def __getitem__(self, index: int | slice) -> T | ImmutableSequence[T]:
|
def __getitem__(self, index: int | slice) -> T | ImmutableSequenceView[T]:
|
||||||
return (
|
return (
|
||||||
self._wrap[index]
|
self._wrap[index]
|
||||||
if isinstance(index, int)
|
if isinstance(index, int)
|
||||||
else ImmutableSequence[T](self._wrap[index])
|
else ImmutableSequenceView[T](self._wrap[index])
|
||||||
)
|
)
|
||||||
|
|
||||||
def __iter__(self) -> Iterator[T]:
|
def __iter__(self) -> Iterator[T]:
|
||||||
@@ -14,7 +14,7 @@ from .._loop import loop_last
|
|||||||
from .._segment_tools import line_crop, line_pad
|
from .._segment_tools import line_crop, line_pad
|
||||||
from .._types import MessageTarget
|
from .._types import MessageTarget
|
||||||
from .._typing import TypeAlias
|
from .._typing import TypeAlias
|
||||||
from .._collections import ImmutableSequence
|
from .._immutable_sequence_view import ImmutableSequenceView
|
||||||
from ..binding import Binding
|
from ..binding import Binding
|
||||||
from ..geometry import Region, Size, clamp
|
from ..geometry import Region, Size, clamp
|
||||||
from ..message import Message
|
from ..message import Message
|
||||||
@@ -54,7 +54,7 @@ class _TreeLine(Generic[TreeDataType]):
|
|||||||
return guides
|
return guides
|
||||||
|
|
||||||
|
|
||||||
class TreeNodes(ImmutableSequence["TreeNode[TreeDataType]"]):
|
class TreeNodes(ImmutableSequenceView["TreeNode[TreeDataType]"]):
|
||||||
"""An immutable collection of `TreeNode`."""
|
"""An immutable collection of `TreeNode`."""
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from typing import Iterable
|
from typing import Sequence
|
||||||
from textual._collections import ImmutableSequence
|
from textual._immutable_sequence_view import ImmutableSequenceView
|
||||||
|
|
||||||
def wrap(source: Iterable[int]) -> ImmutableSequence[int]:
|
def wrap(source: Sequence[int]) -> ImmutableSequenceView[int]:
|
||||||
"""Wrap an itertable of integers inside an immutable sequence."""
|
"""Wrap a sequence of integers inside an immutable sequence view."""
|
||||||
return ImmutableSequence[int](source)
|
return ImmutableSequenceView[int](source)
|
||||||
|
|
||||||
|
|
||||||
def test_empty_immutable_sequence() -> None:
|
def test_empty_immutable_sequence() -> None:
|
||||||
@@ -22,20 +22,6 @@ def test_non_empty_immutable_sequence() -> None:
|
|||||||
assert list(wrap([0])) == [0]
|
assert list(wrap([0])) == [0]
|
||||||
|
|
||||||
|
|
||||||
def test_immutable_sequence_from_empty_iter() -> None:
|
|
||||||
"""An immutable sequence around an empty iterator should act as anticipated."""
|
|
||||||
assert len(wrap(iter([]))) == 0
|
|
||||||
assert bool(wrap(iter([]))) is False
|
|
||||||
assert list(wrap(iter([]))) == []
|
|
||||||
|
|
||||||
|
|
||||||
def test_immutable_sequence_from_non_empty_iter() -> None:
|
|
||||||
"""An immutable sequence around a non-empty iterator should act as anticipated."""
|
|
||||||
assert len(wrap(iter(range(23)))) == 23
|
|
||||||
assert bool(wrap(iter(range(23)))) is True
|
|
||||||
assert list(wrap(iter(range(23)))) == list(range(23))
|
|
||||||
|
|
||||||
|
|
||||||
def test_no_assign_to_immutable_sequence() -> None:
|
def test_no_assign_to_immutable_sequence() -> None:
|
||||||
"""It should not be possible to assign into an immutable sequence."""
|
"""It should not be possible to assign into an immutable sequence."""
|
||||||
tester = wrap([1,2,3,4,5])
|
tester = wrap([1,2,3,4,5])
|
||||||
Reference in New Issue
Block a user