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::Teams, 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::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.
-
#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() = 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
235 236 237 238 239 240 241 242 243 244 |
# File 'lib/github_api/api.rb', line 235 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.
111 112 113 |
# File 'lib/github_api/api.rb', line 111 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 end |
Class Method Details
.after_callbacks ⇒ Object
List of after callbacks
92 93 94 |
# File 'lib/github_api/api.rb', line 92 def self.after_callbacks @after_callbacks ||= [] end |
.after_request(callback, params = {}) ⇒ Object
After request filter
106 107 108 |
# File 'lib/github_api/api.rb', line 106 def self.after_request(callback, params = {}) after_callbacks << params.merge(callback: callback) end |
.before_callbacks ⇒ Object
List of before callbacks
85 86 87 |
# File 'lib/github_api/api.rb', line 85 def self.before_callbacks @before_callbacks ||= [] end |
.before_request(callback, params = {}) ⇒ Object
Before request filter
99 100 101 |
# File 'lib/github_api/api.rb', line 99 def self.before_request(callback, params = {}) before_callbacks << params.merge(callback: callback) end |
.clear_request_methods! ⇒ Object
160 161 162 |
# File 'lib/github_api/api.rb', line 160 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 " def self.actions\n self.new.actions\n end\n\n def actions\n api_methods_in(\#{child_class}) + module_methods_in(\#{child_class})\n end\n RUBY_EVAL\nend\n", __FILE__, __LINE__ + 1 |
.extra_methods ⇒ Object
141 142 143 |
# File 'lib/github_api/api.rb', line 141 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
326 327 328 329 330 331 332 |
# File 'lib/github_api/api.rb', line 326 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
119 120 121 122 123 124 125 126 127 128 129 130 131 |
# File 'lib/github_api/api.rb', line 119 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
135 136 137 138 139 |
# File 'lib/github_api/api.rb', line 135 def self.internal_methods api = self api = api.superclass until api.root? api.public_instance_methods(true) end |
.method_added(method_name) ⇒ Object
164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 |
# File 'lib/github_api/api.rb', line 164 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
295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 |
# File 'lib/github_api/api.rb', line 295 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.
151 152 153 154 155 156 157 158 |
# File 'lib/github_api/api.rb', line 151 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
115 116 117 |
# File 'lib/github_api/api.rb', line 115 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.
250 251 252 253 254 255 256 |
# File 'lib/github_api/api.rb', line 250 def arguments(args=(not_set = true), ={}, &block) if not_set @arguments else @arguments = Arguments.new(.merge!(api: self)).parse(*args, &block) end 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
223 224 225 226 227 228 229 230 |
# File 'lib/github_api/api.rb', line 223 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
201 202 203 204 205 |
# File 'lib/github_api/api.rb', line 201 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
212 213 214 215 216 |
# File 'lib/github_api/api.rb', line 212 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
267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 |
# File 'lib/github_api/api.rb', line 267 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 |