From 5308ad8bf33629a8dd9e9c1040770ade1c57764a Mon Sep 17 00:00:00 2001 From: Shreyas Goenka Date: Thu, 26 Sep 2024 16:03:49 +0200 Subject: [PATCH] split into summary and detail --- bundle/config/loader/process_include.go | 29 ++++++++++---------- bundle/config/loader/process_include_test.go | 21 +++++++++----- 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/bundle/config/loader/process_include.go b/bundle/config/loader/process_include.go index 15fb5e4c8..33b95d5b8 100644 --- a/bundle/config/loader/process_include.go +++ b/bundle/config/loader/process_include.go @@ -3,6 +3,7 @@ package loader import ( "context" "fmt" + "slices" "sort" "strings" @@ -10,7 +11,6 @@ import ( "github.com/databricks/cli/bundle/config" "github.com/databricks/cli/libs/diag" "github.com/databricks/cli/libs/dyn" - "golang.org/x/exp/maps" ) var resourceTypes = []string{ @@ -99,22 +99,20 @@ func validateSingleResourceDefined(r *config.Root, ext, typ string) diag.Diagnos return nil } - msg := strings.Builder{} - msg.WriteString(fmt.Sprintf("We recommend only defining a single %s in a file with the %s extension.\n", typ, ext)) - - // Dedup the list of resources before adding them the diagnostic message. This - // is needed because we do not dedup earlier when gathering the resources and - // it's valid to define the same resource in both the resources and targets block. - msg.WriteString("The following resources are defined or configured in this file:\n") - setOfLines := map[string]struct{}{} + detail := strings.Builder{} + detail.WriteString("The following resources are defined or configured in this file:\n") + lines := []string{} for _, r := range resources { - setOfLines[fmt.Sprintf(" - %s (%s)\n", r.key, r.typ)] = struct{}{} + lines = append(lines, fmt.Sprintf(" - %s (%s)\n", r.key, r.typ)) } // Sort the line s to print to make the output deterministic. - listOfLines := maps.Keys(setOfLines) - sort.Strings(listOfLines) - for _, l := range listOfLines { - msg.WriteString(l) + sort.Strings(lines) + // Compact the lines before writing them to the message to remove any duplicate lines. + // This is needed because we do not dedup earlier when gathering the resources + // and it's valid to define the same resource in both the resources and targets block. + lines = slices.Compact(lines) + for _, l := range lines { + detail.WriteString(l) } locations := []dyn.Location{} @@ -134,7 +132,8 @@ func validateSingleResourceDefined(r *config.Root, ext, typ string) diag.Diagnos return diag.Diagnostics{ { Severity: diag.Info, - Summary: msg.String(), + Summary: fmt.Sprintf("We recommend only defining a single %s in a file with the %s extension.", typ, ext), + Detail: detail.String(), Locations: locations, Paths: paths, }, diff --git a/bundle/config/loader/process_include_test.go b/bundle/config/loader/process_include_test.go index 1451d6fed..221fb7f63 100644 --- a/bundle/config/loader/process_include_test.go +++ b/bundle/config/loader/process_include_test.go @@ -58,7 +58,8 @@ func TestProcessIncludeValidatesFileFormat(t *testing.T) { assert.Equal(t, diag.Diagnostics{ { Severity: diag.Info, - Summary: "We recommend only defining a single job in a file with the .job.yml extension.\nThe following resources are defined or configured in this file:\n - bar (job)\n - foo (job)\n", + Summary: "We recommend only defining a single job in a file with the .job.yml extension.", + Detail: "The following resources are defined or configured in this file:\n - bar (job)\n - foo (job)\n", Locations: []dyn.Location{ {File: filepath.FromSlash("testdata/format/foo.job.yml"), Line: 4, Column: 7}, {File: filepath.FromSlash("testdata/format/foo.job.yml"), Line: 7, Column: 7}, @@ -209,7 +210,8 @@ func TestValidateFileFormat(t *testing.T) { expected: diag.Diagnostics{ { Severity: diag.Info, - Summary: "We recommend only defining a single pipeline in a file with the .pipeline.yml extension.\nThe following resources are defined or configured in this file:\n - job1 (job)\n", + Summary: "We recommend only defining a single pipeline in a file with the .pipeline.yml extension.", + Detail: "The following resources are defined or configured in this file:\n - job1 (job)\n", Locations: []dyn.Location{ {File: "foo.pipeline.yml", Line: 1, Column: 1}, {File: "foo.pipeline.yml", Line: 2, Column: 2}, @@ -242,7 +244,8 @@ func TestValidateFileFormat(t *testing.T) { expected: diag.Diagnostics{ { Severity: diag.Info, - Summary: "We recommend only defining a single job in a file with the .job.yml extension.\nThe following resources are defined or configured in this file:\n - job1 (job)\n - pipeline1 (pipeline)\n", + Summary: "We recommend only defining a single job in a file with the .job.yml extension.", + Detail: "The following resources are defined or configured in this file:\n - job1 (job)\n - pipeline1 (pipeline)\n", Locations: []dyn.Location{ {File: "foo.job.yml", Line: 1, Column: 1}, {File: "foo.job.yml", Line: 2, Column: 2}, @@ -265,7 +268,8 @@ func TestValidateFileFormat(t *testing.T) { expected: diag.Diagnostics{ { Severity: diag.Info, - Summary: "We recommend only defining a single experiment in a file with the .experiment.yml extension.\nThe following resources are defined or configured in this file:\n - job1 (job)\n - pipeline1 (pipeline)\n", + Summary: "We recommend only defining a single experiment in a file with the .experiment.yml extension.", + Detail: "The following resources are defined or configured in this file:\n - job1 (job)\n - pipeline1 (pipeline)\n", Locations: []dyn.Location{ {File: "foo.experiment.yml", Line: 1, Column: 1}, {File: "foo.experiment.yml", Line: 2, Column: 2}, @@ -288,7 +292,8 @@ func TestValidateFileFormat(t *testing.T) { expected: diag.Diagnostics{ { Severity: diag.Info, - Summary: "We recommend only defining a single job in a file with the .job.yml extension.\nThe following resources are defined or configured in this file:\n - job1 (job)\n - job2 (job)\n", + Summary: "We recommend only defining a single job in a file with the .job.yml extension.", + Detail: "The following resources are defined or configured in this file:\n - job1 (job)\n - job2 (job)\n", Locations: []dyn.Location{ {File: "foo.job.yml", Line: 1, Column: 1}, {File: "foo.job.yml", Line: 2, Column: 2}, @@ -321,7 +326,8 @@ func TestValidateFileFormat(t *testing.T) { expected: diag.Diagnostics{ { Severity: diag.Info, - Summary: "We recommend only defining a single job in a file with the .job.yml extension.\nThe following resources are defined or configured in this file:\n - job1 (job)\n - job2 (job)\n", + Summary: "We recommend only defining a single job in a file with the .job.yml extension.", + Detail: "The following resources are defined or configured in this file:\n - job1 (job)\n - job2 (job)\n", Locations: []dyn.Location{ {File: "foo.job.yml", Line: 1, Column: 1}, {File: "foo.job.yml", Line: 2, Column: 2}, @@ -344,7 +350,8 @@ func TestValidateFileFormat(t *testing.T) { expected: diag.Diagnostics{ { Severity: diag.Info, - Summary: "We recommend only defining a single job in a file with the .job.yml extension.\nThe following resources are defined or configured in this file:\n - job1 (job)\n - job2 (job)\n", + Summary: "We recommend only defining a single job in a file with the .job.yml extension.", + Detail: "The following resources are defined or configured in this file:\n - job1 (job)\n - job2 (job)\n", Locations: []dyn.Location{ {File: "foo.job.yml", Line: 1, Column: 1}, {File: "foo.job.yml", Line: 2, Column: 2},