acts-as-taggable-on-padrino 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. data/.rspec +2 -0
  2. data/CHANGELOG +29 -0
  3. data/Gemfile +15 -0
  4. data/MIT-LICENSE +20 -0
  5. data/README.rdoc +194 -0
  6. data/Rakefile +33 -0
  7. data/VERSION +1 -0
  8. data/acts-as-taggable-on-padrino.gemspec +94 -0
  9. data/lib/acts-as-taggable-on-padrino.rb +41 -0
  10. data/lib/acts_as_taggable_on_padrino/tag.rb +72 -0
  11. data/lib/acts_as_taggable_on_padrino/taggable.rb +64 -0
  12. data/lib/acts_as_taggable_on_padrino/taggable/cache.rb +54 -0
  13. data/lib/acts_as_taggable_on_padrino/taggable/collection.rb +91 -0
  14. data/lib/acts_as_taggable_on_padrino/taggable/core.rb +244 -0
  15. data/lib/acts_as_taggable_on_padrino/taggable/ownership.rb +104 -0
  16. data/lib/acts_as_taggable_on_padrino/taggable/related.rb +60 -0
  17. data/lib/acts_as_taggable_on_padrino/taggable/tag_list.rb +96 -0
  18. data/lib/acts_as_taggable_on_padrino/tagger.rb +65 -0
  19. data/lib/acts_as_taggable_on_padrino/tagging.rb +29 -0
  20. data/lib/acts_as_taggable_on_padrino/tags_helper.rb +17 -0
  21. data/lib/tasks/generate_migration.rb +23 -0
  22. data/lib/tasks/templates/migration.rb +29 -0
  23. data/spec/acts_as_taggable_on_padrino/acts_as_taggable_on_spec.rb +263 -0
  24. data/spec/acts_as_taggable_on_padrino/acts_as_tagger_spec.rb +110 -0
  25. data/spec/acts_as_taggable_on_padrino/tag_list_spec.rb +70 -0
  26. data/spec/acts_as_taggable_on_padrino/tag_spec.rb +105 -0
  27. data/spec/acts_as_taggable_on_padrino/taggable_spec.rb +333 -0
  28. data/spec/acts_as_taggable_on_padrino/tagger_spec.rb +90 -0
  29. data/spec/acts_as_taggable_on_padrino/tagging_spec.rb +26 -0
  30. data/spec/acts_as_taggable_on_padrino/tags_helper_spec.rb +26 -0
  31. data/spec/bm.rb +52 -0
  32. data/spec/database.yml.sample +17 -0
  33. data/spec/models.rb +47 -0
  34. data/spec/schema.rb +57 -0
  35. data/spec/spec_helper.rb +60 -0
  36. data/uninstall.rb +1 -0
  37. metadata +175 -0
@@ -0,0 +1,90 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ describe "Tagger" do
4
+ before(:each) do
5
+ @user = TaggableUser.create
6
+ @taggable = TaggableModel.create(:name => "Bob Jones")
7
+ end
8
+
9
+ it "should have taggings" do
10
+ @user.tag(@taggable, :with=>'ruby,scheme', :on=>:tags)
11
+ @user.owned_taggings.size == 2
12
+ end
13
+
14
+ it "should have tags" do
15
+ @user.tag(@taggable, :with=>'ruby,scheme', :on=>:tags)
16
+ @user.owned_tags.size == 2
17
+ end
18
+
19
+ it "should not overlap tags from different taggers" do
20
+ @user2 = TaggableUser.new
21
+ lambda{
22
+ @user.tag(@taggable, :with => 'ruby, scheme', :on => :tags)
23
+ @user2.tag(@taggable, :with => 'java, python, lisp, ruby', :on => :tags)
24
+ }.should change(Tagging, :count).by(6)
25
+
26
+ [@user, @user2, @taggable].each(&:reload)
27
+
28
+ @user.owned_tags.names.sort.should == %w(ruby scheme).sort
29
+ @user2.owned_tags.names.sort.should == %w(java python lisp ruby).sort
30
+
31
+ @taggable.tags_from(@user).sort.should == %w(ruby scheme).sort
32
+ @taggable.tags_from(@user2).sort.should == %w(java lisp python ruby).sort
33
+
34
+ @taggable.all_tags_list.sort.should == %w(ruby scheme java python lisp).sort
35
+ @taggable.all_tags_on(:tags).all.size.should == 5
36
+ end
37
+
38
+ it "should not lose tags from different taggers" do
39
+ @user2 = TaggableUser.create
40
+ @user2.tag(@taggable, :with => 'java, python, lisp, ruby', :on => :tags)
41
+ @user.tag(@taggable, :with => 'ruby, scheme', :on => :tags)
42
+
43
+ lambda {
44
+ @user2.tag(@taggable, :with => 'java, python, lisp', :on => :tags)
45
+ }.should change(Tagging, :count).by(-1)
46
+
47
+ [@user, @user2, @taggable].each(&:reload)
48
+
49
+ @taggable.tags_from(@user).sort.should == %w(ruby scheme).sort
50
+ @taggable.tags_from(@user2).sort.should == %w(java python lisp).sort
51
+
52
+ @taggable.all_tags_list.sort.should == %w(ruby scheme java python lisp).sort
53
+ @taggable.all_tags_on(:tags).length.should == 5
54
+ end
55
+
56
+ it "should not lose tags" do
57
+ @user2 = TaggableUser.create
58
+
59
+ @user.tag(@taggable, :with => 'awesome', :on => :tags)
60
+ @user2.tag(@taggable, :with => 'awesome, epic', :on => :tags)
61
+
62
+ lambda {
63
+ @user2.tag(@taggable, :with => 'epic', :on => :tags)
64
+ }.should change(Tagging, :count).by(-1)
65
+
66
+ @taggable.reload
67
+ @taggable.all_tags_list.should include('awesome')
68
+ @taggable.all_tags_list.should include('epic')
69
+ end
70
+
71
+ it "should not lose tags" do
72
+ @taggable.update_attributes(:tag_list => 'ruby')
73
+ @user.tag(@taggable, :with => 'ruby, scheme', :on => :tags)
74
+
75
+ [@taggable, @user].each(&:reload)
76
+ @taggable.tag_list.should == %w(ruby)
77
+ @taggable.all_tags_list.sort.should == %w(ruby scheme).sort
78
+
79
+ lambda {
80
+ @taggable.update_attributes(:tag_list => "")
81
+ }.should change(Tagging, :count).by(-1)
82
+
83
+ @taggable.tag_list.should == []
84
+ @taggable.all_tags_list.sort.should == %w(ruby scheme).sort
85
+ end
86
+
87
+ it "is tagger" do
88
+ @user.is_tagger?.should(be_true)
89
+ end
90
+ end
@@ -0,0 +1,26 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ describe ActsAsTaggableOn::Tagging do
4
+ before(:each) do
5
+ @tagging = TestTagging.new
6
+ end
7
+
8
+ it "should not be valid with a invalid tag" do
9
+ @tagging.taggable = TaggableModel.create(:name => "Bob Jones")
10
+ @tagging.tag = TestTag.new(:name => "")
11
+ @tagging.context = "tags"
12
+
13
+ @tagging.should_not be_valid
14
+
15
+ @tagging.errors[:tag_id].should == ["can't be blank"]
16
+ end
17
+
18
+ it "should not create duplicate taggings" do
19
+ @taggable = TaggableModel.create(:name => "Bob Jones")
20
+ @tag = TestTag.create(:name => "awesome")
21
+
22
+ lambda {
23
+ 2.times { TestTagging.create(:taggable => @taggable, :tag => @tag, :context => 'tags') }
24
+ }.should change(TestTagging, :count).by(1)
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ describe ActsAsTaggableOn::TagsHelper do
4
+ before(:each) do
5
+ @bob = TaggableModel.create(:name => "Bob Jones", :language_list => "ruby, php")
6
+ @tom = TaggableModel.create(:name => "Tom Marley", :language_list => "ruby, java")
7
+ @eve = TaggableModel.create(:name => "Eve Nodd", :language_list => "ruby, c++")
8
+
9
+ @helper = class Helper
10
+ include ActsAsTaggableOn::TagsHelper
11
+ end.new
12
+ end
13
+
14
+ it "should yield the proper css classes" do
15
+ tags = { }
16
+
17
+ @helper.tag_cloud(TaggableModel.tag_counts_on(:languages), ["sucky", "awesome"]) do |tag, css_class|
18
+ tags[tag.name] = css_class
19
+ end
20
+
21
+ tags["ruby"].should == "awesome"
22
+ tags["java"].should == "sucky"
23
+ tags["c++"].should == "sucky"
24
+ tags["php"].should == "sucky"
25
+ end
26
+ end
data/spec/bm.rb ADDED
@@ -0,0 +1,52 @@
1
+ require 'active_record'
2
+ require 'action_view'
3
+ require File.expand_path('../../lib/acts-as-taggable-on-padrino', __FILE__)
4
+
5
+ if defined?(ActiveRecord::Acts::TaggableOn)
6
+ ActiveRecord::Base.send :include, ActiveRecord::Acts::TaggableOn
7
+ ActiveRecord::Base.send :include, ActiveRecord::Acts::Tagger
8
+ ActionView::Base.send :include, TagsHelper if defined?(ActionView::Base)
9
+ end
10
+
11
+ TEST_DATABASE_FILE = File.join(File.dirname(__FILE__), '..', 'test.sqlite3')
12
+ File.unlink(TEST_DATABASE_FILE) if File.exist?(TEST_DATABASE_FILE)
13
+ ActiveRecord::Base.establish_connection :adapter => 'sqlite3', :database => TEST_DATABASE_FILE
14
+
15
+ ActiveRecord::Base.silence do
16
+ ActiveRecord::Migration.verbose = false
17
+ ActiveRecord::Schema.define :version => 0 do
18
+ create_table "taggings", :force => true do |t|
19
+ t.integer "tag_id", :limit => 11
20
+ t.integer "taggable_id", :limit => 11
21
+ t.string "taggable_type"
22
+ t.string "context"
23
+ t.datetime "created_at"
24
+ t.integer "tagger_id", :limit => 11
25
+ t.string "tagger_type"
26
+ end
27
+
28
+ add_index "taggings", ["tag_id"], :name => "index_taggings_on_tag_id"
29
+ add_index "taggings", ["taggable_id", "taggable_type", "context"], :name => "index_taggings_on_taggable_id_and_taggable_type_and_context"
30
+
31
+ create_table "tags", :force => true do |t|
32
+ t.string "name"
33
+ end
34
+
35
+ create_table :taggable_models, :force => true do |t|
36
+ t.column :name, :string
37
+ t.column :type, :string
38
+ t.column :cached_tag_list, :string
39
+ end
40
+ end
41
+
42
+ class TaggableModel < ActiveRecord::Base
43
+ acts_as_taggable
44
+ acts_as_taggable_on :languages
45
+ acts_as_taggable_on :skills
46
+ acts_as_taggable_on :needs, :offerings
47
+ end
48
+ end
49
+
50
+ puts Benchmark.measure {
51
+ 1000.times { TaggableModel.create :tag_list => "awesome, epic, neat" }
52
+ }
@@ -0,0 +1,17 @@
1
+ sqlite3:
2
+ adapter: sqlite3
3
+ database: acts_as_taggable_on.sqlite3
4
+
5
+ mysql:
6
+ adapter: mysql
7
+ hostname: localhost
8
+ username: root
9
+ password:
10
+ database: acts_as_taggable_on
11
+
12
+ postgresql:
13
+ adapter: postgresql
14
+ hostname: localhost
15
+ username: postgres
16
+ password:
17
+ database: acts_as_taggable_on
data/spec/models.rb ADDED
@@ -0,0 +1,47 @@
1
+ class Tag < ActiveRecord::Base
2
+ acts_as_tag
3
+ end
4
+
5
+ class TestTag < ActiveRecord::Base
6
+ acts_as_tag
7
+ end
8
+
9
+ class Tagging < ActiveRecord::Base
10
+ acts_as_tagging
11
+ end
12
+
13
+ class TestTagging < ActiveRecord::Base
14
+ acts_as_tagging :tag => 'TestTag'
15
+ end
16
+
17
+ class TaggableModel < ActiveRecord::Base
18
+ acts_as_taggable
19
+ acts_as_taggable_on :languages
20
+ acts_as_taggable_on :skills
21
+ acts_as_taggable_on :needs, :offerings
22
+ has_many :untaggable_models
23
+ end
24
+
25
+ class CachedModel < ActiveRecord::Base
26
+ acts_as_taggable
27
+ end
28
+
29
+ class OtherTaggableModel < ActiveRecord::Base
30
+ acts_as_taggable_on :tags, :languages
31
+ acts_as_taggable_on :needs, :offerings
32
+ end
33
+
34
+ class InheritingTaggableModel < TaggableModel
35
+ end
36
+
37
+ class AlteredInheritingTaggableModel < TaggableModel
38
+ acts_as_taggable_on :parts
39
+ end
40
+
41
+ class TaggableUser < ActiveRecord::Base
42
+ acts_as_tagger
43
+ end
44
+
45
+ class UntaggableModel < ActiveRecord::Base
46
+ belongs_to :taggable_model
47
+ end
data/spec/schema.rb ADDED
@@ -0,0 +1,57 @@
1
+ ActiveRecord::Schema.define :version => 0 do
2
+ create_table "taggings", :force => true do |t|
3
+ t.integer "tag_id", :limit => 11
4
+ t.integer "taggable_id", :limit => 11
5
+ t.string "taggable_type"
6
+ t.string "context"
7
+ t.datetime "created_at"
8
+ t.integer "tagger_id", :limit => 11
9
+ t.string "tagger_type"
10
+ end
11
+
12
+ add_index "taggings", ["tag_id"], :name => "index_taggings_on_tag_id"
13
+ add_index "taggings", ["taggable_id", "taggable_type", "context"], :name => "index_taggings_on_taggable_id_and_taggable_type_and_context"
14
+
15
+ create_table "tags", :force => true do |t|
16
+ t.string "name"
17
+ end
18
+
19
+ create_table "test_tags", :force => true do |t|
20
+ t.string "name"
21
+ end
22
+
23
+ create_table "test_taggings", :force => true do |t|
24
+ t.integer "tag_id", :limit => 11
25
+ t.integer "taggable_id", :limit => 11
26
+ t.string "taggable_type"
27
+ t.string "context"
28
+ t.datetime "created_at"
29
+ t.integer "tagger_id", :limit => 11
30
+ t.string "tagger_type"
31
+ end
32
+
33
+ create_table :taggable_models, :force => true do |t|
34
+ t.column :name, :string
35
+ t.column :type, :string
36
+ end
37
+
38
+ create_table :untaggable_models, :force => true do |t|
39
+ t.column :taggable_model_id, :integer
40
+ t.column :name, :string
41
+ end
42
+
43
+ create_table :cached_models, :force => true do |t|
44
+ t.column :name, :string
45
+ t.column :type, :string
46
+ t.column :cached_tag_list, :string
47
+ end
48
+
49
+ create_table :taggable_users, :force => true do |t|
50
+ t.column :name, :string
51
+ end
52
+
53
+ create_table :other_taggable_models, :force => true do |t|
54
+ t.column :name, :string
55
+ t.column :type, :string
56
+ end
57
+ end
@@ -0,0 +1,60 @@
1
+ $LOAD_PATH << "." unless $LOAD_PATH.include?(".")
2
+
3
+ begin
4
+ require "rubygems"
5
+ require "bundler"
6
+
7
+ if Gem::Version.new(Bundler::VERSION) <= Gem::Version.new("0.9.5")
8
+ raise RuntimeError, "Your bundler version is too old." +
9
+ "Run `gem install bundler` to upgrade."
10
+ end
11
+
12
+ # Set up load paths for all bundled gems
13
+ Bundler.setup
14
+ rescue Bundler::GemNotFound
15
+ raise RuntimeError, "Bundler couldn't find some gems." +
16
+ "Did you run \`bundlee install\`?"
17
+ end
18
+
19
+ Bundler.require
20
+ require File.expand_path('../../lib/acts-as-taggable-on-padrino', __FILE__)
21
+
22
+ unless [].respond_to?(:freq)
23
+ class Array
24
+ def freq
25
+ k=Hash.new(0)
26
+ each {|e| k[e]+=1}
27
+ k
28
+ end
29
+ end
30
+ end
31
+
32
+ ENV['DB'] ||= 'sqlite3'
33
+
34
+ database_yml = File.expand_path('../database.yml', __FILE__)
35
+ if !File.exists?(database_yml)
36
+ raise "Please create #{database_yml} first to configure your database. Take a look at: #{database_yml}.sample"
37
+ end
38
+
39
+ active_record_configuration = YAML.load_file(database_yml)[ENV['DB']]
40
+
41
+ require 'active_support/core_ext/logger'
42
+ ActiveRecord::Base.establish_connection(active_record_configuration)
43
+ ActiveRecord::Base.logger = Logger.new(File.join(File.dirname(__FILE__), "debug.log"))
44
+
45
+ ActiveRecord::Base.silence do
46
+ ActiveRecord::Migration.verbose = false
47
+
48
+ load(File.dirname(__FILE__) + '/schema.rb')
49
+ load(File.dirname(__FILE__) + '/models.rb')
50
+ end
51
+
52
+ require 'database_cleaner'
53
+ DatabaseCleaner.strategy = :truncation
54
+ DatabaseCleaner.start
55
+
56
+ RSpec.configure do |config|
57
+ config.after(:each) do
58
+ DatabaseCleaner.clean
59
+ end
60
+ end
data/uninstall.rb ADDED
@@ -0,0 +1 @@
1
+ # Uninstall hook code here
metadata ADDED
@@ -0,0 +1,175 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: acts-as-taggable-on-padrino
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Michael Bleigh
9
+ - John Knott
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2011-06-29 00:00:00.000000000 +01:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: activerecord
18
+ requirement: &14321000 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ! '>='
22
+ - !ruby/object:Gem::Version
23
+ version: 3.0.0
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: *14321000
27
+ - !ruby/object:Gem::Dependency
28
+ name: sqlite3-ruby
29
+ requirement: &14320420 !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ! '>='
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: *14320420
38
+ - !ruby/object:Gem::Dependency
39
+ name: mysql
40
+ requirement: &14319900 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ type: :development
47
+ prerelease: false
48
+ version_requirements: *14319900
49
+ - !ruby/object:Gem::Dependency
50
+ name: pg
51
+ requirement: &14319320 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ! '>='
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ type: :development
58
+ prerelease: false
59
+ version_requirements: *14319320
60
+ - !ruby/object:Gem::Dependency
61
+ name: jeweler
62
+ requirement: &14318840 !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ! '>='
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: *14318840
71
+ - !ruby/object:Gem::Dependency
72
+ name: rspec
73
+ requirement: &14318340 !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: 2.0.0
79
+ type: :development
80
+ prerelease: false
81
+ version_requirements: *14318340
82
+ - !ruby/object:Gem::Dependency
83
+ name: rcov
84
+ requirement: &14317840 !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: *14317840
93
+ - !ruby/object:Gem::Dependency
94
+ name: database_cleaner
95
+ requirement: &14317360 !ruby/object:Gem::Requirement
96
+ none: false
97
+ requirements:
98
+ - - ! '>='
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ type: :development
102
+ prerelease: false
103
+ version_requirements: *14317360
104
+ description: With ActsAsTaggableOnPadrino, you could tag a single model on several
105
+ contexts, such as skills, interests, and awards. It also provides other advanced
106
+ functionality.
107
+ email: john.knott@gmail.com
108
+ executables: []
109
+ extensions: []
110
+ extra_rdoc_files:
111
+ - README.rdoc
112
+ files:
113
+ - .rspec
114
+ - CHANGELOG
115
+ - Gemfile
116
+ - MIT-LICENSE
117
+ - README.rdoc
118
+ - Rakefile
119
+ - VERSION
120
+ - acts-as-taggable-on-padrino.gemspec
121
+ - lib/acts-as-taggable-on-padrino.rb
122
+ - lib/acts_as_taggable_on_padrino/tag.rb
123
+ - lib/acts_as_taggable_on_padrino/taggable.rb
124
+ - lib/acts_as_taggable_on_padrino/taggable/cache.rb
125
+ - lib/acts_as_taggable_on_padrino/taggable/collection.rb
126
+ - lib/acts_as_taggable_on_padrino/taggable/core.rb
127
+ - lib/acts_as_taggable_on_padrino/taggable/ownership.rb
128
+ - lib/acts_as_taggable_on_padrino/taggable/related.rb
129
+ - lib/acts_as_taggable_on_padrino/taggable/tag_list.rb
130
+ - lib/acts_as_taggable_on_padrino/tagger.rb
131
+ - lib/acts_as_taggable_on_padrino/tagging.rb
132
+ - lib/acts_as_taggable_on_padrino/tags_helper.rb
133
+ - lib/tasks/generate_migration.rb
134
+ - lib/tasks/templates/migration.rb
135
+ - spec/acts_as_taggable_on_padrino/acts_as_taggable_on_spec.rb
136
+ - spec/acts_as_taggable_on_padrino/acts_as_tagger_spec.rb
137
+ - spec/acts_as_taggable_on_padrino/tag_list_spec.rb
138
+ - spec/acts_as_taggable_on_padrino/tag_spec.rb
139
+ - spec/acts_as_taggable_on_padrino/taggable_spec.rb
140
+ - spec/acts_as_taggable_on_padrino/tagger_spec.rb
141
+ - spec/acts_as_taggable_on_padrino/tagging_spec.rb
142
+ - spec/acts_as_taggable_on_padrino/tags_helper_spec.rb
143
+ - spec/bm.rb
144
+ - spec/database.yml.sample
145
+ - spec/models.rb
146
+ - spec/schema.rb
147
+ - spec/spec_helper.rb
148
+ - uninstall.rb
149
+ has_rdoc: true
150
+ homepage: http://github.com/johnknott/acts-as-taggable-on-padrino
151
+ licenses: []
152
+ post_install_message:
153
+ rdoc_options: []
154
+ require_paths:
155
+ - lib
156
+ required_ruby_version: !ruby/object:Gem::Requirement
157
+ none: false
158
+ requirements:
159
+ - - ! '>='
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ required_rubygems_version: !ruby/object:Gem::Requirement
163
+ none: false
164
+ requirements:
165
+ - - ! '>='
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
168
+ requirements: []
169
+ rubyforge_project:
170
+ rubygems_version: 1.6.2
171
+ signing_key:
172
+ specification_version: 3
173
+ summary: ActsAsTaggableOnPadrino is a tagging plugin for Padrino that provides multiple
174
+ tagging contexts on a single model.
175
+ test_files: []