acts-as-taggable-on 3.1.1 → 3.2.1

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 (72) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -1
  3. data/.travis.yml +9 -7
  4. data/Appraisals +13 -8
  5. data/CHANGELOG.md +8 -0
  6. data/Gemfile +1 -2
  7. data/README.md +23 -13
  8. data/Rakefile +5 -17
  9. data/UPGRADING.md +6 -0
  10. data/acts-as-taggable-on.gemspec +13 -13
  11. data/db/migrate/1_acts_as_taggable_on_migration.rb +3 -3
  12. data/db/migrate/2_add_missing_unique_indices.rb +3 -5
  13. data/db/migrate/3_add_taggings_counter_cache_to_tags.rb +1 -1
  14. data/gemfiles/activerecord_3.2.gemfile +15 -0
  15. data/gemfiles/activerecord_4.0.gemfile +15 -0
  16. data/gemfiles/activerecord_4.1.gemfile +15 -0
  17. data/gemfiles/activerecord_edge.gemfile +16 -0
  18. data/lib/acts-as-taggable-on.rb +23 -21
  19. data/lib/acts_as_taggable_on/acts_as_taggable_on/cache.rb +1 -4
  20. data/lib/acts_as_taggable_on/acts_as_taggable_on/collection.rb +29 -20
  21. data/lib/acts_as_taggable_on/acts_as_taggable_on/compatibility.rb +11 -10
  22. data/lib/acts_as_taggable_on/acts_as_taggable_on/core.rb +98 -80
  23. data/lib/acts_as_taggable_on/acts_as_taggable_on/ownership.rb +5 -12
  24. data/lib/acts_as_taggable_on/acts_as_taggable_on/related.rb +7 -7
  25. data/lib/acts_as_taggable_on/engine.rb +0 -1
  26. data/lib/acts_as_taggable_on/tag.rb +24 -19
  27. data/lib/acts_as_taggable_on/tag_list.rb +95 -21
  28. data/lib/acts_as_taggable_on/taggable.rb +28 -30
  29. data/lib/acts_as_taggable_on/tagger.rb +30 -18
  30. data/lib/acts_as_taggable_on/tagging.rb +7 -8
  31. data/lib/acts_as_taggable_on/tags_helper.rb +1 -1
  32. data/lib/acts_as_taggable_on/utils.rb +25 -3
  33. data/lib/acts_as_taggable_on/version.rb +1 -1
  34. data/spec/acts_as_taggable_on/acts_as_taggable_on_spec.rb +133 -138
  35. data/spec/acts_as_taggable_on/acts_as_tagger_spec.rb +55 -58
  36. data/spec/acts_as_taggable_on/caching_spec.rb +34 -35
  37. data/spec/acts_as_taggable_on/related_spec.rb +59 -113
  38. data/spec/acts_as_taggable_on/single_table_inheritance_spec.rb +118 -95
  39. data/spec/acts_as_taggable_on/tag_list_spec.rb +89 -57
  40. data/spec/acts_as_taggable_on/tag_spec.rb +125 -114
  41. data/spec/acts_as_taggable_on/taggable_spec.rb +538 -352
  42. data/spec/acts_as_taggable_on/tagger_spec.rb +81 -78
  43. data/spec/acts_as_taggable_on/tagging_spec.rb +13 -14
  44. data/spec/acts_as_taggable_on/tags_helper_spec.rb +25 -25
  45. data/spec/acts_as_taggable_on/utils_spec.rb +9 -9
  46. data/spec/internal/app/models/altered_inheriting_taggable_model.rb +3 -0
  47. data/spec/internal/app/models/cached_model.rb +3 -0
  48. data/spec/internal/app/models/cached_model_with_array.rb +5 -0
  49. data/spec/internal/app/models/company.rb +15 -0
  50. data/spec/internal/app/models/inheriting_taggable_model.rb +2 -0
  51. data/spec/internal/app/models/market.rb +2 -0
  52. data/spec/{models.rb → internal/app/models/models.rb} +34 -2
  53. data/spec/internal/app/models/non_standard_id_taggable_model.rb +8 -0
  54. data/spec/internal/app/models/ordered_taggable_model.rb +4 -0
  55. data/spec/internal/app/models/other_cached_model.rb +3 -0
  56. data/spec/internal/app/models/other_taggable_model.rb +4 -0
  57. data/spec/internal/app/models/student.rb +2 -0
  58. data/spec/internal/app/models/taggable_model.rb +13 -0
  59. data/spec/internal/app/models/untaggable_model.rb +3 -0
  60. data/spec/internal/app/models/user.rb +3 -0
  61. data/spec/{database.yml.sample → internal/config/database.yml.sample} +2 -2
  62. data/spec/internal/db/schema.rb +97 -0
  63. data/spec/schema.rb +11 -0
  64. data/spec/spec_helper.rb +9 -62
  65. data/spec/support/array.rb +9 -0
  66. data/spec/support/database.rb +42 -0
  67. data/spec/support/database_cleaner.rb +17 -0
  68. metadata +101 -37
  69. data/gemfiles/rails_3.2.gemfile +0 -7
  70. data/gemfiles/rails_4.0.gemfile +0 -7
  71. data/gemfiles/rails_4.1.gemfile +0 -7
  72. data/gemfiles/rails_edge.gemfile +0 -7
@@ -1,5 +1,6 @@
1
1
  module ActsAsTaggableOn
2
2
  class Tagging < ::ActiveRecord::Base #:nodoc:
3
+ #TODO, remove from 4.0.0
3
4
  attr_accessible :tag,
4
5
  :tag_id,
5
6
  :context,
@@ -9,14 +10,15 @@ module ActsAsTaggableOn
9
10
  :tagger,
10
11
  :tagger_type,
11
12
  :tagger_id if defined?(ActiveModel::MassAssignmentSecurity)
12
- belongs_to :tag, :class_name => 'ActsAsTaggableOn::Tag' , :counter_cache => true
13
- belongs_to :taggable, :polymorphic => true
14
- belongs_to :tagger, :polymorphic => true
13
+
14
+ belongs_to :tag, class_name: 'ActsAsTaggableOn::Tag' , counter_cache: true
15
+ belongs_to :taggable, polymorphic: true
16
+ belongs_to :tagger, polymorphic: true
15
17
 
16
18
  validates_presence_of :context
17
19
  validates_presence_of :tag_id
18
20
 
19
- validates_uniqueness_of :tag_id, :scope => [:taggable_type, :taggable_id, :context, :tagger_id, :tagger_type]
21
+ validates_uniqueness_of :tag_id, scope: [:taggable_type, :taggable_id, :context, :tagger_id, :tagger_type]
20
22
 
21
23
  after_destroy :remove_unused_tags
22
24
 
@@ -24,10 +26,7 @@ module ActsAsTaggableOn
24
26
 
25
27
  def remove_unused_tags
26
28
  if ActsAsTaggableOn.remove_unused_tags
27
- # TODO: use taggings_count in release 4.0.0
28
- if tag.taggings.count.zero?
29
- tag.destroy
30
- end
29
+ tag.destroy if tag.taggings_count.zero?
31
30
  end
32
31
  end
33
32
  end
@@ -1,6 +1,6 @@
1
1
  module ActsAsTaggableOn
2
2
  module TagsHelper
3
- # See the README for an example using tag_cloud.
3
+ # See the wiki for an example using tag_cloud.
4
4
  def tag_cloud(tags, classes)
5
5
  return [] if tags.empty?
6
6
 
@@ -1,14 +1,26 @@
1
1
  module ActsAsTaggableOn
2
2
  module Utils
3
+ extend self
3
4
 
5
+ # Use ActsAsTaggableOn::Tag connection
4
6
  def connection
5
- ::ActiveRecord::Base.connection
7
+ ActsAsTaggableOn::Tag.connection
6
8
  end
7
9
 
8
10
  def using_postgresql?
9
11
  connection && connection.adapter_name == 'PostgreSQL'
10
12
  end
11
13
 
14
+ def postgresql_version
15
+ if using_postgresql?
16
+ connection.execute("SHOW SERVER_VERSION").first["server_version"].to_f
17
+ end
18
+ end
19
+
20
+ def postgresql_support_json?
21
+ postgresql_version >= 9.2
22
+ end
23
+
12
24
  def using_sqlite?
13
25
  connection && connection.adapter_name == 'SQLite'
14
26
  end
@@ -19,14 +31,24 @@ module ActsAsTaggableOn
19
31
  end
20
32
 
21
33
  def using_case_insensitive_collation?
22
- using_mysql? && ::ActiveRecord::Base.connection.collation =~ /_ci\Z/
34
+ using_mysql? && connection.collation =~ /_ci\Z/
35
+ end
36
+
37
+ def supports_concurrency?
38
+ !using_sqlite?
23
39
  end
24
40
 
25
41
  def sha_prefix(string)
26
42
  Digest::SHA1.hexdigest("#{string}#{rand}")[0..6]
27
43
  end
28
44
 
29
- private
45
+ def active_record4?
46
+ ::ActiveRecord::VERSION::MAJOR == 4
47
+ end
48
+
49
+ def active_record42?
50
+ active_record4? && ::ActiveRecord::VERSION::MINOR >= 2
51
+ end
30
52
 
31
53
  def like_operator
32
54
  using_postgresql? ? 'ILIKE' : 'LIKE'
@@ -1,4 +1,4 @@
1
1
  module ActsAsTaggableOn
2
- VERSION = '3.1.1'
2
+ VERSION = '3.2.1'
3
3
  end
4
4
 
@@ -1,141 +1,136 @@
1
1
  # coding: utf-8
2
2
  require 'spec_helper'
3
3
 
4
- describe "Acts As Taggable On" do
5
- before(:each) do
6
- clean_database!
7
- end
4
+ describe 'Acts As Taggable On' do
8
5
 
9
6
  it "should provide a class method 'taggable?' that is false for untaggable models" do
10
- UntaggableModel.should_not be_taggable
7
+ expect(UntaggableModel).to_not be_taggable
11
8
  end
12
9
 
13
- describe "Taggable Method Generation To Preserve Order" do
10
+ describe 'Taggable Method Generation To Preserve Order' do
14
11
  before(:each) do
15
- clean_database!
16
12
  TaggableModel.tag_types = []
17
13
  TaggableModel.preserve_tag_order = false
18
14
  TaggableModel.acts_as_ordered_taggable_on(:ordered_tags)
19
- @taggable = TaggableModel.new(:name => "Bob Jones")
15
+ @taggable = TaggableModel.new(name: 'Bob Jones')
20
16
  end
21
17
 
22
18
  it "should respond 'true' to preserve_tag_order?" do
23
- @taggable.class.preserve_tag_order?.should be_true
19
+ expect(@taggable.class.preserve_tag_order?).to be_truthy
24
20
  end
25
21
  end
26
22
 
27
- describe "Taggable Method Generation" do
23
+ describe 'Taggable Method Generation' do
28
24
  before(:each) do
29
- clean_database!
30
25
  TaggableModel.tag_types = []
31
26
  TaggableModel.acts_as_taggable_on(:tags, :languages, :skills, :needs, :offerings)
32
- @taggable = TaggableModel.new(:name => "Bob Jones")
27
+ @taggable = TaggableModel.new(name: 'Bob Jones')
33
28
  end
34
29
 
35
30
  it "should respond 'true' to taggable?" do
36
- @taggable.class.should be_taggable
31
+ expect(@taggable.class).to be_taggable
37
32
  end
38
33
 
39
- it "should create a class attribute for tag types" do
40
- @taggable.class.should respond_to(:tag_types)
34
+ it 'should create a class attribute for tag types' do
35
+ expect(@taggable.class).to respond_to(:tag_types)
41
36
  end
42
37
 
43
- it "should create an instance attribute for tag types" do
44
- @taggable.should respond_to(:tag_types)
38
+ it 'should create an instance attribute for tag types' do
39
+ expect(@taggable).to respond_to(:tag_types)
45
40
  end
46
41
 
47
- it "should have all tag types" do
48
- @taggable.tag_types.should == [:tags, :languages, :skills, :needs, :offerings]
42
+ it 'should have all tag types' do
43
+ expect(@taggable.tag_types).to eq([:tags, :languages, :skills, :needs, :offerings])
49
44
  end
50
45
 
51
- it "should create a class attribute for preserve tag order" do
52
- @taggable.class.should respond_to(:preserve_tag_order?)
46
+ it 'should create a class attribute for preserve tag order' do
47
+ expect(@taggable.class).to respond_to(:preserve_tag_order?)
53
48
  end
54
49
 
55
- it "should create an instance attribute for preserve tag order" do
56
- @taggable.should respond_to(:preserve_tag_order?)
50
+ it 'should create an instance attribute for preserve tag order' do
51
+ expect(@taggable).to respond_to(:preserve_tag_order?)
57
52
  end
58
53
 
59
54
  it "should respond 'false' to preserve_tag_order?" do
60
- @taggable.class.preserve_tag_order?.should be_false
55
+ expect(@taggable.class.preserve_tag_order?).to be_falsy
61
56
  end
62
57
 
63
- it "should generate an association for each tag type" do
64
- @taggable.should respond_to(:tags, :skills, :languages)
58
+ it 'should generate an association for each tag type' do
59
+ expect(@taggable).to respond_to(:tags, :skills, :languages)
65
60
  end
66
61
 
67
- it "should add tagged_with and tag_counts to singleton" do
68
- TaggableModel.should respond_to(:tagged_with, :tag_counts)
62
+ it 'should add tagged_with and tag_counts to singleton' do
63
+ expect(TaggableModel).to respond_to(:tagged_with, :tag_counts)
69
64
  end
70
65
 
71
- it "should generate a tag_list accessor/setter for each tag type" do
72
- @taggable.should respond_to(:tag_list, :skill_list, :language_list)
73
- @taggable.should respond_to(:tag_list=, :skill_list=, :language_list=)
66
+ it 'should generate a tag_list accessor/setter for each tag type' do
67
+ expect(@taggable).to respond_to(:tag_list, :skill_list, :language_list)
68
+ expect(@taggable).to respond_to(:tag_list=, :skill_list=, :language_list=)
74
69
  end
75
70
 
76
- it "should generate a tag_list accessor, that includes owned tags, for each tag type" do
77
- @taggable.should respond_to(:all_tags_list, :all_skills_list, :all_languages_list)
71
+ it 'should generate a tag_list accessor, that includes owned tags, for each tag type' do
72
+ expect(@taggable).to respond_to(:all_tags_list, :all_skills_list, :all_languages_list)
78
73
  end
79
74
  end
80
75
 
81
- describe "Reloading" do
82
- it "should save a model instantiated by Model.find" do
83
- taggable = TaggableModel.create!(:name => "Taggable")
76
+ describe 'Reloading' do
77
+ it 'should save a model instantiated by Model.find' do
78
+ taggable = TaggableModel.create!(name: 'Taggable')
84
79
  found_taggable = TaggableModel.find(taggable.id)
85
80
  found_taggable.save
86
81
  end
87
82
  end
88
83
 
89
- describe "Matching Contexts" do
90
- it "should find objects with tags of matching contexts" do
91
- taggable1 = TaggableModel.create!(:name => "Taggable 1")
92
- taggable2 = TaggableModel.create!(:name => "Taggable 2")
93
- taggable3 = TaggableModel.create!(:name => "Taggable 3")
84
+ describe 'Matching Contexts' do
85
+ it 'should find objects with tags of matching contexts' do
86
+ taggable1 = TaggableModel.create!(name: 'Taggable 1')
87
+ taggable2 = TaggableModel.create!(name: 'Taggable 2')
88
+ taggable3 = TaggableModel.create!(name: 'Taggable 3')
94
89
 
95
- taggable1.offering_list = "one, two"
90
+ taggable1.offering_list = 'one, two'
96
91
  taggable1.save!
97
92
 
98
- taggable2.need_list = "one, two"
93
+ taggable2.need_list = 'one, two'
99
94
  taggable2.save!
100
95
 
101
- taggable3.offering_list = "one, two"
96
+ taggable3.offering_list = 'one, two'
102
97
  taggable3.save!
103
98
 
104
- taggable1.find_matching_contexts(:offerings, :needs).should include(taggable2)
105
- taggable1.find_matching_contexts(:offerings, :needs).should_not include(taggable3)
99
+ expect(taggable1.find_matching_contexts(:offerings, :needs)).to include(taggable2)
100
+ expect(taggable1.find_matching_contexts(:offerings, :needs)).to_not include(taggable3)
106
101
  end
107
102
 
108
- it "should find other related objects with tags of matching contexts" do
109
- taggable1 = TaggableModel.create!(:name => "Taggable 1")
110
- taggable2 = OtherTaggableModel.create!(:name => "Taggable 2")
111
- taggable3 = OtherTaggableModel.create!(:name => "Taggable 3")
103
+ it 'should find other related objects with tags of matching contexts' do
104
+ taggable1 = TaggableModel.create!(name: 'Taggable 1')
105
+ taggable2 = OtherTaggableModel.create!(name: 'Taggable 2')
106
+ taggable3 = OtherTaggableModel.create!(name: 'Taggable 3')
112
107
 
113
- taggable1.offering_list = "one, two"
108
+ taggable1.offering_list = 'one, two'
114
109
  taggable1.save
115
110
 
116
- taggable2.need_list = "one, two"
111
+ taggable2.need_list = 'one, two'
117
112
  taggable2.save
118
113
 
119
- taggable3.offering_list = "one, two"
114
+ taggable3.offering_list = 'one, two'
120
115
  taggable3.save
121
116
 
122
- taggable1.find_matching_contexts_for(OtherTaggableModel, :offerings, :needs).should include(taggable2)
123
- taggable1.find_matching_contexts_for(OtherTaggableModel, :offerings, :needs).should_not include(taggable3)
117
+ expect(taggable1.find_matching_contexts_for(OtherTaggableModel, :offerings, :needs)).to include(taggable2)
118
+ expect(taggable1.find_matching_contexts_for(OtherTaggableModel, :offerings, :needs)).to_not include(taggable3)
124
119
  end
125
120
 
126
- it "should not include the object itself in the list of related objects with tags of matching contexts" do
127
- taggable1 = TaggableModel.create!(:name => "Taggable 1")
128
- taggable2 = TaggableModel.create!(:name => "Taggable 2")
121
+ it 'should not include the object itself in the list of related objects with tags of matching contexts' do
122
+ taggable1 = TaggableModel.create!(name: 'Taggable 1')
123
+ taggable2 = TaggableModel.create!(name: 'Taggable 2')
129
124
 
130
- taggable1.offering_list = "one, two"
131
- taggable1.need_list = "one, two"
125
+ taggable1.offering_list = 'one, two'
126
+ taggable1.need_list = 'one, two'
132
127
  taggable1.save
133
128
 
134
- taggable2.need_list = "one, two"
129
+ taggable2.need_list = 'one, two'
135
130
  taggable2.save
136
131
 
137
- taggable1.find_matching_contexts_for(TaggableModel, :offerings, :needs).should include(taggable2)
138
- taggable1.find_matching_contexts_for(TaggableModel, :offerings, :needs).should_not include(taggable1)
132
+ expect(taggable1.find_matching_contexts_for(TaggableModel, :offerings, :needs)).to include(taggable2)
133
+ expect(taggable1.find_matching_contexts_for(TaggableModel, :offerings, :needs)).to_not include(taggable1)
139
134
  end
140
135
 
141
136
  end
@@ -143,121 +138,121 @@ describe "Acts As Taggable On" do
143
138
  describe 'Tagging Contexts' do
144
139
  it 'should eliminate duplicate tagging contexts ' do
145
140
  TaggableModel.acts_as_taggable_on(:skills, :skills)
146
- TaggableModel.tag_types.freq[:skills].should_not == 3
141
+ expect(TaggableModel.tag_types.freq[:skills]).to_not eq(3)
147
142
  end
148
143
 
149
- it "should not contain embedded/nested arrays" do
144
+ it 'should not contain embedded/nested arrays' do
150
145
  TaggableModel.acts_as_taggable_on([:array], [:array])
151
- TaggableModel.tag_types.freq[[:array]].should == 0
146
+ expect(TaggableModel.tag_types.freq[[:array]]).to eq(0)
152
147
  end
153
148
 
154
- it "should _flatten_ the content of arrays" do
149
+ it 'should _flatten_ the content of arrays' do
155
150
  TaggableModel.acts_as_taggable_on([:array], [:array])
156
- TaggableModel.tag_types.freq[:array].should == 1
151
+ expect(TaggableModel.tag_types.freq[:array]).to eq(1)
157
152
  end
158
153
 
159
- it "should not raise an error when passed nil" do
160
- lambda {
161
- TaggableModel.acts_as_taggable_on()
162
- }.should_not raise_error
154
+ it 'should not raise an error when passed nil' do
155
+ expect(-> {
156
+ TaggableModel.acts_as_taggable_on
157
+ }).to_not raise_error
163
158
  end
164
159
 
165
- it "should not raise an error when passed [nil]" do
166
- lambda {
160
+ it 'should not raise an error when passed [nil]' do
161
+ expect(-> {
167
162
  TaggableModel.acts_as_taggable_on([nil])
168
- }.should_not raise_error
163
+ }).to_not raise_error
169
164
  end
170
165
  end
171
166
 
172
167
  context 'when tagging context ends in an "s" when singular (ex. "status", "glass", etc.)' do
173
- describe 'caching' do
174
- before { @taggable = OtherCachedModel.new(:name => "John Smith") }
175
- subject { @taggable }
176
-
177
- it { should respond_to(:save_cached_tag_list) }
178
- its(:cached_language_list) { should be_blank }
179
- its(:cached_status_list) { should be_blank }
180
- its(:cached_glass_list) { should be_blank }
181
-
182
- context 'language taggings cache after update' do
183
- before { @taggable.update_attributes(:language_list => 'ruby, .net') }
184
- subject { @taggable }
185
-
186
- its(:language_list) { should == ['ruby', '.net']}
187
- its(:cached_language_list) { should == 'ruby, .net' } # passes
188
- its(:instance_variables) { should include((RUBY_VERSION < '1.9' ? '@language_list' : :@language_list)) }
189
- end
190
-
191
- context 'status taggings cache after update' do
192
- before { @taggable.update_attributes(:status_list => 'happy, married') }
193
- subject { @taggable }
194
-
195
- its(:status_list) { should == ['happy', 'married'] }
196
- its(:cached_status_list) { should == 'happy, married' } # fails
197
- its(:cached_status_list) { should_not == '' } # fails, is blank
198
- its(:instance_variables) { should include((RUBY_VERSION < '1.9' ? '@status_list' : :@status_list)) }
199
- its(:instance_variables) { should_not include((RUBY_VERSION < '1.9' ? '@statu_list' : :@statu_list)) } # fails, note: one "s"
200
-
201
- end
202
-
203
- context 'glass taggings cache after update' do
204
- before do
205
- @taggable.update_attributes(:glass_list => 'rectangle, aviator')
206
- end
207
-
208
- subject { @taggable }
209
- its(:glass_list) { should == ['rectangle', 'aviator'] }
210
- its(:cached_glass_list) { should == 'rectangle, aviator' } # fails
211
- its(:cached_glass_list) { should_not == '' } # fails, is blank
212
- if RUBY_VERSION < '1.9'
213
- its(:instance_variables) { should include('@glass_list') }
214
- its(:instance_variables) { should_not include('@glas_list') } # fails, note: one "s"
215
- else
216
- its(:instance_variables) { should include(:@glass_list) }
217
- its(:instance_variables) { should_not include(:@glas_list) } # fails, note: one "s"
218
- end
219
-
220
- end
221
- end
168
+ describe 'caching' do
169
+ before { @taggable = OtherCachedModel.new(name: 'John Smith') }
170
+ subject { @taggable }
171
+
172
+ it { should respond_to(:save_cached_tag_list) }
173
+ its(:cached_language_list) { should be_blank }
174
+ its(:cached_status_list) { should be_blank }
175
+ its(:cached_glass_list) { should be_blank }
176
+
177
+ context 'language taggings cache after update' do
178
+ before { @taggable.update_attributes(language_list: 'ruby, .net') }
179
+ subject { @taggable }
180
+
181
+ its(:language_list) { should == ['ruby', '.net']}
182
+ its(:cached_language_list) { should == 'ruby, .net' } # passes
183
+ its(:instance_variables) { should include((RUBY_VERSION < '1.9' ? '@language_list' : :@language_list)) }
184
+ end
185
+
186
+ context 'status taggings cache after update' do
187
+ before { @taggable.update_attributes(status_list: 'happy, married') }
188
+ subject { @taggable }
189
+
190
+ its(:status_list) { should == ['happy', 'married'] }
191
+ its(:cached_status_list) { should == 'happy, married' } # fails
192
+ its(:cached_status_list) { should_not == '' } # fails, is blank
193
+ its(:instance_variables) { should include((RUBY_VERSION < '1.9' ? '@status_list' : :@status_list)) }
194
+ its(:instance_variables) { should_not include((RUBY_VERSION < '1.9' ? '@statu_list' : :@statu_list)) } # fails, note: one "s"
195
+
196
+ end
197
+
198
+ context 'glass taggings cache after update' do
199
+ before do
200
+ @taggable.update_attributes(glass_list: 'rectangle, aviator')
201
+ end
202
+
203
+ subject { @taggable }
204
+ its(:glass_list) { should == ['rectangle', 'aviator'] }
205
+ its(:cached_glass_list) { should == 'rectangle, aviator' } # fails
206
+ its(:cached_glass_list) { should_not == '' } # fails, is blank
207
+ if RUBY_VERSION < '1.9'
208
+ its(:instance_variables) { should include('@glass_list') }
209
+ its(:instance_variables) { should_not include('@glas_list') } # fails, note: one "s"
210
+ else
211
+ its(:instance_variables) { should include(:@glass_list) }
212
+ its(:instance_variables) { should_not include(:@glas_list) } # fails, note: one "s"
213
+ end
214
+
215
+ end
216
+ end
222
217
  end
223
218
 
224
- describe "taggings" do
219
+ describe 'taggings' do
225
220
  before(:each) do
226
- @taggable = TaggableModel.new(:name => "Art Kram")
221
+ @taggable = TaggableModel.new(name: 'Art Kram')
227
222
  end
228
223
 
229
- it 'should return [] taggings' do
230
- @taggable.taggings.should == []
224
+ it 'should return no taggings' do
225
+ expect(@taggable.taggings).to be_empty
231
226
  end
232
227
  end
233
228
 
234
- describe "@@remove_unused_tags" do
229
+ describe '@@remove_unused_tags' do
235
230
  before do
236
- @taggable = TaggableModel.create(:name => "Bob Jones")
237
- @tag = ActsAsTaggableOn::Tag.create(:name => "awesome")
231
+ @taggable = TaggableModel.create(name: 'Bob Jones')
232
+ @tag = ActsAsTaggableOn::Tag.create(name: 'awesome')
238
233
 
239
- @tagging = ActsAsTaggableOn::Tagging.create(:taggable => @taggable, :tag => @tag, :context => 'tags')
234
+ @tagging = ActsAsTaggableOn::Tagging.create(taggable: @taggable, tag: @tag, context: 'tags')
240
235
  end
241
236
 
242
- context "if set to true" do
237
+ context 'if set to true' do
243
238
  before do
244
239
  ActsAsTaggableOn.remove_unused_tags = true
245
240
  end
246
241
 
247
- it "should remove unused tags after removing taggings" do
242
+ it 'should remove unused tags after removing taggings' do
248
243
  @tagging.destroy
249
- ActsAsTaggableOn::Tag.find_by_name("awesome").should be_nil
244
+ expect(ActsAsTaggableOn::Tag.find_by_name('awesome')).to be_nil
250
245
  end
251
246
  end
252
247
 
253
- context "if set to false" do
248
+ context 'if set to false' do
254
249
  before do
255
250
  ActsAsTaggableOn.remove_unused_tags = false
256
251
  end
257
252
 
258
- it "should not remove unused tags after removing taggings" do
253
+ it 'should not remove unused tags after removing taggings' do
259
254
  @tagging.destroy
260
- ActsAsTaggableOn::Tag.find_by_name("awesome").should == @tag
255
+ expect(ActsAsTaggableOn::Tag.find_by_name('awesome')).to eq(@tag)
261
256
  end
262
257
  end
263
258
  end