class Github::API
Core class for api interface operations
def self.inherited(klass)
def self.inherited(klass) klass.class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1 def self.actions self.new.api_methods_in(#{klass}) end def actions api_methods_in(#{klass}) end RUBY_EVAL super end
def _merge_mime_type(resource, params) # :nodoc:
def _merge_mime_type(resource, params) # :nodoc: params['resource'] = resource params['mime_type'] = params['mime_type'] || :raw end
def api_methods_in(klass)
def api_methods_in(klass) puts "---" (klass.send(:instance_methods, false) - ['actions']).sort.each do |method| puts "|--> #{method}" end klass.included_modules.each do |mod| if mod.to_s =~ /#{klass}/ puts "| \\ #{mod.to_s}" mod.instance_methods(false).each do |met| puts "| |--> #{met}" end puts "| /" end end puts "---" nil end
def append_arguments(method)
def append_arguments(method) _method = self.method(method) if _method.arity == 0 args = "()" elsif _method.arity > 0 args = "(few)" else args = "(else)" end args end
def arguments(args=(not_set = true), options={}, &block)
Returns Arguments instance.
Acts as setter and getter for api requests arguments parsing.
def arguments(args=(not_set = true), options={}, &block) if not_set @arguments else @arguments = Arguments.new(self, options).parse(*args, &block) end end
def define_accessors(option, value)
def define_accessors(option, value) setter = proc { |val| set option, value } getter = proc { value } define_singleton_method("#{option}=", setter) if setter define_singleton_method(option, getter) if getter end
def define_singleton_method(name, content=Proc.new)
Dynamically define a method for setting request option
def define_singleton_method(name, content=Proc.new) (class << self; self; end).class_eval do undef_method(name) if method_defined? name if String === content class_eval("def #{name}() #{content}; end") else define_method(name, &content) end end end
def initialize(options={}, &block)
Create new API
def initialize(options={}, &block) setup(options) client(options) if client_id? && client_secret? yield_or_eval(&block) if block_given? end
def method_missing(method, *args, &block) # :nodoc:
Responds to attribute query or attribute clear
def method_missing(method, *args, &block) # :nodoc: case method.to_s when /^(.*)\?$/ return !!self.send($1.to_s) when /^clear_(.*)$/ self.send("#{$1.to_s}=", nil) else super end end
def process_basic_auth(auth)
Extract login and password from basic_auth parameter
def process_basic_auth(auth) case auth when String self.login, self.password = auth.split(':', 2) when Hash self.login = auth[:login] self.password = auth[:password] end end
def set(option, value=(not_set = true), &block)
def set(option, value=(not_set = true), &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}=") return __send__("#{option}=", value) end define_accessors option, value self end
def set_options(options)
Set multiple options
def set_options(options) unless options.respond_to?(:each) raise ArgumentError, 'cannot iterate over value' end options.each { |key, value| set(key, value) } end
def setup(options={})
Configure options and process basic authorization
def setup(options={}) options = Github.options.merge(options) self.current_options = options Configuration.keys.each do |key| send("#{key}=", options[key]) end process_basic_auth(options[:basic_auth]) end
def with(args)
Scope for passing request required arguments.
def with(args) case args when Hash set args when /.*\/.*/i user, repo = args.split('/') set :user => user, :repo => repo else ::Kernel.raise ArgumentError, 'This api does not support passed in arguments' end end
def yield_or_eval(&block)
def yield_or_eval(&block) return unless block block.arity > 0 ? yield(self) : self.instance_eval(&block) end