Skip to content

Commit

Permalink
Add ability to specify generic resources and data source templates
Browse files Browse the repository at this point in the history
Fixes #30
  • Loading branch information
nayyara-cropsey authored and paultyng committed Feb 1, 2021
1 parent b32ed6a commit b7abf70
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 20 deletions.
22 changes: 12 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,16 +25,18 @@ You can see an example of the templates and output in [paultyng/terraform-provid

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

| Path | Description |
|-----------------------------------------------------------|---------------------------------|
| `templates/` | Root of templated docs |
| `templates/index.md[.tmpl]` | Docs index page (or template) |
| `examples/provider/provider.tf` | Provider example config* |
| `templates/data-sources/<data source name>.md[.tmpl]` | Data source page (or template) |
| `examples/data-sources/<data source name>/data-source.tf` | Data source example config* |
| `templates/resources/<resource name>.md[.tmpl]` | Resource page (or template) |
| `examples/resources/<resource name>/resource.tf` | Resource example config* |
| `examples/resources/<resource name>/import.sh` | Resource example import command |
| Path | Description |
|-----------------------------------------------------------|----------------------------------------|
| `templates/` | Root of templated docs |
| `templates/index.md[.tmpl]` | Docs index page (or template) |
| `examples/provider/provider.tf` | Provider example config* |
| `templates/data-sources.md[.tmpl]` | Generic data source page (or template) |
| `templates/data-sources/<data source name>.md[.tmpl]` | Data source page (or template) |
| `examples/data-sources/<data source name>/data-source.tf` | Data source example config* |
| `templates/resources.md[.tmpl]` | Generic resource page (or template) |
| `templates/resources/<resource name>.md[.tmpl]` | Resource page (or template) |
| `examples/resources/<resource name>/resource.tf` | Resource example config* |
| `examples/resources/<resource name>/import.sh` | Resource example import command |

### Templates

Expand Down
45 changes: 35 additions & 10 deletions internal/provider/generate.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,10 @@ var (
// templated website directory defaults
websiteTmp = ""

websiteSourceDir = "templates" // used for override content
websiteResourceFileTemplate = resourceFileTemplate("resources/{{ .ShortName }}.md.tmpl")
websiteResourceFileStatic = []resourceFileTemplate{
websiteSourceDir = "templates" // used for override content
websiteResourceFileTemplate = resourceFileTemplate("resources/{{ .ShortName }}.md.tmpl")
websiteResourceFallbackFileTemplate = resourceFileTemplate("resources.md.tmpl")
websiteResourceFileStatic = []resourceFileTemplate{
resourceFileTemplate("resources/{{ .ShortName }}.md"),
// TODO: warn for all of these, as they won't render? massage them to the proper output file name?
resourceFileTemplate("resources/{{ .ShortName }}.markdown"),
Expand All @@ -47,8 +48,9 @@ var (
resourceFileTemplate("r/{{ .ShortName }}.html.markdown"),
resourceFileTemplate("r/{{ .ShortName }}.html.md"),
}
websiteDataSourceFileTemplate = resourceFileTemplate("data-sources/{{ .ShortName }}.md.tmpl")
websiteDataSourceFileStatic = []resourceFileTemplate{
websiteDataSourceFileTemplate = resourceFileTemplate("data-sources/{{ .ShortName }}.md.tmpl")
websiteDataSourceFallbackFileTemplate = resourceFileTemplate("data-sources.md.tmpl")
websiteDataSourceFileStatic = []resourceFileTemplate{
resourceFileTemplate("data-sources/{{ .ShortName }}.md"),
// TODO: warn for all of these, as they won't render? massage them to the proper output file name?
resourceFileTemplate("data-sources/{{ .ShortName }}.markdown"),
Expand Down Expand Up @@ -172,7 +174,7 @@ func (g *generator) Generate(ctx context.Context) error {
return nil
}

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

targetResourceTemplate := defaultResourceTemplate

fallbackTmplPath, err := fallbackWebsiteFileTemplate.Render(name, providerName)
if err != nil {
return fmt.Errorf("unable to render path for resource %q: %w", name, err)
}
fallbackTmplPath = filepath.Join(websiteTmp, websiteSourceDir, fallbackTmplPath)
if fileExists(fallbackTmplPath) {
g.infof("resource %q fallback template exists", name)
tmplData, err := ioutil.ReadFile(fallbackTmplPath)
if err != nil {
return fmt.Errorf("unable to read file %q: %w", fallbackTmplPath, err)
}
targetResourceTemplate = resourceTemplate(tmplData)
}

g.infof("generating template for %q", name)
md, err := defaultResourceTemplate.Render(name, providerName, typeName, examplePath, importPath, schema)
md, err := targetResourceTemplate.Render(name, providerName, typeName, examplePath, importPath, schema)
if err != nil {
return fmt.Errorf("unable to render template for %q: %w", name, err)
}
Expand Down Expand Up @@ -287,6 +305,7 @@ func (g *generator) renderMissingDocs(providerName string, providerSchema *tfjso
for name, schema := range providerSchema.ResourceSchemas {
err := g.renderMissingResourceDoc(providerName, name, "Resource", schema,
websiteResourceFileTemplate,
websiteResourceFallbackFileTemplate,
websiteResourceFileStatic,
examplesResourceFileTemplate,
&examplesResourceImportTemplate)
Expand All @@ -299,6 +318,7 @@ func (g *generator) renderMissingDocs(providerName string, providerSchema *tfjso
for name, schema := range providerSchema.DataSourceSchemas {
err := g.renderMissingResourceDoc(providerName, name, "Data Source", schema,
websiteDataSourceFileTemplate,
websiteDataSourceFallbackFileTemplate,
websiteDataSourceFileStatic,
examplesDataSourceFileTemplate,
nil)
Expand Down Expand Up @@ -342,6 +362,14 @@ func (g *generator) renderStaticWebsite(providerName string, providerSchema *tfj
return err
}

relDir, relFile := filepath.Split(rel)
relDir = filepath.ToSlash(relDir)

// skip special top-level generic resource and data source templates
if relDir == "" && (relFile == "resources.md.tmpl" || relFile == "data-sources.md.tmpl") {
return nil
}

renderedPath := filepath.Join(renderedWebsiteDir, rel)
err = os.MkdirAll(filepath.Dir(renderedPath), 0755)
if err != nil {
Expand All @@ -368,9 +396,6 @@ func (g *generator) renderStaticWebsite(providerName string, providerSchema *tfj
defer out.Close()

g.infof("rendering %q", rel)

relDir, relFile := filepath.Split(rel)
relDir = filepath.ToSlash(relDir)
switch relDir {
case "data-sources/":
resName := shortName + "_" + removeAllExt(relFile)
Expand Down

0 comments on commit b7abf70

Please sign in to comment.