githook 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/githook.rb +3 -0
- data/lib/githook/bot.rb +74 -0
- data/lib/githook/event_objects/pull_request.rb +27 -0
- data/lib/githook/version.rb +3 -0
- data/spec/githook_spec.rb +58 -0
- data/spec/spec_helper.rb +15 -0
- data/spec/webhooks/README.md +3 -0
- data/spec/webhooks/closed_pr.json +412 -0
- data/spec/webhooks/create_comment.json +184 -0
- data/spec/webhooks/opened_pr.json +413 -0
- data/spec/webhooks/reopened_pr.json +412 -0
- metadata +75 -0
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
data/lib/githook/bot.rb
ADDED
@@ -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,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
|
data/spec/spec_helper.rb
ADDED
@@ -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,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
|
+
}
|