Coverage for portality / autocheck / resource_bundle.py: 85%
47 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-05-04 09:41 +0100
« prev ^ index » next coverage.py v7.13.5, created at 2026-05-04 09:41 +0100
1class ResourceUnavailable(Exception):
2 pass
5class ResourceBundle(object):
6 def __init__(self, resources=None, stack_size=100):
7 self._resources = resources if resources is not None else []
8 self._resource_data = {}
9 self._resource_stack = []
10 self._stack_size = stack_size
12 def register(self, resource_id, data):
13 self._resource_data[resource_id] = data
14 self._resource_stack.append(resource_id)
15 if len(self._resource_stack) > self._stack_size:
16 remove = self._resource_stack.pop(0)
17 if remove in self._resource_data:
18 # I don't know why it ever wouldn't be, but I have occasionally got a key error here
19 self._resource_data.pop(remove)
21 def get(self, resource_id):
22 return self._resource_data.get(resource_id)
24 def resource(self, resource_class):
25 for resource in self._resources:
26 if isinstance(resource, resource_class):
27 return resource
28 inst = resource_class(self)
29 self._resources.append(inst)
30 return inst
33class Resource(object):
34 __identity__ = "base_resource"
36 def __init__(self, resource_bundle):
37 self._resource_bundle = resource_bundle
39 def name(self):
40 return self.__identity__
42 def make_resource_id(self, *args, **kwargs):
43 return self.name()
45 def reference_url(self, *args, **kwargs):
46 raise NotImplementedError()
48 def fetch_fresh(self, *args, **kwargs):
49 raise NotImplementedError()
51 def fetch(self, *args, **kwargs):
52 resource_id = self.make_resource_id(*args, **kwargs)
53 data = self._resource_bundle.get(resource_id)
54 if data is not None:
55 return data
57 try:
58 data = self.fetch_fresh(*args, **kwargs)
59 except Exception as e:
60 raise ResourceUnavailable()
62 self._resource_bundle.register(resource_id, data)
63 return data