Commit 1e6dcfa7ca80a1439cb0e8eb01e216040254fa16
1 parent
c4832b5f
Exists in
staging
and in
42 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 |