Skip to content

Commit

Permalink
Add errorformat printer
Browse files Browse the repository at this point in the history
This is only slightly different than `simple`. The only difference is it supports errorformating and can be used by reviewdog to signify errors vs warnings.
* https://vim-jp.org/vimdoc-en/quickfix.html#error-file-format
* https://github.com/reviewdog/reviewdog#input-format
  • Loading branch information
caitlinelfring committed Sep 8, 2020
1 parent 9947a55 commit 00685a0
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 50 deletions.
37 changes: 37 additions & 0 deletions pkg/printer/errorformat.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package printer

import (
"fmt"

"github.com/get-woke/woke/pkg/result"
)

// ErrorFormat is a ErrorFormat printer meant to be read by errorformat
// https://vim-jp.org/vimdoc-en/quickfix.html#error-file-format
type ErrorFormat struct {
format string
}

// NewErrorFormat returns a new ErrorFormat printer
func NewErrorFormat() *ErrorFormat {
return &ErrorFormat{
format: "%s:%d:%d [%c] %s",
}
}

// Print prints in the format 'filename:line:column: [s] message'
// where `s` is the first character of Severity
// The formatting is meant to line up with errorformat
// "%f:%l:%c [%t] %m"
// https://vim-jp.org/vimdoc-en/quickfix.html#error-file-format
func (e *ErrorFormat) Print(fs *result.FileResults) error {
for _, r := range fs.Results {
fmt.Printf(e.format+"\n",
r.StartPosition.Filename,
r.StartPosition.Line,
r.StartPosition.Column,
r.Rule.Severity.String()[0],
r.Reason())
}
return nil
}
18 changes: 18 additions & 0 deletions pkg/printer/errorformat_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package printer

import (
"fmt"
"testing"

"github.com/stretchr/testify/assert"
)

func TestErrorformat_Print(t *testing.T) {
p := NewErrorFormat()
res := generateFileResult()
got := captureOutput(func() {
assert.NoError(t, p.Print(res))
})
expected := fmt.Sprintf("foo.txt:1:6 [w] %s\n", res.Results[0].Reason())
assert.Equal(t, expected, got)
}
4 changes: 4 additions & 0 deletions pkg/printer/printer.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,14 @@ const (
OutFormatText = "text"
OutFormatSimple = "simple"
OutFormatGitHubActions = "github-actions"
OutFormatErrorformat = "efm"
)

var OutFormats = []string{
OutFormatText,
OutFormatSimple,
OutFormatGitHubActions,
OutFormatErrorformat,
}

var OutFormatsString = strings.Join(OutFormats, ",")
Expand All @@ -37,6 +39,8 @@ func NewPrinter(f string) (Printer, error) {
p = NewSimple()
case OutFormatGitHubActions:
p = NewGitHubActions()
case OutFormatErrorformat:
p = NewErrorFormat()
default:
return p, fmt.Errorf("%s is not a valid printer type", f)
}
Expand Down
31 changes: 11 additions & 20 deletions pkg/printer/simple.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,41 +2,32 @@ package printer

import (
"fmt"
"go/token"

"github.com/get-woke/woke/pkg/result"
)

// Simple is a simple printer meant for a machine to read
type Simple struct{}
type Simple struct {
format string
}

// NewSimple returns a new simple printer
func NewSimple() *Simple {
return &Simple{}
return &Simple{
format: "%s:%d:%d: [%s] %s",
}
}

// Print prints in the format 'filename:line:column: message'
// based on golint's output: https://github.com/golang/lint/blob/738671d3881b9731cc63024d5d88cf28db875626/golint/golint.go#L121
func (p *Simple) Print(fs *result.FileResults) error {
func (s *Simple) Print(fs *result.FileResults) error {
for _, r := range fs.Results {
fmt.Printf("%v: [%s] %s\n",
positionString(r.StartPosition),
fmt.Printf(s.format+"\n",
r.StartPosition.Filename,
r.StartPosition.Line,
r.StartPosition.Column,
r.Rule.Severity,
r.Reason())
}
return nil
}

// positionString is similar to Position.String, but includes the Column
// even if the column is 0
func positionString(pos *token.Position) string {
s := pos.Filename
if pos.IsValid() {
if s != "" {
s += ":"
}
s += fmt.Sprintf("%d", pos.Line)
s += fmt.Sprintf(":%d", pos.Column)
}
return s
}
30 changes: 0 additions & 30 deletions pkg/printer/simple_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,41 +2,11 @@ package printer

import (
"fmt"
"go/token"
"testing"

"github.com/stretchr/testify/assert"
)

func TestSimple_positionString(t *testing.T) {
tests := []struct {
pos token.Position
expected string
}{
{
token.Position{Filename: "my/file", Offset: 0, Line: 10, Column: 4},
"my/file:10:4",
},
{
token.Position{Filename: "my/file", Offset: 0, Line: 1, Column: 0},
"my/file:1:0",
},
{
token.Position{Filename: "my/file", Offset: 0, Line: 0, Column: 4},
"my/file",
},
{
token.Position{Filename: "", Offset: 0, Line: 5, Column: 32},
"5:32",
},
}

for _, test := range tests {
p := positionString(&test.pos)
assert.Equal(t, test.expected, p)
}
}

func TestSimple_Print(t *testing.T) {
p := NewSimple()
res := generateFileResult()
Expand Down

0 comments on commit 00685a0

Please sign in to comment.