Class: Github::API
- Inherits:
-
Object
- Object
- Github::API
- 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
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
-
.root ⇒ Object
(also: root?)
readonly
Returns the value of attribute root.
Instance Attribute Summary collapse
-
#current_options ⇒ Object
Returns the value of attribute current_options.
Class Method Summary collapse
-
.after_callbacks ⇒ Object
List of after callbacks.
-
.after_request(callback, params = {}) ⇒ Object
After request filter.
-
.before_callbacks ⇒ Object
List of before callbacks.
-
.before_request(callback, params = {}) ⇒ Object
Before request filter.
- .clear_request_methods! ⇒ Object
-
.extend_with_actions(child_class) ⇒ nil
Returns all API public methods for a given class.
- .extra_methods ⇒ Object
-
.extract_class_name(name, options) ⇒ String
private
Extracts class name from options.
- .inherited(child_class) ⇒ Object
- .internal_methods ⇒ Object
- .method_added(method_name) ⇒ Object
-
.namespace(*names) ⇒ self
Defines a namespace.
-
.request_methods ⇒ Set
private
Find all the api methods that should be considred by request callbacks.
- .root! ⇒ Object
Instance Method Summary collapse
-
#api_methods_in(klass) ⇒ Object
private
Finds api methods in a class.
-
#arguments(args = (not_set = true), options = {}, &block) ⇒ Object
Acts as setter and getter for api requests arguments parsing.
-
#disable_redirects ⇒ Object
Disable following redirects inside a block.
-
#execute(action, *args, &block) ⇒ Object
private
Execute action.
-
#extract_basic_auth(auth) ⇒ Object
private
Extract login and password from basic_auth parameter.
-
#filter_callbacks(kind, action_name) ⇒ Array[Hash]
private
Filter callbacks based on kind.
-
#initialize(options = {}, &block) ⇒ API
constructor
Create new API.
-
#method_missing(method_name, *args, &block) ⇒ Object
private
Responds to attribute query or attribute clear.
-
#module_methods_in(klass) ⇒ Object
private
Finds methods included through class modules.
-
#run_callbacks(action_name, &block) ⇒ Object
private
Run all callbacks associated with this action.
-
#set(option, value = (not_set=true), ignore_setter = false, &block) ⇒ self
Set a configuration option for a given namespace.
-
#yield_or_eval(&block) ⇒ Object
private
Call block with argument.
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
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(={}, &block) opts = Github.configuration.fetch.merge() @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
.root ⇒ Object (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_options ⇒ Object
Returns the value of attribute current_options.
31 32 33 |
# File 'lib/github_api/api.rb', line 31 def @current_options end |
Class Method Details
.after_callbacks ⇒ Object
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_callbacks ⇒ Object
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.
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_methods ⇒ Object
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
336 337 338 339 340 341 342 |
# File 'lib/github_api/api.rb', line 336 def self.extract_class_name(name, ) converted = .fetch(:full_name, name).to_s converted = converted.split('_').map(&:capitalize).join class_name = .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_methods ⇒ Object
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
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) = 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, ) define_method(name) do |*args, &block| = args.last.is_a?(Hash) ? args.pop : {} API::Factory.new(class_name, .merge(), &block) end end |
.request_methods ⇒ Set
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.
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
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), ={}, &block) if not_set @arguments else @arguments = Arguments.new(.merge!(api: self)).parse(*args, &block) end end |
#disable_redirects ⇒ Object
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
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
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
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
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 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 |