]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
Add == and != operators to range predicates
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sat, 24 Jan 2026 15:51:57 +0000 (16:51 +0100)
committerGitHub <noreply@github.com>
Sat, 24 Jan 2026 15:51:57 +0000 (16:51 +0100)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
common/predicate/predicate.go
common/predicate/predicate_test.go
common/predicate/rangeop_test.go

index 1168316b6290d8cce44dcbc12612fcfed7446306..dde356895e95c24660f451ce98008981668f8279 100644 (file)
@@ -159,6 +159,8 @@ const (
        rangeOpLTE
        rangeOpGT
        rangeOpGTE
+       rangeOpEQ
+       rangeOpNE
 )
 
 func cutRangeOp(s string) (op int, rest string) {
@@ -167,6 +169,10 @@ func cutRangeOp(s string) (op int, rest string) {
                return rangeOpGTE, s[3:]
        case strings.HasPrefix(s, "<= "):
                return rangeOpLTE, s[3:]
+       case strings.HasPrefix(s, "== "):
+               return rangeOpEQ, s[3:]
+       case strings.HasPrefix(s, "!= "):
+               return rangeOpNE, s[3:]
        case strings.HasPrefix(s, "> "):
                return rangeOpGT, s[2:]
        case strings.HasPrefix(s, "< "):
@@ -260,6 +266,14 @@ func NewIndexStringPredicateFromGlobsAndRanges(patterns []string, getIndex func(
                                        p = p.And(func(s IndexString) Match {
                                                return BoolMatch(s.Index >= i)
                                        })
+                               case rangeOpEQ:
+                                       p = p.And(func(s IndexString) Match {
+                                               return BoolMatch(s.Index == i)
+                                       })
+                               case rangeOpNE:
+                                       p = p.And(func(s IndexString) Match {
+                                               return BoolMatch(s.Index != i)
+                                       })
                                }
                        } else {
                                g, err := getGlob(pattern)
index cf867dcb6a956cdb0a690f03dda274373d18b3aa..6802938cb92f9b063e9109179e64ad0f066bc1c7 100644 (file)
@@ -224,6 +224,27 @@ func TestNewIndexStringPredicateFromGlobsAndRanges(t *testing.T) {
        m = n(">= v99.0.0")
        c.Assert(m(is(0)), qt.IsFalse)
        c.Assert(m(is(3)), qt.IsFalse)
+
+       // Test == v2.0.0: should only match v2.0.0
+       m = n("== v2.0.0")
+       c.Assert(m(is(0)), qt.IsFalse) // v4.0.0
+       c.Assert(m(is(1)), qt.IsFalse) // v3.0.0
+       c.Assert(m(is(2)), qt.IsTrue)  // v2.0.0
+       c.Assert(m(is(3)), qt.IsFalse) // v1.0.0
+
+       // Test != v2.0.0: should match everything except v2.0.0
+       m = n("!= v2.0.0")
+       c.Assert(m(is(0)), qt.IsTrue)  // v4.0.0
+       c.Assert(m(is(1)), qt.IsTrue)  // v3.0.0
+       c.Assert(m(is(2)), qt.IsFalse) // v2.0.0
+       c.Assert(m(is(3)), qt.IsTrue)  // v1.0.0
+
+       // Test != with range: >= v2.0.0 AND != v3.0.0
+       m = n(">= v2.0.0", "!= v3.0.0")
+       c.Assert(m(is(0)), qt.IsTrue)  // v4.0.0
+       c.Assert(m(is(1)), qt.IsFalse) // v3.0.0 - excluded by !=
+       c.Assert(m(is(2)), qt.IsTrue)  // v2.0.0
+       c.Assert(m(is(3)), qt.IsFalse) // v1.0.0 - out of range
 }
 
 func BenchmarkPredicate(b *testing.B) {
index 3b282a2c538e3605655df13e23a37043f61057eb..1650c27645977208aab330f6f73ee619891d8816 100644 (file)
@@ -38,6 +38,14 @@ func TestCutRangeOp(t *testing.T) {
        c.Assert(op, qt.Equals, rangeOpLT)
        c.Assert(rest, qt.Equals, "value")
 
+       op, rest = cutRangeOp("== value")
+       c.Assert(op, qt.Equals, rangeOpEQ)
+       c.Assert(rest, qt.Equals, "value")
+
+       op, rest = cutRangeOp("!= value")
+       c.Assert(op, qt.Equals, rangeOpNE)
+       c.Assert(rest, qt.Equals, "value")
+
        op, rest = cutRangeOp("value")
        c.Assert(op, qt.Equals, rangeOpNone)
        c.Assert(rest, qt.Equals, "value")