work on #108, most likely wnf, this is incomplete

This commit is contained in:
Aaron Raddon 2020-10-01 11:13:56 -07:00
parent fcfe3a02eb
commit 89f84f141b
4 changed files with 34 additions and 9 deletions

1
go.mod
View File

@ -4,6 +4,7 @@ go 1.12
require ( require (
github.com/apcera/termtables v0.0.0-20170405184538-bcbc5dc54055 // indirect github.com/apcera/termtables v0.0.0-20170405184538-bcbc5dc54055 // indirect
github.com/araddon/gou v0.0.0-20190110011759-c797efecbb61
github.com/mattn/go-runewidth v0.0.9 // indirect github.com/mattn/go-runewidth v0.0.9 // indirect
github.com/scylladb/termtables v1.0.0 github.com/scylladb/termtables v1.0.0
github.com/stretchr/testify v1.6.1 github.com/stretchr/testify v1.6.1

2
go.sum
View File

@ -1,5 +1,7 @@
github.com/apcera/termtables v0.0.0-20170405184538-bcbc5dc54055 h1:IkPAzP+QjchKXXFX6LCcpDKa89b/e/0gPCUbQGWtUUY= github.com/apcera/termtables v0.0.0-20170405184538-bcbc5dc54055 h1:IkPAzP+QjchKXXFX6LCcpDKa89b/e/0gPCUbQGWtUUY=
github.com/apcera/termtables v0.0.0-20170405184538-bcbc5dc54055/go.mod h1:8mHYHlOef9UC51cK1/WRvE/iQVM8O8QlYFa8eh8r5I8= github.com/apcera/termtables v0.0.0-20170405184538-bcbc5dc54055/go.mod h1:8mHYHlOef9UC51cK1/WRvE/iQVM8O8QlYFa8eh8r5I8=
github.com/araddon/gou v0.0.0-20190110011759-c797efecbb61 h1:Xz25cuW4REGC5W5UtpMU3QItMIImag615HiQcRbxqKQ=
github.com/araddon/gou v0.0.0-20190110011759-c797efecbb61/go.mod h1:ikc1XA58M+Rx7SEbf0bLJCfBkwayZ8T5jBo5FXK8Uz8=
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=

View File

@ -10,12 +10,14 @@ import (
"time" "time"
"unicode" "unicode"
"unicode/utf8" "unicode/utf8"
"github.com/araddon/gou"
) )
// func init() { func init() {
// gou.SetupLogging("debug") gou.SetupLogging("debug")
// gou.SetColorOutput() gou.SetColorOutput()
// } }
var days = []string{ var days = []string{
"mon", "mon",
@ -204,14 +206,27 @@ func MustParse(datestr string, opts ...ParserOption) time.Time {
// // layout = "2006-01-02 15:04:05" // // layout = "2006-01-02 15:04:05"
// //
func ParseFormat(datestr string, opts ...ParserOption) (string, error) { func ParseFormat(datestr string, opts ...ParserOption) (string, error) {
p, err := parseTime(datestr, nil, opts...) return parseFormatOptions(datestr, nil, opts...)
}
func parseFormatOptions(datestr string, loc *time.Location, opts ...ParserOption) (string, error) {
p, err := parseTime(datestr, loc, opts...)
if err != nil { if err != nil {
return "", err return "", err
} }
_, err = p.parse() t, err := p.parse()
gou.Debugf("%s returned %v IsZero()=%v nano=%v second=%v error %v", datestr, t, t.IsZero(), t.UnixNano(), t.Unix(), err)
if err != nil { if err != nil {
return "", err return "", err
} }
// Because the above parse essentially punts by sending to underlying
// go time.Parse() which can easily return a 0000-01-01 00:00:00 +0000 UTC
// we count that as an error.
//
// However, this is definitely not failproof.
if t.IsZero() {
return "", fmt.Errorf("%s returned a IsZero() time so must be invalid", datestr)
}
return string(p.format), nil return string(p.format), nil
} }
@ -2002,7 +2017,6 @@ func (p *parser) parse() (time.Time, error) {
p.format = p.format[p.skip:] p.format = p.format[p.skip:]
p.datestr = p.datestr[p.skip:] p.datestr = p.datestr[p.skip:]
} }
//gou.Debugf("parse %q AS %q", p.datestr, string(p.format))
if p.loc == nil { if p.loc == nil {
return time.Parse(string(p.format), p.datestr) return time.Parse(string(p.format), p.datestr)
} }

View File

@ -527,11 +527,19 @@ var testParseFormat = []dateTest{
{in: "2009-08-12T22:15:09-0700", out: "2006-01-02T15:04:05-0700"}, {in: "2009-08-12T22:15:09-0700", out: "2006-01-02T15:04:05-0700"},
// yyyy-mm-ddThh:mm:ssZ // yyyy-mm-ddThh:mm:ssZ
{in: "2009-08-12T22:15Z", out: "2006-01-02T15:04Z"}, {in: "2009-08-12T22:15Z", out: "2006-01-02T15:04Z"},
// others
{in: "31.jpg", err: true},
//{in: "1.jpg", err: true}, This SHOULD error but doesn't, our validating tests are really
// just passing down to underlying go error which this doesn't catch.
} }
func TestParseLayout(t *testing.T) { func TestParseFormat(t *testing.T) {
_, err := parseFormatOptions("3.jpg", time.UTC)
assert.NotEqual(t, nil, err)
_, err = ParseFormat(`{"hello"}`)
assert.NotEqual(t, nil, err)
for _, th := range testParseFormat { for _, th := range testParseFormat {
l, err := ParseFormat(th.in) l, err := parseFormatOptions(th.in, time.UTC)
if th.err { if th.err {
assert.NotEqual(t, nil, err) assert.NotEqual(t, nil, err)
} else { } else {