Source code for tbm_utils.structures

__all__ = [
	'AttrMapping',
	'LabelList',
]

from collections import UserList
from collections.abc import (
	ItemsView,
	KeysView,
	MutableMapping,
	ValuesView,
)

import pprintpp


class _KeysView(KeysView):  # pragma: nocover
	def __repr__(self):
		return f"KeysView({pprintpp.pformat(list(self._mapping))})"


class _ItemsView(ItemsView):  # pragma: nocover
	def __repr__(self):
		items = [
			(key, self._mapping[key])
			for key in self._mapping
		]

		return f"ItemsView({pprintpp.pformat(items)})"


class _ValuesView(ValuesView):  # pragma: nocover
	def __repr__(self):
		return f"ValuesView({pprintpp.pformat([self._mapping[key] for key in self._mapping])})"


class AttrMapping(MutableMapping):
	def __init__(self, mapping=None, **kwargs):
		if mapping:
			for k, v in mapping.items():
				self[k] = v

		for k, v in kwargs.items():
			self[k] = v

	def __getattr__(self, attr):
		if attr not in self.__dict__:
			raise AttributeError(attr)

		return self.__dict__[attr]  # pragma: nocover

	def __setattr__(self, attr, value):
		self.__dict__[attr] = value

	def __delattr__(self, attr):
		if attr not in self.__dict__:
			raise AttributeError(attr)

		del self.__dict__[attr]

	def __getitem__(self, key):
		if key in self.__dict__:
			return self.__dict__[key]

		if hasattr(self.__class__, '__missing__'):
			return self.__class__.__missing__(self, key)

		raise KeyError(key)

	def __setitem__(self, key, value):
		self.__dict__[key] = value

	def __delitem__(self, key):
		del self.__dict__[key]

	def __iter__(self):
		return iter(self.__dict__)

	def __len__(self):
		return len(self.__dict__)

	def __repr__(self, repr_dict=None):
		repr_dict = repr_dict if repr_dict is not None else self.__dict__
		return f"<{self.__class__.__name__}({pprintpp.pformat(repr_dict)})>"

	@classmethod
	def from_mapping(cls, mapping):
		return cls(**mapping)

	def items(self):
		return _ItemsView(self)

	def keys(self):
		return _KeysView(self)

	def values(self):
		return _ValuesView(self)


[docs]class LabelList(UserList): item_label = ('item', 'items') def __repr__(self): item_label = self.item_label[1] if len(self.data) > 1 else self.item_label[0] return f"<{self.__class__.__name__} ({len(self)} {item_label})>" @property def items(self): return self.data