Repository: Galileo-Galilei/kedro-mlflow
Pull request #464 (2023-10-21 19:49:24)

Remove TemplatedConfigloader in favor of OmegaConfigLoader
## Description

Part of #391

## Development notes

Update tests and documentation

## Checklist

- [ ] Read the [contributing](https://github.com/Galileo-Galilei/kedro-mlflow/blob/master/CONTRIBUTING.md) guidelines
- [ ] Open this PR as a 'Draft Pull Request' if it is work-in-progress
- [ ] Update the documentation to reflect the code changes
- [] Add a description of this change and add your name to the list of supporting contributions in the [`CHANGELOG.md`](https://github.com/Galileo-Galilei/kedro-mlflow/blob/master/CHANGELOG.md) file. Please respect [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) guidelines.
- [X] Add tests to cover your changes

## Notice

- [X] I acknowledge and agree that, by checking this box and clicking "Submit Pull Request":

- I submit this contribution under the [Apache 2.0 license](https://www.apache.org/licenses/LICENSE-2.0.txt) and represent that I am entitled to do so on behalf of myself, my employer, or relevant third parties, as applicable.
- I certify that (a) this contribution is my original creation and / or (b) to the extent it is not my original creation, I am authorised to submit this contribution on behalf of the original creator(s) or their licensees.
- I certify that the use of this contribution as authorised by the Apache 2.0 license does not violate the intellectual property rights of anyone else.



Patch:
diff --git a/.readthedocs.yml b/.readthedocs.yml
index e0164df..150a3b5 100644
--- a/.readthedocs.yml
+++ b/.readthedocs.yml
@@ -5,6 +5,12 @@
 # Required
 version: 2
 
+# required since 2023/10 https://blog.readthedocs.com/use-build-os-config/
+build:
+  os: "ubuntu-22.04"
+  tools:
+    python: "3.11"
+
 # Build documentation in the docs/ directory with Sphinx
 sphinx:
   configuration: docs/conf.py
@@ -16,7 +22,6 @@ formats:
 
 # Optionally set the version of Python and requirements required to build your docs
 python:
-  version: 3.8
   install:
     - method: pip
       path: .
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 824faca..ac358a4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -327,7 +327,7 @@
 
 -   :zap: `get_mlflow_config` now uses the Kedro `ProjectContext` `ConfigLoader` to get configs ([#66](https://github.com/Galileo-Galilei/kedro-mlflow/issues/66)). This indirectly solves the following issues:
     -   `get_mlflow_config` now works in interactive mode if `load_context` is called  with a path different from the working directory ([#30](https://github.com/Galileo-Galilei/kedro-mlflow/issues/30))
-    -   kedro_mlflow now works fine with kedro jupyter notebook independently of the working directory ([#64](https://github.com/Galileo-Galilei/kedro-mlflow/issues/64))
+    -   ``kedro_mlflow`` now works fine with ``kedro jupyter notebook`` independently of the working directory ([#64](https://github.com/Galileo-Galilei/kedro-mlflow/issues/64))
     -   You can use global variables in `mlflow.yml` which is now properly parsed if you use a `TemplatedConfigLoader` ([#72](https://github.com/Galileo-Galilei/kedro-mlflow/issues/72))
 -   :bug: `MlflowMetricsDataset` now saves in the specified `run_id` instead of the current one when the prefix is not specified ([#62](https://github.com/Galileo-Galilei/kedro-mlflow/issues/62))
 -   :memo: Other bug fixes and documentation improvements ([#6](https://github.com/Galileo-Galilei/kedro-mlflow/issues/6), [#99](https://github.com/Galileo-Galilei/kedro-mlflow/issues/99))
diff --git a/docs/source/03_getting_started/02_first_steps.md b/docs/source/03_getting_started/02_first_steps.md
index dee6de4..b08fddb 100644
--- a/docs/source/03_getting_started/02_first_steps.md
+++ b/docs/source/03_getting_started/02_first_steps.md
@@ -142,7 +142,7 @@ example_iris_data:
 example_model:
   type: kedro_mlflow.io.artifacts.MlflowArtifactDataset
   data_set:
-    type: pickle.PickleDataSet
+    type: pickle.PickleDataset
     filepath: data/06_models/trained_model.pkl
 ```
 
diff --git a/docs/source/04_experimentation_tracking/02_version_parameters.md b/docs/source/04_experimentation_tracking/02_version_parameters.md
index 7467d16..298ee5f 100644
--- a/docs/source/04_experimentation_tracking/02_version_parameters.md
+++ b/docs/source/04_experimentation_tracking/02_version_parameters.md
@@ -22,30 +22,4 @@ The parameters are registered node by node (and not in a single batch at the beg
 
 ### How are parameters detected by the plugin?
 
-The hook **detects parameters through their prefix ``params:`` or the value ``parameters``**. These are the [reserved keywords used by Kedro to define parameters](https://kedro.readthedocs.io/en/stable/03_tutorial/04_create_pipelines.html?highlight=params%3A#working-with-multiple-pipelines) in the ``pipeline.py`` file(s).  
-
-### How can I register a parameter if I use a ``TemplatedConfigLoader``?
-
-If you [use a ``TemplatedConfigLoader``](https://docs.kedro.org/en/stable/configuration/advanced_configuration.html#templatedconfigloader) to enable dynamic parameters contruction at runtime or dependency between configuration files, and if we assume your ``src/<project-name>/run.py`` file looks like:
-
-```python
-from kedro.config import TemplatedConfigLoader  # new import
-from datetime import date
-
-
-class ProjectContext(KedroContext):
-    def _create_config_loader(self, conf_paths: Iterable[str]) -> TemplatedConfigLoader:
-        return TemplatedConfigLoader(
-            conf_paths,
-            globals_pattern="*globals.yml",  # read the globals dictionary from project config
-            globals_dict={  # extra keys to add to the globals dictionary, take precedence over globals_pattern
-                execution_date: date.today()
-            },
-        )
-```
-
-Then **you need to add this entry in your ``conf/<env>/parameters``** to ensure that the parameter will be properly recorded:
-
-```yaml
-execution_date: ${execution_date}
-```
+The hook **detects parameters through their prefix ``params:`` or the value ``parameters``**. These are the [reserved keywords used by Kedro to define parameters](https://kedro.readthedocs.io/en/stable/03_tutorial/04_create_pipelines.html?highlight=params%3A#working-with-multiple-pipelines) in the ``pipeline.py`` file(s).
diff --git a/docs/source/05_pipeline_serving/04_hook_pipeline_ml.md b/docs/source/05_pipeline_serving/04_hook_pipeline_ml.md
index 7ac60d2..66f5dd1 100644
--- a/docs/source/05_pipeline_serving/04_hook_pipeline_ml.md
+++ b/docs/source/05_pipeline_serving/04_hook_pipeline_ml.md
@@ -36,7 +36,7 @@ For consistency, you may want to log an inference pipeline (including some data
 
     ```yaml
     label_encoder:
-    type: pickle.PickleDataset  # <- This must be any Kedro Dataset other than "MemoryDataSet"
+    type: pickle.PickleDataset  # <- This must be any Kedro Dataset other than "MemoryDataset"
     filepath: data/06_models/label_encoder.pkl  # <- This must be a local path, no matter what is your mlflow storage (S3 or other)
     ```
 
diff --git a/kedro_mlflow/mlflow/kedro_pipeline_model.py b/kedro_mlflow/mlflow/kedro_pipeline_model.py
index 22c56a2..d8eb0f9 100644
--- a/kedro_mlflow/mlflow/kedro_pipeline_model.py
+++ b/kedro_mlflow/mlflow/kedro_pipeline_model.py
@@ -6,7 +6,7 @@ from kedro.framework.hooks import _create_hook_manager
 from kedro.io import DataCatalog, MemoryDataset
 from kedro.pipeline import Pipeline
 from kedro.runner import AbstractRunner, SequentialRunner
-from kedro_datasets.pickle import PickleDataSet
+from kedro_datasets.pickle import PickleDataset
 from mlflow.pyfunc import PythonModel
 
 from kedro_mlflow.pipeline.pipeline_ml import PipelineML
@@ -152,7 +152,7 @@ class KedroPipelineModel(PythonModel):
                     absolute_param_path = (
                         parameters_saving_folder / f"params_{name[7:]}.pkl"
                     )
-                    persisted_dataset = PickleDataSet(
+                    persisted_dataset = PickleDataset(
                         filepath=absolute_param_path.as_posix()
                     )
                     persisted_dataset.save(dataset.load())


Test patch:
diff --git a/tests/config/test_get_mlflow_config.py b/tests/config/test_get_mlflow_config.py
index 5702a84..e3af246 100644
--- a/tests/config/test_get_mlflow_config.py
+++ b/tests/config/test_get_mlflow_config.py
@@ -6,9 +6,8 @@ import mlflow.tracking.request_header.registry as mtrr  # necessary to access th
 import pytest
 import toml
 import yaml
-from dynaconf.validator import Validator
 from kedro import __version__ as kedro_version
-from kedro.config import OmegaConfigLoader, TemplatedConfigLoader
+from kedro.config import OmegaConfigLoader
 from kedro.framework.context import KedroContext
 from kedro.framework.project import _IsSubclassValidator, _ProjectSettings
 from kedro.framework.session import KedroSession
@@ -132,30 +131,6 @@ def _mock_imported_settings_paths(mocker, mock_settings):
     return mock_settings
 
 
-@pytest.fixture
-def mock_settings_templated_config_loader_class(mocker):
-    class MockSettings(_ProjectSettings):
-        _CONFIG_LOADER_CLASS = _IsSubclassValidator(
-            "CONFIG_LOADER_CLASS", default=lambda *_: TemplatedConfigLoader
-        )
-
-    return _mock_imported_settings_paths(mocker, MockSettings())
-
-
-@pytest.fixture
-def mock_settings_templated_config_loader_class_with_globals(mocker):
-    class MockSettings(_ProjectSettings):
-        _CONFIG_LOADER_CLASS = _IsSubclassValidator(
-            "CONFIG_LOADER_CLASS", default=lambda *_: TemplatedConfigLoader
-        )
-
-        _CONFIG_LOADER_ARGS = Validator(
-            "CONFIG_LOADER_ARGS", default=dict(globals_pattern="*globals.yml")
-        )
-
-    return _mock_imported_settings_paths(mocker, MockSettings())
-
-
 @pytest.fixture
 def mock_settings_omega_config_loader_class(mocker):
     class MockSettings(_ProjectSettings):
@@ -223,13 +198,10 @@ def fake_project(tmp_path, local_logging_config):
     "project_settings",
     [
         "",
-        pytest.lazy_fixture("mock_settings_templated_config_loader_class"),
         pytest.lazy_fixture("mock_settings_omega_config_loader_class"),
     ],
 )
 def test_mlflow_config_correctly_set(kedro_project, project_settings):
-    # create empty conf
-    open((kedro_project / "conf" / "base" / "mlflow.yml").as_posix(), mode="w").close()
     bootstrap_project(kedro_project)
     session = KedroSession.create(
         project_path=kedro_project, package_name="fake_project"
@@ -255,12 +227,12 @@ def test_mlflow_config_correctly_set(kedro_project, project_settings):
     )
 
 
-# TODO: when omegacfongiloader will support templating with globals, add a similar test
-@pytest.mark.usefixtures("mock_settings_templated_config_loader_class_with_globals")
-def test_mlflow_config_interpolated_with_templated_config_loader(fake_project):
+# TODO: when OmegaConfigLoader will support templating with globals, add a similar test
+@pytest.mark.usefixtures("mock_settings_omega_config_loader_class")
+def test_mlflow_config_interpolated_with_globals_resolver(fake_project):
     dict_config = dict(
         server=dict(
-            mlflow_tracking_uri="${mlflow_tracking_uri}",
+            mlflow_tracking_uri="${globals: mlflow_tracking_uri}",
             mlflow_registry_uri=None,
             credentials=None,
             request_header_provider=dict(type=None, pass_context=False, init_kwargs={}),
diff --git a/tests/framework/hooks/test_hook_deactivate_tracking.py b/tests/framework/hooks/test_hook_deactivate_tracking.py
index b28a505..c7f7758 100644
--- a/tests/framework/hooks/test_hook_deactivate_tracking.py
+++ b/tests/framework/hooks/test_hook_deactivate_tracking.py
@@ -253,11 +253,11 @@ def mock_session(
     # we need to patch "kedro.framework.session.session.validate_settings" instead of
     # "kedro.framework.project.validate_settings" because it is imported
     mocker.patch("kedro.framework.session.session.validate_settings")
-    # idem, we patch we need to patch "kedro.framework.session.session._register_hooks_setuptools" instead of
-    # "kedro.framework.hooks.manager._register_hooks_setuptools" because it is imported
+    # idem, we patch we need to patch "kedro.framework.session.session._register_hooks_entry_points" instead of
+    # "kedro.framework.hooks.manager._register_hooks_entry_points" because it is imported
 
     mocker.patch(
-        "kedro.framework.session.session._register_hooks_setuptools"
+        "kedro.framework.session.session._register_hooks_entry_points"
     )  # prevent registering the one of the plugins which are already installed
     configure_project(MOCK_PACKAGE_NAME)
     return KedroSession.create(MOCK_PACKAGE_NAME, kedro_project_path)
diff --git a/tests/framework/hooks/test_hook_log_metrics.py b/tests/framework/hooks/test_hook_log_metrics.py
index 03d9037..9cadcdb 100644
--- a/tests/framework/hooks/test_hook_log_metrics.py
+++ b/tests/framework/hooks/test_hook_log_metrics.py
@@ -6,7 +6,7 @@ from kedro.framework.startup import bootstrap_project
 from kedro.io import DataCatalog, MemoryDataset
 from kedro.pipeline import Pipeline, node
 from kedro.runner import SequentialRunner
-from kedro_datasets.pickle import PickleDataSet
+from kedro_datasets.pickle import PickleDataset
 
 from kedro_mlflow.framework.hooks.mlflow_hook import MlflowHook
 from kedro_mlflow.io.metrics import (
@@ -104,7 +104,7 @@ def dummy_catalog(tmp_path):
             "raw_data": MemoryDataset(pd.DataFrame(data=[1], columns=["a"])),
             "params:unused_param": MemoryDataset("blah"),
             "data": MemoryDataset(),
-            "model": PickleDataSet((tmp_path / "model.csv").as_posix()),
+            "model": PickleDataset((tmp_path / "model.csv").as_posix()),
             "my_metrics": MlflowMetricsDataset(),
             "another_metrics": MlflowMetricsDataset(prefix="foo"),
             "my_metric": MlflowMetricDataset(),
@@ -178,7 +178,7 @@ def test_mlflow_hook_metrics_dataset_with_run_id(
                 "raw_data": MemoryDataset(pd.DataFrame(data=[1], columns=["a"])),
                 "params:unused_param": MemoryDataset("blah"),
                 "data": MemoryDataset(),
-                "model": PickleDataSet(
+                "model": PickleDataset(
                     (kedro_project_with_mlflow_conf / "data" / "model.csv").as_posix()
                 ),
                 "my_metrics": MlflowMetricsDataset(run_id=existing_run_id),
diff --git a/tests/framework/hooks/test_hook_pipeline_ml.py b/tests/framework/hooks/test_hook_pipeline_ml.py
index 1e3d910..633f08b 100644
--- a/tests/framework/hooks/test_hook_pipeline_ml.py
+++ b/tests/framework/hooks/test_hook_pipeline_ml.py
@@ -8,7 +8,7 @@ from kedro.framework.startup import bootstrap_project
 from kedro.io import DataCatalog, MemoryDataset
 from kedro.pipeline import Pipeline, node
 from kedro.runner import SequentialRunner
-from kedro_datasets.pickle import PickleDataSet
+from kedro_datasets.pickle import PickleDataset
 from mlflow.models import infer_signature
 from mlflow.tracking import MlflowClient
 
@@ -91,7 +91,7 @@ def dummy_catalog(tmp_path):
             "raw_data": MemoryDataset(pd.DataFrame(data=[1], columns=["a"])),
             "params:unused_param": MemoryDataset("blah"),
             "data": MemoryDataset(),
-            "model": PickleDataSet((tmp_path / "model.csv").as_posix()),
+            "model": PickleDataset((tmp_path / "model.csv").as_posix()),
         }
     )
     return dummy_catalog
@@ -344,7 +344,7 @@ def test_mlflow_hook_save_pipeline_ml_with_parameters(
                 "cleaned_data": MemoryDataset(),
                 "params:stopwords": MemoryDataset(["Hello", "Hi"]),
                 "params:penalty": MemoryDataset(0.1),
-                "model": PickleDataSet(
+                "model": PickleDataset(
                     (kedro_project_with_mlflow_conf / "data" / "model.csv").as_posix()
                 ),
                 "params:threshold": MemoryDataset(0.5),
diff --git a/tests/io/artifacts/test_mlflow_artifact_dataset.py b/tests/io/artifacts/test_mlflow_artifact_dataset.py
index f78a928..5d88e4e 100644
--- a/tests/io/artifacts/test_mlflow_artifact_dataset.py
+++ b/tests/io/artifacts/test_mlflow_artifact_dataset.py
@@ -5,7 +5,7 @@ import pandas as pd
 import pytest
 from kedro.io import PartitionedDataset
 from kedro_datasets.pandas import CSVDataset
-from kedro_datasets.pickle import PickleDataSet
+from kedro_datasets.pickle import PickleDataset
 from mlflow.tracking import MlflowClient
 from pytest_lazyfixture import lazy_fixture
 
@@ -32,13 +32,13 @@ def df2():
     [
         (CSVDataset, ".csv", lazy_fixture("df1"), None),
         ("pandas.CSVDataset", ".csv", lazy_fixture("df1"), None),
-        (PickleDataSet, ".pkl", lazy_fixture("df1"), None),
-        ("pickle.PickleDataSet", ".pkl", lazy_fixture("df1"), None),
+        (PickleDataset, ".pkl", lazy_fixture("df1"), None),
+        ("pickle.PickleDataset", ".pkl", lazy_fixture("df1"), None),
         (CSVDataset, ".csv", lazy_fixture("df1"), "artifact_dir"),
         ("pandas.CSVDataset", ".csv", lazy_fixture("df1"), "artifact_dir"),
-        (PickleDataSet, ".pkl", lazy_fixture("df1"), "artifact_dir"),
+        (PickleDataset, ".pkl", lazy_fixture("df1"), "artifact_dir"),
         (
-            "pickle.PickleDataSet",
+            "pickle.PickleDataset",
             ".pkl",
             lazy_fixture("df1"),
             "artifact_dir",
@@ -173,7 +173,7 @@ def test_is_versioned_dataset_logged_correctly_in_mlflow(tmp_path, tracking_uri,
 
 def test_artifact_dataset_logging_deactivation(tmp_path, tracking_uri):
     mlflow_pkl_dataset = MlflowArtifactDataset(
-        data_set=dict(type=PickleDataSet, filepath=(tmp_path / "df1.csv").as_posix())
+        data_set=dict(type=PickleDataset, filepath=(tmp_path / "df1.csv").as_posix())
     )
 
     mlflow.set_tracking_uri(tracking_uri.as_uri())
diff --git a/tests/io/models/test_mlflow_model_logger_dataset.py b/tests/io/models/test_mlflow_model_logger_dataset.py
index a9df616..b337363 100644
--- a/tests/io/models/test_mlflow_model_logger_dataset.py
+++ b/tests/io/models/test_mlflow_model_logger_dataset.py
@@ -6,7 +6,7 @@ import pytest
 from kedro.io import DataCatalog, MemoryDataset
 from kedro.io.core import DatasetError
 from kedro.pipeline import Pipeline, node
-from kedro_datasets.pickle import PickleDataSet
+from kedro_datasets.pickle import PickleDataset
 from mlflow.tracking import MlflowClient
 from sklearn.linear_model import LinearRegression
 
@@ -100,7 +100,7 @@ def dummy_catalog(tmp_path):
         {
             "raw_data": MemoryDataset(),
             "data": MemoryDataset(),
-            "model": PickleDataSet(
+            "model": PickleDataset(
                 filepath=(tmp_path / "data" / "06_models" / "model.pkl")
                 .resolve()
                 .as_posix()
diff --git a/tests/io/models/test_mlflow_model_saver_dataset.py b/tests/io/models/test_mlflow_model_saver_dataset.py
index 659537b..c63e464 100644
--- a/tests/io/models/test_mlflow_model_saver_dataset.py
+++ b/tests/io/models/test_mlflow_model_saver_dataset.py
@@ -5,7 +5,7 @@ import pandas as pd
 import pytest
 from kedro.io import DataCatalog, MemoryDataset
 from kedro.pipeline import Pipeline, node
-from kedro_datasets.pickle import PickleDataSet
+from kedro_datasets.pickle import PickleDataset
 from sklearn.linear_model import LinearRegression
 
 from kedro_mlflow.io.models import MlflowModelSaverDataSet
@@ -80,7 +80,7 @@ def dummy_catalog(tmp_path):
         {
             "raw_data": MemoryDataset(),
             "data": MemoryDataset(),
-            "model": PickleDataSet(
+            "model": PickleDataset(
                 filepath=(tmp_path / "data" / "06_models" / "model.pkl")
                 .resolve()
                 .as_posix()
diff --git a/tests/mlflow/test_kedro_pipeline_model.py b/tests/mlflow/test_kedro_pipeline_model.py
index cd1f296..f5cd7f2 100644
--- a/tests/mlflow/test_kedro_pipeline_model.py
+++ b/tests/mlflow/test_kedro_pipeline_model.py
@@ -6,7 +6,7 @@ import pandas as pd
 import pytest
 from kedro.io import DataCatalog, MemoryDataset
 from kedro.pipeline import Pipeline, node
-from kedro_datasets.pickle import PickleDataSet
+from kedro_datasets.pickle import PickleDataset
 from sklearn.linear_model import LinearRegression
 
 from kedro_mlflow.io.models import MlflowModelSaverDataSet
@@ -162,8 +162,8 @@ def catalog_with_encoder(tmp_path):
         {
             "raw_data": MemoryDataset(),
             "data": MemoryDataset(),
-            "encoder": PickleDataSet((tmp_path / "encoder.pkl").resolve().as_posix()),
-            "model": PickleDataSet((tmp_path / "model.pkl").resolve().as_posix()),
+            "encoder": PickleDataset((tmp_path / "encoder.pkl").resolve().as_posix()),
+            "model": PickleDataset((tmp_path / "model.pkl").resolve().as_posix()),
         }
     )
     return catalog_with_encoder
@@ -175,10 +175,10 @@ def catalog_with_stopwords(tmp_path):
         {
             "data": MemoryDataset(),
             "cleaned_data": MemoryDataset(),
-            "stopwords_from_nltk": PickleDataSet(
+            "stopwords_from_nltk": PickleDataset(
                 (tmp_path / "stopwords.pkl").resolve().as_posix()
             ),
-            "model": PickleDataSet((tmp_path / "model.pkl").resolve().as_posix()),
+            "model": PickleDataset((tmp_path / "model.pkl").resolve().as_posix()),
         }
     )
     return catalog_with_stopwords
@@ -192,7 +192,7 @@ def catalog_with_parameters(tmp_path):
             "cleaned_data": MemoryDataset(),
             "params:stopwords": MemoryDataset(["Hello", "Hi"]),
             "params:penalty": MemoryDataset(0),
-            "model": PickleDataSet((tmp_path / "model.pkl").resolve().as_posix()),
+            "model": PickleDataset((tmp_path / "model.pkl").resolve().as_posix()),
             "params:threshold": MemoryDataset(0.5),
         }
     )
@@ -243,7 +243,7 @@ def dummy_catalog(tmp_path):
         {
             "raw_data": MemoryDataset(),
             "data": MemoryDataset(),
-            "model": PickleDataSet(
+            "model": PickleDataset(
                 filepath=(tmp_path / "model.pkl").resolve().as_posix()
             ),
         }
@@ -321,11 +321,11 @@ def test_kedro_pipeline_model_with_wrong_copy_mode_type(
 def test_model_packaging_too_many_artifacts(tmp_path, pipeline_inference_dummy):
     catalog = DataCatalog(
         {
-            "raw_data": PickleDataSet(
+            "raw_data": PickleDataset(
                 filepath=(tmp_path / "raw_data.pkl").resolve().as_posix()
             ),
             "data": MemoryDataset(),
-            "model": PickleDataSet(
+            "model": PickleDataset(
                 filepath=(tmp_path / "model.pkl").resolve().as_posix()
             ),
         }
@@ -371,7 +371,7 @@ def test_model_packaging_missing_artifacts(tmp_path, pipeline_inference_dummy):
         {
             "raw_data": MemoryDataset(),
             "data": MemoryDataset(),
-            "model": PickleDataSet(
+            "model": PickleDataset(
                 filepath=(tmp_path / "model.pkl").resolve().as_posix()
             ),
         }