module ActiveGraph::Shared::Enum::ClassMethods
Constants
- VALID_OPTIONS_FOR_ENUMS
Attributes
neo4j_enum_data[R]
Public Instance Methods
enum(parameters = {})
click to toggle source
Similar to ActiveRecord enum, maps an integer value on the database to a set of enum keys.
@example Base
example
class Media include ActiveGraph::Node enum type: [:image, :video, :unknown] end Media.types # => { :images => 0, :video => 1, :unknown => 2 } media.video! media.image? # => false media.type # => :video Media.videos # => All medias with type = 1 (:video) Media.where(type: :video) # => All medias with type = 1 (:video)
@example Prefix-ing an enum
Media.enum type: [:image, :video, :unknown], _prefix: :enum media.enum_video! media.enum_video? # => true
@example Suffix-ing an enum
Media.enum type: [:image, :video, :unknown], _suffix: true media.video_type! media.video_type? # => true
@example Define a custom mapping for keys-numbers
Media.enum type: { image: 1, video: 2, unknown: 3 }
@see edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html
# File lib/active_graph/shared/enum.rb 44 def enum(parameters = {}) 45 options, parameters = *split_options_and_parameters(parameters) 46 parameters.each do |property_name, enum_keys| 47 enum_keys = normalize_key_list enum_keys, options 48 @neo4j_enum_data ||= {} 49 @neo4j_enum_data[property_name] = enum_keys 50 define_property(property_name, enum_keys, options) 51 define_enum_methods(property_name, enum_keys, options) 52 end 53 end
Protected Instance Methods
build_enum_options(enum_keys, options = {})
click to toggle source
# File lib/active_graph/shared/enum.rb 109 def build_enum_options(enum_keys, options = {}) 110 if options[:_default] && not(enum_keys.include?(options[:_default])) 111 fail ArgumentError, 'Enum default value must match an enum key' 112 end 113 114 build_property_options(enum_keys, options).tap do |enum_options| 115 enum_options[:case_sensitive] = options[:_case_sensitive] 116 end 117 end
build_method_name(base_name, property_name, options)
click to toggle source
# File lib/active_graph/shared/enum.rb 152 def build_method_name(base_name, property_name, options) 153 method_name = base_name 154 method_name = "#{method_name}_#{property_name}" if options[:_suffix] 155 method_name = "#{options[:_prefix]}_#{method_name}" if options[:_prefix] 156 method_name 157 end
build_property_options(_enum_keys, options = {})
click to toggle source
# File lib/active_graph/shared/enum.rb 103 def build_property_options(_enum_keys, options = {}) 104 { 105 default: options[:_default] 106 } 107 end
check_enum_method_conflicts!(property_name, method_name)
click to toggle source
# File lib/active_graph/shared/enum.rb 159 def check_enum_method_conflicts!(property_name, method_name) 160 fail ConflictingEnumMethodError, 161 "The enum `#{property_name}` is trying to define a `#{method_name}` method, "\ 162 'that is already defined. Try to use options `:prefix` or `:suffix` '\ 163 'to avoid conflicts.' if instance_methods(false).include?(method_name) 164 end
define_class_methods(property_name, enum_keys)
click to toggle source
# File lib/active_graph/shared/enum.rb 125 def define_class_methods(property_name, enum_keys) 126 plural_property_name = property_name.to_s.pluralize.to_sym 127 define_singleton_method(plural_property_name) do 128 enum_keys 129 end 130 end
define_enum_methods(property_name, enum_keys, options)
click to toggle source
# File lib/active_graph/shared/enum.rb 119 def define_enum_methods(property_name, enum_keys, options) 120 define_enum_methods_?(property_name, enum_keys, options) 121 define_enum_methods_!(property_name, enum_keys, options) 122 define_class_methods(property_name, enum_keys) 123 end
define_enum_methods_!(property_name, enum_keys, options)
click to toggle source
# File lib/active_graph/shared/enum.rb 142 def define_enum_methods_!(property_name, enum_keys, options) 143 enum_keys.each_key do |enum_value| 144 method_name = build_method_name(enum_value, property_name, options) 145 check_enum_method_conflicts! property_name, :"#{method_name}!" 146 define_method("#{method_name}!") do 147 __send__("#{property_name}=", enum_value) 148 end 149 end 150 end
define_enum_methods_?(property_name, enum_keys, options)
click to toggle source
# File lib/active_graph/shared/enum.rb 132 def define_enum_methods_?(property_name, enum_keys, options) 133 enum_keys.each_key do |enum_value| 134 method_name = build_method_name(enum_value, property_name, options) 135 check_enum_method_conflicts! property_name, :"#{method_name}?" 136 define_method("#{method_name}?") do 137 __send__(property_name).to_s.to_sym == enum_value 138 end 139 end 140 end
define_property(property_name, enum_keys, options)
click to toggle source
# File lib/active_graph/shared/enum.rb 93 def define_property(property_name, enum_keys, options) 94 property property_name, build_property_options(enum_keys, options) 95 serialize property_name, ActiveGraph::Shared::TypeConverters::EnumConverter.new(enum_keys, build_enum_options(enum_keys, options)) 96 97 # If class has already been inherited, make sure subclasses fully inherit enum 98 subclasses.each do |klass| 99 klass.serialized_properties = self.serialized_properties 100 end 101 end
normalize_key_list(enum_keys, options)
click to toggle source
# File lib/active_graph/shared/enum.rb 57 def normalize_key_list(enum_keys, options) 58 case_sensitive = options.fetch(:_case_sensitive, ActiveGraph::Config.enums_case_sensitive) 59 60 case enum_keys 61 when Hash 62 enum_keys 63 when Array 64 enum_keys = Hash[enum_keys.each_with_index.to_a] 65 else 66 fail ArgumentError, 'Invalid parameter for enum. Please provide an Array or an Hash.' 67 end 68 69 unless case_sensitive 70 enum_keys.each_key do |key| 71 fail ArgumentError, 'Enum keys must be lowercase unless _case_sensitive = true' unless key.downcase == key 72 end 73 end 74 75 enum_keys 76 end
split_options_and_parameters(parameters)
click to toggle source
# File lib/active_graph/shared/enum.rb 80 def split_options_and_parameters(parameters) 81 options = {} 82 new_parameters = {} 83 parameters.each do |k, v| 84 if VALID_OPTIONS_FOR_ENUMS.include? k 85 options[k] = v 86 else 87 new_parameters[k] = v 88 end 89 end 90 [options, new_parameters] 91 end