make_flaggable 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +7 -0
- data/Gemfile +4 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +81 -0
- data/Rakefile +7 -0
- data/lib/generators/make_flaggable/make_flaggable_generator.rb +20 -0
- data/lib/generators/make_flaggable/templates/migration.rb +23 -0
- data/lib/make_flaggable/exceptions.rb +21 -0
- data/lib/make_flaggable/flaggable.rb +19 -0
- data/lib/make_flaggable/flagger.rb +73 -0
- data/lib/make_flaggable/flagging.rb +6 -0
- data/lib/make_flaggable/version.rb +3 -0
- data/lib/make_flaggable.rb +38 -0
- data/make_flaggable.gemspec +27 -0
- data/spec/database.yml +3 -0
- data/spec/database.yml.sample +3 -0
- data/spec/generators/make_flaggable_generator_spec.rb +28 -0
- data/spec/lib/make_flaggable_spec.rb +104 -0
- data/spec/models.rb +14 -0
- data/spec/schema.rb +30 -0
- data/spec/spec_helper.rb +37 -0
- metadata +142 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2010-2011 by Kai Schlamp
|
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.
|
data/README.rdoc
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
= MakeFlaggable
|
2
|
+
|
3
|
+
MakeFlaggable is an extension for building a user-centric flagging system for Rails 3 applications.
|
4
|
+
It currently supports ActiveRecord models.
|
5
|
+
|
6
|
+
== Installation
|
7
|
+
|
8
|
+
add MakeFlaggable to your Gemfile
|
9
|
+
|
10
|
+
gem 'make_flaggable'
|
11
|
+
|
12
|
+
afterwards execute
|
13
|
+
|
14
|
+
bundle install
|
15
|
+
|
16
|
+
generate the required migration file
|
17
|
+
|
18
|
+
rails generate make_flaggable
|
19
|
+
|
20
|
+
migrate the database
|
21
|
+
|
22
|
+
rake db:migrate
|
23
|
+
|
24
|
+
== Usage
|
25
|
+
|
26
|
+
# Specify a model that can be flagged.
|
27
|
+
class Article < ActiveRecord::Base
|
28
|
+
make_flaggable
|
29
|
+
end
|
30
|
+
|
31
|
+
# Specify a model that can flag another model.
|
32
|
+
class User < ActiveRecord::Base
|
33
|
+
make_flagger
|
34
|
+
end
|
35
|
+
|
36
|
+
# You can specify that a flagger can only flag a flaggable once.
|
37
|
+
class User < ActiveRecord::Base
|
38
|
+
make_flagger :flag_once => true
|
39
|
+
end
|
40
|
+
|
41
|
+
# The user can now flag the flaggable.
|
42
|
+
# If the user already flagged the flaggable and :flag_once was set then an AlreadyFlaggedError is raised.
|
43
|
+
user.flag!(article, reason)
|
44
|
+
|
45
|
+
# The method without bang(!) does not raise the AlreadyFlaggedError when the user flags the flaggable more than once.
|
46
|
+
# Instead it just returns false and ignores the flagging.
|
47
|
+
# If :flag_once was not set then this method behaves like flag! method.
|
48
|
+
user.flag(article, reason)
|
49
|
+
|
50
|
+
# The user may unflag an already done flagging.
|
51
|
+
# If the user never flagged the flaggable then an NotFlaggedError is raised.
|
52
|
+
user.unflag!(article)
|
53
|
+
|
54
|
+
# The method without bang(!) does not raise the NotFlaggedError, but just returns false if the user never flagged
|
55
|
+
# the flaggable.
|
56
|
+
user.unflag(article)
|
57
|
+
|
58
|
+
# Get all flaggings of a flaggable.
|
59
|
+
article.flaggings
|
60
|
+
|
61
|
+
# Get the reason of a flagging.
|
62
|
+
flagging = article.flaggings.first
|
63
|
+
flagging.reason
|
64
|
+
|
65
|
+
# Get the flagger of the flagging.
|
66
|
+
flagging = article.flaggings.first
|
67
|
+
user = flagging.flagger
|
68
|
+
|
69
|
+
# Returns true if the article was flagged by any flagger, false otherwise
|
70
|
+
article.flagged?
|
71
|
+
|
72
|
+
# Flaggings can also be accessed by its flagger.
|
73
|
+
flagger.flaggings
|
74
|
+
|
75
|
+
== Testing
|
76
|
+
|
77
|
+
MakeFlaggable uses RSpec for testing and has a rake task for executing the provided specs
|
78
|
+
|
79
|
+
rake spec
|
80
|
+
|
81
|
+
Copyright © 2010-2011 Kai Schlamp (http://www.medihack.org), released under the MIT license
|
data/Rakefile
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'rails/generators/migration'
|
2
|
+
require 'rails/generators/active_record'
|
3
|
+
|
4
|
+
class MakeFlaggableGenerator < Rails::Generators::Base
|
5
|
+
include Rails::Generators::Migration
|
6
|
+
|
7
|
+
desc "Generates a migration for the Flag model"
|
8
|
+
|
9
|
+
def self.source_root
|
10
|
+
@source_root ||= File.dirname(__FILE__) + '/templates'
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.next_migration_number(path)
|
14
|
+
ActiveRecord::Generators::Base.next_migration_number(path)
|
15
|
+
end
|
16
|
+
|
17
|
+
def generate_migration
|
18
|
+
migration_template 'migration.rb', 'db/migrate/create_make_flaggable_tables'
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class CreateMakeFlaggableTables < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :flaggings do |t|
|
4
|
+
t.string :flaggable_type
|
5
|
+
t.integer :flaggable_id
|
6
|
+
t.string :flagger_type
|
7
|
+
t.integer :flagger_id
|
8
|
+
t.text :reason
|
9
|
+
|
10
|
+
t.timestamps
|
11
|
+
end
|
12
|
+
|
13
|
+
add_index :flaggings, [:flaggable_type, :flaggable_id]
|
14
|
+
add_index :flaggings, [:flagger_type, :flagger_id, :flaggable_type, :flaggable_id], :name => "access_flaggings"
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.down
|
18
|
+
remove_index :flaggings, :column => [:flaggable_type, :flaggable_id]
|
19
|
+
remove_index :flaggings, :name => "access_flaggings"
|
20
|
+
|
21
|
+
drop_table :flaggings
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module MakeFlaggable
|
2
|
+
module Exceptions
|
3
|
+
class AlreadyFlaggedError < StandardError
|
4
|
+
def initialize
|
5
|
+
super "The flaggable was already flagged by this flagger."
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class NotFlaggedError < StandardError
|
10
|
+
def initialize
|
11
|
+
super "The flaggable was not flagged by the flagger."
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class InvalidFlaggableError < StandardError
|
16
|
+
def initialize
|
17
|
+
super "Invalid flaggable."
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module MakeFlaggable
|
2
|
+
module Flaggable
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
has_many :flaggings, :class_name => "MakeFlaggable::Flagging", :as => :flaggable
|
7
|
+
end
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
def flaggable?
|
11
|
+
true
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def flagged?
|
16
|
+
flaggings.count > 0
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
module MakeFlaggable
|
2
|
+
module Flagger
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
has_many :flaggings, :class_name => "MakeFlaggable::Flagging", :as => :flagger
|
7
|
+
end
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
def flagger?
|
11
|
+
true
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# Flag a +flaggable+ using the provided +reason+.
|
16
|
+
# Raises an +AlreadyFlaggedError+ if the flagger already flagged the flaggable and +:flag_once+ option is set.
|
17
|
+
# Raises an +InvalidFlaggableError+ if the flaggable is not a valid flaggable.
|
18
|
+
def flag!(flaggable, reason = nil)
|
19
|
+
check_flaggable(flaggable)
|
20
|
+
|
21
|
+
if (flaggable_options[:flag_once] && fetch_flaggings(flaggable).try(:first))
|
22
|
+
raise MakeFlaggable::Exceptions::AlreadyFlaggedError.new
|
23
|
+
end
|
24
|
+
|
25
|
+
Flagging.create(:flaggable => flaggable, :flagger => self, :reason => reason)
|
26
|
+
end
|
27
|
+
|
28
|
+
# Flag the +flaggable+, but don't raise an error if the flaggable was already flagged and +:flag_once+ was set.
|
29
|
+
# If +:flag_once+ was not set then this method behaves like +flag!+.
|
30
|
+
# The flagging is simply ignored then.
|
31
|
+
def flag(flaggable, reason = nil)
|
32
|
+
begin
|
33
|
+
flag!(flaggable, reason)
|
34
|
+
rescue Exceptions::AlreadyFlaggedError
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def unflag!(flaggable)
|
39
|
+
check_flaggable(flaggable)
|
40
|
+
|
41
|
+
flaggings = fetch_flaggings(flaggable)
|
42
|
+
|
43
|
+
raise Exceptions::NotFlaggedError if flaggings.empty?
|
44
|
+
|
45
|
+
flaggings.destroy_all
|
46
|
+
|
47
|
+
true
|
48
|
+
end
|
49
|
+
|
50
|
+
def unflag(flaggable)
|
51
|
+
begin
|
52
|
+
unflag!(flaggable)
|
53
|
+
success = true
|
54
|
+
rescue Exceptions::NotFlaggedError
|
55
|
+
success = false
|
56
|
+
end
|
57
|
+
success
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def fetch_flaggings(flaggable)
|
63
|
+
flaggings.where({
|
64
|
+
:flaggable_type => flaggable.class.to_s,
|
65
|
+
:flaggable_id => flaggable.id
|
66
|
+
})
|
67
|
+
end
|
68
|
+
|
69
|
+
def check_flaggable(flaggable)
|
70
|
+
raise Exceptions::InvalidFlaggableError unless flaggable.class.flaggable?
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'make_flaggable/flagging'
|
2
|
+
require 'make_flaggable/flaggable'
|
3
|
+
require 'make_flaggable/flagger'
|
4
|
+
require 'make_flaggable/exceptions'
|
5
|
+
|
6
|
+
module MakeFlaggable
|
7
|
+
def flaggable?
|
8
|
+
false
|
9
|
+
end
|
10
|
+
|
11
|
+
def flagger?
|
12
|
+
false
|
13
|
+
end
|
14
|
+
|
15
|
+
# Specify a model as flaggable.
|
16
|
+
# Optional option :once_per_flagger when only on flag per flagger is allowed.
|
17
|
+
#
|
18
|
+
# Example:
|
19
|
+
# class Article < ActiveRecord::Base
|
20
|
+
# make_flaggable :once_per_flagger => true
|
21
|
+
# end
|
22
|
+
def make_flaggable
|
23
|
+
include Flaggable
|
24
|
+
end
|
25
|
+
|
26
|
+
# Specify a model as flagger.
|
27
|
+
#
|
28
|
+
# Example:
|
29
|
+
# class User < ActiveRecord::Base
|
30
|
+
# make_flagger
|
31
|
+
# end
|
32
|
+
def make_flagger(options = {})
|
33
|
+
define_method(:flaggable_options) { options }
|
34
|
+
include Flagger
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
ActiveRecord::Base.extend MakeFlaggable
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path("../lib/make_flaggable/version", __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = "make_flaggable"
|
6
|
+
s.version = MakeFlaggable::VERSION
|
7
|
+
s.platform = Gem::Platform::RUBY
|
8
|
+
s.authors = ["Kai Schlamp"]
|
9
|
+
s.email = ["schlamp@gmx.de"]
|
10
|
+
s.homepage = "http://github.com/medihack/make_flaggable"
|
11
|
+
s.summary = "Rails 3 flagging extension"
|
12
|
+
s.description = "A user-centric flagging extension for Rails 3 applications."
|
13
|
+
|
14
|
+
s.required_rubygems_version = ">= 1.3.6"
|
15
|
+
s.rubyforge_project = "make_flaggable"
|
16
|
+
|
17
|
+
s.add_dependency "activerecord", "~> 3.0.0"
|
18
|
+
s.add_development_dependency "bundler", "~> 1.0.0"
|
19
|
+
s.add_development_dependency "rspec", "~> 2.5.0"
|
20
|
+
s.add_development_dependency "database_cleaner", "0.6.7.RC"
|
21
|
+
s.add_development_dependency "sqlite3-ruby", "~> 1.3.0"
|
22
|
+
s.add_development_dependency "generator_spec", "~> 0.8.2"
|
23
|
+
|
24
|
+
s.files = `git ls-files`.split("\n")
|
25
|
+
s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
|
26
|
+
s.require_path = 'lib'
|
27
|
+
end
|
data/spec/database.yml
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'action_controller'
|
3
|
+
require 'generator_spec/test_case'
|
4
|
+
require 'generators/make_flaggable/make_flaggable_generator'
|
5
|
+
|
6
|
+
describe MakeFlaggableGenerator do
|
7
|
+
include GeneratorSpec::TestCase
|
8
|
+
destination File.expand_path("/tmp", __FILE__)
|
9
|
+
tests MakeFlaggableGenerator
|
10
|
+
|
11
|
+
before do
|
12
|
+
prepare_destination
|
13
|
+
run_generator
|
14
|
+
end
|
15
|
+
|
16
|
+
specify do
|
17
|
+
destination_root.should have_structure {
|
18
|
+
directory "db" do
|
19
|
+
directory "migrate" do
|
20
|
+
migration "create_make_flaggable_tables" do
|
21
|
+
contains "class CreateMakeFlaggableTables"
|
22
|
+
contains "create_table :flaggings"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
}
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
describe "Make Flaggable" do
|
4
|
+
before(:each) do
|
5
|
+
@flaggable = FlaggableModel.create(:name => "Flaggable 1")
|
6
|
+
@flagger = FlaggerModel.create(:name => "Flagger 1")
|
7
|
+
@flagger_once = FlaggerOnceModel.create(:name => "Flagger Once 1")
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should create a flaggable instance" do
|
11
|
+
@flaggable.class.should == FlaggableModel
|
12
|
+
@flaggable.class.flaggable?.should == true
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should create a flagger instance" do
|
16
|
+
@flagger.class.should == FlaggerModel
|
17
|
+
@flagger.class.flagger?.should == true
|
18
|
+
|
19
|
+
@flagger_once.class.should == FlaggerOnceModel
|
20
|
+
@flagger_once.class.flagger?.should == true
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "flagger" do
|
24
|
+
describe "flag" do
|
25
|
+
it "should create a flagging" do
|
26
|
+
@flaggable.flaggings.length.should == 0
|
27
|
+
@flagger.flag!(@flaggable)
|
28
|
+
@flaggable.flaggings.reload.length.should == 1
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should store the reason" do
|
32
|
+
@flagger.flag!(@flaggable, "The reason.")
|
33
|
+
reason = @flaggable.flaggings[0].reason
|
34
|
+
reason.should == "The reason."
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should only allow to flag a flaggable per flagger once with rasing an error" do
|
38
|
+
@flagger_once.flag!(@flaggable)
|
39
|
+
lambda { @flagger_once.flag!(@flaggable) }.should raise_error(MakeFlaggable::Exceptions::AlreadyFlaggedError)
|
40
|
+
MakeFlaggable::Flagging.count.should == 1
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should only allow to flag a flaggable per flagger once without rasing an error" do
|
44
|
+
@flagger_once.flag(@flaggable)
|
45
|
+
lambda { @flagger_once.flag(@flaggable) }.should_not raise_error(MakeFlaggable::Exceptions::AlreadyFlaggedError)
|
46
|
+
MakeFlaggable::Flagging.count.should == 1
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "unflag" do
|
51
|
+
it "should unflag a flagging" do
|
52
|
+
@flagger.flag!(@flaggable)
|
53
|
+
@flagger.flaggings.length.should == 1
|
54
|
+
@flagger.unflag!(@flaggable).should == true
|
55
|
+
@flagger.flaggings.reload.length.should == 0
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should unflag multiple flaggings" do
|
59
|
+
@flagger.flag!(@flaggable)
|
60
|
+
@flagger.flag!(@flaggable)
|
61
|
+
@flagger.flaggings.length.should == 2
|
62
|
+
@flagger.unflag!(@flaggable).should == true
|
63
|
+
@flagger.flaggings.reload.length.should == 0
|
64
|
+
end
|
65
|
+
|
66
|
+
it "normal method should return true when successfully unflagged" do
|
67
|
+
@flagger.flag(@flaggable)
|
68
|
+
@flagger.unflag(@flaggable).should == true
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should raise error if flagger not flagged the flaggable with bang method" do
|
72
|
+
lambda { @flagger.unflag!(@flaggable) }.should raise_error(MakeFlaggable::Exceptions::NotFlaggedError)
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should not raise error if flagger not flagged the flaggable with normal method" do
|
76
|
+
lambda {
|
77
|
+
@flagger.unflag(@flaggable).should == false
|
78
|
+
}.should_not raise_error(MakeFlaggable::Exceptions::NotFlaggedError)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should have flaggings" do
|
83
|
+
@flagger.flaggings.length.should == 0
|
84
|
+
@flagger.flag!(@flaggable)
|
85
|
+
@flagger.flaggings.reload.length.should == 1
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
describe "flaggable" do
|
90
|
+
it "should have flaggings" do
|
91
|
+
@flaggable.flaggings.length.should == 0
|
92
|
+
@flagger.flag!(@flaggable)
|
93
|
+
@flaggable.flaggings.reload.length.should == 1
|
94
|
+
end
|
95
|
+
|
96
|
+
it "should check if flaggable is flagged" do
|
97
|
+
@flaggable.flagged?.should == false
|
98
|
+
@flagger.flag!(@flaggable)
|
99
|
+
@flaggable.flagged?.should == true
|
100
|
+
@flagger.unflag!(@flaggable)
|
101
|
+
@flaggable.flagged?.should == false
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
data/spec/models.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
class FlaggableModel < ActiveRecord::Base
|
2
|
+
make_flaggable
|
3
|
+
end
|
4
|
+
|
5
|
+
class FlaggerModel < ActiveRecord::Base
|
6
|
+
make_flagger
|
7
|
+
end
|
8
|
+
|
9
|
+
class FlaggerOnceModel < ActiveRecord::Base
|
10
|
+
make_flagger :flag_once => true
|
11
|
+
end
|
12
|
+
|
13
|
+
class InvalidFlaggableModel < ActiveRecord::Base
|
14
|
+
end
|
data/spec/schema.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
ActiveRecord::Schema.define :version => 0 do
|
2
|
+
create_table :flaggable_models, :force => true do |t|
|
3
|
+
t.string :name
|
4
|
+
end
|
5
|
+
|
6
|
+
create_table :flagger_models, :force => true do |t|
|
7
|
+
t.string :name
|
8
|
+
end
|
9
|
+
|
10
|
+
create_table :flagger_once_models, :force => true do |t|
|
11
|
+
t.string :name
|
12
|
+
end
|
13
|
+
|
14
|
+
create_table :invalid_flaggable_models, :force => true do |t|
|
15
|
+
t.string :name
|
16
|
+
end
|
17
|
+
|
18
|
+
create_table :flaggings, :force => true do |t|
|
19
|
+
t.string :flaggable_type
|
20
|
+
t.integer :flaggable_id
|
21
|
+
t.string :flagger_type
|
22
|
+
t.integer :flagger_id
|
23
|
+
t.text :reason
|
24
|
+
|
25
|
+
t.timestamps
|
26
|
+
end
|
27
|
+
|
28
|
+
add_index :flaggings, [:flaggable_type, :flaggable_id]
|
29
|
+
add_index :flaggings, [:flagger_type, :flagger_id, :flaggable_type, :flaggable_id], :name => "access_flaggings"
|
30
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
require 'logger'
|
4
|
+
require 'rspec'
|
5
|
+
require 'active_record'
|
6
|
+
require 'database_cleaner'
|
7
|
+
|
8
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__) + '/../lib')
|
9
|
+
require 'make_flaggable'
|
10
|
+
|
11
|
+
ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + '/debug.log')
|
12
|
+
ActiveRecord::Base.configurations = YAML::load_file(File.dirname(__FILE__) + '/database.yml')
|
13
|
+
ActiveRecord::Base.establish_connection(ENV['DB'] || 'sqlite3')
|
14
|
+
|
15
|
+
ActiveRecord::Base.silence do
|
16
|
+
ActiveRecord::Migration.verbose = false
|
17
|
+
|
18
|
+
load(File.dirname(__FILE__) + '/schema.rb')
|
19
|
+
load(File.dirname(__FILE__) + '/models.rb')
|
20
|
+
end
|
21
|
+
|
22
|
+
RSpec.configure do |config|
|
23
|
+
config.filter_run :focus => true
|
24
|
+
config.run_all_when_everything_filtered = true
|
25
|
+
config.filter_run_excluding :exclude => true
|
26
|
+
|
27
|
+
config.mock_with :rspec
|
28
|
+
|
29
|
+
config.before(:suite) do
|
30
|
+
DatabaseCleaner.strategy = :truncation
|
31
|
+
DatabaseCleaner.clean
|
32
|
+
end
|
33
|
+
|
34
|
+
config.after(:each) do
|
35
|
+
DatabaseCleaner.clean
|
36
|
+
end
|
37
|
+
end
|
metadata
ADDED
@@ -0,0 +1,142 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: make_flaggable
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 0.0.2
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Kai Schlamp
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2011-06-18 00:00:00 +02:00
|
14
|
+
default_executable:
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: activerecord
|
18
|
+
prerelease: false
|
19
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
|
+
none: false
|
21
|
+
requirements:
|
22
|
+
- - ~>
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: 3.0.0
|
25
|
+
type: :runtime
|
26
|
+
version_requirements: *id001
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
prerelease: false
|
30
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
31
|
+
none: false
|
32
|
+
requirements:
|
33
|
+
- - ~>
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: 1.0.0
|
36
|
+
type: :development
|
37
|
+
version_requirements: *id002
|
38
|
+
- !ruby/object:Gem::Dependency
|
39
|
+
name: rspec
|
40
|
+
prerelease: false
|
41
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ~>
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 2.5.0
|
47
|
+
type: :development
|
48
|
+
version_requirements: *id003
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: database_cleaner
|
51
|
+
prerelease: false
|
52
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - "="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: 0.6.7.RC
|
58
|
+
type: :development
|
59
|
+
version_requirements: *id004
|
60
|
+
- !ruby/object:Gem::Dependency
|
61
|
+
name: sqlite3-ruby
|
62
|
+
prerelease: false
|
63
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
64
|
+
none: false
|
65
|
+
requirements:
|
66
|
+
- - ~>
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 1.3.0
|
69
|
+
type: :development
|
70
|
+
version_requirements: *id005
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
name: generator_spec
|
73
|
+
prerelease: false
|
74
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
76
|
+
requirements:
|
77
|
+
- - ~>
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: 0.8.2
|
80
|
+
type: :development
|
81
|
+
version_requirements: *id006
|
82
|
+
description: A user-centric flagging extension for Rails 3 applications.
|
83
|
+
email:
|
84
|
+
- schlamp@gmx.de
|
85
|
+
executables: []
|
86
|
+
|
87
|
+
extensions: []
|
88
|
+
|
89
|
+
extra_rdoc_files: []
|
90
|
+
|
91
|
+
files:
|
92
|
+
- .gitignore
|
93
|
+
- Gemfile
|
94
|
+
- MIT-LICENSE
|
95
|
+
- README.rdoc
|
96
|
+
- Rakefile
|
97
|
+
- lib/generators/make_flaggable/make_flaggable_generator.rb
|
98
|
+
- lib/generators/make_flaggable/templates/migration.rb
|
99
|
+
- lib/make_flaggable.rb
|
100
|
+
- lib/make_flaggable/exceptions.rb
|
101
|
+
- lib/make_flaggable/flaggable.rb
|
102
|
+
- lib/make_flaggable/flagger.rb
|
103
|
+
- lib/make_flaggable/flagging.rb
|
104
|
+
- lib/make_flaggable/version.rb
|
105
|
+
- make_flaggable.gemspec
|
106
|
+
- spec/database.yml
|
107
|
+
- spec/database.yml.sample
|
108
|
+
- spec/generators/make_flaggable_generator_spec.rb
|
109
|
+
- spec/lib/make_flaggable_spec.rb
|
110
|
+
- spec/models.rb
|
111
|
+
- spec/schema.rb
|
112
|
+
- spec/spec_helper.rb
|
113
|
+
has_rdoc: true
|
114
|
+
homepage: http://github.com/medihack/make_flaggable
|
115
|
+
licenses: []
|
116
|
+
|
117
|
+
post_install_message:
|
118
|
+
rdoc_options: []
|
119
|
+
|
120
|
+
require_paths:
|
121
|
+
- lib
|
122
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
123
|
+
none: false
|
124
|
+
requirements:
|
125
|
+
- - ">="
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: "0"
|
128
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ">="
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: 1.3.6
|
134
|
+
requirements: []
|
135
|
+
|
136
|
+
rubyforge_project: make_flaggable
|
137
|
+
rubygems_version: 1.6.2
|
138
|
+
signing_key:
|
139
|
+
specification_version: 3
|
140
|
+
summary: Rails 3 flagging extension
|
141
|
+
test_files: []
|
142
|
+
|