From 9831e4198f4c7666385ea4b46f20cfb956b4938a Mon Sep 17 00:00:00 2001 From: francescalb Date: Tue, 9 May 2023 22:23:03 +0200 Subject: [PATCH 01/10] Started on writing a strategy for adding and instance to a coll --- oteapi_dlite/strategies/add_instance.py | 97 +++++++++++++++++++++++++ setup.cfg | 2 + tests/strategies/test_addinstance.py | 34 +++++++++ 3 files changed, 133 insertions(+) create mode 100644 oteapi_dlite/strategies/add_instance.py create mode 100644 tests/strategies/test_addinstance.py diff --git a/oteapi_dlite/strategies/add_instance.py b/oteapi_dlite/strategies/add_instance.py new file mode 100644 index 00000000..ce68fe55 --- /dev/null +++ b/oteapi_dlite/strategies/add_instance.py @@ -0,0 +1,97 @@ +"""Generic function strategy using DLite storage plugin.""" +# pylint: disable=unused-argument,invalid-name +import tempfile +from typing import TYPE_CHECKING, Optional + +from oteapi.datacache import DataCache +from oteapi.models import ( + AttrDict, + DataCacheConfig, + FunctionConfig, + SessionUpdate, +) +from pydantic import Field +from pydantic.dataclasses import dataclass + +from oteapi_dlite.models import DLiteSessionUpdate +from oteapi_dlite.utils import get_collection, get_driver + +if TYPE_CHECKING: + from typing import Any, Dict + + from oteapi.interfaces import IFunctionStrategy + + +class AddInstanceConfig(AttrDict): + """Configuration for adding an instance to the collection. + """ + + datamodel: str = Field( + description='ID (URI or UUID) of the datamodel.', + ) + value: dict = Field( + description='Dict with instance values.', + ) + label: str = Field( + ..., + description="Label of DLite instance to serialise in the collection.", + ) + + +class DLiteAddInstanceConfig(FunctionConfig): + """DLite function strategy config.""" + + configuration: AddInstanceConfig = Field( + ..., description="Strategy-specific configuration for adding + and instance to the collection." + ) + + +@dataclass +class DLiteAddInstanceStrategy: + """DLite function strategy to add an Instance to the collection. + + **Registers strategies**: + + - `("mediaType", "application/vnd.dlite-addinstance")` + + """ + + function_config: DLiteAddInstanceConfig + + def initialize( + self, + session: "Optional[Dict[str, Any]]" = None, + ) -> "SessionUpdate": + """Initialize.""" + return SessionUpdate() + + def get( + self, session: "Optional[Dict[str, Any]]" = None + ) -> "DLiteSessionUpdate": + """Execute the strategy. + + This method will be called through the strategy-specific endpoint + of the OTE-API Services. + + Parameters: + session: A session-specific dictionary context. + + Returns: + SessionUpdate instance. + """ + config = self.function_config.configuration + cacheconfig = config.datacache_config + + + coll = get_collection(session) + inst = dlite.get_instance(config.datamodel) + inst.from_dict(config.value) + inst.label(config.label) + + coll.add(inst) + + return DLiteSessionUpdate(collection_id=coll.uuid) + + +# DLiteStorageConfig.update_forward_refs() diff --git a/setup.cfg b/setup.cfg index 46d2d074..d32cab2a 100644 --- a/setup.cfg +++ b/setup.cfg @@ -30,6 +30,8 @@ oteapi.parse = oteapi.function = oteapi_dlite.application/vnd.dlite-generate = oteapi_dlite.strategies.function:DLiteFunctionStrategy + oteapi_dlite.application/vnd.dlite-addinstance = oteapi_dlite.strategies.function:DLiteAddInstaceStrategy + oteapi.mapping = oteapi_dlite.mappings = oteapi_dlite.strategies.mapping:DLiteMappingStrategy diff --git a/tests/strategies/test_addinstance.py b/tests/strategies/test_addinstance.py new file mode 100644 index 00000000..fd416a8a --- /dev/null +++ b/tests/strategies/test_addinstance.py @@ -0,0 +1,34 @@ +"""Tests add instance strategy.""" +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from oteapi.interfaces import IFilterStrategy + + +def test_create_collection() -> None: + """Test the create_collection filter.""" + import dlite + + from oteapi_dlite.strategies.function import DLiteAddInstanceStrategy + + # Need to add storage + # Need to + config = {"datamodel": "some uuid", + "value": a dict, + "label": "name"} + + + session = {} + + collfunction: "IFunctionStrategy" = DLiteAddInstanceStrategy(config) + session.update(collfunction.initialize(session)) + + assert "collection_id" in session + coll_id = session["collection_id"] + coll = dlite.get_collection(coll_id) + assert isinstance(coll, dlite.Collection) + + collfunction = DLiteAddInstanceStrategy(config) + session.update(collfunction.get(session)) + assert "collection_id" in session + assert session["collection_id"] == coll_id From 0d35ba142401121a6fd9f6f705b28b074d97a2e6 Mon Sep 17 00:00:00 2001 From: Jesper Friis Date: Tue, 9 May 2023 23:26:32 +0200 Subject: [PATCH 02/10] Updated add_instance.py Added test_add_instance.py --- oteapi_dlite/strategies/add_instance.py | 16 ++++---- tests/strategies/test_add_instance.py | 53 +++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 8 deletions(-) create mode 100644 tests/strategies/test_add_instance.py diff --git a/oteapi_dlite/strategies/add_instance.py b/oteapi_dlite/strategies/add_instance.py index ce68fe55..a8aa5ab7 100644 --- a/oteapi_dlite/strategies/add_instance.py +++ b/oteapi_dlite/strategies/add_instance.py @@ -13,6 +13,9 @@ from pydantic import Field from pydantic.dataclasses import dataclass +import dlite +from dlite.utils import infer_dimensions + from oteapi_dlite.models import DLiteSessionUpdate from oteapi_dlite.utils import get_collection, get_driver @@ -45,7 +48,7 @@ class DLiteAddInstanceConfig(FunctionConfig): ..., description="Strategy-specific configuration for adding and instance to the collection." ) - + @dataclass class DLiteAddInstanceStrategy: @@ -81,16 +84,13 @@ def get( SessionUpdate instance. """ config = self.function_config.configuration - cacheconfig = config.datacache_config - coll = get_collection(session) - inst = dlite.get_instance(config.datamodel) - inst.from_dict(config.value) - inst.label(config.label) - + datamodel = dlite.get_instance(config.datamodel) + dims = infer_dimensions(datamodel, config.value, strict=True) + inst = datamodel(dimensions=dims, properties=config.value) coll.add(inst) - + return DLiteSessionUpdate(collection_id=coll.uuid) diff --git a/tests/strategies/test_add_instance.py b/tests/strategies/test_add_instance.py new file mode 100644 index 00000000..80edcf38 --- /dev/null +++ b/tests/strategies/test_add_instance.py @@ -0,0 +1,53 @@ +"""Test script for the add_instance strategy - tested via otelib.""" +import os +from pathlib import Path + +import dlite + +from tripper import EMMO, MAP, Namespace + +from otelib import OTEClient + + +# Paths +thisdir = Path(__file__).resolve().parent +testdir = thisdir.parent +entitydir = testdir / "entities" +outdir = testdir / "output" + +os.makedirs(outdir, exist_ok=True) +dlite.storage_path.append(entitydir) + + +# Create OTE client +client = OTEClient("python") + +value = { + "potential_energy": 3.2e-19, + "forces": [ + [1.2, 2.3, 3.4], + [0.2, 3.4, 4.5], + ], +} + +add_instance = client.create_function( + functionType="application/vnd.dlite-addinstance", + configuration={ + "datamodel": "http://onto-ns.com/meta/0.1/Result", + "value": value, + "label": "result", + }, +) + +generate = client.create_function( + functionType="application/vnd.dlite-generate", + configuration={ + "driver": "json", + "location": "{outdir}/test_add_instance.json", + "options": "mode=w", + "label": "result", + }, +) + +pipeline = add_instance >> generate +pipeline.get() From 225b36a99ee08af2ec06c37b6c6a93275b411218 Mon Sep 17 00:00:00 2001 From: Jesper Friis Date: Wed, 10 May 2023 00:24:55 +0200 Subject: [PATCH 03/10] Added `dimensions` as an optional configuration --- oteapi_dlite/strategies/add_instance.py | 16 ++++++++++++---- tests/strategies/test_add_instance.py | 12 +++++------- tests/strategies/test_addinstance.py | 8 ++++---- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/oteapi_dlite/strategies/add_instance.py b/oteapi_dlite/strategies/add_instance.py index a8aa5ab7..be331b16 100644 --- a/oteapi_dlite/strategies/add_instance.py +++ b/oteapi_dlite/strategies/add_instance.py @@ -32,8 +32,13 @@ class AddInstanceConfig(AttrDict): datamodel: str = Field( description='ID (URI or UUID) of the datamodel.', ) - value: dict = Field( - description='Dict with instance values.', + values: dict = Field( + description='Dict with property values.', + ) + dimensions: 'Optional[dict]' = Field( + None, + description='Dict with dimension values. If not provided, the ' + 'dimensions will be inferred from `values`.', ) label: str = Field( ..., @@ -87,8 +92,11 @@ def get( coll = get_collection(session) datamodel = dlite.get_instance(config.datamodel) - dims = infer_dimensions(datamodel, config.value, strict=True) - inst = datamodel(dimensions=dims, properties=config.value) + if config.dimensions is None: + dims = infer_dimensions(datamodel, config.values, strict=True) + else: + dims = config.dimensions + inst = datamodel(dimensions=dims, properties=config.values) coll.add(inst) return DLiteSessionUpdate(collection_id=coll.uuid) diff --git a/tests/strategies/test_add_instance.py b/tests/strategies/test_add_instance.py index 80edcf38..ad13bc83 100644 --- a/tests/strategies/test_add_instance.py +++ b/tests/strategies/test_add_instance.py @@ -4,8 +4,6 @@ import dlite -from tripper import EMMO, MAP, Namespace - from otelib import OTEClient @@ -19,10 +17,7 @@ dlite.storage_path.append(entitydir) -# Create OTE client -client = OTEClient("python") - -value = { +values = { "potential_energy": 3.2e-19, "forces": [ [1.2, 2.3, 3.4], @@ -30,11 +25,14 @@ ], } +# Create OTE client +client = OTEClient("python") + add_instance = client.create_function( functionType="application/vnd.dlite-addinstance", configuration={ "datamodel": "http://onto-ns.com/meta/0.1/Result", - "value": value, + "values": values, "label": "result", }, ) diff --git a/tests/strategies/test_addinstance.py b/tests/strategies/test_addinstance.py index fd416a8a..4eab6eb6 100644 --- a/tests/strategies/test_addinstance.py +++ b/tests/strategies/test_addinstance.py @@ -10,13 +10,13 @@ def test_create_collection() -> None: import dlite from oteapi_dlite.strategies.function import DLiteAddInstanceStrategy - + # Need to add storage - # Need to + # Need to config = {"datamodel": "some uuid", - "value": a dict, + "values": a dict, "label": "name"} - + session = {} From 99d070365b3a4c35a9f91c8b52447f2852afa7a4 Mon Sep 17 00:00:00 2001 From: francescalb Date: Mon, 22 May 2023 07:44:39 +0200 Subject: [PATCH 04/10] Some fixes --- docs/api_reference/strategies/add_instance.md | 3 ++ oteapi_dlite/strategies/add_instance.py | 47 ++++++++----------- oteapi_dlite/strategies/function.py | 1 + setup.cfg | 2 +- tests/output/test_add_instance.json | 13 +++++ tests/strategies/test_add_instance.py | 7 ++- tests/strategies/test_addinstance.py | 34 -------------- 7 files changed, 41 insertions(+), 66 deletions(-) create mode 100644 docs/api_reference/strategies/add_instance.md create mode 100644 tests/output/test_add_instance.json delete mode 100644 tests/strategies/test_addinstance.py diff --git a/docs/api_reference/strategies/add_instance.md b/docs/api_reference/strategies/add_instance.md new file mode 100644 index 00000000..9a73f314 --- /dev/null +++ b/docs/api_reference/strategies/add_instance.md @@ -0,0 +1,3 @@ +# add_instance + +::: oteapi_dlite.strategies.add_instance diff --git a/oteapi_dlite/strategies/add_instance.py b/oteapi_dlite/strategies/add_instance.py index be331b16..ab8901a3 100644 --- a/oteapi_dlite/strategies/add_instance.py +++ b/oteapi_dlite/strategies/add_instance.py @@ -1,23 +1,15 @@ """Generic function strategy using DLite storage plugin.""" # pylint: disable=unused-argument,invalid-name -import tempfile from typing import TYPE_CHECKING, Optional -from oteapi.datacache import DataCache -from oteapi.models import ( - AttrDict, - DataCacheConfig, - FunctionConfig, - SessionUpdate, -) -from pydantic import Field -from pydantic.dataclasses import dataclass - import dlite from dlite.utils import infer_dimensions +from oteapi.models import AttrDict, FunctionConfig, SessionUpdate +from pydantic import Field +from pydantic.dataclasses import dataclass from oteapi_dlite.models import DLiteSessionUpdate -from oteapi_dlite.utils import get_collection, get_driver +from oteapi_dlite.utils import get_collection, update_collection if TYPE_CHECKING: from typing import Any, Dict @@ -26,19 +18,18 @@ class AddInstanceConfig(AttrDict): - """Configuration for adding an instance to the collection. - """ + """Configuration for adding an instance to the collection.""" datamodel: str = Field( - description='ID (URI or UUID) of the datamodel.', + description="ID (URI or UUID) of the datamodel.", ) - values: dict = Field( - description='Dict with property values.', + property_values: dict = Field( + description="Dict with property values.", ) - dimensions: 'Optional[dict]' = Field( + dimensions: "Optional[dict]" = Field( None, - description='Dict with dimension values. If not provided, the ' - 'dimensions will be inferred from `values`.', + description="Dict with dimension values. If not provided, the " + "dimensions will be inferred from `values`.", ) label: str = Field( ..., @@ -50,8 +41,9 @@ class DLiteAddInstanceConfig(FunctionConfig): """DLite function strategy config.""" configuration: AddInstanceConfig = Field( - ..., description="Strategy-specific configuration for adding - and instance to the collection." + ..., + description="Strategy-specific configuration for adding " + "an instance to the collection.", ) @@ -93,13 +85,14 @@ def get( coll = get_collection(session) datamodel = dlite.get_instance(config.datamodel) if config.dimensions is None: - dims = infer_dimensions(datamodel, config.values, strict=True) + dims = infer_dimensions( + datamodel, config.property_values, strict=True + ) else: dims = config.dimensions inst = datamodel(dimensions=dims, properties=config.values) - coll.add(inst) - return DLiteSessionUpdate(collection_id=coll.uuid) + coll.add(label=config.label, inst=inst) - -# DLiteStorageConfig.update_forward_refs() + update_collection(coll) + return DLiteSessionUpdate(collection_id=coll.uuid) diff --git a/oteapi_dlite/strategies/function.py b/oteapi_dlite/strategies/function.py index 6b54e0ce..736f8754 100644 --- a/oteapi_dlite/strategies/function.py +++ b/oteapi_dlite/strategies/function.py @@ -115,6 +115,7 @@ def get( ) coll = get_collection(session, config.collection_id) + inst = coll[config.label] # Save instance diff --git a/setup.cfg b/setup.cfg index 489b87db..1dfea551 100644 --- a/setup.cfg +++ b/setup.cfg @@ -30,7 +30,7 @@ oteapi.parse = oteapi.function = oteapi_dlite.application/vnd.dlite-generate = oteapi_dlite.strategies.function:DLiteFunctionStrategy - oteapi_dlite.application/vnd.dlite-addinstance = oteapi_dlite.strategies.function:DLiteAddInstaceStrategy + oteapi_dlite.application/vnd.dlite-addinstance = oteapi_dlite.strategies.add_instance:DLiteAddInstanceStrategy oteapi.mapping = diff --git a/tests/output/test_add_instance.json b/tests/output/test_add_instance.json new file mode 100644 index 00000000..44388dbe --- /dev/null +++ b/tests/output/test_add_instance.json @@ -0,0 +1,13 @@ +{ + "7bad2efc-cb40-420b-aef9-2f909d038b46": { + "meta": "http://onto-ns.com/meta/0.1/Result", + "dimensions": { + "natoms": 2, + "ncoords": 3 + }, + "properties": { + "potential_energy": 0, + "forces": [[0, 0, 0], [0, 0, 0]] + } + } +} diff --git a/tests/strategies/test_add_instance.py b/tests/strategies/test_add_instance.py index ad13bc83..f462d93e 100644 --- a/tests/strategies/test_add_instance.py +++ b/tests/strategies/test_add_instance.py @@ -3,10 +3,8 @@ from pathlib import Path import dlite - from otelib import OTEClient - # Paths thisdir = Path(__file__).resolve().parent testdir = thisdir.parent @@ -32,16 +30,17 @@ functionType="application/vnd.dlite-addinstance", configuration={ "datamodel": "http://onto-ns.com/meta/0.1/Result", - "values": values, + "property_values": values, "label": "result", }, ) + generate = client.create_function( functionType="application/vnd.dlite-generate", configuration={ "driver": "json", - "location": "{outdir}/test_add_instance.json", + "location": f"{outdir}/test_add_instance.json", "options": "mode=w", "label": "result", }, diff --git a/tests/strategies/test_addinstance.py b/tests/strategies/test_addinstance.py deleted file mode 100644 index 4eab6eb6..00000000 --- a/tests/strategies/test_addinstance.py +++ /dev/null @@ -1,34 +0,0 @@ -"""Tests add instance strategy.""" -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - from oteapi.interfaces import IFilterStrategy - - -def test_create_collection() -> None: - """Test the create_collection filter.""" - import dlite - - from oteapi_dlite.strategies.function import DLiteAddInstanceStrategy - - # Need to add storage - # Need to - config = {"datamodel": "some uuid", - "values": a dict, - "label": "name"} - - - session = {} - - collfunction: "IFunctionStrategy" = DLiteAddInstanceStrategy(config) - session.update(collfunction.initialize(session)) - - assert "collection_id" in session - coll_id = session["collection_id"] - coll = dlite.get_collection(coll_id) - assert isinstance(coll, dlite.Collection) - - collfunction = DLiteAddInstanceStrategy(config) - session.update(collfunction.get(session)) - assert "collection_id" in session - assert session["collection_id"] == coll_id From 77736cc5132b6ae8b4bd4988b8375e0f3358b99f Mon Sep 17 00:00:00 2001 From: francescalb Date: Mon, 22 May 2023 07:57:02 +0200 Subject: [PATCH 05/10] Added otelib in dev requirements --- requirements_dev.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements_dev.txt b/requirements_dev.txt index 7a722b18..f0aca7f1 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -1,3 +1,4 @@ +otelib~=0.3.0 pre-commit~=3.2 pylint~=2.17 pytest~=7.3 From 1a136d32a3a9f63f3a4ebcc6767ad7937b11f140 Mon Sep 17 00:00:00 2001 From: Jesper Friis Date: Thu, 13 Jul 2023 18:58:20 +0200 Subject: [PATCH 06/10] Updated doc index --- docs/index.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/index.md b/docs/index.md index 77c4c14c..cd70c6ca 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,3 +1,6 @@ +[![DOI](https://zenodo.org/badge/455070691.svg)](https://zenodo.org/badge/latestdoi/455070691) + + # OTEAPI DLite Plugin All strategies implemented in this plugin (except for `create_collection`) assumes that you have the UUID of a DLite collection with the key `collection_id` in the `session`: From 72a4b2f127a40704f186aca78d266128f3efb7b9 Mon Sep 17 00:00:00 2001 From: Jesper Friis Date: Thu, 13 Jul 2023 19:13:59 +0200 Subject: [PATCH 07/10] Also test result after running the pipeline --- tests/strategies/test_add_instance.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/strategies/test_add_instance.py b/tests/strategies/test_add_instance.py index f462d93e..523d56f9 100644 --- a/tests/strategies/test_add_instance.py +++ b/tests/strategies/test_add_instance.py @@ -3,6 +3,7 @@ from pathlib import Path import dlite +import numpy as np from otelib import OTEClient # Paths @@ -48,3 +49,11 @@ pipeline = add_instance >> generate pipeline.get() + + +# Test that the created content is as expected +inst = dlite.Instance.from_location( + driver="json", location=f"{outdir}/test_add_instance.json", options="mode=r" +) +assert np.allclose(inst.potential_energy, 3.2e-19) +assert np.allclose(inst.forses, [[1.2, 2.3, 3.4], [0.2, 3.4, 4.5]]) From 99d70f477f18c5d8c2d9db5fc1c471e240df936f Mon Sep 17 00:00:00 2001 From: Jesper Friis Date: Thu, 13 Jul 2023 19:19:34 +0200 Subject: [PATCH 08/10] Renamed function.py to generate.py --- docs/api_reference/strategies/function.md | 3 --- docs/api_reference/strategies/generate.md | 3 +++ oteapi_dlite/strategies/{function.py => generate.py} | 0 setup.cfg | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 docs/api_reference/strategies/function.md create mode 100644 docs/api_reference/strategies/generate.md rename oteapi_dlite/strategies/{function.py => generate.py} (100%) diff --git a/docs/api_reference/strategies/function.md b/docs/api_reference/strategies/function.md deleted file mode 100644 index d3a8cac4..00000000 --- a/docs/api_reference/strategies/function.md +++ /dev/null @@ -1,3 +0,0 @@ -# function - -::: oteapi_dlite.strategies.function diff --git a/docs/api_reference/strategies/generate.md b/docs/api_reference/strategies/generate.md new file mode 100644 index 00000000..bfb698c1 --- /dev/null +++ b/docs/api_reference/strategies/generate.md @@ -0,0 +1,3 @@ +# generate + +::: oteapi_dlite.strategies.generate diff --git a/oteapi_dlite/strategies/function.py b/oteapi_dlite/strategies/generate.py similarity index 100% rename from oteapi_dlite/strategies/function.py rename to oteapi_dlite/strategies/generate.py diff --git a/setup.cfg b/setup.cfg index 0e3e1e43..361796a0 100644 --- a/setup.cfg +++ b/setup.cfg @@ -31,7 +31,7 @@ oteapi.parse = oteapi.function = - oteapi_dlite.application/vnd.dlite-generate = oteapi_dlite.strategies.function:DLiteFunctionStrategy + oteapi_dlite.application/vnd.dlite-generate = oteapi_dlite.strategies.generate:DLiteFunctionStrategy oteapi_dlite.application/vnd.dlite-addinstance = oteapi_dlite.strategies.add_instance:DLiteAddInstanceStrategy From 023e7ba938d3c83dc9390a107840e227dc71d87d Mon Sep 17 00:00:00 2001 From: Jesper Friis Date: Thu, 13 Jul 2023 19:26:25 +0200 Subject: [PATCH 09/10] temporary reverted back generate.py to function.py --- oteapi_dlite/strategies/{generate.py => function.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename oteapi_dlite/strategies/{generate.py => function.py} (100%) diff --git a/oteapi_dlite/strategies/generate.py b/oteapi_dlite/strategies/function.py similarity index 100% rename from oteapi_dlite/strategies/generate.py rename to oteapi_dlite/strategies/function.py From 783a91c53d16f0775113ff6e87617ecdaef76d2a Mon Sep 17 00:00:00 2001 From: Jesper Friis Date: Thu, 13 Jul 2023 19:30:21 +0200 Subject: [PATCH 10/10] Got back both function and generate --- docs/api_reference/strategies/function.md | 3 +++ setup.cfg | 1 + 2 files changed, 4 insertions(+) create mode 100644 docs/api_reference/strategies/function.md diff --git a/docs/api_reference/strategies/function.md b/docs/api_reference/strategies/function.md new file mode 100644 index 00000000..d3a8cac4 --- /dev/null +++ b/docs/api_reference/strategies/function.md @@ -0,0 +1,3 @@ +# function + +::: oteapi_dlite.strategies.function diff --git a/setup.cfg b/setup.cfg index 69a6a590..f3e19d03 100644 --- a/setup.cfg +++ b/setup.cfg @@ -31,6 +31,7 @@ oteapi.parse = oteapi.function = oteapi_dlite.application/vnd.dlite-generate = oteapi_dlite.strategies.generate:DLiteFunctionStrategy + oteapi_dlite.application/vnd.dlite-function = oteapi_dlite.strategies.function:DLiteFunctionStrategy oteapi_dlite.application/vnd.dlite-addinstance = oteapi_dlite.strategies.add_instance:DLiteAddInstanceStrategy oteapi.mapping =