From 8f2fdddff58d9a5251b2c629fafea43a5cca081d Mon Sep 17 00:00:00 2001 From: Virgil Date: Thu, 2 Apr 2026 09:48:13 +0000 Subject: [PATCH] fix(i18n): tighten grammar object detection Co-Authored-By: Virgil --- loader.go | 5 +++-- loader_test.go | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/loader.go b/loader.go index feb8fba..51f2baf 100644 --- a/loader.go +++ b/loader.go @@ -328,10 +328,11 @@ func loadGrammarNumber(fullKey string, v map[string]any, grammar *GrammarData) b } func isVerbFormObject(m map[string]any) bool { - _, hasBase := m["base"] _, hasPast := m["past"] _, hasGerund := m["gerund"] - return (hasBase || hasPast || hasGerund) && !isPluralObject(m) + // Verb objects are identified by their inflected forms. A bare "base" + // field is metadata, not enough to claim the object is a verb table. + return (hasPast || hasGerund) && !isPluralObject(m) } func isNounFormObject(m map[string]any) bool { diff --git a/loader_test.go b/loader_test.go index ec20244..3705407 100644 --- a/loader_test.go +++ b/loader_test.go @@ -328,6 +328,40 @@ func TestFlattenWithGrammar(t *testing.T) { } } +func TestFlattenWithGrammar_DetectsSchemaObjectsOutsideGrammarPaths(t *testing.T) { + messages := make(map[string]Message) + grammar := &GrammarData{ + Verbs: make(map[string]VerbForms), + Words: make(map[string]string), + } + + raw := map[string]any{ + "lexicon": map[string]any{ + "base_only": map[string]any{ + "base": "base", + }, + }, + "phrases": map[string]any{ + "draft": map[string]any{ + "past": "drafted", + "gerund": "drafting", + }, + }, + } + + flattenWithGrammar("", raw, messages, grammar) + + if _, ok := grammar.Verbs["draft"]; !ok { + t.Fatal("verb schema object outside gram.verb.* was not extracted") + } + if _, ok := messages["phrases.draft"]; ok { + t.Fatal("verb schema object should not be flattened into messages") + } + if _, ok := grammar.Verbs["base_only"]; ok { + t.Fatal("base-only object should not be detected as a verb table") + } +} + func TestMergeGrammarData(t *testing.T) { const lang = "zz" original := GetGrammarData(lang) -- 2.45.3