diff --git a/.gitignore b/.gitignore index 45bea21..3696a99 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,5 @@ doc/* *.sqlite3 gemfiles/*.lock .bundle +.ruby-version +.ruby-gemset diff --git a/.travis.yml b/.travis.yml index 8f55fbe..3ce5f31 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,19 +1,24 @@ rvm: - - 1.8.7 - 1.9.3 - 2.0.0 + - 2.2.3 - ree - jruby gemfile: - - gemfiles/rails_3_0.gemfile - - gemfiles/rails_3_1.gemfile - gemfiles/rails_3_2.gemfile - gemfiles/rails_4_0.gemfile + - gemfiles/rails_4_1.gemfile + - gemfiles/rails_4_2.gemfile + - gemfiles/rails_5_0.gemfile matrix: exclude: - - rvm: 1.8.7 - gemfile: gemfiles/rails_4_0.gemfile - rvm: ree - gemfile: gemfiles/rails_4_0.gemfile \ No newline at end of file + gemfile: gemfiles/rails_4_0.gemfile + gemfile: gemfiles/rails_4_1.gemfile + gemfile: gemfiles/rails_4_2.gemfile + - rvm: 1.9.3 + gemfile: gemfiles/rails_5_0.gemfile + - rvm: 2.0.0 + gemfile: gemfiles/rails_5_0.gemfile diff --git a/Appraisals b/Appraisals index 345cbe9..7278d07 100644 --- a/Appraisals +++ b/Appraisals @@ -1,27 +1,30 @@ -appraise "rails_3_0" do - gem "activerecord", "~> 3.0.0" +appraise "rails_3_2" do + gem "activerecord", "~> 3.2.0" gem 'activerecord-jdbcsqlite3-adapter', :platforms => :jruby gem 'sqlite3', :platforms => :ruby - gem 'database_cleaner', '1.0.1' + gem 'test-unit', '~> 3.0' end -appraise "rails_3_1" do - gem "activerecord", "~> 3.1.0" - gem 'activerecord-jdbcsqlite3-adapter', :platforms => :jruby +appraise "rails_4_0" do + gem "activerecord", "~> 4.0.0" + gem "activerecord-jdbcsqlite3-adapter", '1.3.0.rc1', :platforms=>:jruby gem 'sqlite3', :platforms => :ruby - gem 'database_cleaner', '1.0.1' end -appraise "rails_3_2" do - gem "activerecord", "~> 3.2.0" - gem 'activerecord-jdbcsqlite3-adapter', :platforms => :jruby +appraise "rails_4_1" do + gem "activerecord", "~> 4.1" + gem "activerecord-jdbcsqlite3-adapter", '1.3.0.rc1', :platforms=>:jruby gem 'sqlite3', :platforms => :ruby - gem 'database_cleaner', '1.0.1' end -appraise "rails_4_0" do - gem "activerecord", "~> 4.0.0" +appraise "rails_4_2" do + gem "activerecord", "~> 4.2" gem "activerecord-jdbcsqlite3-adapter", '1.3.0.rc1', :platforms=>:jruby gem 'sqlite3', :platforms => :ruby - gem 'database_cleaner', '1.0.1' -end \ No newline at end of file +end + +appraise "rails_5_0" do + gem "activerecord", "~> 5.0" + # gem "activerecord-jdbcsqlite3-adapter", '1.3.0.rc1', :platforms=>:jruby + gem 'sqlite3', :platforms => :ruby +end diff --git a/README.rdoc b/README.rdoc index 7d4f566..f7e262b 100644 --- a/README.rdoc +++ b/README.rdoc @@ -1,8 +1,12 @@ +{Build Status}[https://travis-ci.org/dgilperez/make_flaggable] + = MakeFlaggable -MakeFlaggable is an extension for building a user-centric flagging system for Rails 3 and 4 applications. +MakeFlaggable is an extension for building a user-centric flagging system for Rails > 3.2 applications. It currently supports ActiveRecord models. +This fork supports Rails 4.2. + == Installation add MakeFlaggable to your Gemfile @@ -57,7 +61,7 @@ migrate the database # Get all flaggings of a flaggable. article.flaggings - + # Get the flagging with a specified flag. article.flaggings.with_flag(:flag_name) diff --git a/gemfiles/rails_3_0.gemfile b/gemfiles/rails_3_0.gemfile deleted file mode 100644 index e5cf9f3..0000000 --- a/gemfiles/rails_3_0.gemfile +++ /dev/null @@ -1,10 +0,0 @@ -# This file was generated by Appraisal - -source "https://rubygems.org" - -gem "activerecord", "~> 3.0.0" -gem "activerecord-jdbcsqlite3-adapter", :platforms=>:jruby -gem "sqlite3", :platforms=>:ruby -gem "database_cleaner", "1.0.1" - -gemspec :path=>"../" \ No newline at end of file diff --git a/gemfiles/rails_3_1.gemfile b/gemfiles/rails_3_1.gemfile deleted file mode 100644 index 2054d0c..0000000 --- a/gemfiles/rails_3_1.gemfile +++ /dev/null @@ -1,10 +0,0 @@ -# This file was generated by Appraisal - -source "https://rubygems.org" - -gem "activerecord", "~> 3.1.0" -gem "activerecord-jdbcsqlite3-adapter", :platforms=>:jruby -gem "sqlite3", :platforms=>:ruby -gem "database_cleaner", "1.0.1" - -gemspec :path=>"../" \ No newline at end of file diff --git a/gemfiles/rails_3_2.gemfile b/gemfiles/rails_3_2.gemfile index 11d006b..c20bdc4 100644 --- a/gemfiles/rails_3_2.gemfile +++ b/gemfiles/rails_3_2.gemfile @@ -2,9 +2,9 @@ source "https://rubygems.org" +gem "activerecord-jdbcsqlite3-adapter", :platforms => :jruby +gem "sqlite3", :platforms => :ruby gem "activerecord", "~> 3.2.0" -gem "activerecord-jdbcsqlite3-adapter", :platforms=>:jruby -gem "sqlite3", :platforms=>:ruby -gem "database_cleaner", "1.0.1" +gem "test-unit", "~> 3.0" -gemspec :path=>"../" \ No newline at end of file +gemspec :path => "../" diff --git a/gemfiles/rails_4_0.gemfile b/gemfiles/rails_4_0.gemfile index 38ff954..ba7ca60 100644 --- a/gemfiles/rails_4_0.gemfile +++ b/gemfiles/rails_4_0.gemfile @@ -2,9 +2,8 @@ source "https://rubygems.org" +gem "activerecord-jdbcsqlite3-adapter", "1.3.0.rc1", :platforms => :jruby +gem "sqlite3", :platforms => :ruby gem "activerecord", "~> 4.0.0" -gem "activerecord-jdbcsqlite3-adapter", "1.3.0.rc1", :platforms=>:jruby -gem "sqlite3", :platforms=>:ruby -gem "database_cleaner", "1.0.1" -gemspec :path=>"../" \ No newline at end of file +gemspec :path => "../" diff --git a/gemfiles/rails_4_1.gemfile b/gemfiles/rails_4_1.gemfile new file mode 100644 index 0000000..9a6daae --- /dev/null +++ b/gemfiles/rails_4_1.gemfile @@ -0,0 +1,9 @@ +# This file was generated by Appraisal + +source "https://rubygems.org" + +gem "activerecord-jdbcsqlite3-adapter", "1.3.0.rc1", :platforms => :jruby +gem "sqlite3", :platforms => :ruby +gem "activerecord", "~> 4.1" + +gemspec :path => "../" diff --git a/gemfiles/rails_4_2.gemfile b/gemfiles/rails_4_2.gemfile new file mode 100644 index 0000000..253fdd0 --- /dev/null +++ b/gemfiles/rails_4_2.gemfile @@ -0,0 +1,9 @@ +# This file was generated by Appraisal + +source "https://rubygems.org" + +gem "activerecord-jdbcsqlite3-adapter", "1.3.0.rc1", :platforms => :jruby +gem "sqlite3", :platforms => :ruby +gem "activerecord", "~> 4.2" + +gemspec :path => "../" diff --git a/gemfiles/rails_5_0.gemfile b/gemfiles/rails_5_0.gemfile new file mode 100644 index 0000000..12d129b --- /dev/null +++ b/gemfiles/rails_5_0.gemfile @@ -0,0 +1,9 @@ +# This file was generated by Appraisal + +source "https://rubygems.org" + +gem "activerecord-jdbcsqlite3-adapter", :platforms => :jruby +gem "sqlite3", :platforms => :ruby +gem "activerecord", "~> 5.0" + +gemspec :path => "../" diff --git a/lib/make_flaggable/flaggable.rb b/lib/make_flaggable/flaggable.rb index 9b8962f..76f3f36 100644 --- a/lib/make_flaggable/flaggable.rb +++ b/lib/make_flaggable/flaggable.rb @@ -3,7 +3,7 @@ module Flaggable extend ActiveSupport::Concern included do - has_many :flaggings, :class_name => "MakeFlaggable::Flagging", :as => :flaggable + has_many :flaggings, :class_name => "MakeFlaggable::Flagging", :as => :flaggable, :dependent => :destroy end module ClassMethods diff --git a/lib/make_flaggable/flagger.rb b/lib/make_flaggable/flagger.rb index 60dd972..57ed285 100644 --- a/lib/make_flaggable/flagger.rb +++ b/lib/make_flaggable/flagger.rb @@ -3,7 +3,7 @@ module Flagger extend ActiveSupport::Concern included do - has_many :flaggings, :class_name => "MakeFlaggable::Flagging", :as => :flagger + has_many :flaggings, :class_name => "MakeFlaggable::Flagging", :as => :flagger, :dependent => :destroy end module ClassMethods @@ -44,10 +44,10 @@ def flag(flaggable, reason = nil) end end - def unflag!(flaggable) + def unflag!(flaggable, reason = nil) check_flaggable(flaggable) - flaggings = fetch_flaggings(flaggable) + flaggings = fetch_flaggings(flaggable, reason) raise Exceptions::NotFlaggedError if flaggings.empty? @@ -56,9 +56,9 @@ def unflag!(flaggable) true end - def unflag(flaggable) + def unflag(flaggable, reason = nil) begin - unflag!(flaggable) + unflag!(flaggable, reason = nil) success = true rescue Exceptions::NotFlaggedError success = false @@ -66,18 +66,19 @@ def unflag(flaggable) success end - def flagged?(flaggable) + def flagged?(flaggable, reason = nil) check_flaggable(flaggable) - fetch_flaggings(flaggable).try(:first) ? true : false + fetch_flaggings(flaggable, reason).try(:first) ? true : false end private - def fetch_flaggings(flaggable) - flaggings.where({ - :flaggable => flaggable + def fetch_flaggings(flaggable, reason = nil) + flagger_flaggins = flaggings.where({ + :flaggable => flaggable }) + reason ? flagger_flaggins.where(:reason => reason) : flagger_flaggins end def check_flaggable(flaggable) diff --git a/lib/make_flaggable/flagging.rb b/lib/make_flaggable/flagging.rb index b1e2f35..7b17f02 100644 --- a/lib/make_flaggable/flagging.rb +++ b/lib/make_flaggable/flagging.rb @@ -2,5 +2,7 @@ module MakeFlaggable class Flagging < ActiveRecord::Base belongs_to :flaggable, :polymorphic => true, counter_cache: true belongs_to :flagger, :polymorphic => true, counter_cache: true + + scope :with_flag, ->(reason) { where(reason: reason) } end end diff --git a/make_flaggable.gemspec b/make_flaggable.gemspec index 94b1225..7e0fe73 100644 --- a/make_flaggable.gemspec +++ b/make_flaggable.gemspec @@ -14,9 +14,10 @@ Gem::Specification.new do |s| s.required_rubygems_version = ">= 1.3.6" s.rubyforge_project = "make_flaggable" - s.add_dependency "activerecord", ">= 3.0" + s.add_dependency "activerecord", ">= 3.2" + s.add_development_dependency "bundler", ">= 1.0.0" - s.add_development_dependency "rspec", "~>2.14.0" + s.add_development_dependency "rspec", "~> 2.14.0" s.add_development_dependency "database_cleaner", "1.0.1" s.add_development_dependency "generator_spec", "~> 0.9.0" s.add_development_dependency "rake", ">= 0.9.2" diff --git a/spec/lib/make_flaggable_spec.rb b/spec/lib/make_flaggable_spec.rb index d622909..718c1a8 100644 --- a/spec/lib/make_flaggable_spec.rb +++ b/spec/lib/make_flaggable_spec.rb @@ -26,6 +26,12 @@ @flagger.flaggings.reload.length.should == 1 end + it "flaggings should be scopable by .with_flag using reason" do + @flagger.flaggings.with_flag(:spam).length.should == 0 + @flagger.flag!(@flaggable, :spam) + @flagger.flaggings.with_flag(:spam).reload.length.should == 1 + end + describe "flagger" do describe "flag" do it "should create a flagging" do @@ -93,6 +99,16 @@ @flagger.unflag!(@flaggable) @flagger.flagged?(@flaggable).should == false end + + it "should check if flagger is flagged the flaggable with a particular reason" do + @flagger.flagged?(@flaggable, :spam).should == false + @flagger.flag!(@flaggable, :spam) + @flagger.flagged?(@flaggable, :spam).should == true + @flagger.flagged?(@flaggable, :ham).should == false + @flagger.unflag!(@flaggable, :spam) + @flagger.flagged?(@flaggable, :spam).should == false + @flagger.flagged?(@flaggable, :ham).should == false + end end describe '.flaggers' do @@ -116,7 +132,7 @@ context 'Argument passed' do it 'returns flaggers who have flagged a particular flaggable resource' do - FlaggerModel.flaggers(FlaggableModel).should == [@flagger] + FlaggerModel.flaggers(FlaggableModel).should == [@flagger] end it 'returns nothing if no flag is found' do diff --git a/spec/schema.rb b/spec/schema.rb index 477f878..b84b913 100644 --- a/spec/schema.rb +++ b/spec/schema.rb @@ -1,25 +1,27 @@ ActiveRecord::Schema.define :version => 0 do create_table :flaggable_models, :force => true do |t| t.string :name - t.integer :flaggings_count + t.integer :flaggings_count, default: 0 end create_table :flagger_models, :force => true do |t| t.string :name - t.integer :flaggings_count + t.integer :flaggings_count, default: 0 end create_table :flagger_once_models, :force => true do |t| t.string :name - t.integer :flaggings_count + t.integer :flaggings_count, default: 0 end create_table :invalid_flaggable_models, :force => true do |t| t.string :name + t.integer :flaggings_count, default: 0 end create_table :another_flaggable_models, :force => true do |t| t.string :name + t.integer :flaggings_count, default: 0 end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index db757d4..265b577 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -12,12 +12,10 @@ ActiveRecord::Base.configurations = YAML::load_file(File.dirname(__FILE__) + '/database.yml') ActiveRecord::Base.establish_connection(ENV['DB'] || :sqlite3) -ActiveRecord::Base.silence(:stdout) do - ActiveRecord::Migration.verbose = false +ActiveRecord::Migration.verbose = false - load(File.dirname(__FILE__) + '/schema.rb') - load(File.dirname(__FILE__) + '/models.rb') -end +load(File.dirname(__FILE__) + '/schema.rb') +load(File.dirname(__FILE__) + '/models.rb') RSpec.configure do |config| config.filter_run :focus => true