Source code for pyos.psh_lib.results
# -*- coding: utf-8 -*-
"""Module that contains classes used to provide results to the user"""
import collections.abc
from typing import Callable, Iterator
import pyos.results
from pyos.psh_lib import representers
__all__ = 'CachingResults', 'ResultsDict', 'ResultsString'
[docs]class CachingResults(collections.abc.Sequence, pyos.results.BaseResults):
"""A helper that takes an iterator and wraps it caching the results as a sequence."""
def __init__(self, iterator: Iterator, representer: Callable = None):
"""
Create a caching results sequence. If no representer is supplied the default will be used.
:param iterator: the iterable to cache results of
:param representer: the representer to use, if None the current default will be used.
"""
super().__init__()
if not isinstance(iterator, Iterator):
raise TypeError(f'Expected Iterator, got {iterator.__class__.__name__}')
self._iterator = iterator
self._representer = representer or representers.get_default()
self._cache = []
def __getitem__(self, item):
if isinstance(item, slice):
self._ensure_cache(item.stop - 1 if item.stop is not None else -1)
else:
self._ensure_cache(item)
return self._cache[item]
def __iter__(self):
return self._iter_generator()
def __len__(self):
self._ensure_cache()
return len(self._cache)
def __repr__(self):
return '\n'.join([self._representer(item) for item in self])
def _iter_generator(self, at_end=False):
idx = 0 if not at_end else len(self._cache)
while True:
if idx >= len(self._cache):
# Ok, try the iterable
if self._iterator is None:
return
try:
self._cache.append(next(self._iterator))
except StopIteration:
self._iterator = None
return
yield self._cache[idx]
idx += 1
def _ensure_cache(self, max_index=-1):
"""Fill up the cache up to the max index. If -1 then fill up entirely"""
if self._iterator is None or (0 <= max_index < len(self._cache)):
return
idx = len(self._cache)
self_iter = self._iter_generator(at_end=True)
while True:
try:
next(self_iter)
idx += 1
if max_index != -1 and idx > max_index:
return
except StopIteration:
return
[docs]class ResultsDict(collections.abc.Mapping, pyos.results.BaseResults):
"""A custom dictionary representing results from a command"""
def __init__(self, results: dict, representer=None):
self._results = results
self._representer = representer or representers.get_default()
def __getitem__(self, item):
return self._results.__getitem__(item)
def __iter__(self):
return self._results.__iter__()
def __len__(self):
return self._results.__len__()
def __repr__(self):
return self._representer(self)
[docs]class ResultsString(collections.UserString, pyos.results.BaseResults):
"""A string that overwrites the __repr__ method"""
def __init__(self, result: str, representer=None):
super().__init__(result)
self._representer = representer or representers.get_default()
def __repr__(self):
return self._representer(self.data)