From ea6024122e8685257deae5c3919f6e0d8231511b Mon Sep 17 00:00:00 2001 From: Mikalai Radchuk Date: Thu, 7 Sep 2023 12:25:29 +0100 Subject: [PATCH] Moves filter and predicates into a sub package Signed-off-by: Mikalai Radchuk --- .../bundle_predicates.go} | 34 +++++++++---------- .../bundle_predicates_test.go} | 19 ++++++----- .../catalogmetadata/{ => filter}/filter.go | 16 +++++---- .../{ => filter}/filter_test.go | 13 +++---- 4 files changed, 44 insertions(+), 38 deletions(-) rename internal/catalogmetadata/{predicates.go => filter/bundle_predicates.go} (61%) rename internal/catalogmetadata/{predicates_test.go => filter/bundle_predicates_test.go} (91%) rename internal/catalogmetadata/{ => filter}/filter.go (53%) rename internal/catalogmetadata/{ => filter}/filter_test.go (87%) diff --git a/internal/catalogmetadata/predicates.go b/internal/catalogmetadata/filter/bundle_predicates.go similarity index 61% rename from internal/catalogmetadata/predicates.go rename to internal/catalogmetadata/filter/bundle_predicates.go index bd85a3cfa..9260d4c6c 100644 --- a/internal/catalogmetadata/predicates.go +++ b/internal/catalogmetadata/filter/bundle_predicates.go @@ -1,20 +1,20 @@ -package catalogmetadata +package filter import ( mmsemver "github.com/Masterminds/semver/v3" bsemver "github.com/blang/semver/v4" -) -// TODO: Move somewhere nice. Probably into a ./predicates package + "github.com/operator-framework/operator-controller/internal/catalogmetadata" +) -func WithPackageName(packageName string) Predicate[Bundle] { - return func(bundle *Bundle) bool { +func WithPackageName(packageName string) Predicate[catalogmetadata.Bundle] { + return func(bundle *catalogmetadata.Bundle) bool { return bundle.Package == packageName } } -func InMastermindsSemverRange(semverRange *mmsemver.Constraints) Predicate[Bundle] { - return func(bundle *Bundle) bool { +func InMastermindsSemverRange(semverRange *mmsemver.Constraints) Predicate[catalogmetadata.Bundle] { + return func(bundle *catalogmetadata.Bundle) bool { bVersion, err := bundle.Version() if err != nil { return false @@ -31,8 +31,8 @@ func InMastermindsSemverRange(semverRange *mmsemver.Constraints) Predicate[Bundl } } -func InBlangSemverRange(semverRange bsemver.Range) Predicate[Bundle] { - return func(bundle *Bundle) bool { +func InBlangSemverRange(semverRange bsemver.Range) Predicate[catalogmetadata.Bundle] { + return func(bundle *catalogmetadata.Bundle) bool { bundleVersion, err := bundle.Version() if err != nil { return false @@ -41,8 +41,8 @@ func InBlangSemverRange(semverRange bsemver.Range) Predicate[Bundle] { } } -func InChannel(channelName string) Predicate[Bundle] { - return func(bundle *Bundle) bool { +func InChannel(channelName string) Predicate[catalogmetadata.Bundle] { + return func(bundle *catalogmetadata.Bundle) bool { for _, ch := range bundle.InChannels { if ch.Name == channelName { return true @@ -52,8 +52,8 @@ func InChannel(channelName string) Predicate[Bundle] { } } -func ProvidesGVK(gvk *GVK) Predicate[Bundle] { - return func(bundle *Bundle) bool { +func ProvidesGVK(gvk *catalogmetadata.GVK) Predicate[catalogmetadata.Bundle] { + return func(bundle *catalogmetadata.Bundle) bool { providedGVKs, err := bundle.ProvidedGVKs() if err != nil { return false @@ -68,14 +68,14 @@ func ProvidesGVK(gvk *GVK) Predicate[Bundle] { } } -func WithBundleImage(bundleImage string) Predicate[Bundle] { - return func(bundle *Bundle) bool { +func WithBundleImage(bundleImage string) Predicate[catalogmetadata.Bundle] { + return func(bundle *catalogmetadata.Bundle) bool { return bundle.Image == bundleImage } } -func Replaces(bundleName string) Predicate[Bundle] { - return func(bundle *Bundle) bool { +func Replaces(bundleName string) Predicate[catalogmetadata.Bundle] { + return func(bundle *catalogmetadata.Bundle) bool { for _, ch := range bundle.InChannels { for _, chEntry := range ch.Entries { if bundle.Name == chEntry.Name && chEntry.Replaces == bundleName { diff --git a/internal/catalogmetadata/predicates_test.go b/internal/catalogmetadata/filter/bundle_predicates_test.go similarity index 91% rename from internal/catalogmetadata/predicates_test.go rename to internal/catalogmetadata/filter/bundle_predicates_test.go index ce151b921..4be55aa88 100644 --- a/internal/catalogmetadata/predicates_test.go +++ b/internal/catalogmetadata/filter/bundle_predicates_test.go @@ -1,4 +1,4 @@ -package catalogmetadata_test +package filter_test import ( "encoding/json" @@ -11,6 +11,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/operator-framework/operator-controller/internal/catalogmetadata" + "github.com/operator-framework/operator-controller/internal/catalogmetadata/filter" ) func TestWithPackageName(t *testing.T) { @@ -18,7 +19,7 @@ func TestWithPackageName(t *testing.T) { b2 := &catalogmetadata.Bundle{Bundle: declcfg.Bundle{Package: "package2"}} b3 := &catalogmetadata.Bundle{} - f := catalogmetadata.WithPackageName("package1") + f := filter.WithPackageName("package1") assert.True(t, f(b1)) assert.False(t, f(b2)) @@ -54,7 +55,7 @@ func TestInMastermindsSemverRange(t *testing.T) { vRange, err := mmsemver.NewConstraint(">=1.0.0") assert.NoError(t, err) - f := catalogmetadata.InMastermindsSemverRange(vRange) + f := filter.InMastermindsSemverRange(vRange) assert.True(t, f(b1)) assert.False(t, f(b2)) @@ -89,7 +90,7 @@ func TestInBlangSemverRange(t *testing.T) { vRange := bsemver.MustParseRange(">=1.0.0") - f := catalogmetadata.InBlangSemverRange(vRange) + f := filter.InBlangSemverRange(vRange) assert.True(t, f(b1)) assert.False(t, f(b2)) @@ -106,7 +107,7 @@ func TestInChannel(t *testing.T) { }} b3 := &catalogmetadata.Bundle{} - f := catalogmetadata.InChannel("stable") + f := filter.InChannel("stable") assert.True(t, f(b1)) assert.False(t, f(b2)) @@ -123,12 +124,12 @@ func TestProvidesGVK(t *testing.T) { }, }} b2 := &catalogmetadata.Bundle{Bundle: declcfg.Bundle{}} - f1 := catalogmetadata.ProvidesGVK(&catalogmetadata.GVK{ + f1 := filter.ProvidesGVK(&catalogmetadata.GVK{ Group: "foo.io", Version: "v1", Kind: "Foo", }) - f2 := catalogmetadata.ProvidesGVK(&catalogmetadata.GVK{ + f2 := filter.ProvidesGVK(&catalogmetadata.GVK{ Group: "baz.io", Version: "v1alpha1", Kind: "Baz", @@ -146,7 +147,7 @@ func TestWithBundleImage(t *testing.T) { b2 := &catalogmetadata.Bundle{Bundle: declcfg.Bundle{Image: "fake-image-uri-2"}} b3 := &catalogmetadata.Bundle{} - f := catalogmetadata.WithBundleImage("fake-image-uri-1") + f := filter.WithBundleImage("fake-image-uri-1") assert.True(t, f(b1)) assert.False(t, f(b2)) @@ -179,7 +180,7 @@ func TestReplaces(t *testing.T) { } b3 := &catalogmetadata.Bundle{} - f := catalogmetadata.Replaces("package1.v0.0.1") + f := filter.Replaces("package1.v0.0.1") assert.True(t, f(b1)) assert.False(t, f(b2)) diff --git a/internal/catalogmetadata/filter.go b/internal/catalogmetadata/filter/filter.go similarity index 53% rename from internal/catalogmetadata/filter.go rename to internal/catalogmetadata/filter/filter.go index 1e23495c1..36af20661 100644 --- a/internal/catalogmetadata/filter.go +++ b/internal/catalogmetadata/filter/filter.go @@ -1,10 +1,14 @@ -package catalogmetadata +package filter + +import ( + "github.com/operator-framework/operator-controller/internal/catalogmetadata" +) // Predicate returns true if the object should be kept when filtering -type Predicate[T Schemas] func(entity *T) bool +type Predicate[T catalogmetadata.Schemas] func(entity *T) bool // Filter filters a slice accordingly to -func Filter[T Schemas](in []*T, test Predicate[T]) []*T { +func Filter[T catalogmetadata.Schemas](in []*T, test Predicate[T]) []*T { out := []*T{} for i := range in { if test(in[i]) { @@ -14,7 +18,7 @@ func Filter[T Schemas](in []*T, test Predicate[T]) []*T { return out } -func And[T Schemas](predicates ...Predicate[T]) Predicate[T] { +func And[T catalogmetadata.Schemas](predicates ...Predicate[T]) Predicate[T] { return func(obj *T) bool { for _, predicate := range predicates { if !predicate(obj) { @@ -25,7 +29,7 @@ func And[T Schemas](predicates ...Predicate[T]) Predicate[T] { } } -func Or[T Schemas](predicates ...Predicate[T]) Predicate[T] { +func Or[T catalogmetadata.Schemas](predicates ...Predicate[T]) Predicate[T] { return func(obj *T) bool { for _, predicate := range predicates { if predicate(obj) { @@ -36,7 +40,7 @@ func Or[T Schemas](predicates ...Predicate[T]) Predicate[T] { } } -func Not[T Schemas](predicate Predicate[T]) Predicate[T] { +func Not[T catalogmetadata.Schemas](predicate Predicate[T]) Predicate[T] { return func(obj *T) bool { return !predicate(obj) } diff --git a/internal/catalogmetadata/filter_test.go b/internal/catalogmetadata/filter/filter_test.go similarity index 87% rename from internal/catalogmetadata/filter_test.go rename to internal/catalogmetadata/filter/filter_test.go index f50b4c6ca..942b76fa7 100644 --- a/internal/catalogmetadata/filter_test.go +++ b/internal/catalogmetadata/filter/filter_test.go @@ -1,4 +1,4 @@ -package catalogmetadata_test +package filter_test import ( "testing" @@ -7,6 +7,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/operator-framework/operator-controller/internal/catalogmetadata" + "github.com/operator-framework/operator-controller/internal/catalogmetadata/filter" ) func TestFilter(t *testing.T) { @@ -18,7 +19,7 @@ func TestFilter(t *testing.T) { for _, tt := range []struct { name string - predicate catalogmetadata.Predicate[catalogmetadata.Bundle] + predicate filter.Predicate[catalogmetadata.Bundle] want []*catalogmetadata.Bundle }{ { @@ -32,7 +33,7 @@ func TestFilter(t *testing.T) { }, { name: "filter with Not predicate", - predicate: catalogmetadata.Not(func(bundle *catalogmetadata.Bundle) bool { + predicate: filter.Not(func(bundle *catalogmetadata.Bundle) bool { return bundle.Name == "operator1.v1" }), want: []*catalogmetadata.Bundle{ @@ -42,7 +43,7 @@ func TestFilter(t *testing.T) { }, { name: "filter with And predicate", - predicate: catalogmetadata.And( + predicate: filter.And( func(bundle *catalogmetadata.Bundle) bool { return bundle.Name == "operator1.v1" }, @@ -56,7 +57,7 @@ func TestFilter(t *testing.T) { }, { name: "filter with Or predicate", - predicate: catalogmetadata.Or( + predicate: filter.Or( func(bundle *catalogmetadata.Bundle) bool { return bundle.Name == "operator1.v1" }, @@ -71,7 +72,7 @@ func TestFilter(t *testing.T) { }, } { t.Run(tt.name, func(t *testing.T) { - actual := catalogmetadata.Filter(in, tt.predicate) + actual := filter.Filter(in, tt.predicate) assert.Equal(t, tt.want, actual) }) }