Class: Github::API

Inherits:
Object
  • Object
show all
Extended by:
ClassMethods
Includes:
Authorization, Constants, MimeType, RateLimit, Request::Verbs
Defined in:
lib/github_api/api.rb,
lib/github_api/api/config.rb,
lib/github_api/api/actions.rb,
lib/github_api/api/factory.rb,
lib/github_api/api/arguments.rb,
lib/github_api/api/config/property.rb,
lib/github_api/api/config/property_set.rb

Overview

Responsible for providing inspection of api methods

Direct Known Subclasses

Client, Client::Activity, Client::Activity::Events, Client::Activity::Feeds, Client::Activity::Notifications, Client::Activity::Starring, Client::Activity::Watching, Client::Authorizations, Client::Emojis, Client::Gists, Client::Gists::Comments, Client::GitData, Client::GitData::Blobs, Client::GitData::Commits, Client::GitData::References, Client::GitData::Tags, Client::GitData::Trees, Client::Gitignore, Client::Issues, Client::Issues::Assignees, Client::Issues::Comments, Client::Issues::Events, Client::Issues::Labels, Client::Issues::Milestones, Client::Markdown, Client::Meta, Client::Orgs, Client::Orgs::Hooks, Client::Orgs::Members, Client::Orgs::Memberships, Client::Orgs::Projects, Client::Orgs::Teams, Client::Projects, Client::Projects::Cards, Client::Projects::Columns, Client::PullRequests, Client::PullRequests::Comments, Client::PullRequests::Reviews, Client::Repos, Client::Repos::Collaborators, Client::Repos::Comments, Client::Repos::Commits, Client::Repos::Contents, Client::Repos::Deployments, Client::Repos::Downloads, Client::Repos::Forks, Client::Repos::Hooks, Client::Repos::Keys, Client::Repos::Merging, Client::Repos::Pages, Client::Repos::Projects, Client::Repos::PubSubHubbub, Client::Repos::Releases, Client::Repos::Releases::Assets, Client::Repos::Releases::Tags, Client::Repos::Statistics, Client::Repos::Statuses, Client::Say, Client::Scopes, Client::Search, Client::Search::Legacy, Client::Users, Client::Users::Emails, Client::Users::Followers, Client::Users::Keys, Resource

Defined Under Namespace

Classes: Arguments, Config, Factory

Constant Summary

Constants included from MimeType

MimeType::MEDIA_LOOKUP

Constants included from Constants

Constants::ACCEPT, Constants::ACCEPTED_OAUTH_SCOPES, Constants::ACCEPT_CHARSET, Constants::CACHE_CONTROL, Constants::CONTENT_LENGTH, Constants::CONTENT_TYPE, Constants::DATE, Constants::ETAG, Constants::HEADER_LAST, Constants::HEADER_LINK, Constants::HEADER_NEXT, Constants::LOCATION, Constants::META_FIRST, Constants::META_LAST, Constants::META_NEXT, Constants::META_PREV, Constants::META_REL, Constants::OAUTH_SCOPES, Constants::PARAM_PAGE, Constants::PARAM_PER_PAGE, Constants::PARAM_START_PAGE, Constants::RATELIMIT_LIMIT, Constants::RATELIMIT_REMAINING, Constants::RATELIMIT_RESET, Constants::SERVER, Constants::USER_AGENT

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from ClassMethods

configuration, configure, require_all

Methods included from RateLimit

#ratelimit, #ratelimit_remaining, #ratelimit_reset

Methods included from Request::Verbs

#delete_request, #get_request, #head_request, #options_request, #patch_request, #post_request, #put_request

Methods included from MimeType

#lookup_media, #parse

Methods included from Authorization

#auth_code, #authenticated?, #authentication, #authorize_url, #basic_authed?, #client, #get_token

Constructor Details

#initialize(options = {}, &block) ⇒ API

Create new API



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/github_api/api.rb', line 46

def initialize(options={}, &block)
  opts = Github.configuration.fetch.merge(options)
  @current_options = opts

  Github.configuration.property_names.each do |key|
    send("#{key}=", opts[key])
  end
  if opts.key?(:login) && !opts[:login].nil?
    @login, @password = opts[:login], opts[:password]
  elsif opts.key?(:basic_auth) && !opts[:basic_auth].nil?
    @login, @password = extract_basic_auth(opts[:basic_auth])
  end

  yield_or_eval(&block) if block_given?
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

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

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Responds to attribute query or attribute clear



245
246
247
248
249
250
251
252
253
254
# File 'lib/github_api/api.rb', line 245

def method_missing(method_name, *args, &block) # :nodoc:
  case method_name.to_s
  when /^(.*)\?$/
    return !!send($1.to_s)
  when /^clear_(.*)$/
    send("#{$1.to_s}=", nil)
  else
    super
  end
end

Class Attribute Details

.rootObject (readonly) Also known as: root?

Returns the value of attribute root.



121
122
123
# File 'lib/github_api/api.rb', line 121

def root
  @root
end

Instance Attribute Details

#current_optionsObject

Returns the value of attribute current_options.



31
32
33
# File 'lib/github_api/api.rb', line 31

def current_options
  @current_options
end

Class Method Details

.after_callbacksObject

List of after callbacks



102
103
104
# File 'lib/github_api/api.rb', line 102

def self.after_callbacks
  @after_callbacks ||= []
end

.after_request(callback, params = {}) ⇒ Object

After request filter



116
117
118
# File 'lib/github_api/api.rb', line 116

def self.after_request(callback, params = {})
  after_callbacks << params.merge(callback: callback)
end

.before_callbacksObject

List of before callbacks



95
96
97
# File 'lib/github_api/api.rb', line 95

def self.before_callbacks
  @before_callbacks ||= []
end

.before_request(callback, params = {}) ⇒ Object

Before request filter



109
110
111
# File 'lib/github_api/api.rb', line 109

def self.before_request(callback, params = {})
  before_callbacks << params.merge(callback: callback)
end

.clear_request_methods!Object



170
171
172
# File 'lib/github_api/api.rb', line 170

def self.clear_request_methods!
  @request_methods = nil
end

.extend_with_actions(child_class) ⇒ nil

Returns all API public methods for a given class.

Returns:

  • (nil)


11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/github_api/api/actions.rb', line 11

def self.extend_with_actions(child_class)
  return unless child_class.is_a?(Class)
  return if child_class.name.nil? # Skip anonymous classes

  child_class.class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
    def self.actions
      self.new.actions
    end

    def actions
      api_methods_in(#{child_class}) + module_methods_in(#{child_class})
    end
  RUBY_EVAL
end

.extra_methodsObject



151
152
153
# File 'lib/github_api/api.rb', line 151

def self.extra_methods
  ['actions']
end

.extract_class_name(name, options) ⇒ String

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Extracts class name from options

Examples:

extract_class_name(:stats, class_name: :statistics)

Parameters:

Options Hash (options):

  • :full_name (String)

    the full name for the class

  • :root (Boolean)

    if the class is at the root or not

Returns:

  • (String)


336
337
338
339
340
341
342
# File 'lib/github_api/api.rb', line 336

def self.extract_class_name(name, options)
  converted  = options.fetch(:full_name, name).to_s
  converted  = converted.split('_').map(&:capitalize).join
  class_name = options.fetch(:root, false) ? '': "#{self.name}::"
  class_name += converted
  class_name
end

.inherited(child_class) ⇒ Object



129
130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/github_api/api.rb', line 129

def self.inherited(child_class)
  before_callbacks.reverse_each { |callback|
    child_class.before_callbacks.unshift(callback)
  }
  after_callbacks.reverse_each { |callback|
    child_class.after_callbacks.unshift(callback)
  }
  extend_with_actions(child_class)
  unless child_class.instance_variable_defined?(:@root)
    child_class.instance_variable_set(:@root, false)
  end
  super
end

.internal_methodsObject



145
146
147
148
149
# File 'lib/github_api/api.rb', line 145

def self.internal_methods
  api = self
  api = api.superclass until api.root?
  api.public_instance_methods(true)
end

.method_added(method_name) ⇒ Object



174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
# File 'lib/github_api/api.rb', line 174

def self.method_added(method_name)
  method_name = method_name.to_s.gsub(/_with(out)?_callback_.*$/, '')
  # Only subclasses matter
  return if self.root?
  return if extra_methods.include?(method_name)
  # Only public methods are of interest
  return unless request_methods.include?(method_name)
  # Do not redefine
  return if (@__methods_added ||= []).include?(method_name)

  class_name     = self.name.to_s.split('::').last.downcase
  with_method    = "#{method_name}_with_callback_#{class_name}"
  without_method = "#{method_name}_without_callback_#{class_name}"

  return if public_method_defined?(with_method)

  [method_name, with_method, without_method].each do |met|
    @__methods_added << met
  end
  return if public_method_defined?(with_method)

  define_method(with_method) do |*args, &block|
    send(:execute, without_method, *args, &block)
  end
  alias_method without_method, method_name
  alias_method method_name, with_method
  clear_request_methods!
end

.namespace(*names) ⇒ self

Defines a namespace

Examples:

namespace :scopes

Parameters:

  • names (Array[Symbol])

    the name for the scope

Returns:

  • (self)


305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
# File 'lib/github_api/api.rb', line 305

def self.namespace(*names)
  options = names.last.is_a?(Hash) ? names.pop : {}
  names   = names.map(&:to_sym)
  name    = names.pop

  if public_method_defined?(name)
    raise ArgumentError, "namespace '#{name}' is already defined"
  end

  class_name = extract_class_name(name, options)

  define_method(name) do |*args, &block|
    options = args.last.is_a?(Hash) ? args.pop : {}
    API::Factory.new(class_name, current_options.merge(options), &block)
  end
end

.request_methodsSet

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Find all the api methods that should be considred by request callbacks.

Returns:

  • (Set)


161
162
163
164
165
166
167
168
# File 'lib/github_api/api.rb', line 161

def self.request_methods
  @request_methods ||= begin
    methods = (public_instance_methods(true) -
               internal_methods +
               public_instance_methods(false)).uniq.map(&:to_s)
    Set.new(methods - extra_methods)
  end
end

.root!Object



125
126
127
# File 'lib/github_api/api.rb', line 125

def self.root!
  @root = true
end

Instance Method Details

#api_methods_in(klass) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Finds api methods in a class

Parameters:

  • klass (Class)

    The klass to inspect for methods.



32
33
34
35
36
37
38
39
40
41
# File 'lib/github_api/api/actions.rb', line 32

def api_methods_in(klass)
  methods = klass.send(:instance_methods, false) - [:actions]
  methods.sort.each_with_object([]) do |method_name, accumulator|
    unless method_name.to_s.include?('with') ||
           method_name.to_s.include?('without')
      accumulator << method_name
    end
    accumulator
  end
end

#arguments(args = (not_set = true), options = {}, &block) ⇒ Object

Acts as setter and getter for api requests arguments parsing.

Returns Arguments instance.



260
261
262
263
264
265
266
# File 'lib/github_api/api.rb', line 260

def arguments(args=(not_set = true), options={}, &block)
  if not_set
    @arguments
  else
    @arguments = Arguments.new(options.merge!(api: self)).parse(*args, &block)
  end
end

#disable_redirectsObject

Disable following redirects inside a block



85
86
87
88
89
90
# File 'lib/github_api/api.rb', line 85

def disable_redirects
  self.follow_redirects = false
  yield
ensure
  self.follow_redirects = true
end

#execute(action, *args, &block) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Execute action

Parameters:

  • action (Symbol)


233
234
235
236
237
238
239
240
# File 'lib/github_api/api.rb', line 233

def execute(action, *args, &block)
  action_name = action.to_s.gsub(/_with(out)?_callback_.*$/, '')
  result = nil
  run_callbacks(action_name) do
    result = send(action, *args, &block)
  end
  result
end

#extract_basic_auth(auth) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Extract login and password from basic_auth parameter



73
74
75
76
77
78
79
80
# File 'lib/github_api/api.rb', line 73

def extract_basic_auth(auth)
  case auth
  when String
    auth.split(':', 2)
  when Hash
    [auth[:login], auth[:password]]
  end
end

#filter_callbacks(kind, action_name) ⇒ Array[Hash]

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Filter callbacks based on kind

Parameters:

  • kind (Symbol)

    one of :before or :after

Returns:



211
212
213
214
215
# File 'lib/github_api/api.rb', line 211

def filter_callbacks(kind, action_name)
  matched_callbacks = self.class.send("#{kind}_callbacks").select do |callback|
    callback[:only].nil? || callback[:only].include?(action_name)
  end
end

#module_methods_in(klass) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Finds methods included through class modules

Parameters:

  • klass (Class)

    The klass to inspect for methods.



49
50
51
52
53
54
55
56
57
58
# File 'lib/github_api/api/actions.rb', line 49

def module_methods_in(klass)
  klass.included_modules.each_with_object([]) do |mod, accumulator|
    if mod.to_s =~ /#{klass}/
      mod.instance_methods(false).each do |method|
        accumulator << method
      end
    end
    accumulator
  end
end

#run_callbacks(action_name, &block) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Run all callbacks associated with this action



222
223
224
225
226
# File 'lib/github_api/api.rb', line 222

def run_callbacks(action_name, &block)
  filter_callbacks(:before, action_name).each { |hook| send hook[:callback] }
  yield if block_given?
  filter_callbacks(:after, action_name).each { |hook| send hook[:callback] }
end

#set(option, value = (not_set=true), ignore_setter = false, &block) ⇒ self

Set a configuration option for a given namespace

Parameters:

  • option (String)
  • value (Object) (defaults to: (not_set=true))
  • ignore_setter (Boolean) (defaults to: false)

Returns:

  • (self)

Raises:

  • (ArgumentError)


277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
# File 'lib/github_api/api.rb', line 277

def set(option, value=(not_set=true), ignore_setter=false, &block)
  raise ArgumentError, 'value not set' if block and !not_set
  return self if !not_set and value.nil?

  if not_set
    set_options option
    return self
  end

  if respond_to?("#{option}=") and not ignore_setter
    return __send__("#{option}=", value)
  end

  define_accessors option, value
  self
end

#yield_or_eval(&block) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Call block with argument



65
66
67
68
# File 'lib/github_api/api.rb', line 65

def yield_or_eval(&block)
  return unless block
  block.arity > 0 ? yield(self) : self.instance_eval(&block)
end