module AttrEnumerable

AttrEnumerable

AttrEnumerable

AttrEnumerable

AttrEnumerable

AttrEnumerable

AttrEnumerable

AttrEnumerable

AttrEnumerable

AttrEnumerable

AttrEnumerable

AttrEnumerable

AttrEnumerable

AttrEnumerable

AttrEnumerable

AttrEnumerable

AttrEnumerable

AttrEnumerable

AttrEnumerable

Constants

ATTR_METHODS
REQUIRES

Public Instance Methods

method_missing(method_name, *args, &block) click to toggle source

call attr enumerable method.

# File lib/attr_enumerable/attr_enumerable_helper.rb, line 26
def method_missing(method_name, *args, &block)
  target_method = detect(method_name)
  send(target_method[:call_method], target_method[:attribute], method_name, *args, &block)
rescue
  raise
end

Private Instance Methods

at_attr(attribute, method_name, *args, &block) click to toggle source
Calls superclass method
# File lib/attr_enumerable/at_attr.rb, line 7
def at_attr(attribute, method_name, *args, &block)
  return nil if collection.empty?
  index = Integer(args.first)
  super(method_name, *args) unless include_attr?(collection.first, attribute)
  element = collection.at(index)
  return nil if element.nil?
  element.send(attribute)
end
check_argument_length(*args) click to toggle source
# File lib/attr_enumerable/slice_attr.rb, line 17
def check_argument_length(*args)
  return if args.size > 0
  fail ArgumentError, 'wrong number of arguments (0 for 1..2) (ArgumentError)'
end
collection() click to toggle source
# File lib/attr_enumerable/attr_enumerable_helper.rb, line 49
def collection
  instance_variable_get("@#{self.class.name.underscore}")
end
compact_attr(attribute, method_name, *args, &block) click to toggle source
Calls superclass method
# File lib/attr_enumerable/compact_attr.rb, line 7
def compact_attr(attribute, method_name, *args, &block)
  return [] if collection.empty?
  super(method_name, *args) unless include_attr?(collection.first, attribute)
  collection.map(&attribute.to_sym).compact
end
concat_attr(attribute, method_name, *args, &block) click to toggle source
Calls superclass method
# File lib/attr_enumerable/concat_attr.rb, line 7
def concat_attr(attribute, method_name, *args, &block)
  add_array = Array(*args)
  return add_array if collection.empty?
  super(method_name, *args) unless include_attr?(collection.first, attribute)
  collection.map(&attribute.to_sym).concat(add_array)
end
delete_attr(attribute, method_name, *args, &block) click to toggle source
Calls superclass method
# File lib/attr_enumerable/delete_attr.rb, line 7
def delete_attr(attribute, method_name, *args, &block)
  del_target = args.first
  return [] if collection.empty?
  super(method_name, *args) unless include_attr?(collection.first, attribute)
  del_targets = collection.select { |v|v.send(attribute) == del_target }
  del_targets.each { |each_target|collection.delete(each_target) }
  del_targets
end
detect(method_name) click to toggle source
# File lib/attr_enumerable/attr_enumerable_helper.rb, line 34
def detect(method_name)
  ATTR_METHODS.each do |target_method|
    regexp = target_method[:regexp]
    if method_name.to_s =~ regexp
      attribute = method_name.to_s.scan(regexp).first.first
      return { call_method: target_method[:call_method], attribute: attribute }
    end
  end
  fail NoMethodError, "method is not exists #{method_name}"
end
each_attr(attribute, method_name, *args) { |send| ... } click to toggle source
Calls superclass method
# File lib/attr_enumerable/each_attr.rb, line 8
def each_attr(attribute, method_name, *args, &block)
  collection.each do |element|
    super(method_name, *args) unless include_attr?(element, attribute)
    yield element.send(attribute)
  end
end
each_attr_with_index(attribute, method_name, *args) { |send, index| ... } click to toggle source
Calls superclass method
# File lib/attr_enumerable/each_attr_with_index.rb, line 8
def each_attr_with_index(attribute, method_name, *args, &block)
  collection.each_with_index do |element, index|
    super(method_name, *args) unless include_attr?(element, attribute)
    yield element.send(attribute), index
  end
end
first_attr(attribute, method_name, *args, &block) click to toggle source
# File lib/attr_enumerable/first_attr.rb, line 7
def first_attr(attribute, method_name, *args, &block)
  col = collection
  return [] if col.empty?
  first_size = args.size == 0 ? nil : Integer(args.first)
  fail ArgumentError, "invalid attribute #{attribute}" unless include_attr?(col.first, attribute)
  attrs = col.map { |v|v.send(attribute) }
  first_size.nil? ? attrs.first : attrs.first(first_size)
end
include_attr?(element, attribute) click to toggle source
# File lib/attr_enumerable/attr_enumerable_helper.rb, line 45
def include_attr?(element, attribute)
  element.instance_variables.include? :"@#{attribute}"
end
include_attribute?(attribute, method_name, *args, &block) click to toggle source
# File lib/attr_enumerable/include_attr.rb, line 7
def include_attribute?(attribute, method_name, *args, &block)
  col = collection
  return false if col.empty?
  include_value = args.first
  fail ArgumentError, "invalid attribute #{attribute}" unless include_attr?(col.first, attribute)
  attrs = col.map { |v|v.send(attribute) }
  attrs.include?(include_value)
end
last_attr(attribute, method_name, *args, &block) click to toggle source
# File lib/attr_enumerable/last_attr.rb, line 7
def last_attr(attribute, method_name, *args, &block)
  col = collection
  return [] if col.empty?
  last_size = args.size == 0 ? nil : Integer(args.last)
  fail ArgumentError, "invalid attribute #{attribute}" unless include_attr?(col.last, attribute)
  attrs = col.map { |v|v.send(attribute) }
  last_size.nil? ? attrs.last : attrs.last(last_size)
end
map_attr(attribute, method_name, *args) { |e| ... } click to toggle source
# File lib/attr_enumerable/map_attr.rb, line 7
def map_attr(attribute, method_name, *args, &block)
  col = collection
  return [] if col.empty?
  fail ArgumentError, "invalid attribute #{attribute}" unless include_attr?(col.first, attribute)
  attrs = col.map { |v|v.send(attribute) }
  attrs.reduce([]) { |a, e|a << yield(e); a }
end
reduce_attr(attribute, method_name, *args) { |a, e| ... } click to toggle source
# File lib/attr_enumerable/reduce_attr.rb, line 7
def reduce_attr(attribute, method_name, *args, &block)
  col = collection
  init_value = args.size == 0 ? 0 : args.first
  return init_value if col.empty?
  fail ArgumentError, "invalid attribute #{attribute}" unless include_attr?(col.first, attribute)
  attrs = col.map { |e|e.send(attribute) }
  attrs.reduce(init_value) { |a, e|a = yield(a, e); a }
end
reverse_attr(attribute, *args, &block) click to toggle source
Calls superclass method
# File lib/attr_enumerable/reverse_attr.rb, line 8
def reverse_attr(attribute, *args, &block)
  collection.reduce([]) do |r, e|
    super(method_name, *args) unless include_attr?(e, attribute)
    r << e.send(attribute)
    r
  end.reverse
end
sample_attr(attribute, method_name, *args, &block) click to toggle source
# File lib/attr_enumerable/sample_attr.rb, line 7
def sample_attr(attribute, method_name, *args, &block)
  col = collection
  count = args.size == 0 ? 1 : Integer(args.first)
  fail ArgumentError, "invalid attribute #{attribute}" unless include_attr?(col.first, attribute)
  attrs = col.map { |e|e.send(attribute) }
  attrs.sample(count)
end
select_attr(attribute, method_name, *args) { |e| ... } click to toggle source
# File lib/attr_enumerable/select_attr.rb, line 7
def select_attr(attribute, method_name, *args, &block)
  col = collection
  # count = args.size == 0 ? 1 : Integer(args.first)
  fail ArgumentError, "invalid attribute #{attribute}" unless include_attr?(col.first, attribute)
  attrs = col.map { |e|e.send(attribute) }
  attrs.select { |e| yield(e) }
end
shuffle_attr(attribute, method_name, *args, &block) click to toggle source
# File lib/attr_enumerable/shuffle_attr.rb, line 7
def shuffle_attr(attribute, method_name, *args, &block)
  col = collection
  count = args.size == 0 ? 1 : Integer(args.first)
  fail ArgumentError, "invalid attribute #{attribute}" unless include_attr?(col.first, attribute)
  attrs = col.map { |e|e.send(attribute) }
  attrs.shuffle
end
slice_attr(attribute, method_name, *args, &block) click to toggle source
# File lib/attr_enumerable/slice_attr.rb, line 7
def slice_attr(attribute, method_name, *args, &block)
  check_argument_length(*args)
  col = collection
  index_or_range = args.first
  length = args.size > 1 ? args[1] : nil
  fail ArgumentError, "invalid attribute #{attribute}" unless include_attr?(col.first, attribute)
  attrs = col.map { |e|e.send(attribute) }
  length ? attrs.slice(index_or_range, length) : attrs.slice(index_or_range)
end