diff --git a/CHANGELOG.md b/CHANGELOG.md index 6478fea..e950e60 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - More complete example test for `nilerror` package. [PR #27](https://github.com/riverqueue/rivercontrib/pull/27). +### Fixed + +- Fix GitHub import path for `nilerror` package. [PR #29](https://github.com/riverqueue/rivercontrib/pull/29). +- Fix compliance of `nilerror.Hook` to `rivertype.HookWorkEnd` interface. [PR #30](https://github.com/riverqueue/rivercontrib/pull/30). + ## [0.5.0] - 2025-05-02 ### Added diff --git a/datadogriver/example_global_provider_test.go b/datadogriver/example_global_provider_test.go index fe7d67f..8ba9034 100644 --- a/datadogriver/example_global_provider_test.go +++ b/datadogriver/example_global_provider_test.go @@ -2,6 +2,7 @@ package datadogriver_test import ( "log/slog" + "os" ddotel "github.com/DataDog/dd-trace-go/v2/ddtrace/opentelemetry" "go.opentelemetry.io/otel" @@ -19,7 +20,7 @@ func Example_globalProvider() { otel.SetTracerProvider(provider) _, err := river.NewClient(riverpgxv5.New(nil), &river.Config{ - Logger: slog.New(&slogutil.SlogMessageOnlyHandler{Level: slog.LevelWarn}), + Logger: slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelWarn, ReplaceAttr: slogutil.NoLevelTime})), Middleware: []rivertype.Middleware{ // Install the OpenTelemetry middleware to run for all jobs inserted // or worked by this River client. The global provider is used. diff --git a/datadogriver/example_injected_provider_test.go b/datadogriver/example_injected_provider_test.go index c32ef16..c8d9170 100644 --- a/datadogriver/example_injected_provider_test.go +++ b/datadogriver/example_injected_provider_test.go @@ -2,6 +2,7 @@ package datadogriver_test import ( "log/slog" + "os" ddotel "github.com/DataDog/dd-trace-go/v2/ddtrace/opentelemetry" @@ -17,7 +18,7 @@ func Example_injectedProvider() { defer func() { _ = provider.Shutdown() }() _, err := river.NewClient(riverpgxv5.New(nil), &river.Config{ - Logger: slog.New(&slogutil.SlogMessageOnlyHandler{Level: slog.LevelWarn}), + Logger: slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelWarn, ReplaceAttr: slogutil.NoLevelTime})), Middleware: []rivertype.Middleware{ // Install the OpenTelemetry middleware to run for all jobs inserted // or worked by this River client. Inject a specific DataDog provider. diff --git a/nilerror/example_hook_test.go b/nilerror/example_hook_test.go index 009728f..456754c 100644 --- a/nilerror/example_hook_test.go +++ b/nilerror/example_hook_test.go @@ -3,6 +3,7 @@ package nilerror_test import ( "context" "log/slog" + "os" "github.com/jackc/pgx/v5/pgxpool" @@ -56,7 +57,7 @@ func ExampleHook() { // Alternatively, return an error and fail jobs instead. // nilerror.NewHook(nil), }, - Logger: slog.New(&slogutil.SlogMessageOnlyHandler{Level: slog.LevelWarn}), + Logger: slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelWarn, ReplaceAttr: slogutil.NoLevelTime})), Queues: map[string]river.QueueConfig{ river.QueueDefault: {MaxWorkers: 100}, }, @@ -88,5 +89,5 @@ func ExampleHook() { } // Output: - // nilerror.Hook: Got non-nil error containing nil internal value (see: https://go.dev/doc/faq#nil_error); probably a bug: (*nilerror_test.CustomError)() + // msg="nilerror.Hook: Got non-nil error containing nil internal value (see: https://go.dev/doc/faq#nil_error); probably a bug: (*nilerror_test.CustomError)()" } diff --git a/nilerror/go.mod b/nilerror/go.mod index b8ae44a..da0031b 100644 --- a/nilerror/go.mod +++ b/nilerror/go.mod @@ -5,9 +5,9 @@ go 1.24.2 require ( github.com/jackc/pgx/v5 v5.7.4 github.com/riverqueue/river v0.21.0 - github.com/riverqueue/river/riverdriver/riverpgxv5 v0.21.0 - github.com/riverqueue/river/rivershared v0.21.0 - github.com/riverqueue/river/rivertype v0.21.0 + github.com/riverqueue/river/riverdriver/riverpgxv5 v0.27.0 + github.com/riverqueue/river/rivershared v0.27.0 + github.com/riverqueue/river/rivertype v0.27.0 github.com/stretchr/testify v1.10.0 ) @@ -17,7 +17,7 @@ require ( github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jackc/puddle/v2 v2.2.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/riverqueue/river/riverdriver v0.21.0 // indirect + github.com/riverqueue/river/riverdriver v0.27.0 // indirect github.com/tidwall/gjson v1.18.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect diff --git a/nilerror/hook.go b/nilerror/hook.go index f974d83..e3f4acb 100644 --- a/nilerror/hook.go +++ b/nilerror/hook.go @@ -23,6 +23,9 @@ import ( "github.com/riverqueue/river/rivertype" ) +// Verify interface compliance. +var _ rivertype.HookWorkEnd = &Hook{} + // HookConfig is configuration for the nilerror hook. type HookConfig struct { // Suppress causes the hook to suppress detected nil struct values wrapped @@ -37,6 +40,7 @@ type HookConfig struct { type Hook struct { baseservice.BaseService rivertype.Hook + config *HookConfig } @@ -50,7 +54,7 @@ func NewHook(config *HookConfig) *Hook { return &Hook{config: config} } -func (h *Hook) WorkEnd(ctx context.Context, err error) error { +func (h *Hook) WorkEnd(ctx context.Context, _ *rivertype.JobRow, err error) error { if err != nil { errVal := reflect.ValueOf(err) if errVal.IsNil() { diff --git a/nilerror/hook_test.go b/nilerror/hook_test.go index c7b113a..0cca541 100644 --- a/nilerror/hook_test.go +++ b/nilerror/hook_test.go @@ -13,11 +13,6 @@ import ( "github.com/riverqueue/river/rivertype" ) -// Verify interface compliance. -var ( - _ rivertype.HookWorkEnd = &Hook{} -) - type myCustomError struct{} func (*myCustomError) Error() string { @@ -51,7 +46,7 @@ func TestHook(t *testing.T) { hook, _ := setup(t) - require.NoError(t, hook.WorkEnd(ctx, nil)) + require.NoError(t, hook.WorkEnd(ctx, &rivertype.JobRow{}, nil)) }) t.Run("NonNilError", func(t *testing.T) { @@ -60,7 +55,7 @@ func TestHook(t *testing.T) { hook, _ := setup(t) myCustomErr := &myCustomError{} - require.Equal(t, myCustomErr, hook.WorkEnd(ctx, myCustomErr)) + require.Equal(t, myCustomErr, hook.WorkEnd(ctx, &rivertype.JobRow{}, myCustomErr)) }) t.Run("NilError", func(t *testing.T) { @@ -69,7 +64,7 @@ func TestHook(t *testing.T) { hook, _ := setup(t) var myCustomErr *myCustomError - require.EqualError(t, hook.WorkEnd(ctx, myCustomErr), + require.EqualError(t, hook.WorkEnd(ctx, &rivertype.JobRow{}, myCustomErr), "non-nil error containing nil internal value (see: https://go.dev/doc/faq#nil_error); probably a bug: (*nilerror.myCustomError)()", ) }) @@ -80,13 +75,13 @@ func TestHook(t *testing.T) { hook, _ := setupConfig(t, &HookConfig{Suppress: true}) var logBuf bytes.Buffer - hook.Logger = slog.New(&slogutil.SlogMessageOnlyHandler{Level: slog.LevelWarn, Out: &logBuf}) + hook.Logger = slog.New(slog.NewTextHandler(&logBuf, &slog.HandlerOptions{Level: slog.LevelWarn, ReplaceAttr: slogutil.NoLevelTime})) var myCustomErr *myCustomError - require.NoError(t, hook.WorkEnd(ctx, myCustomErr)) + require.NoError(t, hook.WorkEnd(ctx, &rivertype.JobRow{}, myCustomErr)) require.Equal(t, - "nilerror.Hook: Got non-nil error containing nil internal value (see: https://go.dev/doc/faq#nil_error); probably a bug: (*nilerror.myCustomError)()\n", + `msg="nilerror.Hook: Got non-nil error containing nil internal value (see: https://go.dev/doc/faq#nil_error); probably a bug: (*nilerror.myCustomError)()"`+"\n", logBuf.String()) }) } diff --git a/otelriver/example_middleware_test.go b/otelriver/example_middleware_test.go index 5300cbe..ce18a39 100644 --- a/otelriver/example_middleware_test.go +++ b/otelriver/example_middleware_test.go @@ -2,6 +2,7 @@ package otelriver_test import ( "log/slog" + "os" "github.com/riverqueue/river" "github.com/riverqueue/river/riverdriver/riverpgxv5" @@ -12,7 +13,7 @@ import ( func ExampleMiddleware() { _, err := river.NewClient(riverpgxv5.New(nil), &river.Config{ - Logger: slog.New(&slogutil.SlogMessageOnlyHandler{Level: slog.LevelWarn}), + Logger: slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelWarn, ReplaceAttr: slogutil.NoLevelTime})), Middleware: []rivertype.Middleware{ // Install the OpenTelemetry middleware to run for all jobs inserted // or worked by this River client.