diff --git a/learnware/client/learnware_client.py b/learnware/client/learnware_client.py index 4239a7b..c7e99fc 100644 --- a/learnware/client/learnware_client.py +++ b/learnware/client/learnware_client.py @@ -14,7 +14,7 @@ from typing import Union, List from ..config import C from .. import learnware from .container import LearnwaresContainer -from ..market import EasySemanticChecker, EasyStatisticalChecker +from ..market import BaseChecker, EasySemanticChecker, EasyStatChecker, CondaChecker from ..logger import get_module_logger from ..specification import Specification from ..learnware import get_learnware_from_dirpath @@ -386,14 +386,21 @@ class LearnwareClient: @staticmethod def _check_semantic_specification(semantic_spec): - return EasySemanticChecker.check_semantic_spec(semantic_spec) + semantic_checker = EasySemanticChecker() + return semantic_checker(semantic_spec) != BaseChecker.INVALID_LEARNWARE + + @staticmethod + def _check_stat_specification(learnware): + stat_checker = CondaChecker(inner_checker=EasyStatChecker()) + return stat_checker(learnware) != BaseChecker.INVALID_LEARNWARE @staticmethod def check_learnware(learnware_zip_path, semantic_specification=None): semantic_specification = ( get_semantic_specification() if semantic_specification is None else semantic_specification ) - LearnwareClient._check_semantic_specification(semantic_specification) + + assert LearnwareClient._check_semantic_specification(semantic_specification), "Semantic specification check failed!" with tempfile.TemporaryDirectory(prefix="learnware_") as tempdir: with zipfile.ZipFile(learnware_zip_path, mode="r") as z_file: @@ -406,12 +413,7 @@ class LearnwareClient: if learnware is None: raise Exception("The learnware is not valid.") - with LearnwaresContainer(learnware, learnware_zip_path) as env_container: - learnware = env_container.get_learnwares_with_container()[0] - if EasyStatisticalChecker()(learnware) == EasyStatisticalChecker.USABLE_LEARWARE: - logger.info("The learnware passed the local test.") - else: - raise Exception("The learnware is not usable.") + assert LearnwareClient._check_semantic_specification(learnware), "Stas specification check failed!" def cleanup(self): for tempdir in self.tempdir_list: diff --git a/learnware/market/__init__.py b/learnware/market/__init__.py index 7dd1bc6..b20753f 100644 --- a/learnware/market/__init__.py +++ b/learnware/market/__init__.py @@ -2,8 +2,9 @@ from .anchor import AnchoredUserInfo, AnchoredOrganizer from .base import BaseUserInfo, LearnwareMarket, BaseChecker, BaseOrganizer, BaseSearcher from .evolve_anchor import EvolvedAnchoredOrganizer from .evolve import EvolvedOrganizer -from .easy2 import EasyOrganizer, EasySearcher, EasySemanticChecker, EasyStatisticalChecker +from .easy2 import EasyOrganizer, EasySearcher, EasySemanticChecker, EasyStatChecker from .hetergeneous import HeterogeneousOrganizer, MappingFunction from .easy import EasyMarket from .module import instatiate_learnware_market +from .classes import CondaChecker \ No newline at end of file diff --git a/learnware/market/classes.py b/learnware/market/classes.py new file mode 100644 index 0000000..65261a3 --- /dev/null +++ b/learnware/market/classes.py @@ -0,0 +1,19 @@ +from .base import BaseChecker, BaseOrganizer +from ..learnware import Learnware +from ..client.container import LearnwaresContainer + + +class CondaChecker(BaseChecker): + def __init__(self, inner_checker, **kwargs): + self.inner_checker = inner_checker + super(CondaChecker, self).__init__(**kwargs) + + def __call__(self, learnware: Learnware) -> int: + + with LearnwaresContainer(learnware) as env_container: + learnwares = env_container.get_learnwares_with_container() + if len(learnwares) == 0: + raise AssertionError(f"The env of learnware {learnware} installed failed") + check_status = self.inner_checker(learnware[0]) + + return check_status \ No newline at end of file diff --git a/learnware/market/easy2/__init__.py b/learnware/market/easy2/__init__.py index 2178119..2835871 100644 --- a/learnware/market/easy2/__init__.py +++ b/learnware/market/easy2/__init__.py @@ -1,3 +1,3 @@ from .organizer import EasyOrganizer from .searcher import EasySearcher -from .checker import EasySemanticChecker, EasyStatisticalChecker +from .checker import EasySemanticChecker, EasyStatChecker diff --git a/learnware/market/easy2/checker.py b/learnware/market/easy2/checker.py index fa8f26c..4b67157 100644 --- a/learnware/market/easy2/checker.py +++ b/learnware/market/easy2/checker.py @@ -51,7 +51,7 @@ class EasySemanticChecker(BaseChecker): return EasySemanticChecker.NONUSABLE_LEARNWARE - except Exception as err: + except AssertionError as err: logger.warning(f"semantic_specification is not valid due to {err}!") return EasySemanticChecker.INVALID_LEARNWARE @@ -60,7 +60,7 @@ class EasySemanticChecker(BaseChecker): return self.check_semantic_spec(semantic_spec) -class EasyStatisticalChecker(BaseChecker): +class EasyStatChecker(BaseChecker): def __call__(self, learnware): semantic_spec = learnware.get_specification().get_semantic_spec() diff --git a/learnware/market/module.py b/learnware/market/module.py index 57821cd..7c2aedf 100644 --- a/learnware/market/module.py +++ b/learnware/market/module.py @@ -1,11 +1,11 @@ from .base import LearnwareMarket -from .easy2 import EasyOrganizer, EasySearcher, EasySemanticChecker, EasyStatisticalChecker +from .easy2 import EasyOrganizer, EasySearcher, EasySemanticChecker, EasyStatChecker MARKET_CONFIG = { "easy": { "organizer": EasyOrganizer(), "searcher": EasySearcher(), - "checker_list": [EasySemanticChecker(), EasyStatisticalChecker()], + "checker_list": [EasySemanticChecker(), EasyStatChecker()], } }