octodoggy 4.6.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. checksums.yaml +7 -0
  2. data/.document +5 -0
  3. data/CONTRIBUTING.md +22 -0
  4. data/LICENSE.md +20 -0
  5. data/README.md +714 -0
  6. data/Rakefile +22 -0
  7. data/lib/ext/sawyer/relation.rb +10 -0
  8. data/lib/octokit.rb +59 -0
  9. data/lib/octokit/arguments.rb +14 -0
  10. data/lib/octokit/authentication.rb +82 -0
  11. data/lib/octokit/client.rb +238 -0
  12. data/lib/octokit/client/authorizations.rb +244 -0
  13. data/lib/octokit/client/commit_comments.rb +95 -0
  14. data/lib/octokit/client/commits.rb +239 -0
  15. data/lib/octokit/client/contents.rb +162 -0
  16. data/lib/octokit/client/deployments.rb +62 -0
  17. data/lib/octokit/client/downloads.rb +50 -0
  18. data/lib/octokit/client/emojis.rb +18 -0
  19. data/lib/octokit/client/events.rb +151 -0
  20. data/lib/octokit/client/feeds.rb +33 -0
  21. data/lib/octokit/client/gists.rb +233 -0
  22. data/lib/octokit/client/gitignore.rb +43 -0
  23. data/lib/octokit/client/hooks.rb +297 -0
  24. data/lib/octokit/client/integrations.rb +77 -0
  25. data/lib/octokit/client/issues.rb +321 -0
  26. data/lib/octokit/client/labels.rb +156 -0
  27. data/lib/octokit/client/legacy_search.rb +42 -0
  28. data/lib/octokit/client/licenses.rb +45 -0
  29. data/lib/octokit/client/markdown.rb +27 -0
  30. data/lib/octokit/client/meta.rb +21 -0
  31. data/lib/octokit/client/milestones.rb +87 -0
  32. data/lib/octokit/client/notifications.rb +171 -0
  33. data/lib/octokit/client/objects.rb +141 -0
  34. data/lib/octokit/client/organizations.rb +768 -0
  35. data/lib/octokit/client/pages.rb +63 -0
  36. data/lib/octokit/client/projects.rb +314 -0
  37. data/lib/octokit/client/pub_sub_hubbub.rb +111 -0
  38. data/lib/octokit/client/pull_requests.rb +301 -0
  39. data/lib/octokit/client/rate_limit.rb +54 -0
  40. data/lib/octokit/client/reactions.rb +158 -0
  41. data/lib/octokit/client/refs.rb +118 -0
  42. data/lib/octokit/client/releases.rb +163 -0
  43. data/lib/octokit/client/repositories.rb +654 -0
  44. data/lib/octokit/client/repository_invitations.rb +103 -0
  45. data/lib/octokit/client/reviews.rb +174 -0
  46. data/lib/octokit/client/say.rb +19 -0
  47. data/lib/octokit/client/search.rb +76 -0
  48. data/lib/octokit/client/service_status.rb +38 -0
  49. data/lib/octokit/client/source_import.rb +161 -0
  50. data/lib/octokit/client/stats.rb +105 -0
  51. data/lib/octokit/client/statuses.rb +47 -0
  52. data/lib/octokit/client/traffic.rb +69 -0
  53. data/lib/octokit/client/users.rb +354 -0
  54. data/lib/octokit/configurable.rb +147 -0
  55. data/lib/octokit/connection.rb +199 -0
  56. data/lib/octokit/default.rb +166 -0
  57. data/lib/octokit/enterprise_admin_client.rb +40 -0
  58. data/lib/octokit/enterprise_admin_client/admin_stats.rb +120 -0
  59. data/lib/octokit/enterprise_admin_client/license.rb +18 -0
  60. data/lib/octokit/enterprise_admin_client/orgs.rb +27 -0
  61. data/lib/octokit/enterprise_admin_client/search_indexing.rb +83 -0
  62. data/lib/octokit/enterprise_admin_client/users.rb +128 -0
  63. data/lib/octokit/enterprise_management_console_client.rb +50 -0
  64. data/lib/octokit/enterprise_management_console_client/management_console.rb +176 -0
  65. data/lib/octokit/error.rb +286 -0
  66. data/lib/octokit/gist.rb +36 -0
  67. data/lib/octokit/middleware/follow_redirects.rb +131 -0
  68. data/lib/octokit/organization.rb +17 -0
  69. data/lib/octokit/preview.rb +38 -0
  70. data/lib/octokit/rate_limit.rb +33 -0
  71. data/lib/octokit/repo_arguments.rb +19 -0
  72. data/lib/octokit/repository.rb +93 -0
  73. data/lib/octokit/response/feed_parser.rb +21 -0
  74. data/lib/octokit/response/raise_error.rb +21 -0
  75. data/lib/octokit/user.rb +19 -0
  76. data/lib/octokit/version.rb +17 -0
  77. data/lib/octokit/warnable.rb +17 -0
  78. data/octokit.gemspec +22 -0
  79. metadata +160 -0
@@ -0,0 +1,105 @@
1
+ module Octokit
2
+ class Client
3
+
4
+ # Methods for the Repository Statistics API
5
+ #
6
+ # @see https://developer.github.com/v3/repos/statistics/
7
+ module Stats
8
+
9
+ # Get contributors list with additions, deletions, and commit counts
10
+ #
11
+ # @param repo [Integer, String, Hash, Repository] A GitHub repository
12
+ # @option retry_timeout [Number] How long Octokit should keep trying to get stats (in seconds)
13
+ # @option retry_wait [Number] How long Octokit should wait between retries.
14
+ # @return [Array<Sawyer::Resource>] Array of contributor stats
15
+ # @see https://developer.github.com/v3/repos/statistics/#get-contributors-list-with-additions-deletions-and-commit-counts
16
+ # @example Get contributor stats for octokit
17
+ # @client.contributors_stats('octokit/octokit.rb')
18
+ def contributors_stats(repo, options = {})
19
+ get_stats(repo, "contributors", options)
20
+ end
21
+ alias :contributor_stats :contributors_stats
22
+
23
+ # Get the last year of commit activity data
24
+ #
25
+ # @param repo [Integer, String, Hash, Repository] A GitHub repository
26
+ # @option retry_timeout [Number] How long Octokit should keep trying to get stats (in seconds)
27
+ # @option retry_wait [Number] How long Octokit should wait between retries.
28
+ # @return [Array<Sawyer::Resource>] The last year of commit activity grouped by
29
+ # week. The days array is a group of commits per day, starting on Sunday.
30
+ # @see https://developer.github.com/v3/repos/statistics/#get-the-last-year-of-commit-activity-data
31
+ # @example Get commit activity for octokit
32
+ # @client.commit_activity_stats('octokit/octokit.rb')
33
+ def commit_activity_stats(repo, options = {})
34
+ get_stats(repo, "commit_activity", options)
35
+ end
36
+
37
+ # Get the number of additions and deletions per week
38
+ #
39
+ # @param repo [Integer, String, Hash, Repository] A GitHub repository
40
+ # @option retry_timeout [Number] How long Octokit should keep trying to get stats (in seconds)
41
+ # @option retry_wait [Number] How long Octokit should wait between retries.
42
+ # @return [Array<Sawyer::Resource>] Weekly aggregate of the number of additions
43
+ # and deletions pushed to a repository.
44
+ # @see https://developer.github.com/v3/repos/statistics/#get-the-number-of-additions-and-deletions-per-week
45
+ # @example Get code frequency stats for octokit
46
+ # @client.code_frequency_stats('octokit/octokit.rb')
47
+ def code_frequency_stats(repo, options = {})
48
+ get_stats(repo, "code_frequency", options)
49
+ end
50
+
51
+ # Get the weekly commit count for the repo owner and everyone else
52
+ #
53
+ # @param repo [Integer, String, Hash, Repository] A GitHub repository
54
+ # @option retry_timeout [Number] How long Octokit should keep trying to get stats (in seconds)
55
+ # @option retry_wait [Number] How long Octokit should wait between retries.
56
+ # @return [Sawyer::Resource] Total commit counts for the owner and total commit
57
+ # counts in all. all is everyone combined, including the owner in the last
58
+ # 52 weeks. If you’d like to get the commit counts for non-owners, you can
59
+ # subtract all from owner.
60
+ # @see https://developer.github.com/v3/repos/statistics/#get-the-weekly-commit-count-for-the-repository-owner-and-everyone-else
61
+ # @example Get weekly commit counts for octokit
62
+ # @client.participation_stats("octokit/octokit.rb")
63
+ def participation_stats(repo, options = {})
64
+ get_stats(repo, "participation", options)
65
+ end
66
+
67
+ # Get the number of commits per hour in each day
68
+ #
69
+ # @param repo [Integer, String, Hash, Repository] A GitHub repository
70
+ # @option retry_timeout [Number] How long Octokit should keep trying to get stats (in seconds)
71
+ # @option retry_wait [Number] How long Octokit should wait between retries.
72
+ # @return [Array<Array>] Arrays containing the day number, hour number, and
73
+ # number of commits
74
+ # @see https://developer.github.com/v3/repos/statistics/#get-the-number-of-commits-per-hour-in-each-day
75
+ # @example Get octokit punch card
76
+ # @octokit.punch_card_stats
77
+ def punch_card_stats(repo, options = {})
78
+ get_stats(repo, "punch_card", options)
79
+ end
80
+ alias :punch_card :punch_card_stats
81
+
82
+ private
83
+
84
+ # @private Get stats for a repository
85
+ #
86
+ # @param repo [Integer, String, Hash, Repository] A GitHub repository
87
+ # @param metric [String] The metrics you are looking for
88
+ # @return [Array<Sawyer::Resource> or nil] Stats in metric-specific format, or nil if not yet calculated.
89
+ # @see https://developer.github.com/v3/repos/statistics/
90
+ def get_stats(repo, metric, options = {})
91
+ if retry_timeout = options.delete(:retry_timeout)
92
+ retry_wait = options.delete(:retry_wait) || 0.5
93
+ timeout = Time.now + retry_timeout
94
+ end
95
+ loop do
96
+ data = get("#{Repository.path repo}/stats/#{metric}", options)
97
+ return data if last_response.status == 200
98
+ return nil unless retry_timeout
99
+ return nil if Time.now >= timeout
100
+ sleep retry_wait if retry_wait
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,47 @@
1
+ module Octokit
2
+ class Client
3
+
4
+ # Methods for the Commit Statuses API
5
+ #
6
+ # @see https://developer.github.com/v3/repos/statuses/
7
+ module Statuses
8
+
9
+ # List all statuses for a given commit
10
+ #
11
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
12
+ # @param sha [String] The SHA1 for the commit
13
+ # @return [Array<Sawyer::Resource>] A list of statuses
14
+ # @see https://developer.github.com/v3/repos/statuses/#list-statuses-for-a-specific-ref
15
+ def statuses(repo, sha, options = {})
16
+ get "#{Repository.path repo}/statuses/#{sha}", options
17
+ end
18
+ alias :list_statuses :statuses
19
+
20
+ # Get the combined status for a ref
21
+ #
22
+ # @param repo [Integer, String, Repository, Hash] a GitHub repository
23
+ # @param ref [String] A Sha or Ref to fetch the status of
24
+ # @return [Sawyer::Resource] The combined status for the commit
25
+ # @see https://developer.github.com/v3/repos/statuses/#get-the-combined-status-for-a-specific-ref
26
+ def combined_status(repo, ref, options = {})
27
+ get "#{Repository.path repo}/commits/#{ref}/status", options
28
+ end
29
+ alias :status :combined_status
30
+
31
+ # Create status for a commit
32
+ #
33
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
34
+ # @param sha [String] The SHA1 for the commit
35
+ # @param state [String] The state: pending, success, failure, error
36
+ # @option options [String] :context A context to differentiate this status from others
37
+ # @option options [String] :target_url A link to more details about this status
38
+ # @option options [String] :description A short human-readable description of this status
39
+ # @return [Sawyer::Resource] A status
40
+ # @see https://developer.github.com/v3/repos/statuses/#create-a-status
41
+ def create_status(repo, sha, state, options = {})
42
+ options.merge!(:state => state)
43
+ post "#{Repository.path repo}/statuses/#{sha}", options
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,69 @@
1
+ module Octokit
2
+ class Client
3
+
4
+ # Methods for the Traffic API
5
+ #
6
+ # @see https://developer.github.com/v3/repos/traffic/
7
+ module Traffic
8
+
9
+ # Get the top 10 referrers over the last 14 days
10
+ #
11
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
12
+ # @return [Array<Sawyer::Resource>] List of referrers and stats
13
+ # @see https://developer.github.com/v3/repos/traffic/#list-referrers
14
+ # @example
15
+ # @client.top_referrers('octokit/octokit.rb')
16
+ def top_referrers(repo, options = {})
17
+ opts = ensure_api_media_type(:traffic, options)
18
+ get "#{Repository.path repo}/traffic/popular/referrers", opts
19
+ end
20
+
21
+ # Get the top 10 popular contents over the last 14 days
22
+ #
23
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
24
+ # @return [Array<Sawyer::Resource>] List of popular contents
25
+ # @see https://developer.github.com/v3/repos/traffic/#list-paths
26
+ # @example
27
+ # @client.top_paths('octokit/octokit.rb')
28
+ def top_paths(repo, options = {})
29
+ opts = ensure_api_media_type(:traffic, options)
30
+ get "#{Repository.path repo}/traffic/popular/paths", opts
31
+ end
32
+
33
+ # Get the total number of views and breakdown per day or week for the
34
+ # last 14 days
35
+ #
36
+ # @param repo [Integer, String, Repository, Hash] A GitHub Repository
37
+ # @option options [String] :per ('day') Views per. <tt>day</tt> or
38
+ # <tt>week</tt>
39
+ # @return [Sawyer::Resource] Breakdown of view stats
40
+ # @see https://developer.github.com/v3/repos/traffic/#views
41
+ # @example Views per day
42
+ # @client.views('octokit/octokit.rb')
43
+ # @example Views per week
44
+ # @client.views('octokit/octokit.rb', per: 'week')
45
+ def views(repo, options = {})
46
+ opts = ensure_api_media_type(:traffic, options)
47
+ get "#{Repository.path repo}/traffic/views", opts
48
+ end
49
+
50
+ # Get the total number of clones and breakdown per day or week for the
51
+ # last 14 days
52
+ #
53
+ # @param repo [Integer, String, Repository, Hash] A GitHub Repository
54
+ # @option options [String] :per ('day') Views per. <tt>day</tt> or
55
+ # <tt>week</tt>
56
+ # @return [Sawyer::Resource] Breakdown of clone stats
57
+ # @see https://developer.github.com/v3/repos/traffic/#clones
58
+ # @example Clones per day
59
+ # @client.clones('octokit/octokit.rb')
60
+ # @example Clones per week
61
+ # @client.clones('octokit/octokit.rb', per: 'week')
62
+ def clones(repo, options = {})
63
+ opts = ensure_api_media_type(:traffic, options)
64
+ get "#{Repository.path repo}/traffic/clones", opts
65
+ end
66
+
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,354 @@
1
+ module Octokit
2
+ class Client
3
+
4
+ # Methods for the Users API
5
+ #
6
+ # @see https://developer.github.com/v3/users/
7
+ module Users
8
+
9
+ # List all GitHub users
10
+ #
11
+ # This provides a list of every user, in the order that they signed up
12
+ # for GitHub.
13
+ #
14
+ # @param options [Hash] Optional options.
15
+ # @option options [Integer] :since The integer ID of the last User that
16
+ # you’ve seen.
17
+ #
18
+ # @see https://developer.github.com/v3/users/#get-all-users
19
+ #
20
+ # @return [Array<Sawyer::Resource>] List of GitHub users.
21
+ def all_users(options = {})
22
+ paginate "users", options
23
+ end
24
+
25
+ # Get a single user
26
+ #
27
+ # @param user [Integer, String] GitHub user login or id.
28
+ # @return [Sawyer::Resource]
29
+ # @see https://developer.github.com/v3/users/#get-a-single-user
30
+ # @see https://developer.github.com/v3/users/#get-the-authenticated-user
31
+ # @example
32
+ # Octokit.user("sferik")
33
+ def user(user=nil, options = {})
34
+ get User.path(user), options
35
+ end
36
+
37
+ # Retrieve the access_token.
38
+ #
39
+ # @param code [String] Authorization code generated by GitHub.
40
+ # @param app_id [String] Client Id we received when our application was registered with GitHub. Defaults to client_id.
41
+ # @param app_secret [String] Client Secret we received when our application was registered with GitHub. Defaults to client_secret.
42
+ # @return [Sawyer::Resource] Hash holding the access token.
43
+ # @see https://developer.github.com/v3/oauth/#web-application-flow
44
+ # @example
45
+ # Octokit.exchange_code_for_token('aaaa', 'xxxx', 'yyyy', {:accept => 'application/json'})
46
+ def exchange_code_for_token(code, app_id = client_id, app_secret = client_secret, options = {})
47
+ options.merge!({
48
+ :code => code,
49
+ :client_id => app_id,
50
+ :client_secret => app_secret,
51
+ :headers => {
52
+ :content_type => 'application/json',
53
+ :accept => 'application/json'
54
+ }
55
+ })
56
+ post "#{web_endpoint}login/oauth/access_token", options
57
+ end
58
+
59
+ # Validate user username and password
60
+ #
61
+ # @param options [Hash] User credentials
62
+ # @option options [String] :login GitHub login
63
+ # @option options [String] :password GitHub password
64
+ # @return [Boolean] True if credentials are valid
65
+ def validate_credentials(options = {})
66
+ !self.class.new(options).user.nil?
67
+ rescue Octokit::Unauthorized
68
+ false
69
+ end
70
+
71
+ # Update the authenticated user
72
+ #
73
+ # @param options [Hash] A customizable set of options.
74
+ # @option options [String] :name
75
+ # @option options [String] :email Publically visible email address.
76
+ # @option options [String] :blog
77
+ # @option options [String] :company
78
+ # @option options [String] :location
79
+ # @option options [Boolean] :hireable
80
+ # @option options [String] :bio
81
+ # @return [Sawyer::Resource]
82
+ # @see https://developer.github.com/v3/users/#update-the-authenticated-user
83
+ # @example
84
+ # Octokit.update_user(:name => "Erik Michaels-Ober", :email => "sferik@gmail.com", :company => "Code for America", :location => "San Francisco", :hireable => false)
85
+ def update_user(options)
86
+ patch "user", options
87
+ end
88
+
89
+ # Get a user's followers.
90
+ #
91
+ # @param user [Integer, String] GitHub user login or id of the user whose
92
+ # list of followers you are getting.
93
+ # @return [Array<Sawyer::Resource>] Array of hashes representing users
94
+ # followers.
95
+ # @see https://developer.github.com/v3/users/followers/#list-followers-of-a-user
96
+ # @example
97
+ # Octokit.followers('pengwynn')
98
+ def followers(user=login, options = {})
99
+ paginate "#{User.path user}/followers", options
100
+ end
101
+
102
+ # Get list of users a user is following.
103
+ #
104
+ # @param user [Intger, String] GitHub user login or id of the user who you
105
+ # are getting the list of the people they follow.
106
+ # @return [Array<Sawyer::Resource>] Array of hashes representing users a
107
+ # user is following.
108
+ # @see https://developer.github.com/v3/users/followers/#list-users-followed-by-another-user
109
+ # @example
110
+ # Octokit.following('pengwynn')
111
+ def following(user=login, options = {})
112
+ paginate "#{User.path user}/following", options
113
+ end
114
+
115
+ # Check if you are following a user. Alternatively, check if a given user
116
+ # is following a target user.
117
+ #
118
+ # Requries an authenticated client.
119
+ #
120
+ # @overload follows?(target)
121
+ # @param target [String] GitHub login of the user that you want to
122
+ # check if you are following.
123
+ # @overload follows?(user, target)
124
+ # @param user [Integer, String] GitHub user login or id of first user
125
+ # @param target [String] GitHub login of the target user
126
+ # @return [Boolean] True following target user, false otherwise.
127
+ # @see https://developer.github.com/v3/users/followers/#check-if-you-are-following-a-user
128
+ # @see https://developer.github.com/v3/users/followers/#check-if-one-user-follows-another
129
+ # @example
130
+ # @client.follows?('pengwynn')
131
+ # @example
132
+ # @client.follows?('catsby', 'pengwynn')
133
+ def follows?(*args)
134
+ target = args.pop
135
+ user = args.first
136
+ boolean_from_response :get, "#{User.path user}/following/#{target}"
137
+ end
138
+
139
+ # Follow a user.
140
+ #
141
+ # Requires authenticatied client.
142
+ #
143
+ # @param user [String] Username of the user to follow.
144
+ # @return [Boolean] True if follow was successful, false otherwise.
145
+ # @see https://developer.github.com/v3/users/followers/#follow-a-user
146
+ # @example
147
+ # @client.follow('holman')
148
+ def follow(user, options = {})
149
+ boolean_from_response :put, "user/following/#{user}", options
150
+ end
151
+
152
+ # Unfollow a user.
153
+ #
154
+ # Requires authenticated client.
155
+ #
156
+ # @param user [String] Username of the user to unfollow.
157
+ # @return [Boolean] True if unfollow was successful, false otherwise.
158
+ # @see https://developer.github.com/v3/users/followers/#unfollow-a-user
159
+ # @example
160
+ # @client.unfollow('holman')
161
+ def unfollow(user, options = {})
162
+ boolean_from_response :delete, "user/following/#{user}", options
163
+ end
164
+
165
+ # Get list of repos starred by a user.
166
+ #
167
+ # @param user [Integer, String] GitHub user login of the user to get the
168
+ # list of their starred repositories.
169
+ # @param options [Hash] Optional options
170
+ # @option options [String] :sort (created) Sort: <tt>created</tt> or <tt>updated</tt>.
171
+ # @option options [String] :direction (desc) Direction: <tt>asc</tt> or <tt>desc</tt>.
172
+ # @return [Array<Sawyer::Resource>] Array of hashes representing repositories starred by user.
173
+ # @see https://developer.github.com/v3/activity/starring/#list-repositories-being-starred
174
+ # @example
175
+ # Octokit.starred('pengwynn')
176
+ def starred(user=login, options = {})
177
+ paginate user_path(user, 'starred'), options
178
+ end
179
+
180
+ # Check if you are starring a repo.
181
+ #
182
+ # Requires authenticated client.
183
+ #
184
+ # @param repo [String, Hash, Repository] A GitHub repository
185
+ # @return [Boolean] True if you are following the repo, false otherwise.
186
+ # @see https://developer.github.com/v3/activity/starring/#check-if-you-are-starring-a-repository
187
+ # @example
188
+ # @client.starred?('pengwynn/octokit')
189
+ def starred?(repo, options = {})
190
+ boolean_from_response :get, "user/starred/#{Repository.new(repo)}", options
191
+ end
192
+
193
+ # Get a public key.
194
+ #
195
+ # Note, when using dot notation to retrieve the values, ruby will return
196
+ # the hash key for the public keys value instead of the actual value, use
197
+ # symbol or key string to retrieve the value. See example.
198
+ #
199
+ # Requires authenticated client.
200
+ #
201
+ # @param key_id [Integer] Key to retreive.
202
+ # @return [Sawyer::Resource] Hash representing the key.
203
+ # @see https://developer.github.com/v3/users/keys/#get-a-single-public-key
204
+ # @example
205
+ # @client.key(1)
206
+ # @example Retrieve public key contents
207
+ # public_key = @client.key(1)
208
+ # public_key.key
209
+ # # => Error
210
+ #
211
+ # public_key[:key]
212
+ # # => "ssh-rsa AAA..."
213
+ #
214
+ # public_key['key']
215
+ # # => "ssh-rsa AAA..."
216
+ def key(key_id, options = {})
217
+ get "user/keys/#{key_id}", options
218
+ end
219
+
220
+ # Get list of public keys for user.
221
+ #
222
+ # Requires authenticated client.
223
+ #
224
+ # @return [Array<Sawyer::Resource>] Array of hashes representing public keys.
225
+ # @see https://developer.github.com/v3/users/keys/#list-your-public-keys
226
+ # @example
227
+ # @client.keys
228
+ def keys(options = {})
229
+ paginate "user/keys", options
230
+ end
231
+
232
+ # Get list of public keys for user.
233
+ #
234
+ # @param user [Integer, String] GitHub user login or id.
235
+ # @return [Array<Sawyer::Resource>] Array of hashes representing public keys.
236
+ # @see https://developer.github.com/v3/users/keys/#list-public-keys-for-a-user
237
+ # @example
238
+ # @client.user_keys('pengwynn')
239
+ def user_keys(user, options = {})
240
+ # TODO: Roll this into .keys
241
+ paginate "#{User.path user}/keys", options
242
+ end
243
+
244
+ # Add public key to user account.
245
+ #
246
+ # Requires authenticated client.
247
+ #
248
+ # @param title [String] Title to give reference to the public key.
249
+ # @param key [String] Public key.
250
+ # @return [Sawyer::Resource] Hash representing the newly added public key.
251
+ # @see https://developer.github.com/v3/users/keys/#create-a-public-key
252
+ # @example
253
+ # @client.add_key('Personal projects key', 'ssh-rsa AAA...')
254
+ def add_key(title, key, options = {})
255
+ post "user/keys", options.merge({:title => title, :key => key})
256
+ end
257
+
258
+ # Update a public key
259
+ #
260
+ # Requires authenticated client
261
+ #
262
+ # @param key_id [Integer] Id of key to update.
263
+ # @param options [Hash] Hash containing attributes to update.
264
+ # @option options [String] :title
265
+ # @option options [String] :key
266
+ # @return [Sawyer::Resource] Hash representing the updated public key.
267
+ #
268
+ # @deprecated This method is no longer supported in the API
269
+ # @see https://developer.github.com/v3/users/keys/#update-a-public-key
270
+ # @see https://developer.github.com/changes/2014-02-24-finer-grained-scopes-for-ssh-keys/
271
+ # @example
272
+ # @client.update_key(1, :title => 'new title', :key => "ssh-rsa BBB")
273
+ def update_key(key_id, options = {})
274
+ patch "user/keys/#{key_id}", options
275
+ end
276
+
277
+ # Remove a public key from user account.
278
+ #
279
+ # Requires authenticated client.
280
+ #
281
+ # @param id [String] Id of the public key to remove.
282
+ # @return [Boolean] True if removal was successful, false otherwise.
283
+ # @see https://developer.github.com/v3/users/keys/#delete-a-public-key
284
+ # @example
285
+ # @client.remove_key(1)
286
+ def remove_key(id, options = {})
287
+ boolean_from_response :delete, "user/keys/#{id}", options
288
+ end
289
+
290
+ # List email addresses for a user.
291
+ #
292
+ # Requires authenticated client.
293
+ #
294
+ # @return [Array<String>] Array of email addresses.
295
+ # @see https://developer.github.com/v3/users/emails/#list-email-addresses-for-a-user
296
+ # @example
297
+ # @client.emails
298
+ def emails(options = {})
299
+ paginate "user/emails", options
300
+ end
301
+
302
+ # Add email address to user.
303
+ #
304
+ # Requires authenticated client.
305
+ #
306
+ # @param email [String] Email address to add to the user.
307
+ # @return [Array<String>] Array of all email addresses of the user.
308
+ # @see https://developer.github.com/v3/users/emails/#add-email-addresses
309
+ # @example
310
+ # @client.add_email('new_email@user.com')
311
+ def add_email(email, options = {})
312
+ email = Array(email)
313
+ post "user/emails", email
314
+ end
315
+
316
+ # Remove email from user.
317
+ #
318
+ # Requires authenticated client.
319
+ #
320
+ # @param email [String] Email address to remove.
321
+ # @return [Array<String>] Array of all email addresses of the user.
322
+ # @see https://developer.github.com/v3/users/emails/#delete-email-addresses
323
+ # @example
324
+ # @client.remove_email('old_email@user.com')
325
+ def remove_email(email)
326
+ email = Array(email)
327
+ boolean_from_response :delete, "user/emails", email
328
+ end
329
+
330
+ # List repositories being watched by a user.
331
+ #
332
+ # @param user [Integer, String] GitHub user login or id.
333
+ # @return [Array<Sawyer::Resource>] Array of repositories.
334
+ # @see https://developer.github.com/v3/activity/watching/#list-repositories-being-watched
335
+ # @example
336
+ # @client.subscriptions("pengwynn")
337
+ def subscriptions(user=login, options = {})
338
+ paginate user_path(user, 'subscriptions'), options
339
+ end
340
+ alias :watched :subscriptions
341
+
342
+ end
343
+
344
+ private
345
+ # convenience method for constructing a user specific path, if the user is logged in
346
+ def user_path(user, path)
347
+ if user == login && user_authenticated?
348
+ "user/#{path}"
349
+ else
350
+ "#{User.path user}/#{path}"
351
+ end
352
+ end
353
+ end
354
+ end