Skip to content

Commit

Permalink
Raise error if = not in define
Browse files Browse the repository at this point in the history
  • Loading branch information
wxtim committed Oct 9, 2023
1 parent 7697d23 commit 5d4d389
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 4 deletions.
3 changes: 3 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ ones in. -->
[#250](https://github.com/cylc/cylc-rose/pull/250) - Prevent project
name being manually set to an empty string.

[#225](https://github.com/cylc/cylc-rose/pull/225) - Prevent totally invalid
CLI --defines with no = sign.

## __cylc-rose-1.3.0 (<span actions:bind='release-date'>Released 2023-07-21</span>)__

### Fixes
Expand Down
6 changes: 6 additions & 0 deletions cylc/rose/entry_points.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,15 @@
dump_rose_log,
get_rose_vars_from_config_node,
identify_templating_section,
invalid_defines_check,
rose_config_exists,
rose_config_tree_loader,
merge_rose_cylc_suite_install_conf,
paths_to_pathlib,
get_cli_opts_node,
add_cylc_install_to_rose_conf_node_opts,
)
from cylc.flow.flags import cylc7_back_compat
from cylc.flow.hostuserutil import get_host


Expand Down Expand Up @@ -120,6 +122,10 @@ def get_rose_vars(srcdir=None, opts=None):
raise NotARoseSuiteException()
return config

# Check for definitely invalid defines
if opts and hasattr(opts, 'defines') and not cylc7_back_compat:
invalid_defines_check(opts.defines)

# Load the raw config tree
config_tree = rose_config_tree_loader(srcdir, opts)
deprecation_warnings(config_tree)
Expand Down
44 changes: 40 additions & 4 deletions cylc/rose/utilities.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,12 @@

from cylc.flow.hostuserutil import get_host
from cylc.flow import LOG
from cylc.flow.exceptions import CylcError
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
from metomi.rose.config import ConfigDumper, ConfigNodeDiff, ConfigNode
from metomi.rose.config import ConfigNodeDiff, ConfigNode, ConfigDumper
from metomi.rose.config_processor import ConfigProcessError
from metomi.rose.env import env_var_process, UnboundEnvironmentVariableError

Expand All @@ -46,7 +47,11 @@
ALL_MODES = 'all modes'


class MultipleTemplatingEnginesError(Exception):
class MultipleTemplatingEnginesError(CylcError):
...


class InvalidDefineError(CylcError):
...


Expand Down Expand Up @@ -327,11 +332,42 @@ def merge_rose_cylc_suite_install_conf(old, new):
return old


def invalid_defines_check(defines: List) -> None:
"""Check for defines which do not contain an = and therefore cannot be
valid
Examples:
# A single invalid define:
>>> import pytest
>>> with pytest.raises(InvalidDefineError, match=r'\\* foo'):
... invalid_defines_check(['foo'])
# Two invalid defines and one valid one:
>>> with pytest.raises(
... InvalidDefineError, match=r'\\* foo.*\\n.* \\* bar'
... ):
... invalid_defines_check(['foo', 'bar52', 'baz=442'])
# No invalid defines
>>> invalid_defines_check(['foo=12'])
"""
invalid_defines = []
for define in defines:
if parse_cli_defines(define) is False:
invalid_defines.append(define)
if invalid_defines:
msg = 'Invalid Suite Defines (should contain an =)'
for define in invalid_defines:
msg += f'\n * {define}'
raise InvalidDefineError(msg)


def parse_cli_defines(define: str) -> Union[
bool, Tuple[
bool, str, Tuple[
List[Union[str, Any]],
Union[str, Any],
Union[str, Any]
Union[str, Any],
]
]:
"""Parse a define string.
Expand Down

0 comments on commit 5d4d389

Please sign in to comment.