diff --git a/.gitignore b/.gitignore index c6b20dd..96be15d 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ **/*.sw* test/*.log pkg +.bundle diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 0000000..c506e4e --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +ruby-2.0.0-p353 diff --git a/.rvmrc b/.rvmrc deleted file mode 100644 index 6aa60e1..0000000 --- a/.rvmrc +++ /dev/null @@ -1 +0,0 @@ -rvm use ruby-1.9.2-p290@ordered_tree diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..cb7bba3 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,4 @@ +# TBA + +- Drop support for ActiveRecord 3.x +- Drop support for Ruby 1.8 diff --git a/Gemfile b/Gemfile index c1de15a..720713a 100644 --- a/Gemfile +++ b/Gemfile @@ -1,15 +1,10 @@ -source "http://rubygems.org" +source "https://rubygems.org" -gem "activerecord", ">= 3.1.1" +gemspec -group :development do - gem "rspec", "~> 2.6.0" - gem "bundler", "~> 1.0.0" - gem "jeweler", "~> 1.6.2" - gem "rcov", ">= 0" +gem "activerecord" +gem "activesupport" +gem "rspec" - gem 'sqlite3' - gem 'guard-rspec' - gem 'libnotify' - gem 'rb-inotify' -end +# TODO Upgrade when fixed: http://stackoverflow.com/a/20128697/61018 +gem "pry", "0.9.12.2" diff --git a/Gemfile.lock b/Gemfile.lock index fa0a967..9865bb8 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,37 +1,40 @@ +PATH + remote: . + specs: + ordered_tree (0.2.1) + activerecord (>= 4.0) + GEM - remote: http://rubygems.org/ + remote: https://rubygems.org/ specs: - activemodel (3.1.1) - activesupport (= 3.1.1) - builder (~> 3.0.0) - i18n (~> 0.6) - activerecord (3.1.1) - activemodel (= 3.1.1) - activesupport (= 3.1.1) - arel (~> 2.2.1) - tzinfo (~> 0.3.29) - activesupport (3.1.1) - multi_json (~> 1.0) - arel (2.2.1) - builder (3.0.0) + activemodel (4.0.2) + activesupport (= 4.0.2) + builder (~> 3.1.0) + activerecord (4.0.2) + activemodel (= 4.0.2) + activerecord-deprecated_finders (~> 1.0.2) + activesupport (= 4.0.2) + arel (~> 4.0.0) + activerecord-deprecated_finders (1.0.3) + activesupport (4.0.2) + i18n (~> 0.6, >= 0.6.4) + minitest (~> 4.2) + multi_json (~> 1.3) + thread_safe (~> 0.1) + tzinfo (~> 0.3.37) + arel (4.0.1) + atomic (1.1.14) + builder (3.1.4) + coderay (1.0.9) diff-lcs (1.1.3) - ffi (1.0.10) - git (1.2.5) - guard (0.8.8) - thor (~> 0.14.6) - guard-rspec (0.5.3) - guard (>= 0.8.4) - i18n (0.6.0) - jeweler (1.6.4) - bundler (~> 1.0) - git (>= 1.2.5) - rake - libnotify (0.5.9) - multi_json (1.0.3) - rake (0.9.2.2) - rb-inotify (0.8.8) - ffi (>= 0.5.0) - rcov (0.9.11) + i18n (0.6.9) + method_source (0.8.2) + minitest (4.7.5) + multi_json (1.8.2) + pry (0.9.12.2) + coderay (~> 1.0.5) + method_source (~> 0.8) + slop (~> 3.4) rspec (2.6.0) rspec-core (~> 2.6.0) rspec-expectations (~> 2.6.0) @@ -40,20 +43,19 @@ GEM rspec-expectations (2.6.0) diff-lcs (~> 1.1.2) rspec-mocks (2.6.0) - sqlite3 (1.3.4) - thor (0.14.6) - tzinfo (0.3.31) + slop (3.4.7) + sqlite3 (1.3.8) + thread_safe (0.1.3) + atomic + tzinfo (0.3.38) PLATFORMS ruby DEPENDENCIES - activerecord (>= 3.1.1) - bundler (~> 1.0.0) - guard-rspec - jeweler (~> 1.6.2) - libnotify - rb-inotify - rcov - rspec (~> 2.6.0) + activerecord + activesupport + ordered_tree! + pry (= 0.9.12.2) + rspec sqlite3 diff --git a/VERSION b/VERSION deleted file mode 100644 index 7dff5b8..0000000 --- a/VERSION +++ /dev/null @@ -1 +0,0 @@ -0.2.1 \ No newline at end of file diff --git a/lib/ordered_tree.rb b/lib/ordered_tree.rb index c4cecd7..7827d3a 100644 --- a/lib/ordered_tree.rb +++ b/lib/ordered_tree.rb @@ -27,17 +27,23 @@ def ordered_tree(options = {}) self.ordered_tree_config[:primary_key] ||= :id self.ordered_tree_config.update(options) if options.is_a?(Hash) - belongs_to :parent_node, + belongs_to( + :parent_node, + lambda { |instance| where(instance.send(:scope_condition)) }, :class_name => self.name, :foreign_key => ordered_tree_config[:foreign_key], :primary_key => ordered_tree_config[:primary_key], - :conditions => proc {scope_condition} - has_many :child_nodes, + ) + has_many( + :child_nodes, + lambda { |instance| + where(instance.send(:scope_condition)). + order(ordered_tree_config[:order]) + }, :class_name => self.name, :foreign_key => ordered_tree_config[:foreign_key], - :primary_key => ordered_tree_config[:primary_key], - :conditions => proc {scope_condition}, - :order => ordered_tree_config[:order] + :primary_key => ordered_tree_config[:primary_key] + ) scope :roots, lambda { |*args| column = "#{self.table_name}.#{self.ordered_tree_config[:foreign_key].to_sym}" scope_condition = args[0] diff --git a/lib/ordered_tree/instance_methods/list.rb b/lib/ordered_tree/instance_methods/list.rb index 5105b49..677da3d 100644 --- a/lib/ordered_tree/instance_methods/list.rb +++ b/lib/ordered_tree/instance_methods/list.rb @@ -116,9 +116,10 @@ def move_to(new_position, on_create = false) # moving from lower to higher, increment all in between # #{order_column} >= #{new_position} AND #{order_column} < #{position_in_list} self.class.transaction do - self.class.update_all( - "#{order_column} = (#{order_column} + 1)", "#{scope} AND (#{order_column} BETWEEN #{new_position} AND #{position_in_list - 1})" - ) + self.class.#where(order_column => order_column + 1). + where(scope). + where("#{order_column} BETWEEN #{new_position} AND #{position_in_list - 1}"). + update_all("#{order_column} = (#{order_column} + 1)") if on_create self[order_column] = new_position else @@ -129,9 +130,9 @@ def move_to(new_position, on_create = false) # moving from higher to lower, decrement all in between # #{order_column} > #{position_in_list} AND #{order_column} <= #{new_position} self.class.transaction do - self.class.update_all( - "#{order_column} = (#{order_column} - 1)", "#{scope} AND (#{order_column} BETWEEN #{position_in_list + 1} AND #{new_position})" - ) + self.class.where(scope). + where("#{order_column} BETWEEN #{position_in_list + 1} AND #{new_position}"). + update_all("#{order_column} = (#{order_column} - 1)") update_attribute(order_column, new_position) end end diff --git a/lib/ordered_tree/version.rb b/lib/ordered_tree/version.rb new file mode 100644 index 0000000..d794b06 --- /dev/null +++ b/lib/ordered_tree/version.rb @@ -0,0 +1,3 @@ +module OrderedTree + VERSION = "0.2.1" +end diff --git a/ordered_tree.gemspec b/ordered_tree.gemspec index ae63ce7..8b2c418 100644 --- a/ordered_tree.gemspec +++ b/ordered_tree.gemspec @@ -1,85 +1,26 @@ -# Generated by jeweler -# DO NOT EDIT THIS FILE DIRECTLY -# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec' -# -*- encoding: utf-8 -*- +$: << File.join(File.dirname(__FILE__), "lib") +require "ordered_tree/version" Gem::Specification.new do |s| s.name = %q{ordered_tree} - s.version = "0.2.1" + s.version = OrderedTree::VERSION - s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Ramon Tayag"] s.date = %q{2011-11-13} s.description = %q{Uses parent_id and position to create an ordered tree.} - s.email = %q{ramon@tayag.net} - s.extra_rdoc_files = [ - "LICENSE.txt", - "README.textile" - ] - s.files = [ - ".rvmrc", - "CHANGELOG", - "Gemfile", - "Gemfile.lock", - "Guardfile", - "LICENSE.txt", - "README.textile", - "Rakefile", - "VERSION", - "lib/ordered_tree.rb", - "lib/ordered_tree/class_methods.rb", - "lib/ordered_tree/instance_methods.rb", - "lib/ordered_tree/instance_methods/destroy.rb", - "lib/ordered_tree/instance_methods/list.rb", - "lib/ordered_tree/instance_methods/misc.rb", - "lib/ordered_tree/instance_methods/tree.rb", - "ordered_tree.gemspec", - "spec/fixtures/category.rb", - "spec/fixtures/page.rb", - "spec/fixtures/person.rb", - "spec/ordered_tree_spec.rb", - "spec/spec_helper.rb" - ] s.homepage = %q{http://github.com/ramontayag/ordered_tree} s.licenses = ["MIT"] - s.require_paths = ["lib"] - s.rubygems_version = %q{1.6.2} s.summary = %q{Gem version of Wizard's ActsAsTree} - if s.respond_to? :specification_version then - s.specification_version = 3 + s.files = `git ls-files`.split("\n") + s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n") + s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) } + s.require_paths = ["lib"] + + s.email = %q{ramon@tayag.net} - if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then - s.add_runtime_dependency(%q, [">= 3.1.1"]) - s.add_development_dependency(%q, ["~> 2.6.0"]) - s.add_development_dependency(%q, ["~> 1.0.0"]) - s.add_development_dependency(%q, ["~> 1.6.2"]) - s.add_development_dependency(%q, [">= 0"]) - s.add_development_dependency(%q, [">= 0"]) - s.add_development_dependency(%q, [">= 0"]) - s.add_development_dependency(%q, [">= 0"]) - s.add_development_dependency(%q, [">= 0"]) - else - s.add_dependency(%q, [">= 3.1.1"]) - s.add_dependency(%q, ["~> 2.6.0"]) - s.add_dependency(%q, ["~> 1.0.0"]) - s.add_dependency(%q, ["~> 1.6.2"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - end - else - s.add_dependency(%q, [">= 3.1.1"]) - s.add_dependency(%q, ["~> 2.6.0"]) - s.add_dependency(%q, ["~> 1.0.0"]) - s.add_dependency(%q, ["~> 1.6.2"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - end + s.add_runtime_dependency(%q, [">= 4.0"]) + s.add_development_dependency(%q, [">= 4.0"]) + s.add_development_dependency(%q, ["~> 2.6.0"]) + s.add_development_dependency(%q, [">= 0"]) end - diff --git a/spec/ordered_tree_spec.rb b/spec/ordered_tree_spec.rb index a61f7af..9520d94 100644 --- a/spec/ordered_tree_spec.rb +++ b/spec/ordered_tree_spec.rb @@ -190,6 +190,7 @@ def scope_condition end it "should reorder the list when stuff are destroyed" do + people_count = @people.count @people[0].descendants.should == [@people[1],@people[2],@people[3],@people[4],@people[7],@people[8],@people[9],@people[10],@people[5],@people[6]] @people[5].self_and_siblings.should == [@people[1],@people[2],@people[5],@people[6]] @people[5].position_in_list.should == 3 @@ -197,7 +198,7 @@ def scope_condition @people[10].children << @people[2] @people[2].parent.should == @people[10] @people[2].destroy.should_not be_nil - Person.count.should == @people.count - 7 + Person.count.should == people_count - 7 # Note that I don't need to reload self_and_siblings or children in this case, # since the re-ordering action is actually happening against people[0].children # (which is what self_and_syblings returns) @@ -254,9 +255,9 @@ def scope_condition describe "#move_to_bottom" do it "should do properly set the position_in_list" do - @people = Person.find(:all) + @people = Person.all (@people[4].move_to_bottom).should_not be_false - @people = Person.find(:all) + @people = Person.all @people[3].position_in_list.should == 1 @people[9].position_in_list.should == 2 @people[10].position_in_list.should == 3 diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index e248e12..a3c688e 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,48 +1,21 @@ -$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) -$LOAD_PATH.unshift(File.dirname(__FILE__)) -require 'rubygems' -require 'active_record' -require 'rspec' -require 'ordered_tree' -require 'fixtures/person' -require 'fixtures/page' -require 'fixtures/category' +LIB_DIR = File.join(File.dirname(__FILE__), '..', 'lib') +SPEC_DIR = File.dirname(__FILE__) +$LOAD_PATH.unshift(LIB_DIR) +$LOAD_PATH.unshift(SPEC_DIR) -#Allow to connect to SQLite -ActiveRecord::Base.establish_connection( - :adapter => "sqlite3", - :database => ":memory:" -) +# require "bundler/setup" +# Bundler.require(:default, :development, :test) +require "active_support" +require "active_record" +require "sqlite3" +require "rspec" +require "pry" -# Requires supporting files with custom matchers and macros, etc, -# in ./support/ and its subdirectories. -Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f} +require 'ordered_tree' -RSpec.configure do |config| -end +Dir["#{SPEC_DIR}/support/**/*.rb"].each {|f| require f} -def reset_database - %W(people pages categories).each do |table_name| - ActiveRecord::Base.connection.execute("DROP TABLE IF EXISTS '#{table_name}'") - end - ActiveRecord::Base.connection.create_table(:people) do |t| - t.integer :parent_id, :null => false, :default => 0 - t.integer :position - t.string :name - #add_index :people, [:parent_id], :name => "index_people_on_parent_id" - end - ActiveRecord::Base.connection.create_table(:pages) do |t| - t.integer :parent_id - t.integer :position - t.string :name - t.integer :person_id - end - ActiveRecord::Base.connection.create_table(:categories) do |t| - t.integer :parent_id - t.integer :position - t.integer :alt_id - t.integer :person_id - end +RSpec.configure do |config| end # Using this doesn't seem to work when >= Rails 3.1 @@ -52,7 +25,7 @@ def reset_database # to have different configurations, so we don't have to open # things up in the spec. def ordered_tree(klass, *opts) - klass.ordered_tree *opts + klass.ordered_tree(*opts) yield ensure klass.ordered_tree @@ -124,11 +97,11 @@ def reload_test_tree if n == -1 i = i.next people << Person.create(:name => "Person_#{i}") - else - 2.times do - i = i.next - people << people[n].children.create(:name => "Person_#{i}") - end + else + 2.times do + i = i.next + people << people[n].children.create(:name => "Person_#{i}") end end end +end diff --git a/spec/support/database.rb b/spec/support/database.rb new file mode 100644 index 0000000..e75a0be --- /dev/null +++ b/spec/support/database.rb @@ -0,0 +1,28 @@ +ActiveRecord::Base.establish_connection( + adapter: "sqlite3", + database: ":memory:" +) + +def reset_database + %W(people pages categories).each do |table_name| + ActiveRecord::Base.connection.execute("DROP TABLE IF EXISTS '#{table_name}'") + end + ActiveRecord::Base.connection.create_table(:people) do |t| + t.integer :parent_id, null: false, default: 0 + t.integer :position + t.string :name + #add_index :people, [:parent_id], name: "index_people_on_parent_id" + end + ActiveRecord::Base.connection.create_table(:pages) do |t| + t.integer :parent_id + t.integer :position + t.string :name + t.integer :person_id + end + ActiveRecord::Base.connection.create_table(:categories) do |t| + t.integer :parent_id + t.integer :position + t.integer :alt_id + t.integer :person_id + end +end diff --git a/spec/support/fixtures.rb b/spec/support/fixtures.rb new file mode 100644 index 0000000..9e56925 --- /dev/null +++ b/spec/support/fixtures.rb @@ -0,0 +1 @@ +Dir[File.join(SPEC_DIR, "fixtures", "*.rb")].each {|f| require f}