From 92f5679335d6e02bcfa713d08b6d4310efa6a620 Mon Sep 17 00:00:00 2001 From: Jesper Friis Date: Fri, 18 Nov 2022 20:00:56 +0100 Subject: [PATCH] Updated the function strategy. Create an explicit instance of ASEDliteConfig to make optional attributes available. This is needed, since `self.function_config.configuration` is an AttrDict and not an ASEDliteConfig. --- oteapi_asmod/strategies/function.py | 20 ++++++++++---------- tests/test_function.py | 11 ++++++++--- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/oteapi_asmod/strategies/function.py b/oteapi_asmod/strategies/function.py index c80724d..8876e70 100644 --- a/oteapi_asmod/strategies/function.py +++ b/oteapi_asmod/strategies/function.py @@ -1,10 +1,10 @@ """Function strategy class for mapping ase.Atoms to dlite metadata.""" -# pylint: disable=no-self-use,unused-argument +# pylint: disable=unused-argument import pathlib from dataclasses import dataclass from typing import TYPE_CHECKING, Optional, Union -from dlite import Instance, get_collection +from dlite import Instance, get_instance from oteapi.datacache import DataCache from oteapi.models import AttrDict, DataCacheConfig, FunctionConfig, SessionUpdate from pydantic import Field, HttpUrl @@ -91,22 +91,22 @@ def get(self, session: "Dict" = None) -> SessionUpdateASEDliteFunction: Returns SessionUpdate() """ - model = self.function_config + config = ASEDliteConfig(**self.function_config.configuration) # There should be a local folder with entitites at least until onto-ns is up # dlite.storage_path.append(str(pathlib.Path(__file__).parent.resolve())) # Create dlite instance of metadata - moleculemodel = Instance.create_from_url( - "json://" + str(model.datamodel), + moleculemodel = Instance.from_url( + "json://" + str(config.datamodel), ) # DLite Metadata # Get ase.Atoms obejct from cache - cache = DataCache(model.datacache_config) - atoms = cache.get(model.datacacheKey) + cache = DataCache(config.datacache_config) + atoms = cache.get(config.datacacheKey) # Creat dlite instance from metadata and populate - inst = moleculemodel(dims=[len(atoms), 3], id=model.label) # DLite instance + inst = moleculemodel(dims=[len(atoms), 3], id=config.label) # DLite instance inst.symbols = atoms.get_chemical_symbols() inst.masses = atoms.get_masses() inst.positions = atoms.positions @@ -114,10 +114,10 @@ def get(self, session: "Dict" = None) -> SessionUpdateASEDliteFunction: # Get collection from session and place molecule in it if session is not None: - coll = get_collection(session["collection_id"]) + coll = get_instance(session["collection_id"]) else: raise OteapiAsmodError("Missing session") - coll.add(label=model.label, inst=inst) + coll.add(label=config.label, inst=inst) return SessionUpdateASEDliteFunction(collection_id=session["collection_id"]) diff --git a/tests/test_function.py b/tests/test_function.py index 51f8fb6..09385bb 100644 --- a/tests/test_function.py +++ b/tests/test_function.py @@ -13,7 +13,7 @@ def test_ASEDlite( # pylint: disable=invalid-name, too-many-locals from oteapi.models.resourceconfig import ResourceConfig from oteapi_asmod.strategies.function import ( - ASEDliteConfig, + ASEDliteFunctionConfig, ASEDliteFunctionStrategy, ) from oteapi_asmod.strategies.parse import AtomisticStructureParseStrategy @@ -38,8 +38,13 @@ def test_ASEDlite( # pylint: disable=invalid-name, too-many-locals session.update(SessionUpdate(collection_id=coll.uuid)) # Define configuration for the function modelpath = repo_dir / "tests" / "testfiles" / "Molecule.json" - config2 = ASEDliteConfig( - label="molecule", datacacheKey=parsed_atoms_key, datamodel=modelpath + config2 = ASEDliteFunctionConfig( + functionType="asedlite/atoms", + configuration={ + "label": "molecule", + "datacacheKey": parsed_atoms_key, + "datamodel": modelpath, + }, ) # Instantiate function