Module: ActiveModule::Enum::Util
- Included in:
- ActiveModule::Enum
- Defined in:
- lib/active_module/enum/util.rb
Instance Method Summary collapse
- #build_ambiguity_map(modules) ⇒ Object
- #build_name_maps(modules) ⇒ Object
- #build_unique_names_map(modules, ambiguity) ⇒ Object
- #define_if_new(existing, name, &block) ⇒ Object
- #determine_prefix(attribute_name, prefix, suffix) ⇒ Object
- #determine_suffix(attribute_name, prefix, suffix) ⇒ Object
- #enum_method_name(value_name, opts) ⇒ Object
- #warn_if_ambiguous(mod, value_name, opts, maps) ⇒ Object
Instance Method Details
#build_ambiguity_map(modules) ⇒ Object
60 61 62 63 64 65 66 |
# File 'lib/active_module/enum/util.rb', line 60 def build_ambiguity_map(modules) modules.each_with_object({}) do |mod, h| mod.underscored_names.each do |name| (h[name] ||= []) << mod end end end |
#build_name_maps(modules) ⇒ Object
52 53 54 55 56 57 58 |
# File 'lib/active_module/enum/util.rb', line 52 def build_name_maps(modules) ambiguity = build_ambiguity_map(modules) unique = build_unique_names_map( modules, ambiguity ) { ambiguity: ambiguity, unique: unique } end |
#build_unique_names_map(modules, ambiguity) ⇒ Object
68 69 70 71 72 73 74 75 76 |
# File 'lib/active_module/enum/util.rb', line 68 def build_unique_names_map(modules, ambiguity) modules.each_with_object({}) do |mod, h| mod.underscored_names.each do |name| next if ambiguity[name].size > 1 (h[mod] ||= []) << name end end end |
#define_if_new(existing, name, &block) ⇒ Object
31 32 33 34 35 36 |
# File 'lib/active_module/enum/util.rb', line 31 def define_if_new(existing, name, &block) return if existing.include?(name) return if new.respond_to?(name) define_method(name, &block) end |
#determine_prefix(attribute_name, prefix, suffix) ⇒ Object
8 9 10 11 12 13 14 15 16 |
# File 'lib/active_module/enum/util.rb', line 8 def determine_prefix(attribute_name, prefix, suffix) if prefix.is_a?(String) prefix elsif prefix == true || (prefix.nil? && suffix == true && !prefix.nil?) prefix == true ? attribute_name.to_s : nil end end |
#determine_suffix(attribute_name, prefix, suffix) ⇒ Object
18 19 20 21 22 23 24 |
# File 'lib/active_module/enum/util.rb', line 18 def determine_suffix(attribute_name, prefix, suffix) if suffix.is_a?(String) suffix elsif suffix == true && prefix != true attribute_name.to_s end end |
#enum_method_name(value_name, opts) ⇒ Object
26 27 28 29 |
# File 'lib/active_module/enum/util.rb', line 26 def enum_method_name(value_name, opts) [opts[:prefix], value_name, opts[:suffix]] .compact.join("_") end |
#warn_if_ambiguous(mod, value_name, opts, maps) ⇒ Object
38 39 40 41 42 43 44 45 46 47 48 49 50 |
# File 'lib/active_module/enum/util.rb', line 38 def warn_if_ambiguous(mod, value_name, opts, maps) return unless maps[:ambiguity][value_name]&.size&.> 1 return if opts[:on_ambiguous] == :silence name = enum_method_name(value_name, opts) alts = (maps[:unique][mod] || []) .map { |a| "`#{a}`" } warn("WARNING: `#{name}` is ambiguous. " \ "Use #{alts.join(", ")} for " \ "unambiguous access. " \ "Pass on_ambiguous: :silence " \ "to suppress this warning.") end |