class Github::Arguments

Request arguments handler

def assert_required(required)


Check if required keys are present inside parameters hash.
def assert_required(required)
  assert_required_keys required, params
  self
end

def assert_values(values, key=nil)


Check if parameters match expected values.
def assert_values(values, key=nil)
  assert_valid_values values, (key.nil? ? params : params[key])
  self
end

def check_assignment!(options)


Check if required arguments have been set on instance.
def check_assignment!(options)
  result = required.inject({}) { |hash, arg|
    if api.respond_to?(:"#{arg}") && (value = api.send(:"#{arg}"))
      hash[arg] = value
    end
    hash
  }
  assert_presence_of result
  result
end

def check_requirement!(*args)


Check if required arguments are present.
def check_requirement!(*args)
  args_length     = args.length
  required_length = required.length
  if args_length < required_length
    ::Kernel.raise ArgumentError, "wrong number of arguments (#{args_length} for #{required_length})"
  end
end

def extract_pagination(options)


Fine auto_pagination parameter in options hash
def extract_pagination(options)
  if (value = options.delete(AUTO_PAGINATION))
    api.auto_pagination = value
  end
end

def extract_remaining(args)


Find remaining arguments
def extract_remaining(args)
  args[required.size..-1]
end

def initialize(api, options={})


:required - arguments that must be present before request is fired
= Parameters

Takes api, filters and required arguments
def initialize(api, options={})
  normalize! options
  @api      = api
  @required = options.fetch('required', []).map(&:to_s)
  @optional = options.fetch('optional', []).map(&:to_s)
end

def parse(*args, &block)


Arguments can be part of parameters hash or be simple string arguments.
Parse arguments to allow for flexible api calls.
def parse(*args, &block)
  options = args.extract_options!
  normalize! options
  if !args.size.zero?
    parse_arguments *args
  else
    # Arguments are inside the parameters hash
    parse_options options
  end
  @params = options
  @remaining = extract_remaining(args)
  extract_pagination(options)
  yield_or_eval(&block)
  self
end

def parse_arguments(*args)


Check and set all requried arguments.
def parse_arguments(*args)
  assert_presence_of *args
  required.each_with_index do |req, indx|
    api.set req, args[indx]
  end
  check_requirement!(*args)
end

def parse_options(options)


validate their presence(if not nil or empty string).
Remove required arguments from parameters and
def parse_options(options)
  options.each { |key, val| remove_required(options, key, val) }
  provided_args = check_assignment!(options)
  check_requirement!(*provided_args.keys)
end

def remove_required(options, key, val)


Remove required argument from parameters
def remove_required(options, key, val)
  key = key.to_s
  if required.include? key
    assert_presence_of val
    options.delete key
    api.set key, val
  end
end

def sift(keys, key=nil, options={})


:recursive - boolean that toggles whether nested filtering should be applied
= Parameters

Remove unkown keys from parameters hash.
def sift(keys, key=nil, options={})
  filter! keys, (key.nil? ? params : params[key]), options if keys.any?
  self
end

def yield_or_eval(&block)


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