lib/selectable_attr/enum.rb in selectable_attr-0.3.11 vs lib/selectable_attr/enum.rb in selectable_attr-0.3.12

- old
+ new

@@ -7,111 +7,111 @@ class << self def instances @@instances ||= [] end end - + def initialize(&block) @entries = [] instance_eval(&block) if block_given? SelectableAttr::Enum.instances << self end - + def entries @entries end - + def each(&block) entries.each(&block) end - + def define(id, key, name, options = nil, &block) entry = Entry.new(self, id, key, name, options, &block) entry.instance_variable_set(:@defined_in_code, true) @entries << entry end alias_method :entry, :define - + def i18n_scope(*path) @i18n_scope = path unless path.empty? @i18n_scope end - + def match_entry(entry, value, *attrs) attrs.any?{|attr| entry[attr].to_s == value.to_s} end def entry_by(value, *attrs) entries.detect{|entry| match_entry(entry, value, *attrs)} || Entry::NULL end - + def entry_by_id(id) entry_by(id, :id) end - + def entry_by_key(key) entry_by(key, :key) end - + def entry_by_id_or_key(id_or_key) entry_by(id_or_key, :id, :key) end - + def entry_by_hash(attrs) entries.detect{|entry| attrs.all?{|(attr, value)| entry[attr].to_s == value.to_s }} || Entry::NULL end - + def [](arg) arg.is_a?(Hash) ? entry_by_hash(arg) : entry_by_id_or_key(arg) end - + def values(*args) args = args.empty? ? [:name, :id] : args result = entries.collect{|entry| args.collect{|arg| entry.send(arg) }} (args.length == 1) ? result.flatten : result end - + def map_attrs(attrs, *ids_or_keys) if attrs.is_a?(Array) - ids_or_keys.empty? ? - entries.map{|entry| attrs.map{|attr|entry.send(attr)}} : + ids_or_keys.empty? ? + entries.map{|entry| attrs.map{|attr|entry.send(attr)}} : ids_or_keys.map do |id_or_key| entry = entry_by_id_or_key(id_or_key) attrs.map{|attr|entry.send(attr)} end else attr = attrs - ids_or_keys.empty? ? - entries.map(&attr.to_sym) : + ids_or_keys.empty? ? + entries.map(&attr.to_sym) : ids_or_keys.map{|id_or_key|entry_by_id_or_key(id_or_key).send(attr)} end end - + def ids(*ids_or_keys); map_attrs(:id, *ids_or_keys); end def keys(*ids_or_keys); map_attrs(:key, *ids_or_keys); end def names(*ids_or_keys); map_attrs(:name, *ids_or_keys); end def options(*ids_or_keys); map_attrs([:name, :id], *ids_or_keys); end def key_by_id(id); entry_by_id(id).key; end def id_by_key(key); entry_by_key(key).id; end def name_by_id(id); entry_by_id(id).name; end def name_by_key(key); entry_by_key(key).name; end - + def find(options = nil, &block) - entries.detect{|entry| - block_given? ? yield(entry) : entry.match?(options) + entries.detect{|entry| + block_given? ? yield(entry) : entry.match?(options) } || Entry::NULL end - + def to_hash_array entries.map do |entry| result = entry.to_hash yield(result) if defined? yield result end end - + def length entries.length end alias_method :size, :length @@ -125,30 +125,30 @@ @key = key @name = name @options = options self.instance_eval(&block) if block end - + attr_reader :name - + def [](option_key) BASE_ATTRS.include?(option_key) ? send(option_key) : @options ? @options[option_key] : nil end - + def match?(options) @options === options end - + def null? false end - + def null_object? self.null? end - + def to_hash (@options || {}).merge(:id => @id, :key => @key, :name => name) end def inspect @@ -160,9 +160,9 @@ NULL = new(nil, nil, nil, nil) do def null?; true; end def name; nil; end end end - + end end