octokit 4.18.0 → 4.19.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: 9801b25dfdd07e517b87bdc1404ffa64fd12496b66af8bb8bc4af57f6f33483f
4
+ data.tar.gz: b082dcc32f514846b53da5aaafe7666020c9de8d590dafb6e93743767a70573b
5
5
  SHA512:
6
- metadata.gz: 61f2200517ff1f3f805926d3ce20b3155429e77d6e35ef89ebc0b1e2a826064e658bcc9f32c368cd89618677fa9c1b14d65668b6083ebba56ab36375e605a035
7
- data.tar.gz: 8bf0ef345c8f3850196d8a2695b5ae9a3f2d90a7c63e9e02944c2876bf381613bb2fd0ecd5c3b11a4aaba75e22d5345269d1ad324c777224b4c65ec4f27eaf4a
6
+ metadata.gz: 16595560313f6346448710adf2a0d641fe62521089ff017aff1c2f1dc6dd1d5dc06d8397e552a098cf1a6ada91edfa111863d9c4491df86d3d38d3143531a7b5
7
+ data.tar.gz: 7dc816349c9050b31e0c0d09a7e1e25b6d455d59f6ae817db2f46b16900104bcdff15d3f280352e7bcb0ca195060824094ebe09ea022c3e46b52c8f559c0cc5b
@@ -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
@@ -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,94 @@
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
+ # Get a download url for archived log files of 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 [String] URL to the archived log files of the run
74
+ # @see https://developer.github.com/v3/actions/workflow-runs/#download-workflow-run-logs
75
+ def workflow_run_logs(repo, id, options = {})
76
+ url = "#{Repository.path repo}/actions/runs/#{id}/logs"
77
+
78
+ response = client_without_redirects.head(url, options)
79
+ response.headers['Location']
80
+ end
81
+
82
+ # Delets all log files of a workflow run
83
+ #
84
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
85
+ # @param id [Integer] Id of a workflow run
86
+ #
87
+ # @return [Boolean] Returns true if the logs are deleted
88
+ # @see https://developer.github.com/v3/actions/workflow-runs/#delete-workflow-run-logs
89
+ def delete_workflow_run_logs(repo, id, options = {})
90
+ boolean_from_response :delete, "#{Repository.path repo}/actions/runs/#{id}/logs", options
91
+ end
92
+ end
93
+ end
94
+ 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,18 @@ 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
+ opts = ensure_api_media_type(:integrations, options)
16
+ get "app", opts
17
+ end
18
+
7
19
  # Find all installations that belong to an App
8
20
  #
9
21
  # @param options [Hash] A customizable set of options
@@ -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
@@ -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
@@ -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,7 @@ 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
803
  end
804
804
  end
805
805
  end
@@ -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
@@ -720,6 +720,19 @@ module Octokit
720
720
  def delete_subscription(repo, options = {})
721
721
  boolean_from_response :delete, "#{Repository.path repo}/subscription", options
722
722
  end
723
+
724
+ # Create a repository dispatch event
725
+ #
726
+ # @param repo [Integer, String, Hash, Repository] A GitHub repository.
727
+ # @param event_type [String] A custom webhook event name.
728
+ # @option options [Hash] :client_payload payload with extra information
729
+ # about the webhook event that your action or worklow may use.
730
+ #
731
+ # @return [Boolean] True if event was dispatched, false otherwise.
732
+ # @see https://developer.github.com/v3/repos/#create-a-repository-dispatch-event
733
+ def dispatch_event(repo, event_type, options = {})
734
+ boolean_from_response :post, "#{Repository.path repo}/dispatches", options.merge({ event_type: event_type })
735
+ end
723
736
  end
724
737
  end
725
738
  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
 
@@ -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
  #
@@ -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/i
88
+ Octokit::InstallationSuspended
80
89
  else
81
90
  Octokit::Forbidden
82
91
  end
@@ -265,6 +274,10 @@ module Octokit
265
274
  # and body matches 'Resource protected by organization SAML enforcement'
266
275
  class SAMLProtected < Forbidden; end
267
276
 
277
+ # Raised when GitHub returns a 403 HTTP status code
278
+ # and body matches 'suspended your access'
279
+ class InstallationSuspended < Forbidden; end
280
+
268
281
  # Raised when GitHub returns a 404 HTTP status code
269
282
  class NotFound < ClientError; end
270
283
 
@@ -315,4 +328,5 @@ module Octokit
315
328
  # Raised when a repository is created with an invalid format
316
329
  class InvalidRepository < ArgumentError; end
317
330
 
331
+ RATE_LIMITED_ERRORS = [Octokit::TooManyRequests, Octokit::AbuseDetected]
318
332
  end
@@ -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)
@@ -5,7 +5,7 @@ module Octokit
5
5
 
6
6
  # Current minor release.
7
7
  # @return [Integer]
8
- MINOR = 18
8
+ MINOR = 19
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.19.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: 2020-10-20 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