Skip to content

Commit

Permalink
Use separator while formatting to print
Browse files Browse the repository at this point in the history
Signed-off-by: Aswin Karthik <[email protected]>
  • Loading branch information
aswinkarthik committed Feb 21, 2020
1 parent 731e773 commit 5513f45
Show file tree
Hide file tree
Showing 4 changed files with 88 additions and 38 deletions.
35 changes: 19 additions & 16 deletions cmd/formatter.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ type Formatter struct {

// NewFormatter can be used to create a new formatter
func NewFormatter(stdout, stderr io.Writer, ctx Context) *Formatter {
if ctx.separator == rune(0) {
ctx.separator = ','
}
return &Formatter{stdout: stdout, stderr: stderr, ctx: ctx}
}

Expand Down Expand Up @@ -67,17 +70,17 @@ func (f *Formatter) legacyJSON(diff digest.Differences) error {

additions := make([]string, 0, len(diff.Additions))
for _, addition := range diff.Additions {
additions = append(additions, includes.String(addition))
additions = append(additions, includes.String(addition, f.ctx.separator))
}

modifications := make([]string, 0, len(diff.Modifications))
for _, modification := range diff.Modifications {
modifications = append(modifications, includes.String(modification.Current))
modifications = append(modifications, includes.String(modification.Current, f.ctx.separator))
}

deletions := make([]string, 0, len(diff.Deletions))
for _, deletion := range diff.Deletions {
deletions = append(deletions, includes.String(deletion))
deletions = append(deletions, includes.String(deletion, f.ctx.separator))
}

jsonDiff := jsonDifference{Additions: additions, Modifications: modifications, Deletions: deletions}
Expand All @@ -103,12 +106,12 @@ func (f *Formatter) json(diff digest.Differences) error {

additions := make([]string, 0, len(diff.Additions))
for _, addition := range diff.Additions {
additions = append(additions, includes.String(addition))
additions = append(additions, includes.String(addition, f.ctx.separator))
}

deletions := make([]string, 0, len(diff.Deletions))
for _, deletion := range diff.Deletions {
deletions = append(deletions, includes.String(deletion))
deletions = append(deletions, includes.String(deletion, f.ctx.separator))
}

type modification struct {
Expand All @@ -124,7 +127,7 @@ func (f *Formatter) json(diff digest.Differences) error {

modifications := make([]modification, 0, len(diff.Modifications))
for _, mods := range diff.Modifications {
m := modification{Original: includes.String(mods.Original), Current: includes.String(mods.Current)}
m := modification{Original: includes.String(mods.Original, f.ctx.separator), Current: includes.String(mods.Current, f.ctx.separator)}
modifications = append(modifications, m)
}

Expand Down Expand Up @@ -155,17 +158,17 @@ func (f *Formatter) rowMark(diff digest.Differences) error {

additions := make([]string, 0, len(diff.Additions))
for _, addition := range diff.Additions {
additions = append(additions, includes.String(addition))
additions = append(additions, includes.String(addition, f.ctx.separator))
}

modifications := make([]string, 0, len(diff.Modifications))
for _, modification := range diff.Modifications {
modifications = append(modifications, includes.String(modification.Current))
modifications = append(modifications, includes.String(modification.Current, f.ctx.separator))
}

deletions := make([]string, 0, len(diff.Deletions))
for _, deletion := range diff.Deletions {
deletions = append(deletions, includes.String(deletion))
deletions = append(deletions, includes.String(deletion, f.ctx.separator))
}

for _, added := range additions {
Expand Down Expand Up @@ -193,16 +196,16 @@ func (f *Formatter) lineDiff(diff digest.Differences) error {

blue(f.stderr, "# Additions (%d)\n", len(diff.Additions))
for _, addition := range diff.Additions {
green(f.stdout, "+ %s\n", includes.String(addition))
green(f.stdout, "+ %s\n", includes.String(addition, f.ctx.separator))
}
blue(f.stderr, "# Modifications (%d)\n", len(diff.Modifications))
for _, modification := range diff.Modifications {
red(f.stdout, "- %s\n", includes.String(modification.Original))
green(f.stdout, "+ %s\n", includes.String(modification.Current))
red(f.stdout, "- %s\n", includes.String(modification.Original, f.ctx.separator))
green(f.stdout, "+ %s\n", includes.String(modification.Current, f.ctx.separator))
}
blue(f.stderr, "# Deletions (%d)\n", len(diff.Deletions))
for _, deletion := range diff.Deletions {
red(f.stdout, "- %s\n", includes.String(deletion))
red(f.stdout, "- %s\n", includes.String(deletion, f.ctx.separator))
}

return nil
Expand All @@ -229,7 +232,7 @@ func (f *Formatter) wordLevelDiffs(diff digest.Differences, deletionFormat, addi

_, _ = fmt.Fprintln(f.stderr, blue("# Additions (%d)", len(diff.Additions)))
for _, addition := range diff.Additions {
_, _ = fmt.Fprintln(f.stdout, green(additionFormat, includes.String(addition)))
_, _ = fmt.Fprintln(f.stdout, green(additionFormat, includes.String(addition, f.ctx.separator)))
}

_, _ = fmt.Fprintln(f.stderr, blue("# Modifications (%d)", len(diff.Modifications)))
Expand All @@ -244,12 +247,12 @@ func (f *Formatter) wordLevelDiffs(diff digest.Differences, deletionFormat, addi
result = append(result, modification.Current[i])
}
}
_, _ = fmt.Fprintln(f.stdout, includes.String(result))
_, _ = fmt.Fprintln(f.stdout, includes.String(result, f.ctx.separator))
}

_, _ = fmt.Fprintln(f.stderr, blue("# Deletions (%d)", len(diff.Deletions)))
for _, deletion := range diff.Deletions {
_, _ = fmt.Fprintln(f.stdout, red(deletionFormat, includes.String(deletion)))
_, _ = fmt.Fprintln(f.stdout, red(deletionFormat, includes.String(deletion, f.ctx.separator)))
}

return nil
Expand Down
72 changes: 54 additions & 18 deletions cmd/formatter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,36 +96,72 @@ Rows:
}

func TestLineDiff(t *testing.T) {
diff := digest.Differences{
Additions: []digest.Addition{[]string{"additions"}},
Modifications: []digest.Modification{
{
Original: []string{"original", "comma,separated,value"},
Current: []string{"modification", "comma,separated,value-2"},
t.Run("should show line diff with comma by default", func(t *testing.T) {
diff := digest.Differences{
Additions: []digest.Addition{[]string{"additions"}},
Modifications: []digest.Modification{
{
Original: []string{"original", "comma,separated,value"},
Current: []string{"modification", "comma,separated,value-2"},
},
},
},
Deletions: []digest.Deletion{{"deletion", "this-row-was-deleted"}},
}
expectedStdout := `+ additions
Deletions: []digest.Deletion{{"deletion", "this-row-was-deleted"}},
}
expectedStdout := `+ additions
- original,"comma,separated,value"
+ modification,"comma,separated,value-2"
- deletion,this-row-was-deleted
`
expectedStderr := `# Additions (1)
expectedStderr := `# Additions (1)
# Modifications (1)
# Deletions (1)
`

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

formatter := NewFormatter(&stdout, &stderr, Context{format: "diff"})
formatter := NewFormatter(&stdout, &stderr, Context{format: "diff"})

err := formatter.Format(diff)
err := formatter.Format(diff)

assert.NoError(t, err)
assert.Equal(t, expectedStdout, stdout.String())
assert.Equal(t, expectedStderr, stderr.String())
})

t.Run("should show line diff with custom separator", func(t *testing.T) {
diff := digest.Differences{
Additions: []digest.Addition{[]string{"additions"}},
Modifications: []digest.Modification{
{
Original: []string{"original", "comma,separated,value"},
Current: []string{"modification", "comma,separated,value-2"},
},
},
Deletions: []digest.Deletion{{"deletion", "this-row-was-deleted"}},
}
expectedStdout := `+ additions
- original|comma,separated,value
+ modification|comma,separated,value-2
- deletion|this-row-was-deleted
`
expectedStderr := `# Additions (1)
# Modifications (1)
# Deletions (1)
`

var stdout bytes.Buffer
var stderr bytes.Buffer

formatter := NewFormatter(&stdout, &stderr, Context{format: "diff", separator: '|'})

err := formatter.Format(diff)

assert.NoError(t, err)
assert.Equal(t, expectedStdout, stdout.String())
assert.Equal(t, expectedStderr, stderr.String())
})

assert.NoError(t, err)
assert.Equal(t, expectedStdout, stdout.String())
assert.Equal(t, expectedStderr, stderr.String())
}

func TestWordDiff(t *testing.T) {
Expand Down
3 changes: 2 additions & 1 deletion pkg/digest/positions.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ func (p Positions) Join(csv []string, separator string) string {

// String method converts to csv mapping to positions
// escapes necessary characters
func (p Positions) String(csv []string) string {
func (p Positions) String(csv []string, separator rune) string {
selectiveCsv := csv
if len(p) != 0 {
selectiveCsv = make([]string, 0, len(p))
Expand All @@ -38,6 +38,7 @@ func (p Positions) String(csv []string) string {

csvStr := strings.Builder{}
w := csvlib.NewWriter(&csvStr)
w.Comma = separator
_ = w.Write(selectiveCsv)
w.Flush()
csvWithNewLine := csvStr.String()
Expand Down
16 changes: 13 additions & 3 deletions pkg/digest/positions_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,17 +47,27 @@ func TestPositions_String(t *testing.T) {
positions := digest.Positions([]int{0, 3})
csv := []string{"zero", "one", "two", "three"}

actual := positions.String(csv)
actual := positions.String(csv, ',')
expected := "zero,three"

assert.Equal(t, expected, actual)
})

t.Run("should map positions to string using custom separator", func(t *testing.T) {
positions := digest.Positions([]int{0, 3})
csv := []string{"zero", "one", "two", "three"}

actual := positions.String(csv, '|')
expected := "zero|three"

assert.Equal(t, expected, actual)
})

t.Run("should map all positions to string if positions is empty", func(t *testing.T) {
positions := digest.Positions([]int{})
csv := []string{"zero", "one", "two", "three"}

actual := positions.String(csv)
actual := positions.String(csv, ',')
expected := strings.Join(csv, comma)

assert.Equal(t, expected, actual)
Expand All @@ -67,7 +77,7 @@ func TestPositions_String(t *testing.T) {
positions := digest.Positions([]int{0, 3})
csv := []string{"zero\n", "one", "two", "three,3"}

actual := positions.String(csv)
actual := positions.String(csv, ',')
expected := "\"zero\n\",\"three,3\""

assert.Equal(t, expected, actual)
Expand Down

0 comments on commit 5513f45

Please sign in to comment.