in liminal/core/util/class_util.py [0:0]
def find_subclasses_in_packages(packages, parent_class):
"""
Finds all subclasses of given parent class within given packages
:return: map of module ref -> class
"""
module_content = {}
for p in packages:
module_content.update(import_module(p))
subclasses = set()
work = [parent_class]
while work:
parent = work.pop()
for child in parent.__subclasses__():
if child not in subclasses:
work.append(child)
# verify that the found class is in the relevant module
for p in packages:
if p in child.__module__:
subclasses.add(child)
break
return {sc.__module__.split(".")[-1]: sc for sc in subclasses}