Repository: kcl-lang/kcl-go
Pull request #443 (2025-02-10 05:34:30)

Chore: (deps): bump github.com/goccy/go-yaml from 1.15.17 to 1.15.19
Bumps [github.com/goccy/go-yaml](https://github.com/goccy/go-yaml) from 1.15.17 to 1.15.19.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/goccy/go-yaml/releases">github.com/goccy/go-yaml's releases</a>.</em></p>
<blockquote>
<h2>1.15.19</h2>
<h2>What's Changed</h2>
<ul>
<li>Fix format with comment by <a href="https://github.com/goccy"><code>@​goccy</code></a> in <a href="https://redirect.github.com/goccy/go-yaml/pull/645">goccy/go-yaml#645</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/goccy/go-yaml/compare/v1.15.18...v1.15.19">https://github.com/goccy/go-yaml/compare/v1.15.18...v1.15.19</a></p>
<h2>1.15.18</h2>
<h2>What's Changed</h2>
<ul>
<li>Fix toString for TagNode by <a href="https://github.com/LarsStegman"><code>@​LarsStegman</code></a> in <a href="https://redirect.github.com/goccy/go-yaml/pull/633">goccy/go-yaml#633</a></li>
<li>fixed typo in ycat install example by <a href="https://github.com/brammeleman"><code>@​brammeleman</code></a> in <a href="https://redirect.github.com/goccy/go-yaml/pull/640">goccy/go-yaml#640</a></li>
<li>Add node formatter by <a href="https://github.com/goccy"><code>@​goccy</code></a> in <a href="https://redirect.github.com/goccy/go-yaml/pull/644">goccy/go-yaml#644</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/brammeleman"><code>@​brammeleman</code></a> made their first contribution in <a href="https://redirect.github.com/goccy/go-yaml/pull/640">goccy/go-yaml#640</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/goccy/go-yaml/compare/v1.15.17...v1.15.18">https://github.com/goccy/go-yaml/compare/v1.15.17...v1.15.18</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/goccy/go-yaml/commit/e6c495e05873493ae227121bd6f297cd7dab4ec8"><code>e6c495e</code></a> fix format with comment (<a href="https://redirect.github.com/goccy/go-yaml/issues/645">#645</a>)</li>
<li><a href="https://github.com/goccy/go-yaml/commit/0653c8084372eacf15d2985c06d15554b7038776"><code>0653c80</code></a> add node formatter (<a href="https://redirect.github.com/goccy/go-yaml/issues/644">#644</a>)</li>
<li><a href="https://github.com/goccy/go-yaml/commit/8d4b192f87ebaceb061adfe9bd3ff32f41d01f49"><code>8d4b192</code></a> fixed typo in ycat install example (<a href="https://redirect.github.com/goccy/go-yaml/issues/640">#640</a>)</li>
<li><a href="https://github.com/goccy/go-yaml/commit/81dbf2619c42bb056627d6dfd93a2ff7ec285075"><code>81dbf26</code></a> Fix toString for TagNode (<a href="https://redirect.github.com/goccy/go-yaml/issues/633">#633</a>)</li>
<li>See full diff in <a href="https://github.com/goccy/go-yaml/compare/v1.15.17...v1.15.19">compare view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/goccy/go-yaml&package-manager=go_modules&previous-version=1.15.17&new-version=1.15.19)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)


</details>

coveralls: ## Pull Request Test Coverage Report for [Build 13234272055](https://coveralls.io/builds/72156665)


### Details

* **0** of **0**   changed or added relevant lines in **0** files are covered.
* No unchanged relevant lines lost coverage.
* Overall coverage remained the same at **36.529%**

---



|  Totals | [![Coverage Status](https://coveralls.io/builds/72156665/badge)](https://coveralls.io/builds/72156665) |
| :-- | --: |
| Change from base [Build 13211408095](https://coveralls.io/builds/72144099): |  0.0% |
| Covered Lines: | 5495 |
| Relevant Lines: | 15043 |

---
##### 💛  - [Coveralls](https://coveralls.io)

coveralls: ## Pull Request Test Coverage Report for [Build 13234272055](https://coveralls.io/builds/72156665)


### Details

* **0** of **0**   changed or added relevant lines in **0** files are covered.
* No unchanged relevant lines lost coverage.
* Overall coverage remained the same at **36.529%**

---



|  Totals | [![Coverage Status](https://coveralls.io/builds/72156665/badge)](https://coveralls.io/builds/72156665) |
| :-- | --: |
| Change from base [Build 13211408095](https://coveralls.io/builds/72144099): |  0.0% |
| Covered Lines: | 5495 |
| Relevant Lines: | 15043 |

---
##### 💛  - [Coveralls](https://coveralls.io)


Patch:
diff --git a/go.mod b/go.mod
index 209a87c..e727580 100644
--- a/go.mod
+++ b/go.mod
@@ -7,7 +7,7 @@ require (
 	github.com/chai2010/protorpc v1.1.4
 	github.com/emicklei/proto v1.14.0
 	github.com/getkin/kin-openapi v0.129.0
-	github.com/goccy/go-yaml v1.15.17
+	github.com/goccy/go-yaml v1.15.19
 	github.com/golang/protobuf v1.5.4
 	github.com/google/go-cmp v0.6.0
 	github.com/iancoleman/strcase v0.3.0
@@ -20,7 +20,7 @@ require (
 	github.com/yuin/goldmark v1.7.8
 	golang.org/x/tools v0.29.0
 	google.golang.org/grpc v1.70.0
-	google.golang.org/protobuf v1.36.4
+	google.golang.org/protobuf v1.36.5
 	gopkg.in/yaml.v3 v3.0.1
 	kcl-lang.io/lib v0.11.1
 )
diff --git a/go.sum b/go.sum
index c431d73..6d75492 100644
--- a/go.sum
+++ b/go.sum
@@ -24,8 +24,8 @@ github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+Gr
 github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
 github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM=
 github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE=
-github.com/goccy/go-yaml v1.15.17 h1:dK4FbbTTEOZTLH/NW3/xBqg0JdC14YKVmYwS9GT3H60=
-github.com/goccy/go-yaml v1.15.17/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=
+github.com/goccy/go-yaml v1.15.19 h1:ivDxLiW6SbmqPZwSAM9Yq+Yr68C9FLbTNyuH3ITizxQ=
+github.com/goccy/go-yaml v1.15.19/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=
 github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E=
 github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0=
 github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -106,8 +106,8 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20241202173237-19429a94021a h1:
 google.golang.org/genproto/googleapis/rpc v0.0.0-20241202173237-19429a94021a/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU=
 google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ=
 google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw=
-google.golang.org/protobuf v1.36.4 h1:6A3ZDJHn/eNqc1i+IdefRzy/9PokBTPvcqMySR7NNIM=
-google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
+google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM=
+google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
diff --git a/pkg/tools/gen/genkcl_value.go b/pkg/tools/gen/genkcl_value.go
index 12f8984..5ecd34e 100644
--- a/pkg/tools/gen/genkcl_value.go
+++ b/pkg/tools/gen/genkcl_value.go
@@ -52,6 +52,7 @@ type printer struct {
 	writer       io.Writer
 	listInline   bool
 	configInline bool
+	escape       bool
 }
 
 func (p *printer) writeIndent() {
@@ -243,7 +244,7 @@ func (p *printer) walkValue(v any) error {
 		p.writeConfigEnd()
 	case reflect.String:
 		value := val.String()
-		if isStringEscaped(value) {
+		if isStringEscaped(value) && p.escape {
 			if value[len(value)-1] == '"' {
 				// if the string ends with '"' then we need to add a space after the closing triple quote
 				p.write(fmt.Sprintf(`r"""%s """`, value))
diff --git a/pkg/tools/gen/template.go b/pkg/tools/gen/template.go
index 4352a13..48c2555 100644
--- a/pkg/tools/gen/template.go
+++ b/pkg/tools/gen/template.go
@@ -29,10 +29,11 @@ var (
 )
 
 var funcs = template.FuncMap{
-	"formatType":  formatType,
-	"formatValue": formatValue,
-	"formatName":  formatName,
-	"indentLines": indentLines,
+	"formatType":            formatType,
+	"formatValue":           formatValue,
+	"formatValueWithEscape": formatValueWithEscape,
+	"formatName":            formatName,
+	"indentLines":           indentLines,
 	"isKclData": func(v interface{}) bool {
 		_, ok := v.([]data)
 		return ok
@@ -92,12 +93,13 @@ func formatType(t typeInterface) string {
 	return typAny
 }
 
-func formatValue(v interface{}) string {
+func formatValueWithEscape(v interface{}, escape bool) string {
 	var buf bytes.Buffer
 	p := &printer{
 		listInline:   true,
 		configInline: true,
 		writer:       &buf,
+		escape:       escape,
 	}
 	err := p.walkValue(v)
 	if err != nil {
@@ -107,6 +109,10 @@ func formatValue(v interface{}) string {
 	}
 }
 
+func formatValue(v interface{}) string {
+	return formatValueWithEscape(v, true)
+}
+
 var kclKeywords = map[string]struct{}{
 	"True":      {},
 	"False":     {},
diff --git a/pkg/tools/gen/templates/kcl/document.gotmpl b/pkg/tools/gen/templates/kcl/document.gotmpl
index f9b44b9..a217cf2 100644
--- a/pkg/tools/gen/templates/kcl/document.gotmpl
+++ b/pkg/tools/gen/templates/kcl/document.gotmpl
@@ -10,7 +10,7 @@
     ----------
   {{- range .Properties }}
     {{ formatName .Name }} : {{ formatType .Type }}, {{ if .Required }}required{{ else }}optional{{ end }}
-    {{- if .HasDefault }}, default is {{ formatValue .DefaultValue }}{{ end }}
+    {{- if .HasDefault }}, default is {{ formatValueWithEscape .DefaultValue false}}{{ end }}
     {{- if .Description }}{{ "\n" }}{{ indentLines .Description "        " }}{{ end }}
   {{- end -}}
 


Test patch:
diff --git a/pkg/tools/gen/genkcl_test.go b/pkg/tools/gen/genkcl_test.go
index 5bd9773..c83695e 100644
--- a/pkg/tools/gen/genkcl_test.go
+++ b/pkg/tools/gen/genkcl_test.go
@@ -2,6 +2,7 @@ package gen
 
 import (
 	"bytes"
+	"fmt"
 	"log"
 	"os"
 	"path/filepath"
@@ -142,11 +143,14 @@ func TestGenKclFromJsonSchema(t *testing.T) {
 	for _, testcase := range cases {
 		t.Run(testcase.name, func(t *testing.T) {
 			var buf bytes.Buffer
-			err := GenKcl(&buf, testcase.input, nil, &GenKclOptions{})
+			err := GenKcl(&buf, testcase.input, nil, &GenKclOptions{
+				Mode: ModeJsonSchema,
+			})
 			if err != nil {
 				t.Fatal(err)
 			}
 			result := buf.Bytes()
+			fmt.Printf("result: %v\n", string(result))
 			assert2.Equal(t, testcase.expect, string(bytes.ReplaceAll(result, []byte("\r\n"), []byte("\n"))))
 		})
 	}
diff --git a/pkg/tools/gen/testdata/jsonschema/document_quota/expect.k b/pkg/tools/gen/testdata/jsonschema/document_quota/expect.k
new file mode 100644
index 0000000..3ac6184
--- /dev/null
+++ b/pkg/tools/gen/testdata/jsonschema/document_quota/expect.k
@@ -0,0 +1,16 @@
+"""
+This file was generated by the KCL auto-gen tool. DO NOT EDIT.
+Editing this file might prove futile when you re-run the KCL auto-gen generate command.
+"""
+
+schema Input:
+    r"""
+    Input
+
+    Attributes
+    ----------
+    foo : str, required, default is "more \"quotes\""
+    """
+
+    foo: str = r"""more "quotes" """
+
diff --git a/pkg/tools/gen/testdata/jsonschema/document_quota/input.json b/pkg/tools/gen/testdata/jsonschema/document_quota/input.json
new file mode 100644
index 0000000..e6a3581
--- /dev/null
+++ b/pkg/tools/gen/testdata/jsonschema/document_quota/input.json
@@ -0,0 +1,12 @@
+{
+    "type": "object",
+    "properties": {
+        "foo": {
+            "type": "string",
+            "default": "more \"quotes\""
+        }
+    },
+    "required": [
+        "foo"
+    ]
+}
\ No newline at end of file
diff --git a/pkg/tools/gen/testdata/jsonschema/document_quota_0/expect.k b/pkg/tools/gen/testdata/jsonschema/document_quota_0/expect.k
new file mode 100644
index 0000000..986ecc7
--- /dev/null
+++ b/pkg/tools/gen/testdata/jsonschema/document_quota_0/expect.k
@@ -0,0 +1,24 @@
+"""
+This file was generated by the KCL auto-gen tool. DO NOT EDIT.
+Editing this file might prove futile when you re-run the KCL auto-gen generate command.
+"""
+
+schema Input:
+    r"""
+    Input
+
+    Attributes
+    ----------
+    foo : str, required, default is "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque pellentesque ligula consequat, aliquam elit vitae, dapibus velit. Donec posuere venenatis diam, et viverra mi facilisis nec. Mauris eget velit eu risus ornare accumsan. Suspendisse rutrum vehicula tellus. Morbi lobortis lorem eget odio consequat dapibus. Etiam metus arcu, tincidunt id enim eget, mollis tempor purus. Sed finibus ante id odio dignissim mollis. Fusce auctor sit amet risus nec dictum. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec ornare orci nec fermentum accumsan. Vivamus fermentum dolor non ligula consequat, vitae pellentesque quam accumsan. Ut lobortis facilisis pharetra. Nullam tristique orci in nisi tempor, ut consequat metus molestie.\n\nSuspendisse justo quam, fermentum id ultrices sed, fringilla non eros. Ut leo risus, efficitur id posuere sit amet, sagittis vitae risus. Nullam mattis arcu quis ligula tempus ullamcorper. Donec vel nibh vel sem fermentum efficitur id a velit. Maecenas congue iaculis arcu et consectetur. Maecenas gravida nisl vitae eros dignissim, rutrum malesuada felis pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae;\n\nCurabitur vitae augue et sapien pulvinar scelerisque. Proin eleifend varius feugiat. Nullam sagittis ante at ligula pharetra, vitae molestie turpis aliquet. Donec vitae odio nec tortor accumsan condimentum. Phasellus suscipit semper tortor, ac sodales orci varius non. Praesent iaculis ultrices dui in fringilla. Sed tristique libero sed sapien sagittis eleifend.\n\nCurabitur id fermentum ex, ac aliquam ligula. Duis tellus neque, luctus eu tristique eget, viverra vitae magna. Maecenas facilisis mauris quam, eu sodales elit vulputate quis. Suspendisse nulla ipsum, auctor ut efficitur sed, rhoncus ut nisi. Donec viverra libero a rhoncus bibendum. Nullam sit amet metus nisi. Nunc venenatis eu ante quis egestas.\n\nUt sollicitudin pellentesque sem in consectetur. Nunc imperdiet lacus in venenatis consectetur. Vestibulum sed turpis tempor, mattis velit eu, hendrerit quam. Morbi ac pretium orci, ut mattis felis. Phasellus id faucibus orci, lobortis bibendum eros. Nunc nec libero consectetur, elementum tortor vitae, cursus orci. Curabitur nisl velit, auctor eu rutrum id, suscipit cursus est."
+    """
+
+    foo: str = r"""Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque pellentesque ligula consequat, aliquam elit vitae, dapibus velit. Donec posuere venenatis diam, et viverra mi facilisis nec. Mauris eget velit eu risus ornare accumsan. Suspendisse rutrum vehicula tellus. Morbi lobortis lorem eget odio consequat dapibus. Etiam metus arcu, tincidunt id enim eget, mollis tempor purus. Sed finibus ante id odio dignissim mollis. Fusce auctor sit amet risus nec dictum. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec ornare orci nec fermentum accumsan. Vivamus fermentum dolor non ligula consequat, vitae pellentesque quam accumsan. Ut lobortis facilisis pharetra. Nullam tristique orci in nisi tempor, ut consequat metus molestie.
+
+Suspendisse justo quam, fermentum id ultrices sed, fringilla non eros. Ut leo risus, efficitur id posuere sit amet, sagittis vitae risus. Nullam mattis arcu quis ligula tempus ullamcorper. Donec vel nibh vel sem fermentum efficitur id a velit. Maecenas congue iaculis arcu et consectetur. Maecenas gravida nisl vitae eros dignissim, rutrum malesuada felis pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae;
+
+Curabitur vitae augue et sapien pulvinar scelerisque. Proin eleifend varius feugiat. Nullam sagittis ante at ligula pharetra, vitae molestie turpis aliquet. Donec vitae odio nec tortor accumsan condimentum. Phasellus suscipit semper tortor, ac sodales orci varius non. Praesent iaculis ultrices dui in fringilla. Sed tristique libero sed sapien sagittis eleifend.
+
+Curabitur id fermentum ex, ac aliquam ligula. Duis tellus neque, luctus eu tristique eget, viverra vitae magna. Maecenas facilisis mauris quam, eu sodales elit vulputate quis. Suspendisse nulla ipsum, auctor ut efficitur sed, rhoncus ut nisi. Donec viverra libero a rhoncus bibendum. Nullam sit amet metus nisi. Nunc venenatis eu ante quis egestas.
+
+Ut sollicitudin pellentesque sem in consectetur. Nunc imperdiet lacus in venenatis consectetur. Vestibulum sed turpis tempor, mattis velit eu, hendrerit quam. Morbi ac pretium orci, ut mattis felis. Phasellus id faucibus orci, lobortis bibendum eros. Nunc nec libero consectetur, elementum tortor vitae, cursus orci. Curabitur nisl velit, auctor eu rutrum id, suscipit cursus est."""
+
diff --git a/pkg/tools/gen/testdata/jsonschema/document_quota_0/input.json b/pkg/tools/gen/testdata/jsonschema/document_quota_0/input.json
new file mode 100644
index 0000000..02cf26c
--- /dev/null
+++ b/pkg/tools/gen/testdata/jsonschema/document_quota_0/input.json
@@ -0,0 +1,12 @@
+{
+    "type": "object",
+    "properties": {
+        "foo": {
+            "type": "string",
+            "default": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque pellentesque ligula consequat, aliquam elit vitae, dapibus velit. Donec posuere venenatis diam, et viverra mi facilisis nec. Mauris eget velit eu risus ornare accumsan. Suspendisse rutrum vehicula tellus. Morbi lobortis lorem eget odio consequat dapibus. Etiam metus arcu, tincidunt id enim eget, mollis tempor purus. Sed finibus ante id odio dignissim mollis. Fusce auctor sit amet risus nec dictum. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec ornare orci nec fermentum accumsan. Vivamus fermentum dolor non ligula consequat, vitae pellentesque quam accumsan. Ut lobortis facilisis pharetra. Nullam tristique orci in nisi tempor, ut consequat metus molestie.\n\nSuspendisse justo quam, fermentum id ultrices sed, fringilla non eros. Ut leo risus, efficitur id posuere sit amet, sagittis vitae risus. Nullam mattis arcu quis ligula tempus ullamcorper. Donec vel nibh vel sem fermentum efficitur id a velit. Maecenas congue iaculis arcu et consectetur. Maecenas gravida nisl vitae eros dignissim, rutrum malesuada felis pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae;\n\nCurabitur vitae augue et sapien pulvinar scelerisque. Proin eleifend varius feugiat. Nullam sagittis ante at ligula pharetra, vitae molestie turpis aliquet. Donec vitae odio nec tortor accumsan condimentum. Phasellus suscipit semper tortor, ac sodales orci varius non. Praesent iaculis ultrices dui in fringilla. Sed tristique libero sed sapien sagittis eleifend.\n\nCurabitur id fermentum ex, ac aliquam ligula. Duis tellus neque, luctus eu tristique eget, viverra vitae magna. Maecenas facilisis mauris quam, eu sodales elit vulputate quis. Suspendisse nulla ipsum, auctor ut efficitur sed, rhoncus ut nisi. Donec viverra libero a rhoncus bibendum. Nullam sit amet metus nisi. Nunc venenatis eu ante quis egestas.\n\nUt sollicitudin pellentesque sem in consectetur. Nunc imperdiet lacus in venenatis consectetur. Vestibulum sed turpis tempor, mattis velit eu, hendrerit quam. Morbi ac pretium orci, ut mattis felis. Phasellus id faucibus orci, lobortis bibendum eros. Nunc nec libero consectetur, elementum tortor vitae, cursus orci. Curabitur nisl velit, auctor eu rutrum id, suscipit cursus est."
+        }
+    },
+    "required": [
+        "foo"
+    ]
+}
\ No newline at end of file