diff --git a/README.md b/README.md index 5587725..2f1500e 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ terraform-docs markdown document ./my-terraform-module # generate markdown docum terraform-docs pretty ./my-terraform-module # generate colorized pretty terraform-docs tfvars hcl ./my-terraform-module # generate hcl format of terraform.tfvars terraform-docs tfvars json ./my-terraform-module # generate json format of terraform.tfvars +terraform-docs toml ./my-terraform-module # generate toml terraform-docs xml ./my-terraform-module # generate xml terraform-docs yaml ./my-terraform-module # generate yaml ``` diff --git a/cmd/toml.go b/cmd/toml.go new file mode 100644 index 0000000..ffda6c0 --- /dev/null +++ b/cmd/toml.go @@ -0,0 +1,17 @@ +package cmd + +import ( + "github.com/spf13/cobra" +) + +var tomlCmd = &cobra.Command{ + Args: cobra.ExactArgs(1), + Use: "toml [PATH]", + Short: "Generate TOML of inputs and outputs", + Annotations: formatAnnotations("toml"), + RunE: formatRunE, +} + +func init() { + rootCmd.AddCommand(tomlCmd) +} diff --git a/docs/FORMATS_GUIDE.md b/docs/FORMATS_GUIDE.md index d944ec6..edea6e3 100644 --- a/docs/FORMATS_GUIDE.md +++ b/docs/FORMATS_GUIDE.md @@ -36,6 +36,7 @@ A utility to generate documentation from Terraform modules in various output for * [terraform-docs tfvars](/docs/formats/tfvars.md) - Generate terraform.tfvars of inputs * [terraform-docs tfvars hcl](/docs/formats/tfvars-hcl.md) - Generate HCL format of terraform.tfvars of inputs * [terraform-docs tfvars json](/docs/formats/tfvars-json.md) - Generate JSON format of terraform.tfvars of inputs +* [terraform-docs toml](/docs/formats/toml.md) - Generate TOML of inputs and outputs * [terraform-docs xml](/docs/formats/xml.md) - Generate XML of inputs and outputs * [terraform-docs yaml](/docs/formats/yaml.md) - Generate YAML of inputs and outputs diff --git a/docs/formats/toml.md b/docs/formats/toml.md new file mode 100644 index 0000000..1502978 --- /dev/null +++ b/docs/formats/toml.md @@ -0,0 +1,319 @@ +## terraform-docs toml + +Generate TOML of inputs and outputs + +### Synopsis + +Generate TOML of inputs and outputs + +``` +terraform-docs toml [PATH] [flags] +``` + +### Options + +``` + -h, --help help for toml +``` + +### Options inherited from parent commands + +``` + --header-from string relative path of a file to read header from (default "main.tf") + --no-header do not show module header + --no-inputs do not show inputs + --no-outputs do not show outputs + --no-providers do not show providers + --no-requirements do not show module requirements + --no-sort do no sort items + --output-values inject output values into outputs + --output-values-from string inject output values from file into outputs + --sort-by-required sort items by name and print required ones first + --sort-by-type sort items by type of them +``` + +### Example + +Given the [`examples`](/examples/) module: + +```shell +terraform-docs toml ./examples/ +``` + +generates the following output: + + header = "Usage:\n\nExample of 'foo_bar' module in `foo_bar.tf`.\n\n- list item 1\n- list item 2\n\nEven inline **formatting** in _here_ is possible.\nand some [link](https://domain.com/)\n\n* list item 3\n* list item 4\n\n```hcl\nmodule \"foo_bar\" {\n source = \"github.com/foo/bar\"\n\n id = \"1234567890\"\n name = \"baz\"\n\n zones = [\"us-east-1\", \"us-west-1\"]\n\n tags = {\n Name = \"baz\"\n Created-By = \"first.last@email.com\"\n Date-Created = \"20180101\"\n }\n}\n```\n\nHere is some trailing text after code block,\nfollowed by another line of text.\n\n| Name | Description |\n|------|-----------------|\n| Foo | Foo description |\n| Bar | Bar description |" + + [[inputs]] + name = "bool-1" + type = "bool" + description = "It's bool number one." + default = true + required = false + + [[inputs]] + name = "bool-2" + type = "bool" + description = "It's bool number two." + default = false + required = false + + [[inputs]] + name = "bool-3" + type = "bool" + description = "" + default = true + required = false + + [[inputs]] + name = "bool_default_false" + type = "bool" + description = "" + default = false + required = false + + [[inputs]] + name = "input-with-code-block" + type = "list" + description = "This is a complicated one. We need a newline. \nAnd an example in a code block\n```\ndefault = [\n \"machine rack01:neptune\"\n]\n```\n" + default = ["name rack:location"] + required = false + + [[inputs]] + name = "input-with-pipe" + type = "string" + description = "It includes v1 | v2 | v3" + default = "v1" + required = false + + [[inputs]] + name = "input_with_underscores" + type = "any" + description = "A variable with underscores." + required = true + [inputs.default] + + [[inputs]] + name = "list-1" + type = "list" + description = "It's list number one." + default = ["a", "b", "c"] + required = false + + [[inputs]] + name = "list-2" + type = "list" + description = "It's list number two." + required = true + [inputs.default] + + [[inputs]] + name = "list-3" + type = "list" + description = "" + default = [] + required = false + + [[inputs]] + name = "list_default_empty" + type = "list(string)" + description = "" + default = [] + required = false + + [[inputs]] + name = "long_type" + type = "object({\n name = string,\n foo = object({ foo = string, bar = string }),\n bar = object({ foo = string, bar = string }),\n fizz = list(string),\n buzz = list(string)\n })" + description = "This description is itself markdown.\n\nIt spans over multiple lines.\n" + required = false + [inputs.default] + buzz = ["fizz", "buzz"] + fizz = [] + name = "hello" + [inputs.default.bar] + bar = "bar" + foo = "bar" + [inputs.default.foo] + bar = "foo" + foo = "foo" + + [[inputs]] + name = "map-1" + type = "map" + description = "It's map number one." + required = false + [inputs.default] + a = 1.0 + b = 2.0 + c = 3.0 + + [[inputs]] + name = "map-2" + type = "map" + description = "It's map number two." + required = true + [inputs.default] + + [[inputs]] + name = "map-3" + type = "map" + description = "" + required = false + [inputs.default] + + [[inputs]] + name = "no-escape-default-value" + type = "string" + description = "The description contains `something_with_underscore`. Defaults to 'VALUE_WITH_UNDERSCORE'." + default = "VALUE_WITH_UNDERSCORE" + required = false + + [[inputs]] + name = "number-1" + type = "number" + description = "It's number number one." + default = 42.0 + required = false + + [[inputs]] + name = "number-2" + type = "number" + description = "It's number number two." + required = true + [inputs.default] + + [[inputs]] + name = "number-3" + type = "number" + description = "" + default = "19" + required = false + + [[inputs]] + name = "number-4" + type = "number" + description = "" + default = 15.75 + required = false + + [[inputs]] + name = "number_default_zero" + type = "number" + description = "" + default = 0.0 + required = false + + [[inputs]] + name = "object_default_empty" + type = "object({})" + description = "" + required = false + [inputs.default] + + [[inputs]] + name = "string-1" + type = "string" + description = "It's string number one." + default = "bar" + required = false + + [[inputs]] + name = "string-2" + type = "string" + description = "It's string number two." + required = true + [inputs.default] + + [[inputs]] + name = "string-3" + type = "string" + description = "" + default = "" + required = false + + [[inputs]] + name = "string_default_empty" + type = "string" + description = "" + default = "" + required = false + + [[inputs]] + name = "string_default_null" + type = "string" + description = "" + required = false + [inputs.default] + + [[inputs]] + name = "string_no_default" + type = "string" + description = "" + required = true + [inputs.default] + + [[inputs]] + name = "unquoted" + type = "any" + description = "" + required = true + [inputs.default] + + [[inputs]] + name = "with-url" + type = "string" + description = "The description contains url. https://www.domain.com/foo/bar_baz.html" + default = "" + required = false + + [[outputs]] + name = "output-0.12" + description = "terraform 0.12 only" + + [[outputs]] + name = "output-1" + description = "It's output number one." + + [[outputs]] + name = "output-2" + description = "It's output number two." + + [[outputs]] + name = "unquoted" + description = "It's unquoted output." + + [[providers]] + name = "aws" + alias = "" + version = ">= 2.15.0" + + [[providers]] + name = "aws" + alias = "ident" + version = ">= 2.15.0" + + [[providers]] + name = "null" + alias = "" + version = "" + + [[providers]] + name = "tls" + alias = "" + version = "" + + [[requirements]] + Name = "terraform" + Version = ">= 0.12" + + [[requirements]] + Name = "aws" + Version = ">= 2.15.0" + + [[requirements]] + Name = "random" + Version = ">= 2.2.0" + + + +###### Auto generated by spf13/cobra on 14-May-2020 diff --git a/go.mod b/go.mod index 94de4d4..6a241c4 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/segmentio/terraform-docs go 1.14 require ( + github.com/BurntSushi/toml v0.3.1 github.com/go-test/deep v1.0.6 github.com/hashicorp/hcl v1.0.0 github.com/hashicorp/hcl/v2 v2.5.1 diff --git a/go.sum b/go.sum index fb4462b..c96301c 100644 --- a/go.sum +++ b/go.sum @@ -55,8 +55,6 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/hcl/v2 v2.5.0 h1:tnNRfUho4o/6qLTqd54gj9Gs5AWmdc0tG8YdElu6MEw= -github.com/hashicorp/hcl/v2 v2.5.0/go.mod h1:bQTN5mpo+jewjJgh8jr0JUguIi7qPHUF6yIfAEN3jqY= github.com/hashicorp/hcl/v2 v2.5.1 h1:5ytFZykUu2/4U59ogd2f+XZdi9+6oC/Tv5WzsH6fIDA= github.com/hashicorp/hcl/v2 v2.5.1/go.mod h1:bQTN5mpo+jewjJgh8jr0JUguIi7qPHUF6yIfAEN3jqY= github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 h1:i462o439ZjprVSFSZLZxcsoAe592sZB1rci2Z8j4wdk= diff --git a/internal/format/factory.go b/internal/format/factory.go index 4dbe53c..1734457 100644 --- a/internal/format/factory.go +++ b/internal/format/factory.go @@ -32,6 +32,8 @@ func Factory(name string, settings *print.Settings) (print.Format, error) { return NewTfvarsHCL(settings), nil case "tfvars json": return NewTfvarsJSON(settings), nil + case "toml": + return NewTOML(settings), nil case "xml": return NewXML(settings), nil case "yaml": diff --git a/internal/format/factory_test.go b/internal/format/factory_test.go index 3416a72..09808ce 100644 --- a/internal/format/factory_test.go +++ b/internal/format/factory_test.go @@ -75,6 +75,12 @@ func TestFormatFactory(t *testing.T) { expected: "*format.TfvarsJSON", wantErr: false, }, + { + name: "format factory from name", + format: "toml", + expected: "*format.TOML", + wantErr: false, + }, { name: "format factory from name", format: "xml", diff --git a/internal/format/testdata/toml/toml-Empty.golden b/internal/format/testdata/toml/toml-Empty.golden new file mode 100644 index 0000000..8ca1a47 --- /dev/null +++ b/internal/format/testdata/toml/toml-Empty.golden @@ -0,0 +1,5 @@ +header = "" +inputs = [] +outputs = [] +providers = [] +requirements = [] diff --git a/internal/format/testdata/toml/toml-HeaderFromFile.golden b/internal/format/testdata/toml/toml-HeaderFromFile.golden new file mode 100644 index 0000000..5adba35 --- /dev/null +++ b/internal/format/testdata/toml/toml-HeaderFromFile.golden @@ -0,0 +1,271 @@ +header = "This header comes from a custom file\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit,\nsed do eiusmod tempor incididunt ut labore et dolore magna\naliqua. Ut enim ad minim veniam, quis nostrud exercitation\nullamco laboris nisi ut aliquip ex ea commodo consequat.\nDuis aute irure dolor in reprehenderit in voluptate velit\nesse cillum dolore eu fugiat nulla pariatur." + +[[inputs]] + name = "unquoted" + type = "any" + description = "" + required = true + [inputs.default] + +[[inputs]] + name = "bool-3" + type = "bool" + description = "" + default = true + required = false + +[[inputs]] + name = "bool-2" + type = "bool" + description = "It's bool number two." + default = false + required = false + +[[inputs]] + name = "bool-1" + type = "bool" + description = "It's bool number one." + default = true + required = false + +[[inputs]] + name = "string-3" + type = "string" + description = "" + default = "" + required = false + +[[inputs]] + name = "string-2" + type = "string" + description = "It's string number two." + required = true + [inputs.default] + +[[inputs]] + name = "string-1" + type = "string" + description = "It's string number one." + default = "bar" + required = false + +[[inputs]] + name = "number-3" + type = "number" + description = "" + default = "19" + required = false + +[[inputs]] + name = "number-4" + type = "number" + description = "" + default = 15.75 + required = false + +[[inputs]] + name = "number-2" + type = "number" + description = "It's number number two." + required = true + [inputs.default] + +[[inputs]] + name = "number-1" + type = "number" + description = "It's number number one." + default = 42.0 + required = false + +[[inputs]] + name = "map-3" + type = "map" + description = "" + required = false + [inputs.default] + +[[inputs]] + name = "map-2" + type = "map" + description = "It's map number two." + required = true + [inputs.default] + +[[inputs]] + name = "map-1" + type = "map" + description = "It's map number one." + required = false + [inputs.default] + a = 1.0 + b = 2.0 + c = 3.0 + +[[inputs]] + name = "list-3" + type = "list" + description = "" + default = [] + required = false + +[[inputs]] + name = "list-2" + type = "list" + description = "It's list number two." + required = true + [inputs.default] + +[[inputs]] + name = "list-1" + type = "list" + description = "It's list number one." + default = ["a", "b", "c"] + required = false + +[[inputs]] + name = "input_with_underscores" + type = "any" + description = "A variable with underscores." + required = true + [inputs.default] + +[[inputs]] + name = "input-with-pipe" + type = "string" + description = "It includes v1 | v2 | v3" + default = "v1" + required = false + +[[inputs]] + name = "input-with-code-block" + type = "list" + description = "This is a complicated one. We need a newline. \nAnd an example in a code block\n```\ndefault = [\n \"machine rack01:neptune\"\n]\n```\n" + default = ["name rack:location"] + required = false + +[[inputs]] + name = "long_type" + type = "object({\n name = string,\n foo = object({ foo = string, bar = string }),\n bar = object({ foo = string, bar = string }),\n fizz = list(string),\n buzz = list(string)\n })" + description = "This description is itself markdown.\n\nIt spans over multiple lines.\n" + required = false + [inputs.default] + buzz = ["fizz", "buzz"] + fizz = [] + name = "hello" + [inputs.default.bar] + bar = "bar" + foo = "bar" + [inputs.default.foo] + bar = "foo" + foo = "foo" + +[[inputs]] + name = "no-escape-default-value" + type = "string" + description = "The description contains `something_with_underscore`. Defaults to 'VALUE_WITH_UNDERSCORE'." + default = "VALUE_WITH_UNDERSCORE" + required = false + +[[inputs]] + name = "with-url" + type = "string" + description = "The description contains url. https://www.domain.com/foo/bar_baz.html" + default = "" + required = false + +[[inputs]] + name = "string_default_empty" + type = "string" + description = "" + default = "" + required = false + +[[inputs]] + name = "string_default_null" + type = "string" + description = "" + required = false + [inputs.default] + +[[inputs]] + name = "string_no_default" + type = "string" + description = "" + required = true + [inputs.default] + +[[inputs]] + name = "number_default_zero" + type = "number" + description = "" + default = 0.0 + required = false + +[[inputs]] + name = "bool_default_false" + type = "bool" + description = "" + default = false + required = false + +[[inputs]] + name = "list_default_empty" + type = "list(string)" + description = "" + default = [] + required = false + +[[inputs]] + name = "object_default_empty" + type = "object({})" + description = "" + required = false + [inputs.default] + +[[outputs]] + name = "unquoted" + description = "It's unquoted output." + +[[outputs]] + name = "output-2" + description = "It's output number two." + +[[outputs]] + name = "output-1" + description = "It's output number one." + +[[outputs]] + name = "output-0.12" + description = "terraform 0.12 only" + +[[providers]] + name = "tls" + alias = "" + version = "" + +[[providers]] + name = "aws" + alias = "" + version = ">= 2.15.0" + +[[providers]] + name = "aws" + alias = "ident" + version = ">= 2.15.0" + +[[providers]] + name = "null" + alias = "" + version = "" + +[[requirements]] + Name = "terraform" + Version = ">= 0.12" + +[[requirements]] + Name = "aws" + Version = ">= 2.15.0" + +[[requirements]] + Name = "random" + Version = ">= 2.2.0" diff --git a/internal/format/testdata/toml/toml-NoHeader.golden b/internal/format/testdata/toml/toml-NoHeader.golden new file mode 100644 index 0000000..e4bb941 --- /dev/null +++ b/internal/format/testdata/toml/toml-NoHeader.golden @@ -0,0 +1,271 @@ +header = "" + +[[inputs]] + name = "unquoted" + type = "any" + description = "" + required = true + [inputs.default] + +[[inputs]] + name = "bool-3" + type = "bool" + description = "" + default = true + required = false + +[[inputs]] + name = "bool-2" + type = "bool" + description = "It's bool number two." + default = false + required = false + +[[inputs]] + name = "bool-1" + type = "bool" + description = "It's bool number one." + default = true + required = false + +[[inputs]] + name = "string-3" + type = "string" + description = "" + default = "" + required = false + +[[inputs]] + name = "string-2" + type = "string" + description = "It's string number two." + required = true + [inputs.default] + +[[inputs]] + name = "string-1" + type = "string" + description = "It's string number one." + default = "bar" + required = false + +[[inputs]] + name = "number-3" + type = "number" + description = "" + default = "19" + required = false + +[[inputs]] + name = "number-4" + type = "number" + description = "" + default = 15.75 + required = false + +[[inputs]] + name = "number-2" + type = "number" + description = "It's number number two." + required = true + [inputs.default] + +[[inputs]] + name = "number-1" + type = "number" + description = "It's number number one." + default = 42.0 + required = false + +[[inputs]] + name = "map-3" + type = "map" + description = "" + required = false + [inputs.default] + +[[inputs]] + name = "map-2" + type = "map" + description = "It's map number two." + required = true + [inputs.default] + +[[inputs]] + name = "map-1" + type = "map" + description = "It's map number one." + required = false + [inputs.default] + a = 1.0 + b = 2.0 + c = 3.0 + +[[inputs]] + name = "list-3" + type = "list" + description = "" + default = [] + required = false + +[[inputs]] + name = "list-2" + type = "list" + description = "It's list number two." + required = true + [inputs.default] + +[[inputs]] + name = "list-1" + type = "list" + description = "It's list number one." + default = ["a", "b", "c"] + required = false + +[[inputs]] + name = "input_with_underscores" + type = "any" + description = "A variable with underscores." + required = true + [inputs.default] + +[[inputs]] + name = "input-with-pipe" + type = "string" + description = "It includes v1 | v2 | v3" + default = "v1" + required = false + +[[inputs]] + name = "input-with-code-block" + type = "list" + description = "This is a complicated one. We need a newline. \nAnd an example in a code block\n```\ndefault = [\n \"machine rack01:neptune\"\n]\n```\n" + default = ["name rack:location"] + required = false + +[[inputs]] + name = "long_type" + type = "object({\n name = string,\n foo = object({ foo = string, bar = string }),\n bar = object({ foo = string, bar = string }),\n fizz = list(string),\n buzz = list(string)\n })" + description = "This description is itself markdown.\n\nIt spans over multiple lines.\n" + required = false + [inputs.default] + buzz = ["fizz", "buzz"] + fizz = [] + name = "hello" + [inputs.default.bar] + bar = "bar" + foo = "bar" + [inputs.default.foo] + bar = "foo" + foo = "foo" + +[[inputs]] + name = "no-escape-default-value" + type = "string" + description = "The description contains `something_with_underscore`. Defaults to 'VALUE_WITH_UNDERSCORE'." + default = "VALUE_WITH_UNDERSCORE" + required = false + +[[inputs]] + name = "with-url" + type = "string" + description = "The description contains url. https://www.domain.com/foo/bar_baz.html" + default = "" + required = false + +[[inputs]] + name = "string_default_empty" + type = "string" + description = "" + default = "" + required = false + +[[inputs]] + name = "string_default_null" + type = "string" + description = "" + required = false + [inputs.default] + +[[inputs]] + name = "string_no_default" + type = "string" + description = "" + required = true + [inputs.default] + +[[inputs]] + name = "number_default_zero" + type = "number" + description = "" + default = 0.0 + required = false + +[[inputs]] + name = "bool_default_false" + type = "bool" + description = "" + default = false + required = false + +[[inputs]] + name = "list_default_empty" + type = "list(string)" + description = "" + default = [] + required = false + +[[inputs]] + name = "object_default_empty" + type = "object({})" + description = "" + required = false + [inputs.default] + +[[outputs]] + name = "unquoted" + description = "It's unquoted output." + +[[outputs]] + name = "output-2" + description = "It's output number two." + +[[outputs]] + name = "output-1" + description = "It's output number one." + +[[outputs]] + name = "output-0.12" + description = "terraform 0.12 only" + +[[providers]] + name = "tls" + alias = "" + version = "" + +[[providers]] + name = "aws" + alias = "" + version = ">= 2.15.0" + +[[providers]] + name = "aws" + alias = "ident" + version = ">= 2.15.0" + +[[providers]] + name = "null" + alias = "" + version = "" + +[[requirements]] + Name = "terraform" + Version = ">= 0.12" + +[[requirements]] + Name = "aws" + Version = ">= 2.15.0" + +[[requirements]] + Name = "random" + Version = ">= 2.2.0" diff --git a/internal/format/testdata/toml/toml-NoInputs.golden b/internal/format/testdata/toml/toml-NoInputs.golden new file mode 100644 index 0000000..f9f58e0 --- /dev/null +++ b/internal/format/testdata/toml/toml-NoInputs.golden @@ -0,0 +1,50 @@ +header = "Usage:\n\nExample of 'foo_bar' module in `foo_bar.tf`.\n\n- list item 1\n- list item 2\n\nEven inline **formatting** in _here_ is possible.\nand some [link](https://domain.com/)\n\n* list item 3\n* list item 4\n\n```hcl\nmodule \"foo_bar\" {\n source = \"github.com/foo/bar\"\n\n id = \"1234567890\"\n name = \"baz\"\n\n zones = [\"us-east-1\", \"us-west-1\"]\n\n tags = {\n Name = \"baz\"\n Created-By = \"first.last@email.com\"\n Date-Created = \"20180101\"\n }\n}\n```\n\nHere is some trailing text after code block,\nfollowed by another line of text.\n\n| Name | Description |\n|------|-----------------|\n| Foo | Foo description |\n| Bar | Bar description |" +inputs = [] + +[[outputs]] + name = "unquoted" + description = "It's unquoted output." + +[[outputs]] + name = "output-2" + description = "It's output number two." + +[[outputs]] + name = "output-1" + description = "It's output number one." + +[[outputs]] + name = "output-0.12" + description = "terraform 0.12 only" + +[[providers]] + name = "tls" + alias = "" + version = "" + +[[providers]] + name = "aws" + alias = "" + version = ">= 2.15.0" + +[[providers]] + name = "aws" + alias = "ident" + version = ">= 2.15.0" + +[[providers]] + name = "null" + alias = "" + version = "" + +[[requirements]] + Name = "terraform" + Version = ">= 0.12" + +[[requirements]] + Name = "aws" + Version = ">= 2.15.0" + +[[requirements]] + Name = "random" + Version = ">= 2.2.0" diff --git a/internal/format/testdata/toml/toml-NoOutputs.golden b/internal/format/testdata/toml/toml-NoOutputs.golden new file mode 100644 index 0000000..75db73b --- /dev/null +++ b/internal/format/testdata/toml/toml-NoOutputs.golden @@ -0,0 +1,256 @@ +header = "Usage:\n\nExample of 'foo_bar' module in `foo_bar.tf`.\n\n- list item 1\n- list item 2\n\nEven inline **formatting** in _here_ is possible.\nand some [link](https://domain.com/)\n\n* list item 3\n* list item 4\n\n```hcl\nmodule \"foo_bar\" {\n source = \"github.com/foo/bar\"\n\n id = \"1234567890\"\n name = \"baz\"\n\n zones = [\"us-east-1\", \"us-west-1\"]\n\n tags = {\n Name = \"baz\"\n Created-By = \"first.last@email.com\"\n Date-Created = \"20180101\"\n }\n}\n```\n\nHere is some trailing text after code block,\nfollowed by another line of text.\n\n| Name | Description |\n|------|-----------------|\n| Foo | Foo description |\n| Bar | Bar description |" +outputs = [] + +[[inputs]] + name = "unquoted" + type = "any" + description = "" + required = true + [inputs.default] + +[[inputs]] + name = "bool-3" + type = "bool" + description = "" + default = true + required = false + +[[inputs]] + name = "bool-2" + type = "bool" + description = "It's bool number two." + default = false + required = false + +[[inputs]] + name = "bool-1" + type = "bool" + description = "It's bool number one." + default = true + required = false + +[[inputs]] + name = "string-3" + type = "string" + description = "" + default = "" + required = false + +[[inputs]] + name = "string-2" + type = "string" + description = "It's string number two." + required = true + [inputs.default] + +[[inputs]] + name = "string-1" + type = "string" + description = "It's string number one." + default = "bar" + required = false + +[[inputs]] + name = "number-3" + type = "number" + description = "" + default = "19" + required = false + +[[inputs]] + name = "number-4" + type = "number" + description = "" + default = 15.75 + required = false + +[[inputs]] + name = "number-2" + type = "number" + description = "It's number number two." + required = true + [inputs.default] + +[[inputs]] + name = "number-1" + type = "number" + description = "It's number number one." + default = 42.0 + required = false + +[[inputs]] + name = "map-3" + type = "map" + description = "" + required = false + [inputs.default] + +[[inputs]] + name = "map-2" + type = "map" + description = "It's map number two." + required = true + [inputs.default] + +[[inputs]] + name = "map-1" + type = "map" + description = "It's map number one." + required = false + [inputs.default] + a = 1.0 + b = 2.0 + c = 3.0 + +[[inputs]] + name = "list-3" + type = "list" + description = "" + default = [] + required = false + +[[inputs]] + name = "list-2" + type = "list" + description = "It's list number two." + required = true + [inputs.default] + +[[inputs]] + name = "list-1" + type = "list" + description = "It's list number one." + default = ["a", "b", "c"] + required = false + +[[inputs]] + name = "input_with_underscores" + type = "any" + description = "A variable with underscores." + required = true + [inputs.default] + +[[inputs]] + name = "input-with-pipe" + type = "string" + description = "It includes v1 | v2 | v3" + default = "v1" + required = false + +[[inputs]] + name = "input-with-code-block" + type = "list" + description = "This is a complicated one. We need a newline. \nAnd an example in a code block\n```\ndefault = [\n \"machine rack01:neptune\"\n]\n```\n" + default = ["name rack:location"] + required = false + +[[inputs]] + name = "long_type" + type = "object({\n name = string,\n foo = object({ foo = string, bar = string }),\n bar = object({ foo = string, bar = string }),\n fizz = list(string),\n buzz = list(string)\n })" + description = "This description is itself markdown.\n\nIt spans over multiple lines.\n" + required = false + [inputs.default] + buzz = ["fizz", "buzz"] + fizz = [] + name = "hello" + [inputs.default.bar] + bar = "bar" + foo = "bar" + [inputs.default.foo] + bar = "foo" + foo = "foo" + +[[inputs]] + name = "no-escape-default-value" + type = "string" + description = "The description contains `something_with_underscore`. Defaults to 'VALUE_WITH_UNDERSCORE'." + default = "VALUE_WITH_UNDERSCORE" + required = false + +[[inputs]] + name = "with-url" + type = "string" + description = "The description contains url. https://www.domain.com/foo/bar_baz.html" + default = "" + required = false + +[[inputs]] + name = "string_default_empty" + type = "string" + description = "" + default = "" + required = false + +[[inputs]] + name = "string_default_null" + type = "string" + description = "" + required = false + [inputs.default] + +[[inputs]] + name = "string_no_default" + type = "string" + description = "" + required = true + [inputs.default] + +[[inputs]] + name = "number_default_zero" + type = "number" + description = "" + default = 0.0 + required = false + +[[inputs]] + name = "bool_default_false" + type = "bool" + description = "" + default = false + required = false + +[[inputs]] + name = "list_default_empty" + type = "list(string)" + description = "" + default = [] + required = false + +[[inputs]] + name = "object_default_empty" + type = "object({})" + description = "" + required = false + [inputs.default] + +[[providers]] + name = "tls" + alias = "" + version = "" + +[[providers]] + name = "aws" + alias = "" + version = ">= 2.15.0" + +[[providers]] + name = "aws" + alias = "ident" + version = ">= 2.15.0" + +[[providers]] + name = "null" + alias = "" + version = "" + +[[requirements]] + Name = "terraform" + Version = ">= 0.12" + +[[requirements]] + Name = "aws" + Version = ">= 2.15.0" + +[[requirements]] + Name = "random" + Version = ">= 2.2.0" diff --git a/internal/format/testdata/toml/toml-NoProviders.golden b/internal/format/testdata/toml/toml-NoProviders.golden new file mode 100644 index 0000000..d2ee00b --- /dev/null +++ b/internal/format/testdata/toml/toml-NoProviders.golden @@ -0,0 +1,252 @@ +header = "Usage:\n\nExample of 'foo_bar' module in `foo_bar.tf`.\n\n- list item 1\n- list item 2\n\nEven inline **formatting** in _here_ is possible.\nand some [link](https://domain.com/)\n\n* list item 3\n* list item 4\n\n```hcl\nmodule \"foo_bar\" {\n source = \"github.com/foo/bar\"\n\n id = \"1234567890\"\n name = \"baz\"\n\n zones = [\"us-east-1\", \"us-west-1\"]\n\n tags = {\n Name = \"baz\"\n Created-By = \"first.last@email.com\"\n Date-Created = \"20180101\"\n }\n}\n```\n\nHere is some trailing text after code block,\nfollowed by another line of text.\n\n| Name | Description |\n|------|-----------------|\n| Foo | Foo description |\n| Bar | Bar description |" +providers = [] + +[[inputs]] + name = "unquoted" + type = "any" + description = "" + required = true + [inputs.default] + +[[inputs]] + name = "bool-3" + type = "bool" + description = "" + default = true + required = false + +[[inputs]] + name = "bool-2" + type = "bool" + description = "It's bool number two." + default = false + required = false + +[[inputs]] + name = "bool-1" + type = "bool" + description = "It's bool number one." + default = true + required = false + +[[inputs]] + name = "string-3" + type = "string" + description = "" + default = "" + required = false + +[[inputs]] + name = "string-2" + type = "string" + description = "It's string number two." + required = true + [inputs.default] + +[[inputs]] + name = "string-1" + type = "string" + description = "It's string number one." + default = "bar" + required = false + +[[inputs]] + name = "number-3" + type = "number" + description = "" + default = "19" + required = false + +[[inputs]] + name = "number-4" + type = "number" + description = "" + default = 15.75 + required = false + +[[inputs]] + name = "number-2" + type = "number" + description = "It's number number two." + required = true + [inputs.default] + +[[inputs]] + name = "number-1" + type = "number" + description = "It's number number one." + default = 42.0 + required = false + +[[inputs]] + name = "map-3" + type = "map" + description = "" + required = false + [inputs.default] + +[[inputs]] + name = "map-2" + type = "map" + description = "It's map number two." + required = true + [inputs.default] + +[[inputs]] + name = "map-1" + type = "map" + description = "It's map number one." + required = false + [inputs.default] + a = 1.0 + b = 2.0 + c = 3.0 + +[[inputs]] + name = "list-3" + type = "list" + description = "" + default = [] + required = false + +[[inputs]] + name = "list-2" + type = "list" + description = "It's list number two." + required = true + [inputs.default] + +[[inputs]] + name = "list-1" + type = "list" + description = "It's list number one." + default = ["a", "b", "c"] + required = false + +[[inputs]] + name = "input_with_underscores" + type = "any" + description = "A variable with underscores." + required = true + [inputs.default] + +[[inputs]] + name = "input-with-pipe" + type = "string" + description = "It includes v1 | v2 | v3" + default = "v1" + required = false + +[[inputs]] + name = "input-with-code-block" + type = "list" + description = "This is a complicated one. We need a newline. \nAnd an example in a code block\n```\ndefault = [\n \"machine rack01:neptune\"\n]\n```\n" + default = ["name rack:location"] + required = false + +[[inputs]] + name = "long_type" + type = "object({\n name = string,\n foo = object({ foo = string, bar = string }),\n bar = object({ foo = string, bar = string }),\n fizz = list(string),\n buzz = list(string)\n })" + description = "This description is itself markdown.\n\nIt spans over multiple lines.\n" + required = false + [inputs.default] + buzz = ["fizz", "buzz"] + fizz = [] + name = "hello" + [inputs.default.bar] + bar = "bar" + foo = "bar" + [inputs.default.foo] + bar = "foo" + foo = "foo" + +[[inputs]] + name = "no-escape-default-value" + type = "string" + description = "The description contains `something_with_underscore`. Defaults to 'VALUE_WITH_UNDERSCORE'." + default = "VALUE_WITH_UNDERSCORE" + required = false + +[[inputs]] + name = "with-url" + type = "string" + description = "The description contains url. https://www.domain.com/foo/bar_baz.html" + default = "" + required = false + +[[inputs]] + name = "string_default_empty" + type = "string" + description = "" + default = "" + required = false + +[[inputs]] + name = "string_default_null" + type = "string" + description = "" + required = false + [inputs.default] + +[[inputs]] + name = "string_no_default" + type = "string" + description = "" + required = true + [inputs.default] + +[[inputs]] + name = "number_default_zero" + type = "number" + description = "" + default = 0.0 + required = false + +[[inputs]] + name = "bool_default_false" + type = "bool" + description = "" + default = false + required = false + +[[inputs]] + name = "list_default_empty" + type = "list(string)" + description = "" + default = [] + required = false + +[[inputs]] + name = "object_default_empty" + type = "object({})" + description = "" + required = false + [inputs.default] + +[[outputs]] + name = "unquoted" + description = "It's unquoted output." + +[[outputs]] + name = "output-2" + description = "It's output number two." + +[[outputs]] + name = "output-1" + description = "It's output number one." + +[[outputs]] + name = "output-0.12" + description = "terraform 0.12 only" + +[[requirements]] + Name = "terraform" + Version = ">= 0.12" + +[[requirements]] + Name = "aws" + Version = ">= 2.15.0" + +[[requirements]] + Name = "random" + Version = ">= 2.2.0" diff --git a/internal/format/testdata/toml/toml-NoRequirements.golden b/internal/format/testdata/toml/toml-NoRequirements.golden new file mode 100644 index 0000000..4c9b8af --- /dev/null +++ b/internal/format/testdata/toml/toml-NoRequirements.golden @@ -0,0 +1,260 @@ +header = "Usage:\n\nExample of 'foo_bar' module in `foo_bar.tf`.\n\n- list item 1\n- list item 2\n\nEven inline **formatting** in _here_ is possible.\nand some [link](https://domain.com/)\n\n* list item 3\n* list item 4\n\n```hcl\nmodule \"foo_bar\" {\n source = \"github.com/foo/bar\"\n\n id = \"1234567890\"\n name = \"baz\"\n\n zones = [\"us-east-1\", \"us-west-1\"]\n\n tags = {\n Name = \"baz\"\n Created-By = \"first.last@email.com\"\n Date-Created = \"20180101\"\n }\n}\n```\n\nHere is some trailing text after code block,\nfollowed by another line of text.\n\n| Name | Description |\n|------|-----------------|\n| Foo | Foo description |\n| Bar | Bar description |" +requirements = [] + +[[inputs]] + name = "unquoted" + type = "any" + description = "" + required = true + [inputs.default] + +[[inputs]] + name = "bool-3" + type = "bool" + description = "" + default = true + required = false + +[[inputs]] + name = "bool-2" + type = "bool" + description = "It's bool number two." + default = false + required = false + +[[inputs]] + name = "bool-1" + type = "bool" + description = "It's bool number one." + default = true + required = false + +[[inputs]] + name = "string-3" + type = "string" + description = "" + default = "" + required = false + +[[inputs]] + name = "string-2" + type = "string" + description = "It's string number two." + required = true + [inputs.default] + +[[inputs]] + name = "string-1" + type = "string" + description = "It's string number one." + default = "bar" + required = false + +[[inputs]] + name = "number-3" + type = "number" + description = "" + default = "19" + required = false + +[[inputs]] + name = "number-4" + type = "number" + description = "" + default = 15.75 + required = false + +[[inputs]] + name = "number-2" + type = "number" + description = "It's number number two." + required = true + [inputs.default] + +[[inputs]] + name = "number-1" + type = "number" + description = "It's number number one." + default = 42.0 + required = false + +[[inputs]] + name = "map-3" + type = "map" + description = "" + required = false + [inputs.default] + +[[inputs]] + name = "map-2" + type = "map" + description = "It's map number two." + required = true + [inputs.default] + +[[inputs]] + name = "map-1" + type = "map" + description = "It's map number one." + required = false + [inputs.default] + a = 1.0 + b = 2.0 + c = 3.0 + +[[inputs]] + name = "list-3" + type = "list" + description = "" + default = [] + required = false + +[[inputs]] + name = "list-2" + type = "list" + description = "It's list number two." + required = true + [inputs.default] + +[[inputs]] + name = "list-1" + type = "list" + description = "It's list number one." + default = ["a", "b", "c"] + required = false + +[[inputs]] + name = "input_with_underscores" + type = "any" + description = "A variable with underscores." + required = true + [inputs.default] + +[[inputs]] + name = "input-with-pipe" + type = "string" + description = "It includes v1 | v2 | v3" + default = "v1" + required = false + +[[inputs]] + name = "input-with-code-block" + type = "list" + description = "This is a complicated one. We need a newline. \nAnd an example in a code block\n```\ndefault = [\n \"machine rack01:neptune\"\n]\n```\n" + default = ["name rack:location"] + required = false + +[[inputs]] + name = "long_type" + type = "object({\n name = string,\n foo = object({ foo = string, bar = string }),\n bar = object({ foo = string, bar = string }),\n fizz = list(string),\n buzz = list(string)\n })" + description = "This description is itself markdown.\n\nIt spans over multiple lines.\n" + required = false + [inputs.default] + buzz = ["fizz", "buzz"] + fizz = [] + name = "hello" + [inputs.default.bar] + bar = "bar" + foo = "bar" + [inputs.default.foo] + bar = "foo" + foo = "foo" + +[[inputs]] + name = "no-escape-default-value" + type = "string" + description = "The description contains `something_with_underscore`. Defaults to 'VALUE_WITH_UNDERSCORE'." + default = "VALUE_WITH_UNDERSCORE" + required = false + +[[inputs]] + name = "with-url" + type = "string" + description = "The description contains url. https://www.domain.com/foo/bar_baz.html" + default = "" + required = false + +[[inputs]] + name = "string_default_empty" + type = "string" + description = "" + default = "" + required = false + +[[inputs]] + name = "string_default_null" + type = "string" + description = "" + required = false + [inputs.default] + +[[inputs]] + name = "string_no_default" + type = "string" + description = "" + required = true + [inputs.default] + +[[inputs]] + name = "number_default_zero" + type = "number" + description = "" + default = 0.0 + required = false + +[[inputs]] + name = "bool_default_false" + type = "bool" + description = "" + default = false + required = false + +[[inputs]] + name = "list_default_empty" + type = "list(string)" + description = "" + default = [] + required = false + +[[inputs]] + name = "object_default_empty" + type = "object({})" + description = "" + required = false + [inputs.default] + +[[outputs]] + name = "unquoted" + description = "It's unquoted output." + +[[outputs]] + name = "output-2" + description = "It's output number two." + +[[outputs]] + name = "output-1" + description = "It's output number one." + +[[outputs]] + name = "output-0.12" + description = "terraform 0.12 only" + +[[providers]] + name = "tls" + alias = "" + version = "" + +[[providers]] + name = "aws" + alias = "" + version = ">= 2.15.0" + +[[providers]] + name = "aws" + alias = "ident" + version = ">= 2.15.0" + +[[providers]] + name = "null" + alias = "" + version = "" diff --git a/internal/format/testdata/toml/toml-OnlyHeader.golden b/internal/format/testdata/toml/toml-OnlyHeader.golden new file mode 100644 index 0000000..f0b0ea2 --- /dev/null +++ b/internal/format/testdata/toml/toml-OnlyHeader.golden @@ -0,0 +1,5 @@ +header = "Usage:\n\nExample of 'foo_bar' module in `foo_bar.tf`.\n\n- list item 1\n- list item 2\n\nEven inline **formatting** in _here_ is possible.\nand some [link](https://domain.com/)\n\n* list item 3\n* list item 4\n\n```hcl\nmodule \"foo_bar\" {\n source = \"github.com/foo/bar\"\n\n id = \"1234567890\"\n name = \"baz\"\n\n zones = [\"us-east-1\", \"us-west-1\"]\n\n tags = {\n Name = \"baz\"\n Created-By = \"first.last@email.com\"\n Date-Created = \"20180101\"\n }\n}\n```\n\nHere is some trailing text after code block,\nfollowed by another line of text.\n\n| Name | Description |\n|------|-----------------|\n| Foo | Foo description |\n| Bar | Bar description |" +inputs = [] +outputs = [] +providers = [] +requirements = [] diff --git a/internal/format/testdata/toml/toml-OnlyInputs.golden b/internal/format/testdata/toml/toml-OnlyInputs.golden new file mode 100644 index 0000000..d72fda6 --- /dev/null +++ b/internal/format/testdata/toml/toml-OnlyInputs.golden @@ -0,0 +1,226 @@ +header = "" +outputs = [] +providers = [] +requirements = [] + +[[inputs]] + name = "unquoted" + type = "any" + description = "" + required = true + [inputs.default] + +[[inputs]] + name = "bool-3" + type = "bool" + description = "" + default = true + required = false + +[[inputs]] + name = "bool-2" + type = "bool" + description = "It's bool number two." + default = false + required = false + +[[inputs]] + name = "bool-1" + type = "bool" + description = "It's bool number one." + default = true + required = false + +[[inputs]] + name = "string-3" + type = "string" + description = "" + default = "" + required = false + +[[inputs]] + name = "string-2" + type = "string" + description = "It's string number two." + required = true + [inputs.default] + +[[inputs]] + name = "string-1" + type = "string" + description = "It's string number one." + default = "bar" + required = false + +[[inputs]] + name = "number-3" + type = "number" + description = "" + default = "19" + required = false + +[[inputs]] + name = "number-4" + type = "number" + description = "" + default = 15.75 + required = false + +[[inputs]] + name = "number-2" + type = "number" + description = "It's number number two." + required = true + [inputs.default] + +[[inputs]] + name = "number-1" + type = "number" + description = "It's number number one." + default = 42.0 + required = false + +[[inputs]] + name = "map-3" + type = "map" + description = "" + required = false + [inputs.default] + +[[inputs]] + name = "map-2" + type = "map" + description = "It's map number two." + required = true + [inputs.default] + +[[inputs]] + name = "map-1" + type = "map" + description = "It's map number one." + required = false + [inputs.default] + a = 1.0 + b = 2.0 + c = 3.0 + +[[inputs]] + name = "list-3" + type = "list" + description = "" + default = [] + required = false + +[[inputs]] + name = "list-2" + type = "list" + description = "It's list number two." + required = true + [inputs.default] + +[[inputs]] + name = "list-1" + type = "list" + description = "It's list number one." + default = ["a", "b", "c"] + required = false + +[[inputs]] + name = "input_with_underscores" + type = "any" + description = "A variable with underscores." + required = true + [inputs.default] + +[[inputs]] + name = "input-with-pipe" + type = "string" + description = "It includes v1 | v2 | v3" + default = "v1" + required = false + +[[inputs]] + name = "input-with-code-block" + type = "list" + description = "This is a complicated one. We need a newline. \nAnd an example in a code block\n```\ndefault = [\n \"machine rack01:neptune\"\n]\n```\n" + default = ["name rack:location"] + required = false + +[[inputs]] + name = "long_type" + type = "object({\n name = string,\n foo = object({ foo = string, bar = string }),\n bar = object({ foo = string, bar = string }),\n fizz = list(string),\n buzz = list(string)\n })" + description = "This description is itself markdown.\n\nIt spans over multiple lines.\n" + required = false + [inputs.default] + buzz = ["fizz", "buzz"] + fizz = [] + name = "hello" + [inputs.default.bar] + bar = "bar" + foo = "bar" + [inputs.default.foo] + bar = "foo" + foo = "foo" + +[[inputs]] + name = "no-escape-default-value" + type = "string" + description = "The description contains `something_with_underscore`. Defaults to 'VALUE_WITH_UNDERSCORE'." + default = "VALUE_WITH_UNDERSCORE" + required = false + +[[inputs]] + name = "with-url" + type = "string" + description = "The description contains url. https://www.domain.com/foo/bar_baz.html" + default = "" + required = false + +[[inputs]] + name = "string_default_empty" + type = "string" + description = "" + default = "" + required = false + +[[inputs]] + name = "string_default_null" + type = "string" + description = "" + required = false + [inputs.default] + +[[inputs]] + name = "string_no_default" + type = "string" + description = "" + required = true + [inputs.default] + +[[inputs]] + name = "number_default_zero" + type = "number" + description = "" + default = 0.0 + required = false + +[[inputs]] + name = "bool_default_false" + type = "bool" + description = "" + default = false + required = false + +[[inputs]] + name = "list_default_empty" + type = "list(string)" + description = "" + default = [] + required = false + +[[inputs]] + name = "object_default_empty" + type = "object({})" + description = "" + required = false + [inputs.default] diff --git a/internal/format/testdata/toml/toml-OnlyOutputs.golden b/internal/format/testdata/toml/toml-OnlyOutputs.golden new file mode 100644 index 0000000..c42ce9b --- /dev/null +++ b/internal/format/testdata/toml/toml-OnlyOutputs.golden @@ -0,0 +1,20 @@ +header = "" +inputs = [] +providers = [] +requirements = [] + +[[outputs]] + name = "unquoted" + description = "It's unquoted output." + +[[outputs]] + name = "output-2" + description = "It's output number two." + +[[outputs]] + name = "output-1" + description = "It's output number one." + +[[outputs]] + name = "output-0.12" + description = "terraform 0.12 only" diff --git a/internal/format/testdata/toml/toml-OnlyProviders.golden b/internal/format/testdata/toml/toml-OnlyProviders.golden new file mode 100644 index 0000000..c8fe164 --- /dev/null +++ b/internal/format/testdata/toml/toml-OnlyProviders.golden @@ -0,0 +1,24 @@ +header = "" +inputs = [] +outputs = [] +requirements = [] + +[[providers]] + name = "tls" + alias = "" + version = "" + +[[providers]] + name = "aws" + alias = "" + version = ">= 2.15.0" + +[[providers]] + name = "aws" + alias = "ident" + version = ">= 2.15.0" + +[[providers]] + name = "null" + alias = "" + version = "" diff --git a/internal/format/testdata/toml/toml-OnlyRequirements.golden b/internal/format/testdata/toml/toml-OnlyRequirements.golden new file mode 100644 index 0000000..821ccd4 --- /dev/null +++ b/internal/format/testdata/toml/toml-OnlyRequirements.golden @@ -0,0 +1,16 @@ +header = "" +inputs = [] +outputs = [] +providers = [] + +[[requirements]] + Name = "terraform" + Version = ">= 0.12" + +[[requirements]] + Name = "aws" + Version = ">= 2.15.0" + +[[requirements]] + Name = "random" + Version = ">= 2.2.0" diff --git a/internal/format/testdata/toml/toml-OutputValues.golden b/internal/format/testdata/toml/toml-OutputValues.golden new file mode 100644 index 0000000..942fb11 --- /dev/null +++ b/internal/format/testdata/toml/toml-OutputValues.golden @@ -0,0 +1,277 @@ +header = "Usage:\n\nExample of 'foo_bar' module in `foo_bar.tf`.\n\n- list item 1\n- list item 2\n\nEven inline **formatting** in _here_ is possible.\nand some [link](https://domain.com/)\n\n* list item 3\n* list item 4\n\n```hcl\nmodule \"foo_bar\" {\n source = \"github.com/foo/bar\"\n\n id = \"1234567890\"\n name = \"baz\"\n\n zones = [\"us-east-1\", \"us-west-1\"]\n\n tags = {\n Name = \"baz\"\n Created-By = \"first.last@email.com\"\n Date-Created = \"20180101\"\n }\n}\n```\n\nHere is some trailing text after code block,\nfollowed by another line of text.\n\n| Name | Description |\n|------|-----------------|\n| Foo | Foo description |\n| Bar | Bar description |" + +[[inputs]] + name = "unquoted" + type = "any" + description = "" + required = true + [inputs.default] + +[[inputs]] + name = "bool-3" + type = "bool" + description = "" + default = true + required = false + +[[inputs]] + name = "bool-2" + type = "bool" + description = "It's bool number two." + default = false + required = false + +[[inputs]] + name = "bool-1" + type = "bool" + description = "It's bool number one." + default = true + required = false + +[[inputs]] + name = "string-3" + type = "string" + description = "" + default = "" + required = false + +[[inputs]] + name = "string-2" + type = "string" + description = "It's string number two." + required = true + [inputs.default] + +[[inputs]] + name = "string-1" + type = "string" + description = "It's string number one." + default = "bar" + required = false + +[[inputs]] + name = "number-3" + type = "number" + description = "" + default = "19" + required = false + +[[inputs]] + name = "number-4" + type = "number" + description = "" + default = 15.75 + required = false + +[[inputs]] + name = "number-2" + type = "number" + description = "It's number number two." + required = true + [inputs.default] + +[[inputs]] + name = "number-1" + type = "number" + description = "It's number number one." + default = 42.0 + required = false + +[[inputs]] + name = "map-3" + type = "map" + description = "" + required = false + [inputs.default] + +[[inputs]] + name = "map-2" + type = "map" + description = "It's map number two." + required = true + [inputs.default] + +[[inputs]] + name = "map-1" + type = "map" + description = "It's map number one." + required = false + [inputs.default] + a = 1.0 + b = 2.0 + c = 3.0 + +[[inputs]] + name = "list-3" + type = "list" + description = "" + default = [] + required = false + +[[inputs]] + name = "list-2" + type = "list" + description = "It's list number two." + required = true + [inputs.default] + +[[inputs]] + name = "list-1" + type = "list" + description = "It's list number one." + default = ["a", "b", "c"] + required = false + +[[inputs]] + name = "input_with_underscores" + type = "any" + description = "A variable with underscores." + required = true + [inputs.default] + +[[inputs]] + name = "input-with-pipe" + type = "string" + description = "It includes v1 | v2 | v3" + default = "v1" + required = false + +[[inputs]] + name = "input-with-code-block" + type = "list" + description = "This is a complicated one. We need a newline. \nAnd an example in a code block\n```\ndefault = [\n \"machine rack01:neptune\"\n]\n```\n" + default = ["name rack:location"] + required = false + +[[inputs]] + name = "long_type" + type = "object({\n name = string,\n foo = object({ foo = string, bar = string }),\n bar = object({ foo = string, bar = string }),\n fizz = list(string),\n buzz = list(string)\n })" + description = "This description is itself markdown.\n\nIt spans over multiple lines.\n" + required = false + [inputs.default] + buzz = ["fizz", "buzz"] + fizz = [] + name = "hello" + [inputs.default.bar] + bar = "bar" + foo = "bar" + [inputs.default.foo] + bar = "foo" + foo = "foo" + +[[inputs]] + name = "no-escape-default-value" + type = "string" + description = "The description contains `something_with_underscore`. Defaults to 'VALUE_WITH_UNDERSCORE'." + default = "VALUE_WITH_UNDERSCORE" + required = false + +[[inputs]] + name = "with-url" + type = "string" + description = "The description contains url. https://www.domain.com/foo/bar_baz.html" + default = "" + required = false + +[[inputs]] + name = "string_default_empty" + type = "string" + description = "" + default = "" + required = false + +[[inputs]] + name = "string_default_null" + type = "string" + description = "" + required = false + [inputs.default] + +[[inputs]] + name = "string_no_default" + type = "string" + description = "" + required = true + [inputs.default] + +[[inputs]] + name = "number_default_zero" + type = "number" + description = "" + default = 0.0 + required = false + +[[inputs]] + name = "bool_default_false" + type = "bool" + description = "" + default = false + required = false + +[[inputs]] + name = "list_default_empty" + type = "list(string)" + description = "" + default = [] + required = false + +[[inputs]] + name = "object_default_empty" + type = "object({})" + description = "" + required = false + [inputs.default] + +[[outputs]] + name = "unquoted" + description = "It's unquoted output." + [outputs.value] + leon = "cat" + +[[outputs]] + name = "output-2" + description = "It's output number two." + value = ["jack", "lola"] + +[[outputs]] + name = "output-1" + description = "It's output number one." + value = 1.0 + +[[outputs]] + name = "output-0.12" + description = "terraform 0.12 only" + value = "" + sensitive = true + +[[providers]] + name = "tls" + alias = "" + version = "" + +[[providers]] + name = "aws" + alias = "" + version = ">= 2.15.0" + +[[providers]] + name = "aws" + alias = "ident" + version = ">= 2.15.0" + +[[providers]] + name = "null" + alias = "" + version = "" + +[[requirements]] + Name = "terraform" + Version = ">= 0.12" + +[[requirements]] + Name = "aws" + Version = ">= 2.15.0" + +[[requirements]] + Name = "random" + Version = ">= 2.2.0" diff --git a/internal/format/testdata/toml/toml-SortByName.golden b/internal/format/testdata/toml/toml-SortByName.golden new file mode 100644 index 0000000..59343f7 --- /dev/null +++ b/internal/format/testdata/toml/toml-SortByName.golden @@ -0,0 +1,271 @@ +header = "Usage:\n\nExample of 'foo_bar' module in `foo_bar.tf`.\n\n- list item 1\n- list item 2\n\nEven inline **formatting** in _here_ is possible.\nand some [link](https://domain.com/)\n\n* list item 3\n* list item 4\n\n```hcl\nmodule \"foo_bar\" {\n source = \"github.com/foo/bar\"\n\n id = \"1234567890\"\n name = \"baz\"\n\n zones = [\"us-east-1\", \"us-west-1\"]\n\n tags = {\n Name = \"baz\"\n Created-By = \"first.last@email.com\"\n Date-Created = \"20180101\"\n }\n}\n```\n\nHere is some trailing text after code block,\nfollowed by another line of text.\n\n| Name | Description |\n|------|-----------------|\n| Foo | Foo description |\n| Bar | Bar description |" + +[[inputs]] + name = "bool-1" + type = "bool" + description = "It's bool number one." + default = true + required = false + +[[inputs]] + name = "bool-2" + type = "bool" + description = "It's bool number two." + default = false + required = false + +[[inputs]] + name = "bool-3" + type = "bool" + description = "" + default = true + required = false + +[[inputs]] + name = "bool_default_false" + type = "bool" + description = "" + default = false + required = false + +[[inputs]] + name = "input-with-code-block" + type = "list" + description = "This is a complicated one. We need a newline. \nAnd an example in a code block\n```\ndefault = [\n \"machine rack01:neptune\"\n]\n```\n" + default = ["name rack:location"] + required = false + +[[inputs]] + name = "input-with-pipe" + type = "string" + description = "It includes v1 | v2 | v3" + default = "v1" + required = false + +[[inputs]] + name = "input_with_underscores" + type = "any" + description = "A variable with underscores." + required = true + [inputs.default] + +[[inputs]] + name = "list-1" + type = "list" + description = "It's list number one." + default = ["a", "b", "c"] + required = false + +[[inputs]] + name = "list-2" + type = "list" + description = "It's list number two." + required = true + [inputs.default] + +[[inputs]] + name = "list-3" + type = "list" + description = "" + default = [] + required = false + +[[inputs]] + name = "list_default_empty" + type = "list(string)" + description = "" + default = [] + required = false + +[[inputs]] + name = "long_type" + type = "object({\n name = string,\n foo = object({ foo = string, bar = string }),\n bar = object({ foo = string, bar = string }),\n fizz = list(string),\n buzz = list(string)\n })" + description = "This description is itself markdown.\n\nIt spans over multiple lines.\n" + required = false + [inputs.default] + buzz = ["fizz", "buzz"] + fizz = [] + name = "hello" + [inputs.default.bar] + bar = "bar" + foo = "bar" + [inputs.default.foo] + bar = "foo" + foo = "foo" + +[[inputs]] + name = "map-1" + type = "map" + description = "It's map number one." + required = false + [inputs.default] + a = 1.0 + b = 2.0 + c = 3.0 + +[[inputs]] + name = "map-2" + type = "map" + description = "It's map number two." + required = true + [inputs.default] + +[[inputs]] + name = "map-3" + type = "map" + description = "" + required = false + [inputs.default] + +[[inputs]] + name = "no-escape-default-value" + type = "string" + description = "The description contains `something_with_underscore`. Defaults to 'VALUE_WITH_UNDERSCORE'." + default = "VALUE_WITH_UNDERSCORE" + required = false + +[[inputs]] + name = "number-1" + type = "number" + description = "It's number number one." + default = 42.0 + required = false + +[[inputs]] + name = "number-2" + type = "number" + description = "It's number number two." + required = true + [inputs.default] + +[[inputs]] + name = "number-3" + type = "number" + description = "" + default = "19" + required = false + +[[inputs]] + name = "number-4" + type = "number" + description = "" + default = 15.75 + required = false + +[[inputs]] + name = "number_default_zero" + type = "number" + description = "" + default = 0.0 + required = false + +[[inputs]] + name = "object_default_empty" + type = "object({})" + description = "" + required = false + [inputs.default] + +[[inputs]] + name = "string-1" + type = "string" + description = "It's string number one." + default = "bar" + required = false + +[[inputs]] + name = "string-2" + type = "string" + description = "It's string number two." + required = true + [inputs.default] + +[[inputs]] + name = "string-3" + type = "string" + description = "" + default = "" + required = false + +[[inputs]] + name = "string_default_empty" + type = "string" + description = "" + default = "" + required = false + +[[inputs]] + name = "string_default_null" + type = "string" + description = "" + required = false + [inputs.default] + +[[inputs]] + name = "string_no_default" + type = "string" + description = "" + required = true + [inputs.default] + +[[inputs]] + name = "unquoted" + type = "any" + description = "" + required = true + [inputs.default] + +[[inputs]] + name = "with-url" + type = "string" + description = "The description contains url. https://www.domain.com/foo/bar_baz.html" + default = "" + required = false + +[[outputs]] + name = "output-0.12" + description = "terraform 0.12 only" + +[[outputs]] + name = "output-1" + description = "It's output number one." + +[[outputs]] + name = "output-2" + description = "It's output number two." + +[[outputs]] + name = "unquoted" + description = "It's unquoted output." + +[[providers]] + name = "aws" + alias = "" + version = ">= 2.15.0" + +[[providers]] + name = "aws" + alias = "ident" + version = ">= 2.15.0" + +[[providers]] + name = "null" + alias = "" + version = "" + +[[providers]] + name = "tls" + alias = "" + version = "" + +[[requirements]] + Name = "terraform" + Version = ">= 0.12" + +[[requirements]] + Name = "aws" + Version = ">= 2.15.0" + +[[requirements]] + Name = "random" + Version = ">= 2.2.0" diff --git a/internal/format/testdata/toml/toml-SortByRequired.golden b/internal/format/testdata/toml/toml-SortByRequired.golden new file mode 100644 index 0000000..1b4fc04 --- /dev/null +++ b/internal/format/testdata/toml/toml-SortByRequired.golden @@ -0,0 +1,271 @@ +header = "Usage:\n\nExample of 'foo_bar' module in `foo_bar.tf`.\n\n- list item 1\n- list item 2\n\nEven inline **formatting** in _here_ is possible.\nand some [link](https://domain.com/)\n\n* list item 3\n* list item 4\n\n```hcl\nmodule \"foo_bar\" {\n source = \"github.com/foo/bar\"\n\n id = \"1234567890\"\n name = \"baz\"\n\n zones = [\"us-east-1\", \"us-west-1\"]\n\n tags = {\n Name = \"baz\"\n Created-By = \"first.last@email.com\"\n Date-Created = \"20180101\"\n }\n}\n```\n\nHere is some trailing text after code block,\nfollowed by another line of text.\n\n| Name | Description |\n|------|-----------------|\n| Foo | Foo description |\n| Bar | Bar description |" + +[[inputs]] + name = "input_with_underscores" + type = "any" + description = "A variable with underscores." + required = true + [inputs.default] + +[[inputs]] + name = "list-2" + type = "list" + description = "It's list number two." + required = true + [inputs.default] + +[[inputs]] + name = "map-2" + type = "map" + description = "It's map number two." + required = true + [inputs.default] + +[[inputs]] + name = "number-2" + type = "number" + description = "It's number number two." + required = true + [inputs.default] + +[[inputs]] + name = "string-2" + type = "string" + description = "It's string number two." + required = true + [inputs.default] + +[[inputs]] + name = "string_no_default" + type = "string" + description = "" + required = true + [inputs.default] + +[[inputs]] + name = "unquoted" + type = "any" + description = "" + required = true + [inputs.default] + +[[inputs]] + name = "bool-1" + type = "bool" + description = "It's bool number one." + default = true + required = false + +[[inputs]] + name = "bool-2" + type = "bool" + description = "It's bool number two." + default = false + required = false + +[[inputs]] + name = "bool-3" + type = "bool" + description = "" + default = true + required = false + +[[inputs]] + name = "bool_default_false" + type = "bool" + description = "" + default = false + required = false + +[[inputs]] + name = "input-with-code-block" + type = "list" + description = "This is a complicated one. We need a newline. \nAnd an example in a code block\n```\ndefault = [\n \"machine rack01:neptune\"\n]\n```\n" + default = ["name rack:location"] + required = false + +[[inputs]] + name = "input-with-pipe" + type = "string" + description = "It includes v1 | v2 | v3" + default = "v1" + required = false + +[[inputs]] + name = "list-1" + type = "list" + description = "It's list number one." + default = ["a", "b", "c"] + required = false + +[[inputs]] + name = "list-3" + type = "list" + description = "" + default = [] + required = false + +[[inputs]] + name = "list_default_empty" + type = "list(string)" + description = "" + default = [] + required = false + +[[inputs]] + name = "long_type" + type = "object({\n name = string,\n foo = object({ foo = string, bar = string }),\n bar = object({ foo = string, bar = string }),\n fizz = list(string),\n buzz = list(string)\n })" + description = "This description is itself markdown.\n\nIt spans over multiple lines.\n" + required = false + [inputs.default] + buzz = ["fizz", "buzz"] + fizz = [] + name = "hello" + [inputs.default.bar] + bar = "bar" + foo = "bar" + [inputs.default.foo] + bar = "foo" + foo = "foo" + +[[inputs]] + name = "map-1" + type = "map" + description = "It's map number one." + required = false + [inputs.default] + a = 1.0 + b = 2.0 + c = 3.0 + +[[inputs]] + name = "map-3" + type = "map" + description = "" + required = false + [inputs.default] + +[[inputs]] + name = "no-escape-default-value" + type = "string" + description = "The description contains `something_with_underscore`. Defaults to 'VALUE_WITH_UNDERSCORE'." + default = "VALUE_WITH_UNDERSCORE" + required = false + +[[inputs]] + name = "number-1" + type = "number" + description = "It's number number one." + default = 42.0 + required = false + +[[inputs]] + name = "number-3" + type = "number" + description = "" + default = "19" + required = false + +[[inputs]] + name = "number-4" + type = "number" + description = "" + default = 15.75 + required = false + +[[inputs]] + name = "number_default_zero" + type = "number" + description = "" + default = 0.0 + required = false + +[[inputs]] + name = "object_default_empty" + type = "object({})" + description = "" + required = false + [inputs.default] + +[[inputs]] + name = "string-1" + type = "string" + description = "It's string number one." + default = "bar" + required = false + +[[inputs]] + name = "string-3" + type = "string" + description = "" + default = "" + required = false + +[[inputs]] + name = "string_default_empty" + type = "string" + description = "" + default = "" + required = false + +[[inputs]] + name = "string_default_null" + type = "string" + description = "" + required = false + [inputs.default] + +[[inputs]] + name = "with-url" + type = "string" + description = "The description contains url. https://www.domain.com/foo/bar_baz.html" + default = "" + required = false + +[[outputs]] + name = "output-0.12" + description = "terraform 0.12 only" + +[[outputs]] + name = "output-1" + description = "It's output number one." + +[[outputs]] + name = "output-2" + description = "It's output number two." + +[[outputs]] + name = "unquoted" + description = "It's unquoted output." + +[[providers]] + name = "aws" + alias = "" + version = ">= 2.15.0" + +[[providers]] + name = "aws" + alias = "ident" + version = ">= 2.15.0" + +[[providers]] + name = "null" + alias = "" + version = "" + +[[providers]] + name = "tls" + alias = "" + version = "" + +[[requirements]] + Name = "terraform" + Version = ">= 0.12" + +[[requirements]] + Name = "aws" + Version = ">= 2.15.0" + +[[requirements]] + Name = "random" + Version = ">= 2.2.0" diff --git a/internal/format/testdata/toml/toml-SortByType.golden b/internal/format/testdata/toml/toml-SortByType.golden new file mode 100644 index 0000000..6e9ea14 --- /dev/null +++ b/internal/format/testdata/toml/toml-SortByType.golden @@ -0,0 +1,271 @@ +header = "Usage:\n\nExample of 'foo_bar' module in `foo_bar.tf`.\n\n- list item 1\n- list item 2\n\nEven inline **formatting** in _here_ is possible.\nand some [link](https://domain.com/)\n\n* list item 3\n* list item 4\n\n```hcl\nmodule \"foo_bar\" {\n source = \"github.com/foo/bar\"\n\n id = \"1234567890\"\n name = \"baz\"\n\n zones = [\"us-east-1\", \"us-west-1\"]\n\n tags = {\n Name = \"baz\"\n Created-By = \"first.last@email.com\"\n Date-Created = \"20180101\"\n }\n}\n```\n\nHere is some trailing text after code block,\nfollowed by another line of text.\n\n| Name | Description |\n|------|-----------------|\n| Foo | Foo description |\n| Bar | Bar description |" + +[[inputs]] + name = "input_with_underscores" + type = "any" + description = "A variable with underscores." + required = true + [inputs.default] + +[[inputs]] + name = "unquoted" + type = "any" + description = "" + required = true + [inputs.default] + +[[inputs]] + name = "bool-1" + type = "bool" + description = "It's bool number one." + default = true + required = false + +[[inputs]] + name = "bool-2" + type = "bool" + description = "It's bool number two." + default = false + required = false + +[[inputs]] + name = "bool-3" + type = "bool" + description = "" + default = true + required = false + +[[inputs]] + name = "bool_default_false" + type = "bool" + description = "" + default = false + required = false + +[[inputs]] + name = "input-with-code-block" + type = "list" + description = "This is a complicated one. We need a newline. \nAnd an example in a code block\n```\ndefault = [\n \"machine rack01:neptune\"\n]\n```\n" + default = ["name rack:location"] + required = false + +[[inputs]] + name = "list-1" + type = "list" + description = "It's list number one." + default = ["a", "b", "c"] + required = false + +[[inputs]] + name = "list-2" + type = "list" + description = "It's list number two." + required = true + [inputs.default] + +[[inputs]] + name = "list-3" + type = "list" + description = "" + default = [] + required = false + +[[inputs]] + name = "list_default_empty" + type = "list(string)" + description = "" + default = [] + required = false + +[[inputs]] + name = "map-1" + type = "map" + description = "It's map number one." + required = false + [inputs.default] + a = 1.0 + b = 2.0 + c = 3.0 + +[[inputs]] + name = "map-2" + type = "map" + description = "It's map number two." + required = true + [inputs.default] + +[[inputs]] + name = "map-3" + type = "map" + description = "" + required = false + [inputs.default] + +[[inputs]] + name = "number-1" + type = "number" + description = "It's number number one." + default = 42.0 + required = false + +[[inputs]] + name = "number-2" + type = "number" + description = "It's number number two." + required = true + [inputs.default] + +[[inputs]] + name = "number-3" + type = "number" + description = "" + default = "19" + required = false + +[[inputs]] + name = "number-4" + type = "number" + description = "" + default = 15.75 + required = false + +[[inputs]] + name = "number_default_zero" + type = "number" + description = "" + default = 0.0 + required = false + +[[inputs]] + name = "long_type" + type = "object({\n name = string,\n foo = object({ foo = string, bar = string }),\n bar = object({ foo = string, bar = string }),\n fizz = list(string),\n buzz = list(string)\n })" + description = "This description is itself markdown.\n\nIt spans over multiple lines.\n" + required = false + [inputs.default] + buzz = ["fizz", "buzz"] + fizz = [] + name = "hello" + [inputs.default.bar] + bar = "bar" + foo = "bar" + [inputs.default.foo] + bar = "foo" + foo = "foo" + +[[inputs]] + name = "object_default_empty" + type = "object({})" + description = "" + required = false + [inputs.default] + +[[inputs]] + name = "input-with-pipe" + type = "string" + description = "It includes v1 | v2 | v3" + default = "v1" + required = false + +[[inputs]] + name = "no-escape-default-value" + type = "string" + description = "The description contains `something_with_underscore`. Defaults to 'VALUE_WITH_UNDERSCORE'." + default = "VALUE_WITH_UNDERSCORE" + required = false + +[[inputs]] + name = "string-1" + type = "string" + description = "It's string number one." + default = "bar" + required = false + +[[inputs]] + name = "string-2" + type = "string" + description = "It's string number two." + required = true + [inputs.default] + +[[inputs]] + name = "string-3" + type = "string" + description = "" + default = "" + required = false + +[[inputs]] + name = "string_default_empty" + type = "string" + description = "" + default = "" + required = false + +[[inputs]] + name = "string_default_null" + type = "string" + description = "" + required = false + [inputs.default] + +[[inputs]] + name = "string_no_default" + type = "string" + description = "" + required = true + [inputs.default] + +[[inputs]] + name = "with-url" + type = "string" + description = "The description contains url. https://www.domain.com/foo/bar_baz.html" + default = "" + required = false + +[[outputs]] + name = "output-0.12" + description = "terraform 0.12 only" + +[[outputs]] + name = "output-1" + description = "It's output number one." + +[[outputs]] + name = "output-2" + description = "It's output number two." + +[[outputs]] + name = "unquoted" + description = "It's unquoted output." + +[[providers]] + name = "aws" + alias = "" + version = ">= 2.15.0" + +[[providers]] + name = "aws" + alias = "ident" + version = ">= 2.15.0" + +[[providers]] + name = "null" + alias = "" + version = "" + +[[providers]] + name = "tls" + alias = "" + version = "" + +[[requirements]] + Name = "terraform" + Version = ">= 0.12" + +[[requirements]] + Name = "aws" + Version = ">= 2.15.0" + +[[requirements]] + Name = "random" + Version = ">= 2.2.0" diff --git a/internal/format/testdata/toml/toml.golden b/internal/format/testdata/toml/toml.golden new file mode 100644 index 0000000..0c21dd7 --- /dev/null +++ b/internal/format/testdata/toml/toml.golden @@ -0,0 +1,271 @@ +header = "Usage:\n\nExample of 'foo_bar' module in `foo_bar.tf`.\n\n- list item 1\n- list item 2\n\nEven inline **formatting** in _here_ is possible.\nand some [link](https://domain.com/)\n\n* list item 3\n* list item 4\n\n```hcl\nmodule \"foo_bar\" {\n source = \"github.com/foo/bar\"\n\n id = \"1234567890\"\n name = \"baz\"\n\n zones = [\"us-east-1\", \"us-west-1\"]\n\n tags = {\n Name = \"baz\"\n Created-By = \"first.last@email.com\"\n Date-Created = \"20180101\"\n }\n}\n```\n\nHere is some trailing text after code block,\nfollowed by another line of text.\n\n| Name | Description |\n|------|-----------------|\n| Foo | Foo description |\n| Bar | Bar description |" + +[[inputs]] + name = "unquoted" + type = "any" + description = "" + required = true + [inputs.default] + +[[inputs]] + name = "bool-3" + type = "bool" + description = "" + default = true + required = false + +[[inputs]] + name = "bool-2" + type = "bool" + description = "It's bool number two." + default = false + required = false + +[[inputs]] + name = "bool-1" + type = "bool" + description = "It's bool number one." + default = true + required = false + +[[inputs]] + name = "string-3" + type = "string" + description = "" + default = "" + required = false + +[[inputs]] + name = "string-2" + type = "string" + description = "It's string number two." + required = true + [inputs.default] + +[[inputs]] + name = "string-1" + type = "string" + description = "It's string number one." + default = "bar" + required = false + +[[inputs]] + name = "number-3" + type = "number" + description = "" + default = "19" + required = false + +[[inputs]] + name = "number-4" + type = "number" + description = "" + default = 15.75 + required = false + +[[inputs]] + name = "number-2" + type = "number" + description = "It's number number two." + required = true + [inputs.default] + +[[inputs]] + name = "number-1" + type = "number" + description = "It's number number one." + default = 42.0 + required = false + +[[inputs]] + name = "map-3" + type = "map" + description = "" + required = false + [inputs.default] + +[[inputs]] + name = "map-2" + type = "map" + description = "It's map number two." + required = true + [inputs.default] + +[[inputs]] + name = "map-1" + type = "map" + description = "It's map number one." + required = false + [inputs.default] + a = 1.0 + b = 2.0 + c = 3.0 + +[[inputs]] + name = "list-3" + type = "list" + description = "" + default = [] + required = false + +[[inputs]] + name = "list-2" + type = "list" + description = "It's list number two." + required = true + [inputs.default] + +[[inputs]] + name = "list-1" + type = "list" + description = "It's list number one." + default = ["a", "b", "c"] + required = false + +[[inputs]] + name = "input_with_underscores" + type = "any" + description = "A variable with underscores." + required = true + [inputs.default] + +[[inputs]] + name = "input-with-pipe" + type = "string" + description = "It includes v1 | v2 | v3" + default = "v1" + required = false + +[[inputs]] + name = "input-with-code-block" + type = "list" + description = "This is a complicated one. We need a newline. \nAnd an example in a code block\n```\ndefault = [\n \"machine rack01:neptune\"\n]\n```\n" + default = ["name rack:location"] + required = false + +[[inputs]] + name = "long_type" + type = "object({\n name = string,\n foo = object({ foo = string, bar = string }),\n bar = object({ foo = string, bar = string }),\n fizz = list(string),\n buzz = list(string)\n })" + description = "This description is itself markdown.\n\nIt spans over multiple lines.\n" + required = false + [inputs.default] + buzz = ["fizz", "buzz"] + fizz = [] + name = "hello" + [inputs.default.bar] + bar = "bar" + foo = "bar" + [inputs.default.foo] + bar = "foo" + foo = "foo" + +[[inputs]] + name = "no-escape-default-value" + type = "string" + description = "The description contains `something_with_underscore`. Defaults to 'VALUE_WITH_UNDERSCORE'." + default = "VALUE_WITH_UNDERSCORE" + required = false + +[[inputs]] + name = "with-url" + type = "string" + description = "The description contains url. https://www.domain.com/foo/bar_baz.html" + default = "" + required = false + +[[inputs]] + name = "string_default_empty" + type = "string" + description = "" + default = "" + required = false + +[[inputs]] + name = "string_default_null" + type = "string" + description = "" + required = false + [inputs.default] + +[[inputs]] + name = "string_no_default" + type = "string" + description = "" + required = true + [inputs.default] + +[[inputs]] + name = "number_default_zero" + type = "number" + description = "" + default = 0.0 + required = false + +[[inputs]] + name = "bool_default_false" + type = "bool" + description = "" + default = false + required = false + +[[inputs]] + name = "list_default_empty" + type = "list(string)" + description = "" + default = [] + required = false + +[[inputs]] + name = "object_default_empty" + type = "object({})" + description = "" + required = false + [inputs.default] + +[[outputs]] + name = "unquoted" + description = "It's unquoted output." + +[[outputs]] + name = "output-2" + description = "It's output number two." + +[[outputs]] + name = "output-1" + description = "It's output number one." + +[[outputs]] + name = "output-0.12" + description = "terraform 0.12 only" + +[[providers]] + name = "tls" + alias = "" + version = "" + +[[providers]] + name = "aws" + alias = "" + version = ">= 2.15.0" + +[[providers]] + name = "aws" + alias = "ident" + version = ">= 2.15.0" + +[[providers]] + name = "null" + alias = "" + version = "" + +[[requirements]] + Name = "terraform" + Version = ">= 0.12" + +[[requirements]] + Name = "aws" + Version = ">= 2.15.0" + +[[requirements]] + Name = "random" + Version = ">= 2.2.0" diff --git a/internal/format/toml.go b/internal/format/toml.go new file mode 100644 index 0000000..ccd6568 --- /dev/null +++ b/internal/format/toml.go @@ -0,0 +1,53 @@ +package format + +import ( + "bytes" + + "github.com/BurntSushi/toml" + "github.com/segmentio/terraform-docs/pkg/print" + "github.com/segmentio/terraform-docs/pkg/tfconf" +) + +// TOML represents TOML format. +type TOML struct{} + +// NewTOML returns new instance of TOML. +func NewTOML(settings *print.Settings) *TOML { + return &TOML{} +} + +// Print prints a Terraform module as toml. +func (t *TOML) Print(module *tfconf.Module, settings *print.Settings) (string, error) { + copy := tfconf.Module{ + Header: "", + Providers: make([]*tfconf.Provider, 0), + Inputs: make([]*tfconf.Input, 0), + Outputs: make([]*tfconf.Output, 0), + Requirements: make([]*tfconf.Requirement, 0), + } + + if settings.ShowHeader { + copy.Header = module.Header + } + if settings.ShowInputs { + copy.Inputs = module.Inputs + } + if settings.ShowOutputs { + copy.Outputs = module.Outputs + } + if settings.ShowProviders { + copy.Providers = module.Providers + } + if settings.ShowRequirements { + copy.Requirements = module.Requirements + } + + buffer := new(bytes.Buffer) + encoder := toml.NewEncoder(buffer) + err := encoder.Encode(copy) + if err != nil { + return "", err + } + + return buffer.String(), nil +} diff --git a/internal/format/toml_test.go b/internal/format/toml_test.go new file mode 100644 index 0000000..446a25e --- /dev/null +++ b/internal/format/toml_test.go @@ -0,0 +1,424 @@ +package format + +import ( + "testing" + + "github.com/segmentio/terraform-docs/internal/module" + "github.com/segmentio/terraform-docs/internal/testutil" + "github.com/segmentio/terraform-docs/pkg/print" + "github.com/stretchr/testify/assert" +) + +func TestToml(t *testing.T) { + assert := assert.New(t) + settings := testutil.Settings().WithSections().Build() + + expected, err := testutil.GetExpected("toml", "toml") + assert.Nil(err) + + options := module.NewOptions() + module, err := testutil.GetModule(options) + assert.Nil(err) + + printer := NewTOML(settings) + actual, err := printer.Print(module, settings) + + assert.Nil(err) + assert.Equal(expected, actual) +} + +func TestTomlSortByName(t *testing.T) { + assert := assert.New(t) + settings := testutil.Settings().WithSections().With(&print.Settings{ + SortByName: true, + }).Build() + + expected, err := testutil.GetExpected("toml", "toml-SortByName") + assert.Nil(err) + + options, err := module.NewOptions().With(&module.Options{ + SortBy: &module.SortBy{ + Name: true, + }, + }) + assert.Nil(err) + + module, err := testutil.GetModule(options) + assert.Nil(err) + + printer := NewTOML(settings) + actual, err := printer.Print(module, settings) + + assert.Nil(err) + assert.Equal(expected, actual) +} + +func TestTomlSortByRequired(t *testing.T) { + assert := assert.New(t) + settings := testutil.Settings().WithSections().With(&print.Settings{ + SortByName: true, + SortByRequired: true, + }).Build() + + expected, err := testutil.GetExpected("toml", "toml-SortByRequired") + assert.Nil(err) + + options, err := module.NewOptions().With(&module.Options{ + SortBy: &module.SortBy{ + Name: true, + Required: true, + }, + }) + assert.Nil(err) + + module, err := testutil.GetModule(options) + assert.Nil(err) + + printer := NewTOML(settings) + actual, err := printer.Print(module, settings) + + assert.Nil(err) + assert.Equal(expected, actual) +} + +func TestTomlSortByType(t *testing.T) { + assert := assert.New(t) + settings := testutil.Settings().WithSections().With(&print.Settings{ + SortByType: true, + }).Build() + + expected, err := testutil.GetExpected("toml", "toml-SortByType") + assert.Nil(err) + + options, err := module.NewOptions().With(&module.Options{ + SortBy: &module.SortBy{ + Type: true, + }, + }) + assert.Nil(err) + + module, err := testutil.GetModule(options) + assert.Nil(err) + + printer := NewTOML(settings) + actual, err := printer.Print(module, settings) + + assert.Nil(err) + assert.Equal(expected, actual) +} + +func TestTomlNoHeader(t *testing.T) { + assert := assert.New(t) + settings := testutil.Settings().With(&print.Settings{ + ShowHeader: false, + ShowInputs: true, + ShowOutputs: true, + ShowProviders: true, + ShowRequirements: true, + }).Build() + + expected, err := testutil.GetExpected("toml", "toml-NoHeader") + assert.Nil(err) + + options := module.NewOptions() + module, err := testutil.GetModule(options) + assert.Nil(err) + + printer := NewTOML(settings) + actual, err := printer.Print(module, settings) + + assert.Nil(err) + assert.Equal(expected, actual) +} + +func TestTomlNoInputs(t *testing.T) { + assert := assert.New(t) + settings := testutil.Settings().With(&print.Settings{ + ShowHeader: true, + ShowInputs: false, + ShowOutputs: true, + ShowProviders: true, + ShowRequirements: true, + }).Build() + + expected, err := testutil.GetExpected("toml", "toml-NoInputs") + assert.Nil(err) + + options := module.NewOptions() + module, err := testutil.GetModule(options) + assert.Nil(err) + + printer := NewTOML(settings) + actual, err := printer.Print(module, settings) + + assert.Nil(err) + assert.Equal(expected, actual) +} + +func TestTomlNoOutputs(t *testing.T) { + assert := assert.New(t) + settings := testutil.Settings().With(&print.Settings{ + ShowHeader: true, + ShowInputs: true, + ShowOutputs: false, + ShowProviders: true, + ShowRequirements: true, + }).Build() + + expected, err := testutil.GetExpected("toml", "toml-NoOutputs") + assert.Nil(err) + + options := module.NewOptions() + module, err := testutil.GetModule(options) + assert.Nil(err) + + printer := NewTOML(settings) + actual, err := printer.Print(module, settings) + + assert.Nil(err) + assert.Equal(expected, actual) +} + +func TestTomlNoProviders(t *testing.T) { + assert := assert.New(t) + settings := testutil.Settings().With(&print.Settings{ + ShowHeader: true, + ShowInputs: true, + ShowOutputs: true, + ShowProviders: false, + ShowRequirements: true, + }).Build() + + expected, err := testutil.GetExpected("toml", "toml-NoProviders") + assert.Nil(err) + + options := module.NewOptions() + module, err := testutil.GetModule(options) + assert.Nil(err) + + printer := NewTOML(settings) + actual, err := printer.Print(module, settings) + + assert.Nil(err) + assert.Equal(expected, actual) +} + +func TestTomlNoRequirements(t *testing.T) { + assert := assert.New(t) + settings := testutil.Settings().With(&print.Settings{ + ShowHeader: true, + ShowInputs: true, + ShowOutputs: true, + ShowProviders: true, + ShowRequirements: false, + }).Build() + + expected, err := testutil.GetExpected("toml", "toml-NoRequirements") + assert.Nil(err) + + options := module.NewOptions() + module, err := testutil.GetModule(options) + assert.Nil(err) + + printer := NewTOML(settings) + actual, err := printer.Print(module, settings) + + assert.Nil(err) + assert.Equal(expected, actual) +} + +func TestTomlOnlyHeader(t *testing.T) { + assert := assert.New(t) + settings := testutil.Settings().With(&print.Settings{ + ShowHeader: true, + ShowInputs: false, + ShowOutputs: false, + ShowProviders: false, + ShowRequirements: false, + }).Build() + + expected, err := testutil.GetExpected("toml", "toml-OnlyHeader") + assert.Nil(err) + + options := module.NewOptions() + module, err := testutil.GetModule(options) + assert.Nil(err) + + printer := NewTOML(settings) + actual, err := printer.Print(module, settings) + + assert.Nil(err) + assert.Equal(expected, actual) +} + +func TestTomlOnlyInputs(t *testing.T) { + assert := assert.New(t) + settings := testutil.Settings().With(&print.Settings{ + ShowHeader: false, + ShowInputs: true, + ShowOutputs: false, + ShowProviders: false, + ShowRequirements: false, + }).Build() + + expected, err := testutil.GetExpected("toml", "toml-OnlyInputs") + assert.Nil(err) + + options := module.NewOptions() + module, err := testutil.GetModule(options) + assert.Nil(err) + + printer := NewTOML(settings) + actual, err := printer.Print(module, settings) + + assert.Nil(err) + assert.Equal(expected, actual) +} + +func TestTomlOnlyOutputs(t *testing.T) { + assert := assert.New(t) + settings := testutil.Settings().With(&print.Settings{ + ShowHeader: false, + ShowInputs: false, + ShowOutputs: true, + ShowProviders: false, + ShowRequirements: false, + }).Build() + + expected, err := testutil.GetExpected("toml", "toml-OnlyOutputs") + assert.Nil(err) + + options := module.NewOptions() + module, err := testutil.GetModule(options) + assert.Nil(err) + + printer := NewTOML(settings) + actual, err := printer.Print(module, settings) + + assert.Nil(err) + assert.Equal(expected, actual) +} + +func TestTomlOnlyProviders(t *testing.T) { + assert := assert.New(t) + settings := testutil.Settings().With(&print.Settings{ + ShowHeader: false, + ShowInputs: false, + ShowOutputs: false, + ShowProviders: true, + ShowRequirements: false, + }).Build() + + expected, err := testutil.GetExpected("toml", "toml-OnlyProviders") + assert.Nil(err) + + options := module.NewOptions() + module, err := testutil.GetModule(options) + assert.Nil(err) + + printer := NewTOML(settings) + actual, err := printer.Print(module, settings) + + assert.Nil(err) + assert.Equal(expected, actual) +} + +func TestTomlOnlyRequirements(t *testing.T) { + assert := assert.New(t) + settings := testutil.Settings().With(&print.Settings{ + ShowHeader: false, + ShowInputs: false, + ShowOutputs: false, + ShowProviders: false, + ShowRequirements: true, + }).Build() + + expected, err := testutil.GetExpected("toml", "toml-OnlyRequirements") + assert.Nil(err) + + options := module.NewOptions() + module, err := testutil.GetModule(options) + assert.Nil(err) + + printer := NewTOML(settings) + actual, err := printer.Print(module, settings) + + assert.Nil(err) + assert.Equal(expected, actual) +} + +func TestTomlOutputValues(t *testing.T) { + assert := assert.New(t) + settings := testutil.Settings().WithSections().With(&print.Settings{ + OutputValues: true, + }).Build() + + expected, err := testutil.GetExpected("toml", "toml-OutputValues") + assert.Nil(err) + + options, err := module.NewOptions().With(&module.Options{ + OutputValues: true, + OutputValuesPath: "output_values.json", + }) + assert.Nil(err) + + module, err := testutil.GetModule(options) + assert.Nil(err) + + printer := NewTOML(settings) + actual, err := printer.Print(module, settings) + + assert.Nil(err) + assert.Equal(expected, actual) +} + +func TestTomlHeaderFromFile(t *testing.T) { + assert := assert.New(t) + settings := testutil.Settings().WithSections().Build() + + expected, err := testutil.GetExpected("toml", "toml-HeaderFromFile") + assert.Nil(err) + + options, err := module.NewOptions().WithOverwrite(&module.Options{ + HeaderFromFile: "doc.tf", + }) + assert.Nil(err) + + module, err := testutil.GetModule(options) + assert.Nil(err) + + printer := NewTOML(settings) + actual, err := printer.Print(module, settings) + + assert.Nil(err) + assert.Equal(expected, actual) +} + +func TestTomlEmpty(t *testing.T) { + assert := assert.New(t) + settings := testutil.Settings().With(&print.Settings{ + ShowHeader: false, + ShowInputs: false, + ShowOutputs: false, + ShowProviders: false, + ShowRequirements: false, + }).Build() + + expected, err := testutil.GetExpected("toml", "toml-Empty") + assert.Nil(err) + + options, err := module.NewOptions().WithOverwrite(&module.Options{ + HeaderFromFile: "bad.tf", + }) + options.ShowHeader = false // Since we don't show the header, the file won't be loaded at all + assert.Nil(err) + + module, err := testutil.GetModule(options) + assert.Nil(err) + + printer := NewTOML(settings) + actual, err := printer.Print(module, settings) + + assert.Nil(err) + assert.Equal(expected, actual) +} diff --git a/pkg/tfconf/input.go b/pkg/tfconf/input.go index 3b41335..1f66bb8 100644 --- a/pkg/tfconf/input.go +++ b/pkg/tfconf/input.go @@ -8,12 +8,12 @@ import ( // Input represents a Terraform input. type Input struct { - Name string `json:"name" xml:"name" yaml:"name"` - Type types.String `json:"type" xml:"type" yaml:"type"` - Description types.String `json:"description" xml:"description" yaml:"description"` - Default types.Value `json:"default" xml:"default" yaml:"default"` - Required bool `json:"required" xml:"required" yaml:"required"` - Position Position `json:"-" xml:"-" yaml:"-"` + Name string `json:"name" toml:"name" xml:"name" yaml:"name"` + Type types.String `json:"type" toml:"type" xml:"type" yaml:"type"` + Description types.String `json:"description" toml:"description" xml:"description" yaml:"description"` + Default types.Value `json:"default" toml:"default" xml:"default" yaml:"default"` + Required bool `json:"required" toml:"required" xml:"required" yaml:"required"` + Position Position `json:"-" toml:"-" xml:"-" yaml:"-"` } // GetValue returns JSON representation of the 'Default' value, which is an 'interface'. diff --git a/pkg/tfconf/module.go b/pkg/tfconf/module.go index d8eeeb0..7b108c8 100644 --- a/pkg/tfconf/module.go +++ b/pkg/tfconf/module.go @@ -12,16 +12,16 @@ import ( // - Providers ('providers' json key): List of 'providers' extracted from resources used in Terraform module // - Requirements ('header' json key): List of 'requirements' extracted from the Terraform module .tf files type Module struct { - XMLName xml.Name `json:"-" xml:"module" yaml:"-"` + XMLName xml.Name `json:"-" toml:"-" xml:"module" yaml:"-"` - Header string `json:"header" xml:"header" yaml:"header"` - Inputs []*Input `json:"inputs" xml:"inputs>input" yaml:"inputs"` - Outputs []*Output `json:"outputs" xml:"outputs>output" yaml:"outputs"` - Providers []*Provider `json:"providers" xml:"providers>provider" yaml:"providers"` - Requirements []*Requirement `json:"requirements" xml:"requirements>requirement" yaml:"requirements"` + Header string `json:"header" toml:"header" xml:"header" yaml:"header"` + Inputs []*Input `json:"inputs" toml:"inputs" xml:"inputs>input" yaml:"inputs"` + Outputs []*Output `json:"outputs" toml:"outputs" xml:"outputs>output" yaml:"outputs"` + Providers []*Provider `json:"providers" toml:"providers" xml:"providers>provider" yaml:"providers"` + Requirements []*Requirement `json:"requirements" toml:"requirements" xml:"requirements>requirement" yaml:"requirements"` - RequiredInputs []*Input `json:"-" xml:"-" yaml:"-"` - OptionalInputs []*Input `json:"-" xml:"-" yaml:"-"` + RequiredInputs []*Input `json:"-" toml:"-" xml:"-" yaml:"-"` + OptionalInputs []*Input `json:"-" toml:"-" xml:"-" yaml:"-"` } // HasHeader indicates if the module has header. diff --git a/pkg/tfconf/output.go b/pkg/tfconf/output.go index 5a48e00..c862300 100644 --- a/pkg/tfconf/output.go +++ b/pkg/tfconf/output.go @@ -10,21 +10,21 @@ import ( // Output represents a Terraform output. type Output struct { - Name string `json:"name" xml:"name" yaml:"name"` - Description types.String `json:"description" xml:"description" yaml:"description"` - Value types.Value `json:"value,omitempty" xml:"value,omitempty" yaml:"value,omitempty"` - Sensitive bool `json:"sensitive,omitempty" xml:"sensitive,omitempty" yaml:"sensitive,omitempty"` - Position Position `json:"-" xml:"-" yaml:"-"` - ShowValue bool `json:"-" xml:"-" yaml:"-"` + Name string `json:"name" toml:"name" xml:"name" yaml:"name"` + Description types.String `json:"description" toml:"description" xml:"description" yaml:"description"` + Value types.Value `json:"value,omitempty" toml:"value,omitempty" xml:"value,omitempty" yaml:"value,omitempty"` + Sensitive bool `json:"sensitive,omitempty" toml:"sensitive,omitempty" xml:"sensitive,omitempty" yaml:"sensitive,omitempty"` + Position Position `json:"-" toml:"-" xml:"-" yaml:"-"` + ShowValue bool `json:"-" toml:"-" xml:"-" yaml:"-"` } type withvalue struct { - Name string `json:"name" xml:"name" yaml:"name"` - Description types.String `json:"description" xml:"description" yaml:"description"` - Value types.Value `json:"value" xml:"value" yaml:"value"` - Sensitive bool `json:"sensitive" xml:"sensitive" yaml:"sensitive"` - Position Position `json:"-" xml:"-" yaml:"-"` - ShowValue bool `json:"-" xml:"-" yaml:"-"` + Name string `json:"name" toml:"name" xml:"name" yaml:"name"` + Description types.String `json:"description" toml:"description" xml:"description" yaml:"description"` + Value types.Value `json:"value" toml:"value" xml:"value" yaml:"value"` + Sensitive bool `json:"sensitive" toml:"sensitive" xml:"sensitive" yaml:"sensitive"` + Position Position `json:"-" toml:"-" xml:"-" yaml:"-"` + ShowValue bool `json:"-" toml:"-" xml:"-" yaml:"-"` } // GetValue returns JSON representation of the 'Value', which is an 'interface'. diff --git a/pkg/tfconf/position.go b/pkg/tfconf/position.go index cec7cc2..d48888b 100644 --- a/pkg/tfconf/position.go +++ b/pkg/tfconf/position.go @@ -2,6 +2,6 @@ package tfconf // Position represents position of Terraform input or output in a file. type Position struct { - Filename string `json:"-" xml:"-" yaml:"-"` - Line int `json:"-" xml:"-" yaml:"-"` + Filename string `json:"-" toml:"-" xml:"-" yaml:"-"` + Line int `json:"-" toml:"-" xml:"-" yaml:"-"` } diff --git a/pkg/tfconf/provider.go b/pkg/tfconf/provider.go index 5b72437..96755e7 100644 --- a/pkg/tfconf/provider.go +++ b/pkg/tfconf/provider.go @@ -8,10 +8,10 @@ import ( // Provider represents a Terraform output. type Provider struct { - Name string `json:"name" xml:"name" yaml:"name"` - Alias types.String `json:"alias" xml:"alias" yaml:"alias"` - Version types.String `json:"version" xml:"version" yaml:"version"` - Position Position `json:"-" xml:"-" yaml:"-"` + Name string `json:"name" toml:"name" xml:"name" yaml:"name"` + Alias types.String `json:"alias" toml:"alias" xml:"alias" yaml:"alias"` + Version types.String `json:"version" toml:"version" xml:"version" yaml:"version"` + Position Position `json:"-" toml:"-" xml:"-" yaml:"-"` } // FullName returns full name of the provider, with alias if available