1+ from typing import Sequence
2+
13from 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
133149register_resources = cache .register_resources
134150get_resource = cache .get_resource
151+ get_child_resources = cache .get_child_resources
135152
136153register_mapping = cache .register_mapping
137154get_mapping = cache .get_mapping
0 commit comments