acts-as-taggable-on 0.0.0 → 1.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. data/CHANGELOG +2 -9
  2. data/README +196 -0
  3. data/Rakefile +10 -47
  4. data/VERSION +1 -1
  5. data/lib/acts-as-taggable-on.rb +6 -30
  6. data/lib/acts_as_taggable_on/acts_as_taggable_on.rb +313 -28
  7. data/lib/acts_as_taggable_on/acts_as_tagger.rb +45 -40
  8. data/lib/acts_as_taggable_on/tag.rb +6 -48
  9. data/lib/acts_as_taggable_on/tag_list.rb +29 -31
  10. data/lib/acts_as_taggable_on/tagging.rb +1 -18
  11. data/lib/acts_as_taggable_on/tags_helper.rb +2 -8
  12. data/rails/init.rb +6 -1
  13. data/spec/acts_as_taggable_on/acts_as_taggable_on_spec.rb +47 -148
  14. data/spec/acts_as_taggable_on/acts_as_tagger_spec.rb +4 -46
  15. data/spec/acts_as_taggable_on/tag_list_spec.rb +0 -29
  16. data/spec/acts_as_taggable_on/tag_spec.rb +7 -95
  17. data/spec/acts_as_taggable_on/taggable_spec.rb +48 -178
  18. data/spec/acts_as_taggable_on/tagger_spec.rb +5 -57
  19. data/spec/acts_as_taggable_on/tagging_spec.rb +1 -25
  20. data/spec/schema.rb +2 -12
  21. data/spec/spec.opts +6 -1
  22. data/spec/spec_helper.rb +34 -35
  23. metadata +7 -31
  24. data/Gemfile +0 -6
  25. data/README.rdoc +0 -212
  26. data/lib/acts_as_taggable_on/acts_as_taggable_on/cache.rb +0 -56
  27. data/lib/acts_as_taggable_on/acts_as_taggable_on/collection.rb +0 -97
  28. data/lib/acts_as_taggable_on/acts_as_taggable_on/core.rb +0 -220
  29. data/lib/acts_as_taggable_on/acts_as_taggable_on/dirty.rb +0 -29
  30. data/lib/acts_as_taggable_on/acts_as_taggable_on/ownership.rb +0 -101
  31. data/lib/acts_as_taggable_on/acts_as_taggable_on/related.rb +0 -64
  32. data/lib/acts_as_taggable_on/compatibility/Gemfile +0 -6
  33. data/lib/acts_as_taggable_on/compatibility/active_record_backports.rb +0 -17
  34. data/lib/generators/acts_as_taggable_on/migration/migration_generator.rb +0 -31
  35. data/lib/generators/acts_as_taggable_on/migration/templates/active_record/migration.rb +0 -28
  36. data/spec/acts_as_taggable_on/tags_helper_spec.rb +0 -28
  37. data/spec/bm.rb +0 -52
  38. data/spec/models.rb +0 -36
@@ -2,73 +2,21 @@ require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
3
  describe "Tagger" do
4
4
  before(:each) do
5
- clean_database!
6
- @user = TaggableUser.create
7
- @taggable = TaggableModel.create(:name => "Bob Jones")
5
+ [TaggableModel, Tag, Tagging, TaggableUser].each(&:delete_all)
6
+ @user = TaggableUser.new
7
+ @taggable = TaggableModel.new(:name => "Bob Jones")
8
8
  end
9
-
9
+
10
10
  it "should have taggings" do
11
11
  @user.tag(@taggable, :with=>'ruby,scheme', :on=>:tags)
12
12
  @user.owned_taggings.size == 2
13
13
  end
14
-
14
+
15
15
  it "should have tags" do
16
16
  @user.tag(@taggable, :with=>'ruby,scheme', :on=>:tags)
17
17
  @user.owned_tags.size == 2
18
18
  end
19
19
 
20
- it "should not overlap tags from different taggers" do
21
- @user2 = TaggableUser.new
22
- lambda{
23
- @user.tag(@taggable, :with => 'ruby, scheme', :on => :tags)
24
- @user2.tag(@taggable, :with => 'java, python, lisp, ruby', :on => :tags)
25
- }.should change(Tagging, :count).by(6)
26
-
27
- [@user, @user2, @taggable].each(&:reload)
28
-
29
- @user.owned_tags.map(&:name).sort.should == %w(ruby scheme).sort
30
- @user2.owned_tags.map(&:name).sort.should == %w(java python lisp ruby).sort
31
-
32
- @taggable.tags_from(@user).sort.should == %w(ruby scheme).sort
33
- @taggable.tags_from(@user2).sort.should == %w(java lisp python ruby).sort
34
-
35
- @taggable.all_tags_list.sort.should == %w(ruby scheme java python lisp).sort
36
- @taggable.all_tags_on(:tags).size.should == 5
37
- end
38
-
39
- it "should not lose tags from different taggers" do
40
- @user2 = TaggableUser.create
41
- @user2.tag(@taggable, :with => 'java, python, lisp, ruby', :on => :tags)
42
- @user.tag(@taggable, :with => 'ruby, scheme', :on => :tags)
43
-
44
- lambda {
45
- @user2.tag(@taggable, :with => 'java, python, lisp', :on => :tags)
46
- }.should change(Tagging, :count).by(-1)
47
-
48
- [@user, @user2, @taggable].each(&:reload)
49
-
50
- @taggable.tags_from(@user).sort.should == %w(ruby scheme).sort
51
- @taggable.tags_from(@user2).sort.should == %w(java python lisp).sort
52
-
53
- @taggable.all_tags_list.sort.should == %w(ruby scheme java python lisp).sort
54
- @taggable.all_tags_on(:tags).length.should == 5
55
- end
56
-
57
- it "should not lose tags" do
58
- @user2 = TaggableUser.create
59
-
60
- @user.tag(@taggable, :with => 'awesome', :on => :tags)
61
- @user2.tag(@taggable, :with => 'awesome, epic', :on => :tags)
62
-
63
- lambda {
64
- @user2.tag(@taggable, :with => 'epic', :on => :tags)
65
- }.should change(Tagging, :count).by(-1)
66
-
67
- @taggable.reload
68
- @taggable.all_tags_list.should include('awesome')
69
- @taggable.all_tags_list.should include('epic')
70
- end
71
-
72
20
  it "is tagger" do
73
21
  @user.is_tagger?.should(be_true)
74
22
  end
@@ -2,30 +2,6 @@ require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
3
  describe Tagging do
4
4
  before(:each) do
5
- clean_database!
6
5
  @tagging = Tagging.new
7
6
  end
8
-
9
- it "should not be valid with a invalid tag" do
10
- @tagging.taggable = TaggableModel.create(:name => "Bob Jones")
11
- @tagging.tag = Tag.new(:name => "")
12
- @tagging.context = "tags"
13
-
14
- @tagging.should_not be_valid
15
-
16
- if ActiveRecord::VERSION::MAJOR >= 3
17
- @tagging.errors[:tag_id].should == ["can't be blank"]
18
- else
19
- @tagging.errors[:tag_id].should == "can't be blank"
20
- end
21
- end
22
-
23
- it "should not create duplicate taggings" do
24
- @taggable = TaggableModel.create(:name => "Bob Jones")
25
- @tag = Tag.create(:name => "awesome")
26
-
27
- lambda {
28
- 2.times { Tagging.create(:taggable => @taggable, :tag => @tag, :context => 'tags') }
29
- }.should change(Tagging, :count).by(1)
30
- end
31
- end
7
+ end
@@ -19,24 +19,14 @@ ActiveRecord::Schema.define :version => 0 do
19
19
  create_table :taggable_models, :force => true do |t|
20
20
  t.column :name, :string
21
21
  t.column :type, :string
22
+ #t.column :cached_tag_list, :string
22
23
  end
23
-
24
- create_table :cached_models, :force => true do |t|
25
- t.column :name, :string
26
- t.column :type, :string
27
- t.column :cached_tag_list, :string
28
- end
29
-
30
24
  create_table :taggable_users, :force => true do |t|
31
25
  t.column :name, :string
32
26
  end
33
-
34
27
  create_table :other_taggable_models, :force => true do |t|
35
28
  t.column :name, :string
36
29
  t.column :type, :string
37
- end
38
-
39
- create_table :untaggable_models, :force => true do |t|
40
- t.column :name, :string
30
+ #t.column :cached_tag_list, :string
41
31
  end
42
32
  end
@@ -1,2 +1,7 @@
1
1
  --colour
2
- --backtrace
2
+ --format
3
+ specdoc
4
+ --loadby
5
+ mtime
6
+ --reverse
7
+ --backtrace
@@ -1,47 +1,46 @@
1
- begin
2
- # Try to require the preresolved locked set of gems.
3
- require File.expand_path("../.bundle/environment", __FILE__)
4
- rescue LoadError
5
- # Fall back on doing an unlocked resolve at runtime.
6
- require "rubygems" unless RUBY_VERSION >= "1.9"
7
- require "bundler"
8
- Bundler.setup
1
+ # require File.dirname(__FILE__) + '/../../../../spec/spec_helper'
2
+ require 'rubygems'
3
+ require 'active_support'
4
+ require 'active_record'
5
+ require 'spec'
6
+
7
+ module Spec::Example::ExampleGroupMethods
8
+ alias :context :describe
9
9
  end
10
10
 
11
- Bundler.require
12
- require File.expand_path('../../lib/acts-as-taggable-on', __FILE__)
11
+ TEST_DATABASE_FILE = File.join(File.dirname(__FILE__), '..', 'test.sqlite3')
12
+
13
+ File.unlink(TEST_DATABASE_FILE) if File.exist?(TEST_DATABASE_FILE)
14
+ ActiveRecord::Base.establish_connection(
15
+ "adapter" => "sqlite3", "database" => TEST_DATABASE_FILE
16
+ )
17
+
18
+ RAILS_DEFAULT_LOGGER = Logger.new(File.join(File.dirname(__FILE__), "debug.log"))
13
19
 
14
- if defined?(Rspec::Core::ExampleGroupSubject)
15
- module Rspec::Core::ExampleGroupSubject
16
- alias :context :describe
17
- end
20
+ load(File.dirname(__FILE__) + '/schema.rb')
21
+
22
+ $: << File.join(File.dirname(__FILE__), '..', 'lib')
23
+ require File.join(File.dirname(__FILE__), '..', 'init')
24
+
25
+ class TaggableModel < ActiveRecord::Base
26
+ acts_as_taggable_on :tags, :languages
27
+ acts_as_taggable_on :skills
18
28
  end
19
29
 
20
- class Array
21
- def freq
22
- k=Hash.new(0)
23
- each {|e| k[e]+=1}
24
- k
25
- end
30
+ class OtherTaggableModel < ActiveRecord::Base
31
+ acts_as_taggable_on :tags, :languages
26
32
  end
27
33
 
28
- # Setup a database
29
- TEST_DATABASE_FILE = File.join(File.dirname(__FILE__), '..', 'test.sqlite3')
30
- File.unlink(TEST_DATABASE_FILE) if File.exist?(TEST_DATABASE_FILE)
31
- ActiveRecord::Base.establish_connection :adapter => 'sqlite3', :database => TEST_DATABASE_FILE
34
+ class InheritingTaggableModel < TaggableModel
35
+ end
32
36
 
33
- ActiveRecord::Base.silence do
34
- ActiveRecord::Migration.verbose = false
35
- load(File.dirname(__FILE__) + '/schema.rb')
36
- load(File.dirname(__FILE__) + '/models.rb')
37
+ class AlteredInheritingTaggableModel < TaggableModel
38
+ acts_as_taggable_on :parts
37
39
  end
38
40
 
39
- def clean_database!
40
- models = [Tag, Tagging, TaggableModel, OtherTaggableModel, InheritingTaggableModel,
41
- AlteredInheritingTaggableModel, TaggableUser, UntaggableModel]
42
- models.each do |model|
43
- model.destroy_all
44
- end
41
+ class TaggableUser < ActiveRecord::Base
42
+ acts_as_tagger
45
43
  end
46
44
 
47
- clean_database!
45
+ class UntaggableModel < ActiveRecord::Base
46
+ end
metadata CHANGED
@@ -1,12 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: acts-as-taggable-on
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 0
8
- - 0
9
- version: 0.0.0
4
+ version: 1.0.6
10
5
  platform: ruby
11
6
  authors:
12
7
  - Michael Bleigh
@@ -14,7 +9,7 @@ autorequire:
14
9
  bindir: bin
15
10
  cert_chain: []
16
11
 
17
- date: 2010-03-25 00:00:00 +01:00
12
+ date: 2009-10-14 00:00:00 -04:00
18
13
  default_executable:
19
14
  dependencies: []
20
15
 
@@ -25,31 +20,20 @@ executables: []
25
20
  extensions: []
26
21
 
27
22
  extra_rdoc_files:
28
- - README.rdoc
23
+ - README
29
24
  files:
30
25
  - CHANGELOG
31
- - Gemfile
32
26
  - MIT-LICENSE
33
- - README.rdoc
27
+ - README
34
28
  - Rakefile
35
29
  - VERSION
36
30
  - lib/acts-as-taggable-on.rb
37
31
  - lib/acts_as_taggable_on/acts_as_taggable_on.rb
38
- - lib/acts_as_taggable_on/acts_as_taggable_on/cache.rb
39
- - lib/acts_as_taggable_on/acts_as_taggable_on/collection.rb
40
- - lib/acts_as_taggable_on/acts_as_taggable_on/core.rb
41
- - lib/acts_as_taggable_on/acts_as_taggable_on/dirty.rb
42
- - lib/acts_as_taggable_on/acts_as_taggable_on/ownership.rb
43
- - lib/acts_as_taggable_on/acts_as_taggable_on/related.rb
44
32
  - lib/acts_as_taggable_on/acts_as_tagger.rb
45
- - lib/acts_as_taggable_on/compatibility/Gemfile
46
- - lib/acts_as_taggable_on/compatibility/active_record_backports.rb
47
33
  - lib/acts_as_taggable_on/tag.rb
48
34
  - lib/acts_as_taggable_on/tag_list.rb
49
35
  - lib/acts_as_taggable_on/tagging.rb
50
36
  - lib/acts_as_taggable_on/tags_helper.rb
51
- - lib/generators/acts_as_taggable_on/migration/migration_generator.rb
52
- - lib/generators/acts_as_taggable_on/migration/templates/active_record/migration.rb
53
37
  - rails/init.rb
54
38
  - spec/acts_as_taggable_on/acts_as_taggable_on_spec.rb
55
39
  - spec/acts_as_taggable_on/acts_as_tagger_spec.rb
@@ -58,9 +42,6 @@ files:
58
42
  - spec/acts_as_taggable_on/taggable_spec.rb
59
43
  - spec/acts_as_taggable_on/tagger_spec.rb
60
44
  - spec/acts_as_taggable_on/tagging_spec.rb
61
- - spec/acts_as_taggable_on/tags_helper_spec.rb
62
- - spec/bm.rb
63
- - spec/models.rb
64
45
  - spec/schema.rb
65
46
  - spec/spec.opts
66
47
  - spec/spec_helper.rb
@@ -77,20 +58,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
77
58
  requirements:
78
59
  - - ">="
79
60
  - !ruby/object:Gem::Version
80
- segments:
81
- - 0
82
61
  version: "0"
62
+ version:
83
63
  required_rubygems_version: !ruby/object:Gem::Requirement
84
64
  requirements:
85
65
  - - ">="
86
66
  - !ruby/object:Gem::Version
87
- segments:
88
- - 0
89
67
  version: "0"
68
+ version:
90
69
  requirements: []
91
70
 
92
71
  rubyforge_project:
93
- rubygems_version: 1.3.6
72
+ rubygems_version: 1.3.5
94
73
  signing_key:
95
74
  specification_version: 3
96
75
  summary: ActsAsTaggableOn is a tagging plugin for Rails that provides multiple tagging contexts on a single model.
@@ -102,8 +81,5 @@ test_files:
102
81
  - spec/acts_as_taggable_on/taggable_spec.rb
103
82
  - spec/acts_as_taggable_on/tagger_spec.rb
104
83
  - spec/acts_as_taggable_on/tagging_spec.rb
105
- - spec/acts_as_taggable_on/tags_helper_spec.rb
106
- - spec/bm.rb
107
- - spec/models.rb
108
84
  - spec/schema.rb
109
85
  - spec/spec_helper.rb
data/Gemfile DELETED
@@ -1,6 +0,0 @@
1
- source :gemcutter
2
-
3
- # Rails 3.0
4
- gem 'rails', '3.0.0.beta'
5
- gem 'rspec', '2.0.0.beta.1'
6
- gem 'sqlite3-ruby', '1.2.5', :require => 'sqlite3'
@@ -1,212 +0,0 @@
1
- = ActsAsTaggableOn
2
-
3
- This plugin was originally based on Acts as Taggable on Steroids by Jonathan Viney.
4
- It has evolved substantially since that point, but all credit goes to him for the
5
- initial tagging functionality that so many people have used.
6
-
7
- For instance, in a social network, a user might have tags that are called skills,
8
- interests, sports, and more. There is no real way to differentiate between tags and
9
- so an implementation of this type is not possible with acts as taggable on steroids.
10
-
11
- Enter Acts as Taggable On. Rather than tying functionality to a specific keyword
12
- (namely "tags"), acts as taggable on allows you to specify an arbitrary number of
13
- tag "contexts" that can be used locally or in combination in the same way steroids
14
- was used.
15
-
16
- == Installation
17
-
18
- === Plugin
19
-
20
- Acts As Taggable On is available both as a gem and as a traditional plugin. For the
21
- traditional plugin you can install like so (Rails 2.1 or later):
22
-
23
- script/plugin install git://github.com/mbleigh/acts-as-taggable-on.git
24
-
25
- === GemPlugin
26
-
27
- Acts As Taggable On is also available as a gem plugin using Rails 2.1's gem dependencies.
28
- To install the gem, add this to your config/environment.rb:
29
-
30
- config.gem "acts-as-taggable-on", :source => "http://gemcutter.org"
31
-
32
- After that, you can run "rake gems:install" to install the gem if you don't already have it.
33
-
34
- == Rails 3.0
35
-
36
- Acts As Taggable On is now useable in Rails 3.0, thanks to the excellent work of Szymon Nowak
37
- and Jelle Vandebeeck. Because backwards compatibility is hard to maintain, their work is available
38
- in the feature/rails3_compatibility branch.
39
-
40
- A Rails 3.0 compatible version of the gem is also available:
41
-
42
- gem install acts-as-taggable-on -v=2.0.0.pre1
43
-
44
- === Post Installation (Rails)
45
-
46
- 1. script/generate acts_as_taggable_on_migration
47
- 2. rake db:migrate
48
-
49
- === Testing
50
-
51
- Acts As Taggable On uses RSpec for its test coverage. Inside the plugin
52
- directory, you can run the specs with:
53
-
54
- rake spec
55
-
56
- If you already have RSpec on your application, the specs will run while using:
57
-
58
- rake spec:plugins
59
-
60
-
61
- == Usage
62
-
63
- class User < ActiveRecord::Base
64
- acts_as_taggable_on :tags, :skills, :interests
65
- end
66
-
67
- @user = User.new(:name => "Bobby")
68
- @user.tag_list = "awesome, slick, hefty" # this should be familiar
69
- @user.skill_list = "joking, clowning, boxing" # but you can do it for any context!
70
- @user.skill_list # => ["joking","clowning","boxing"] as TagList
71
- @user.save
72
-
73
- @user.tags # => [<Tag name:"awesome">,<Tag name:"slick">,<Tag name:"hefty">]
74
- @user.skills # => [<Tag name:"joking">,<Tag name:"clowning">,<Tag name:"boxing">]
75
-
76
- # The old way
77
- User.find_tagged_with("awesome", :on => :tags) # => [@user]
78
- User.find_tagged_with("awesome", :on => :skills) # => []
79
-
80
- # The better way (utilizes named_scope)
81
- User.tagged_with("awesome", :on => :tags) # => [@user]
82
- User.tagged_with("awesome", :on => :skills) # => []
83
-
84
- @frankie = User.create(:name => "Frankie", :skill_list => "joking, flying, eating")
85
- User.skill_counts # => [<Tag name="joking" count=2>,<Tag name="clowning" count=1>...]
86
- @frankie.skill_counts
87
-
88
- === Finding Tagged Objects
89
-
90
- Acts As Taggable On utilizes Rails 2.1's named_scope to create an association
91
- for tags. This way you can mix and match to filter down your results, and it
92
- also improves compatibility with the will_paginate gem:
93
-
94
- class User < ActiveRecord::Base
95
- acts_as_taggable_on :tags
96
- named_scope :by_join_date, :order => "created_at DESC"
97
- end
98
-
99
- User.tagged_with("awesome").by_date
100
- User.tagged_with("awesome").by_date.paginate(:page => params[:page], :per_page => 20)
101
-
102
- #Find a user with matching all tags, not just one
103
- User.tagged_with(["awesome", "cool"], :match_all => :true)
104
-
105
- === Relationships
106
-
107
- You can find objects of the same type based on similar tags on certain contexts.
108
- Also, objects will be returned in descending order based on the total number of
109
- matched tags.
110
-
111
- @bobby = User.find_by_name("Bobby")
112
- @bobby.skill_list # => ["jogging", "diving"]
113
-
114
- @frankie = User.find_by_name("Frankie")
115
- @frankie.skill_list # => ["hacking"]
116
-
117
- @tom = User.find_by_name("Tom")
118
- @tom.skill_list # => ["hacking", "jogging", "diving"]
119
-
120
- @tom.find_related_skills # => [<User name="Bobby">,<User name="Frankie">]
121
- @bobby.find_related_skills # => [<User name="Tom">]
122
- @frankie.find_related_skills # => [<User name="Tom">]
123
-
124
- === Dynamic Tag Contexts
125
-
126
- In addition to the generated tag contexts in the definition, it is also possible
127
- to allow for dynamic tag contexts (this could be user generated tag contexts!)
128
-
129
- @user = User.new(:name => "Bobby")
130
- @user.set_tag_list_on(:customs, "same, as, tag, list")
131
- @user.tag_list_on(:customs) # => ["same","as","tag","list"]
132
- @user.save
133
- @user.tags_on(:customs) # => [<Tag name='same'>,...]
134
- @user.tag_counts_on(:customs)
135
- User.find_tagged_with("same", :on => :customs) # => [@user]
136
-
137
- === Tag Ownership
138
-
139
- Tags can have owners:
140
-
141
- class User < ActiveRecord::Base
142
- acts_as_tagger
143
- end
144
-
145
- class Photo < ActiveRecord::Base
146
- acts_as_taggable_on :locations
147
- end
148
-
149
- @some_user.tag(@some_photo, :with => "paris, normandy", :on => :locations)
150
- @some_user.owned_taggings
151
- @some_user.owned_tags
152
- @some_photo.locations_from(@some_user)
153
-
154
- === Tag cloud calculations
155
-
156
- To construct tag clouds, the frequency of each tag needs to be calculated.
157
- Because we specified +acts_as_taggable_on+ on the <tt>User</tt> class, we can
158
- get a calculation of all the tag counts by using <tt>User.tag_counts_on(:customs)</tt>. But what if we wanted a tag count for
159
- an single user's posts? To achieve this we call tag_counts on the association:
160
-
161
- User.find(:first).posts.tag_counts_on(:tags)
162
-
163
- A helper is included to assist with generating tag clouds.
164
-
165
- Here is an example that generates a tag cloud.
166
-
167
- Helper:
168
-
169
- module PostsHelper
170
- include TagsHelper
171
- end
172
-
173
- Controller:
174
-
175
- class PostController < ApplicationController
176
- def tag_cloud
177
- @tags = Post.tag_counts_on(:tags)
178
- end
179
- end
180
-
181
- View:
182
-
183
- <% tag_cloud(@tags, %w(css1 css2 css3 css4)) do |tag, css_class| %>
184
- <%= link_to tag.name, { :action => :tag, :id => tag.name }, :class => css_class %>
185
- <% end %>
186
-
187
- CSS:
188
-
189
- .css1 { font-size: 1.0em; }
190
- .css2 { font-size: 1.2em; }
191
- .css3 { font-size: 1.4em; }
192
- .css4 { font-size: 1.6em; }
193
-
194
- == Contributors
195
-
196
- * TomEric (i76) - Maintainer
197
- * Michael Bleigh - Original Author
198
- * Brendan Lim - Related Objects
199
- * Pradeep Elankumaran - Taggers
200
- * Sinclair Bain - Patch King
201
-
202
- == Patch Contributors
203
-
204
- * tristanzdunn - Related objects of other classes
205
- * azabaj - Fixed migrate down
206
- * Peter Cooper - named_scope fix
207
- * slainer68 - STI fix
208
- * harrylove - migration instructions and fix-ups
209
- * lawrencepit - cached tag work
210
- * sobrinho - fixed tag_cloud helper
211
-
212
- Copyright (c) 2007-2009 Michael Bleigh (http://mbleigh.com/) and Intridea Inc. (http://intridea.com/), released under the MIT license