module Neo4j::Shared::Enum::ClassMethods

Constants

DEFAULT_OPTIONS_FOR_ENUMS
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 Neo4j::ActiveNode
  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 Disable index: :exact for enum elements

Media.enum type: [:image, :video, :unknown], _index: false

@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/neo4j/shared/enum.rb
46 def enum(parameters = {})
47   options, parameters = *split_options_and_parameters(parameters)
48   parameters.each do |property_name, enum_keys|
49     enum_keys = normalize_key_list enum_keys
50     @neo4j_enum_data ||= {}
51     @neo4j_enum_data[property_name] = enum_keys
52     define_property(property_name, enum_keys, options)
53     define_enum_methods(property_name, enum_keys, options)
54   end
55 end

Protected Instance Methods

build_method_name(base_name, property_name, options) click to toggle source
    # File lib/neo4j/shared/enum.rb
133 def build_method_name(base_name, property_name, options)
134   method_name = base_name
135   method_name = "#{method_name}_#{property_name}" if options[:_suffix]
136   method_name = "#{options[:_prefix]}_#{method_name}" if options[:_prefix]
137   method_name
138 end
build_property_options(_enum_keys, options = {}) click to toggle source
   # File lib/neo4j/shared/enum.rb
94 def build_property_options(_enum_keys, options = {})
95   {
96     default: options[:_default]
97   }
98 end
check_enum_method_conflicts!(property_name, method_name) click to toggle source
    # File lib/neo4j/shared/enum.rb
140 def check_enum_method_conflicts!(property_name, method_name)
141   fail ConflictingEnumMethodError,
142        "The enum `#{property_name}` is trying to define a `#{method_name}` method, "\
143        'that is already defined. Try to use options `:prefix` or `:suffix` '\
144        'to avoid conflicts.' if instance_methods(false).include?(method_name)
145 end
define_class_methods(property_name, enum_keys) click to toggle source
    # File lib/neo4j/shared/enum.rb
106 def define_class_methods(property_name, enum_keys)
107   plural_property_name = property_name.to_s.pluralize.to_sym
108   define_singleton_method(plural_property_name) do
109     enum_keys
110   end
111 end
define_enum_methods(property_name, enum_keys, options) click to toggle source
    # File lib/neo4j/shared/enum.rb
100 def define_enum_methods(property_name, enum_keys, options)
101   define_enum_methods_?(property_name, enum_keys, options)
102   define_enum_methods_!(property_name, enum_keys, options)
103   define_class_methods(property_name, enum_keys)
104 end
define_enum_methods_!(property_name, enum_keys, options) click to toggle source
    # File lib/neo4j/shared/enum.rb
123 def define_enum_methods_!(property_name, enum_keys, options)
124   enum_keys.keys.each do |enum_value|
125     method_name = build_method_name(enum_value, property_name, options)
126     check_enum_method_conflicts! property_name, :"#{method_name}!"
127     define_method("#{method_name}!") do
128       __send__("#{property_name}=", enum_value)
129     end
130   end
131 end
define_enum_methods_?(property_name, enum_keys, options) click to toggle source
    # File lib/neo4j/shared/enum.rb
113 def define_enum_methods_?(property_name, enum_keys, options)
114   enum_keys.keys.each do |enum_value|
115     method_name = build_method_name(enum_value, property_name, options)
116     check_enum_method_conflicts! property_name, :"#{method_name}?"
117     define_method("#{method_name}?") do
118       __send__(property_name).to_s.to_sym == enum_value
119     end
120   end
121 end
define_property(property_name, enum_keys, options) click to toggle source
   # File lib/neo4j/shared/enum.rb
88 def define_property(property_name, enum_keys, options)
89   property_options = build_property_options(enum_keys, options)
90   property property_name, property_options
91   serialize property_name, Neo4j::Shared::TypeConverters::EnumConverter.new(enum_keys, property_options)
92 end
normalize_key_list(enum_keys) click to toggle source
   # File lib/neo4j/shared/enum.rb
59 def normalize_key_list(enum_keys)
60   case enum_keys
61   when Hash
62     enum_keys
63   when Array
64     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 end
split_options_and_parameters(parameters) click to toggle source
   # File lib/neo4j/shared/enum.rb
75 def split_options_and_parameters(parameters)
76   options = DEFAULT_OPTIONS_FOR_ENUMS.clone
77   new_parameters = {}
78   parameters.each do |k, v|
79     if VALID_OPTIONS_FOR_ENUMS.include? k
80       options[k] = v
81     else
82       new_parameters[k] = v
83     end
84   end
85   [options, new_parameters]
86 end