Skip to content

Commit

Permalink
Move metadata in RowMark output to stderr
Browse files Browse the repository at this point in the history
Signed-off-by: Aswin Karthik <[email protected]>
  • Loading branch information
aswinkarthik committed Feb 28, 2019
1 parent 5c6dde8 commit 8761d89
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 29 deletions.
17 changes: 12 additions & 5 deletions cmd/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package cmd

import (
"errors"
"os"
"strings"

"github.com/aswinkarthik/csvdiff/pkg/digest"
Expand Down Expand Up @@ -74,10 +75,16 @@ const (
// based on config.Format
func (c *Config) Formatter() Formatter {
format := strings.ToLower(c.Format)
if format == rowmark {
return &RowMarkFormatter{}
} else if format == jsonFormat {
return &JSONFormatter{}

switch format {
case jsonFormat:
return &JSONFormatter{
Stdout: os.Stdout,
}
default:
return &RowMarkFormatter{
Stdout: os.Stdout,
Stderr: os.Stderr,
}
}
return &RowMarkFormatter{}
}
46 changes: 34 additions & 12 deletions cmd/formatter.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,38 +11,60 @@ import (
// Formatter defines the interface through which differences
// can be formatted and displayed
type Formatter interface {
Format(digest.Difference, io.Writer)
Format(digest.Difference) error
}

// RowMarkFormatter formats diff by marking each row as
// ADDED/MODIFIED. It mutates the row and adds as a new column.
type RowMarkFormatter struct{}
type RowMarkFormatter struct {
Stdout io.Writer
Stderr io.Writer
}

// Format prints the diff to os.Stdout
func (f *RowMarkFormatter) Format(diff digest.Difference, w io.Writer) {
fmt.Fprintf(w, "Additions %d\n", len(diff.Additions))
fmt.Fprintf(w, "Modifications %d\n", len(diff.Modifications))
fmt.Fprintf(w, "Rows:\n")
func (f *RowMarkFormatter) Format(diff digest.Difference) error {
fmt.Fprintf(f.Stderr, "Additions %d\n", len(diff.Additions))
fmt.Fprintf(f.Stderr, "Modifications %d\n", len(diff.Modifications))
fmt.Fprintf(f.Stderr, "Rows:\n")

for _, added := range diff.Additions {
fmt.Fprintf(w, "%s,%s\n", added, "ADDED")
_, err := fmt.Fprintf(f.Stdout, "%s,%s\n", added, "ADDED")

if err != nil {
return fmt.Errorf("error when formatting additions with RowMark formatter: %v", err)
}
}

for _, modified := range diff.Modifications {
fmt.Fprintf(w, "%s,%s\n", modified, "MODIFIED")
_, err := fmt.Fprintf(f.Stdout, "%s,%s\n", modified, "MODIFIED")

if err != nil {
return fmt.Errorf("error when formatting modifications with RowMark formatter: %v", err)
}

}

return nil
}

// JSONFormatter formats diff to as a JSON Object
type JSONFormatter struct{}
type JSONFormatter struct {
Stdout io.Writer
}

// Format prints the diff as a JSON
func (f *JSONFormatter) Format(diff digest.Difference, w io.Writer) {
func (f *JSONFormatter) Format(diff digest.Difference) error {
data, err := json.MarshalIndent(diff, "", " ")

if err != nil {
panic(err)
return fmt.Errorf("error when serializing with JSON formatter: %v", err)
}

_, err = f.Stdout.Write(data)

if err != nil {
return fmt.Errorf("error when writing to writer with JSON formatter: %v", err)
}

w.Write(data)
return nil
}
28 changes: 17 additions & 11 deletions cmd/formatter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,13 @@ func TestJSONFormat(t *testing.T) {
]
}`

var buffer bytes.Buffer
var stdout bytes.Buffer

formatter = &cmd.JSONFormatter{}
formatter = &cmd.JSONFormatter{Stdout: &stdout}

formatter.Format(diff, &buffer)
assert.Equal(t, expected, buffer.String())
err := formatter.Format(diff)
assert.NoError(t, err)
assert.Equal(t, expected, stdout.String())
}

func TestRowMarkFormatter(t *testing.T) {
Expand All @@ -39,17 +40,22 @@ func TestRowMarkFormatter(t *testing.T) {
Additions: []string{"additions"},
Modifications: []string{"modification"},
}
expected := `Additions 1
expectedStdout := `additions,ADDED
modification,MODIFIED
`
expectedStderr := `Additions 1
Modifications 1
Rows:
additions,ADDED
modification,MODIFIED
`

var buffer bytes.Buffer
var stdout bytes.Buffer
var stderr bytes.Buffer

formatter = &cmd.RowMarkFormatter{Stdout: &stdout, Stderr: &stderr}

formatter = &cmd.RowMarkFormatter{}
err := formatter.Format(diff)

formatter.Format(diff, &buffer)
assert.Equal(t, expected, buffer.String())
assert.NoError(t, err)
assert.Equal(t, expectedStdout, stdout.String())
assert.Equal(t, expectedStderr, stderr.String())
}
2 changes: 1 addition & 1 deletion cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ Most suitable for csv files created from database tables`,
os.Exit(2)
}

config.Formatter().Format(diff, os.Stdout)
config.Formatter().Format(diff)

return
},
Expand Down

0 comments on commit 8761d89

Please sign in to comment.