Class: OfflineLookup::DynamicModuleBuilder
- Inherits:
-
Object
- Object
- OfflineLookup::DynamicModuleBuilder
- Defined in:
- lib/offline_lookup/dynamic_module_builder.rb
Instance Method Summary collapse
- #add_all_dynamic_lookups ⇒ Object
- #add_dynamic_lookup_methods(key_value, value) ⇒ Object
-
#add_identity_method(key_value, value) ⇒ Object
Return true iff instance is of named type (e.g. FooType.first.bar?).
-
#add_key_for_name_method ⇒ Object
e.g.
-
#add_key_lookup_method(key_value, value) ⇒ Object
Get key value (e.g. FooType.bar_id).
-
#add_lookup_method(key_value, value) ⇒ Object
Get instance by named method (e.g. FooType.bar) (Not offline, but syntactic sugar).
-
#add_name_for_key_method ⇒ Object
e.g.
-
#add_static_lookup_method ⇒ Object
e.g.
- #build_module ⇒ Object
- #create_module ⇒ Object
- #get_module ⇒ Object
-
#initialize(model, options) ⇒ DynamicModuleBuilder
constructor
A new instance of DynamicModuleBuilder.
- #sanitize(string) ⇒ Object
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, ) @model = model @fields = [:fields].map(&:to_s) @key_name = [:key] @name = [:name] @build_identity_methods = [:identity_methods] @build_lookup_methods = [:lookup_methods] @modyule = get_module || create_module end |
Instance Method Details
#add_all_dynamic_lookups ⇒ Object
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_method ⇒ Object
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_method ⇒ Object
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_method ⇒ Object
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_module ⇒ Object
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_module ⇒ Object
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_module ⇒ Object
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 |