Source code for crytic_compile.platform.abstract_platform

"""
Abstract Platform
"""
import abc
from typing import TYPE_CHECKING, List

from crytic_compile.platform import Type
from crytic_compile.utils.unit_tests import guess_tests

if TYPE_CHECKING:
    from crytic_compile import CryticCompile


[docs]class IncorrectPlatformInitialization(Exception): """ Exception raises if a platform was not properly defined """ pass
[docs]class AbstractPlatform(metaclass=abc.ABCMeta): """ This is the abstract class for the platform """ NAME: str = "" PROJECT_URL: str = "" TYPE: Type = Type.NOT_IMPLEMENTED HIDE = False # True if the class is not meant for direct user manipulation def __init__(self, target: str, **kwargs: str): if not self.NAME: raise IncorrectPlatformInitialization( "NAME is not initialized {}".format(self.__class__.__name__) ) if not self.PROJECT_URL: raise IncorrectPlatformInitialization( "PROJECT_URL is not initialized {}".format(self.__class__.__name__) ) if self.TYPE == Type.NOT_IMPLEMENTED: raise IncorrectPlatformInitialization( "TYPE is not initialized {}".format(self.__class__.__name__) ) self._target: str = target # region Properties. ################################################################################### ################################################################################### # The properties might be different from the class value # For example the archive will return the underlying platform values @property def target(self) -> str: """ Return the target name :return: """ return self._target @property def platform_name_used(self) -> str: """ Return the underlying platform used :return: """ return self.NAME @property def platform_project_url_used(self) -> str: """ Return the underlying platform url used :return: """ return self.PROJECT_URL @property def platform_type_used(self) -> Type: """ Return the underlying platform url used :return: """ return self.TYPE # endregion ################################################################################### ################################################################################### # region Abstract methods ################################################################################### ###################################################################################
[docs] @abc.abstractmethod def compile(self, crytic_compile: "CryticCompile", **kwargs: str): """ Run the compilation :param crytic_compile: :param kwargs: :return: """ return
[docs] @staticmethod @abc.abstractmethod def is_supported(target: str, **kwargs: str) -> bool: """ Check if the target is a project supported by this platform :param target: :return: """ return False
[docs] @abc.abstractmethod def is_dependency(self, path: str) -> bool: """ Check if the target is a dependency :param path: :return: """ return False
# Only _guessed_tests is an abstract method # guessed_tests will call the generic guess_tests and appends to the list # platforms-dependent tests @abc.abstractmethod def _guessed_tests(self) -> List[str]: """ Guess the potential unit tests commands :return: """ return []
[docs] def guessed_tests(self) -> List[str]: """ Guess the potential unit tests commands :return: list of unit tests command guessed """ return guess_tests(self._target) + self._guessed_tests()
# endregion ################################################################################### ###################################################################################