octokit 4.3.0 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 433f670467c277e091d184af708f336f2a019b5a
4
- data.tar.gz: 4c29fdcfe9e156bec1a58b83c809ced9ff628748
3
+ metadata.gz: ca949068002176e1c5b3d59da31f46febae73fe5
4
+ data.tar.gz: 6b58185158a0115d1c2ce3e66ec01899684fb09a
5
5
  SHA512:
6
- metadata.gz: db2aa2a80a84de1d91da8b0414145e1f7adb28a01b957cc14dfe075208a110aeaf85886fb2a6af45ee2fb5688cc51847ff698aa7731da656d7519e40776d764c
7
- data.tar.gz: d6bc2a4e82cef39bde7daf9c2149e2b58dc6c75e09c5ce1f41936725937f90f58f54449f676b1ac0098c412027e4974016d2f7b415fbaf5f361ad97c697b9db2
6
+ metadata.gz: 64e36285a18bb0abeebfa514d6edce2fe1045c05e41bff62c96a2d94157e854f1d4cda4d32fd0a666f4cbef5dbcd60eeaf4e1af7b1fb0fb179ae82e4e2577dbf
7
+ data.tar.gz: 8c5c77fbe09bb78b3f1406e82e3f8e46d8f1cc5b57ad95975ce0d0d2f9dd139cd05f54a71f108ab734010e16e4606ab98bc7db2672c27096ce214597465156d9
data/README.md CHANGED
@@ -8,6 +8,44 @@ Ruby toolkit for the GitHub API.
8
8
  Upgrading? Check the [Upgrade Guide](#upgrading-guide) before bumping to a new
9
9
  [major version][semver].
10
10
 
11
+ ## Table of Contents
12
+
13
+ 1. [Philosophy](#philosophy)
14
+ 2. [Quick start](#quick-start)
15
+ 3. [Making requests](#making-requests)
16
+ 4. [Consuming resources](#consuming-resources)
17
+ 5. [Accessing HTTP responses](#accessing-http-responses)
18
+ 6. [Authentication](#authentication)
19
+ 1. [Basic Authentication](#basic-authentication)
20
+ 2. [OAuth access tokens](#oauth-access-tokens)
21
+ 3. [Two-Factor Authentication](#two-factor-authentication)
22
+ 4. [Using a .netrc file](#using-a-netrc-file)
23
+ 5. [Application authentication](#application-authentication)
24
+ 7. [Pagination](#pagination)
25
+ 1. [Auto pagination](#auto-pagination)
26
+ 8. [Working with GitHub Enterprise](#working-with-github-enterprise)
27
+ 1. [Interacting with the GitHub.com APIs in GitHub Enterprise](#interacting-with-the-githubcom-apis-in-github-enterprise)
28
+ 2. [Interacting with the GitHub Enterprise Admin APIs](#interacting-with-the-github-enterprise-admin-apis)
29
+ 3. [Interacting with the GitHub Enterprise Management Console APIs](#interacting-with-the-github-enterprise-management-console-apis)
30
+ 9. [SSL Connection Errors](#ssl-connection-errors)
31
+ 10. [Configuration and defaults](#configuration-and-defaults)
32
+ 1. [Configuring module defaults](#configuring-module-defaults)
33
+ 2. [Using ENV variables](#using-env-variables)
34
+ 11. [Hypermedia agent](#hypermedia-agent)
35
+ 1. [Hypermedia in Octokit](#hypermedia-in-octokit)
36
+ 2. [URI templates](#uri-templates)
37
+ 3. [The Full Hypermedia Experience™](#the-full-hypermedia-experience)
38
+ 12. [Upgrading guide](#upgrading-guide)
39
+ 1. [Upgrading from 1.x.x](#upgrading-from-1xx)
40
+ 13. [Advanced usage](#advanced-usage)
41
+ 1. [Debugging](#debugging)
42
+ 2. [Caching](#caching)
43
+ 14. [Hacking on Octokit.rb](#hacking-on-octokitrb)
44
+ 1. [Running and writing new tests](#running-and-writing-new-tests)
45
+ 15. [Supported Ruby Versions](#supported-ruby-versions)
46
+ 16. [Versioning](#versioning)
47
+ 17. [License](#license)
48
+
11
49
  ## Philosophy
12
50
 
13
51
  API wrappers [should reflect the idioms of the language in which they were
@@ -279,7 +317,7 @@ The GitHub Enterprise Admin APIs are under a different client: `EnterpriseAdminC
279
317
  ``` ruby
280
318
  admin_client = Octokit::EnterpriseAdminClient.new \
281
319
  :access_token => "<your 40 char token>",
282
- :api_endpoint = "https://<hostname>/api/v3/"
320
+ :api_endpoint => "https://<hostname>/api/v3/"
283
321
 
284
322
  # or
285
323
  Octokit.configure do |c|
@@ -433,7 +471,7 @@ pass `state` in the method options.
433
471
  - adds support for new [Enterprise-only APIs](#working-with-github-enterprise).
434
472
  - adds support for [Repository redirects][redirects].
435
473
 
436
- [list-pulls]: https://github.com/octokit/octokit.rb/commit/e48e91f736d5fce51e3bf74d7c9022aaa52f5c5c
474
+ [list-pulls]: https://github.com/octokit/octokit.rb/commit/e48e91f736d5fce51e3bf74d7c9022aaa52f5c5c
437
475
  [redirects]: https://developer.github.com/changes/2015-05-26-repository-redirects-are-coming/
438
476
 
439
477
  Version 3.0 includes a couple breaking changes when upgrading from v2.x.x:
@@ -528,7 +566,7 @@ Next, construct your own Faraday middleware:
528
566
 
529
567
  ```ruby
530
568
  stack = Faraday::RackBuilder.new do |builder|
531
- builder.use Faraday::HttpCache
569
+ builder.use Faraday::HttpCache, serializer: Marshal, shared_cache: false
532
570
  builder.use Octokit::Response::RaiseError
533
571
  builder.adapter Faraday.default_adapter
534
572
  end
@@ -614,6 +652,7 @@ implementations:
614
652
  * Ruby 2.0
615
653
  * Ruby 2.1
616
654
  * Ruby 2.2
655
+ * Ruby 2.3
617
656
 
618
657
  If something doesn't work on one of these Ruby versions, it's a bug.
619
658
 
@@ -36,9 +36,11 @@ require 'octokit/client/pages'
36
36
  require 'octokit/client/pub_sub_hubbub'
37
37
  require 'octokit/client/pull_requests'
38
38
  require 'octokit/client/rate_limit'
39
+ require 'octokit/client/reactions'
39
40
  require 'octokit/client/refs'
40
41
  require 'octokit/client/releases'
41
42
  require 'octokit/client/repositories'
43
+ require 'octokit/client/repository_invitations'
42
44
  require 'octokit/client/say'
43
45
  require 'octokit/client/search'
44
46
  require 'octokit/client/service_status'
@@ -85,9 +87,11 @@ module Octokit
85
87
  include Octokit::Client::PubSubHubbub
86
88
  include Octokit::Client::PullRequests
87
89
  include Octokit::Client::RateLimit
90
+ include Octokit::Client::Reactions
88
91
  include Octokit::Client::Refs
89
92
  include Octokit::Client::Releases
90
93
  include Octokit::Client::Repositories
94
+ include Octokit::Client::RepositoryInvitations
91
95
  include Octokit::Client::Say
92
96
  include Octokit::Client::Search
93
97
  include Octokit::Client::ServiceStatus
@@ -230,10 +230,11 @@ module Octokit
230
230
  raise Octokit::ApplicationCredentialsRequired.new "client_id required"
231
231
  end
232
232
  authorize_url = options.delete(:endpoint) || Octokit.web_endpoint
233
- authorize_url += "login/oauth/authorize?client_id=" + app_id
233
+ authorize_url << "login/oauth/authorize?client_id=#{app_id}"
234
234
 
235
+ require 'cgi'
235
236
  options.each do |key, value|
236
- authorize_url += "&" + key.to_s + "=" + value
237
+ authorize_url << "&#{key}=#{CGI.escape value}"
237
238
  end
238
239
 
239
240
  authorize_url
@@ -126,7 +126,7 @@ module Octokit
126
126
  # @return [Array<Sawyer::Resource>] An array of hashes representing commits
127
127
  # @see https://developer.github.com/v3/repos/commits/#list-commits-on-a-repository
128
128
  # @example
129
- # Octokit.commits_on('octokit/octokit.rb', '2012-10-01', '2012-11-01')
129
+ # Octokit.commits_between('octokit/octokit.rb', '2012-10-01', '2012-11-01')
130
130
  def commits_between(*args)
131
131
  arguments = Octokit::RepoArguments.new(args)
132
132
  date = parse_date(arguments.shift)
@@ -75,7 +75,6 @@ module Octokit
75
75
  #
76
76
  # @param options [Hash] Gist information.
77
77
  # @option options [String] :description
78
- # @option options [Boolean] :public Sets gist visibility
79
78
  # @option options [Hash] :files Files that make up this gist. Keys
80
79
  # should be the filename, the value a Hash with a :content key with text
81
80
  # content of the Gist.
@@ -146,6 +146,30 @@ module Octokit
146
146
  patch "#{Repository.path repo}/issues/#{number}", options.merge({:state => "open"})
147
147
  end
148
148
 
149
+ # Lock an issue's conversation, limiting it to collaborators
150
+ #
151
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
152
+ # @param number [Integer] Number ID of the issue
153
+ # @return [Boolean] Success
154
+ # @see https://developer.github.com/v3/issues/#lock-an-issue
155
+ # @example Lock Issue #25 from octokit/octokit.rb
156
+ # Octokit.lock_issue("octokit/octokit.rb", "25")
157
+ def lock_issue(repo, number, options = {})
158
+ boolean_from_response :put, "#{Repository.path repo}/issues/#{number}/lock", options
159
+ end
160
+
161
+ # Unlock an issue's conversation, opening it to all viewers
162
+ #
163
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
164
+ # @param number [Integer] Number ID of the issue
165
+ # @return [Boolean] Success
166
+ # @see https://developer.github.com/v3/issues/#unlock-an-issue
167
+ # @example Unlock Issue #25 from octokit/octokit.rb
168
+ # Octokit.close_issue("octokit/octokit.rb", "25")
169
+ def unlock_issue(repo, number, options = {})
170
+ boolean_from_response :delete, "#{Repository.path repo}/issues/#{number}/lock", options
171
+ end
172
+
149
173
  # Update an issue
150
174
  #
151
175
  # @overload update_issue(repo, number, title, body, options)
@@ -279,6 +303,19 @@ module Octokit
279
303
  def delete_comment(repo, number, options = {})
280
304
  boolean_from_response :delete, "#{Repository.path repo}/issues/comments/#{number}", options
281
305
  end
306
+
307
+ # Get the timeline for an issue
308
+ #
309
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
310
+ # @param number [Integer] Number ID of the comment
311
+ # @return [Sawyer::Resource] The timeline for this issue
312
+ # @see https://developer.github.com/v3/issues/timeline/
313
+ # @example Get timeline for issue #1435 on octokit/octokit.rb
314
+ # Octokit.issue_timeline("octokit/octokit.rb", 1435)
315
+ def issue_timeline(repo, number, options = {})
316
+ options = ensure_api_media_type(:issue_timelines, options)
317
+ paginate "#{Repository.path repo}/issues/#{number}/timeline", options
318
+ end
282
319
  end
283
320
  end
284
321
  end
@@ -8,7 +8,7 @@ module Octokit
8
8
 
9
9
  # List milestones for a repository
10
10
  #
11
- # @param repository [String, Repository, Hash] A GitHub repository.
11
+ # @param repository [Integer, String, Repository, Hash] A GitHub repository
12
12
  # @param options [Hash] A customizable set of options.
13
13
  # @option options [Integer] :milestone Milestone number.
14
14
  # @option options [String] :state (open) State: <tt>open</tt>, <tt>closed</tt>, or <tt>all</tt>.
@@ -19,13 +19,13 @@ module Octokit
19
19
  # @example List milestones for a repository
20
20
  # Octokit.list_milestones("octokit/octokit.rb")
21
21
  def list_milestones(repository, options = {})
22
- paginate "repos/#{Repository.new(repository)}/milestones", options
22
+ paginate "#{Repository.path repository}/milestones", options
23
23
  end
24
24
  alias :milestones :list_milestones
25
25
 
26
26
  # Get a single milestone for a repository
27
27
  #
28
- # @param repository [String, Repository, Hash] A GitHub repository.
28
+ # @param repository [Integer, String, Repository, Hash] A GitHub repository
29
29
  # @param options [Hash] A customizable set of options.
30
30
  # @option options [Integer] :milestone Milestone number.
31
31
  # @return [Sawyer::Resource] A single milestone from a repository.
@@ -33,12 +33,12 @@ module Octokit
33
33
  # @example Get a single milestone for a repository
34
34
  # Octokit.milestone("octokit/octokit.rb", 1)
35
35
  def milestone(repository, number, options = {})
36
- get "repos/#{Repository.new(repository)}/milestones/#{number}", options
36
+ get "#{Repository.path repository}/milestones/#{number}", options
37
37
  end
38
38
 
39
39
  # Create a milestone for a repository
40
40
  #
41
- # @param repository [String, Repository, Hash] A GitHub repository.
41
+ # @param repository [Integer, String, Repository, Hash] A GitHub repository
42
42
  # @param title [String] A unique title.
43
43
  # @param options [Hash] A customizable set of options.
44
44
  # @option options [String] :state (open) State: <tt>open</tt> or <tt>closed</tt>.
@@ -49,12 +49,12 @@ module Octokit
49
49
  # @example Create a milestone for a repository
50
50
  # Octokit.create_milestone("octokit/octokit.rb", "0.7.0", {:description => 'Add support for v3 of Github API'})
51
51
  def create_milestone(repository, title, options = {})
52
- post "repos/#{Repository.new(repository)}/milestones", options.merge({:title => title})
52
+ post "#{Repository.path repository}/milestones", options.merge({:title => title})
53
53
  end
54
54
 
55
55
  # Update a milestone for a repository
56
56
  #
57
- # @param repository [String, Repository, Hash] A GitHub repository.
57
+ # @param repository [Integer, String, Repository, Hash] A GitHub repository
58
58
  # @param number [String, Integer] ID of the milestone
59
59
  # @param options [Hash] A customizable set of options.
60
60
  # @option options [String] :title A unique title.
@@ -66,13 +66,13 @@ module Octokit
66
66
  # @example Update a milestone for a repository
67
67
  # Octokit.update_milestone("octokit/octokit.rb", 1, {:description => 'Add support for v3 of Github API'})
68
68
  def update_milestone(repository, number, options = {})
69
- patch "repos/#{Repository.new(repository)}/milestones/#{number}", options
69
+ patch "#{Repository.path repository}/milestones/#{number}", options
70
70
  end
71
71
  alias :edit_milestone :update_milestone
72
72
 
73
73
  # Delete a single milestone for a repository
74
74
  #
75
- # @param repository [String, Repository, Hash] A GitHub repository.
75
+ # @param repository [Integer, String, Repository, Hash] A GitHub repository
76
76
  # @param options [Hash] A customizable set of options.
77
77
  # @option options [Integer] :milestone Milestone number.
78
78
  # @return [Boolean] Success
@@ -80,7 +80,7 @@ module Octokit
80
80
  # @example Delete a single milestone from a repository
81
81
  # Octokit.delete_milestone("octokit/octokit.rb", 1)
82
82
  def delete_milestone(repository, number, options = {})
83
- boolean_from_response :delete, "repos/#{Repository.new(repository)}/milestones/#{number}", options
83
+ boolean_from_response :delete, "#{Repository.path repository}/milestones/#{number}", options
84
84
  end
85
85
  end
86
86
  end
@@ -230,21 +230,17 @@ module Octokit
230
230
  # @param org [String, Integer] Organization GitHub login or id.
231
231
  # @option options [String] :name Team name.
232
232
  # @option options [Array<String>] :repo_names Repositories for the team.
233
- # @option options [String, optional] :permission ('pull') Permissions the
234
- # team has for team repositories.
235
- #
236
- # `pull` - team members can pull, but not push to or administer these repositories.
237
- # `push` - team members can pull and push, but not administer these repositories.
238
- # `admin` - team members can pull, push and administer these repositories.
239
233
  # @return [Sawyer::Resource] Hash representing new team.
240
234
  # @see https://developer.github.com/v3/orgs/teams/#create-team
241
235
  # @example
242
236
  # @client.create_team('github', {
243
237
  # :name => 'Designers',
244
- # :repo_names => ['github/dotfiles'],
245
- # :permission => 'push'
238
+ # :repo_names => ['github/dotfiles']
246
239
  # })
247
240
  def create_team(org, options = {})
241
+ if options.key?(:permission)
242
+ octokit_warn "Deprecated: Passing :permission option to #create_team. Assign team repository permission by passing :permission to #add_team_repository instead."
243
+ end
248
244
  post "#{Organization.path org}/teams", options
249
245
  end
250
246
 
@@ -406,19 +402,28 @@ module Octokit
406
402
 
407
403
  # Add team repository
408
404
  #
405
+ # This can also be used to update the permission of an existing team
406
+ #
409
407
  # Requires authenticated user to be an owner of the organization that the
410
408
  # team is associated with. Also, the repo must be owned by the
411
409
  # organization, or a direct form of a repo owned by the organization.
412
410
  #
413
411
  # @param team_id [Integer] Team id.
414
412
  # @param repo [String, Hash, Repository] A GitHub repository.
413
+ # @option options [String] :permission The permission to grant the team.
414
+ # Only valid on organization-owned repositories.
415
+ # Can be one of: <tt>pull</tt>, <tt>push</tt>, or <tt>admin</tt>.
416
+ # If not specified, the team's <tt>permission</tt> attribute will be
417
+ # used to determine what permission to grant the team on this repository.
415
418
  # @return [Boolean] True if successful, false otherwise.
416
419
  # @see Octokit::Repository
417
- # @see https://developer.github.com/v3/orgs/teams/#add-team-repository
420
+ # @see https://developer.github.com/v3/orgs/teams/#add-or-update-team-repository
418
421
  # @example
419
422
  # @client.add_team_repository(100000, 'github/developer.github.com')
420
423
  # @example
421
424
  # @client.add_team_repo(100000, 'github/developer.github.com')
425
+ # @example Add a team with admin permissions
426
+ # @client.add_team_repository(100000, 'github/developer.github.com', permission: 'admin')
422
427
  def add_team_repository(team_id, repo, options = {})
423
428
  boolean_from_response :put, "teams/#{team_id}/repos/#{Repository.new(repo)}", options.merge(:name => Repository.new(repo))
424
429
  end
@@ -12,7 +12,21 @@ module Octokit
12
12
  # @return Sawyer::Resource A GitHub Pages resource
13
13
  # @see https://developer.github.com/v3/repos/pages/#get-information-about-a-pages-site
14
14
  def pages(repo, options = {})
15
- get "#{Repository.path repo}/pages", options
15
+ opts = ensure_api_media_type(:pages, options)
16
+ get "#{Repository.path repo}/pages", opts
17
+ end
18
+
19
+ # Get a specific Pages build by ID
20
+ #
21
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
22
+ # @param id [Integer, String] Build ID
23
+ # @return [Sawyer::Resource] Pages build information
24
+ # @see https://developer.github.com/v3/repos/pages/#list-a-specific-pages-build
25
+ # @example
26
+ # Octokit.pages_build("github/developer.github.com", 5472601)
27
+ def pages_build(repo, id, options = {})
28
+ opts = ensure_api_media_type(:pages, options)
29
+ get "#{Repository.path repo}/pages/builds/#{id}", opts
16
30
  end
17
31
 
18
32
  # List Pages builds for a repository
@@ -33,6 +47,18 @@ module Octokit
33
47
  def latest_pages_build(repo, options = {})
34
48
  get "#{Repository.path repo}/pages/builds/latest", options
35
49
  end
50
+
51
+ # Request a page build for the latest revision of the default branch
52
+ #
53
+ # You can only request builds for your repositories
54
+ #
55
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
56
+ # @return [Sawyer::Resource] Request result
57
+ # @see https://developer.github.com/v3/repos/pages/#request-a-page-build
58
+ def request_page_build(repo, options = {})
59
+ opts = ensure_api_media_type(:pages, options)
60
+ post "#{Repository.path repo}/pages/builds", opts
61
+ end
36
62
  end
37
63
  end
38
64
  end
@@ -222,7 +222,7 @@ module Octokit
222
222
  # @return [Sawyer::Resource] Hash representing new comment
223
223
  # @see https://developer.github.com/v3/pulls/comments/#create-a-comment
224
224
  # @example
225
- # @client.create_pull_request_comment_reply("octokit/octokit.rb", 1903950, "done.")
225
+ # @client.create_pull_request_comment_reply("octokit/octokit.rb", 163, "done.", 1903950)
226
226
  def create_pull_request_comment_reply(repo, pull_id, body, comment_id, options = {})
227
227
  options.merge!({
228
228
  :body => body,
@@ -0,0 +1,158 @@
1
+ module Octokit
2
+ class Client
3
+
4
+ # Methods for the Reacions API
5
+ #
6
+ # @see https://developer.github.com/v3/reactions/
7
+ module Reactions
8
+
9
+ # List reactions for a commit comment
10
+ #
11
+ # @param repo [Integer, String, Hash, Repository] A GitHub repository
12
+ # @param id [Integer] The id of the commit comment
13
+ # @see https://developer.github.com/v3/reactions/#list-reactions-for-a-commit-comment
14
+ #
15
+ # @example
16
+ # @client.commit_comment_reactions("octokit/octokit.rb", 1)
17
+ #
18
+ # @return [Array<Sawyer::Resource>] Array of Hashes representing the reactions.
19
+ def commit_comment_reactions(repo, id, options = {})
20
+ options = ensure_api_media_type(:reactions, options)
21
+ get "#{Repository.path repo}/comments/#{id}/reactions", options
22
+ end
23
+
24
+ # Create a reaction for a commit comment
25
+ #
26
+ # @param repo [Integer, String, Hash, Repository] A GitHub repository
27
+ # @param id [Integer] The id of the commit comment
28
+ # @param reaction [String] The Reaction
29
+ # @see https://developer.github.com/v3/reactions/#create-reaction-for-a-commit-comment
30
+ # @see https://developer.github.com/v3/reactions/#reaction-types
31
+ #
32
+ # @example
33
+ # @client.create_commit_comment_reactions("octokit/octokit.rb", 1)
34
+ #
35
+ # @return [<Sawyer::Resource>] Hash representing the reaction
36
+ def create_commit_comment_reaction(repo, id, reaction, options = {})
37
+ options = ensure_api_media_type(:reactions, options.merge(:content => reaction))
38
+ post "#{Repository.path repo}/comments/#{id}/reactions", options
39
+ end
40
+
41
+ # List reactions for an issue
42
+ #
43
+ # @param repo [Integer, String, Hash, Repository] A GitHub repository
44
+ # @param number [Integer] The Issue number
45
+ # @see https://developer.github.com/v3/reactions/#list-reactions-for-an-issue
46
+ #
47
+ # @example
48
+ # @client.issue_reactions("octokit/octokit.rb", 1)
49
+ #
50
+ # @return [Array<Sawyer::Resource>] Array of Hashes representing the reactions.
51
+ def issue_reactions(repo, number, options = {})
52
+ options = ensure_api_media_type(:reactions, options)
53
+ get "#{Repository.path repo}/issues/#{number}/reactions", options
54
+ end
55
+
56
+ # Create reaction for an issue
57
+ #
58
+ # @param repo [Integer, String, Hash, Repository] A GitHub repository
59
+ # @param number [Integer] The Issue number
60
+ # @param reaction [String] The Reaction
61
+ #
62
+ # @see https://developer.github.com/v3/reactions/#create-reaction-for-an-issue
63
+ # @see https://developer.github.com/v3/reactions/#reaction-types
64
+ #
65
+ # @example
66
+ # @client.create_issue_reaction("octokit/octokit.rb", 1)
67
+ #
68
+ # @return [<Sawyer::Resource>] Hash representing the reaction.
69
+ def create_issue_reaction(repo, number, reaction, options = {})
70
+ options = ensure_api_media_type(:reactions, options.merge(:content => reaction))
71
+ post "#{Repository.path repo}/issues/#{number}/reactions", options
72
+ end
73
+
74
+ # List reactions for an issue comment
75
+ #
76
+ # @param repo [Integer, String, Hash, Repository] A GitHub repository
77
+ # @param id [Integer] The Issue comment id
78
+ #
79
+ # @see https://developer.github.com/v3/reactions/#list-reactions-for-an-issue-comment
80
+ #
81
+ # @example
82
+ # @client.issue_comment_reactions("octokit/octokit.rb", 1)
83
+ #
84
+ # @return [Array<Sawyer::Resource>] Array of Hashes representing the reactions.
85
+ def issue_comment_reactions(repo, id, options = {})
86
+ options = ensure_api_media_type(:reactions, options)
87
+ get "#{Repository.path repo}/issues/comments/#{id}/reactions", options
88
+ end
89
+
90
+ # Create reaction for an issue comment
91
+ #
92
+ # @param repo [Integer, String, Hash, Repository] A GitHub repository
93
+ # @param id [Integer] The Issue comment id
94
+ # @param reaction [String] The Reaction
95
+ #
96
+ # @see https://developer.github.com/v3/reactions/#create-reaction-for-an-issue-comment
97
+ # @see https://developer.github.com/v3/reactions/#reaction-types
98
+ #
99
+ # @example
100
+ # @client.create_issue_comment_reaction("octokit/octokit.rb", 1)
101
+ #
102
+ # @return [<Sawyer::Resource>] Hashes representing the reaction.
103
+ def create_issue_comment_reaction(repo, id, reaction, options = {})
104
+ options = ensure_api_media_type(:reactions, options.merge(:content => reaction))
105
+ post "#{Repository.path repo}/issues/comments/#{id}/reactions", options
106
+ end
107
+
108
+ # List reactions for a pull request review comment
109
+ #
110
+ # @param repo [Integer, String, Hash, Repository] A GitHub repository
111
+ # @param id [Integer] The Issue comment id
112
+ #
113
+ # @see https://developer.github.com/v3/reactions/#list-reactions-for-a-pull-request-review-comment
114
+ #
115
+ # @example
116
+ # @client.pull_request_review_comment_reactions("octokit/octokit.rb", 1)
117
+ #
118
+ # @return [Array<Sawyer::Resource>] Array of Hashes representing the reactions.
119
+ def pull_request_review_comment_reactions(repo, id, options = {})
120
+ options = ensure_api_media_type(:reactions, options)
121
+ get "#{Repository.path repo}/pulls/comments/#{id}/reactions", options
122
+ end
123
+
124
+ # Create reaction for a pull request review comment
125
+ #
126
+ # @param repo [Integer, String, Hash, Repository] A GitHub repository
127
+ # @param id [Integer] The Issue comment id
128
+ # @param reaction [String] The Reaction
129
+ #
130
+ # @see https://developer.github.com/v3/reactions/#create-reaction-for-a-pull-request-review-comment
131
+ # @see https://developer.github.com/v3/reactions/#reaction-types
132
+ #
133
+ # @example
134
+ # @client.create_pull_request_reiew_comment_reaction("octokit/octokit.rb", 1)
135
+ #
136
+ # @return [<Sawyer::Resource>] Hash representing the reaction.
137
+ def create_pull_request_review_comment_reaction(repo, id, reaction, options = {})
138
+ options = ensure_api_media_type(:reactions, options.merge(:content => reaction))
139
+ post "#{Repository.path repo}/pulls/comments/#{id}/reactions", options
140
+ end
141
+
142
+ # Delete a reaction
143
+ #
144
+ # @param id [Integer] Reaction id
145
+ #
146
+ # @see https://developer.github.com/v3/reactions/#delete-a-reaction
147
+ #
148
+ # @example
149
+ # @client.delete_reaction(1)
150
+ #
151
+ # @return [Boolean] Return true if reaction was deleted, false otherwise.
152
+ def delete_reaction(id, options = {})
153
+ options = ensure_api_media_type(:reactions, options)
154
+ boolean_from_response :delete, "reactions/#{id}", options
155
+ end
156
+ end
157
+ end
158
+ end
@@ -83,7 +83,7 @@ module Octokit
83
83
  # @return [Sawyer::Resource] The release asset
84
84
  # @see https://developer.github.com/v3/repos/releases/#upload-a-release-asset
85
85
  def upload_asset(release_url, path_or_file, options = {})
86
- file = path_or_file.respond_to?(:read) ? path_or_file : File.new(path_or_file, "r+b")
86
+ file = path_or_file.respond_to?(:read) ? path_or_file : File.new(path_or_file, "rb")
87
87
  options[:content_type] ||= content_type_from_file(file)
88
88
  raise Octokit::MissingContentType.new if options[:content_type].nil?
89
89
  unless name = options[:name]
@@ -152,13 +152,14 @@ module Octokit
152
152
  # @return [Sawyer::Resource] Repository info for the new repository
153
153
  # @see https://developer.github.com/v3/repos/#create
154
154
  def create_repository(name, options = {})
155
- organization = options.delete :organization
156
- options.merge! :name => name
155
+ opts = options.dup
156
+ organization = opts.delete :organization
157
+ opts.merge! :name => name
157
158
 
158
159
  if organization.nil?
159
- post 'user/repos', options
160
+ post 'user/repos', opts
160
161
  else
161
- post "#{Organization.path organization}/repos", options
162
+ post "#{Organization.path organization}/repos", opts
162
163
  end
163
164
  end
164
165
  alias :create_repo :create_repository
@@ -291,16 +292,24 @@ module Octokit
291
292
 
292
293
  # Add collaborator to repo
293
294
  #
295
+ # This can also be used to update the permission of an existing collaborator
296
+ #
294
297
  # Requires authenticated client.
295
298
  #
296
299
  # @param repo [Integer, String, Hash, Repository] A GitHub repository.
297
300
  # @param collaborator [String] Collaborator GitHub username to add.
301
+ # @option options [String] :permission The permission to grant the collaborator.
302
+ # Only valid on organization-owned repositories.
303
+ # Can be one of: <tt>pull</tt>, <tt>push</tt>, or <tt>admin</tt>.
304
+ # If not specified, defaults to <tt>push</tt>
298
305
  # @return [Boolean] True if collaborator added, false otherwise.
299
306
  # @see https://developer.github.com/v3/repos/collaborators/#add-user-as-a-collaborator
300
307
  # @example
301
308
  # @client.add_collaborator('octokit/octokit.rb', 'holman')
302
309
  # @example
303
310
  # @client.add_collab('octokit/octokit.rb', 'holman')
311
+ # @example Add a collaborator with admin permissions
312
+ # @client.add_collaborator('octokit/octokit.rb', 'holman', permission: 'admin')
304
313
  def add_collaborator(repo, collaborator, options = {})
305
314
  boolean_from_response :put, "#{Repository.path repo}/collaborators/#{collaborator}", options
306
315
  end
@@ -496,14 +505,29 @@ module Octokit
496
505
  # @example
497
506
  # @client.protect_branch('octokit/octokit.rb', 'master', foo)
498
507
  def protect_branch(repo, branch, required_status_checks = {}, options = {})
499
- if !required_status_checks.empty?
500
- required_status_checks = { :required_status_checks => required_status_checks }
501
- end
508
+ required_status_checks[:restrictions] ||= nil
509
+ required_status_checks[:required_status_checks] ||= nil
502
510
 
503
- protection = { :protection => { :enabled => true }.merge(required_status_checks) }
504
- options = ensure_api_media_type(:branch_protection, options.merge(protection))
511
+ options = ensure_api_media_type(:branch_protection, options.merge(required_status_checks))
512
+ put "#{Repository.path repo}/branches/#{branch}/protection", options
513
+ end
505
514
 
506
- patch "#{Repository.path repo}/branches/#{branch}", options
515
+ # Get branch protection summary
516
+ #
517
+ # @param repo [Integer, String, Hash, Repository] A GitHub repository.
518
+ # @param branch [String] Branch name
519
+ # @return [Sawyer::Resource, nil] Branch protection summary or nil if the branch
520
+ # is not protected
521
+ # @see https://developer.github.com/v3/repos/branches/#get-branch-protection
522
+ # @example
523
+ # @client.branch_protection('octokit/octokit.rb', 'master')
524
+ def branch_protection(repo, branch, options = {})
525
+ opts = ensure_api_media_type(:branch_protection, options)
526
+ begin
527
+ get "#{Repository.path repo}/branches/#{branch}/protection", opts
528
+ rescue Octokit::BranchNotProtected
529
+ nil
530
+ end
507
531
  end
508
532
 
509
533
  # Unlock a single branch from a repository
@@ -517,9 +541,8 @@ module Octokit
517
541
  # @example
518
542
  # @client.unprotect_branch('octokit/octokit.rb', 'master')
519
543
  def unprotect_branch(repo, branch, options = {})
520
- protection = { :protection => { :enabled => false } }
521
- options = ensure_api_media_type(:branch_protection, options.merge(protection))
522
- patch "#{Repository.path repo}/branches/#{branch}", options
544
+ options = ensure_api_media_type(:branch_protection, options)
545
+ delete "#{Repository.path repo}/branches/#{branch}/protection", options
523
546
  end
524
547
 
525
548
  # List users available for assigning to issues.
@@ -0,0 +1,103 @@
1
+ module Octokit
2
+ class Client
3
+
4
+ # Methods for the Repository Invitations API
5
+ #
6
+ # @see https://developer.github.com/v3/repos/invitations/
7
+ module RepositoryInvitations
8
+
9
+ # Invite a user to a repository
10
+ #
11
+ # Requires authenticated client
12
+ #
13
+ # @param repo [Integer, String, Hash, Repository] A GitHub repository
14
+ # @param user [String] User GitHub username to add
15
+ # @return [Sawyer::Resource] The repository invitation
16
+ # @see https://developer.github.com/v3/repos/invitations/#invite-a-user-to-a-repository
17
+ def invite_user_to_repository(repo, user, options = {})
18
+ options = ensure_api_media_type(:repository_invitations, options)
19
+ put "#{Repository.path repo}/collaborators/#{user}", options
20
+ end
21
+ alias invite_user_to_repo invite_user_to_repository
22
+
23
+ # List all invitations for a repository
24
+ #
25
+ # Requires authenticated client
26
+ #
27
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
28
+ # @return [Array<Sawyer::Resource>] A list of invitations
29
+ # @see https://developer.github.com/v3/repos/invitations/#list-invitations-for-a-repository
30
+ def repository_invitations(repo, options = {})
31
+ options = ensure_api_media_type(:repository_invitations, options)
32
+ paginate "#{Repository.path repo}/invitations", options
33
+ end
34
+ alias repo_invitations repository_invitations
35
+
36
+ # Delete an invitation for a repository
37
+ #
38
+ # Requires authenticated client
39
+ #
40
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
41
+ # @param invitation_id [Integer] The id of the invitation
42
+ # @return [Boolean] True if the invitation was successfully deleted
43
+ # @see https://developer.github.com/v3/repos/invitations/#delete-a-repository-invitation
44
+ def delete_repository_invitation(repo, invitation_id, options = {})
45
+ options = ensure_api_media_type(:repository_invitations, options)
46
+ boolean_from_response :delete, "#{Repository.path repo}/invitations/#{invitation_id}", options
47
+ end
48
+ alias delete_repo_invitation delete_repository_invitation
49
+
50
+ # Update an invitation for a repository
51
+ #
52
+ # Requires authenticated client
53
+ #
54
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
55
+ # @param invitation_id [Integer] The id of the invitation
56
+ # @return [Sawyer::Resource] The updated repository invitation
57
+ # @see https://developer.github.com/v3/repos/invitations/#update-a-repository-invitation
58
+ def update_repository_invitation(repo, invitation_id, options = {})
59
+ options = ensure_api_media_type(:repository_invitations, options)
60
+ patch "#{Repository.path repo}/invitations/#{invitation_id}", options
61
+ end
62
+ alias update_repo_invitation update_repository_invitation
63
+
64
+ # List all repository invitations for the user
65
+ #
66
+ # Requires authenticated client
67
+ #
68
+ # @return [Array<Sawyer::Resource>] The users repository invitations
69
+ # @see https://developer.github.com/v3/repos/invitations/#list-a-users-repository-invitations
70
+ def user_repository_invitations(options = {})
71
+ options = ensure_api_media_type(:repository_invitations, options)
72
+ paginate "/user/repository_invitations", options
73
+ end
74
+ alias user_repo_invitations user_repository_invitations
75
+
76
+ # Accept a repository invitation
77
+ #
78
+ # Requires authenticated client
79
+ #
80
+ # @param invitation_id [Integer] The id of the invitation
81
+ # @return [Boolean] True if the acceptance of the invitation was successful
82
+ # @see https://developer.github.com/v3/repos/invitations/#accept-a-repository-invitation
83
+ def accept_repository_invitation(invitation_id, options = {})
84
+ options = ensure_api_media_type(:repository_invitations, options)
85
+ patch "/user/repository_invitations/#{invitation_id}", options
86
+ end
87
+ alias accept_repo_invitation accept_repository_invitation
88
+
89
+ # Decline a repository invitation
90
+ #
91
+ # Requires authenticated client
92
+ #
93
+ # @param invitation_id [Integer] The id of the invitation
94
+ # @return [Boolean] True if the acceptance of the invitation was successful
95
+ # @see https://developer.github.com/v3/repos/invitations/#decline-a-repository-invitation
96
+ def decline_repository_invitation(invitation_id, options = {})
97
+ options = ensure_api_media_type(:repository_invitations, options)
98
+ boolean_from_response :delete, "/user/repository_invitations/#{invitation_id}", options
99
+ end
100
+ alias decline_invitation decline_repository_invitation
101
+ end
102
+ end
103
+ end
@@ -3,29 +3,47 @@ module Octokit
3
3
 
4
4
  # Methods for the Source Import API
5
5
  #
6
- # @see https://developer.github.com/v3/repos/source_imports
6
+ # @see https://developer.github.com/v3/migration/source_imports
7
7
  module SourceImport
8
8
 
9
9
  # Start a source import to a GitHub repository using GitHub Importer.
10
10
  #
11
- # @param repo [Integer, String, Hash, Repository] A GitHub repository.
12
- # @param vcs [String] The originating VCS type. Can be one of "subversion", "git", "mercurial", or "tfvc".
13
- # @param vcs_url [String] The URL of the originating repository.
14
- # @param options [Hash]
15
- # @option options [String] :vcs_username If authentication is required, the username to provide to vcs_url.
16
- # @option options [String] :vcs_password If authentication is required, the password to provide to vcs_url.
17
- # @option options [String] :tfvc_project For a tfvc import, the name of the project that is being imported.
11
+ # @overload start_source_import(repo, vcs, vcs_url, options = {})
12
+ # @deprecated
13
+ # @param repo [Integer, String, Hash, Repository] A GitHub repository.
14
+ # @param vcs [String] The originating VCS type. Can be one of "subversion", "git", "mercurial", or "tfvc".
15
+ # @param vcs_url [String] The URL of the originating repository.
16
+ # @param options [Hash]
17
+ # @option options [String] :vcs_username If authentication is required, the username to provide to vcs_url.
18
+ # @option options [String] :vcs_password If authentication is required, the password to provide to vcs_url.
19
+ # @option options [String] :tfvc_project For a tfvc import, the name of the project that is being imported.
20
+ # @overload start_source_import(repo, vcs_url, options = {})
21
+ # @param repo [Integer, String, Hash, Repository] A GitHub repository.
22
+ # @param vcs_url [String] The URL of the originating repository.
23
+ # @param options [Hash]
24
+ # @param options [String] :vcs The originating VCS type. Can be one of "subversion", "git", "mercurial", or "tfvc".
25
+ # @option options [String] :vcs_username If authentication is required, the username to provide to vcs_url.
26
+ # @option options [String] :vcs_password If authentication is required, the password to provide to vcs_url.
27
+ # @option options [String] :tfvc_project For a tfvc import, the name of the project that is being imported.
18
28
  # @return [Sawyer::Resource] Hash representing the repository import
19
29
  # @see https://developer.github.com/v3/migration/source_imports/#start-an-import
20
30
  #
21
31
  # @example
22
- # @client.import("octokit/octokit.rb", "subversion", "http://svn.mycompany.com/svn/myproject" {
32
+ # @client.start_source_import("octokit/octokit.rb", "http://svn.mycompany.com/svn/myproject", {
33
+ # :vcs => "subversion",
23
34
  # :vcs_username" => "octocat",
24
35
  # :vcs_password => "secret"
25
36
  # })
26
- def start_source_import(repo, vcs, vcs_url, options = {})
27
- options = ensure_api_media_type(:source_imports, options.merge(:vcs => vcs, :vcs_url => vcs_url))
28
- put "#{Repository.path repo}/import", options
37
+ def start_source_import(*args)
38
+ arguments = Octokit::RepoArguments.new(args)
39
+ vcs_url = arguments.pop
40
+ vcs = arguments.pop
41
+ if vcs
42
+ octokit_warn "Octokit#start_source_import vcs parameter is now an option, please update your call before the next major Octokit version update."
43
+ arguments.options.merge!(:vcs => vcs)
44
+ end
45
+ options = ensure_api_media_type(:source_imports, arguments.options.merge(:vcs_url => vcs_url))
46
+ put "#{Repository.path arguments.repo}/import", options
29
47
  end
30
48
 
31
49
  # View the progress of an import.
@@ -41,6 +59,27 @@ module Octokit
41
59
  get "#{Repository.path repo}/import", options
42
60
  end
43
61
 
62
+ # Update source import with authentication or project choice
63
+ # Restart source import if no options are passed
64
+ #
65
+ # @param repo [Integer, String, Hash, Repository] A GitHub repository.
66
+ # @return [Sawyer::Resource] Hash representing the repository import
67
+ # @see https://developer.github.com/v3/migration/source_imports/#update-existing-import
68
+ # @option options [String] :vcs_username If authentication is required, the username to provide to vcs_url.
69
+ # @option options [String] :vcs_password If authentication is required, the password to provide to vcs_url.
70
+ # @option options [String] To update project choice, please refer to the project_choice array from the progress return hash for the exact attributes.
71
+ # https://developer.github.com/v3/migration/source_imports/#update-existing-import
72
+ #
73
+ # @example
74
+ # @client.update_source_import("octokit/octokit.rb", {
75
+ # :vcs_username" => "octocat",
76
+ # :vcs_password => "secret"
77
+ # })
78
+ def update_source_import(repo, options = {})
79
+ options = ensure_api_media_type(:source_imports, options)
80
+ patch "#{Repository.path repo}/import", options
81
+ end
82
+
44
83
  # List source import commit authors
45
84
  #
46
85
  # @param repo [Integer, String, Hash, Repository] A GitHub repository.
@@ -88,6 +127,35 @@ module Octokit
88
127
  options = ensure_api_media_type(:source_imports, options)
89
128
  boolean_from_response :delete, "#{Repository.path repo}/import", options
90
129
  end
130
+
131
+ # List source import large files
132
+ #
133
+ # @param repo [Integer, String, Hash, Repository] A GitHub repository.
134
+ # @param options [Hash]
135
+ # @option options [Fixnum] :page Page of paginated results
136
+ # @return [Array<Sawyer::Resource>] Array of hashes representing files over 100MB.
137
+ # @see https://developer.github.com/v3/migration/source_imports/#get-large-files
138
+ #
139
+ # @example
140
+ # @client.source_import_large_files("octokit/octokit.rb")
141
+ def source_import_large_files(repo, options = {})
142
+ options = ensure_api_media_type(:source_imports, options)
143
+ get "#{Repository.path repo}/import/large_files", options
144
+ end
145
+
146
+ # Set preference for using Git LFS to import files over 100MB
147
+ #
148
+ # @param repo [Integer, String, Hash, Repository] A GitHub repository.
149
+ # @param use_lfs [String] Preference for using Git LFS to import large files. Can be one of "opt_in" or "opt_out"
150
+ # @return [Sawyer::Resource] Hash representing the repository import
151
+ # @see https://developer.github.com/v3/migration/source_imports/#set-git-lfs-preference
152
+ #
153
+ # @example
154
+ # @client.opt_in_source_import_lfs("octokit/octokit.rb", "opt_in")
155
+ def set_source_import_lfs_preference(repo, use_lfs, options = {})
156
+ options = ensure_api_media_type(:source_imports, options.merge(:use_lfs => use_lfs))
157
+ patch "#{Repository.path repo}/import/lfs", options
158
+ end
91
159
  end
92
160
  end
93
161
  end
@@ -96,7 +96,7 @@ module Octokit
96
96
  data = get("#{Repository.path repo}/stats/#{metric}", options)
97
97
  return data if last_response.status == 200
98
98
  return nil unless retry_timeout
99
- return data if Time.now >= timeout
99
+ return nil if Time.now >= timeout
100
100
  sleep retry_wait if retry_wait
101
101
  end
102
102
  end
@@ -106,7 +106,7 @@ module Octokit
106
106
 
107
107
  # Default middleware stack for Faraday::Connection
108
108
  # from {MIDDLEWARE}
109
- # @return [String]
109
+ # @return [Faraday::RackBuilder or Faraday::Builder]
110
110
  def middleware
111
111
  MIDDLEWARE
112
112
  end
@@ -32,6 +32,8 @@ module Octokit
32
32
  Octokit::Configurable.keys.each do |key|
33
33
  instance_variable_set(:"@#{key}", options[key] || Octokit.instance_variable_get(:"@#{key}"))
34
34
  end
35
+
36
+ login_from_netrc unless user_authenticated? || application_authenticated?
35
37
  end
36
38
 
37
39
  end
@@ -16,12 +16,13 @@ module Octokit
16
16
  when 400 then Octokit::BadRequest
17
17
  when 401 then error_for_401(headers)
18
18
  when 403 then error_for_403(body)
19
- when 404 then Octokit::NotFound
19
+ when 404 then error_for_404(body)
20
20
  when 405 then Octokit::MethodNotAllowed
21
21
  when 406 then Octokit::NotAcceptable
22
22
  when 409 then Octokit::Conflict
23
23
  when 415 then Octokit::UnsupportedMediaType
24
24
  when 422 then Octokit::UnprocessableEntity
25
+ when 451 then Octokit::UnavailableForLegalReasons
25
26
  when 400..499 then Octokit::ClientError
26
27
  when 500 then Octokit::InternalServerError
27
28
  when 501 then Octokit::NotImplemented
@@ -68,11 +69,23 @@ module Octokit
68
69
  Octokit::RepositoryUnavailable
69
70
  elsif body =~ /email address must be verified/i
70
71
  Octokit::UnverifiedEmail
72
+ elsif body =~ /account was suspended/i
73
+ Octokit::AccountSuspended
71
74
  else
72
75
  Octokit::Forbidden
73
76
  end
74
77
  end
75
78
 
79
+ # Return most appropriate error for 404 HTTP status code
80
+ # @private
81
+ def self.error_for_404(body)
82
+ if body =~ /Branch not protected/i
83
+ Octokit::BranchNotProtected
84
+ else
85
+ Octokit::NotFound
86
+ end
87
+ end
88
+
76
89
  # Array of validation errors
77
90
  # @return [Array<Hash>] Error info
78
91
  def errors
@@ -83,6 +96,13 @@ module Octokit
83
96
  end
84
97
  end
85
98
 
99
+ # Status code returned by the GitHub server.
100
+ #
101
+ # @return [Integer]
102
+ def response_status
103
+ @response[:status]
104
+ end
105
+
86
106
  private
87
107
 
88
108
  def data
@@ -205,9 +225,17 @@ module Octokit
205
225
  # and body matches 'email address must be verified'
206
226
  class UnverifiedEmail < Forbidden; end
207
227
 
228
+ # Raised when GitHub returns a 403 HTTP status code
229
+ # and body matches 'account was suspended'
230
+ class AccountSuspended < Forbidden; end
231
+
208
232
  # Raised when GitHub returns a 404 HTTP status code
209
233
  class NotFound < ClientError; end
210
234
 
235
+ # Raised when GitHub returns a 404 HTTP status code
236
+ # and body matches 'Branch not protected'
237
+ class BranchNotProtected < ClientError; end
238
+
211
239
  # Raised when GitHub returns a 405 HTTP status code
212
240
  class MethodNotAllowed < ClientError; end
213
241
 
@@ -223,6 +251,9 @@ module Octokit
223
251
  # Raised when GitHub returns a 422 HTTP status code
224
252
  class UnprocessableEntity < ClientError; end
225
253
 
254
+ # Raised when GitHub returns a 451 HTTP status code
255
+ class UnavailableForLegalReasons < ClientError; end
256
+
226
257
  # Raised on errors in the 500-599 range
227
258
  class ServerError < Error; end
228
259
 
@@ -4,10 +4,14 @@ module Octokit
4
4
  module Preview
5
5
 
6
6
  PREVIEW_TYPES = {
7
- :branch_protection => 'application/vnd.github.loki-preview+json'.freeze,
8
- :migrations => 'application/vnd.github.wyandotte-preview+json'.freeze,
9
- :licenses => 'application/vnd.github.drax-preview+json'.freeze,
10
- :source_imports => 'application/vnd.github.barred-rock-preview'.freeze,
7
+ :branch_protection => 'application/vnd.github.loki-preview+json'.freeze,
8
+ :migrations => 'application/vnd.github.wyandotte-preview+json'.freeze,
9
+ :licenses => 'application/vnd.github.drax-preview+json'.freeze,
10
+ :source_imports => 'application/vnd.github.barred-rock-preview'.freeze,
11
+ :reactions => 'application/vnd.github.squirrel-girl-preview'.freeze,
12
+ :repository_invitations => 'application/vnd.github.swamp-thing-preview+json'.freeze,
13
+ :issue_timelines => 'application/vnd.github.mockingbird-preview+json'.freeze,
14
+ :pages => 'application/vnd.github.mister-fantastic-preview+json'.freeze
11
15
  }
12
16
 
13
17
  def ensure_api_media_type(type, options)
@@ -19,7 +23,7 @@ module Octokit
19
23
  end
20
24
 
21
25
  def warn_preview(type)
22
- warn <<-EOS
26
+ octokit_warn <<-EOS
23
27
  WARNING: The preview version of the #{type.to_s.capitalize} API is not yet suitable for production use.
24
28
  You can avoid this message by supplying an appropriate media type in the 'Accept' request
25
29
  header.
@@ -10,7 +10,10 @@ module Octokit
10
10
  #
11
11
  # @return [Repository]
12
12
  def self.from_url(url)
13
- Repository.new(URI.parse(url).path[1..-1])
13
+ new URI.parse(url).path[1..-1].
14
+ gsub(/^repos\//,'').
15
+ split('/', 3)[0..1].
16
+ join('/')
14
17
  end
15
18
 
16
19
  # @raise [Octokit::InvalidRepository] if the repository
@@ -78,7 +81,7 @@ module Octokit
78
81
  private
79
82
 
80
83
  def validate_owner_and_name!
81
- if @owner.include?('/') || @name.include?('/') || !url.match(/\A#{URI.regexp}\z/)
84
+ if @owner.include?('/') || @name.include?('/') || !url.match(URI::ABS_URI)
82
85
  raise_invalid_repository!
83
86
  end
84
87
  end
@@ -5,7 +5,7 @@ module Octokit
5
5
 
6
6
  # Current minor release.
7
7
  # @return [Integer]
8
- MINOR = 3
8
+ MINOR = 4
9
9
 
10
10
  # Current patch level.
11
11
  # @return [Integer]
@@ -15,7 +15,7 @@ Gem::Specification.new do |spec|
15
15
  spec.licenses = ['MIT']
16
16
  spec.name = 'octokit'
17
17
  spec.require_paths = ['lib']
18
- spec.required_ruby_version = '>= 1.9.2'
18
+ spec.required_ruby_version = '>= 2.0.0'
19
19
  spec.required_rubygems_version = '>= 1.3.5'
20
20
  spec.summary = "Ruby toolkit for working with the GitHub API"
21
21
  spec.version = Octokit::VERSION.dup
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: octokit
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.3.0
4
+ version: 4.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wynn Netherland
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2016-03-05 00:00:00.000000000 Z
13
+ date: 2016-10-23 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler
@@ -90,9 +90,11 @@ files:
90
90
  - lib/octokit/client/pub_sub_hubbub.rb
91
91
  - lib/octokit/client/pull_requests.rb
92
92
  - lib/octokit/client/rate_limit.rb
93
+ - lib/octokit/client/reactions.rb
93
94
  - lib/octokit/client/refs.rb
94
95
  - lib/octokit/client/releases.rb
95
96
  - lib/octokit/client/repositories.rb
97
+ - lib/octokit/client/repository_invitations.rb
96
98
  - lib/octokit/client/say.rb
97
99
  - lib/octokit/client/search.rb
98
100
  - lib/octokit/client/service_status.rb
@@ -137,7 +139,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
137
139
  requirements:
138
140
  - - ">="
139
141
  - !ruby/object:Gem::Version
140
- version: 1.9.2
142
+ version: 2.0.0
141
143
  required_rubygems_version: !ruby/object:Gem::Requirement
142
144
  requirements:
143
145
  - - ">="