@@ -2,7 +2,7 @@ module Agents |
||
| 2 | 2 |
class TriggerAgent < Agent |
| 3 | 3 |
cannot_be_scheduled! |
| 4 | 4 |
|
| 5 |
- VALID_COMPARISON_TYPES = %w[regex field<value field<=value field==value field>=value field>value] |
|
| 5 |
+ VALID_COMPARISON_TYPES = %w[regex !regex field<value field<=value field==value field!=value field>=value field>value] |
|
| 6 | 6 |
|
| 7 | 7 |
description <<-MD |
| 8 | 8 |
Use a TriggerAgent to watch for a specific value in an Event payload. |
@@ -52,6 +52,8 @@ module Agents |
||
| 52 | 52 |
case rule[:type] |
| 53 | 53 |
when "regex" |
| 54 | 54 |
value_at_path.to_s =~ Regexp.new(rule[:value], Regexp::IGNORECASE) |
| 55 |
+ when "!regex" |
|
| 56 |
+ value_at_path.to_s !~ Regexp.new(rule[:value], Regexp::IGNORECASE) |
|
| 55 | 57 |
when "field>value" |
| 56 | 58 |
value_at_path.to_f > rule[:value].to_f |
| 57 | 59 |
when "field>=value" |
@@ -62,6 +64,8 @@ module Agents |
||
| 62 | 64 |
value_at_path.to_f <= rule[:value].to_f |
| 63 | 65 |
when "field==value" |
| 64 | 66 |
value_at_path.to_s == rule[:value].to_s |
| 67 |
+ when "field!=value" |
|
| 68 |
+ value_at_path.to_s != rule[:value].to_s |
|
| 65 | 69 |
else |
| 66 | 70 |
raise "Invalid :type of #{rule[:type]} in TriggerAgent##{id}"
|
| 67 | 71 |
end |
@@ -71,6 +71,24 @@ describe Agents::TriggerAgent do |
||
| 71 | 71 |
}.should change { Event.count }.by(1)
|
| 72 | 72 |
end |
| 73 | 73 |
|
| 74 |
+ it "handles negated regex" do |
|
| 75 |
+ @event.payload[:foo]["bar"][:baz] = "a2b" |
|
| 76 |
+ @checker.options[:rules][0] = {
|
|
| 77 |
+ :type => "!regex", |
|
| 78 |
+ :value => "a\\db", |
|
| 79 |
+ :path => "foo.bar.baz", |
|
| 80 |
+ } |
|
| 81 |
+ |
|
| 82 |
+ lambda {
|
|
| 83 |
+ @checker.receive([@event]) |
|
| 84 |
+ }.should_not change { Event.count }
|
|
| 85 |
+ |
|
| 86 |
+ @event.payload[:foo]["bar"][:baz] = "a22b" |
|
| 87 |
+ lambda {
|
|
| 88 |
+ @checker.receive([@event]) |
|
| 89 |
+ }.should change { Event.count }.by(1)
|
|
| 90 |
+ end |
|
| 91 |
+ |
|
| 74 | 92 |
it "puts can extract values into the message based on paths" do |
| 75 | 93 |
@checker.receive([@event]) |
| 76 | 94 |
Event.last.payload[:message].should == "I saw 'a2b' from Joe" |
@@ -106,6 +124,22 @@ describe Agents::TriggerAgent do |
||
| 106 | 124 |
}.should change { Event.count }.by(1)
|
| 107 | 125 |
end |
| 108 | 126 |
|
| 127 |
+ it "handles negated comparisons" do |
|
| 128 |
+ @event.payload[:foo]["bar"][:baz] = "hello world" |
|
| 129 |
+ @checker.options[:rules].first[:type] = "field!=value" |
|
| 130 |
+ @checker.options[:rules].first[:value] = "hello world" |
|
| 131 |
+ |
|
| 132 |
+ lambda {
|
|
| 133 |
+ @checker.receive([@event]) |
|
| 134 |
+ }.should_not change { Event.count }
|
|
| 135 |
+ |
|
| 136 |
+ @checker.options[:rules].first[:value] = "hello there" |
|
| 137 |
+ |
|
| 138 |
+ lambda {
|
|
| 139 |
+ @checker.receive([@event]) |
|
| 140 |
+ }.should change { Event.count }.by(1)
|
|
| 141 |
+ end |
|
| 142 |
+ |
|
| 109 | 143 |
it "does fine without dots in the path" do |
| 110 | 144 |
@event.payload = { :hello => "world" }
|
| 111 | 145 |
@checker.options[:rules].first[:type] = "field==value" |