Skip to content

Commit 7edaccf

Browse files
authored
Merge pull request #123 from genlm/DRMacIver/validate-required-keys
Validate required keys in fail fast parser for JSON potential
2 parents 252ea5f + 33896bb commit 7edaccf

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

genlm/control/potential/built_in/json.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -855,6 +855,11 @@ async def parse(self, input: Input):
855855
while True:
856856
await input.skip_whitespace()
857857
if await input.current_char() == "}":
858+
if not self.required_keys.issubset(keys_seen):
859+
raise ParseError(
860+
"Missing keys: "
861+
+ ", ".join(map(json.dumps, self.required_keys))
862+
)
858863
await input.read(1)
859864
break
860865
if not first:

tests/potential/test_json.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1553,3 +1553,23 @@ def test_trie_adding_prefix_of_existing():
15531553

15541554
assert trie.root.children["b"].prefix == "ar"
15551555
assert trie.root.children["b"].accepting
1556+
1557+
1558+
@pytest.mark.asyncio
1559+
async def test_rejects_if_required_keys_are_missing():
1560+
parser = json_schema_parser(
1561+
{
1562+
"type": "object",
1563+
"properties": {"foo": {"type": "string"}, "bar": {"type": "number"}},
1564+
"required": ["foo"],
1565+
}
1566+
)
1567+
1568+
for incomplete in [
1569+
"{}",
1570+
'{"bar": 0.0}',
1571+
]:
1572+
with pytest.raises(ParseError):
1573+
await parser.parse_string(incomplete)
1574+
1575+
assert await parser.parse_string('{"foo": "hello"}') == {"foo": "hello"}

0 commit comments

Comments
 (0)