diff --git a/inputremapper/injection/macros/parse.py b/inputremapper/injection/macros/parse.py index 71f4f202..68ac5a74 100644 --- a/inputremapper/injection/macros/parse.py +++ b/inputremapper/injection/macros/parse.py @@ -421,6 +421,12 @@ def parse(macro, context=None, return_errors=False): try: macro_object = _parse_recurse(macro, context) + + if not isinstance(macro_object, Macro): + # someone put a single parameter like a string into this function, and + # it was most likely returned without modification. Not a macro + raise ValueError("The provided code was not a macro") + return macro_object if not return_errors else None except Exception as error: logger.error('Failed to parse macro "%s": %s', macro, error.__repr__()) diff --git a/tests/unit/test_macros.py b/tests/unit/test_macros.py index ce6c9149..32b741cb 100644 --- a/tests/unit/test_macros.py +++ b/tests/unit/test_macros.py @@ -360,6 +360,10 @@ class TestMacros(MacroTestBase): self.assertIsNone(parse("r(a, k(b))", self.context)) self.assertIsNone(parse("m(a, b)", self.context)) + # passing a string parameter. This is not a macro, even though + # it might look like it without the string quotes. + self.assertIsNone(parse('"m(a, b)"', self.context)) + async def test_0(self): macro = parse("k(1)", self.context) one_code = system_mapping.get("1")