# HG changeset patch # User Axel Prel <axel.prel@xcg-consulting.fr> # Date 1718629875 -7200 # Mon Jun 17 15:11:15 2024 +0200 # Node ID 1edf4f94bac37270cec312690c495eea3ad096af # Parent 6b5f31e47bbc0d52f36dc45ef5a9e673878e7ab4 lint the obvious diff --git a/database/array_contains.go b/database/array_contains.go --- a/database/array_contains.go +++ b/database/array_contains.go @@ -2,7 +2,6 @@ import ( "database/sql/driver" - "fmt" "sort" "strings" @@ -12,7 +11,7 @@ type ArrayContains map[string]interface{} //nolint:revive -func (ac ArrayContains) ToSql() (sql string, args []interface{}, err error) { +func (ac ArrayContains) ToSql() (sql string, args []interface{}, err error) { //nolint:nonamedreturns if len(ac) == 0 { // Empty Sql{} evaluates to true. sql = "(1=1)" @@ -51,7 +50,7 @@ if val == nil { panic("cannot handle NULL values") } else { - expr = fmt.Sprintf("%s @> ?", key) + expr = key + " @> ?" args = append(args, val) } exprs = append(exprs, expr) @@ -67,5 +66,6 @@ sortedKeys = append(sortedKeys, k) } sort.Strings(sortedKeys) + return sortedKeys } diff --git a/database/database.go b/database/database.go --- a/database/database.go +++ b/database/database.go @@ -13,5 +13,6 @@ if maxConn != 0 { db.SetMaxOpenConns(maxConn) } + return db, nil } diff --git a/database/migrations.go b/database/migrations.go --- a/database/migrations.go +++ b/database/migrations.go @@ -12,6 +12,7 @@ "github.com/rs/zerolog" ) +//nolint:dupword //go:generate go-bindata -pkg database -prefix migrations migrations //go:generate sed -i "1s;^;// Code generated by go-bindata. DO NOT EDIT.\\n\\n;" bindata.go @@ -70,6 +71,7 @@ if err != nil { return nil, err } + return m, nil } @@ -86,14 +88,15 @@ log.Warn().Msg("Database is not up-to-date, it will be migrated automatically") m, err := NewMigrate(dsn, sourceDriver) if err != nil { - return fmt.Errorf("failed to init migration engine: %s", err) + return fmt.Errorf("failed to init migration engine: %w", err) } defer m.Close() if err := m.Up(); err != nil { - return fmt.Errorf("error during auto-migration: %s", err) + return fmt.Errorf("error during auto-migration: %w", err) } log.Info().Msg("Successfully upgraded database") + return nil } @@ -101,7 +104,7 @@ func IsUptodate(dsn string, sourceDriver source.Driver) error { m, err := NewMigrate(dsn, sourceDriver) if err != nil { - return fmt.Errorf("failed to check database version: %s", err) + return fmt.Errorf("failed to check database version: %w", err) } // Lookup the last available db version @@ -120,14 +123,14 @@ } version, dirty, err := m.Version() - if err == migrate.ErrNilVersion { + if errors.Is(err, migrate.ErrNilVersion) { return ErrDBNotVersioned } if err != nil { - return fmt.Errorf("error while checking the database version: %s", err) + return fmt.Errorf("error while checking the database version: %w", err) } if dirty { - return fmt.Errorf("database is marked 'dirty'") + return errors.New("database is marked 'dirty'") } if version < lastVersion { @@ -142,5 +145,6 @@ RequiredVersion: lastVersion, } } + return nil } diff --git a/database/sql.go b/database/sql.go --- a/database/sql.go +++ b/database/sql.go @@ -73,6 +73,7 @@ return err } SQLTrace(log, sqlQuery, args) + return e.GetContext(ctx, obj, sqlQuery, args...) } @@ -90,6 +91,7 @@ return err } SQLTrace(log, sqlQuery, args) + return e.SelectContext(ctx, obj, sqlQuery, args...) } @@ -107,6 +109,7 @@ return nil, err } SQLTrace(log, sqlQuery, args) + return e.ExecContext(ctx, sqlQuery, args...) } @@ -119,6 +122,7 @@ return nil, err } SQLTrace(log, sqlQuery, args) + return e.QueryxContext(ctx, sqlQuery, args...) } @@ -130,6 +134,7 @@ for i, column := range columns { values[column] = valuesList[i] } + return values } @@ -143,6 +148,7 @@ Update(m.Table()). SetMap(ValuesMap(m, columns...)).Where( squirrel.Eq{m.PKeyColumn(): m.Values(m.PKeyColumn())}) + return q } @@ -164,7 +170,7 @@ updateParts := strings.Split(updateSQL, " SET ") if len(updateParts) != 2 { - panic("Could not split the UPDATE query: " + updateSQL) + panic("Could not split the UPDATE query: " + updateSQL) } suffix := "ON CONFLICT (" + m.PKeyColumn() + ") DO UPDATE SET " + updateParts[1] @@ -174,6 +180,7 @@ Columns(insertColumns...). Values(m.Values(insertColumns...)...). Suffix(suffix, updateArgs...) + return q } @@ -189,7 +196,7 @@ updateParts := strings.Split(updateSQL, " SET ") if len(updateParts) != 2 { - panic("Could not split the UPDATE query: " + updateSQL) + panic("Could not split the UPDATE query: " + updateSQL) } suffix := "ON CONFLICT (" + strings.Join(keyCols, ",") + ") DO UPDATE SET " + updateParts[1] @@ -200,6 +207,7 @@ Columns(allColumns...). Values(m.Values(allColumns...)...). Suffix(suffix, updateArgs...) + return q } @@ -212,6 +220,7 @@ for _, m := range instances { q = q.Values(m.Values(allColumns...)...) } + return q } @@ -225,6 +234,7 @@ for _, m := range instances { q = q.Values(m.Values(allColumns...)...) } + return q } @@ -234,6 +244,7 @@ for i, name := range columns { prefixed[i] = PrefixColumn(table, name) } + return columns } diff --git a/database/sql_helper.go b/database/sql_helper.go --- a/database/sql_helper.go +++ b/database/sql_helper.go @@ -28,6 +28,7 @@ func (h *SQLHelper) GetRaw(obj interface{}, sql string, args ...interface{}) error { SQLTrace(&h.log, sql, args) + return h.sqle.GetContext(h.ctx, obj, sql, args...) } @@ -72,6 +73,7 @@ Where(pred, args...) _, err := h.Exec(query) + return err } @@ -94,6 +96,7 @@ func (h *SQLHelper) SelectRaw(obj interface{}, sql string, args ...interface{}) error { SQLTrace(&h.log, sql, args) + return h.sqle.SelectContext(h.ctx, obj, sql, args...) } @@ -104,6 +107,7 @@ func (h *SQLHelper) ExecRaw(sql string, args ...interface{}) (sql.Result, error) { SQLTrace(&h.log, sql, args) + return h.sqle.ExecContext(h.ctx, sql, args...) } @@ -115,18 +119,21 @@ // QueryRaw executes a raw SQL query. func (h *SQLHelper) QueryRaw(sql string, args ...interface{}) (*sqlx.Rows, error) { SQLTrace(&h.log, sql, args) + return h.sqle.QueryxContext(h.ctx, sql, args...) } // Insert inserts a Mapped into the db. func (h *SQLHelper) Insert(instances ...Mapped) (sql.Result, error) { query := SQLInsert(instances...) + return h.Exec(query) } // InsertNoPKey inserts a Mapped into the db. func (h *SQLHelper) InsertNoPKey(instances ...Mapped) (sql.Result, error) { query := SQLInsertNoPKey(instances...) + return h.Exec(query) } @@ -138,6 +145,7 @@ return err } } + return nil } @@ -149,6 +157,7 @@ return err } } + return nil } @@ -161,6 +170,7 @@ return err } } + return nil } @@ -170,6 +180,7 @@ if _, err := h.Exec(query); err != nil { return err } + return nil } @@ -181,6 +192,7 @@ return err } } + return nil } @@ -210,5 +222,6 @@ if _, err := h.Exec(sq.Delete(table).Where(filter)); err != nil { return err } + return nil } diff --git a/database/test.go b/database/test.go --- a/database/test.go +++ b/database/test.go @@ -17,21 +17,23 @@ const dbLockID = 15104 func getDSN(tb testing.TB) string { + tb.Helper() dsn := os.Getenv("TEST_DB_DSN") if dsn == "" { tb.Fatal("Please define a TEST_DB_DSN environment variable") } + return dsn } - -func clearDB(ctx context.Context, t testing.TB, c *sqlx.Conn, dsn string) { +func clearDB(ctx context.Context, tb testing.TB, c *sqlx.Conn) { + tb.Helper() // Drop all tables, and reinit if _, err := c.ExecContext(ctx, "DROP SCHEMA IF EXISTS public CASCADE"); err != nil { - t.Fatal(err) + tb.Fatal(err) } if _, err := c.ExecContext(ctx, "CREATE SCHEMA public"); err != nil { - t.Fatal(err) + tb.Fatal(err) } } @@ -46,8 +48,10 @@ // SetTB changes the current tb and returns a function to restore the original one. func (db *TestDB) SetTB(tb testing.TB) func() { + tb.Helper() save := db.tb db.tb = tb + return func() { db.tb = save } @@ -67,7 +71,7 @@ for _, name := range dbtablenames { if _, err := tx.Exec( - "DELETE FROM " + name, + "DELETE FROM " + name, ); err != nil { db.tb.Fatal(err) } @@ -91,6 +95,7 @@ } func GetTestDBNoInit(ctx context.Context, tb testing.TB) *TestDB { + tb.Helper() var success bool dsn := getDSN(tb) @@ -131,27 +136,30 @@ // GetTestDB creates a db and returns it. It must be closed within the test. // If it fails, t.Fatal() is called. -func GetTestDB(ctx context.Context, t testing.TB, sourceDriver source.Driver) *TestDB { - db := GetTestDBNoClear(ctx, t, sourceDriver) +func GetTestDB(ctx context.Context, tb testing.TB, sourceDriver source.Driver) *TestDB { + tb.Helper() + db := GetTestDBNoClear(ctx, tb, sourceDriver) db.ClearDB() + return db } -func GetTestDBNoClear(ctx context.Context, t testing.TB, sourceDriver source.Driver) *TestDB { +func GetTestDBNoClear(ctx context.Context, tb testing.TB, sourceDriver source.Driver) *TestDB { + tb.Helper() var success bool - dsn := getDSN(t) + dsn := getDSN(tb) db, err := Open(dsn, 0) if err != nil { - t.Fatal(err) + tb.Fatal(err) } defer func() { if !success { if ctx.Err() == nil { if err := db.Close(); err != nil { - t.Log("Error closing db:", err) + tb.Log("Error closing db:", err) } } } @@ -159,13 +167,13 @@ c, err := db.Connx(ctx) if err != nil { - t.Fatal(err) + tb.Fatal(err) } defer func() { if !success { if err := c.Close(); err != nil { - t.Log("Error closing conn:", err) + tb.Log("Error closing conn:", err) } } }() @@ -174,25 +182,25 @@ ctx, "SELECT pg_advisory_lock($1)", dbLockID, ); err != nil { - t.Fatal(err) + tb.Fatal(err) } if len(dbtablenames) == 0 { - clearDB(ctx, t, c, dsn) + clearDB(ctx, tb, c) m, err := NewMigrate(dsn, sourceDriver) if err != nil { - t.Fatal(err) + tb.Fatal(err) } if err := m.Up(); err != nil { - t.Fatal(err) + tb.Fatal(err) } if srcErr, dbErr := m.Close(); srcErr != nil || dbErr != nil { - t.Fatal(srcErr, dbErr) + tb.Fatal(srcErr, dbErr) } } - testDB := TestDB{db, dsn, ctx, t, c} + testDB := TestDB{db, dsn, ctx, tb, c} if len(dbtablenames) == 0 { if err := db.Select(&dbtablenames, "SELECT tablename "+ @@ -200,11 +208,12 @@ "WHERE schemaname = 'public' "+ "AND tablename <> 'schema_migrations';", ); err != nil { - t.Fatal(err) + tb.Fatal(err) } } success = true + return &testDB } diff --git a/database/tx.go b/database/tx.go --- a/database/tx.go +++ b/database/tx.go @@ -2,7 +2,7 @@ import ( "context" - "fmt" + "errors" "github.com/jmoiron/sqlx" "github.com/rs/zerolog" @@ -26,6 +26,7 @@ if err != nil { return nil, err } + return &Tx{tx, TxOpened}, nil } @@ -39,18 +40,20 @@ // Commit commits the transaction. func (tx *Tx) Commit() error { if tx.state != TxOpened { - return fmt.Errorf("transaction is not open") + return errors.New("transaction is not open") } tx.state = TxCommitted + return tx.Tx.Commit() } // Rollback rollbacks the transaction. func (tx *Tx) Rollback() error { if tx.state != TxOpened { - return fmt.Errorf("transaction is not open") + return errors.New("transaction is not open") } tx.state = TxRolledback + return tx.Tx.Rollback() } diff --git a/log-console-writer.go b/log-console-writer.go --- a/log-console-writer.go +++ b/log-console-writer.go @@ -114,7 +114,7 @@ d.UseNumber() err = d.Decode(&evt) if err != nil { - return n, fmt.Errorf("cannot decode event: %s", err) + return n, fmt.Errorf("cannot decode event: %w", err) } for _, p := range w.PartsOrder { @@ -128,6 +128,7 @@ return n, err } _, err = buf.WriteTo(w.Out) + return len(p), err } @@ -175,7 +176,8 @@ var fn Formatter var fv Formatter - if field == zerolog.ErrorFieldName { + switch field { + case zerolog.ErrorFieldName: if w.FormatErrFieldName == nil { fn = consoleDefaultFormatErrFieldName(w.NoColor) } else { @@ -187,7 +189,7 @@ } else { fv = w.FormatErrFieldValue } - } else if field == ExceptionFieldName { + case ExceptionFieldName: if w.FormatExcFieldName == nil { fn = consoleDefaultFormatExcFieldName(w.NoColor) } else { @@ -199,7 +201,7 @@ } else { fv = w.FormatExcFieldValue } - } else { + default: if w.FormatFieldName == nil { fn = consoleDefaultFormatFieldName(w.NoColor) } else { @@ -293,6 +295,7 @@ return true } } + return false } @@ -301,6 +304,7 @@ if disabled { return fmt.Sprintf("%s", s) } + return fmt.Sprintf("\x1b[%dm%v\x1b[0m", c, s) } @@ -319,6 +323,7 @@ if timeFormat == "" { timeFormat = consoleDefaultTimeFormat } + return func(i interface{}) string { t := "<nil>" switch tt := i.(type) { @@ -347,6 +352,7 @@ t = ts.Format(timeFormat) } } + return colorize(t, colorDarkGray, noColor) } } @@ -380,6 +386,7 @@ l = strings.ToUpper(fmt.Sprintf("%s", i))[0:3] } } + return l } } @@ -398,6 +405,7 @@ } c = colorize(c, colorBold, noColor) + colorize(" >", colorCyan, noColor) } + return c } } @@ -406,6 +414,7 @@ if i == nil { return "" } + return fmt.Sprintf("%s", i) } @@ -454,10 +463,12 @@ for _, frame := range e.Stacktrace.Frames { s += PrintFrame(frame) } + return s } } } + return colorize(fmt.Sprintf("%s", i), colorRed, noColor) } } diff --git a/log-console-writer_test.go b/log-console-writer_test.go --- a/log-console-writer_test.go +++ b/log-console-writer_test.go @@ -1,4 +1,4 @@ -package orusapi +package orusapi_test import ( "bytes" @@ -14,17 +14,19 @@ "github.com/getsentry/sentry-go" "github.com/rs/zerolog" "github.com/stretchr/testify/assert" + + "orus.io/orus-io/go-orusapi" ) func ExampleConsoleWriter() { - log := zerolog.New(ConsoleWriter{Out: os.Stdout, NoColor: true}) + log := zerolog.New(orusapi.ConsoleWriter{Out: os.Stdout, NoColor: true}) log.Info().Str("foo", "bar").Msg("Hello World") // Output: <nil> INF Hello World foo=bar } func ExampleConsoleWriter_customFormatters() { - out := ConsoleWriter{Out: os.Stdout, NoColor: true} + out := orusapi.ConsoleWriter{Out: os.Stdout, NoColor: true} out.FormatLevel = func(i interface{}) string { return strings.ToUpper(fmt.Sprintf("%-6s|", i)) } out.FormatFieldName = func(i interface{}) string { return fmt.Sprintf("%s:", i) } out.FormatFieldValue = func(i interface{}) string { return strings.ToUpper(fmt.Sprintf("%s", i)) } @@ -44,8 +46,8 @@ } func ExampleNewConsoleWriter_customFormatters() { - out := NewConsoleWriter( - func(w *ConsoleWriter) { + out := orusapi.NewConsoleWriter( + func(w *orusapi.ConsoleWriter) { // Customize time format w.TimeFormat = time.RFC822 // Customize level formatting @@ -63,13 +65,14 @@ func TestConsoleLogger(t *testing.T) { t.Run("Numbers", func(t *testing.T) { buf := &bytes.Buffer{} - log := zerolog.New(ConsoleWriter{Out: buf, NoColor: true}) + log := zerolog.New(orusapi.ConsoleWriter{Out: buf, NoColor: true}) log.Info(). Float64("float", 1.23). Uint64("small", 123). Uint64("big", 1152921504606846976). Msg("msg") - if got, want := strings.TrimSpace(buf.String()), "<nil> INF msg big=1152921504606846976 float=1.23 small=123"; got != want { + if got, want := strings.TrimSpace(buf.String()), + "<nil> INF msg big=1152921504606846976 float=1.23 small=123"; got != want { t.Errorf("\ngot:\n%s\nwant:\n%s", got, want) } }) @@ -78,7 +81,7 @@ func TestConsoleWriter(t *testing.T) { t.Run("Default field formatter", func(t *testing.T) { buf := &bytes.Buffer{} - w := ConsoleWriter{Out: buf, NoColor: true, PartsOrder: []string{"foo"}} + w := orusapi.ConsoleWriter{Out: buf, NoColor: true, PartsOrder: []string{"foo"}} _, err := w.Write([]byte(`{"foo": "DEFAULT"}`)) if err != nil { @@ -94,7 +97,7 @@ t.Run("Write colorized", func(t *testing.T) { buf := &bytes.Buffer{} - w := ConsoleWriter{Out: buf, NoColor: false} + w := orusapi.ConsoleWriter{Out: buf, NoColor: false} _, err := w.Write([]byte(`{"level": "warn", "message": "Foobar"}`)) if err != nil { @@ -110,7 +113,7 @@ t.Run("Write fields", func(t *testing.T) { buf := &bytes.Buffer{} - w := ConsoleWriter{Out: buf, NoColor: true} + w := orusapi.ConsoleWriter{Out: buf, NoColor: true} d := time.Unix(0, 0).UTC().Format(time.RFC3339) _, err := w.Write([]byte(`{"time": "` + d + `", "level": "debug", "message": "Foobar", "foo": "bar"}`)) @@ -133,7 +136,7 @@ zerolog.TimeFieldFormat = zerolog.TimeFormatUnix buf := &bytes.Buffer{} - w := ConsoleWriter{Out: buf, TimeFormat: time.StampMilli, NoColor: true} + w := orusapi.ConsoleWriter{Out: buf, TimeFormat: time.StampMilli, NoColor: true} _, err := w.Write([]byte(`{"time": 1234, "level": "debug", "message": "Foobar", "foo": "bar"}`)) if err != nil { @@ -155,7 +158,7 @@ zerolog.TimeFieldFormat = zerolog.TimeFormatUnixMs buf := &bytes.Buffer{} - w := ConsoleWriter{Out: buf, TimeFormat: time.StampMilli, NoColor: true} + w := orusapi.ConsoleWriter{Out: buf, TimeFormat: time.StampMilli, NoColor: true} _, err := w.Write([]byte(`{"time": 1234567, "level": "debug", "message": "Foobar", "foo": "bar"}`)) if err != nil { @@ -177,7 +180,7 @@ zerolog.TimeFieldFormat = zerolog.TimeFormatUnixMicro buf := &bytes.Buffer{} - w := ConsoleWriter{Out: buf, TimeFormat: time.StampMicro, NoColor: true} + w := orusapi.ConsoleWriter{Out: buf, TimeFormat: time.StampMicro, NoColor: true} _, err := w.Write([]byte(`{"time": 1234567891, "level": "debug", "message": "Foobar", "foo": "bar"}`)) if err != nil { @@ -193,7 +196,7 @@ t.Run("No message field", func(t *testing.T) { buf := &bytes.Buffer{} - w := ConsoleWriter{Out: buf, NoColor: true} + w := orusapi.ConsoleWriter{Out: buf, NoColor: true} _, err := w.Write([]byte(`{"level": "debug", "foo": "bar"}`)) if err != nil { @@ -209,7 +212,7 @@ t.Run("No level field", func(t *testing.T) { buf := &bytes.Buffer{} - w := ConsoleWriter{Out: buf, NoColor: true} + w := orusapi.ConsoleWriter{Out: buf, NoColor: true} _, err := w.Write([]byte(`{"message": "Foobar", "foo": "bar"}`)) if err != nil { @@ -225,7 +228,7 @@ t.Run("Write colorized fields", func(t *testing.T) { buf := &bytes.Buffer{} - w := ConsoleWriter{Out: buf, NoColor: false} + w := orusapi.ConsoleWriter{Out: buf, NoColor: false} _, err := w.Write([]byte(`{"level": "warn", "message": "Foobar", "foo": "bar"}`)) if err != nil { @@ -241,7 +244,7 @@ t.Run("Write error field", func(t *testing.T) { buf := &bytes.Buffer{} - w := ConsoleWriter{Out: buf, NoColor: true} + w := orusapi.ConsoleWriter{Out: buf, NoColor: true} d := time.Unix(0, 0).UTC().Format(time.RFC3339) evt := `{"time": "` + d + `", "level": "error", "message": "Foobar", "aaa": "bbb", "error": "Error"}` @@ -261,7 +264,7 @@ t.Run("Write caller field", func(t *testing.T) { buf := &bytes.Buffer{} - w := ConsoleWriter{Out: buf, NoColor: true} + w := orusapi.ConsoleWriter{Out: buf, NoColor: true} cwd, err := os.Getwd() if err != nil { @@ -269,7 +272,9 @@ } d := time.Unix(0, 0).UTC().Format(time.RFC3339) - evt := `{"time": "` + d + `", "level": "debug", "message": "Foobar", "foo": "bar", "caller": "` + cwd + `/foo/bar.go"}` + evt := `{"time": "` + d + + `", "level": "debug", "message": "Foobar", "foo": "bar", "caller": "` + + cwd + `/foo/bar.go"}` // t.Log(evt) _, err = w.Write([]byte(evt)) @@ -286,7 +291,7 @@ t.Run("Write JSON field", func(t *testing.T) { buf := &bytes.Buffer{} - w := ConsoleWriter{Out: buf, NoColor: true} + w := orusapi.ConsoleWriter{Out: buf, NoColor: true} evt := `{"level": "debug", "message": "Foobar", "foo": [1, 2, 3], "bar": true}` // t.Log(evt) @@ -305,7 +310,7 @@ t.Run("Write exception", func(t *testing.T) { buf := &bytes.Buffer{} - w := ConsoleWriter{Out: buf, NoColor: true} + w := orusapi.ConsoleWriter{Out: buf, NoColor: true} b := debug.Stack() t.Log(string(b)) @@ -317,7 +322,8 @@ t.FailNow() } - evt := `{"level": "error", "message": "Foobar", "exception": {"type": "any", "value": "error!", "stacktrace": ` + string(b) + `}}` + evt := `{"level": "error", "message": "Foobar", "exception": {"type": "any", "value": "error!", "stacktrace": ` + + string(b) + `}}` _, err = w.Write([]byte(evt)) if err != nil { @@ -327,8 +333,8 @@ wd, err := os.Getwd() assert.NoError(t, err) expectedOutput := fmt.Sprintf(`<nil> ERR Foobar exception=error!(any) -orus.io/orus-io/go-orusapi.TestConsoleWriter.func13 - %s/log-console-writer_test.go:313 +orus.io/orus-io/go-orusapi_test.TestConsoleWriter.func13 + %s/log-console-writer_test.go:318 `, wd) actualOutput := buf.String() @@ -342,7 +348,7 @@ func TestConsoleWriterConfiguration(t *testing.T) { t.Run("Sets TimeFormat", func(t *testing.T) { buf := &bytes.Buffer{} - w := ConsoleWriter{Out: buf, NoColor: true, TimeFormat: time.RFC3339} + w := orusapi.ConsoleWriter{Out: buf, NoColor: true, TimeFormat: time.RFC3339} d := time.Unix(0, 0).UTC().Format(time.RFC3339) evt := `{"time": "` + d + `", "level": "info", "message": "Foobar"}` @@ -361,7 +367,7 @@ t.Run("Sets PartsOrder", func(t *testing.T) { buf := &bytes.Buffer{} - w := ConsoleWriter{Out: buf, NoColor: true, PartsOrder: []string{"message", "level"}} + w := orusapi.ConsoleWriter{Out: buf, NoColor: true, PartsOrder: []string{"message", "level"}} evt := `{"level": "info", "message": "Foobar"}` _, err := w.Write([]byte(evt)) @@ -383,7 +389,7 @@ msg := []byte(`{"level": "info", "foo": "bar", "message": "HELLO", "time": "1990-01-01"}`) - w := ConsoleWriter{Out: io.Discard, NoColor: false} + w := orusapi.ConsoleWriter{Out: io.Discard, NoColor: false} for i := 0; i < b.N; i++ { _, _ = w.Write(msg) diff --git a/log_middlewares.go b/log_middlewares.go --- a/log_middlewares.go +++ b/log_middlewares.go @@ -21,11 +21,13 @@ hlog.AccessHandler(func(r *http.Request, status, size int, duration time.Duration) { log := hlog.FromRequest(r) var event *zerolog.Event - if status >= http.StatusInternalServerError { + //nolint:zerologlint + switch { + case status >= http.StatusInternalServerError: event = log.Error() - } else if status >= http.StatusBadRequest { + case status >= http.StatusBadRequest: event = log.WithLevel(status4XXLogLevel) - } else { + default: event = log.Info() } event. diff --git a/logging.go b/logging.go --- a/logging.go +++ b/logging.go @@ -15,6 +15,7 @@ if err := o.Setup(log, output); err != nil { return nil, err } + return &o, nil } @@ -23,6 +24,7 @@ if err != nil { panic(err) } + return o } @@ -106,6 +108,7 @@ return fmt.Errorf("invalid log-format: %s", format) } o.resetOutput() + return nil } o.Verbose = func() { @@ -130,6 +133,7 @@ return err } *o.log = o.log.Level(level) + return nil } if err := o.Format("auto"); err != nil { @@ -139,5 +143,6 @@ return err } logLevelAutoLocked = true + return nil } diff --git a/logging_test.go b/logging_test.go --- a/logging_test.go +++ b/logging_test.go @@ -1,4 +1,4 @@ -package orusapi +package orusapi_test import ( "bytes" @@ -7,6 +7,8 @@ "github.com/rs/zerolog" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + "orus.io/orus-io/go-orusapi" ) func TestLogging(t *testing.T) { @@ -15,25 +17,25 @@ log zerolog.Logger ) - var o LoggingOptions + var o orusapi.LoggingOptions require.NoError(t, o.Setup(&log, &buf)) - assert.Equal(t, zerolog.WarnLevel, o.log.GetLevel()) + assert.Equal(t, zerolog.WarnLevel, o.Logger().GetLevel()) o.Verbose() - assert.Equal(t, zerolog.InfoLevel, o.log.GetLevel()) + assert.Equal(t, zerolog.InfoLevel, o.Logger().GetLevel()) o.Verbose() - assert.Equal(t, zerolog.DebugLevel, o.log.GetLevel()) + assert.Equal(t, zerolog.DebugLevel, o.Logger().GetLevel()) o.Verbose() - assert.Equal(t, zerolog.TraceLevel, o.log.GetLevel()) + assert.Equal(t, zerolog.TraceLevel, o.Logger().GetLevel()) require.NoError(t, o.Level("fatal")) - assert.Equal(t, zerolog.FatalLevel, o.log.GetLevel()) + assert.Equal(t, zerolog.FatalLevel, o.Logger().GetLevel()) require.NoError(t, o.Level("info")) - assert.Equal(t, zerolog.InfoLevel, o.log.GetLevel()) + assert.Equal(t, zerolog.InfoLevel, o.Logger().GetLevel()) require.NoError(t, o.Format("pretty")) log.Warn().Msg("this is a warning") diff --git a/prometheus_middleware.go b/prometheus_middleware.go --- a/prometheus_middleware.go +++ b/prometheus_middleware.go @@ -16,6 +16,7 @@ return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { if strings.HasPrefix(r.URL.Path, path) { handler.ServeHTTP(rw, r) + return } @@ -23,6 +24,7 @@ rw.Header().Set("Content-Type", "text/plain") rw.WriteHeader(http.StatusNotFound) _, _ = rw.Write([]byte(fmt.Sprintf("%q not found", path))) + return } next.ServeHTTP(rw, r) diff --git a/redoc.go b/redoc.go --- a/redoc.go +++ b/redoc.go @@ -60,6 +60,7 @@ rw.WriteHeader(http.StatusOK) _, _ = rw.Write(b) + return } @@ -67,6 +68,7 @@ rw.Header().Set("Content-Type", "text/plain") rw.WriteHeader(http.StatusNotFound) _, _ = rw.Write([]byte(fmt.Sprintf("%q not found", pth))) + return } next.ServeHTTP(rw, r) diff --git a/scripts/generate_db_helpers.go b/scripts/generate_db_helpers.go --- a/scripts/generate_db_helpers.go +++ b/scripts/generate_db_helpers.go @@ -36,6 +36,7 @@ fields = append(fields, field) } } + return fields } @@ -105,6 +106,7 @@ file, func(name, doc string, structType *ast.StructType) error { topLevel.AllStructs[name] = structType + return nil }); err != nil { panic(err) @@ -116,6 +118,7 @@ file, func(dbstruct DBStruct) error { topLevel.DBStructs = append(topLevel.DBStructs, dbstruct) + return nil }); err != nil { panic(err) @@ -155,6 +158,7 @@ } } } + return nil } @@ -172,6 +176,7 @@ if dbstruct != nil { return visit(*dbstruct) } + return nil }) } @@ -182,6 +187,7 @@ return line } } + return "" } @@ -191,7 +197,7 @@ } tags, err := structtag.Parse(tag) if err != nil { - return nil, fmt.Errorf("error parsing tag `%s`: %s", tag, err) + return nil, fmt.Errorf("error parsing tag `%s`: %w", tag, err) } tableTag, err := tags.Get("dbtable") @@ -231,9 +237,10 @@ } func getDBFields(topLevel *Package, structType *ast.StructType) ([]DBField, error) { - var dbfields []DBField + allFields := topLevel.getAllFields(structType) + dbfields := make([]DBField, 0, len(allFields)) - for _, field := range topLevel.getAllFields(structType) { + for _, field := range allFields { if field.Tag == nil || len(field.Tag.Value) < 2 { continue } diff --git a/sentry.go b/sentry.go --- a/sentry.go +++ b/sentry.go @@ -25,6 +25,7 @@ }) if err != nil { log.Err(err).Msg("Could not initialize sentry") + return } hub := sentry.NewHub(client, sentry.NewScope()) @@ -34,9 +35,10 @@ return SentryLogger{hub, next, &sentryOptions} }) // OnShutdown(func() { - //hub.Flush(time.Second) - //}) + // hub.Flush(time.Second) + // }) } + return &sentryOptions } @@ -60,6 +62,7 @@ return buildEvent(tagNames, p) } } + return nil } @@ -99,6 +102,7 @@ default: event.Extra["user."+field] = iter.Read() } + return true }) { return false @@ -121,11 +125,13 @@ value = value[:200] } event.Tags[tag] = value + return true } } event.Extra[field] = iter.Read() } + return true }) { return nil @@ -136,13 +142,15 @@ } else if event.Request != nil && event.Request.Method != "" { event.Message = event.Request.Method + " " + event.Request.URL + ": " + event.Message } + return event } // Write ... -func (l SentryLogger) Write(p []byte) (n int, err error) { +func (l SentryLogger) Write(p []byte) (int, error) { if event := buildEventIfLevelGtWarn(l.options.TagNames, p); event != nil { l.hub.CaptureEvent(event) } + return l.next.Write(p) } diff --git a/server.go b/server.go --- a/server.go +++ b/server.go @@ -7,7 +7,6 @@ "crypto/tls" "crypto/x509" "errors" - "fmt" "net" "net/http" "os" @@ -55,6 +54,7 @@ s.shutdown = make(chan struct{}) s.api = api s.interrupt = make(chan os.Signal, 1) + return s } @@ -122,6 +122,7 @@ if api == nil { s.api = nil s.handler = nil + return } @@ -139,6 +140,7 @@ return true } } + return false } @@ -273,7 +275,7 @@ caCertPool := x509.NewCertPool() ok := caCertPool.AppendCertsFromPEM(caCert) if !ok { - return fmt.Errorf("cannot parse CA certificate") + return errors.New("cannot parse CA certificate") } httpsServer.TLSConfig.ClientCAs = caCertPool httpsServer.TLSConfig.ClientAuth = tls.RequireAndVerifyClientCert @@ -288,6 +290,7 @@ if s.TLSCertificateKey == "" { return errors.New("the required flags `--tls-certificate` and `--tls-key` were not specified") } + return errors.New("the required flag `--tls-certificate` was not specified") } if s.TLSCertificateKey == "" { @@ -318,6 +321,7 @@ go s.handleShutdown(wg, &servers) wg.Wait() + return nil } @@ -389,6 +393,7 @@ } s.hasListeners = true + return nil } @@ -397,6 +402,7 @@ if atomic.CompareAndSwapInt32(&s.shuttingDown, 0, 1) { close(s.shutdown) } + return nil } @@ -462,6 +468,7 @@ return nil, err } } + return s.domainSocketL, nil } @@ -472,6 +479,7 @@ return nil, err } } + return s.httpServerL, nil } @@ -482,6 +490,7 @@ return nil, err } } + return s.httpsServerL, nil } @@ -490,6 +499,7 @@ for range s.interrupt { if s.interrupted { s.Logf("Server already shutting down") + continue } s.interrupted = true diff --git a/testutils/defered_errcheck.go b/testutils/defered_errcheck.go --- a/testutils/defered_errcheck.go +++ b/testutils/defered_errcheck.go @@ -8,5 +8,6 @@ // DeferedErrCheck ... func DeferedErrCheck(tb testing.TB, cb func() error) { + tb.Helper() assert.NoError(tb, cb()) } diff --git a/testutils/logger.go b/testutils/logger.go --- a/testutils/logger.go +++ b/testutils/logger.go @@ -9,6 +9,8 @@ // NewTestLogger creates a TestLogger. func NewTestLogger(tb testing.TB) *TestLogger { + tb.Helper() + return &TestLogger{tb} } @@ -26,6 +28,7 @@ if os.Getenv("TEST_QUIET") != "" { level = zerolog.InfoLevel } + return zerolog.New(zerolog.ConsoleWriter{Out: tl}). With().Timestamp().Logger(). Level(level) @@ -34,14 +37,17 @@ // Write writes the given string to t.Logf. func (tl *TestLogger) Write(m []byte) (int, error) { tl.tb.Logf(string(m)) + return len(m), nil } // SetTB changes the current TB, and returns a function to get back to the // previous one. func (tl *TestLogger) SetTB(tb testing.TB) func() { + tb.Helper() otb := tl.tb tl.tb = tb + return func() { tl.tb = otb } @@ -49,5 +55,7 @@ // GetLogger returns a test Logger. func GetLogger(tb testing.TB) zerolog.Logger { + tb.Helper() + return NewTestLogger(tb).Logger() } diff --git a/version.go b/version.go --- a/version.go +++ b/version.go @@ -24,6 +24,7 @@ func InjectVersion(versionTag, vcsCommit string) func(json.RawMessage) json.RawMessage { jsonFixVersionAttribute := JSONFixVersionAttribute(versionTag, vcsCommit) + return func(swaggerJSON json.RawMessage) json.RawMessage { return versionAttrRe.ReplaceAllFunc(swaggerJSON, jsonFixVersionAttribute) } @@ -40,5 +41,6 @@ if err := json.Unmarshal(swaggerJSON, &sv); err != nil { panic(err) } + return sv.Info.Version }