gwooks 0.0.4 → 0.0.5
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 +67 -26
- data/lib/gwooks/base.rb +1 -0
- data/lib/gwooks/payload.rb +10 -1
- data/lib/gwooks/version.rb +1 -1
- data/spec/gwooks/base_spec.rb +1 -0
- data/spec/gwooks/payload_spec.rb +5 -0
- metadata +14 -16
data/README.md
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
# Gwooks
|
2
2
|
|
3
|
-
A DSL for quickly creating endpoints for
|
4
|
-
|
5
|
-
|
6
|
-
custom conditions.
|
3
|
+
A DSL for quickly creating endpoints for [GitHub post-receive
|
4
|
+
webhooks](https://help.github.com/articles/post-receive-hooks). It makes it
|
5
|
+
easy to perform some actions whenever one of your GitHub repos receives a push
|
6
|
+
matching someone custom conditions.
|
7
7
|
|
8
8
|
## Installation
|
9
9
|
|
@@ -21,7 +21,8 @@ Or install it yourself as:
|
|
21
21
|
|
22
22
|
## Usage
|
23
23
|
|
24
|
-
First extend the `Gwooks::Base` class and use the DSL to create actions to be
|
24
|
+
First extend the `Gwooks::Base` class and use the DSL to create actions to be
|
25
|
+
performed in response to a push:
|
25
26
|
|
26
27
|
```ruby
|
27
28
|
class MyActions < Gwooks::Base
|
@@ -31,7 +32,7 @@ class MyActions < Gwooks::Base
|
|
31
32
|
# a push to a repo named "my_cool_project"
|
32
33
|
|
33
34
|
# Here you can also access the payload sent by GitHub, parsed to a hash:
|
34
|
-
contributors = payload[:commits].map {|c| c[:author][:name] }
|
35
|
+
contributors = payload[:commits].map {|c| c[:author][:name] }.uniq
|
35
36
|
send_email "someone@email.com", "my_cool_project received changes by: #{ contributors.join(', ') }"
|
36
37
|
end
|
37
38
|
|
@@ -52,8 +53,8 @@ class MyActions < Gwooks::Base
|
|
52
53
|
end
|
53
54
|
```
|
54
55
|
|
55
|
-
Then set up an application providing an endpoint for the GitHub post-receive
|
56
|
-
class you created:
|
56
|
+
Then set up an application providing an endpoint for the GitHub post-receive
|
57
|
+
webhook and make use of the class you created:
|
57
58
|
|
58
59
|
```ruby
|
59
60
|
require "sinatra"
|
@@ -63,7 +64,8 @@ post "/webhook" do
|
|
63
64
|
end
|
64
65
|
```
|
65
66
|
|
66
|
-
Alternatively, you can use the sinatra application provided by the class
|
67
|
+
Alternatively, you can use the sinatra application provided by the class
|
68
|
+
`Gwooks::App`:
|
67
69
|
|
68
70
|
```ruby
|
69
71
|
# In your config.ru
|
@@ -76,32 +78,41 @@ Gwooks::App.use_webhook MyActions
|
|
76
78
|
run Gwooks::App
|
77
79
|
```
|
78
80
|
|
79
|
-
Finally [set up your GitHub
|
80
|
-
post-receive
|
81
|
-
|
81
|
+
Finally [set up your GitHub
|
82
|
+
repo](https://help.github.com/articles/post-receive-hooks) to trigger a
|
83
|
+
post-receive hook pointing to your endpoint. Whenever GitHub receives a push,
|
84
|
+
your endpoint will be notified, and _all_ the matching actions will be
|
85
|
+
performed.
|
82
86
|
|
83
|
-
###
|
87
|
+
### Class methods (DSL)
|
84
88
|
|
85
|
-
Each DSL
|
86
|
-
(e.g. `repository_owner_email` matches
|
89
|
+
Each of the DSL methods matches a corresponding property in the payload object
|
90
|
+
(e.g. `repository_owner_email` matches
|
91
|
+
`payload["repository"]["owner"]["email"]`). The payload is the one sent by the
|
92
|
+
GitHub post-receive hooks, parsed into a hash and with an additional `branch`
|
93
|
+
property.
|
87
94
|
|
88
|
-
Note that all the methods starting with `commits` are also aliased with the
|
89
|
-
those starting with `repository` are aliased with
|
95
|
+
Note that all the methods starting with `commits` are also aliased with the
|
96
|
+
singular `commit`, and those starting with `repository` are aliased with
|
97
|
+
`repo` to improve code readability.
|
90
98
|
|
91
99
|
The signature is identical for all methods:
|
92
100
|
|
93
101
|
```ruby
|
94
|
-
|
102
|
+
repository_owner_email(pattern, &block)
|
95
103
|
```
|
96
104
|
|
97
|
-
**pattern** can be any object. If it is a Regexp, it is matched against
|
98
|
-
|
105
|
+
**pattern** can be any object. If it is a Regexp, it is matched against the
|
106
|
+
target property in the payload, otherwise it is checked for equality.
|
99
107
|
|
100
|
-
**block** is called
|
101
|
-
|
102
|
-
|
108
|
+
**block** is called once if there is at least one match, and it gets passed
|
109
|
+
the match, or an array of matches if the target property is an array (all
|
110
|
+
`commits` methods match against the array of commits and their properties). The
|
111
|
+
match is a MatchData object when regexp matching is used, or the matched
|
112
|
+
pattern otherwise. The block is evaluated in the instance scope, and thus can
|
113
|
+
access the `payload` object.
|
103
114
|
|
104
|
-
Here is the full list of
|
115
|
+
Here is the full list of DSL methods:
|
105
116
|
```
|
106
117
|
after
|
107
118
|
before
|
@@ -128,13 +139,43 @@ repository_watchers (alias: repo_watchers)
|
|
128
139
|
```
|
129
140
|
|
130
141
|
|
131
|
-
##
|
142
|
+
## Payload
|
132
143
|
|
133
|
-
|
144
|
+
The payload sent by GitHub is parsed into a hash-like object and is available
|
145
|
+
through the `payload` instance method. For convenience, a `branch` property is
|
146
|
+
added to it, indicating the branch that received the push (extrapolated from
|
147
|
+
the `ref`). The payload property can be indifferently accessed using symbol or
|
148
|
+
string keys.
|
149
|
+
|
150
|
+
The `payload` object also has a `resolve` method that takes a string key and
|
151
|
+
returns the matched property (or array of matched properties) or `nil` if the
|
152
|
+
property or one of its parents is not set:
|
153
|
+
|
154
|
+
```ruby
|
155
|
+
payload.resolve "repository.owner.name"
|
156
|
+
# returns the repo owner name, or nil if either payload["repository"],
|
157
|
+
# payload["repository"]["owner"] or payload["repository"]["owner"]["name"] are
|
158
|
+
# not set.
|
159
|
+
|
160
|
+
payload.resolve "commits.author.name"
|
161
|
+
# returns the array of each commit's author name
|
162
|
+
# Equivalent to `payload["commits"].map {|c| c["author"]["name"]}`, but it
|
163
|
+
# does not raise errors if some property is not set.
|
164
|
+
```
|
165
|
+
|
166
|
+
|
167
|
+
## Alpha release
|
168
|
+
|
169
|
+
Please take into consideration that this is an alpha release, and as such the API
|
170
|
+
may change frequently.
|
134
171
|
|
135
172
|
|
136
173
|
## Changelog
|
137
174
|
|
175
|
+
v0.0.5 - Add `branch` payload property and corresponding DSL method
|
176
|
+
|
177
|
+
v0.0.4 - Payload with indifferent access
|
178
|
+
|
138
179
|
v0.0.3 - Alias `repository_` methods to `repo_`
|
139
180
|
|
140
181
|
v0.0.2 - Alias `commits_` methods to `commit_`
|
data/lib/gwooks/base.rb
CHANGED
data/lib/gwooks/payload.rb
CHANGED
@@ -11,8 +11,17 @@ module Gwooks
|
|
11
11
|
hash[key.to_s] if key.is_a? Symbol
|
12
12
|
end
|
13
13
|
payload = JSON.parse(payload) if payload.is_a? String
|
14
|
+
set_branch payload
|
14
15
|
new_hash.update(payload)
|
15
16
|
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def set_branch(payload)
|
21
|
+
if payload["ref"] and payload["ref"].start_with? "refs/heads/"
|
22
|
+
payload["branch"] = payload["ref"].gsub(/^refs\/heads\//, "")
|
23
|
+
end
|
24
|
+
end
|
16
25
|
end
|
17
26
|
|
18
27
|
def resolve(key)
|
@@ -51,7 +60,7 @@ module Gwooks
|
|
51
60
|
else
|
52
61
|
obj
|
53
62
|
end
|
54
|
-
end
|
63
|
+
end
|
55
64
|
|
56
65
|
end
|
57
66
|
end
|
data/lib/gwooks/version.rb
CHANGED
data/spec/gwooks/base_spec.rb
CHANGED
data/spec/gwooks/payload_spec.rb
CHANGED
@@ -13,6 +13,11 @@ describe Gwooks::Payload do
|
|
13
13
|
payload = Gwooks::Payload.new({"foo" => "bar"})
|
14
14
|
payload.should == {"foo" => "bar"}
|
15
15
|
end
|
16
|
+
|
17
|
+
it "creates the additional 'branch' property from ref" do
|
18
|
+
payload = Gwooks::Payload.new({"ref" => "refs/heads/foo"})
|
19
|
+
payload.should == {"ref" => "refs/heads/foo", "branch" => "foo"}
|
20
|
+
end
|
16
21
|
end
|
17
22
|
end
|
18
23
|
|
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:
|
5
|
-
prerelease:
|
4
|
+
hash: 21
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 5
|
10
|
+
version: 0.0.5
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Luca Ongaro
|
@@ -15,12 +15,9 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2013-01-
|
19
|
-
default_executable:
|
18
|
+
date: 2013-01-19 00:00:00 Z
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
22
|
-
name: json
|
23
|
-
prerelease: false
|
24
21
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
22
|
none: false
|
26
23
|
requirements:
|
@@ -30,11 +27,11 @@ dependencies:
|
|
30
27
|
segments:
|
31
28
|
- 0
|
32
29
|
version: "0"
|
30
|
+
prerelease: false
|
33
31
|
type: :runtime
|
32
|
+
name: json
|
34
33
|
version_requirements: *id001
|
35
34
|
- !ruby/object:Gem::Dependency
|
36
|
-
name: sinatra
|
37
|
-
prerelease: false
|
38
35
|
requirement: &id002 !ruby/object:Gem::Requirement
|
39
36
|
none: false
|
40
37
|
requirements:
|
@@ -44,11 +41,11 @@ dependencies:
|
|
44
41
|
segments:
|
45
42
|
- 0
|
46
43
|
version: "0"
|
44
|
+
prerelease: false
|
47
45
|
type: :runtime
|
46
|
+
name: sinatra
|
48
47
|
version_requirements: *id002
|
49
48
|
- !ruby/object:Gem::Dependency
|
50
|
-
name: rspec
|
51
|
-
prerelease: false
|
52
49
|
requirement: &id003 !ruby/object:Gem::Requirement
|
53
50
|
none: false
|
54
51
|
requirements:
|
@@ -58,11 +55,11 @@ dependencies:
|
|
58
55
|
segments:
|
59
56
|
- 0
|
60
57
|
version: "0"
|
58
|
+
prerelease: false
|
61
59
|
type: :development
|
60
|
+
name: rspec
|
62
61
|
version_requirements: *id003
|
63
62
|
- !ruby/object:Gem::Dependency
|
64
|
-
name: rack-test
|
65
|
-
prerelease: false
|
66
63
|
requirement: &id004 !ruby/object:Gem::Requirement
|
67
64
|
none: false
|
68
65
|
requirements:
|
@@ -72,7 +69,9 @@ dependencies:
|
|
72
69
|
segments:
|
73
70
|
- 0
|
74
71
|
version: "0"
|
72
|
+
prerelease: false
|
75
73
|
type: :development
|
74
|
+
name: rack-test
|
76
75
|
version_requirements: *id004
|
77
76
|
description: A DSL for quickly creating endpoints for GitHub post-receive webhooks.
|
78
77
|
email:
|
@@ -100,7 +99,6 @@ files:
|
|
100
99
|
- spec/gwooks/payload_spec.rb
|
101
100
|
- spec/integration/integration_spec.rb
|
102
101
|
- spec/spec_helper.rb
|
103
|
-
has_rdoc: true
|
104
102
|
homepage: https://github.com/lucaong/gwooks
|
105
103
|
licenses: []
|
106
104
|
|
@@ -130,7 +128,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
130
128
|
requirements: []
|
131
129
|
|
132
130
|
rubyforge_project:
|
133
|
-
rubygems_version: 1.
|
131
|
+
rubygems_version: 1.8.24
|
134
132
|
signing_key:
|
135
133
|
specification_version: 3
|
136
134
|
summary: A DSL for quickly creating endpoints for GitHub post-receive webhooks. It provides methods for executing blocks of code when GitHub posts a payload matching some conditions in response to a code push.
|