Commit 1e6dcfa7ca80a1439cb0e8eb01e216040254fa16
1 parent
c4832b5f
Exists in
master
and in
27 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 | 28 | activesupport (3.2.6) |
| 29 | 29 | i18n (~> 0.6) |
| 30 | 30 | multi_json (~> 1.0) |
| 31 | + acts-as-taggable-on (3.0.1) | |
| 32 | + rails (>= 3, < 5) | |
| 31 | 33 | arel (3.0.2) |
| 32 | 34 | builder (3.0.0) |
| 33 | 35 | erubis (2.7.0) |
| ... | ... | @@ -82,6 +84,7 @@ PLATFORMS |
| 82 | 84 | ruby |
| 83 | 85 | |
| 84 | 86 | DEPENDENCIES |
| 87 | + acts-as-taggable-on | |
| 85 | 88 | fast_gettext |
| 86 | 89 | rails |
| 87 | 90 | rake | ... | ... |
app/controllers/public/profile_controller.rb
| ... | ... | @@ -32,7 +32,7 @@ class ProfileController < PublicController |
| 32 | 32 | @tag = params[:id] |
| 33 | 33 | @tag_cache_key = "tag_#{CGI.escape(@tag.to_s)}_#{profile.id.to_s}_page_#{params[:npage]}" |
| 34 | 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 | 36 | end |
| 37 | 37 | end |
| 38 | 38 | ... | ... |
app/controllers/public/search_controller.rb
| ... | ... | @@ -133,7 +133,7 @@ class SearchController < PublicController |
| 133 | 133 | @tag = params[:tag] |
| 134 | 134 | @tag_cache_key = "tag_#{CGI.escape(@tag.to_s)}_env_#{environment.id.to_s}_page_#{params[:npage]}" |
| 135 | 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 | 137 | end |
| 138 | 138 | end |
| 139 | 139 | ... | ... |
app/helpers/tags_helper.rb
| ... | ... | @@ -9,7 +9,7 @@ module TagsHelper |
| 9 | 9 | |
| 10 | 10 | # <tt>tags</tt> must be a hash where the keys are tag names and the values |
| 11 | 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 | 13 | # _('No tags yet.') |
| 14 | 14 | # |
| 15 | 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 | 759 | |
| 760 | 760 | def sanitize_tag_list |
| 761 | 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 | 763 | end |
| 764 | 764 | |
| 765 | 765 | def strip_tag_name(tag_name) | ... | ... |
app/models/profile.rb
| ... | ... | @@ -556,8 +556,8 @@ private :generate_url, :url_options |
| 556 | 556 | end |
| 557 | 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 | 561 | end |
| 562 | 562 | |
| 563 | 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 @@ |
| 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 @@ |
| 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 | 3 | attr_accessible :name, :parent_id, :pending |
| 4 | 4 | |
| ... | ... | @@ -25,7 +25,7 @@ class Tag |
| 25 | 25 | |
| 26 | 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 | 27 | def parent_candidates |
| 28 | - Tag.find(:all) - descendents - [self] | |
| 28 | + ActsAsTaggableOn::Tag.find(:all) - descendents - [self] | |
| 29 | 29 | end |
| 30 | 30 | |
| 31 | 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 | 67 | should 'act as taggable' do |
| 68 | 68 | a = create(Article, :name => 'my article', :profile_id => profile.id) |
| 69 | 69 | a.tag_list = ['one', 'two'] |
| 70 | - tags = a.tag_list.names | |
| 70 | + tags = a.tag_list | |
| 71 | 71 | assert tags.include?('one') |
| 72 | 72 | assert tags.include?('two') |
| 73 | 73 | end |
| ... | ... | @@ -746,7 +746,7 @@ class ArticleTest < ActiveSupport::TestCase |
| 746 | 746 | |
| 747 | 747 | should 'get tagged with tag' do |
| 748 | 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 | 751 | assert_includes as, a |
| 752 | 752 | end |
| ... | ... | @@ -758,7 +758,7 @@ class ArticleTest < ActiveSupport::TestCase |
| 758 | 758 | user_from_other_environment = create_user('other_user', :environment => other_environment).person |
| 759 | 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 | 763 | assert_includes tagged_articles_in_other_environment, article_from_other_enviroment |
| 764 | 764 | assert_not_includes tagged_articles_in_other_environment, article_from_this_environment |
| ... | ... | @@ -859,16 +859,18 @@ class ArticleTest < ActiveSupport::TestCase |
| 859 | 859 | |
| 860 | 860 | should 'sanitize tags after save article' do |
| 861 | 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 | 865 | article.save! |
| 865 | 866 | assert_no_match /[<>]/, article.tags.last.name |
| 866 | 867 | end |
| 867 | 868 | |
| 868 | 869 | should 'strip HTML from tag names after save article' do |
| 869 | 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 | 874 | article.save! |
| 873 | 875 | assert_no_match /</, article.tags.last.name |
| 874 | 876 | end | ... | ... |
test/unit/extended_tag_test.rb
| ... | ... | @@ -4,30 +4,30 @@ require 'extended_tag.rb' |
| 4 | 4 | class UserTest < ActiveSupport::TestCase |
| 5 | 5 | |
| 6 | 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 | 11 | end |
| 12 | 12 | |
| 13 | 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 | 18 | end |
| 19 | 19 | |
| 20 | 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 | 23 | assert ( not tag1.parent_candidates.include?(tag2) ) |
| 24 | 24 | assert tag2.parent_candidates.include?(tag1) |
| 25 | 25 | end |
| 26 | 26 | |
| 27 | 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 | 31 | assert (not tag2.descendents.include?(tag1)) |
| 32 | 32 | assert (not tag1.descendents.include?(tag1)) |
| 33 | 33 | assert tag1.descendents.include?(tag2) | ... | ... |
test/unit/profile_test.rb
| ... | ... | @@ -285,9 +285,9 @@ class ProfileTest < ActiveSupport::TestCase |
| 285 | 285 | second = create(Article, :profile => profile, :tag_list => 'first-tag, second-tag') |
| 286 | 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 | 291 | end |
| 292 | 292 | |
| 293 | 293 | should 'provide tag count' do | ... | ... |
vendor/plugins/acts_as_taggable_on_steroids/CHANGELOG
| ... | ... | @@ -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 | -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 | -= 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 | -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 | -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 | -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 | -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 | -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 | -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 | -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 | -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 | -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 | 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 | -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
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 | -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 | -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 | -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 | -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 |