diff options
Diffstat (limited to 'app/discover/link_finders/find_links_metadata_parser.py')
-rw-r--r-- | app/discover/link_finders/find_links_metadata_parser.py | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/app/discover/link_finders/find_links_metadata_parser.py b/app/discover/link_finders/find_links_metadata_parser.py new file mode 100644 index 0000000..a1e290c --- /dev/null +++ b/app/discover/link_finders/find_links_metadata_parser.py @@ -0,0 +1,79 @@ +############################################################################### +# Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) # +# and others # +# # +# All rights reserved. This program and the accompanying materials # +# are made available under the terms of the Apache License, Version 2.0 # +# which accompanies this distribution, and is available at # +# http://www.apache.org/licenses/LICENSE-2.0 # +############################################################################### +from utils.metadata_parser import MetadataParser +from utils.util import ClassResolver + + +class FindLinksMetadataParser(MetadataParser): + + FINDERS_FILE = "link_finders.json" + + FINDERS_PACKAGE = "finders_package" + BASE_FINDER = "base_finder" + LINK_FINDERS = "link_finders" + + def __init__(self): + super().__init__() + self.finders_package = None + self.base_finder_class = None + self.base_finder = None + self.link_finders = [] + + def validate_link_finder(self, finder_class): + try: + module_name = ClassResolver.get_module_file_by_class_name(finder_class) + instance = ClassResolver\ + .get_instance_of_class(package_name=self.finders_package, + module_name=module_name, + class_name=finder_class) + + except ValueError: + instance = None + + if instance: + if isinstance(instance, self.base_finder.__class__): + self.link_finders.append(instance) + else: + self.add_error('Link finder "{}" should subclass ' + 'base link finder "{}"' + .format(finder_class, self.base_finder_class)) + else: + self.add_error('Failed to import link finder class "{}"' + .format(finder_class)) + + def validate_metadata(self, metadata: dict): + super().validate_metadata(metadata) + self.finders_package = metadata[self.FINDERS_PACKAGE] + self.base_finder_class = metadata[self.BASE_FINDER] + base_finder_module = ClassResolver\ + .get_module_file_by_class_name(self.base_finder_class) + + try: + self.base_finder = ClassResolver\ + .get_instance_of_class(package_name=self.finders_package, + module_name=base_finder_module, + class_name=self.base_finder_class) + except ValueError: + self.base_finder = None + + if not self.base_finder: + self.add_error("Couldn't create base link finder instance" + "for class name '{}'".format(self.base_finder_class)) + return False + + for link_finder in metadata[self.LINK_FINDERS]: + self.validate_link_finder(finder_class=link_finder) + metadata[self.LINK_FINDERS] = self.link_finders + + return len(self.errors) == 0 + + def get_required_fields(self) -> list: + return [self.FINDERS_PACKAGE, self.BASE_FINDER, self.LINK_FINDERS] + |