mirror of
https://codeberg.org/scip/tablizer.git
synced 2025-12-17 04:30:56 +01:00
adapted version generation to cfg module, added and fixed unit tests
This commit is contained in:
28
CHANGELOG.md
28
CHANGELOG.md
@@ -4,8 +4,34 @@ All notable changes to this project will be documented in this file.
|
|||||||
|
|
||||||
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org).
|
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org).
|
||||||
|
|
||||||
|
## [v1.0.11](https://github.com/TLINDEN/tablizer/tree/v1.0.11) - 2022-10-19
|
||||||
|
|
||||||
|
[Full Changelog](https://github.com/TLINDEN/tablizer/compare/v1.0.10...v1.0.11)
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Added CI job golinter to regularly check for common mistakes.
|
||||||
|
|
||||||
|
- Added YAML output mode.
|
||||||
|
|
||||||
|
- Added more unit tests, we're over 95% in the lib module.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- do not use any global variables anymore, makes the code easier to
|
||||||
|
maintain, understand and test
|
||||||
|
|
||||||
|
- using io.Writer in print* functions, which is easier to test, also
|
||||||
|
re-implemented the print tests.
|
||||||
|
|
||||||
|
- replaced go-str2duration with my own implementation `duration2int()`.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## [v1.0.10](https://github.com/TLINDEN/tablizer/tree/v1.0.10) - 2022-10-15
|
## [v1.0.10](https://github.com/TLINDEN/tablizer/tree/v1.0.10) - 2022-10-15
|
||||||
|
|
||||||
|
[Full Changelog](https://github.com/TLINDEN/tablizer/compare/v1.0.9...v1.0.10)
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- Added various sort modes: sort by time, by duration, numerical (-a -t -i)
|
- Added various sort modes: sort by time, by duration, numerical (-a -t -i)
|
||||||
@@ -44,7 +70,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a
|
|||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- Added sort support with the new parameter -k (like sort(1).
|
- Added sort support with the new parameter -k (like sort(1)).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
4
Makefile
4
Makefile
@@ -18,7 +18,7 @@
|
|||||||
#
|
#
|
||||||
# no need to modify anything below
|
# no need to modify anything below
|
||||||
tool = tablizer
|
tool = tablizer
|
||||||
version = $(shell egrep "= .v" lib/common.go | cut -d'=' -f2 | cut -d'"' -f 2)
|
version = $(shell egrep "= .v" cfg/config.go | cut -d'=' -f2 | cut -d'"' -f 2)
|
||||||
archs = android darwin freebsd linux netbsd openbsd windows
|
archs = android darwin freebsd linux netbsd openbsd windows
|
||||||
PREFIX = /usr/local
|
PREFIX = /usr/local
|
||||||
UID = root
|
UID = root
|
||||||
@@ -42,7 +42,7 @@ cmd/%.go: %.pod
|
|||||||
echo "\`" >> cmd/$*.go
|
echo "\`" >> cmd/$*.go
|
||||||
|
|
||||||
buildlocal:
|
buildlocal:
|
||||||
go build -ldflags "-X 'github.com/tlinden/tablizer/lib.VERSION=$(VERSION)'"
|
go build -ldflags "-X 'github.com/tlinden/tablizer/cfg.VERSION=$(VERSION)'"
|
||||||
|
|
||||||
release:
|
release:
|
||||||
./mkrel.sh $(tool) $(version)
|
./mkrel.sh $(tool) $(version)
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const DefaultSeparator string = `(\s\s+|\t)`
|
const DefaultSeparator string = `(\s\s+|\t)`
|
||||||
const ValidOutputModes string = "(orgtbl|markdown|extended|ascii|yaml)"
|
const ValidOutputModes string = "(orgtbl|markdown|extended|ascii|yaml|shell)"
|
||||||
const Version string = "v1.0.11"
|
const Version string = "v1.0.11"
|
||||||
|
|
||||||
var VERSION string // maintained by -x
|
var VERSION string // maintained by -x
|
||||||
@@ -117,17 +117,14 @@ func (conf *Config) PrepareModeFlags(flag Modeflag, mode string) error {
|
|||||||
conf.OutputMode = "ascii"
|
conf.OutputMode = "ascii"
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
r, err := regexp.Compile(ValidOutputModes)
|
r, _ := regexp.Compile(ValidOutputModes) // hardcoded, no fail expected
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return errors.New("Failed to validate output mode spec!")
|
|
||||||
}
|
|
||||||
|
|
||||||
match := r.MatchString(mode)
|
match := r.MatchString(mode)
|
||||||
|
|
||||||
if !match {
|
if !match {
|
||||||
return errors.New("Invalid output mode!")
|
return errors.New("Invalid output mode!")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
conf.OutputMode = mode
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -17,4 +17,82 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
|
|
||||||
package cfg
|
package cfg
|
||||||
|
|
||||||
// FIXME: add tests
|
import (
|
||||||
|
"fmt"
|
||||||
|
// "reflect"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPrepareModeFlags(t *testing.T) {
|
||||||
|
var tests = []struct {
|
||||||
|
flag Modeflag
|
||||||
|
mode string // input, if any
|
||||||
|
expect string // output
|
||||||
|
want bool
|
||||||
|
}{
|
||||||
|
// short commandline flags like -M
|
||||||
|
{Modeflag{X: true}, "", "extended", false},
|
||||||
|
{Modeflag{S: true}, "", "shell", false},
|
||||||
|
{Modeflag{O: true}, "", "orgtbl", false},
|
||||||
|
{Modeflag{Y: true}, "", "yaml", false},
|
||||||
|
{Modeflag{M: true}, "", "markdown", false},
|
||||||
|
{Modeflag{}, "", "ascii", false},
|
||||||
|
|
||||||
|
// long flags like -o yaml
|
||||||
|
{Modeflag{}, "extended", "extended", false},
|
||||||
|
{Modeflag{}, "shell", "shell", false},
|
||||||
|
{Modeflag{}, "orgtbl", "orgtbl", false},
|
||||||
|
{Modeflag{}, "yaml", "yaml", false},
|
||||||
|
{Modeflag{}, "markdown", "markdown", false},
|
||||||
|
|
||||||
|
// failing
|
||||||
|
{Modeflag{}, "blah", "", true},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
testname := fmt.Sprintf("PrepareModeFlags-flags-mode-%s-expect-%s-want-%t",
|
||||||
|
tt.mode, tt.expect, tt.want)
|
||||||
|
t.Run(testname, func(t *testing.T) {
|
||||||
|
c := Config{OutputMode: tt.mode}
|
||||||
|
|
||||||
|
// check either flag or pre filled mode, whatever is defined in tt
|
||||||
|
err := c.PrepareModeFlags(tt.flag, tt.mode)
|
||||||
|
if err != nil {
|
||||||
|
if !tt.want {
|
||||||
|
// expect to fail
|
||||||
|
t.Fatalf("PrepareModeFlags returned unexpected error: %s", err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if c.OutputMode != tt.expect {
|
||||||
|
t.Errorf("got: %s, expect: %s", c.OutputMode, tt.expect)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPrepareSortFlags(t *testing.T) {
|
||||||
|
var tests = []struct {
|
||||||
|
flag Sortmode
|
||||||
|
expect string // output
|
||||||
|
}{
|
||||||
|
// short commandline flags like -M
|
||||||
|
{Sortmode{Numeric: true}, "numeric"},
|
||||||
|
{Sortmode{Age: true}, "duration"},
|
||||||
|
{Sortmode{Time: true}, "time"},
|
||||||
|
{Sortmode{}, "string"},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
testname := fmt.Sprintf("PrepareSortFlags-expect-%s", tt.expect)
|
||||||
|
t.Run(testname, func(t *testing.T) {
|
||||||
|
c := Config{}
|
||||||
|
|
||||||
|
c.PrepareSortFlags(tt.flag)
|
||||||
|
|
||||||
|
if c.SortMode != tt.expect {
|
||||||
|
t.Errorf("got: %s, expect: %s", c.SortMode, tt.expect)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ func Execute() {
|
|||||||
RunE: func(cmd *cobra.Command, args []string) error {
|
RunE: func(cmd *cobra.Command, args []string) error {
|
||||||
if ShowVersion {
|
if ShowVersion {
|
||||||
fmt.Println(cfg.Getversion())
|
fmt.Println(cfg.Getversion())
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if ShowManual {
|
if ShowManual {
|
||||||
@@ -112,7 +113,7 @@ func Execute() {
|
|||||||
_ = rootCmd.Flags().MarkHidden("yaml")
|
_ = rootCmd.Flags().MarkHidden("yaml")
|
||||||
|
|
||||||
// same thing but more common, takes precedence over above group
|
// same thing but more common, takes precedence over above group
|
||||||
rootCmd.PersistentFlags().StringVarP(&Outputmode, "output", "o", "ascii", "Output mode - one of: orgtbl, markdown, extended, shell, ascii(default)")
|
rootCmd.PersistentFlags().StringVarP(&Outputmode, "output", "o", "", "Output mode - one of: orgtbl, markdown, extended, shell, ascii(default)")
|
||||||
|
|
||||||
err := rootCmd.Execute()
|
err := rootCmd.Execute()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ func TestParserPatternmatching(t *testing.T) {
|
|||||||
entries [][]string
|
entries [][]string
|
||||||
pattern string
|
pattern string
|
||||||
invert bool
|
invert bool
|
||||||
|
want bool
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
entries: [][]string{
|
entries: [][]string{
|
||||||
@@ -86,6 +87,15 @@ func TestParserPatternmatching(t *testing.T) {
|
|||||||
pattern: "ig",
|
pattern: "ig",
|
||||||
invert: true,
|
invert: true,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
entries: [][]string{
|
||||||
|
{
|
||||||
|
"asd", "igig", "cxxxncnc",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
pattern: "[a-z",
|
||||||
|
want: true,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
table := `ONE TWO THREE
|
table := `ONE TWO THREE
|
||||||
@@ -101,12 +111,14 @@ asd igig cxxxncnc
|
|||||||
gotdata, err := parseFile(c, readFd, tt.pattern)
|
gotdata, err := parseFile(c, readFd, tt.pattern)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("Parser returned error: %s\nData processed so far: %+v", err, gotdata)
|
if !tt.want {
|
||||||
}
|
t.Errorf("Parser returned error: %s\nData processed so far: %+v", err, gotdata)
|
||||||
|
}
|
||||||
if !reflect.DeepEqual(tt.entries, gotdata.entries) {
|
} else {
|
||||||
t.Errorf("Parser returned invalid data (pattern: %s, invert: %t)\nExp: %+v\nGot: %+v\n",
|
if !reflect.DeepEqual(tt.entries, gotdata.entries) {
|
||||||
tt.pattern, tt.invert, tt.entries, gotdata.entries)
|
t.Errorf("Parser returned invalid data (pattern: %s, invert: %t)\nExp: %+v\nGot: %+v\n",
|
||||||
|
tt.pattern, tt.invert, tt.entries, gotdata.entries)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -91,13 +91,13 @@ ceta 33d12h 9 06/Jan/2008 15:04:05 -0700`,
|
|||||||
name: "default",
|
name: "default",
|
||||||
mode: "orgtbl",
|
mode: "orgtbl",
|
||||||
expect: `
|
expect: `
|
||||||
|---------+-------------+----------+----------------------------|
|
+---------+-------------+----------+----------------------------+
|
||||||
| NAME(1) | DURATION(2) | COUNT(3) | WHEN(4) |
|
| NAME(1) | DURATION(2) | COUNT(3) | WHEN(4) |
|
||||||
|---------+-------------+----------+----------------------------|
|
+---------+-------------+----------+----------------------------+
|
||||||
| beta | 1d10h5m1s | 33 | 3/1/2014 |
|
| beta | 1d10h5m1s | 33 | 3/1/2014 |
|
||||||
| alpha | 4h35m | 170 | 2013-Feb-03 |
|
| alpha | 4h35m | 170 | 2013-Feb-03 |
|
||||||
| ceta | 33d12h | 9 | 06/Jan/2008 15:04:05 -0700 |
|
| ceta | 33d12h | 9 | 06/Jan/2008 15:04:05 -0700 |
|
||||||
|---------+-------------+----------+----------------------------|`,
|
+---------+-------------+----------+----------------------------+`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "default",
|
name: "default",
|
||||||
|
|||||||
Reference in New Issue
Block a user