use column order of -c when specified (#81)

This commit is contained in:
T.v.Dein
2025-10-06 22:55:04 +02:00
committed by GitHub
parent 35b726fee4
commit 50a9378d92
3 changed files with 43 additions and 49 deletions

View File

@@ -65,7 +65,7 @@ clean:
rm -rf $(tool) releases coverage.out rm -rf $(tool) releases coverage.out
test: clean test: clean
go test -cover ./... $(OPTS) go test -count=1 -cover ./... $(OPTS)
singletest: singletest:
@echo "Call like this: 'make singletest TEST=TestPrepareColumns MOD=lib'" @echo "Call like this: 'make singletest TEST=TestPrepareColumns MOD=lib'"

View File

@@ -22,7 +22,7 @@ import (
"fmt" "fmt"
"os" "os"
"regexp" "regexp"
"sort" "slices"
"strconv" "strconv"
"strings" "strings"
@@ -30,16 +30,6 @@ import (
"github.com/tlinden/tablizer/cfg" "github.com/tlinden/tablizer/cfg"
) )
func contains(s []int, e int) bool {
for _, a := range s {
if a == e {
return true
}
}
return false
}
func findindex(s []int, e int) (int, bool) { func findindex(s []int, e int) (int, bool) {
for i, a := range s { for i, a := range s {
if a == e { if a == e {
@@ -174,46 +164,31 @@ func PrepareColumnVars(columns string, data *Tabdata) ([]int, error) {
// deduplicate: put all values into a map (value gets map key) // deduplicate: put all values into a map (value gets map key)
// thereby removing duplicates, extract keys into new slice // thereby removing duplicates, extract keys into new slice
// and sort it deduped := []int{}
imap := make(map[int]int, len(usecolumns))
for _, i := range usecolumns { for _, i := range usecolumns {
imap[i] = 0 if !slices.Contains(deduped, i) {
deduped = append(deduped, i)
}
} }
// fill with deduplicated columns return deduped, nil
usecolumns = nil
for k := range imap {
usecolumns = append(usecolumns, k)
}
sort.Ints(usecolumns)
return usecolumns, nil
} }
// prepare headers: add numbers to headers // prepare headers: add numbers to headers
func numberizeAndReduceHeaders(conf cfg.Config, data *Tabdata) { func numberizeAndReduceHeaders(conf cfg.Config, data *Tabdata) {
numberedHeaders := []string{} numberedHeaders := make([]string, len(data.headers))
maxwidth := 0 // start from scratch, so we only look at displayed column widths maxwidth := 0 // start from scratch, so we only look at displayed column widths
// add numbers to headers if needed, get widest cell width
for idx, head := range data.headers { for idx, head := range data.headers {
var headlen int var headlen int
if len(conf.Columns) > 0 {
// -c specified
if !contains(conf.UseColumns, idx+1) {
// ignore this one
continue
}
}
if conf.Numbering { if conf.Numbering {
numhead := fmt.Sprintf("%s(%d)", head, idx+1) newhead := fmt.Sprintf("%s(%d)", head, idx+1)
headlen = len(numhead) numberedHeaders[idx] = newhead
numberedHeaders = append(numberedHeaders, numhead) headlen = len(newhead)
} else { } else {
numberedHeaders = append(numberedHeaders, head)
headlen = len(head) headlen = len(head)
} }
@@ -222,7 +197,24 @@ func numberizeAndReduceHeaders(conf cfg.Config, data *Tabdata) {
} }
} }
data.headers = numberedHeaders if conf.Numbering {
data.headers = numberedHeaders
}
if len(conf.UseColumns) > 0 {
// re-align headers based on user requested column list
headers := make([]string, len(conf.UseColumns))
for i, col := range conf.UseColumns {
for idx := range data.headers {
if col-1 == idx {
headers[i] = data.headers[col-1]
}
}
}
data.headers = headers
}
if data.maxwidthHeader != maxwidth && maxwidth > 0 { if data.maxwidthHeader != maxwidth && maxwidth > 0 {
data.maxwidthHeader = maxwidth data.maxwidthHeader = maxwidth
@@ -234,17 +226,17 @@ func reduceColumns(conf cfg.Config, data *Tabdata) {
if len(conf.Columns) > 0 { if len(conf.Columns) > 0 {
reducedEntries := [][]string{} reducedEntries := [][]string{}
var reducedEntry []string
for _, entry := range data.entries { for _, entry := range data.entries {
reducedEntry = nil var reducedEntry []string
for i, value := range entry { for _, col := range conf.UseColumns {
if !contains(conf.UseColumns, i+1) { col--
continue
for idx, value := range entry {
if idx == col {
reducedEntry = append(reducedEntry, value)
}
} }
reducedEntry = append(reducedEntry, value)
} }
reducedEntries = append(reducedEntries, reducedEntry) reducedEntries = append(reducedEntries, reducedEntry)

View File

@@ -19,6 +19,7 @@ package lib
import ( import (
"fmt" "fmt"
"slices"
"testing" "testing"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
@@ -38,7 +39,7 @@ func TestContains(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
testname := fmt.Sprintf("contains-%d,%d,%t", tt.list, tt.search, tt.want) testname := fmt.Sprintf("contains-%d,%d,%t", tt.list, tt.search, tt.want)
t.Run(testname, func(t *testing.T) { t.Run(testname, func(t *testing.T) {
answer := contains(tt.list, tt.search) answer := slices.Contains(tt.list, tt.search)
assert.EqualValues(t, tt.want, answer) assert.EqualValues(t, tt.want, answer)
}) })
@@ -72,7 +73,8 @@ func TestPrepareColumns(t *testing.T) {
} }
for _, testdata := range tests { for _, testdata := range tests {
testname := fmt.Sprintf("PrepareColumns-%s-%t", testdata.input, testdata.wanterror) testname := fmt.Sprintf("PrepareColumns-%s-%t",
testdata.input, testdata.wanterror)
t.Run(testname, func(t *testing.T) { t.Run(testname, func(t *testing.T) {
conf := cfg.Config{Columns: testdata.input} conf := cfg.Config{Columns: testdata.input}
err := PrepareColumns(&conf, &data) err := PrepareColumns(&conf, &data)