Sha256: 954728d675a366594d212d829f1b9b570f51715333009f67d011f169edb26c3d

Contents?: true

Size: 1.1 KB

Versions: 3

Compression:

Stored size: 1.1 KB

Contents

# encoding: utf-8
# frozen_string_literal: true

module Traits
  class List
    include Enumerable

    def initialize(list = [])
      @list = list
    end

    def filter(hash)
      select do |item|
        hash.all? { |method, expected| compare(item, method, expected) }
      end
    end

    def first_where(hash)
      find do |item|
        hash.all? { |method, expected| compare(item, method, expected) }
      end
    end

    def [](arg)
      by_name(arg)
    end

    def each(&block)
      @list.each(&block)
    end

    def by_name(name)
      name = name.to_sym if name.kind_of?(String)
      find { |attr| attr.name == name }
    end

    def to_hash
      each_with_object({}) { |item, memo| memo[item.name] = item.to_hash }
    end

  protected
    def compare(item, method, expected)
      returned = item.send(method)
      case expected
        when Array  then expected.include?(returned)
        when Regexp then returned =~ expected
        else returned == expected
      end
    end
  end

  class AttributeList < List
    def primary_key
      first_where(primary_key?: true)
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
activerecord-traits-1.0.3 lib/traits/list.rb
activerecord-traits-1.0.2 lib/traits/list.rb
activerecord-traits-1.0.1 lib/traits/list.rb