encoding/jsonschema: fix dropping of struct for additionalProperties: true
Fixes #734
Change-Id: I4ff1ee63d894bcc76d25bc406c52eeda59deab90
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/8781
Reviewed-by: CUE cueckoo <cueckoo@gmail.com>
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>
diff --git a/cmd/cue/cmd/testdata/script/cmd_github.txt b/cmd/cue/cmd/testdata/script/cmd_github.txt
index e180a69..77de89b 100644
--- a/cmd/cue/cmd/testdata/script/cmd_github.txt
+++ b/cmd/cue/cmd/testdata/script/cmd_github.txt
@@ -957,7 +957,9 @@
#event: "check_run" | "check_suite" | "create" | "delete" | "deployment" | "deployment_status" | "fork" | "gollum" | "issue_comment" | "issues" | "label" | "member" | "milestone" | "page_build" | "project" | "project_card" | "project_column" | "public" | "pull_request" | "pull_request_review" | "pull_request_review_comment" | "pull_request_target" | "push" | "registry_package" | "release" | "status" | "watch" | "workflow_dispatch" | "workflow_run" | "repository_dispatch"
- #eventObject: null
+ #eventObject: null | {
+ ...
+ }
#expressionSyntax: =~"^\\$\\{\\{.*\\}\\}$"
diff --git a/cue.mod/pkg/github.com/SchemaStore/schemastore/src/schemas/json/github-workflow.cue b/cue.mod/pkg/github.com/SchemaStore/schemastore/src/schemas/json/github-workflow.cue
index 013dfa2..ac72436 100644
--- a/cue.mod/pkg/github.com/SchemaStore/schemastore/src/schemas/json/github-workflow.cue
+++ b/cue.mod/pkg/github.com/SchemaStore/schemastore/src/schemas/json/github-workflow.cue
@@ -631,7 +631,9 @@
#event: "check_run" | "check_suite" | "create" | "delete" | "deployment" | "deployment_status" | "fork" | "gollum" | "issue_comment" | "issues" | "label" | "member" | "milestone" | "page_build" | "project" | "project_card" | "project_column" | "public" | "pull_request" | "pull_request_review" | "pull_request_review_comment" | "pull_request_target" | "push" | "registry_package" | "release" | "status" | "watch" | "workflow_dispatch" | "workflow_run" | "repository_dispatch"
- #eventObject: null
+ #eventObject: null | {
+ ...
+ }
#expressionSyntax: =~"^\\$\\{\\{.*\\}\\}$"
diff --git a/cue/testdata/eval/github.txtar b/cue/testdata/eval/github.txtar
index bd88e5f..1bebdb0 100644
--- a/cue/testdata/eval/github.txtar
+++ b/cue/testdata/eval/github.txtar
@@ -1020,7 +1020,9 @@
#event: "check_run" | "check_suite" | "create" | "delete" | "deployment" | "deployment_status" | "fork" | "gollum" | "issue_comment" | "issues" | "label" | "member" | "milestone" | "page_build" | "project" | "project_card" | "project_column" | "public" | "pull_request" | "pull_request_review" | "pull_request_review_comment" | "pull_request_target" | "push" | "registry_package" | "release" | "status" | "watch" | "workflow_dispatch" | "workflow_run" | "repository_dispatch"
- #eventObject: null
+ #eventObject: null | {
+ ...
+ }
#expressionSyntax: =~"^\\$\\{\\{.*\\}\\}$"
@@ -1075,7 +1077,8 @@
name: (string){ string }
}
#event: (string){ |((string){ "check_run" }, (string){ "check_suite" }, (string){ "create" }, (string){ "delete" }, (string){ "deployment" }, (string){ "deployment_status" }, (string){ "fork" }, (string){ "gollum" }, (string){ "issue_comment" }, (string){ "issues" }, (string){ "label" }, (string){ "member" }, (string){ "milestone" }, (string){ "page_build" }, (string){ "project" }, (string){ "project_card" }, (string){ "project_column" }, (string){ "public" }, (string){ "pull_request" }, (string){ "pull_request_review" }, (string){ "pull_request_review_comment" }, (string){ "pull_request_target" }, (string){ "push" }, (string){ "registry_package" }, (string){ "release" }, (string){ "status" }, (string){ "watch" }, (string){ "workflow_dispatch" }, (string){ "workflow_run" }, (string){ "repository_dispatch" }) }
- #eventObject: (null){ null }
+ #eventObject: ((null|struct)){ |((null){ null }, (#struct){
+ }) }
#expressionSyntax: (string){ =~"^\\$\\{\\{.*\\}\\}$" }
#globs: (list){
0: (string){ strings.MinRunes(1) }
@@ -1305,7 +1308,8 @@
name: (string){ string }
}
#event: (string){ |((string){ "check_run" }, (string){ "check_suite" }, (string){ "create" }, (string){ "delete" }, (string){ "deployment" }, (string){ "deployment_status" }, (string){ "fork" }, (string){ "gollum" }, (string){ "issue_comment" }, (string){ "issues" }, (string){ "label" }, (string){ "member" }, (string){ "milestone" }, (string){ "page_build" }, (string){ "project" }, (string){ "project_card" }, (string){ "project_column" }, (string){ "public" }, (string){ "pull_request" }, (string){ "pull_request_review" }, (string){ "pull_request_review_comment" }, (string){ "pull_request_target" }, (string){ "push" }, (string){ "registry_package" }, (string){ "release" }, (string){ "status" }, (string){ "watch" }, (string){ "workflow_dispatch" }, (string){ "workflow_run" }, (string){ "repository_dispatch" }) }
- #eventObject: (null){ null }
+ #eventObject: ((null|struct)){ |((null){ null }, (#struct){
+ }) }
#expressionSyntax: (string){ =~"^\\$\\{\\{.*\\}\\}$" }
#globs: (list){
0: (string){ strings.MinRunes(1) }
@@ -1430,7 +1434,8 @@
name: (string){ string }
}
#event: (string){ |((string){ "check_run" }, (string){ "check_suite" }, (string){ "create" }, (string){ "delete" }, (string){ "deployment" }, (string){ "deployment_status" }, (string){ "fork" }, (string){ "gollum" }, (string){ "issue_comment" }, (string){ "issues" }, (string){ "label" }, (string){ "member" }, (string){ "milestone" }, (string){ "page_build" }, (string){ "project" }, (string){ "project_card" }, (string){ "project_column" }, (string){ "public" }, (string){ "pull_request" }, (string){ "pull_request_review" }, (string){ "pull_request_review_comment" }, (string){ "pull_request_target" }, (string){ "push" }, (string){ "registry_package" }, (string){ "release" }, (string){ "status" }, (string){ "watch" }, (string){ "workflow_dispatch" }, (string){ "workflow_run" }, (string){ "repository_dispatch" }) }
- #eventObject: (null){ null }
+ #eventObject: ((null|struct)){ |((null){ null }, (#struct){
+ }) }
#expressionSyntax: (string){ =~"^\\$\\{\\{.*\\}\\}$" }
#globs: (list){
0: (string){ strings.MinRunes(1) }
@@ -1559,7 +1564,8 @@
name: (string){ string }
}
#event: (string){ |((string){ "check_run" }, (string){ "check_suite" }, (string){ "create" }, (string){ "delete" }, (string){ "deployment" }, (string){ "deployment_status" }, (string){ "fork" }, (string){ "gollum" }, (string){ "issue_comment" }, (string){ "issues" }, (string){ "label" }, (string){ "member" }, (string){ "milestone" }, (string){ "page_build" }, (string){ "project" }, (string){ "project_card" }, (string){ "project_column" }, (string){ "public" }, (string){ "pull_request" }, (string){ "pull_request_review" }, (string){ "pull_request_review_comment" }, (string){ "pull_request_target" }, (string){ "push" }, (string){ "registry_package" }, (string){ "release" }, (string){ "status" }, (string){ "watch" }, (string){ "workflow_dispatch" }, (string){ "workflow_run" }, (string){ "repository_dispatch" }) }
- #eventObject: (null){ null }
+ #eventObject: ((null|struct)){ |((null){ null }, (#struct){
+ }) }
#expressionSyntax: (string){ =~"^\\$\\{\\{.*\\}\\}$" }
#globs: (list){
0: (string){ strings.MinRunes(1) }
@@ -1625,7 +1631,8 @@
name: (string){ string }
}
#event: (string){ |((string){ "check_run" }, (string){ "check_suite" }, (string){ "create" }, (string){ "delete" }, (string){ "deployment" }, (string){ "deployment_status" }, (string){ "fork" }, (string){ "gollum" }, (string){ "issue_comment" }, (string){ "issues" }, (string){ "label" }, (string){ "member" }, (string){ "milestone" }, (string){ "page_build" }, (string){ "project" }, (string){ "project_card" }, (string){ "project_column" }, (string){ "public" }, (string){ "pull_request" }, (string){ "pull_request_review" }, (string){ "pull_request_review_comment" }, (string){ "pull_request_target" }, (string){ "push" }, (string){ "registry_package" }, (string){ "release" }, (string){ "status" }, (string){ "watch" }, (string){ "workflow_dispatch" }, (string){ "workflow_run" }, (string){ "repository_dispatch" }) }
- #eventObject: (null){ null }
+ #eventObject: ((null|struct)){ |((null){ null }, (#struct){
+ }) }
#expressionSyntax: (string){ =~"^\\$\\{\\{.*\\}\\}$" }
#globs: (list){
0: (string){ strings.MinRunes(1) }
@@ -1699,7 +1706,8 @@
name: (string){ string }
}
#event: (string){ |((string){ "check_run" }, (string){ "check_suite" }, (string){ "create" }, (string){ "delete" }, (string){ "deployment" }, (string){ "deployment_status" }, (string){ "fork" }, (string){ "gollum" }, (string){ "issue_comment" }, (string){ "issues" }, (string){ "label" }, (string){ "member" }, (string){ "milestone" }, (string){ "page_build" }, (string){ "project" }, (string){ "project_card" }, (string){ "project_column" }, (string){ "public" }, (string){ "pull_request" }, (string){ "pull_request_review" }, (string){ "pull_request_review_comment" }, (string){ "pull_request_target" }, (string){ "push" }, (string){ "registry_package" }, (string){ "release" }, (string){ "status" }, (string){ "watch" }, (string){ "workflow_dispatch" }, (string){ "workflow_run" }, (string){ "repository_dispatch" }) }
- #eventObject: (null){ null }
+ #eventObject: ((null|struct)){ |((null){ null }, (#struct){
+ }) }
#expressionSyntax: (string){ =~"^\\$\\{\\{.*\\}\\}$" }
#globs: (list){
0: (string){ strings.MinRunes(1) }
@@ -1926,7 +1934,8 @@
name: (string){ string }
}
#event: (string){ |((string){ "check_run" }, (string){ "check_suite" }, (string){ "create" }, (string){ "delete" }, (string){ "deployment" }, (string){ "deployment_status" }, (string){ "fork" }, (string){ "gollum" }, (string){ "issue_comment" }, (string){ "issues" }, (string){ "label" }, (string){ "member" }, (string){ "milestone" }, (string){ "page_build" }, (string){ "project" }, (string){ "project_card" }, (string){ "project_column" }, (string){ "public" }, (string){ "pull_request" }, (string){ "pull_request_review" }, (string){ "pull_request_review_comment" }, (string){ "pull_request_target" }, (string){ "push" }, (string){ "registry_package" }, (string){ "release" }, (string){ "status" }, (string){ "watch" }, (string){ "workflow_dispatch" }, (string){ "workflow_run" }, (string){ "repository_dispatch" }) }
- #eventObject: (null){ null }
+ #eventObject: ((null|struct)){ |((null){ null }, (#struct){
+ }) }
#expressionSyntax: (string){ =~"^\\$\\{\\{.*\\}\\}$" }
#globs: (list){
0: (string){ strings.MinRunes(1) }
@@ -2048,7 +2057,8 @@
name: (string){ string }
}
#event: (string){ |((string){ "check_run" }, (string){ "check_suite" }, (string){ "create" }, (string){ "delete" }, (string){ "deployment" }, (string){ "deployment_status" }, (string){ "fork" }, (string){ "gollum" }, (string){ "issue_comment" }, (string){ "issues" }, (string){ "label" }, (string){ "member" }, (string){ "milestone" }, (string){ "page_build" }, (string){ "project" }, (string){ "project_card" }, (string){ "project_column" }, (string){ "public" }, (string){ "pull_request" }, (string){ "pull_request_review" }, (string){ "pull_request_review_comment" }, (string){ "pull_request_target" }, (string){ "push" }, (string){ "registry_package" }, (string){ "release" }, (string){ "status" }, (string){ "watch" }, (string){ "workflow_dispatch" }, (string){ "workflow_run" }, (string){ "repository_dispatch" }) }
- #eventObject: (null){ null }
+ #eventObject: ((null|struct)){ |((null){ null }, (#struct){
+ }) }
#expressionSyntax: (string){ =~"^\\$\\{\\{.*\\}\\}$" }
#globs: (list){
0: (string){ strings.MinRunes(1) }
@@ -2120,7 +2130,8 @@
name: (string){ string }
}
#event: (string){ |((string){ "check_run" }, (string){ "check_suite" }, (string){ "create" }, (string){ "delete" }, (string){ "deployment" }, (string){ "deployment_status" }, (string){ "fork" }, (string){ "gollum" }, (string){ "issue_comment" }, (string){ "issues" }, (string){ "label" }, (string){ "member" }, (string){ "milestone" }, (string){ "page_build" }, (string){ "project" }, (string){ "project_card" }, (string){ "project_column" }, (string){ "public" }, (string){ "pull_request" }, (string){ "pull_request_review" }, (string){ "pull_request_review_comment" }, (string){ "pull_request_target" }, (string){ "push" }, (string){ "registry_package" }, (string){ "release" }, (string){ "status" }, (string){ "watch" }, (string){ "workflow_dispatch" }, (string){ "workflow_run" }, (string){ "repository_dispatch" }) }
- #eventObject: (null){ null }
+ #eventObject: ((null|struct)){ |((null){ null }, (#struct){
+ }) }
#expressionSyntax: (string){ =~"^\\$\\{\\{.*\\}\\}$" }
#globs: (list){
0: (string){ strings.MinRunes(1) }
@@ -2246,7 +2257,8 @@
name: (string){ string }
}
#event: (string){ |((string){ "check_run" }, (string){ "check_suite" }, (string){ "create" }, (string){ "delete" }, (string){ "deployment" }, (string){ "deployment_status" }, (string){ "fork" }, (string){ "gollum" }, (string){ "issue_comment" }, (string){ "issues" }, (string){ "label" }, (string){ "member" }, (string){ "milestone" }, (string){ "page_build" }, (string){ "project" }, (string){ "project_card" }, (string){ "project_column" }, (string){ "public" }, (string){ "pull_request" }, (string){ "pull_request_review" }, (string){ "pull_request_review_comment" }, (string){ "pull_request_target" }, (string){ "push" }, (string){ "registry_package" }, (string){ "release" }, (string){ "status" }, (string){ "watch" }, (string){ "workflow_dispatch" }, (string){ "workflow_run" }, (string){ "repository_dispatch" }) }
- #eventObject: (null){ null }
+ #eventObject: ((null|struct)){ |((null){ null }, (#struct){
+ }) }
#expressionSyntax: (string){ =~"^\\$\\{\\{.*\\}\\}$" }
#globs: (list){
0: (string){ strings.MinRunes(1) }
@@ -2309,7 +2321,8 @@
name: (string){ string }
}
#event: (string){ |((string){ "check_run" }, (string){ "check_suite" }, (string){ "create" }, (string){ "delete" }, (string){ "deployment" }, (string){ "deployment_status" }, (string){ "fork" }, (string){ "gollum" }, (string){ "issue_comment" }, (string){ "issues" }, (string){ "label" }, (string){ "member" }, (string){ "milestone" }, (string){ "page_build" }, (string){ "project" }, (string){ "project_card" }, (string){ "project_column" }, (string){ "public" }, (string){ "pull_request" }, (string){ "pull_request_review" }, (string){ "pull_request_review_comment" }, (string){ "pull_request_target" }, (string){ "push" }, (string){ "registry_package" }, (string){ "release" }, (string){ "status" }, (string){ "watch" }, (string){ "workflow_dispatch" }, (string){ "workflow_run" }, (string){ "repository_dispatch" }) }
- #eventObject: (null){ null }
+ #eventObject: ((null|struct)){ |((null){ null }, (#struct){
+ }) }
#expressionSyntax: (string){ =~"^\\$\\{\\{.*\\}\\}$" }
#globs: (list){
0: (string){ strings.MinRunes(1) }
diff --git a/encoding/jsonschema/constraints.go b/encoding/jsonschema/constraints.go
index ef941e2..2b9e1ec 100644
--- a/encoding/jsonschema/constraints.go
+++ b/encoding/jsonschema/constraints.go
@@ -596,9 +596,6 @@
switch n.Kind() {
case cue.BoolKind:
s.closeStruct = !s.boolValue(n)
- if !s.closeStruct {
- s.usedTypes |= cue.StructKind
- }
case cue.StructKind:
s.usedTypes |= cue.StructKind
diff --git a/encoding/jsonschema/decode_test.go b/encoding/jsonschema/decode_test.go
index 9912cd8..252ae28 100644
--- a/encoding/jsonschema/decode_test.go
+++ b/encoding/jsonschema/decode_test.go
@@ -34,6 +34,7 @@
"cuelang.org/go/cue/token"
"cuelang.org/go/encoding/json"
"cuelang.org/go/encoding/yaml"
+ "cuelang.org/go/internal"
"cuelang.org/go/internal/cuetest"
_ "cuelang.org/go/pkg"
)
@@ -148,3 +149,38 @@
})
assert.NoError(t, err)
}
+
+func TestX(t *testing.T) {
+ t.Skip()
+ data := `
+-- schema.json --
+`
+
+ a := txtar.Parse([]byte(data))
+
+ r := &cue.Runtime{}
+ var in *cue.Instance
+ var err error
+ for _, f := range a.Files {
+ switch path.Ext(f.Name) {
+ case ".json":
+ in, err = json.Decode(r, f.Name, f.Data)
+ if err != nil {
+ t.Fatal(err)
+ }
+ case ".yaml":
+ in, err = yaml.Decode(r, f.Name, f.Data)
+ if err != nil {
+ t.Fatal(err)
+ }
+ }
+ }
+
+ cfg := &Config{ID: "test"}
+ expr, err := Extract(in, cfg)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ t.Fatal(internal.DebugStr(expr))
+}
diff --git a/encoding/jsonschema/testdata/emptyobj.txtar b/encoding/jsonschema/testdata/emptyobj.txtar
new file mode 100644
index 0000000..61ddea1
--- /dev/null
+++ b/encoding/jsonschema/testdata/emptyobj.txtar
@@ -0,0 +1,36 @@
+// Objects without properties should convert correctly.
+//
+// Issue #734
+-- github-workflow.json --
+{
+ "$schema": "http://json-schema.org/draft-07/schema",
+ "definitions": {
+ "obj1": {
+ "oneOf": [
+ {
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "additionalProperties": true
+ },
+ "obj2": {
+ "type": [ "object", "null" ],
+ "additionalProperties": true
+ }
+ }
+}
+-- out.err --
+-- out.cue --
+@jsonschema(schema="http://json-schema.org/draft-07/schema")
+_
+
+#obj1: null | {
+ ...
+}
+
+#obj2: null | {
+ ...
+}
diff --git a/encoding/jsonschema/testdata/github.txtar b/encoding/jsonschema/testdata/github.txtar
index e644d9f..69699f9 100644
--- a/encoding/jsonschema/testdata/github.txtar
+++ b/encoding/jsonschema/testdata/github.txtar
@@ -1972,7 +1972,9 @@
#event: "check_run" | "check_suite" | "create" | "delete" | "deployment" | "deployment_status" | "fork" | "gollum" | "issue_comment" | "issues" | "label" | "member" | "milestone" | "page_build" | "project" | "project_card" | "project_column" | "public" | "pull_request" | "pull_request_review" | "pull_request_review_comment" | "pull_request_target" | "push" | "registry_package" | "release" | "status" | "watch" | "workflow_dispatch" | "workflow_run" | "repository_dispatch"
-#eventObject: null
+#eventObject: null | {
+ ...
+}
#expressionSyntax: =~"^\\$\\{\\{.*\\}\\}$"