From f8b0099f194f435e58d149f4df11f008aabbc647 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 24 Feb 2023 13:57:36 +0000 Subject: [PATCH] Bump github.com/teivah/onecontext Bumps [github.com/teivah/onecontext](https://github.com/teivah/onecontext) from 0.0.0-20200513185103-40f981bfd775 to 1.3.0. - [Release notes](https://github.com/teivah/onecontext/releases) - [Commits](https://github.com/teivah/onecontext/commits/v1.3.0) --- updated-dependencies: - dependency-name: github.com/teivah/onecontext dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 9 +- vendor/github.com/teivah/onecontext/README.md | 28 +++-- vendor/github.com/teivah/onecontext/detach.go | 51 +++++++++ vendor/github.com/teivah/onecontext/go.mod | 5 +- vendor/github.com/teivah/onecontext/go.sum | 28 ++++- .../teivah/onecontext/onecontext.go | 104 +++++++++--------- vendor/github.com/teivah/onecontext/reset.go | 38 +++++++ vendor/modules.txt | 2 +- 9 files changed, 195 insertions(+), 72 deletions(-) create mode 100644 vendor/github.com/teivah/onecontext/detach.go create mode 100644 vendor/github.com/teivah/onecontext/reset.go diff --git a/go.mod b/go.mod index 8a09d416..9b571d87 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/cenkalti/backoff/v4 v4.1.1 github.com/emirpasic/gods v1.12.0 github.com/stretchr/testify v1.8.0 - github.com/teivah/onecontext v0.0.0-20200513185103-40f981bfd775 + github.com/teivah/onecontext v1.3.0 go.uber.org/goleak v1.1.12 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c ) diff --git a/go.sum b/go.sum index 254221ee..e063a93f 100644 --- a/go.sum +++ b/go.sum @@ -15,14 +15,15 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/teivah/onecontext v0.0.0-20200513185103-40f981bfd775 h1:BLNsFR8l/hj/oGjnJXkd4Vi3s4kQD3/3x8HSAE4bzN0= -github.com/teivah/onecontext v0.0.0-20200513185103-40f981bfd775/go.mod h1:XUZ4x3oGhWfiOnUvTslnKKs39AWUct3g3yJvXTQSJOQ= +github.com/teivah/onecontext v1.3.0 h1:tbikMhAlo6VhAuEGCvhc8HlTnpX4xTNPTOseWuhO1J0= +github.com/teivah/onecontext v1.3.0/go.mod h1:hoW1nmdPVK/0jrvGtcx8sCKYs2PiS4z0zzfdeuEVyb0= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -49,6 +50,7 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= @@ -59,6 +61,7 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8T gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/vendor/github.com/teivah/onecontext/README.md b/vendor/github.com/teivah/onecontext/README.md index d818434b..0fcfc53f 100644 --- a/vendor/github.com/teivah/onecontext/README.md +++ b/vendor/github.com/teivah/onecontext/README.md @@ -2,12 +2,14 @@ [![Go Report Card](https://goreportcard.com/badge/github.com/teivah/onecontext)](https://goreportcard.com/report/github.com/teivah/onecontext) -## Overview +`teivah/onecontext` is a set of context utilities. + +## One Context Have you ever faced the situation where you have to merge multiple existing contexts? If not, then you might, eventually. -For example, we can face the situation where we are building an application using a library that gives us a global context (for example `urfave/cli`). +For example, we can face the situation where we are building an application using a library that gives us a global context (for example, `urfave/cli`). This context expires once the application is stopped. Meanwhile, we are exposing a gRPC service like this: @@ -18,24 +20,28 @@ func (f *Foo) Get(ctx context.Context, bar *Bar) (*Baz, error) { } ``` -Here, we receive another context provided by gRPC. +Here, we receive another context provided by gRPC. -Then, in the `Get` implementation, we want for example to query a database and we must provide a context for that. +Then, in the `Get` implementation, we want to query a database and provide a context for that. -Ideally, we would like to provide a merged context that would expire either: -- When the application is stopped +Ideally, we would like to provide a merged context that would expire either: +- When the application is stopped - Or when the received gRPC context expires -This is exactly the purpose of this library. +It's is precisely the purpose of this library. -In our case, we can now merge the two contexts in a single one like this: +In our case, we can now merge the two contexts in a single one like this: ```go ctx, cancel := onecontext.Merge(ctx1, ctx2) ``` -This returns a merged context that we can now propagate. +It returns a merged context that we can now propagate. + +## Detach + +`onecontext.Detach` returns a context detached from the original cancellation signal. It can be helpful, for example, if we implement an HTTP handler and that we have to pass a context to another goroutine that may expire after we send back a response. -# Installation +## Reset Values -`go get github.com/teivah/onecontext` +`onecontext.ResetValues` reset the values of an existing context. diff --git a/vendor/github.com/teivah/onecontext/detach.go b/vendor/github.com/teivah/onecontext/detach.go new file mode 100644 index 00000000..e08ba2e1 --- /dev/null +++ b/vendor/github.com/teivah/onecontext/detach.go @@ -0,0 +1,51 @@ +package onecontext + +import ( + "context" + "time" +) + +// DetachedContext holds the logic to detach a cancellation signal from a context. +type DetachedContext struct { + ctx context.Context + ch chan struct{} + cancel func() +} + +// Detach detaches the cancellation signal from a context. +func Detach(ctx context.Context) (*DetachedContext, func()) { + ch := make(chan struct{}) + cancel := func() { + close(ch) + } + return &DetachedContext{ + ctx: ctx, + ch: ch, + cancel: cancel, + }, cancel +} + +// Deadline returns a nil deadline. +func (c *DetachedContext) Deadline() (time.Time, bool) { + return time.Time{}, false +} + +// Done returns a cancellation signal that expires only when the context is canceled from the cancel function returned in Detach. +func (c *DetachedContext) Done() <-chan struct{} { + return c.ch +} + +// Err returns an error if the context is canceled from the cancel function returned in Detach. +func (c *DetachedContext) Err() error { + select { + case <-c.Done(): + return ErrCanceled + default: + return nil + } +} + +// Value returns the value associated with the key from the original context. +func (c *DetachedContext) Value(key interface{}) interface{} { + return c.ctx.Value(key) +} diff --git a/vendor/github.com/teivah/onecontext/go.mod b/vendor/github.com/teivah/onecontext/go.mod index dba5eb30..9a7502d7 100644 --- a/vendor/github.com/teivah/onecontext/go.mod +++ b/vendor/github.com/teivah/onecontext/go.mod @@ -2,4 +2,7 @@ module github.com/teivah/onecontext go 1.12 -require github.com/stretchr/testify v1.3.0 +require ( + github.com/stretchr/testify v1.4.0 + go.uber.org/goleak v1.1.10 +) diff --git a/vendor/github.com/teivah/onecontext/go.sum b/vendor/github.com/teivah/onecontext/go.sum index 4347755a..7f37a1c2 100644 --- a/vendor/github.com/teivah/onecontext/go.sum +++ b/vendor/github.com/teivah/onecontext/go.sum @@ -1,7 +1,31 @@ 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/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11 h1:Yq9t9jnGoR+dBuitxdo9l6Q7xh/zOyNnYUtDKaQ3x0E= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/teivah/onecontext/onecontext.go b/vendor/github.com/teivah/onecontext/onecontext.go index 20042c0b..3d1ab433 100644 --- a/vendor/github.com/teivah/onecontext/onecontext.go +++ b/vendor/github.com/teivah/onecontext/onecontext.go @@ -3,24 +3,22 @@ package onecontext import ( "context" + "errors" + "reflect" "sync" "time" ) -// Canceled is the error returned when the CancelFunc returned by Merge is called -type Canceled struct { -} - -func (c *Canceled) Error() string { - return "canceled context" -} +// ErrCanceled is the returned when the CancelFunc returned by Merge is called. +var ErrCanceled = errors.New("context canceled") -type onecontext struct { +// OneContext is the struct holding the context grouping logic. +type OneContext struct { ctx context.Context ctxs []context.Context done chan struct{} err error - errMutex sync.Mutex + errMutex sync.RWMutex cancelFunc context.CancelFunc cancelCtx context.Context } @@ -29,7 +27,7 @@ type onecontext struct { // It returns the merged context and a CancelFunc to cancel it. func Merge(ctx context.Context, ctxs ...context.Context) (context.Context, context.CancelFunc) { cancelCtx, cancelFunc := context.WithCancel(context.Background()) - o := &onecontext{ + o := &OneContext{ done: make(chan struct{}), ctx: ctx, ctxs: ctxs, @@ -40,7 +38,8 @@ func Merge(ctx context.Context, ctxs ...context.Context) (context.Context, conte return o, cancelFunc } -func (o *onecontext) Deadline() (time.Time, bool) { +// Deadline returns the minimum deadline among all the contexts. +func (o *OneContext) Deadline() (time.Time, bool) { min := time.Time{} if deadline, ok := o.ctx.Deadline(); ok { @@ -54,21 +53,23 @@ func (o *onecontext) Deadline() (time.Time, bool) { } } } - return min, !min.IsZero() } -func (o *onecontext) Done() <-chan struct{} { +// Done returns a channel for cancellation. +func (o *OneContext) Done() <-chan struct{} { return o.done } -func (o *onecontext) Err() error { - o.errMutex.Lock() - defer o.errMutex.Unlock() +// Err returns the first error raised by the contexts, otherwise a nil error. +func (o *OneContext) Err() error { + o.errMutex.RLock() + defer o.errMutex.RUnlock() return o.err } -func (o *onecontext) Value(key interface{}) interface{} { +// Value returns the value associated with the key from one of the contexts. +func (o *OneContext) Value(key interface{}) interface{} { if value := o.ctx.Value(key); value != nil { return value } @@ -82,52 +83,49 @@ func (o *onecontext) Value(key interface{}) interface{} { return nil } -func (o *onecontext) run() { - once := sync.Once{} - +func (o *OneContext) run() { if len(o.ctxs) == 1 { o.runTwoContexts(o.ctx, o.ctxs[0]) return } - o.runMultipleContexts(o.ctx, &once) - for _, ctx := range o.ctxs { - o.runMultipleContexts(ctx, &once) + o.runMultipleContexts() +} + +func (o *OneContext) runTwoContexts(ctx1, ctx2 context.Context) { + select { + case <-o.cancelCtx.Done(): + o.cancel(ErrCanceled) + case <-ctx1.Done(): + o.cancel(o.ctx.Err()) + case <-ctx2.Done(): + o.cancel(o.ctxs[0].Err()) } } -func (o *onecontext) cancel(err error) { - o.cancelFunc() +func (o *OneContext) runMultipleContexts() { + cases := make([]reflect.SelectCase, len(o.ctxs)+2) + cases[0] = reflect.SelectCase{Dir: reflect.SelectRecv, Chan: reflect.ValueOf(o.cancelCtx.Done())} + cases[1] = reflect.SelectCase{Dir: reflect.SelectRecv, Chan: reflect.ValueOf(o.ctx.Done())} + for i, ctx := range o.ctxs { + cases[i+2] = reflect.SelectCase{Dir: reflect.SelectRecv, Chan: reflect.ValueOf(ctx.Done())} + } + + chosen, _, _ := reflect.Select(cases) + switch chosen { + case 0: + o.cancel(ErrCanceled) + case 1: + o.cancel(o.ctx.Err()) + default: + o.cancel(o.ctxs[chosen-2].Err()) + } +} + +func (o *OneContext) cancel(err error) { o.errMutex.Lock() o.err = err o.errMutex.Unlock() close(o.done) -} - -func (o *onecontext) runTwoContexts(ctx1, ctx2 context.Context) { - go func() { - select { - case <-o.cancelCtx.Done(): - o.cancel(&Canceled{}) - case <-ctx1.Done(): - o.cancel(ctx1.Err()) - case <-ctx2.Done(): - o.cancel(ctx2.Err()) - } - }() -} - -func (o *onecontext) runMultipleContexts(ctx context.Context, once *sync.Once) { - go func() { - select { - case <-o.cancelCtx.Done(): - once.Do(func() { - o.cancel(&Canceled{}) - }) - case <-ctx.Done(): - once.Do(func() { - o.cancel(ctx.Err()) - }) - } - }() + o.cancelFunc() } diff --git a/vendor/github.com/teivah/onecontext/reset.go b/vendor/github.com/teivah/onecontext/reset.go new file mode 100644 index 00000000..f1d00cb6 --- /dev/null +++ b/vendor/github.com/teivah/onecontext/reset.go @@ -0,0 +1,38 @@ +package onecontext + +import ( + "context" + "time" +) + +// ResetValuesContext holds the logic reset the values of a context. +type ResetValuesContext struct { + ctx context.Context +} + +// ResetValues reset the values of a context. +func ResetValues(ctx context.Context) *ResetValuesContext { + return &ResetValuesContext{ + ctx: ctx, + } +} + +// Deadline returns the original context deadline. +func (c *ResetValuesContext) Deadline() (time.Time, bool) { + return c.ctx.Deadline() +} + +// Done returns the original done channel. +func (c *ResetValuesContext) Done() <-chan struct{} { + return c.ctx.Done() +} + +// Err returns the original context error. +func (c *ResetValuesContext) Err() error { + return c.ctx.Err() +} + +// Value returns nil regardless of the key. +func (c *ResetValuesContext) Value(_ interface{}) interface{} { + return nil +} diff --git a/vendor/modules.txt b/vendor/modules.txt index c65cc3f8..5a1ff47c 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -16,7 +16,7 @@ github.com/stretchr/objx # github.com/stretchr/testify v1.8.0 github.com/stretchr/testify/assert github.com/stretchr/testify/mock -# github.com/teivah/onecontext v0.0.0-20200513185103-40f981bfd775 +# github.com/teivah/onecontext v1.3.0 github.com/teivah/onecontext # go.uber.org/goleak v1.1.12 go.uber.org/goleak