Module: ActiveModule::Enum::Util

Included in:
ActiveModule::Enum
Defined in:
lib/active_module/enum/util.rb

Instance Method Summary collapse

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