Commit 1e6dcfa7ca80a1439cb0e8eb01e216040254fa16
1 parent
c4832b5f
Exists in
master
and in
22 other branches
rails3: replace acts_as_taggable_on_steroids by acts-as-taggable-on
Showing
41 changed files
with
77 additions
and
1318 deletions
Show diff stats
Gemfile
Gemfile.lock
@@ -28,6 +28,8 @@ GEM | @@ -28,6 +28,8 @@ GEM | ||
28 | activesupport (3.2.6) | 28 | activesupport (3.2.6) |
29 | i18n (~> 0.6) | 29 | i18n (~> 0.6) |
30 | multi_json (~> 1.0) | 30 | multi_json (~> 1.0) |
31 | + acts-as-taggable-on (3.0.1) | ||
32 | + rails (>= 3, < 5) | ||
31 | arel (3.0.2) | 33 | arel (3.0.2) |
32 | builder (3.0.0) | 34 | builder (3.0.0) |
33 | erubis (2.7.0) | 35 | erubis (2.7.0) |
@@ -82,6 +84,7 @@ PLATFORMS | @@ -82,6 +84,7 @@ PLATFORMS | ||
82 | ruby | 84 | ruby |
83 | 85 | ||
84 | DEPENDENCIES | 86 | DEPENDENCIES |
87 | + acts-as-taggable-on | ||
85 | fast_gettext | 88 | fast_gettext |
86 | rails | 89 | rails |
87 | rake | 90 | rake |
app/controllers/public/profile_controller.rb
@@ -32,7 +32,7 @@ class ProfileController < PublicController | @@ -32,7 +32,7 @@ class ProfileController < PublicController | ||
32 | @tag = params[:id] | 32 | @tag = params[:id] |
33 | @tag_cache_key = "tag_#{CGI.escape(@tag.to_s)}_#{profile.id.to_s}_page_#{params[:npage]}" | 33 | @tag_cache_key = "tag_#{CGI.escape(@tag.to_s)}_#{profile.id.to_s}_page_#{params[:npage]}" |
34 | if is_cache_expired?(@tag_cache_key) | 34 | if is_cache_expired?(@tag_cache_key) |
35 | - @tagged = profile.find_tagged_with(@tag).paginate(:per_page => 20, :page => params[:npage]) | 35 | + @tagged = profile.tagged_with(@tag).paginate(:per_page => 20, :page => params[:npage]) |
36 | end | 36 | end |
37 | end | 37 | end |
38 | 38 |
app/controllers/public/search_controller.rb
@@ -133,7 +133,7 @@ class SearchController < PublicController | @@ -133,7 +133,7 @@ class SearchController < PublicController | ||
133 | @tag = params[:tag] | 133 | @tag = params[:tag] |
134 | @tag_cache_key = "tag_#{CGI.escape(@tag.to_s)}_env_#{environment.id.to_s}_page_#{params[:npage]}" | 134 | @tag_cache_key = "tag_#{CGI.escape(@tag.to_s)}_env_#{environment.id.to_s}_page_#{params[:npage]}" |
135 | if is_cache_expired?(@tag_cache_key) | 135 | if is_cache_expired?(@tag_cache_key) |
136 | - @searches[@asset] = {:results => environment.articles.find_tagged_with(@tag).paginate(paginate_options)} | 136 | + @searches[@asset] = {:results => environment.articles.tagged_with(@tag).paginate(paginate_options)} |
137 | end | 137 | end |
138 | end | 138 | end |
139 | 139 |
app/helpers/tags_helper.rb
@@ -9,7 +9,7 @@ module TagsHelper | @@ -9,7 +9,7 @@ module TagsHelper | ||
9 | 9 | ||
10 | # <tt>tags</tt> must be a hash where the keys are tag names and the values | 10 | # <tt>tags</tt> must be a hash where the keys are tag names and the values |
11 | # the count of elements tagged with the tag, as returned by | 11 | # the count of elements tagged with the tag, as returned by |
12 | - # Profile#find_tagged_with. If not tags were returned, just returns | 12 | + # Profile#tagged_with. If not tags were returned, just returns |
13 | # _('No tags yet.') | 13 | # _('No tags yet.') |
14 | # | 14 | # |
15 | # <tagname_option> must be a symbol representing the key to be inserted in | 15 | # <tagname_option> must be a symbol representing the key to be inserted in |
app/models/article.rb
@@ -759,7 +759,7 @@ class Article < ActiveRecord::Base | @@ -759,7 +759,7 @@ class Article < ActiveRecord::Base | ||
759 | 759 | ||
760 | def sanitize_tag_list | 760 | def sanitize_tag_list |
761 | sanitizer = HTML::FullSanitizer.new | 761 | sanitizer = HTML::FullSanitizer.new |
762 | - self.tag_list.names.map!{|i| strip_tag_name sanitizer.sanitize(i) } | 762 | + self.tag_list.map!{|i| strip_tag_name sanitizer.sanitize(i) } |
763 | end | 763 | end |
764 | 764 | ||
765 | def strip_tag_name(tag_name) | 765 | def strip_tag_name(tag_name) |
app/models/profile.rb
@@ -556,8 +556,8 @@ private :generate_url, :url_options | @@ -556,8 +556,8 @@ private :generate_url, :url_options | ||
556 | end | 556 | end |
557 | end | 557 | end |
558 | 558 | ||
559 | - def find_tagged_with(tag) | ||
560 | - self.articles.find_tagged_with(tag) | 559 | + def tagged_with(tag) |
560 | + self.articles.tagged_with(tag) | ||
561 | end | 561 | end |
562 | 562 | ||
563 | # Tells whether a specified profile has members or nor. | 563 | # Tells whether a specified profile has members or nor. |
db/migrate/20140115190131_acts_as_taggable_on_migration.acts_as_taggable_on_engine.rb
0 → 100644
@@ -0,0 +1,18 @@ | @@ -0,0 +1,18 @@ | ||
1 | +# This migration comes from acts_as_taggable_on_engine (originally 1) | ||
2 | +class ActsAsTaggableOnMigration < ActiveRecord::Migration | ||
3 | + def self.up | ||
4 | + change_table :taggings do |t| | ||
5 | + t.references :tagger, :polymorphic => true | ||
6 | + t.string :context, :limit => 128 | ||
7 | + end | ||
8 | + add_index :taggings, [:taggable_id, :taggable_type, :context] | ||
9 | + end | ||
10 | + | ||
11 | + def self.down | ||
12 | + remove_index :taggings, [:taggable_id, :taggable_type, :context] | ||
13 | + change_table :taggings do |t| | ||
14 | + t.remove_references :tagger, :polymorphic => true | ||
15 | + t.remove :context | ||
16 | + end | ||
17 | + end | ||
18 | +end |
db/migrate/20140115190132_add_missing_unique_indices.acts_as_taggable_on_engine.rb
0 → 100644
@@ -0,0 +1,22 @@ | @@ -0,0 +1,22 @@ | ||
1 | +# This migration comes from acts_as_taggable_on_engine (originally 2) | ||
2 | +class AddMissingUniqueIndices < ActiveRecord::Migration | ||
3 | + | ||
4 | + def self.up | ||
5 | + add_index :tags, :name, unique: true | ||
6 | + | ||
7 | + remove_index :taggings, :tag_id | ||
8 | + remove_index :taggings, [:taggable_id, :taggable_type, :context] | ||
9 | + add_index :taggings, | ||
10 | + [:tag_id, :taggable_id, :taggable_type, :context, :tagger_id, :tagger_type], | ||
11 | + unique: true, name: 'taggings_idx' | ||
12 | + end | ||
13 | + | ||
14 | + def self.down | ||
15 | + remove_index :tags, :name | ||
16 | + | ||
17 | + remove_index :taggings, name: 'taggings_idx' | ||
18 | + add_index :taggings, :tag_id | ||
19 | + add_index :taggings, [:taggable_id, :taggable_type, :context] | ||
20 | + end | ||
21 | + | ||
22 | +end |
lib/extended_tag.rb
1 | -class Tag | 1 | +class ActsAsTaggableOn::Tag |
2 | 2 | ||
3 | attr_accessible :name, :parent_id, :pending | 3 | attr_accessible :name, :parent_id, :pending |
4 | 4 | ||
@@ -25,7 +25,7 @@ class Tag | @@ -25,7 +25,7 @@ class Tag | ||
25 | 25 | ||
26 | # All the tags that can be a new parent for this tag, that is all but itself and its descendents to avoid loops | 26 | # All the tags that can be a new parent for this tag, that is all but itself and its descendents to avoid loops |
27 | def parent_candidates | 27 | def parent_candidates |
28 | - Tag.find(:all) - descendents - [self] | 28 | + ActsAsTaggableOn::Tag.find(:all) - descendents - [self] |
29 | end | 29 | end |
30 | 30 | ||
31 | # All tags that have this tag as its one of its ancestors | 31 | # All tags that have this tag as its one of its ancestors |
test/unit/article_test.rb
@@ -67,7 +67,7 @@ class ArticleTest < ActiveSupport::TestCase | @@ -67,7 +67,7 @@ class ArticleTest < ActiveSupport::TestCase | ||
67 | should 'act as taggable' do | 67 | should 'act as taggable' do |
68 | a = create(Article, :name => 'my article', :profile_id => profile.id) | 68 | a = create(Article, :name => 'my article', :profile_id => profile.id) |
69 | a.tag_list = ['one', 'two'] | 69 | a.tag_list = ['one', 'two'] |
70 | - tags = a.tag_list.names | 70 | + tags = a.tag_list |
71 | assert tags.include?('one') | 71 | assert tags.include?('one') |
72 | assert tags.include?('two') | 72 | assert tags.include?('two') |
73 | end | 73 | end |
@@ -746,7 +746,7 @@ class ArticleTest < ActiveSupport::TestCase | @@ -746,7 +746,7 @@ class ArticleTest < ActiveSupport::TestCase | ||
746 | 746 | ||
747 | should 'get tagged with tag' do | 747 | should 'get tagged with tag' do |
748 | a = create(Article, :name => 'Published at', :profile_id => profile.id, :tag_list => 'bli') | 748 | a = create(Article, :name => 'Published at', :profile_id => profile.id, :tag_list => 'bli') |
749 | - as = Article.find_tagged_with('bli') | 749 | + as = Article.tagged_with('bli') |
750 | 750 | ||
751 | assert_includes as, a | 751 | assert_includes as, a |
752 | end | 752 | end |
@@ -758,7 +758,7 @@ class ArticleTest < ActiveSupport::TestCase | @@ -758,7 +758,7 @@ class ArticleTest < ActiveSupport::TestCase | ||
758 | user_from_other_environment = create_user('other_user', :environment => other_environment).person | 758 | user_from_other_environment = create_user('other_user', :environment => other_environment).person |
759 | article_from_other_enviroment = create(Article, :profile => user_from_other_environment, :tag_list => 'bli') | 759 | article_from_other_enviroment = create(Article, :profile => user_from_other_environment, :tag_list => 'bli') |
760 | 760 | ||
761 | - tagged_articles_in_other_environment = other_environment.articles.find_tagged_with('bli') | 761 | + tagged_articles_in_other_environment = other_environment.articles.tagged_with('bli') |
762 | 762 | ||
763 | assert_includes tagged_articles_in_other_environment, article_from_other_enviroment | 763 | assert_includes tagged_articles_in_other_environment, article_from_other_enviroment |
764 | assert_not_includes tagged_articles_in_other_environment, article_from_this_environment | 764 | assert_not_includes tagged_articles_in_other_environment, article_from_this_environment |
@@ -859,16 +859,18 @@ class ArticleTest < ActiveSupport::TestCase | @@ -859,16 +859,18 @@ class ArticleTest < ActiveSupport::TestCase | ||
859 | 859 | ||
860 | should 'sanitize tags after save article' do | 860 | should 'sanitize tags after save article' do |
861 | article = fast_create(Article, :slug => 'article-with-tags', :profile_id => profile.id) | 861 | article = fast_create(Article, :slug => 'article-with-tags', :profile_id => profile.id) |
862 | - article.tags << build(Tag, :name => "TV Web w<script type='javascript'></script>") | ||
863 | - assert_match /[<>]/, article.tags.last.name | 862 | + tag = build(ActsAsTaggableOn::Tag, :name => "TV Web w<script type='javascript'></script>") |
863 | + assert_match /[<>]/, tag.name | ||
864 | + article.tag_list.add(tag.name) | ||
864 | article.save! | 865 | article.save! |
865 | assert_no_match /[<>]/, article.tags.last.name | 866 | assert_no_match /[<>]/, article.tags.last.name |
866 | end | 867 | end |
867 | 868 | ||
868 | should 'strip HTML from tag names after save article' do | 869 | should 'strip HTML from tag names after save article' do |
869 | article = fast_create(Article, :slug => 'article-with-tags', :profile_id => profile.id) | 870 | article = fast_create(Article, :slug => 'article-with-tags', :profile_id => profile.id) |
870 | - article.tags << build(Tag, :name => "TV Web w<script type=...") | ||
871 | - assert_match /</, article.tags.last.name | 871 | + tag = build(ActsAsTaggableOn::Tag, :name => "TV Web w<script type=...") |
872 | + assert_match /</, tag.name | ||
873 | + article.tag_list.add(tag.name) | ||
872 | article.save! | 874 | article.save! |
873 | assert_no_match /</, article.tags.last.name | 875 | assert_no_match /</, article.tags.last.name |
874 | end | 876 | end |
test/unit/extended_tag_test.rb
@@ -4,30 +4,30 @@ require 'extended_tag.rb' | @@ -4,30 +4,30 @@ require 'extended_tag.rb' | ||
4 | class UserTest < ActiveSupport::TestCase | 4 | class UserTest < ActiveSupport::TestCase |
5 | 5 | ||
6 | def test_find_without_pendings | 6 | def test_find_without_pendings |
7 | - tag1 = Tag.create(:name => 'pending_tag', :pending => true) | ||
8 | - tag2 = Tag.create(:name => 'approved_tag', :pending => false) | ||
9 | - assert_nothing_raised {Tag.find(tag2.id)} | ||
10 | - assert_raise(ActiveRecord::RecordNotFound) {Tag.find(tag1.id)} | 7 | + tag1 = ActsAsTaggableOn::Tag.create(:name => 'pending_tag', :pending => true) |
8 | + tag2 = ActsAsTaggableOn::Tag.create(:name => 'approved_tag', :pending => false) | ||
9 | + assert_nothing_raised {ActsAsTaggableOn::Tag.find(tag2.id)} | ||
10 | + assert_raise(ActiveRecord::RecordNotFound) {ActsAsTaggableOn::Tag.find(tag1.id)} | ||
11 | end | 11 | end |
12 | 12 | ||
13 | def test_find_pendings | 13 | def test_find_pendings |
14 | - tag1 = Tag.create(:name => 'pending_tag', :pending => true) | ||
15 | - tag2 = Tag.create(:name => 'approved_tag', :pending => false) | ||
16 | - assert Tag.find_pendings.include?(tag1) | ||
17 | - assert (not Tag.find_pendings.include?(tag2)) | 14 | + tag1 = ActsAsTaggableOn::Tag.create(:name => 'pending_tag', :pending => true) |
15 | + tag2 = ActsAsTaggableOn::Tag.create(:name => 'approved_tag', :pending => false) | ||
16 | + assert ActsAsTaggableOn::Tag.find_pendings.include?(tag1) | ||
17 | + assert (not ActsAsTaggableOn::Tag.find_pendings.include?(tag2)) | ||
18 | end | 18 | end |
19 | 19 | ||
20 | def test_parent_candidates | 20 | def test_parent_candidates |
21 | - tag1 = Tag.create(:name => 'parent_tag') | ||
22 | - tag2 = Tag.create(:name => 'child_tag', :parent_id => tag1.id) | 21 | + tag1 = ActsAsTaggableOn::Tag.create(:name => 'parent_tag') |
22 | + tag2 = ActsAsTaggableOn::Tag.create(:name => 'child_tag', :parent_id => tag1.id) | ||
23 | assert ( not tag1.parent_candidates.include?(tag2) ) | 23 | assert ( not tag1.parent_candidates.include?(tag2) ) |
24 | assert tag2.parent_candidates.include?(tag1) | 24 | assert tag2.parent_candidates.include?(tag1) |
25 | end | 25 | end |
26 | 26 | ||
27 | def test_descendents | 27 | def test_descendents |
28 | - tag1 = Tag.create(:name => 'parent_tag') | ||
29 | - tag2 = Tag.create(:name => 'child_tag', :parent_id => tag1.id) | ||
30 | - tag3 = Tag.create(:name => 'grand_tag', :parent_id => tag2.id) | 28 | + tag1 = ActsAsTaggableOn::Tag.create(:name => 'parent_tag') |
29 | + tag2 = ActsAsTaggableOn::Tag.create(:name => 'child_tag', :parent_id => tag1.id) | ||
30 | + tag3 = ActsAsTaggableOn::Tag.create(:name => 'grand_tag', :parent_id => tag2.id) | ||
31 | assert (not tag2.descendents.include?(tag1)) | 31 | assert (not tag2.descendents.include?(tag1)) |
32 | assert (not tag1.descendents.include?(tag1)) | 32 | assert (not tag1.descendents.include?(tag1)) |
33 | assert tag1.descendents.include?(tag2) | 33 | assert tag1.descendents.include?(tag2) |
test/unit/profile_test.rb
@@ -285,9 +285,9 @@ class ProfileTest < ActiveSupport::TestCase | @@ -285,9 +285,9 @@ class ProfileTest < ActiveSupport::TestCase | ||
285 | second = create(Article, :profile => profile, :tag_list => 'first-tag, second-tag') | 285 | second = create(Article, :profile => profile, :tag_list => 'first-tag, second-tag') |
286 | third = create(Article, :profile => profile, :tag_list => 'first-tag, second-tag, third-tag') | 286 | third = create(Article, :profile => profile, :tag_list => 'first-tag, second-tag, third-tag') |
287 | 287 | ||
288 | - assert_equivalent [ first, second, third], profile.find_tagged_with('first-tag') | ||
289 | - assert_equivalent [ second, third ], profile.find_tagged_with('second-tag') | ||
290 | - assert_equivalent [ third], profile.find_tagged_with('third-tag') | 288 | + assert_equivalent [ first, second, third], profile.tagged_with('first-tag') |
289 | + assert_equivalent [ second, third ], profile.tagged_with('second-tag') | ||
290 | + assert_equivalent [ third], profile.tagged_with('third-tag') | ||
291 | end | 291 | end |
292 | 292 | ||
293 | should 'provide tag count' do | 293 | should 'provide tag count' do |
vendor/plugins/acts_as_taggable_on_steroids/CHANGELOG
@@ -1,58 +0,0 @@ | @@ -1,58 +0,0 @@ | ||
1 | -[1 July 2007] | ||
2 | - | ||
3 | -* Fix incorrect tagging when the case of the tag list is changed. | ||
4 | - | ||
5 | -* Fix deprecated Tag.delimiter accessor. | ||
6 | - | ||
7 | -[23 June 2007] | ||
8 | - | ||
9 | -* Add validation to Tag model. | ||
10 | - | ||
11 | -* find_options_for_tagged_with should always return a hash. | ||
12 | - | ||
13 | -* find_tagged_with passing in no tags should return an empty array. | ||
14 | - | ||
15 | -* Improve compatibility with PostgreSQL. | ||
16 | - | ||
17 | -[21 June 2007] | ||
18 | - | ||
19 | -* Remove extra .rb from generated migration file name. | ||
20 | - | ||
21 | -[15 June 2007] | ||
22 | - | ||
23 | -* Introduce TagList class. | ||
24 | - | ||
25 | -* Various cleanups and improvements. | ||
26 | - | ||
27 | -* Use TagList.delimiter now, not Tag.delimiter. Tag.delimiter will be removed at some stage. | ||
28 | - | ||
29 | -[11 June 2007] | ||
30 | - | ||
31 | -* Restructure the creation of the options for find_tagged_with [Thijs Cadier] | ||
32 | - | ||
33 | -* Add an example migration with a generator. | ||
34 | - | ||
35 | -* Add caching. | ||
36 | - | ||
37 | -* Fix compatibility with Ruby < 1.8.6 | ||
38 | - | ||
39 | -[23 April 2007] | ||
40 | - | ||
41 | -* Make tag_list to respect Tag.delimiter | ||
42 | - | ||
43 | -[31 March 2007] | ||
44 | - | ||
45 | -* Add Tag.delimiter accessor to change how tags are parsed. | ||
46 | -* Fix :include => :tags when used with find_tagged_with | ||
47 | - | ||
48 | -[7 March 2007] | ||
49 | - | ||
50 | -* Fix tag_counts for SQLServer [Brad Young] | ||
51 | - | ||
52 | -[21 Feb 2007] | ||
53 | - | ||
54 | -* Use scoping instead of TagCountsExtension [Michael Schuerig] | ||
55 | - | ||
56 | -[7 Jan 2007] | ||
57 | - | ||
58 | -* Add :match_all to find_tagged_with [Michael Sheakoski] |
vendor/plugins/acts_as_taggable_on_steroids/MIT-LICENSE
@@ -1,20 +0,0 @@ | @@ -1,20 +0,0 @@ | ||
1 | -Copyright (c) 2006 Jonathan Viney | ||
2 | - | ||
3 | -Permission is hereby granted, free of charge, to any person obtaining | ||
4 | -a copy of this software and associated documentation files (the | ||
5 | -"Software"), to deal in the Software without restriction, including | ||
6 | -without limitation the rights to use, copy, modify, merge, publish, | ||
7 | -distribute, sublicense, and/or sell copies of the Software, and to | ||
8 | -permit persons to whom the Software is furnished to do so, subject to | ||
9 | -the following conditions: | ||
10 | - | ||
11 | -The above copyright notice and this permission notice shall be | ||
12 | -included in all copies or substantial portions of the Software. | ||
13 | - | ||
14 | -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||
15 | -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||
16 | -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||
17 | -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE | ||
18 | -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | ||
19 | -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | ||
20 | -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
vendor/plugins/acts_as_taggable_on_steroids/README
@@ -1,116 +0,0 @@ | @@ -1,116 +0,0 @@ | ||
1 | -= acts_as_taggable_on_steroids | ||
2 | - | ||
3 | -If you find this plugin useful, please consider a donation to show your support! | ||
4 | - | ||
5 | - http://www.paypal.com/cgi-bin/webscr?cmd=_send-money | ||
6 | - | ||
7 | - Email address: jonathan.viney@gmail.com | ||
8 | - | ||
9 | -== Instructions | ||
10 | - | ||
11 | -This plugin is based on acts_as_taggable by DHH but includes extras | ||
12 | -such as tests, smarter tag assignment, and tag cloud calculations. | ||
13 | - | ||
14 | -Thanks to www.fanacious.com for allowing this plugin to be released. Please check out | ||
15 | -their site to show your support. | ||
16 | - | ||
17 | -== Resources | ||
18 | - | ||
19 | -Install | ||
20 | - * script/plugin install http://svn.viney.net.nz/things/rails/plugins/acts_as_taggable_on_steroids | ||
21 | - | ||
22 | -== Usage | ||
23 | - | ||
24 | -=== Prepare database | ||
25 | - | ||
26 | -Generate and apply the migration: | ||
27 | - | ||
28 | - ruby script/generate acts_as_taggable_migration | ||
29 | - rake db:migrate | ||
30 | - | ||
31 | -=== Basic tagging | ||
32 | - | ||
33 | -Using the examples from the tests, let's suppose we have users that have many posts and we want those | ||
34 | -posts to be able to be tagged by the user. | ||
35 | - | ||
36 | -As usual, we add +acts_as_taggable+ to the Post class: | ||
37 | - | ||
38 | - class Post < ActiveRecord::Base | ||
39 | - acts_as_taggable | ||
40 | - | ||
41 | - belongs_to :user | ||
42 | - end | ||
43 | - | ||
44 | -We can now use the tagging methods provided by acts_as_taggable, <tt>tag_list</tt> and <tt>tag_list=</tt>. Both these | ||
45 | -methods work like regular attribute accessors. | ||
46 | - | ||
47 | - p = Post.find(:first) | ||
48 | - p.tag_list.to_s # "" | ||
49 | - p.tag_list = "Funny, Silly" | ||
50 | - p.save | ||
51 | - p.reload.tag_list.to_s # "Funny, Silly" | ||
52 | - | ||
53 | -You can also add or remove arrays of tags. | ||
54 | - | ||
55 | - p.tag_list.add("Great", "Awful") | ||
56 | - p.tag_list.remove("Funny") | ||
57 | - | ||
58 | -=== Finding tagged objects | ||
59 | - | ||
60 | -To retrieve objects tagged with a certain tag, use find_tagged_with. | ||
61 | - | ||
62 | - Post.find_tagged_with('Funny, Silly') | ||
63 | - | ||
64 | -By default, find_tagged_with will find objects that have any of the given tags. To | ||
65 | -find only objects that are tagged with all the given tags, use match_all. | ||
66 | - | ||
67 | - Post.find_tagged_with('Funny, Silly', :match_all => true) | ||
68 | - | ||
69 | -=== Tag cloud calculations | ||
70 | - | ||
71 | -To construct tag clouds, the frequency of each tag needs to be calculated. | ||
72 | -Because we specified +acts_as_taggable+ on the <tt>Post</tt> class, we can | ||
73 | -get a calculation of all the tag counts by using <tt>Post.tag_counts</tt>. But what if we wanted a tag count for | ||
74 | -an single user's posts? To achieve this we call tag_counts on the association: | ||
75 | - | ||
76 | - User.find(:first).posts.tag_counts | ||
77 | - | ||
78 | -=== Caching | ||
79 | - | ||
80 | -It is useful to cache the list of tags to reduce the number of queries executed. To do this, | ||
81 | -add a column named <tt>cached_tag_list</tt> to the model which is being tagged. | ||
82 | - | ||
83 | - class CachePostTagList < ActiveRecord::Migration | ||
84 | - def self.up | ||
85 | - # You should make sure that the column is long enough to hold | ||
86 | - # the full tag list. In some situations the :text type may be more appropriate. | ||
87 | - add_column :posts, :cached_tag_list, :string | ||
88 | - end | ||
89 | - end | ||
90 | - | ||
91 | - class Post < ActiveRecord::Base | ||
92 | - acts_as_taggable | ||
93 | - | ||
94 | - # The caching column defaults to cached_tag_list, but can be changed: | ||
95 | - # | ||
96 | - # set_cached_tag_list_column_name "my_caching_column_name" | ||
97 | - end | ||
98 | - | ||
99 | -The details of the caching are handled for you. Just continue to use the tag_list accessor as you normally would. | ||
100 | -Note that the cached tag list will not be updated if you directly create Tagging objects or manually append to the | ||
101 | -<tt>tags</tt> or <tt>taggings</tt> associations. To update the cached tag list you should call <tt>save_cached_tag_list</tt> manually. | ||
102 | - | ||
103 | -=== Delimiter | ||
104 | - | ||
105 | -If you want to change the delimiter used to parse and present tags, set TagList.delimiter. | ||
106 | -For example, to use spaces instead of commas, add the following to config/environment.rb: | ||
107 | - | ||
108 | - TagList.delimiter = " " | ||
109 | - | ||
110 | -=== Other | ||
111 | - | ||
112 | -Problems, comments, and suggestions all welcome. jonathan.viney@gmail.com | ||
113 | - | ||
114 | -== Credits | ||
115 | - | ||
116 | -www.fanacious.com |
vendor/plugins/acts_as_taggable_on_steroids/Rakefile
@@ -1,22 +0,0 @@ | @@ -1,22 +0,0 @@ | ||
1 | -require 'rake' | ||
2 | -require 'rake/testtask' | ||
3 | -require 'rake/rdoctask' | ||
4 | - | ||
5 | -desc 'Default: run unit tests.' | ||
6 | -task :default => :test | ||
7 | - | ||
8 | -desc 'Test the acts_as_taggable_on_steroids plugin.' | ||
9 | -Rake::TestTask.new(:test) do |t| | ||
10 | - t.libs << 'lib' | ||
11 | - t.pattern = 'test/**/*_test.rb' | ||
12 | - t.verbose = true | ||
13 | -end | ||
14 | - | ||
15 | -desc 'Generate documentation for the acts_as_taggable_on_steroids plugin.' | ||
16 | -Rake::RDocTask.new(:rdoc) do |rdoc| | ||
17 | - rdoc.rdoc_dir = 'rdoc' | ||
18 | - rdoc.title = 'Acts As Taggable On Steroids' | ||
19 | - rdoc.options << '--line-numbers' << '--inline-source' | ||
20 | - rdoc.rdoc_files.include('README') | ||
21 | - rdoc.rdoc_files.include('lib/**/*.rb') | ||
22 | -end |
vendor/plugins/acts_as_taggable_on_steroids/generators/acts_as_taggable_migration/acts_as_taggable_migration_generator.rb
vendor/plugins/acts_as_taggable_on_steroids/generators/acts_as_taggable_migration/templates/migration.rb
@@ -1,26 +0,0 @@ | @@ -1,26 +0,0 @@ | ||
1 | -class ActsAsTaggableMigration < ActiveRecord::Migration | ||
2 | - def self.up | ||
3 | - create_table :tags do |t| | ||
4 | - t.column :name, :string | ||
5 | - end | ||
6 | - | ||
7 | - create_table :taggings do |t| | ||
8 | - t.column :tag_id, :integer | ||
9 | - t.column :taggable_id, :integer | ||
10 | - | ||
11 | - # You should make sure that the column created is | ||
12 | - # long enough to store the required class names. | ||
13 | - t.column :taggable_type, :string | ||
14 | - | ||
15 | - t.column :created_at, :datetime | ||
16 | - end | ||
17 | - | ||
18 | - add_index :taggings, :tag_id | ||
19 | - add_index :taggings, [:taggable_id, :taggable_type] | ||
20 | - end | ||
21 | - | ||
22 | - def self.down | ||
23 | - drop_table :taggings | ||
24 | - drop_table :tags | ||
25 | - end | ||
26 | -end |
vendor/plugins/acts_as_taggable_on_steroids/init.rb
vendor/plugins/acts_as_taggable_on_steroids/lib/acts_as_taggable.rb
@@ -1,145 +0,0 @@ | @@ -1,145 +0,0 @@ | ||
1 | -module ActiveRecord | ||
2 | - module Acts #:nodoc: | ||
3 | - module Taggable #:nodoc: | ||
4 | - def self.included(base) | ||
5 | - base.extend(ClassMethods) | ||
6 | - end | ||
7 | - | ||
8 | - module ClassMethods | ||
9 | - def acts_as_taggable(options = {}) | ||
10 | - has_many :taggings, :as => :taggable, :dependent => :destroy, :include => :tag | ||
11 | - has_many :tags, :through => :taggings | ||
12 | - | ||
13 | - before_save :save_cached_tag_list | ||
14 | - after_save :save_tags | ||
15 | - | ||
16 | - include ActiveRecord::Acts::Taggable::InstanceMethods | ||
17 | - extend ActiveRecord::Acts::Taggable::SingletonMethods | ||
18 | - | ||
19 | - alias_method :reload_without_tag_list, :reload | ||
20 | - alias_method :reload, :reload_with_tag_list | ||
21 | - end | ||
22 | - | ||
23 | - def cached_tag_list_column_name | ||
24 | - "cached_tag_list" | ||
25 | - end | ||
26 | - | ||
27 | - def set_cached_tag_list_column_name(value = nil, &block) | ||
28 | - define_attr_method :cached_tag_list_column_name, value, &block | ||
29 | - end | ||
30 | - end | ||
31 | - | ||
32 | - module SingletonMethods | ||
33 | - # Pass either a tag string, or an array of strings or tags | ||
34 | - # | ||
35 | - # Options: | ||
36 | - # :exclude - Find models that are not tagged with the given tags | ||
37 | - # :match_all - Find models that match all of the given tags, not just one | ||
38 | - # :conditions - A piece of SQL conditions to add to the query | ||
39 | - def find_tagged_with(tags, options = {}) | ||
40 | - tags = TagList.from(tags).names | ||
41 | - return [] if tags.empty? | ||
42 | - | ||
43 | - conditions = tags.map {|t| sanitize_sql(["tags.name LIKE ?",t])}.join(' OR ') | ||
44 | - conditions += ' AND ' + sanitize_sql(options.delete(:conditions)) if options[:conditions] | ||
45 | - group = "#{table_name}.id HAVING COUNT(#{table_name}.id) = #{tags.size}" if options.delete(:match_all) | ||
46 | - exclude = options.delete(:exclude) | ||
47 | - taggeds = find(:all, {:conditions => conditions, :include => :tags, :group => group}.update(options)) | ||
48 | - exclude ? find(:all) - taggeds : taggeds | ||
49 | - end | ||
50 | - | ||
51 | - # Options: | ||
52 | - # :start_at - Restrict the tags to those created after a certain time | ||
53 | - # :end_at - Restrict the tags to those created before a certain time | ||
54 | - # :conditions - A piece of SQL conditions to add to the query | ||
55 | - # :limit - The maximum number of tags to return | ||
56 | - # :order - A piece of SQL to order by. Eg 'tags.count desc' or 'taggings.created_at desc' | ||
57 | - # :at_least - Exclude tags with a frequency less than the given value | ||
58 | - # :at_most - Exclude tags with a frequency greater then the given value | ||
59 | - def tag_counts(*args) | ||
60 | - Tag.find(:all, find_options_for_tag_counts(*args)) | ||
61 | - end | ||
62 | - | ||
63 | - def find_options_for_tag_counts(options = {}) | ||
64 | - options.assert_valid_keys :start_at, :end_at, :conditions, :at_least, :at_most, :order, :limit | ||
65 | - | ||
66 | - scope = scope(:find) | ||
67 | - start_at = sanitize_sql(["#{Tagging.table_name}.created_at >= ?", options[:start_at]]) if options[:start_at] | ||
68 | - end_at = sanitize_sql(["#{Tagging.table_name}.created_at <= ?", options[:end_at]]) if options[:end_at] | ||
69 | - | ||
70 | - conditions = [ | ||
71 | - "#{Tagging.table_name}.taggable_type = #{quote_value(base_class.name)}", | ||
72 | - options[:conditions], | ||
73 | - scope && scope[:conditions], | ||
74 | - start_at, | ||
75 | - end_at | ||
76 | - ] | ||
77 | - conditions = conditions.compact.join(' and ') | ||
78 | - | ||
79 | - at_least = sanitize_sql(['COUNT(*) >= ?', options[:at_least]]) if options[:at_least] | ||
80 | - at_most = sanitize_sql(['COUNT(*) <= ?', options[:at_most]]) if options[:at_most] | ||
81 | - having = [at_least, at_most].compact.join(' and ') | ||
82 | - group_by = "#{Tag.table_name}.id, #{Tag.table_name}.name HAVING COUNT(*) > 0" | ||
83 | - group_by << " AND #{having}" unless having.blank? | ||
84 | - | ||
85 | - { :select => "#{Tag.table_name}.id, #{Tag.table_name}.name, COUNT(*) AS count", | ||
86 | - :joins => "LEFT OUTER JOIN #{Tagging.table_name} ON #{Tag.table_name}.id = #{Tagging.table_name}.tag_id LEFT OUTER JOIN #{table_name} ON #{table_name}.#{primary_key} = #{Tagging.table_name}.taggable_id", | ||
87 | - :conditions => conditions, | ||
88 | - :group => group_by, | ||
89 | - :order => options[:order], | ||
90 | - :limit => options[:limit] | ||
91 | - } | ||
92 | - end | ||
93 | - end | ||
94 | - | ||
95 | - module InstanceMethods | ||
96 | - def tag_list | ||
97 | - if @tag_list | ||
98 | - @tag_list | ||
99 | - elsif caching_tag_list? and !send(self.class.cached_tag_list_column_name).nil? | ||
100 | - @tag_list = TagList.from(send(self.class.cached_tag_list_column_name)) | ||
101 | - else | ||
102 | - @tag_list = TagList.new(tags.map(&:name)) | ||
103 | - end | ||
104 | - end | ||
105 | - | ||
106 | - def tag_list=(value) | ||
107 | - @tag_list = TagList.from(value) | ||
108 | - end | ||
109 | - | ||
110 | - def save_cached_tag_list | ||
111 | - if caching_tag_list? and !tag_list.blank? | ||
112 | - self[self.class.cached_tag_list_column_name] = tag_list.to_s | ||
113 | - end | ||
114 | - end | ||
115 | - | ||
116 | - def save_tags | ||
117 | - return unless @tag_list | ||
118 | - | ||
119 | - new_tag_names = @tag_list.names - tags.map(&:name) | ||
120 | - old_tags = tags.reject { |tag| @tag_list.names.include?(tag.name) } | ||
121 | - | ||
122 | - self.class.transaction do | ||
123 | - tags.delete(*old_tags) if old_tags.any? | ||
124 | - | ||
125 | - new_tag_names.each do |new_tag_name| | ||
126 | - tags << (Tag.find(:first, :conditions => ['name like ?',new_tag_name]) || Tag.create(:name => new_tag_name)) | ||
127 | - end | ||
128 | - end | ||
129 | - true | ||
130 | - end | ||
131 | - | ||
132 | - def reload_with_tag_list(*args) | ||
133 | - @tag_list = nil | ||
134 | - reload_without_tag_list(*args) | ||
135 | - end | ||
136 | - | ||
137 | - def caching_tag_list? | ||
138 | - self.class.column_names.include?(self.class.cached_tag_list_column_name) | ||
139 | - end | ||
140 | - end | ||
141 | - end | ||
142 | - end | ||
143 | -end | ||
144 | - | ||
145 | -ActiveRecord::Base.send(:include, ActiveRecord::Acts::Taggable) |
vendor/plugins/acts_as_taggable_on_steroids/lib/tag.rb
@@ -1,41 +0,0 @@ | @@ -1,41 +0,0 @@ | ||
1 | -class Tag < ActiveRecord::Base | ||
2 | - has_many :taggings | ||
3 | - | ||
4 | - attr_accessible :name | ||
5 | - | ||
6 | - validates_presence_of :name | ||
7 | - validates_uniqueness_of :name | ||
8 | - | ||
9 | - class << self | ||
10 | - delegate :delimiter, :delimiter=, :to => TagList | ||
11 | - end | ||
12 | - | ||
13 | - def ==(object) | ||
14 | - super || (object.is_a?(Tag) && name == object.name) | ||
15 | - end | ||
16 | - | ||
17 | - def to_s | ||
18 | - name | ||
19 | - end | ||
20 | - | ||
21 | - def count | ||
22 | - read_attribute(:count).to_i | ||
23 | - end | ||
24 | - | ||
25 | - def self.hierarchical=(bool) | ||
26 | - if bool | ||
27 | - acts_as_tree | ||
28 | - end | ||
29 | - end | ||
30 | - | ||
31 | - # All the tags that can be a new parent for this tag, that is all but itself and its descendents to avoid loops | ||
32 | - def parent_candidates | ||
33 | - Tag.find_all_by_pending(false) - descendents - [self] | ||
34 | - end | ||
35 | - | ||
36 | - # All tags that have this tag as its one of its ancestors | ||
37 | - def descendents | ||
38 | - children.to_a.sum([], &:descendents) + children | ||
39 | - end | ||
40 | - | ||
41 | -end |
vendor/plugins/acts_as_taggable_on_steroids/lib/tag_counts_extension.rb
vendor/plugins/acts_as_taggable_on_steroids/lib/tag_list.rb
@@ -1,66 +0,0 @@ | @@ -1,66 +0,0 @@ | ||
1 | -class TagList | ||
2 | - cattr_accessor :delimiter | ||
3 | - self.delimiter = ',' | ||
4 | - | ||
5 | - attr_reader :names | ||
6 | - | ||
7 | - def initialize(*names) | ||
8 | - @names = [] | ||
9 | - add(*names) | ||
10 | - end | ||
11 | - | ||
12 | - def add(*names) | ||
13 | - names = names.flatten | ||
14 | - | ||
15 | - # Strip whitespace and remove blank or duplicate tags | ||
16 | - names.map!(&:strip) | ||
17 | - names.reject!(&:blank?) | ||
18 | - | ||
19 | - @names.concat(names) | ||
20 | - @names.uniq! | ||
21 | - end | ||
22 | - | ||
23 | - def remove(*names) | ||
24 | - names = names.flatten | ||
25 | - @names.delete_if { |name| names.include?(name) } | ||
26 | - end | ||
27 | - | ||
28 | - def blank? | ||
29 | - @names.empty? | ||
30 | - end | ||
31 | - | ||
32 | - def to_s | ||
33 | - @names.map do |name| | ||
34 | - name.include?(delimiter) ? "\"#{name}\"" : name | ||
35 | - end.join(delimiter.ends_with?(" ") ? delimiter : "#{delimiter} ") | ||
36 | - end | ||
37 | - | ||
38 | - def ==(other) | ||
39 | - super || (other.is_a?(TagList) && other.names == @names) | ||
40 | - end | ||
41 | - | ||
42 | - class << self | ||
43 | - def from(tags) | ||
44 | - case tags | ||
45 | - when String | ||
46 | - new(parse(tags)) | ||
47 | - when Array | ||
48 | - new(tags.map(&:to_s)) | ||
49 | - else | ||
50 | - new([]) | ||
51 | - end | ||
52 | - end | ||
53 | - | ||
54 | - def parse(string) | ||
55 | - [].tap do |names| | ||
56 | - string = string.to_s.dup | ||
57 | - | ||
58 | - # Parse the quoted tags | ||
59 | - string.gsub!(/"(.*?)"\s*#{delimiter}?\s*/) { names << $1; "" } | ||
60 | - string.gsub!(/'(.*?)'\s*#{delimiter}?\s*/) { names << $1; "" } | ||
61 | - | ||
62 | - names.concat(string.split(delimiter)) | ||
63 | - end | ||
64 | - end | ||
65 | - end | ||
66 | -end |
vendor/plugins/acts_as_taggable_on_steroids/lib/tagging.rb
vendor/plugins/acts_as_taggable_on_steroids/test/abstract_unit.rb
@@ -1,82 +0,0 @@ | @@ -1,82 +0,0 @@ | ||
1 | -require 'test/unit' | ||
2 | - | ||
3 | -begin | ||
4 | - require File.dirname(__FILE__) + '/../../../../config/environment' | ||
5 | -rescue LoadError | ||
6 | - require 'rubygems' | ||
7 | - require_gem 'activerecord' | ||
8 | - require_gem 'actionpack' | ||
9 | -end | ||
10 | - | ||
11 | -# Search for fixtures first | ||
12 | -fixture_path = File.dirname(__FILE__) + '/fixtures/' | ||
13 | -begin | ||
14 | - Dependencies.load_paths.insert(0, fixture_path) | ||
15 | -rescue | ||
16 | - $LOAD_PATH.unshift(fixture_path) | ||
17 | -end | ||
18 | - | ||
19 | -require 'active_record/fixtures' | ||
20 | - | ||
21 | -require File.dirname(__FILE__) + '/../lib/acts_as_taggable' | ||
22 | -require_dependency File.dirname(__FILE__) + '/../lib/tag_list' | ||
23 | - | ||
24 | -ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + '/debug.log') | ||
25 | -#ActiveRecord::Base.configurations = YAML::load(IO.read(File.dirname(__FILE__) + '/database.yml')) | ||
26 | -#ActiveRecord::Base.establish_connection(ENV['DB'] || 'mysql') | ||
27 | - | ||
28 | -load(File.dirname(__FILE__) + '/schema.rb') | ||
29 | - | ||
30 | -Test::Unit::TestCase.fixture_path = fixture_path | ||
31 | - | ||
32 | -class Test::Unit::TestCase #:nodoc: | ||
33 | - self.use_transactional_fixtures = true | ||
34 | - self.use_instantiated_fixtures = false | ||
35 | - | ||
36 | - def assert_equivalent(expected, actual, message = nil) | ||
37 | - if expected.first.is_a?(ActiveRecord::Base) | ||
38 | - assert_equal expected.sort_by(&:id), actual.sort_by(&:id), message | ||
39 | - else | ||
40 | - assert_equal expected.sort, actual.sort, message | ||
41 | - end | ||
42 | - end | ||
43 | - | ||
44 | - def assert_tag_counts(tags, expected_values) | ||
45 | - # Map the tag fixture names to real tag names | ||
46 | - expected_values = expected_values.inject({}) do |hash, (tag, count)| | ||
47 | - hash[tags(tag).name] = count | ||
48 | - hash | ||
49 | - end | ||
50 | - | ||
51 | - tags.each do |tag| | ||
52 | - value = expected_values.delete(tag.name) | ||
53 | - assert_not_nil value, "Expected count for #{tag.name} was not provided" if value.nil? | ||
54 | - assert_equal value, tag.count, "Expected value of #{value} for #{tag.name}, but was #{tag.count}" | ||
55 | - end | ||
56 | - | ||
57 | - unless expected_values.empty? | ||
58 | - assert false, "The following tag counts were not present: #{expected_values.inspect}" | ||
59 | - end | ||
60 | - end | ||
61 | - | ||
62 | - def assert_queries(num = 1) | ||
63 | - $query_count = 0 | ||
64 | - yield | ||
65 | - ensure | ||
66 | - assert_equal num, $query_count, "#{$query_count} instead of #{num} queries were executed." | ||
67 | - end | ||
68 | - | ||
69 | - def assert_no_queries(&block) | ||
70 | - assert_queries(0, &block) | ||
71 | - end | ||
72 | -end | ||
73 | - | ||
74 | -ActiveRecord::Base.connection.class.class_eval do | ||
75 | - def execute_with_counting(sql, name = nil, &block) | ||
76 | - $query_count ||= 0 | ||
77 | - $query_count += 1 | ||
78 | - execute_without_counting(sql, name, &block) | ||
79 | - end | ||
80 | - | ||
81 | - alias_method_chain :execute, :counting | ||
82 | -end |
vendor/plugins/acts_as_taggable_on_steroids/test/acts_as_taggable_test.rb
@@ -1,272 +0,0 @@ | @@ -1,272 +0,0 @@ | ||
1 | -require File.dirname(__FILE__) + '/abstract_unit' | ||
2 | - | ||
3 | -class ActsAsTaggableOnSteroidsTest < Test::Unit::TestCase | ||
4 | - fixtures :tags, :taggings, :posts, :users, :photos | ||
5 | - | ||
6 | - def test_find_tagged_with | ||
7 | - assert_equivalent [posts(:jonathan_sky), posts(:sam_flowers)], Post.find_tagged_with('"Very good"') | ||
8 | - assert_equal Post.find_tagged_with('"Very good"'), Post.find_tagged_with(['Very good']) | ||
9 | - assert_equal Post.find_tagged_with('"Very good"'), Post.find_tagged_with([tags(:good)]) | ||
10 | - | ||
11 | - assert_equivalent [photos(:jonathan_dog), photos(:sam_flower), photos(:sam_sky)], Photo.find_tagged_with('Nature') | ||
12 | - assert_equal Photo.find_tagged_with('Nature'), Photo.find_tagged_with(['Nature']) | ||
13 | - assert_equal Photo.find_tagged_with('Nature'), Photo.find_tagged_with([tags(:nature)]) | ||
14 | - | ||
15 | - assert_equivalent [photos(:jonathan_bad_cat), photos(:jonathan_dog), photos(:jonathan_questioning_dog)], Photo.find_tagged_with('"Crazy animal" Bad') | ||
16 | - assert_equal Photo.find_tagged_with('"Crazy animal" Bad'), Photo.find_tagged_with(['Crazy animal', 'Bad']) | ||
17 | - assert_equal Photo.find_tagged_with('"Crazy animal" Bad'), Photo.find_tagged_with([tags(:animal), tags(:bad)]) | ||
18 | - end | ||
19 | - | ||
20 | - def test_find_tagged_with_nothing | ||
21 | - assert_equal [], Post.find_tagged_with("") | ||
22 | - assert_equal [], Post.find_tagged_with([]) | ||
23 | - end | ||
24 | - | ||
25 | - def test_find_tagged_with_nonexistant_tags | ||
26 | - assert_equal [], Post.find_tagged_with('ABCDEFG') | ||
27 | - assert_equal [], Photo.find_tagged_with(['HIJKLM']) | ||
28 | - assert_equal [], Photo.find_tagged_with([Tag.new(:name => 'unsaved tag')]) | ||
29 | - end | ||
30 | - | ||
31 | - def test_find_tagged_with_matching_all_tags | ||
32 | - assert_equivalent [photos(:jonathan_dog)], Photo.find_tagged_with('Crazy animal, "Nature"', :match_all => true) | ||
33 | - assert_equivalent [posts(:jonathan_sky), posts(:sam_flowers)], Post.find_tagged_with(['Very good', 'Nature'], :match_all => true) | ||
34 | - end | ||
35 | - | ||
36 | - def test_find_tagged_with_exclusions | ||
37 | - assert_equivalent [photos(:jonathan_questioning_dog), photos(:jonathan_bad_cat)], Photo.find_tagged_with("Nature", :exclude => true) | ||
38 | - assert_equivalent [posts(:jonathan_grass), posts(:jonathan_rain)], Post.find_tagged_with("'Very good', Bad", :exclude => true) | ||
39 | - end | ||
40 | - | ||
41 | -# def test_find_options_for_tagged_with_no_tags_returns_empty_hash | ||
42 | -# assert_equal Hash.new, Post.find_options_for_tagged_with("") | ||
43 | -# assert_equal Hash.new, Post.find_options_for_tagged_with([nil]) | ||
44 | -# end | ||
45 | - | ||
46 | -# def test_find_options_for_tagged_with_leavs_arguments_unchanged | ||
47 | -# original_tags = photos(:jonathan_questioning_dog).tags.dup | ||
48 | -# Photo.find_options_for_tagged_with(photos(:jonathan_questioning_dog).tags) | ||
49 | -# assert_equal original_tags, photos(:jonathan_questioning_dog).tags | ||
50 | -# end | ||
51 | - | ||
52 | -# def test_find_options_for_tagged_with_respects_custom_table_name | ||
53 | -# Tagging.table_name = "categorisations" | ||
54 | -# Tag.table_name = "categories" | ||
55 | -# | ||
56 | -# options = Photo.find_options_for_tagged_with("Hello") | ||
57 | -# | ||
58 | -# assert_no_match Regexp.new(" taggings "), options[:joins] | ||
59 | -# assert_no_match Regexp.new(" tags "), options[:joins] | ||
60 | -# | ||
61 | -# assert_match Regexp.new(" categorisations "), options[:joins] | ||
62 | -# assert_match Regexp.new(" categories "), options[:joins] | ||
63 | -# ensure | ||
64 | -# Tagging.table_name = "taggings" | ||
65 | -# Tag.table_name = "tags" | ||
66 | -# end | ||
67 | - | ||
68 | - def test_include_tags_on_find_tagged_with | ||
69 | - assert_nothing_raised do | ||
70 | - Photo.find_tagged_with('Nature', :include => :tags) | ||
71 | - Photo.find_tagged_with("Nature", :include => { :taggings => :tag }) | ||
72 | - end | ||
73 | - end | ||
74 | - | ||
75 | - def test_basic_tag_counts_on_class | ||
76 | - assert_tag_counts Post.tag_counts, :good => 2, :nature => 5, :question => 1, :bad => 1 | ||
77 | - assert_tag_counts Photo.tag_counts, :good => 1, :nature => 3, :question => 1, :bad => 1, :animal => 3 | ||
78 | - end | ||
79 | - | ||
80 | - def test_tag_counts_on_class_with_date_conditions | ||
81 | - assert_tag_counts Post.tag_counts(:start_at => Date.new(2006, 8, 4)), :good => 1, :nature => 3, :question => 1, :bad => 1 | ||
82 | - assert_tag_counts Post.tag_counts(:end_at => Date.new(2006, 8, 6)), :good => 1, :nature => 4, :question => 1 | ||
83 | - assert_tag_counts Post.tag_counts(:start_at => Date.new(2006, 8, 5), :end_at => Date.new(2006, 8, 8)), :good => 1, :nature => 2, :bad => 1 | ||
84 | - | ||
85 | - assert_tag_counts Photo.tag_counts(:start_at => Date.new(2006, 8, 12), :end_at => Date.new(2006, 8, 17)), :good => 1, :nature => 1, :bad => 1, :question => 1, :animal => 2 | ||
86 | - end | ||
87 | - | ||
88 | - def test_tag_counts_on_class_with_frequencies | ||
89 | - assert_tag_counts Photo.tag_counts(:at_least => 2), :nature => 3, :animal => 3 | ||
90 | - assert_tag_counts Photo.tag_counts(:at_most => 2), :good => 1, :question => 1, :bad => 1 | ||
91 | - end | ||
92 | - | ||
93 | - def test_tag_counts_with_limit | ||
94 | - assert_equal 2, Photo.tag_counts(:limit => 2).size | ||
95 | - assert_equal 1, Post.tag_counts(:at_least => 4, :limit => 2).size | ||
96 | - end | ||
97 | - | ||
98 | - def test_tag_counts_with_limit_and_order | ||
99 | - assert_equal [tags(:nature), tags(:good)], Post.tag_counts(:order => 'count desc', :limit => 2) | ||
100 | - end | ||
101 | - | ||
102 | - def test_tag_counts_on_association | ||
103 | - assert_tag_counts users(:jonathan).posts.tag_counts, :good => 1, :nature => 3, :question => 1 | ||
104 | - assert_tag_counts users(:sam).posts.tag_counts, :good => 1, :nature => 2, :bad => 1 | ||
105 | - | ||
106 | - assert_tag_counts users(:jonathan).photos.tag_counts, :animal => 3, :nature => 1, :question => 1, :bad => 1 | ||
107 | - assert_tag_counts users(:sam).photos.tag_counts, :nature => 2, :good => 1 | ||
108 | - end | ||
109 | - | ||
110 | - def test_tag_counts_on_association_with_options | ||
111 | - assert_equal [], users(:jonathan).posts.tag_counts(:conditions => '1=0') | ||
112 | - assert_tag_counts users(:jonathan).posts.tag_counts(:at_most => 2), :good => 1, :question => 1 | ||
113 | - end | ||
114 | - | ||
115 | - def test_tag_counts_respects_custom_table_names | ||
116 | - Tagging.table_name = "categorisations" | ||
117 | - Tag.table_name = "categories" | ||
118 | - | ||
119 | - options = Photo.find_options_for_tag_counts(:start_at => 2.weeks.ago, :end_at => Date.today) | ||
120 | - sql = options.values.join(' ') | ||
121 | - | ||
122 | - assert_no_match /taggings/, sql | ||
123 | - assert_no_match /tags/, sql | ||
124 | - | ||
125 | - assert_match /categorisations/, sql | ||
126 | - assert_match /categories/, sql | ||
127 | - ensure | ||
128 | - Tagging.table_name = "taggings" | ||
129 | - Tag.table_name = "tags" | ||
130 | - end | ||
131 | - | ||
132 | - def test_tag_list_reader | ||
133 | - assert_equivalent ["Very good", "Nature"], posts(:jonathan_sky).tag_list.names | ||
134 | - assert_equivalent ["Bad", "Crazy animal"], photos(:jonathan_bad_cat).tag_list.names | ||
135 | - end | ||
136 | - | ||
137 | - def test_reassign_tag_list | ||
138 | - assert_equivalent ["Nature", "Question"], posts(:jonathan_rain).tag_list.names | ||
139 | - posts(:jonathan_rain).taggings.reload | ||
140 | - | ||
141 | - # Only an update of the posts table should be executed | ||
142 | - assert_queries 1 do | ||
143 | - posts(:jonathan_rain).update_attributes!(:tag_list => posts(:jonathan_rain).tag_list.to_s) | ||
144 | - end | ||
145 | - | ||
146 | - assert_equivalent ["Nature", "Question"], posts(:jonathan_rain).tag_list.names | ||
147 | - end | ||
148 | - | ||
149 | - def test_new_tags | ||
150 | - assert_equivalent ["Very good", "Nature"], posts(:jonathan_sky).tag_list.names | ||
151 | - posts(:jonathan_sky).update_attributes!(:tag_list => "#{posts(:jonathan_sky).tag_list}, One, Two") | ||
152 | - assert_equivalent ["Very good", "Nature", "One", "Two"], posts(:jonathan_sky).tag_list.names | ||
153 | - end | ||
154 | - | ||
155 | - def test_remove_tag | ||
156 | - assert_equivalent ["Very good", "Nature"], posts(:jonathan_sky).tag_list.names | ||
157 | - posts(:jonathan_sky).update_attributes!(:tag_list => "Nature") | ||
158 | - assert_equivalent ["Nature"], posts(:jonathan_sky).tag_list.names | ||
159 | - end | ||
160 | - | ||
161 | - def test_change_case_of_tags | ||
162 | - original_tag_names = photos(:jonathan_questioning_dog).tag_list.names | ||
163 | - photos(:jonathan_questioning_dog).update_attributes!(:tag_list => photos(:jonathan_questioning_dog).tag_list.to_s.upcase) | ||
164 | - | ||
165 | - # The new tag list is not uppercase becuase the AR finders are not case-sensitive | ||
166 | - # and find the old tags when re-tagging with the uppercase tags. | ||
167 | - assert_equivalent original_tag_names, photos(:jonathan_questioning_dog).reload.tag_list.names | ||
168 | - end | ||
169 | - | ||
170 | - def test_remove_and_add_tag | ||
171 | - assert_equivalent ["Very good", "Nature"], posts(:jonathan_sky).tag_list.names | ||
172 | - posts(:jonathan_sky).update_attributes!(:tag_list => "Nature, Beautiful") | ||
173 | - assert_equivalent ["Nature", "Beautiful"], posts(:jonathan_sky).tag_list.names | ||
174 | - end | ||
175 | - | ||
176 | - def test_tags_not_saved_if_validation_fails | ||
177 | - assert_equivalent ["Very good", "Nature"], posts(:jonathan_sky).tag_list.names | ||
178 | - assert !posts(:jonathan_sky).update_attributes(:tag_list => "One, Two", :text => "") | ||
179 | - assert_equivalent ["Very good", "Nature"], Post.find(posts(:jonathan_sky).id).tag_list.names | ||
180 | - end | ||
181 | - | ||
182 | - def test_tag_list_accessors_on_new_record | ||
183 | - p = Post.new(:text => 'Test') | ||
184 | - | ||
185 | - assert p.tag_list.blank? | ||
186 | - p.tag_list = "One, Two" | ||
187 | - assert_equal "One, Two", p.tag_list.to_s | ||
188 | - end | ||
189 | - | ||
190 | - def test_clear_tag_list_with_nil | ||
191 | - p = photos(:jonathan_questioning_dog) | ||
192 | - | ||
193 | - assert !p.tag_list.blank? | ||
194 | - assert p.update_attributes(:tag_list => nil) | ||
195 | - assert p.tag_list.blank? | ||
196 | - | ||
197 | - assert p.reload.tag_list.blank? | ||
198 | - end | ||
199 | - | ||
200 | - def test_clear_tag_list_with_string | ||
201 | - p = photos(:jonathan_questioning_dog) | ||
202 | - | ||
203 | - assert !p.tag_list.blank? | ||
204 | - assert p.update_attributes(:tag_list => ' ') | ||
205 | - assert p.tag_list.blank? | ||
206 | - | ||
207 | - assert p.reload.tag_list.blank? | ||
208 | - end | ||
209 | - | ||
210 | - def test_tag_list_reset_on_reload | ||
211 | - p = photos(:jonathan_questioning_dog) | ||
212 | - assert !p.tag_list.blank? | ||
213 | - p.tag_list = nil | ||
214 | - assert p.tag_list.blank? | ||
215 | - assert !p.reload.tag_list.blank? | ||
216 | - end | ||
217 | - | ||
218 | - def test_tag_list_populated_when_cache_nil | ||
219 | - assert_nil posts(:jonathan_sky).cached_tag_list | ||
220 | - posts(:jonathan_sky).save! | ||
221 | - assert_equal posts(:jonathan_sky).tag_list.to_s, posts(:jonathan_sky).cached_tag_list | ||
222 | - end | ||
223 | - | ||
224 | - def test_cached_tag_list_used | ||
225 | - posts(:jonathan_sky).save! | ||
226 | - posts(:jonathan_sky).reload | ||
227 | - | ||
228 | - assert_no_queries do | ||
229 | - assert_equivalent ["Very good", "Nature"], posts(:jonathan_sky).tag_list.names | ||
230 | - end | ||
231 | - end | ||
232 | - | ||
233 | - def test_cached_tag_list_not_used | ||
234 | - # Load fixture and column information | ||
235 | - posts(:jonathan_sky).taggings(:reload) | ||
236 | - | ||
237 | - assert_queries 1 do | ||
238 | - # Tags association will be loaded | ||
239 | - posts(:jonathan_sky).tag_list | ||
240 | - end | ||
241 | - end | ||
242 | - | ||
243 | - def test_cached_tag_list_updated | ||
244 | - assert_nil posts(:jonathan_sky).cached_tag_list | ||
245 | - posts(:jonathan_sky).save! | ||
246 | - assert_equivalent ["Very good", "Nature"], TagList.from(posts(:jonathan_sky).cached_tag_list).names | ||
247 | - posts(:jonathan_sky).update_attributes!(:tag_list => "None") | ||
248 | - | ||
249 | - assert_equal 'None', posts(:jonathan_sky).cached_tag_list | ||
250 | - assert_equal 'None', posts(:jonathan_sky).reload.cached_tag_list | ||
251 | - end | ||
252 | - | ||
253 | - def test_inherited_taggable | ||
254 | - # SpPost inherits acts_as_taggable from its ancestor Post | ||
255 | - p = SpPost.new(:text => 'bla bla bla ...') | ||
256 | - p.tag_list = 'bla' | ||
257 | - p.save | ||
258 | - assert !SpPost.find_tagged_with('bla').blank? | ||
259 | - end | ||
260 | -end | ||
261 | - | ||
262 | -class ActsAsTaggableOnSteroidsFormTest < Test::Unit::TestCase | ||
263 | - fixtures :tags, :taggings, :posts, :users, :photos | ||
264 | - | ||
265 | - include ActionView::Helpers::FormHelper | ||
266 | - | ||
267 | - def test_tag_list_contents | ||
268 | - fields_for :post, posts(:jonathan_sky) do |f| | ||
269 | - assert_match /Very good, Nature/, f.text_field(:tag_list) | ||
270 | - end | ||
271 | - end | ||
272 | -end |
vendor/plugins/acts_as_taggable_on_steroids/test/database.yml
vendor/plugins/acts_as_taggable_on_steroids/test/fixtures/photo.rb
vendor/plugins/acts_as_taggable_on_steroids/test/fixtures/photos.yml
@@ -1,24 +0,0 @@ | @@ -1,24 +0,0 @@ | ||
1 | -jonathan_dog: | ||
2 | - id: 1 | ||
3 | - user_id: 1 | ||
4 | - title: A small dog | ||
5 | - | ||
6 | -jonathan_questioning_dog: | ||
7 | - id: 2 | ||
8 | - user_id: 1 | ||
9 | - title: What does this dog want? | ||
10 | - | ||
11 | -jonathan_bad_cat: | ||
12 | - id: 3 | ||
13 | - user_id: 1 | ||
14 | - title: Bad cat | ||
15 | - | ||
16 | -sam_flower: | ||
17 | - id: 4 | ||
18 | - user_id: 2 | ||
19 | - title: Flower | ||
20 | - | ||
21 | -sam_sky: | ||
22 | - id: 5 | ||
23 | - user_id: 2 | ||
24 | - title: Sky |
vendor/plugins/acts_as_taggable_on_steroids/test/fixtures/post.rb
vendor/plugins/acts_as_taggable_on_steroids/test/fixtures/posts.yml
@@ -1,24 +0,0 @@ | @@ -1,24 +0,0 @@ | ||
1 | -jonathan_sky: | ||
2 | - id: 1 | ||
3 | - user_id: 1 | ||
4 | - text: The sky is particularly blue today | ||
5 | - | ||
6 | -jonathan_grass: | ||
7 | - id: 2 | ||
8 | - user_id: 1 | ||
9 | - text: The grass seems very green | ||
10 | - | ||
11 | -jonathan_rain: | ||
12 | - id: 3 | ||
13 | - user_id: 1 | ||
14 | - text: Why does the rain fall? | ||
15 | - | ||
16 | -sam_ground: | ||
17 | - id: 4 | ||
18 | - user_id: 2 | ||
19 | - text: The ground is looking too brown | ||
20 | - | ||
21 | -sam_flowers: | ||
22 | - id: 5 | ||
23 | - user_id: 2 | ||
24 | - text: Why are the flowers dead? | ||
25 | \ No newline at end of file | 0 | \ No newline at end of file |
vendor/plugins/acts_as_taggable_on_steroids/test/fixtures/sp_post.rb
vendor/plugins/acts_as_taggable_on_steroids/test/fixtures/taggings.yml
@@ -1,126 +0,0 @@ | @@ -1,126 +0,0 @@ | ||
1 | -jonathan_sky_good: | ||
2 | - id: 1 | ||
3 | - tag_id: 1 | ||
4 | - taggable_id: 1 | ||
5 | - taggable_type: Post | ||
6 | - created_at: 2006-08-01 | ||
7 | - | ||
8 | -jonathan_sky_nature: | ||
9 | - id: 2 | ||
10 | - tag_id: 3 | ||
11 | - taggable_id: 1 | ||
12 | - taggable_type: Post | ||
13 | - created_at: 2006-08-02 | ||
14 | - | ||
15 | -jonathan_grass_nature: | ||
16 | - id: 3 | ||
17 | - tag_id: 3 | ||
18 | - taggable_id: 2 | ||
19 | - taggable_type: Post | ||
20 | - created_at: 2006-08-03 | ||
21 | - | ||
22 | -jonathan_rain_question: | ||
23 | - id: 4 | ||
24 | - tag_id: 4 | ||
25 | - taggable_id: 3 | ||
26 | - taggable_type: Post | ||
27 | - created_at: 2006-08-04 | ||
28 | - | ||
29 | -jonathan_rain_nature: | ||
30 | - id: 5 | ||
31 | - tag_id: 3 | ||
32 | - taggable_id: 3 | ||
33 | - taggable_type: Post | ||
34 | - created_at: 2006-08-05 | ||
35 | - | ||
36 | -sam_ground_nature: | ||
37 | - id: 6 | ||
38 | - tag_id: 3 | ||
39 | - taggable_id: 4 | ||
40 | - taggable_type: Post | ||
41 | - created_at: 2006-08-06 | ||
42 | - | ||
43 | -sam_ground_bad: | ||
44 | - id: 7 | ||
45 | - tag_id: 2 | ||
46 | - taggable_id: 4 | ||
47 | - taggable_type: Post | ||
48 | - created_at: 2006-08-07 | ||
49 | - | ||
50 | -sam_flowers_good: | ||
51 | - id: 8 | ||
52 | - tag_id: 1 | ||
53 | - taggable_id: 5 | ||
54 | - taggable_type: Post | ||
55 | - created_at: 2006-08-08 | ||
56 | - | ||
57 | -sam_flowers_nature: | ||
58 | - id: 9 | ||
59 | - tag_id: 3 | ||
60 | - taggable_id: 5 | ||
61 | - taggable_type: Post | ||
62 | - created_at: 2006-08-09 | ||
63 | - | ||
64 | - | ||
65 | -jonathan_dog_animal: | ||
66 | - id: 10 | ||
67 | - tag_id: 5 | ||
68 | - taggable_id: 1 | ||
69 | - taggable_type: Photo | ||
70 | - created_at: 2006-08-10 | ||
71 | - | ||
72 | -jonathan_dog_nature: | ||
73 | - id: 11 | ||
74 | - tag_id: 3 | ||
75 | - taggable_id: 1 | ||
76 | - taggable_type: Photo | ||
77 | - created_at: 2006-08-11 | ||
78 | - | ||
79 | -jonathan_questioning_dog_animal: | ||
80 | - id: 12 | ||
81 | - tag_id: 5 | ||
82 | - taggable_id: 2 | ||
83 | - taggable_type: Photo | ||
84 | - created_at: 2006-08-12 | ||
85 | - | ||
86 | -jonathan_questioning_dog_question: | ||
87 | - id: 13 | ||
88 | - tag_id: 4 | ||
89 | - taggable_id: 2 | ||
90 | - taggable_type: Photo | ||
91 | - created_at: 2006-08-13 | ||
92 | - | ||
93 | -jonathan_bad_cat_bad: | ||
94 | - id: 14 | ||
95 | - tag_id: 2 | ||
96 | - taggable_id: 3 | ||
97 | - taggable_type: Photo | ||
98 | - created_at: 2006-08-14 | ||
99 | - | ||
100 | -jonathan_bad_cat_animal: | ||
101 | - id: 15 | ||
102 | - tag_id: 5 | ||
103 | - taggable_id: 3 | ||
104 | - taggable_type: Photo | ||
105 | - created_at: 2006-08-15 | ||
106 | - | ||
107 | -sam_flower_nature: | ||
108 | - id: 16 | ||
109 | - tag_id: 3 | ||
110 | - taggable_id: 4 | ||
111 | - taggable_type: Photo | ||
112 | - created_at: 2006-08-16 | ||
113 | - | ||
114 | -sam_flower_good: | ||
115 | - id: 17 | ||
116 | - tag_id: 1 | ||
117 | - taggable_id: 4 | ||
118 | - taggable_type: Photo | ||
119 | - created_at: 2006-08-17 | ||
120 | - | ||
121 | -sam_sky_nature: | ||
122 | - id: 18 | ||
123 | - tag_id: 3 | ||
124 | - taggable_id: 5 | ||
125 | - taggable_type: Photo | ||
126 | - created_at: 2006-08-18 |
vendor/plugins/acts_as_taggable_on_steroids/test/fixtures/tags.yml
@@ -1,19 +0,0 @@ | @@ -1,19 +0,0 @@ | ||
1 | -good: | ||
2 | - id: 1 | ||
3 | - name: Very good | ||
4 | - | ||
5 | -bad: | ||
6 | - id: 2 | ||
7 | - name: Bad | ||
8 | - | ||
9 | -nature: | ||
10 | - id: 3 | ||
11 | - name: Nature | ||
12 | - | ||
13 | -question: | ||
14 | - id: 4 | ||
15 | - name: Question | ||
16 | - | ||
17 | -animal: | ||
18 | - id: 5 | ||
19 | - name: Crazy animal | ||
20 | \ No newline at end of file | 0 | \ No newline at end of file |
vendor/plugins/acts_as_taggable_on_steroids/test/fixtures/user.rb
vendor/plugins/acts_as_taggable_on_steroids/test/fixtures/users.yml
vendor/plugins/acts_as_taggable_on_steroids/test/schema.rb
@@ -1,31 +0,0 @@ | @@ -1,31 +0,0 @@ | ||
1 | -ActiveRecord::Schema.define :version => 0 do | ||
2 | - create_table :tags, :force => true do |t| | ||
3 | - t.column :name, :string | ||
4 | - t.column :parent_id, :integer | ||
5 | - t.column :pending, :boolean | ||
6 | - end | ||
7 | - | ||
8 | - create_table :taggings, :force => true do |t| | ||
9 | - t.column :tag_id, :integer | ||
10 | - t.column :taggable_id, :integer | ||
11 | - t.column :taggable_type, :string | ||
12 | - t.column :created_at, :datetime | ||
13 | - end | ||
14 | - | ||
15 | - create_table :users, :force => true do |t| | ||
16 | - t.column :name, :string | ||
17 | - end | ||
18 | - | ||
19 | - create_table :posts, :force => true do |t| | ||
20 | - t.column :text, :text | ||
21 | - t.column :cached_tag_list, :string | ||
22 | - t.column :user_id, :integer | ||
23 | - | ||
24 | - t.column :type, :string | ||
25 | - end | ||
26 | - | ||
27 | - create_table :photos, :force => true do |t| | ||
28 | - t.column :title, :string | ||
29 | - t.column :user_id, :integer | ||
30 | - end | ||
31 | -end |
vendor/plugins/acts_as_taggable_on_steroids/test/tag_list_test.rb
@@ -1,98 +0,0 @@ | @@ -1,98 +0,0 @@ | ||
1 | -require File.dirname(__FILE__) + '/abstract_unit' | ||
2 | - | ||
3 | -class TagListTest < Test::Unit::TestCase | ||
4 | - def test_blank? | ||
5 | - assert TagList.new.blank? | ||
6 | - end | ||
7 | - | ||
8 | - def test_equality | ||
9 | - assert_equal TagList.new, TagList.new | ||
10 | - assert_equal TagList.new("tag"), TagList.new("tag") | ||
11 | - | ||
12 | - assert_not_equal TagList.new, "" | ||
13 | - assert_not_equal TagList.new, TagList.new("tag") | ||
14 | - end | ||
15 | - | ||
16 | - def test_parse_leaves_string_unchanged | ||
17 | - tags = '"one ", two' | ||
18 | - original = tags.dup | ||
19 | - TagList.parse(tags) | ||
20 | - assert_equal tags, original | ||
21 | - end | ||
22 | - | ||
23 | - def test_from_single_name | ||
24 | - assert_equal %w(fun), TagList.from("fun").names | ||
25 | - assert_equal %w(fun), TagList.from('"fun"').names | ||
26 | - end | ||
27 | - | ||
28 | - def test_from_blank | ||
29 | - assert_equal [], TagList.from(nil).names | ||
30 | - assert_equal [], TagList.from("").names | ||
31 | - end | ||
32 | - | ||
33 | - def test_from_single_quoted_tag | ||
34 | - assert_equal ['with, comma'], TagList.from('"with, comma"').names | ||
35 | - end | ||
36 | - | ||
37 | - def test_spaces_do_not_delineate | ||
38 | - assert_equal ['a b', 'c'], TagList.from('a b, c').names | ||
39 | - end | ||
40 | - | ||
41 | - def test_from_multiple_tags | ||
42 | - assert_equivalent %w(alpha beta delta gamma), TagList.from("alpha, beta, delta, gamma").names.sort | ||
43 | - end | ||
44 | - | ||
45 | - def test_from_multiple_tags_with_quotes | ||
46 | - assert_equivalent %w(alpha beta delta gamma), TagList.from('alpha, "beta", gamma , "delta"').names.sort | ||
47 | - end | ||
48 | - | ||
49 | - def test_from_multiple_tags_with_quote_and_commas | ||
50 | - assert_equivalent ['alpha, beta', 'delta', 'gamma, something'], TagList.from('"alpha, beta", delta, "gamma, something"').names | ||
51 | - end | ||
52 | - | ||
53 | - def test_from_removes_white_space | ||
54 | - assert_equivalent %w(alpha beta), TagList.from('" alpha ", "beta "').names | ||
55 | - assert_equivalent %w(alpha beta), TagList.from(' alpha, beta ').names | ||
56 | - end | ||
57 | - | ||
58 | - def test_alternative_delimiter | ||
59 | - TagList.delimiter = " " | ||
60 | - | ||
61 | - assert_equal %w(one two), TagList.from("one two").names | ||
62 | - assert_equal ['one two', 'three', 'four'], TagList.from('"one two" three four').names | ||
63 | - ensure | ||
64 | - TagList.delimiter = "," | ||
65 | - end | ||
66 | - | ||
67 | - def test_duplicate_tags_removed | ||
68 | - assert_equal %w(one), TagList.from("one, one").names | ||
69 | - end | ||
70 | - | ||
71 | - def test_to_s_with_commas | ||
72 | - assert_equal "question, crazy animal", TagList.new(["question", "crazy animal"]).to_s | ||
73 | - end | ||
74 | - | ||
75 | - def test_to_s_with_alternative_delimiter | ||
76 | - TagList.delimiter = " " | ||
77 | - | ||
78 | - assert_equal '"crazy animal" question', TagList.new(["crazy animal", "question"]).to_s | ||
79 | - ensure | ||
80 | - TagList.delimiter = "," | ||
81 | - end | ||
82 | - | ||
83 | - def test_add | ||
84 | - tag_list = TagList.new("one") | ||
85 | - assert_equal %w(one), tag_list.names | ||
86 | - | ||
87 | - tag_list.add("two") | ||
88 | - assert_equal %w(one two), tag_list.names | ||
89 | - end | ||
90 | - | ||
91 | - def test_remove | ||
92 | - tag_list = TagList.new("one", "two") | ||
93 | - assert_equal %w(one two), tag_list.names | ||
94 | - | ||
95 | - tag_list.remove("one") | ||
96 | - assert_equal %w(two), tag_list.names | ||
97 | - end | ||
98 | -end |
vendor/plugins/acts_as_taggable_on_steroids/test/tag_test.rb
@@ -1,42 +0,0 @@ | @@ -1,42 +0,0 @@ | ||
1 | -require File.dirname(__FILE__) + '/abstract_unit' | ||
2 | - | ||
3 | -class TagTest < Test::Unit::TestCase | ||
4 | - fixtures :tags, :taggings, :users, :photos, :posts | ||
5 | - | ||
6 | - def test_name_required | ||
7 | - t = Tag.create | ||
8 | - assert_match /blank/, t.errors[:name].to_s | ||
9 | - end | ||
10 | - | ||
11 | - def test_name_unique | ||
12 | - t = Tag.create!(:name => "My tag") | ||
13 | - duplicate = t.clone | ||
14 | - | ||
15 | - assert !duplicate.save | ||
16 | - assert_match /taken/, duplicate.errors[:name].to_s | ||
17 | - end | ||
18 | - | ||
19 | - def test_taggings | ||
20 | - assert_equivalent [taggings(:jonathan_sky_good), taggings(:sam_flowers_good), taggings(:sam_flower_good)], tags(:good).taggings | ||
21 | - assert_equivalent [taggings(:sam_ground_bad), taggings(:jonathan_bad_cat_bad)], tags(:bad).taggings | ||
22 | - end | ||
23 | - | ||
24 | - def test_to_s | ||
25 | - assert_equal tags(:good).name, tags(:good).to_s | ||
26 | - end | ||
27 | - | ||
28 | - def test_equality | ||
29 | - assert_equal tags(:good), tags(:good) | ||
30 | - assert_equal Tag.find(1), Tag.find(1) | ||
31 | - assert_equal Tag.new(:name => 'A'), Tag.new(:name => 'A') | ||
32 | - assert_not_equal Tag.new(:name => 'A'), Tag.new(:name => 'B') | ||
33 | - end | ||
34 | - | ||
35 | - def test_deprecated_delimiter | ||
36 | - original_delimiter = Tag.delimiter | ||
37 | - Tag.delimiter = ":" | ||
38 | - assert_equal ":", TagList.delimiter | ||
39 | - ensure | ||
40 | - TagList.delimiter = original_delimiter | ||
41 | - end | ||
42 | -end |
vendor/plugins/acts_as_taggable_on_steroids/test/tagging_test.rb
@@ -1,13 +0,0 @@ | @@ -1,13 +0,0 @@ | ||
1 | -require File.dirname(__FILE__) + '/abstract_unit' | ||
2 | - | ||
3 | -class TaggingTest < Test::Unit::TestCase | ||
4 | - fixtures :tags, :taggings, :posts | ||
5 | - | ||
6 | - def test_tag | ||
7 | - assert_equal tags(:good), taggings(:jonathan_sky_good).tag | ||
8 | - end | ||
9 | - | ||
10 | - def test_taggable | ||
11 | - assert_equal posts(:jonathan_sky), taggings(:jonathan_sky_good).taggable | ||
12 | - end | ||
13 | -end |