1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
from __future__ import annotations
class APIItems:
"""Base class for a map of API Items."""
def __init__(self, logger, raw, request, path, item_cls):
self._logger = logger
self._request = request
self._path = path
self._item_cls = item_cls
self._items = {}
self._process_raw(raw)
@property
def items(self):
return self.values()
async def update(self):
"""Request update of all items of this resource type."""
raw = await self._request("get", self._path)
self._process_raw(raw)
def _process_raw(self, raw):
for id, raw_item in raw.items():
obj = self._items.get(id)
if obj is not None:
obj.raw = raw_item
else:
self._items[id] = self._item_cls(
id,
raw_item,
self._request,
)
removed_items = []
for id in self._items:
if id not in raw:
removed_items.append(id)
for id in removed_items:
del self._items[id]
def values(self):
return list(self._items.values())
def __getitem__(self, obj_id):
return self._items[obj_id]
def __iter__(self):
return iter(self._items)
|