acts-as-taggable-on 2.0.0.pre5 → 3.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/{spec/spec.opts → .rspec} +0 -0
  4. data/.travis.yml +40 -0
  5. data/Appraisals +16 -0
  6. data/CHANGELOG.md +208 -0
  7. data/CONTRIBUTING.md +44 -0
  8. data/Gemfile +10 -5
  9. data/Guardfile +5 -0
  10. data/{MIT-LICENSE → LICENSE.md} +1 -1
  11. data/README.md +477 -0
  12. data/Rakefile +14 -52
  13. data/UPGRADING.md +8 -0
  14. data/acts-as-taggable-on.gemspec +36 -0
  15. data/{lib/generators/acts_as_taggable_on/migration/templates/active_record/migration.rb → db/migrate/1_acts_as_taggable_on_migration.rb} +5 -3
  16. data/db/migrate/2_add_missing_unique_indices.rb +19 -0
  17. data/db/migrate/3_add_taggings_counter_cache_to_tags.rb +14 -0
  18. data/db/migrate/4_add_missing_taggable_index.rb +9 -0
  19. data/db/migrate/5_change_collation_for_tag_names.rb +9 -0
  20. data/gemfiles/activerecord_3.2.gemfile +15 -0
  21. data/gemfiles/activerecord_4.0.gemfile +15 -0
  22. data/gemfiles/activerecord_4.1.gemfile +15 -0
  23. data/gemfiles/activerecord_4.2.gemfile +16 -0
  24. data/lib/acts-as-taggable-on.rb +117 -22
  25. data/lib/acts_as_taggable_on/compatibility.rb +35 -0
  26. data/lib/acts_as_taggable_on/default_parser.rb +79 -0
  27. data/lib/acts_as_taggable_on/engine.rb +5 -0
  28. data/lib/acts_as_taggable_on/generic_parser.rb +19 -0
  29. data/lib/acts_as_taggable_on/tag.rb +137 -61
  30. data/lib/acts_as_taggable_on/tag_list.rb +96 -75
  31. data/lib/acts_as_taggable_on/tag_list_parser.rb +21 -0
  32. data/lib/acts_as_taggable_on/taggable/cache.rb +86 -0
  33. data/lib/acts_as_taggable_on/taggable/collection.rb +178 -0
  34. data/lib/acts_as_taggable_on/taggable/core.rb +459 -0
  35. data/lib/acts_as_taggable_on/taggable/dirty.rb +36 -0
  36. data/lib/acts_as_taggable_on/taggable/ownership.rb +125 -0
  37. data/lib/acts_as_taggable_on/taggable/related.rb +71 -0
  38. data/lib/acts_as_taggable_on/taggable.rb +102 -0
  39. data/lib/acts_as_taggable_on/tagger.rb +88 -0
  40. data/lib/acts_as_taggable_on/tagging.rb +38 -18
  41. data/lib/acts_as_taggable_on/tags_helper.rb +12 -14
  42. data/lib/acts_as_taggable_on/utils.rb +38 -0
  43. data/lib/acts_as_taggable_on/version.rb +4 -0
  44. data/lib/acts_as_taggable_on.rb +6 -0
  45. data/lib/tasks/tags_collate_utf8.rake +21 -0
  46. data/spec/acts_as_taggable_on/acts_as_taggable_on_spec.rb +205 -195
  47. data/spec/acts_as_taggable_on/acts_as_tagger_spec.rb +79 -81
  48. data/spec/acts_as_taggable_on/caching_spec.rb +83 -0
  49. data/spec/acts_as_taggable_on/default_parser_spec.rb +47 -0
  50. data/spec/acts_as_taggable_on/generic_parser_spec.rb +14 -0
  51. data/spec/acts_as_taggable_on/related_spec.rb +99 -0
  52. data/spec/acts_as_taggable_on/single_table_inheritance_spec.rb +211 -0
  53. data/spec/acts_as_taggable_on/tag_list_parser_spec.rb +46 -0
  54. data/spec/acts_as_taggable_on/tag_list_spec.rb +142 -62
  55. data/spec/acts_as_taggable_on/tag_spec.rb +274 -64
  56. data/spec/acts_as_taggable_on/taggable/dirty_spec.rb +127 -0
  57. data/spec/acts_as_taggable_on/taggable_spec.rb +704 -181
  58. data/spec/acts_as_taggable_on/tagger_spec.rb +134 -56
  59. data/spec/acts_as_taggable_on/tagging_spec.rb +54 -22
  60. data/spec/acts_as_taggable_on/tags_helper_spec.rb +39 -22
  61. data/spec/acts_as_taggable_on/utils_spec.rb +23 -0
  62. data/spec/internal/app/models/altered_inheriting_taggable_model.rb +3 -0
  63. data/spec/internal/app/models/cached_model.rb +3 -0
  64. data/spec/internal/app/models/cached_model_with_array.rb +5 -0
  65. data/spec/internal/app/models/company.rb +15 -0
  66. data/spec/internal/app/models/inheriting_taggable_model.rb +2 -0
  67. data/spec/internal/app/models/market.rb +2 -0
  68. data/spec/internal/app/models/models.rb +90 -0
  69. data/spec/internal/app/models/non_standard_id_taggable_model.rb +8 -0
  70. data/spec/internal/app/models/ordered_taggable_model.rb +4 -0
  71. data/spec/internal/app/models/other_cached_model.rb +3 -0
  72. data/spec/internal/app/models/other_taggable_model.rb +4 -0
  73. data/spec/internal/app/models/student.rb +2 -0
  74. data/spec/internal/app/models/taggable_model.rb +13 -0
  75. data/spec/internal/app/models/untaggable_model.rb +3 -0
  76. data/spec/internal/app/models/user.rb +3 -0
  77. data/spec/internal/config/database.yml.sample +19 -0
  78. data/spec/internal/db/schema.rb +97 -0
  79. data/spec/spec_helper.rb +12 -38
  80. data/spec/support/0-helpers.rb +32 -0
  81. data/spec/support/array.rb +9 -0
  82. data/spec/support/database.rb +42 -0
  83. data/spec/support/database_cleaner.rb +21 -0
  84. metadata +268 -73
  85. data/CHANGELOG +0 -25
  86. data/README.rdoc +0 -212
  87. data/VERSION +0 -1
  88. data/lib/acts_as_taggable_on/acts_as_taggable_on/cache.rb +0 -56
  89. data/lib/acts_as_taggable_on/acts_as_taggable_on/collection.rb +0 -97
  90. data/lib/acts_as_taggable_on/acts_as_taggable_on/core.rb +0 -220
  91. data/lib/acts_as_taggable_on/acts_as_taggable_on/dirty.rb +0 -29
  92. data/lib/acts_as_taggable_on/acts_as_taggable_on/ownership.rb +0 -101
  93. data/lib/acts_as_taggable_on/acts_as_taggable_on/related.rb +0 -64
  94. data/lib/acts_as_taggable_on/acts_as_taggable_on.rb +0 -41
  95. data/lib/acts_as_taggable_on/acts_as_tagger.rb +0 -47
  96. data/lib/acts_as_taggable_on/compatibility/Gemfile +0 -6
  97. data/lib/acts_as_taggable_on/compatibility/active_record_backports.rb +0 -17
  98. data/lib/generators/acts_as_taggable_on/migration/migration_generator.rb +0 -31
  99. data/rails/init.rb +0 -1
  100. data/spec/bm.rb +0 -52
  101. data/spec/models.rb +0 -36
  102. data/spec/schema.rb +0 -42
@@ -1,75 +1,153 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
1
+ # -*- encoding : utf-8 -*-
2
+ require 'spec_helper'
2
3
 
3
- describe "Tagger" do
4
+ describe 'Tagger' do
4
5
  before(:each) do
5
- clean_database!
6
- @user = TaggableUser.create
7
- @taggable = TaggableModel.create(:name => "Bob Jones")
6
+ @user = User.create
7
+ @taggable = TaggableModel.create(name: 'Bob Jones')
8
8
  end
9
9
 
10
- it "should have taggings" do
11
- @user.tag(@taggable, :with=>'ruby,scheme', :on=>:tags)
12
- @user.owned_taggings.size == 2
10
+
11
+
12
+ it 'should have taggings' do
13
+ @user.tag(@taggable, with: 'ruby,scheme', on: :tags)
14
+ expect(@user.owned_taggings.size).to eq(2)
15
+ end
16
+
17
+ it 'should have tags' do
18
+ @user.tag(@taggable, with: 'ruby,scheme', on: :tags)
19
+ expect(@user.owned_tags.size).to eq(2)
20
+ end
21
+
22
+ it 'should scope objects returned by tagged_with by owners' do
23
+ @taggable2 = TaggableModel.create(name: 'Jim Jones')
24
+ @taggable3 = TaggableModel.create(name: 'Jane Doe')
25
+
26
+ @user2 = User.new
27
+ @user.tag(@taggable, with: 'ruby, scheme', on: :tags)
28
+ @user2.tag(@taggable2, with: 'ruby, scheme', on: :tags)
29
+ @user2.tag(@taggable3, with: 'ruby, scheme', on: :tags)
30
+
31
+ expect(TaggableModel.tagged_with(%w(ruby scheme), owned_by: @user).count).to eq(1)
32
+ expect(TaggableModel.tagged_with(%w(ruby scheme), owned_by: @user2).count).to eq(2)
33
+ end
34
+
35
+ it 'only returns objects tagged by owned_by when any is true' do
36
+ @user2 = User.new
37
+ @taggable2 = TaggableModel.create(name: 'Jim Jones')
38
+ @taggable3 = TaggableModel.create(name: 'Jane Doe')
39
+
40
+ @user.tag(@taggable, with: 'ruby', on: :tags)
41
+ @user.tag(@taggable2, with: 'java', on: :tags)
42
+ @user2.tag(@taggable3, with: 'ruby', on: :tags)
43
+
44
+ tags = TaggableModel.tagged_with(%w(ruby java), owned_by: @user, any: true)
45
+ expect(tags).to include(@taggable, @taggable2)
46
+ expect(tags.size).to eq(2)
13
47
  end
14
48
 
15
- it "should have tags" do
16
- @user.tag(@taggable, :with=>'ruby,scheme', :on=>:tags)
17
- @user.owned_tags.size == 2
49
+ it 'only returns objects tagged by owned_by when exclude is true' do
50
+ @user2 = User.new
51
+ @taggable2 = TaggableModel.create(name: 'Jim Jones')
52
+ @taggable3 = TaggableModel.create(name: 'Jane Doe')
53
+
54
+ @user.tag(@taggable, with: 'ruby', on: :tags)
55
+ @user.tag(@taggable2, with: 'java', on: :tags)
56
+ @user2.tag(@taggable3, with: 'java', on: :tags)
57
+
58
+ tags = TaggableModel.tagged_with(%w(ruby), owned_by: @user, exclude: true)
59
+ expect(tags).to eq([@taggable2])
18
60
  end
19
-
20
- it "should not overlap tags from different taggers" do
21
- @user2 = TaggableUser.new
22
- lambda{
23
- @user.tag(@taggable, :with => 'ruby, scheme', :on => :tags)
24
- @user2.tag(@taggable, :with => 'java, python, lisp, ruby', :on => :tags)
25
- }.should change(Tagging, :count).by(6)
61
+
62
+ it 'should not overlap tags from different taggers' do
63
+ @user2 = User.new
64
+ expect(-> {
65
+ @user.tag(@taggable, with: 'ruby, scheme', on: :tags)
66
+ @user2.tag(@taggable, with: 'java, python, lisp, ruby', on: :tags)
67
+ }).to change(ActsAsTaggableOn::Tagging, :count).by(6)
26
68
 
27
69
  [@user, @user2, @taggable].each(&:reload)
28
70
 
29
- @user.owned_tags.map(&:name).sort.should == %w(ruby scheme).sort
30
- @user2.owned_tags.map(&:name).sort.should == %w(java python lisp ruby).sort
31
-
32
- @taggable.tags_from(@user).sort.should == %w(ruby scheme).sort
33
- @taggable.tags_from(@user2).sort.should == %w(java lisp python ruby).sort
34
-
35
- @taggable.all_tags_list.sort.should == %w(ruby scheme java python lisp).sort
36
- @taggable.all_tags_on(:tags).size.should == 5
71
+ expect(@user.owned_tags.map(&:name).sort).to eq(%w(ruby scheme).sort)
72
+ expect(@user2.owned_tags.map(&:name).sort).to eq(%w(java python lisp ruby).sort)
73
+
74
+ expect(@taggable.tags_from(@user).sort).to eq(%w(ruby scheme).sort)
75
+ expect(@taggable.tags_from(@user2).sort).to eq(%w(java lisp python ruby).sort)
76
+
77
+ expect(@taggable.all_tags_list.sort).to eq(%w(ruby scheme java python lisp).sort)
78
+ expect(@taggable.all_tags_on(:tags).size).to eq(5)
37
79
  end
38
-
39
- it "should not lose tags from different taggers" do
40
- @user2 = TaggableUser.create
41
- @user2.tag(@taggable, :with => 'java, python, lisp, ruby', :on => :tags)
42
- @user.tag(@taggable, :with => 'ruby, scheme', :on => :tags)
43
-
44
- lambda {
45
- @user2.tag(@taggable, :with => 'java, python, lisp', :on => :tags)
46
- }.should change(Tagging, :count).by(-1)
80
+
81
+ it 'should not lose tags from different taggers' do
82
+ @user2 = User.create
83
+ @user2.tag(@taggable, with: 'java, python, lisp, ruby', on: :tags)
84
+ @user.tag(@taggable, with: 'ruby, scheme', on: :tags)
85
+
86
+ expect(-> {
87
+ @user2.tag(@taggable, with: 'java, python, lisp', on: :tags)
88
+ }).to change(ActsAsTaggableOn::Tagging, :count).by(-1)
47
89
 
48
90
  [@user, @user2, @taggable].each(&:reload)
49
-
50
- @taggable.tags_from(@user).sort.should == %w(ruby scheme).sort
51
- @taggable.tags_from(@user2).sort.should == %w(java python lisp).sort
52
-
53
- @taggable.all_tags_list.sort.should == %w(ruby scheme java python lisp).sort
54
- @taggable.all_tags_on(:tags).length.should == 5
91
+
92
+ expect(@taggable.tags_from(@user).sort).to eq(%w(ruby scheme).sort)
93
+ expect(@taggable.tags_from(@user2).sort).to eq(%w(java python lisp).sort)
94
+
95
+ expect(@taggable.all_tags_list.sort).to eq(%w(ruby scheme java python lisp).sort)
96
+ expect(@taggable.all_tags_on(:tags).length).to eq(5)
97
+ end
98
+
99
+ it 'should not lose tags' do
100
+ @user2 = User.create
101
+
102
+ @user.tag(@taggable, with: 'awesome', on: :tags)
103
+ @user2.tag(@taggable, with: 'awesome, epic', on: :tags)
104
+
105
+ expect(-> {
106
+ @user2.tag(@taggable, with: 'epic', on: :tags)
107
+ }).to change(ActsAsTaggableOn::Tagging, :count).by(-1)
108
+
109
+ @taggable.reload
110
+ expect(@taggable.all_tags_list).to include('awesome')
111
+ expect(@taggable.all_tags_list).to include('epic')
112
+ end
113
+
114
+ it 'should not lose tags' do
115
+ @taggable.update_attributes(tag_list: 'ruby')
116
+ @user.tag(@taggable, with: 'ruby, scheme', on: :tags)
117
+
118
+ [@taggable, @user].each(&:reload)
119
+ expect(@taggable.tag_list).to eq(%w(ruby))
120
+ expect(@taggable.all_tags_list.sort).to eq(%w(ruby scheme).sort)
121
+
122
+ expect(-> {
123
+ @taggable.update_attributes(tag_list: '')
124
+ }).to change(ActsAsTaggableOn::Tagging, :count).by(-1)
125
+
126
+ expect(@taggable.tag_list).to be_empty
127
+ expect(@taggable.all_tags_list.sort).to eq(%w(ruby scheme).sort)
55
128
  end
56
129
 
57
- it "should not lose tags" do
58
- @user2 = TaggableUser.create
59
-
60
- @user.tag(@taggable, :with => 'awesome', :on => :tags)
61
- @user2.tag(@taggable, :with => 'awesome, epic', :on => :tags)
130
+ it 'is tagger' do
131
+ expect(@user.is_tagger?).to be_truthy
132
+ end
133
+
134
+ it 'should skip save if skip_save is passed as option' do
135
+ expect(-> {
136
+ @user.tag(@taggable, with: 'epic', on: :tags, skip_save: true)
137
+ }).to_not change(ActsAsTaggableOn::Tagging, :count)
138
+ end
139
+
140
+ it 'should change tags order in ordered taggable' do
141
+ @ordered_taggable = OrderedTaggableModel.create name: 'hey!'
142
+
143
+ @user.tag @ordered_taggable, with: 'tag, tag1', on: :tags
144
+ expect(@ordered_taggable.reload.tags_from(@user)).to eq(['tag', 'tag1'])
62
145
 
63
- lambda {
64
- @user2.tag(@taggable, :with => 'epic', :on => :tags)
65
- }.should change(Tagging, :count).by(-1)
146
+ @user.tag @ordered_taggable, with: 'tag2, tag1', on: :tags
147
+ expect(@ordered_taggable.reload.tags_from(@user)).to eq(['tag2', 'tag1'])
66
148
 
67
- @taggable.reload
68
- @taggable.all_tags_list.should include('awesome')
69
- @taggable.all_tags_list.should include('epic')
149
+ @user.tag @ordered_taggable, with: 'tag1, tag2', on: :tags
150
+ expect(@ordered_taggable.reload.tags_from(@user)).to eq(['tag1', 'tag2'])
70
151
  end
71
152
 
72
- it "is tagger" do
73
- @user.is_tagger?.should(be_true)
74
- end
75
- end
153
+ end
@@ -1,31 +1,63 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
1
+ # -*- encoding : utf-8 -*-
2
+ require 'spec_helper'
2
3
 
3
- describe Tagging do
4
+ describe ActsAsTaggableOn::Tagging do
4
5
  before(:each) do
5
- clean_database!
6
- @tagging = Tagging.new
6
+ @tagging = ActsAsTaggableOn::Tagging.new
7
7
  end
8
8
 
9
- it "should not be valid with a invalid tag" do
10
- @tagging.taggable = TaggableModel.create(:name => "Bob Jones")
11
- @tagging.tag = Tag.new(:name => "")
12
- @tagging.context = "tags"
13
-
14
- @tagging.should_not be_valid
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
9
+ it 'should not be valid with a invalid tag' do
10
+ @tagging.taggable = TaggableModel.create(name: 'Bob Jones')
11
+ @tagging.tag = ActsAsTaggableOn::Tag.new(name: '')
12
+ @tagging.context = 'tags'
13
+
14
+ expect(@tagging).to_not be_valid
15
+
16
+ expect(@tagging.errors[:tag_id]).to eq(['can\'t be blank'])
17
+ end
18
+
19
+ it 'should not create duplicate taggings' do
20
+ @taggable = TaggableModel.create(name: 'Bob Jones')
21
+ @tag = ActsAsTaggableOn::Tag.create(name: 'awesome')
22
+
23
+ expect(-> {
24
+ 2.times { ActsAsTaggableOn::Tagging.create(taggable: @taggable, tag: @tag, context: 'tags') }
25
+ }).to change(ActsAsTaggableOn::Tagging, :count).by(1)
21
26
  end
22
27
 
23
- it "should not create duplicate taggings" do
24
- @taggable = TaggableModel.create(:name => "Bob Jones")
25
- @tag = Tag.create(:name => "awesome")
28
+ it 'should not delete tags of other records' do
29
+ 6.times { TaggableModel.create(name: 'Bob Jones', tag_list: 'very, serious, bug') }
30
+ expect(ActsAsTaggableOn::Tag.count).to eq(3)
31
+ taggable = TaggableModel.first
32
+ taggable.tag_list = 'bug'
33
+ taggable.save
34
+
35
+ expect(taggable.tag_list).to eq(['bug'])
36
+
37
+ another_taggable = TaggableModel.where('id != ?', taggable.id).sample
38
+ expect(another_taggable.tag_list.sort).to eq(%w(very serious bug).sort)
39
+ end
26
40
 
27
- lambda {
28
- 2.times { Tagging.create(:taggable => @taggable, :tag => @tag, :context => 'tags') }
29
- }.should change(Tagging, :count).by(1)
41
+ it 'should destroy unused tags after tagging destroyed' do
42
+ previous_setting = ActsAsTaggableOn.remove_unused_tags
43
+ ActsAsTaggableOn.remove_unused_tags = true
44
+ ActsAsTaggableOn::Tag.destroy_all
45
+ @taggable = TaggableModel.create(name: 'Bob Jones')
46
+ @taggable.update_attribute :tag_list, 'aaa,bbb,ccc'
47
+ @taggable.update_attribute :tag_list, ''
48
+ expect(ActsAsTaggableOn::Tag.count).to eql(0)
49
+ ActsAsTaggableOn.remove_unused_tags = previous_setting
30
50
  end
51
+
52
+ pending 'context scopes' do
53
+ describe '.by_context'
54
+
55
+ describe '.by_contexts'
56
+
57
+ describe '.owned_by'
58
+
59
+ describe '.not_owned'
60
+
61
+ end
62
+
31
63
  end
@@ -1,28 +1,45 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
1
+ # -*- encoding : utf-8 -*-
2
+ require 'spec_helper'
2
3
 
3
- describe TagsHelper do
4
+ describe ActsAsTaggableOn::TagsHelper do
4
5
  before(:each) do
5
- clean_database!
6
-
7
- @bob = TaggableModel.create(:name => "Bob Jones", :language_list => "ruby, php")
8
- @tom = TaggableModel.create(:name => "Tom Marley", :language_list => "ruby, java")
9
- @eve = TaggableModel.create(:name => "Eve Nodd", :language_list => "ruby, c++")
10
-
11
- @helper = class Helper
12
- include TagsHelper
13
- end.new
6
+ @bob = TaggableModel.create(name: 'Bob Jones', language_list: 'ruby, php')
7
+ @tom = TaggableModel.create(name: 'Tom Marley', language_list: 'ruby, java')
8
+ @eve = TaggableModel.create(name: 'Eve Nodd', language_list: 'ruby, c++')
9
+
10
+ @helper =
11
+ class Helper
12
+ include ActsAsTaggableOn::TagsHelper
13
+ end.new
14
+ end
15
+
16
+
17
+ it 'should yield the proper css classes' do
18
+ tags = {}
19
+
20
+ @helper.tag_cloud(TaggableModel.tag_counts_on(:languages), %w(sucky awesome)) do |tag, css_class|
21
+ tags[tag.name] = css_class
22
+ end
23
+
24
+ expect(tags['ruby']).to eq('awesome')
25
+ expect(tags['java']).to eq('sucky')
26
+ expect(tags['c++']).to eq('sucky')
27
+ expect(tags['php']).to eq('sucky')
14
28
  end
15
-
16
- it "should yield the proper css classes" do
17
- tags = { }
18
-
19
- @helper.tag_cloud(TaggableModel.tag_counts_on(:languages), ["sucky", "awesome"]) do |tag, css_class|
29
+
30
+ it 'should handle tags with zero counts (build for empty)' do
31
+ ActsAsTaggableOn::Tag.create(name: 'php')
32
+ ActsAsTaggableOn::Tag.create(name: 'java')
33
+ ActsAsTaggableOn::Tag.create(name: 'c++')
34
+
35
+ tags = {}
36
+
37
+ @helper.tag_cloud(ActsAsTaggableOn::Tag.all, %w(sucky awesome)) do |tag, css_class|
20
38
  tags[tag.name] = css_class
21
39
  end
22
-
23
- tags["ruby"].should == "awesome"
24
- tags["java"].should == "sucky"
25
- tags["c++"].should == "sucky"
26
- tags["php"].should == "sucky"
40
+
41
+ expect(tags['java']).to eq('sucky')
42
+ expect(tags['c++']).to eq('sucky')
43
+ expect(tags['php']).to eq('sucky')
27
44
  end
28
- end
45
+ end
@@ -0,0 +1,23 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe ActsAsTaggableOn::Utils do
5
+ describe '#like_operator' do
6
+ it 'should return \'ILIKE\' when the adapter is PostgreSQL' do
7
+ allow(ActsAsTaggableOn::Utils.connection).to receive(:adapter_name) { 'PostgreSQL' }
8
+ expect(ActsAsTaggableOn::Utils.like_operator).to eq('ILIKE')
9
+ end
10
+
11
+ it 'should return \'LIKE\' when the adapter is not PostgreSQL' do
12
+ allow(ActsAsTaggableOn::Utils.connection).to receive(:adapter_name) { 'MySQL' }
13
+ expect(ActsAsTaggableOn::Utils.like_operator).to eq('LIKE')
14
+ end
15
+ end
16
+
17
+ describe '#sha_prefix' do
18
+ it 'should return a consistent prefix for a given word' do
19
+ expect(ActsAsTaggableOn::Utils.sha_prefix('kittens')).to eq(ActsAsTaggableOn::Utils.sha_prefix('kittens'))
20
+ expect(ActsAsTaggableOn::Utils.sha_prefix('puppies')).not_to eq(ActsAsTaggableOn::Utils.sha_prefix('kittens'))
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,3 @@
1
+ class AlteredInheritingTaggableModel < TaggableModel
2
+ acts_as_taggable_on :parts
3
+ end
@@ -0,0 +1,3 @@
1
+ class CachedModel < ActiveRecord::Base
2
+ acts_as_taggable
3
+ end
@@ -0,0 +1,5 @@
1
+ if using_postgresql?
2
+ class CachedModelWithArray < ActiveRecord::Base
3
+ acts_as_taggable
4
+ end
5
+ end
@@ -0,0 +1,15 @@
1
+ class Company < ActiveRecord::Base
2
+ acts_as_taggable_on :locations, :markets
3
+
4
+ has_many :markets, :through => :market_taggings, :source => :tag
5
+
6
+ private
7
+
8
+ def find_or_create_tags_from_list_with_context(tag_list, context)
9
+ if context.to_sym == :markets
10
+ Market.find_or_create_all_with_like_by_name(tag_list)
11
+ else
12
+ super
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,2 @@
1
+ class InheritingTaggableModel < TaggableModel
2
+ end
@@ -0,0 +1,2 @@
1
+ class Market < ActsAsTaggableOn::Tag
2
+ end
@@ -0,0 +1,90 @@
1
+ class TaggableModel < ActiveRecord::Base
2
+ acts_as_taggable
3
+ acts_as_taggable_on :languages
4
+ acts_as_taggable_on :skills
5
+ acts_as_taggable_on :needs, :offerings
6
+ has_many :untaggable_models
7
+
8
+ attr_reader :tag_list_submethod_called
9
+
10
+ def tag_list=(v)
11
+ @tag_list_submethod_called = true
12
+ super
13
+ end
14
+ end
15
+
16
+ class CachedModel < ActiveRecord::Base
17
+ acts_as_taggable
18
+ end
19
+
20
+ class OtherCachedModel < ActiveRecord::Base
21
+ acts_as_taggable_on :languages, :statuses, :glasses
22
+ end
23
+
24
+ class OtherTaggableModel < ActiveRecord::Base
25
+ acts_as_taggable_on :tags, :languages
26
+ acts_as_taggable_on :needs, :offerings
27
+ end
28
+
29
+ class InheritingTaggableModel < TaggableModel
30
+ end
31
+
32
+ class AlteredInheritingTaggableModel < TaggableModel
33
+ acts_as_taggable_on :parts
34
+ end
35
+
36
+ class Market < ActsAsTaggableOn::Tag
37
+ end
38
+
39
+ class Company < ActiveRecord::Base
40
+ acts_as_taggable_on :locations, :markets
41
+
42
+ has_many :markets, :through => :market_taggings, :source => :tag
43
+
44
+ private
45
+
46
+ def find_or_create_tags_from_list_with_context(tag_list, context)
47
+ if context.to_sym == :markets
48
+ Market.find_or_create_all_with_like_by_name(tag_list)
49
+ else
50
+ super
51
+ end
52
+ end
53
+ end
54
+
55
+ class User < ActiveRecord::Base
56
+ acts_as_tagger
57
+ end
58
+
59
+ class Student < User
60
+ end
61
+
62
+ class UntaggableModel < ActiveRecord::Base
63
+ belongs_to :taggable_model
64
+ end
65
+
66
+ class NonStandardIdTaggableModel < ActiveRecord::Base
67
+ self.primary_key = :an_id
68
+ acts_as_taggable
69
+ acts_as_taggable_on :languages
70
+ acts_as_taggable_on :skills
71
+ acts_as_taggable_on :needs, :offerings
72
+ has_many :untaggable_models
73
+ end
74
+
75
+ class OrderedTaggableModel < ActiveRecord::Base
76
+ acts_as_ordered_taggable
77
+ acts_as_ordered_taggable_on :colours
78
+ end
79
+
80
+ if using_postgresql?
81
+ class CachedModelWithArray < ActiveRecord::Base
82
+ acts_as_taggable
83
+ end
84
+ if postgresql_support_json?
85
+ class TaggableModelWithJson < ActiveRecord::Base
86
+ acts_as_taggable
87
+ acts_as_taggable_on :skills
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,8 @@
1
+ class NonStandardIdTaggableModel < ActiveRecord::Base
2
+ self.primary_key = 'an_id'
3
+ acts_as_taggable
4
+ acts_as_taggable_on :languages
5
+ acts_as_taggable_on :skills
6
+ acts_as_taggable_on :needs, :offerings
7
+ has_many :untaggable_models
8
+ end
@@ -0,0 +1,4 @@
1
+ class OrderedTaggableModel < ActiveRecord::Base
2
+ acts_as_ordered_taggable
3
+ acts_as_ordered_taggable_on :colours
4
+ end
@@ -0,0 +1,3 @@
1
+ class OtherCachedModel < ActiveRecord::Base
2
+ acts_as_taggable_on :languages, :statuses, :glasses
3
+ end
@@ -0,0 +1,4 @@
1
+ class OtherTaggableModel < ActiveRecord::Base
2
+ acts_as_taggable_on :tags, :languages
3
+ acts_as_taggable_on :needs, :offerings
4
+ end
@@ -0,0 +1,2 @@
1
+ class Student < User
2
+ end
@@ -0,0 +1,13 @@
1
+ class TaggableModel < ActiveRecord::Base
2
+ acts_as_taggable
3
+ acts_as_taggable_on :languages
4
+ acts_as_taggable_on :skills
5
+ acts_as_taggable_on :needs, :offerings
6
+ has_many :untaggable_models
7
+
8
+ attr_reader :tag_list_submethod_called
9
+ def tag_list=(v)
10
+ @tag_list_submethod_called = true
11
+ super
12
+ end
13
+ end
@@ -0,0 +1,3 @@
1
+ class UntaggableModel < ActiveRecord::Base
2
+ belongs_to :taggable_model
3
+ end
@@ -0,0 +1,3 @@
1
+ class User < ActiveRecord::Base
2
+ acts_as_tagger
3
+ end
@@ -0,0 +1,19 @@
1
+ sqlite3:
2
+ adapter: sqlite3
3
+ database: ':memory:'
4
+
5
+ mysql:
6
+ adapter: mysql2
7
+ host: localhost
8
+ username: root
9
+ password:
10
+ database: acts_as_taggable_on
11
+ charset: utf8
12
+
13
+ postgresql:
14
+ adapter: postgresql
15
+ hostname: localhost
16
+ username: postgres
17
+ password:
18
+ database: acts_as_taggable_on
19
+ encoding: utf8