github_api 0.8.2 → 0.8.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +20 -1
- data/features/cassettes/issues/events/get.yml +139 -0
- data/features/cassettes/issues/events/list_issue.yml +71 -0
- data/features/cassettes/issues/events/list_repo.yml +222 -0
- data/features/cassettes/issues/labels/list_repo.yml +65 -0
- data/features/cassettes/issues/milestones/create.yml +55 -0
- data/features/cassettes/issues/milestones/delete.yml +46 -0
- data/features/cassettes/issues/milestones/get.yml +175 -0
- data/features/cassettes/issues/milestones/list.yml +54 -0
- data/features/cassettes/issues/milestones/update.yml +53 -0
- data/features/cassettes/repos/contents/archive.yml +43 -84
- data/features/cassettes/say/custom.yml +60 -0
- data/features/cassettes/say/random.yml +60 -0
- data/features/issues/events.feature +38 -0
- data/features/issues/labels.feature +14 -0
- data/features/issues/milestones.feature +62 -0
- data/features/say.feature +68 -0
- data/features/step_definitions/common_steps.rb +6 -0
- data/features/support/helpers.rb +4 -0
- data/lib/github_api.rb +2 -0
- data/lib/github_api/client.rb +8 -0
- data/lib/github_api/constants.rb +4 -0
- data/lib/github_api/issues.rb +74 -46
- data/lib/github_api/issues/assignees.rb +2 -1
- data/lib/github_api/issues/events.rb +3 -3
- data/lib/github_api/issues/milestones.rb +0 -1
- data/lib/github_api/rate_limit.rb +2 -0
- data/lib/github_api/result.rb +13 -0
- data/lib/github_api/say.rb +24 -0
- data/lib/github_api/scopes.rb +19 -0
- data/lib/github_api/version.rb +1 -1
- data/spec/github/git_data/git_data_spec.rb +19 -0
- data/spec/github/issues/assignees/check_spec.rb +46 -0
- data/spec/github/issues/assignees/list_spec.rb +47 -0
- data/spec/github/issues/assignees_spec.rb +0 -96
- data/spec/github/issues/create_spec.rb +60 -0
- data/spec/github/issues/edit_spec.rb +61 -0
- data/spec/github/issues/events_spec.rb +4 -4
- data/spec/github/issues/get_spec.rb +49 -0
- data/spec/github/issues/issues_spec.rb +19 -0
- data/spec/github/issues/list_spec.rb +90 -0
- data/spec/github/issues/milestones/create_spec.rb +56 -0
- data/spec/github/issues/milestones/delete_spec.rb +42 -0
- data/spec/github/issues/milestones/get_spec.rb +49 -0
- data/spec/github/issues/milestones/list_spec.rb +52 -0
- data/spec/github/issues/milestones/update_spec.rb +57 -0
- data/spec/github/issues/milestones_spec.rb +1 -276
- data/spec/github/scopes/list_spec.rb +33 -0
- data/spec/github/users/followers/follow_spec.rb +33 -0
- data/spec/github/users/followers/following_spec.rb +65 -0
- data/spec/github/users/followers/is_following_spec.rb +41 -0
- data/spec/github/users/followers/list_spec.rb +2 -8
- data/spec/github/users/followers/unfollow_spec.rb +33 -0
- data/spec/github/users/users_spec.rb +16 -0
- metadata +68 -35
- data/spec/github/git_data_spec.rb +0 -11
- data/spec/github/issues_spec.rb +0 -284
- data/spec/github/users/followers_spec.rb +0 -172
@@ -30,6 +30,8 @@ Then /^the response should be (.*)$/ do |expected_response|
|
|
30
30
|
true
|
31
31
|
when /\d+/
|
32
32
|
expected_response.to_i
|
33
|
+
when /empty/
|
34
|
+
[]
|
33
35
|
else
|
34
36
|
expected_response
|
35
37
|
end
|
@@ -62,6 +64,10 @@ Then /^the response should contain (.*)$/ do |item|
|
|
62
64
|
end
|
63
65
|
end
|
64
66
|
|
67
|
+
Then /^the response should contain:$/ do |string|
|
68
|
+
unescape(@response.body).should include(unescape(string))
|
69
|
+
end
|
70
|
+
|
65
71
|
Then /^the response (.*) link should contain:$/ do |type, table|
|
66
72
|
table.hashes.each do |attributes|
|
67
73
|
attributes.each do |key, val|
|
data/features/support/helpers.rb
CHANGED
data/lib/github_api.rb
CHANGED
data/lib/github_api/client.rb
CHANGED
@@ -60,6 +60,14 @@ module Github
|
|
60
60
|
end
|
61
61
|
alias :repositories :repos
|
62
62
|
|
63
|
+
def octocat(options = {})
|
64
|
+
@octocat ||= ApiFactory.new 'Say', options
|
65
|
+
end
|
66
|
+
|
67
|
+
def scopes(options = {})
|
68
|
+
@scopes ||= ApiFactory.new 'Scopes', options
|
69
|
+
end
|
70
|
+
|
63
71
|
def search(options = {})
|
64
72
|
@search ||= ApiFactory.new 'Search', options
|
65
73
|
end
|
data/lib/github_api/constants.rb
CHANGED
data/lib/github_api/issues.rb
CHANGED
@@ -25,6 +25,7 @@ module Github
|
|
25
25
|
body
|
26
26
|
resource
|
27
27
|
mime_type
|
28
|
+
org
|
28
29
|
].freeze
|
29
30
|
|
30
31
|
VALID_ISSUE_PARAM_VALUES = {
|
@@ -67,61 +68,66 @@ module Github
|
|
67
68
|
|
68
69
|
# List your issues
|
69
70
|
#
|
70
|
-
#
|
71
|
-
#
|
72
|
-
#
|
73
|
-
# * <tt>created</tt>: Issues assigned to you (default)
|
74
|
-
# * <tt>mentioned</tt>: Issues assigned to you (default)
|
75
|
-
# * <tt>subscribed</tt>: Issues assigned to you (default)
|
76
|
-
# <tt>:state</tt> - <tt>open</tt>, <tt>closed</tt>, default: <tt>open</tt>
|
77
|
-
# <tt>:labels</tt> - String list of comma separated Label names. Example: bug,ui,@high
|
78
|
-
# <tt>:sort</tt> - <tt>created</tt>, <tt>updated</tt>, <tt>comments</tt>, default: <tt>created</tt>
|
79
|
-
# <tt>:direction</tt> - <tt>asc</tt>, <tt>desc</tt>, default: <tt>desc</tt>
|
80
|
-
# <tt>:since</tt> - Optional string of a timestamp in ISO 8601 format: YYYY-MM-DDTHH:MM:SSZ
|
71
|
+
# List all issues across all the authenticated user’s visible repositories
|
72
|
+
# including owned repositories, member repositories,
|
73
|
+
# and organization repositories.
|
81
74
|
#
|
82
|
-
# =
|
75
|
+
# = Example
|
83
76
|
# github = Github.new :oauth_token => '...'
|
84
|
-
# github.issues.list
|
85
|
-
#
|
86
|
-
#
|
87
|
-
#
|
88
|
-
#
|
89
|
-
#
|
77
|
+
# github.issues.list
|
78
|
+
#
|
79
|
+
# List all issues across owned and member repositories for the
|
80
|
+
# authenticated user.
|
81
|
+
#
|
82
|
+
# = Example
|
83
|
+
# github = Github.new :oauth_token => '...'
|
84
|
+
# github.issues.list :user
|
85
|
+
#
|
86
|
+
# List all issues for a given organization for the authenticated user.
|
87
|
+
#
|
88
|
+
# = Example
|
89
|
+
# github = Github.new :oauth_token => '...'
|
90
|
+
# github.issues.list :org => 'org-name'
|
90
91
|
#
|
91
|
-
def list(*args)
|
92
|
-
params = args.extract_options!
|
93
|
-
normalize! params
|
94
|
-
filter! VALID_ISSUE_PARAM_NAMES, params
|
95
|
-
# _merge_mime_type(:issue, params)
|
96
|
-
assert_valid_values(VALID_ISSUE_PARAM_VALUES, params)
|
97
|
-
|
98
|
-
response = get_request("/issues", params)
|
99
|
-
return response unless block_given?
|
100
|
-
response.each { |el| yield el }
|
101
|
-
end
|
102
|
-
alias :all :list
|
103
|
-
|
104
92
|
# List issues for a repository
|
105
93
|
#
|
94
|
+
# = Example
|
95
|
+
# github = Github.new
|
96
|
+
# github.issues.list :user => 'user-name', :repo => 'repo-name'
|
97
|
+
#
|
106
98
|
# = Parameters
|
99
|
+
# <tt>:filter</tt>
|
100
|
+
# * <tt>assigned</tt> Issues assigned to you (default)
|
101
|
+
# * <tt>created</tt> Issues assigned to you (default)
|
102
|
+
# * <tt>mentioned</tt> Issues assigned to you (default)
|
103
|
+
# * <tt>subscribed</tt> Issues assigned to you (default)
|
107
104
|
# <tt>:milestone</tt>
|
108
105
|
# * Integer Milestone number
|
109
106
|
# * <tt>none</tt> for Issues with no Milestone.
|
110
|
-
# * <tt>*</tt>
|
111
|
-
# <tt>:state</tt>
|
107
|
+
# * <tt>*</tt> for Issues with any Milestone
|
108
|
+
# <tt>:state</tt> - <tt>open</tt>, <tt>closed</tt>, default: <tt>open</tt>
|
109
|
+
# <tt>:labels</tt> - String list of comma separated Label names.
|
110
|
+
# Example: bug,ui,@high
|
112
111
|
# <tt>:assignee</tt>
|
113
112
|
# * String User login
|
114
113
|
# * <tt>none</tt> for Issues with no assigned User.
|
115
|
-
# * <tt>*</tt>
|
114
|
+
# * <tt>*</tt> for Issues with any assigned User.
|
116
115
|
# <tt>:mentioned</tt> String User login
|
117
|
-
# <tt>:
|
118
|
-
#
|
119
|
-
# <tt>:direction</tt> - <tt>asc</tt>, <tt>desc</tt>, default: <tt>desc</tt>
|
120
|
-
# <tt>:since</tt> - Optional string of a timestamp in ISO 8601 format: YYYY-MM-DDTHH:MM:SSZ
|
121
|
-
# <tt></tt>, default: <tt>due_date</tt>
|
116
|
+
# <tt>:sort</tt> - <tt>created</tt>, <tt>updated</tt>, <tt>comments</tt>,
|
117
|
+
# default: <tt>created</tt>
|
122
118
|
# <tt>:direction</tt> - <tt>asc</tt>, <tt>desc</tt>, default: <tt>desc</tt>
|
119
|
+
# <tt>:since</tt> - Optional string of a timestamp in ISO 8601
|
120
|
+
# format: YYYY-MM-DDTHH:MM:SSZ
|
123
121
|
#
|
124
122
|
# = Examples
|
123
|
+
# github = Github.new :oauth_token => '...'
|
124
|
+
# github.issues.list :since => '2011-04-12T12:12:12Z',
|
125
|
+
# :filter => 'created',
|
126
|
+
# :state => 'open',
|
127
|
+
# :labels => "bug,ui,bla",
|
128
|
+
# :sort => 'comments',
|
129
|
+
# :direction => 'asc'
|
130
|
+
#
|
125
131
|
# github = Github.new :user => 'user-name', :repo => 'repo-name'
|
126
132
|
# github.issues.list_repo :milestone => 1,
|
127
133
|
# :state => 'open',
|
@@ -131,20 +137,42 @@ module Github
|
|
131
137
|
# :sort => 'comments',
|
132
138
|
# :direction => 'asc'
|
133
139
|
#
|
134
|
-
def
|
140
|
+
def list(*args)
|
141
|
+
params = args.extract_options!
|
142
|
+
normalize! params
|
143
|
+
# filter! VALID_ISSUE_PARAM_NAMES, params
|
144
|
+
# _merge_mime_type(:issue, params)
|
145
|
+
# assert_valid_values(VALID_ISSUE_PARAM_VALUES, params)
|
146
|
+
|
147
|
+
response = if (org = params.delete('org'))
|
148
|
+
get_request("/orgs/#{org}/issues", params)
|
149
|
+
|
150
|
+
elsif (user_name = params.delete('user')) &&
|
151
|
+
(repo_name = params.delete('repo'))
|
152
|
+
|
153
|
+
list_repo user_name, repo_name, params
|
154
|
+
elsif args.include? :user
|
155
|
+
get_request("/user/issues", params)
|
156
|
+
else
|
157
|
+
get_request("/issues", params)
|
158
|
+
end
|
159
|
+
return response unless block_given?
|
160
|
+
response.each { |el| yield el }
|
161
|
+
end
|
162
|
+
alias :all :list
|
163
|
+
|
164
|
+
# List issues for a repository
|
165
|
+
#
|
166
|
+
def list_repo(user_name, repo_name, params)
|
135
167
|
set :user => user_name, :repo => repo_name
|
136
168
|
assert_presence_of user, repo
|
137
169
|
|
138
|
-
normalize! params
|
139
170
|
filter! VALID_ISSUE_PARAM_NAMES, params
|
140
|
-
# _merge_mime_type(:issue, params)
|
141
171
|
assert_valid_values(VALID_ISSUE_PARAM_VALUES, params)
|
142
172
|
|
143
|
-
|
144
|
-
return response unless block_given?
|
145
|
-
response.each { |el| yield el }
|
173
|
+
get_request("/repos/#{user}/#{repo}/issues", params)
|
146
174
|
end
|
147
|
-
|
175
|
+
private :list_repo
|
148
176
|
|
149
177
|
# Get a single issue
|
150
178
|
#
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module Github
|
4
4
|
class Issues::Assignees < API
|
5
5
|
|
6
|
-
# lists all the available assignees (owner + collaborators)
|
6
|
+
# lists all the available assignees (owner + collaborators)
|
7
7
|
# to which issues may be assigned.
|
8
8
|
#
|
9
9
|
# = Examples
|
@@ -19,6 +19,7 @@ module Github
|
|
19
19
|
return response unless block_given?
|
20
20
|
response.each { |el| yield el }
|
21
21
|
end
|
22
|
+
alias :all :list
|
22
23
|
|
23
24
|
# Check to see if a particular user is an assignee for a repository.
|
24
25
|
#
|
@@ -12,7 +12,7 @@ module Github
|
|
12
12
|
#
|
13
13
|
# = Examples
|
14
14
|
# github = Github.new
|
15
|
-
# github.issues.events.list 'user-name', 'repo-name', 'issue-id'
|
15
|
+
# github.issues.events.list 'user-name', 'repo-name', issue_id: 'issue-id'
|
16
16
|
#
|
17
17
|
# List events for a repository
|
18
18
|
#
|
@@ -20,12 +20,12 @@ module Github
|
|
20
20
|
# github = Github.new
|
21
21
|
# github.issues.events.list 'user-name', 'repo-name'
|
22
22
|
#
|
23
|
-
def list(user_name, repo_name,
|
23
|
+
def list(user_name, repo_name, params={})
|
24
24
|
set :user => user_name, :repo => repo_name
|
25
25
|
assert_presence_of user, repo
|
26
26
|
normalize! params
|
27
27
|
|
28
|
-
response = if issue_id
|
28
|
+
response = if (issue_id = params.delete('issue_id'))
|
29
29
|
get_request("/repos/#{user}/#{repo}/issues/#{issue_id}/events", params)
|
30
30
|
else
|
31
31
|
get_request("/repos/#{user}/#{repo}/issues/events", params)
|
data/lib/github_api/result.rb
CHANGED
@@ -6,6 +6,19 @@ module Github
|
|
6
6
|
|
7
7
|
# TODO Add result counts method to check total items looking at result links
|
8
8
|
|
9
|
+
# All request headers
|
10
|
+
def headers
|
11
|
+
loaded? ? @env[:response_headers] : nil
|
12
|
+
end
|
13
|
+
|
14
|
+
def oauth_scopes
|
15
|
+
loaded? ? @env[:response_headers][OAUTH_SCOPES] : nil
|
16
|
+
end
|
17
|
+
|
18
|
+
def accepted_oauth_scopes
|
19
|
+
loaded? ? @env[:response_headers][ACCEPTED_OAUTH_SCOPES] : nil
|
20
|
+
end
|
21
|
+
|
9
22
|
# Requests are limited to API v3 to 5000 per hour.
|
10
23
|
def ratelimit_limit
|
11
24
|
loaded? ? @env[:response_headers][RATELIMIT_LIMIT] : nil
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Github
|
4
|
+
class Say < API
|
5
|
+
|
6
|
+
# Generate ASCII octocat with speech bubble.
|
7
|
+
#
|
8
|
+
# = Examples
|
9
|
+
# Github::Say.new.say "My custom string..."
|
10
|
+
#
|
11
|
+
# github = Github.new
|
12
|
+
# github.octocat.say "My custom string..."
|
13
|
+
#
|
14
|
+
def say(*args)
|
15
|
+
params = args.extract_options!
|
16
|
+
normalize! params
|
17
|
+
|
18
|
+
params[:s] = args.shift unless args.empty?
|
19
|
+
|
20
|
+
get_request('/octocat', params, :raw => true)
|
21
|
+
end
|
22
|
+
|
23
|
+
end # Say
|
24
|
+
end # Github
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Github
|
4
|
+
class Scopes < API
|
5
|
+
|
6
|
+
# Check what OAuth scopes you have.
|
7
|
+
#
|
8
|
+
# = Examples
|
9
|
+
# github = Github.new :oauth_token => 'token'
|
10
|
+
# github.scopes.all
|
11
|
+
#
|
12
|
+
def list(params={})
|
13
|
+
response = get_request("/user", params)
|
14
|
+
response.oauth_scopes ? response.oauth_scopes.split(',') : response
|
15
|
+
end
|
16
|
+
alias :all :list
|
17
|
+
|
18
|
+
end
|
19
|
+
end # Github
|
data/lib/github_api/version.rb
CHANGED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Github::GitData, 'integration' do
|
4
|
+
|
5
|
+
after { reset_authentication_for subject }
|
6
|
+
|
7
|
+
it_should_behave_like 'api interface'
|
8
|
+
|
9
|
+
its(:blobs) { should be_a Github::GitData::Blobs }
|
10
|
+
|
11
|
+
its(:commits) { should be_a Github::GitData::Commits }
|
12
|
+
|
13
|
+
its(:references) { should be_a Github::GitData::References }
|
14
|
+
|
15
|
+
its(:tags) { should be_a Github::GitData::Tags }
|
16
|
+
|
17
|
+
its(:trees) { should be_a Github::GitData::Trees }
|
18
|
+
|
19
|
+
end # Github::GitData
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Github::Issues::Assignees, '#check' do
|
6
|
+
let(:user) { 'peter-murach' }
|
7
|
+
let(:repo) { 'github' }
|
8
|
+
let(:assignee) { 'octocat' }
|
9
|
+
let(:request_path) { "/repos/#{user}/#{repo}/assignees/#{assignee}" }
|
10
|
+
|
11
|
+
before {
|
12
|
+
stub_get(request_path).to_return(:body => body, :status => status,
|
13
|
+
:headers => {:content_type => "application/json; charset=utf-8"})
|
14
|
+
}
|
15
|
+
|
16
|
+
after { reset_authentication_for(subject) }
|
17
|
+
|
18
|
+
context "resource found " do
|
19
|
+
let(:body) { '[]' }
|
20
|
+
let(:status) { 204 }
|
21
|
+
|
22
|
+
it "should fail to get resource without collaborator name" do
|
23
|
+
expect { subject.check user, repo, nil }.to raise_error(ArgumentError)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should get the resource" do
|
27
|
+
subject.check user, repo, assignee
|
28
|
+
a_get(request_path).should have_been_made
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should find assignee" do
|
32
|
+
subject.should_receive(:check).with(user, repo, assignee) { true }
|
33
|
+
subject.check user, repo, assignee
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "resource not found" do
|
38
|
+
let(:body) { '[]' }
|
39
|
+
let(:status) { 404 }
|
40
|
+
|
41
|
+
it "should fail to retrieve resource" do
|
42
|
+
subject.should_receive(:check).with(user, repo, assignee) { false }
|
43
|
+
subject.check user, repo, assignee
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end # check
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Github::Issues::Assignees, '#list' do
|
6
|
+
let(:user) { 'peter-murach' }
|
7
|
+
let(:repo) { 'github' }
|
8
|
+
let(:request_path) { "/repos/#{user}/#{repo}/assignees" }
|
9
|
+
|
10
|
+
before {
|
11
|
+
stub_get(request_path).to_return(:body => body, :status => status,
|
12
|
+
:headers => {:content_type => "application/json; charset=utf-8"})
|
13
|
+
}
|
14
|
+
|
15
|
+
after { reset_authentication_for(subject) }
|
16
|
+
|
17
|
+
context 'resources found' do
|
18
|
+
let(:body) { fixture('repos/assignees.json') }
|
19
|
+
let(:status) { 200 }
|
20
|
+
|
21
|
+
it { should respond_to(:all) }
|
22
|
+
|
23
|
+
it 'should get the resources' do
|
24
|
+
subject.list user, repo
|
25
|
+
a_get(request_path).should have_been_made
|
26
|
+
end
|
27
|
+
|
28
|
+
it_should_behave_like 'an array of resources' do
|
29
|
+
let(:requestable) { subject.list user, repo }
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should get collaborator information" do
|
33
|
+
assignees = subject.list user, repo
|
34
|
+
assignees.first.login.should == 'octocat'
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should yield to a block" do
|
38
|
+
yielded = []
|
39
|
+
result = subject.list(user, repo) { |obj| yielded << obj }
|
40
|
+
yielded.should == result
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
it_should_behave_like 'request failure' do
|
45
|
+
let(:requestable) { subject.list user, repo }
|
46
|
+
end
|
47
|
+
end # list
|