From 15fbf7f75d7d7980862f5a73ab30b64b9a67a9c2 Mon Sep 17 00:00:00 2001 From: Roger Peppe Date: Tue, 10 Sep 2024 11:26:06 +0100 Subject: [PATCH] internal/filetypes: default strictFeatures to true MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In general in JSON Schema we want to ignore keywords which aren't defined, but it seems better to default to giving an error when there's a keyword that we know is not implemented, meaning that the schema cannot be interpreted correctly. To revert to previous behavior, `jsonschema+strictFeatures=0:` can be used. Signed-off-by: Roger Peppe Change-Id: I65d24ae8c147d36499b4e02b418bedcc6d1a376b Reviewed-on: https://review.gerrithub.io/c/cue-lang/cue/+/1200932 Reviewed-by: Daniel Martí TryBot-Result: CUEcueckoo Unity-Result: CUE porcuepine --- cmd/cue/cmd/help.go | 7 ++++--- .../cmd/testdata/script/def_jsonschema.txtar | 5 ++++- internal/filetypes/filetypes_test.go | 19 +++++++++++++++++-- internal/filetypes/types.cue | 2 +- 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/cmd/cue/cmd/help.go b/cmd/cue/cmd/help.go index ea0d74b6c..715672434 100644 --- a/cmd/cue/cmd/help.go +++ b/cmd/cue/cmd/help.go @@ -613,14 +613,15 @@ The following tags are only valid in combination with other tags, and influence the functioning of the codec. The tag they are valid with is mentioned in parentheses at the end. - strictFeatures report errors for lossy mappings (jsonschema) + strictFeatures report errors for lossy mappings. Enabled by default (jsonschema) strictKeywords report errors for unknown keywords (jsonschema) strict report errors for either of the above (jsonschema) The above flags also accept a boolean flag value (e.g. true, 1, false, 0) -to set them explicitly. For example: +to set them explicitly. For example, to ignore unimplemented JSON Schema +features rather than giving an error: - jsonschema+strictKeywords=0+strictFeatures=1 + jsonschema+strictFeatures=0 Many commands also support the --out and --outfile/-o flags. The --out flag specifies the output type using a qualifier diff --git a/cmd/cue/cmd/testdata/script/def_jsonschema.txtar b/cmd/cue/cmd/testdata/script/def_jsonschema.txtar index 474f09973..f68cc3b97 100644 --- a/cmd/cue/cmd/testdata/script/def_jsonschema.txtar +++ b/cmd/cue/cmd/testdata/script/def_jsonschema.txtar @@ -5,7 +5,10 @@ cmp stdout expect-stdout exec cue def schema.json -p schema -l '#Person:' cmp stdout expect-stdout -exec cue def jsonschema: bad.json +! exec cue def jsonschema: bad.json +cmp stderr expect-stderr-strict-features + +exec cue def jsonschema+strictFeatures=0: bad.json ! exec cue def jsonschema: bad.json --strict cmp stderr expect-stderr diff --git a/internal/filetypes/filetypes_test.go b/internal/filetypes/filetypes_test.go index a675fe322..6e4805a98 100644 --- a/internal/filetypes/filetypes_test.go +++ b/internal/filetypes/filetypes_test.go @@ -181,7 +181,7 @@ func TestFromFile(t *testing.T) { Form: build.Schema, BoolTags: map[string]bool{ "strict": false, - "strictFeatures": false, + "strictFeatures": true, "strictKeywords": false, }, }, @@ -419,7 +419,7 @@ func TestParseArgs(t *testing.T) { Interpretation: "jsonschema", BoolTags: map[string]bool{ "strict": false, - "strictFeatures": false, + "strictFeatures": true, "strictKeywords": false, }, }, @@ -439,6 +439,21 @@ func TestParseArgs(t *testing.T) { }, }, }, + }, { + in: "jsonschema+strictFeatures=0: bar.schema", + out: []*build.File{ + { + Filename: "bar.schema", + Encoding: "json", + Interpretation: "jsonschema", + Form: build.Schema, + BoolTags: map[string]bool{ + "strict": false, + "strictFeatures": false, + "strictKeywords": false, + }, + }, + }, }, { in: `json: c:\foo.json c:\path\to\file.dat`, out: []*build.File{ diff --git a/internal/filetypes/types.cue b/internal/filetypes/types.cue index 19c95c6cd..7f42bb4fb 100644 --- a/internal/filetypes/types.cue +++ b/internal/filetypes/types.cue @@ -297,7 +297,7 @@ interpretations: jsonschema: { boolTags: { strict: *false | bool strictKeywords: *strict | bool - strictFeatures: *strict | bool + strictFeatures: *true | bool } }