enumerate_by 0.4.3 → 0.4.4
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +8 -0
- data/LICENSE +1 -1
- data/README.rdoc +3 -3
- data/Rakefile +8 -14
- data/lib/enumerate_by.rb +31 -13
- data/lib/enumerate_by/extensions/associations.rb +3 -2
- data/lib/enumerate_by/extensions/base_conditions.rb +3 -2
- data/test/app_root/app/models/car.rb +1 -0
- data/test/app_root/app/models/color.rb +2 -0
- data/test/app_root/app/models/legacy_color.rb +5 -0
- data/test/app_root/config/environment.rb +8 -0
- data/test/app_root/db/migrate/002_create_cars.rb +1 -1
- data/test/app_root/db/migrate/005_create_legacy_colors.rb +12 -0
- data/test/app_root/db/migrate/006_create_tags.rb +11 -0
- data/test/app_root/vendor/plugins/plugin_with_model/init.rb +1 -0
- data/test/app_root/vendor/plugins/plugin_with_model/lib/plugin_with_model.rb +2 -0
- data/test/factory.rb +12 -1
- data/test/unit/{assocations_test.rb → associations_test.rb} +29 -2
- data/test/unit/base_conditions_test.rb +31 -0
- data/test/unit/enumerate_by_test.rb +78 -0
- data/test/unit/json_serializer_test.rb +13 -3
- data/test/unit/serializer_test.rb +10 -5
- data/test/unit/xml_serializer_test.rb +19 -0
- metadata +27 -27
data/CHANGELOG.rdoc
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
== master
|
2
2
|
|
3
|
+
== 0.4.4 / 2010-03-07
|
4
|
+
|
5
|
+
* Fix serialization failing when ActiveRecord models have been defined prior to this plugin being loaded
|
6
|
+
* Fix cached enumeration records not being isolated from external modifications that don't sweep the cache
|
7
|
+
* Respect custom primary_key configurations in ActiveRecord models [Martin Honermeyer]
|
8
|
+
* Fix tests failing on Rails 2.3.3+
|
9
|
+
* Release gems via rake-gemcutter instead of rubyforge
|
10
|
+
|
3
11
|
== 0.4.3 / 2009-06-14
|
4
12
|
|
5
13
|
* Add support for looking up enumerators by their symbol equivalent
|
data/LICENSE
CHANGED
data/README.rdoc
CHANGED
@@ -38,7 +38,7 @@ associations. The important thing to remember, however, is that while the
|
|
38
38
|
associations exist, the enumerator is always used outside of the application,
|
39
39
|
while either the enumerator or the enumerator's record would be referenced
|
40
40
|
*within* the application. This means that you would reference a Color record
|
41
|
-
via
|
41
|
+
via its enumerator (such as "red") everywhere in the code (conditions,
|
42
42
|
assigning associations, forms, etc.), but it would always be stored in the
|
43
43
|
database as a true association with the integer value of 1.
|
44
44
|
|
@@ -75,9 +75,9 @@ database as a true association with the integer value of 1.
|
|
75
75
|
|
76
76
|
Each of the above models is backed by the database with its own table. Both
|
77
77
|
the Color and ColorGroup enumerations automatically synchronize with the
|
78
|
-
records in the database based on what's
|
78
|
+
records in the database based on what's defined in their bootstrap data.
|
79
79
|
|
80
|
-
The enumerations and their associations can
|
80
|
+
The enumerations and their associations can then be used like so:
|
81
81
|
|
82
82
|
car = Car.create(:color => 'red') # => #<Car id: 1, color_id: 1>
|
83
83
|
car.color # => #<Color id: 1, name: "red">
|
data/Rakefile
CHANGED
@@ -1,11 +1,12 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
1
3
|
require 'rake/testtask'
|
2
4
|
require 'rake/rdoctask'
|
3
5
|
require 'rake/gempackagetask'
|
4
|
-
require 'rake/contrib/sshpublisher'
|
5
6
|
|
6
7
|
spec = Gem::Specification.new do |s|
|
7
8
|
s.name = 'enumerate_by'
|
8
|
-
s.version = '0.4.
|
9
|
+
s.version = '0.4.4'
|
9
10
|
s.platform = Gem::Platform::RUBY
|
10
11
|
s.summary = 'Adds support for declaring an ActiveRecord class as an enumeration'
|
11
12
|
s.description = s.summary
|
@@ -63,17 +64,17 @@ end
|
|
63
64
|
|
64
65
|
Rake::GemPackageTask.new(spec) do |p|
|
65
66
|
p.gem_spec = spec
|
66
|
-
p.need_tar = true
|
67
|
-
p.need_zip = true
|
68
67
|
end
|
69
68
|
|
70
69
|
desc 'Publish the beta gem.'
|
71
70
|
task :pgem => [:package] do
|
71
|
+
require 'rake/contrib/sshpublisher'
|
72
72
|
Rake::SshFilePublisher.new('aaron@pluginaweek.org', '/home/aaron/gems.pluginaweek.org/public/gems', 'pkg', "#{spec.name}-#{spec.version}.gem").upload
|
73
73
|
end
|
74
74
|
|
75
75
|
desc 'Publish the API documentation.'
|
76
76
|
task :pdoc => [:rdoc] do
|
77
|
+
require 'rake/contrib/sshpublisher'
|
77
78
|
Rake::SshDirPublisher.new('aaron@pluginaweek.org', "/home/aaron/api.pluginaweek.org/public/#{spec.name}", 'rdoc').upload
|
78
79
|
end
|
79
80
|
|
@@ -82,15 +83,8 @@ task :publish => [:pgem, :pdoc, :release]
|
|
82
83
|
|
83
84
|
desc 'Publish the release files to RubyForge.'
|
84
85
|
task :release => [:gem, :package] do
|
85
|
-
require '
|
86
|
+
require 'rake/gemcutter'
|
86
87
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
%w(gem tgz zip).each do |ext|
|
91
|
-
file = "pkg/#{spec.name}-#{spec.version}.#{ext}"
|
92
|
-
puts "Releasing #{File.basename(file)}..."
|
93
|
-
|
94
|
-
ruby_forge.add_release(spec.rubyforge_project, spec.name, spec.version, file)
|
95
|
-
end
|
88
|
+
Rake::Gemcutter::Tasks.new(spec)
|
89
|
+
Rake::Task['gem:push'].invoke
|
96
90
|
end
|
data/lib/enumerate_by.rb
CHANGED
@@ -17,7 +17,11 @@ module EnumerateBy
|
|
17
17
|
# Tracks which associations are backed by an enumeration
|
18
18
|
# {"foreign key" => "association name"}
|
19
19
|
class_inheritable_accessor :enumeration_associations
|
20
|
-
|
20
|
+
|
21
|
+
# Fix existing models not getting the default value
|
22
|
+
([self] + subclasses).each do |model|
|
23
|
+
model.enumeration_associations = {}
|
24
|
+
end
|
21
25
|
end
|
22
26
|
end
|
23
27
|
|
@@ -178,7 +182,7 @@ module EnumerateBy
|
|
178
182
|
[:find_by_sql, :exists?, :calculate].each do |method|
|
179
183
|
define_method(method) do |*args|
|
180
184
|
if EnumerateBy.perform_caching && perform_enumerator_caching
|
181
|
-
enumerator_cache_store.fetch([method] + args) { super(*args) }
|
185
|
+
shallow_clone(enumerator_cache_store.fetch([method] + args) { super(*args) })
|
182
186
|
else
|
183
187
|
super(*args)
|
184
188
|
end
|
@@ -209,6 +213,16 @@ module EnumerateBy
|
|
209
213
|
enumerator.is_a?(Symbol) ? enumerator.to_s : enumerator
|
210
214
|
end
|
211
215
|
end
|
216
|
+
|
217
|
+
# Generates a copy of the given record(s), keeping intact the original id
|
218
|
+
def shallow_clone(result)
|
219
|
+
case result
|
220
|
+
when Array
|
221
|
+
result.map {|item| shallow_clone(item)}
|
222
|
+
when ActiveRecord::Base
|
223
|
+
result.class.send(:instantiate, result.instance_variable_get(:@attributes))
|
224
|
+
end
|
225
|
+
end
|
212
226
|
end
|
213
227
|
|
214
228
|
module Bootstrapped
|
@@ -265,13 +279,15 @@ module EnumerateBy
|
|
265
279
|
# Otherwise, any changes to that column remain there.
|
266
280
|
def bootstrap(*records)
|
267
281
|
uncached do
|
282
|
+
primary_key = self.primary_key.to_sym
|
283
|
+
|
268
284
|
# Remove records that are no longer being used
|
269
285
|
records.flatten!
|
270
|
-
ids = records.map {|record| record[
|
271
|
-
delete_all(ids.any? ? [
|
286
|
+
ids = records.map {|record| record[primary_key]}.compact
|
287
|
+
delete_all(ids.any? ? ["#{primary_key} NOT IN (?)", ids] : nil)
|
272
288
|
|
273
289
|
# Find remaining existing records (to be updated)
|
274
|
-
existing = all.inject({}) {|existing, record| existing[record.
|
290
|
+
existing = all.inject({}) {|existing, record| existing[record.send(primary_key)] = record; existing}
|
275
291
|
|
276
292
|
records.map! do |attributes|
|
277
293
|
attributes.symbolize_keys!
|
@@ -279,7 +295,7 @@ module EnumerateBy
|
|
279
295
|
|
280
296
|
# Update with new attributes
|
281
297
|
record =
|
282
|
-
if record = existing[attributes[
|
298
|
+
if record = existing[attributes[primary_key]]
|
283
299
|
attributes.merge!(defaults.delete_if {|attribute, value| record.send("#{attribute}?")}) if defaults
|
284
300
|
record.attributes = attributes
|
285
301
|
record
|
@@ -287,7 +303,7 @@ module EnumerateBy
|
|
287
303
|
attributes.merge!(defaults) if defaults
|
288
304
|
new(attributes)
|
289
305
|
end
|
290
|
-
record.
|
306
|
+
record.send("#{primary_key}=", attributes[primary_key])
|
291
307
|
|
292
308
|
# Force failed saves to stop execution
|
293
309
|
record.save!
|
@@ -317,14 +333,16 @@ module EnumerateBy
|
|
317
333
|
#
|
318
334
|
# See EnumerateBy::Bootstrapped#bootstrap for information about usage.
|
319
335
|
def fast_bootstrap(*records)
|
336
|
+
primary_key = self.primary_key.to_sym
|
337
|
+
|
320
338
|
# Remove records that are no longer being used
|
321
339
|
records.flatten!
|
322
|
-
ids = records.map {|record| record[
|
323
|
-
delete_all(ids.any? ? [
|
340
|
+
ids = records.map {|record| record[primary_key]}.compact
|
341
|
+
delete_all(ids.any? ? ["#{primary_key} NOT IN (?)", ids] : nil)
|
324
342
|
|
325
343
|
# Find remaining existing records (to be updated)
|
326
344
|
quoted_table_name = self.quoted_table_name
|
327
|
-
existing = connection.select_all("SELECT * FROM #{quoted_table_name}").inject({}) {|existing, record| existing[record[
|
345
|
+
existing = connection.select_all("SELECT * FROM #{quoted_table_name}").inject({}) {|existing, record| existing[record[primary_key.to_s].to_i] = record; existing}
|
328
346
|
|
329
347
|
records.each do |attributes|
|
330
348
|
attributes.stringify_keys!
|
@@ -332,12 +350,12 @@ module EnumerateBy
|
|
332
350
|
defaults.stringify_keys!
|
333
351
|
end
|
334
352
|
|
335
|
-
id = attributes[
|
353
|
+
id = attributes[primary_key.to_s]
|
336
354
|
if existing_attributes = existing[id]
|
337
355
|
# Record exists: Update attributes
|
338
|
-
attributes.delete(
|
356
|
+
attributes.delete(primary_key.to_s)
|
339
357
|
attributes.merge!(defaults.delete_if {|attribute, value| !existing_attributes[attribute].nil?}) if defaults
|
340
|
-
update_all(attributes,
|
358
|
+
update_all(attributes, primary_key => id)
|
341
359
|
else
|
342
360
|
# Record doesn't exist: create new one
|
343
361
|
attributes.merge!(defaults) if defaults
|
@@ -75,18 +75,19 @@ module EnumerateBy
|
|
75
75
|
primary_key_name = reflection.primary_key_name
|
76
76
|
class_name = reflection.class_name
|
77
77
|
klass = reflection.klass
|
78
|
+
klass_primary_key = klass.primary_key.to_sym
|
78
79
|
|
79
80
|
# Inclusion scopes
|
80
81
|
%W(with_#{name} with_#{name.to_s.pluralize}).each do |scope_name|
|
81
82
|
named_scope scope_name.to_sym, lambda {|*enumerators| {
|
82
|
-
:conditions => {primary_key_name => klass.find_all_by_enumerator!(enumerators).map(
|
83
|
+
:conditions => {primary_key_name => klass.find_all_by_enumerator!(enumerators).map(&klass_primary_key)}
|
83
84
|
}}
|
84
85
|
end
|
85
86
|
|
86
87
|
# Exclusion scopes
|
87
88
|
%W(without_#{name} without_#{name.to_s.pluralize}).each do |scope_name|
|
88
89
|
named_scope scope_name.to_sym, lambda {|*enumerators| {
|
89
|
-
:conditions => ["#{primary_key_name} NOT IN (?)", klass.find_all_by_enumerator!(enumerators).map(
|
90
|
+
:conditions => ["#{primary_key_name} NOT IN (?)", klass.find_all_by_enumerator!(enumerators).map(&klass_primary_key)]
|
90
91
|
}}
|
91
92
|
end
|
92
93
|
|
@@ -104,11 +104,12 @@ module EnumerateBy
|
|
104
104
|
def enumerator_options_for(name, enumerator, allow_multiple = true)
|
105
105
|
if reflection = reflect_on_enumeration(name)
|
106
106
|
klass = reflection.klass
|
107
|
+
klass_primary_key = klass.primary_key.to_sym
|
107
108
|
attribute = reflection.primary_key_name
|
108
109
|
id = if allow_multiple && enumerator.is_a?(Array)
|
109
|
-
klass.find_all_by_enumerator!(enumerator).map(
|
110
|
+
klass.find_all_by_enumerator!(enumerator).map(&klass_primary_key)
|
110
111
|
else
|
111
|
-
klass.find_by_enumerator!(enumerator).
|
112
|
+
klass.find_by_enumerator!(enumerator).send(klass_primary_key)
|
112
113
|
end
|
113
114
|
|
114
115
|
{attribute => id}
|
@@ -0,0 +1,8 @@
|
|
1
|
+
require 'config/boot'
|
2
|
+
|
3
|
+
Rails::Initializer.run do |config|
|
4
|
+
config.plugins = %w(plugin_with_model enumerate_by)
|
5
|
+
config.cache_classes = false
|
6
|
+
config.whiny_nils = true
|
7
|
+
config.action_controller.session = {:key => 'rails_session', :secret => 'd229e4d22437432705ab3985d4d246'}
|
8
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'plugin_with_model'
|
data/test/factory.rb
CHANGED
@@ -34,7 +34,6 @@ module Factory
|
|
34
34
|
end
|
35
35
|
|
36
36
|
build Car do |attributes|
|
37
|
-
attributes[:color] = create_color unless attributes.include?(:color)
|
38
37
|
attributes.reverse_merge!(
|
39
38
|
:name => 'Ford Mustang'
|
40
39
|
)
|
@@ -52,10 +51,22 @@ module Factory
|
|
52
51
|
)
|
53
52
|
end
|
54
53
|
|
54
|
+
build LegacyColor do |attributes|
|
55
|
+
attributes.reverse_merge!(
|
56
|
+
:name => 'red'
|
57
|
+
)
|
58
|
+
end
|
59
|
+
|
55
60
|
build Order do |attributes|
|
56
61
|
attributes[:car_part] = create_car_part unless attributes.include?(:car_part)
|
57
62
|
attributes.reverse_merge!(
|
58
63
|
:state => 'pending'
|
59
64
|
)
|
60
65
|
end
|
66
|
+
|
67
|
+
build Tag do |attributes|
|
68
|
+
attributes.reverse_merge!(
|
69
|
+
:name => 'rails'
|
70
|
+
)
|
71
|
+
end
|
61
72
|
end
|
@@ -17,7 +17,7 @@ class ModelWithBelongsToAssociationTest < ActiveRecord::TestCase
|
|
17
17
|
assert_equal @green, @car.color
|
18
18
|
end
|
19
19
|
|
20
|
-
def
|
20
|
+
def test_should_find_association_from_record
|
21
21
|
@car.color = @green
|
22
22
|
assert_equal @green, @car.color
|
23
23
|
end
|
@@ -33,7 +33,7 @@ class ModelWithBelongsToAssociationTest < ActiveRecord::TestCase
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def test_should_track_associations
|
36
|
-
expected = {'color_id' => 'color'}
|
36
|
+
expected = {'color_id' => 'color', 'legacy_color_id' => 'legacy_color'}
|
37
37
|
assert_equal expected, Car.enumeration_associations
|
38
38
|
end
|
39
39
|
end
|
@@ -73,3 +73,30 @@ class ModelWithPolymorphicBelongsToAssociationTest < ActiveRecord::TestCase
|
|
73
73
|
assert !Car.respond_to?(:without_features)
|
74
74
|
end
|
75
75
|
end
|
76
|
+
|
77
|
+
class ModelWithEnumerationScopesUsingCustomPrimaryKeyTest < ActiveRecord::TestCase
|
78
|
+
def setup
|
79
|
+
@red = create_legacy_color(:name => 'red')
|
80
|
+
@blue = create_legacy_color(:name => 'blue')
|
81
|
+
@red_car = create_car(:name => 'Ford Mustang', :legacy_color => @red)
|
82
|
+
@blue_car = create_car(:name => 'Ford Mustang', :legacy_color => @blue)
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_should_have_inclusion_scope_for_single_enumerator
|
86
|
+
assert_equal [@red_car], Car.with_legacy_color('red')
|
87
|
+
assert_equal [@blue_car], Car.with_legacy_color('blue')
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_should_have_inclusion_scope_for_multiple_enumerators
|
91
|
+
assert_equal [@red_car, @blue_car], Car.with_legacy_color('red', 'blue')
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_should_have_exclusion_scope_for_single_enumerator
|
95
|
+
assert_equal [@blue_car], Car.without_legacy_color('red')
|
96
|
+
assert_equal [@red_car], Car.without_legacy_color('blue')
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_should_have_exclusion_scope_for_multiple_enumerators
|
100
|
+
assert_equal [], Car.without_legacy_colors('red', 'blue')
|
101
|
+
end
|
102
|
+
end
|
@@ -57,6 +57,23 @@ class EnumerationWithFinderConditionsTest < ActiveRecord::TestCase
|
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
|
+
class EnumerationWithCustomPrimaryKeyAndFinderConditionsTest < ActiveRecord::TestCase
|
61
|
+
def setup
|
62
|
+
@red = create_legacy_color(:name => 'red')
|
63
|
+
@blue = create_legacy_color(:name => 'blue')
|
64
|
+
@red_car = create_car(:name => 'Ford Mustang', :legacy_color => @red)
|
65
|
+
@blue_car = create_car(:name => 'Ford Mustang', :legacy_color => @blue)
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_should_replace_enumerations_in_dynamic_finders
|
69
|
+
assert_equal @red_car, Car.find_by_legacy_color('red')
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_should_replace_enumerations_in_find_conditions
|
73
|
+
assert_equal @red_car, Car.first(:conditions => {:legacy_color => 'red'})
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
60
77
|
class EnumerationWithFinderUpdatesTest < ActiveRecord::TestCase
|
61
78
|
def setup
|
62
79
|
@red = create_color(:name => 'red')
|
@@ -86,3 +103,17 @@ class EnumerationWithFinderUpdatesTest < ActiveRecord::TestCase
|
|
86
103
|
assert_equal @red, @red_car.color
|
87
104
|
end
|
88
105
|
end
|
106
|
+
|
107
|
+
class EnumerationWithCustomPrimaryKeyAndFinderUpdatesTest < ActiveRecord::TestCase
|
108
|
+
def setup
|
109
|
+
@red = create_legacy_color(:name => 'red')
|
110
|
+
@blue = create_legacy_color(:name => 'blue')
|
111
|
+
@red_car = create_car(:name => 'Ford Mustang', :legacy_color => @red)
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_should_replace_enumerations_in_update_conditions
|
115
|
+
Car.update_all({:legacy_color => 'blue'}, :name => 'Ford Mustang')
|
116
|
+
@red_car.reload
|
117
|
+
assert_equal @blue, @red_car.legacy_color
|
118
|
+
end
|
119
|
+
end
|
@@ -284,6 +284,14 @@ class EnumerationWithCachingTest < ActiveRecord::TestCase
|
|
284
284
|
assert Color.perform_enumerator_caching
|
285
285
|
end
|
286
286
|
|
287
|
+
def test_should_not_return_same_objects
|
288
|
+
assert_not_same Color.find(@red.id), Color.find(@red.id)
|
289
|
+
end
|
290
|
+
|
291
|
+
def test_should_not_return_same_collections
|
292
|
+
assert_not_same Color.find_all_by_id(@red.id), Color.find_all_by_id(@red.id)
|
293
|
+
end
|
294
|
+
|
287
295
|
def test_should_cache_all_finder_queries
|
288
296
|
assert_queries(1) { Color.find(@red.id) }
|
289
297
|
assert_queries(0) { Color.find(@red.id) }
|
@@ -310,6 +318,7 @@ class EnumerationWithCachingTest < ActiveRecord::TestCase
|
|
310
318
|
end
|
311
319
|
|
312
320
|
def teardown
|
321
|
+
Color.enumerator_cache_store.clear
|
313
322
|
EnumerateBy.perform_caching = false
|
314
323
|
end
|
315
324
|
end
|
@@ -347,6 +356,33 @@ class EnumerationWithoutCachingTest < ActiveRecord::TestCase
|
|
347
356
|
end
|
348
357
|
end
|
349
358
|
|
359
|
+
class EnumerationWithAssociationsTest < ActiveRecord::TestCase
|
360
|
+
def setup
|
361
|
+
EnumerateBy.perform_caching = true
|
362
|
+
|
363
|
+
@red = create_color(:name => 'red')
|
364
|
+
@blue = create_color(:name => 'blue')
|
365
|
+
@red_car = create_car(:name => 'Ford Mustang', :color => @red)
|
366
|
+
@blue_car = create_car(:name => 'Ford Mustang', :color => @blue)
|
367
|
+
end
|
368
|
+
|
369
|
+
def test_should_find_associated_records
|
370
|
+
assert_equal [@red_car], Color['red'].cars
|
371
|
+
end
|
372
|
+
|
373
|
+
def test_should_not_cache_association_on_subsequent_usage
|
374
|
+
assert_equal [@red_car], Color['red'].cars
|
375
|
+
|
376
|
+
@second_red_car = create_car(:name => 'Ford Mustang', :color => @red)
|
377
|
+
assert_equal [@red_car, @second_red_car], Color['red'].cars
|
378
|
+
end
|
379
|
+
|
380
|
+
def teardown
|
381
|
+
Color.enumerator_cache_store.clear
|
382
|
+
EnumerateBy.perform_caching = false
|
383
|
+
end
|
384
|
+
end
|
385
|
+
|
350
386
|
class EnumerationBootstrappedTest < ActiveRecord::TestCase
|
351
387
|
def setup
|
352
388
|
@red, @green = Color.bootstrap(
|
@@ -448,6 +484,28 @@ class EnumerationBootstrappedWithDefaultsTest < ActiveRecord::TestCase
|
|
448
484
|
end
|
449
485
|
end
|
450
486
|
|
487
|
+
class EnumerationWithCustomPrimaryKeyBootstrappedTest < ActiveRecord::TestCase
|
488
|
+
def setup
|
489
|
+
@red, @green = LegacyColor.bootstrap(
|
490
|
+
{:uid => 1, :name => 'red'},
|
491
|
+
{:uid => 2, :name => 'green'}
|
492
|
+
)
|
493
|
+
end
|
494
|
+
|
495
|
+
def test_should_not_raise_exception_if_primary_key_not_specified
|
496
|
+
assert_nothing_raised { LegacyColor.bootstrap({:name => 'red'}, {:name => 'green'}) }
|
497
|
+
assert_equal 2, LegacyColor.count
|
498
|
+
end
|
499
|
+
|
500
|
+
def test_should_create_records
|
501
|
+
assert_equal @red, LegacyColor.find(1)
|
502
|
+
assert_equal 'red', @red.name
|
503
|
+
|
504
|
+
assert_equal @green, LegacyColor.find(2)
|
505
|
+
assert_equal 'green', @green.name
|
506
|
+
end
|
507
|
+
end
|
508
|
+
|
451
509
|
class EnumerationFastBootstrappedTest < ActiveRecord::TestCase
|
452
510
|
def setup
|
453
511
|
@result = Color.fast_bootstrap(
|
@@ -546,3 +604,23 @@ class EnumerationFastBootstrappedWithDefaultsTest < ActiveRecord::TestCase
|
|
546
604
|
assert_equal '#00ff00', @green.html
|
547
605
|
end
|
548
606
|
end
|
607
|
+
|
608
|
+
class EnumerationWithCustomPrimaryKeyFastBootstrappedTest < ActiveRecord::TestCase
|
609
|
+
def setup
|
610
|
+
@result = LegacyColor.fast_bootstrap(
|
611
|
+
{:uid => 1, :name => 'red'},
|
612
|
+
{:uid => 2, :name => 'green'}
|
613
|
+
)
|
614
|
+
end
|
615
|
+
|
616
|
+
def test_should_not_raise_exception_if_primary_key_not_specified
|
617
|
+
assert_nothing_raised { LegacyColor.fast_bootstrap({:name => 'red'}, {:name => 'green'}) }
|
618
|
+
assert_equal 2, LegacyColor.count
|
619
|
+
end
|
620
|
+
|
621
|
+
def test_should_create_records
|
622
|
+
assert @result
|
623
|
+
assert_not_nil LegacyColor.find_by_name('red')
|
624
|
+
assert_not_nil LegacyColor.find_by_name('green')
|
625
|
+
end
|
626
|
+
end
|
@@ -8,11 +8,21 @@ class JSONSerializerTest < ActiveRecord::TestCase
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def test_should_include_enumeration_in_json
|
11
|
-
assert_match %r{"color"
|
11
|
+
assert_match %r{"color":\s*"red"}, @json
|
12
12
|
end
|
13
13
|
|
14
14
|
def test_should_render_other_attributes
|
15
|
-
assert_match %r{"id"
|
16
|
-
assert_match %r{"name"
|
15
|
+
assert_match %r{"id":\s*#{@car.id}}, @json
|
16
|
+
assert_match %r{"name":\s*"Ford Mustang"}, @json
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class JSONSerializerForPluginModelTest < ActiveRecord::TestCase
|
21
|
+
def setup
|
22
|
+
@tag = create_tag(:name => 'rails')
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_should_serialize
|
26
|
+
assert_match %r{"name":\s*"rails"}, @tag.to_json
|
17
27
|
end
|
18
28
|
end
|
@@ -8,7 +8,7 @@ class SerializerByDefaultTest < ActiveRecord::TestCase
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def test_should_include_enumerations_in_serializable_attribute_names
|
11
|
-
assert_equal %w(color feature_id feature_type id name), @serializer.serializable_attribute_names
|
11
|
+
assert_equal %w(color feature_id feature_type id legacy_color name), @serializer.serializable_attribute_names
|
12
12
|
end
|
13
13
|
|
14
14
|
def test_should_typecast_serializable_record
|
@@ -16,6 +16,7 @@ class SerializerByDefaultTest < ActiveRecord::TestCase
|
|
16
16
|
'color' => 'red',
|
17
17
|
'feature_id' => nil,
|
18
18
|
'feature_type' => nil,
|
19
|
+
'legacy_color' => nil,
|
19
20
|
'id' => @car.id,
|
20
21
|
'name' => 'Ford Mustang'
|
21
22
|
}
|
@@ -32,7 +33,7 @@ class SerializerWithoutEnumerationsTest < ActiveRecord::TestCase
|
|
32
33
|
end
|
33
34
|
|
34
35
|
def test_should_not_include_enumerations_in_serializable_attribute_names
|
35
|
-
assert_equal %w(color_id feature_id feature_type id name), @serializer.serializable_attribute_names
|
36
|
+
assert_equal %w(color_id feature_id feature_type id legacy_color_id name), @serializer.serializable_attribute_names
|
36
37
|
end
|
37
38
|
|
38
39
|
def test_should_not_typecast_serializable_record
|
@@ -40,6 +41,7 @@ class SerializerWithoutEnumerationsTest < ActiveRecord::TestCase
|
|
40
41
|
'color_id' => @red.id,
|
41
42
|
'feature_id' => nil,
|
42
43
|
'feature_type' => nil,
|
44
|
+
'legacy_color_id' => nil,
|
43
45
|
'id' => @car.id,
|
44
46
|
'name' => 'Ford Mustang'
|
45
47
|
}
|
@@ -98,13 +100,14 @@ class SerializerWithExceptEnumerationAttributeTest < ActiveRecord::TestCase
|
|
98
100
|
end
|
99
101
|
|
100
102
|
def test_should_not_include_enumeration_in_serializable_attribute_names
|
101
|
-
assert_equal %w(feature_id feature_type id name), @serializer.serializable_attribute_names
|
103
|
+
assert_equal %w(feature_id feature_type id legacy_color name), @serializer.serializable_attribute_names
|
102
104
|
end
|
103
105
|
|
104
106
|
def test_should_not_include_enumeration_in_serializable_record
|
105
107
|
expected = {
|
106
108
|
'feature_id' => nil,
|
107
109
|
'feature_type' => nil,
|
110
|
+
'legacy_color' => nil,
|
108
111
|
'id' => @car.id,
|
109
112
|
'name' => 'Ford Mustang'
|
110
113
|
}
|
@@ -121,13 +124,14 @@ class SerializerWithExceptEnumerationAssociationTest < ActiveRecord::TestCase
|
|
121
124
|
end
|
122
125
|
|
123
126
|
def test_should_not_include_enumeration_in_serializable_attribute_names
|
124
|
-
assert_equal %w(feature_id feature_type id name), @serializer.serializable_attribute_names
|
127
|
+
assert_equal %w(feature_id feature_type id legacy_color name), @serializer.serializable_attribute_names
|
125
128
|
end
|
126
129
|
|
127
130
|
def test_should_not_include_enumeration_in_serializable_record
|
128
131
|
expected = {
|
129
132
|
'feature_id' => nil,
|
130
133
|
'feature_type' => nil,
|
134
|
+
'legacy_color' => nil,
|
131
135
|
'id' => @car.id,
|
132
136
|
'name' => 'Ford Mustang'
|
133
137
|
}
|
@@ -144,7 +148,7 @@ class SerializerWithIncludeEnumerationTest < ActiveRecord::TestCase
|
|
144
148
|
end
|
145
149
|
|
146
150
|
def test_should_not_include_enumeration_in_serializable_attribute_names
|
147
|
-
assert_equal %w(color_id feature_id feature_type id name), @serializer.serializable_attribute_names
|
151
|
+
assert_equal %w(color_id feature_id feature_type id legacy_color name), @serializer.serializable_attribute_names
|
148
152
|
end
|
149
153
|
|
150
154
|
def test_should_include_entire_enumeration_in_serializable_record
|
@@ -157,6 +161,7 @@ class SerializerWithIncludeEnumerationTest < ActiveRecord::TestCase
|
|
157
161
|
'color_id' => @red.id,
|
158
162
|
'feature_id' => nil,
|
159
163
|
'feature_type' => nil,
|
164
|
+
'legacy_color' => nil,
|
160
165
|
'id' => @car.id,
|
161
166
|
'name' => 'Ford Mustang'
|
162
167
|
}
|
@@ -62,6 +62,7 @@ class XmlSerializerTest < ActiveRecord::TestCase
|
|
62
62
|
<feature-id type="integer" nil="true"></feature-id>
|
63
63
|
<feature-type nil="true"></feature-type>
|
64
64
|
<id type="integer">#{@car.id}</id>
|
65
|
+
<legacy-color nil="true"></legacy-color>
|
65
66
|
<name>Ford Mustang</name>
|
66
67
|
</car>
|
67
68
|
eos
|
@@ -89,3 +90,21 @@ class XmlSerializerWithNumericEnumeratorAttributeTest < ActiveRecord::TestCase
|
|
89
90
|
assert_equal expected, @order.to_xml
|
90
91
|
end
|
91
92
|
end
|
93
|
+
|
94
|
+
class XMLSerializerForPluginModelTest < ActiveRecord::TestCase
|
95
|
+
def setup
|
96
|
+
@tag = create_tag(:name => 'rails')
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_should_serialize
|
100
|
+
expected = <<-eos
|
101
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
102
|
+
<tag>
|
103
|
+
<id type="integer">#{@tag.id}</id>
|
104
|
+
<name>rails</name>
|
105
|
+
</tag>
|
106
|
+
eos
|
107
|
+
|
108
|
+
assert_equal expected, @tag.to_xml
|
109
|
+
end
|
110
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: enumerate_by
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.4
|
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:
|
12
|
+
date: 2010-03-07 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -22,35 +22,33 @@ extensions: []
|
|
22
22
|
extra_rdoc_files: []
|
23
23
|
|
24
24
|
files:
|
25
|
-
- lib/enumerate_by.rb
|
26
|
-
- lib/enumerate_by
|
27
|
-
- lib/enumerate_by/extensions
|
28
|
-
- lib/enumerate_by/extensions/base_conditions.rb
|
29
25
|
- lib/enumerate_by/extensions/associations.rb
|
30
26
|
- lib/enumerate_by/extensions/serializer.rb
|
31
27
|
- lib/enumerate_by/extensions/xml_serializer.rb
|
32
|
-
-
|
28
|
+
- lib/enumerate_by/extensions/base_conditions.rb
|
29
|
+
- lib/enumerate_by.rb
|
30
|
+
- test/unit/serializer_test.rb
|
31
|
+
- test/unit/base_conditions_test.rb
|
33
32
|
- test/unit/xml_serializer_test.rb
|
34
33
|
- test/unit/enumerate_by_test.rb
|
35
|
-
- test/unit/serializer_test.rb
|
36
|
-
- test/unit/assocations_test.rb
|
37
34
|
- test/unit/json_serializer_test.rb
|
38
|
-
- test/unit/
|
39
|
-
- test/
|
40
|
-
- test/app_root
|
41
|
-
- test/app_root/
|
42
|
-
- test/app_root/app/models
|
43
|
-
- test/app_root/app/models/order.rb
|
44
|
-
- test/app_root/app/models/color.rb
|
45
|
-
- test/app_root/app/models/car.rb
|
46
|
-
- test/app_root/app/models/car_part.rb
|
47
|
-
- test/app_root/db
|
48
|
-
- test/app_root/db/migrate
|
49
|
-
- test/app_root/db/migrate/003_create_car_parts.rb
|
35
|
+
- test/unit/associations_test.rb
|
36
|
+
- test/app_root/vendor/plugins/plugin_with_model/init.rb
|
37
|
+
- test/app_root/vendor/plugins/plugin_with_model/lib/plugin_with_model.rb
|
38
|
+
- test/app_root/db/migrate/005_create_legacy_colors.rb
|
50
39
|
- test/app_root/db/migrate/001_create_colors.rb
|
51
|
-
- test/app_root/db/migrate/
|
40
|
+
- test/app_root/db/migrate/006_create_tags.rb
|
41
|
+
- test/app_root/db/migrate/003_create_car_parts.rb
|
52
42
|
- test/app_root/db/migrate/004_create_orders.rb
|
43
|
+
- test/app_root/db/migrate/002_create_cars.rb
|
44
|
+
- test/app_root/app/models/car.rb
|
45
|
+
- test/app_root/app/models/color.rb
|
46
|
+
- test/app_root/app/models/legacy_color.rb
|
47
|
+
- test/app_root/app/models/car_part.rb
|
48
|
+
- test/app_root/app/models/order.rb
|
49
|
+
- test/app_root/config/environment.rb
|
53
50
|
- test/test_helper.rb
|
51
|
+
- test/factory.rb
|
54
52
|
- CHANGELOG.rdoc
|
55
53
|
- init.rb
|
56
54
|
- LICENSE
|
@@ -58,6 +56,8 @@ files:
|
|
58
56
|
- README.rdoc
|
59
57
|
has_rdoc: true
|
60
58
|
homepage: http://www.pluginaweek.org
|
59
|
+
licenses: []
|
60
|
+
|
61
61
|
post_install_message:
|
62
62
|
rdoc_options: []
|
63
63
|
|
@@ -78,14 +78,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
78
78
|
requirements: []
|
79
79
|
|
80
80
|
rubyforge_project: pluginaweek
|
81
|
-
rubygems_version: 1.3.
|
81
|
+
rubygems_version: 1.3.5
|
82
82
|
signing_key:
|
83
|
-
specification_version:
|
83
|
+
specification_version: 3
|
84
84
|
summary: Adds support for declaring an ActiveRecord class as an enumeration
|
85
85
|
test_files:
|
86
|
+
- test/unit/serializer_test.rb
|
87
|
+
- test/unit/base_conditions_test.rb
|
86
88
|
- test/unit/xml_serializer_test.rb
|
87
89
|
- test/unit/enumerate_by_test.rb
|
88
|
-
- test/unit/serializer_test.rb
|
89
|
-
- test/unit/assocations_test.rb
|
90
90
|
- test/unit/json_serializer_test.rb
|
91
|
-
- test/unit/
|
91
|
+
- test/unit/associations_test.rb
|