Skip to content

Commit 920e38c

Browse files
committed
Add cached lookup for child resources
1 parent 6037fda commit 920e38c

1 file changed

Lines changed: 18 additions & 1 deletion

File tree

src/odin/registration.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from typing import Sequence
2+
13
from odin.utils import getmeta
24

35

@@ -10,6 +12,7 @@ class ResourceCache:
1012
# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66531.
1113
__shared_state = {
1214
"resources": {},
15+
"resource_subclasses": {},
1316
"mappings": {},
1417
"field_resolvers": set(),
1518
"validation_error_handlers": {},
@@ -33,7 +36,7 @@ def register_resources(self, *resources):
3336
if resource_name != class_name:
3437
self.resources[class_name] = resource
3538

36-
def get_resource(self, resource_name):
39+
def get_resource(self, resource_name: str):
3740
"""
3841
Get a resource by name.
3942
@@ -44,6 +47,19 @@ def get_resource(self, resource_name):
4447
"""
4548
return self.resources.get(resource_name.lower())
4649

50+
def get_child_resources(self, resource: type) -> Sequence[type]:
51+
"""
52+
Get subclasses of a resource.
53+
"""
54+
resource_subclasses = self.resource_subclasses.get(resource)
55+
if resource_subclasses is None:
56+
self.resource_subclasses[resource] = resource_subclasses = {
57+
child
58+
for child in self.resources.values()
59+
if issubclass(child, resource)
60+
}
61+
return resource_subclasses
62+
4763
def register_mapping(self, mapping):
4864
"""
4965
Register a mapping
@@ -132,6 +148,7 @@ def get_validation_error_handler(self, error_type):
132148

133149
register_resources = cache.register_resources
134150
get_resource = cache.get_resource
151+
get_child_resources = cache.get_child_resources
135152

136153
register_mapping = cache.register_mapping
137154
get_mapping = cache.get_mapping

0 commit comments

Comments
 (0)