Skip to content

Commit

Permalink
Moves filter and predicates into a sub package
Browse files Browse the repository at this point in the history
Signed-off-by: Mikalai Radchuk <mradchuk@redhat.com>
  • Loading branch information
m1kola committed Sep 11, 2023
1 parent 5bf40f1 commit ea60241
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 38 deletions.
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package catalogmetadata_test
package filter_test

import (
"encoding/json"
Expand All @@ -11,14 +11,15 @@ 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) {
b1 := &catalogmetadata.Bundle{Bundle: declcfg.Bundle{Package: "package1"}}
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))
Expand Down Expand Up @@ -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))
Expand Down Expand Up @@ -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))
Expand All @@ -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))
Expand All @@ -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",
Expand All @@ -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))
Expand Down Expand Up @@ -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))
Expand Down
Original file line number Diff line number Diff line change
@@ -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]) {
Expand All @@ -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) {
Expand All @@ -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) {
Expand All @@ -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)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package catalogmetadata_test
package filter_test

import (
"testing"
Expand All @@ -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) {
Expand All @@ -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
}{
{
Expand All @@ -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{
Expand All @@ -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"
},
Expand All @@ -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"
},
Expand All @@ -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)
})
}
Expand Down

0 comments on commit ea60241

Please sign in to comment.