浏览代码

feat: remove MigrationConfig

trgiangdo 9 月之前
父节点
当前提交
ad2c212fb3

+ 1 - 5
taipy/config/config.pyi

@@ -14,7 +14,7 @@ from datetime import timedelta
 from typing import Any, Callable, Dict, List, Optional, Union
 
 from taipy.config._config import _Config
-from taipy.core.config import CoreSection, DataNodeConfig, JobConfig, MigrationConfig, ScenarioConfig, TaskConfig
+from taipy.core.config import CoreSection, DataNodeConfig, JobConfig, ScenarioConfig, TaskConfig
 
 from .checker.issue_collector import IssueCollector
 from .common._classproperty import _Classproperty
@@ -169,10 +169,6 @@ class Config:
     def scenarios(cls) -> Dict[str, ScenarioConfig]:
         """"""
 
-    @_Classproperty
-    def migration_functions(cls) -> Dict[str, MigrationConfig]:
-        """"""
-
     @_Classproperty
     def core(cls) -> Dict[str, CoreSection]:
         """"""

+ 2 - 3
taipy/config/stubs/generate_pyi.py

@@ -14,7 +14,8 @@ import re
 from pathlib import Path
 from typing import List
 
-_end_doc = re.compile(r'\"\"\"\s*(#\s*noqa\s*:\s*E501)?\s*\n')
+_end_doc = re.compile(r"\"\"\"\s*(#\s*noqa\s*:\s*E501)?\s*\n")
+
 
 def _get_function_delimiters(initial_line, lines):
     begin = end = initial_line
@@ -148,7 +149,6 @@ if __name__ == "__main__":
     job_filename = "taipy/core/config/job_config.py"
     scenario_filename = "taipy/core/config/scenario_config.py"
     task_filename = "taipy/core/config/task_config.py"
-    migration_filename = "taipy/core/config/migration_config.py"
     core_filename = "taipy/core/config/core_section.py"
 
     entities_map, property_map = _generate_entity_and_property_maps(config_init)
@@ -159,7 +159,6 @@ if __name__ == "__main__":
     pyi = _build_entity_config_pyi(pyi, dn_filename, entities_map["DataNodeConfig"])
     pyi = _build_entity_config_pyi(pyi, task_filename, entities_map["TaskConfig"])
     pyi = _build_entity_config_pyi(pyi, job_filename, entities_map["JobConfig"])
-    pyi = _build_entity_config_pyi(pyi, migration_filename, entities_map["MigrationConfig"])
     pyi = _build_entity_config_pyi(pyi, core_filename, entities_map["CoreSection"])
 
     # Remove the final redundant \n

+ 1 - 1
taipy/config/stubs/pyi_header.py

@@ -14,7 +14,7 @@ from datetime import timedelta
 from typing import Any, Callable, Dict, List, Optional, Union
 
 from taipy.config._config import _Config
-from taipy.core.config import CoreSection, DataNodeConfig, JobConfig, MigrationConfig, ScenarioConfig, TaskConfig
+from taipy.core.config import CoreSection, DataNodeConfig, JobConfig, ScenarioConfig, TaskConfig
 
 from .checker.issue_collector import IssueCollector
 from .common._classproperty import _Classproperty

+ 0 - 49
taipy/core/_version/_utils.py

@@ -1,49 +0,0 @@
-# Copyright 2021-2024 Avaiga Private Limited
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-#        http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
-# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations under the License.
-
-from typing import Callable, List
-
-from taipy.config.config import Config
-
-from .._entity._reload import _Reloader
-from ..config import MigrationConfig
-from ._version_manager_factory import _VersionManagerFactory
-
-
-def _migrate_entity(entity):
-    if (
-        latest_version := _VersionManagerFactory._build_manager()._get_latest_version()
-    ) in _VersionManagerFactory._build_manager()._get_production_versions():
-        if migration_fcts := __get_migration_fcts_to_latest(entity._version, entity.config_id):
-            with _Reloader():
-                for fct in migration_fcts:
-                    entity = fct(entity)
-                entity._version = latest_version
-
-    return entity
-
-
-def __get_migration_fcts_to_latest(source_version: str, config_id: str) -> List[Callable]:
-    migration_fcts_to_latest: List[Callable] = []
-
-    production_versions = _VersionManagerFactory._build_manager()._get_production_versions()
-    try:
-        start_index = production_versions.index(source_version) + 1
-    except ValueError:
-        return migration_fcts_to_latest
-
-    versions_to_migrate = production_versions[start_index:]
-
-    for version in versions_to_migrate:
-        if migration_fct := Config.unique_sections[MigrationConfig.name].migration_fcts.get(version, {}).get(config_id):
-            migration_fcts_to_latest.append(migration_fct)
-
-    return migration_fcts_to_latest

+ 0 - 9
taipy/core/config/__init__.py

@@ -25,7 +25,6 @@ from .checkers._task_config_checker import _TaskConfigChecker
 from .core_section import CoreSection
 from .data_node_config import DataNodeConfig
 from .job_config import JobConfig
-from .migration_config import MigrationConfig
 from .scenario_config import ScenarioConfig
 from .task_config import TaskConfig
 
@@ -75,13 +74,6 @@ _inject_section(
         ("set_default_scenario_configuration", ScenarioConfig._set_default_configuration),
     ],
 )
-_inject_section(
-    MigrationConfig,
-    "migration_functions",
-    MigrationConfig.default_config(),
-    [("add_migration_function", MigrationConfig._add_migration_function)],
-    add_to_unconflicted_sections=True,
-)
 _inject_section(
     CoreSection,
     "core",
@@ -94,6 +86,5 @@ _Checker.add_checker(_ConfigIdChecker)
 _Checker.add_checker(_CoreSectionChecker)
 _Checker.add_checker(_DataNodeConfigChecker)
 _Checker.add_checker(_JobConfigChecker)
-# We don't need to add _MigrationConfigChecker because it is run only when the Core service is run.
 _Checker.add_checker(_TaskConfigChecker)
 _Checker.add_checker(_ScenarioConfigChecker)

+ 0 - 66
taipy/core/config/checkers/_migration_config_checker.py

@@ -1,66 +0,0 @@
-# Copyright 2021-2024 Avaiga Private Limited
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-#        http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
-# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations under the License.
-
-from taipy.config._config import _Config
-from taipy.config.checker._checkers._config_checker import _ConfigChecker
-from taipy.config.checker.issue_collector import IssueCollector
-
-from ..._version._version_manager_factory import _VersionManagerFactory
-from ..migration_config import MigrationConfig
-
-
-class _MigrationConfigChecker(_ConfigChecker):
-    def __init__(self, config: _Config, collector: IssueCollector):
-        super().__init__(config, collector)
-
-    def _check(self) -> IssueCollector:
-        if migration_config := self._config._unique_sections.get(MigrationConfig.name):
-            self._check_if_entity_property_key_used_is_predefined(migration_config)
-
-            migration_fcts = migration_config.migration_fcts
-
-            for target_version, migration_functions in migration_config.migration_fcts.items():  # type: ignore[union-attr]
-                for config_id, migration_function in migration_functions.items():
-                    self._check_callable(target_version, config_id, migration_function)
-
-            self._check_valid_production_version(migration_fcts)
-            self._check_migration_from_productions_to_productions_exist(migration_fcts)
-
-        return self._collector
-
-    def _check_callable(self, target_version, config_id, migration_function):
-        if not callable(migration_function):
-            self._error(
-                MigrationConfig._MIGRATION_FCTS_KEY,
-                migration_function,
-                f"The migration function of config `{config_id}` from version {target_version}"
-                f" must be populated with Callable value.",
-            )
-
-    def _check_valid_production_version(self, migration_fcts):
-        for target_version in migration_fcts.keys():
-            if target_version not in _VersionManagerFactory._build_manager()._get_production_versions():
-                self._error(
-                    MigrationConfig._MIGRATION_FCTS_KEY,
-                    target_version,
-                    "The target version for a migration function must be a production version.",
-                )
-
-    def _check_migration_from_productions_to_productions_exist(self, migration_fcts):
-        production_versions = _VersionManagerFactory._build_manager()._get_production_versions()
-        for source_version, target_version in zip(production_versions[:-1], production_versions[1:]):
-            if not migration_fcts.get(target_version):
-                self._info(
-                    "target_version",
-                    None,
-                    f'There is no migration function from production version "{source_version}"'
-                    f' to version "{target_version}".',
-                )

+ 0 - 113
taipy/core/config/migration_config.py

@@ -1,113 +0,0 @@
-# Copyright 2021-2024 Avaiga Private Limited
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-#        http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
-# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations under the License.
-
-import collections.abc
-from copy import deepcopy
-from typing import Any, Callable, Dict, Optional, Union
-
-from taipy.config._config import _Config
-from taipy.config.common._template_handler import _TemplateHandler as _tpl
-from taipy.config.config import Config
-from taipy.config.section import Section
-from taipy.config.unique_section import UniqueSection
-
-
-class MigrationConfig(UniqueSection):
-    """
-    Configuration fields needed to register migration functions from an old version to newer one.
-
-    Attributes:
-        migration_fcts (Dict[str, Dict[str, Callable]]): A dictionary that maps the version that entities are
-            migrated from to the migration functions.
-        **properties (dict[str, Any]): A dictionary of additional properties.
-    """
-
-    name = "VERSION_MIGRATION"
-
-    _MIGRATION_FCTS_KEY = "migration_fcts"
-
-    def __init__(
-        self,
-        migration_fcts: Dict[str, Dict[str, Callable]],
-        **properties,
-    ):
-        self.migration_fcts = migration_fcts
-
-        super().__init__(**properties)
-
-    def __copy__(self):
-        return MigrationConfig(
-            deepcopy(self.migration_fcts),
-            **deepcopy(self._properties),
-        )
-
-    def _clean(self):
-        self.migration_fcts.clear()
-        self._properties.clear()
-
-    def __getattr__(self, item: str) -> Optional[Any]:
-        return _tpl._replace_templates(self._properties.get(item))  # type: ignore
-
-    @classmethod
-    def default_config(cls):
-        return MigrationConfig({})
-
-    def _to_dict(self):
-        return {
-            self._MIGRATION_FCTS_KEY: self.migration_fcts,
-            **self._properties,
-        }
-
-    @classmethod
-    def _from_dict(cls, as_dict: Dict[str, Any], id: str, config: Optional[_Config]):
-        return MigrationConfig(**as_dict)
-
-    def _update(self, as_dict, default_section=None):
-        def deep_update(d, u):
-            for k, v in u.items():
-                if isinstance(v, collections.abc.Mapping):
-                    d[k] = deep_update(d.get(k, {}), v)
-                else:
-                    d[k] = v
-            return d
-
-        migration_fcts = as_dict.pop(self._MIGRATION_FCTS_KEY)
-        deep_update(self.migration_fcts, migration_fcts)
-
-        self._properties.update(as_dict)
-
-    @staticmethod
-    def _add_migration_function(
-        target_version: str,
-        config: Union[Section, str],
-        migration_fct: Callable,
-        **properties,
-    ):
-        """Add a migration function for a Configuration to migrate entities to the target version.
-
-        Parameters:
-            target_version (str): The production version that entities are migrated to.
-            config (Union[Section, str]): The configuration or the `id` of the config that needs to migrate.
-            migration_fct (Callable): Migration function that takes an entity as input and returns a new entity
-                that is compatible with the target production version.
-            **properties (Dict[str, Any]): A keyworded variable length list of additional arguments.
-        Returns:
-            `MigrationConfig^`: The Migration configuration.
-        """
-        config_id = config if isinstance(config, str) else config.id
-        migration_fcts = {target_version: {config_id: migration_fct}}
-
-        section = MigrationConfig(
-            migration_fcts,
-            **properties,
-        )
-        Config._register(section)
-        return Config.unique_sections[MigrationConfig.name]

+ 1 - 3
taipy/core/data/_data_converter.py

@@ -14,7 +14,6 @@ from datetime import datetime, timedelta
 from pydoc import locate
 
 from .._repository._abstract_converter import _AbstractConverter
-from .._version._utils import _migrate_entity
 from ..common._utils import _load_fct
 from ..data._data_model import _DataNodeModel
 from ..data.data_node import DataNode
@@ -299,7 +298,7 @@ class _DataNodeConverter(_AbstractConverter):
             validity_period = timedelta(days=model.validity_days, seconds=model.validity_seconds)
 
         exp_date = datetime.fromisoformat(model.editor_expiration_date) if model.editor_expiration_date else None
-        datanode = DataNode._class_map()[model.storage_type](
+        return DataNode._class_map()[model.storage_type](
             config_id=model.config_id,
             scope=model.scope,
             id=model.id,
@@ -314,4 +313,3 @@ class _DataNodeConverter(_AbstractConverter):
             editor_expiration_date=exp_date,
             properties=data_node_properties,
         )
-        return _migrate_entity(datanode)

+ 1 - 3
taipy/core/scenario/_scenario_converter.py

@@ -13,7 +13,6 @@ from datetime import datetime
 from typing import Dict, List, Optional, Set, Union
 
 from .._repository._abstract_converter import _AbstractConverter
-from .._version._utils import _migrate_entity
 from ..common import _utils
 from ..cycle._cycle_manager_factory import _CycleManagerFactory
 from ..cycle.cycle import Cycle, CycleId
@@ -67,7 +66,7 @@ class _ScenarioConverter(_AbstractConverter):
                         for it in subscribers
                     ]
 
-        scenario = Scenario(
+        return Scenario(
             scenario_id=model.id,
             config_id=model.config_id,
             tasks=tasks,
@@ -84,7 +83,6 @@ class _ScenarioConverter(_AbstractConverter):
             version=model.version,
             sequences=model.sequences,
         )
-        return _migrate_entity(scenario)
 
     @staticmethod
     def __to_cycle(cycle_id: Optional[CycleId] = None) -> Optional[Cycle]:

+ 1 - 4
taipy/core/task/_task_converter.py

@@ -9,9 +9,7 @@
 # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
 # specific language governing permissions and limitations under the License.
 
-
 from .._repository._abstract_converter import _AbstractConverter
-from .._version._utils import _migrate_entity
 from ..common._utils import _load_fct
 from ..data._data_manager_factory import _DataManagerFactory
 from ..exceptions import NonExistingDataNode
@@ -39,7 +37,7 @@ class _TaskConverter(_AbstractConverter):
 
     @classmethod
     def _model_to_entity(cls, model: _TaskModel) -> Task:
-        task = Task(
+        return Task(
             id=TaskId(model.id),
             owner_id=model.owner_id,
             parent_ids=set(model.parent_ids),
@@ -51,7 +49,6 @@ class _TaskConverter(_AbstractConverter):
             skippable=model.skippable,
             properties=model.properties,
         )
-        return _migrate_entity(task)
 
     @staticmethod
     def __to_ids(data_nodes):

+ 1 - 8
tests/conftest.py

@@ -21,7 +21,7 @@ from taipy.config._serializer._toml_serializer import _TomlSerializer
 from taipy.config.checker._checker import _Checker
 from taipy.config.checker.issue_collector import IssueCollector
 from taipy.config.config import Config
-from taipy.core.config import CoreSection, DataNodeConfig, JobConfig, MigrationConfig, ScenarioConfig, TaskConfig
+from taipy.core.config import CoreSection, DataNodeConfig, JobConfig, ScenarioConfig, TaskConfig
 
 
 def pytest_addoption(parser):
@@ -137,12 +137,5 @@ def inject_core_sections():
                 ("set_default_scenario_configuration", ScenarioConfig._set_default_configuration),
             ],
         )
-        _inject_section(
-            MigrationConfig,
-            "migration_functions",
-            MigrationConfig.default_config(),
-            [("add_migration_function", MigrationConfig._add_migration_function)],
-            True,
-        )
 
     return _inject_core_sections

+ 0 - 132
tests/core/config/checkers/test_migration_config_checker.py

@@ -1,132 +0,0 @@
-# Copyright 2021-2024 Avaiga Private Limited
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-#        http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
-# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations under the License.
-
-from unittest.mock import patch
-
-import pytest
-
-from taipy.config.config import Config
-from taipy.core import Core
-from taipy.core._version._version_manager import _VersionManager
-from taipy.core.config import MigrationConfig
-
-
-def mock_func():
-    pass
-
-
-def test_check_if_entity_property_key_used_is_predefined(caplog):
-    Config.unique_sections[MigrationConfig.name]._properties["_entity_owner"] = None
-    with patch("sys.argv", ["prog", "--production", "1.0"]):
-        with pytest.raises(SystemExit):
-            core = Core()
-            core.run()
-        core.stop()
-    assert (
-        "Properties of MigrationConfig `VERSION_MIGRATION` cannot have `_entity_owner` as its property." in caplog.text
-    )
-
-    caplog.clear()
-
-    Config.unique_sections[MigrationConfig.name]._properties["_entity_owner"] = "entity_owner"
-    with patch("sys.argv", ["prog", "--production", "1.0"]):
-        with pytest.raises(SystemExit):
-            core = Core()
-            core.run()
-        core.stop()
-    expected_error_message = (
-        "Properties of MigrationConfig `VERSION_MIGRATION` cannot have `_entity_owner` as its property."
-        ' Current value of property `_entity_owner` is "entity_owner".'
-    )
-    assert expected_error_message in caplog.text
-
-
-def test_check_valid_version(caplog):
-    data_nodes1 = Config.configure_data_node("data_nodes1", "pickle")
-
-    Config.add_migration_function("2.0", data_nodes1, mock_func)
-    with patch("sys.argv", ["prog", "--production", "1.0"]):
-        with pytest.raises(SystemExit):
-            core = Core()
-            core.run()
-        core.stop()
-    assert "The target version for a migration function must be a production version." in caplog.text
-
-    caplog.clear()
-    Config.unblock_update()
-
-    with patch("sys.argv", ["prog", "--production", "2.0"]):
-        # No SystemExit should be raised
-        core = Core()
-        core.run()
-    core.stop()
-
-
-def test_check_callable_function(caplog):
-    data_nodes1 = Config.configure_data_node("data_nodes1", "pickle")
-    Config.add_migration_function("1.0", data_nodes1, 1)
-    with patch("sys.argv", ["prog", "--production", "1.0"]):
-        with pytest.raises(SystemExit):
-            core = Core()
-            core.run()
-        core.stop()
-    expected_error_message = (
-        "The migration function of config `data_nodes1` from version 1.0 must be populated with"
-        " Callable value. Current value of property `migration_fcts` is 1."
-    )
-    assert expected_error_message in caplog.text
-
-    caplog.clear()
-    Config.unblock_update()
-
-    Config.add_migration_function("1.0", data_nodes1, "bar")
-    with patch("sys.argv", ["prog", "--production", "1.0"]):
-        with pytest.raises(SystemExit):
-            core = Core()
-            core.run()
-        core.stop()
-    expected_error_message = (
-        "The migration function of config `data_nodes1` from version 1.0 must be populated with"
-        ' Callable value. Current value of property `migration_fcts` is "bar".'
-    )
-    assert expected_error_message in caplog.text
-
-    caplog.clear()
-    Config.unblock_update()
-
-    Config.add_migration_function("1.0", data_nodes1, mock_func)
-    with patch("sys.argv", ["prog", "--production", "1.0"]):
-        core = Core()
-        core.run()
-        core.stop()
-
-
-def test_check_migration_from_productions_to_productions_exist(caplog):
-    _VersionManager._set_production_version("1.0", True)
-    _VersionManager._set_production_version("1.1", True)
-    _VersionManager._set_production_version("1.2", True)
-
-    with patch("sys.argv", ["prog", "--production", "1.0"]):
-        core = Core()
-        core.run()
-        core.stop()
-    assert 'There is no migration function from production version "1.0" to version "1.1".' in caplog.text
-    assert 'There is no migration function from production version "1.1" to version "1.2".' in caplog.text
-
-    caplog.clear()
-    Config.unblock_update()
-
-    Config.add_migration_function("1.2", "data_nodes1", mock_func)
-    with patch("sys.argv", ["prog", "--production", "1.0"]):
-        core = Core()
-        core.run()
-        core.stop()
-    assert 'There is no migration function from production version "1.0" to version "1.1".' in caplog.text

+ 5 - 35
tests/core/config/test_config_serialization.py

@@ -16,7 +16,7 @@ from taipy.config import Config
 from taipy.config._serializer._json_serializer import _JsonSerializer
 from taipy.config.common.frequency import Frequency
 from taipy.config.common.scope import Scope
-from taipy.core.config import CoreSection, DataNodeConfig, JobConfig, MigrationConfig, ScenarioConfig, TaskConfig
+from taipy.core.config import CoreSection, DataNodeConfig, JobConfig, ScenarioConfig, TaskConfig
 from tests.core.utils.named_temporary_file import NamedTemporaryFile
 
 
@@ -102,8 +102,6 @@ def config_test_scenario():
     )
     test_scenario_cfg.add_sequences({"sequence1": [test_task_cfg]})
 
-    Config.add_migration_function("1.0", test_csv_dn_cfg, migrate_csv_path)
-
     return test_scenario_cfg
 
 
@@ -172,9 +170,6 @@ tasks = [ "test_task:SECTION",]
 additional_data_nodes = [ "test_pickle_dn:SECTION",]
 frequency = "DAILY:FREQUENCY"
 
-[VERSION_MIGRATION.migration_fcts."1.0"]
-test_csv_dn = "tests.core.config.test_config_serialization.migrate_csv_path:function"
-
 [SCENARIO.default.comparators]
 
 [SCENARIO.default.sequences]
@@ -201,13 +196,11 @@ sequence1 = [ "test_task:SECTION",]
     assert actual_config_2 == expected_toml_config
 
     assert Config.unique_sections is not None
-    assert len(Config.unique_sections) == 3
+    assert len(Config.unique_sections) == 2
 
     assert Config.unique_sections[JobConfig.name].mode == "development"
     assert Config.unique_sections[JobConfig.name].max_nb_of_workers is None
 
-    assert Config.unique_sections[MigrationConfig.name].migration_fcts["1.0"] == {"test_csv_dn": migrate_csv_path}
-
     assert Config.sections is not None
     assert len(Config.sections) == 3
 
@@ -300,13 +293,6 @@ def test_read_write_json_configuration_file():
 """
         + """
 },
-"VERSION_MIGRATION": {
-"migration_fcts": {
-"1.0": {
-"test_csv_dn": "tests.core.config.test_config_serialization.migrate_csv_path:function"
-}
-}
-},
 "DATA_NODE": {
 "default": {
 "storage_type": "pickle",
@@ -402,13 +388,11 @@ def test_read_write_json_configuration_file():
     assert actual_config_2 == expected_json_config
 
     assert Config.unique_sections is not None
-    assert len(Config.unique_sections) == 3
+    assert len(Config.unique_sections) == 2
 
     assert Config.unique_sections[JobConfig.name].mode == "development"
     assert Config.unique_sections[JobConfig.name].max_nb_of_workers is None
 
-    assert Config.unique_sections[MigrationConfig.name].migration_fcts["1.0"] == {"test_csv_dn": migrate_csv_path}
-
     assert Config.sections is not None
     assert len(Config.sections) == 3
 
@@ -531,9 +515,6 @@ tasks = [ "test_task:SECTION",]
 sequences.test_sequence = [ "test_task:SECTION",]
 frequency = "DAILY:FREQUENCY"
 
-[VERSION_MIGRATION.migration_fcts."1.0"]
-test_csv_dn = "tests.core.config.test_config_serialization.migrate_csv_path:function"
-
 [SCENARIO.default.comparators]
 
 [SCENARIO.test_scenario.comparators]
@@ -548,7 +529,7 @@ test_json_dn = [ "tests.core.config.test_config_serialization.compare_function:f
     Config.restore(tf.filename)
 
     assert Config.unique_sections is not None
-    assert len(Config.unique_sections) == 3
+    assert len(Config.unique_sections) == 2
 
     assert Config.unique_sections[CoreSection.name].root_folder == "./taipy/"
     assert Config.unique_sections[CoreSection.name].storage_folder == ".data/"
@@ -561,8 +542,6 @@ test_json_dn = [ "tests.core.config.test_config_serialization.compare_function:f
     assert Config.unique_sections[JobConfig.name].mode == "development"
     assert Config.unique_sections[JobConfig.name].max_nb_of_workers == 1
 
-    assert Config.unique_sections[MigrationConfig.name].migration_fcts["1.0"] == {"test_csv_dn": migrate_csv_path}
-
     assert Config.sections is not None
     assert len(Config.sections) == 3
 
@@ -643,13 +622,6 @@ def test_read_write_json_configuration_file_migrate_sequence_in_scenario():
 "version_number": "",
 "force": "False:bool"
 },
-"VERSION_MIGRATION": {
-"migration_fcts": {
-"1.0": {
-"test_csv_dn": "tests.core.config.test_config_serialization.migrate_csv_path:function"
-}
-}
-},
 "DATA_NODE": {
 "default": {
 "storage_type": "pickle",
@@ -724,7 +696,7 @@ def test_read_write_json_configuration_file_migrate_sequence_in_scenario():
     Config.restore(tf.filename)
 
     assert Config.unique_sections is not None
-    assert len(Config.unique_sections) == 3
+    assert len(Config.unique_sections) == 2
 
     assert Config.unique_sections[CoreSection.name].root_folder == "./taipy/"
     assert Config.unique_sections[CoreSection.name].storage_folder == ".data/"
@@ -737,8 +709,6 @@ def test_read_write_json_configuration_file_migrate_sequence_in_scenario():
     assert Config.unique_sections[JobConfig.name].mode == "development"
     assert Config.unique_sections[JobConfig.name].max_nb_of_workers == 1
 
-    assert Config.unique_sections[MigrationConfig.name].migration_fcts["1.0"] == {"test_csv_dn": migrate_csv_path}
-
     assert Config.sections is not None
     assert len(Config.sections) == 3
 

+ 2 - 2
tests/core/config/test_core_section.py

@@ -45,7 +45,7 @@ def test_core_section():
 [TAIPY]
 
 [CORE]
-mode = "production"
+mode = "experiment"
 version_number = "test_num_2"
 force = "true:bool"
         """
@@ -54,7 +54,7 @@ force = "true:bool"
     with patch("sys.argv", ["prog"]):
         core = Core()
         core.run()
-    assert Config.core.mode == "production"
+    assert Config.core.mode == "experiment"
     assert Config.core.version_number == "test_num_2"
     assert Config.core.force
     core.stop()

+ 0 - 5
tests/core/config/test_core_version.py

@@ -81,8 +81,6 @@ class TestCoreVersionInCoreSectionConfig:
             version_number = ""
             force = "False:bool"
             core_version = "{core_version}"
-
-            [VERSION_MIGRATION.migration_fcts]
             """
         )
         if is_compatible:
@@ -111,8 +109,6 @@ class TestCoreVersionInCoreSectionConfig:
             version_number = ""
             force = "False:bool"
             core_version = "{core_version}"
-
-            [VERSION_MIGRATION.migration_fcts]
             """
         )
         if is_compatible:
@@ -137,7 +133,6 @@ class TestCoreVersionInCoreSectionConfig:
             mode = "development"
             version_number = ""
             force = "False:bool"
-            [VERSION_MIGRATION.migration_fcts]
             """
         )
         Config.load(file_config.filename)

+ 1 - 12
tests/core/config/test_default_config.py

@@ -15,7 +15,6 @@ from taipy.config.global_app.global_app_config import GlobalAppConfig
 from taipy.core.config import CoreSection
 from taipy.core.config.data_node_config import DataNodeConfig
 from taipy.core.config.job_config import JobConfig
-from taipy.core.config.migration_config import MigrationConfig
 from taipy.core.config.scenario_config import ScenarioConfig
 from taipy.core.config.task_config import TaskConfig
 
@@ -70,12 +69,6 @@ def _test_default_scenario_config(scenario_config: ScenarioConfig):
     assert len(scenario_config.properties) == 0  # type: ignore
 
 
-def _test_default_version_migration_config(version_migration_config: MigrationConfig):
-    assert version_migration_config is not None
-    assert version_migration_config.migration_fcts == {}
-    assert len(version_migration_config.properties) == 0  # type: ignore
-
-
 def _test_default_global_app_config(global_config: GlobalAppConfig):
     assert global_config is not None
     assert not global_config.notification
@@ -90,17 +83,13 @@ def test_default_configuration():
     _test_default_global_app_config(GlobalAppConfig().default_config())
 
     assert default_config._unique_sections is not None
-    assert len(default_config._unique_sections) == 3
+    assert len(default_config._unique_sections) == 2
     assert len(default_config._sections) == 3
 
     _test_default_job_config(default_config._unique_sections[JobConfig.name])
     _test_default_job_config(Config.job_config)
     _test_default_job_config(JobConfig().default_config())
 
-    _test_default_version_migration_config(default_config._unique_sections[MigrationConfig.name])
-    _test_default_version_migration_config(Config.migration_functions)
-    _test_default_version_migration_config(MigrationConfig.default_config())
-
     _test_default_core_section(default_config._unique_sections[CoreSection.name])
     _test_default_core_section(Config.core)
     _test_default_core_section(CoreSection().default_config())

+ 0 - 2
tests/core/config/test_file_config.py

@@ -40,8 +40,6 @@ version_number = ""
 force = "False:bool"
 core_version = "{CoreSection._CURRENT_CORE_VERSION}"
 
-[VERSION_MIGRATION.migration_fcts]
-
 [DATA_NODE.default]
 storage_type = "in_memory"
 scope = "SCENARIO:SCOPE"

+ 0 - 65
tests/core/config/test_migration_config.py

@@ -1,65 +0,0 @@
-# Copyright 2021-2024 Avaiga Private Limited
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-#        http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
-# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations under the License.
-
-from taipy.config.config import Config
-
-
-def migrate_pickle_path(dn):
-    dn.path = "s1.pkl"
-
-
-def migrate_skippable(task):
-    task.skippable = True
-
-
-def test_migration_config():
-    assert Config.migration_functions.migration_fcts == {}
-
-    data_nodes1 = Config.configure_data_node("data_nodes1", "pickle")
-
-    migration_cfg = Config.add_migration_function(
-        target_version="1.0",
-        config=data_nodes1,
-        migration_fct=migrate_pickle_path,
-    )
-
-    assert migration_cfg.migration_fcts == {"1.0": {"data_nodes1": migrate_pickle_path}}
-    assert migration_cfg.properties == {}
-
-    data_nodes2 = Config.configure_data_node("data_nodes2", "pickle")
-
-    migration_cfg = Config.add_migration_function(
-        target_version="1.0",
-        config=data_nodes2,
-        migration_fct=migrate_pickle_path,
-    )
-    assert migration_cfg.migration_fcts == {
-        "1.0": {"data_nodes1": migrate_pickle_path, "data_nodes2": migrate_pickle_path}
-    }
-
-
-def test_clean_config():
-    assert Config.migration_functions.migration_fcts == {}
-
-    data_nodes1 = Config.configure_data_node("data_nodes1", "pickle")
-    migration_cfg = Config.add_migration_function(
-        target_version="1.0",
-        config=data_nodes1,
-        migration_fct=migrate_pickle_path,
-    )
-
-    assert migration_cfg.migration_fcts == {"1.0": {"data_nodes1": migrate_pickle_path}}
-    assert migration_cfg.properties == {}
-
-    migration_cfg._clean()
-
-    assert migration_cfg.migration_fcts == {}
-    assert migration_cfg._properties == {}

+ 0 - 1
tests/core/conftest.py

@@ -350,7 +350,6 @@ def init_config(reset_configuration_singleton, inject_core_sections):
         _Checker.add_checker(_CoreSectionChecker)
         _Checker.add_checker(_DataNodeConfigChecker)
         _Checker.add_checker(_JobConfigChecker)
-        # We don't need to add _MigrationConfigChecker because it is run only when the Core service is run.
         _Checker.add_checker(_TaskConfigChecker)
         _Checker.add_checker(_ScenarioConfigChecker)