Source code for tooldog.analyse.tool_analyzer

#!/usr/bin/env python3

import logging

from .code_collector import CodeCollector
from .language_analyzer import PythonAnalyzer

LOGGER = logging.getLogger(__name__)


[docs]class ToolAnalyzer(object): """ Class to perform appropriate source code analysis of a tool. """
[docs] def __init__(self, biotool, gen_format, language=None, source_code=None): """ :param biotool: Biotool object :type biotool: :class:`tooldog.biotool_model.Biotool` :param gen_format: tool descriptor language (Galaxy XML or CWL) :type gen_format: STRING :param language: language of the tool :type language: STRING :param source_code: path to source code :type source_code: STRING """ self.biotool = biotool self.gen_format = gen_format self.language = language self.source_code = source_code self.output = ''
def _analyse_python(self): """ Perform analysis of Python. """ pa = PythonAnalyzer(self.gen_format, self.source_code) return pa.analyse() def _analyse_no_language(self): """ Warning message to mention that no language was specified in bio.tools. In the future, we can imagine that a code analysis will be perform to check what is the coding language. """ LOGGER.warn("Language was not specified for this tool on https://bio.tools. " + "This feature is not processed for the moment.") def _analyse_multi_languages(self): """ Warning message to mention that more than one language was given in bio.tools. In the future, need to find which language is the main language of the tool (at least the one used to run the tool). """ LOGGER.warn("This tool is decribed as using more than one language. " + "This feature is not processed for the moment.")
[docs] def set_language(self): """ Set the language attribute of the object based on the https://bio.tools description. """ language = self.biotool.informations.language if len(language) > 1: self.language = "multi_languages" elif len(language) == 1: self.language = language[0] else: self.language = "no_language"
[docs] def get_source(self): """ Get source code to give to analyzer. """ # At the end of this method, self.source_code should point to directory or archive cc = CodeCollector(self.biotool) source = cc.get_source() if source is not None: self.source_code = source
[docs] def run_analysis(self): """ Method to run analysis of source code of the entry. """ output = None if self.source_code is None: self.get_source() if self.source_code is not None: if self.language is None: self.set_language() language = self.language.lower().translate(str.maketrans(' ', '_')) try: output = getattr(self, '_analyse_{}'.format(language))() except AttributeError: LOGGER.warn(language + " language is not processed yet by ToolDog.") # Need to return the generated code here return output