octokit 8.1.0 → 9.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dead7bdb61143c1a0b84afa0b02b567a29e117b0b15e0d0ee10271bb9dc62a17
4
- data.tar.gz: 648cb60f5d7f8765f925ec2a673dd00331151d3222b392a9814e856e6d303a67
3
+ metadata.gz: f755fdeae0b35f76932ffa267d2d73e01b5d137f5f740d8e80106fc6c0bcb226
4
+ data.tar.gz: 473dc0bee0251cb20935bc9e2160e7e92b851271dc67010bda79a94bef8adb68
5
5
  SHA512:
6
- metadata.gz: 9b5d2d09d0665466a4bdca1d523758ad447db67c911284c2738a311c400267dbbabcf4c92079c83550339b1cd5361abe841a672a89bc77a7345940d3041cee65
7
- data.tar.gz: ca2ced14c1bb869c41f94806427fbd16917eadd6486c35c58c69c59c44b384c323b282266ae95b84bd6109674051a963d6b2d1fea15609bbc61c033a55b6e90f
6
+ metadata.gz: 51f43e8ac4d7082309ce0e673fa0c948f5ff62e5982a2079cec57639a047be09a12a443788993929d3ab82ec6998ed49ceaa479b5d8b3fe5deef04e29549672d
7
+ data.tar.gz: bfcc814b67b08b256832fb7d168166082289a6281caa0ec81fc98ce03d376d976037e5c99c72e63d9f1440c0d1e1e5bac1c925a0fe5db6ef3d0cae7aa63e56b5
data/README.md CHANGED
@@ -81,7 +81,7 @@ Install via Rubygems
81
81
 
82
82
  ... or add to your Gemfile
83
83
 
84
- gem "octokit", "~> 5.0"
84
+ gem "octokit"
85
85
 
86
86
  Access the library in Ruby:
87
87
 
@@ -709,6 +709,9 @@ Octokit:
709
709
  | `OCTOKIT_TEST_GITHUB_ENTERPRISE_MANAGEMENT_CONSOLE_PASSWORD` | GitHub Enterprise management console password. |
710
710
  | `OCTOKIT_TEST_GITHUB_ENTERPRISE_ENDPOINT` | GitHub Enterprise hostname. |
711
711
  | `OCTOKIT_TEST_GITHUB_ENTERPRISE_MANAGEMENT_CONSOLE_ENDPOINT` | GitHub Enterprise Management Console endpoint. |
712
+ | `OCTOKIT_TEST_GITHUB_MANAGE_GHES_ENDPOINT` | GitHub Enterprise Server GHES Manage Endpoint. |
713
+ | `OCTOKIT_TEST_GITHUB_MANAGE_GHES_USERNAME` | GitHub Enterprise Server GHES Manage Username. |
714
+ | `OCTOKIT_TEST_GITHUB_MANAGE_GHES_PASSWORD` | GitHub Enterprise Server GHES Manage Password. |
712
715
  | `OCTOKIT_TEST_GITHUB_INTEGRATION` | [GitHub Integration](https://developer.github.com/early-access/integrations/) owned by your test organization. |
713
716
  | `OCTOKIT_TEST_GITHUB_INTEGRATION_INSTALLATION` | Installation of the GitHub Integration specified above. |
714
717
  | `OCTOKIT_TEST_INTEGRATION_PEM_KEY` | File path to the private key generated from your integration. |
@@ -738,6 +741,7 @@ implementations:
738
741
  * Ruby 3.0
739
742
  * Ruby 3.1
740
743
  * Ruby 3.2
744
+ * Ruby 3.3
741
745
 
742
746
  If something doesn't work on one of these Ruby versions, it's a bug.
743
747
 
@@ -8,7 +8,7 @@ module Octokit
8
8
 
9
9
  def initialize(args)
10
10
  @options = args.last.is_a?(::Hash) ? args.pop : {}
11
- super(args)
11
+ super
12
12
  end
13
13
  end
14
14
  end
@@ -231,6 +231,18 @@ module Octokit
231
231
  end
232
232
  end
233
233
 
234
+ # Returns a delivery for the webhook configured for a GitHub App.
235
+ #
236
+ # @param delivery_id [String] The id of a GitHub App Hook Delivery
237
+ # @param options [Hash] A customizable set of options
238
+ #
239
+ # @see https://docs.github.com/en/rest/apps/webhooks#get-a-delivery-for-an-app-webhook
240
+ #
241
+ # @return [<Sawyer::Resource>] The webhook delivery
242
+ def app_hook_delivery(delivery_id, options = {})
243
+ get "/app/hook/deliveries/#{delivery_id}", options
244
+ end
245
+
234
246
  # Redeliver a delivery for the webhook configured for a GitHub App.
235
247
  #
236
248
  # @param delivery_id [Integer] The id of a GitHub App Hook Delivery
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'base64'
4
3
  require 'tempfile'
5
4
  require 'zlib'
6
5
 
@@ -10,6 +9,144 @@ module Octokit
10
9
  #
11
10
  # @see https://docs.github.com/rest/code-scanning
12
11
  module CodeScanning
12
+ # Updates a code scanning default setup configuration
13
+ #
14
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
15
+ # @param state [String] The desired state of code scanning default setup
16
+ # @param query_suite [String] CodeQL query suite to be used
17
+ # @param languages [Array] List of CodeQL languages to be analyzed
18
+ #
19
+ # @return [Sawyer::Resource] Action Run information
20
+ # @see https://docs.github.com/en/rest/code-scanning/code-scanning#update-a-code-scanning-default-setup-configuration
21
+ def update_code_scanning_default_config(repo, state, query_suite = nil, languages = nil, options = {})
22
+ options[:state] = state
23
+ options[:query_suite] = query_suite if query_suite
24
+ options[:languages] = languages if languages
25
+
26
+ patch "#{Repository.path repo}/code-scanning/default-setup", options
27
+ end
28
+
29
+ # Get Code Scanning Default Configuration
30
+ #
31
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
32
+ #
33
+ # @return [Sawyer::Resource] CodeQl Default Setup Configuration Information
34
+ # @see https://docs.github.com/en/rest/code-scanning/code-scanning#get-a-code-scanning-default-setup-configuration
35
+ def get_code_scanning_default_config(repo, options = {})
36
+ get "#{Repository.path repo}/code-scanning/default-setup", options
37
+ end
38
+
39
+ # Gets a CodeQL database for a language in a repository
40
+ #
41
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
42
+ # @param language [String]
43
+ #
44
+ # @return [Sawyer::Resource] CodeQl Default Setup Configuration Information
45
+ # @see https://docs.github.com/en/rest/code-scanning/code-scanning#get-a-codeql-database-for-a-repository
46
+ def get_codeql_database_for_repo(repo, language, options = {})
47
+ get "#{Repository.path repo}/code-scanning/codeql/databases/#{language}", options
48
+ end
49
+
50
+ # Lists the CodeQL databases that are available in a repository
51
+ #
52
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
53
+ #
54
+ # @return [Array] List of CodeQL Databases
55
+ # @see https://docs.github.com/en/rest/code-scanning/code-scanning#list-codeql-databases-for-a-repository
56
+ def list_codeql_database_for_repo(repo, options = {})
57
+ get "#{Repository.path repo}/code-scanning/codeql/databases", options
58
+ end
59
+
60
+ # Delete a specified code scanning analysis from a repository
61
+ #
62
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
63
+ # @param analysis_id [Integer] ID of the code scanning analysis
64
+ #
65
+ # @return [Sawyer::Resource] Next Code Scanning Analysis Information
66
+ # @see https://docs.github.com/en/rest/code-scanning/code-scanning#delete-a-code-scanning-analysis-from-a-repository
67
+ def delete_code_scanning_analysis(repo, analysis_id, options = {})
68
+ delete "#{Repository.path repo}/code-scanning/analyses/#{analysis_id}", options
69
+ end
70
+
71
+ # Get a code scanning analysis for a repository
72
+ #
73
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
74
+ # @param analysis_id [Integer] ID of the code scanning analysis
75
+ #
76
+ # @return [Sawyer::Resource] Code Scanning Analysis
77
+ # @see https://docs.github.com/en/rest/code-scanning/code-scanning#get-a-code-scanning-analysis-for-a-repository
78
+ def get_code_scanning_analysis(repo, analysis_id, options = {})
79
+ get "#{Repository.path repo}/code-scanning/analyses/#{analysis_id}", options
80
+ end
81
+
82
+ # List code scanning analyses for a repository
83
+ #
84
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
85
+ #
86
+ # @return [Array] List of Code Scanning Analyses
87
+ # @see https://docs.github.com/en/rest/code-scanning/code-scanning#list-code-scanning-analyses-for-a-repository
88
+ def list_code_scanning_analysis(repo, options = {})
89
+ paginate "#{Repository.path repo}/code-scanning/analyses", options
90
+ end
91
+
92
+ # List instances of a code scanning alert
93
+ #
94
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
95
+ # @param alert_number [Integer] The number that identifies an alert
96
+ #
97
+ # @return [Array] List of Code Scanning Alerts
98
+ # @see https://docs.github.com/en/rest/code-scanning/code-scanning#list-instances-of-a-code-scanning-alert
99
+ def list_instances_of_code_scanning_alert(repo, alert_number, options = {})
100
+ paginate "#{Repository.path repo}/code-scanning/alerts/#{alert_number}/instances", options
101
+ end
102
+
103
+ # Update a code scanning alert
104
+ #
105
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
106
+ # @param alert_number [Integer] The number that identifies an alert
107
+ # @param state [String] The reason for dismissing or closing the alert. Required when the state is dismissed
108
+ #
109
+ # @return [Sawyer::Resource] Code Scanning Alert information
110
+ # @see https://docs.github.com/en/rest/code-scanning/code-scanning#update-a-code-scanning-alert
111
+ def update_code_scanning_alert(repo, alert_number, state, reason, comment = nil, options = {})
112
+ options[:state] = state
113
+ options[:dismissed_reason] = reason
114
+ options[:dismissed_comment] = comment if comment
115
+
116
+ patch "#{Repository.path repo}/code-scanning/alerts/#{alert_number}", options
117
+ end
118
+
119
+ # Gets a single code scanning alert
120
+ #
121
+ # @param repo [Integer, String, Repository, Hash] A GitHub repository
122
+ # @param alert_number [Integer] The number that identifies an alert
123
+ #
124
+ # @return [Sawyer::Resource] Code Scanning Alert
125
+ # @see https://docs.github.com/en/rest/code-scanning/code-scanning#get-a-code-scanning-alert
126
+ def get_code_scanning_alert(repo, alert_number, options = {})
127
+ get "#{Repository.path repo}/code-scanning/alerts/#{alert_number}", options
128
+ end
129
+
130
+ # List code scanning alerts for a repository
131
+ #
132
+ # @param org [String] A GitHub organization
133
+ #
134
+ # @return [Array] Code Scanning Alert information
135
+ # @see https://docs.github.com/en/rest/code-scanning/code-scanning#list-code-scanning-alerts-for-a-repository
136
+ def list_code_scanning_alerts_for_repo(repo, options = {})
137
+ paginate "#{Repository.path repo}/code-scanning/alerts", options
138
+ end
139
+
140
+ # List code scanning alerts for an organization
141
+ #
142
+ # @param org [String] A GitHub organization
143
+ #
144
+ # @return [Array] Code Scanning Alert information
145
+ # @see https://docs.github.com/en/rest/code-scanning/code-scanning#list-code-scanning-alerts-for-an-organization
146
+ def list_code_scanning_alerts_for_org(org, options = {})
147
+ paginate "orgs/#{org}/code-scanning/alerts", options
148
+ end
149
+
13
150
  # Uploads SARIF data containing the results of a code scanning analysis
14
151
  #
15
152
  # @param repo [Integer, String, Repository, Hash] A GitHub repository
@@ -45,7 +182,7 @@ module Octokit
45
182
  Zlib::GzipWriter.open(tempfile) do |gz_file|
46
183
  gz_file.write File.binread(file)
47
184
  end
48
- Base64.strict_encode64(tempfile.read)
185
+ [tempfile.read].pack('m0') # Base64.strict_encode64
49
186
  end
50
187
  end
51
188
  end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'base64'
4
-
5
3
  module Octokit
6
4
  class Client
7
5
  # Methods for the Repo Contents API
@@ -80,7 +78,7 @@ module Octokit
80
78
  end
81
79
  raise ArgumentError, 'content or :file option required' if content.nil?
82
80
 
83
- options[:content] = Base64.strict_encode64(content)
81
+ options[:content] = [content].pack('m0') # Base64.strict_encode64
84
82
  options[:message] = message
85
83
  url = "#{Repository.path repo}/contents/#{path}"
86
84
  put url, options
@@ -24,7 +24,10 @@ module Octokit
24
24
  # @return [Sawyer::Resource] Total count of environments and list of environments
25
25
  # @see https://docs.github.com/en/rest/deployments/environments#list-environments
26
26
  def environments(repo, options = {})
27
- get("#{Repository.path repo}/environments", options)
27
+ paginate("#{Repository.path repo}/environments", options) do |data, last_response|
28
+ data.environments.concat last_response.data.environments
29
+ data.total_count += last_response.data.total_count
30
+ end
28
31
  end
29
32
  alias list_environments environments
30
33
 
@@ -50,7 +50,6 @@ require 'octokit/client/objects'
50
50
  require 'octokit/client/organizations'
51
51
  require 'octokit/client/pages'
52
52
  require 'octokit/client/projects'
53
- require 'octokit/client/pub_sub_hubbub'
54
53
  require 'octokit/client/pull_requests'
55
54
  require 'octokit/client/rate_limit'
56
55
  require 'octokit/client/reactions'
@@ -118,7 +117,6 @@ module Octokit
118
117
  include Octokit::Client::Organizations
119
118
  include Octokit::Client::Pages
120
119
  include Octokit::Client::Projects
121
- include Octokit::Client::PubSubHubbub
122
120
  include Octokit::Client::PullRequests
123
121
  include Octokit::Client::RateLimit
124
122
  include Octokit::Client::Reactions
@@ -32,6 +32,12 @@ module Octokit
32
32
  # @return [String] An admin password set up for your GitHub Enterprise management console
33
33
  # @!attribute management_console_endpoint
34
34
  # @return [String] Base URL for API requests to the GitHub Enterprise management console
35
+ # @!attribute manage_ghes_endpoint
36
+ # @return [String] Base URL for API requests to the GitHub Enterprise Server Manage API
37
+ # @!attribute manage_ghes_username
38
+ # @return [String] API username for requests to the GitHub Enterprise Server Manage API
39
+ # @!attribute manage_ghes_password
40
+ # @return [String] API user password for requests to the GitHub Enterprise Server Manage API
35
41
  # @!attribute middleware
36
42
  # @see https://github.com/lostisland/faraday
37
43
  # @return [Faraday::Builder or Faraday::RackBuilder] Configure middleware for Faraday
@@ -59,7 +65,10 @@ module Octokit
59
65
  :middleware, :netrc, :netrc_file,
60
66
  :per_page, :proxy, :ssl_verify_mode, :user_agent
61
67
  attr_writer :password, :web_endpoint, :api_endpoint, :login,
62
- :management_console_endpoint, :management_console_password
68
+ :management_console_endpoint, :management_console_password,
69
+ :manage_ghes_endpoint,
70
+ :manage_ghes_username,
71
+ :manage_ghes_password
63
72
 
64
73
  class << self
65
74
  # List of configurable keys for {Octokit::Client}
@@ -77,6 +86,9 @@ module Octokit
77
86
  login
78
87
  management_console_endpoint
79
88
  management_console_password
89
+ manage_ghes_endpoint
90
+ manage_ghes_username
91
+ manage_ghes_password
80
92
  middleware
81
93
  netrc
82
94
  netrc_file
@@ -126,6 +138,10 @@ module Octokit
126
138
  File.join(@management_console_endpoint, '')
127
139
  end
128
140
 
141
+ def manage_ghes_endpoint
142
+ File.join(@manage_ghes_endpoint, '')
143
+ end
144
+
129
145
  # Base URL for generated web URLs
130
146
  #
131
147
  # @return [String] Default: https://github.com/
@@ -12,6 +12,11 @@ if Gem::Version.new(Faraday::VERSION) >= Gem::Version.new('2.0')
12
12
  rescue LoadError
13
13
  Octokit::Warnable.octokit_warn 'To use retry middleware with Faraday v2.0+, install `faraday-retry` gem'
14
14
  end
15
+ begin
16
+ require 'faraday/multipart'
17
+ rescue LoadError
18
+ Octokit::Warnable.octokit_warn 'To use multipart middleware with Faraday v2.0+, install `faraday-multipart` gem; note: this is used by the ManageGHES client for uploading licenses'
19
+ end
15
20
  end
16
21
 
17
22
  module Octokit
@@ -102,6 +107,24 @@ module Octokit
102
107
  ENV.fetch('OCTOKIT_ENTERPRISE_MANAGEMENT_CONSOLE_ENDPOINT', nil)
103
108
  end
104
109
 
110
+ # Default GHES Manage API endpoint from ENV
111
+ # @return [String]
112
+ def manage_ghes_endpoint
113
+ ENV.fetch('OCTOKIT_MANAGE_GHES_ENDPOINT', nil)
114
+ end
115
+
116
+ # Default GHES Manage API username from ENV
117
+ # @return [String]
118
+ def manage_ghes_username
119
+ ENV.fetch('OCTOKIT_MANAGE_GHES_USERNAME', nil)
120
+ end
121
+
122
+ # Default GHES Manage API password from ENV
123
+ # @return [String]
124
+ def manage_ghes_password
125
+ ENV.fetch('OCTOKIT_MANAGE_GHES_PASSWORD', nil)
126
+ end
127
+
105
128
  # Default options for Faraday::Connection
106
129
  # @return [Hash]
107
130
  def connection_options
@@ -14,6 +14,7 @@ module Octokit
14
14
  # @see https://docs.github.com/en/enterprise-server@3.4/rest/enterprise-admin/management-console#create-a-github-license
15
15
  # @return nil
16
16
  def upload_license(license, settings = nil)
17
+ octokit_warn('The Management Console API will be deprecated in GitHub Enterprise Server 3.14.0, please use the ManageGHES client instead.')
17
18
  conn = faraday_configuration
18
19
 
19
20
  params = {}
@@ -28,6 +29,7 @@ module Octokit
28
29
  #
29
30
  # @return nil
30
31
  def start_configuration
32
+ octokit_warn('The Management Console API will be deprecated in GitHub Enterprise Server 3.14.0, please use the ManageGHES client instead.')
31
33
  post '/setup/api/configure', password_hash
32
34
  end
33
35
 
@@ -37,6 +39,7 @@ module Octokit
37
39
  #
38
40
  # @return nil
39
41
  def upgrade(license)
42
+ octokit_warn('The Management Console API will be deprecated in GitHub Enterprise Server 3.14.0, please use the ManageGHES client instead.')
40
43
  conn = faraday_configuration
41
44
 
42
45
  params = {}
@@ -49,6 +52,7 @@ module Octokit
49
52
  #
50
53
  # @return [Sawyer::Resource] The installation information
51
54
  def config_status
55
+ octokit_warn('The Management Console API will be deprecated in GitHub Enterprise Server 3.14.0, please use the ManageGHES client instead.')
52
56
  get '/setup/api/configcheck', password_hash
53
57
  end
54
58
  alias config_check config_status
@@ -57,6 +61,7 @@ module Octokit
57
61
  #
58
62
  # @return [Sawyer::Resource] The settings
59
63
  def settings
64
+ octokit_warn('The Management Console API will be deprecated in GitHub Enterprise Server 3.14.0, please use the ManageGHES client instead.')
60
65
  get '/setup/api/settings', password_hash
61
66
  end
62
67
  alias get_settings settings
@@ -67,6 +72,7 @@ module Octokit
67
72
  #
68
73
  # @return [nil]
69
74
  def edit_settings(settings)
75
+ octokit_warn('The Management Console API will be deprecated in GitHub Enterprise Server 3.14.0, please use the ManageGHES client instead.')
70
76
  queries = password_hash
71
77
  queries[:query][:settings] = settings.to_json.to_s
72
78
  put '/setup/api/settings', queries
@@ -76,6 +82,7 @@ module Octokit
76
82
  #
77
83
  # @return [Sawyer::Resource] The maintenance status
78
84
  def maintenance_status
85
+ octokit_warn('The Management Console API will be deprecated in GitHub Enterprise Server 3.14.0, please use the ManageGHES client instead.')
79
86
  get '/setup/api/maintenance', password_hash
80
87
  end
81
88
  alias get_maintenance_status maintenance_status
@@ -85,6 +92,7 @@ module Octokit
85
92
  # @param maintenance [Hash] A hash configuration of the maintenance settings
86
93
  # @return [nil]
87
94
  def set_maintenance_status(maintenance)
95
+ octokit_warn('The Management Console API will be deprecated in GitHub Enterprise Server 3.14.0, please use the ManageGHES client instead.')
88
96
  queries = password_hash
89
97
  queries[:query][:maintenance] = maintenance.to_json.to_s
90
98
  post '/setup/api/maintenance', queries
@@ -95,6 +103,7 @@ module Octokit
95
103
  #
96
104
  # @return [Sawyer::Resource] An array of authorized SSH keys
97
105
  def authorized_keys
106
+ octokit_warn('The Management Console API will be deprecated in GitHub Enterprise Server 3.14.0, please use the ManageGHES client instead.')
98
107
  get '/setup/api/settings/authorized-keys', password_hash
99
108
  end
100
109
  alias get_authorized_keys authorized_keys
@@ -104,6 +113,7 @@ module Octokit
104
113
  # @param key Either the file path to a key, a File handler to the key, or the contents of the key itself
105
114
  # @return [Sawyer::Resource] An array of authorized SSH keys
106
115
  def add_authorized_key(key)
116
+ octokit_warn('The Management Console API will be deprecated in GitHub Enterprise Server 3.14.0, please use the ManageGHES client instead.')
107
117
  queries = password_hash
108
118
  case key
109
119
  when String
@@ -128,6 +138,7 @@ module Octokit
128
138
  # @param key Either the file path to a key, a File handler to the key, or the contents of the key itself
129
139
  # @return [Sawyer::Resource] An array of authorized SSH keys
130
140
  def remove_authorized_key(key)
141
+ octokit_warn('The Management Console API will be deprecated in GitHub Enterprise Server 3.14.0, please use the ManageGHES client instead.')
131
142
  queries = password_hash
132
143
  case key
133
144
  when String
data/lib/octokit/error.rb CHANGED
@@ -10,6 +10,7 @@ module Octokit
10
10
  #
11
11
  # @param [Hash] response HTTP response
12
12
  # @return [Octokit::Error]
13
+ # rubocop:disable Metrics/CyclomaticComplexity
13
14
  def self.from_response(response)
14
15
  status = response[:status].to_i
15
16
  body = response[:body].to_s
@@ -23,6 +24,7 @@ module Octokit
23
24
  when 405 then Octokit::MethodNotAllowed
24
25
  when 406 then Octokit::NotAcceptable
25
26
  when 409 then Octokit::Conflict
27
+ when 410 then Octokit::Deprecated
26
28
  when 415 then Octokit::UnsupportedMediaType
27
29
  when 422 then error_for_422(body)
28
30
  when 451 then Octokit::UnavailableForLegalReasons
@@ -36,6 +38,7 @@ module Octokit
36
38
  klass.new(response)
37
39
  end
38
40
  end
41
+ # rubocop:enable Metrics/CyclomaticComplexity
39
42
 
40
43
  def build_error_context
41
44
  if RATE_LIMITED_ERRORS.include?(self.class)
@@ -317,6 +320,9 @@ module Octokit
317
320
  # Raised when GitHub returns a 409 HTTP status code
318
321
  class Conflict < ClientError; end
319
322
 
323
+ # Raised when GHES Manage return a 410 HTTP status code
324
+ class Deprecated < ClientError; end
325
+
320
326
  # Raised when GitHub returns a 414 HTTP status code
321
327
  class UnsupportedMediaType < ClientError; end
322
328
 
@@ -0,0 +1,171 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Octokit
4
+ # Client for the Manage GitHub Enterprise Server API
5
+ class ManageGHESClient
6
+ # Methods for the Manage GitHub Enterprise Server API
7
+ #
8
+ # @see https://developer.github.com/v3/enterprise-admin/manage-ghes
9
+ module ManageAPI
10
+ # Get information about the maintenance status of the GHES instance
11
+ #
12
+ # @return [nil]
13
+ def maintenance_mode
14
+ conn = authenticated_client
15
+
16
+ @last_response = conn.get('/manage/v1/maintenance')
17
+ end
18
+
19
+ # Configure the maintenance mode of the GHES instance
20
+ #
21
+ # @param maintenance [Hash] A hash configuration of the maintenance mode status
22
+ # @return [nil]
23
+ def set_maintenance_mode(enabled, options = {})
24
+ conn = authenticated_client
25
+
26
+ options[:enabled] = enabled
27
+ @last_response = conn.post('/manage/v1/maintenance', options)
28
+ end
29
+ alias configure_maintenance_mode set_maintenance_mode
30
+ end
31
+
32
+ # Uploads a license for the first time
33
+ #
34
+ # @param license [String] The path to your .ghl license file.
35
+ #
36
+ # @return [nil]
37
+ def upload_license(license)
38
+ conn = authenticated_client
39
+ conn.request :multipart
40
+ params = {}
41
+ params[:license] = Faraday::FilePart.new(license, 'binary')
42
+ params[:password] = @manage_ghes_password
43
+ @last_response = conn.post('/manage/v1/config/init', params, { 'Content-Type' => 'multipart/form-data' })
44
+ end
45
+
46
+ # Start a configuration process.
47
+ #
48
+ # @return [nil]
49
+ def start_configuration
50
+ conn = authenticated_client
51
+ @last_response = conn.post('/manage/v1/config/apply')
52
+ end
53
+
54
+ # Get information about the Enterprise installation
55
+ #
56
+ # @return [nil]
57
+ def config_status
58
+ conn = authenticated_client
59
+ @last_response = conn.get('/manage/v1/config/apply')
60
+ end
61
+ alias config_check config_status
62
+
63
+ # Get information about the Enterprise installation
64
+ #
65
+ # @return [nil]
66
+ def settings
67
+ conn = authenticated_client
68
+ @last_response = conn.get('/manage/v1/config/settings')
69
+ end
70
+ alias get_settings settings
71
+
72
+ # Modify the Enterprise settings
73
+ #
74
+ # @param settings [Hash] A hash configuration of the new settings
75
+ #
76
+ # @return [nil]
77
+ def edit_settings(settings)
78
+ conn = authenticated_client
79
+ @last_response = conn.put('/manage/v1/config/settings', settings.to_json.to_s)
80
+ end
81
+
82
+ def authorized_keys
83
+ conn = authenticated_client
84
+ @last_response = conn.get('/manage/v1/access/ssh')
85
+ end
86
+ alias get_authorized_keys authorized_keys
87
+
88
+ # Add an authorized SSH keys on the Enterprise install
89
+ #
90
+ # @param key Either the file path to a key, a File handler to the key, or the contents of the key itself
91
+ # @return [nil]
92
+ def add_authorized_key(key)
93
+ conn = authenticated_client
94
+ case key
95
+ when String
96
+ if File.exist?(key)
97
+ key = File.open(key, 'r')
98
+ content = key.read.strip
99
+ key.close
100
+ else
101
+ content = key
102
+ end
103
+ when File
104
+ content = key.read.strip
105
+ key.close
106
+ end
107
+
108
+ queries = {}
109
+ queries[:key] = content
110
+ @last_response = conn.post('/manage/v1/access/ssh', queries)
111
+ end
112
+
113
+ # Removes an authorized SSH keys from the Enterprise install
114
+ #
115
+ # @param key Either the file path to a key, a File handler to the key, or the contents of the key itself
116
+ # @return [nil]
117
+ def remove_authorized_key(key)
118
+ conn = authenticated_client
119
+ case key
120
+ when String
121
+ if File.exist?(key)
122
+ key = File.open(key, 'r')
123
+ content = key.read.strip
124
+ key.close
125
+ else
126
+ content = key
127
+ end
128
+ when File
129
+ content = key.read.strip
130
+ key.close
131
+ end
132
+
133
+ queries = {}
134
+ queries[:key] = content
135
+ @last_response = conn.run_request(:delete, '/manage/v1/access/ssh', queries, nil)
136
+ end
137
+ alias delete_authorized_key remove_authorized_key
138
+
139
+ private
140
+
141
+ def basic_authenticated?
142
+ !!(@manage_ghes_username && @manage_ghes_password)
143
+ end
144
+
145
+ # If no username is provided, we assume root site admin should be used
146
+ def root_site_admin_assumed?
147
+ !@manage_ghes_username
148
+ end
149
+
150
+ def authenticated_client
151
+ @authenticated_client ||= Faraday.new(url: @manage_ghes_endpoint) do |c|
152
+ c.headers[:user_agent] = user_agent
153
+ c.request :json
154
+ c.response :json
155
+ c.adapter Faraday.default_adapter
156
+
157
+ if root_site_admin_assumed?
158
+ username = 'api_key'
159
+ elsif basic_authenticated?
160
+ username = @manage_ghes_username
161
+ end
162
+ c.request(*FARADAY_BASIC_AUTH_KEYS, username, @manage_ghes_password)
163
+
164
+ # Disabling SSL is essential for certain self-hosted Enterprise instances
165
+ c.ssl[:verify] = false if connection_options[:ssl] && !connection_options[:ssl][:verify]
166
+
167
+ c.use Octokit::Response::RaiseError
168
+ end
169
+ end
170
+ end
171
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'octokit/configurable'
4
+ require 'octokit/connection'
5
+ require 'octokit/warnable'
6
+ require 'octokit/manage_ghes_client/manage_ghes'
7
+
8
+ module Octokit
9
+ # ManageGHESClient is only meant to be used by GitHub Enterprise Server (GHES) operators
10
+ # and provides access to the Manage GHES API endpoints.
11
+ #
12
+ # @see Octokit::Client Use Octokit::Client for regular API use for GitHub
13
+ # and GitHub Enterprise.
14
+ # @see https://developer.github.com/v3/enterprise-admin/manage-ghes/
15
+ class ManageGHESClient
16
+ include Octokit::Configurable
17
+ include Octokit::Connection
18
+ include Octokit::Warnable
19
+ include Octokit::ManageGHESClient::ManageAPI
20
+
21
+ def initialize(options = {})
22
+ # Use options passed in, but fall back to module defaults
23
+ # rubocop:disable Style/HashEachMethods
24
+ #
25
+ # This may look like a `.keys.each` which should be replaced with `#each_key`, but
26
+ # this doesn't actually work, since `#keys` is just a method we've defined ourselves.
27
+ # The class doesn't fulfill the whole `Enumerable` contract.
28
+ Octokit::Configurable.keys.each do |key|
29
+ # rubocop:enable Style/HashEachMethods
30
+ instance_variable_set(:"@#{key}", options[key] || Octokit.instance_variable_get(:"@#{key}"))
31
+ end
32
+ end
33
+
34
+ protected
35
+
36
+ def endpoint
37
+ manage_ghes_endpoint
38
+ end
39
+
40
+ # Set Manage GHES API endpoint
41
+ #
42
+ # @param value [String] Manage GHES API endpoint
43
+ def manage_ghes_endpoint=(value)
44
+ reset_agent
45
+ @manage_ghes_endpoint = value
46
+ end
47
+
48
+ # Set Manage GHES API username
49
+ #
50
+ # @param value [String] Manage GHES API username
51
+ def manage_ghes_username=(value)
52
+ reset_agent
53
+ @manage_ghes_username = value
54
+ end
55
+
56
+ # Set Manage GHES API password
57
+ #
58
+ # @param value [String] Manage GHES API password
59
+ def manage_ghes_password=(value)
60
+ reset_agent
61
+ @manage_ghes_password = value
62
+ end
63
+ end
64
+ end
@@ -9,7 +9,7 @@ module Octokit
9
9
  attr_reader :repo
10
10
 
11
11
  def initialize(args)
12
- arguments = super(args)
12
+ arguments = super
13
13
  @repo = arguments.shift
14
14
 
15
15
  arguments
@@ -3,7 +3,7 @@
3
3
  module Octokit
4
4
  # Current major release.
5
5
  # @return [Integer]
6
- MAJOR = 8
6
+ MAJOR = 9
7
7
 
8
8
  # Current minor release.
9
9
  # @return [Integer]
data/lib/octokit.rb CHANGED
@@ -4,6 +4,7 @@ require 'octokit/default'
4
4
  require 'octokit/client'
5
5
  require 'octokit/enterprise_admin_client'
6
6
  require 'octokit/enterprise_management_console_client'
7
+ require 'octokit/manage_ghes_client'
7
8
 
8
9
  # Ruby toolkit for the GitHub API
9
10
  module Octokit
@@ -41,12 +42,24 @@ module Octokit
41
42
  @enterprise_management_console_client = Octokit::EnterpriseManagementConsoleClient.new(options)
42
43
  end
43
44
 
45
+ # ManageGHESClient client based on configured options {Configurable}
46
+ #
47
+ # @return [Octokit::ManageGHESClient] API wrapper
48
+ def manage_ghes_client
49
+ if defined?(@manage_ghes_client) && @manage_ghes_client.same_options?(options)
50
+ return @manage_ghes_client
51
+ end
52
+
53
+ @manage_ghes_client = Octokit::ManageGHESClient.new(options)
54
+ end
55
+
44
56
  private
45
57
 
46
58
  def respond_to_missing?(method_name, include_private = false)
47
59
  client.respond_to?(method_name, include_private) ||
48
60
  enterprise_admin_client.respond_to?(method_name, include_private) ||
49
- enterprise_management_console_client.respond_to?(method_name, include_private)
61
+ enterprise_management_console_client.respond_to?(method_name, include_private) ||
62
+ manage_ghes_client.respond_to?(method_name, include_private)
50
63
  end
51
64
 
52
65
  def method_missing(method_name, *args, &block)
@@ -56,6 +69,8 @@ module Octokit
56
69
  return enterprise_admin_client.send(method_name, *args, &block)
57
70
  elsif enterprise_management_console_client.respond_to?(method_name)
58
71
  return enterprise_management_console_client.send(method_name, *args, &block)
72
+ elsif manage_ghes_client.respond_to?(method_name)
73
+ return manage_ghes_client.send(method_name, *args, &block)
59
74
  end
60
75
 
61
76
  super
data/octokit.gemspec CHANGED
@@ -5,7 +5,6 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
  require 'octokit/version'
6
6
 
7
7
  Gem::Specification.new do |spec|
8
- spec.add_dependency 'base64'
9
8
  spec.add_dependency 'faraday', '>= 1', '< 3'
10
9
  spec.add_dependency 'sawyer', '~> 0.9'
11
10
  spec.authors = ['Wynn Netherland', 'Erik Michaels-Ober', 'Clint Shryock']
metadata CHANGED
@@ -1,31 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: octokit
3
3
  version: !ruby/object:Gem::Version
4
- version: 8.1.0
4
+ version: 9.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wynn Netherland
8
8
  - Erik Michaels-Ober
9
9
  - Clint Shryock
10
- autorequire:
10
+ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2024-02-01 00:00:00.000000000 Z
13
+ date: 2024-06-11 00:00:00.000000000 Z
14
14
  dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: base64
17
- requirement: !ruby/object:Gem::Requirement
18
- requirements:
19
- - - ">="
20
- - !ruby/object:Gem::Version
21
- version: '0'
22
- type: :runtime
23
- prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- version: '0'
29
15
  - !ruby/object:Gem::Dependency
30
16
  name: faraday
31
17
  requirement: !ruby/object:Gem::Requirement
@@ -118,7 +104,6 @@ files:
118
104
  - lib/octokit/client/organizations.rb
119
105
  - lib/octokit/client/pages.rb
120
106
  - lib/octokit/client/projects.rb
121
- - lib/octokit/client/pub_sub_hubbub.rb
122
107
  - lib/octokit/client/pull_requests.rb
123
108
  - lib/octokit/client/rate_limit.rb
124
109
  - lib/octokit/client/reactions.rb
@@ -149,6 +134,8 @@ files:
149
134
  - lib/octokit/enterprise_management_console_client/management_console.rb
150
135
  - lib/octokit/error.rb
151
136
  - lib/octokit/gist.rb
137
+ - lib/octokit/manage_ghes_client.rb
138
+ - lib/octokit/manage_ghes_client/manage_ghes.rb
152
139
  - lib/octokit/middleware/follow_redirects.rb
153
140
  - lib/octokit/organization.rb
154
141
  - lib/octokit/rate_limit.rb
@@ -166,7 +153,7 @@ licenses:
166
153
  - MIT
167
154
  metadata:
168
155
  rubygems_mfa_required: 'true'
169
- post_install_message:
156
+ post_install_message:
170
157
  rdoc_options: []
171
158
  require_paths:
172
159
  - lib
@@ -181,8 +168,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
181
168
  - !ruby/object:Gem::Version
182
169
  version: 1.3.5
183
170
  requirements: []
184
- rubygems_version: 3.4.20
185
- signing_key:
171
+ rubygems_version: 3.0.3.1
172
+ signing_key:
186
173
  specification_version: 4
187
174
  summary: Ruby toolkit for working with the GitHub API
188
175
  test_files: []
@@ -1,111 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Octokit
4
- class Client
5
- # Methods for the PubSubHubbub API
6
- #
7
- # @see https://developer.github.com/v3/repos/hooks/#pubsubhubbub
8
- module PubSubHubbub
9
- # Subscribe to a pubsub topic
10
- #
11
- # @param topic [String] A recoginized and supported pubsub topic
12
- # @param callback [String] A callback url to be posted to when the topic event is fired
13
- # @param secret [String] An optional shared secret used to generate a SHA1 HMAC of the outgoing body content
14
- # @return [Boolean] true if the subscribe was successful, otherwise an error is raised
15
- # @see https://developer.github.com/v3/repos/hooks/#subscribing
16
- # @example Subscribe to push events from one of your repositories, having an email sent when fired
17
- # client = Octokit::Client.new(:oauth_token = "token")
18
- # client.subscribe("https://github.com/joshk/devise_imapable/events/push", "github://Email?address=josh.kalderimis@gmail.com")
19
- def subscribe(topic, callback, secret = nil)
20
- options = {
21
- 'hub.callback': callback,
22
- 'hub.mode': 'subscribe',
23
- 'hub.topic': topic
24
- }
25
- options.merge!('hub.secret': secret) unless secret.nil?
26
-
27
- response = pub_sub_hubbub_request(options)
28
-
29
- response.status == 204
30
- end
31
-
32
- # Unsubscribe from a pubsub topic
33
- #
34
- # @param topic [String] A recoginized pubsub topic
35
- # @param callback [String] A callback url to be unsubscribed from
36
- # @return [Boolean] true if the unsubscribe was successful, otherwise an error is raised
37
- # @see https://developer.github.com/v3/repos/hooks/#subscribing
38
- # @example Unsubscribe to push events from one of your repositories, no longer having an email sent when fired
39
- # client = Octokit::Client.new(:oauth_token = "token")
40
- # client.unsubscribe("https://github.com/joshk/devise_imapable/events/push", "github://Email?address=josh.kalderimis@gmail.com")
41
- def unsubscribe(topic, callback)
42
- options = {
43
- 'hub.callback': callback,
44
- 'hub.mode': 'unsubscribe',
45
- 'hub.topic': topic
46
- }
47
- response = pub_sub_hubbub_request(options)
48
-
49
- response.status == 204
50
- end
51
-
52
- # Subscribe to a repository through pubsub
53
- #
54
- # @param repo [String, Repository, Hash] A GitHub repository
55
- # @param service_name [String] service name owner
56
- # @param service_arguments [Hash] params that will be passed by subscribed hook.
57
- # List of services is available @ https://github.com/github/github-services/tree/master/docs.
58
- # Please refer Data node for complete list of arguments.
59
- # @param secret [String] An optional shared secret used to generate a SHA1 HMAC of the outgoing body content
60
- # @return [Boolean] True if subscription successful, false otherwise
61
- # @see https://developer.github.com/v3/repos/hooks/#subscribing
62
- # @example Subscribe to push events to one of your repositories to Travis-CI
63
- # client = Octokit::Client.new(:oauth_token = "token")
64
- # client.subscribe_service_hook('joshk/device_imapable', 'Travis', { :token => "test", :domain => "domain", :user => "user" })
65
- def subscribe_service_hook(repo, service_name, service_arguments = {}, secret = nil)
66
- topic = "#{Octokit.web_endpoint}#{Repository.new(repo)}/events/push"
67
- callback = "github://#{service_name}?#{service_arguments.collect { |k, v| [k, v].map { |p| URI.encode_www_form_component(p) }.join('=') }.join('&')}"
68
- subscribe(topic, callback, secret)
69
- end
70
-
71
- # Unsubscribe repository through pubsub
72
- #
73
- # @param repo [String, Repository, Hash] A GitHub repository
74
- # @param service_name [String] service name owner
75
- # List of services is available @ https://github.com/github/github-services/tree/master/docs.
76
- # @see https://developer.github.com/v3/repos/hooks/#subscribing
77
- # @example Subscribe to push events to one of your repositories to Travis-CI
78
- # client = Octokit::Client.new(:oauth_token = "token")
79
- # client.unsubscribe_service_hook('joshk/device_imapable', 'Travis')
80
- def unsubscribe_service_hook(repo, service_name)
81
- topic = "#{Octokit.web_endpoint}#{Repository.new(repo)}/events/push"
82
- callback = "github://#{service_name}"
83
- unsubscribe(topic, callback)
84
- end
85
-
86
- private
87
-
88
- def pub_sub_hubbub_request(options = {})
89
- # This method is janky, bypass normal stack so we don't
90
- # serialize request as JSON
91
- conn = Faraday.new(url: @api_endpoint) do |http|
92
- http.headers[:user_agent] = user_agent
93
- if basic_authenticated?
94
- http.request(*FARADAY_BASIC_AUTH_KEYS, @login, @password)
95
- elsif token_authenticated?
96
- http.request :authorization, 'token', @access_token
97
- end
98
- http.request :url_encoded
99
- http.use Octokit::Response::RaiseError
100
- http.adapter Faraday.default_adapter
101
- end
102
-
103
- conn.post do |req|
104
- req.url 'hub'
105
- req.headers['Content-Type'] = 'application/x-www-form-urlencoded'
106
- req.body = options
107
- end
108
- end
109
- end
110
- end
111
- end