Class: Dependabot::Clients::GithubWithRetries
- Inherits:
-
Object
- Object
- Dependabot::Clients::GithubWithRetries
- Defined in:
- lib/dependabot/clients/github_with_retries.rb
Constant Summary collapse
- DEFAULT_CLIENT_ARGS =
{ connection_options: { request: { open_timeout: 2, timeout: 5 } } }.freeze
- RETRYABLE_ERRORS =
[ Faraday::ConnectionFailed, Faraday::TimeoutError, Octokit::InternalServerError, Octokit::BadGateway ].freeze
Class Method Summary collapse
- .for_github_dot_com(credentials:) ⇒ Object
-
.for_source(source:, credentials:) ⇒ Object
Constructor methods #.
Instance Method Summary collapse
-
#fetch_commit(repo, branch) ⇒ Object
VCS Interface #.
- #fetch_default_branch(repo) ⇒ Object
-
#initialize(max_retries: 3, **args) ⇒ GithubWithRetries
constructor
Proxying #.
- #method_missing(method_name, *args, &block) ⇒ Object
- #respond_to_missing?(method_name, include_private = false) ⇒ Boolean
-
#retry_connection_failures ⇒ Object
rubocop:disable Naming/RescuedExceptionsVariableName.
Constructor Details
#initialize(max_retries: 3, **args) ⇒ GithubWithRetries
Proxying #
73 74 75 76 77 78 79 80 81 82 83 84 85 |
# File 'lib/dependabot/clients/github_with_retries.rb', line 73 def initialize(max_retries: 3, **args) args = DEFAULT_CLIENT_ARGS.merge(args) access_tokens = args.delete(:access_tokens) || [] access_tokens << args[:access_token] if args[:access_token] access_tokens << nil if access_tokens.empty? access_tokens.uniq! @max_retries = max_retries || 3 @clients = access_tokens.map do |token| Octokit::Client.new(args.merge(access_token: token)) end end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method_name, *args, &block) ⇒ Object
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
# File 'lib/dependabot/clients/github_with_retries.rb', line 87 def method_missing(method_name, *args, &block) untried_clients = @clients.dup client = untried_clients.pop begin retry_connection_failures do if client.respond_to?(method_name) mutatable_args = args.map(&:dup) client.public_send(method_name, *mutatable_args, &block) else super end end rescue Octokit::NotFound, Octokit::Unauthorized, Octokit::Forbidden raise unless (client = untried_clients.pop) retry end end |
Class Method Details
.for_github_dot_com(credentials:) ⇒ Object
42 43 44 45 46 47 48 49 50 51 |
# File 'lib/dependabot/clients/github_with_retries.rb', line 42 def self.for_github_dot_com(credentials:) access_tokens = credentials. select { |cred| cred["type"] == "git_source" }. select { |cred| cred["host"] == "github.com" }. select { |cred| cred["password"] }. map { |cred| cred.fetch("password") } new(access_tokens: access_tokens) end |
.for_source(source:, credentials:) ⇒ Object
Constructor methods #
28 29 30 31 32 33 34 35 36 37 38 39 40 |
# File 'lib/dependabot/clients/github_with_retries.rb', line 28 def self.for_source(source:, credentials:) access_tokens = credentials. select { |cred| cred["type"] == "git_source" }. select { |cred| cred["host"] == source.hostname }. select { |cred| cred["password"] }. map { |cred| cred.fetch("password") } new( access_tokens: access_tokens, api_endpoint: source.api_endpoint ) end |
Instance Method Details
#fetch_commit(repo, branch) ⇒ Object
VCS Interface #
57 58 59 60 61 62 63 |
# File 'lib/dependabot/clients/github_with_retries.rb', line 57 def fetch_commit(repo, branch) response = ref(repo, "heads/#{branch}") raise Octokit::NotFound if response.is_a?(Array) response.object.sha end |
#fetch_default_branch(repo) ⇒ Object
65 66 67 |
# File 'lib/dependabot/clients/github_with_retries.rb', line 65 def fetch_default_branch(repo) repository(repo).default_branch end |
#respond_to_missing?(method_name, include_private = false) ⇒ Boolean
107 108 109 |
# File 'lib/dependabot/clients/github_with_retries.rb', line 107 def respond_to_missing?(method_name, include_private = false) @clients.first.respond_to?(method_name) || super end |
#retry_connection_failures ⇒ Object
rubocop:disable Naming/RescuedExceptionsVariableName
112 113 114 115 116 117 118 119 120 121 |
# File 'lib/dependabot/clients/github_with_retries.rb', line 112 def retry_connection_failures retry_attempt = 0 begin yield rescue *RETRYABLE_ERRORS retry_attempt += 1 retry_attempt <= @max_retries ? retry : raise end end |