From 465884207a14186ff83215d6eb6198e40093a2ab Mon Sep 17 00:00:00 2001 From: Nikita Tikhonov Date: Sat, 6 Jan 2024 19:45:13 +0300 Subject: [PATCH] Update views, bump dependencies. --- README.md | 2 +- iters/__init__.py | 2 +- iters/iters.py | 24 +++++++++++++++-- iters/mapping_view.py | 41 +++++++++++++++++++++++++++++ iters/sequence_view.py | 9 ++----- pyproject.toml | 59 ++++++++++++++---------------------------- 6 files changed, 86 insertions(+), 51 deletions(-) create mode 100644 iters/mapping_view.py diff --git a/README.md b/README.md index b908b8f..73a7128 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ Or by directly specifying it in the configuration like so: ```toml [tool.poetry.dependencies] -iters = "^0.15.0" +iters = "^0.16.0" ``` Alternatively, you can add it directly from the source: diff --git a/iters/__init__.py b/iters/__init__.py index c443403..af9308d 100644 --- a/iters/__init__.py +++ b/iters/__init__.py @@ -11,7 +11,7 @@ __title__ = "iters" __author__ = "nekitdev" __license__ = "MIT" -__version__ = "0.15.0" +__version__ = "0.16.0" from iters.async_iters import ( AsyncIter, diff --git a/iters/iters.py b/iters/iters.py index 3b10b35..68ef3dc 100644 --- a/iters/iters.py +++ b/iters/iters.py @@ -1101,7 +1101,17 @@ def create_zip_longest( __iterable_e: Iterable[E], __iterable_f: Iterable[F], __iterable_g: Iterable[G], - ) -> Iter[Tuple[Option[A], Option[B], Option[C], Option[D], Option[E], Option[F], Option[G],]]: + ) -> Iter[ + Tuple[ + Option[A], + Option[B], + Option[C], + Option[D], + Option[E], + Option[F], + Option[G], + ] + ]: ... @overload @@ -2626,7 +2636,17 @@ def apply_zip_longest( __iterable_d: Iterable[D], __iterable_e: Iterable[E], __iterable_f: Iterable[F], - ) -> Iter[Tuple[Option[T], Option[A], Option[B], Option[C], Option[D], Option[E], Option[F],]]: + ) -> Iter[ + Tuple[ + Option[T], + Option[A], + Option[B], + Option[C], + Option[D], + Option[E], + Option[F], + ] + ]: ... @overload diff --git a/iters/mapping_view.py b/iters/mapping_view.py new file mode 100644 index 0000000..fefd0df --- /dev/null +++ b/iters/mapping_view.py @@ -0,0 +1,41 @@ +from typing import Any, Iterator, Mapping, TypeVar, final + +from attrs import frozen +from typing_extensions import Self +from wraps import wrap_option + +__all__ = ("MappingView", "mapping_view") + +K = TypeVar("K") +V = TypeVar("V") + + +@final +@frozen() +class MappingView(Mapping[K, V]): + """Represents view over mappings.""" + + mapping: Mapping[K, V] + """The mapping to view.""" + + def __iter__(self) -> Iterator[K]: + yield from self.mapping + + def __getitem__(self, key: K) -> V: + return self.mapping[key] + + def __contains__(self, key: Any) -> bool: + return key in self.mapping + + def __len__(self) -> int: + return len(self.mapping) + + @wrap_option + def get_option(self, key: K) -> V: + return self[key] + + def copy(self) -> Self: + return type(self)(self) + + +mapping_view = MappingView diff --git a/iters/sequence_view.py b/iters/sequence_view.py index aa6e011..8c79910 100644 --- a/iters/sequence_view.py +++ b/iters/sequence_view.py @@ -9,7 +9,6 @@ __all__ = ("SequenceView", "sequence_view") T = TypeVar("T") -U = TypeVar("U") @final @@ -18,11 +17,7 @@ class SequenceView(Sequence[T]): """Represents views over sequences.""" sequence: Sequence[T] - """The sequence to view into.""" - - @classmethod - def create(cls, sequence: Sequence[U]) -> SequenceView[U]: - return cls(sequence) # type: ignore + """The sequence to view.""" @overload def __getitem__(self, index: int) -> T: @@ -34,7 +29,7 @@ def __getitem__(self, index: slice) -> SequenceView[T]: def __getitem__(self, index: Union[int, slice]) -> Union[T, SequenceView[T]]: if is_slice(index): - return self.create(self.sequence[index]) + return type(self)(self.sequence[index]) return self.sequence[index] # type: ignore diff --git a/pyproject.toml b/pyproject.toml index 771dbcf..e565bde 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "iters" -version = "0.15.0" +version = "0.16.0" description = "Composable external iteration." authors = ["nekitdev"] license = "MIT" @@ -31,42 +31,26 @@ include = "iters" [tool.poetry.dependencies] python = ">= 3.8" -typing-aliases = ">= 1.2.0" -typing-extensions = ">= 4.8.0" +typing-aliases = "^1.4.1" +typing-extensions = "^4.9.0" -named = ">= 1.3.0" -orderings = ">= 1.1.0" +named = "^1.3.0" +orderings = "^1.1.0" -solus = ">= 1.1.0" +solus = "^1.1.0" -async-extensions = ">= 1.4.1" -mixed-methods = ">= 1.0.2" - -[tool.poetry.group.format] -optional = true +async-extensions = "^1.4.1" +mixed-methods = "^1.0.2" [tool.poetry.group.format.dependencies] -black = "23.11.0" -flake8-pyproject = "1.2.3" - -[tool.poetry.group.format.dependencies.flake8] -version = "6.1.0" -python = ">= 3.8.1" - -[tool.poetry.group.format.dependencies.isort] -version = "5.12.0" - -[tool.poetry.group.check] -optional = true +ruff = "0.1.11" [tool.poetry.group.check.dependencies] -mypy = "1.7.1" - -[tool.poetry.group.test] -optional = true +mypy = "1.8.0" [tool.poetry.group.test.dependencies] -pytest = "7.4.3" +coverage = "7.4.0" +pytest = "7.4.4" pytest-cov = "4.1.0" [tool.poetry.group.docs] @@ -74,31 +58,26 @@ optional = true [tool.poetry.group.docs.dependencies] mkdocs = "1.5.3" -mkdocs-material = "9.4.11" +mkdocs-material = "9.5.3" [tool.poetry.group.docs.dependencies.mkdocstrings] version = "0.24.0" extras = ["python"] -[tool.poetry.group.dev] +[tool.poetry.group.release] optional = true -[tool.poetry.group.dev.dependencies] +[tool.poetry.group.release.dependencies] changelogging = "1.3.0" -[tool.black] -line_length = 100 +[tool.ruff] +line-length = 100 -[tool.flake8] -max_line_length = 100 +[tool.ruff.lint] ignore = [ "E402", # module level import not at top of file (circular import fixes) ] -[tool.isort] -line_length = 100 -profile = "black" - [tool.pytest.ini_options] addopts = "--cov iters" testpaths = ["tests"] @@ -127,7 +106,7 @@ strict = true [tool.changelogging] name = "iters" -version = "0.15.0" +version = "0.16.0" url = "https://github.com/nekitdev/iters" directory = "changes" output = "CHANGELOG.md"