Skip to content

Commit

Permalink
Introduce separators (#71)
Browse files Browse the repository at this point in the history
* Split concerns betweens column formatter and sql formatter

* Update docs
  • Loading branch information
lucapette authored Apr 3, 2022
1 parent 22dd71a commit 33905f7
Show file tree
Hide file tree
Showing 11 changed files with 60 additions and 63 deletions.
39 changes: 21 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

# Quick Start

`fakedata` helps you generate random data in a number of ways. You can generate
data by specifying on the command line the kind of data you need:
`fakedata` helps you generate random data in a number of ways. By default
`fakedata` uses a column formatter with space separator:

```sh
$ fakedata email country
Expand All @@ -19,11 +19,10 @@ [email protected] Malaysia
[email protected] Virgin Islands, British
```

By default `fakedata` uses a space separator. You can choose a different output
format:
You can choose a different separator:

```sh
$ fakedata --format=csv product.category product.name
$ fakedata --separator=, product.category product.name
Shoes,Rankfix
Automotive,Namis
Movies,Matquadfax
Expand All @@ -34,33 +33,35 @@ Home,Sil-Home
Health,Toughwarm
Shoes,Freetop
Tools,Domnix
# tab is a little tricky to type, but works
$ fakedata emoji industry -s=$'\t'
👦 Electrical & Electronic Manufacturing
🆘 Investment Banking/Venture
📦 Computer Hardware
♐ Computer & Network Security
🔠 Religious Institutions
💷 Automotive
🇱 Capital Markets
㊙ Public Relations
☺ Alternative Dispute Resoluti
```

or SQL insert statements:
You can also specify a SQL formatter:

```sh
$ fakedata --format=sql --limit 1 email domain
INSERT INTO TABLE (email,domain) values ('[email protected]','example.me');
```

You can specify the name of the column using a field with the following format
You can change the name of the table column using a field with the following syntax
`column_name=generator`:

```sh
$ fakedata --format=sql --limit 1 login=email referral=domain
INSERT INTO TABLE (login,referral) values ('[email protected]','test.me');
```

If you need more control over the output, you can use templates:

```sh
$ echo '{{Email}}--{{Int}}--{{Color}}' | fakedata -l5
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
```
If you need more control over the output, you can use [templates](/templates).

# Generators

Expand All @@ -75,7 +76,9 @@ country.code 2-digit country code
date date
domain domain
domain.tld example|test
# ...It's a long list :)
#...
#...
#It's a long list :)
```

You can use the `-g` (or `--generator`) option to see an example:
Expand Down
12 changes: 6 additions & 6 deletions integration/cli_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ import (
"github.com/kr/pretty"
)

// In the following tests, there's a lot going on.
// Please have a look at the following article for a longer explanation:
// https://lucapette.me/writing-integration-tests-for-a-go-cli-application
// In the following tests, there's a lot going on. Please have a look at the
// following article for a longer explanation:
// https://lucapette.me/writing/writing-integration-tests-for-a-go-cli-application

var update = flag.Bool("update", false, "update golden files")

Expand Down Expand Up @@ -121,19 +121,19 @@ func TestCLI(t *testing.T) {
},
{
"csv format short",
[]string{"-f=csv", "int:42,42", "enum:foo,foo"},
[]string{"-s=,", "int:42,42", "enum:foo,foo"},
"csv-format.golden",
false,
},
{
"csv format",
[]string{"--format=csv", "int:42,42", "enum:foo,foo"},
[]string{"--separator=,", "int:42,42", "enum:foo,foo"},
"csv-format.golden",
false,
},
{
"tab format",
[]string{"-f=tab", "int:42,42", "enum:foo,foo"},
[]string{"--separator=\t", "int:42,42", "enum:foo,foo"},
"tab-format.golden",
false,
},
Expand Down
3 changes: 2 additions & 1 deletion integration/golden/file-does-not-exist.golden
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,12 @@ could not read file this file does not exist.txt: open this file does not exist.
Usage: fakedata [option ...] field...

-C, --completion string print shell completion function, pass shell name as argument ("bash", "zsh" or "fish")
-f, --format string generators rows in f format. Available formats: csv|tab|sql
-f, --format string generates rows in f format. Available formats: column|sql (default "column")
-g, --generator string show help for a specific generator
-G, --generators lists available generators
-c, --generators-with-constraints lists available generators with constraints
-l, --limit int limits rows up to n (default 10)
-s, --separator string specifies separator for the column format (default " ")
-t, --table string table name of the sql format (default "TABLE")
-T, --template string Use template as input
-v, --version shows version information
3 changes: 2 additions & 1 deletion integration/golden/help.golden
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
Usage: fakedata [option ...] field...

-C, --completion string print shell completion function, pass shell name as argument ("bash", "zsh" or "fish")
-f, --format string generators rows in f format. Available formats: csv|tab|sql
-f, --format string generates rows in f format. Available formats: column|sql (default "column")
-g, --generator string show help for a specific generator
-G, --generators lists available generators
-c, --generators-with-constraints lists available generators with constraints
-l, --limit int limits rows up to n (default 10)
-s, --separator string specifies separator for the column format (default " ")
-t, --table string table name of the sql format (default "TABLE")
-T, --template string Use template as input
-v, --version shows version information
3 changes: 2 additions & 1 deletion integration/golden/path-empty.golden
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,12 @@ no file path given
Usage: fakedata [option ...] field...

-C, --completion string print shell completion function, pass shell name as argument ("bash", "zsh" or "fish")
-f, --format string generators rows in f format. Available formats: csv|tab|sql
-f, --format string generates rows in f format. Available formats: column|sql (default "column")
-g, --generator string show help for a specific generator
-G, --generators lists available generators
-c, --generators-with-constraints lists available generators with constraints
-l, --limit int limits rows up to n (default 10)
-s, --separator string specifies separator for the column format (default " ")
-t, --table string table name of the sql format (default "TABLE")
-T, --template string Use template as input
-v, --version shows version information
3 changes: 2 additions & 1 deletion integration/golden/unknown-format.golden
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,12 @@ unknown format: no-format
Usage: fakedata [option ...] field...

-C, --completion string print shell completion function, pass shell name as argument ("bash", "zsh" or "fish")
-f, --format string generators rows in f format. Available formats: csv|tab|sql
-f, --format string generates rows in f format. Available formats: column|sql (default "column")
-g, --generator string show help for a specific generator
-G, --generators lists available generators
-c, --generators-with-constraints lists available generators with constraints
-l, --limit int limits rows up to n (default 10)
-s, --separator string specifies separator for the column format (default " ")
-t, --table string table name of the sql format (default "TABLE")
-T, --template string Use template as input
-v, --version shows version information
3 changes: 2 additions & 1 deletion integration/golden/unknown-generators.golden
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,12 @@ unknown generator: madeupgenerator
Usage: fakedata [option ...] field...

-C, --completion string print shell completion function, pass shell name as argument ("bash", "zsh" or "fish")
-f, --format string generators rows in f format. Available formats: csv|tab|sql
-f, --format string generates rows in f format. Available formats: column|sql (default "column")
-g, --generator string show help for a specific generator
-G, --generators lists available generators
-c, --generators-with-constraints lists available generators with constraints
-l, --limit int limits rows up to n (default 10)
-s, --separator string specifies separator for the column format (default " ")
-t, --table string table name of the sql format (default "TABLE")
-T, --template string Use template as input
-v, --version shows version information
31 changes: 10 additions & 21 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,22 +14,6 @@ import (

var version = "main"

func getFormatter(format, table string) (f fakedata.Formatter, err error) {
switch format {
case "csv":
f = fakedata.NewSeparatorFormatter(",")
case "tab":
f = fakedata.NewSeparatorFormatter("\t")
case "sql":
f = fakedata.NewSQLFormatter(table)
case "":
f = fakedata.NewSeparatorFormatter(" ")
default:
err = fmt.Errorf("unknown format: %s", format)
}
return f, err
}

func generatorsHelp(generators fakedata.Generators) string {
max := 0
for _, gen := range generators {
Expand Down Expand Up @@ -86,11 +70,12 @@ func main() {
generatorFlag = flag.StringP("generator", "g", "", "show help for a specific generator")
constraintsFlag = flag.BoolP("generators-with-constraints", "c", false, "lists available generators with constraints")
limitFlag = flag.IntP("limit", "l", 10, "limits rows up to n")
formatFlag = flag.StringP("format", "f", "", "generators rows in f format. Available formats: csv|tab|sql")
versionFlag = flag.BoolP("version", "v", false, "shows version information")
formatFlag = flag.StringP("format", "f", "column", "generates rows in f format. Available formats: column|sql")
tableFlag = flag.StringP("table", "t", "TABLE", "table name of the sql format")
separatorFlag = flag.StringP("separator", "s", " ", "specifies separator for the column format")
templateFlag = flag.StringP("template", "T", "", "Use template as input")
completionFlag = flag.StringP("completion", "C", "", "print shell completion function, pass shell name as argument (\"bash\", \"zsh\" or \"fish\")")
versionFlag = flag.BoolP("version", "v", false, "shows version information")
)

flag.Usage = func() {
Expand Down Expand Up @@ -168,9 +153,13 @@ func main() {
os.Exit(1)
}

formatter, err := getFormatter(*formatFlag, *tableFlag)
if err != nil {
fmt.Printf("%v\n\n", err)
var formatter fakedata.Formatter
if *formatFlag == "column" {
formatter = fakedata.NewColumnFormatter(*separatorFlag)
} else if *formatFlag == "sql" {
formatter = fakedata.NewSQLFormatter(*tableFlag)
} else {
fmt.Printf("unknown format: %s\n\n", *formatFlag)
flag.Usage()
os.Exit(1)
}
Expand Down
6 changes: 3 additions & 3 deletions pkg/fakedata/column_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,9 +103,9 @@ func TestNewColumnsWithName(t *testing.T) {
}
}

var csv = fakedata.NewSeparatorFormatter(",")
var def = fakedata.NewSeparatorFormatter(" ")
var tab = fakedata.NewSeparatorFormatter("\t")
var csv = fakedata.NewColumnFormatter(",")
var def = fakedata.NewColumnFormatter(" ")
var tab = fakedata.NewColumnFormatter("\t")

type args struct {
input []string
Expand Down
12 changes: 6 additions & 6 deletions pkg/fakedata/formatter.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@ type Formatter interface {
Format(Columns, []string) string
}

// SeparatorFormatter is a Formatter for character separated formats
type SeparatorFormatter struct {
// ColumnFormatter is a Formatter for character separated formats
type ColumnFormatter struct {
Separator string
}

// Format as character separated strings
func (f *SeparatorFormatter) Format(columns Columns, values []string) string {
func (f *ColumnFormatter) Format(columns Columns, values []string) string {
return strings.Join(values, f.Separator)
}

Expand Down Expand Up @@ -50,9 +50,9 @@ func (f *SQLFormatter) Format(columns Columns, values []string) string {
return sql.String()
}

// NewSeparatorFormatter returns a SeparatorFormatter using the sep string as a separator
func NewSeparatorFormatter(sep string) (f *SeparatorFormatter) {
return &SeparatorFormatter{Separator: sep}
// NewColumnFormatter returns a ColumnFormatter using the sep string as a separator
func NewColumnFormatter(sep string) (f *ColumnFormatter) {
return &ColumnFormatter{Separator: sep}
}

// NewSQLFormatter returns a SQLFormatter using the table string for table name generation
Expand Down
8 changes: 4 additions & 4 deletions pkg/fakedata/formatter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,21 @@ import (
var columns = fakedata.Columns{{Name: "name", Key: "name"}, {Name: "domain", Key: "domain"}}
var values = []string{"Grace Hopper", "example.com"}

func TestSeparatorFormatter(t *testing.T) {
func TestColumnFormatter(t *testing.T) {
tests := []struct {
name string
sep string
want string
}{
{"default", " ", "Grace Hopper example.com"},
{"csv", ",", "Grace Hopper,example.com"},
{"tab", "\t", "Grace Hopper\texample.com"},
{"tab", "\t", "Grace Hopper example.com"},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
f := &fakedata.SeparatorFormatter{Separator: tt.sep}
f := &fakedata.ColumnFormatter{Separator: tt.sep}
if got := f.Format(columns, values); !reflect.DeepEqual(got, tt.want) {
t.Errorf("SeparatorFormatter.Format() = %v, want %v", got, tt.want)
t.Errorf("ColumnFormatter.Format() = %v, want %v", got, tt.want)
}
})
}
Expand Down

0 comments on commit 33905f7

Please sign in to comment.