Skip to content

Commit 8889464

Browse files
committed
Format output text for rule results to improve readability
Previously, the output text for the rule results had no formatting to speak of. It was simply a single, often long, line of text. Wrapping of this text was at the mercy of whatever displayed it. When there were multiple rule results in the output it melded into a wall of dense text. The readability is improved by two formatting changes: - Format the rule level (e.g., ERROR, WARNING) text and the rule message text into separate columns - Wrap the rule message text, maintaining the column alignment after line breaks This is accomplished by putting the result output for each rule is made into a single row, borderless table.
1 parent 24d0055 commit 8889464

File tree

4 files changed

+29
-6
lines changed

4 files changed

+29
-6
lines changed

go.mod

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ require (
2828
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect
2929
github.com/magiconair/properties v1.8.4 // indirect
3030
github.com/mitchellh/mapstructure v1.4.0 // indirect
31+
github.com/olekukonko/tablewriter v0.0.5
3132
github.com/ory/go-acc v0.2.6 // indirect
3233
github.com/ory/herodot v0.9.1 // indirect
3334
github.com/ory/jsonschema/v3 v3.0.1

go.sum

+2
Original file line numberDiff line numberDiff line change
@@ -813,6 +813,8 @@ github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn
813813
github.com/oleiade/reflections v1.0.0/go.mod h1:RbATFBbKYkVdqmSFtx13Bb/tVhR0lgOBXunWTZKeL4w=
814814
github.com/oleksandr/bonjour v0.0.0-20160508152359-5dcf00d8b228 h1:Cvfd2dOlXIPTeEkOT/h8PyK4phBngOM4at9/jlgy7d4=
815815
github.com/oleksandr/bonjour v0.0.0-20160508152359-5dcf00d8b228/go.mod h1:MGuVJ1+5TX1SCoO2Sx0eAnjpdRytYla2uC1YIZfkC9c=
816+
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
817+
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
816818
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
817819
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
818820
github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=

internal/result/result.go

+22-4
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"encoding/json"
2222
"fmt"
2323
"io"
24+
"strings"
2425
"text/template"
2526

2627
"github.com/arduino/arduino-lint/internal/configuration"
@@ -30,6 +31,7 @@ import (
3031
"github.com/arduino/arduino-lint/internal/rule/rulelevel"
3132
"github.com/arduino/arduino-lint/internal/rule/ruleresult"
3233
"github.com/arduino/go-paths-helper"
34+
"github.com/olekukonko/tablewriter"
3335
)
3436

3537
// 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
111113
}
112114

113115
summaryText := ""
116+
117+
formatRuleText := func(level rulelevel.Type, message string) string {
118+
width := 120 // Wrap text to this width
119+
prefix := fmt.Sprintf("%s: ", level)
120+
121+
formattedOutput := &strings.Builder{}
122+
table := tablewriter.NewWriter(formattedOutput)
123+
table.SetBorder(false)
124+
table.SetColumnSeparator("")
125+
table.SetNoWhiteSpace(true)
126+
table.SetColWidth(width - len(prefix))
127+
table.Append([]string{prefix, message})
128+
table.Render()
129+
130+
return formattedOutput.String()
131+
}
132+
114133
if configuration.Verbose() {
115-
summaryText = fmt.Sprintf("Rule %s result: %s", ruleConfiguration.ID, ruleResult)
134+
summaryText = fmt.Sprintf("Rule %s result: %s\n", ruleConfiguration.ID, ruleResult)
116135
// Add explanation of rule result if present.
117136
if ruleMessage != "" {
118-
summaryText += fmt.Sprintf("\n%s: %s", ruleLevel, ruleMessage)
137+
summaryText += formatRuleText(ruleLevel, ruleMessage)
119138
}
120-
summaryText += "\n"
121139
} else {
122140
if ruleResult == ruleresult.Fail {
123-
summaryText = fmt.Sprintf("%s: %s (Rule %s)\n", ruleLevel, ruleMessage, ruleConfiguration.ID)
141+
summaryText = formatRuleText(ruleLevel, fmt.Sprintf("%s (Rule %s)", ruleMessage, ruleConfiguration.ID))
124142
}
125143
}
126144

internal/result/result_test.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -77,15 +77,17 @@ func TestRecord(t *testing.T) {
7777
flags.Set("verbose", "true")
7878
require.Nil(t, configuration.Initialize(flags, projectPaths))
7979
summaryText := results.Record(lintedProject, ruleConfiguration, ruleresult.Fail, ruleOutput)
80-
assert.Equal(t, fmt.Sprintf("Rule %s result: %s\n%s: %s\n", ruleConfiguration.ID, ruleresult.Fail, rulelevel.Error, message(ruleConfiguration.MessageTemplate, ruleOutput)), summaryText)
80+
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"
81+
assert.Equal(t, outputAssertion, summaryText)
8182
summaryText = results.Record(lintedProject, ruleConfiguration, ruleresult.NotRun, ruleOutput)
8283
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")
8384
summaryText = results.Record(lintedProject, ruleConfiguration, ruleresult.Pass, "")
8485
assert.Equal(t, fmt.Sprintf("Rule %s result: %s\n", ruleConfiguration.ID, ruleresult.Pass), summaryText, "Non-failure result with no rule function output should only use preface")
8586
flags.Set("verbose", "false")
8687
require.Nil(t, configuration.Initialize(flags, projectPaths))
8788
summaryText = results.Record(lintedProject, ruleConfiguration, ruleresult.Fail, ruleOutput)
88-
assert.Equal(t, fmt.Sprintf("%s: %s (Rule %s)\n", rulelevel.Error, message(ruleConfiguration.MessageTemplate, ruleOutput), ruleConfiguration.ID), summaryText)
89+
outputAssertion = "ERROR: Path does not contain a valid Arduino library. See: \n https://arduino.github.io/arduino-cli/latest/library-specification (Rule LS001) \n"
90+
assert.Equal(t, outputAssertion, summaryText)
8991
summaryText = results.Record(lintedProject, ruleConfiguration, ruleresult.NotRun, ruleOutput)
9092
assert.Equal(t, "", summaryText, "Non-fail result should not result in output in non-verbose mode")
9193
summaryText = results.Record(lintedProject, ruleConfiguration, ruleresult.Pass, "")

0 commit comments

Comments
 (0)