Module: Seabright::Types::ClassMethods
- Defined in:
- lib/redis_object/types.rb
Instance Method Summary collapse
- #describe ⇒ Object
- #dump_schema(file) ⇒ Object
- #field_formats ⇒ Object
- #field_formats_set_locally ⇒ Object
- #inherit_field_format(k, v) ⇒ Object
- #intercept_for_typing! ⇒ Object
- #method_missing(sym, *args, &block) ⇒ Object
- #register_format(k, fmt) ⇒ Object
- #register_type(sym, als = nil) ⇒ Object
- #set_field_format(k, v) ⇒ Object
- #update_child_class_field_formats(k, v) ⇒ Object
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(sym, *args, &block) ⇒ Object
50 51 52 53 54 55 56 57 58 59 60 61 |
# File 'lib/redis_object/types.rb', line 50 def method_missing(sym,*args,&block) if als = Types.type_aliases[sym] org = sym sym = als end if Types.known_types.include?(sym) register_type(sym,org) send(sym,*args,&block) else super(sym,*args,&block) end end |
Instance Method Details
#describe ⇒ Object
114 115 116 117 118 119 120 121 122 123 124 |
# File 'lib/redis_object/types.rb', line 114 def describe all_keys.inject({}) do |acc,(k,v)| if field_formats[k.to_sym] acc[k.to_sym] ||= [field_formats[k.to_sym].to_s.gsub(/^format_/,'').to_sym, 0] else acc[k.to_sym] ||= [:string, 0] end acc[k.to_sym][1] += 1 acc end end |
#dump_schema(file) ⇒ Object
126 127 128 129 130 131 132 133 134 135 |
# File 'lib/redis_object/types.rb', line 126 def dump_schema(file) child_classes_set.sort {|a,b| a.name <=> b.name}.each do |child| file.puts "# #{child.name}" # sort fields by number of instances found child.describe.sort {|a,b| b[1][1] <=> a[1][1]}.each do |field,(type, count)| file.puts "#{field}: #{type} (#{count})" end file.puts end end |
#field_formats ⇒ Object
81 82 83 |
# File 'lib/redis_object/types.rb', line 81 def field_formats @field_formats_hash ||= (defined?(superclass.field_formats) ? superclass.field_formats.clone : {}) end |
#field_formats_set_locally ⇒ Object
92 93 94 |
# File 'lib/redis_object/types.rb', line 92 def field_formats_set_locally @field_formats_set_locally_set ||= Set.new end |
#inherit_field_format(k, v) ⇒ Object
96 97 98 99 100 101 102 |
# File 'lib/redis_object/types.rb', line 96 def inherit_field_format(k, v) unless fields_formats_set_locally.include? k field_formats[k] = v update_child_class_field_formats(k, v) end intercept_for_typing! end |
#intercept_for_typing! ⇒ Object
137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
# File 'lib/redis_object/types.rb', line 137 def intercept_for_typing! return if @intercepted_for_typing filter_gets do |obj, k, v| obj.enforce_format(k, v) end filter_sets do |obj, k, v| [k, obj.save_format(k,v)] end filter_msets do |obj, dat| dat.merge!(dat) {|k,v1,v2| obj.save_format(k, v1) } end @intercepted_for_typing = true end |
#register_format(k, fmt) ⇒ Object
110 111 112 |
# File 'lib/redis_object/types.rb', line 110 def register_format(k,fmt) send(fmt, k) end |
#register_type(sym, als = nil) ⇒ Object
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
# File 'lib/redis_object/types.rb', line 63 def register_type(sym,als=nil) sym = sym.to_sym return if self.respond_to?(sym) self.send(:include,Types.const_get("#{sym.to_s.capitalize}Type".to_sym)) = class << self; self; end .class_eval do define_method(sym) do |k| set_field_format k, sym end if als als = als.to_sym define_method(als) do |k| set_field_format k, sym end end end end |
#set_field_format(k, v) ⇒ Object
85 86 87 88 89 90 |
# File 'lib/redis_object/types.rb', line 85 def set_field_format(k, v) field_formats_set_locally.add(k) field_formats[k] = v update_child_class_field_formats(k, v) intercept_for_typing! end |
#update_child_class_field_formats(k, v) ⇒ Object
104 105 106 107 108 |
# File 'lib/redis_object/types.rb', line 104 def update_child_class_field_formats(k, v) child_classes.each do |child_class| child_class.inherit_field_format(k, v) end end |