Coverage for portality / autocheck / resource_bundle.py: 85%

47 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-05-05 00:09 +0100

1class ResourceUnavailable(Exception): 

2 pass 

3 

4 

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 

11 

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) 

20 

21 def get(self, resource_id): 

22 return self._resource_data.get(resource_id) 

23 

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 

31 

32 

33class Resource(object): 

34 __identity__ = "base_resource" 

35 

36 def __init__(self, resource_bundle): 

37 self._resource_bundle = resource_bundle 

38 

39 def name(self): 

40 return self.__identity__ 

41 

42 def make_resource_id(self, *args, **kwargs): 

43 return self.name() 

44 

45 def reference_url(self, *args, **kwargs): 

46 raise NotImplementedError() 

47 

48 def fetch_fresh(self, *args, **kwargs): 

49 raise NotImplementedError() 

50 

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 

56 

57 try: 

58 data = self.fetch_fresh(*args, **kwargs) 

59 except Exception as e: 

60 raise ResourceUnavailable() 

61 

62 self._resource_bundle.register(resource_id, data) 

63 return data