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