{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":356355992,"defaultBranch":"main","name":"terraform-plugin-framework","ownerLogin":"hashicorp","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2021-04-09T17:52:52.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/761456?v=4","public":true,"private":false,"isOrgOwned":true},"refInfo":{"name":"","listCacheKey":"v0:1715115966.0","currentOid":""},"activityList":{"items":[{"before":"3a5a8c30ade0dd4210f4ec4c6c969179359d940a","after":"04042c2b41e2eaf21caf9e77d1486ea979cc3a1c","ref":"refs/heads/SBGoods/deferred-action-support","pushedAt":"2024-05-08T15:12:12.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"SBGoods","name":"Selena Goods","path":"/SBGoods","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/15186916?s=80&v=4"},"commit":{"message":"Add changelog entries","shortMessageHtmlLink":"Add changelog entries"}},{"before":"e6a37004c89143f0156312d8dc9503948616efc6","after":"3a5a8c30ade0dd4210f4ec4c6c969179359d940a","ref":"refs/heads/SBGoods/deferred-action-support","pushedAt":"2024-05-07T21:22:31.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"SBGoods","name":"Selena Goods","path":"/SBGoods","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/15186916?s=80&v=4"},"commit":{"message":"Add copyright headers","shortMessageHtmlLink":"Add copyright headers"}},{"before":"39c4bb5c58a176a2b2f54ea1423933ceb6d9ea37","after":"e6a37004c89143f0156312d8dc9503948616efc6","ref":"refs/heads/SBGoods/deferred-action-support","pushedAt":"2024-05-07T21:08:32.000Z","pushType":"push","commitsCount":9,"pusher":{"login":"SBGoods","name":"Selena Goods","path":"/SBGoods","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/15186916?s=80&v=4"},"commit":{"message":"Merge branch 'main' into SBGoods/deferred-action-support\n\n# Conflicts:\n#\tgo.sum","shortMessageHtmlLink":"Merge branch 'main' into SBGoods/deferred-action-support"}},{"before":null,"after":"39c4bb5c58a176a2b2f54ea1423933ceb6d9ea37","ref":"refs/heads/SBGoods/deferred-action-support","pushedAt":"2024-05-07T21:06:06.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"SBGoods","name":"Selena Goods","path":"/SBGoods","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/15186916?s=80&v=4"},"commit":{"message":"Update documentation and diagnostic messages","shortMessageHtmlLink":"Update documentation and diagnostic messages"}},{"before":"525b4c9772402514b97e483e491e2c521e4b09d3","after":null,"ref":"refs/heads/dependabot/github_actions/hashicorp/setup-terraform-3.1.1","pushedAt":"2024-05-07T14:37:41.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"austinvalle","name":"Austin Valle","path":"/austinvalle","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/8650838?s=80&v=4"}},{"before":"5ad5f892b63396bf57ea56627d40654aa177eaad","after":"543316741ca23e85e2a0d5343141648ae3b15e10","ref":"refs/heads/main","pushedAt":"2024-05-07T14:37:40.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"austinvalle","name":"Austin Valle","path":"/austinvalle","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/8650838?s=80&v=4"},"commit":{"message":"build(deps): Bump hashicorp/setup-terraform from 3.1.0 to 3.1.1 (#998)\n\nBumps [hashicorp/setup-terraform](https://github.com/hashicorp/setup-terraform) from 3.1.0 to 3.1.1.\r\n- [Release notes](https://github.com/hashicorp/setup-terraform/releases)\r\n- [Changelog](https://github.com/hashicorp/setup-terraform/blob/main/CHANGELOG.md)\r\n- [Commits](https://github.com/hashicorp/setup-terraform/compare/97f030cf6dc0b4f5e0da352c7bca9cca34579800...651471c36a6092792c552e8b1bef71e592b462d8)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: hashicorp/setup-terraform\r\n dependency-type: direct:production\r\n update-type: version-update:semver-patch\r\n...\r\n\r\nSigned-off-by: dependabot[bot] \r\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\r\nCo-authored-by: Austin Valle ","shortMessageHtmlLink":"build(deps): Bump hashicorp/setup-terraform from 3.1.0 to 3.1.1 (#998)"}},{"before":"adce09a14a8196fa5f0b67f190dfe00106210d21","after":"525b4c9772402514b97e483e491e2c521e4b09d3","ref":"refs/heads/dependabot/github_actions/hashicorp/setup-terraform-3.1.1","pushedAt":"2024-05-07T14:35:02.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"austinvalle","name":"Austin Valle","path":"/austinvalle","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/8650838?s=80&v=4"},"commit":{"message":"Merge branch 'main' into dependabot/github_actions/hashicorp/setup-terraform-3.1.1","shortMessageHtmlLink":"Merge branch 'main' into dependabot/github_actions/hashicorp/setup-te…"}},{"before":"1fa6971784e67271ecd9bc7fd511876971dda43f","after":null,"ref":"refs/heads/dependabot/go_modules/github.com/hashicorp/terraform-plugin-go-0.23.0","pushedAt":"2024-05-07T14:34:51.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"austinvalle","name":"Austin Valle","path":"/austinvalle","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/8650838?s=80&v=4"}},{"before":"81828e32c3a012aaa2258760bd0b7c5edca7a89e","after":"5ad5f892b63396bf57ea56627d40654aa177eaad","ref":"refs/heads/main","pushedAt":"2024-05-07T14:34:50.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"austinvalle","name":"Austin Valle","path":"/austinvalle","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/8650838?s=80&v=4"},"commit":{"message":"build(deps): Bump github.com/hashicorp/terraform-plugin-go (#997)\n\nBumps [github.com/hashicorp/terraform-plugin-go](https://github.com/hashicorp/terraform-plugin-go) from 0.22.2 to 0.23.0.\r\n- [Release notes](https://github.com/hashicorp/terraform-plugin-go/releases)\r\n- [Changelog](https://github.com/hashicorp/terraform-plugin-go/blob/main/CHANGELOG.md)\r\n- [Commits](https://github.com/hashicorp/terraform-plugin-go/compare/v0.22.2...v0.23.0)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: github.com/hashicorp/terraform-plugin-go\r\n dependency-type: direct:production\r\n update-type: version-update:semver-minor\r\n...\r\n\r\nSigned-off-by: dependabot[bot] \r\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>","shortMessageHtmlLink":"build(deps): Bump github.com/hashicorp/terraform-plugin-go (#997)"}},{"before":null,"after":"adce09a14a8196fa5f0b67f190dfe00106210d21","ref":"refs/heads/dependabot/github_actions/hashicorp/setup-terraform-3.1.1","pushedAt":"2024-05-07T14:27:03.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"dependabot[bot]","name":null,"path":"/apps/dependabot","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/29110?s=80&v=4"},"commit":{"message":"build(deps): Bump hashicorp/setup-terraform from 3.1.0 to 3.1.1\n\nBumps [hashicorp/setup-terraform](https://github.com/hashicorp/setup-terraform) from 3.1.0 to 3.1.1.\n- [Release notes](https://github.com/hashicorp/setup-terraform/releases)\n- [Changelog](https://github.com/hashicorp/setup-terraform/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/hashicorp/setup-terraform/compare/97f030cf6dc0b4f5e0da352c7bca9cca34579800...651471c36a6092792c552e8b1bef71e592b462d8)\n\n---\nupdated-dependencies:\n- dependency-name: hashicorp/setup-terraform\n dependency-type: direct:production\n update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] ","shortMessageHtmlLink":"build(deps): Bump hashicorp/setup-terraform from 3.1.0 to 3.1.1"}},{"before":null,"after":"1fa6971784e67271ecd9bc7fd511876971dda43f","ref":"refs/heads/dependabot/go_modules/github.com/hashicorp/terraform-plugin-go-0.23.0","pushedAt":"2024-05-07T14:22:17.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"dependabot[bot]","name":null,"path":"/apps/dependabot","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/29110?s=80&v=4"},"commit":{"message":"build(deps): Bump github.com/hashicorp/terraform-plugin-go\n\nBumps [github.com/hashicorp/terraform-plugin-go](https://github.com/hashicorp/terraform-plugin-go) from 0.22.2 to 0.23.0.\n- [Release notes](https://github.com/hashicorp/terraform-plugin-go/releases)\n- [Changelog](https://github.com/hashicorp/terraform-plugin-go/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/hashicorp/terraform-plugin-go/compare/v0.22.2...v0.23.0)\n\n---\nupdated-dependencies:\n- dependency-name: github.com/hashicorp/terraform-plugin-go\n dependency-type: direct:production\n update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] ","shortMessageHtmlLink":"build(deps): Bump github.com/hashicorp/terraform-plugin-go"}},{"before":"90f87e1bcb012ecc5c07997d348dd11650612830","after":null,"ref":"refs/heads/tsccr-auto-pinning/trusted/2024-05-06","pushedAt":"2024-05-06T14:34:16.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"bflad","name":"Brian Flad","path":"/bflad","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/189114?s=80&v=4"}},{"before":"f200629c5c701ec34f246bc5200afb59b3842b40","after":"81828e32c3a012aaa2258760bd0b7c5edca7a89e","ref":"refs/heads/main","pushedAt":"2024-05-06T14:34:15.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"bflad","name":"Brian Flad","path":"/bflad","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/189114?s=80&v=4"},"commit":{"message":"Result of tsccr-helper -log-level=info gha update -latest . (#996)\n\nCo-authored-by: hashicorp-tsccr[bot] ","shortMessageHtmlLink":"Result of tsccr-helper -log-level=info gha update -latest . (#996)"}},{"before":null,"after":"90f87e1bcb012ecc5c07997d348dd11650612830","ref":"refs/heads/tsccr-auto-pinning/trusted/2024-05-06","pushedAt":"2024-05-06T06:08:07.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"hashicorp-tsccr[bot]","name":null,"path":"/apps/hashicorp-tsccr","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/312369?s=80&v=4"},"commit":{"message":"Result of tsccr-helper -log-level=info gha update -latest .","shortMessageHtmlLink":"Result of tsccr-helper -log-level=info gha update -latest ."}},{"before":"10e88cf79d97ecc798142c3c21863857f858b3ba","after":null,"ref":"refs/heads/bflad/nestedattributeobject-skip-known-valuing","pushedAt":"2024-04-30T12:02:22.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"bflad","name":"Brian Flad","path":"/bflad","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/189114?s=80&v=4"}},{"before":"0cca037d9e1a64449ef2a0e0685f65ccb91c4b2d","after":"f200629c5c701ec34f246bc5200afb59b3842b40","ref":"refs/heads/main","pushedAt":"2024-04-30T12:02:21.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"bflad","name":"Brian Flad","path":"/bflad","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/189114?s=80&v=4"},"commit":{"message":"internal/fwserver: Skip automatic object state conversion and nested attributes plan modification if object is null or unknown (#995)\n\nReference: https://github.com/hashicorp/terraform-plugin-framework/issues/993\r\n\r\nBy data definition, a null or unknown object has no underlying data where nested attributes should run plan modification. By Terraform data consistency rules, a null or unknown object should be preserved as-is (unless it is an unknown value being refined into a more known value), however this was not the case where a collection-based nested attribute had a null or unknown object, such as this example configuration:\r\n\r\n```\r\nresource \"examplecloud_thing\" \"example\" {\r\n nested_map = {\r\n examplekey = null # this was previously problematic\r\n }\r\n}\r\n```\r\n\r\nPreviously, a null or unknown object would be errantly transformed by the framework plan modification logic into a known object with null/unknown attributes. This could be seen in human-readable Terraform plans, such as (`{}` below):\r\n\r\n```\r\n # examplecloud_thing.example will be created\r\n + resource \"examplecloud_thing\" \"example\" {\r\n + nested_map = {\r\n + \"examplekey\" = {},\r\n }\r\n }\r\n```\r\n\r\nFollowing new unit test creation, failures could be seen from the PlanResourceChange RPC:\r\n\r\n```\r\n--- FAIL: TestServerPlanResourceChange_AttributeRoundtrip (0.00s)\r\n --- FAIL: TestServerPlanResourceChange_AttributeRoundtrip/create-list-nested-optional-and-computed-unknown-element (0.00s)\r\n /Users/bflad/src/github.com/hashicorp/terraform-plugin-framework/internal/fwserver/server_planresourcechange_test.go:15072: unexpected difference:   &fwserver.PlanResourceChangeResponse{\r\n   \tDiagnostics: nil,\r\n   \tPlannedPrivate: &{Provider: &{data: {}}},\r\n   \tPlannedState: &tfsdk.State{\r\n - \t\tRaw: s`tftypes.Object[\"list_nested_attribute\":tftypes.List[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"list_nested_attribute\":tftypes.List[tftypes.Object[\"string_attribute\":tftypes.String]]>>`,\r\n   \t\tSchema: schema.Schema{Attributes: {\"list_nested_attribute\": schema.ListNestedAttribute{NestedObject: {...}, Optional: true, Computed: true}}},\r\n   \t},\r\n   \tRequiresReplace: s\"[]\",\r\n   }\r\n --- FAIL: TestServerPlanResourceChange_AttributeRoundtrip/create-list-nested-optional-null-element (0.00s)\r\n /Users/bflad/src/github.com/hashicorp/terraform-plugin-framework/internal/fwserver/server_planresourcechange_test.go:15072: unexpected difference:   &fwserver.PlanResourceChangeResponse{\r\n   \tDiagnostics: nil,\r\n   \tPlannedPrivate: &{Provider: &{data: {}}},\r\n   \tPlannedState: &tfsdk.State{\r\n - \t\tRaw: s`tftypes.Object[\"list_nested_attribute\":tftypes.List[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"list_nested_attribute\":tftypes.List[tftypes.Object[\"string_attribute\":tftypes.String]]>>`,\r\n   \t\tSchema: schema.Schema{Attributes: {\"list_nested_attribute\": schema.ListNestedAttribute{NestedObject: {...}, Optional: true}}},\r\n   \t},\r\n   \tRequiresReplace: s\"[]\",\r\n   }\r\n --- FAIL: TestServerPlanResourceChange_AttributeRoundtrip/create-list-nested-optional-and-computed-null-element (0.00s)\r\n /Users/bflad/src/github.com/hashicorp/terraform-plugin-framework/internal/fwserver/server_planresourcechange_test.go:15072: unexpected difference:   &fwserver.PlanResourceChangeResponse{\r\n   \tDiagnostics: nil,\r\n   \tPlannedPrivate: &{Provider: &{data: {}}},\r\n   \tPlannedState: &tfsdk.State{\r\n - \t\tRaw: s`tftypes.Object[\"list_nested_attribute\":tftypes.List[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"list_nested_attribute\":tftypes.List[tftypes.Object[\"string_attribute\":tftypes.String]]>>`,\r\n   \t\tSchema: schema.Schema{Attributes: {\"list_nested_attribute\": schema.ListNestedAttribute{NestedObject: {...}, Optional: true, Computed: true}}},\r\n   \t},\r\n   \tRequiresReplace: s\"[]\",\r\n   }\r\n --- FAIL: TestServerPlanResourceChange_AttributeRoundtrip/create-map-nested-optional-and-computed-null-element (0.00s)\r\n /Users/bflad/src/github.com/hashicorp/terraform-plugin-framework/internal/fwserver/server_planresourcechange_test.go:15072: unexpected difference:   &fwserver.PlanResourceChangeResponse{\r\n   \tDiagnostics: nil,\r\n   \tPlannedPrivate: &{Provider: &{data: {}}},\r\n   \tPlannedState: &tfsdk.State{\r\n - \t\tRaw: s`tftypes.Object[\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]<\"null\":tftypes.Object[\"string_attribute\":tftypes.String]<\"string_att`...,\r\n + \t\tRaw: s`tftypes.Object[\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]<\"null\":tftypes.Object[\"string_attribute\":tftypes.String]>>`,\r\n   \t\tSchema: schema.Schema{Attributes: {\"map_nested_attribute\": schema.MapNestedAttribute{NestedObject: {...}, Optional: true, Computed: true}}},\r\n   \t},\r\n   \tRequiresReplace: s\"[]\",\r\n   }\r\n --- FAIL: TestServerPlanResourceChange_AttributeRoundtrip/create-map-nested-optional-unknown-element (0.00s)\r\n /Users/bflad/src/github.com/hashicorp/terraform-plugin-framework/internal/fwserver/server_planresourcechange_test.go:15072: unexpected difference:   &fwserver.PlanResourceChangeResponse{\r\n   \tDiagnostics: nil,\r\n   \tPlannedPrivate: &{Provider: &{data: {}}},\r\n   \tPlannedState: &tfsdk.State{\r\n - \t\tRaw: s`tftypes.Object[\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]<\"null\":tftypes.Object[\"string_attribute\":tftypes.String]<\"string_att`...,\r\n + \t\tRaw: s`tftypes.Object[\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]<\"null\":tftypes.Object[\"string_attribute\":tftypes.String]>>`,\r\n   \t\tSchema: schema.Schema{Attributes: {\"map_nested_attribute\": schema.MapNestedAttribute{NestedObject: {...}, Optional: true}}},\r\n   \t},\r\n   \tRequiresReplace: s\"[]\",\r\n   }\r\n --- FAIL: TestServerPlanResourceChange_AttributeRoundtrip/create-set-nested-optional-unknown-element (0.00s)\r\n /Users/bflad/src/github.com/hashicorp/terraform-plugin-framework/internal/fwserver/server_planresourcechange_test.go:15072: unexpected difference:   &fwserver.PlanResourceChangeResponse{\r\n   \tDiagnostics: nil,\r\n   \tPlannedPrivate: &{Provider: &{data: {}}},\r\n   \tPlannedState: &tfsdk.State{\r\n - \t\tRaw: s`tftypes.Object[\"set_nested_attribute\":tftypes.Set[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"set_nested_attribute\":tftypes.Set[tftypes.Object[\"string_attribute\":tftypes.String]]>>`,\r\n   \t\tSchema: schema.Schema{Attributes: {\"set_nested_attribute\": schema.SetNestedAttribute{NestedObject: {...}, Optional: true}}},\r\n   \t},\r\n   \tRequiresReplace: s\"[]\",\r\n   }\r\n --- FAIL: TestServerPlanResourceChange_AttributeRoundtrip/create-set-nested-optional-null-element (0.00s)\r\n /Users/bflad/src/github.com/hashicorp/terraform-plugin-framework/internal/fwserver/server_planresourcechange_test.go:15072: unexpected difference:   &fwserver.PlanResourceChangeResponse{\r\n   \tDiagnostics: nil,\r\n   \tPlannedPrivate: &{Provider: &{data: {}}},\r\n   \tPlannedState: &tfsdk.State{\r\n - \t\tRaw: s`tftypes.Object[\"set_nested_attribute\":tftypes.Set[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"set_nested_attribute\":tftypes.Set[tftypes.Object[\"string_attribute\":tftypes.String]]>>`,\r\n   \t\tSchema: schema.Schema{Attributes: {\"set_nested_attribute\": schema.SetNestedAttribute{NestedObject: {...}, Optional: true}}},\r\n   \t},\r\n   \tRequiresReplace: s\"[]\",\r\n   }\r\n --- FAIL: TestServerPlanResourceChange_AttributeRoundtrip/create-set-nested-optional-and-computed-null-element (0.00s)\r\n /Users/bflad/src/github.com/hashicorp/terraform-plugin-framework/internal/fwserver/server_planresourcechange_test.go:15072: unexpected difference:   &fwserver.PlanResourceChangeResponse{\r\n   \tDiagnostics: nil,\r\n   \tPlannedPrivate: &{Provider: &{data: {}}},\r\n   \tPlannedState: &tfsdk.State{\r\n - \t\tRaw: s`tftypes.Object[\"set_nested_attribute\":tftypes.Set[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"set_nested_attribute\":tftypes.Set[tftypes.Object[\"string_attribute\":tftypes.String]]>>`,\r\n   \t\tSchema: schema.Schema{Attributes: {\"set_nested_attribute\": schema.SetNestedAttribute{NestedObject: {...}, Optional: true, Computed: true}}},\r\n   \t},\r\n   \tRequiresReplace: s\"[]\",\r\n   }\r\n --- FAIL: TestServerPlanResourceChange_AttributeRoundtrip/create-map-nested-optional-null-element (0.00s)\r\n /Users/bflad/src/github.com/hashicorp/terraform-plugin-framework/internal/fwserver/server_planresourcechange_test.go:15072: unexpected difference:   &fwserver.PlanResourceChangeResponse{\r\n   \tDiagnostics: nil,\r\n   \tPlannedPrivate: &{Provider: &{data: {}}},\r\n   \tPlannedState: &tfsdk.State{\r\n - \t\tRaw: s`tftypes.Object[\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]<\"null\":tftypes.Object[\"string_attribute\":tftypes.String]<\"string_att`...,\r\n + \t\tRaw: s`tftypes.Object[\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]<\"null\":tftypes.Object[\"string_attribute\":tftypes.String]>>`,\r\n   \t\tSchema: schema.Schema{Attributes: {\"map_nested_attribute\": schema.MapNestedAttribute{NestedObject: {...}, Optional: true}}},\r\n   \t},\r\n   \tRequiresReplace: s\"[]\",\r\n   }\r\n --- FAIL: TestServerPlanResourceChange_AttributeRoundtrip/create-set-nested-optional-and-computed-unknown-element (0.00s)\r\n /Users/bflad/src/github.com/hashicorp/terraform-plugin-framework/internal/fwserver/server_planresourcechange_test.go:15072: unexpected difference:   &fwserver.PlanResourceChangeResponse{\r\n   \tDiagnostics: nil,\r\n   \tPlannedPrivate: &{Provider: &{data: {}}},\r\n   \tPlannedState: &tfsdk.State{\r\n - \t\tRaw: s`tftypes.Object[\"set_nested_attribute\":tftypes.Set[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"set_nested_attribute\":tftypes.Set[tftypes.Object[\"string_attribute\":tftypes.String]]>>`,\r\n   \t\tSchema: schema.Schema{Attributes: {\"set_nested_attribute\": schema.SetNestedAttribute{NestedObject: {...}, Optional: true, Computed: true}}},\r\n   \t},\r\n   \tRequiresReplace: s\"[]\",\r\n   }\r\n --- FAIL: TestServerPlanResourceChange_AttributeRoundtrip/create-map-nested-optional-and-computed-unknown-element (0.00s)\r\n /Users/bflad/src/github.com/hashicorp/terraform-plugin-framework/internal/fwserver/server_planresourcechange_test.go:15072: unexpected difference:   &fwserver.PlanResourceChangeResponse{\r\n   \tDiagnostics: nil,\r\n   \tPlannedPrivate: &{Provider: &{data: {}}},\r\n   \tPlannedState: &tfsdk.State{\r\n - \t\tRaw: s`tftypes.Object[\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]<\"null\":tftypes.Object[\"string_attribute\":tftypes.String]<\"string_att`...,\r\n + \t\tRaw: s`tftypes.Object[\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]<\"null\":tftypes.Object[\"string_attribute\":tftypes.String]>>`,\r\n   \t\tSchema: schema.Schema{Attributes: {\"map_nested_attribute\": schema.MapNestedAttribute{NestedObject: {...}, Optional: true, Computed: true}}},\r\n   \t},\r\n   \tRequiresReplace: s\"[]\",\r\n   }\r\n --- FAIL: TestServerPlanResourceChange_AttributeRoundtrip/create-list-nested-optional-unknown-element (0.00s)\r\n /Users/bflad/src/github.com/hashicorp/terraform-plugin-framework/internal/fwserver/server_planresourcechange_test.go:15072: unexpected difference:   &fwserver.PlanResourceChangeResponse{\r\n   \tDiagnostics: nil,\r\n   \tPlannedPrivate: &{Provider: &{data: {}}},\r\n   \tPlannedState: &tfsdk.State{\r\n - \t\tRaw: s`tftypes.Object[\"list_nested_attribute\":tftypes.List[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"list_nested_attribute\":tftypes.List[tftypes.Object[\"string_attribute\":tftypes.String]]>>`,\r\n   \t\tSchema: schema.Schema{Attributes: {\"list_nested_attribute\": schema.ListNestedAttribute{NestedObject: {...}, Optional: true}}},\r\n   \t},\r\n   \tRequiresReplace: s\"[]\",\r\n   }\r\n```\r\n\r\nThe plan modification logic was updated to return a null/unknown object early, but only after the object plan modifiers have run. This ensures that provider developers still have an escape hatch to run logic before the framework skips the nested attributes.\r\n\r\nIf provider developers need to override this logic change, object-level plan modifiers can convert a null/unknown object into a known object will all null/unknown attributes, which then the framework will run nested attribute plan modification on those attributes. If this is a common use case, a feature request can be submitted to consider including this type of object plan modifier in the framework.","shortMessageHtmlLink":"internal/fwserver: Skip automatic object state conversion and nested …"}},{"before":"90ae2361e5bbd3bf1dba80cef01324b7f0130346","after":"10e88cf79d97ecc798142c3c21863857f858b3ba","ref":"refs/heads/bflad/nestedattributeobject-skip-known-valuing","pushedAt":"2024-04-29T21:03:18.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"bflad","name":"Brian Flad","path":"/bflad","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/189114?s=80&v=4"},"commit":{"message":"Update CHANGELOG for #995","shortMessageHtmlLink":"Update CHANGELOG for #995"}},{"before":null,"after":"90ae2361e5bbd3bf1dba80cef01324b7f0130346","ref":"refs/heads/bflad/nestedattributeobject-skip-known-valuing","pushedAt":"2024-04-29T20:56:35.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"bflad","name":"Brian Flad","path":"/bflad","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/189114?s=80&v=4"},"commit":{"message":"internal/fwserver: Skip automatic object state conversion and nested attributes plan modification if object is null or unknown\n\nReference: https://github.com/hashicorp/terraform-plugin-framework/issues/993\n\nBy data definition, a null or unknown object has no underlying data where nested attributes should run plan modification. By Terraform data consistency rules, a null or unknown object should be preserved as-is (unless it is an unknown value being refined into a more known value), however this was not the case where a collection-based nested attribute had a null or unknown object, such as this example configuration:\n\n```\nresource \"examplecloud_thing\" \"example\" {\n nested_map = {\n examplekey = null # this was previously problematic\n }\n}\n```\n\nPreviously, a null or unknown object would be errantly transformed by the framework plan modification logic into a known object with null/unknown attributes. This could be seen in human-readable Terraform plans, such as (`{}` below):\n\n```\n # examplecloud_thing.example will be created\n + resource \"examplecloud_thing\" \"example\" {\n + nested_map = {\n + \"examplekey\" = {},\n }\n }\n```\n\nFollowing new unit test creation, failures could be seen from the PlanResourceChange RPC:\n\n```\n--- FAIL: TestServerPlanResourceChange_AttributeRoundtrip (0.00s)\n --- FAIL: TestServerPlanResourceChange_AttributeRoundtrip/create-list-nested-optional-and-computed-unknown-element (0.00s)\n /Users/bflad/src/github.com/hashicorp/terraform-plugin-framework/internal/fwserver/server_planresourcechange_test.go:15072: unexpected difference:   &fwserver.PlanResourceChangeResponse{\n   \tDiagnostics: nil,\n   \tPlannedPrivate: &{Provider: &{data: {}}},\n   \tPlannedState: &tfsdk.State{\n - \t\tRaw: s`tftypes.Object[\"list_nested_attribute\":tftypes.List[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"list_nested_attribute\":tftypes.List[tftypes.Object[\"string_attribute\":tftypes.String]]>>`,\n   \t\tSchema: schema.Schema{Attributes: {\"list_nested_attribute\": schema.ListNestedAttribute{NestedObject: {...}, Optional: true, Computed: true}}},\n   \t},\n   \tRequiresReplace: s\"[]\",\n   }\n --- FAIL: TestServerPlanResourceChange_AttributeRoundtrip/create-list-nested-optional-null-element (0.00s)\n /Users/bflad/src/github.com/hashicorp/terraform-plugin-framework/internal/fwserver/server_planresourcechange_test.go:15072: unexpected difference:   &fwserver.PlanResourceChangeResponse{\n   \tDiagnostics: nil,\n   \tPlannedPrivate: &{Provider: &{data: {}}},\n   \tPlannedState: &tfsdk.State{\n - \t\tRaw: s`tftypes.Object[\"list_nested_attribute\":tftypes.List[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"list_nested_attribute\":tftypes.List[tftypes.Object[\"string_attribute\":tftypes.String]]>>`,\n   \t\tSchema: schema.Schema{Attributes: {\"list_nested_attribute\": schema.ListNestedAttribute{NestedObject: {...}, Optional: true}}},\n   \t},\n   \tRequiresReplace: s\"[]\",\n   }\n --- FAIL: TestServerPlanResourceChange_AttributeRoundtrip/create-list-nested-optional-and-computed-null-element (0.00s)\n /Users/bflad/src/github.com/hashicorp/terraform-plugin-framework/internal/fwserver/server_planresourcechange_test.go:15072: unexpected difference:   &fwserver.PlanResourceChangeResponse{\n   \tDiagnostics: nil,\n   \tPlannedPrivate: &{Provider: &{data: {}}},\n   \tPlannedState: &tfsdk.State{\n - \t\tRaw: s`tftypes.Object[\"list_nested_attribute\":tftypes.List[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"list_nested_attribute\":tftypes.List[tftypes.Object[\"string_attribute\":tftypes.String]]>>`,\n   \t\tSchema: schema.Schema{Attributes: {\"list_nested_attribute\": schema.ListNestedAttribute{NestedObject: {...}, Optional: true, Computed: true}}},\n   \t},\n   \tRequiresReplace: s\"[]\",\n   }\n --- FAIL: TestServerPlanResourceChange_AttributeRoundtrip/create-map-nested-optional-and-computed-null-element (0.00s)\n /Users/bflad/src/github.com/hashicorp/terraform-plugin-framework/internal/fwserver/server_planresourcechange_test.go:15072: unexpected difference:   &fwserver.PlanResourceChangeResponse{\n   \tDiagnostics: nil,\n   \tPlannedPrivate: &{Provider: &{data: {}}},\n   \tPlannedState: &tfsdk.State{\n - \t\tRaw: s`tftypes.Object[\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]<\"null\":tftypes.Object[\"string_attribute\":tftypes.String]<\"string_att`...,\n + \t\tRaw: s`tftypes.Object[\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]<\"null\":tftypes.Object[\"string_attribute\":tftypes.String]>>`,\n   \t\tSchema: schema.Schema{Attributes: {\"map_nested_attribute\": schema.MapNestedAttribute{NestedObject: {...}, Optional: true, Computed: true}}},\n   \t},\n   \tRequiresReplace: s\"[]\",\n   }\n --- FAIL: TestServerPlanResourceChange_AttributeRoundtrip/create-map-nested-optional-unknown-element (0.00s)\n /Users/bflad/src/github.com/hashicorp/terraform-plugin-framework/internal/fwserver/server_planresourcechange_test.go:15072: unexpected difference:   &fwserver.PlanResourceChangeResponse{\n   \tDiagnostics: nil,\n   \tPlannedPrivate: &{Provider: &{data: {}}},\n   \tPlannedState: &tfsdk.State{\n - \t\tRaw: s`tftypes.Object[\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]<\"null\":tftypes.Object[\"string_attribute\":tftypes.String]<\"string_att`...,\n + \t\tRaw: s`tftypes.Object[\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]<\"null\":tftypes.Object[\"string_attribute\":tftypes.String]>>`,\n   \t\tSchema: schema.Schema{Attributes: {\"map_nested_attribute\": schema.MapNestedAttribute{NestedObject: {...}, Optional: true}}},\n   \t},\n   \tRequiresReplace: s\"[]\",\n   }\n --- FAIL: TestServerPlanResourceChange_AttributeRoundtrip/create-set-nested-optional-unknown-element (0.00s)\n /Users/bflad/src/github.com/hashicorp/terraform-plugin-framework/internal/fwserver/server_planresourcechange_test.go:15072: unexpected difference:   &fwserver.PlanResourceChangeResponse{\n   \tDiagnostics: nil,\n   \tPlannedPrivate: &{Provider: &{data: {}}},\n   \tPlannedState: &tfsdk.State{\n - \t\tRaw: s`tftypes.Object[\"set_nested_attribute\":tftypes.Set[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"set_nested_attribute\":tftypes.Set[tftypes.Object[\"string_attribute\":tftypes.String]]>>`,\n   \t\tSchema: schema.Schema{Attributes: {\"set_nested_attribute\": schema.SetNestedAttribute{NestedObject: {...}, Optional: true}}},\n   \t},\n   \tRequiresReplace: s\"[]\",\n   }\n --- FAIL: TestServerPlanResourceChange_AttributeRoundtrip/create-set-nested-optional-null-element (0.00s)\n /Users/bflad/src/github.com/hashicorp/terraform-plugin-framework/internal/fwserver/server_planresourcechange_test.go:15072: unexpected difference:   &fwserver.PlanResourceChangeResponse{\n   \tDiagnostics: nil,\n   \tPlannedPrivate: &{Provider: &{data: {}}},\n   \tPlannedState: &tfsdk.State{\n - \t\tRaw: s`tftypes.Object[\"set_nested_attribute\":tftypes.Set[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"set_nested_attribute\":tftypes.Set[tftypes.Object[\"string_attribute\":tftypes.String]]>>`,\n   \t\tSchema: schema.Schema{Attributes: {\"set_nested_attribute\": schema.SetNestedAttribute{NestedObject: {...}, Optional: true}}},\n   \t},\n   \tRequiresReplace: s\"[]\",\n   }\n --- FAIL: TestServerPlanResourceChange_AttributeRoundtrip/create-set-nested-optional-and-computed-null-element (0.00s)\n /Users/bflad/src/github.com/hashicorp/terraform-plugin-framework/internal/fwserver/server_planresourcechange_test.go:15072: unexpected difference:   &fwserver.PlanResourceChangeResponse{\n   \tDiagnostics: nil,\n   \tPlannedPrivate: &{Provider: &{data: {}}},\n   \tPlannedState: &tfsdk.State{\n - \t\tRaw: s`tftypes.Object[\"set_nested_attribute\":tftypes.Set[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"set_nested_attribute\":tftypes.Set[tftypes.Object[\"string_attribute\":tftypes.String]]>>`,\n   \t\tSchema: schema.Schema{Attributes: {\"set_nested_attribute\": schema.SetNestedAttribute{NestedObject: {...}, Optional: true, Computed: true}}},\n   \t},\n   \tRequiresReplace: s\"[]\",\n   }\n --- FAIL: TestServerPlanResourceChange_AttributeRoundtrip/create-map-nested-optional-null-element (0.00s)\n /Users/bflad/src/github.com/hashicorp/terraform-plugin-framework/internal/fwserver/server_planresourcechange_test.go:15072: unexpected difference:   &fwserver.PlanResourceChangeResponse{\n   \tDiagnostics: nil,\n   \tPlannedPrivate: &{Provider: &{data: {}}},\n   \tPlannedState: &tfsdk.State{\n - \t\tRaw: s`tftypes.Object[\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]<\"null\":tftypes.Object[\"string_attribute\":tftypes.String]<\"string_att`...,\n + \t\tRaw: s`tftypes.Object[\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]<\"null\":tftypes.Object[\"string_attribute\":tftypes.String]>>`,\n   \t\tSchema: schema.Schema{Attributes: {\"map_nested_attribute\": schema.MapNestedAttribute{NestedObject: {...}, Optional: true}}},\n   \t},\n   \tRequiresReplace: s\"[]\",\n   }\n --- FAIL: TestServerPlanResourceChange_AttributeRoundtrip/create-set-nested-optional-and-computed-unknown-element (0.00s)\n /Users/bflad/src/github.com/hashicorp/terraform-plugin-framework/internal/fwserver/server_planresourcechange_test.go:15072: unexpected difference:   &fwserver.PlanResourceChangeResponse{\n   \tDiagnostics: nil,\n   \tPlannedPrivate: &{Provider: &{data: {}}},\n   \tPlannedState: &tfsdk.State{\n - \t\tRaw: s`tftypes.Object[\"set_nested_attribute\":tftypes.Set[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"set_nested_attribute\":tftypes.Set[tftypes.Object[\"string_attribute\":tftypes.String]]>>`,\n   \t\tSchema: schema.Schema{Attributes: {\"set_nested_attribute\": schema.SetNestedAttribute{NestedObject: {...}, Optional: true, Computed: true}}},\n   \t},\n   \tRequiresReplace: s\"[]\",\n   }\n --- FAIL: TestServerPlanResourceChange_AttributeRoundtrip/create-map-nested-optional-and-computed-unknown-element (0.00s)\n /Users/bflad/src/github.com/hashicorp/terraform-plugin-framework/internal/fwserver/server_planresourcechange_test.go:15072: unexpected difference:   &fwserver.PlanResourceChangeResponse{\n   \tDiagnostics: nil,\n   \tPlannedPrivate: &{Provider: &{data: {}}},\n   \tPlannedState: &tfsdk.State{\n - \t\tRaw: s`tftypes.Object[\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]<\"null\":tftypes.Object[\"string_attribute\":tftypes.String]<\"string_att`...,\n + \t\tRaw: s`tftypes.Object[\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]<\"null\":tftypes.Object[\"string_attribute\":tftypes.String]>>`,\n   \t\tSchema: schema.Schema{Attributes: {\"map_nested_attribute\": schema.MapNestedAttribute{NestedObject: {...}, Optional: true, Computed: true}}},\n   \t},\n   \tRequiresReplace: s\"[]\",\n   }\n --- FAIL: TestServerPlanResourceChange_AttributeRoundtrip/create-list-nested-optional-unknown-element (0.00s)\n /Users/bflad/src/github.com/hashicorp/terraform-plugin-framework/internal/fwserver/server_planresourcechange_test.go:15072: unexpected difference:   &fwserver.PlanResourceChangeResponse{\n   \tDiagnostics: nil,\n   \tPlannedPrivate: &{Provider: &{data: {}}},\n   \tPlannedState: &tfsdk.State{\n - \t\tRaw: s`tftypes.Object[\"list_nested_attribute\":tftypes.List[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"list_nested_attribute\":tftypes.List[tftypes.Object[\"string_attribute\":tftypes.String]]>>`,\n   \t\tSchema: schema.Schema{Attributes: {\"list_nested_attribute\": schema.ListNestedAttribute{NestedObject: {...}, Optional: true}}},\n   \t},\n   \tRequiresReplace: s\"[]\",\n   }\n```\n\n```\n--- FAIL: TestServerPlanResourceChange_AttributeRoundtrip (0.00s)\n --- FAIL: TestServerPlanResourceChange_AttributeRoundtrip/create-list-nested-optional-and-computed-null-element (0.00s)\n /Users/bflad/src/github.com/hashicorp/terraform-plugin-framework/internal/fwserver/server_planresourcechange_test.go:15072: unexpected difference: &fwserver.PlanResourceChangeResponse{\n \tDiagnostics: nil,\n \tPlannedPrivate: &{Provider: &{data: {}}},\n \tPlannedState: &tfsdk.State{\n - \t\tRaw: s`tftypes.Object[\"list_nested_attribute\":tftypes.List[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"list_nested_attribute\":tftypes.List[tftypes.Object[\"string_attribute\":tftypes.String]]>>`,\n + \t\tRaw: s`tftypes.Object[\"list_nested_attribute\":tftypes.List[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"list_nested_attribute\":tftypes.List[tftypes.Object[\"string_attribute\":tftypes.String]]>>`,\n \t\tSchema: schema.Schema{Attributes: {\"list_nested_attribute\": schema.ListNestedAttribute{NestedObject: {...}, Optional: true, Computed: true}}},\n \t},\n \tRequiresReplace: s\"[]\",\n }\n --- FAIL: TestServerPlanResourceChange_AttributeRoundtrip/create-set-nested-optional-and-computed-null-element (0.00s)\n /Users/bflad/src/github.com/hashicorp/terraform-plugin-framework/internal/fwserver/server_planresourcechange_test.go:15072: unexpected difference: &fwserver.PlanResourceChangeResponse{\n \tDiagnostics: nil,\n \tPlannedPrivate: &{Provider: &{data: {}}},\n \tPlannedState: &tfsdk.State{\n - \t\tRaw: s`tftypes.Object[\"set_nested_attribute\":tftypes.Set[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"set_nested_attribute\":tftypes.Set[tftypes.Object[\"string_attribute\":tftypes.String]]>>`,\n + \t\tRaw: s`tftypes.Object[\"set_nested_attribute\":tftypes.Set[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"set_nested_attribute\":tftypes.Set[tftypes.Object[\"string_attribute\":tftypes.String]]>>`,\n \t\tSchema: schema.Schema{Attributes: {\"set_nested_attribute\": schema.SetNestedAttribute{NestedObject: {...}, Optional: true, Computed: true}}},\n \t},\n \tRequiresReplace: s\"[]\",\n }\n --- FAIL: TestServerPlanResourceChange_AttributeRoundtrip/create-map-nested-optional-and-computed-null-element (0.00s)\n /Users/bflad/src/github.com/hashicorp/terraform-plugin-framework/internal/fwserver/server_planresourcechange_test.go:15072: unexpected difference: &fwserver.PlanResourceChangeResponse{\n \tDiagnostics: nil,\n \tPlannedPrivate: &{Provider: &{data: {}}},\n \tPlannedState: &tfsdk.State{\n - \t\tRaw: s`tftypes.Object[\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]<\"null\":tftypes.Object[\"string_attribute\":tftypes.String]>>`,\n + \t\tRaw: s`tftypes.Object[\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]]<\"map_nested_attribute\":tftypes.Map[tftypes.Object[\"string_attribute\":tftypes.String]]<\"null\":tftypes.Object[\"string_attribute\":tftypes.String]>>`,\n \t\tSchema: schema.Schema{Attributes: {\"map_nested_attribute\": schema.MapNestedAttribute{NestedObject: {...}, Optional: true, Computed: true}}},\n \t},\n \tRequiresReplace: s\"[]\",\n }\n```\n\nThe plan modification logic was updated to return a null/unknown object early, but only after the object plan modifiers have run. This ensures that provider developers still have an escape hatch to run logic before the framework skips the nested attributes.\n\nIf provider developers need to override this logic change, object-level plan modifiers can convert a null/unknown object into a known object will all null/unknown attributes, which then the framework will run nested attribute plan modification on those attributes. If this is a common use case, a feature request can be submitted to consider including this type of object plan modifier in the framework.","shortMessageHtmlLink":"internal/fwserver: Skip automatic object state conversion and nested …"}},{"before":"caf21e7881604a1926a30f5178f1caa1ba5b1c72","after":"0cca037d9e1a64449ef2a0e0685f65ccb91c4b2d","ref":"refs/heads/main","pushedAt":"2024-04-29T08:07:21.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"bendbennett","name":"Benjamin Bennett","path":"/bendbennett","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/4332332?s=80&v=4"},"commit":{"message":"Result of tsccr-helper -log-level=info gha update -latest . (#994)\n\nCo-authored-by: hashicorp-tsccr[bot] ","shortMessageHtmlLink":"Result of tsccr-helper -log-level=info gha update -latest . (#994)"}},{"before":"0e4b06adee35cdb1d55d511a4100b381e09ed7a6","after":null,"ref":"refs/heads/tsccr-auto-pinning/trusted/2024-04-29","pushedAt":"2024-04-29T08:07:21.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"bendbennett","name":"Benjamin Bennett","path":"/bendbennett","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/4332332?s=80&v=4"}},{"before":null,"after":"0e4b06adee35cdb1d55d511a4100b381e09ed7a6","ref":"refs/heads/tsccr-auto-pinning/trusted/2024-04-29","pushedAt":"2024-04-29T06:07:23.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"hashicorp-tsccr[bot]","name":null,"path":"/apps/hashicorp-tsccr","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/312369?s=80&v=4"},"commit":{"message":"Result of tsccr-helper -log-level=info gha update -latest .","shortMessageHtmlLink":"Result of tsccr-helper -log-level=info gha update -latest ."}},{"before":"a30a67913fc6961db0783a40e15e4ecc8382e7e3","after":"2e6695e46bc012906c165962915b13fcc5aa3ea2","ref":"refs/heads/av/embedded-struct-discovery","pushedAt":"2024-04-26T16:45:46.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"austinvalle","name":"Austin Valle","path":"/austinvalle","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/8650838?s=80&v=4"},"commit":{"message":"add comment todo","shortMessageHtmlLink":"add comment todo"}},{"before":"54a1e9d1e4fbd65318bcc064ef2c8455f3cea67a","after":"a30a67913fc6961db0783a40e15e4ecc8382e7e3","ref":"refs/heads/av/embedded-struct-discovery","pushedAt":"2024-04-26T15:58:39.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"austinvalle","name":"Austin Valle","path":"/austinvalle","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/8650838?s=80&v=4"},"commit":{"message":"switch getStructTags to use an index sequence + utilize the type for retrieving tags","shortMessageHtmlLink":"switch getStructTags to use an index sequence + utilize the type for …"}},{"before":"caf21e7881604a1926a30f5178f1caa1ba5b1c72","after":"54a1e9d1e4fbd65318bcc064ef2c8455f3cea67a","ref":"refs/heads/av/embedded-struct-discovery","pushedAt":"2024-04-26T13:53:01.000Z","pushType":"push","commitsCount":5,"pusher":{"login":"austinvalle","name":"Austin Valle","path":"/austinvalle","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/8650838?s=80&v=4"},"commit":{"message":"Merge branch 'embedded_structs_in_models' into av/embedded-struct-discovery","shortMessageHtmlLink":"Merge branch 'embedded_structs_in_models' into av/embedded-struct-dis…"}},{"before":null,"after":"caf21e7881604a1926a30f5178f1caa1ba5b1c72","ref":"refs/heads/av/embedded-struct-discovery","pushedAt":"2024-04-26T13:51:27.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"austinvalle","name":"Austin Valle","path":"/austinvalle","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/8650838?s=80&v=4"},"commit":{"message":"function: Mention that return documentation is expected in definition documentation (#992)\n\nFollowup from an out-of-band conversation. The website documentation for returns already mentions this, but it was missing from the Go package documentation.","shortMessageHtmlLink":"function: Mention that return documentation is expected in definition…"}},{"before":"c8bd02aba62cde420857346eb98e69d88a86e8e9","after":null,"ref":"refs/heads/av/embedded-structs","pushedAt":"2024-04-26T13:50:15.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"austinvalle","name":"Austin Valle","path":"/austinvalle","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/8650838?s=80&v=4"}},{"before":"caf21e7881604a1926a30f5178f1caa1ba5b1c72","after":"c8bd02aba62cde420857346eb98e69d88a86e8e9","ref":"refs/heads/av/embedded-structs","pushedAt":"2024-04-25T22:02:29.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"austinvalle","name":"Austin Valle","path":"/austinvalle","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/8650838?s=80&v=4"},"commit":{"message":"initial proposed commit","shortMessageHtmlLink":"initial proposed commit"}},{"before":null,"after":"caf21e7881604a1926a30f5178f1caa1ba5b1c72","ref":"refs/heads/av/embedded-structs","pushedAt":"2024-04-25T17:15:37.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"austinvalle","name":"Austin Valle","path":"/austinvalle","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/8650838?s=80&v=4"},"commit":{"message":"function: Mention that return documentation is expected in definition documentation (#992)\n\nFollowup from an out-of-band conversation. The website documentation for returns already mentions this, but it was missing from the Go package documentation.","shortMessageHtmlLink":"function: Mention that return documentation is expected in definition…"}},{"before":"1266a7b780794bcfe1042254cb40b541681cbb64","after":null,"ref":"refs/heads/bflad/function-return-documentation","pushedAt":"2024-04-25T13:16:39.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"bflad","name":"Brian Flad","path":"/bflad","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/189114?s=80&v=4"}},{"before":"a150eeff59f817c15809b25be89fbb68acc8f772","after":"caf21e7881604a1926a30f5178f1caa1ba5b1c72","ref":"refs/heads/main","pushedAt":"2024-04-25T13:16:38.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"bflad","name":"Brian Flad","path":"/bflad","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/189114?s=80&v=4"},"commit":{"message":"function: Mention that return documentation is expected in definition documentation (#992)\n\nFollowup from an out-of-band conversation. The website documentation for returns already mentions this, but it was missing from the Go package documentation.","shortMessageHtmlLink":"function: Mention that return documentation is expected in definition…"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAAERMSVIQA","startCursor":null,"endCursor":null}},"title":"Activity · hashicorp/terraform-plugin-framework"}