From b2a96f1d4c02fc9cd6cdcc023a65c0b298de6310 Mon Sep 17 00:00:00 2001 From: Pei-Hsuan Wu Date: Tue, 4 Feb 2025 22:20:13 -0800 Subject: [PATCH 01/12] [Hydra] Improve error message in parse_overrides Summary: Test Plan: Reviewers: Subscribers: Tasks: Tags: --- hydra/core/override_parser/overrides_parser.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hydra/core/override_parser/overrides_parser.py b/hydra/core/override_parser/overrides_parser.py index 860d3458ad..a48dab3752 100644 --- a/hydra/core/override_parser/overrides_parser.py +++ b/hydra/core/override_parser/overrides_parser.py @@ -80,7 +80,7 @@ def parse_override(self, s: str) -> Override: def parse_overrides(self, overrides: List[str]) -> List[Override]: ret: List[Override] = [] - for override in overrides: + for idx, override in enumerate(overrides): try: parsed = self.parse_rule(override, "override") except HydraException as e: @@ -98,7 +98,7 @@ def parse_overrides(self, overrides: List[str]) -> List[Override]: msg = f"Error parsing override '{override}'" f"\n{e}" raise OverrideParseException( override=override, - message=f"{msg}" + message=f"Error when parsing index: {idx}, string: {override} out of {overrides}. {msg}" f"\nSee https://hydra.cc/docs/1.2/advanced/override_grammar/basic for details", ) from e.__cause__ assert isinstance(parsed, Override) From 9a6e787f01002583f3552fb1ee5e2dbf2a193017 Mon Sep 17 00:00:00 2001 From: Pei-Hsuan Wu Date: Tue, 4 Feb 2025 23:30:54 -0800 Subject: [PATCH 02/12] Fix test --- tests/test_hydra_cli_errors.py | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/tests/test_hydra_cli_errors.py b/tests/test_hydra_cli_errors.py index 871b313660..137167993d 100644 --- a/tests/test_hydra_cli_errors.py +++ b/tests/test_hydra_cli_errors.py @@ -19,41 +19,49 @@ [ param( "+key=int(", - "no viable alternative at input 'int('", + """Error when parsing index: 1, string: +key=int( out of ['hydra.sweep.dir=/tmp/pytest-of-runner/pytest-0/test_cli_error_parse_error_in_0', '+key=int(', 'hydra.mode=RUN']. +no viable alternative at input 'int('""", id="parse_error_in_function", ), param( "+key=sort()", - """Error parsing override '+key=sort()' + """Error when parsing index: 1, string: +key=sort() out of ['hydra.sweep.dir=/tmp/pytest-of-runner/pytest-0/test_cli_error_empty_sort_0', '+key=sort()', 'hydra.mode=RUN']. +Error parsing override '+key=sort()' ValueError while evaluating 'sort()': empty sort input""", id="empty_sort", ), param( "key=sort(interval(1,10))", - """Error parsing override 'key=sort(interval(1,10))' + """Error when parsing index: 1, string: key=sort(interval(1,10)) out of ['hydra.sweep.dir=/tmp/pytest-of-runner/pytest-0/test_cli_error_sort_interval_0', 'key=sort(interval(1,10))', 'hydra.mode=RUN']. +Error parsing override 'key=sort(interval(1,10))' TypeError while evaluating 'sort(interval(1,10))': mismatch type argument args[0]""", id="sort_interval", ), param( "+key=choice()", - """Error parsing override '+key=choice()' + """Error when parsing index: 1, string: +key=choice() out of ['hydra.sweep.dir=/tmp/pytest-of-runner/pytest-0/test_cli_error_empty_choice0_0', '+key=choice()', 'hydra.mode=RUN']. +Error parsing override '+key=choice()' ValueError while evaluating 'choice()': empty choice is not legal""", id="empty choice", ), param( "+key=extend_list(1, 2, 3)", - """Error parsing override '+key=extend_list(1, 2, 3)' + """Error when parsing index: 1, string: +key=extend_list(1, 2, 3) out of ['hydra.sweep.dir=/tmp/pytest-of-runner/pytest-0/test_cli_error_plus_key_extend0', '+key=extend_list(1, 2, 3)', 'hydra.mode=RUN']. +Error parsing override '+key=extend_list(1, 2, 3)' Trying to use override symbols when extending a list""", id="plus key extend_list", ), param( "key={inner_key=extend_list(1, 2, 3)}", - "no viable alternative at input '{inner_key='", + """Error when parsing index: 1, string: key={inner_key=extend_list(1, 2, 3)} +out of ['hydra.sweep.dir=/tmp/pytest-of-runner/pytest-0/test_cli_error_embedded_extend0', 'key={inner_key=extend_list(1, 2, 3)}', 'hydra.mode=RUN']. +no viable alternative at input '{inner_key='""", id="embedded extend_list", ), param( ["+key=choice(choice(a,b))", "-m"], - """Error parsing override '+key=choice(choice(a,b))' + """Error when parsing index: 1, string: +key=choice(choice(a,b)) out of ['hydra.sweep.dir=/tmp/pytest-of-runner/pytest-0/test_cli_error_empty_choice1_0', '+key=choice(choice(a,b))', 'hydra.mode=MULTIRUN']. +Error parsing override '+key=choice(choice(a,b))' ValueError while evaluating 'choice(choice(a,b))': nesting choices is not supported See https://hydra.cc/docs/1.2/advanced/override_grammar/basic for details From fd8e554e2470f58440b8e3a11b41b9825ba8454e Mon Sep 17 00:00:00 2001 From: Pei-Hsuan Wu Date: Tue, 4 Feb 2025 23:41:13 -0800 Subject: [PATCH 03/12] Fix test --- tests/test_hydra_cli_errors.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/test_hydra_cli_errors.py b/tests/test_hydra_cli_errors.py index 137167993d..45e5185c89 100644 --- a/tests/test_hydra_cli_errors.py +++ b/tests/test_hydra_cli_errors.py @@ -3,14 +3,14 @@ from pathlib import Path from typing import Any -from pytest import mark, param - from hydra.test_utils.test_utils import ( chdir_hydra_root, normalize_newlines, run_with_error, ) +from pytest import mark, param + chdir_hydra_root() @@ -19,48 +19,48 @@ [ param( "+key=int(", - """Error when parsing index: 1, string: +key=int( out of ['hydra.sweep.dir=/tmp/pytest-of-runner/pytest-0/test_cli_error_parse_error_in_0', '+key=int(', 'hydra.mode=RUN']. + """Error when parsing index: 1, string: +key=int( out of ['hydra.sweep.dir=/tmp/pytest-of-runner/pytest-0/test_cli_error_parse_error_in_0', '+key=int(', 'hydra.mode=RUN']. no viable alternative at input 'int('""", id="parse_error_in_function", ), param( "+key=sort()", - """Error when parsing index: 1, string: +key=sort() out of ['hydra.sweep.dir=/tmp/pytest-of-runner/pytest-0/test_cli_error_empty_sort_0', '+key=sort()', 'hydra.mode=RUN']. + """Error when parsing index: 1, string: +key=sort() out of ['hydra.sweep.dir=/tmp/pytest-of-runner/pytest-0/test_cli_error_empty_sort_0', '+key=sort()', 'hydra.mode=RUN']. Error parsing override '+key=sort()' ValueError while evaluating 'sort()': empty sort input""", id="empty_sort", ), param( "key=sort(interval(1,10))", - """Error when parsing index: 1, string: key=sort(interval(1,10)) out of ['hydra.sweep.dir=/tmp/pytest-of-runner/pytest-0/test_cli_error_sort_interval_0', 'key=sort(interval(1,10))', 'hydra.mode=RUN']. + """Error when parsing index: 1, string: key=sort(interval(1,10)) out of ['hydra.sweep.dir=/tmp/pytest-of-runner/pytest-0/test_cli_error_sort_interval_0', 'key=sort(interval(1,10))', 'hydra.mode=RUN']. Error parsing override 'key=sort(interval(1,10))' TypeError while evaluating 'sort(interval(1,10))': mismatch type argument args[0]""", id="sort_interval", ), param( "+key=choice()", - """Error when parsing index: 1, string: +key=choice() out of ['hydra.sweep.dir=/tmp/pytest-of-runner/pytest-0/test_cli_error_empty_choice0_0', '+key=choice()', 'hydra.mode=RUN']. + """Error when parsing index: 1, string: +key=choice() out of ['hydra.sweep.dir=/tmp/pytest-of-runner/pytest-0/test_cli_error_empty_choice0_0', '+key=choice()', 'hydra.mode=RUN']. Error parsing override '+key=choice()' ValueError while evaluating 'choice()': empty choice is not legal""", id="empty choice", ), param( "+key=extend_list(1, 2, 3)", - """Error when parsing index: 1, string: +key=extend_list(1, 2, 3) out of ['hydra.sweep.dir=/tmp/pytest-of-runner/pytest-0/test_cli_error_plus_key_extend0', '+key=extend_list(1, 2, 3)', 'hydra.mode=RUN']. + """Error when parsing index: 1, string: +key=extend_list(1, 2, 3) out of ['hydra.sweep.dir=/tmp/pytest-of-runner/pytest-0/test_cli_error_plus_key_extend0', '+key=extend_list(1, 2, 3)', 'hydra.mode=RUN']. Error parsing override '+key=extend_list(1, 2, 3)' Trying to use override symbols when extending a list""", id="plus key extend_list", ), param( "key={inner_key=extend_list(1, 2, 3)}", - """Error when parsing index: 1, string: key={inner_key=extend_list(1, 2, 3)} + """Error when parsing index: 1, string: key={inner_key=extend_list(1, 2, 3)} out of ['hydra.sweep.dir=/tmp/pytest-of-runner/pytest-0/test_cli_error_embedded_extend0', 'key={inner_key=extend_list(1, 2, 3)}', 'hydra.mode=RUN']. no viable alternative at input '{inner_key='""", id="embedded extend_list", ), param( ["+key=choice(choice(a,b))", "-m"], - """Error when parsing index: 1, string: +key=choice(choice(a,b)) out of ['hydra.sweep.dir=/tmp/pytest-of-runner/pytest-0/test_cli_error_empty_choice1_0', '+key=choice(choice(a,b))', 'hydra.mode=MULTIRUN']. + """Error when parsing index: 1, string: +key=choice(choice(a,b)) out of ['hydra.sweep.dir=/tmp/pytest-of-runner/pytest-0/test_cli_error_empty_choice1_0', '+key=choice(choice(a,b))', 'hydra.mode=MULTIRUN']. Error parsing override '+key=choice(choice(a,b))' ValueError while evaluating 'choice(choice(a,b))': nesting choices is not supported See https://hydra.cc/docs/1.2/advanced/override_grammar/basic for details From 36eaa85bb8e4b7cb17564030df1342132376a39b Mon Sep 17 00:00:00 2001 From: Pei-Hsuan Wu Date: Tue, 4 Feb 2025 23:50:21 -0800 Subject: [PATCH 04/12] Fix test --- hydra/core/override_parser/overrides_parser.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/hydra/core/override_parser/overrides_parser.py b/hydra/core/override_parser/overrides_parser.py index a48dab3752..2a86ef59a9 100644 --- a/hydra/core/override_parser/overrides_parser.py +++ b/hydra/core/override_parser/overrides_parser.py @@ -2,11 +2,6 @@ import sys from typing import Any, List, Optional -from omegaconf.vendor.antlr4.error.Errors import ( - LexerNoViableAltException, - RecognitionException, -) - from hydra._internal.grammar import grammar_functions from hydra._internal.grammar.functions import Functions from hydra.core.config_loader import ConfigLoader @@ -17,6 +12,11 @@ from hydra.core.override_parser.types import Override from hydra.errors import HydraException, OverrideParseException +from omegaconf.vendor.antlr4.error.Errors import ( + LexerNoViableAltException, + RecognitionException, +) + try: from hydra.grammar.gen.OverrideLexer import ( # type: ignore[attr-defined] CommonTokenStream, @@ -98,7 +98,8 @@ def parse_overrides(self, overrides: List[str]) -> List[Override]: msg = f"Error parsing override '{override}'" f"\n{e}" raise OverrideParseException( override=override, - message=f"Error when parsing index: {idx}, string: {override} out of {overrides}. {msg}" + message=f"Error when parsing index: {idx}, string: {override} out of {overrides}." + f"\n{msg}" f"\nSee https://hydra.cc/docs/1.2/advanced/override_grammar/basic for details", ) from e.__cause__ assert isinstance(parsed, Override) From c8723215fcafd36d94e9a73b8b5d717b4b47fb8c Mon Sep 17 00:00:00 2001 From: Pei-Hsuan Wu Date: Tue, 4 Feb 2025 23:57:08 -0800 Subject: [PATCH 05/12] Fix test --- tests/test_hydra_cli_errors.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/test_hydra_cli_errors.py b/tests/test_hydra_cli_errors.py index 45e5185c89..75d5c915f6 100644 --- a/tests/test_hydra_cli_errors.py +++ b/tests/test_hydra_cli_errors.py @@ -53,8 +53,7 @@ ), param( "key={inner_key=extend_list(1, 2, 3)}", - """Error when parsing index: 1, string: key={inner_key=extend_list(1, 2, 3)} -out of ['hydra.sweep.dir=/tmp/pytest-of-runner/pytest-0/test_cli_error_embedded_extend0', 'key={inner_key=extend_list(1, 2, 3)}', 'hydra.mode=RUN']. + """Error when parsing index: 1, string: key={inner_key=extend_list(1, 2, 3)} out of ['hydra.sweep.dir=/tmp/pytest-of-runner/pytest-0/test_cli_error_embedded_extend0', 'key={inner_key=extend_list(1, 2, 3)}', 'hydra.mode=RUN']. no viable alternative at input '{inner_key='""", id="embedded extend_list", ), From 1937e7ca53cf7a093653809af9283333322456e0 Mon Sep 17 00:00:00 2001 From: Pei-Hsuan Wu Date: Wed, 5 Feb 2025 00:06:48 -0800 Subject: [PATCH 06/12] Fix test --- tests/test_hydra_cli_errors.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/test_hydra_cli_errors.py b/tests/test_hydra_cli_errors.py index 75d5c915f6..fd463882f5 100644 --- a/tests/test_hydra_cli_errors.py +++ b/tests/test_hydra_cli_errors.py @@ -54,7 +54,11 @@ param( "key={inner_key=extend_list(1, 2, 3)}", """Error when parsing index: 1, string: key={inner_key=extend_list(1, 2, 3)} out of ['hydra.sweep.dir=/tmp/pytest-of-runner/pytest-0/test_cli_error_embedded_extend0', 'key={inner_key=extend_list(1, 2, 3)}', 'hydra.mode=RUN']. -no viable alternative at input '{inner_key='""", +no viable alternative at input '{inner_key=' +See https://hydra.cc/docs/1.2/advanced/override_grammar/basic for details + +Set the environment variable HYDRA_FULL_ERROR=1 for a complete stack trace. +""", id="embedded extend_list", ), param( From 0e476872f4a24bf6d12ad6eb9ca984ab9e929128 Mon Sep 17 00:00:00 2001 From: Pei-Hsuan Wu Date: Wed, 5 Feb 2025 00:12:25 -0800 Subject: [PATCH 07/12] Fix test --- tests/test_hydra_cli_errors.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/test_hydra_cli_errors.py b/tests/test_hydra_cli_errors.py index fd463882f5..e3d3fe1974 100644 --- a/tests/test_hydra_cli_errors.py +++ b/tests/test_hydra_cli_errors.py @@ -57,8 +57,7 @@ no viable alternative at input '{inner_key=' See https://hydra.cc/docs/1.2/advanced/override_grammar/basic for details -Set the environment variable HYDRA_FULL_ERROR=1 for a complete stack trace. -""", +Set the environment variable HYDRA_FULL_ERROR=1 for a complete stack trace.""", id="embedded extend_list", ), param( From 5dafbf32e557ee75dd821dc0642c5bff8e5a4194 Mon Sep 17 00:00:00 2001 From: Pei-Hsuan Wu Date: Wed, 5 Feb 2025 00:18:27 -0800 Subject: [PATCH 08/12] Fix test --- tests/test_hydra_cli_errors.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_hydra_cli_errors.py b/tests/test_hydra_cli_errors.py index e3d3fe1974..50787ada34 100644 --- a/tests/test_hydra_cli_errors.py +++ b/tests/test_hydra_cli_errors.py @@ -53,7 +53,7 @@ ), param( "key={inner_key=extend_list(1, 2, 3)}", - """Error when parsing index: 1, string: key={inner_key=extend_list(1, 2, 3)} out of ['hydra.sweep.dir=/tmp/pytest-of-runner/pytest-0/test_cli_error_embedded_extend0', 'key={inner_key=extend_list(1, 2, 3)}', 'hydra.mode=RUN']. + """Error when parsing index: 1, string: key={inner_key=extend_list(1, 2, 3)} out of ['hydra.sweep.dir=/tmp/pytest-of-runner/pytest-0/test_cli_error_embedded_extend0', 'key={inner_key=extend_list(1, 2, 3)}', 'hydra.mode=RUN']. no viable alternative at input '{inner_key=' See https://hydra.cc/docs/1.2/advanced/override_grammar/basic for details From de0e4abf1f45a69ff2666fb61cc123156767e4d5 Mon Sep 17 00:00:00 2001 From: Pei-Hsuan Wu Date: Wed, 5 Feb 2025 00:51:52 -0800 Subject: [PATCH 09/12] Fix test --- tests/test_hydra_cli_errors.py | 52 +++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/tests/test_hydra_cli_errors.py b/tests/test_hydra_cli_errors.py index 50787ada34..97d9b9e2d1 100644 --- a/tests/test_hydra_cli_errors.py +++ b/tests/test_hydra_cli_errors.py @@ -15,55 +15,52 @@ @mark.parametrize( - "override,expected", + "override,expected_substring_1,expected_substring_2", [ param( "+key=int(", - """Error when parsing index: 1, string: +key=int( out of ['hydra.sweep.dir=/tmp/pytest-of-runner/pytest-0/test_cli_error_parse_error_in_0', '+key=int(', 'hydra.mode=RUN']. -no viable alternative at input 'int('""", + "Error when parsing index: 1, string: +key=int( out of [", + "no viable alternative at input 'int('", id="parse_error_in_function", ), param( "+key=sort()", - """Error when parsing index: 1, string: +key=sort() out of ['hydra.sweep.dir=/tmp/pytest-of-runner/pytest-0/test_cli_error_empty_sort_0', '+key=sort()', 'hydra.mode=RUN']. -Error parsing override '+key=sort()' + """Error when parsing index: 1, string: +key=sort() out of [""", + """Error parsing override '+key=sort()' ValueError while evaluating 'sort()': empty sort input""", id="empty_sort", ), param( "key=sort(interval(1,10))", - """Error when parsing index: 1, string: key=sort(interval(1,10)) out of ['hydra.sweep.dir=/tmp/pytest-of-runner/pytest-0/test_cli_error_sort_interval_0', 'key=sort(interval(1,10))', 'hydra.mode=RUN']. -Error parsing override 'key=sort(interval(1,10))' + """Error when parsing index: 1, string: key=sort(interval(1,10)) out of [""", + """Error parsing override 'key=sort(interval(1,10))' TypeError while evaluating 'sort(interval(1,10))': mismatch type argument args[0]""", id="sort_interval", ), param( "+key=choice()", - """Error when parsing index: 1, string: +key=choice() out of ['hydra.sweep.dir=/tmp/pytest-of-runner/pytest-0/test_cli_error_empty_choice0_0', '+key=choice()', 'hydra.mode=RUN']. -Error parsing override '+key=choice()' + """Error when parsing index: 1, string: +key=choice() out of [""", + """Error parsing override '+key=choice()' ValueError while evaluating 'choice()': empty choice is not legal""", id="empty choice", ), param( "+key=extend_list(1, 2, 3)", - """Error when parsing index: 1, string: +key=extend_list(1, 2, 3) out of ['hydra.sweep.dir=/tmp/pytest-of-runner/pytest-0/test_cli_error_plus_key_extend0', '+key=extend_list(1, 2, 3)', 'hydra.mode=RUN']. -Error parsing override '+key=extend_list(1, 2, 3)' + """Error when parsing index: 1, string: +key=extend_list(1, 2, 3) out of [""", + """Error parsing override '+key=extend_list(1, 2, 3)' Trying to use override symbols when extending a list""", id="plus key extend_list", ), param( "key={inner_key=extend_list(1, 2, 3)}", - """Error when parsing index: 1, string: key={inner_key=extend_list(1, 2, 3)} out of ['hydra.sweep.dir=/tmp/pytest-of-runner/pytest-0/test_cli_error_embedded_extend0', 'key={inner_key=extend_list(1, 2, 3)}', 'hydra.mode=RUN']. -no viable alternative at input '{inner_key=' -See https://hydra.cc/docs/1.2/advanced/override_grammar/basic for details - -Set the environment variable HYDRA_FULL_ERROR=1 for a complete stack trace.""", + """Error when parsing index: 1, string: key={inner_key=extend_list(1, 2, 3)} out of [""", + "no viable alternative at input '{inner_key='", id="embedded extend_list", ), param( ["+key=choice(choice(a,b))", "-m"], - """Error when parsing index: 1, string: +key=choice(choice(a,b)) out of ['hydra.sweep.dir=/tmp/pytest-of-runner/pytest-0/test_cli_error_empty_choice1_0', '+key=choice(choice(a,b))', 'hydra.mode=MULTIRUN']. -Error parsing override '+key=choice(choice(a,b))' + """Error when parsing index: 1, string: +key=choice(choice(a,b)) out of [""", + """Error parsing override '+key=choice(choice(a,b))' ValueError while evaluating 'choice(choice(a,b))': nesting choices is not supported See https://hydra.cc/docs/1.2/advanced/override_grammar/basic for details @@ -81,22 +78,31 @@ ), ], ) -def test_cli_error(tmpdir: Any, monkeypatch: Any, override: Any, expected: str) -> None: +def test_cli_error( + tmpdir: Any, + monkeypatch: Any, + override: Any, + expected_substring_1: str, + expected_substring_2: str, +) -> None: monkeypatch.chdir("tests/test_apps/app_without_config/") if isinstance(override, str): override = [override] cmd = ["my_app.py", "hydra.sweep.dir=" + str(tmpdir)] + override ret = normalize_newlines(run_with_error(cmd)) assert ( - re.search("^" + re.escape(normalize_newlines(expected.strip())), ret) - is not None + expected_substring_1.strip() in ret and expected_substring_2.strip() in ret ), ( f"Result:" f"\n---" f"\n{ret}" f"\n---" - f"\nDid not match expected:" + f"\nDoes not contain expected_substring_1:" + f"\n---" + f"\n{expected_substring_1}" + f"\n---" + f"\nand expected_substring_2:" f"\n---" - f"\n{expected}" + f"\n{expected_substring_2}" f"\n---" ) From 4971f5f846db099016c986ccbddb2084503930b1 Mon Sep 17 00:00:00 2001 From: Pei-Hsuan Wu Date: Wed, 5 Feb 2025 00:54:55 -0800 Subject: [PATCH 10/12] Fix test --- tests/test_hydra_cli_errors.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_hydra_cli_errors.py b/tests/test_hydra_cli_errors.py index 97d9b9e2d1..b10158def6 100644 --- a/tests/test_hydra_cli_errors.py +++ b/tests/test_hydra_cli_errors.py @@ -74,6 +74,7 @@ Set the environment variable HYDRA_FULL_ERROR=1 for a complete stack trace. """, + "", id="config_dir_not_found", ), ], From b187d62f1b16946306e03690c7ae5b4889d80113 Mon Sep 17 00:00:00 2001 From: Pei-Hsuan Wu Date: Wed, 5 Feb 2025 10:35:03 -0800 Subject: [PATCH 11/12] Fix test --- hydra/core/override_parser/overrides_parser.py | 10 +++++----- tests/test_hydra_cli_errors.py | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/hydra/core/override_parser/overrides_parser.py b/hydra/core/override_parser/overrides_parser.py index 2a86ef59a9..371963fedd 100644 --- a/hydra/core/override_parser/overrides_parser.py +++ b/hydra/core/override_parser/overrides_parser.py @@ -2,6 +2,11 @@ import sys from typing import Any, List, Optional +from omegaconf.vendor.antlr4.error.Errors import ( + LexerNoViableAltException, + RecognitionException, +) + from hydra._internal.grammar import grammar_functions from hydra._internal.grammar.functions import Functions from hydra.core.config_loader import ConfigLoader @@ -12,11 +17,6 @@ from hydra.core.override_parser.types import Override from hydra.errors import HydraException, OverrideParseException -from omegaconf.vendor.antlr4.error.Errors import ( - LexerNoViableAltException, - RecognitionException, -) - try: from hydra.grammar.gen.OverrideLexer import ( # type: ignore[attr-defined] CommonTokenStream, diff --git a/tests/test_hydra_cli_errors.py b/tests/test_hydra_cli_errors.py index b10158def6..5494485dc9 100644 --- a/tests/test_hydra_cli_errors.py +++ b/tests/test_hydra_cli_errors.py @@ -3,14 +3,14 @@ from pathlib import Path from typing import Any +from pytest import mark, param + from hydra.test_utils.test_utils import ( chdir_hydra_root, normalize_newlines, run_with_error, ) -from pytest import mark, param - chdir_hydra_root() From dcebf29b257652b24b4658e4a657777b6cce5c03 Mon Sep 17 00:00:00 2001 From: Pei-Hsuan Wu Date: Wed, 5 Feb 2025 11:05:53 -0800 Subject: [PATCH 12/12] Fix test --- tests/test_hydra_cli_errors.py | 73 +++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/tests/test_hydra_cli_errors.py b/tests/test_hydra_cli_errors.py index 5494485dc9..a43bc31e14 100644 --- a/tests/test_hydra_cli_errors.py +++ b/tests/test_hydra_cli_errors.py @@ -1,7 +1,6 @@ # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -import re from pathlib import Path -from typing import Any +from typing import Any, List from pytest import mark, param @@ -15,66 +14,81 @@ @mark.parametrize( - "override,expected_substring_1,expected_substring_2", + "override,expected_substrings", [ param( "+key=int(", - "Error when parsing index: 1, string: +key=int( out of [", - "no viable alternative at input 'int('", + [ + "Error when parsing index: 1, string: +key=int( out of [", + "no viable alternative at input 'int('", + ], id="parse_error_in_function", ), param( "+key=sort()", - """Error when parsing index: 1, string: +key=sort() out of [""", - """Error parsing override '+key=sort()' + [ + """Error when parsing index: 1, string: +key=sort() out of [""", + """Error parsing override '+key=sort()' ValueError while evaluating 'sort()': empty sort input""", + ], id="empty_sort", ), param( "key=sort(interval(1,10))", - """Error when parsing index: 1, string: key=sort(interval(1,10)) out of [""", - """Error parsing override 'key=sort(interval(1,10))' + [ + """Error when parsing index: 1, string: key=sort(interval(1,10)) out of [""", + """Error parsing override 'key=sort(interval(1,10))' TypeError while evaluating 'sort(interval(1,10))': mismatch type argument args[0]""", + ], id="sort_interval", ), param( "+key=choice()", - """Error when parsing index: 1, string: +key=choice() out of [""", - """Error parsing override '+key=choice()' + [ + """Error when parsing index: 1, string: +key=choice() out of [""", + """Error parsing override '+key=choice()' ValueError while evaluating 'choice()': empty choice is not legal""", + ], id="empty choice", ), param( "+key=extend_list(1, 2, 3)", - """Error when parsing index: 1, string: +key=extend_list(1, 2, 3) out of [""", - """Error parsing override '+key=extend_list(1, 2, 3)' + [ + """Error when parsing index: 1, string: +key=extend_list(1, 2, 3) out of [""", + """Error parsing override '+key=extend_list(1, 2, 3)' Trying to use override symbols when extending a list""", + ], id="plus key extend_list", ), param( "key={inner_key=extend_list(1, 2, 3)}", - """Error when parsing index: 1, string: key={inner_key=extend_list(1, 2, 3)} out of [""", - "no viable alternative at input '{inner_key='", + [ + """Error when parsing index: 1, string: key={inner_key=extend_list(1, 2, 3)} out of [""", + "no viable alternative at input '{inner_key='", + ], id="embedded extend_list", ), param( ["+key=choice(choice(a,b))", "-m"], - """Error when parsing index: 1, string: +key=choice(choice(a,b)) out of [""", - """Error parsing override '+key=choice(choice(a,b))' + [ + """Error when parsing index: 1, string: +key=choice(choice(a,b)) out of [""", + """Error parsing override '+key=choice(choice(a,b))' ValueError while evaluating 'choice(choice(a,b))': nesting choices is not supported See https://hydra.cc/docs/1.2/advanced/override_grammar/basic for details Set the environment variable HYDRA_FULL_ERROR=1 for a complete stack trace. """, + ], id="empty choice", ), param( "--config-dir=/dir/not/found", - f"""Additional config directory '{Path('/dir/not/found').absolute()}' not found + [ + f"""Additional config directory '{Path('/dir/not/found').absolute()}' not found Set the environment variable HYDRA_FULL_ERROR=1 for a complete stack trace. -""", - "", +""" + ], id="config_dir_not_found", ), ], @@ -83,27 +97,20 @@ def test_cli_error( tmpdir: Any, monkeypatch: Any, override: Any, - expected_substring_1: str, - expected_substring_2: str, + expected_substrings: List[str], ) -> None: monkeypatch.chdir("tests/test_apps/app_without_config/") if isinstance(override, str): override = [override] cmd = ["my_app.py", "hydra.sweep.dir=" + str(tmpdir)] + override ret = normalize_newlines(run_with_error(cmd)) - assert ( - expected_substring_1.strip() in ret and expected_substring_2.strip() in ret - ), ( + missing_substrings = [s for s in expected_substrings if s.strip() not in ret] + assert not missing_substrings, ( f"Result:" f"\n---" f"\n{ret}" f"\n---" - f"\nDoes not contain expected_substring_1:" - f"\n---" - f"\n{expected_substring_1}" - f"\n---" - f"\nand expected_substring_2:" - f"\n---" - f"\n{expected_substring_2}" - f"\n---" + f"\nDoes not contain the following expected substrings:" + + "\n---\n".join(f"{s}" for s in missing_substrings) + + "\n---" )