feat: Add new flags: --show, --show-all, --hide-all (#267)

* Add new flags: --show, --show-all, --hide-all

* add deprecated flags to Config

* update docs

* add implementation for new flags

Examples:

- hide all sections except one (or more): `terraform-docs --hide-all --show <name> ...`
- show all sections except one (or more): `terraform-docs --show-all --hide <name> ...`
This commit is contained in:
Khosrow Moossavi
2020-05-25 12:08:52 -04:00
committed by GitHub
parent 04a9ef49eb
commit e0404399a7
23 changed files with 349 additions and 163 deletions

View File

@@ -21,13 +21,13 @@ func NewCommand(config *cli.Config) *cobra.Command {
}
// flags
cmd.PersistentFlags().BoolVar(&config.Settings.Required, "required", true, "show \"Required\" column or section")
cmd.PersistentFlags().BoolVar(&config.Settings.Sensitive, "sensitive", true, "show \"Sensitive\" column or section")
cmd.PersistentFlags().BoolVar(&config.Settings.Required, "required", true, "show Required column or section")
cmd.PersistentFlags().BoolVar(&config.Settings.Sensitive, "sensitive", true, "show Sensitive column or section")
cmd.PersistentFlags().IntVar(&config.Settings.Indent, "indent", 2, "indention level of AsciiDoc sections [1, 2, 3, 4, 5]")
// deprecation
cmd.PersistentFlags().BoolVar(new(bool), "no-required", false, "do not show \"Required\" column or section")
cmd.PersistentFlags().BoolVar(new(bool), "no-sensitive", false, "do not show \"Sensitive\" column or section")
cmd.PersistentFlags().BoolVar(&config.Settings.Deprecated.NoRequired, "no-required", false, "do not show \"Required\" column or section")
cmd.PersistentFlags().BoolVar(&config.Settings.Deprecated.NoSensitive, "no-sensitive", false, "do not show \"Sensitive\" column or section")
cmd.PersistentFlags().MarkDeprecated("no-required", "use '--required=false' instead") //nolint:errcheck
cmd.PersistentFlags().MarkDeprecated("no-sensitive", "use '--sensitive=false' instead") //nolint:errcheck

View File

@@ -21,7 +21,7 @@ func NewCommand(config *cli.Config) *cobra.Command {
cmd.PersistentFlags().BoolVar(&config.Settings.Escape, "escape", true, "escape special characters")
// deprecation
cmd.PersistentFlags().BoolVar(new(bool), "no-escape", false, "do not escape special characters")
cmd.PersistentFlags().BoolVar(&config.Settings.Deprecated.NoEscape, "no-escape", false, "do not escape special characters")
cmd.PersistentFlags().MarkDeprecated("no-escape", "use '--escape=false' instead") //nolint:errcheck
return cmd

View File

@@ -21,15 +21,15 @@ func NewCommand(config *cli.Config) *cobra.Command {
}
// flags
cmd.PersistentFlags().BoolVar(&config.Settings.Required, "required", true, "show \"Required\" column or section")
cmd.PersistentFlags().BoolVar(&config.Settings.Sensitive, "sensitive", true, "show \"Sensitive\" column or section")
cmd.PersistentFlags().BoolVar(&config.Settings.Required, "required", true, "show Required column or section")
cmd.PersistentFlags().BoolVar(&config.Settings.Sensitive, "sensitive", true, "show Sensitive column or section")
cmd.PersistentFlags().BoolVar(&config.Settings.Escape, "escape", true, "escape special characters")
cmd.PersistentFlags().IntVar(&config.Settings.Indent, "indent", 2, "indention level of Markdown sections [1, 2, 3, 4, 5]")
// deprecation
cmd.PersistentFlags().BoolVar(new(bool), "no-required", false, "do not show \"Required\" column or section")
cmd.PersistentFlags().BoolVar(new(bool), "no-sensitive", false, "do not show \"Sensitive\" column or section")
cmd.PersistentFlags().BoolVar(new(bool), "no-escape", false, "do not escape special characters")
cmd.PersistentFlags().BoolVar(&config.Settings.Deprecated.NoRequired, "no-required", false, "do not show \"Required\" column or section")
cmd.PersistentFlags().BoolVar(&config.Settings.Deprecated.NoSensitive, "no-sensitive", false, "do not show \"Sensitive\" column or section")
cmd.PersistentFlags().BoolVar(&config.Settings.Deprecated.NoEscape, "no-escape", false, "do not escape special characters")
cmd.PersistentFlags().MarkDeprecated("no-required", "use '--required=false' instead") //nolint:errcheck
cmd.PersistentFlags().MarkDeprecated("no-sensitive", "use '--sensitive=false' instead") //nolint:errcheck
cmd.PersistentFlags().MarkDeprecated("no-escape", "use '--escape=false' instead") //nolint:errcheck

View File

@@ -21,7 +21,7 @@ func NewCommand(config *cli.Config) *cobra.Command {
cmd.PersistentFlags().BoolVar(&config.Settings.Color, "color", true, "colorize printed result")
// deprecation
cmd.PersistentFlags().BoolVar(new(bool), "no-color", false, "do not colorize printed result")
cmd.PersistentFlags().BoolVar(&config.Settings.Deprecated.NoColor, "no-color", false, "do not colorize printed result")
cmd.PersistentFlags().MarkDeprecated("no-color", "use '--color=false' instead") //nolint:errcheck
return cmd

View File

@@ -42,7 +42,10 @@ func NewCommand() *cobra.Command {
}
// flags
cmd.PersistentFlags().StringSliceVar(&config.Sections.Show, "show", []string{}, "show section [header, inputs, outputs, providers, requirements]")
cmd.PersistentFlags().StringSliceVar(&config.Sections.Hide, "hide", []string{}, "hide section [header, inputs, outputs, providers, requirements]")
cmd.PersistentFlags().BoolVar(&config.Sections.ShowAll, "show-all", true, "show all sections")
cmd.PersistentFlags().BoolVar(&config.Sections.HideAll, "hide-all", false, "hide all sections (default false)")
cmd.PersistentFlags().BoolVar(&config.Sort.Enabled, "sort", true, "sort items")
cmd.PersistentFlags().BoolVar(&config.Sort.By.Required, "sort-by-required", false, "sort items by name and print required ones first (default false)")
@@ -54,12 +57,12 @@ func NewCommand() *cobra.Command {
cmd.PersistentFlags().StringVar(&config.OutputValues.From, "output-values-from", "", "inject output values from file into outputs (default \"\")")
// deprecation
cmd.PersistentFlags().BoolVar(new(bool), "no-header", false, "do not show module header")
cmd.PersistentFlags().BoolVar(new(bool), "no-inputs", false, "do not show inputs")
cmd.PersistentFlags().BoolVar(new(bool), "no-outputs", false, "do not show outputs")
cmd.PersistentFlags().BoolVar(new(bool), "no-providers", false, "do not show providers")
cmd.PersistentFlags().BoolVar(new(bool), "no-requirements", false, "do not show module requirements")
cmd.PersistentFlags().BoolVar(new(bool), "no-sort", false, "do no sort items")
cmd.PersistentFlags().BoolVar(&config.Sections.Deprecated.NoHeader, "no-header", false, "do not show module header")
cmd.PersistentFlags().BoolVar(&config.Sections.Deprecated.NoInputs, "no-inputs", false, "do not show inputs")
cmd.PersistentFlags().BoolVar(&config.Sections.Deprecated.NoOutputs, "no-outputs", false, "do not show outputs")
cmd.PersistentFlags().BoolVar(&config.Sections.Deprecated.NoProviders, "no-providers", false, "do not show providers")
cmd.PersistentFlags().BoolVar(&config.Sections.Deprecated.NoRequirements, "no-requirements", false, "do not show module requirements")
cmd.PersistentFlags().BoolVar(&config.Sort.Deprecated.NoSort, "no-sort", false, "do no sort items")
cmd.PersistentFlags().MarkDeprecated("no-header", "use '--hide header' instead") //nolint:errcheck
cmd.PersistentFlags().MarkDeprecated("no-inputs", "use '--hide inputs' instead") //nolint:errcheck

View File

@@ -12,8 +12,11 @@ A utility to generate documentation from Terraform modules in various output for
--header-from string relative path of a file to read header from (default "main.tf")
-h, --help help for terraform-docs
--hide strings hide section [header, inputs, outputs, providers, requirements]
--hide-all hide all sections (default false)
--output-values inject output values into outputs (default false)
--output-values-from string inject output values from file into outputs (default "")
--show strings show section [header, inputs, outputs, providers, requirements]
--show-all show all sections (default true)
--sort sort items (default true)
--sort-by-required sort items by name and print required ones first (default false)
--sort-by-type sort items by type of them (default false)
@@ -36,4 +39,4 @@ A utility to generate documentation from Terraform modules in various output for
* [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
###### Auto generated by spf13/cobra on 20-May-2020
###### Auto generated by spf13/cobra on 24-May-2020

View File

@@ -8,6 +8,15 @@ Support for Terraform `v0.12.x` has been added in `terraform-docs` version `v0.8
Please refer to [Formats Guide](/docs/FORMATS_GUIDE.md) for guidance on output formats, execution syntax, CLI options, etc.
## Control Visibility of Sections
Output generated by `terraform-docs` consists of different sections (header, requirements, providers, inputs, outputs) which are visible by default. The visibility of these can be controlled by one or combination of : `--show-all`, `--hide-all`, `--show <name>` and `--hide <name>`. For example:
```bash
terraform-docs --show-all --hide header ... # show all sections except 'header'
terraform-docs --hide-all --show inputs --show outputs ... # hide all sections except 'inputs' and 'outputs'
```
## Generate terraform.tfvars
You can generate `terraform.tfvars` in both `hcl` and `json` format by executing the following:

View File

@@ -21,11 +21,14 @@ terraform-docs asciidoc document [PATH] [flags]
```
--header-from string relative path of a file to read header from (default "main.tf")
--hide strings hide section [header, inputs, outputs, providers, requirements]
--hide-all hide all sections (default false)
--indent int indention level of AsciiDoc sections [1, 2, 3, 4, 5] (default 2)
--output-values inject output values into outputs (default false)
--output-values-from string inject output values from file into outputs (default "")
--required show "Required" column or section (default true)
--sensitive show "Sensitive" column or section (default true)
--required show Required column or section (default true)
--sensitive show Sensitive column or section (default true)
--show strings show section [header, inputs, outputs, providers, requirements]
--show-all show all sections (default true)
--sort sort items (default true)
--sort-by-required sort items by name and print required ones first (default false)
--sort-by-type sort items by type of them (default false)
@@ -416,4 +419,4 @@ generates the following output:
###### Auto generated by spf13/cobra on 20-May-2020
###### Auto generated by spf13/cobra on 24-May-2020

View File

@@ -21,11 +21,14 @@ terraform-docs asciidoc table [PATH] [flags]
```
--header-from string relative path of a file to read header from (default "main.tf")
--hide strings hide section [header, inputs, outputs, providers, requirements]
--hide-all hide all sections (default false)
--indent int indention level of AsciiDoc sections [1, 2, 3, 4, 5] (default 2)
--output-values inject output values into outputs (default false)
--output-values-from string inject output values from file into outputs (default "")
--required show "Required" column or section (default true)
--sensitive show "Sensitive" column or section (default true)
--required show Required column or section (default true)
--sensitive show Sensitive column or section (default true)
--show strings show section [header, inputs, outputs, providers, requirements]
--show-all show all sections (default true)
--sort sort items (default true)
--sort-by-required sort items by name and print required ones first (default false)
--sort-by-type sort items by type of them (default false)
@@ -372,4 +375,4 @@ generates the following output:
###### Auto generated by spf13/cobra on 20-May-2020
###### Auto generated by spf13/cobra on 24-May-2020

View File

@@ -15,8 +15,8 @@ terraform-docs asciidoc [PATH] [flags]
```
-h, --help help for asciidoc
--indent int indention level of AsciiDoc sections [1, 2, 3, 4, 5] (default 2)
--required show "Required" column or section (default true)
--sensitive show "Sensitive" column or section (default true)
--required show Required column or section (default true)
--sensitive show Sensitive column or section (default true)
```
### Options inherited from parent commands
@@ -24,8 +24,11 @@ terraform-docs asciidoc [PATH] [flags]
```
--header-from string relative path of a file to read header from (default "main.tf")
--hide strings hide section [header, inputs, outputs, providers, requirements]
--hide-all hide all sections (default false)
--output-values inject output values into outputs (default false)
--output-values-from string inject output values from file into outputs (default "")
--show strings show section [header, inputs, outputs, providers, requirements]
--show-all show all sections (default true)
--sort sort items (default true)
--sort-by-required sort items by name and print required ones first (default false)
--sort-by-type sort items by type of them (default false)
@@ -36,4 +39,4 @@ terraform-docs asciidoc [PATH] [flags]
* [terraform-docs asciidoc document](/docs/formats/asciidoc-document.md) - Generate AsciiDoc document of inputs and outputs
* [terraform-docs asciidoc table](/docs/formats/asciidoc-table.md) - Generate AsciiDoc tables of inputs and outputs
###### Auto generated by spf13/cobra on 20-May-2020
###### Auto generated by spf13/cobra on 24-May-2020

View File

@@ -22,8 +22,11 @@ terraform-docs json [PATH] [flags]
```
--header-from string relative path of a file to read header from (default "main.tf")
--hide strings hide section [header, inputs, outputs, providers, requirements]
--hide-all hide all sections (default false)
--output-values inject output values into outputs (default false)
--output-values-from string inject output values from file into outputs (default "")
--show strings show section [header, inputs, outputs, providers, requirements]
--show-all show all sections (default true)
--sort sort items (default true)
--sort-by-required sort items by name and print required ones first (default false)
--sort-by-type sort items by type of them (default false)
@@ -335,4 +338,4 @@ generates the following output:
}
###### Auto generated by spf13/cobra on 20-May-2020
###### Auto generated by spf13/cobra on 24-May-2020

View File

@@ -22,11 +22,14 @@ terraform-docs markdown document [PATH] [flags]
--escape escape special characters (default true)
--header-from string relative path of a file to read header from (default "main.tf")
--hide strings hide section [header, inputs, outputs, providers, requirements]
--hide-all hide all sections (default false)
--indent int indention level of Markdown sections [1, 2, 3, 4, 5] (default 2)
--output-values inject output values into outputs (default false)
--output-values-from string inject output values from file into outputs (default "")
--required show "Required" column or section (default true)
--sensitive show "Sensitive" column or section (default true)
--required show Required column or section (default true)
--sensitive show Sensitive column or section (default true)
--show strings show section [header, inputs, outputs, providers, requirements]
--show-all show all sections (default true)
--sort sort items (default true)
--sort-by-required sort items by name and print required ones first (default false)
--sort-by-type sort items by type of them (default false)
@@ -417,4 +420,4 @@ generates the following output:
###### Auto generated by spf13/cobra on 20-May-2020
###### Auto generated by spf13/cobra on 24-May-2020

View File

@@ -22,11 +22,14 @@ terraform-docs markdown table [PATH] [flags]
--escape escape special characters (default true)
--header-from string relative path of a file to read header from (default "main.tf")
--hide strings hide section [header, inputs, outputs, providers, requirements]
--hide-all hide all sections (default false)
--indent int indention level of Markdown sections [1, 2, 3, 4, 5] (default 2)
--output-values inject output values into outputs (default false)
--output-values-from string inject output values from file into outputs (default "")
--required show "Required" column or section (default true)
--sensitive show "Sensitive" column or section (default true)
--required show Required column or section (default true)
--sensitive show Sensitive column or section (default true)
--show strings show section [header, inputs, outputs, providers, requirements]
--show-all show all sections (default true)
--sort sort items (default true)
--sort-by-required sort items by name and print required ones first (default false)
--sort-by-type sort items by type of them (default false)
@@ -143,4 +146,4 @@ generates the following output:
###### Auto generated by spf13/cobra on 20-May-2020
###### Auto generated by spf13/cobra on 24-May-2020

View File

@@ -16,8 +16,8 @@ terraform-docs markdown [PATH] [flags]
--escape escape special characters (default true)
-h, --help help for markdown
--indent int indention level of Markdown sections [1, 2, 3, 4, 5] (default 2)
--required show "Required" column or section (default true)
--sensitive show "Sensitive" column or section (default true)
--required show Required column or section (default true)
--sensitive show Sensitive column or section (default true)
```
### Options inherited from parent commands
@@ -25,8 +25,11 @@ terraform-docs markdown [PATH] [flags]
```
--header-from string relative path of a file to read header from (default "main.tf")
--hide strings hide section [header, inputs, outputs, providers, requirements]
--hide-all hide all sections (default false)
--output-values inject output values into outputs (default false)
--output-values-from string inject output values from file into outputs (default "")
--show strings show section [header, inputs, outputs, providers, requirements]
--show-all show all sections (default true)
--sort sort items (default true)
--sort-by-required sort items by name and print required ones first (default false)
--sort-by-type sort items by type of them (default false)
@@ -37,4 +40,4 @@ terraform-docs markdown [PATH] [flags]
* [terraform-docs markdown document](/docs/formats/markdown-document.md) - Generate Markdown document of inputs and outputs
* [terraform-docs markdown table](/docs/formats/markdown-table.md) - Generate Markdown tables of inputs and outputs
###### Auto generated by spf13/cobra on 20-May-2020
###### Auto generated by spf13/cobra on 24-May-2020

View File

@@ -22,8 +22,11 @@ terraform-docs pretty [PATH] [flags]
```
--header-from string relative path of a file to read header from (default "main.tf")
--hide strings hide section [header, inputs, outputs, providers, requirements]
--hide-all hide all sections (default false)
--output-values inject output values into outputs (default false)
--output-values-from string inject output values from file into outputs (default "")
--show strings show section [header, inputs, outputs, providers, requirements]
--show-all show all sections (default true)
--sort sort items (default true)
--sort-by-required sort items by name and print required ones first (default false)
--sort-by-type sort items by type of them (default false)
@@ -239,4 +242,4 @@ generates the following output:
###### Auto generated by spf13/cobra on 20-May-2020
###### Auto generated by spf13/cobra on 24-May-2020

View File

@@ -21,8 +21,11 @@ terraform-docs tfvars hcl [PATH] [flags]
```
--header-from string relative path of a file to read header from (default "main.tf")
--hide strings hide section [header, inputs, outputs, providers, requirements]
--hide-all hide all sections (default false)
--output-values inject output values into outputs (default false)
--output-values-from string inject output values from file into outputs (default "")
--show strings show section [header, inputs, outputs, providers, requirements]
--show-all show all sections (default true)
--sort sort items (default true)
--sort-by-required sort items by name and print required ones first (default false)
--sort-by-type sort items by type of them (default false)
@@ -95,4 +98,4 @@ generates the following output:
with-url = ""
###### Auto generated by spf13/cobra on 20-May-2020
###### Auto generated by spf13/cobra on 24-May-2020

View File

@@ -21,8 +21,11 @@ terraform-docs tfvars json [PATH] [flags]
```
--header-from string relative path of a file to read header from (default "main.tf")
--hide strings hide section [header, inputs, outputs, providers, requirements]
--hide-all hide all sections (default false)
--output-values inject output values into outputs (default false)
--output-values-from string inject output values from file into outputs (default "")
--show strings show section [header, inputs, outputs, providers, requirements]
--show-all show all sections (default true)
--sort sort items (default true)
--sort-by-required sort items by name and print required ones first (default false)
--sort-by-type sort items by type of them (default false)
@@ -97,4 +100,4 @@ generates the following output:
}
###### Auto generated by spf13/cobra on 20-May-2020
###### Auto generated by spf13/cobra on 24-May-2020

View File

@@ -17,8 +17,11 @@ Generate terraform.tfvars of inputs
```
--header-from string relative path of a file to read header from (default "main.tf")
--hide strings hide section [header, inputs, outputs, providers, requirements]
--hide-all hide all sections (default false)
--output-values inject output values into outputs (default false)
--output-values-from string inject output values from file into outputs (default "")
--show strings show section [header, inputs, outputs, providers, requirements]
--show-all show all sections (default true)
--sort sort items (default true)
--sort-by-required sort items by name and print required ones first (default false)
--sort-by-type sort items by type of them (default false)
@@ -29,4 +32,4 @@ 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
###### Auto generated by spf13/cobra on 20-May-2020
###### Auto generated by spf13/cobra on 24-May-2020

View File

@@ -21,8 +21,11 @@ terraform-docs toml [PATH] [flags]
```
--header-from string relative path of a file to read header from (default "main.tf")
--hide strings hide section [header, inputs, outputs, providers, requirements]
--hide-all hide all sections (default false)
--output-values inject output values into outputs (default false)
--output-values-from string inject output values from file into outputs (default "")
--show strings show section [header, inputs, outputs, providers, requirements]
--show-all show all sections (default true)
--sort sort items (default true)
--sort-by-required sort items by name and print required ones first (default false)
--sort-by-type sort items by type of them (default false)
@@ -312,4 +315,4 @@ generates the following output:
###### Auto generated by spf13/cobra on 20-May-2020
###### Auto generated by spf13/cobra on 24-May-2020

View File

@@ -21,8 +21,11 @@ terraform-docs xml [PATH] [flags]
```
--header-from string relative path of a file to read header from (default "main.tf")
--hide strings hide section [header, inputs, outputs, providers, requirements]
--hide-all hide all sections (default false)
--output-values inject output values into outputs (default false)
--output-values-from string inject output values from file into outputs (default "")
--show strings show section [header, inputs, outputs, providers, requirements]
--show-all show all sections (default true)
--sort sort items (default true)
--sort-by-required sort items by name and print required ones first (default false)
--sort-by-type sort items by type of them (default false)
@@ -334,4 +337,4 @@ generates the following output:
</module>
###### Auto generated by spf13/cobra on 20-May-2020
###### Auto generated by spf13/cobra on 24-May-2020

View File

@@ -21,8 +21,11 @@ terraform-docs yaml [PATH] [flags]
```
--header-from string relative path of a file to read header from (default "main.tf")
--hide strings hide section [header, inputs, outputs, providers, requirements]
--hide-all hide all sections (default false)
--output-values inject output values into outputs (default false)
--output-values-from string inject output values from file into outputs (default "")
--show strings show section [header, inputs, outputs, providers, requirements]
--show-all show all sections (default true)
--sort sort items (default true)
--sort-by-required sort items by name and print required ones first (default false)
--sort-by-type sort items by type of them (default false)
@@ -286,4 +289,4 @@ generates the following output:
version: '>= 2.2.0'
###### Auto generated by spf13/cobra on 20-May-2020
###### Auto generated by spf13/cobra on 24-May-2020

View File

@@ -4,14 +4,26 @@ import (
"fmt"
"strings"
"github.com/spf13/pflag"
"github.com/segmentio/terraform-docs/internal/module"
"github.com/segmentio/terraform-docs/pkg/print"
)
// list of flagset items which explicitly changed from CLI
var changedfs = make(map[string]bool)
type _sections struct {
NoHeader bool
NoInputs bool
NoOutputs bool
NoProviders bool
NoRequirements bool
}
type sections struct {
Hide []string
Show []string
Hide []string
ShowAll bool
HideAll bool
Deprecated *_sections
header bool
inputs bool
@@ -20,40 +32,101 @@ type sections struct {
requirements bool
}
func (s *sections) contains(section string) bool {
for _, item := range s.Hide {
if item == section {
return true
}
func defaultSections() *sections {
return &sections{
Show: []string{},
Hide: []string{},
ShowAll: true,
HideAll: false,
Deprecated: &_sections{
NoHeader: false,
NoInputs: false,
NoOutputs: false,
NoProviders: false,
NoRequirements: false,
},
header: false,
inputs: false,
outputs: false,
providers: false,
requirements: false,
}
return false
}
func (s *sections) validate(fs *pflag.FlagSet) error {
sections := []string{"header", "inputs", "outputs", "providers", "requirements"}
for _, h := range s.Hide {
switch h {
case sections[0], sections[1], sections[2], sections[3], sections[4]:
func (s *sections) validate() error {
items := []string{"header", "inputs", "outputs", "providers", "requirements"}
for _, item := range s.Show {
switch item {
case items[0], items[1], items[2], items[3], items[4]:
default:
return fmt.Errorf("'%s' is not a valid section", h)
return fmt.Errorf("'%s' is not a valid section", item)
}
}
for _, section := range sections {
if fs.Changed("no-"+section) && s.contains(section) {
return fmt.Errorf("'--no-%s' and '--hide %s' cannot be used together", section, section)
for _, item := range s.Hide {
switch item {
case items[0], items[1], items[2], items[3], items[4]:
default:
return fmt.Errorf("'%s' is not a valid section", item)
}
}
if s.ShowAll && s.HideAll {
return fmt.Errorf("'--show-all' and '--hide-all' can't be used together")
}
if s.ShowAll && len(s.Show) != 0 {
return fmt.Errorf("'--show-all' and '--show' can't be used together")
}
if s.HideAll && len(s.Hide) != 0 {
return fmt.Errorf("'--hide-all' and '--hide' can't be used together")
}
for _, section := range items {
if changedfs["no-"+section] && contains(s.Hide, section) {
return fmt.Errorf("'--no-%s' and '--hide %s' can't be used together", section, section)
}
}
return nil
}
func (s *sections) visibility(section string) bool {
if s.ShowAll && !s.HideAll {
for _, n := range s.Hide {
if n == section {
return false
}
}
return true
}
for _, n := range s.Show {
if n == section {
return true
}
}
for _, n := range s.Hide {
if n == section {
return false
}
}
return false
}
type outputvalues struct {
Enabled bool
From string
}
func defaultOutputValues() *outputvalues {
return &outputvalues{
Enabled: false,
From: "",
}
}
func (o *outputvalues) validate() error {
if o.Enabled && o.From == "" {
return fmt.Errorf("value of '--output-values-from' cannot be empty")
if changedfs["output-values-from"] {
return fmt.Errorf("value of '--output-values-from' can't be empty")
}
return fmt.Errorf("value of '--output-values-from' is missing")
}
return nil
}
@@ -62,37 +135,77 @@ type sortby struct {
Required bool
Type bool
}
type _sort struct {
NoSort bool
}
type sort struct {
Enabled bool
By *sortby
Enabled bool
By *sortby
Deprecated *_sort
}
func (s *sort) validate(fs *pflag.FlagSet) error {
func defaultSort() *sort {
return &sort{
Enabled: true,
By: &sortby{
Required: false,
Type: false,
},
Deprecated: &_sort{
NoSort: false,
},
}
}
func (s *sort) validate() error {
items := []string{"sort"}
for _, item := range items {
if fs.Changed("no-"+item) && fs.Changed(item) {
return fmt.Errorf("'--no-%s' and '--%s' cannot be used together", item, item)
if changedfs[item] && changedfs["no-"+item] {
return fmt.Errorf("'--%s' and '--no-%s' can't be used together", item, item)
}
}
if fs.Changed("sort-by-required") && fs.Changed("sort-by-type") {
return fmt.Errorf("'--sort-by-required' and '--sort-by-type' cannot be used together")
if s.By.Required && s.By.Type {
return fmt.Errorf("'--sort-by-required' and '--sort-by-type' can't be used together")
}
return nil
}
type _settings struct {
NoColor bool
NoEscape bool
NoRequired bool
NoSensitive bool
}
type settings struct {
Color bool
Escape bool
Indent int
Required bool
Sensitive bool
Color bool
Escape bool
Indent int
Required bool
Sensitive bool
Deprecated *_settings
}
func (s *settings) validate(fs *pflag.FlagSet) error {
func defaultSettings() *settings {
return &settings{
Color: true,
Escape: true,
Indent: 2,
Required: true,
Sensitive: true,
Deprecated: &_settings{
NoColor: false,
NoEscape: false,
NoRequired: false,
NoSensitive: false,
},
}
}
func (s *settings) validate() error {
items := []string{"escape", "color", "required", "sensitive"}
for _, item := range items {
if fs.Changed("no-"+item) && fs.Changed(item) {
return fmt.Errorf("'--no-%s' and '--%s' cannot be used together", item, item)
if changedfs[item] && changedfs["no-"+item] {
return fmt.Errorf("'--%s' and '--no-%s' can't be used together", item, item)
}
}
return nil
@@ -111,40 +224,84 @@ type Config struct {
// DefaultConfig returns new instance of Config with default values set
func DefaultConfig() *Config {
return &Config{
Formatter: "",
HeaderFrom: "main.tf",
Sections: &sections{
Hide: []string{},
header: true,
inputs: true,
outputs: true,
providers: true,
requirements: true,
},
OutputValues: &outputvalues{
Enabled: false,
From: "",
},
Sort: &sort{
Enabled: true,
By: &sortby{
Required: false,
Type: false,
},
},
Settings: &settings{
Color: true,
Escape: true,
Indent: 2,
Required: false,
Sensitive: false,
},
Formatter: "",
HeaderFrom: "main.tf",
Sections: defaultSections(),
OutputValues: defaultOutputValues(),
Sort: defaultSort(),
Settings: defaultSettings(),
}
}
// normalize provided Config
func (c *Config) normalize(command string) {
c.Formatter = strings.Replace(command, "terraform-docs ", "", -1)
// sections
if c.Sections.HideAll && !changedfs["show-all"] {
c.Sections.ShowAll = false
}
if !c.Sections.ShowAll && !changedfs["hide-all"] {
c.Sections.HideAll = true
}
c.Sections.header = c.Sections.visibility("header")
c.Sections.inputs = c.Sections.visibility("inputs")
c.Sections.outputs = c.Sections.visibility("outputs")
c.Sections.providers = c.Sections.visibility("providers")
c.Sections.requirements = c.Sections.visibility("requirements")
// sort
if !changedfs["sort"] {
c.Sort.Enabled = !c.Sort.Deprecated.NoSort
}
// settings
if !changedfs["escape"] {
c.Settings.Escape = !c.Settings.Deprecated.NoEscape
}
if !changedfs["color"] {
c.Settings.Color = !c.Settings.Deprecated.NoColor
}
if !changedfs["required"] {
c.Settings.Required = !c.Settings.Deprecated.NoRequired
}
if !changedfs["sensitive"] {
c.Settings.Sensitive = !c.Settings.Deprecated.NoSensitive
}
}
// validate config and check for any misuse or misconfiguration
func (c *Config) validate() error {
// header-from
if c.HeaderFrom == "" {
return fmt.Errorf("value of '--header-from' can't be empty")
}
// sections
if err := c.Sections.validate(); err != nil {
return err
}
// output values
if err := c.OutputValues.validate(); err != nil {
return err
}
// sort
if err := c.Sort.validate(); err != nil {
return err
}
// settings
if err := c.Settings.validate(); err != nil {
return err
}
return nil
}
// extract and build print.Settings and module.Options out of Config
func (c *Config) extract() (*print.Settings, *module.Options, error) {
func (c *Config) extract() (*print.Settings, *module.Options) {
settings := print.NewSettings()
options := module.NewOptions()
@@ -179,57 +336,14 @@ func (c *Config) extract() (*print.Settings, *module.Options, error) {
settings.ShowRequired = c.Settings.Required
settings.ShowSensitivity = c.Settings.Sensitive
return settings, options, nil
return settings, options
}
// normalize provided Config and check for any misuse or misconfiguration
func normalize(command string, fs *pflag.FlagSet, config *Config) error {
config.Formatter = strings.Replace(command, "terraform-docs ", "", -1)
// header-from
if fs.Changed("header-from") && config.HeaderFrom == "" {
return fmt.Errorf("value of '--header-from' cannot be empty")
func contains(list []string, name string) bool {
for _, i := range list {
if i == name {
return true
}
}
// sections
if err := config.Sections.validate(fs); err != nil {
return err
}
config.Sections.header = !(config.Sections.contains("header") || fs.Changed("no-header"))
config.Sections.inputs = !(config.Sections.contains("inputs") || fs.Changed("no-inputs"))
config.Sections.outputs = !(config.Sections.contains("outputs") || fs.Changed("no-outputs"))
config.Sections.providers = !(config.Sections.contains("providers") || fs.Changed("no-providers"))
config.Sections.requirements = !(config.Sections.contains("requirements") || fs.Changed("no-requirements"))
// output values
if err := config.OutputValues.validate(); err != nil {
return err
}
// sort
if err := config.Sort.validate(fs); err != nil {
return err
}
if !fs.Changed("sort") {
config.Sort.Enabled = !fs.Changed("no-sort")
}
// settings
if err := config.Settings.validate(fs); err != nil {
return err
}
if !fs.Changed("escape") {
config.Settings.Escape = !fs.Changed("no-escape")
}
if !fs.Changed("color") {
config.Settings.Color = !fs.Changed("no-color")
}
if !fs.Changed("required") {
config.Settings.Required = !fs.Changed("no-required")
}
if !fs.Changed("sensitive") {
config.Settings.Sensitive = !fs.Changed("no-sensitive")
}
return nil
return false
}

View File

@@ -4,6 +4,7 @@ import (
"fmt"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
"github.com/segmentio/terraform-docs/internal/format"
"github.com/segmentio/terraform-docs/internal/module"
@@ -14,7 +15,17 @@ import (
// flags and arguments passed through CLI execution.
func PreRunEFunc(config *Config) func(*cobra.Command, []string) error {
return func(cmd *cobra.Command, args []string) error {
return normalize(cmd.CommandPath(), cmd.Flags(), config)
cmd.Flags().VisitAll(func(f *pflag.Flag) {
changedfs[f.Name] = f.Changed
})
config.normalize(cmd.CommandPath())
if err := config.validate(); err != nil {
return err
}
return nil
}
}
@@ -24,24 +35,28 @@ func PreRunEFunc(config *Config) func(*cobra.Command, []string) error {
// initializes required print.Format instance and executes it.
func RunEFunc(config *Config) func(*cobra.Command, []string) error {
return func(cmd *cobra.Command, args []string) error {
settings, options, err := config.extract()
if err != nil {
return err
}
settings, options := config.extract()
printer, err := format.Factory(config.Formatter, settings)
if err != nil {
return err
}
options.Path = args[0]
tfmodule, err := module.LoadWithOptions(options)
if err != nil {
return err
}
output, err := printer.Print(tfmodule, settings)
if err != nil {
return err
}
fmt.Println(output)
return nil
}
}