Skip to content

Commit b7abf70

Browse files
nayyara-cropseypaultyng
authored andcommitted
Add ability to specify generic resources and data source templates
Fixes #30
1 parent b32ed6a commit b7abf70

File tree

2 files changed

+47
-20
lines changed

2 files changed

+47
-20
lines changed

README.md

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,18 @@ You can see an example of the templates and output in [paultyng/terraform-provid
2525

2626
The generation of missing documentation is based on a number of assumptions / conventional paths:
2727

28-
| Path | Description |
29-
|-----------------------------------------------------------|---------------------------------|
30-
| `templates/` | Root of templated docs |
31-
| `templates/index.md[.tmpl]` | Docs index page (or template) |
32-
| `examples/provider/provider.tf` | Provider example config* |
33-
| `templates/data-sources/<data source name>.md[.tmpl]` | Data source page (or template) |
34-
| `examples/data-sources/<data source name>/data-source.tf` | Data source example config* |
35-
| `templates/resources/<resource name>.md[.tmpl]` | Resource page (or template) |
36-
| `examples/resources/<resource name>/resource.tf` | Resource example config* |
37-
| `examples/resources/<resource name>/import.sh` | Resource example import command |
28+
| Path | Description |
29+
|-----------------------------------------------------------|----------------------------------------|
30+
| `templates/` | Root of templated docs |
31+
| `templates/index.md[.tmpl]` | Docs index page (or template) |
32+
| `examples/provider/provider.tf` | Provider example config* |
33+
| `templates/data-sources.md[.tmpl]` | Generic data source page (or template) |
34+
| `templates/data-sources/<data source name>.md[.tmpl]` | Data source page (or template) |
35+
| `examples/data-sources/<data source name>/data-source.tf` | Data source example config* |
36+
| `templates/resources.md[.tmpl]` | Generic resource page (or template) |
37+
| `templates/resources/<resource name>.md[.tmpl]` | Resource page (or template) |
38+
| `examples/resources/<resource name>/resource.tf` | Resource example config* |
39+
| `examples/resources/<resource name>/import.sh` | Resource example import command |
3840

3941
### Templates
4042

internal/provider/generate.go

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,10 @@ var (
3434
// templated website directory defaults
3535
websiteTmp = ""
3636

37-
websiteSourceDir = "templates" // used for override content
38-
websiteResourceFileTemplate = resourceFileTemplate("resources/{{ .ShortName }}.md.tmpl")
39-
websiteResourceFileStatic = []resourceFileTemplate{
37+
websiteSourceDir = "templates" // used for override content
38+
websiteResourceFileTemplate = resourceFileTemplate("resources/{{ .ShortName }}.md.tmpl")
39+
websiteResourceFallbackFileTemplate = resourceFileTemplate("resources.md.tmpl")
40+
websiteResourceFileStatic = []resourceFileTemplate{
4041
resourceFileTemplate("resources/{{ .ShortName }}.md"),
4142
// TODO: warn for all of these, as they won't render? massage them to the proper output file name?
4243
resourceFileTemplate("resources/{{ .ShortName }}.markdown"),
@@ -47,8 +48,9 @@ var (
4748
resourceFileTemplate("r/{{ .ShortName }}.html.markdown"),
4849
resourceFileTemplate("r/{{ .ShortName }}.html.md"),
4950
}
50-
websiteDataSourceFileTemplate = resourceFileTemplate("data-sources/{{ .ShortName }}.md.tmpl")
51-
websiteDataSourceFileStatic = []resourceFileTemplate{
51+
websiteDataSourceFileTemplate = resourceFileTemplate("data-sources/{{ .ShortName }}.md.tmpl")
52+
websiteDataSourceFallbackFileTemplate = resourceFileTemplate("data-sources.md.tmpl")
53+
websiteDataSourceFileStatic = []resourceFileTemplate{
5254
resourceFileTemplate("data-sources/{{ .ShortName }}.md"),
5355
// TODO: warn for all of these, as they won't render? massage them to the proper output file name?
5456
resourceFileTemplate("data-sources/{{ .ShortName }}.markdown"),
@@ -172,7 +174,7 @@ func (g *generator) Generate(ctx context.Context) error {
172174
return nil
173175
}
174176

175-
func (g *generator) renderMissingResourceDoc(providerName, name, typeName string, schema *tfjson.Schema, websiteFileTemplate resourceFileTemplate, websiteStaticCandidateTemplates []resourceFileTemplate, examplesFileTemplate resourceFileTemplate, examplesImportTemplate *resourceFileTemplate) error {
177+
func (g *generator) renderMissingResourceDoc(providerName, name, typeName string, schema *tfjson.Schema, websiteFileTemplate resourceFileTemplate, fallbackWebsiteFileTemplate resourceFileTemplate, websiteStaticCandidateTemplates []resourceFileTemplate, examplesFileTemplate resourceFileTemplate, examplesImportTemplate *resourceFileTemplate) error {
176178
tmplPath, err := websiteFileTemplate.Render(name, providerName)
177179
if err != nil {
178180
return fmt.Errorf("unable to render path for resource %q: %w", name, err)
@@ -220,8 +222,24 @@ func (g *generator) renderMissingResourceDoc(providerName, name, typeName string
220222
}
221223
}
222224

225+
targetResourceTemplate := defaultResourceTemplate
226+
227+
fallbackTmplPath, err := fallbackWebsiteFileTemplate.Render(name, providerName)
228+
if err != nil {
229+
return fmt.Errorf("unable to render path for resource %q: %w", name, err)
230+
}
231+
fallbackTmplPath = filepath.Join(websiteTmp, websiteSourceDir, fallbackTmplPath)
232+
if fileExists(fallbackTmplPath) {
233+
g.infof("resource %q fallback template exists", name)
234+
tmplData, err := ioutil.ReadFile(fallbackTmplPath)
235+
if err != nil {
236+
return fmt.Errorf("unable to read file %q: %w", fallbackTmplPath, err)
237+
}
238+
targetResourceTemplate = resourceTemplate(tmplData)
239+
}
240+
223241
g.infof("generating template for %q", name)
224-
md, err := defaultResourceTemplate.Render(name, providerName, typeName, examplePath, importPath, schema)
242+
md, err := targetResourceTemplate.Render(name, providerName, typeName, examplePath, importPath, schema)
225243
if err != nil {
226244
return fmt.Errorf("unable to render template for %q: %w", name, err)
227245
}
@@ -287,6 +305,7 @@ func (g *generator) renderMissingDocs(providerName string, providerSchema *tfjso
287305
for name, schema := range providerSchema.ResourceSchemas {
288306
err := g.renderMissingResourceDoc(providerName, name, "Resource", schema,
289307
websiteResourceFileTemplate,
308+
websiteResourceFallbackFileTemplate,
290309
websiteResourceFileStatic,
291310
examplesResourceFileTemplate,
292311
&examplesResourceImportTemplate)
@@ -299,6 +318,7 @@ func (g *generator) renderMissingDocs(providerName string, providerSchema *tfjso
299318
for name, schema := range providerSchema.DataSourceSchemas {
300319
err := g.renderMissingResourceDoc(providerName, name, "Data Source", schema,
301320
websiteDataSourceFileTemplate,
321+
websiteDataSourceFallbackFileTemplate,
302322
websiteDataSourceFileStatic,
303323
examplesDataSourceFileTemplate,
304324
nil)
@@ -342,6 +362,14 @@ func (g *generator) renderStaticWebsite(providerName string, providerSchema *tfj
342362
return err
343363
}
344364

365+
relDir, relFile := filepath.Split(rel)
366+
relDir = filepath.ToSlash(relDir)
367+
368+
// skip special top-level generic resource and data source templates
369+
if relDir == "" && (relFile == "resources.md.tmpl" || relFile == "data-sources.md.tmpl") {
370+
return nil
371+
}
372+
345373
renderedPath := filepath.Join(renderedWebsiteDir, rel)
346374
err = os.MkdirAll(filepath.Dir(renderedPath), 0755)
347375
if err != nil {
@@ -368,9 +396,6 @@ func (g *generator) renderStaticWebsite(providerName string, providerSchema *tfj
368396
defer out.Close()
369397

370398
g.infof("rendering %q", rel)
371-
372-
relDir, relFile := filepath.Split(rel)
373-
relDir = filepath.ToSlash(relDir)
374399
switch relDir {
375400
case "data-sources/":
376401
resName := shortName + "_" + removeAllExt(relFile)

0 commit comments

Comments
 (0)