Skip to content

Commit 191ecdf

Browse files
authored
all: Add support for state stores (#570)
* initial impl and basic test skips * add tests and changelogs * add generate tests * add migrate and validate tests * update changelogs with PR * fmt
1 parent aca69d0 commit 191ecdf

35 files changed

Lines changed: 1272 additions & 22 deletions
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
kind: FEATURES
2+
body: 'generate: Add support for state stores'
3+
time: 2026-02-27T14:44:49.221116-05:00
4+
custom:
5+
Issue: "570"
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
kind: FEATURES
2+
body: 'migrate: Add support for state stores'
3+
time: 2026-02-27T14:45:13.780708-05:00
4+
custom:
5+
Issue: "570"
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
kind: FEATURES
2+
body: 'validate: Add support for state stores'
3+
time: 2026-02-27T14:45:23.218741-05:00
4+
custom:
5+
Issue: "570"

README.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ When you run `tfplugindocs`, by default from the root directory of a provider co
119119
* Generate ephemeral resource template files, if missing (Requires Terraform v1.10.0+)
120120
* Generate action template files, if missing (Requires Terraform v1.14.0+)
121121
* Generate list resource templeate files, if missing (Requires Terraform v1.14.0+)
122+
* Generate state store template files, if missing (Requires Terraform v1.16.0+)
122123
* Copy all non-template files to the output website directory
123124
124125
> [!NOTE]
@@ -219,6 +220,8 @@ For templates:
219220
| `templates/functions/<function name>.md[.tmpl]` | Function page (or template) |
220221
| `templates/list-resources.md[.tmpl]` | Generic list resource page (or template) |
221222
| `templates/list-resources/<list resource name>.md[.tmpl]` | List resource page (or template) |
223+
| `templates/state-stores.md[.tmpl]` | Generic state store page (or template) |
224+
| `templates/state-stores/<state store name>.md[.tmpl]` | State store page (or template) |
222225
| `templates/resources.md[.tmpl]` | Generic resource page (or template) |
223226
| `templates/resources/<resource name>.md[.tmpl]` | Resource page (or template) |
224227
@@ -238,6 +241,7 @@ For examples:
238241
| `examples/ephemeral-resources/<ephemeral resource>/ephemeral-resource<*>.tf` | Ephemeral resource example config(s) |
239242
| `examples/functions/<function name>/function<*>.tf` | Function example config(s) |
240243
| `examples/list-resources/<list resource>/list-resource<*>.tfquery.hcl` | List resource example config(s) |
244+
| `examples/state-stores/<state store>/state-store<*>.tf` | State store example config(s) |
241245
| `examples/resources/<resource name>/resource<*>.tf` | Resource example config(s) |
242246
| `examples/resources/<resource name>/import.sh` | Resource example import command |
243247
| `examples/resources/<resource name>/import-by-string-id.tf` | Resource example import by id config |
@@ -262,6 +266,7 @@ Legacy website directory structure:
262266
| `website/docs/ephemeral-resources/<ephemeral resource name>.html.markdown` | Ephemeral resource page |
263267
| `website/docs/functons/<function name>.html.markdown` | Functions page |
264268
| `website/docs/list-resources/<list resource name>.html.markdown` | List resource page |
269+
| `website/docs/state-stores/<state store name>.html.markdown` | State store page |
265270
| `website/docs/r/<resource name>.html.markdown` | Resource page |
266271
267272
Docs website directory structure:
@@ -276,6 +281,7 @@ Docs website directory structure:
276281
| `docs/ephemeral-resources/<ephemeral resource name>.html.markdown` | Ephemeral resource page |
277282
| `docs/functions/<function name>.html.markdown` | Function page |
278283
| `docs/list-resources/<list resource name>.html.markdown` | List resource page |
284+
| `docs/state-stores/<state store name>.html.markdown` | State store page |
279285
| `docs/resources/<resource name>.html.markdown` | Resource page |
280286
281287
Files named `index` (before the first `.`) in the website docs root directory and files in the `website/docs/d/`, `website/docs/r/`, `docs/data-sources/`,
@@ -381,6 +387,22 @@ using the following data fields and functions:
381387
| `.RenderedProviderName` | string | Value provided via argument `--rendered-provider-name`, otherwise same as `.ProviderName` |
382388
| `.SchemaMarkdown` | string | a Markdown formatted list resource Schema definition |
383389
390+
##### State Store Fields
391+
392+
| Field | Type | Description |
393+
|-------------------------|--------|------------------------------------------------------------------------------------------------------------------------------------------------|
394+
| `.Name` | string | Name of the state store (ex. `examplecloud_thing`) |
395+
| `.Type` | string | `State Store` |
396+
| `.Description` | string | State store description |
397+
| `.HasExample` | bool | (Legacy) Is there an example file? |
398+
| `.HasExamples` | bool | Are there example files? Always true if HasExample is true. |
399+
| `.ExampleFile` | string | (Legacy) Path to the file with the terraform configuration example |
400+
| `.ExampleFiles` | string | Paths to the files with terraform configuration examples. Includes ExampleFile. |
401+
| `.ProviderName` | string | Canonical provider name (ex. `terraform-provider-http`) |
402+
| `.ProviderShortName` | string | Short version of the rendered provider name (ex. `http`) |
403+
| `.RenderedProviderName` | string | Value provided via argument `--rendered-provider-name`, otherwise same as `.ProviderName` |
404+
| `.SchemaMarkdown` | string | a Markdown formatted state store Schema definition |
405+
384406
#### Template Functions
385407
386408
| Function | Example | Description |

cmd/tfplugindocs/testdata/scripts/provider-build/generate/framework_provider_success_generic_templates.txtar

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ generating missing function content
2929
generating missing ephemeral resource content
3030
generating missing action content
3131
generating missing list resource content
32+
generating missing state store content
3233
generating missing provider content
3334
provider "terraform-provider-scaffolding" template exists, skipping
3435
rendering static website

cmd/tfplugindocs/testdata/scripts/provider-build/generate/framework_provider_success_named_templates.txtar

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ generating missing function content
2929
generating missing ephemeral resource content
3030
generating missing action content
3131
generating missing list resource content
32+
generating missing state store content
3233
generating missing provider content
3334
provider "terraform-provider-scaffolding" template exists, skipping
3435
rendering static website

cmd/tfplugindocs/testdata/scripts/provider-build/generate/framework_provider_success_no_templates.txtar

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ generating missing function content
2727
generating missing ephemeral resource content
2828
generating missing action content
2929
generating missing list resource content
30+
generating missing state store content
3031
generating missing provider content
3132
generating new template for "terraform-provider-scaffolding"
3233
rendering static website

cmd/tfplugindocs/testdata/scripts/provider-build/generate/null_provider_success.txtar

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ generating missing function content
2626
generating missing ephemeral resource content
2727
generating missing action content
2828
generating missing list resource content
29+
generating missing state store content
2930
generating missing provider content
3031
provider "terraform-provider-null" template exists, skipping
3132
rendering static website
@@ -2404,4 +2405,4 @@ func main() {
24042405
if err != nil {
24052406
log.Fatal(err)
24062407
}
2407-
}
2408+
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ generating new template for function "scaffolding"
2222
generating missing ephemeral resource content
2323
generating missing action content
2424
generating missing list resource content
25+
generating missing state store content
2526
generating missing provider content
2627
generating new template for "terraform-provider-scaffolding"
2728
rendering static website

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

Lines changed: 133 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ cmpenv docs/functions/example.md expected-function.md
1313
cmpenv docs/ephemeral-resources/example.md expected-ephemeral-resource.md
1414
cmpenv docs/actions/example.md expected-action.md
1515
cmpenv docs/list-resources/example.md expected-list-resource.md
16+
cmpenv docs/state-stores/example.md expected-state-store.md
1617

1718

1819
-- expected-output.txt --
@@ -33,6 +34,8 @@ generating missing action content
3334
action "scaffolding_example" fallback template exists, creating template
3435
generating missing list resource content
3536
list resource "scaffolding_example" fallback template exists, creating template
37+
generating missing state store content
38+
state store "scaffolding_example" fallback template exists, creating template
3639
generating missing provider content
3740
provider "terraform-provider-scaffolding" template exists, skipping
3841
rendering static website
@@ -45,6 +48,7 @@ rendering "functions/example.md.tmpl"
4548
rendering "index.md.tmpl"
4649
rendering "list-resources/example.md.tmpl"
4750
rendering "resources/example.md.tmpl"
51+
rendering "state-stores/example.md.tmpl"
4852
-- expected-action.md --
4953
# Data Fields
5054

@@ -149,6 +153,60 @@ list "scaffolding_example" "example" {
149153
}
150154
}
151155
```
156+
-- expected-state-store.md --
157+
# Data Fields
158+
159+
Name: scaffolding_example
160+
Type: State Store
161+
Description: Example state store
162+
HasExample: true
163+
ExampleFile: $WORK/examples/state-stores/scaffolding_example/state-store.tf
164+
ProviderName: terraform-provider-scaffolding
165+
ProviderShortName: scaffolding
166+
RenderedProviderName: terraform-provider-scaffolding
167+
SchemaMarkdown: <!-- schema generated by tfplugindocs -->
168+
## Schema
169+
170+
### Optional
171+
172+
- `configurable_attribute` (String) Example configurable attribute
173+
- `defaulted` (String) Example configurable attribute with default value
174+
175+
176+
177+
# Functions
178+
179+
lower: state store
180+
plainmarkdown: State Store
181+
prefixlines: Prefix: State Store
182+
split: [scaffolding example]
183+
title: State Store
184+
trimspace: State Store
185+
upper: STATE STORE
186+
187+
# Conditionals and File Functions
188+
189+
printf tffile:
190+
## Example Usage
191+
192+
{{tffile "$WORK/examples/state-stores/scaffolding_example/state-store.tf"}}
193+
194+
tffile:
195+
## Example Usage
196+
197+
```terraform
198+
terraform {
199+
required_providers {
200+
scaffolding = {
201+
source = "registry.terraform.io/hashicorp/scaffolding"
202+
}
203+
}
204+
state_store "scaffolding_example" {
205+
configurable_attribute = "some-value"
206+
provider "scaffolding" {}
207+
}
208+
}
209+
```
152210
-- expected-datasource.md --
153211
# Data Fields
154212

@@ -458,6 +516,44 @@ tffile:
458516
{{ if .HasExample -}}
459517
## Example Usage
460518

519+
{{tffile .ExampleFile }}
520+
{{- end }}
521+
-- templates/state-stores.md.tmpl --
522+
# Data Fields
523+
524+
Name: {{.Name}}
525+
Type: {{.Type}}
526+
Description: {{.Description}}
527+
HasExample: {{.HasExample}}
528+
ExampleFile: {{.ExampleFile}}
529+
ProviderName: {{.ProviderName}}
530+
ProviderShortName: {{.ProviderShortName}}
531+
RenderedProviderName: {{.RenderedProviderName}}
532+
SchemaMarkdown: {{.SchemaMarkdown}}
533+
534+
# Functions
535+
536+
lower: {{ .Type | lower }}
537+
plainmarkdown: {{ .Type | plainmarkdown }}
538+
prefixlines: {{ .Type | prefixlines "Prefix: " }}
539+
split: {{ split .Name "_" }}
540+
title: {{ .Type | title }}
541+
trimspace: {{ .Type | trimspace }}
542+
upper: {{ .Type | upper }}
543+
544+
# Conditionals and File Functions
545+
546+
printf tffile:
547+
{{ if .HasExample -}}
548+
## Example Usage
549+
550+
{{ printf "{{tffile %q}}" .ExampleFile }}
551+
{{- end }}
552+
553+
tffile:
554+
{{ if .HasExample -}}
555+
## Example Usage
556+
461557
{{tffile .ExampleFile }}
462558
{{- end }}
463559
-- templates/actions.md.tmpl --
@@ -774,6 +870,18 @@ list "scaffolding_example" "example" {
774870
required_attr = "some-value"
775871
}
776872
}
873+
-- examples/state-stores/scaffolding_example/state-store.tf --
874+
terraform {
875+
required_providers {
876+
scaffolding = {
877+
source = "registry.terraform.io/hashicorp/scaffolding"
878+
}
879+
}
880+
state_store "scaffolding_example" {
881+
configurable_attribute = "some-value"
882+
provider "scaffolding" {}
883+
}
884+
}
777885
-- examples/data-sources/scaffolding_example/data-source.tf --
778886
data "scaffolding_example" "example" {
779887
configurable_attribute = "some-value"
@@ -848,6 +956,30 @@ resource "scaffolding_example" "example" {
848956
}
849957
}
850958
},
959+
"state_store_schemas": {
960+
"scaffolding_example": {
961+
"version": 0,
962+
"block": {
963+
"attributes": {
964+
"configurable_attribute": {
965+
"type": "string",
966+
"description": "Example configurable attribute",
967+
"description_kind": "markdown",
968+
"optional": true
969+
},
970+
"defaulted": {
971+
"type": "string",
972+
"description": "Example configurable attribute with default value",
973+
"description_kind": "markdown",
974+
"optional": true,
975+
"computed": true
976+
}
977+
},
978+
"description": "Example state store",
979+
"description_kind": "markdown"
980+
}
981+
}
982+
},
851983
"action_schemas": {
852984
"scaffolding_example": {
853985
"version": 0,
@@ -975,4 +1107,4 @@ resource "scaffolding_example" "example" {
9751107
}
9761108
}
9771109
}
978-
}
1110+
}

0 commit comments

Comments
 (0)