diff --git a/go.mod b/go.mod index 9cc0afd9..1e203def 100644 --- a/go.mod +++ b/go.mod @@ -28,6 +28,7 @@ require ( github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect github.com/magiconair/properties v1.8.4 // indirect github.com/mitchellh/mapstructure v1.4.0 // indirect + github.com/olekukonko/tablewriter v0.0.5 github.com/ory/go-acc v0.2.6 // indirect github.com/ory/herodot v0.9.1 // indirect github.com/ory/jsonschema/v3 v3.0.1 diff --git a/go.sum b/go.sum index 48bd55cc..5e5bf031 100644 --- a/go.sum +++ b/go.sum @@ -813,6 +813,8 @@ github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn github.com/oleiade/reflections v1.0.0/go.mod h1:RbATFBbKYkVdqmSFtx13Bb/tVhR0lgOBXunWTZKeL4w= github.com/oleksandr/bonjour v0.0.0-20160508152359-5dcf00d8b228 h1:Cvfd2dOlXIPTeEkOT/h8PyK4phBngOM4at9/jlgy7d4= github.com/oleksandr/bonjour v0.0.0-20160508152359-5dcf00d8b228/go.mod h1:MGuVJ1+5TX1SCoO2Sx0eAnjpdRytYla2uC1YIZfkC9c= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= diff --git a/internal/result/result.go b/internal/result/result.go index f86303d3..65f9c3ab 100644 --- a/internal/result/result.go +++ b/internal/result/result.go @@ -21,6 +21,7 @@ import ( "encoding/json" "fmt" "io" + "strings" "text/template" "github.com/arduino/arduino-lint/internal/configuration" @@ -30,6 +31,7 @@ import ( "github.com/arduino/arduino-lint/internal/rule/rulelevel" "github.com/arduino/arduino-lint/internal/rule/ruleresult" "github.com/arduino/go-paths-helper" + "github.com/olekukonko/tablewriter" ) // Results is the global instance of the rule results result.Type struct @@ -111,16 +113,32 @@ func (results *Type) Record(lintedProject project.Type, ruleConfiguration ruleco } summaryText := "" + + formatRuleText := func(level rulelevel.Type, message string) string { + width := 120 // Wrap text to this width + prefix := fmt.Sprintf("%s: ", level) + + formattedOutput := &strings.Builder{} + table := tablewriter.NewWriter(formattedOutput) + table.SetBorder(false) + table.SetColumnSeparator("") + table.SetNoWhiteSpace(true) + table.SetColWidth(width - len(prefix)) + table.Append([]string{prefix, message}) + table.Render() + + return formattedOutput.String() + } + if configuration.Verbose() { - summaryText = fmt.Sprintf("Rule %s result: %s", ruleConfiguration.ID, ruleResult) + summaryText = fmt.Sprintf("Rule %s result: %s\n", ruleConfiguration.ID, ruleResult) // Add explanation of rule result if present. if ruleMessage != "" { - summaryText += fmt.Sprintf("\n%s: %s", ruleLevel, ruleMessage) + summaryText += formatRuleText(ruleLevel, ruleMessage) } - summaryText += "\n" } else { if ruleResult == ruleresult.Fail { - summaryText = fmt.Sprintf("%s: %s (Rule %s)\n", ruleLevel, ruleMessage, ruleConfiguration.ID) + summaryText = formatRuleText(ruleLevel, fmt.Sprintf("%s (Rule %s)", ruleMessage, ruleConfiguration.ID)) } } diff --git a/internal/result/result_test.go b/internal/result/result_test.go index 2a59a91c..22604a85 100644 --- a/internal/result/result_test.go +++ b/internal/result/result_test.go @@ -77,7 +77,8 @@ func TestRecord(t *testing.T) { flags.Set("verbose", "true") require.Nil(t, configuration.Initialize(flags, projectPaths)) summaryText := results.Record(lintedProject, ruleConfiguration, ruleresult.Fail, ruleOutput) - assert.Equal(t, fmt.Sprintf("Rule %s result: %s\n%s: %s\n", ruleConfiguration.ID, ruleresult.Fail, rulelevel.Error, message(ruleConfiguration.MessageTemplate, ruleOutput)), summaryText) + outputAssertion := "Rule LS001 result: fail\nERROR: Path does not contain a valid Arduino library. See: \n https://arduino.github.io/arduino-cli/latest/library-specification \n" + assert.Equal(t, outputAssertion, summaryText) summaryText = results.Record(lintedProject, ruleConfiguration, ruleresult.NotRun, ruleOutput) assert.Equal(t, fmt.Sprintf("Rule %s result: %s\n%s: %s\n", ruleConfiguration.ID, ruleresult.NotRun, rulelevel.Notice, ruleOutput), summaryText, "Non-fail result should not use message") summaryText = results.Record(lintedProject, ruleConfiguration, ruleresult.Pass, "") @@ -85,7 +86,8 @@ func TestRecord(t *testing.T) { flags.Set("verbose", "false") require.Nil(t, configuration.Initialize(flags, projectPaths)) summaryText = results.Record(lintedProject, ruleConfiguration, ruleresult.Fail, ruleOutput) - assert.Equal(t, fmt.Sprintf("%s: %s (Rule %s)\n", rulelevel.Error, message(ruleConfiguration.MessageTemplate, ruleOutput), ruleConfiguration.ID), summaryText) + outputAssertion = "ERROR: Path does not contain a valid Arduino library. See: \n https://arduino.github.io/arduino-cli/latest/library-specification (Rule LS001) \n" + assert.Equal(t, outputAssertion, summaryText) summaryText = results.Record(lintedProject, ruleConfiguration, ruleresult.NotRun, ruleOutput) assert.Equal(t, "", summaryText, "Non-fail result should not result in output in non-verbose mode") summaryText = results.Record(lintedProject, ruleConfiguration, ruleresult.Pass, "")