acts-as-taggable-on 2.0.6 → 2.2.2

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.
Files changed (46) hide show
  1. data/.gitignore +8 -0
  2. data/.rspec +2 -0
  3. data/.travis.yml +9 -0
  4. data/CHANGELOG +10 -0
  5. data/Gemfile +2 -9
  6. data/Guardfile +5 -0
  7. data/README.rdoc +47 -63
  8. data/Rakefile +9 -55
  9. data/acts-as-taggable-on.gemspec +28 -0
  10. data/lib/acts-as-taggable-on/version.rb +4 -0
  11. data/lib/acts-as-taggable-on.rb +7 -3
  12. data/lib/acts_as_taggable_on/acts_as_taggable_on/cache.rb +4 -4
  13. data/lib/acts_as_taggable_on/acts_as_taggable_on/collection.rb +38 -43
  14. data/lib/acts_as_taggable_on/acts_as_taggable_on/core.rb +81 -30
  15. data/lib/acts_as_taggable_on/acts_as_taggable_on/ownership.rb +7 -3
  16. data/lib/acts_as_taggable_on/acts_as_taggable_on/related.rb +23 -15
  17. data/lib/acts_as_taggable_on/tag.rb +21 -12
  18. data/lib/acts_as_taggable_on/{acts_as_taggable_on.rb → taggable.rb} +6 -5
  19. data/lib/acts_as_taggable_on/tagging.rb +12 -2
  20. data/lib/acts_as_taggable_on/tags_helper.rb +2 -2
  21. data/lib/acts_as_taggable_on/utils.rb +34 -0
  22. data/lib/generators/acts_as_taggable_on/migration/migration_generator.rb +9 -2
  23. data/lib/generators/acts_as_taggable_on/migration/templates/active_record/migration.rb +3 -1
  24. data/spec/acts_as_taggable_on/acts_as_taggable_on_spec.rb +242 -54
  25. data/spec/acts_as_taggable_on/tag_list_spec.rb +4 -0
  26. data/spec/acts_as_taggable_on/tag_spec.rb +52 -13
  27. data/spec/acts_as_taggable_on/taggable_spec.rb +131 -35
  28. data/spec/acts_as_taggable_on/tagger_spec.rb +14 -0
  29. data/spec/acts_as_taggable_on/tagging_spec.rb +2 -5
  30. data/spec/acts_as_taggable_on/tags_helper_spec.rb +16 -0
  31. data/spec/acts_as_taggable_on/utils_spec.rb +21 -0
  32. data/spec/database.yml.sample +4 -2
  33. data/spec/generators/acts_as_taggable_on/migration/migration_generator_spec.rb +22 -0
  34. data/spec/models.rb +14 -1
  35. data/spec/schema.rb +13 -0
  36. data/spec/spec_helper.rb +27 -6
  37. data/uninstall.rb +1 -0
  38. metadata +136 -51
  39. data/VERSION +0 -1
  40. data/generators/acts_as_taggable_on_migration/acts_as_taggable_on_migration_generator.rb +0 -7
  41. data/generators/acts_as_taggable_on_migration/templates/migration.rb +0 -29
  42. data/lib/acts_as_taggable_on/compatibility/Gemfile +0 -8
  43. data/lib/acts_as_taggable_on/compatibility/active_record_backports.rb +0 -17
  44. data/lib/acts_as_taggable_on/compatibility/postgresql.rb +0 -44
  45. data/spec/database.yml +0 -17
  46. /data/lib/acts_as_taggable_on/{acts_as_tagger.rb → tagger.rb} +0 -0
@@ -4,6 +4,7 @@ describe "Taggable" do
4
4
  before(:each) do
5
5
  clean_database!
6
6
  @taggable = TaggableModel.new(:name => "Bob Jones")
7
+ @taggables = [@taggable, TaggableModel.new(:name => "John Doe")]
7
8
  end
8
9
 
9
10
  it "should have tag types" do
@@ -24,14 +25,19 @@ describe "Taggable" do
24
25
  @taggable.tag_counts_on(:tags).length.should == 2
25
26
  end
26
27
 
28
+ it "should return [] right after create" do
29
+ blank_taggable = TaggableModel.new(:name => "Bob Jones")
30
+ blank_taggable.tag_list.should == []
31
+ end
32
+
27
33
  it "should be able to create tags" do
28
34
  @taggable.skill_list = "ruby, rails, css"
29
35
  @taggable.instance_variable_get("@skill_list").instance_of?(ActsAsTaggableOn::TagList).should be_true
30
-
36
+
31
37
  lambda {
32
38
  @taggable.save
33
39
  }.should change(ActsAsTaggableOn::Tag, :count).by(3)
34
-
40
+
35
41
  @taggable.reload
36
42
  @taggable.skill_list.sort.should == %w(ruby rails css).sort
37
43
  end
@@ -40,10 +46,10 @@ describe "Taggable" do
40
46
  @taggable.tag_list_on(:test).add("hello")
41
47
  @taggable.tag_list_cache_on(:test).should_not be_empty
42
48
  @taggable.tag_list_on(:test).should == ["hello"]
43
-
49
+
44
50
  @taggable.save
45
51
  @taggable.save_tags
46
-
52
+
47
53
  @taggable.reload
48
54
  @taggable.tag_list_on(:test).should == ["hello"]
49
55
  end
@@ -68,6 +74,22 @@ describe "Taggable" do
68
74
  @taggable.should have(2).skills
69
75
  end
70
76
 
77
+ it "should be able to select taggables by subset of tags using ActiveRelation methods" do
78
+ @taggables[0].tag_list = "bob"
79
+ @taggables[1].tag_list = "charlie"
80
+ @taggables[0].skill_list = "ruby"
81
+ @taggables[1].skill_list = "css"
82
+ @taggables.each{|taggable| taggable.save}
83
+
84
+ @found_taggables_by_tag = TaggableModel.joins(:tags).where(:tags => {:name => ["bob"]})
85
+ @found_taggables_by_skill = TaggableModel.joins(:skills).where(:tags => {:name => ["ruby"]})
86
+
87
+ @found_taggables_by_tag.should include @taggables[0]
88
+ @found_taggables_by_tag.should_not include @taggables[1]
89
+ @found_taggables_by_skill.should include @taggables[0]
90
+ @found_taggables_by_skill.should_not include @taggables[1]
91
+ end
92
+
71
93
  it "should be able to find by tag" do
72
94
  @taggable.skill_list = "ruby, rails, css"
73
95
  @taggable.save
@@ -111,20 +133,18 @@ describe "Taggable" do
111
133
  TaggableModel.all_tag_counts(:order => 'tags.id').first.count.should == 3 # ruby
112
134
  end
113
135
 
114
- if ActiveRecord::VERSION::MAJOR >= 3
115
- it "should not return read-only records" do
116
- TaggableModel.create(:name => "Bob", :tag_list => "ruby, rails, css")
117
- TaggableModel.tagged_with("ruby").first.should_not be_readonly
118
- end
119
- else
120
- xit "should not return read-only records" do
121
- # apparantly, there is no way to set readonly to false in a scope if joins are made
122
- end
123
-
124
- it "should be possible to return writable records" do
125
- TaggableModel.create(:name => "Bob", :tag_list => "ruby, rails, css")
126
- TaggableModel.tagged_with("ruby").first(:readonly => false).should_not be_readonly
127
- end
136
+ it "should be able to use named scopes to chain tag finds by any tags by context" do
137
+ bob = TaggableModel.create(:name => "Bob", :need_list => "rails", :offering_list => "c++")
138
+ frank = TaggableModel.create(:name => "Frank", :need_list => "css", :offering_list => "css")
139
+ steve = TaggableModel.create(:name => 'Steve', :need_list => "c++", :offering_list => "java")
140
+
141
+ # Let's only find those who need rails or css and are offering c++ or java
142
+ TaggableModel.tagged_with(['rails, css'], :on => :needs, :any => true).tagged_with(['c++', 'java'], :on => :offerings, :any => true).to_a.should == [bob]
143
+ end
144
+
145
+ it "should not return read-only records" do
146
+ TaggableModel.create(:name => "Bob", :tag_list => "ruby, rails, css")
147
+ TaggableModel.tagged_with("ruby").first.should_not be_readonly
128
148
  end
129
149
 
130
150
  it "should be able to get scoped tag counts" do
@@ -148,10 +168,10 @@ describe "Taggable" do
148
168
  bob = TaggableModel.create(:name => "Bob", :tag_list => "ruby, rails, css")
149
169
  frank = TaggableModel.create(:name => "Frank", :tag_list => "ruby, rails")
150
170
  charlie = TaggableModel.create(:name => "Charlie", :skill_list => "ruby, java")
151
-
171
+
152
172
  TaggableModel.tagged_with('rails').all_tag_counts.should have(3).items
153
173
  TaggableModel.tagged_with('rails').all_tag_counts.any? { |tag| tag.name == 'java' }.should be_false
154
-
174
+
155
175
  # Test specific join syntaxes:
156
176
  frank.untaggable_models.create!
157
177
  TaggableModel.tagged_with('rails').scoped(:joins => :untaggable_models).all_tag_counts.should have(2).items
@@ -177,15 +197,15 @@ describe "Taggable" do
177
197
  TaggableModel.tagged_with("ruby, rails", :order => 'taggable_models.name').to_a.should == [bob, frank]
178
198
  TaggableModel.tagged_with(["ruby", "rails"], :order => 'taggable_models.name').to_a.should == [bob, frank]
179
199
  end
180
-
200
+
181
201
  it "should be able to find tagged with quotation marks" do
182
202
  bob = TaggableModel.create(:name => "Bob", :tag_list => "fitter, happier, more productive, 'I love the ,comma,'")
183
203
  TaggableModel.tagged_with("'I love the ,comma,'").should include(bob)
184
204
  end
185
-
205
+
186
206
  it "should be able to find tagged with invalid tags" do
187
- bob = TaggableModel.create(:name => "Bob", :tag_list => "fitter, happier, more productive")
188
- TaggableModel.tagged_with("sad, happier").should_not include(bob)
207
+ bob = TaggableModel.create(:name => "Bob", :tag_list => "fitter, happier, more productive")
208
+ TaggableModel.tagged_with("sad, happier").should_not include(bob)
189
209
  end
190
210
 
191
211
  it "should be able to find tagged with any tag" do
@@ -198,12 +218,25 @@ describe "Taggable" do
198
218
  TaggableModel.tagged_with(["depressed", "css"], :order => 'taggable_models.name', :any => true).to_a.should == [bob, frank]
199
219
  end
200
220
 
221
+ context "wild: true" do
222
+ it "should use params as wildcards" do
223
+ bob = TaggableModel.create(:name => "Bob", :tag_list => "bob, tricia")
224
+ frank = TaggableModel.create(:name => "Frank", :tag_list => "bobby, jim")
225
+ steve = TaggableModel.create(:name => "Steve", :tag_list => "john, patricia")
226
+ jim = TaggableModel.create(:name => "Jim", :tag_list => "jim, steve")
227
+
228
+
229
+ TaggableModel.tagged_with(["bob", "tricia"], :wild => true, :any => true).to_a.should == [bob, frank, steve]
230
+ TaggableModel.tagged_with(["bob", "tricia"], :wild => true, :exclude => true).to_a.should == [jim]
231
+ end
232
+ end
233
+
201
234
  it "should be able to find tagged on a custom tag context" do
202
235
  bob = TaggableModel.create(:name => "Bob")
203
236
  bob.set_tag_list_on(:rotors, "spinning, jumping")
204
237
  bob.tag_list_on(:rotors).should == ["spinning","jumping"]
205
238
  bob.save
206
-
239
+
207
240
  TaggableModel.tagged_with("spinning", :on => :rotors).to_a.should == [bob]
208
241
  end
209
242
 
@@ -235,6 +268,13 @@ describe "Taggable" do
235
268
  TaggableModel.tagged_with("lazy", :exclude => true).to_a.should == [frank, steve]
236
269
  end
237
270
 
271
+ it "should return an empty scope for empty tags" do
272
+ TaggableModel.tagged_with('').should == []
273
+ TaggableModel.tagged_with(' ').should == []
274
+ TaggableModel.tagged_with(nil).should == []
275
+ TaggableModel.tagged_with([]).should == []
276
+ end
277
+
238
278
  it "should not create duplicate taggings" do
239
279
  bob = TaggableModel.create(:name => "Bob")
240
280
  lambda {
@@ -243,12 +283,12 @@ describe "Taggable" do
243
283
  bob.save
244
284
  }.should change(ActsAsTaggableOn::Tagging, :count).by(1)
245
285
  end
246
-
286
+
247
287
  describe "Associations" do
248
288
  before(:each) do
249
289
  @taggable = TaggableModel.create(:tag_list => "awesome, epic")
250
290
  end
251
-
291
+
252
292
  it "should not remove tags when creating associated objects" do
253
293
  @taggable.untaggable_models.create!
254
294
  @taggable.reload
@@ -264,6 +304,10 @@ describe "Taggable" do
264
304
  it "should return all column names joined for TaggableModel GROUP clause" do
265
305
  @taggable.grouped_column_names_for(TaggableModel).should == "taggable_models.id, taggable_models.name, taggable_models.type"
266
306
  end
307
+
308
+ it "should return all column names joined for NonStandardIdTaggableModel GROUP clause" do
309
+ @taggable.grouped_column_names_for(TaggableModel).should == "taggable_models.#{TaggableModel.primary_key}, taggable_models.name, taggable_models.type"
310
+ end
267
311
  end
268
312
 
269
313
  describe "Single Table Inheritance" do
@@ -272,45 +316,97 @@ describe "Taggable" do
272
316
  @inherited_same = InheritingTaggableModel.new(:name => "inherited same")
273
317
  @inherited_different = AlteredInheritingTaggableModel.new(:name => "inherited different")
274
318
  end
275
-
319
+
276
320
  it "should be able to save tags for inherited models" do
277
321
  @inherited_same.tag_list = "bob, kelso"
278
322
  @inherited_same.save
279
323
  InheritingTaggableModel.tagged_with("bob").first.should == @inherited_same
280
324
  end
281
-
325
+
282
326
  it "should find STI tagged models on the superclass" do
283
327
  @inherited_same.tag_list = "bob, kelso"
284
328
  @inherited_same.save
285
329
  TaggableModel.tagged_with("bob").first.should == @inherited_same
286
330
  end
287
-
331
+
288
332
  it "should be able to add on contexts only to some subclasses" do
289
333
  @inherited_different.part_list = "fork, spoon"
290
334
  @inherited_different.save
291
335
  InheritingTaggableModel.tagged_with("fork", :on => :parts).should be_empty
292
336
  AlteredInheritingTaggableModel.tagged_with("fork", :on => :parts).first.should == @inherited_different
293
337
  end
294
-
338
+
295
339
  it "should have different tag_counts_on for inherited models" do
296
340
  @inherited_same.tag_list = "bob, kelso"
297
341
  @inherited_same.save!
298
342
  @inherited_different.tag_list = "fork, spoon"
299
343
  @inherited_different.save!
300
-
344
+
301
345
  InheritingTaggableModel.tag_counts_on(:tags, :order => 'tags.id').map(&:name).should == %w(bob kelso)
302
346
  AlteredInheritingTaggableModel.tag_counts_on(:tags, :order => 'tags.id').map(&:name).should == %w(fork spoon)
303
347
  TaggableModel.tag_counts_on(:tags, :order => 'tags.id').map(&:name).should == %w(bob kelso fork spoon)
304
348
  end
305
-
349
+
306
350
  it 'should store same tag without validation conflict' do
307
351
  @taggable.tag_list = 'one'
308
352
  @taggable.save!
309
-
353
+
310
354
  @inherited_same.tag_list = 'one'
311
355
  @inherited_same.save!
312
-
356
+
313
357
  @inherited_same.update_attributes! :name => 'foo'
314
358
  end
315
359
  end
360
+
361
+ describe "NonStandardIdTaggable" do
362
+ before(:each) do
363
+ clean_database!
364
+ @taggable = NonStandardIdTaggableModel.new(:name => "Bob Jones")
365
+ @taggables = [@taggable, NonStandardIdTaggableModel.new(:name => "John Doe")]
366
+ end
367
+
368
+ it "should have tag types" do
369
+ [:tags, :languages, :skills, :needs, :offerings].each do |type|
370
+ NonStandardIdTaggableModel.tag_types.should include type
371
+ end
372
+
373
+ @taggable.tag_types.should == NonStandardIdTaggableModel.tag_types
374
+ end
375
+
376
+ it "should have tag_counts_on" do
377
+ NonStandardIdTaggableModel.tag_counts_on(:tags).all.should be_empty
378
+
379
+ @taggable.tag_list = ["awesome", "epic"]
380
+ @taggable.save
381
+
382
+ NonStandardIdTaggableModel.tag_counts_on(:tags).length.should == 2
383
+ @taggable.tag_counts_on(:tags).length.should == 2
384
+ end
385
+
386
+ it "should be able to create tags" do
387
+ @taggable.skill_list = "ruby, rails, css"
388
+ @taggable.instance_variable_get("@skill_list").instance_of?(ActsAsTaggableOn::TagList).should be_true
389
+
390
+ lambda {
391
+ @taggable.save
392
+ }.should change(ActsAsTaggableOn::Tag, :count).by(3)
393
+
394
+ @taggable.reload
395
+ @taggable.skill_list.sort.should == %w(ruby rails css).sort
396
+ end
397
+
398
+ it "should be able to create tags through the tag list directly" do
399
+ @taggable.tag_list_on(:test).add("hello")
400
+ @taggable.tag_list_cache_on(:test).should_not be_empty
401
+ @taggable.tag_list_on(:test).should == ["hello"]
402
+
403
+ @taggable.save
404
+ @taggable.save_tags
405
+
406
+ @taggable.reload
407
+ @taggable.tag_list_on(:test).should == ["hello"]
408
+ end
409
+ end
316
410
  end
411
+
412
+
@@ -17,6 +17,20 @@ describe "Tagger" do
17
17
  @user.owned_tags.size == 2
18
18
  end
19
19
 
20
+ it "should scope objects returned by tagged_with by owners" do
21
+ @taggable2 = TaggableModel.create(:name => "Jim Jones")
22
+ @taggable3 = TaggableModel.create(:name => "Jane Doe")
23
+
24
+ @user2 = TaggableUser.new
25
+ @user.tag(@taggable, :with => 'ruby, scheme', :on => :tags)
26
+ @user2.tag(@taggable2, :with => 'ruby, scheme', :on => :tags)
27
+ @user2.tag(@taggable3, :with => 'ruby, scheme', :on => :tags)
28
+
29
+ TaggableModel.tagged_with(%w(ruby scheme), :owned_by => @user).count.should == 1
30
+ TaggableModel.tagged_with(%w(ruby scheme), :owned_by => @user2).count.should == 2
31
+
32
+ end
33
+
20
34
  it "should not overlap tags from different taggers" do
21
35
  @user2 = TaggableUser.new
22
36
  lambda{
@@ -13,11 +13,7 @@ describe ActsAsTaggableOn::Tagging do
13
13
 
14
14
  @tagging.should_not be_valid
15
15
 
16
- if ActiveRecord::VERSION::MAJOR >= 3
17
- @tagging.errors[:tag_id].should == ["can't be blank"]
18
- else
19
- @tagging.errors[:tag_id].should == "can't be blank"
20
- end
16
+ @tagging.errors[:tag_id].should == ["can't be blank"]
21
17
  end
22
18
 
23
19
  it "should not create duplicate taggings" do
@@ -28,4 +24,5 @@ describe ActsAsTaggableOn::Tagging do
28
24
  2.times { ActsAsTaggableOn::Tagging.create(:taggable => @taggable, :tag => @tag, :context => 'tags') }
29
25
  }.should change(ActsAsTaggableOn::Tagging, :count).by(1)
30
26
  end
27
+
31
28
  end
@@ -25,4 +25,20 @@ describe ActsAsTaggableOn::TagsHelper do
25
25
  tags["c++"].should == "sucky"
26
26
  tags["php"].should == "sucky"
27
27
  end
28
+
29
+ it "should handle tags with zero counts (build for empty)" do
30
+ bob = ActsAsTaggableOn::Tag.create(:name => "php")
31
+ tom = ActsAsTaggableOn::Tag.create(:name => "java")
32
+ eve = ActsAsTaggableOn::Tag.create(:name => "c++")
33
+
34
+ tags = { }
35
+
36
+ @helper.tag_cloud(ActsAsTaggableOn::Tag.all, ["sucky", "awesome"]) do |tag, css_class|
37
+ tags[tag.name] = css_class
38
+ end
39
+
40
+ tags["java"].should == "sucky"
41
+ tags["c++"].should == "sucky"
42
+ tags["php"].should == "sucky"
43
+ end
28
44
  end
@@ -0,0 +1,21 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ describe ActsAsTaggableOn::Utils do
4
+ describe "like_operator" do
5
+ before(:each) do
6
+ clean_database!
7
+ TaggableModel.acts_as_taggable_on(:tags, :languages, :skills, :needs, :offerings)
8
+ @taggable = TaggableModel.new(:name => "Bob Jones")
9
+ end
10
+
11
+ it "should return 'ILIKE' when the adapter is PostgreSQL" do
12
+ TaggableModel.connection.stub(:adapter_name).and_return("PostgreSQL")
13
+ TaggableModel.send(:like_operator).should == "ILIKE"
14
+ end
15
+
16
+ it "should return 'LIKE' when the adapter is not PostgreSQL" do
17
+ TaggableModel.connection.stub(:adapter_name).and_return("MySQL")
18
+ TaggableModel.send(:like_operator).should == "LIKE"
19
+ end
20
+ end
21
+ end
@@ -3,15 +3,17 @@ sqlite3:
3
3
  database: acts_as_taggable_on.sqlite3
4
4
 
5
5
  mysql:
6
- adapter: mysql
6
+ adapter: mysql2
7
7
  hostname: localhost
8
8
  username: root
9
9
  password:
10
10
  database: acts_as_taggable_on
11
-
11
+ charset: utf8
12
+
12
13
  postgresql:
13
14
  adapter: postgresql
14
15
  hostname: localhost
15
16
  username: postgres
16
17
  password:
17
18
  database: acts_as_taggable_on
19
+ encoding: utf8
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ # Generators are not automatically loaded by Rails
4
+ require 'generators/acts_as_taggable_on/migration/migration_generator'
5
+
6
+ describe ActsAsTaggableOn::MigrationGenerator do
7
+ # Tell the generator where to put its output (what it thinks of as Rails.root)
8
+ destination File.expand_path("../../../../../tmp", __FILE__)
9
+
10
+ before do
11
+ prepare_destination
12
+ Rails::Generators.options[:rails][:orm] = :active_record
13
+ end
14
+ describe 'no arguments' do
15
+ before { run_generator }
16
+
17
+ describe 'db/migrate/acts_as_taggable_on_migration.rb' do
18
+ subject { file('db/migrate/acts_as_taggable_on_migration.rb') }
19
+ it { should be_a_migration }
20
+ end
21
+ end
22
+ end
data/spec/models.rb CHANGED
@@ -10,6 +10,10 @@ class CachedModel < ActiveRecord::Base
10
10
  acts_as_taggable
11
11
  end
12
12
 
13
+ class OtherCachedModel < ActiveRecord::Base
14
+ acts_as_taggable_on :languages, :statuses, :glasses
15
+ end
16
+
13
17
  class OtherTaggableModel < ActiveRecord::Base
14
18
  acts_as_taggable_on :tags, :languages
15
19
  acts_as_taggable_on :needs, :offerings
@@ -28,4 +32,13 @@ end
28
32
 
29
33
  class UntaggableModel < ActiveRecord::Base
30
34
  belongs_to :taggable_model
31
- end
35
+ end
36
+
37
+ class NonStandardIdTaggableModel < ActiveRecord::Base
38
+ set_primary_key "an_id"
39
+ acts_as_taggable
40
+ acts_as_taggable_on :languages
41
+ acts_as_taggable_on :skills
42
+ acts_as_taggable_on :needs, :offerings
43
+ has_many :untaggable_models
44
+ end
data/spec/schema.rb CHANGED
@@ -21,6 +21,11 @@ ActiveRecord::Schema.define :version => 0 do
21
21
  t.column :type, :string
22
22
  end
23
23
 
24
+ create_table :non_standard_id_taggable_models, :primary_key => "an_id", :force => true do |t|
25
+ t.column :name, :string
26
+ t.column :type, :string
27
+ end
28
+
24
29
  create_table :untaggable_models, :force => true do |t|
25
30
  t.column :taggable_model_id, :integer
26
31
  t.column :name, :string
@@ -32,6 +37,14 @@ ActiveRecord::Schema.define :version => 0 do
32
37
  t.column :cached_tag_list, :string
33
38
  end
34
39
 
40
+ create_table :other_cached_models, :force => true do |t|
41
+ t.column :name, :string
42
+ t.column :type, :string
43
+ t.column :cached_language_list, :string
44
+ t.column :cached_status_list, :string
45
+ t.column :cached_glass_list, :string
46
+ end
47
+
35
48
  create_table :taggable_users, :force => true do |t|
36
49
  t.column :name, :string
37
50
  end
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  $LOAD_PATH << "." unless $LOAD_PATH.include?(".")
2
+ require 'logger'
2
3
 
3
4
  begin
4
5
  require "rubygems"
@@ -13,11 +14,12 @@ begin
13
14
  Bundler.setup
14
15
  rescue Bundler::GemNotFound
15
16
  raise RuntimeError, "Bundler couldn't find some gems." +
16
- "Did you run `bundle install`?"
17
+ "Did you run \`bundlee install\`?"
17
18
  end
18
19
 
19
20
  Bundler.require
20
21
  require File.expand_path('../../lib/acts-as-taggable-on', __FILE__)
22
+ require 'ammeter/init'
21
23
 
22
24
  unless [].respond_to?(:freq)
23
25
  class Array
@@ -29,14 +31,33 @@ unless [].respond_to?(:freq)
29
31
  end
30
32
  end
31
33
 
32
- ENV['DB'] ||= 'sqlite3'
33
-
34
+ db_name = ENV['DB'] || 'sqlite3'
34
35
  database_yml = File.expand_path('../database.yml', __FILE__)
36
+
35
37
  if File.exists?(database_yml)
36
- active_record_configuration = YAML.load_file(database_yml)[ENV['DB']]
38
+ active_record_configuration = YAML.load_file(database_yml)
37
39
 
38
- ActiveRecord::Base.establish_connection(active_record_configuration)
40
+ ActiveRecord::Base.configurations = active_record_configuration
41
+ config = ActiveRecord::Base.configurations[db_name]
42
+
43
+ begin
44
+ ActiveRecord::Base.establish_connection(db_name)
45
+ ActiveRecord::Base.connection
46
+ rescue
47
+ case db_name
48
+ when /mysql/
49
+ ActiveRecord::Base.establish_connection(config.merge('database' => nil))
50
+ ActiveRecord::Base.connection.create_database(config['database'], {:charset => 'utf8', :collation => 'utf8_unicode_ci'})
51
+ when 'postgresql'
52
+ ActiveRecord::Base.establish_connection(config.merge('database' => 'postgres', 'schema_search_path' => 'public'))
53
+ ActiveRecord::Base.connection.create_database(config['database'], config.merge('encoding' => 'utf8'))
54
+ end
55
+
56
+ ActiveRecord::Base.establish_connection(config)
57
+ end
58
+
39
59
  ActiveRecord::Base.logger = Logger.new(File.join(File.dirname(__FILE__), "debug.log"))
60
+ ActiveRecord::Base.default_timezone = :utc
40
61
 
41
62
  ActiveRecord::Base.silence do
42
63
  ActiveRecord::Migration.verbose = false
@@ -57,4 +78,4 @@ def clean_database!
57
78
  end
58
79
  end
59
80
 
60
- clean_database!
81
+ clean_database!
data/uninstall.rb ADDED
@@ -0,0 +1 @@
1
+ # Uninstall hook code here