acts-as-taggable-on 2.2.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +3 -1
- data/README.rdoc +59 -7
- data/acts-as-taggable-on.gemspec +3 -3
- data/lib/acts-as-taggable-on/version.rb +1 -1
- data/lib/acts-as-taggable-on.rb +30 -3
- data/lib/acts_as_taggable_on/acts_as_taggable_on/collection.rb +7 -19
- data/lib/acts_as_taggable_on/acts_as_taggable_on/core.rb +86 -21
- data/lib/acts_as_taggable_on/acts_as_taggable_on/dirty.rb +37 -0
- data/lib/acts_as_taggable_on/acts_as_taggable_on/ownership.rb +33 -12
- data/lib/acts_as_taggable_on/acts_as_taggable_on/related.rb +1 -1
- data/lib/acts_as_taggable_on/tag.rb +5 -8
- data/lib/acts_as_taggable_on/tag_list.rb +13 -12
- data/lib/acts_as_taggable_on/taggable.rb +102 -0
- data/lib/acts_as_taggable_on/{acts_as_tagger.rb → tagger.rb} +3 -3
- data/lib/acts_as_taggable_on/tagging.rb +12 -0
- data/lib/acts_as_taggable_on/tags_helper.rb +2 -2
- data/lib/acts_as_taggable_on/utils.rb +4 -0
- data/lib/generators/acts_as_taggable_on/migration/templates/active_record/migration.rb +3 -1
- data/spec/acts_as_taggable_on/acts_as_taggable_on_spec.rb +58 -0
- data/spec/acts_as_taggable_on/tag_list_spec.rb +84 -65
- data/spec/acts_as_taggable_on/tag_spec.rb +32 -10
- data/spec/acts_as_taggable_on/taggable_spec.rb +147 -14
- data/spec/acts_as_taggable_on/tagger_spec.rb +23 -16
- data/spec/acts_as_taggable_on/tagging_spec.rb +2 -5
- data/spec/acts_as_taggable_on/tags_helper_spec.rb +16 -0
- data/spec/models.rb +5 -0
- data/spec/schema.rb +5 -0
- data/spec/spec_helper.rb +3 -1
- metadata +26 -25
- data/lib/acts_as_taggable_on/acts_as_taggable_on.rb +0 -54
|
@@ -16,7 +16,7 @@ describe "Tagger" do
|
|
|
16
16
|
@user.tag(@taggable, :with=>'ruby,scheme', :on=>:tags)
|
|
17
17
|
@user.owned_tags.size == 2
|
|
18
18
|
end
|
|
19
|
-
|
|
19
|
+
|
|
20
20
|
it "should scope objects returned by tagged_with by owners" do
|
|
21
21
|
@taggable2 = TaggableModel.create(:name => "Jim Jones")
|
|
22
22
|
@taggable3 = TaggableModel.create(:name => "Jane Doe")
|
|
@@ -30,7 +30,7 @@ describe "Tagger" do
|
|
|
30
30
|
TaggableModel.tagged_with(%w(ruby scheme), :owned_by => @user2).count.should == 2
|
|
31
31
|
|
|
32
32
|
end
|
|
33
|
-
|
|
33
|
+
|
|
34
34
|
it "should not overlap tags from different taggers" do
|
|
35
35
|
@user2 = TaggableUser.new
|
|
36
36
|
lambda{
|
|
@@ -42,35 +42,35 @@ describe "Tagger" do
|
|
|
42
42
|
|
|
43
43
|
@user.owned_tags.map(&:name).sort.should == %w(ruby scheme).sort
|
|
44
44
|
@user2.owned_tags.map(&:name).sort.should == %w(java python lisp ruby).sort
|
|
45
|
-
|
|
45
|
+
|
|
46
46
|
@taggable.tags_from(@user).sort.should == %w(ruby scheme).sort
|
|
47
47
|
@taggable.tags_from(@user2).sort.should == %w(java lisp python ruby).sort
|
|
48
|
-
|
|
48
|
+
|
|
49
49
|
@taggable.all_tags_list.sort.should == %w(ruby scheme java python lisp).sort
|
|
50
50
|
@taggable.all_tags_on(:tags).size.should == 5
|
|
51
51
|
end
|
|
52
|
-
|
|
52
|
+
|
|
53
53
|
it "should not lose tags from different taggers" do
|
|
54
54
|
@user2 = TaggableUser.create
|
|
55
55
|
@user2.tag(@taggable, :with => 'java, python, lisp, ruby', :on => :tags)
|
|
56
|
-
@user.tag(@taggable, :with => 'ruby, scheme', :on => :tags)
|
|
57
|
-
|
|
56
|
+
@user.tag(@taggable, :with => 'ruby, scheme', :on => :tags)
|
|
57
|
+
|
|
58
58
|
lambda {
|
|
59
59
|
@user2.tag(@taggable, :with => 'java, python, lisp', :on => :tags)
|
|
60
60
|
}.should change(ActsAsTaggableOn::Tagging, :count).by(-1)
|
|
61
61
|
|
|
62
62
|
[@user, @user2, @taggable].each(&:reload)
|
|
63
|
-
|
|
63
|
+
|
|
64
64
|
@taggable.tags_from(@user).sort.should == %w(ruby scheme).sort
|
|
65
65
|
@taggable.tags_from(@user2).sort.should == %w(java python lisp).sort
|
|
66
|
-
|
|
66
|
+
|
|
67
67
|
@taggable.all_tags_list.sort.should == %w(ruby scheme java python lisp).sort
|
|
68
68
|
@taggable.all_tags_on(:tags).length.should == 5
|
|
69
69
|
end
|
|
70
70
|
|
|
71
71
|
it "should not lose tags" do
|
|
72
72
|
@user2 = TaggableUser.create
|
|
73
|
-
|
|
73
|
+
|
|
74
74
|
@user.tag(@taggable, :with => 'awesome', :on => :tags)
|
|
75
75
|
@user2.tag(@taggable, :with => 'awesome, epic', :on => :tags)
|
|
76
76
|
|
|
@@ -78,28 +78,35 @@ describe "Tagger" do
|
|
|
78
78
|
@user2.tag(@taggable, :with => 'epic', :on => :tags)
|
|
79
79
|
}.should change(ActsAsTaggableOn::Tagging, :count).by(-1)
|
|
80
80
|
|
|
81
|
-
@taggable.reload
|
|
81
|
+
@taggable.reload
|
|
82
82
|
@taggable.all_tags_list.should include('awesome')
|
|
83
83
|
@taggable.all_tags_list.should include('epic')
|
|
84
84
|
end
|
|
85
|
-
|
|
85
|
+
|
|
86
86
|
it "should not lose tags" do
|
|
87
87
|
@taggable.update_attributes(:tag_list => 'ruby')
|
|
88
88
|
@user.tag(@taggable, :with => 'ruby, scheme', :on => :tags)
|
|
89
|
-
|
|
89
|
+
|
|
90
90
|
[@taggable, @user].each(&:reload)
|
|
91
91
|
@taggable.tag_list.should == %w(ruby)
|
|
92
92
|
@taggable.all_tags_list.sort.should == %w(ruby scheme).sort
|
|
93
|
-
|
|
93
|
+
|
|
94
94
|
lambda {
|
|
95
95
|
@taggable.update_attributes(:tag_list => "")
|
|
96
96
|
}.should change(ActsAsTaggableOn::Tagging, :count).by(-1)
|
|
97
|
-
|
|
97
|
+
|
|
98
98
|
@taggable.tag_list.should == []
|
|
99
99
|
@taggable.all_tags_list.sort.should == %w(ruby scheme).sort
|
|
100
100
|
end
|
|
101
101
|
|
|
102
102
|
it "is tagger" do
|
|
103
103
|
@user.is_tagger?.should(be_true)
|
|
104
|
-
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
it "should skip save if skip_save is passed as option" do
|
|
107
|
+
lambda {
|
|
108
|
+
@user.tag(@taggable, :with => 'epic', :on => :tags, :skip_save => true)
|
|
109
|
+
}.should_not change(ActsAsTaggableOn::Tagging, :count)
|
|
110
|
+
|
|
111
|
+
end
|
|
105
112
|
end
|
|
@@ -13,11 +13,7 @@ describe ActsAsTaggableOn::Tagging do
|
|
|
13
13
|
|
|
14
14
|
@tagging.should_not be_valid
|
|
15
15
|
|
|
16
|
-
|
|
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
|
data/spec/models.rb
CHANGED
data/spec/schema.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
|
@@ -31,6 +31,8 @@ unless [].respond_to?(:freq)
|
|
|
31
31
|
end
|
|
32
32
|
end
|
|
33
33
|
|
|
34
|
+
# set adapter to use, default is sqlite3
|
|
35
|
+
# to use an alternative adapter run => rake spec DB='postgresql'
|
|
34
36
|
db_name = ENV['DB'] || 'sqlite3'
|
|
35
37
|
database_yml = File.expand_path('../database.yml', __FILE__)
|
|
36
38
|
|
|
@@ -72,7 +74,7 @@ end
|
|
|
72
74
|
|
|
73
75
|
def clean_database!
|
|
74
76
|
models = [ActsAsTaggableOn::Tag, ActsAsTaggableOn::Tagging, TaggableModel, OtherTaggableModel, InheritingTaggableModel,
|
|
75
|
-
AlteredInheritingTaggableModel, TaggableUser, UntaggableModel]
|
|
77
|
+
AlteredInheritingTaggableModel, TaggableUser, UntaggableModel, OrderedTaggableModel]
|
|
76
78
|
models.each do |model|
|
|
77
79
|
ActiveRecord::Base.connection.execute "DELETE FROM #{model.table_name}"
|
|
78
80
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: acts-as-taggable-on
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.3.0
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,33 +9,33 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date:
|
|
12
|
+
date: 2012-01-06 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: rails
|
|
16
|
-
requirement: &
|
|
16
|
+
requirement: &70275758086480 !ruby/object:Gem::Requirement
|
|
17
17
|
none: false
|
|
18
18
|
requirements:
|
|
19
19
|
- - ~>
|
|
20
20
|
- !ruby/object:Gem::Version
|
|
21
|
-
version: '3.
|
|
21
|
+
version: '3.0'
|
|
22
22
|
type: :runtime
|
|
23
23
|
prerelease: false
|
|
24
|
-
version_requirements: *
|
|
24
|
+
version_requirements: *70275758086480
|
|
25
25
|
- !ruby/object:Gem::Dependency
|
|
26
26
|
name: rspec
|
|
27
|
-
requirement: &
|
|
27
|
+
requirement: &70275758085980 !ruby/object:Gem::Requirement
|
|
28
28
|
none: false
|
|
29
29
|
requirements:
|
|
30
30
|
- - ~>
|
|
31
31
|
- !ruby/object:Gem::Version
|
|
32
|
-
version: '2.
|
|
32
|
+
version: '2.6'
|
|
33
33
|
type: :development
|
|
34
34
|
prerelease: false
|
|
35
|
-
version_requirements: *
|
|
35
|
+
version_requirements: *70275758085980
|
|
36
36
|
- !ruby/object:Gem::Dependency
|
|
37
37
|
name: ammeter
|
|
38
|
-
requirement: &
|
|
38
|
+
requirement: &70275758085520 !ruby/object:Gem::Requirement
|
|
39
39
|
none: false
|
|
40
40
|
requirements:
|
|
41
41
|
- - ~>
|
|
@@ -43,10 +43,10 @@ dependencies:
|
|
|
43
43
|
version: 0.1.3
|
|
44
44
|
type: :development
|
|
45
45
|
prerelease: false
|
|
46
|
-
version_requirements: *
|
|
46
|
+
version_requirements: *70275758085520
|
|
47
47
|
- !ruby/object:Gem::Dependency
|
|
48
48
|
name: sqlite3
|
|
49
|
-
requirement: &
|
|
49
|
+
requirement: &70275758103040 !ruby/object:Gem::Requirement
|
|
50
50
|
none: false
|
|
51
51
|
requirements:
|
|
52
52
|
- - ! '>='
|
|
@@ -54,10 +54,10 @@ dependencies:
|
|
|
54
54
|
version: '0'
|
|
55
55
|
type: :development
|
|
56
56
|
prerelease: false
|
|
57
|
-
version_requirements: *
|
|
57
|
+
version_requirements: *70275758103040
|
|
58
58
|
- !ruby/object:Gem::Dependency
|
|
59
59
|
name: mysql2
|
|
60
|
-
requirement: &
|
|
60
|
+
requirement: &70275758102400 !ruby/object:Gem::Requirement
|
|
61
61
|
none: false
|
|
62
62
|
requirements:
|
|
63
63
|
- - ~>
|
|
@@ -65,10 +65,10 @@ dependencies:
|
|
|
65
65
|
version: 0.3.7
|
|
66
66
|
type: :development
|
|
67
67
|
prerelease: false
|
|
68
|
-
version_requirements: *
|
|
68
|
+
version_requirements: *70275758102400
|
|
69
69
|
- !ruby/object:Gem::Dependency
|
|
70
70
|
name: pg
|
|
71
|
-
requirement: &
|
|
71
|
+
requirement: &70275758101640 !ruby/object:Gem::Requirement
|
|
72
72
|
none: false
|
|
73
73
|
requirements:
|
|
74
74
|
- - ! '>='
|
|
@@ -76,10 +76,10 @@ dependencies:
|
|
|
76
76
|
version: '0'
|
|
77
77
|
type: :development
|
|
78
78
|
prerelease: false
|
|
79
|
-
version_requirements: *
|
|
79
|
+
version_requirements: *70275758101640
|
|
80
80
|
- !ruby/object:Gem::Dependency
|
|
81
81
|
name: guard
|
|
82
|
-
requirement: &
|
|
82
|
+
requirement: &70275758100980 !ruby/object:Gem::Requirement
|
|
83
83
|
none: false
|
|
84
84
|
requirements:
|
|
85
85
|
- - ! '>='
|
|
@@ -87,10 +87,10 @@ dependencies:
|
|
|
87
87
|
version: '0'
|
|
88
88
|
type: :development
|
|
89
89
|
prerelease: false
|
|
90
|
-
version_requirements: *
|
|
90
|
+
version_requirements: *70275758100980
|
|
91
91
|
- !ruby/object:Gem::Dependency
|
|
92
92
|
name: guard-rspec
|
|
93
|
-
requirement: &
|
|
93
|
+
requirement: &70275758100180 !ruby/object:Gem::Requirement
|
|
94
94
|
none: false
|
|
95
95
|
requirements:
|
|
96
96
|
- - ! '>='
|
|
@@ -98,7 +98,7 @@ dependencies:
|
|
|
98
98
|
version: '0'
|
|
99
99
|
type: :development
|
|
100
100
|
prerelease: false
|
|
101
|
-
version_requirements: *
|
|
101
|
+
version_requirements: *70275758100180
|
|
102
102
|
description: With ActsAsTaggableOn, you can tag a single model on several contexts,
|
|
103
103
|
such as skills, interests, and awards. It also provides other advanced functionality.
|
|
104
104
|
email: michael@intridea.com
|
|
@@ -118,15 +118,16 @@ files:
|
|
|
118
118
|
- acts-as-taggable-on.gemspec
|
|
119
119
|
- lib/acts-as-taggable-on.rb
|
|
120
120
|
- lib/acts-as-taggable-on/version.rb
|
|
121
|
-
- lib/acts_as_taggable_on/acts_as_taggable_on.rb
|
|
122
121
|
- lib/acts_as_taggable_on/acts_as_taggable_on/cache.rb
|
|
123
122
|
- lib/acts_as_taggable_on/acts_as_taggable_on/collection.rb
|
|
124
123
|
- lib/acts_as_taggable_on/acts_as_taggable_on/core.rb
|
|
124
|
+
- lib/acts_as_taggable_on/acts_as_taggable_on/dirty.rb
|
|
125
125
|
- lib/acts_as_taggable_on/acts_as_taggable_on/ownership.rb
|
|
126
126
|
- lib/acts_as_taggable_on/acts_as_taggable_on/related.rb
|
|
127
|
-
- lib/acts_as_taggable_on/acts_as_tagger.rb
|
|
128
127
|
- lib/acts_as_taggable_on/tag.rb
|
|
129
128
|
- lib/acts_as_taggable_on/tag_list.rb
|
|
129
|
+
- lib/acts_as_taggable_on/taggable.rb
|
|
130
|
+
- lib/acts_as_taggable_on/tagger.rb
|
|
130
131
|
- lib/acts_as_taggable_on/tagging.rb
|
|
131
132
|
- lib/acts_as_taggable_on/tags_helper.rb
|
|
132
133
|
- lib/acts_as_taggable_on/utils.rb
|
|
@@ -163,7 +164,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
163
164
|
version: '0'
|
|
164
165
|
segments:
|
|
165
166
|
- 0
|
|
166
|
-
hash:
|
|
167
|
+
hash: 3587969812961176900
|
|
167
168
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
168
169
|
none: false
|
|
169
170
|
requirements:
|
|
@@ -172,10 +173,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
172
173
|
version: '0'
|
|
173
174
|
segments:
|
|
174
175
|
- 0
|
|
175
|
-
hash:
|
|
176
|
+
hash: 3587969812961176900
|
|
176
177
|
requirements: []
|
|
177
178
|
rubyforge_project:
|
|
178
|
-
rubygems_version: 1.8.
|
|
179
|
+
rubygems_version: 1.8.10
|
|
179
180
|
signing_key:
|
|
180
181
|
specification_version: 3
|
|
181
182
|
summary: Advanced tagging for Rails.
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
module ActsAsTaggableOn
|
|
2
|
-
module Taggable
|
|
3
|
-
def taggable?
|
|
4
|
-
false
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
##
|
|
8
|
-
# This is an alias for calling <tt>acts_as_taggable_on :tags</tt>.
|
|
9
|
-
#
|
|
10
|
-
# Example:
|
|
11
|
-
# class Book < ActiveRecord::Base
|
|
12
|
-
# acts_as_taggable
|
|
13
|
-
# end
|
|
14
|
-
def acts_as_taggable
|
|
15
|
-
acts_as_taggable_on :tags
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
##
|
|
19
|
-
# Make a model taggable on specified contexts.
|
|
20
|
-
#
|
|
21
|
-
# @param [Array] tag_types An array of taggable contexts
|
|
22
|
-
#
|
|
23
|
-
# Example:
|
|
24
|
-
# class User < ActiveRecord::Base
|
|
25
|
-
# acts_as_taggable_on :languages, :skills
|
|
26
|
-
# end
|
|
27
|
-
def acts_as_taggable_on(*tag_types)
|
|
28
|
-
tag_types = tag_types.to_a.flatten.compact.map(&:to_sym)
|
|
29
|
-
|
|
30
|
-
if taggable?
|
|
31
|
-
self.tag_types = (self.tag_types + tag_types).uniq
|
|
32
|
-
else
|
|
33
|
-
class_attribute :tag_types
|
|
34
|
-
self.tag_types = tag_types
|
|
35
|
-
|
|
36
|
-
class_eval do
|
|
37
|
-
has_many :taggings, :as => :taggable, :dependent => :destroy, :include => :tag, :class_name => "ActsAsTaggableOn::Tagging"
|
|
38
|
-
has_many :base_tags, :through => :taggings, :source => :tag, :class_name => "ActsAsTaggableOn::Tag"
|
|
39
|
-
|
|
40
|
-
def self.taggable?
|
|
41
|
-
true
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
include ActsAsTaggableOn::Utils
|
|
45
|
-
include ActsAsTaggableOn::Taggable::Core
|
|
46
|
-
include ActsAsTaggableOn::Taggable::Collection
|
|
47
|
-
include ActsAsTaggableOn::Taggable::Cache
|
|
48
|
-
include ActsAsTaggableOn::Taggable::Ownership
|
|
49
|
-
include ActsAsTaggableOn::Taggable::Related
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
end
|