preferences 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.rdoc +5 -0
- data/README.rdoc +25 -23
- data/Rakefile +1 -1
- data/app/models/preference.rb +11 -1
- data/lib/preferences.rb +95 -43
- data/lib/preferences/preference_definition.rb +7 -12
- data/test/app_root/app/models/employee.rb +2 -0
- data/test/app_root/app/models/manager.rb +3 -0
- data/test/app_root/db/migrate/003_create_employees.rb +12 -0
- data/test/app_root/db/migrate/{003_migrate_preferences_to_version_1.rb → 004_migrate_preferences_to_version_1.rb} +0 -0
- data/test/factory.rb +10 -0
- data/test/functional/preferences_test.rb +24 -4
- data/test/unit/preference_definition_test.rb +2 -2
- data/test/unit/preference_test.rb +27 -4
- metadata +19 -16
data/CHANGELOG.rdoc
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
== master
|
2
2
|
|
3
|
+
== 0.1.5 / 2008-11-16
|
4
|
+
|
5
|
+
* Add all prefers/preferred accessors for preferences to be analogous to ActiveRecord column accessors
|
6
|
+
* Fix preferences defined in STI subclasses not working [Quinn Shanahan]
|
7
|
+
|
3
8
|
== 0.1.4 / 2008-10-26
|
4
9
|
|
5
10
|
* Change how the base module is included to prevent namespacing conflicts
|
data/README.rdoc
CHANGED
@@ -31,12 +31,12 @@ Generally, basic preferences can be accomplished through simple designs, such as
|
|
31
31
|
additional columns or a bit vector described and implemented by preference_fu[http://agilewebdevelopment.com/plugins/preferencefu].
|
32
32
|
However, as you find the need for non-binary preferences and the number of
|
33
33
|
preferences becomes unmanageable as individual columns in the database, the next
|
34
|
-
step is often to create a separate "preferences" table. This is where the
|
35
|
-
plugin comes in.
|
34
|
+
step is often to create a separate "preferences" table. This is where the
|
35
|
+
+preferences+ plugin comes in.
|
36
36
|
|
37
|
-
+preferences+ encapsulates this design by
|
38
|
-
|
39
|
-
preferences.
|
37
|
+
+preferences+ encapsulates this design by exposing preferences using simple
|
38
|
+
attribute accessors on the model, hiding the fact that preferences are stored in
|
39
|
+
a separate table and making it dead-simple to define and manage preferences.
|
40
40
|
|
41
41
|
== Usage
|
42
42
|
|
@@ -60,26 +60,28 @@ In the above model, 5 preferences have been defined:
|
|
60
60
|
* language
|
61
61
|
|
62
62
|
For each preference, a data type and default value can be specified. If no
|
63
|
-
data type is given, it's
|
63
|
+
data type is given, it's assumed to be a boolean value. If no default value is
|
64
64
|
given, the default is assumed to be nil.
|
65
65
|
|
66
66
|
=== Accessing preferences
|
67
67
|
|
68
|
-
Once preferences have been defined for a model, they can be accessed either
|
69
|
-
the
|
70
|
-
that are not specific to a particular preference.
|
68
|
+
Once preferences have been defined for a model, they can be accessed either
|
69
|
+
using the accessor methods that are generated for each preference or the generic
|
70
|
+
methods that are not specific to a particular preference.
|
71
71
|
|
72
|
-
====
|
72
|
+
==== Accessors
|
73
73
|
|
74
|
-
There are several shortcut methods that are generated
|
74
|
+
There are several shortcut methods that are generated for each preference
|
75
|
+
defined on a model. These reflect the same set of methods (attribute accessors)
|
76
|
+
that are generated for a model's columns. Examples of these are shown below:
|
75
77
|
|
76
78
|
Query methods:
|
77
79
|
user.prefers_hot_salsa? # => false
|
78
|
-
user.
|
80
|
+
user.preferred_language? # => true
|
79
81
|
|
80
82
|
Reader methods:
|
81
|
-
user.
|
82
|
-
user.preferred_language
|
83
|
+
user.prefers_hot_salsa # => false
|
84
|
+
user.preferred_language # => "English"
|
83
85
|
|
84
86
|
Writer methods:
|
85
87
|
user.prefers_hot_salsa = false # => false
|
@@ -87,16 +89,16 @@ Writer methods:
|
|
87
89
|
|
88
90
|
==== Generic methods
|
89
91
|
|
90
|
-
Each
|
92
|
+
Each preference accessor is essentially a wrapper for the various generic methods
|
91
93
|
shown below:
|
92
94
|
|
93
95
|
Query method:
|
94
|
-
user.prefers?(:hot_salsa)
|
95
|
-
user.
|
96
|
+
user.prefers?(:hot_salsa) # => false
|
97
|
+
user.preferred?(:language) # => true
|
96
98
|
|
97
99
|
Reader method:
|
98
|
-
user.
|
99
|
-
user.preferred(:language)
|
100
|
+
user.prefers(:hot_salsa) # => false
|
101
|
+
user.preferred(:language) # => "English"
|
100
102
|
|
101
103
|
Write method:
|
102
104
|
user.set_preference(:hot_salsa, false) # => false
|
@@ -135,7 +137,7 @@ through an example:
|
|
135
137
|
user.preferred_color = 'red', car
|
136
138
|
# user.set_preference(:color, 'red', car) # The generic way
|
137
139
|
|
138
|
-
This will create a preference
|
140
|
+
This will create a color preference of "red" for the given car. In this way,
|
139
141
|
you can have "color" preferences for different records.
|
140
142
|
|
141
143
|
To access the preference for a particular record, you can use the same accessor
|
@@ -160,11 +162,11 @@ preferences by name. For example,
|
|
160
162
|
|
161
163
|
=== Saving preferences
|
162
164
|
|
163
|
-
Note that preferences are not saved until the owning record is saved.
|
164
|
-
are treated in a similar fashion to attributes. For example,
|
165
|
+
Note that preferences are not saved until the owning record is saved.
|
166
|
+
Preferences are treated in a similar fashion to attributes. For example,
|
165
167
|
|
166
168
|
user = user.find(:first)
|
167
|
-
user.attributes = {:preferred_color => 'red'}
|
169
|
+
user.attributes = {:prefers_hot_salsa => false, :preferred_color => 'red'}
|
168
170
|
user.save!
|
169
171
|
|
170
172
|
Preferences are stored in a separate table called "preferences".
|
data/Rakefile
CHANGED
data/app/models/preference.rb
CHANGED
@@ -43,7 +43,10 @@ class Preference < ActiveRecord::Base
|
|
43
43
|
|
44
44
|
# The definition for the attribute
|
45
45
|
def definition
|
46
|
-
|
46
|
+
# Optimize number of queries to the database by only looking up the actual
|
47
|
+
# owner record for STI cases when the definition can't be found in the
|
48
|
+
# stored owner type class
|
49
|
+
owner_type && (find_definition(owner_type.constantize) || find_definition(owner.class))
|
47
50
|
end
|
48
51
|
|
49
52
|
# Typecasts the value depending on the preference definition's declared type
|
@@ -58,4 +61,11 @@ class Preference < ActiveRecord::Base
|
|
58
61
|
group_id ? group_without_optional_lookup : group_type
|
59
62
|
end
|
60
63
|
alias_method_chain :group, :optional_lookup
|
64
|
+
|
65
|
+
private
|
66
|
+
# Finds the definition for this preference's attribute in the given owner
|
67
|
+
# class.
|
68
|
+
def find_definition(owner_class)
|
69
|
+
owner_class.respond_to?(:preference_definitions) && owner_class.preference_definitions[attribute]
|
70
|
+
end
|
61
71
|
end
|
data/lib/preferences.rb
CHANGED
@@ -20,11 +20,35 @@ module PluginAWeek #:nodoc:
|
|
20
20
|
# u = User.find_by_login('admin')
|
21
21
|
# u.attributes = {:prefers_notifications => true}
|
22
22
|
# u.save!
|
23
|
+
#
|
24
|
+
# == Validations
|
25
|
+
#
|
26
|
+
# Since the generated accessors for a preference allow the preference to be
|
27
|
+
# treated just like regular ActiveRecord column attributes, they can also be
|
28
|
+
# validated against in the same way. For example,
|
29
|
+
#
|
30
|
+
# class User < ActiveRecord::Base
|
31
|
+
# preference :color, :string
|
32
|
+
#
|
33
|
+
# validates_presence_of :preferred_color
|
34
|
+
# validates_inclusion_of :preferred_color, :in => %w(red green blue)
|
35
|
+
# end
|
36
|
+
#
|
37
|
+
# u = User.new
|
38
|
+
# u.valid? # => false
|
39
|
+
# u.errors.on(:preferred_color) # => "can't be blank"
|
40
|
+
#
|
41
|
+
# u.preferred_color = 'white'
|
42
|
+
# u.valid? # => false
|
43
|
+
# u.errors.on(:preferred_color) # => "is not included in the list"
|
44
|
+
#
|
45
|
+
# u.preferred_color = 'red'
|
46
|
+
# u.valid? # => true
|
23
47
|
module Preferences
|
24
48
|
module MacroMethods
|
25
|
-
# Defines a new preference for all records in the model. By default,
|
26
|
-
# are assumed to have a boolean data type, so all values will
|
27
|
-
# to true/false based on ActiveRecord rules.
|
49
|
+
# Defines a new preference for all records in the model. By default,
|
50
|
+
# preferences are assumed to have a boolean data type, so all values will
|
51
|
+
# be typecasted to true/false based on ActiveRecord rules.
|
28
52
|
#
|
29
53
|
# Configuration options:
|
30
54
|
# * +default+ - The default value for the preference. Default is nil.
|
@@ -47,34 +71,37 @@ module PluginAWeek #:nodoc:
|
|
47
71
|
#
|
48
72
|
# After the first preference is defined, the following associations are
|
49
73
|
# created for the model:
|
50
|
-
# * +stored_preferences+ - A collection of all the custom preferences specified for a record
|
74
|
+
# * +stored_preferences+ - A collection of all the custom preferences specified for a record. This will not include default preferences unless they have been explicitly set.
|
51
75
|
#
|
52
|
-
# == Generated
|
76
|
+
# == Generated accessors
|
53
77
|
#
|
54
78
|
# In addition to calling <tt>prefers?</tt> and +preferred+ on a record, you
|
55
|
-
# can also use the shortcut methods that are generated when a
|
56
|
-
# defined. For example,
|
79
|
+
# can also use the shortcut accessor methods that are generated when a
|
80
|
+
# preference is defined. For example,
|
57
81
|
#
|
58
82
|
# class User < ActiveRecord::Base
|
59
83
|
# preference :notifications
|
60
84
|
# end
|
61
85
|
#
|
62
86
|
# ...generates the following methods:
|
63
|
-
# * <tt>prefers_notifications?</tt> -
|
64
|
-
# * <tt>prefers_notifications
|
65
|
-
# * <tt>
|
66
|
-
# * <tt>preferred_notifications
|
87
|
+
# * <tt>prefers_notifications?</tt> - Whether a value has been specified, i.e. <tt>record.prefers?(:notifications)</tt>
|
88
|
+
# * <tt>prefers_notifications</tt> - The actual value stored, i.e. <tt>record.prefers(:notifications)</tt>
|
89
|
+
# * <tt>prefers_notifications=(value)</tt> - Sets a new value, i.e. <tt>record.set_preference(:notifications, value)</tt>
|
90
|
+
# * <tt>preferred_notifications?</tt> - Whether a value has been specified, i.e. <tt>record.preferred?(:notifications)</tt>
|
91
|
+
# * <tt>preferred_notifications</tt> - The actual value stored, i.e. <tt>record.preferred(:notifications)</tt>
|
92
|
+
# * <tt>preferred_notifications=(value)</tt> - Sets a new value, i.e. <tt>record.set_preference(:notifications, value)</tt>
|
67
93
|
#
|
68
94
|
# Notice that there are two tenses used depending on the context of the
|
69
95
|
# preference. Conventionally, <tt>prefers_notifications?</tt> is better
|
70
|
-
# for boolean preferences, while +preferred_color+ is better for
|
71
|
-
# preferences.
|
96
|
+
# for accessing boolean preferences, while +preferred_color+ is better for
|
97
|
+
# accessing non-boolean preferences.
|
72
98
|
#
|
73
99
|
# Example:
|
74
100
|
#
|
75
101
|
# user = User.find(:first)
|
76
102
|
# user.prefers_notifications? # => false
|
77
|
-
# user.
|
103
|
+
# user.prefers_notifications # => false
|
104
|
+
# user.preferred_color? # => true
|
78
105
|
# user.preferred_color # => 'red'
|
79
106
|
# user.preferred_color = 'blue' # => 'blue'
|
80
107
|
#
|
@@ -83,7 +110,7 @@ module PluginAWeek #:nodoc:
|
|
83
110
|
# car = Car.find(:first)
|
84
111
|
# user.preferred_color = 'red', car # => 'red'
|
85
112
|
# user.preferred_color(car) # => 'red'
|
86
|
-
# user.
|
113
|
+
# user.preferred_color?(car) # => true
|
87
114
|
#
|
88
115
|
# user.save! # => true
|
89
116
|
def preference(attribute, *args)
|
@@ -109,25 +136,27 @@ module PluginAWeek #:nodoc:
|
|
109
136
|
self.preference_definitions[attribute] = definition
|
110
137
|
self.default_preferences[attribute] = definition.default_value
|
111
138
|
|
112
|
-
# Create short-hand
|
139
|
+
# Create short-hand accessor methods, making sure that the attribute
|
113
140
|
# is method-safe in terms of what characters are allowed
|
114
141
|
attribute = attribute.gsub(/[^A-Za-z0-9_-]/, '').underscore
|
115
142
|
|
116
143
|
# Query lookup
|
117
|
-
define_method("
|
118
|
-
|
144
|
+
define_method("preferred_#{attribute}?") do |*group|
|
145
|
+
preferred?(attribute, group.first)
|
119
146
|
end
|
120
|
-
|
121
|
-
# Writer
|
122
|
-
define_method("prefers_#{attribute}=") do |*args|
|
123
|
-
set_preference(*([attribute] + [args].flatten))
|
124
|
-
end
|
125
|
-
alias_method "preferred_#{attribute}=", "prefers_#{attribute}="
|
147
|
+
alias_method "prefers_#{attribute}?", "preferred_#{attribute}?"
|
126
148
|
|
127
149
|
# Reader
|
128
150
|
define_method("preferred_#{attribute}") do |*group|
|
129
151
|
preferred(attribute, group.first)
|
130
152
|
end
|
153
|
+
alias_method "prefers_#{attribute}", "preferred_#{attribute}"
|
154
|
+
|
155
|
+
# Writer
|
156
|
+
define_method("preferred_#{attribute}=") do |*args|
|
157
|
+
set_preference(*([attribute] + [args].flatten))
|
158
|
+
end
|
159
|
+
alias_method "prefers_#{attribute}=", "preferred_#{attribute}="
|
131
160
|
|
132
161
|
definition
|
133
162
|
end
|
@@ -156,7 +185,7 @@ module PluginAWeek #:nodoc:
|
|
156
185
|
# user.preferences
|
157
186
|
# => {"language"=>"English", "color"=>nil, "cars"=>{"language=>"English", "color"=>"red"}}
|
158
187
|
#
|
159
|
-
# Getting preference values for the owning record:
|
188
|
+
# Getting preference values *just* for the owning record (i.e. excluding groups):
|
160
189
|
# user.preferences(nil)
|
161
190
|
# => {"language"=>"English", "color"=>nil}
|
162
191
|
#
|
@@ -169,6 +198,9 @@ module PluginAWeek #:nodoc:
|
|
169
198
|
conditions = {}
|
170
199
|
else
|
171
200
|
group = args.first
|
201
|
+
|
202
|
+
# Split the actual group into its different parts (id/type) in case
|
203
|
+
# a record is passed in
|
172
204
|
group_id, group_type = Preference.split_group(group)
|
173
205
|
conditions = {:group_id => group_id, :group_type => group_type}
|
174
206
|
end
|
@@ -189,61 +221,81 @@ module PluginAWeek #:nodoc:
|
|
189
221
|
end
|
190
222
|
end
|
191
223
|
|
192
|
-
# Queries whether or not a value
|
193
|
-
#
|
224
|
+
# Queries whether or not a value is present for the given attribute. This
|
225
|
+
# is dependent on how the value is type-casted.
|
194
226
|
#
|
195
227
|
# == Examples
|
196
228
|
#
|
197
|
-
#
|
198
|
-
#
|
229
|
+
# class User < ActiveRecord::Base
|
230
|
+
# preference :color, :string, :default => 'red'
|
231
|
+
# end
|
199
232
|
#
|
200
|
-
# user
|
233
|
+
# user = User.create
|
234
|
+
# user.preferred(:color) # => "red"
|
235
|
+
# user.preferred?(:color) # => true
|
236
|
+
# user.preferred?(:color, 'cars') # => true
|
237
|
+
# user.preferred?(:color, Car.first) # => true
|
201
238
|
#
|
202
|
-
#
|
203
|
-
# user.
|
204
|
-
|
239
|
+
# user.set_preference(:color, nil)
|
240
|
+
# user.preferred(:color) # => nil
|
241
|
+
# user.preferred?(:color) # => false
|
242
|
+
def preferred?(attribute, group = nil)
|
205
243
|
attribute = attribute.to_s
|
206
244
|
|
207
245
|
value = preferred(attribute, group)
|
208
246
|
preference_definitions[attribute].query(value)
|
209
247
|
end
|
248
|
+
alias_method :prefers?, :preferred?
|
210
249
|
|
211
|
-
# Gets the
|
250
|
+
# Gets the actual value stored for the given attribute, or the default
|
251
|
+
# value if nothing is present.
|
212
252
|
#
|
213
253
|
# == Examples
|
214
254
|
#
|
215
|
-
#
|
216
|
-
#
|
255
|
+
# class User < ActiveRecord::Base
|
256
|
+
# preference :color, :string, :default => 'red'
|
257
|
+
# end
|
217
258
|
#
|
218
|
-
# user
|
259
|
+
# user = User.create
|
260
|
+
# user.preferred(:color) # => "red"
|
261
|
+
# user.preferred(:color, 'cars') # => "red"
|
262
|
+
# user.preferred(:color, Car.first) # => "red"
|
219
263
|
#
|
220
|
-
#
|
221
|
-
# user.preferred(:color
|
264
|
+
# user.set_preference(:color, 'blue')
|
265
|
+
# user.preferred(:color) # => "blue"
|
222
266
|
def preferred(attribute, group = nil)
|
223
267
|
attribute = attribute.to_s
|
224
268
|
|
225
269
|
if @preference_values && @preference_values[attribute] && @preference_values[attribute].include?(group)
|
270
|
+
# Value for this attribute/group has been written, but not saved yet:
|
271
|
+
# grab from the pending values
|
226
272
|
value = @preference_values[attribute][group]
|
227
273
|
else
|
274
|
+
# Split the group being filtered
|
228
275
|
group_id, group_type = Preference.split_group(group)
|
276
|
+
|
277
|
+
# Grab the first preference; if it doesn't exist, use the default value
|
229
278
|
preference = stored_preferences.find(:first, :conditions => {:attribute => attribute, :group_id => group_id, :group_type => group_type})
|
230
279
|
value = preference ? preference.value : preference_definitions[attribute].default_value
|
231
280
|
end
|
232
281
|
|
233
282
|
value
|
234
283
|
end
|
284
|
+
alias_method :prefers, :preferred
|
235
285
|
|
236
286
|
# Sets a new value for the given attribute. The actual Preference record
|
237
|
-
# is *not* created until
|
287
|
+
# is *not* created until this record is saved. In this way, preferences
|
288
|
+
# act *exactly* the same as attributes. They can be written to and
|
289
|
+
# validated against, but won't actually be written to the database until
|
290
|
+
# the record is saved.
|
238
291
|
#
|
239
292
|
# == Examples
|
240
293
|
#
|
241
294
|
# user = User.find(:first)
|
242
|
-
# user.set_preference(:
|
295
|
+
# user.set_preference(:color, 'red') # => "red"
|
243
296
|
# user.save!
|
244
297
|
#
|
245
|
-
#
|
246
|
-
# user.set_preference(:notifications, true, newsgroup) # => true
|
298
|
+
# user.set_preference(:color, 'blue', Car.first) # => "blue"
|
247
299
|
# user.save!
|
248
300
|
def set_preference(attribute, value, group = nil)
|
249
301
|
attribute = attribute.to_s
|
@@ -24,25 +24,20 @@ module PluginAWeek #:nodoc:
|
|
24
24
|
end
|
25
25
|
|
26
26
|
# Typecasts the value based on the type of preference that was defined.
|
27
|
-
# This uses ActiveRecord's typecast functionality
|
27
|
+
# This uses ActiveRecord's typecast functionality so the same rules for
|
28
|
+
# typecasting a model's columns apply here.
|
28
29
|
def type_cast(value)
|
29
|
-
|
30
|
-
value
|
31
|
-
else
|
32
|
-
@column.type_cast(value)
|
33
|
-
end
|
30
|
+
@type == 'any' ? value : @column.type_cast(value)
|
34
31
|
end
|
35
32
|
|
36
33
|
# Typecasts the value to true/false depending on the type of preference
|
37
34
|
def query(value)
|
38
|
-
|
35
|
+
if !(value = type_cast(value))
|
39
36
|
false
|
37
|
+
elsif @column.number?
|
38
|
+
!value.zero?
|
40
39
|
else
|
41
|
-
|
42
|
-
!value.zero?
|
43
|
-
else
|
44
|
-
!value.blank?
|
45
|
-
end
|
40
|
+
!value.blank?
|
46
41
|
end
|
47
42
|
end
|
48
43
|
end
|
File without changes
|
data/test/factory.rb
CHANGED
@@ -39,6 +39,16 @@ module Factory
|
|
39
39
|
)
|
40
40
|
end
|
41
41
|
|
42
|
+
build Employee do |attributes|
|
43
|
+
attributes.reverse_merge!(
|
44
|
+
:name => 'John Smith'
|
45
|
+
)
|
46
|
+
end
|
47
|
+
|
48
|
+
build Manager do |attributes|
|
49
|
+
valid_employee_attributes(attributes)
|
50
|
+
end
|
51
|
+
|
42
52
|
build Preference do |attributes|
|
43
53
|
attributes[:owner] = create_user unless attributes.include?(:owner)
|
44
54
|
attributes.reverse_merge!(
|
@@ -12,22 +12,30 @@ class PreferencesTest < Test::Unit::TestCase
|
|
12
12
|
assert_raise(ArgumentError) {User.preference :notifications, :boolean, :invalid => true}
|
13
13
|
end
|
14
14
|
|
15
|
-
def
|
16
|
-
assert @user.respond_to?(:
|
15
|
+
def test_should_create_preferred_query_method
|
16
|
+
assert @user.respond_to?(:preferred_notifications?)
|
17
17
|
end
|
18
18
|
|
19
|
-
def
|
20
|
-
assert @user.respond_to?(:prefers_notifications
|
19
|
+
def test_should_create_prefers_query_method
|
20
|
+
assert @user.respond_to?(:prefers_notifications?)
|
21
21
|
end
|
22
22
|
|
23
23
|
def test_should_create_preferred_reader
|
24
24
|
assert @user.respond_to?(:preferred_notifications)
|
25
25
|
end
|
26
26
|
|
27
|
+
def test_should_create_prefers_reader
|
28
|
+
assert @user.respond_to?(:prefers_notifications)
|
29
|
+
end
|
30
|
+
|
27
31
|
def test_should_create_preferred_writer
|
28
32
|
assert @user.respond_to?(:preferred_notifications=)
|
29
33
|
end
|
30
34
|
|
35
|
+
def test_should_create_prefers_writer
|
36
|
+
assert @user.respond_to?(:prefers_notifications=)
|
37
|
+
end
|
38
|
+
|
31
39
|
def test_should_create_preference_definitions
|
32
40
|
assert User.respond_to?(:preference_definitions)
|
33
41
|
end
|
@@ -53,10 +61,12 @@ class UserByDefaultTest < Test::Unit::TestCase
|
|
53
61
|
|
54
62
|
def test_should_not_prefer_hot_salsa
|
55
63
|
assert_nil @user.preferred_hot_salsa
|
64
|
+
assert_nil @user.prefers_hot_salsa
|
56
65
|
end
|
57
66
|
|
58
67
|
def test_should_prefer_dark_chocolate
|
59
68
|
assert_equal true, @user.preferred_dark_chocolate
|
69
|
+
assert_equal true, @user.prefers_dark_chocolate
|
60
70
|
end
|
61
71
|
|
62
72
|
def test_should_not_have_a_preferred_color
|
@@ -120,6 +130,11 @@ class UserTest < Test::Unit::TestCase
|
|
120
130
|
assert_equal 'Latin', @user.preferred_language
|
121
131
|
end
|
122
132
|
|
133
|
+
def test_should_be_able_to_use_generic_preferred_query_method
|
134
|
+
@user.prefers_hot_salsa = true
|
135
|
+
assert @user.preferred?(:hot_salsa)
|
136
|
+
end
|
137
|
+
|
123
138
|
def test_should_be_able_to_use_generic_prefers_query_method
|
124
139
|
@user.prefers_hot_salsa = true
|
125
140
|
assert @user.prefers?(:hot_salsa)
|
@@ -130,6 +145,11 @@ class UserTest < Test::Unit::TestCase
|
|
130
145
|
assert_equal 'blue', @user.preferred(:color)
|
131
146
|
end
|
132
147
|
|
148
|
+
def test_should_be_able_to_use_generic_prefers_method
|
149
|
+
@user.preferred_color = 'blue'
|
150
|
+
assert_equal 'blue', @user.prefers(:color)
|
151
|
+
end
|
152
|
+
|
133
153
|
def test_should_be_able_to_use_generic_set_preference_method
|
134
154
|
@user.set_preference(:color, 'blue')
|
135
155
|
assert_equal 'blue', @user.preferred(:color)
|
@@ -95,8 +95,8 @@ class PreferenceDefinitionWithBooleanTypeTest < Test::Unit::TestCase
|
|
95
95
|
assert_equal true, @definition.type_cast('true')
|
96
96
|
end
|
97
97
|
|
98
|
-
def
|
99
|
-
|
98
|
+
def test_should_type_cast_to_nil_if_value_is_not_true_string
|
99
|
+
assert_nil @definition.type_cast('')
|
100
100
|
end
|
101
101
|
|
102
102
|
def test_should_query_false_if_value_is_nil
|
@@ -43,19 +43,19 @@ class PreferenceTest < Test::Unit::TestCase
|
|
43
43
|
def test_should_require_an_attribute
|
44
44
|
preference = new_preference(:attribute => nil)
|
45
45
|
assert !preference.valid?
|
46
|
-
|
46
|
+
assert preference.errors.invalid?(:attribute)
|
47
47
|
end
|
48
48
|
|
49
49
|
def test_should_require_an_owner_id
|
50
50
|
preference = new_preference(:owner => nil)
|
51
51
|
assert !preference.valid?
|
52
|
-
|
52
|
+
assert preference.errors.invalid?(:owner_id)
|
53
53
|
end
|
54
54
|
|
55
55
|
def test_should_require_an_owner_type
|
56
56
|
preference = new_preference(:owner => nil)
|
57
57
|
assert !preference.valid?
|
58
|
-
|
58
|
+
assert preference.errors.invalid?(:owner_type)
|
59
59
|
end
|
60
60
|
|
61
61
|
def test_should_not_require_a_group_id
|
@@ -78,7 +78,7 @@ class PreferenceTest < Test::Unit::TestCase
|
|
78
78
|
preference = new_preference(:group => nil)
|
79
79
|
preference.group_id = 1
|
80
80
|
assert !preference.valid?
|
81
|
-
|
81
|
+
assert preference.errors.invalid?(:group_type)
|
82
82
|
end
|
83
83
|
|
84
84
|
def test_should_protect_attributes_from_mass_assignment
|
@@ -209,3 +209,26 @@ class PreferenceWithBooleanAttributeTest < Test::Unit::TestCase
|
|
209
209
|
User.default_preferences.delete('notifications')
|
210
210
|
end
|
211
211
|
end
|
212
|
+
|
213
|
+
class PreferenceWithSTIOwnerTest < Test::Unit::TestCase
|
214
|
+
def setup
|
215
|
+
@manager = create_manager
|
216
|
+
@preference = create_preference(:owner => @manager, :attribute => 'health_insurance', :value => true)
|
217
|
+
end
|
218
|
+
|
219
|
+
def test_should_have_an_owner
|
220
|
+
assert_equal @manager, @preference.owner
|
221
|
+
end
|
222
|
+
|
223
|
+
def test_should_have_an_owner_type
|
224
|
+
assert_equal 'Employee', @preference.owner_type
|
225
|
+
end
|
226
|
+
|
227
|
+
def test_should_have_a_definition
|
228
|
+
assert_not_nil @preference.definition
|
229
|
+
end
|
230
|
+
|
231
|
+
def test_should_have_a_value
|
232
|
+
assert_equal true, @preference.value
|
233
|
+
end
|
234
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: preferences
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aaron Pfeifer
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-12-04 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -27,25 +27,28 @@ files:
|
|
27
27
|
- lib/preferences
|
28
28
|
- lib/preferences/preference_definition.rb
|
29
29
|
- lib/preferences.rb
|
30
|
-
- test/
|
31
|
-
- test/
|
32
|
-
- test/app_root/app/models
|
33
|
-
- test/app_root/app/models/car.rb
|
34
|
-
- test/app_root/app/models/user.rb
|
35
|
-
- test/app_root/config
|
36
|
-
- test/app_root/config/environment.rb
|
37
|
-
- test/app_root/db
|
38
|
-
- test/app_root/db/migrate
|
39
|
-
- test/app_root/db/migrate/001_create_users.rb
|
40
|
-
- test/app_root/db/migrate/003_migrate_preferences_to_version_1.rb
|
41
|
-
- test/app_root/db/migrate/002_create_cars.rb
|
30
|
+
- test/factory.rb
|
31
|
+
- test/test_helper.rb
|
42
32
|
- test/functional
|
43
33
|
- test/functional/preferences_test.rb
|
44
|
-
- test/test_helper.rb
|
45
|
-
- test/factory.rb
|
46
34
|
- test/unit
|
47
35
|
- test/unit/preference_test.rb
|
48
36
|
- test/unit/preference_definition_test.rb
|
37
|
+
- test/app_root
|
38
|
+
- test/app_root/db
|
39
|
+
- test/app_root/db/migrate
|
40
|
+
- test/app_root/db/migrate/004_migrate_preferences_to_version_1.rb
|
41
|
+
- test/app_root/db/migrate/002_create_cars.rb
|
42
|
+
- test/app_root/db/migrate/001_create_users.rb
|
43
|
+
- test/app_root/db/migrate/003_create_employees.rb
|
44
|
+
- test/app_root/config
|
45
|
+
- test/app_root/config/environment.rb
|
46
|
+
- test/app_root/app
|
47
|
+
- test/app_root/app/models
|
48
|
+
- test/app_root/app/models/car.rb
|
49
|
+
- test/app_root/app/models/manager.rb
|
50
|
+
- test/app_root/app/models/user.rb
|
51
|
+
- test/app_root/app/models/employee.rb
|
49
52
|
- CHANGELOG.rdoc
|
50
53
|
- init.rb
|
51
54
|
- LICENSE
|