Source code for planetary_coverage.rois.abstract
"""ROIs abstract module."""
from collections import UserDict
from copy import copy
[docs]class AbstractItem:
"""Abstract item.
Parameters
----------
key:
Identification key.
name: str, optional
ROI/Category/SubCategory name.
**kwargs: str, optional
Region description/Science objective/Observation requirement/Color.
"""
def __init__(self, key, name=None, **kwargs):
self.key = key
self.name = None if name is None or name == 'None' else name.title()
self._attrs = kwargs
for k, v in kwargs.items():
setattr(self, k, v)
def __str__(self):
return str(self.key)
def __repr__(self):
name = f' ({self.name})' if self.name else ''
return '\n - '.join([
f'<{self.__class__.__name__}> {self}{name}',
*[
f'{k.replace("_", " ").title()}: {v}'
for k, v in self._attrs.items()
]
])
def __eq__(self, other):
return str(self) == other
def __getitem__(self, item):
return getattr(self, item)
[docs]class AbstractCollection(UserDict):
"""Abstract collection."""
ITEM = AbstractItem
def __repr__(self):
return '\n - '.join([
f'<{self.__class__.__name__}> {self.count}',
*self.data.keys()
])
def __iter__(self):
"""Iterator on values and not keys like regular dict."""
return iter(self.data.values())
def __getitem__(self, key):
if str(key) in self.data:
return self.data[str(key)]
raise KeyError(key)
def __setitem__(self, key, attrs):
"""Add a new item.
Note
----
If an ``ITEM`` is directly provided, the item
will be copy an its key will be updated with
the new one.
"""
if isinstance(attrs, self.ITEM):
_item = copy(attrs)
_item.key = key
self.data[str(key)] = _item
elif isinstance(attrs, str):
setattr(self, str(key), attrs)
else:
self.data[str(key)] = self.ITEM(key, **attrs)
@property
def count(self):
"""Count items."""
ITEM = self.ITEM.__name__
n = len(self)
if n > 1:
ITEM = (ITEM + 's') if ITEM[-1] != 'y' else (ITEM[:-1] + 'ies')
if n == 0:
n = 'No'
return f'{n} {ITEM.lower()}'
[docs] def keys(self):
"""Keys iterators."""
return self.data.keys()
[docs] def items(self):
"""Keys and values iterators."""
return self.data.items()