Skip to content

Commit 50247ef

Browse files
jacobbednarzdetro
authored andcommitted
generate: move configuration to flags
This updates all the directory and provider configuration that was previously hardcoded to now be controlled by flags. Closes #92
1 parent 659d0ef commit 50247ef

File tree

2 files changed

+72
-42
lines changed

2 files changed

+72
-42
lines changed

internal/cmd/generate.go

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,15 @@ type generateCmd struct {
1111
commonCmd
1212

1313
flagLegacySidebar bool
14-
tfVersion string
14+
15+
flagProviderName string
16+
flagRenderedProviderName string
17+
18+
flagRenderedWebsiteDir string
19+
flagExamplesDir string
20+
flagWebsiteTmpDir string
21+
flagWebsiteSourceDir string
22+
tfVersion string
1523
}
1624

1725
func (cmd *generateCmd) Synopsis() string {
@@ -25,6 +33,12 @@ func (cmd *generateCmd) Help() string {
2533
func (cmd *generateCmd) Flags() *flag.FlagSet {
2634
fs := flag.NewFlagSet("generate", flag.ExitOnError)
2735
fs.BoolVar(&cmd.flagLegacySidebar, "legacy-sidebar", false, "generate the legacy .erb sidebar file")
36+
fs.StringVar(&cmd.flagProviderName, "provider-name", "", "provider name used for looking up the schema")
37+
fs.StringVar(&cmd.flagRenderedProviderName, "rendered-provider-name", "", "provider name used in generated outputs such as page titles")
38+
fs.StringVar(&cmd.flagRenderedWebsiteDir, "rendered-website-dir", "docs", "directory where the rendered website documentation is generated to")
39+
fs.StringVar(&cmd.flagExamplesDir, "examples-dir", "examples", "directory of examples used in rendered documentation")
40+
fs.StringVar(&cmd.flagWebsiteTmpDir, "website-temp-dir", "", "")
41+
fs.StringVar(&cmd.flagWebsiteSourceDir, "website-source-dir", "templates", "directory of templates that are used for generating the static output")
2842
fs.StringVar(&cmd.tfVersion, "tf-version", "", "terraform binary version to download")
2943
return fs
3044
}
@@ -41,7 +55,17 @@ func (cmd *generateCmd) Run(args []string) int {
4155
}
4256

4357
func (cmd *generateCmd) runInternal() error {
44-
err := provider.Generate(cmd.ui, cmd.flagLegacySidebar, cmd.tfVersion)
58+
err := provider.Generate(
59+
cmd.ui,
60+
cmd.flagLegacySidebar,
61+
cmd.flagProviderName,
62+
cmd.flagRenderedProviderName,
63+
cmd.flagRenderedWebsiteDir,
64+
cmd.flagExamplesDir,
65+
cmd.flagWebsiteTmpDir,
66+
cmd.flagWebsiteSourceDir,
67+
cmd.tfVersion,
68+
)
4569
if err != nil {
4670
return fmt.Errorf("unable to generate website: %w", err)
4771
}

internal/provider/generate.go

Lines changed: 46 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -22,25 +22,12 @@ import (
2222
"github.com/mitchellh/cli"
2323
)
2424

25-
// TODO: convert these to flags?
2625
var (
27-
providerName string
28-
29-
// rendered website dir
30-
renderedWebsiteDir = "docs"
31-
32-
// examples directory defaults
33-
examplesDir = "examples"
34-
// relative to examples dir
3526
examplesResourceFileTemplate = resourceFileTemplate("resources/{{.Name}}/resource.tf")
3627
examplesResourceImportTemplate = resourceFileTemplate("resources/{{.Name}}/import.sh")
3728
examplesDataSourceFileTemplate = resourceFileTemplate("data-sources/{{ .Name }}/data-source.tf")
3829
examplesProviderFileTemplate = providerFileTemplate("provider/provider.tf")
3930

40-
// templated website directory defaults
41-
websiteTmp = ""
42-
43-
websiteSourceDir = "templates" // used for override content
4431
websiteResourceFileTemplate = resourceFileTemplate("resources/{{ .ShortName }}.md.tmpl")
4532
websiteResourceFallbackFileTemplate = resourceFileTemplate("resources.md.tmpl")
4633
websiteResourceFileStatic = []resourceFileTemplate{
@@ -80,6 +67,13 @@ type generator struct {
8067
legacySidebar bool
8168
tfVersion string
8269

70+
providerName string
71+
renderedProviderName string
72+
renderedWebsiteDir string
73+
examplesDir string
74+
websiteTmpDir string
75+
websiteSourceDir string
76+
8377
ui cli.Ui
8478
}
8579

@@ -91,11 +85,18 @@ func (g *generator) warnf(format string, a ...interface{}) {
9185
g.ui.Warn(fmt.Sprintf(format, a...))
9286
}
9387

94-
func Generate(ui cli.Ui, legacySidebar bool, tfVersion string) error {
88+
func Generate(ui cli.Ui, legacySidebar bool, providerName, renderedProviderName, renderedWebsiteDir, examplesDir, websiteTmpDir, websiteSourceDir, tfVersion string) error {
9589
g := &generator{
9690
legacySidebar: legacySidebar,
9791
tfVersion: tfVersion,
9892

93+
providerName: providerName,
94+
renderedProviderName: renderedProviderName,
95+
renderedWebsiteDir: renderedWebsiteDir,
96+
examplesDir: examplesDir,
97+
websiteTmpDir: websiteTmpDir,
98+
websiteSourceDir: websiteSourceDir,
99+
99100
ui: ui,
100101
}
101102

@@ -112,46 +113,51 @@ func (g *generator) Generate(ctx context.Context) error {
112113
return err
113114
}
114115

115-
if providerName == "" {
116+
providerName := g.providerName
117+
if g.providerName == "" {
116118
providerName = filepath.Base(wd)
117119
}
118120

119-
g.infof("rendering website for provider %q", providerName)
121+
if g.renderedProviderName == "" {
122+
g.renderedProviderName = providerName
123+
}
124+
125+
g.infof("rendering website for provider %q (as %q)", providerName, g.renderedProviderName)
120126

121127
switch {
122-
case websiteTmp == "":
123-
websiteTmp, err = ioutil.TempDir("", "tfws")
128+
case g.websiteTmpDir == "":
129+
g.websiteTmpDir, err = ioutil.TempDir("", "tfws")
124130
if err != nil {
125131
return err
126132
}
127-
defer os.RemoveAll(websiteTmp)
133+
defer os.RemoveAll(g.websiteTmpDir)
128134
default:
129-
g.infof("cleaning tmp dir %q", websiteTmp)
130-
err = os.RemoveAll(websiteTmp)
135+
g.infof("cleaning tmp dir %q", g.websiteTmpDir)
136+
err = os.RemoveAll(g.websiteTmpDir)
131137
if err != nil {
132138
return err
133139
}
134140

135-
g.infof("creating tmp dir %q", websiteTmp)
136-
err = os.MkdirAll(websiteTmp, 0755)
141+
g.infof("creating tmp dir %q", g.websiteTmpDir)
142+
err = os.MkdirAll(g.websiteTmpDir, 0755)
137143
if err != nil {
138144
return err
139145
}
140146
}
141147

142-
websiteSourceDirInfo, err := os.Stat(websiteSourceDir)
148+
websiteSourceDirInfo, err := os.Stat(g.websiteSourceDir)
143149
switch {
144150
case os.IsNotExist(err):
145151
// do nothing, no template dir
146152
case err != nil:
147153
return err
148154
default:
149155
if !websiteSourceDirInfo.IsDir() {
150-
return fmt.Errorf("template path is not a directory: %s", websiteSourceDir)
156+
return fmt.Errorf("template path is not a directory: %s", g.websiteSourceDir)
151157
}
152158

153159
g.infof("copying any existing content to tmp dir")
154-
err = cp(websiteSourceDir, filepath.Join(websiteTmp, "templates"))
160+
err = cp(g.websiteSourceDir, filepath.Join(g.websiteTmpDir, "templates"))
155161
if err != nil {
156162
return err
157163
}
@@ -164,13 +170,13 @@ func (g *generator) Generate(ctx context.Context) error {
164170
}
165171

166172
g.infof("rendering missing docs")
167-
err = g.renderMissingDocs(providerName, providerSchema)
173+
err = g.renderMissingDocs(g.renderedProviderName, providerSchema)
168174
if err != nil {
169175
return err
170176
}
171177

172178
g.infof("rendering static website")
173-
err = g.renderStaticWebsite(providerName, providerSchema)
179+
err = g.renderStaticWebsite(g.renderedProviderName, providerSchema)
174180
if err != nil {
175181
return err
176182
}
@@ -189,7 +195,7 @@ func (g *generator) renderMissingResourceDoc(providerName, name, typeName string
189195
if err != nil {
190196
return fmt.Errorf("unable to render path for resource %q: %w", name, err)
191197
}
192-
tmplPath = filepath.Join(websiteTmp, websiteSourceDir, tmplPath)
198+
tmplPath = filepath.Join(g.websiteTmpDir, g.websiteSourceDir, tmplPath)
193199
if fileExists(tmplPath) {
194200
g.infof("resource %q template exists, skipping", name)
195201
return nil
@@ -200,7 +206,7 @@ func (g *generator) renderMissingResourceDoc(providerName, name, typeName string
200206
if err != nil {
201207
return fmt.Errorf("unable to render path for resource %q: %w", name, err)
202208
}
203-
candidatePath = filepath.Join(websiteTmp, websiteSourceDir, candidatePath)
209+
candidatePath = filepath.Join(g.websiteTmpDir, g.websiteSourceDir, candidatePath)
204210
if fileExists(candidatePath) {
205211
g.infof("resource %q static file exists, skipping", name)
206212
return nil
@@ -212,7 +218,7 @@ func (g *generator) renderMissingResourceDoc(providerName, name, typeName string
212218
return fmt.Errorf("unable to render example file path for %q: %w", name, err)
213219
}
214220
if examplePath != "" {
215-
examplePath = filepath.Join(examplesDir, examplePath)
221+
examplePath = filepath.Join(g.examplesDir, examplePath)
216222
}
217223
if !fileExists(examplePath) {
218224
examplePath = ""
@@ -225,7 +231,7 @@ func (g *generator) renderMissingResourceDoc(providerName, name, typeName string
225231
return fmt.Errorf("unable to render example import file path for %q: %w", name, err)
226232
}
227233
if importPath != "" {
228-
importPath = filepath.Join(examplesDir, importPath)
234+
importPath = filepath.Join(g.examplesDir, importPath)
229235
}
230236
if !fileExists(importPath) {
231237
importPath = ""
@@ -238,7 +244,7 @@ func (g *generator) renderMissingResourceDoc(providerName, name, typeName string
238244
if err != nil {
239245
return fmt.Errorf("unable to render path for resource %q: %w", name, err)
240246
}
241-
fallbackTmplPath = filepath.Join(websiteTmp, websiteSourceDir, fallbackTmplPath)
247+
fallbackTmplPath = filepath.Join(g.websiteTmpDir, g.websiteSourceDir, fallbackTmplPath)
242248
if fileExists(fallbackTmplPath) {
243249
g.infof("resource %q fallback template exists", name)
244250
tmplData, err := ioutil.ReadFile(fallbackTmplPath)
@@ -267,7 +273,7 @@ func (g *generator) renderMissingProviderDoc(providerName string, schema *tfjson
267273
if err != nil {
268274
return fmt.Errorf("unable to render path for provider %q: %w", providerName, err)
269275
}
270-
tmplPath = filepath.Join(websiteTmp, websiteSourceDir, tmplPath)
276+
tmplPath = filepath.Join(g.websiteTmpDir, g.websiteSourceDir, tmplPath)
271277
if fileExists(tmplPath) {
272278
g.infof("provider %q template exists, skipping", providerName)
273279
return nil
@@ -278,7 +284,7 @@ func (g *generator) renderMissingProviderDoc(providerName string, schema *tfjson
278284
if err != nil {
279285
return fmt.Errorf("unable to render path for provider %q: %w", providerName, err)
280286
}
281-
candidatePath = filepath.Join(websiteTmp, websiteSourceDir, candidatePath)
287+
candidatePath = filepath.Join(g.websiteTmpDir, g.websiteSourceDir, candidatePath)
282288
if fileExists(candidatePath) {
283289
g.infof("provider %q static file exists, skipping", providerName)
284290
return nil
@@ -290,7 +296,7 @@ func (g *generator) renderMissingProviderDoc(providerName string, schema *tfjson
290296
return fmt.Errorf("unable to render example file path for %q: %w", providerName, err)
291297
}
292298
if examplePath != "" {
293-
examplePath = filepath.Join(examplesDir, examplePath)
299+
examplePath = filepath.Join(g.examplesDir, examplePath)
294300
}
295301
if !fileExists(examplePath) {
296302
examplePath = ""
@@ -352,7 +358,7 @@ func (g *generator) renderMissingDocs(providerName string, providerSchema *tfjso
352358

353359
func (g *generator) renderStaticWebsite(providerName string, providerSchema *tfjson.ProviderSchema) error {
354360
g.infof("cleaning rendered website dir")
355-
err := os.RemoveAll(renderedWebsiteDir)
361+
err := os.RemoveAll(g.renderedWebsiteDir)
356362
if err != nil {
357363
return err
358364
}
@@ -361,13 +367,13 @@ func (g *generator) renderStaticWebsite(providerName string, providerSchema *tfj
361367

362368
g.infof("rendering templated website to static markdown")
363369

364-
err = filepath.Walk(websiteTmp, func(path string, info os.FileInfo, err error) error {
370+
err = filepath.Walk(g.websiteTmpDir, func(path string, info os.FileInfo, err error) error {
365371
if info.IsDir() {
366372
// skip directories
367373
return nil
368374
}
369375

370-
rel, err := filepath.Rel(filepath.Join(websiteTmp, websiteSourceDir), path)
376+
rel, err := filepath.Rel(filepath.Join(g.websiteTmpDir, g.websiteSourceDir), path)
371377
if err != nil {
372378
return err
373379
}
@@ -380,7 +386,7 @@ func (g *generator) renderStaticWebsite(providerName string, providerSchema *tfj
380386
return nil
381387
}
382388

383-
renderedPath := filepath.Join(renderedWebsiteDir, rel)
389+
renderedPath := filepath.Join(g.renderedWebsiteDir, rel)
384390
err = os.MkdirAll(filepath.Dir(renderedPath), 0755)
385391
if err != nil {
386392
return err

0 commit comments

Comments
 (0)