Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Lua output fixes #1811

Merged
merged 3 commits into from Oct 12, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
41 changes: 40 additions & 1 deletion acceptance_tests/output-format.sh
Expand Up @@ -271,4 +271,43 @@ EOM
assertEquals "$expected" "$X"
}

source ./scripts/shunit2
testLuaOutputPretty() {
cat >test.yml <<EOL
animals:
cat: meow
EOL

read -r -d '' expected << EOM
return {
["animals"] = {
["cat"] = "meow";
};
};
EOM

X=$(./yq e --output-format=lua test.yml)
assertEquals "$expected" "$X"

X=$(./yq e --output-format=lua --prettyPrint test.yml)
assertEquals "$expected" "$X"

}

testLuaOutputSubset() {
cat >test.yml <<EOL
animals:
cat: meow
EOL

read -r -d '' expected << EOM
return {
["cat"] = "meow";
};
EOM

X=$(./yq e --output-format=lua '.animals' test.yml)
assertEquals "$expected" "$X"

}

source ./scripts/shunit2
4 changes: 4 additions & 0 deletions pkg/yqlib/doc/usage/lua.md
Expand Up @@ -129,6 +129,8 @@ numbers:
- octal: 0o30
- float: 123.45
- infinity: .inf
plus_infinity: +.inf
minus_infinity: -.inf
- not: .nan

```
Expand Down Expand Up @@ -162,6 +164,8 @@ return {
},
{
["infinity"] = (1/0);
["plus_infinity"] = (1/0);
["minus_infinity"] = (-1/0);
},
{
["not"] = (0/0);
Expand Down
47 changes: 27 additions & 20 deletions pkg/yqlib/encoder_lua.go
Expand Up @@ -129,7 +129,7 @@ func (le *luaEncoder) encodeArray(writer io.Writer, node *yaml.Node) error {
if err != nil {
return err
}
err := le.Encode(writer, child)
err := le.encodeAny(writer, child)
if err != nil {
return err
}
Expand Down Expand Up @@ -192,7 +192,7 @@ func (le *luaEncoder) encodeMap(writer io.Writer, node *yaml.Node, global bool)
for i, child := range node.Content {
if (i % 2) == 1 {
// value
err := le.Encode(writer, child)
err := le.encodeAny(writer, child)
if err != nil {
return err
}
Expand Down Expand Up @@ -270,7 +270,7 @@ func (le *luaEncoder) encodeAny(writer io.Writer, node *yaml.Node) error {
case yaml.MappingNode:
return le.encodeMap(writer, node, false)
case yaml.ScalarNode:
switch node.Tag {
switch node.ShortTag() {
case "!!str":
return le.encodeString(writer, node)
case "!!null":
Expand All @@ -292,7 +292,7 @@ func (le *luaEncoder) encodeAny(writer io.Writer, node *yaml.Node) error {
return writeString(writer, strings.ToLower(node.Value))
case "!!float":
switch strings.ToLower(node.Value) {
case ".inf":
case ".inf", "+.inf":
return writeString(writer, "(1/0)")
case "-.inf":
return writeString(writer, "(-1/0)")
Expand All @@ -305,26 +305,33 @@ func (le *luaEncoder) encodeAny(writer io.Writer, node *yaml.Node) error {
return fmt.Errorf("Lua encoder NYI -- %s", node.ShortTag())
}
case yaml.DocumentNode:
if le.globals {
if node.Content[0].Kind != yaml.MappingNode {
return fmt.Errorf("--lua-global requires a top level MappingNode")
}
return le.encodeMap(writer, node.Content[0], true)
}
err := writeString(writer, le.docPrefix)
if err != nil {
return err
}
err = le.encodeAny(writer, node.Content[0])
if err != nil {
return err
}
return writeString(writer, le.docSuffix)
return le.encodeAny(writer, node.Content[0])
default:
return fmt.Errorf("Lua encoder NYI -- %s", node.ShortTag())
}
}

func (le *luaEncoder) encodeTopLevel(writer io.Writer, node *yaml.Node) error {
err := writeString(writer, le.docPrefix)
if err != nil {
return err
}
err = le.encodeAny(writer, node)
if err != nil {
return err
}
return writeString(writer, le.docSuffix)
}

func (le *luaEncoder) Encode(writer io.Writer, node *yaml.Node) error {
return le.encodeAny(writer, node)
if node.Kind == yaml.DocumentNode {
return le.Encode(writer, node.Content[0])
}
if le.globals {
if node.Kind != yaml.MappingNode {
return fmt.Errorf("--lua-global requires a top level MappingNode")
}
return le.encodeMap(writer, node, true)
}
return le.encodeTopLevel(writer, node)
}
4 changes: 4 additions & 0 deletions pkg/yqlib/lua_test.go
Expand Up @@ -135,6 +135,8 @@ numbers:
- octal: 0o30
- float: 123.45
- infinity: .inf
plus_infinity: +.inf
minus_infinity: -.inf
- not: .nan
`,
expected: `return {
Expand All @@ -161,6 +163,8 @@ numbers:
},
{
["infinity"] = (1/0);
["plus_infinity"] = (1/0);
["minus_infinity"] = (-1/0);
},
{
["not"] = (0/0);
Expand Down