From 0eeef04be692d1a41840b82c4583a2c6c74692a1 Mon Sep 17 00:00:00 2001 From: Ilia Abashin Date: Sun, 3 Sep 2017 17:11:34 +0300 Subject: Require link finders to subclass base FindLinks class Change-Id: I1f82c311b4ab4bb9b40327040b409d265d66d68a Signed-off-by: Ilia Abashin --- .../link_finders/find_links_metadata_parser.py | 38 +++++++++++++++++----- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/app/discover/link_finders/find_links_metadata_parser.py b/app/discover/link_finders/find_links_metadata_parser.py index 1f28262..a1e290c 100644 --- a/app/discover/link_finders/find_links_metadata_parser.py +++ b/app/discover/link_finders/find_links_metadata_parser.py @@ -1,3 +1,12 @@ +############################################################################### +# 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 @@ -13,6 +22,7 @@ class FindLinksMetadataParser(MetadataParser): def __init__(self): super().__init__() self.finders_package = None + self.base_finder_class = None self.base_finder = None self.link_finders = [] @@ -23,11 +33,17 @@ class FindLinksMetadataParser(MetadataParser): .get_instance_of_class(package_name=self.finders_package, module_name=module_name, class_name=finder_class) + except ValueError: instance = None if instance: - self.link_finders.append(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)) @@ -35,16 +51,22 @@ class FindLinksMetadataParser(MetadataParser): def validate_metadata(self, metadata: dict): super().validate_metadata(metadata) self.finders_package = metadata[self.FINDERS_PACKAGE] - self.base_finder = metadata[self.BASE_FINDER] + self.base_finder_class = metadata[self.BASE_FINDER] base_finder_module = ClassResolver\ - .get_module_file_by_class_name(self.base_finder) + .get_module_file_by_class_name(self.base_finder_class) - base_finder_class = ClassResolver.get_class_name_by_module( - ".".join((self.finders_package, base_finder_module))) + 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 base_finder_class: - self.add_error("Couldn't find base link finder class") - return + 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) -- cgit 1.2.3-korg