Skip to content

Commit 0367702

Browse files
authored
Generate: Use rendered provider name instead of provider name in default templates (#492)
* Update the default provider, resource, and function templates to use `.RenderedProviderName` instead of `.ProviderName` * Update Readme * Update Readme * Add changelog entries * Fix tests * Sort schema keys when generating missing templates to ensure deterministic stdout.
1 parent 8b2645d commit 0367702

File tree

7 files changed

+82
-34
lines changed

7 files changed

+82
-34
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
kind: BREAKING CHANGES
2+
body: 'generate: The `.ProviderShortName` template function now uses the rendered provider name to derive the provider short name. Users that pass in the
3+
`--rendered-provider-name` flag might see a different output for this function'
4+
time: 2025-06-13T13:51:04.745115-04:00
5+
custom:
6+
Issue: "492"
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
kind: ENHANCEMENTS
2+
body: 'generate: Default resource and function templates now use `.RenderedProviderName` instead of `.ProviderName`'
3+
time: 2025-06-13T13:48:14.705452-04:00
4+
custom:
5+
Issue: "492"

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ Usage: tfplugindocs generate [<args>]
6868
--provider-dir <ARG> relative or absolute path to the root provider code directory when running the command outside the root provider code directory
6969
--provider-name <ARG> provider name, as used in Terraform configurations; defaults to the --provider-dir short name (after removing `terraform-provider-` prefix)
7070
--providers-schema <ARG> path to the providers schema JSON file, which contains the output of the terraform providers schema -json command. Setting this flag will skip building the provider and calling Terraform CLI
71-
--rendered-provider-name <ARG> provider name, as generated in documentation (ex. page titles, ...)
71+
--rendered-provider-name <ARG> provider name, as generated in documentation (ex. page titles, ...); defaults to the --provider-name
7272
--rendered-website-dir <ARG> output directory based on provider-dir (default: "docs")
7373
--tf-version <ARG> terraform binary version to download. If not provided, will look for a terraform binary in the local environment. If not found in the environment, will download the latest version of Terraform
7474
--website-source-dir <ARG> templates directory based on provider-dir (default: "templates")
@@ -286,7 +286,7 @@ using the following data fields and functions:
286286
| `.HasExample` | bool | Is there an example file? |
287287
| `.ExampleFile` | string | Path to the file with the terraform configuration example |
288288
| `.ProviderName` | string | Canonical provider name (ex. `terraform-provider-random`) |
289-
| `.ProviderShortName` | string | Short version of the provider name (ex. `random`) |
289+
| `.ProviderShortName` | string | Short version of the rendered provider name (ex. `random`) |
290290
| `.RenderedProviderName` | string | Value provided via argument `--rendered-provider-name`, otherwise same as `.ProviderName` |
291291
| `.SchemaMarkdown` | string | a Markdown formatted Provider Schema definition |
292292
@@ -302,7 +302,7 @@ using the following data fields and functions:
302302
| `.HasImport` | bool | Is there an import file? |
303303
| `.ImportFile` | string | Path to the file with the command for importing the resource |
304304
| `.ProviderName` | string | Canonical provider name (ex. `terraform-provider-random`) |
305-
| `.ProviderShortName` | string | Short version of the provider name (ex. `random`) |
305+
| `.ProviderShortName` | string | Short version of the rendered provider name (ex. `random`) |
306306
| `.RenderedProviderName` | string | Value provided via argument `--rendered-provider-name`, otherwise same as `.ProviderName` |
307307
| `.SchemaMarkdown` | string | a Markdown formatted Resource / Data Source Schema definition |
308308
@@ -317,7 +317,7 @@ using the following data fields and functions:
317317
| `.HasExample` | bool | Is there an example file? |
318318
| `.ExampleFile` | string | Path to the file with the terraform configuration example |
319319
| `.ProviderName` | string | Canonical provider name (ex. `terraform-provider-random`) |
320-
| `.ProviderShortName` | string | Short version of the provider name (ex. `random`) |
320+
| `.ProviderShortName` | string | Short version of the rendered provider name (ex. `random`) |
321321
| `.RenderedProviderName` | string | Value provided via argument `--rendered-provider-name`, otherwise same as `.ProviderName` |
322322
| `.FunctionSignatureMarkdown` | string | a Markdown formatted Function signature |
323323
| `.FunctionArgumentsMarkdown` | string | a Markdown formatted Function arguments definition |

cmd/tfplugindocs/testdata/scripts/schema-json/generate/framework_provider_success_named_templates.txtar

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# Successful run of tfplugindocs on a Framework provider with "named" template paths (i.e. templates/resources/<resource name>.md.tmpl)
55
# Templates test all implemented data fields and functions.
66
[!unix] skip
7-
exec tfplugindocs --provider-name=terraform-provider-scaffolding --providers-schema=schema.json
7+
exec tfplugindocs --provider-name=terraform-provider-scaffolding --providers-schema=schema.json --rendered-provider-name=Scaffolding
88
cmp stdout expected-output.txt
99
cmpenv docs/index.md expected-index.md
1010
cmpenv docs/data-sources/example.md expected-datasource.md
@@ -13,7 +13,7 @@ cmpenv docs/functions/example.md expected-function.md
1313
cmpenv docs/ephemeral-resources/example.md expected-ephemeral-resource.md
1414

1515
-- expected-output.txt --
16-
rendering website for provider "terraform-provider-scaffolding" (as "terraform-provider-scaffolding")
16+
rendering website for provider "terraform-provider-scaffolding" (as "Scaffolding")
1717
copying any existing content to tmp dir
1818
exporting schema from JSON file
1919
getting provider schema
@@ -46,8 +46,8 @@ HasExample: true
4646
ExampleFile: $WORK/examples/data-sources/scaffolding_example/data-source.tf
4747
HasImport: false
4848
ProviderName: terraform-provider-scaffolding
49-
ProviderShortName: scaffolding
50-
RenderedProviderName: terraform-provider-scaffolding
49+
ProviderShortName: Scaffolding
50+
RenderedProviderName: Scaffolding
5151
SchemaMarkdown: <!-- schema generated by tfplugindocs -->
5252
## Schema
5353

@@ -102,8 +102,8 @@ Summary: Echo a string
102102
HasExample: true
103103
ExampleFile: $WORK/examples/functions/example/function.tf
104104
ProviderName: terraform-provider-scaffolding
105-
ProviderShortName: scaffolding
106-
RenderedProviderName: terraform-provider-scaffolding
105+
ProviderShortName: Scaffolding
106+
RenderedProviderName: Scaffolding
107107
FunctionSignatureMarkdown: <!-- signature generated by tfplugindocs -->
108108
```text
109109
example(input string, variadicInput string...) string
@@ -146,8 +146,8 @@ Description: Example provider
146146
HasExample: true
147147
ExampleFile: $WORK/examples/provider/provider.tf
148148
ProviderName: terraform-provider-scaffolding
149-
ProviderShortName: scaffolding
150-
RenderedProviderName: terraform-provider-scaffolding
149+
ProviderShortName: Scaffolding
150+
RenderedProviderName: Scaffolding
151151
SchemaMarkdown: <!-- schema generated by tfplugindocs -->
152152
## Schema
153153

@@ -193,8 +193,8 @@ ExampleFile: $WORK/examples/resources/scaffolding_example/resource.tf
193193
HasImport: true
194194
ImportFile: $WORK/examples/resources/scaffolding_example/import.sh
195195
ProviderName: terraform-provider-scaffolding
196-
ProviderShortName: scaffolding
197-
RenderedProviderName: terraform-provider-scaffolding
196+
ProviderShortName: Scaffolding
197+
RenderedProviderName: Scaffolding
198198
SchemaMarkdown: <!-- schema generated by tfplugindocs -->
199199
## Schema
200200

@@ -260,8 +260,8 @@ HasExample: true
260260
ExampleFile: $WORK/examples/ephemeral-resources/scaffolding_example/ephemeral-resource.tf
261261
HasImport: false
262262
ProviderName: terraform-provider-scaffolding
263-
ProviderShortName: scaffolding
264-
RenderedProviderName: terraform-provider-scaffolding
263+
ProviderShortName: Scaffolding
264+
RenderedProviderName: Scaffolding
265265
SchemaMarkdown: <!-- schema generated by tfplugindocs -->
266266
## Schema
267267

cmd/tfplugindocs/testdata/scripts/schema-json/generate/framework_provider_success_no_templates.txtar

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
# Successful run of tfplugindocs on a Framework provider with examples but no templates or pre-exiting docs.
55
[!unix] skip
6-
exec tfplugindocs --provider-name=terraform-provider-scaffolding --providers-schema=schema.json
6+
exec tfplugindocs --provider-name=terraform-provider-scaffolding --providers-schema=schema.json --rendered-provider-name=Scaffolding
77
cmp stdout expected-output.txt
88
cmp docs/index.md expected-index.md
99
cmp docs/data-sources/example.md expected-datasource.md
@@ -13,7 +13,7 @@ cmp docs/functions/no-variadic.md expected-no-variadic-function.md
1313
cmp docs/ephemeral-resources/example.md expected-ephemeral-resource.md
1414

1515
-- expected-output.txt --
16-
rendering website for provider "terraform-provider-scaffolding" (as "terraform-provider-scaffolding")
16+
rendering website for provider "terraform-provider-scaffolding" (as "Scaffolding")
1717
exporting schema from JSON file
1818
getting provider schema
1919
generating missing templates
@@ -40,7 +40,7 @@ rendering "resources/example.md.tmpl"
4040
-- expected-datasource.md --
4141
---
4242
# generated by https://github.com/hashicorp/terraform-plugin-docs
43-
page_title: "scaffolding_example Data Source - terraform-provider-scaffolding"
43+
page_title: "scaffolding_example Data Source - Scaffolding"
4444
subcategory: ""
4545
description: |-
4646
Example data source
@@ -71,7 +71,7 @@ data "scaffolding_example" "example" {
7171
-- expected-function.md --
7272
---
7373
# generated by https://github.com/hashicorp/terraform-plugin-docs
74-
page_title: "example function - terraform-provider-scaffolding"
74+
page_title: "example function - Scaffolding"
7575
subcategory: ""
7676
description: |-
7777
Echo a string
@@ -105,7 +105,7 @@ example(input string, variadicInput string...) string
105105
-- expected-no-variadic-function.md --
106106
---
107107
# generated by https://github.com/hashicorp/terraform-plugin-docs
108-
page_title: "no-variadic function - terraform-provider-scaffolding"
108+
page_title: "no-variadic function - Scaffolding"
109109
subcategory: ""
110110
description: |-
111111
Echo a string
@@ -137,12 +137,12 @@ no-variadic(input string) string
137137
-- expected-index.md --
138138
---
139139
# generated by https://github.com/hashicorp/terraform-plugin-docs
140-
page_title: "scaffolding Provider"
140+
page_title: "Scaffolding Provider"
141141
description: |-
142142
Example provider
143143
---
144144

145-
# scaffolding Provider
145+
# Scaffolding Provider
146146

147147
Example provider
148148

@@ -163,7 +163,7 @@ provider "scaffolding" {
163163
-- expected-resource.md --
164164
---
165165
# generated by https://github.com/hashicorp/terraform-plugin-docs
166-
page_title: "scaffolding_example Resource - terraform-provider-scaffolding"
166+
page_title: "scaffolding_example Resource - Scaffolding"
167167
subcategory: ""
168168
description: |-
169169
Example resource
@@ -195,7 +195,7 @@ resource "scaffolding_example" "example" {
195195
-- expected-ephemeral-resource.md --
196196
---
197197
# generated by https://github.com/hashicorp/terraform-plugin-docs
198-
page_title: "scaffolding_example Ephemeral Resource - terraform-provider-scaffolding"
198+
page_title: "scaffolding_example Ephemeral Resource - Scaffolding"
199199
subcategory: ""
200200
description: |-
201201
Example ephemeral resource

internal/provider/generate.go

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"os/exec"
1111
"path/filepath"
1212
"runtime"
13+
"sort"
1314
"strings"
1415

1516
"github.com/hashicorp/cli"
@@ -443,7 +444,16 @@ func (g *generator) generateMissingProviderTemplate() error {
443444

444445
func (g *generator) generateMissingTemplates(providerSchema *tfjson.ProviderSchema) error {
445446
g.infof("generating missing resource content")
446-
for name, schema := range providerSchema.ResourceSchemas {
447+
448+
resourceKeys := make([]string, 0, len(providerSchema.ResourceSchemas))
449+
for key := range providerSchema.ResourceSchemas {
450+
resourceKeys = append(resourceKeys, key)
451+
}
452+
sort.Strings(resourceKeys)
453+
454+
for _, name := range resourceKeys {
455+
schema := providerSchema.ResourceSchemas[name]
456+
447457
if g.ignoreDeprecated && schema.Block.Deprecated {
448458
continue
449459
}
@@ -455,7 +465,16 @@ func (g *generator) generateMissingTemplates(providerSchema *tfjson.ProviderSche
455465
}
456466

457467
g.infof("generating missing data source content")
458-
for name, schema := range providerSchema.DataSourceSchemas {
468+
469+
dataSourceKeys := make([]string, 0, len(providerSchema.DataSourceSchemas))
470+
for key := range providerSchema.DataSourceSchemas {
471+
dataSourceKeys = append(dataSourceKeys, key)
472+
}
473+
sort.Strings(dataSourceKeys)
474+
475+
for _, name := range dataSourceKeys {
476+
schema := providerSchema.DataSourceSchemas[name]
477+
459478
if g.ignoreDeprecated && schema.Block.Deprecated {
460479
continue
461480
}
@@ -467,7 +486,16 @@ func (g *generator) generateMissingTemplates(providerSchema *tfjson.ProviderSche
467486
}
468487

469488
g.infof("generating missing function content")
470-
for name, signature := range providerSchema.Functions {
489+
490+
functionKeys := make([]string, 0, len(providerSchema.Functions))
491+
for key := range providerSchema.Functions {
492+
functionKeys = append(functionKeys, key)
493+
}
494+
sort.Strings(functionKeys)
495+
496+
for _, name := range functionKeys {
497+
signature := providerSchema.Functions[name]
498+
471499
if g.ignoreDeprecated && signature.DeprecationMessage != "" {
472500
continue
473501
}
@@ -479,7 +507,16 @@ func (g *generator) generateMissingTemplates(providerSchema *tfjson.ProviderSche
479507
}
480508

481509
g.infof("generating missing ephemeral resource content")
482-
for name, schema := range providerSchema.EphemeralResourceSchemas {
510+
511+
ephemeralKeys := make([]string, 0, len(providerSchema.EphemeralResourceSchemas))
512+
for key := range providerSchema.EphemeralResourceSchemas {
513+
ephemeralKeys = append(ephemeralKeys, key)
514+
}
515+
sort.Strings(ephemeralKeys)
516+
517+
for _, name := range ephemeralKeys {
518+
schema := providerSchema.EphemeralResourceSchemas[name]
519+
483520
if g.ignoreDeprecated && schema.Block.Deprecated {
484521
continue
485522
}

internal/provider/template.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ func (t providerTemplate) Render(providerDir, providerName, renderedProviderName
150150
ExampleFile: exampleFile,
151151

152152
ProviderName: providerName,
153-
ProviderShortName: providerShortName(providerName),
153+
ProviderShortName: providerShortName(renderedProviderName),
154154

155155
SchemaMarkdown: schemaComment + "\n" + schemaBuffer.String(),
156156

@@ -199,7 +199,7 @@ func (t resourceTemplate) Render(providerDir, name, providerName, renderedProvid
199199
ImportFile: importFile,
200200

201201
ProviderName: providerName,
202-
ProviderShortName: providerShortName(providerName),
202+
ProviderShortName: providerShortName(renderedProviderName),
203203

204204
SchemaMarkdown: schemaComment + "\n" + schemaBuffer.String(),
205205

@@ -257,7 +257,7 @@ func (t functionTemplate) Render(providerDir, name, providerName, renderedProvid
257257
ExampleFile: exampleFile,
258258

259259
ProviderName: providerName,
260-
ProviderShortName: providerShortName(providerName),
260+
ProviderShortName: providerShortName(renderedProviderName),
261261

262262
FunctionSignatureMarkdown: signatureComment + "\n" + funcSig,
263263
FunctionArgumentsMarkdown: argumentComment + "\n" + funcArgs,
@@ -271,7 +271,7 @@ func (t functionTemplate) Render(providerDir, name, providerName, renderedProvid
271271

272272
const defaultResourceTemplate resourceTemplate = `---
273273
` + frontmatterComment + `
274-
page_title: "{{.Name}} {{.Type}} - {{.ProviderName}}"
274+
page_title: "{{.Name}} {{.Type}} - {{.RenderedProviderName}}"
275275
subcategory: ""
276276
description: |-
277277
{{ .Description | plainmarkdown | trimspace | prefixlines " " }}
@@ -300,7 +300,7 @@ Import is supported using the following syntax:
300300

301301
const defaultFunctionTemplate functionTemplate = `---
302302
` + frontmatterComment + `
303-
page_title: "{{.Name}} {{.Type}} - {{.ProviderName}}"
303+
page_title: "{{.Name}} {{.Type}} - {{.RenderedProviderName}}"
304304
subcategory: ""
305305
description: |-
306306
{{ .Summary | plainmarkdown | trimspace | prefixlines " " }}

0 commit comments

Comments
 (0)