githook 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0d6ad67228de0794573cee0c93d11e0c1983a0f3
4
+ data.tar.gz: 53a47507217adb632d626c8cb6d7b5294704dd73
5
+ SHA512:
6
+ metadata.gz: eed95b3d2f1051f5f99f415b20c856f62cc521e784a1a750dd0564b5aecafd211f111a8615e8122d35dc5fb72eeca3c20630006335d275a4c41e5abc4c5f8050
7
+ data.tar.gz: 8c9fb99c67059699529013a85140efd4bc50d8651d1137c96a9c4f0d7e41410d083242fba03924cd02a4f626e2da004fe09aa821cc406680efab5ca6b215dd01
data/lib/githook.rb ADDED
@@ -0,0 +1,3 @@
1
+ require 'octokit'
2
+ require 'githook/bot'
3
+ require 'githook/event_objects/pull_request'
@@ -0,0 +1,74 @@
1
+ require 'logger'
2
+
3
+ module Githook
4
+ class Bot
5
+ attr_accessor :github_client
6
+
7
+ def initialize(configs = {})
8
+ access_token = configs[:access_token]
9
+ @logger = configs[:logger] || Logger.new(STDOUT)
10
+
11
+ raise "No Github access token was provided. Your bot will be unable to perform Github actions on your behalf." unless access_token
12
+
13
+ @github_client = Octokit::Client.new({access_token:
14
+ access_token
15
+ })
16
+
17
+ @registry = {}
18
+ end
19
+
20
+ def registry
21
+ @registry
22
+ end
23
+
24
+ def perform(&handler)
25
+ event_keys = if !@actions.empty?
26
+ @actions.map {|a| "#{@event_type}-#{a}"}
27
+ else
28
+ [@event_type]
29
+ end
30
+
31
+ event_keys.each {|key| @registry[key] = handler}
32
+ end
33
+
34
+ @actions = []
35
+ def when(event_action)
36
+ @actions << event_action
37
+
38
+ self
39
+ end
40
+
41
+ @event_type = nil
42
+ def on(event_type)
43
+ @event_type = event_type
44
+ @actions = []
45
+
46
+ self
47
+ end
48
+
49
+ def process(body)
50
+ event_info = github_event(body)
51
+
52
+ handler = (@registry["#{event_info['event']}-#{event_info['action']}"] || @registry[event_info['event']])
53
+
54
+ if handler
55
+ pr_info = body['pull_request'] || body['issue']
56
+ repo_name = pr_info['head'] ? pr_info['head']['repo']['full_name'] : nil
57
+ pr = Githook::PullRequest.new(pr_info['title'], pr_info['body'], repo_name, body['number'], pr_info['user']['login'], self.github_client)
58
+ handler.call(pr)
59
+ end
60
+ end
61
+
62
+ private
63
+ def github_event(body)
64
+ # Normally the GitHub event is present in the X-GitHub-Event headers but sometimes
65
+ # that header is absent in which case we need to brute force it.
66
+ events = %w(commit_comment create delete deployment deployment_status fork gollum issue_comment issue pull_request)
67
+
68
+ event = (body.keys & events).first # should only ever be one
69
+
70
+ @logger.info("Detected the following GitHub event: action: #{body['action']} event: #{event}")
71
+ {'action' => body['action'], 'event' => event}
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,27 @@
1
+ module Githook
2
+ class PullRequest
3
+ attr_accessor :title, :description, :repo, :author
4
+
5
+ def initialize(title, description, full_repo_name, number, author, client)
6
+ @title = title
7
+ @description = description
8
+ @number = number
9
+ @repo = full_repo_name
10
+ @author = author
11
+ @client = client
12
+ end
13
+
14
+ def comment(message)
15
+ puts "Made comment to #{github_pr_url} with message '#{message}'"
16
+
17
+ @client.post("#{github_pr_url}/comments", {
18
+ body: message
19
+ })
20
+ end
21
+ private
22
+
23
+ def github_pr_url
24
+ "/repos/#{@repo}/issues/#{@number}"
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,3 @@
1
+ module Githook
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+
3
+ describe Githook do
4
+ context 'initializing your Githook::Bot' do
5
+ it "raises error if no 'access_token' is provided" do
6
+ expect{ Githook::Bot.new }.to raise_error(StandardError)
7
+ end
8
+ end
9
+
10
+ context "processing Github events in 'process'" do
11
+ let(:mybot) { Githook::Bot.new(access_token: 'xxxxxxfakexxxx') }
12
+ let(:handler) { Proc.new {|pr| true} }
13
+
14
+ it 'invokes the handler that matches the event type and action' do
15
+ mybot.on('pull_request').when('opened').perform(&handler)
16
+ expect(handler).to receive(:call)
17
+ mybot.process(WEBHOOK_REQUESTS['spec/webhooks/opened_pr.json'])
18
+ end
19
+
20
+ it 'passes an appropriate object to the invoked block' do
21
+ complex_handler = Proc.new do |pr|
22
+ unless pr.class == Githook::PullRequest
23
+ raise "pr is not of type Githook::PullRequest"
24
+ end
25
+ end
26
+
27
+ mybot.on('pull_request').when('opened').perform(&complex_handler)
28
+ expect{ mybot.process(WEBHOOK_REQUESTS['spec/webhooks/opened_pr.json']) }.to_not raise_error
29
+ end
30
+ end
31
+
32
+ context "registering new webhook action by invoking 'on'" do
33
+ let(:mybot) { Githook::Bot.new(access_token: 'xxxxxxfakexxxx') }
34
+
35
+ it "successfully registers appropriate handler for the event#action specified" do
36
+ handler = Proc.new {|pr| true}
37
+ mybot.on('pull_request').when('opened').perform(&handler)
38
+
39
+ expect(mybot.registry['pull_request-opened']).to eq(handler)
40
+ expect(mybot.registry['pull_request']).to eq(nil)
41
+ end
42
+
43
+ it "registers handler only for the event if no action is specified" do
44
+ handler = Proc.new {|pr| true}
45
+ mybot.on('pull_request').perform(&handler)
46
+
47
+ expect(mybot.registry['pull_request']).to eq(handler)
48
+ end
49
+
50
+ it "registers handler only for each event#action specified" do
51
+ handler = Proc.new {|pr| true}
52
+ mybot.on('pull_request').when('opened').when('reopened').perform(&handler)
53
+
54
+ expect(mybot.registry['pull_request-opened']).to eq(handler)
55
+ expect(mybot.registry['pull_request-reopened']).to eq(handler)
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,15 @@
1
+ SPEC_DIR = File.expand_path('..', __FILE__)
2
+
3
+ require 'bundler'
4
+ require 'byebug'
5
+ require 'rspec'
6
+ require 'json'
7
+ require 'githook'
8
+
9
+ Bundler.setup
10
+
11
+ WEBHOOK_REQUESTS = {}
12
+ Dir['spec/webhooks/*.json'].each do |wh|
13
+ file = File.read(wh)
14
+ WEBHOOK_REQUESTS[wh] = JSON.parse(file)
15
+ end
@@ -0,0 +1,3 @@
1
+ # Webhook Replay Files
2
+
3
+ This directory contains a manifest of Github web hook request bodies for each of the event/action combos that the `githook` gem supports.
@@ -0,0 +1,412 @@
1
+ {
2
+ "action": "closed",
3
+ "number": 3,
4
+ "pull_request": {
5
+ "url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/pulls/3",
6
+ "id": 32587181,
7
+ "html_url": "https://github.com/miwest929/noun_phrase_extractor/pull/3",
8
+ "diff_url": "https://github.com/miwest929/noun_phrase_extractor/pull/3.diff",
9
+ "patch_url": "https://github.com/miwest929/noun_phrase_extractor/pull/3.patch",
10
+ "issue_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/issues/3",
11
+ "number": 3,
12
+ "state": "closed",
13
+ "locked": false,
14
+ "title": "Remove unused initializer",
15
+ "user": {
16
+ "login": "miwest929",
17
+ "id": 1210746,
18
+ "avatar_url": "https://avatars.githubusercontent.com/u/1210746?v=3",
19
+ "gravatar_id": "",
20
+ "url": "https://api.github.com/users/miwest929",
21
+ "html_url": "https://github.com/miwest929",
22
+ "followers_url": "https://api.github.com/users/miwest929/followers",
23
+ "following_url": "https://api.github.com/users/miwest929/following{/other_user}",
24
+ "gists_url": "https://api.github.com/users/miwest929/gists{/gist_id}",
25
+ "starred_url": "https://api.github.com/users/miwest929/starred{/owner}{/repo}",
26
+ "subscriptions_url": "https://api.github.com/users/miwest929/subscriptions",
27
+ "organizations_url": "https://api.github.com/users/miwest929/orgs",
28
+ "repos_url": "https://api.github.com/users/miwest929/repos",
29
+ "events_url": "https://api.github.com/users/miwest929/events{/privacy}",
30
+ "received_events_url": "https://api.github.com/users/miwest929/received_events",
31
+ "type": "User",
32
+ "site_admin": false
33
+ },
34
+ "body": "",
35
+ "created_at": "2015-04-03T12:56:21Z",
36
+ "updated_at": "2015-04-03T13:08:21Z",
37
+ "closed_at": "2015-04-03T13:08:21Z",
38
+ "merged_at": null,
39
+ "merge_commit_sha": "d0369f6ad910bb3f029f4d9e160466a7da7721f4",
40
+ "assignee": null,
41
+ "milestone": null,
42
+ "commits_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/pulls/3/commits",
43
+ "review_comments_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/pulls/3/comments",
44
+ "review_comment_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/pulls/comments{/number}",
45
+ "comments_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/issues/3/comments",
46
+ "statuses_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/statuses/4b1fc279666db876a618cb38d069e496a127bb0c",
47
+ "head": {
48
+ "label": "miwest929:remove_unused_initializer",
49
+ "ref": "remove_unused_initializer",
50
+ "sha": "4b1fc279666db876a618cb38d069e496a127bb0c",
51
+ "user": {
52
+ "login": "miwest929",
53
+ "id": 1210746,
54
+ "avatar_url": "https://avatars.githubusercontent.com/u/1210746?v=3",
55
+ "gravatar_id": "",
56
+ "url": "https://api.github.com/users/miwest929",
57
+ "html_url": "https://github.com/miwest929",
58
+ "followers_url": "https://api.github.com/users/miwest929/followers",
59
+ "following_url": "https://api.github.com/users/miwest929/following{/other_user}",
60
+ "gists_url": "https://api.github.com/users/miwest929/gists{/gist_id}",
61
+ "starred_url": "https://api.github.com/users/miwest929/starred{/owner}{/repo}",
62
+ "subscriptions_url": "https://api.github.com/users/miwest929/subscriptions",
63
+ "organizations_url": "https://api.github.com/users/miwest929/orgs",
64
+ "repos_url": "https://api.github.com/users/miwest929/repos",
65
+ "events_url": "https://api.github.com/users/miwest929/events{/privacy}",
66
+ "received_events_url": "https://api.github.com/users/miwest929/received_events",
67
+ "type": "User",
68
+ "site_admin": false
69
+ },
70
+ "repo": {
71
+ "id": 32995368,
72
+ "name": "noun_phrase_extractor",
73
+ "full_name": "miwest929/noun_phrase_extractor",
74
+ "owner": {
75
+ "login": "miwest929",
76
+ "id": 1210746,
77
+ "avatar_url": "https://avatars.githubusercontent.com/u/1210746?v=3",
78
+ "gravatar_id": "",
79
+ "url": "https://api.github.com/users/miwest929",
80
+ "html_url": "https://github.com/miwest929",
81
+ "followers_url": "https://api.github.com/users/miwest929/followers",
82
+ "following_url": "https://api.github.com/users/miwest929/following{/other_user}",
83
+ "gists_url": "https://api.github.com/users/miwest929/gists{/gist_id}",
84
+ "starred_url": "https://api.github.com/users/miwest929/starred{/owner}{/repo}",
85
+ "subscriptions_url": "https://api.github.com/users/miwest929/subscriptions",
86
+ "organizations_url": "https://api.github.com/users/miwest929/orgs",
87
+ "repos_url": "https://api.github.com/users/miwest929/repos",
88
+ "events_url": "https://api.github.com/users/miwest929/events{/privacy}",
89
+ "received_events_url": "https://api.github.com/users/miwest929/received_events",
90
+ "type": "User",
91
+ "site_admin": false
92
+ },
93
+ "private": false,
94
+ "html_url": "https://github.com/miwest929/noun_phrase_extractor",
95
+ "description": "Demo of Noun Phrase Extraction algorithm in Ruby",
96
+ "fork": false,
97
+ "url": "https://api.github.com/repos/miwest929/noun_phrase_extractor",
98
+ "forks_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/forks",
99
+ "keys_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/keys{/key_id}",
100
+ "collaborators_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/collaborators{/collaborator}",
101
+ "teams_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/teams",
102
+ "hooks_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/hooks",
103
+ "issue_events_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/issues/events{/number}",
104
+ "events_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/events",
105
+ "assignees_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/assignees{/user}",
106
+ "branches_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/branches{/branch}",
107
+ "tags_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/tags",
108
+ "blobs_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/git/blobs{/sha}",
109
+ "git_tags_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/git/tags{/sha}",
110
+ "git_refs_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/git/refs{/sha}",
111
+ "trees_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/git/trees{/sha}",
112
+ "statuses_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/statuses/{sha}",
113
+ "languages_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/languages",
114
+ "stargazers_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/stargazers",
115
+ "contributors_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/contributors",
116
+ "subscribers_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/subscribers",
117
+ "subscription_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/subscription",
118
+ "commits_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/commits{/sha}",
119
+ "git_commits_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/git/commits{/sha}",
120
+ "comments_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/comments{/number}",
121
+ "issue_comment_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/issues/comments{/number}",
122
+ "contents_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/contents/{+path}",
123
+ "compare_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/compare/{base}...{head}",
124
+ "merges_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/merges",
125
+ "archive_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/{archive_format}{/ref}",
126
+ "downloads_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/downloads",
127
+ "issues_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/issues{/number}",
128
+ "pulls_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/pulls{/number}",
129
+ "milestones_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/milestones{/number}",
130
+ "notifications_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/notifications{?since,all,participating}",
131
+ "labels_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/labels{/name}",
132
+ "releases_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/releases{/id}",
133
+ "created_at": "2015-03-27T15:56:18Z",
134
+ "updated_at": "2015-04-02T18:50:16Z",
135
+ "pushed_at": "2015-04-03T12:56:21Z",
136
+ "git_url": "git://github.com/miwest929/noun_phrase_extractor.git",
137
+ "ssh_url": "git@github.com:miwest929/noun_phrase_extractor.git",
138
+ "clone_url": "https://github.com/miwest929/noun_phrase_extractor.git",
139
+ "svn_url": "https://github.com/miwest929/noun_phrase_extractor",
140
+ "homepage": null,
141
+ "size": 0,
142
+ "stargazers_count": 0,
143
+ "watchers_count": 0,
144
+ "language": "Perl",
145
+ "has_issues": true,
146
+ "has_downloads": true,
147
+ "has_wiki": true,
148
+ "has_pages": false,
149
+ "forks_count": 0,
150
+ "mirror_url": null,
151
+ "open_issues_count": 0,
152
+ "forks": 0,
153
+ "open_issues": 0,
154
+ "watchers": 0,
155
+ "default_branch": "master"
156
+ }
157
+ },
158
+ "base": {
159
+ "label": "miwest929:master",
160
+ "ref": "master",
161
+ "sha": "0b88209daffd0765f80f2300efa7fc9981e0055c",
162
+ "user": {
163
+ "login": "miwest929",
164
+ "id": 1210746,
165
+ "avatar_url": "https://avatars.githubusercontent.com/u/1210746?v=3",
166
+ "gravatar_id": "",
167
+ "url": "https://api.github.com/users/miwest929",
168
+ "html_url": "https://github.com/miwest929",
169
+ "followers_url": "https://api.github.com/users/miwest929/followers",
170
+ "following_url": "https://api.github.com/users/miwest929/following{/other_user}",
171
+ "gists_url": "https://api.github.com/users/miwest929/gists{/gist_id}",
172
+ "starred_url": "https://api.github.com/users/miwest929/starred{/owner}{/repo}",
173
+ "subscriptions_url": "https://api.github.com/users/miwest929/subscriptions",
174
+ "organizations_url": "https://api.github.com/users/miwest929/orgs",
175
+ "repos_url": "https://api.github.com/users/miwest929/repos",
176
+ "events_url": "https://api.github.com/users/miwest929/events{/privacy}",
177
+ "received_events_url": "https://api.github.com/users/miwest929/received_events",
178
+ "type": "User",
179
+ "site_admin": false
180
+ },
181
+ "repo": {
182
+ "id": 32995368,
183
+ "name": "noun_phrase_extractor",
184
+ "full_name": "miwest929/noun_phrase_extractor",
185
+ "owner": {
186
+ "login": "miwest929",
187
+ "id": 1210746,
188
+ "avatar_url": "https://avatars.githubusercontent.com/u/1210746?v=3",
189
+ "gravatar_id": "",
190
+ "url": "https://api.github.com/users/miwest929",
191
+ "html_url": "https://github.com/miwest929",
192
+ "followers_url": "https://api.github.com/users/miwest929/followers",
193
+ "following_url": "https://api.github.com/users/miwest929/following{/other_user}",
194
+ "gists_url": "https://api.github.com/users/miwest929/gists{/gist_id}",
195
+ "starred_url": "https://api.github.com/users/miwest929/starred{/owner}{/repo}",
196
+ "subscriptions_url": "https://api.github.com/users/miwest929/subscriptions",
197
+ "organizations_url": "https://api.github.com/users/miwest929/orgs",
198
+ "repos_url": "https://api.github.com/users/miwest929/repos",
199
+ "events_url": "https://api.github.com/users/miwest929/events{/privacy}",
200
+ "received_events_url": "https://api.github.com/users/miwest929/received_events",
201
+ "type": "User",
202
+ "site_admin": false
203
+ },
204
+ "private": false,
205
+ "html_url": "https://github.com/miwest929/noun_phrase_extractor",
206
+ "description": "Demo of Noun Phrase Extraction algorithm in Ruby",
207
+ "fork": false,
208
+ "url": "https://api.github.com/repos/miwest929/noun_phrase_extractor",
209
+ "forks_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/forks",
210
+ "keys_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/keys{/key_id}",
211
+ "collaborators_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/collaborators{/collaborator}",
212
+ "teams_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/teams",
213
+ "hooks_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/hooks",
214
+ "issue_events_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/issues/events{/number}",
215
+ "events_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/events",
216
+ "assignees_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/assignees{/user}",
217
+ "branches_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/branches{/branch}",
218
+ "tags_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/tags",
219
+ "blobs_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/git/blobs{/sha}",
220
+ "git_tags_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/git/tags{/sha}",
221
+ "git_refs_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/git/refs{/sha}",
222
+ "trees_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/git/trees{/sha}",
223
+ "statuses_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/statuses/{sha}",
224
+ "languages_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/languages",
225
+ "stargazers_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/stargazers",
226
+ "contributors_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/contributors",
227
+ "subscribers_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/subscribers",
228
+ "subscription_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/subscription",
229
+ "commits_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/commits{/sha}",
230
+ "git_commits_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/git/commits{/sha}",
231
+ "comments_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/comments{/number}",
232
+ "issue_comment_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/issues/comments{/number}",
233
+ "contents_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/contents/{+path}",
234
+ "compare_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/compare/{base}...{head}",
235
+ "merges_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/merges",
236
+ "archive_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/{archive_format}{/ref}",
237
+ "downloads_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/downloads",
238
+ "issues_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/issues{/number}",
239
+ "pulls_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/pulls{/number}",
240
+ "milestones_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/milestones{/number}",
241
+ "notifications_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/notifications{?since,all,participating}",
242
+ "labels_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/labels{/name}",
243
+ "releases_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/releases{/id}",
244
+ "created_at": "2015-03-27T15:56:18Z",
245
+ "updated_at": "2015-04-02T18:50:16Z",
246
+ "pushed_at": "2015-04-03T12:56:21Z",
247
+ "git_url": "git://github.com/miwest929/noun_phrase_extractor.git",
248
+ "ssh_url": "git@github.com:miwest929/noun_phrase_extractor.git",
249
+ "clone_url": "https://github.com/miwest929/noun_phrase_extractor.git",
250
+ "svn_url": "https://github.com/miwest929/noun_phrase_extractor",
251
+ "homepage": null,
252
+ "size": 0,
253
+ "stargazers_count": 0,
254
+ "watchers_count": 0,
255
+ "language": "Perl",
256
+ "has_issues": true,
257
+ "has_downloads": true,
258
+ "has_wiki": true,
259
+ "has_pages": false,
260
+ "forks_count": 0,
261
+ "mirror_url": null,
262
+ "open_issues_count": 0,
263
+ "forks": 0,
264
+ "open_issues": 0,
265
+ "watchers": 0,
266
+ "default_branch": "master"
267
+ }
268
+ },
269
+ "_links": {
270
+ "self": {
271
+ "href": "https://api.github.com/repos/miwest929/noun_phrase_extractor/pulls/3"
272
+ },
273
+ "html": {
274
+ "href": "https://github.com/miwest929/noun_phrase_extractor/pull/3"
275
+ },
276
+ "issue": {
277
+ "href": "https://api.github.com/repos/miwest929/noun_phrase_extractor/issues/3"
278
+ },
279
+ "comments": {
280
+ "href": "https://api.github.com/repos/miwest929/noun_phrase_extractor/issues/3/comments"
281
+ },
282
+ "review_comments": {
283
+ "href": "https://api.github.com/repos/miwest929/noun_phrase_extractor/pulls/3/comments"
284
+ },
285
+ "review_comment": {
286
+ "href": "https://api.github.com/repos/miwest929/noun_phrase_extractor/pulls/comments{/number}"
287
+ },
288
+ "commits": {
289
+ "href": "https://api.github.com/repos/miwest929/noun_phrase_extractor/pulls/3/commits"
290
+ },
291
+ "statuses": {
292
+ "href": "https://api.github.com/repos/miwest929/noun_phrase_extractor/statuses/4b1fc279666db876a618cb38d069e496a127bb0c"
293
+ }
294
+ },
295
+ "merged": false,
296
+ "mergeable": true,
297
+ "mergeable_state": "clean",
298
+ "merged_by": null,
299
+ "comments": 8,
300
+ "review_comments": 0,
301
+ "commits": 1,
302
+ "additions": 0,
303
+ "deletions": 3,
304
+ "changed_files": 1
305
+ },
306
+ "repository": {
307
+ "id": 32995368,
308
+ "name": "noun_phrase_extractor",
309
+ "full_name": "miwest929/noun_phrase_extractor",
310
+ "owner": {
311
+ "login": "miwest929",
312
+ "id": 1210746,
313
+ "avatar_url": "https://avatars.githubusercontent.com/u/1210746?v=3",
314
+ "gravatar_id": "",
315
+ "url": "https://api.github.com/users/miwest929",
316
+ "html_url": "https://github.com/miwest929",
317
+ "followers_url": "https://api.github.com/users/miwest929/followers",
318
+ "following_url": "https://api.github.com/users/miwest929/following{/other_user}",
319
+ "gists_url": "https://api.github.com/users/miwest929/gists{/gist_id}",
320
+ "starred_url": "https://api.github.com/users/miwest929/starred{/owner}{/repo}",
321
+ "subscriptions_url": "https://api.github.com/users/miwest929/subscriptions",
322
+ "organizations_url": "https://api.github.com/users/miwest929/orgs",
323
+ "repos_url": "https://api.github.com/users/miwest929/repos",
324
+ "events_url": "https://api.github.com/users/miwest929/events{/privacy}",
325
+ "received_events_url": "https://api.github.com/users/miwest929/received_events",
326
+ "type": "User",
327
+ "site_admin": false
328
+ },
329
+ "private": false,
330
+ "html_url": "https://github.com/miwest929/noun_phrase_extractor",
331
+ "description": "Demo of Noun Phrase Extraction algorithm in Ruby",
332
+ "fork": false,
333
+ "url": "https://api.github.com/repos/miwest929/noun_phrase_extractor",
334
+ "forks_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/forks",
335
+ "keys_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/keys{/key_id}",
336
+ "collaborators_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/collaborators{/collaborator}",
337
+ "teams_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/teams",
338
+ "hooks_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/hooks",
339
+ "issue_events_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/issues/events{/number}",
340
+ "events_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/events",
341
+ "assignees_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/assignees{/user}",
342
+ "branches_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/branches{/branch}",
343
+ "tags_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/tags",
344
+ "blobs_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/git/blobs{/sha}",
345
+ "git_tags_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/git/tags{/sha}",
346
+ "git_refs_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/git/refs{/sha}",
347
+ "trees_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/git/trees{/sha}",
348
+ "statuses_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/statuses/{sha}",
349
+ "languages_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/languages",
350
+ "stargazers_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/stargazers",
351
+ "contributors_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/contributors",
352
+ "subscribers_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/subscribers",
353
+ "subscription_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/subscription",
354
+ "commits_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/commits{/sha}",
355
+ "git_commits_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/git/commits{/sha}",
356
+ "comments_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/comments{/number}",
357
+ "issue_comment_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/issues/comments{/number}",
358
+ "contents_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/contents/{+path}",
359
+ "compare_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/compare/{base}...{head}",
360
+ "merges_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/merges",
361
+ "archive_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/{archive_format}{/ref}",
362
+ "downloads_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/downloads",
363
+ "issues_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/issues{/number}",
364
+ "pulls_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/pulls{/number}",
365
+ "milestones_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/milestones{/number}",
366
+ "notifications_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/notifications{?since,all,participating}",
367
+ "labels_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/labels{/name}",
368
+ "releases_url": "https://api.github.com/repos/miwest929/noun_phrase_extractor/releases{/id}",
369
+ "created_at": "2015-03-27T15:56:18Z",
370
+ "updated_at": "2015-04-02T18:50:16Z",
371
+ "pushed_at": "2015-04-03T12:56:21Z",
372
+ "git_url": "git://github.com/miwest929/noun_phrase_extractor.git",
373
+ "ssh_url": "git@github.com:miwest929/noun_phrase_extractor.git",
374
+ "clone_url": "https://github.com/miwest929/noun_phrase_extractor.git",
375
+ "svn_url": "https://github.com/miwest929/noun_phrase_extractor",
376
+ "homepage": null,
377
+ "size": 0,
378
+ "stargazers_count": 0,
379
+ "watchers_count": 0,
380
+ "language": "Perl",
381
+ "has_issues": true,
382
+ "has_downloads": true,
383
+ "has_wiki": true,
384
+ "has_pages": false,
385
+ "forks_count": 0,
386
+ "mirror_url": null,
387
+ "open_issues_count": 0,
388
+ "forks": 0,
389
+ "open_issues": 0,
390
+ "watchers": 0,
391
+ "default_branch": "master"
392
+ },
393
+ "sender": {
394
+ "login": "miwest929",
395
+ "id": 1210746,
396
+ "avatar_url": "https://avatars.githubusercontent.com/u/1210746?v=3",
397
+ "gravatar_id": "",
398
+ "url": "https://api.github.com/users/miwest929",
399
+ "html_url": "https://github.com/miwest929",
400
+ "followers_url": "https://api.github.com/users/miwest929/followers",
401
+ "following_url": "https://api.github.com/users/miwest929/following{/other_user}",
402
+ "gists_url": "https://api.github.com/users/miwest929/gists{/gist_id}",
403
+ "starred_url": "https://api.github.com/users/miwest929/starred{/owner}{/repo}",
404
+ "subscriptions_url": "https://api.github.com/users/miwest929/subscriptions",
405
+ "organizations_url": "https://api.github.com/users/miwest929/orgs",
406
+ "repos_url": "https://api.github.com/users/miwest929/repos",
407
+ "events_url": "https://api.github.com/users/miwest929/events{/privacy}",
408
+ "received_events_url": "https://api.github.com/users/miwest929/received_events",
409
+ "type": "User",
410
+ "site_admin": false
411
+ }
412
+ }