@@ -5,7 +5,7 @@ module Agents |
||
| 5 | 5 |
default_schedule "never" |
| 6 | 6 |
|
| 7 | 7 |
description <<-MD |
| 8 |
- A PostAgent receives events from other agents (or runs periodically), merges those events with the contents of `payload`, and sends the results as POST (or GET) requests to a specified url. |
|
| 8 |
+ A PostAgent receives events from other agents (or runs periodically), merges those events with the [Liquid-interpolated](https://github.com/cantino/huginn/wiki/Formatting-Events-using-Liquid) contents of `payload`, and sends the results as POST (or GET) requests to a specified url. To skip merging in the incoming event, but still send the interpolated payload, set `no_merge` to `true`. |
|
| 9 | 9 |
|
| 10 | 10 |
The `post_url` field must specify where you would like to send requests. Please include the URI scheme (`http` or `https`). |
| 11 | 11 |
|
@@ -21,11 +21,12 @@ module Agents |
||
| 21 | 21 |
def default_options |
| 22 | 22 |
{
|
| 23 | 23 |
'post_url' => "http://www.example.com", |
| 24 |
- 'expected_receive_period_in_days' => 1, |
|
| 24 |
+ 'expected_receive_period_in_days' => '1', |
|
| 25 | 25 |
'content_type' => 'form', |
| 26 | 26 |
'method' => 'post', |
| 27 | 27 |
'payload' => {
|
| 28 |
- 'key' => 'value' |
|
| 28 |
+ 'key' => 'value', |
|
| 29 |
+ 'something' => 'the event contained {{ somekey }}'
|
|
| 29 | 30 |
}, |
| 30 | 31 |
'headers' => {}
|
| 31 | 32 |
} |
@@ -52,8 +53,12 @@ module Agents |
||
| 52 | 53 |
errors.add(:base, "if provided, payload must be a hash") |
| 53 | 54 |
end |
| 54 | 55 |
|
| 55 |
- unless %w[post get].include?(method) |
|
| 56 |
- errors.add(:base, "method must be 'post' or 'get'") |
|
| 56 |
+ unless %w[post get put delete patch].include?(method) |
|
| 57 |
+ errors.add(:base, "method must be 'post', 'get', 'put', 'delete', or 'patch'") |
|
| 58 |
+ end |
|
| 59 |
+ |
|
| 60 |
+ if options['no_merge'].present? && !%[true false].include?(options['no_merge'].to_s) |
|
| 61 |
+ errors.add(:base, "if provided, no_merge must be 'true' or 'false'") |
|
| 57 | 62 |
end |
| 58 | 63 |
|
| 59 | 64 |
unless headers.is_a?(Hash) |
@@ -63,7 +68,12 @@ module Agents |
||
| 63 | 68 |
|
| 64 | 69 |
def receive(incoming_events) |
| 65 | 70 |
incoming_events.each do |event| |
| 66 |
- handle (interpolated(event.payload)['payload'].presence || {}).merge(event.payload)
|
|
| 71 |
+ outgoing = interpolated(event.payload)['payload'].presence || {}
|
|
| 72 |
+ if interpolated['no_merge'].to_s == 'true' |
|
| 73 |
+ handle outgoing |
|
| 74 |
+ else |
|
| 75 |
+ handle outgoing.merge(event.payload) |
|
| 76 |
+ end |
|
| 67 | 77 |
end |
| 68 | 78 |
end |
| 69 | 79 |
|
@@ -38,6 +38,7 @@ describe Agents::PostAgent do |
||
| 38 | 38 |
'post' => Net::HTTP::Post, 'patch' => Net::HTTP::Patch, |
| 39 | 39 |
'delete' => Net::HTTP::Delete }.each.with_index do |(verb, type), index| |
| 40 | 40 |
@checker.options['method'] = verb |
| 41 |
+ @checker.should be_valid |
|
| 41 | 42 |
@checker.check |
| 42 | 43 |
@requests.should == index + 1 |
| 43 | 44 |
@sent_requests[type].length.should == 1 |
@@ -76,6 +77,15 @@ describe Agents::PostAgent do |
||
| 76 | 77 |
|
| 77 | 78 |
@sent_requests[Net::HTTP::Get][0].should == @event.payload.merge('default' => 'value')
|
| 78 | 79 |
end |
| 80 |
+ |
|
| 81 |
+ it "can skip merging the incoming event when no_merge is set, but it still interpolates" do |
|
| 82 |
+ @checker.options['no_merge'] = 'true' |
|
| 83 |
+ @checker.options['payload'] = {
|
|
| 84 |
+ 'key' => 'it said: {{ someotherkey.somekey }}'
|
|
| 85 |
+ } |
|
| 86 |
+ @checker.receive([@event]) |
|
| 87 |
+ @sent_requests[Net::HTTP::Post].first.should == { 'key' => 'it said: value' }
|
|
| 88 |
+ end |
|
| 79 | 89 |
end |
| 80 | 90 |
|
| 81 | 91 |
describe "#check" do |
@@ -125,7 +135,7 @@ describe Agents::PostAgent do |
||
| 125 | 135 |
@checker.should_not be_valid |
| 126 | 136 |
end |
| 127 | 137 |
|
| 128 |
- it "should validate method as post or get, defaulting to post" do |
|
| 138 |
+ it "should validate method as post, get, put, patch, or delete, defaulting to post" do |
|
| 129 | 139 |
@checker.options['method'] = "" |
| 130 | 140 |
@checker.method.should == "post" |
| 131 | 141 |
@checker.should be_valid |
@@ -138,11 +148,35 @@ describe Agents::PostAgent do |
||
| 138 | 148 |
@checker.method.should == "get" |
| 139 | 149 |
@checker.should be_valid |
| 140 | 150 |
|
| 151 |
+ @checker.options['method'] = "patch" |
|
| 152 |
+ @checker.method.should == "patch" |
|
| 153 |
+ @checker.should be_valid |
|
| 154 |
+ |
|
| 141 | 155 |
@checker.options['method'] = "wut" |
| 142 | 156 |
@checker.method.should == "wut" |
| 143 | 157 |
@checker.should_not be_valid |
| 144 | 158 |
end |
| 145 | 159 |
|
| 160 |
+ it "should validate that no_merge is 'true' or 'false', if present" do |
|
| 161 |
+ @checker.options['no_merge'] = "" |
|
| 162 |
+ @checker.should be_valid |
|
| 163 |
+ |
|
| 164 |
+ @checker.options['no_merge'] = "true" |
|
| 165 |
+ @checker.should be_valid |
|
| 166 |
+ |
|
| 167 |
+ @checker.options['no_merge'] = "false" |
|
| 168 |
+ @checker.should be_valid |
|
| 169 |
+ |
|
| 170 |
+ @checker.options['no_merge'] = false |
|
| 171 |
+ @checker.should be_valid |
|
| 172 |
+ |
|
| 173 |
+ @checker.options['no_merge'] = true |
|
| 174 |
+ @checker.should be_valid |
|
| 175 |
+ |
|
| 176 |
+ @checker.options['no_merge'] = 'blarg' |
|
| 177 |
+ @checker.should_not be_valid |
|
| 178 |
+ end |
|
| 179 |
+ |
|
| 146 | 180 |
it "should validate payload as a hash, if present" do |
| 147 | 181 |
@checker.options['payload'] = "" |
| 148 | 182 |
@checker.should be_valid |