diff --git a/src/scenic/core/dynamics/scenarios.py b/src/scenic/core/dynamics/scenarios.py index 7f33c3ec9..77ec470e8 100644 --- a/src/scenic/core/dynamics/scenarios.py +++ b/src/scenic/core/dynamics/scenarios.py @@ -1,5 +1,6 @@ """Dynamic scenarios.""" +import ast from collections import defaultdict import dataclasses import functools @@ -8,8 +9,9 @@ import rv_ltl +import scenic import scenic.core.dynamics as dynamics -from scenic.core.errors import InvalidScenarioError +from scenic.core.errors import InvalidScenarioError, ScenicSyntaxError from scenic.core.lazy_eval import DelayedArgument, needsLazyEvaluation from scenic.core.requirements import ( DynamicRequirement, @@ -429,6 +431,23 @@ def _compileRequirements(self): assert requirementSyntax is not None for reqID, requirement in self._pendingRequirements.items(): syntax = requirementSyntax[reqID] if requirementSyntax else None + + # Catch the simple case where someone has most likely forgotten the "monitor" + # keyword. + if ( + (not requirement.ty == RequirementType.monitor) + and isinstance(syntax, ast.Call) + and isinstance(syntax.func, ast.Name) + and syntax.func.id in namespace + and isinstance(namespace[syntax.func.id], type) + and issubclass( + namespace[syntax.func.id], scenic.core.dynamics.behaviors.Monitor + ) + ): + raise ScenicSyntaxError( + f"Missing 'monitor' keyword after 'require' when instantiating '{syntax.func.id}'" + ) + compiledReq = requirement.compile(namespace, self, syntax) self._registerCompiledRequirement(compiledReq) diff --git a/tests/syntax/test_dynamics.py b/tests/syntax/test_dynamics.py index 516fb5cdc..8b9083dbe 100644 --- a/tests/syntax/test_dynamics.py +++ b/tests/syntax/test_dynamics.py @@ -1466,6 +1466,18 @@ def test_require_monitor_invalid(): sampleScene(scenario) +def test_require_monitor_error(): + with pytest.raises(ScenicSyntaxError): + compileScenic( + """ + monitor Monitor(): + wait + ego = new Object + require Monitor() + """ + ) + + def test_old_style_monitor(): with pytest.raises(ScenicSyntaxError): compileScenic(