Fix gometalinter complaints
diff --git a/benchmark_test.go b/benchmark_test.go
index b2019e1..62c7cc5 100644
--- a/benchmark_test.go
+++ b/benchmark_test.go
@@ -17,6 +17,8 @@
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
- Load([]byte(input), ISO_8859_1)
+ if _, err := Load([]byte(input), ISO_8859_1); err != nil {
+ b.Fatal(err)
+ }
}
}
diff --git a/decode.go b/decode.go
index 1461c0a..0a961bb 100644
--- a/decode.go
+++ b/decode.go
@@ -158,16 +158,16 @@
// keydef returns the property key and the default value based on the
// name of the struct field and the options in the tag.
keydef := func(f reflect.StructField) (string, *string, map[string]string) {
- key, opts := parseTag(f.Tag.Get("properties"))
+ _key, _opts := parseTag(f.Tag.Get("properties"))
- var def *string
- if d, ok := opts["default"]; ok {
- def = &d
+ var _def *string
+ if d, ok := _opts["default"]; ok {
+ _def = &d
}
- if key != "" {
- return key, def, opts
+ if _key != "" {
+ return _key, _def, _opts
}
- return f.Name, def, opts
+ return f.Name, _def, _opts
}
switch {
@@ -223,7 +223,7 @@
case isMap(t):
valT := t.Elem()
m := reflect.MakeMap(t)
- for postfix, _ := range p.FilterStripPrefix(key + ".").m {
+ for postfix := range p.FilterStripPrefix(key + ".").m {
pp := strings.SplitN(postfix, ".", 2)
mk, mv := pp[0], reflect.New(valT)
if err := dec(p, key+"."+mk, nil, nil, mv); err != nil {
@@ -274,7 +274,6 @@
func isBool(t reflect.Type) bool { return t.Kind() == reflect.Bool }
func isDuration(t reflect.Type) bool { return t == reflect.TypeOf(time.Second) }
func isMap(t reflect.Type) bool { return t.Kind() == reflect.Map }
-func isNumeric(t reflect.Type) bool { return isInt(t) || isUint(t) || isFloat(t) }
func isPtr(t reflect.Type) bool { return t.Kind() == reflect.Ptr }
func isString(t reflect.Type) bool { return t.Kind() == reflect.String }
func isStruct(t reflect.Type) bool { return t.Kind() == reflect.Struct }
diff --git a/integrate_test.go b/integrate_test.go
index b8fcf0e..cbee181 100644
--- a/integrate_test.go
+++ b/integrate_test.go
@@ -17,8 +17,8 @@
gotI := f.Int("i", -1, "int flag")
p := NewProperties()
- p.Set("s", "t")
- p.Set("i", "9")
+ p.MustSet("s", "t")
+ p.MustSet("i", "9")
p.MustFlag(f)
if want := "t"; *gotS != want {
@@ -36,11 +36,13 @@
gotB := f.Int("b", 2, "customized")
gotC := f.Int("c", 3, "overridden")
- f.Parse([]string{"-c", "4"})
+ if err := f.Parse([]string{"-c", "4"}); err != nil {
+ t.Fatal(err)
+ }
p := NewProperties()
- p.Set("b", "5")
- p.Set("c", "6")
+ p.MustSet("b", "5")
+ p.MustSet("c", "6")
p.MustFlag(f)
if want := 1; *gotA != want {
@@ -63,8 +65,8 @@
fmt.Printf("flagged as x=%d, y=%d\n", *x, *y)
p := NewProperties()
- p.Set("x", "7")
- p.Set("y", "42") // note discard
+ p.MustSet("x", "7")
+ p.MustSet("y", "42") // note discard
p.MustFlag(flag.CommandLine)
fmt.Printf("configured to x=%d, y=%d\n", *x, *y)
diff --git a/lex.go b/lex.go
index 6ad94f3..a3cba03 100644
--- a/lex.go
+++ b/lex.go
@@ -72,7 +72,7 @@
// next returns the next rune in the input.
func (l *lexer) next() rune {
- if int(l.pos) >= len(l.input) {
+ if l.pos >= len(l.input) {
l.width = 0
return eof
}
@@ -96,8 +96,8 @@
// emit passes an item back to the client.
func (l *lexer) emit(t itemType) {
- item := item{t, l.start, string(l.runes)}
- l.items <- item
+ i := item{t, l.start, string(l.runes)}
+ l.items <- i
l.start = l.pos
l.runes = l.runes[:0]
}
@@ -114,7 +114,7 @@
// accept consumes the next rune if it's from the valid set.
func (l *lexer) accept(valid string) bool {
- if strings.IndexRune(valid, l.next()) >= 0 {
+ if strings.ContainsRune(valid, l.next()) {
return true
}
l.backup()
@@ -123,7 +123,7 @@
// acceptRun consumes a run of runes from the valid set.
func (l *lexer) acceptRun(valid string) {
- for strings.IndexRune(valid, l.next()) >= 0 {
+ for strings.ContainsRune(valid, l.next()) {
}
l.backup()
}
@@ -156,9 +156,9 @@
// nextItem returns the next item from the input.
func (l *lexer) nextItem() item {
- item := <-l.items
- l.lastPos = item.pos
- return item
+ i := <-l.items
+ l.lastPos = i.pos
+ return i
}
// lex creates a new scanner for the input string.
@@ -279,8 +279,7 @@
for {
switch r := l.next(); {
case isEscape(r):
- r := l.peek()
- if isEOL(r) {
+ if isEOL(l.peek()) {
l.next()
l.acceptRun(whitespace)
} else {
diff --git a/load.go b/load.go
index 41f353d..701a86d 100644
--- a/load.go
+++ b/load.go
@@ -98,7 +98,7 @@
return must(LoadURL(url))
}
-// MustLoadFiles reads the content of multiple URLs in the given order into a
+// MustLoadURLs reads the content of multiple URLs in the given order into a
// Properties struct and panics on error. If 'ignoreMissing' is true then a 404
// status code will not be reported as error.
func MustLoadURLs(urls []string, ignoreMissing bool) *Properties {
@@ -172,10 +172,12 @@
return nil, fmt.Errorf("properties: %s returned %d", url, resp.StatusCode)
}
body, err := ioutil.ReadAll(resp.Body)
- resp.Body.Close()
if err != nil {
return nil, fmt.Errorf("properties: %s error reading response. %s", url, err)
}
+ if err = resp.Body.Close(); err != nil {
+ return nil, fmt.Errorf("properties: %s error reading response. %s", url, err)
+ }
ct := resp.Header.Get("Content-Type")
var enc Encoding
diff --git a/load_test.go b/load_test.go
index 8b3137e..c46339d 100644
--- a/load_test.go
+++ b/load_test.go
@@ -66,7 +66,9 @@
tf := make(tempFiles, 0)
defer tf.removeAll()
- os.Setenv("_VARX", "some-value")
+ if err := os.Setenv("_VARX", "some-value"); err != nil {
+ t.Fatal(err)
+ }
filename := tf.makeFilePrefix(os.Getenv("_VARX"), "key=value")
filename = strings.Replace(filename, os.Getenv("_VARX"), "${_VARX}", -1)
p := MustLoadFile(filename, ISO_8859_1)
@@ -189,7 +191,9 @@
return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
send := func(data []byte, contentType string) {
w.Header().Set("Content-Type", contentType)
- w.Write(data)
+ if _, err := w.Write(data); err != nil {
+ panic(err)
+ }
}
utf8 := []byte("key=äöü")
diff --git a/properties.go b/properties.go
index d41343d..80360c9 100644
--- a/properties.go
+++ b/properties.go
@@ -28,8 +28,10 @@
// functions. The default is LogFatalHandler.
var ErrorHandler ErrorHandlerFunc = LogFatalHandler
+// LogHandlerFunc defines the function prototype for logging errors.
type LogHandlerFunc func(fmt string, args ...interface{})
+// LogPrintf defines a log handler which uses log.Printf.
var LogPrintf LogHandlerFunc = log.Printf
// LogFatalHandler handles the error by logging a fatal error and exiting.
@@ -444,6 +446,8 @@
pp := NewProperties()
for _, k := range p.k {
if re.MatchString(k) {
+ // TODO(fs): we are ignoring the error which flags a circular reference.
+ // TODO(fs): since we are just copying a subset of keys this cannot happen (fingers crossed)
pp.Set(k, p.m[k])
}
}
@@ -456,6 +460,8 @@
pp := NewProperties()
for _, k := range p.k {
if strings.HasPrefix(k, prefix) {
+ // TODO(fs): we are ignoring the error which flags a circular reference.
+ // TODO(fs): since we are just copying a subset of keys this cannot happen (fingers crossed)
pp.Set(k, p.m[k])
}
}
@@ -469,6 +475,9 @@
n := len(prefix)
for _, k := range p.k {
if len(k) > len(prefix) && strings.HasPrefix(k, prefix) {
+ // TODO(fs): we are ignoring the error which flags a circular reference.
+ // TODO(fs): since we are modifying keys I am not entirely sure whether we can create a circular reference
+ // TODO(fs): this function should probably return an error but the signature is fixed
pp.Set(k[n:], p.m[k])
}
}
@@ -483,9 +492,7 @@
// Keys returns all keys in the same order as in the input.
func (p *Properties) Keys() []string {
keys := make([]string, len(p.k))
- for i, k := range p.k {
- keys[i] = k
- }
+ copy(keys, p.k)
return keys
}
diff --git a/properties_test.go b/properties_test.go
index bf5aa0d..a63a560 100644
--- a/properties_test.go
+++ b/properties_test.go
@@ -452,8 +452,8 @@
assert.Equal(t, p.MustGet("key2"), "${key}")
// with expansion disabled we can introduce circular references
- p.Set("keyA", "${keyB}")
- p.Set("keyB", "${keyA}")
+ p.MustSet("keyA", "${keyB}")
+ p.MustSet("keyB", "${keyA}")
assert.Equal(t, p.MustGet("keyA"), "${keyB}")
assert.Equal(t, p.MustGet("keyB"), "${keyA}")
}
@@ -676,6 +676,22 @@
}
}
+func TestFilterStripPrefix(t *testing.T) {
+ for _, test := range filterStripPrefixTests {
+ p := mustParse(t, test.input)
+ pp := p.FilterPrefix(test.prefix)
+ assert.Equal(t, pp != nil, true, "want properties")
+ assert.Equal(t, pp.Len(), len(test.keys))
+ for _, key := range test.keys {
+ v1, ok1 := p.Get(key)
+ v2, ok2 := pp.Get(key)
+ assert.Equal(t, ok1, true)
+ assert.Equal(t, ok2, true)
+ assert.Equal(t, v1, v2)
+ }
+ }
+}
+
func TestKeys(t *testing.T) {
for _, test := range keysTests {
p := mustParse(t, test.input)