|
14 | 14 | Namespace, |
15 | 15 | set_parsing_settings, |
16 | 16 | ) |
| 17 | +from jsonargparse._common import subclasses_disabled_selectors |
17 | 18 | from jsonargparse._namespace import NSKeyError |
18 | 19 | from jsonargparse._optionals import ( |
19 | 20 | docstring_parser_support, |
|
31 | 32 |
|
32 | 33 | annotated = typing_extensions_import("Annotated") |
33 | 34 |
|
| 35 | + |
| 36 | +@pytest.fixture |
| 37 | +def enable_subclasses(subclass_behavior): |
| 38 | + set_parsing_settings(subclasses_enabled=["is_pure_dataclass"]) |
| 39 | + yield |
| 40 | + |
| 41 | + |
34 | 42 | BetweenThreeAndNine = restricted_number_type("BetweenThreeAndNine", float, [(">=", 3), ("<=", 9)]) |
35 | 43 | ListPositiveInt = List[PositiveInt] |
36 | 44 |
|
@@ -768,13 +776,6 @@ def test_add_subclass_dataclass_subclasses_disabled(parser): |
768 | 776 | parser.add_subclass_arguments(DataMain, "data") |
769 | 777 |
|
770 | 778 |
|
771 | | -@pytest.fixture |
772 | | -def enable_subclasses(): |
773 | | - with patch.dict("jsonargparse._common.subclasses_disabled_selectors"): |
774 | | - set_parsing_settings(subclasses_enabled=["is_pure_dataclass"]) |
775 | | - yield |
776 | | - |
777 | | - |
778 | 779 | @pytest.mark.parametrize("default", [None, DataMain()]) |
779 | 780 | def test_add_subclass_dataclass_subclasses_enabled(parser, default, enable_subclasses): |
780 | 781 | parser.add_subclass_arguments(DataMain, "data", default=default) |
@@ -849,6 +850,46 @@ def test_add_argument_dataclass_subclasses_enabled(parser, subtests, enable_subc |
849 | 850 | assert dataclasses.asdict(init.data) == {"p1": 2, "p2": "-"} |
850 | 851 |
|
851 | 852 |
|
| 853 | +def test_add_argument_dataclass_single_type_subclasses_enabled(parser, subclass_behavior): |
| 854 | + set_parsing_settings(subclasses_enabled=[DataMain]) |
| 855 | + assert "is_pure_dataclass" in subclasses_disabled_selectors |
| 856 | + |
| 857 | + parser.add_argument("--data", type=DataMain, default=DataMain(p1=2)) |
| 858 | + |
| 859 | + config = {"class_path": f"{__name__}.DataSub", "init_args": {"p2": "y"}} |
| 860 | + cfg = parser.parse_args([f"--data={json.dumps(config)}"]) |
| 861 | + init = parser.instantiate_classes(cfg) |
| 862 | + assert isinstance(init.data, DataSub) |
| 863 | + assert dataclasses.asdict(init.data) == {"p1": 2, "p2": "y"} |
| 864 | + dump = json_or_yaml_load(parser.dump(cfg))["data"] |
| 865 | + assert dump == {"class_path": f"{__name__}.DataSub", "init_args": {"p1": 2, "p2": "y"}} |
| 866 | + |
| 867 | + |
| 868 | +def test_add_argument_dataclass_single_type_subclasses_disabled(parser, enable_subclasses): |
| 869 | + set_parsing_settings(subclasses_disabled=[DataMain]) |
| 870 | + assert "is_pure_dataclass" not in subclasses_disabled_selectors |
| 871 | + |
| 872 | + parser.add_argument("--data", type=DataMain, default=DataMain(p1=2)) |
| 873 | + |
| 874 | + config = {"class_path": f"{__name__}.DataSub", "init_args": {"p2": "y"}} |
| 875 | + with pytest.raises(ArgumentError, match="Group 'data' does not accept option 'init_args.p2'"): |
| 876 | + parser.parse_args([f"--data={json.dumps(config)}"]) |
| 877 | + |
| 878 | + |
| 879 | +def test_add_argument_dataclass_subclasses_disabled_function(parser, enable_subclasses): |
| 880 | + def is_data_main(obj): |
| 881 | + return obj is DataMain |
| 882 | + |
| 883 | + set_parsing_settings(subclasses_disabled=[is_data_main]) |
| 884 | + assert "is_pure_dataclass" not in subclasses_disabled_selectors |
| 885 | + |
| 886 | + parser.add_argument("--data", type=DataMain, default=DataMain(p1=2)) |
| 887 | + |
| 888 | + config = {"class_path": f"{__name__}.DataSub", "init_args": {"p2": "y"}} |
| 889 | + with pytest.raises(ArgumentError, match="Group 'data' does not accept option 'init_args.p2'"): |
| 890 | + parser.parse_args([f"--data={json.dumps(config)}"]) |
| 891 | + |
| 892 | + |
852 | 893 | class ParentData: |
853 | 894 | def __init__(self, data: DataMain = DataMain(p1=2)): |
854 | 895 | self.data = data |
|
0 commit comments