gwooks 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +5 -5
- data/lib/gwooks/base.rb +4 -22
- data/lib/gwooks/payload.rb +57 -0
- data/lib/gwooks/version.rb +1 -1
- data/spec/gwooks/base_spec.rb +8 -71
- data/spec/gwooks/payload_spec.rb +82 -0
- metadata +6 -3
data/README.md
CHANGED
@@ -24,14 +24,14 @@ Or install it yourself as:
|
|
24
24
|
First extend the `Gwooks::Base` class and use the DSL to create actions to be performed in response to a push:
|
25
25
|
|
26
26
|
```ruby
|
27
|
-
class
|
27
|
+
class MyActions < Gwooks::Base
|
28
28
|
|
29
29
|
repository_name "my_cool_project" do
|
30
30
|
# this block gets executed when GitHub receives
|
31
31
|
# a push to a repo named "my_cool_project"
|
32
32
|
|
33
|
-
# Here you can also access the payload sent by GitHub:
|
34
|
-
contributors = payload[
|
33
|
+
# Here you can also access the payload sent by GitHub, parsed to a hash:
|
34
|
+
contributors = payload[:commits].map {|c| c[:author][:name] }
|
35
35
|
send_email "someone@email.com", "my_cool_project received changes by: #{ contributors.join(', ') }"
|
36
36
|
end
|
37
37
|
|
@@ -59,7 +59,7 @@ class you created:
|
|
59
59
|
require "sinatra"
|
60
60
|
|
61
61
|
post "/webhook" do
|
62
|
-
|
62
|
+
MyActions.call(params[:payload])
|
63
63
|
end
|
64
64
|
```
|
65
65
|
|
@@ -70,7 +70,7 @@ Alternatively, you can use the sinatra application provided by the class `Gwooks
|
|
70
70
|
require "gwooks"
|
71
71
|
|
72
72
|
# Tell Gwooks::App to use your class
|
73
|
-
Gwooks::App.use_webhook
|
73
|
+
Gwooks::App.use_webhook MyActions
|
74
74
|
|
75
75
|
# Gwooks::App sets up an endpoint on POST /"
|
76
76
|
run Gwooks::App
|
data/lib/gwooks/base.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require "
|
1
|
+
require File.expand_path("payload.rb", File.dirname(__FILE__))
|
2
2
|
|
3
3
|
module Gwooks
|
4
4
|
class Base
|
@@ -72,20 +72,15 @@ module Gwooks
|
|
72
72
|
end
|
73
73
|
|
74
74
|
attr_reader :payload
|
75
|
-
private :payload
|
76
75
|
|
77
76
|
def initialize(payload)
|
78
|
-
|
79
|
-
@payload = JSON.parse(payload)
|
80
|
-
else
|
81
|
-
@payload = payload
|
82
|
-
end
|
77
|
+
@payload = Gwooks::Payload.new(payload)
|
83
78
|
end
|
84
79
|
|
85
80
|
def call
|
86
81
|
self.class.hooks.each do |hook|
|
87
82
|
key, pattern, block = *hook
|
88
|
-
target =
|
83
|
+
target = payload.resolve(key)
|
89
84
|
if target.is_a? Array
|
90
85
|
match = target.map do |t|
|
91
86
|
match_pattern(t, pattern)
|
@@ -100,20 +95,7 @@ module Gwooks
|
|
100
95
|
nil
|
101
96
|
end
|
102
97
|
|
103
|
-
private
|
104
|
-
|
105
|
-
def resolve_key(key)
|
106
|
-
key.split(".").inject(payload) do |obj, segment|
|
107
|
-
break nil if obj.nil?
|
108
|
-
if obj.is_a? Array
|
109
|
-
obj.map do |item|
|
110
|
-
item[segment]
|
111
|
-
end.flatten
|
112
|
-
else
|
113
|
-
obj[segment]
|
114
|
-
end
|
115
|
-
end
|
116
|
-
end
|
98
|
+
private
|
117
99
|
|
118
100
|
def match_pattern(target, pattern)
|
119
101
|
if pattern.is_a? Regexp
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require "json"
|
2
|
+
|
3
|
+
module Gwooks
|
4
|
+
class Payload < Hash
|
5
|
+
|
6
|
+
class << self
|
7
|
+
alias_method :new_without_indifferent_access, :new
|
8
|
+
|
9
|
+
def new(payload)
|
10
|
+
new_hash = new_without_indifferent_access do |hash, key|
|
11
|
+
hash[key.to_s] if key.is_a? Symbol
|
12
|
+
end
|
13
|
+
payload = JSON.parse(payload) if payload.is_a? String
|
14
|
+
new_hash.update(payload)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def resolve(key)
|
19
|
+
key.split(".").inject(self) do |obj, segment|
|
20
|
+
break nil if obj.nil?
|
21
|
+
if obj.is_a? Array
|
22
|
+
obj.map do |item|
|
23
|
+
item[segment]
|
24
|
+
end.flatten
|
25
|
+
else
|
26
|
+
obj[segment]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
alias_method :update_without_indifferent_access, :update
|
32
|
+
def update(hash)
|
33
|
+
hash.each do |key, obj|
|
34
|
+
self[key] = make_indifferent(obj)
|
35
|
+
end
|
36
|
+
self
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def make_indifferent(obj)
|
42
|
+
case obj
|
43
|
+
when Hash
|
44
|
+
new_hash = Hash.new(&self.default_proc)
|
45
|
+
obj.each do |key, val|
|
46
|
+
new_hash[key] = make_indifferent(val)
|
47
|
+
end
|
48
|
+
new_hash
|
49
|
+
when Array
|
50
|
+
obj.map {|item| make_indifferent(item)}
|
51
|
+
else
|
52
|
+
obj
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
data/lib/gwooks/version.rb
CHANGED
data/spec/gwooks/base_spec.rb
CHANGED
@@ -8,6 +8,13 @@ describe "subclass of Gwooks::Base" do
|
|
8
8
|
GwooksBaseSub = Class.new(Gwooks::Base)
|
9
9
|
end
|
10
10
|
|
11
|
+
describe :new do
|
12
|
+
it "creates and store a new instance of Gwooks::Payload" do
|
13
|
+
gwooks = GwooksBaseSub.new({"foo" => "bar"})
|
14
|
+
gwooks.payload.should == {"foo" => "bar"}
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
11
18
|
describe :call do
|
12
19
|
it "creates a new instance passing payload and then invokes call()" do
|
13
20
|
gwooks = double GwooksBaseSub.new("{}")
|
@@ -83,19 +90,7 @@ describe "subclass of Gwooks::Base" do
|
|
83
90
|
end
|
84
91
|
end
|
85
92
|
|
86
|
-
describe "instance" do
|
87
|
-
|
88
|
-
describe :new do
|
89
|
-
it "initializes payload parsing the argument as JSON if it is a string" do
|
90
|
-
gwooks = GwooksBaseSub.new("{\"foo\": \"bar\"}")
|
91
|
-
gwooks.send(:payload).should == {"foo" => "bar"}
|
92
|
-
end
|
93
|
-
|
94
|
-
it "initializes payload using the argument if it is not a string" do
|
95
|
-
gwooks = GwooksBaseSub.new({"foo" => "bar"})
|
96
|
-
gwooks.send(:payload).should == {"foo" => "bar"}
|
97
|
-
end
|
98
|
-
end
|
93
|
+
describe "instance" do
|
99
94
|
|
100
95
|
describe :call do
|
101
96
|
it "executes all matching hooks" do
|
@@ -212,64 +207,6 @@ describe "subclass of Gwooks::Base" do
|
|
212
207
|
end
|
213
208
|
end
|
214
209
|
|
215
|
-
describe :resolve_key do
|
216
|
-
it "returns nested object according to the key" do
|
217
|
-
GwooksBaseSub.new(
|
218
|
-
"foo" => {
|
219
|
-
"bar" => {
|
220
|
-
"baz" => "qux"
|
221
|
-
}
|
222
|
-
}
|
223
|
-
).send(:resolve_key, "foo.bar.baz").should == "qux"
|
224
|
-
end
|
225
|
-
|
226
|
-
it "returns nil if nested object does not exist" do
|
227
|
-
GwooksBaseSub.new(
|
228
|
-
"foo" => {
|
229
|
-
"bar" => {}
|
230
|
-
}
|
231
|
-
).send(:resolve_key, "foo.bar.baz").should == nil
|
232
|
-
end
|
233
|
-
|
234
|
-
it "returns nil if parent object does not exist" do
|
235
|
-
GwooksBaseSub.new(
|
236
|
-
"foo" => {}
|
237
|
-
).send(:resolve_key, "foo.bar.baz").should == nil
|
238
|
-
end
|
239
|
-
|
240
|
-
it "returns all items in array when item is an array" do
|
241
|
-
GwooksBaseSub.new(
|
242
|
-
"foo" => ["a", "b", "c"]
|
243
|
-
).send(:resolve_key, "foo").should == ["a", "b", "c"]
|
244
|
-
end
|
245
|
-
|
246
|
-
it "resolve key in array" do
|
247
|
-
GwooksBaseSub.new(
|
248
|
-
"foo" => [
|
249
|
-
{ "bar" => 123 },
|
250
|
-
{ "bar" => 321 }
|
251
|
-
]
|
252
|
-
).send(:resolve_key, "foo.bar").should == [123, 321]
|
253
|
-
end
|
254
|
-
|
255
|
-
it "resolve key in nested arrays" do
|
256
|
-
GwooksBaseSub.new(
|
257
|
-
"foo" => [
|
258
|
-
{ "bar" => [
|
259
|
-
{"baz" => 123},
|
260
|
-
{"baz" => 321}
|
261
|
-
]},
|
262
|
-
{ "bar" => [
|
263
|
-
{"baz" => 312},
|
264
|
-
{"baz" => 132}
|
265
|
-
]}
|
266
|
-
]
|
267
|
-
).send(:resolve_key, "foo.bar.baz").should == [123, 321, 312, 132]
|
268
|
-
end
|
269
|
-
|
270
|
-
|
271
|
-
end
|
272
|
-
|
273
210
|
end
|
274
211
|
|
275
212
|
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require File.expand_path("../spec_helper.rb", File.dirname(__FILE__))
|
2
|
+
require File.expand_path("../../lib/gwooks/payload.rb", File.dirname(__FILE__))
|
3
|
+
|
4
|
+
describe Gwooks::Payload do
|
5
|
+
describe "class methods" do
|
6
|
+
describe :new do
|
7
|
+
it "initializes parsing the argument as JSON if it is a string" do
|
8
|
+
payload = Gwooks::Payload.new("{\"foo\": \"bar\"}")
|
9
|
+
payload.should == {"foo" => "bar"}
|
10
|
+
end
|
11
|
+
|
12
|
+
it "initializes using the argument if it is not a string" do
|
13
|
+
payload = Gwooks::Payload.new({"foo" => "bar"})
|
14
|
+
payload.should == {"foo" => "bar"}
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe :[] do
|
20
|
+
it "provides indifferent access" do
|
21
|
+
payload = Gwooks::Payload.new("foo" => {"bar" => "baz"})
|
22
|
+
payload[:foo][:bar].should == "baz"
|
23
|
+
payload["foo"]["bar"].should == "baz"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe :resolve do
|
28
|
+
it "returns nested object according to the key" do
|
29
|
+
Gwooks::Payload.new(
|
30
|
+
"foo" => {
|
31
|
+
"bar" => {
|
32
|
+
"baz" => "qux"
|
33
|
+
}
|
34
|
+
}
|
35
|
+
).resolve("foo.bar.baz").should == "qux"
|
36
|
+
end
|
37
|
+
|
38
|
+
it "returns nil if nested property does not exist" do
|
39
|
+
Gwooks::Payload.new(
|
40
|
+
"foo" => {
|
41
|
+
"bar" => {}
|
42
|
+
}
|
43
|
+
).resolve("foo.bar.baz").should == nil
|
44
|
+
end
|
45
|
+
|
46
|
+
it "returns nil if parent property does not exist" do
|
47
|
+
Gwooks::Payload.new(
|
48
|
+
"foo" => {}
|
49
|
+
).resolve("foo.bar.baz").should == nil
|
50
|
+
end
|
51
|
+
|
52
|
+
it "returns all items in array when property is an array" do
|
53
|
+
Gwooks::Payload.new(
|
54
|
+
"foo" => ["a", "b", "c"]
|
55
|
+
).resolve("foo").should == ["a", "b", "c"]
|
56
|
+
end
|
57
|
+
|
58
|
+
it "resolve key nested in an array" do
|
59
|
+
Gwooks::Payload.new(
|
60
|
+
"foo" => [
|
61
|
+
{ "bar" => 123 },
|
62
|
+
{ "bar" => 321 }
|
63
|
+
]
|
64
|
+
).resolve("foo.bar").should == [123, 321]
|
65
|
+
end
|
66
|
+
|
67
|
+
it "resolve key nested in multiple arrays" do
|
68
|
+
Gwooks::Payload.new(
|
69
|
+
"foo" => [
|
70
|
+
{ "bar" => [
|
71
|
+
{"baz" => 123},
|
72
|
+
{"baz" => 321}
|
73
|
+
]},
|
74
|
+
{ "bar" => [
|
75
|
+
{"baz" => 312},
|
76
|
+
{"baz" => 132}
|
77
|
+
]}
|
78
|
+
]
|
79
|
+
).resolve("foo.bar.baz").should == [123, 321, 312, 132]
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gwooks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 4
|
10
|
+
version: 0.0.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Luca Ongaro
|
@@ -93,9 +93,11 @@ files:
|
|
93
93
|
- lib/gwooks.rb
|
94
94
|
- lib/gwooks/app.rb
|
95
95
|
- lib/gwooks/base.rb
|
96
|
+
- lib/gwooks/payload.rb
|
96
97
|
- lib/gwooks/version.rb
|
97
98
|
- spec/gwooks/app_spec.rb
|
98
99
|
- spec/gwooks/base_spec.rb
|
100
|
+
- spec/gwooks/payload_spec.rb
|
99
101
|
- spec/integration/integration_spec.rb
|
100
102
|
- spec/spec_helper.rb
|
101
103
|
has_rdoc: true
|
@@ -135,5 +137,6 @@ summary: A DSL for quickly creating endpoints for GitHub post-receive webhooks.
|
|
135
137
|
test_files:
|
136
138
|
- spec/gwooks/app_spec.rb
|
137
139
|
- spec/gwooks/base_spec.rb
|
140
|
+
- spec/gwooks/payload_spec.rb
|
138
141
|
- spec/integration/integration_spec.rb
|
139
142
|
- spec/spec_helper.rb
|