Source code for ebonite.core.analyzer.requirement

from abc import abstractmethod
from typing import List

from ebonite.core.analyzer import Hook
from ebonite.core.objects.requirements import AnyRequirements, Requirement, Requirements, resolve_requirements


[docs]class RequirementAnalyzer: """ Analyzer for RequirementHook hooks """ hooks: List['RequirementHook'] = []
[docs] @classmethod def analyze(cls, obj: AnyRequirements) -> Requirements: """ Run RequirementHook hooks to analyze obj :param obj: objects to analyze :return: Instance of Requirements """ obj = resolve_requirements(obj) to_process = list(obj.requirements) result = [] for hook in cls.hooks: while len(to_process) > 0: req = to_process.pop() if hook.can_process(req): result += hook.process(req).requirements else: result.append(req) to_process = result result = [] return Requirements(to_process)
[docs]class RequirementHook(Hook): _analyzer = RequirementAnalyzer
[docs] def must_process(self, obj: Requirement) -> bool: return self.can_process(obj)
[docs] @abstractmethod def can_process(self, obj: Requirement) -> bool: pass
[docs] @abstractmethod def process(self, obj: Requirement, **kwargs) -> Requirements: pass