From 731e1de353d251072cb926e1b84b5211b772bb5f Mon Sep 17 00:00:00 2001 From: njzjz-bot Date: Mon, 24 Aug 2026 03:10:37 +0800 Subject: [PATCH] fix: validate repeated mapping schema entries Coding-Agent: Codex Codex-Version: codex-cli 0.149.0 Model: gpt-5.6-sol Reasoning-Effort: xhigh --- dargs/json_schema.py | 10 ++++++++-- tests/test_json_schema.py | 19 ++++++++++++++++++- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/dargs/json_schema.py b/dargs/json_schema.py index 221dd3b..17695c3 100644 --- a/dargs/json_schema.py +++ b/dargs/json_schema.py @@ -119,13 +119,19 @@ def _convert_single_argument(argument: Argument) -> dict: if allof: data["allOf"] = allof else: - data["items"] = { + repeated_value = { "type": "object", "properties": properties, "required": required, } if allof: - data["items"]["allOf"] = allof + repeated_value["allOf"] = allof + # Repeated lists validate through ``items`` while repeated mappings + # validate every dynamically named entry through ``additionalProperties``. + if "array" in data["type"]: + data["items"] = repeated_value + if "object" in data["type"]: + data["additionalProperties"] = repeated_value return data diff --git a/tests/test_json_schema.py b/tests/test_json_schema.py index 2da52e8..ef23d61 100644 --- a/tests/test_json_schema.py +++ b/tests/test_json_schema.py @@ -3,8 +3,9 @@ import json import unittest -from jsonschema import validate +from jsonschema import ValidationError, validate +from dargs import Argument from dargs.json_schema import _convert_types, generate_json_schema from .dpmdargs import example_json_str, gen_args @@ -28,3 +29,19 @@ def test_convert_types(self) -> None: self.assertEqual(_convert_types(dict), "object") with self.assertRaises(ValueError): _convert_types(set) + + def test_repeat_dict_validates_each_entry(self) -> None: + """Each value in a dict-style repeated argument uses the item schema.""" + argument = Argument( + "base", + dict, + [Argument("sub1", int), Argument("sub2", str)], + repeat=True, + ) + schema = generate_json_schema(argument) + + validate({"item1": {"sub1": 1, "sub2": "valid"}}, schema) + with self.assertRaises(ValidationError): + validate({"item1": {"sub1": 1, "sub2": None}}, schema) + with self.assertRaises(ValidationError): + validate({"item1": {"sub1": 1}}, schema)