github_api_v3 0.3.3 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +16 -6
  3. data/lib/github_api_v3/client/feeds.rb +1 -1
  4. data/lib/github_api_v3/client/gists.rb +10 -10
  5. data/lib/github_api_v3/client/issues.rb +8 -8
  6. data/lib/github_api_v3/client/markdown.rb +1 -1
  7. data/lib/github_api_v3/client/oauth.rb +101 -0
  8. data/lib/github_api_v3/client/orgs.rb +22 -22
  9. data/lib/github_api_v3/client/pull_requests.rb +14 -14
  10. data/lib/github_api_v3/client/repos.rb +23 -23
  11. data/lib/github_api_v3/client/stats.rb +5 -5
  12. data/lib/github_api_v3/client/users.rb +30 -20
  13. data/lib/github_api_v3/client.rb +73 -64
  14. data/lib/github_api_v3/error.rb +20 -2
  15. data/lib/github_api_v3/version.rb +1 -1
  16. data/lib/github_api_v3.rb +2 -2
  17. data/spec/cassettes/GitHub_Client_Gists/_create_gist/creates_a_gist.json +1 -1
  18. data/spec/cassettes/GitHub_Client_Gists/_create_gist_comment/creates_the_comment.json +1 -1
  19. data/spec/cassettes/GitHub_Client_Gists/_create_gist_comment/returns_comment_information_after_creation.json +1 -1
  20. data/spec/cassettes/GitHub_Client_Gists/_delete_gist/deletes_a_gist.json +1 -1
  21. data/spec/cassettes/GitHub_Client_Gists/_delete_gist_comment/deletes_the_comment.json +1 -1
  22. data/spec/cassettes/GitHub_Client_Gists/_delete_gist_comment/returns_true_or_false.json +1 -1
  23. data/spec/cassettes/GitHub_Client_Gists/_edit_gist/edits_a_gist.json +1 -1
  24. data/spec/cassettes/GitHub_Client_Gists/_edit_gist_comment/edits_the_comment.json +1 -1
  25. data/spec/cassettes/GitHub_Client_Gists/_edit_gist_comment/returns_comment_information_after_editing.json +1 -1
  26. data/spec/cassettes/GitHub_Client_Gists/_fork_gist/forks_a_gist.json +1 -1
  27. data/spec/cassettes/GitHub_Client_Gists/_fork_gist/returns_false_when_not_found.json +1 -1
  28. data/spec/cassettes/GitHub_Client_Gists/_gist/returns_a_404_when_not_found.json +1 -1
  29. data/spec/cassettes/GitHub_Client_Gists/_gist/returns_gist_information.json +1 -1
  30. data/spec/cassettes/GitHub_Client_Gists/_gist_comment/returns_a_404_when_not_found.json +1 -1
  31. data/spec/cassettes/GitHub_Client_Gists/_gist_comment/returns_a_comment.json +1 -1
  32. data/spec/cassettes/GitHub_Client_Gists/_gist_comments/returns_a_404_when_not_found.json +1 -1
  33. data/spec/cassettes/GitHub_Client_Gists/_gist_comments/returns_a_list_of_comments.json +1 -1
  34. data/spec/cassettes/GitHub_Client_Gists/_gist_starred_/returns_false_when_not_found.json +1 -1
  35. data/spec/cassettes/GitHub_Client_Gists/_gist_starred_/should_return_true_or_false.json +1 -1
  36. data/spec/cassettes/GitHub_Client_Gists/_gists/returns_an_array_of_gists.json +1 -1
  37. data/spec/cassettes/GitHub_Client_Gists/_gists/returns_an_array_of_gists_for_authenticated_user.json +1 -1
  38. data/spec/cassettes/GitHub_Client_Gists/_gists/returns_public_gists_for_unauthenticated_user.json +1 -1
  39. data/spec/cassettes/GitHub_Client_Gists/_star_gist/returns_false_when_not_found.json +1 -1
  40. data/spec/cassettes/GitHub_Client_Gists/_star_gist/stars_a_gist.json +1 -1
  41. data/spec/cassettes/GitHub_Client_Gists/_unstar_gist/returns_false_when_not_found.json +1 -1
  42. data/spec/cassettes/GitHub_Client_Gists/_unstar_gist/unstars_a_gist.json +1 -1
  43. data/spec/cassettes/GitHub_Client_Issues/_issues/returns_an_array_of_issues.json +1 -1
  44. data/spec/cassettes/GitHub_Client_Issues/_issues/returns_the_correct_information.json +1 -1
  45. data/spec/cassettes/GitHub_Client_OAuth/_authorization/returns_a_404_if_using_access_token_authentication.json +1 -0
  46. data/spec/cassettes/GitHub_Client_OAuth/_authorization/returns_a_404_if_using_no_authentication.json +1 -0
  47. data/spec/cassettes/GitHub_Client_OAuth/_authorization/returns_a_404_when_not_found.json +1 -0
  48. data/spec/cassettes/GitHub_Client_OAuth/_authorization/returns_authorization_information.json +1 -0
  49. data/spec/cassettes/GitHub_Client_OAuth/_authorization/returns_the_correct_information.json +1 -0
  50. data/spec/cassettes/GitHub_Client_OAuth/_authorizations/returns_a_404_if_using_access_token_authentication.json +1 -0
  51. data/spec/cassettes/GitHub_Client_OAuth/_authorizations/returns_a_404_if_using_no_authentication.json +1 -0
  52. data/spec/cassettes/GitHub_Client_OAuth/_authorizations/returns_a_list_of_authorizations.json +1 -0
  53. data/spec/cassettes/GitHub_Client_OAuth/_authorizations/returns_the_correct_array.json +1 -0
  54. data/spec/cassettes/GitHub_Client_OAuth/_create_authorization/creates_the_correct_authorization.json +1 -0
  55. data/spec/cassettes/GitHub_Client_OAuth/_create_authorization/returns_authorization_information_hash.json +1 -0
  56. data/spec/cassettes/GitHub_Client_OAuth/_delete_authorization/deletes_the_authorization.json +1 -0
  57. data/spec/cassettes/GitHub_Client_OAuth/_delete_authorization/returns_true.json +1 -0
  58. data/spec/cassettes/GitHub_Client_OAuth/_update_authorization/returns_authorization_information_hash.json +1 -0
  59. data/spec/cassettes/GitHub_Client_OAuth/_update_authorization/updates_the_authorization.json +1 -0
  60. data/spec/cassettes/GitHub_Client_Users/_follows_/returns_false_when_not_following.json +1 -1
  61. data/spec/cassettes/GitHub_Client_Users/_follows_/returns_true_when_following.json +1 -1
  62. data/spec/cassettes/GitHub_Client_Users/_rate_limit/returns_authenticated_rate_limit_information.json +1 -0
  63. data/spec/cassettes/GitHub_Client_Users/_rate_limit/returns_unauthenticated_rate_limit_information.json +1 -0
  64. data/spec/config.sample.yml +3 -1
  65. data/spec/github_api_v3/client/gists_spec.rb +25 -25
  66. data/spec/github_api_v3/client/oauth_spec.rb +87 -0
  67. data/spec/github_api_v3/client/users_spec.rb +16 -0
  68. data/spec/spec_helper.rb +21 -11
  69. metadata +38 -1
@@ -13,7 +13,7 @@ module GitHub
13
13
  # @return [Array]
14
14
  # @see http://developer.github.com/v3/repos/#list-all-public-repositories
15
15
  def all_repos
16
- get '/repositories', auth_params
16
+ get '/repositories'
17
17
  end
18
18
 
19
19
  # Get one repository.
@@ -25,7 +25,7 @@ module GitHub
25
25
  # @example
26
26
  # GitHub.repo('caseyscarborough','github')
27
27
  def repo(owner, repo)
28
- get "/repos/#{owner}/#{repo}", auth_params
28
+ get "/repos/#{owner}/#{repo}"
29
29
  end
30
30
 
31
31
  # Get all repositories for a user.
@@ -43,7 +43,7 @@ module GitHub
43
43
  if username
44
44
  get "/users/#{username}/repos"
45
45
  else
46
- get '/user/repos', auth_params
46
+ get '/user/repos'
47
47
  end
48
48
  end
49
49
 
@@ -67,7 +67,7 @@ module GitHub
67
67
  # @example
68
68
  # client.create_repo('new-repo', description: 'New repository.', private: true)
69
69
  def create_repo(name, options={})
70
- post "/user/repos", auth_params, options.merge(name: name)
70
+ post "/user/repos", body: options.merge(name: name)
71
71
  end
72
72
 
73
73
  # Edit a repository.
@@ -91,7 +91,7 @@ module GitHub
91
91
  # client.edit_repo('caseyscarborough','github', name: 'github', description: 'An awesome repository!')
92
92
  def edit_repo(owner, repo, options={})
93
93
  options[:name] = repo unless options[:name]
94
- patch "/repos/#{owner}/#{repo}", auth_params, options
94
+ patch "/repos/#{owner}/#{repo}", body: options
95
95
  end
96
96
 
97
97
  # Delete a repository.
@@ -104,7 +104,7 @@ module GitHub
104
104
  # @example
105
105
  # client.delete_repo('repo-name')
106
106
  def delete_repo(owner, repo)
107
- boolean_delete "/repos/#{owner}/#{repo}", auth_params
107
+ boolean_request :delete, "/repos/#{owner}/#{repo}"
108
108
  end
109
109
 
110
110
  # Get organization repositories.
@@ -115,7 +115,7 @@ module GitHub
115
115
  # @example
116
116
  # GitHub.org_repos('rails')
117
117
  def org_repos(org)
118
- get "/orgs/#{org}/repos", auth_params
118
+ get "/orgs/#{org}/repos"
119
119
  end
120
120
 
121
121
  # List contributors for a repository.
@@ -127,7 +127,7 @@ module GitHub
127
127
  # @example
128
128
  # GitHub.contributors('caseyscarborough','github')
129
129
  def contributors(owner, repo)
130
- get "/repos/#{owner}/#{repo}/contributors", auth_params
130
+ get "/repos/#{owner}/#{repo}/contributors"
131
131
  end
132
132
 
133
133
  # List languages for a repository.
@@ -139,7 +139,7 @@ module GitHub
139
139
  # @example
140
140
  # GitHub.languages('caseyscarborough','github')
141
141
  def languages(owner, repo)
142
- get "/repos/#{owner}/#{repo}/languages", auth_params
142
+ get "/repos/#{owner}/#{repo}/languages"
143
143
  end
144
144
 
145
145
  # def teams(owner, repo)
@@ -155,7 +155,7 @@ module GitHub
155
155
  # @example
156
156
  # GitHub.tags('caseyscarborough','github')
157
157
  def tags(owner, repo)
158
- get "/repos/#{owner}/#{repo}/tags", auth_params
158
+ get "/repos/#{owner}/#{repo}/tags"
159
159
  end
160
160
 
161
161
  # List branches for a repository.
@@ -167,7 +167,7 @@ module GitHub
167
167
  # @example
168
168
  # GitHub.branches('caseyscarborough','github')
169
169
  def branches(owner, repo)
170
- get "/repos/#{owner}/#{repo}/branches", auth_params
170
+ get "/repos/#{owner}/#{repo}/branches"
171
171
  end
172
172
 
173
173
  # Get information about a branch.
@@ -179,7 +179,7 @@ module GitHub
179
179
  # @example
180
180
  # GitHub.branch('caseyscarborough','github','master')
181
181
  def branch(owner, repo, branch)
182
- get "/repos/#{owner}/#{repo}/branches/#{branch}", auth_params
182
+ get "/repos/#{owner}/#{repo}/branches/#{branch}"
183
183
  end
184
184
 
185
185
  # Get list of collaborators for a repository.
@@ -191,7 +191,7 @@ module GitHub
191
191
  # @example
192
192
  # GitHub.collaborators('caseyscarborough','github')
193
193
  def collaborators(owner, repo)
194
- get "/repos/#{owner}/#{repo}/collaborators", auth_params
194
+ get "/repos/#{owner}/#{repo}/collaborators"
195
195
  end
196
196
 
197
197
  # Determine if a user is a collaborator to a repository.
@@ -204,7 +204,7 @@ module GitHub
204
204
  # @example
205
205
  # GitHub.collaborator?('caseyscarborough','github','caseyscarborough')
206
206
  def collaborator?(owner, repo, user)
207
- boolean_get "/repos/#{owner}/#{repo}/collaborators/#{user}", auth_params
207
+ boolean_request :get, "/repos/#{owner}/#{repo}/collaborators/#{user}"
208
208
  end
209
209
 
210
210
  # Add a collaborator to a repository.
@@ -217,7 +217,7 @@ module GitHub
217
217
  # @return [Boolean] True if successful, false if not.
218
218
  # @see http://developer.github.com/v3/repos/collaborators/#add-collaborator
219
219
  def add_collaborator(owner, repo, user)
220
- boolean_put "/repos/#{owner}/#{repo}/collaborators/#{user}", auth_params
220
+ boolean_request :put, "/repos/#{owner}/#{repo}/collaborators/#{user}"
221
221
  end
222
222
 
223
223
  # Remove a collaborator from a repository.
@@ -230,7 +230,7 @@ module GitHub
230
230
  # @return [Boolean] True if successful, false if not.
231
231
  # @see http://developer.github.com/v3/repos/collaborators/#remove-collaborator
232
232
  def remove_collaborator(owner, repo, user)
233
- boolean_delete "/repos/#{owner}/#{repo}/collaborators/#{user}", auth_params
233
+ boolean_request :delete, "/repos/#{owner}/#{repo}/collaborators/#{user}"
234
234
  end
235
235
 
236
236
  # List Stargazers for a repository.
@@ -242,7 +242,7 @@ module GitHub
242
242
  # @example
243
243
  # GitHub.stargazers('caseyscarborough','github')
244
244
  def stargazers(owner, repo)
245
- get "/repos/#{owner}/#{repo}/stargazers", auth_params
245
+ get "/repos/#{owner}/#{repo}/stargazers"
246
246
  end
247
247
 
248
248
  # Star a repository.
@@ -254,7 +254,7 @@ module GitHub
254
254
  # @return [Boolean] True if successful, false if not.
255
255
  # @see http://developer.github.com/v3/activity/starring/#star-a-repository
256
256
  def star(owner, repo)
257
- boolean_put "/user/starred/#{owner}/#{repo}", auth_params
257
+ boolean_request :put, "/user/starred/#{owner}/#{repo}"
258
258
  end
259
259
 
260
260
  # Unstar a repository.
@@ -266,7 +266,7 @@ module GitHub
266
266
  # @return [Boolean] True if successful, false if not.
267
267
  # @see http://developer.github.com/v3/activity/starring/#unstar-a-repository
268
268
  def unstar(owner, repo)
269
- boolean_delete "/user/starred/#{owner}/#{repo}", auth_params
269
+ boolean_request :delete, "/user/starred/#{owner}/#{repo}"
270
270
  end
271
271
 
272
272
  # List Watchers for a repository.
@@ -276,7 +276,7 @@ module GitHub
276
276
  # @return [Array] List of users.
277
277
  # @see http://developer.github.com/v3/activity/watching/#list-watchers
278
278
  def watchers(owner, repo)
279
- get "/repos/#{owner}/#{repo}/subscribers", auth_params
279
+ get "/repos/#{owner}/#{repo}/subscribers"
280
280
  end
281
281
 
282
282
  # Get subscription information.
@@ -290,7 +290,7 @@ module GitHub
290
290
  # @example
291
291
  # client.subscription('caseyscarborough','github')
292
292
  def subscription(owner, repo)
293
- get "/repos/#{owner}/#{repo}/subscription", auth_params
293
+ get "/repos/#{owner}/#{repo}/subscription"
294
294
  end
295
295
 
296
296
  # Set a repository subscription.
@@ -306,7 +306,7 @@ module GitHub
306
306
  def subscribe(owner, repo, options={})
307
307
  options[:subscribed] = true unless options[:subscribed]
308
308
  options[:ignored] = false unless options[:ignored]
309
- put "/repos/#{owner}/#{repo}/subscription", auth_params, options
309
+ put "/repos/#{owner}/#{repo}/subscription", body: options
310
310
  end
311
311
 
312
312
  # Delete a repository subscription.
@@ -319,7 +319,7 @@ module GitHub
319
319
  # @example
320
320
  # client.unsubscribe('caseyscarborough','github')
321
321
  def unsubscribe(owner, repo)
322
- boolean_delete "/repos/#{owner}/#{repo}/subscription", auth_params
322
+ boolean_request :delete, "/repos/#{owner}/#{repo}/subscription"
323
323
  end
324
324
 
325
325
  end
@@ -25,7 +25,7 @@ module GitHub
25
25
  # @return [Array] Contributor list.
26
26
  # @see http://developer.github.com/v3/repos/statistics/#get-contributors-list-with-additions-deletions-and-commit-counts
27
27
  def contributors_list(owner, repo)
28
- get "/repos/#{owner}/#{repo}/stats/contributors", auth_params
28
+ get "/repos/#{owner}/#{repo}/stats/contributors"
29
29
  end
30
30
 
31
31
  # Get the last year of commit activity data.
@@ -35,7 +35,7 @@ module GitHub
35
35
  # @return [Array] Commit activity list.
36
36
  # @see http://developer.github.com/v3/repos/statistics/#get-the-last-year-of-commit-activity-data
37
37
  def commit_activity(owner, repo)
38
- get "/repos/#{owner}/#{repo}/stats/commit_activity", auth_params
38
+ get "/repos/#{owner}/#{repo}/stats/commit_activity"
39
39
  end
40
40
 
41
41
  # Get the number of additions and deletions per week.
@@ -45,7 +45,7 @@ module GitHub
45
45
  # @return [Array]
46
46
  # @see http://developer.github.com/v3/repos/statistics/#get-the-number-of-additions-and-deletions-per-week
47
47
  def code_frequency(owner, repo)
48
- get "/repos/#{owner}/#{repo}/stats/code_frequency", auth_params
48
+ get "/repos/#{owner}/#{repo}/stats/code_frequency"
49
49
  end
50
50
 
51
51
  # Get the weekly commit count for the repo owner and everyone else.
@@ -55,7 +55,7 @@ module GitHub
55
55
  # @return [Array] Contributor list.
56
56
  # @see http://developer.github.com/v3/repos/statistics/#get-the-weekly-commit-count-for-the-repo-owner-and-everyone-else
57
57
  def participation(owner, repo)
58
- get "/repos/#{owner}/#{repo}/stats/participation", auth_params
58
+ get "/repos/#{owner}/#{repo}/stats/participation"
59
59
  end
60
60
 
61
61
  # Get the number of commits per hour in each day.
@@ -65,7 +65,7 @@ module GitHub
65
65
  # @return [Array]
66
66
  # @see http://developer.github.com/v3/repos/statistics/#get-the-number-of-commits-per-hour-in-each-day
67
67
  def punch_card(owner, repo)
68
- get "/repos/#{owner}/#{repo}/stats/punch_card", auth_params
68
+ get "/repos/#{owner}/#{repo}/stats/punch_card"
69
69
  end
70
70
 
71
71
  end
@@ -21,7 +21,7 @@
21
21
  if username
22
22
  get "/users/#{username}"
23
23
  else
24
- get '/user', auth_params
24
+ get '/user'
25
25
  end
26
26
  end
27
27
 
@@ -41,7 +41,7 @@
41
41
  # client = GitHub::Client.new(login: 'username', access_token: 'abcdefghijklmnopqrstuvwxyz12345')
42
42
  # client.emails # => ["email@example.com", "email2@example.com"]
43
43
  def emails
44
- get '/user/emails', auth_params
44
+ get '/user/emails'
45
45
  end
46
46
 
47
47
  # Follow a user.
@@ -54,7 +54,7 @@
54
54
  # @example
55
55
  # client.follow('caseyscarborough')
56
56
  def follow(username)
57
- boolean_put "/user/following/#{username}", auth_params
57
+ boolean_request :put, "/user/following/#{username}"
58
58
  end
59
59
 
60
60
  # Checks to see if a user is following another user.
@@ -66,8 +66,7 @@
66
66
  # @example
67
67
  # GitHub.follows?('caseyscarborough', 'matz')
68
68
  def follows?(username, target_username)
69
- response = self.class.get "/users/#{username}/following/#{target_username}"
70
- response.code == 204
69
+ boolean_request :get, "/users/#{username}/following/#{target_username}"
71
70
  end
72
71
 
73
72
  # List a user's followers.
@@ -87,7 +86,7 @@
87
86
  if username
88
87
  get "/users/#{username}/followers"
89
88
  else
90
- get '/user/followers', auth_params
89
+ get '/user/followers'
91
90
  end
92
91
  end
93
92
 
@@ -111,8 +110,7 @@
111
110
  # @example
112
111
  # client.following?('caseyscarborough')
113
112
  def following?(username)
114
- response = self.class.get "/user/following/#{username}", query: auth_params
115
- response.code == 204
113
+ boolean_request :get, "/user/following/#{username}"
116
114
  end
117
115
 
118
116
  # Unfollow a user.
@@ -124,7 +122,7 @@
124
122
  # @example
125
123
  # client.unfollow('matz')
126
124
  def unfollow(username)
127
- boolean_delete "/user/following/#{username}", auth_params
125
+ boolean_request :delete, "/user/following/#{username}"
128
126
  end
129
127
 
130
128
  # Get a list of public keys for a user.
@@ -141,7 +139,7 @@
141
139
  if username
142
140
  get "/users/#{username}/keys"
143
141
  else
144
- get '/user/keys', auth_params
142
+ get '/user/keys'
145
143
  end
146
144
  end
147
145
 
@@ -154,7 +152,7 @@
154
152
  # @example
155
153
  # client.key(123)
156
154
  def key(id)
157
- get "/user/keys/#{id}", auth_params
155
+ get "/user/keys/#{id}"
158
156
  end
159
157
 
160
158
  # Create a public key.
@@ -168,7 +166,7 @@
168
166
  # @example
169
167
  # client.create_key('octocat@octomac', 'ssh-rsa AAA...')
170
168
  def create_key(title, key)
171
- post '/user/keys', auth_params, {title: title, key: key}
169
+ post '/user/keys', body: {title: title, key: key}
172
170
  end
173
171
 
174
172
  # Update a public key
@@ -183,7 +181,7 @@
183
181
  # @example
184
182
  # client.update_key(1, 'octocat@octomac', 'ssh-rsa AAA...')
185
183
  def update_key(id, title, key)
186
- patch "/user/keys/#{id}", auth_params, {title: title, key: key}
184
+ patch "/user/keys/#{id}", body: {title: title, key: key}
187
185
  end
188
186
 
189
187
  # Remove a public key from a user's account.
@@ -195,7 +193,7 @@
195
193
  # @example
196
194
  # client.delete_key(123)
197
195
  def delete_key(id)
198
- boolean_delete "/user/keys/#{id}", auth_params
196
+ boolean_request :delete, "/user/keys/#{id}"
199
197
  end
200
198
 
201
199
  # List notifications.
@@ -211,7 +209,7 @@
211
209
  # @example
212
210
  # client.notifications
213
211
  def notifications(options={})
214
- get "/notifications", auth_params.merge(options)
212
+ get "/notifications", params: options
215
213
  end
216
214
 
217
215
  # List notifications for a repository.
@@ -229,7 +227,7 @@
229
227
  # @example
230
228
  # client.repo_notifications('caseyscarborough','github')
231
229
  def repo_notifications(owner, repo, options={})
232
- get "/repos/#{owner}/#{repo}/notifications", auth_params
230
+ get "/repos/#{owner}/#{repo}/notifications"
233
231
  end
234
232
 
235
233
  # List repositories a user is starring.
@@ -247,7 +245,7 @@
247
245
  if username
248
246
  get "/users/#{username}/starred"
249
247
  else
250
- get "/user/starred", auth_params
248
+ get "/user/starred"
251
249
  end
252
250
  end
253
251
 
@@ -262,7 +260,7 @@
262
260
  # @example
263
261
  # client.starring?('caseyscarborough','github')
264
262
  def starring?(owner, repo)
265
- boolean_get "/user/starred/#{owner}/#{repo}", auth_params
263
+ boolean_request :get, "/user/starred/#{owner}/#{repo}"
266
264
  end
267
265
 
268
266
  # List repositories a user is watching.
@@ -278,7 +276,7 @@
278
276
  if username
279
277
  get "/users/#{username}/subscriptions"
280
278
  else
281
- get "/user/subscriptions", auth_params
279
+ get "/user/subscriptions"
282
280
  end
283
281
  end
284
282
 
@@ -295,10 +293,22 @@
295
293
  if username
296
294
  get "/users/#{username}/orgs"
297
295
  else
298
- get "/user/orgs", auth_params
296
+ get "/user/orgs"
299
297
  end
300
298
  end
301
299
 
300
+ # Get the current client's rate limit info.
301
+ #
302
+ # @return [Hash] The rate limit information.
303
+ # @see http://developer.github.com/v3/rate_limit/
304
+ # @example Unauthenticated client's rate limit.
305
+ # GitHub.rate_limit
306
+ # @example Authenticated client's rate limit.
307
+ # client.rate_limit
308
+ def rate_limit
309
+ get "/rate_limit"
310
+ end
311
+
302
312
  end
303
313
 
304
314
  end
@@ -1,3 +1,4 @@
1
+ require 'base64'
1
2
  require 'json'
2
3
  require 'github_api_v3/client/events'
3
4
  require 'github_api_v3/client/feeds'
@@ -5,6 +6,7 @@ require 'github_api_v3/client/gists'
5
6
  require 'github_api_v3/client/gitignore'
6
7
  require 'github_api_v3/client/issues'
7
8
  require 'github_api_v3/client/markdown'
9
+ require 'github_api_v3/client/oauth'
8
10
  require 'github_api_v3/client/orgs'
9
11
  require 'github_api_v3/client/pull_requests'
10
12
  require 'github_api_v3/client/repos'
@@ -29,13 +31,14 @@ module GitHub
29
31
  include GitHub::Client::Gists
30
32
  include GitHub::Client::Issues
31
33
  include GitHub::Client::Markdown
34
+ include GitHub::Client::OAuth
32
35
  include GitHub::Client::Orgs
33
36
  include GitHub::Client::PullRequests
34
37
  include GitHub::Client::Repos
35
38
  include GitHub::Client::Stats
36
39
  include GitHub::Client::Users
37
40
 
38
- attr_reader :login, :access_token
41
+ attr_accessor :login, :access_token, :password
39
42
 
40
43
  def initialize(options={})
41
44
  @login = options[:login]
@@ -48,98 +51,48 @@ module GitHub
48
51
  # Perform a get request.
49
52
  #
50
53
  # @return [Hash, Array, String]
51
- def get(url, params={})
52
- response = self.class.get url, query: params
54
+ def get(url, options={})
55
+ response = request :get, url, options
53
56
  handle_response(response)
54
57
  response.parsed_response
55
58
  end
56
59
 
57
- # Perform a get request with boolean return type.
58
- #
59
- # @return [Boolean]
60
- def boolean_get(url, params={})
61
- response = self.class.get url, query: params
62
- response.code == 204
63
- rescue GitHub::NotFound
64
- false
65
- end
66
-
67
60
  # Perform a put request.
68
61
  #
69
62
  # @return [Hash, Array, String]
70
- def put(url, params={}, body={})
71
- response = self.class.put url, query: params, body: body.to_json
63
+ def put(url, options={})
64
+ response = request :put, url, options
72
65
  handle_response(response)
73
66
  response.parsed_response
74
67
  end
75
68
 
76
- # Perform a put request with boolean return type.
77
- #
78
- # @return [Boolean]
79
- def boolean_put(url, params={}, body={})
80
- response = self.class.put url, query: params, body: body.to_json
81
- response.code == 204
82
- rescue GitHub::NotFound
83
- false
84
- end
85
-
86
69
  # Perform a post request.
87
70
  #
88
71
  # @return [Hash, Array, String]
89
- def post(url, params={}, body={})
90
- response = self.class.post url, query: params, body: body.to_json
72
+ def post(url, options={})
73
+ response = request :post, url, options
91
74
  handle_response(response)
92
75
  response.parsed_response
93
76
  end
94
77
 
95
- # Perform a post request with boolean return type.
96
- #
97
- # @return [Boolean]
98
- def boolean_post(url, params={}, body={})
99
- response = self.class.post url, query: params, body: body.to_json
100
- response.code == 204
101
- rescue GitHub::NotFound
102
- false
103
- end
104
-
105
78
  # Perform a patch request.
106
79
  #
107
80
  # @return [Hash, Array, String]
108
- def patch(url, params={}, body={})
109
- response = self.class.patch url, query: params, body: body.to_json
81
+ def patch(url, options={})
82
+ response = request :patch, url, options
110
83
  handle_response(response)
111
84
  response.parsed_response
112
85
  end
113
86
 
114
- # Perform a patch request with boolean return type.
115
- #
116
- # @return [Boolean]
117
- def boolean_patch(url, params={}, body={})
118
- response = self.class.patch url, query: params, body: body.to_json
119
- response.code == 204
120
- rescue GitHub::NotFound
121
- false
122
- end
123
-
124
87
  # Perform a delete request.
125
88
  #
126
89
  # @return [Hash, Array, String]
127
- def delete(url, params={})
128
- response = self.class.delete url, query: params
90
+ def delete(url, options={})
91
+ response = request :delete, url, options
129
92
  handle_response(response)
130
93
  response.parsed_response
131
94
  end
132
95
 
133
- # Perform a delete request with boolean return type.
134
- #
135
- # @return [Boolean]
136
- def boolean_delete(url, params={})
137
- response = self.class.delete url, query: params
138
- response.code == 204
139
- rescue GitHub::NotFound
140
- false
141
- end
142
-
143
96
  # Return a hash with client's login and password.
144
97
  #
145
98
  # @return [Hash]
@@ -154,6 +107,51 @@ module GitHub
154
107
  @login.nil? ? {} : { login: @login, access_token: @access_token }
155
108
  end
156
109
 
110
+ def basic_auth_headers
111
+ encoded_auth = Base64.encode64("#{@login}:#{@password}")
112
+ { 'Authorization' => "Basic #{encoded_auth}" }
113
+ end
114
+
115
+ # Send an HTTP request.
116
+ #
117
+ # @param method [Symbol] The request type, such as :get, :put, or :post.
118
+ # @param url [String] The URL to send the request to.
119
+ # @param options [Hash] Optional parameters.
120
+ # @option options [Hash] :params URL parameters.
121
+ # @option options [Hash] :headers Headers to send with the request.
122
+ # @option options [Hash] :body Body of the request.
123
+ # @return [Array, Hash]
124
+ # @example POST request
125
+ # request :post, 'http://example.com/users', params: { name: 'Casey' }, body: { example: 'example' }
126
+ def request(method, url, options={})
127
+ params = options[:params] || {}
128
+ headers = options[:headers] || {}
129
+ body = options[:body] || {}
130
+
131
+ params.merge!(auth_params)
132
+ headers.merge!(basic_auth_headers) if @login && @password
133
+
134
+ self.class.send(method, url, query: params, body: body.to_json, headers: headers)
135
+ end
136
+
137
+ # Get a boolean response from an HTTP request.
138
+ #
139
+ # @param method [Symbol] The request type, such as :get, :put, or :post.
140
+ # @param url [String] The URL to send the request to.
141
+ # @param options [Hash] Optional parameters.
142
+ # @option options [Hash] :params URL parameters.
143
+ # @option options [Hash] :headers Headers to send with the request.
144
+ # @option options [Hash] :body Body of the request.
145
+ # @return [Boolean]
146
+ # @example DELETE Request
147
+ # boolean_request :delete, 'http://example.com/users'
148
+ def boolean_request(method, url, options={})
149
+ response = request(method, url, options)
150
+ response.code == 204
151
+ rescue GitHub::NotFound
152
+ false
153
+ end
154
+
157
155
  # Handle HTTP responses.
158
156
  #
159
157
  # Raise proper exceptions based on the response code.
@@ -161,11 +159,22 @@ module GitHub
161
159
  # @return [HTTParty::Response]
162
160
  def handle_response(response)
163
161
  case response.code
162
+ when 400 then raise BadRequest
164
163
  when 401 then raise Unauthorized
165
- when 403 then raise RateLimitExceeded
164
+ when 403
165
+ if response.body =~ /rate limit/i
166
+ raise RateLimitExceeded
167
+ elsif response.body =~ /login attempts/i
168
+ raise LoginAttemptsExceeded
169
+ else
170
+ raise Forbidden
171
+ end
166
172
  when 404 then raise NotFound
167
- when 400..500 then raise ClientError
168
- when 500..600 then raise ServerError, response.code
173
+ when 400...500 then raise ClientError
174
+ when 500 then raise InternalServerError
175
+ when 502 then raise BadGateway
176
+ when 503 then raise ServiceUnavailable
177
+ when 500...600 then raise ServerError, response.code
169
178
  else
170
179
  response
171
180
  end
@@ -3,6 +3,9 @@ module GitHub
3
3
  # Default GitHub error.
4
4
  class GitHubError < StandardError; end
5
5
 
6
+ # Raised when a 400 HTTP status code is received.
7
+ class BadRequest < GitHubError; end
8
+
6
9
  # Raised when a 404 HTTP status code is received.
7
10
  class NotFound < GitHubError; end
8
11
 
@@ -15,10 +18,25 @@ module GitHub
15
18
  # Raised when a 403 HTTP status code is received.
16
19
  class RateLimitExceeded < GitHubError; end
17
20
 
18
- # Raised when a 500..600 HTTP status code is received.
21
+ # Raised when a 403 HTTP status code is received.
22
+ class LoginAttemptsExceeded < GitHubError; end
23
+
24
+ # Raised when a 403 HTTP status code is received.
25
+ class Forbidden < GitHubError; end
26
+
27
+ # Raised when a 500 HTTP status code is received.
28
+ class InternalServerError < GitHubError; end
29
+
30
+ # Raised when a 502 HTTP status code is received.
31
+ class BadGateway < GitHubError; end
32
+
33
+ # Raised when a 503 HTTP status code is received.
34
+ class ServiceUnavailable < GitHubError; end
35
+
36
+ # Raised when a 500...600 HTTP status code is received.
19
37
  class ServerError < GitHubError; end
20
38
 
21
- # Raised when a 400..500 HTTP status code is received.
39
+ # Raised when a 400...500 HTTP status code is received.
22
40
  class ClientError < GitHubError; end
23
41
 
24
42
  end
@@ -1,3 +1,3 @@
1
1
  module GitHub
2
- VERSION = '0.3.3'
2
+ VERSION = '0.4.0'
3
3
  end
data/lib/github_api_v3.rb CHANGED
@@ -8,8 +8,8 @@ module GitHub
8
8
 
9
9
  class << self
10
10
 
11
- def client
12
- @client = Client.new unless @client
11
+ def client(options={})
12
+ @client = Client.new(options) unless @client
13
13
  @client
14
14
  end
15
15