octokit 4.18.0 → 4.21.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
  SHA256:
3
- metadata.gz: 6769ee0502378ac696ca5c6fe2cf854eb67ad86affebf92342a6f30997d3f181
4
- data.tar.gz: 9a189f3ee1bdd7164ce1a189d62f014e0440a648ac40dfdc8e7bf8c57af4d5fa
3
+ metadata.gz: be4c54d083639a915bef0eb235748b93351f17f2a98e204b7b9f2899c156f2f6
4
+ data.tar.gz: 21998779cea8f95e63b1814dc264102c1ac69c9d66fef6694ef6442554419bbc
5
5
  SHA512:
6
- metadata.gz: 61f2200517ff1f3f805926d3ce20b3155429e77d6e35ef89ebc0b1e2a826064e658bcc9f32c368cd89618677fa9c1b14d65668b6083ebba56ab36375e605a035
7
- data.tar.gz: 8bf0ef345c8f3850196d8a2695b5ae9a3f2d90a7c63e9e02944c2876bf381613bb2fd0ecd5c3b11a4aaba75e22d5345269d1ad324c777224b4c65ec4f27eaf4a
6
+ metadata.gz: 14221c5912859f6fa1a9f3dce7d7ee1cb6b5730bc1a95c997e84ff2972f23a3e8eaad723acbabd57982afadc1f4bb1538af510bd10583e21e0f208c7712ce1e6
7
+ data.tar.gz: 23300ee9b4e73fc660a391018efbc969742dbdc9740faa57ed7609853830689cc1edcca8d445df2d939f2d7353056f828b53ad44b33269573ed06a8e93b8dbd4
data/CONTRIBUTING.md CHANGED
@@ -1,8 +1,8 @@
1
1
  ## Submitting a Pull Request
2
2
 
3
3
  0. Read our [Code of Conduct](CODE_OF_CONDUCT.md).
4
- 1. Check out Hacking on Octokit in the README guide for
5
- bootstrapping the project for local development.
4
+ 1. Check out [Hacking on Octokit](README.md#hacking-on-octokitrb) in the
5
+ README for bootstrapping the project for local development.
6
6
  2. [Fork the repository.][fork]
7
7
  3. [Create a topic branch.][branch]
8
8
  4. Add specs for your unimplemented feature or bug fix.
@@ -18,8 +18,6 @@
18
18
  add "[ci skip]" to your commit message to avoid needless CI builds.
19
19
  12. [Submit a pull request.][pr]
20
20
 
21
- Please abide by
22
-
23
21
  [fork]: https://help.github.com/articles/fork-a-repo
24
22
  [branch]: https://help.github.com/articles/creating-and-deleting-branches-within-your-repository/
25
23
  [pr]: https://help.github.com/articles/using-pull-requests
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Ruby toolkit for the GitHub API.
4
4
 
5
- ![logo](http://cl.ly/image/3Y013H0A2z3z/gundam-ruby.png)
5
+ ![logo](https://docs.github.com/assets/images/gundamcat.png)
6
6
 
7
7
  Upgrading? Check the [Upgrade Guide](#upgrading-guide) before bumping to a new
8
8
  [major version][semver].
@@ -41,7 +41,7 @@ Upgrading? Check the [Upgrade Guide](#upgrading-guide) before bumping to a new
41
41
  1. [Debugging](#debugging)
42
42
  2. [Caching](#caching)
43
43
  14. [Hacking on Octokit.rb](#hacking-on-octokitrb)
44
- 1. [Code of Conduction](#code_of_conduct)
44
+ 1. [Code of Conduct](#code-of-conduct)
45
45
  2. [Running and writing new tests](#running-and-writing-new-tests)
46
46
  15. [Supported Ruby Versions](#supported-ruby-versions)
47
47
  16. [Versioning](#versioning)
@@ -86,10 +86,10 @@ Access the library in Ruby:
86
86
 
87
87
  ```ruby
88
88
  # Provide authentication credentials
89
- client = Octokit::Client.new(:login => 'defunkt', :password => 'c0d3b4ssssss!')
89
+ client = Octokit::Client.new(:access_token => 'personal_access_token')
90
90
 
91
- # Set access_token instead of login and password if you use personal access token
92
- # client = Octokit::Client.new(:access_token => '[personal_access_token]!')
91
+ # You can still use the username/password syntax by replacing the password value with your PAT.
92
+ # client = Octokit::Client.new(:login => 'defunkt', :password => 'personal_access_token')
93
93
 
94
94
  # Fetch the current user
95
95
  client.user
@@ -323,7 +323,7 @@ custom pattern for traversing large lists.
323
323
 
324
324
  ## Working with GitHub Enterprise
325
325
 
326
- With a bit of setup, you can also use Octokit with your Github Enterprise instance.
326
+ With a bit of setup, you can also use Octokit with your GitHub Enterprise instance.
327
327
 
328
328
  ### Interacting with the GitHub.com APIs in GitHub Enterprise
329
329
 
@@ -651,7 +651,7 @@ to run a Ruby console to poke on Octokit, you can crank one up with:
651
651
 
652
652
  script/console
653
653
 
654
- Using the scripts in `./scripts` instead of `bundle exec rspec`, `bundle
654
+ Using the scripts in `./script` instead of `bundle exec rspec`, `bundle
655
655
  console`, etc. ensures your dependencies are up-to-date.
656
656
 
657
657
  ### Code of Conduct
@@ -713,16 +713,12 @@ when writing new specs.
713
713
 
714
714
  ## Supported Ruby Versions
715
715
 
716
- This library aims to support and is [tested against][travis] the following Ruby
716
+ This library aims to support and is [tested against][actions] the following Ruby
717
717
  implementations:
718
718
 
719
- * Ruby 2.0
720
- * Ruby 2.1
721
- * Ruby 2.2
722
- * Ruby 2.3
723
- * Ruby 2.4
724
719
  * Ruby 2.5
725
720
  * Ruby 2.6
721
+ * Ruby 2.7
726
722
 
727
723
  If something doesn't work on one of these Ruby versions, it's a bug.
728
724
 
@@ -737,7 +733,7 @@ implementation, you will be responsible for providing patches in a timely
737
733
  fashion. If critical issues for a particular implementation exist at the time
738
734
  of a major release, support for that Ruby version may be dropped.
739
735
 
740
- [travis]: https://travis-ci.org/octokit/octokit.rb
736
+ [actions]: https://github.com/octokit/octokit.rb/actions
741
737
 
742
738
  ## Versioning
743
739
 
@@ -45,7 +45,7 @@ module Octokit
45
45
  # @see https://developer.github.com/v3/#unauthenticated-rate-limited-requests
46
46
  # @return [Boolean]
47
47
  def application_authenticated?
48
- @client_id && @client_secret
48
+ !!(@client_id && @client_secret)
49
49
  end
50
50
 
51
51
  private
@@ -10,6 +10,9 @@ require 'octokit/repository'
10
10
  require 'octokit/user'
11
11
  require 'octokit/organization'
12
12
  require 'octokit/preview'
13
+ require 'octokit/client/actions_secrets'
14
+ require 'octokit/client/actions_workflows'
15
+ require 'octokit/client/actions_workflow_runs'
13
16
  require 'octokit/client/apps'
14
17
  require 'octokit/client/authorizations'
15
18
  require 'octokit/client/checks'
@@ -72,6 +75,7 @@ module Octokit
72
75
  include Octokit::Connection
73
76
  include Octokit::Preview
74
77
  include Octokit::Warnable
78
+ include Octokit::Client::ActionsSecrets
75
79
  include Octokit::Client::Authorizations
76
80
  include Octokit::Client::Checks
77
81
  include Octokit::Client::Commits
@@ -88,6 +92,8 @@ module Octokit
88
92
  include Octokit::Client::Gists
89
93
  include Octokit::Client::Gitignore
90
94
  include Octokit::Client::Hooks
95
+ include Octokit::Client::ActionsWorkflows
96
+ include Octokit::Client::ActionsWorkflowRuns
91
97
  include Octokit::Client::Apps
92
98
  include Octokit::Client::Issues
93
99
  include Octokit::Client::Labels
@@ -0,0 +1,58 @@
1
+ module Octokit
2
+ class Client
3
+
4
+ # Methods for the Actions Secrets API
5
+ #
6
+ # @see https://developer.github.com/v3/actions/secrets/
7
+ module ActionsSecrets
8
+
9
+ # Get public key for secrets encryption
10
+ #
11
+ # @param repo [Integer, String, Hash, Repository] A GitHub repository
12
+ # @return [Hash] key_id and key
13
+ # @see https://developer.github.com/v3/actions/secrets/#get-your-public-key
14
+ def get_public_key(repo)
15
+ get "#{Repository.path repo}/actions/secrets/public-key"
16
+ end
17
+
18
+
19
+ # List secrets
20
+ #
21
+ # @param repo [Integer, String, Hash, Repository] A GitHub repository
22
+ # @return [Hash] total_count and list of secrets (each item is hash with name, created_at and updated_at)
23
+ # @see https://developer.github.com/v3/actions/secrets/#list-secrets-for-a-repository
24
+ def list_secrets(repo)
25
+ paginate "#{Repository.path repo}/actions/secrets"
26
+ end
27
+
28
+ # Get a secret
29
+ #
30
+ # @param repo [Integer, String, Hash, Repository] A GitHub repository
31
+ # @param name [String] Name of secret
32
+ # @return [Hash] name, created_at and updated_at
33
+ # @see https://developer.github.com/v3/actions/secrets/#get-a-secret
34
+ def get_secret(repo, name)
35
+ get "#{Repository.path repo}/actions/secrets/#{name}"
36
+ end
37
+
38
+ # Create or update secrets
39
+ #
40
+ # @param repo [Integer, String, Hash, Repository] A GitHub repository
41
+ # @param name [String] Name of secret
42
+ # @param options [Hash] encrypted_value and key_id
43
+ # @see https://developer.github.com/v3/actions/secrets/#create-or-update-a-secret-for-a-repository
44
+ def create_or_update_secret(repo, name, options)
45
+ put "#{Repository.path repo}/actions/secrets/#{name}", options
46
+ end
47
+
48
+ # Delete a secret
49
+ #
50
+ # @param repo [Integer, String, Hash, Repository] A GitHub repository
51
+ # @param name [String] Name of secret
52
+ # @see https://developer.github.com/v3/actions/secrets/#delete-a-secret-from-a-repository
53
+ def delete_secret(repo, name)
54
+ boolean_from_response :delete, "#{Repository.path repo}/actions/secrets/#{name}"
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,105 @@
1
+ module Octokit
2
+ class Client
3
+ module ActionsWorkflowRuns
4
+ # List all runs for a repository workflow
5
+ #
6
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
7
+ # @param workflow [Integer, String] Id or file name of the workflow
8
+ # @option options [String] :actor Optional filtering by a user
9
+ # @option options [String] :branch Optional filtering by a branch
10
+ # @option options [String] :event Optional filtering by the event type
11
+ # @option options [String] :status Optional filtering by a status or conclusion
12
+ #
13
+ # @return [Sawyer::Resource] the total count and an array of workflows
14
+ # @see https://developer.github.com/v3/actions/workflow-runs/#list-workflow-runs
15
+ def workflow_runs(repo, workflow, options = {})
16
+ paginate "#{Repository.path repo}/actions/workflows/#{workflow}/runs", options
17
+ end
18
+ alias list_workflow_runs workflow_runs
19
+
20
+ # List all workflow runs for a repository
21
+ #
22
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
23
+ # @option options [String] :actor Optional filtering by the login of a user
24
+ # @option options [String] :branch Optional filtering by a branch
25
+ # @option options [String] :event Optional filtering by the event type (e.g. push, pull_request, issue)
26
+ # @option options [String] :status Optional filtering by a status or conclusion (e.g. success, completed...)
27
+ #
28
+ # @return [Sawyer::Resource] the total count and an array of workflows
29
+ # @see https://developer.github.com/v3/actions/workflow-runs/#list-repository-workflow-runs
30
+ def repository_workflow_runs(repo, options = {})
31
+ paginate "#{Repository.path repo}/actions/runs", options
32
+ end
33
+ alias list_repository_workflow_runs repository_workflow_runs
34
+
35
+ # Get a workflow run
36
+ #
37
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
38
+ # @param id [Integer] Id of a workflow run
39
+ #
40
+ # @return [Sawyer::Resource] Run information
41
+ # @see https://developer.github.com/v3/actions/workflow-runs/#get-a-workflow-run
42
+ def workflow_run(repo, id, options = {})
43
+ get "#{Repository.path repo}/actions/runs/#{id}", options
44
+ end
45
+
46
+ # Re-runs a workflow run
47
+ #
48
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
49
+ # @param id [Integer] Id of a workflow run
50
+ #
51
+ # @return [Boolean] Returns true if the re-run request was accepted
52
+ # @see https://developer.github.com/v3/actions/workflow-runs/#re-run-a-workflow
53
+ def rerun_workflow_run(repo, id, options = {})
54
+ boolean_from_response :post, "#{Repository.path repo}/actions/runs/#{id}/rerun", options
55
+ end
56
+
57
+ # Cancels a workflow run
58
+ #
59
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
60
+ # @param id [Integer] Id of a workflow run
61
+ #
62
+ # @return [Boolean] Returns true if the cancellation was accepted
63
+ # @see https://developer.github.com/v3/actions/workflow-runs/#cancel-a-workflow-run
64
+ def cancel_workflow_run(repo, id, options = {})
65
+ boolean_from_response :post, "#{Repository.path repo}/actions/runs/#{id}/cancel", options
66
+ end
67
+
68
+ # Deletes a workflow run
69
+ #
70
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
71
+ # @param id [Integer] Id of a workflow run
72
+ #
73
+ # @return [Boolean] Returns true if the run is deleted
74
+ # @see https://docs.github.com/en/rest/reference/actions#delete-a-workflow-run
75
+ def delete_workflow_run(repo, id, options = {})
76
+ boolean_from_response :delete, "#{Repository.path repo}/actions/runs/#{id}", options
77
+ end
78
+
79
+ # Get a download url for archived log files of a workflow run
80
+ #
81
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
82
+ # @param id [Integer] Id of a workflow run
83
+ #
84
+ # @return [String] URL to the archived log files of the run
85
+ # @see https://developer.github.com/v3/actions/workflow-runs/#download-workflow-run-logs
86
+ def workflow_run_logs(repo, id, options = {})
87
+ url = "#{Repository.path repo}/actions/runs/#{id}/logs"
88
+
89
+ response = client_without_redirects.head(url, options)
90
+ response.headers['Location']
91
+ end
92
+
93
+ # Delets all log files of a workflow run
94
+ #
95
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
96
+ # @param id [Integer] Id of a workflow run
97
+ #
98
+ # @return [Boolean] Returns true if the logs are deleted
99
+ # @see https://developer.github.com/v3/actions/workflow-runs/#delete-workflow-run-logs
100
+ def delete_workflow_run_logs(repo, id, options = {})
101
+ boolean_from_response :delete, "#{Repository.path repo}/actions/runs/#{id}/logs", options
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,43 @@
1
+ module Octokit
2
+ class Client
3
+ # Methods for the Actions Workflows API
4
+ #
5
+ # @see https://developer.github.com/v3/actions/workflows
6
+ module ActionsWorkflows
7
+
8
+ # Get the workflows in a repository
9
+ #
10
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
11
+ #
12
+ # @return [Sawyer::Resource] the total count and an array of workflows
13
+ # @see https://developer.github.com/v3/actions/workflows/#list-repository-workflows
14
+ def workflows(repo, options = {})
15
+ paginate "#{Repository.path repo}/actions/workflows", options
16
+ end
17
+ alias list_workflows workflows
18
+
19
+ # Get single workflow in a repository
20
+ #
21
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
22
+ # @param id [Integer, String] Id or file name of the workflow
23
+ #
24
+ # @return [Sawyer::Resource] A single workflow
25
+ # @see https://developer.github.com/v3/actions/workflows/#get-a-workflow
26
+ def workflow(repo, id, options = {})
27
+ get "#{Repository.path repo}/actions/workflows/#{id}", options
28
+ end
29
+
30
+ # Create a workflow dispatch event
31
+ #
32
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
33
+ # @param id [Integer, String] Id or file name of the workflow
34
+ # @param ref [String] A SHA, branch name, or tag name
35
+ #
36
+ # @return [Boolean] True if event was dispatched, false otherwise
37
+ # @see https://docs.github.com/en/rest/reference/actions#create-a-workflow-dispatch-event
38
+ def workflow_dispatch(repo, id, ref, options = {})
39
+ boolean_from_response :post, "#{Repository.path repo}/actions/workflows/#{id}/dispatches", options.merge({ ref: ref })
40
+ end
41
+ end
42
+ end
43
+ end
@@ -4,6 +4,17 @@ module Octokit
4
4
  # Methods for the Apps API
5
5
  module Apps
6
6
 
7
+ # Get the authenticated App
8
+ #
9
+ # @param options [Hash] A customizable set of options
10
+ #
11
+ # @see https://developer.github.com/v3/apps/#get-the-authenticated-app
12
+ #
13
+ # @return [Sawyer::Resource] App information
14
+ def app(options = {})
15
+ get "app", options
16
+ end
17
+
7
18
  # Find all installations that belong to an App
8
19
  #
9
20
  # @param options [Hash] A customizable set of options
@@ -12,8 +23,7 @@ module Octokit
12
23
  #
13
24
  # @return [Array<Sawyer::Resource>] the total_count and an array of installations
14
25
  def find_app_installations(options = {})
15
- opts = ensure_api_media_type(:integrations, options)
16
- paginate "app/installations", opts
26
+ paginate "app/installations", options
17
27
  end
18
28
  alias find_installations find_app_installations
19
29
 
@@ -35,8 +45,7 @@ module Octokit
35
45
  #
36
46
  # @return [Sawyer::Resource] the total_count and an array of installations
37
47
  def find_user_installations(options = {})
38
- opts = ensure_api_media_type(:integrations, options)
39
- paginate("user/installations", opts) do |data, last_response|
48
+ paginate("user/installations", options) do |data, last_response|
40
49
  data.installations.concat last_response.data.installations
41
50
  end
42
51
  end
@@ -49,8 +58,7 @@ module Octokit
49
58
  #
50
59
  # @return [Sawyer::Resource] Installation information
51
60
  def installation(id, options = {})
52
- opts = ensure_api_media_type(:integrations, options)
53
- get "app/installations/#{id}", opts
61
+ get "app/installations/#{id}", options
54
62
  end
55
63
 
56
64
  # Create a new installation token
@@ -62,8 +70,7 @@ module Octokit
62
70
  #
63
71
  # @return [<Sawyer::Resource>] An installation token
64
72
  def create_app_installation_access_token(installation, options = {})
65
- opts = ensure_api_media_type(:integrations, options)
66
- post "app/installations/#{installation}/access_tokens", opts
73
+ post "app/installations/#{installation}/access_tokens", options
67
74
  end
68
75
  alias create_installation_access_token create_app_installation_access_token
69
76
 
@@ -86,8 +93,7 @@ module Octokit
86
93
  #
87
94
  # @return [Sawyer::Resource] Installation information
88
95
  def find_organization_installation(organization, options = {})
89
- opts = ensure_api_media_type(:integrations, options)
90
- get "#{Organization.path(organization)}/installation", opts
96
+ get "#{Organization.path(organization)}/installation", options
91
97
  end
92
98
 
93
99
  # Enables an app to find the repository's installation information.
@@ -99,8 +105,7 @@ module Octokit
99
105
  #
100
106
  # @return [Sawyer::Resource] Installation information
101
107
  def find_repository_installation(repo, options = {})
102
- opts = ensure_api_media_type(:integrations, options)
103
- get "#{Repository.path(repo)}/installation", opts
108
+ get "#{Repository.path(repo)}/installation", options
104
109
  end
105
110
 
106
111
  # Enables an app to find the user's installation information.
@@ -112,8 +117,7 @@ module Octokit
112
117
  #
113
118
  # @return [Sawyer::Resource] Installation information
114
119
  def find_user_installation(user, options = {})
115
- opts = ensure_api_media_type(:integrations, options)
116
- get "#{User.path(user)}/installation", opts
120
+ get "#{User.path(user)}/installation", options
117
121
  end
118
122
 
119
123
  # List repositories that are accessible to the authenticated installation
@@ -124,8 +128,7 @@ module Octokit
124
128
  #
125
129
  # @return [Sawyer::Resource] the total_count and an array of repositories
126
130
  def list_app_installation_repositories(options = {})
127
- opts = ensure_api_media_type(:integrations, options)
128
- paginate("installation/repositories", opts) do |data, last_response|
131
+ paginate("installation/repositories", options) do |data, last_response|
129
132
  data.repositories.concat last_response.data.repositories
130
133
  end
131
134
  end
@@ -151,8 +154,7 @@ module Octokit
151
154
  #
152
155
  # @return [Boolean] Success
153
156
  def add_repository_to_app_installation(installation, repo, options = {})
154
- opts = ensure_api_media_type(:integrations, options)
155
- boolean_from_response :put, "user/installations/#{installation}/repositories/#{repo}", opts
157
+ boolean_from_response :put, "user/installations/#{installation}/repositories/#{repo}", options
156
158
  end
157
159
  alias add_repo_to_installation add_repository_to_app_installation
158
160
 
@@ -176,8 +178,7 @@ module Octokit
176
178
  #
177
179
  # @return [Boolean] Success
178
180
  def remove_repository_from_app_installation(installation, repo, options = {})
179
- opts = ensure_api_media_type(:integrations, options)
180
- boolean_from_response :delete, "user/installations/#{installation}/repositories/#{repo}", opts
181
+ boolean_from_response :delete, "user/installations/#{installation}/repositories/#{repo}", options
181
182
  end
182
183
  alias remove_repo_from_installation remove_repository_from_app_installation
183
184
 
@@ -200,8 +201,7 @@ module Octokit
200
201
  #
201
202
  # @return [Sawyer::Resource] the total_count and an array of repositories
202
203
  def find_installation_repositories_for_user(installation, options = {})
203
- opts = ensure_api_media_type(:integrations, options)
204
- paginate("user/installations/#{installation}/repositories", opts) do |data, last_response|
204
+ paginate("user/installations/#{installation}/repositories", options) do |data, last_response|
205
205
  data.repositories.concat last_response.data.repositories
206
206
  end
207
207
  end
@@ -215,8 +215,7 @@ module Octokit
215
215
  #
216
216
  # @return [Boolean] Success
217
217
  def delete_installation(installation, options = {})
218
- opts = ensure_api_media_type(:uninstall_github_app, options)
219
- boolean_from_response :delete, "app/installations/#{installation}", opts
218
+ boolean_from_response :delete, "app/installations/#{installation}", options
220
219
  end
221
220
  end
222
221
  end
@@ -59,7 +59,7 @@ module Octokit
59
59
  # client = Octokit::Client.new(:login => 'ctshryock', :password => 'secret')
60
60
  # client.create_authorization({:idempotent => true, :client_id => 'xxxx', :client_secret => 'yyyy', :scopes => ["user"]})
61
61
  def create_authorization(options = {})
62
- # Techincally we can omit scopes as GitHub has a default, however the
62
+ # Technically we can omit scopes as GitHub has a default, however the
63
63
  # API will reject us if we send a POST request with an empty body.
64
64
  options = options.dup
65
65
  if options.delete :idempotent
@@ -23,7 +23,6 @@ module Octokit
23
23
  # check_run.head_sha # => "7638417db6d59f3c431d3e1f261cc637155684cd"
24
24
  # check_run.status # => "queued"
25
25
  def create_check_run(repo, name, head_sha, options = {})
26
- ensure_api_media_type(:checks, options)
27
26
  options[:name] = name
28
27
  options[:head_sha] = head_sha
29
28
 
@@ -41,8 +40,6 @@ module Octokit
41
40
  # check_run.id # => 51295429
42
41
  # check_run.status # => "in_progress"
43
42
  def update_check_run(repo, id, options = {})
44
- ensure_api_media_type(:checks, options)
45
-
46
43
  patch "#{Repository.path repo}/check-runs/#{id}", options
47
44
  end
48
45
 
@@ -63,8 +60,6 @@ module Octokit
63
60
  # result.check_runs[0].id # => 51295429
64
61
  # result.check_runs[0].status # => "in_progress"
65
62
  def check_runs_for_ref(repo, ref, options = {})
66
- ensure_api_media_type(:checks, options)
67
-
68
63
  get "#{Repository.path repo}/commits/#{ref}/check-runs", options
69
64
  end
70
65
  alias :list_check_runs_for_ref :check_runs_for_ref
@@ -86,8 +81,6 @@ module Octokit
86
81
  # result.check_runs[0].check_suite.id # => 50440400
87
82
  # result.check_runs[0].status # => "in_progress"
88
83
  def check_runs_for_check_suite(repo, id, options = {})
89
- ensure_api_media_type(:checks, options)
90
-
91
84
  get "#{Repository.path repo}/check-suites/#{id}/check-runs", options
92
85
  end
93
86
  alias :list_check_runs_for_check_suite :check_runs_for_check_suite
@@ -99,8 +92,6 @@ module Octokit
99
92
  # @return [Sawyer::Resource] A hash representing the check run
100
93
  # @see https://developer.github.com/v3/checks/runs/#get-a-single-check-run
101
94
  def check_run(repo, id, options = {})
102
- ensure_api_media_type(:checks, options)
103
-
104
95
  get "#{Repository.path repo}/check-runs/#{id}", options
105
96
  end
106
97
 
@@ -116,8 +107,6 @@ module Octokit
116
107
  # annotations[0].path # => "README.md"
117
108
  # annotations[0].message # => "Looks good!"
118
109
  def check_run_annotations(repo, id, options = {})
119
- ensure_api_media_type(:checks, options)
120
-
121
110
  get "#{Repository.path repo}/check-runs/#{id}/annotations", options
122
111
  end
123
112
 
@@ -132,8 +121,6 @@ module Octokit
132
121
  # @return [Sawyer::Resource] A hash representing the check suite
133
122
  # @see https://developer.github.com/v3/checks/suites/#get-a-single-check-suite
134
123
  def check_suite(repo, id, options = {})
135
- ensure_api_media_type(:checks, options)
136
-
137
124
  get "#{Repository.path repo}/check-suites/#{id}", options
138
125
  end
139
126
 
@@ -153,8 +140,6 @@ module Octokit
153
140
  # result.check_suites[0].id # => 50440400
154
141
  # result.check_suites[0].app.id # => 76765
155
142
  def check_suites_for_ref(repo, ref, options = {})
156
- ensure_api_media_type(:checks, options)
157
-
158
143
  get "#{Repository.path repo}/commits/#{ref}/check-suites", options
159
144
  end
160
145
  alias :list_check_suites_for_ref :check_suites_for_ref
@@ -172,8 +157,6 @@ module Octokit
172
157
  # result.preferences.auto_trigger_checks[0].setting # => false
173
158
  # result.repository.full_name # => "octocat/Hello-World"
174
159
  def set_check_suite_preferences(repo, options = {})
175
- ensure_api_media_type(:checks, options)
176
-
177
160
  patch "#{Repository.path repo}/check-suites/preferences", options
178
161
  end
179
162
 
@@ -188,7 +171,6 @@ module Octokit
188
171
  # check_suite.head_sha # => "7638417db6d59f3c431d3e1f261cc637155684cd"
189
172
  # check_suite.status # => "queued"
190
173
  def create_check_suite(repo, head_sha, options = {})
191
- ensure_api_media_type(:checks, options)
192
174
  options[:head_sha] = head_sha
193
175
 
194
176
  post "#{Repository.path repo}/check-suites", options
@@ -201,8 +183,6 @@ module Octokit
201
183
  # @return [Boolean] True if successful, raises an error otherwise
202
184
  # @see https://developer.github.com/v3/checks/suites/#rerequest-check-suite
203
185
  def rerequest_check_suite(repo, id, options = {})
204
- ensure_api_media_type(:checks, options)
205
-
206
186
  post "#{Repository.path repo}/check-suites/#{id}/rerequest", options
207
187
  true
208
188
  end
@@ -16,6 +16,8 @@ module Octokit
16
16
  # @see https://developer.github.com/v3/repos/contents/#get-the-readme
17
17
  # @example Get the readme file for a repo
18
18
  # Octokit.readme("octokit/octokit.rb")
19
+ # @example Get the readme file for a particular branch of the repo
20
+ # Octokit.readme("octokit/octokit.rb", :query => {:ref => 'some-other-branch'})
19
21
  def readme(repo, options={})
20
22
  get "#{Repository.path repo}/readme", options
21
23
  end
@@ -29,6 +31,8 @@ module Octokit
29
31
  # @see https://developer.github.com/v3/repos/contents/#get-contents
30
32
  # @example List the contents of lib/octokit.rb
31
33
  # Octokit.contents("octokit/octokit.rb", :path => 'lib/octokit.rb')
34
+ # @example Lists the contents of lib /octokit.rb on a particular branch
35
+ # Octokit.contents("octokit/octokit.rb", :path => 'lib/octokit.rb', :query => {:ref => 'some-other-branch'})
32
36
  def contents(repo, options={})
33
37
  options = options.dup
34
38
  repo_path = options.delete :path
@@ -43,6 +43,16 @@ module Octokit
43
43
  post("#{Repository.path repo}/deployments", options)
44
44
  end
45
45
 
46
+ # Delete a Deployment
47
+ #
48
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
49
+ # @param deployment_id [Integer, String, Repository, Hash] A GitHub repository
50
+ # @return [No Content]
51
+ # @see https://developer.github.com/v3/repos/deployments/#delete-a-deployment
52
+ def delete_deployment(repo, deployment_id, options = {})
53
+ delete("#{Repository.path repo}/deployments/#{deployment_id}", options)
54
+ end
55
+
46
56
  # List all statuses for a Deployment
47
57
  #
48
58
  # @param deployment_url [String] A URL for a deployment resource
@@ -62,7 +62,7 @@ module Octokit
62
62
  #
63
63
  # Applications can revoke (delete) a token
64
64
  #
65
- # @param token [String] 40 character GitHub OAuth access token
65
+ # @param access_token [String] 40 character GitHub OAuth access token
66
66
  #
67
67
  # @return [Boolean] Result
68
68
  # @see https://developer.github.com/v3/apps/oauth_applications/#delete-an-app-token
@@ -93,7 +93,7 @@ module Octokit
93
93
  #
94
94
  # OAuth application owners can revoke a grant for their OAuth application and a specific user.
95
95
  #
96
- # @param accces_token [String] 40 character GitHub OAuth access token
96
+ # @param access_token [String] 40 character GitHub OAuth access token
97
97
  #
98
98
  # @return [Boolean] Result
99
99
  # @see https://developer.github.com/v3/apps/oauth_applications/#delete-an-app-token
@@ -236,7 +236,7 @@ module Octokit
236
236
  # @example
237
237
  # @client.outside_collaborators('github')
238
238
  def outside_collaborators(org, options={})
239
- get "#{Organization.path org}/outside_collaborators", options
239
+ paginate "#{Organization.path org}/outside_collaborators", options
240
240
  end
241
241
 
242
242
  # Remove outside collaborator from an organization
@@ -690,7 +690,7 @@ module Octokit
690
690
 
691
691
  # Edit an organization membership
692
692
  #
693
- # @param org [String] Organization GitHub login.
693
+ # @param org [String, Integer] Organization GitHub login or id.
694
694
  # @option options [String] :role The role of the user in the organization.
695
695
  # @option options [String] :state The state that the membership should be in.
696
696
  # @option options [String] :user The login of the user, otherwise authenticated user.
@@ -701,7 +701,7 @@ module Octokit
701
701
  options = options.dup
702
702
  if user = options.delete(:user)
703
703
  options.delete(:state)
704
- put "orgs/#{org}/memberships/#{user}", options
704
+ put "#{Organization.path(org)}/memberships/#{user}", options
705
705
  else
706
706
  options.delete(:role)
707
707
  patch "user/memberships/orgs/#{org}", options
@@ -711,13 +711,13 @@ module Octokit
711
711
 
712
712
  # Remove an organization membership
713
713
  #
714
- # @param org [String] Organization GitHub login.
714
+ # @param org [String, Integer] Organization GitHub login or id.
715
715
  # @return [Boolean] Success
716
716
  # @see https://developer.github.com/v3/orgs/members/#remove-organization-membership
717
717
  def remove_organization_membership(org, options = {})
718
718
  options = options.dup
719
719
  user = options.delete(:user)
720
- user && boolean_from_response(:delete, "orgs/#{org}/memberships/#{user}", options)
720
+ user && boolean_from_response(:delete, "#{Organization.path(org)}/memberships/#{user}", options)
721
721
  end
722
722
  alias :remove_org_membership :remove_organization_membership
723
723
 
@@ -735,7 +735,7 @@ module Octokit
735
735
  def start_migration(org, repositories, options = {})
736
736
  options = ensure_api_media_type(:migrations, options)
737
737
  options[:repositories] = repositories
738
- post "orgs/#{org}/migrations", options
738
+ post "#{Organization.path(org)}/migrations", options
739
739
  end
740
740
 
741
741
  # Lists the most recent migrations.
@@ -747,7 +747,7 @@ module Octokit
747
747
  # @see https://developer.github.com/v3/orgs/migrations/#get-a-list-of-migrations
748
748
  def migrations(org, options = {})
749
749
  options = ensure_api_media_type(:migrations, options)
750
- paginate "orgs/#{org}/migrations", options
750
+ paginate "#{Organization.path(org)}/migrations", options
751
751
  end
752
752
 
753
753
  # Fetches the status of a migration.
@@ -759,7 +759,7 @@ module Octokit
759
759
  # @see https://developer.github.com/v3/orgs/migrations/#get-the-status-of-a-migration
760
760
  def migration_status(org, id, options = {})
761
761
  options = ensure_api_media_type(:migrations, options)
762
- get "orgs/#{org}/migrations/#{id}", options
762
+ get "#{Organization.path(org)}/migrations/#{id}", options
763
763
  end
764
764
 
765
765
  # Fetches the URL to a migration archive.
@@ -771,7 +771,7 @@ module Octokit
771
771
  # @see https://developer.github.com/v3/orgs/migrations/#download-a-migration-archive
772
772
  def migration_archive_url(org, id, options = {})
773
773
  options = ensure_api_media_type(:migrations, options)
774
- url = "orgs/#{org}/migrations/#{id}/archive"
774
+ url = "#{Organization.path(org)}/migrations/#{id}/archive"
775
775
 
776
776
  response = client_without_redirects(options).get(url)
777
777
  response.headers['location']
@@ -786,7 +786,7 @@ module Octokit
786
786
  # @see https://developer.github.com/v3/orgs/migrations/#delete-a-migration-archive
787
787
  def delete_migration_archive(org, id, options = {})
788
788
  options = ensure_api_media_type(:migrations, options)
789
- delete "orgs/#{org}/migrations/#{id}/archive", options
789
+ delete "#{Organization.path(org)}/migrations/#{id}/archive", options
790
790
  end
791
791
 
792
792
  # Unlock a previous migration archive.
@@ -799,7 +799,21 @@ module Octokit
799
799
  # @see https://developer.github.com/v3/orgs/migrations/#unlock-a-repository
800
800
  def unlock_repository(org, id, repo, options = {})
801
801
  options = ensure_api_media_type(:migrations, options)
802
- delete "orgs/#{org}/migrations/#{id}/repos/#{repo}/lock", options
802
+ delete "#{Organization.path(org)}/migrations/#{id}/repos/#{repo}/lock", options
803
+ end
804
+
805
+ # Get GitHub Actions billing for an organization
806
+ #
807
+ # Requires authenticated organization owner.
808
+ #
809
+ # @param org [String, Integer] Organization GitHub login or id.
810
+ # @return [Sawyer::Resource] Hash representing GitHub Actions billing for an organization.
811
+ # @see https://docs.github.com/en/rest/reference/billing#get-github-actions-billing-for-an-organization
812
+ #
813
+ # @example
814
+ # @client.billing_actions('github')
815
+ def billing_actions(org)
816
+ get "#{Organization.path(org)}/settings/billing/actions"
803
817
  end
804
818
  end
805
819
  end
@@ -23,6 +23,18 @@ module Octokit
23
23
  alias :references :refs
24
24
  alias :list_references :refs
25
25
 
26
+ # Fetch matching refs
27
+ #
28
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
29
+ # @param ref [String] The ref, e.g. <tt>tags/v0.0.3</tt> or <tt>heads/rails-3</tt>
30
+ # @return [Array<Sawyer::Resource>] The reference matching the given repo and the ref id
31
+ # @see https://developer.github.com/v3/git/refs/#list-matching-references
32
+ # @example Fetch refs matching tags/v2 for sferik/rails_admin
33
+ # Octokit.ref("sferik/rails_admin","tags/v2")
34
+ def matching_refs(repo, ref, options = {})
35
+ paginate "#{Repository.path repo}/git/matching-refs/#{ref}", options
36
+ end
37
+
26
38
  # Fetch a given reference
27
39
  #
28
40
  # @param repo [Integer, String, Repository, Hash] A GitHub repository
@@ -32,7 +32,7 @@ module Octokit
32
32
 
33
33
  # Edit a repository
34
34
  #
35
- # @see https://developer.github.com/v3/repos/#edit
35
+ # @see https://developer.github.com/v3/repos/#update-a-repository
36
36
  # @param repo [String, Hash, Repository] A GitHub repository
37
37
  # @param options [Hash] Repository information to update
38
38
  # @option options [String] :name Name of the repo
@@ -429,7 +429,7 @@ module Octokit
429
429
  # @example List topics for octokit/octokit.rb
430
430
  # Octokit.topics('octokit/octokit.rb')
431
431
  # @example List topics for octokit/octokit.rb
432
- # client.topics('octokit/octokit.rb')
432
+ # client.topics('octokit/octokit.rb')
433
433
  def topics(repo, options = {})
434
434
  opts = ensure_api_media_type(:topics, options)
435
435
  paginate "#{Repository.path repo}/topics", opts
@@ -586,14 +586,14 @@ module Octokit
586
586
  #
587
587
  # @param repo [Integer, String, Hash, Repository] A GitHub repository.
588
588
  # @param branch [String] Branch name
589
- # @option options [Hash] :required_status_checks If not null, the following keys are required:
590
- # <tt>:enforce_admins [boolean] Enforce required status checks for repository administrators.</tt>
591
- # <tt>:strict [boolean] Require branches to be up to date before merging.</tt>
592
- # <tt>:contexts [Array] The list of status checks to require in order to merge into this branch</tt>
589
+ # @option options [Hash] :required_status_checks If not null, the following keys are required:
590
+ # <tt>:enforce_admins [boolean] Enforce required status checks for repository administrators.</tt>
591
+ # <tt>:strict [boolean] Require branches to be up to date before merging.</tt>
592
+ # <tt>:contexts [Array] The list of status checks to require in order to merge into this branch</tt>
593
593
  #
594
594
  # @option options [Hash] :restrictions If not null, the following keys are required:
595
- # <tt>:users [Array] The list of user logins with push access</tt>
596
- # <tt>:teams [Array] The list of team slugs with push access</tt>.
595
+ # <tt>:users [Array] The list of user logins with push access</tt>
596
+ # <tt>:teams [Array] The list of team slugs with push access</tt>.
597
597
  #
598
598
  # Teams and users restrictions are only available for organization-owned repositories.
599
599
  # @return [Sawyer::Resource] The protected branch
@@ -640,6 +640,24 @@ module Octokit
640
640
  boolean_from_response :delete, "#{Repository.path repo}/branches/#{branch}/protection", opts
641
641
  end
642
642
 
643
+ # Rename a single branch from a repository
644
+ #
645
+ # Requires authenticated client
646
+ #
647
+ # @param repo [Integer, String, Hash, Repository] A GitHub repository.
648
+ # @param branch [String] Current branch name
649
+ # @param new_name [String] New branch name
650
+ # @return [Sawyer::Resource] The renamed branch
651
+ # @see https://developer.github.com/v3/repos/#rename-a-branch
652
+ # @example
653
+ # @client.rename_branch('octokit/octokit.rb', 'master', 'main')
654
+ def rename_branch(repo, branch, new_name, options = {})
655
+ params = {
656
+ new_name: new_name,
657
+ }
658
+ post "#{Repository.path repo}/branches/#{branch}/rename", params.merge(options)
659
+ end
660
+
643
661
  # List users available for assigning to issues.
644
662
  #
645
663
  # Requires authenticated client for private repos.
@@ -720,6 +738,62 @@ module Octokit
720
738
  def delete_subscription(repo, options = {})
721
739
  boolean_from_response :delete, "#{Repository.path repo}/subscription", options
722
740
  end
741
+
742
+ # Create a repository dispatch event
743
+ #
744
+ # @param repo [Integer, String, Hash, Repository] A GitHub repository.
745
+ # @param event_type [String] A custom webhook event name.
746
+ # @option options [Hash] :client_payload payload with extra information
747
+ # about the webhook event that your action or worklow may use.
748
+ #
749
+ # @return [Boolean] True if event was dispatched, false otherwise.
750
+ # @see https://developer.github.com/v3/repos/#create-a-repository-dispatch-event
751
+ def dispatch_event(repo, event_type, options = {})
752
+ boolean_from_response :post, "#{Repository.path repo}/dispatches", options.merge({ event_type: event_type })
753
+ end
754
+
755
+ # Check to see if vulnerability alerts are enabled for a repository
756
+ #
757
+ # The authenticated user must have admin access to the repository.
758
+ #
759
+ # @param repo [Integer, String, Hash, Repository] A GitHub repository.
760
+ # @return [Boolean] True if vulnerability alerts are enabled, false otherwise.
761
+ # @see https://docs.github.com/en/rest/reference/repos#check-if-vulnerability-alerts-are-enabled-for-a-repository
762
+ #
763
+ # @example
764
+ # @client.vulnerability_alerts_enabled?("octokit/octokit.rb")
765
+ def vulnerability_alerts_enabled?(repo, options = {})
766
+ opts = ensure_api_media_type(:vulnerability_alerts, options)
767
+ boolean_from_response(:get, "#{Repository.path repo}/vulnerability-alerts", opts)
768
+ end
769
+
770
+ # Enable vulnerability alerts for a repository
771
+ #
772
+ # @param repo [Integer, String, Hash, Repository] A GitHub repository.
773
+ # @param options [Hash]
774
+ #
775
+ # @return [Boolean] True if vulnerability alerts enabled, false otherwise.
776
+ # @see https://docs.github.com/en/rest/reference/repos#enable-vulnerability-alerts
777
+ # @example Enable vulnerability alerts for a repository
778
+ # @client.enable_vulnerability_alerts("octokit/octokit.rb")
779
+ def enable_vulnerability_alerts(repo, options = {})
780
+ opts = ensure_api_media_type(:vulnerability_alerts, options)
781
+ boolean_from_response(:put, "#{Repository.path repo}/vulnerability-alerts", opts)
782
+ end
783
+
784
+ # Disable vulnerability alerts for a repository
785
+ #
786
+ # @param repo [Integer, String, Hash, Repository] A GitHub repository.
787
+ # @param options [Hash]
788
+ #
789
+ # @return [Boolean] True if vulnerability alerts disabled, false otherwise.
790
+ # @see https://docs.github.com/en/rest/reference/repos#disable-vulnerability-alerts
791
+ # @example Disable vulnerability alerts for a repository
792
+ # @client.disable_vulnerability_alerts("octokit/octokit.rb")
793
+ def disable_vulnerability_alerts(repo, options = {})
794
+ opts = ensure_api_media_type(:vulnerability_alerts, options)
795
+ boolean_from_response(:delete, "#{Repository.path repo}/vulnerability-alerts", opts)
796
+ end
723
797
  end
724
798
  end
725
799
  end
@@ -340,6 +340,92 @@ module Octokit
340
340
  end
341
341
  alias :watched :subscriptions
342
342
 
343
+ # Initiates the generation of a migration archive.
344
+ #
345
+ # Requires authenticated user.
346
+ #
347
+ # @param repositories [Array<String>] :repositories Repositories for the organization.
348
+ # @option options [Boolean, optional] :lock_repositories Indicates whether repositories should be locked during migration
349
+ # @option options [Boolean, optional] :exclude_attachments Exclude attachments fro the migration data
350
+ # @return [Sawyer::Resource] Hash representing the new migration.
351
+ # @example
352
+ # @client.start_migration(['octocat/hello-world'])
353
+ # @see https://docs.github.com/en/rest/reference/migrations#start-a-user-migration
354
+ def start_user_migration(repositories, options = {})
355
+ options = ensure_api_media_type(:migrations, options)
356
+ options[:repositories] = repositories
357
+ post "user/migrations", options
358
+ end
359
+
360
+ # Lists the most recent migrations.
361
+ #
362
+ # Requires authenticated user.
363
+ #
364
+ # @return [Array<Sawyer::Resource>] Array of migration resources.
365
+ # @see https://docs.github.com/en/rest/reference/migrations#list-user-migrations
366
+ def user_migrations(options = {})
367
+ options = ensure_api_media_type(:migrations, options)
368
+ paginate "user/migrations", options
369
+ end
370
+
371
+ # Fetches the status of a migration.
372
+ #
373
+ # Requires authenticated user.
374
+ #
375
+ # @param id [Integer] ID number of the migration.
376
+ # @see https://docs.github.com/en/rest/reference/migrations#get-a-user-migration-status
377
+ def user_migration_status(id, options = {})
378
+ options = ensure_api_media_type(:migrations, options)
379
+ get "user/migrations/#{id}", options
380
+ end
381
+
382
+ # Fetches the URL to a migration archive.
383
+ #
384
+ # Requires authenticated user.
385
+ #
386
+ # @param id [Integer] ID number of the migration.
387
+ # @see https://docs.github.com/en/rest/reference/migrations#download-a-user-migration-archive
388
+ def user_migration_archive_url(id, options = {})
389
+ options = ensure_api_media_type(:migrations, options)
390
+ url = "user/migrations/#{id}/archive"
391
+
392
+ response = client_without_redirects(options).get(url)
393
+ response.headers['location']
394
+ end
395
+
396
+ # Deletes a previous migration archive.
397
+ #
398
+ # Requires authenticated user.
399
+ #
400
+ # @param id [Integer] ID number of the migration.
401
+ # @see https://docs.github.com/en/rest/reference/migrations#delete-a-user-migration-archive
402
+ def delete_user_migration_archive(id, options = {})
403
+ options = ensure_api_media_type(:migrations, options)
404
+ delete "user/migrations/#{id}/archive", options
405
+ end
406
+
407
+ # List repositories for a user migration.
408
+ #
409
+ # Requires authenticated user.
410
+ #
411
+ # @param id [Integer] ID number of the migration.
412
+ # @see https://docs.github.com/en/rest/reference/migrations#list-repositories-for-a-user-migration
413
+ def user_migration_repositories(id, options = {})
414
+ options = ensure_api_media_type(:migrations, options)
415
+ get "user/migrations/#{id}/repositories", options
416
+ end
417
+
418
+ # Unlock a user repository which has been locked by a migration.
419
+ #
420
+ # Requires authenticated user.
421
+ #
422
+ # @param id [Integer] ID number of the migration.
423
+ # @param repo [String] Name of the repository.
424
+ # @see https://docs.github.com/en/rest/reference/migrations#unlock-a-user-repository
425
+ def unlock_user_repository(id, repo, options = {})
426
+ options = ensure_api_media_type(:migrations, options)
427
+ delete "user/migrations/#{id}/repos/#{repo}/lock", options
428
+ end
343
429
  end
344
430
 
345
431
  private
@@ -155,6 +155,9 @@ module Octokit
155
155
 
156
156
  @last_response = response = agent.call(method, Addressable::URI.parse(path.to_s).normalize.to_s, data, options)
157
157
  response.data
158
+ rescue Octokit::Error => error
159
+ @last_response = nil
160
+ raise error
158
161
  end
159
162
 
160
163
  # Executes the request, checking if it was successful
@@ -162,7 +165,7 @@ module Octokit
162
165
  # @return [Boolean] True on success, false otherwise
163
166
  def boolean_from_response(method, path, options = {})
164
167
  request(method, path, options)
165
- @last_response.status == 204
168
+ [201, 202, 204].include? @last_response.status
166
169
  rescue Octokit::NotFound
167
170
  false
168
171
  end
@@ -177,12 +180,12 @@ module Octokit
177
180
  conn_opts[:proxy] = @proxy if @proxy
178
181
  if conn_opts[:ssl].nil?
179
182
  conn_opts[:ssl] = { :verify_mode => @ssl_verify_mode } if @ssl_verify_mode
180
- else
181
- if @connection_options[:ssl][:verify] == false
182
- conn_opts[:ssl] = { :verify_mode => 0}
183
- else
184
- conn_opts[:ssl] = { :verify_mode => @ssl_verify_mode }
185
- end
183
+ else
184
+ verify = @connection_options[:ssl][:verify]
185
+ conn_opts[:ssl] = {
186
+ :verify => verify,
187
+ :verify_mode => verify == false ? 0 : @ssl_verify_mode
188
+ }
186
189
  end
187
190
  opts[:faraday] = Faraday.new(conn_opts)
188
191
 
data/lib/octokit/error.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module Octokit
2
2
  # Custom error class for rescuing from all GitHub errors
3
3
  class Error < StandardError
4
-
4
+ attr_reader :context
5
5
  # Returns the appropriate Octokit::Error subclass based
6
6
  # on status and response message
7
7
  #
@@ -21,7 +21,7 @@ module Octokit
21
21
  when 406 then Octokit::NotAcceptable
22
22
  when 409 then Octokit::Conflict
23
23
  when 415 then Octokit::UnsupportedMediaType
24
- when 422 then Octokit::UnprocessableEntity
24
+ when 422 then error_for_422(body)
25
25
  when 451 then Octokit::UnavailableForLegalReasons
26
26
  when 400..499 then Octokit::ClientError
27
27
  when 500 then Octokit::InternalServerError
@@ -34,9 +34,16 @@ module Octokit
34
34
  end
35
35
  end
36
36
 
37
+ def build_error_context
38
+ if RATE_LIMITED_ERRORS.include?(self.class)
39
+ @context = Octokit::RateLimit.from_response(@response)
40
+ end
41
+ end
42
+
37
43
  def initialize(response=nil)
38
44
  @response = response
39
45
  super(build_error_message)
46
+ build_error_context
40
47
  end
41
48
 
42
49
  # Documentation URL returned by the API for some errors
@@ -77,6 +84,8 @@ module Octokit
77
84
  Octokit::BillingIssue
78
85
  elsif body =~ /Resource protected by organization SAML enforcement/i
79
86
  Octokit::SAMLProtected
87
+ elsif body =~ /suspended your access|This installation has been suspended/i
88
+ Octokit::InstallationSuspended
80
89
  else
81
90
  Octokit::Forbidden
82
91
  end
@@ -92,6 +101,18 @@ module Octokit
92
101
  end
93
102
  end
94
103
 
104
+ # Return most appropriate error for 422 HTTP status code
105
+ # @private
106
+ def self.error_for_422(body)
107
+ if body =~ /PullRequestReviewComment/i && body =~ /(commit_id|end_commit_oid) is not part of the pull request/i
108
+ Octokit::CommitIsNotPartOfPullRequest
109
+ elsif body =~ /Path diff too large/i
110
+ Octokit::PathDiffTooLarge
111
+ else
112
+ Octokit::UnprocessableEntity
113
+ end
114
+ end
115
+
95
116
  # Array of validation errors
96
117
  # @return [Array<Hash>] Error info
97
118
  def errors
@@ -265,6 +286,10 @@ module Octokit
265
286
  # and body matches 'Resource protected by organization SAML enforcement'
266
287
  class SAMLProtected < Forbidden; end
267
288
 
289
+ # Raised when GitHub returns a 403 HTTP status code
290
+ # and body matches 'suspended your access'
291
+ class InstallationSuspended < Forbidden; end
292
+
268
293
  # Raised when GitHub returns a 404 HTTP status code
269
294
  class NotFound < ClientError; end
270
295
 
@@ -287,6 +312,14 @@ module Octokit
287
312
  # Raised when GitHub returns a 422 HTTP status code
288
313
  class UnprocessableEntity < ClientError; end
289
314
 
315
+ # Raised when GitHub returns a 422 HTTP status code
316
+ # and body matches 'PullRequestReviewComment' and 'commit_id (or end_commit_oid) is not part of the pull request'
317
+ class CommitIsNotPartOfPullRequest < UnprocessableEntity; end
318
+
319
+ # Raised when GitHub returns a 422 HTTP status code and body matches 'Path diff too large'.
320
+ # It could occur when attempting to post review comments on a "too large" file.
321
+ class PathDiffTooLarge < UnprocessableEntity; end
322
+
290
323
  # Raised when GitHub returns a 451 HTTP status code
291
324
  class UnavailableForLegalReasons < ClientError; end
292
325
 
@@ -315,4 +348,5 @@ module Octokit
315
348
  # Raised when a repository is created with an invalid format
316
349
  class InvalidRepository < ArgumentError; end
317
350
 
351
+ RATE_LIMITED_ERRORS = [Octokit::TooManyRequests, Octokit::AbuseDetected]
318
352
  end
@@ -6,7 +6,6 @@ module Octokit
6
6
  PREVIEW_TYPES = {
7
7
  :applications_api => 'application/vnd.github.doctor-strange-preview+json'.freeze,
8
8
  :branch_protection => 'application/vnd.github.luke-cage-preview+json'.freeze,
9
- :checks => 'application/vnd.github.antiope-preview+json'.freeze,
10
9
  :commit_search => 'application/vnd.github.cloak-preview+json'.freeze,
11
10
  :commit_pulls => 'application/vnd.github.groot-preview+json'.freeze,
12
11
  :commit_branches => 'application/vnd.github.groot-preview+json'.freeze,
@@ -20,14 +19,12 @@ module Octokit
20
19
  :pages => 'application/vnd.github.mister-fantastic-preview+json'.freeze,
21
20
  :projects => 'application/vnd.github.inertia-preview+json'.freeze,
22
21
  :traffic => 'application/vnd.github.spiderman-preview'.freeze,
23
- :integrations => 'application/vnd.github.machine-man-preview+json'.freeze,
24
22
  :topics => 'application/vnd.github.mercy-preview+json'.freeze,
25
23
  :community_profile => 'application/vnd.github.black-panther-preview+json'.freeze,
26
24
  :strict_validation => 'application/vnd.github.speedy-preview+json'.freeze,
27
- :drafts => 'application/vnd.github.shadow-cat-preview'.freeze,
28
25
  :template_repositories => 'application/vnd.github.baptiste-preview+json'.freeze,
29
- :uninstall_github_app => 'application/vnd.github.gambit-preview+json'.freeze,
30
26
  :project_card_events => 'application/vnd.github.starfox-preview+json'.freeze,
27
+ :vulnerability_alerts => 'application/vnd.github.dorian-preview+json'.freeze,
31
28
  }
32
29
 
33
30
  def ensure_api_media_type(type, options)
@@ -20,7 +20,7 @@ module Octokit
20
20
  # @return [RateLimit]
21
21
  def self.from_response(response)
22
22
  info = new
23
- if response && !response.headers.nil?
23
+ if response && response.respond_to?(:headers) && !response.headers.nil?
24
24
  info.limit = (response.headers['X-RateLimit-Limit'] || 1).to_i
25
25
  info.remaining = (response.headers['X-RateLimit-Remaining'] || 1).to_i
26
26
  info.resets_at = Time.at((response.headers['X-RateLimit-Reset'] || Time.now).to_i)
@@ -7,8 +7,6 @@ module Octokit
7
7
  # Parses RSS and Atom feed responses.
8
8
  class FeedParser < Faraday::Response::Middleware
9
9
 
10
- private
11
-
12
10
  def on_complete(env)
13
11
  if env[:response_headers]["content-type"] =~ /(\batom|\brss)/
14
12
  require 'rss'
@@ -9,8 +9,6 @@ module Octokit
9
9
  # HTTP status codes returned by the API
10
10
  class RaiseError < Faraday::Response::Middleware
11
11
 
12
- private
13
-
14
12
  def on_complete(response)
15
13
  if error = Octokit::Error.from_response(response)
16
14
  raise error
@@ -5,7 +5,7 @@ module Octokit
5
5
 
6
6
  # Current minor release.
7
7
  # @return [Integer]
8
- MINOR = 18
8
+ MINOR = 21
9
9
 
10
10
  # Current patch level.
11
11
  # @return [Integer]
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.18.0
4
+ version: 4.21.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: 2020-03-25 00:00:00.000000000 Z
13
+ date: 2021-04-26 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler
@@ -85,6 +85,9 @@ files:
85
85
  - lib/octokit/arguments.rb
86
86
  - lib/octokit/authentication.rb
87
87
  - lib/octokit/client.rb
88
+ - lib/octokit/client/actions_secrets.rb
89
+ - lib/octokit/client/actions_workflow_runs.rb
90
+ - lib/octokit/client/actions_workflows.rb
88
91
  - lib/octokit/client/apps.rb
89
92
  - lib/octokit/client/authorizations.rb
90
93
  - lib/octokit/client/checks.rb