Skip to content

Commit

Permalink
Introduce formatter with default as stdout formatter
Browse files Browse the repository at this point in the history
  • Loading branch information
aswinkarthik committed Apr 29, 2018
1 parent 80fabed commit da5b623
Show file tree
Hide file tree
Showing 4 changed files with 106 additions and 18 deletions.
35 changes: 35 additions & 0 deletions cmd/config.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package cmd

import (
"errors"
"io"
"log"
"os"
"strings"

"github.com/aswinkarthik93/csvdiff/pkg/digest"
)
Expand All @@ -18,6 +20,7 @@ func init() {
type Config struct {
PrimaryKeyPositions []int
ValueColumnPositions []int
Format string
Base string
Delta string
Additions string
Expand Down Expand Up @@ -82,3 +85,35 @@ func getWriter(outputStream string) io.WriteCloser {
}
return os.Stdout
}

// Validate validates the config object
// and returns error if not valid.
func (c *Config) Validate() error {
allFormats := []string{stdout}

formatValid := false
for _, format := range allFormats {
if strings.ToLower(c.Format) == format {
formatValid = true
}
}

if !formatValid {
return errors.New("Specified format is not valid")
}

return nil
}

const (
stdout = "stdout"
)

// Formatter instantiates a new formatted
// based on config.Format
func (c *Config) Formatter() Formatter {
if strings.ToLower(c.Format) == stdout {
return &StdoutFormatter{}
}
return &StdoutFormatter{}
}
46 changes: 39 additions & 7 deletions cmd/config_test.go
Original file line number Diff line number Diff line change
@@ -1,30 +1,62 @@
package cmd
package cmd_test

import (
"testing"

"github.com/aswinkarthik93/csvdiff/cmd"
"github.com/aswinkarthik93/csvdiff/pkg/digest"
"github.com/stretchr/testify/assert"
)

func TestPrimaryKeyPositions(t *testing.T) {
config := Config{PrimaryKeyPositions: []int{0, 1}}
config := cmd.Config{PrimaryKeyPositions: []int{0, 1}}
assert.Equal(t, digest.Positions([]int{0, 1}), config.GetPrimaryKeys())

config = Config{PrimaryKeyPositions: []int{}}
config = cmd.Config{PrimaryKeyPositions: []int{}}
assert.Equal(t, digest.Positions([]int{0}), config.GetPrimaryKeys())

config = Config{}
config = cmd.Config{}
assert.Equal(t, digest.Positions([]int{0}), config.GetPrimaryKeys())
}

func TestValueColumnPositions(t *testing.T) {
config := Config{ValueColumnPositions: []int{0, 1}}
config := cmd.Config{ValueColumnPositions: []int{0, 1}}
assert.Equal(t, digest.Positions([]int{0, 1}), config.GetValueColumns())

config = Config{ValueColumnPositions: []int{}}
config = cmd.Config{ValueColumnPositions: []int{}}
assert.Equal(t, digest.Positions([]int{}), config.GetValueColumns())

config = Config{}
config = cmd.Config{}
assert.Equal(t, digest.Positions([]int{}), config.GetValueColumns())
}

func TestConfigValidate(t *testing.T) {
var config *cmd.Config

config = &cmd.Config{}
assert.Error(t, config.Validate())

config = &cmd.Config{Format: "stdout"}
assert.NoError(t, config.Validate())

config = &cmd.Config{Format: "stdOUT"}
assert.NoError(t, config.Validate())
}

func TestDefaultConfigFormatter(t *testing.T) {
config := &cmd.Config{}

formatter, ok := config.Formatter().(*cmd.StdoutFormatter)

assert.True(t, ok)
assert.NotNil(t, formatter)
}

func TestStdoutConfigFormatter(t *testing.T) {
config := &cmd.Config{Format: "stdout"}

formatter, ok := config.Formatter().(*cmd.StdoutFormatter)

assert.True(t, ok)
assert.NotNil(t, formatter)
}
31 changes: 31 additions & 0 deletions cmd/formatter.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package cmd

import (
"fmt"

"github.com/aswinkarthik93/csvdiff/pkg/digest"
)

// Formatter defines the interface through which differences
// can be formatted and displayed
type Formatter interface {
Format(digest.Difference)
}

// StdoutFormatter formats diff to STDOUT
type StdoutFormatter struct{}

// Format prints the diff to os.Stdout
func (f *StdoutFormatter) Format(diff digest.Difference) {
fmt.Printf("Additions %d\n", len(diff.Additions))
fmt.Printf("Modifications %d\n", len(diff.Modifications))
fmt.Println("Rows:")

for _, added := range diff.Additions {
fmt.Printf("%s,%s\n", added, "ADDED")
}

for _, modified := range diff.Modifications {
fmt.Printf("%s,%s\n", modified, "MODIFIED")
}
}
12 changes: 1 addition & 11 deletions cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,17 +77,7 @@ Most suitable for csv files created from database tables`,

diff := digest.Diff(baseConfig, deltaConfig)

fmt.Printf("Additions %d\n", len(diff.Additions))
fmt.Printf("Modifications %d\n", len(diff.Modifications))
fmt.Println("Rows:")

for _, added := range diff.Additions {
fmt.Printf("%s,%s\n", added, "ADDED")
}

for _, modified := range diff.Modifications {
fmt.Printf("%s,%s\n", modified, "MODIFIED")
}
config.Formatter().Format(diff)
},
}

Expand Down

0 comments on commit da5b623

Please sign in to comment.