Source code for pycodeanalyzer.core.languages.filedispatcher

import pathlib
from typing import List, Tuple

from injector import inject, singleton

from pycodeanalyzer.core.abstraction.objects import (
    AbstractObject,
    compareAbstractObject,
)
from pycodeanalyzer.core.languages.analyzers.cppanalyzer import CppAnalyzer
from pycodeanalyzer.core.languages.analyzers.javaanalyzer import JavaAnalyzer
from pycodeanalyzer.core.languages.analyzers.kotlinanalyzer import KotlinAnalyzer
from pycodeanalyzer.core.languages.analyzers.pythonanalyzer import PythonAnalyzer
from pycodeanalyzer.core.languages.extensions import languageExtensions
from pycodeanalyzer.core.logging.loggerfactory import LoggerFactory
from pycodeanalyzer.ui.app import UiFileDispatcherListener


[docs]@singleton class FileDispatcher: """File dispatcher. This class allow to dispatch fetched files to the correct language analyzer. """ @inject def __init__( self, cppAnalyzer: CppAnalyzer, pythonAnalyzer: PythonAnalyzer, javaAnalyzer: JavaAnalyzer, kotlinAnalyzer: KotlinAnalyzer, uiListener: UiFileDispatcherListener, ) -> None: self.logger = LoggerFactory.createLogger(__name__) self.cppAnalyzer = cppAnalyzer self.pythonAnalyzer = pythonAnalyzer self.javaAnalyzer = javaAnalyzer self.kotlinAnalyzer = kotlinAnalyzer self.uiListener = uiListener
[docs] def dispatchRoots(self, roots: List[Tuple[str, List[str]]]) -> List[AbstractObject]: self.logger.debug("start file dispatching") abstractObjects: List[AbstractObject] = [] for rootDir, files in roots: abstractObjects.extend(self.dispatch(rootDir, files)) self.logger.debug("end file dispatching") self.uiListener.notifyAnalysisEnd() return self.sortObjects(abstractObjects)
[docs] def dispatch(self, rootDir: str, files: List[str]) -> List[AbstractObject]: abstractObjects = [] for file in files: extension = pathlib.Path(file).suffix language = None if extension in languageExtensions.keys(): language = languageExtensions[extension] if language == "CPP": self.uiListener.notifyAnalyzing(file) abstractObjects += self.cppAnalyzer.analyze(rootDir, file) if language == "PYTHON": self.uiListener.notifyAnalyzing(file) abstractObjects += self.pythonAnalyzer.analyze(rootDir, file) if language == "JAVA": self.uiListener.notifyAnalyzing(file) abstractObjects += self.javaAnalyzer.analyze(rootDir, file) if language == "KOTLIN": self.uiListener.notifyAnalyzing(file) abstractObjects += self.kotlinAnalyzer.analyze(rootDir, file) return abstractObjects
[docs] def sortObjects( self, abstractObjects: List[AbstractObject] ) -> List[AbstractObject]: return sorted(abstractObjects, key=compareAbstractObject)