Class: Jekyll::GitHubMetadata::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/jekyll-github-metadata/client.rb

Constant Summary collapse

InvalidMethodError =
Class.new(NoMethodError)
BadCredentialsError =
Class.new(StandardError)
API_CALLS =

Whitelisted API calls.

Set.new(%w(
  repository
  organization
  user
  repository?
  pages
  contributors
  releases
  latest_release
  list_repos
  organization_public_members
))
FARADAY_FAILED_CONNECTION =

NOTE: Faraday’s error classes have been simplified from v1.0.0.

In older versions, both ‘Faraday::Error::ConnectionFailed` and `Faraday::ConnectionFailed` were valid and equivalent to each other. From v1.0.0 onwards, `Faraday::Error::ConnectionFailed` no longer exists.

TODO: Remove in v2.0 of this plugin.

begin
  Faraday::Error::ConnectionFailed
rescue NameError
  Faraday::ConnectionFailed
end

Instance Method Summary collapse

Constructor Details

#initialize(options = nil) ⇒ Client

Returns a new instance of Client.



25
26
27
# File 'lib/jekyll-github-metadata/client.rb', line 25

def initialize(options = nil)
  @client = build_octokit_client(options)
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method_name, *args, &block) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/jekyll-github-metadata/client.rb', line 58

def method_missing(method_name, *args, &block)
  method = method_name.to_s
  if accepts_client_method?(method_name)
    key = cache_key(method_name, args)
    GitHubMetadata.log :debug, "Calling @client.#{method}(#{args.map(&:inspect).join(", ")})"
    cache[key] ||= save_from_errors { @client.public_send(method_name, *args, &block) }
  elsif @client.respond_to?(method_name)
    raise InvalidMethodError, "#{method_name} is not whitelisted on #{inspect}"
  else
    super
  end
end

Instance Method Details

#accepts_client_method?(method_name) ⇒ Boolean

Returns:

  • (Boolean)


50
51
52
# File 'lib/jekyll-github-metadata/client.rb', line 50

def accepts_client_method?(method_name)
  API_CALLS.include?(method_name.to_s) && @client.respond_to?(method_name)
end

#authenticated?Boolean

Returns:

  • (Boolean)


106
107
108
# File 'lib/jekyll-github-metadata/client.rb', line 106

def authenticated?
  !@client.access_token.to_s.empty?
end

#build_octokit_client(options = nil) ⇒ Object



44
45
46
47
48
# File 'lib/jekyll-github-metadata/client.rb', line 44

def build_octokit_client(options = nil)
  options ||= {}
  options.merge!(pluck_auth_method) unless options.key?(:access_token)
  Octokit::Client.new(default_octokit_options.merge(options))
end

#default_octokit_optionsObject



36
37
38
39
40
41
42
# File 'lib/jekyll-github-metadata/client.rb', line 36

def default_octokit_options
  {
    :api_endpoint  => Jekyll::GitHubMetadata::Pages.api_url,
    :web_endpoint  => Jekyll::GitHubMetadata::Pages.github_url,
    :auto_paginate => true,
  }
end

#inspectObject



102
103
104
# File 'lib/jekyll-github-metadata/client.rb', line 102

def inspect
  "#<#{self.class.name} @client=#{client_inspect} @internet_connected=#{internet_connected?}>"
end

#internet_connected?Boolean

Returns:

  • (Boolean)


110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/jekyll-github-metadata/client.rb', line 110

def internet_connected?
  return @internet_connected if defined?(@internet_connected)

  require "resolv"
  begin
    Resolv::DNS.open do |dns|
      dns.timeouts = 2
      dns.getaddress("api.github.com")
    end
    @internet_connected = true
  rescue Resolv::ResolvError
    @internet_connected = false
  end
end

#respond_to_missing?(method_name, include_private = false) ⇒ Boolean

Returns:

  • (Boolean)


54
55
56
# File 'lib/jekyll-github-metadata/client.rb', line 54

def respond_to_missing?(method_name, include_private = false)
  accepts_client_method?(method_name) || super
end

#safe_require(gem_name) ⇒ Object



29
30
31
32
33
34
# File 'lib/jekyll-github-metadata/client.rb', line 29

def safe_require(gem_name)
  require gem_name
  true
rescue LoadError
  false
end

#save_from_errors(default = false) ⇒ Object



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/jekyll-github-metadata/client.rb', line 86

def save_from_errors(default = false)
  unless internet_connected?
    GitHubMetadata.log :warn, "No internet connection. GitHub metadata may be missing or incorrect."
    return default
  end

  yield @client
rescue Octokit::Unauthorized
  raise BadCredentialsError, "The GitHub API credentials you provided aren't valid."
rescue Faraday::ConnectionFailed, Octokit::TooManyRequests => e
  GitHubMetadata.log :warn, e.message
  default
rescue Octokit::NotFound
  default
end