Class: OfflineLookup::DynamicModuleBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/offline_lookup/dynamic_module_builder.rb

Instance Method Summary collapse

Constructor Details

#initialize(model, options) ⇒ DynamicModuleBuilder

Returns a new instance of DynamicModuleBuilder.



3
4
5
6
7
8
9
10
11
# File 'lib/offline_lookup/dynamic_module_builder.rb', line 3

def initialize(model, options)
  @model = model
  @fields = options[:fields].map(&:to_s)
  @key_name = options[:key]
  @name = options[:name]
  @build_identity_methods = options[:identity_methods]
  @build_lookup_methods = options[:lookup_methods]
  @modyule = get_module || create_module
end

Instance Method Details

#add_all_dynamic_lookupsObject



33
34
35
# File 'lib/offline_lookup/dynamic_module_builder.rb', line 33

def add_all_dynamic_lookups
  @model.offline_lookup_values.each{|key_value, value| add_dynamic_lookup_methods(key_value, value)}
end

#add_dynamic_lookup_methods(key_value, value) ⇒ Object



37
38
39
40
41
# File 'lib/offline_lookup/dynamic_module_builder.rb', line 37

def add_dynamic_lookup_methods(key_value, value)
  add_key_lookup_method(key_value, value)
  add_identity_method(key_value, value) if @build_identity_methods
  add_lookup_method(key_value, value) if @build_lookup_methods
end

#add_identity_method(key_value, value) ⇒ Object

Return true iff instance is of named type (e.g. FooType.first.bar?)



54
55
56
57
58
59
60
61
# File 'lib/offline_lookup/dynamic_module_builder.rb', line 54

def add_identity_method(key_value, value)
  identify_method_name = sanitize(value) + "?"
  @modyule.instance_exec(identify_method_name, @key_name, key_value) do |method_name, key_name, key_value|
    define_method method_name do
      self.attributes[key_name] == key_value
    end
  end
end

#add_key_for_name_methodObject

e.g. FooType.id_for_name(“Bar”)



84
85
86
87
88
89
90
91
# File 'lib/offline_lookup/dynamic_module_builder.rb', line 84

def add_key_for_name_method
  method_name = sanitize("#{@key_name}_for_#{@name}")
  @modyule::ClassMethods.instance_exec(method_name) do |method_name|
    define_method method_name do |value|
      self.offline_lookup_values.key(value.to_s)
    end
  end
end

#add_key_lookup_method(key_value, value) ⇒ Object

Get key value (e.g. FooType.bar_id)



44
45
46
47
48
49
50
51
# File 'lib/offline_lookup/dynamic_module_builder.rb', line 44

def add_key_lookup_method(key_value, value)
  key_lookup_method_name = sanitize("#{value}_#{@key_name}")
  @modyule::ClassMethods.instance_exec(key_lookup_method_name, key_value, value) do |method_name, key_value|
    define_method method_name do
      key_value
    end
  end
end

#add_lookup_method(key_value, value) ⇒ Object

Get instance by named method (e.g. FooType.bar) (Not offline, but syntactic sugar)



64
65
66
67
68
69
70
71
# File 'lib/offline_lookup/dynamic_module_builder.rb', line 64

def add_lookup_method(key_value, value)
  lookup_method_name = sanitize(value)
  @modyule::ClassMethods.instance_exec(lookup_method_name, @key_name, key_value, value) do |method_name, key_name, key_value|
    define_method method_name do
      find_by(key_name => key_value)
    end
  end
end

#add_name_for_key_methodObject

e.g. FooType.name_for_id(1)



74
75
76
77
78
79
80
81
# File 'lib/offline_lookup/dynamic_module_builder.rb', line 74

def add_name_for_key_method
  method_name = sanitize("#{@name}_for_#{@key_name}")
  @modyule::ClassMethods.instance_exec(method_name) do |method_name|
    define_method method_name do |key|
      self.offline_lookup_values[key]
    end
  end
end

#add_static_lookup_methodObject

e.g. FooType.lookup(“Bar”)



94
95
96
97
98
99
100
# File 'lib/offline_lookup/dynamic_module_builder.rb', line 94

def add_static_lookup_method
  @modyule::ClassMethods.instance_exec(@key_name) do |key_name|
    define_method "lookup" do |value|
      find_by(key_name => self.offline_lookup_values.key(value.to_s))
    end
  end
end

#build_moduleObject



25
26
27
28
29
30
31
# File 'lib/offline_lookup/dynamic_module_builder.rb', line 25

def build_module
  add_all_dynamic_lookups
  add_name_for_key_method
  add_key_for_name_method
  add_static_lookup_method
  return @modyule
end

#create_moduleObject



17
18
19
20
21
22
23
# File 'lib/offline_lookup/dynamic_module_builder.rb', line 17

def create_module
  modyule = Module.new
  modyule.extend ActiveSupport::Concern
  modyule.const_set("ClassMethods", Module.new)
  @model.const_set("OfflineLookupMethods", modyule)
  return modyule
end

#get_moduleObject



13
14
15
# File 'lib/offline_lookup/dynamic_module_builder.rb', line 13

def get_module
  @model.const_defined?("OfflineLookupMethods") && @model::OfflineLookupMethods
end

#sanitize(string) ⇒ Object



102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/offline_lookup/dynamic_module_builder.rb', line 102

def sanitize(string)
  #1. Replace illegal chars and _ boundaries with " " boundary
  string = string.to_s.gsub(/[^a-zA-Z\d]+/," ").strip
  #2. Insert " " boundary at snake-case boundaries
  string.gsub!(/([a-z])([A-Z])/){|s| "#{$1} #{$2}"}
  #3. underscore
  string.gsub!(/\s+/, "_")
  string.downcase!
  #4. Append underscore if name begins with digit
  string = "_#{string}" if string.length == 0 || string[0] =~ /\d/
  return string
end