power_enum 0.6.3 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -385,8 +385,12 @@ The `:on_lookup_failure` option in has\_enumerated is there because you may want
385
385
  situations where the argument passed to `status=(arg)` is invalid. By default, an invalid value will cause an
386
386
  ArgumentError to be raised.
387
387
 
388
- Of course, this may not be optimal in your situation. In this case you can specify an *instance* method to be called in
389
- the case of a lookup failure. The method signature is as follows:
388
+ Of course, this may not be optimal in your situation. In this case you can do one of two thigs:
389
+
390
+ 1) You can set it to 'validation\_error'. In this case, the invalid value will be cached and returned on
391
+ subsequent lookups, but the model will fail validation.
392
+
393
+ 2) Specify an *instance* method to be called in the case of a lookup failure. The method signature is as follows:
390
394
 
391
395
  your_lookup_handler(operation, name, name_foreign_key, acts_enumerated_class_name, lookup_value)
392
396
 
@@ -32,8 +32,12 @@ module ActiveRecord
32
32
  # [:on_lookup_failure]
33
33
  # The :on_lookup_failure option in has_enumerated is there because you may want to create an error handler for
34
34
  # situations where the argument passed to status=(arg) is invalid. By default, an invalid value will cause an
35
- # ArgumentError to be raised. Since this may not be optimal in your situation, you can specify an instance
36
- # method to be called in the case of a lookup failure. The method signature is as follows:
35
+ # ArgumentError to be raised. Since this may not be optimal in your situation, you can do one of two things:
36
+ #
37
+ # 1) You can set it to 'validation_error'. In this case, the invalid value will be cached and returned on
38
+ # subsequent lookups, but the model will fail validation.
39
+ # 2) You can specify an instance method to be called in the case of a lookup failure. The method signature is
40
+ # as follows:
37
41
  # <tt>your_lookup_handler(operation, name, name_foreign_key, acts_enumerated_class_name, lookup_value)</tt>
38
42
  # The 'operation' arg will be either :read or :write. In the case of :read you are expected to return
39
43
  # something or raise an exception, while in the case of a :write you don't have to return anything. Note that
@@ -79,14 +83,20 @@ module ActiveRecord
79
83
 
80
84
  module_eval( <<-end_eval, __FILE__, __LINE__ )
81
85
  def #{name}
86
+ if @invalid_enum_values && @invalid_enum_values.has_key?(:#{name})
87
+ return @invalid_enum_values[:#{name}]
88
+ end
82
89
  rval = #{class_name}.lookup_id(self.#{foreign_key})
83
90
  if rval.nil? && #{!failure.nil?}
84
- return self.send(#{failure.inspect}, :read, #{name.inspect}, #{foreign_key.inspect}, #{class_name.inspect}, self.#{foreign_key})
91
+ self.send(#{failure.inspect}, :read, #{name.inspect}, #{foreign_key.inspect}, #{class_name.inspect}, self.#{foreign_key})
92
+ else
93
+ rval
85
94
  end
86
- return rval
87
- end
95
+ end
88
96
 
89
97
  def #{name}=(arg)
98
+ @invalid_enum_values ||= {}
99
+
90
100
  #{!empty_name ? 'arg = nil if arg.blank?' : ''}
91
101
  case arg
92
102
  when #{class_name}
@@ -99,22 +109,46 @@ module ActiveRecord
99
109
  val = #{class_name}.lookup_id(arg)
100
110
  when nil
101
111
  self.#{foreign_key} = nil
112
+ @invalid_enum_values.delete :#{name}
102
113
  return nil
103
- else
104
- raise TypeError, "#{self.name}: #{name}= argument must be a #{class_name}, String, Symbol or Fixnum but got a: \#{arg.class.name}"
114
+ else
115
+ raise TypeError, "#{self.name}: #{name}= argument must be a #{class_name}, String, Symbol or Fixnum but got a: \#{arg.class.name}"
105
116
  end
106
117
 
107
- if val.nil?
118
+ if val.nil?
108
119
  if #{failure.nil?}
109
120
  raise ArgumentError, "#{self.name}: #{name}= can't assign a #{class_name} for a value of (\#{arg.inspect})"
121
+ else
122
+ @invalid_enum_values.delete :#{name}
123
+ self.send(#{failure.inspect}, :write, #{name.inspect}, #{foreign_key.inspect}, #{class_name.inspect}, arg)
110
124
  end
111
- self.send(#{failure.inspect}, :write, #{name.inspect}, #{foreign_key.inspect}, #{class_name.inspect}, arg)
112
125
  else
126
+ @invalid_enum_values.delete :#{name}
113
127
  self.#{foreign_key} = val.id
114
128
  end
115
129
  end
116
130
  end_eval
117
131
 
132
+ if failure.to_s == 'validation_error'
133
+ module_eval( <<-end_eval, __FILE__, __LINE__ )
134
+ validate do
135
+ if @invalid_enum_values && @invalid_enum_values.has_key?(:#{name})
136
+ errors.add(:#{name}, "is invalid")
137
+ end
138
+ end
139
+
140
+ def validation_error(operation, name, name_foreign_key, acts_enumerated_class_name, lookup_value)
141
+ @invalid_enum_values ||= {}
142
+ if operation == :write
143
+ @invalid_enum_values[name.to_sym] = lookup_value
144
+ else
145
+ nil
146
+ end
147
+ end
148
+ private :validation_error
149
+ end_eval
150
+ end
151
+
118
152
  enumerated_attributes << name
119
153
 
120
154
  if options.has_key?(:default)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: power_enum
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.3
4
+ version: 0.7.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2012-05-19 00:00:00.000000000 Z
15
+ date: 2012-06-13 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: rails
@@ -94,6 +94,22 @@ dependencies:
94
94
  - - '='
95
95
  - !ruby/object:Gem::Version
96
96
  version: 0.2.1
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry
99
+ requirement: !ruby/object:Gem::Requirement
100
+ none: false
101
+ requirements:
102
+ - - ! '>='
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ none: false
109
+ requirements:
110
+ - - ! '>='
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
97
113
  description: ! 'Power Enum allows you to treat instances of your ActiveRecord models
98
114
  as though they were an enumeration of values.
99
115