Skip to content

Commit

Permalink
refactor: Use "github.com/jedib0t/go-pretty/v6/table"
Browse files Browse the repository at this point in the history
  • Loading branch information
haijima committed May 5, 2024
1 parent 9d8ca96 commit 9fe7cce
Show file tree
Hide file tree
Showing 5 changed files with 68 additions and 100 deletions.
78 changes: 34 additions & 44 deletions cmd/param.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package cmd

import (
"encoding/csv"
"fmt"
"sort"
"strings"
Expand All @@ -12,7 +11,8 @@ import (
"github.com/haijima/gini"
"github.com/haijima/stool/internal"
"github.com/haijima/stool/internal/log"
"github.com/olekukonko/tablewriter"
"github.com/jedib0t/go-pretty/v6/table"
"github.com/jedib0t/go-pretty/v6/text"
"github.com/spf13/afero"
"github.com/spf13/cobra"
"github.com/spf13/viper"
Expand Down Expand Up @@ -289,7 +289,7 @@ func printQueryResult(cmd *cobra.Command, result *internal.Param, displayNum int
}

func printParamStat(cmd *cobra.Command, result *internal.Param, paramType, format string) {
rows := make([][]string, 0)
rows := make([]table.Row, 0)
for _, k := range result.Endpoints {
v := result.Count[k]
pathParams, hasPathParam := result.Path[k]
Expand All @@ -307,15 +307,15 @@ func printParamStat(cmd *cobra.Command, result *internal.Param, paramType, forma
paramName = fmt.Sprintf("Path param(%d)", i+1)
}
g, _ := gini.Gini(maps.Values(vv))
row := make([]string, 0, 6)
row = append(row, k)
row = append(row, "path")
row = append(row, paramName)
row = append(row, humanize.Comma(int64(v)))
row = append(row, color.HiBlackString("100.00"))
row = append(row, humanize.Comma(int64(len(vv))))
row = append(row, printGini(g, false))
rows = append(rows, row)
rows = append(rows, table.Row{
k,
"path",
paramName,
humanize.Comma(int64(v)),
color.HiBlackString("100.00"),
humanize.Comma(int64(len(vv))),
printGini(g, false),
})
}
}

Expand All @@ -325,46 +325,36 @@ func printParamStat(cmd *cobra.Command, result *internal.Param, paramType, forma
for _, kk := range queryKeys {
vv := queryParams[kk]
g, _ := gini.Gini(maps.Values(vv))
row := make([]string, 0, 6)
row = append(row, k)
row = append(row, "query")
row = append(row, fmt.Sprintf("?%s", kk))
row = append(row, humanize.Comma(int64(result.QueryKey[k][kk])))
row = append(row, fmt.Sprintf("%.2f", float64(result.QueryKey[k][kk])/float64(v)*100))
row = append(row, humanize.Comma(int64(len(vv))))
row = append(row, printGini(g, false))
rows = append(rows, row)
rows = append(rows, table.Row{
k,
"query",
fmt.Sprintf("?%s", kk),
humanize.Comma(int64(result.QueryKey[k][kk])),
fmt.Sprintf("%.2f", float64(result.QueryKey[k][kk])/float64(v)*100),
humanize.Comma(int64(len(vv))),
printGini(g, false),
})
}
}
}

header := []string{"Endpoint", "Type", "Parameter", "Count", "Count(%)", "Cardinality", "Gini"}
aligns := []int{tablewriter.ALIGN_LEFT, tablewriter.ALIGN_LEFT, tablewriter.ALIGN_LEFT, tablewriter.ALIGN_RIGHT, tablewriter.ALIGN_RIGHT, tablewriter.ALIGN_RIGHT, tablewriter.ALIGN_RIGHT}
t := table.NewWriter()
t.SetOutputMirror(cmd.OutOrStdout())
header := table.Row{"Endpoint", "Type", "Parameter", "Count", "Count(%)", "Cardinality", "Gini"}
t.AppendHeader(header)

aligns := []table.ColumnConfig{{Number: 4, Align: text.AlignRight}, {Number: 5, Align: text.AlignRight}, {Number: 6, Align: text.AlignRight}, {Number: 7, Align: text.AlignRight}}
t.SetColumnConfigs(aligns)
t.AppendRows(rows)

if format == "csv" {
csvWriter := csv.NewWriter(cmd.OutOrStdout())
_ = csvWriter.Write(header)
_ = csvWriter.WriteAll(rows)
t.RenderCSV()
} else if format == "tsv" {
csvWriter := csv.NewWriter(cmd.OutOrStdout())
csvWriter.Comma = '\t'
_ = csvWriter.Write(header)
_ = csvWriter.WriteAll(rows)
t.RenderTSV()
} else if format == "table" {
tableWriter := tablewriter.NewWriter(cmd.OutOrStdout())
tableWriter.SetAutoWrapText(false)
tableWriter.SetHeader(header)
tableWriter.SetColumnAlignment(aligns)
tableWriter.AppendBulk(rows)
tableWriter.Render()
t.Render()
} else if format == "md" {
mdWriter := tablewriter.NewWriter(cmd.OutOrStdout())
mdWriter.SetBorders(tablewriter.Border{Left: true, Top: false, Right: true, Bottom: false})
mdWriter.SetCenterSeparator("|")
mdWriter.SetAutoWrapText(false)
mdWriter.SetHeader(header)
mdWriter.SetColumnAlignment(aligns)
mdWriter.AppendBulk(rows)
mdWriter.Render()
t.RenderMarkdown()
} else {
cmd.PrintErrf("invalid format: %s\n", format)
}
Expand Down
81 changes: 30 additions & 51 deletions cmd/trend.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package cmd

import (
"encoding/csv"
"fmt"
"strconv"
"strings"
Expand All @@ -12,7 +11,8 @@ import (
"github.com/haijima/cobrax"
"github.com/haijima/stool/internal"
"github.com/haijima/stool/internal/log"
"github.com/olekukonko/tablewriter"
"github.com/jedib0t/go-pretty/v6/table"
"github.com/jedib0t/go-pretty/v6/text"
"github.com/spf13/afero"
"github.com/spf13/cobra"
"github.com/spf13/viper"
Expand Down Expand Up @@ -76,67 +76,46 @@ func runTrend(cmd *cobra.Command, v *viper.Viper, fs afero.Fs, p *internal.Trend
return err
}

switch format {
case "table":
return printTrendTable(cmd, result, false)
case "md":
return printTrendTable(cmd, result, true)
case "csv":
return printTrendCsv(cmd, result)
default:
return nil // unreachable
}
return printTrendTable(cmd, result, format)
}

func printTrendTable(cmd *cobra.Command, result *internal.Trend, markdown bool) error {
table := tablewriter.NewWriter(cmd.OutOrStdout())
if markdown {
table.SetBorders(tablewriter.Border{Left: true, Top: false, Right: true, Bottom: false})
table.SetCenterSeparator("|")
}

header := resultToHeader(result)
table.SetHeader(header)
func printTrendTable(cmd *cobra.Command, result *internal.Trend, format string) error {
t := table.NewWriter()
t.SetOutputMirror(cmd.OutOrStdout())

aligns := make([]int, 0, len(header))
aligns = append(aligns, tablewriter.ALIGN_LEFT)
aligns = append(aligns, tablewriter.ALIGN_LEFT)
for i := 2; i < len(header); i++ {
aligns = append(aligns, tablewriter.ALIGN_RIGHT)
header := table.Row{"Method", "Uri"}
for i := 0; i < result.Step; i++ {
header = append(header, strconv.Itoa(i*result.Interval))
}
table.SetColumnAlignment(aligns)
table.AppendBulk(resultToRows(result, true))
table.Render()
return nil
}

func printTrendCsv(cmd *cobra.Command, result *internal.Trend) error {
writer := csv.NewWriter(cmd.OutOrStdout())
t.AppendHeader(header)

if err := writer.Write(resultToHeader(result)); err != nil {
return err
aligns := make([]table.ColumnConfig, 0, len(header)-2)
for i := 3; i <= len(header); i++ {
aligns = append(aligns, table.ColumnConfig{Number: i, Align: text.AlignRight})
}
t.SetColumnConfigs(aligns)

if err := writer.WriteAll(resultToRows(result, false)); err != nil {
return err
switch format {
case "table":
t.AppendRows(resultToRows(result, true))
t.Render()
case "md":
t.AppendRows(resultToRows(result, true))
t.RenderMarkdown()
case "csv":
t.AppendRows(resultToRows(result, false))
t.RenderCSV()
default:
return nil // unreachable
}
return nil
}

func resultToHeader(result *internal.Trend) []string {
header := make([]string, 0, result.Step+2)
header = append(header, "Method", "Uri")
for i := 0; i < result.Step; i++ {
header = append(header, strconv.Itoa(i*result.Interval))
}
return header
}

func resultToRows(result *internal.Trend, humanized bool) [][]string {
rows := make([][]string, 0, len(result.Endpoints()))
func resultToRows(result *internal.Trend, humanized bool) []table.Row {
rows := make([]table.Row, 0, len(result.Endpoints()))
for _, endpoint := range result.Endpoints() {
row := make([]string, 0)
row = append(row, strings.SplitN(endpoint, " ", 2)...) // split into Method and Uri
methodAndUri := strings.SplitN(endpoint, " ", 2) // split into Method and Uri
row := table.Row{methodAndUri[0], methodAndUri[1]}
for i, count := range result.Counts(endpoint) {
s := strconv.Itoa(count)
if humanized {
Expand Down
2 changes: 1 addition & 1 deletion cmd/trend_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ func Test_printTrendCsv(t *testing.T) {
cmd.SetOut(stdout)

result := internal.NewTrend(data, 5, 5)
_ = printTrendCsv(cmd, result)
_ = printTrendTable(cmd, result, "csv")

assert.Equal(t, `Method,Uri,0,5,10,15,20
GET,/,1,2,3,4,0
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ require (
github.com/fatih/color v1.16.0
github.com/haijima/cobrax v0.3.1
github.com/haijima/gini v0.0.2
github.com/jedib0t/go-pretty/v6 v6.5.8
github.com/lucasb-eyer/go-colorful v1.2.0
github.com/mattn/go-colorable v0.1.13
github.com/olekukonko/tablewriter v0.0.5
github.com/pelletier/go-toml/v2 v2.2.1
github.com/spf13/afero v1.11.0
github.com/spf13/cobra v1.8.0
Expand Down
5 changes: 2 additions & 3 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/jedib0t/go-pretty/v6 v6.5.8 h1:8BCzJdSvUbaDuRba4YVh+SKMGcAAKdkcF3SVFbrHAtQ=
github.com/jedib0t/go-pretty/v6 v6.5.8/go.mod h1:zbn98qrYlh95FIhwwsbIip0LYpwSG8SUOScs+v9/t0E=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
Expand All @@ -55,13 +57,10 @@ github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovk
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
github.com/pelletier/go-toml/v2 v2.2.1 h1:9TA9+T8+8CUCO2+WYnDLCgrYi9+omqKXyjDtosvtEhg=
github.com/pelletier/go-toml/v2 v2.2.1/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
Expand Down

0 comments on commit 9fe7cce

Please sign in to comment.