Lint
continuous-integration/drone/push Build is failing
Details
continuous-integration/drone/push Build is failing
Details
parent
2ead56e2b1
commit
7f1ad192a2
123
.golangci.yml
123
.golangci.yml
|
@ -1,23 +1,116 @@
|
|||
# This file contains all available configuration options
|
||||
# with their default values.
|
||||
|
||||
# options for analysis running
|
||||
run:
|
||||
# default concurrency is a available CPU number
|
||||
#concurrency: 4
|
||||
|
||||
# timeout for analysis, e.g. 30s, 5m, default is 1m
|
||||
deadline: 30m
|
||||
|
||||
# include test files or not, default is true
|
||||
tests: false
|
||||
|
||||
# which dirs to skip: they won't be analyzed;
|
||||
# can use regexp here: generated.*, regexp is applied on full path;
|
||||
# default value is empty list, but next dirs are always skipped independently
|
||||
# from this option's value:
|
||||
# vendor$, third_party$, testdata$, examples$, Godeps$, builtin$
|
||||
skip-dirs:
|
||||
- bin$
|
||||
- \.git$
|
||||
- etc$
|
||||
- protobuf$
|
||||
- scripts$
|
||||
- vendor$
|
||||
- ^benches/
|
||||
|
||||
# which files to skip: they will be analyzed, but issues from them
|
||||
# won't be reported. Default value is empty list, but there is
|
||||
# no need to include all autogenerated files, we confidently recognize
|
||||
# autogenerated files. If it's not please let us know.
|
||||
skip-files:
|
||||
- "_easyjson.go"
|
||||
- ".pb.go"
|
||||
|
||||
# by default isn't set. If set we pass it to "go list -mod={option}". From "go help modules":
|
||||
# If invoked with -mod=readonly, the go command is disallowed from the implicit
|
||||
# automatic updating of go.mod described above. Instead, it fails when any changes
|
||||
# to go.mod are needed. This setting is most useful to check that go.mod does
|
||||
# not need updates, such as in a continuous integration and testing system.
|
||||
# If invoked with -mod=vendor, the go command assumes that the vendor
|
||||
# directory holds the correct copies of dependencies and ignores
|
||||
# the dependency descriptions in go.mod.
|
||||
modules-download-mode: mod
|
||||
|
||||
# all available settings of specific linters
|
||||
linters-settings:
|
||||
errcheck:
|
||||
# report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`;
|
||||
# default is false: such cases aren't reported by default.
|
||||
check-blank: true
|
||||
govet:
|
||||
# report about shadowed variables
|
||||
check-shadowing: true
|
||||
golint:
|
||||
# minimal confidence for issues, default is 0.8
|
||||
min-confidence: 0.3
|
||||
gocyclo:
|
||||
# minimal code complexity to report, 30 by default (but we recommend 10-20)
|
||||
min-complexity: 20
|
||||
dupl:
|
||||
# tokens count to trigger issue, 150 by default
|
||||
threshold: 200
|
||||
lll:
|
||||
# max line length, lines longer will be reported. Default is 120.
|
||||
# '\t' is counted as 1 character by default, and can be changed with the tab-width option
|
||||
line-length: 150
|
||||
funlen:
|
||||
statements: 50
|
||||
lines: 150
|
||||
|
||||
linters:
|
||||
disable-all: false
|
||||
enable-all: true
|
||||
disable:
|
||||
- gochecknoglobals
|
||||
- gochecknoinits
|
||||
- godox
|
||||
- goerr113
|
||||
- gomnd
|
||||
- lll
|
||||
- nakedret
|
||||
- testpackage
|
||||
- wsl
|
||||
- nlreturn
|
||||
- whitespace
|
||||
- bodyclose
|
||||
- wrapcheck
|
||||
- gci
|
||||
- exhaustivestruct
|
||||
- exhaustruct
|
||||
- gochecknoglobals
|
||||
- whitespace
|
||||
- wsl
|
||||
- wrapcheck
|
||||
- nlreturn
|
||||
- gofmt
|
||||
- gofumpt
|
||||
- varcheck
|
||||
- golint
|
||||
- structcheck
|
||||
- nosnakecase
|
||||
- maligned
|
||||
- interfacer
|
||||
- deadcode
|
||||
- scopelint
|
||||
- ifshort
|
||||
- godox
|
||||
- forbidigo
|
||||
- goerr113
|
||||
- nonamedreturns
|
||||
- staticcheck
|
||||
- gofumpt
|
||||
fast: false
|
||||
|
||||
issues:
|
||||
max-issues-per-linter: 0
|
||||
max-same-issues: 0
|
||||
|
||||
exclude-rules:
|
||||
# Exclude lll issues for long lines with go:generate
|
||||
- linters:
|
||||
- lll
|
||||
source: "^//go:generate "
|
||||
- linters:
|
||||
- golint
|
||||
text: "receiver name should be a reflection of its identity"
|
||||
|
||||
output:
|
||||
format: tab
|
||||
|
|
2
Makefile
2
Makefile
|
@ -3,7 +3,7 @@ PROJECT_NAME=modules
|
|||
.PHONY: lint
|
||||
lint: ## Линт всего проекта
|
||||
curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh| sh -s -- -b $(go env GOPATH)/bin v1.51.1
|
||||
golangci-lint run --config=./golangci.yml ./...
|
||||
golangci-lint run --config=./.golangci.yml ./...
|
||||
|
||||
.PHONY: test
|
||||
test: ## Юнит тестирование всего проекта
|
||||
|
|
|
@ -33,22 +33,22 @@ func New(str interface{}) Interface {
|
|||
}
|
||||
|
||||
// Method wraps discrete methods.
|
||||
func (s Interface) Combine(c Config) error {
|
||||
if c.ConfigFile != "" {
|
||||
fmt.Printf("try to apply config from file %s...\n", c.ConfigFile)
|
||||
if err := s.SetFromFile(c.ConfigFile); err != nil {
|
||||
func (s Interface) Combine(config Config) error {
|
||||
if config.ConfigFile != "" {
|
||||
fmt.Printf("try to apply config from file %s...\n", config.ConfigFile)
|
||||
if err := s.SetFromFile(config.ConfigFile); err != nil {
|
||||
return fmt.Errorf("can't apply config from file: %w", err)
|
||||
}
|
||||
}
|
||||
if c.EnvPrefix != "" {
|
||||
if config.EnvPrefix != "" {
|
||||
fmt.Printf("try to apply config from environment...\n")
|
||||
if err := s.SetFromEnv(c.EnvPrefix); err != nil {
|
||||
if err := s.SetFromEnv(config.EnvPrefix); err != nil {
|
||||
return fmt.Errorf("can't apply envvars to config:%w", err)
|
||||
}
|
||||
}
|
||||
if c.DSN != "" {
|
||||
fmt.Printf("try to apply config from DSN %s...\n", c.DSN)
|
||||
db, dbname, err := DialDSN(c.DSN)
|
||||
if config.DSN != "" {
|
||||
fmt.Printf("try to apply config from DSN %s...\n", config.DSN)
|
||||
db, dbname, err := DialDSN(config.DSN)
|
||||
if err != nil {
|
||||
return fmt.Errorf("can't dial DB:%w", err)
|
||||
}
|
||||
|
@ -109,15 +109,15 @@ func DialDSN(dsn string) (db *sql.DB, dbname string, err error) {
|
|||
}
|
||||
|
||||
// Method adds and replace config fields from db.
|
||||
func (s Interface) SetFromDB(db *sql.DB, dbname string) error {
|
||||
defer db.Close()
|
||||
func (s Interface) SetFromDB(database *sql.DB, dbname string) error {
|
||||
defer database.Close()
|
||||
res := make(map[string]string)
|
||||
var key, val string
|
||||
|
||||
//TODO: Перенести это в параметры.
|
||||
table := "config"
|
||||
q := "SELECT " + table + ".key, " + table + ".value FROM " + table
|
||||
results, err := db.Query(q)
|
||||
results, err := database.Query(q)
|
||||
if err != nil || results.Err() != nil {
|
||||
return fmt.Errorf("can't get key-value pairs from DB: %w", err)
|
||||
}
|
||||
|
|
|
@ -8,27 +8,27 @@ import (
|
|||
"strings"
|
||||
)
|
||||
|
||||
func getEnvVar(v reflect.Value, t reflect.Type, counter int, prefix string) error {
|
||||
if v.Kind() != reflect.Ptr {
|
||||
func getEnvVar(value reflect.Value, rtype reflect.Type, counter int, prefix string) error {
|
||||
if value.Kind() != reflect.Ptr {
|
||||
return fmt.Errorf("not a pointer value")
|
||||
}
|
||||
f := reflect.StructField{}
|
||||
if counter != -1 {
|
||||
f = t.Field(counter)
|
||||
f = rtype.Field(counter)
|
||||
}
|
||||
v = reflect.Indirect(v)
|
||||
value = reflect.Indirect(value)
|
||||
fName := strings.ToUpper(f.Name)
|
||||
if prefix != "" {
|
||||
prefix = strings.TrimLeft(prefix, "_")
|
||||
}
|
||||
|
||||
env := os.Getenv(prefix + fName)
|
||||
if err := selector(env, &v); err != nil {
|
||||
if err := selector(env, &value); err != nil {
|
||||
return fmt.Errorf("could set value: %w", err)
|
||||
}
|
||||
if v.Kind() == reflect.Struct {
|
||||
for i := 0; i < v.NumField(); i++ {
|
||||
if err := getEnvVar(v.Field(i).Addr(), v.Type(), i, prefix+fName+"_"); err != nil {
|
||||
if value.Kind() == reflect.Struct {
|
||||
for i := 0; i < value.NumField(); i++ {
|
||||
if err := getEnvVar(value.Field(i).Addr(), value.Type(), i, prefix+fName+"_"); err != nil {
|
||||
return fmt.Errorf("could not apply env var: %w", err)
|
||||
}
|
||||
}
|
||||
|
@ -36,27 +36,27 @@ func getEnvVar(v reflect.Value, t reflect.Type, counter int, prefix string) erro
|
|||
return nil
|
||||
}
|
||||
|
||||
func parseToStruct(v reflect.Value, t reflect.Type, counter int, prefix string, kv map[string]string) error {
|
||||
if v.Kind() != reflect.Ptr {
|
||||
func parseToStruct(value reflect.Value, rtype reflect.Type, counter int, prefix string, index map[string]string) error {
|
||||
if value.Kind() != reflect.Ptr {
|
||||
return fmt.Errorf("not a pointer value")
|
||||
}
|
||||
f := reflect.StructField{}
|
||||
if counter != -1 {
|
||||
f = t.Field(counter)
|
||||
f = rtype.Field(counter)
|
||||
}
|
||||
v = reflect.Indirect(v)
|
||||
value = reflect.Indirect(value)
|
||||
fName := strings.ToLower(f.Name)
|
||||
if prefix != "" {
|
||||
prefix = strings.TrimLeft(prefix, ".")
|
||||
}
|
||||
|
||||
env := kv[prefix+fName]
|
||||
if err := selector(env, &v); err != nil {
|
||||
env := index[prefix+fName]
|
||||
if err := selector(env, &value); err != nil {
|
||||
return fmt.Errorf("could set value: %w", err)
|
||||
}
|
||||
if v.Kind() == reflect.Struct {
|
||||
for i := 0; i < v.NumField(); i++ {
|
||||
if err := parseToStruct(v.Field(i).Addr(), v.Type(), i, prefix+fName+".", kv); err != nil {
|
||||
if value.Kind() == reflect.Struct {
|
||||
for i := 0; i < value.NumField(); i++ {
|
||||
if err := parseToStruct(value.Field(i).Addr(), value.Type(), i, prefix+fName+".", index); err != nil {
|
||||
return fmt.Errorf("could not apply env var: %w", err)
|
||||
}
|
||||
}
|
||||
|
@ -64,24 +64,24 @@ func parseToStruct(v reflect.Value, t reflect.Type, counter int, prefix string,
|
|||
return nil
|
||||
}
|
||||
|
||||
func selector(env string, v *reflect.Value) error {
|
||||
func selector(env string, value *reflect.Value) error {
|
||||
if env != "" {
|
||||
switch v.Kind() {
|
||||
//nolint:exhaustive
|
||||
switch value.Kind() {
|
||||
case reflect.Int:
|
||||
envI, err := strconv.Atoi(env)
|
||||
if err != nil {
|
||||
return fmt.Errorf("could not parse to int: %w", err)
|
||||
}
|
||||
v.SetInt(int64(envI))
|
||||
value.SetInt(int64(envI))
|
||||
case reflect.String:
|
||||
v.SetString(env)
|
||||
value.SetString(env)
|
||||
case reflect.Bool:
|
||||
envB, err := strconv.ParseBool(env)
|
||||
if err != nil {
|
||||
return fmt.Errorf("could not parse bool: %w", err)
|
||||
}
|
||||
v.SetBool(envB)
|
||||
case reflect.Array, reflect.Chan, reflect.Complex128, reflect.Complex64, reflect.Float32, reflect.Float64, reflect.Func, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int8, reflect.Interface, reflect.Invalid, reflect.Map, reflect.Ptr, reflect.Slice, reflect.Struct, reflect.Uint, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint8, reflect.Uintptr, reflect.UnsafePointer:
|
||||
value.SetBool(envB)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
//nolint:asasalint,ireturn
|
||||
package logger
|
||||
|
||||
import (
|
||||
|
@ -34,7 +35,7 @@ func New(conf Config) (Interface, error) {
|
|||
return nil, errors.New("invalid logger config")
|
||||
}
|
||||
|
||||
c := amitralog.Configuration{
|
||||
config := amitralog.Configuration{
|
||||
EnableConsole: !conf.MuteStdout,
|
||||
ConsoleLevel: amitralog.Fatal,
|
||||
ConsoleJSONFormat: false,
|
||||
|
@ -44,7 +45,7 @@ func New(conf Config) (Interface, error) {
|
|||
FileLocation: conf.File,
|
||||
}
|
||||
|
||||
if err := amitralog.NewLogger(c, amitralog.InstanceZapLogger); err != nil {
|
||||
if err := amitralog.NewLogger(config, amitralog.InstanceZapLogger); err != nil {
|
||||
log.Fatalf("Could not instantiate log %s", err.Error())
|
||||
}
|
||||
l := amitralog.WithFields(amitralog.Fields{"hw": "15"})
|
||||
|
@ -70,5 +71,6 @@ func (l *Logger) Errorf(format string, args ...interface{}) {
|
|||
|
||||
func (l *Logger) Fatalf(format string, args ...interface{}) {
|
||||
l.Logger.Fatalf(format, args)
|
||||
//nolint:gomnd
|
||||
os.Exit(2)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue