Skip to content

Commit cbd432b

Browse files
authored
Allowing single word resources to use templates (#147)
* Allowing single word resources to use templates * Updating CHANGELOG.md * Add unit test for resourceName * Returning error if resource not found * Adding field names to test structs
1 parent ed20132 commit cbd432b

File tree

5 files changed

+134
-28
lines changed

5 files changed

+134
-28
lines changed

CHANGELOG.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
1+
# 0.9.1 (Unreleased)
2+
3+
BUG FIXES:
4+
5+
* cmd/tfplugindocs: Allow single word resources to use templates ([147](https://github.com/hashicorp/terraform-plugin-docs/pull/147)).
6+
17
# 0.9.0 (June 1, 2022)
28

39
NEW FEATURES:
410

5-
* cmd/tflugindocs: Additional CLI arguments `provider-name`, `rendered-provider-name`, `rendered-website-dir`, `examples-dir`, `website-temp-dir`, and `website-source-dir`. These allow to further customise generated doc ([#95](https://github.com/hashicorp/terraform-plugin-docs/pull/95)).
11+
* cmd/tfplugindocs: Additional CLI arguments `provider-name`, `rendered-provider-name`, `rendered-website-dir`, `examples-dir`, `website-temp-dir`, and `website-source-dir`. These allow to further customise generated doc ([#95](https://github.com/hashicorp/terraform-plugin-docs/pull/95)).
612

713
ENHANCEMENTS:
814

9-
* cmd/tflugindocs: Implemented usage output (i.e. `--help`) for `generate` and `validate` commands ([#95](https://github.com/hashicorp/terraform-plugin-docs/pull/95)).
15+
* cmd/tfplugindocs: Implemented usage output (i.e. `--help`) for `generate` and `validate` commands ([#95](https://github.com/hashicorp/terraform-plugin-docs/pull/95)).
1016

1117
# 0.8.1 (May 10, 2022)
1218

internal/provider/generate.go

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -414,35 +414,37 @@ func (g *generator) renderStaticWebsite(providerName string, providerSchema *tfj
414414
g.infof("rendering %q", rel)
415415
switch relDir {
416416
case "data-sources/":
417-
resName := shortName + "_" + removeAllExt(relFile)
418-
resSchema, ok := providerSchema.DataSourceSchemas[resName]
419-
if ok {
420-
tmpl := resourceTemplate(tmplData)
421-
render, err := tmpl.Render(resName, providerName, "Data Source", "", "", resSchema)
422-
if err != nil {
423-
return fmt.Errorf("unable to render data source template %q: %w", rel, err)
424-
}
425-
_, err = out.WriteString(render)
426-
if err != nil {
427-
return fmt.Errorf("unable to write rendered string: %w", err)
428-
}
429-
return nil
417+
resSchema, resName := resourceSchema(providerSchema.DataSourceSchemas, shortName, relFile)
418+
if resSchema == nil {
419+
return fmt.Errorf("unable to find resource for provider (%s) and template (%s)", shortName, relFile)
420+
}
421+
422+
tmpl := resourceTemplate(tmplData)
423+
render, err := tmpl.Render(resName, providerName, "Data Source", "", "", resSchema)
424+
if err != nil {
425+
return fmt.Errorf("unable to render data source template %q: %w", rel, err)
430426
}
427+
_, err = out.WriteString(render)
428+
if err != nil {
429+
return fmt.Errorf("unable to write rendered string: %w", err)
430+
}
431+
return nil
431432
case "resources/":
432-
resName := shortName + "_" + removeAllExt(relFile)
433-
resSchema, ok := providerSchema.ResourceSchemas[resName]
434-
if ok {
435-
tmpl := resourceTemplate(tmplData)
436-
render, err := tmpl.Render(resName, providerName, "Resource", "", "", resSchema)
437-
if err != nil {
438-
return fmt.Errorf("unable to render resource template %q: %w", rel, err)
439-
}
440-
_, err = out.WriteString(render)
441-
if err != nil {
442-
return fmt.Errorf("unable to write regindered string: %w", err)
443-
}
444-
return nil
433+
resSchema, resName := resourceSchema(providerSchema.ResourceSchemas, shortName, relFile)
434+
if resSchema == nil {
435+
return fmt.Errorf("unable to find resource for provider (%s) and template (%s)", shortName, relFile)
436+
}
437+
438+
tmpl := resourceTemplate(tmplData)
439+
render, err := tmpl.Render(resName, providerName, "Resource", "", "", resSchema)
440+
if err != nil {
441+
return fmt.Errorf("unable to render resource template %q: %w", rel, err)
445442
}
443+
_, err = out.WriteString(render)
444+
if err != nil {
445+
return fmt.Errorf("unable to write regindered string: %w", err)
446+
}
447+
return nil
446448
case "": // provider
447449
if relFile == "index.md.tmpl" {
448450
tmpl := providerTemplate(tmplData)

internal/provider/template.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"text/template"
99

1010
tfjson "github.com/hashicorp/terraform-json"
11+
1112
"github.com/hashicorp/terraform-plugin-docs/internal/mdplain"
1213
"github.com/hashicorp/terraform-plugin-docs/internal/tmplfuncs"
1314
"github.com/hashicorp/terraform-plugin-docs/schemamd"

internal/provider/util.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import (
99
"os/exec"
1010
"path/filepath"
1111
"strings"
12+
13+
tfjson "github.com/hashicorp/terraform-json"
1214
)
1315

1416
func providerShortName(n string) string {
@@ -52,6 +54,23 @@ func removeAllExt(file string) string {
5254
}
5355
}
5456

57+
// resourceSchema determines whether there is a schema in the supplied schemas map which
58+
// has either the providerShortName or the providerShortName concatenated with the
59+
// templateFileName (stripped of file extension.
60+
func resourceSchema(schemas map[string]*tfjson.Schema, providerShortName, templateFileName string) (*tfjson.Schema, string) {
61+
if schema, ok := schemas[providerShortName]; ok {
62+
return schema, providerShortName
63+
}
64+
65+
resName := providerShortName + "_" + removeAllExt(templateFileName)
66+
67+
if schema, ok := schemas[resName]; ok {
68+
return schema, resName
69+
}
70+
71+
return nil, ""
72+
}
73+
5574
func writeFile(path string, data string) error {
5675
dir, _ := filepath.Split(path)
5776
err := os.MkdirAll(dir, 0755)

internal/provider/util_test.go

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package provider
2+
3+
import (
4+
"testing"
5+
6+
"github.com/google/go-cmp/cmp"
7+
tfjson "github.com/hashicorp/terraform-json"
8+
)
9+
10+
func Test_resourceSchema(t *testing.T) {
11+
cases := map[string]struct {
12+
schemas map[string]*tfjson.Schema
13+
providerShortName string
14+
templateFileName string
15+
expectedSchema *tfjson.Schema
16+
expectedResourceName string
17+
}{
18+
"provider short name matches schema name": {
19+
schemas: map[string]*tfjson.Schema{
20+
"http": {},
21+
},
22+
providerShortName: "http",
23+
templateFileName: "http.md.tmpl",
24+
expectedSchema: &tfjson.Schema{},
25+
expectedResourceName: "http",
26+
},
27+
"provider short name does not match schema name": {
28+
schemas: map[string]*tfjson.Schema{
29+
"http": {},
30+
},
31+
providerShortName: "tls",
32+
templateFileName: "http.md.tmpl",
33+
expectedSchema: nil,
34+
expectedResourceName: "",
35+
},
36+
"provider short name concatenated with template file name matches schema name": {
37+
schemas: map[string]*tfjson.Schema{
38+
"tls_cert_request": {},
39+
},
40+
providerShortName: "tls",
41+
templateFileName: "cert_request.md.tmpl",
42+
expectedSchema: &tfjson.Schema{},
43+
expectedResourceName: "tls_cert_request",
44+
},
45+
"provider short name concatenated with template file name does not match schema name": {
46+
schemas: map[string]*tfjson.Schema{
47+
"tls_cert_request": {},
48+
},
49+
providerShortName: "tls",
50+
templateFileName: "not_found.md.tmpl",
51+
expectedSchema: nil,
52+
expectedResourceName: "",
53+
},
54+
"provider short name concatenated with same template file name matches schema name": {
55+
schemas: map[string]*tfjson.Schema{
56+
"tls_tls": {},
57+
},
58+
providerShortName: "tls",
59+
templateFileName: "tls.md.tmpl",
60+
expectedSchema: &tfjson.Schema{},
61+
expectedResourceName: "tls_tls",
62+
},
63+
}
64+
65+
for name, c := range cases {
66+
t.Run(name, func(t *testing.T) {
67+
actualSchema, actualResourceName := resourceSchema(c.schemas, c.providerShortName, c.templateFileName)
68+
69+
if !cmp.Equal(c.expectedSchema, actualSchema) {
70+
t.Errorf("expected: %+v, got: %+v", c.expectedSchema, actualSchema)
71+
}
72+
73+
if !cmp.Equal(c.expectedResourceName, actualResourceName) {
74+
t.Errorf("expected: %s, got: %s", c.expectedResourceName, actualResourceName)
75+
}
76+
})
77+
}
78+
}

0 commit comments

Comments
 (0)