diff --git a/CHANGES.md b/CHANGES.md
index 5cfb0969..86f4cbdf 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -6,7 +6,7 @@ creating a new release entry be sure to copy & paste the span tag with the
updated. Only the first match gets replaced, so it's fine to leave the old
ones in. -->
-## __cylc-rose-1.2.1 (Awaiting Release)__
+## __cylc-rose-1.3.0 (Upcoming)__
### Fixes
@@ -14,6 +14,9 @@ ones in. -->
Fix bug which stops rose-stem suites using the new `[template variables]` section
in their `rose-suite.conf` files.
+[#231](https://github.com/cylc/cylc-rose/pull/231) - Show warning about
+`root-dir` config setting in compatibility mode.
+
## __cylc-rose-1.2.0 (Released 2023-01-16)__
### Fixes
diff --git a/cylc/rose/utilities.py b/cylc/rose/utilities.py
index 16fa5570..ed90511d 100644
--- a/cylc/rose/utilities.py
+++ b/cylc/rose/utilities.py
@@ -25,7 +25,7 @@
from cylc.flow.hostuserutil import get_host
from cylc.flow import LOG
-import cylc.flow.flags as flags
+from cylc.flow.flags import cylc7_back_compat
from cylc.rose.jinja2_parser import Parser, patch_jinja2_leading_zeros
from metomi.rose import __version__ as ROSE_VERSION
from metomi.isodatetime.datetimeoper import DateTimeOperator
@@ -42,6 +42,8 @@
ROSE_ORIG_HOST_INSTALLED_OVERRIDE_STRING = (
' ROSE_ORIG_HOST set by cylc install.'
)
+MESSAGE = 'message'
+ALL_MODES = 'all modes'
class MultipleTemplatingEnginesError(Exception):
@@ -656,30 +658,50 @@ def deprecation_warnings(config_tree):
- "root-dir"
- "jinja2:suite.rc"
- "empy:suite.rc"
+ - root-dir
+ If ALL_MODES is True this deprecation will ignore whether there is a
+ flow.cylc or suite.rc in the workflow directory.
"""
deprecations = {
- 'empy:suite.rc': (
- "'rose-suite.conf[empy:suite.rc]' is deprecated."
- " Use [template variables] instead."),
- 'jinja2:suite.rc': (
- "'rose-suite.conf[jinja2:suite.rc]' is deprecated."
- " Use [template variables] instead."),
- 'empy:flow.cylc': (
- "'rose-suite.conf[empy:flow.cylc]' is not used by Cylc."
- " Use [template variables] instead."),
- 'jinja2:flow.cylc': (
- "'rose-suite.conf[jinja2:flow.cylc]' is not used by Cylc."
- " Use [template variables] instead."),
- 'root-dir': (
- 'You have set "rose-suite.conf[root-dir]", '
- 'which is not supported at '
- 'Cylc 8. Use `[install] symlink dirs` in global.cylc '
- 'instead.')
+ 'empy:suite.rc': {
+ MESSAGE: (
+ "'rose-suite.conf[empy:suite.rc]' is deprecated."
+ " Use [template variables] instead."),
+ ALL_MODES: False,
+ },
+ 'jinja2:suite.rc': {
+ MESSAGE: (
+ "'rose-suite.conf[jinja2:suite.rc]' is deprecated."
+ " Use [template variables] instead."),
+ ALL_MODES: False,
+ },
+ 'empy:flow.cylc': {
+ MESSAGE: (
+ "'rose-suite.conf[empy:flow.cylc]' is not used by Cylc."
+ " Use [template variables] instead."),
+ ALL_MODES: False,
+ },
+ 'jinja2:flow.cylc': {
+ MESSAGE: (
+ "'rose-suite.conf[jinja2:flow.cylc]' is not used by Cylc."
+ " Use [template variables] instead."),
+ ALL_MODES: False,
+ },
+ 'root-dir': {
+ MESSAGE: (
+ 'You have set "rose-suite.conf[root-dir]", '
+ 'which is not supported at '
+ 'Cylc 8. Use `[install] symlink dirs` in global.cylc '
+ 'instead.'),
+ ALL_MODES: True,
+ },
}
- if not flags.cylc7_back_compat:
- for string in list(config_tree.node):
- for deprecation in deprecations.keys():
- if deprecation in string.lower():
- LOG.warning(deprecations[deprecation])
+ for string in list(config_tree.node):
+ for name, info in deprecations.items():
+ if (
+ (info[ALL_MODES] or not cylc7_back_compat)
+ and name in string.lower()
+ ):
+ LOG.warning(info[MESSAGE])
diff --git a/tests/conftest.py b/tests/conftest.py
index 631c93b2..4031397e 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -102,7 +102,6 @@ def _cylc_validate_cli(capsys, caplog):
def _inner(srcpath, args=None):
parser = validate_gop()
options = Options(parser, args)()
-
output = SimpleNamespace()
try:
@@ -130,7 +129,6 @@ def _inner(srcpath, args=None):
args: Dictionary of arguments.
"""
options = Options(install_gop(), args)()
-
output = SimpleNamespace()
try:
@@ -156,7 +154,6 @@ def _inner(workflow_id, opts=None):
args: Dictionary of arguments.
"""
options = Options(reinstall_gop(), opts)()
-
output = SimpleNamespace()
try:
diff --git a/tests/functional/test_pre_configure.py b/tests/functional/test_pre_configure.py
index 9c715d2d..ddefff41 100644
--- a/tests/functional/test_pre_configure.py
+++ b/tests/functional/test_pre_configure.py
@@ -157,7 +157,7 @@ def test_warn_if_old_templating_set(
):
"""Test using unsupported root-dir config raises error."""
monkeypatch.setattr(
- cylc.rose.utilities.flags, 'cylc7_back_compat', compat_mode
+ cylc.rose.utilities, 'cylc7_back_compat', compat_mode
)
(tmp_path / 'rose-suite.conf').write_text(f'[{rose_config}]')
get_rose_vars(srcdir=tmp_path)
diff --git a/tests/functional/test_rose_stem.py b/tests/functional/test_rose_stem.py
index 6095c559..122c41e2 100644
--- a/tests/functional/test_rose_stem.py
+++ b/tests/functional/test_rose_stem.py
@@ -177,6 +177,12 @@ def setup_stem_repo(tmp_path_factory, monkeymodule, request):
dest = str(workingcopy / 'rose-stem')
shutil.copy2(src, dest)
suite_install_dir = get_workflow_run_dir(suitename)
+
+ monkeymodule.setattr(
+ 'cylc.flow.pathutil.make_symlink_dir',
+ lambda *_, **__: {}
+ )
+
yield {
'basetemp': basetemp,
'workingcopy': workingcopy,
diff --git a/tests/unit/test_config_node.py b/tests/unit/test_config_node.py
index 8c7505b2..86bf8232 100644
--- a/tests/unit/test_config_node.py
+++ b/tests/unit/test_config_node.py
@@ -16,6 +16,7 @@
"""Tests the plugin with Rose suite configurations via the Python API."""
import pytest
+from types import SimpleNamespace
from metomi.isodatetime.datetimeoper import DateTimeOperator
from metomi.rose import __version__ as ROSE_VERSION
@@ -28,6 +29,7 @@
ROSE_ORIG_HOST_INSTALLED_OVERRIDE_STRING,
get_rose_vars_from_config_node,
add_cylc_install_to_rose_conf_node_opts,
+ deprecation_warnings,
dump_rose_log,
identify_templating_section,
MultipleTemplatingEnginesError
@@ -285,3 +287,44 @@ def test_ROSE_ORIG_HOST_replacement_behaviour(
ROSE_ORIG_HOST_INSTALLED_OVERRIDE_STRING)
assert not caplog.records
assert node['env']['ROSE_ORIG_HOST'].value == 'IMPLAUSIBLE_HOST_NAME'
+
+
+@pytest.mark.parametrize(
+ 'compat_mode, must_include, must_exclude',
+ (
+ (True, None, 'Use [template variables]'),
+ (True, 'root-dir', None),
+ (False, 'Use [template variables]', None),
+ (False, 'root-dir', None),
+ )
+)
+def test_deprecation_warnings(
+ caplog, monkeypatch, compat_mode, must_include, must_exclude
+):
+ """Method logs warnings correctly.
+
+ Two node items are set:
+
+ * ``jinja2:suite.rc`` should not cause a warning in compatibility mode.
+ * ``root-dir=/somewhere`` should always lead to a warning being logged.
+
+ Error messages about
+ """
+ # Create a node to pass to the method
+ # (It's not a tree test because we can use a simpleNamespace in place of
+ # a tree object):
+ node = ConfigNode()
+ node.set(['jinja2:suite.rc'])
+ node.set(['root-dir', '~foo'])
+ tree = SimpleNamespace(node=node)
+
+ # Patch compatibility mode flag and run the function under test:
+ monkeypatch.setattr('cylc.rose.utilities.cylc7_back_compat', compat_mode)
+ deprecation_warnings(tree)
+
+ # Check that warnings have/not been logged:
+ records = '\n'.join([i.message for i in caplog.records])
+ if must_include:
+ assert must_include in records
+ else:
+ assert must_exclude not in records