acts_as_sane_tree 2.0.5 → 2.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 89a019d5241aef791604209335af604e3b6c926d
4
+ data.tar.gz: ab0d2f4d92b65230a7eaad525389bc102caa18a7
5
+ SHA512:
6
+ metadata.gz: 9ddd081548cbe842f2bca5562794753e7e6328ebe4c076c1d2fbb5d3ac8cc40a224a79f35bf9367b91bf8eb60ae4671083ea71d70358c2d305fd6bfcff12aae6
7
+ data.tar.gz: 72f023ab7fe05705c0dd2bc80d6c5fb4ae52005254aae72667a25048132161b4e75e70041cf62c5400f7f9b38318ace8ae9526ebf9c1822bcdf489d21b932a04
@@ -1,3 +1,6 @@
1
+ === v2.0.6
2
+ * Add full support for rails 4.0 and 4.1
3
+
1
4
  === v2.0.5
2
5
  * Force integer type on depth result or nil if undetermined
3
6
  * Fixed query building bug in #nodes_within
@@ -1,6 +1,8 @@
1
- == acts_as_sane_tree
1
+ == acts_as_sane_tree
2
2
  ==== (Building trees with a dash of sanity)
3
3
 
4
+ {<img src="https://secure.travis-ci.org/chrisroberts/acts_as_sane_tree.png" />}[http://travis-ci.org/chrisroberts/acts_as_sane_tree]
5
+
4
6
  This is a drop in replacement for acts_as_tree on systems with Postgresql >= 8.4
5
7
 
6
8
  == What this provides
@@ -9,7 +11,12 @@ A fast way to build trees.
9
11
 
10
12
  == What version of Rails
11
13
 
12
- As of version 2, acts_as_sane_tree now proudly offers support on Rails 2 as well as Rails 3
14
+ * Rails ~> 4.1.0
15
+ * Rails ~> 4.0.0
16
+ * Rails ~> 3.2.0
17
+ * Rails ~> 3.1.0
18
+ * Rails ~> 3.0.0
19
+ * Rails ~> 2.3.0
13
20
 
14
21
  == Requirements
15
22
 
@@ -50,7 +57,7 @@ http://chrisroberts.github.com/acts_as_sane_tree
50
57
  == License
51
58
 
52
59
  A (now not so large) majority of this was copied directly from the original acts as tree, with the original license:
53
- * Copyright (c) 2007 David Heinemeier Hansson, released under the MIT license
60
+ * Copyright (c) 2007 David Heinemeier Hansson, released under the MIT license
54
61
 
55
62
  The new additions continue:
56
63
  * Copyright (c) 2011 Chris Roberts, released under the MIT license
@@ -3,7 +3,7 @@ require 'acts_as_sane_tree/instance_methods'
3
3
  require 'acts_as_sane_tree/singleton_methods.rb'
4
4
 
5
5
  module ActsAsSaneTree
6
-
6
+
7
7
  def self.included(base) # :nodoc:
8
8
  base.extend(ClassMethods)
9
9
  end
@@ -31,7 +31,7 @@ module ActsAsSaneTree
31
31
  # root.children.first.children.first # => subchild1
32
32
  #
33
33
  # The following class methods are also added:
34
- #
34
+ #
35
35
  # * <tt>nodes_within?(src, chk)</tt> - Returns true if chk contains any nodes found within src and all ancestors of nodes within src
36
36
  # * <tt>nodes_within(src, chk)</tt> - Returns any matching nodes from chk found within src and all ancestors within src
37
37
  # * <tt>nodes_and_descendants(*args)</tt> - Returns all nodes and descendants for given IDs or records. Accepts multiple IDs and records. Valid options:
@@ -52,21 +52,29 @@ module ActsAsSaneTree
52
52
 
53
53
  self.class_eval do
54
54
  cattr_accessor :configuration
55
-
56
- has_many :children,
57
- :class_name => @configuration[:class].name,
58
- :foreign_key => @configuration[:foreign_key],
59
- :order => @configuration[:order],
60
- :dependent => @configuration[:dependent]
61
- belongs_to :parent,
62
- :class_name => @configuration[:class].name,
55
+
56
+ if(Gem::Version.new(ActiveRecord::VERSION::STRING) < Gem::Version.new('4.1.0'))
57
+ has_many :children,
58
+ :class_name => @configuration[:class].name,
59
+ :foreign_key => @configuration[:foreign_key],
60
+ :order => @configuration[:order],
61
+ :dependent => @configuration[:dependent]
62
+ else
63
+ has_many :children,
64
+ proc{ order self.configuration[:order] },
65
+ :class_name => @configuration[:class].name,
66
+ :foreign_key => @configuration[:foreign_key],
67
+ :dependent => @configuration[:dependent]
68
+ end
69
+ belongs_to :parent,
70
+ :class_name => @configuration[:class].name,
63
71
  :foreign_key => @configuration[:foreign_key]
64
72
  if(@configuration[:parent_override])
65
73
  def parent
66
74
  self.class.where(:id => self.parent_id).first
67
75
  end
68
76
  end
69
-
77
+
70
78
  validates_each @configuration[:foreign_key] do |record, attr, value|
71
79
  record.errors.add attr, 'cannot be own parent.' if !record.id.nil? && value.to_i == record.id.to_i
72
80
  end
@@ -1,28 +1,29 @@
1
1
  module ActsAsSaneTree
2
2
  module InstanceMethods
3
3
 
4
- # Returns all ancestors of the current node.
4
+ # Returns all ancestors of the current node.
5
5
  def ancestors
6
- query =
6
+ query =
7
7
  "(WITH RECURSIVE crumbs AS (
8
8
  SELECT #{self.class.configuration[:class].table_name}.*,
9
9
  1 AS depth
10
10
  FROM #{self.class.configuration[:class].table_name}
11
- WHERE id = #{id}
11
+ WHERE id = #{id}
12
12
  UNION ALL
13
- SELECT alias1.*,
14
- depth + 1
13
+ SELECT alias1.*,
14
+ depth + 1
15
15
  FROM crumbs
16
16
  JOIN #{self.class.configuration[:class].table_name} alias1 ON alias1.id = crumbs.parent_id
17
17
  ) SELECT * FROM crumbs WHERE crumbs.id != #{id}) as #{self.class.configuration[:class].table_name}"
18
- if(self.class.rails_3?)
19
- self.class.configuration[:class].send(:with_exclusive_scope) do
18
+ scope_strip_method = self.class.configuration[:class].methods.map(&:to_sym).include?(:unscoped) ? :unscoped : :with_exclusive_scope
19
+ if(self.class.rails_arel?)
20
+ self.class.configuration[:class].send(scope_strip_method) do
20
21
  self.class.configuration[:class].from(
21
22
  query
22
23
  ).order("#{self.class.configuration[:class].table_name}.depth DESC")
23
24
  end
24
25
  else
25
- self.class.configuration[:class].send(:with_exclusive_scope) do
26
+ self.class.configuration[:class].send(scope_strip_method) do
26
27
  self.class.configuration[:class].scoped(
27
28
  :from => query,
28
29
  :order => "#{self.class.configuration[:class].table_name}.depth DESC"
@@ -49,12 +50,12 @@ module ActsAsSaneTree
49
50
  def self_and_siblings
50
51
  parent ? parent.children : self.class.configuration[:class].roots
51
52
  end
52
-
53
+
53
54
  # Returns if the current node is a root
54
55
  def root?
55
56
  parent_id.nil?
56
57
  end
57
-
58
+
58
59
  # Returns all descendants of the current node. Each level
59
60
  # is within its own hash, so for a structure like:
60
61
  # root
@@ -63,9 +64,9 @@ module ActsAsSaneTree
63
64
  # \_ subsubchild1
64
65
  # \_ subchild2
65
66
  # the resulting hash would look like:
66
- #
67
- # {child1 =>
68
- # {subchild1 =>
67
+ #
68
+ # {child1 =>
69
+ # {subchild1 =>
69
70
  # {subsubchild1 => {}},
70
71
  # subchild2 => {}}}
71
72
  #
@@ -79,16 +80,16 @@ module ActsAsSaneTree
79
80
  self.class.configuration[:class].nodes_and_descendants(:no_self, self, *args)
80
81
  end
81
82
  alias_method :descendents, :descendants
82
-
83
+
83
84
  # Returns the depth of the current node. 0 depth represents the root of the tree
84
85
  def depth
85
- query =
86
+ query =
86
87
  "WITH RECURSIVE crumbs AS (
87
88
  SELECT parent_id, 0 AS level
88
89
  FROM #{self.class.configuration[:class].table_name}
89
- WHERE id = #{self.id}
90
+ WHERE id = #{self.id}
90
91
  UNION ALL
91
- SELECT alias1.parent_id, level + 1
92
+ SELECT alias1.parent_id, level + 1
92
93
  FROM crumbs
93
94
  JOIN #{self.class.configuration[:class].table_name} alias1 ON alias1.id = crumbs.parent_id
94
95
  ) SELECT level FROM crumbs ORDER BY level DESC LIMIT 1"
@@ -1,14 +1,14 @@
1
1
  module ActsAsSaneTree
2
2
  module SingletonMethods
3
-
3
+
4
4
  # Check if we are in rails 3
5
- def rails_3?
6
- @is_3 ||= !defined?(Arel).nil?
5
+ def rails_arel?
6
+ @is_arel ||= !defined?(Arel).nil?
7
7
  end
8
8
 
9
9
  # Return all root nodes
10
10
  def roots
11
- if(rails_3?)
11
+ if(rails_arel?)
12
12
  configuration[:class].where(
13
13
  "#{configuration[:foreign_key]} IS NULL"
14
14
  ).order(configuration[:order])
@@ -22,12 +22,12 @@ module ActsAsSaneTree
22
22
 
23
23
  # Return first root node
24
24
  def root
25
- if(rails_3?)
25
+ if(rails_arel?)
26
26
  configuration[:class].where("#{configuration[:foreign_key]} IS NULL").order(configuration[:order]).first
27
27
  else
28
28
  configuration[:class].find(
29
- :first,
30
- :conditions => "#{configuration[:foreign_key]} IS NULL",
29
+ :first,
30
+ :conditions => "#{configuration[:foreign_key]} IS NULL",
31
31
  :order => configuration[:order]
32
32
  )
33
33
  end
@@ -57,26 +57,26 @@ module ActsAsSaneTree
57
57
  # chk:: Array of nodes
58
58
  # Return all nodes that are within both chk and src
59
59
  def nodes_within(src, chk)
60
- s = (src.is_a?(Array) ? src : [src]).map{|x|x.is_a?(ActiveRecord::Base) ? x.id : x.to_i}
61
- c = (chk.is_a?(Array) ? chk : [chk]).map{|x|x.is_a?(ActiveRecord::Base) ? x.id : x.to_i}
60
+ s = [src].flatten.compact.map{|x|x.is_a?(ActiveRecord::Base) ? x.id : x.to_i}
61
+ c = [chk].flatten.compact.map{|x|x.is_a?(ActiveRecord::Base) ? x.id : x.to_i}
62
62
  if(s.empty? || c.empty?)
63
63
  nil
64
64
  else
65
- query =
65
+ query =
66
66
  "(WITH RECURSIVE crumbs AS (
67
67
  SELECT #{configuration[:class].table_name}.*, 0 AS depth FROM #{configuration[:class].table_name} WHERE id in (#{s.join(', ')})
68
68
  UNION ALL
69
69
  SELECT alias1.*, crumbs.depth + 1 FROM crumbs JOIN #{configuration[:class].table_name} alias1 on alias1.parent_id = crumbs.id
70
70
  #{configuration[:max_depth] ? "WHERE crumbs.depth + 1 < #{configuration[:max_depth].to_i}" : ''}
71
71
  ) SELECT * FROM crumbs WHERE id in (#{c.join(', ')})) as #{configuration[:class].table_name}"
72
- if(rails_3?)
72
+ if(rails_arel?)
73
73
  configuration[:class].from(query)
74
74
  else
75
75
  configuration[:class].scoped(:from => query)
76
76
  end
77
77
  end
78
78
  end
79
-
79
+
80
80
  # args:: ActiveRecord models or IDs - Symbols: :raw, :no_self - Hash: {:to_depth => n, :at_depth => n}
81
81
  # Returns provided nodes plus all descendants of provided nodes in nested Hash where keys are nodes and values are children
82
82
  # :raw:: return value will be flat array
@@ -104,7 +104,7 @@ module ActsAsSaneTree
104
104
  depth_clause = "#{configuration[:class].table_name}.depth + 1 < #{depth.to_i + 2}"
105
105
  end
106
106
  base_ids = args.map{|x| x.is_a?(ActiveRecord::Base) ? x.id : x.to_i}
107
- query =
107
+ query =
108
108
  "(WITH RECURSIVE crumbs AS (
109
109
  SELECT #{configuration[:class].table_name}.*, #{no_self ? -1 : 0} AS depth FROM #{configuration[:class].table_name} WHERE #{base_ids.empty? ? 'parent_id IS NULL' : "id in (#{base_ids.join(', ')})"}
110
110
  UNION ALL
@@ -112,7 +112,7 @@ module ActsAsSaneTree
112
112
  #{depth_restriction}
113
113
  ) SELECT * FROM crumbs) as #{configuration[:class].table_name}"
114
114
  q = nil
115
- if(rails_3?)
115
+ if(rails_arel?)
116
116
  q = configuration[:class].from(
117
117
  query
118
118
  ).where(
@@ -126,7 +126,7 @@ module ActsAsSaneTree
126
126
  end
127
127
  else
128
128
  q = configuration[:class].scoped(
129
- :from => query,
129
+ :from => query,
130
130
  :conditions => "#{configuration[:class].table_name}.depth >= 0"
131
131
  )
132
132
  if(configuration[:order].present?)
@@ -136,7 +136,7 @@ module ActsAsSaneTree
136
136
  q = q.scoped(:conditions => depth_clause)
137
137
  end
138
138
  end
139
- unless(rails_3?)
139
+ unless(rails_arel?)
140
140
  q = q.scoped(scope(:find))
141
141
  end
142
142
  unless(raw)
@@ -13,6 +13,5 @@ module ActsAsSaneTree
13
13
  end
14
14
  end
15
15
 
16
- VERSION = Version.new('2.0.5')
16
+ VERSION = Version.new('2.0.6')
17
17
  end
18
-
metadata CHANGED
@@ -1,89 +1,68 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: acts_as_sane_tree
3
- version: !ruby/object:Gem::Version
4
- hash: 5
5
- prerelease:
6
- segments:
7
- - 2
8
- - 0
9
- - 5
10
- version: 2.0.5
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.6
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Chris Roberts
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2012-01-25 00:00:00 -08:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
11
+ date: 2014-11-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
22
14
  name: activerecord
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
27
17
  - - ">"
28
- - !ruby/object:Gem::Version
29
- hash: 3
30
- segments:
31
- - 0
32
- version: "0"
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
33
20
  type: :runtime
34
- version_requirements: *id001
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">"
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
35
27
  description: Sane ActiveRecord tree builder
36
28
  email: chrisroberts.code@gmail.com
37
29
  executables: []
38
-
39
30
  extensions: []
40
-
41
- extra_rdoc_files:
31
+ extra_rdoc_files:
32
+ - README.rdoc
33
+ files:
34
+ - CHANGELOG.rdoc
42
35
  - README.rdoc
43
- files:
44
36
  - acts_as_sane_tree.gemspec
45
37
  - init.rb
46
- - README.rdoc
47
- - CHANGELOG.rdoc
48
38
  - lib/acts_as_sane_tree.rb
49
- - lib/acts_as_sane_tree/version.rb
50
39
  - lib/acts_as_sane_tree/acts_as_sane_tree.rb
51
- - lib/acts_as_sane_tree/singleton_methods.rb
52
40
  - lib/acts_as_sane_tree/instance_methods.rb
41
+ - lib/acts_as_sane_tree/singleton_methods.rb
42
+ - lib/acts_as_sane_tree/version.rb
53
43
  - rails/init.rb
54
- has_rdoc: true
55
44
  homepage: http://github.com/chrisroberts/acts_as_sane_tree
56
45
  licenses: []
57
-
46
+ metadata: {}
58
47
  post_install_message:
59
48
  rdoc_options: []
60
-
61
- require_paths:
49
+ require_paths:
62
50
  - lib
63
- required_ruby_version: !ruby/object:Gem::Requirement
64
- none: false
65
- requirements:
51
+ required_ruby_version: !ruby/object:Gem::Requirement
52
+ requirements:
66
53
  - - ">="
67
- - !ruby/object:Gem::Version
68
- hash: 3
69
- segments:
70
- - 0
71
- version: "0"
72
- required_rubygems_version: !ruby/object:Gem::Requirement
73
- none: false
74
- requirements:
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ required_rubygems_version: !ruby/object:Gem::Requirement
57
+ requirements:
75
58
  - - ">="
76
- - !ruby/object:Gem::Version
77
- hash: 3
78
- segments:
79
- - 0
80
- version: "0"
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
81
61
  requirements: []
82
-
83
62
  rubyforge_project:
84
- rubygems_version: 1.4.2
63
+ rubygems_version: 2.2.2
85
64
  signing_key:
86
- specification_version: 3
65
+ specification_version: 4
87
66
  summary: Sane tree builder for ActiveRecord and Postgresql
88
67
  test_files: []
89
-
68
+ has_rdoc: true