closure_tree 4.0.0 → 4.0.1

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.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ NzBiMzczYWMyY2IwMzMyMGFiMDE4ZWZiZGE5NDdmYjAwNWFlNmY5Ng==
5
+ data.tar.gz: !binary |-
6
+ NmNmMDYzNDcwZmM4MzBmNjA4ZTgxOGQxZjFmZGJlMTY5MGFjMTAyYg==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ YWJmYWZkOWFlMDM2ZGQwZTlmMDZiYjAxOWYwZTJiMGI5NDQ2ZmNjNzliZWY2
10
+ OTlhYWYxMGViMTY1ZGJmNGE1YzZlM2EwNDA5ZTE3YTZlMDgxOWY1MjA3YjM1
11
+ NjkxOGIwMjk2NzVmYmIxOGNjY2ZlMDczOWYyNTdkMTYyZmVmMjQ=
12
+ data.tar.gz: !binary |-
13
+ Zjg1MmExYzAxZjc0MDIxOTE3YzczMTllYTc1NGVmZjQyM2JkNTQ5YWE1MDJl
14
+ MTBlMzUyM2RmZTA3ZTg1MDUyNjY4YzgwMjljOWZmMTAyYWYwMmRjNzlkYThi
15
+ MTYyMTNhZWQ2ZGQzZmY4YWU5OGQ3NDIyMzYxNjk4ZTliYTNjMjg=
data/README.md CHANGED
@@ -1,14 +1,17 @@
1
- # Closure Tree [![Build Status](https://secure.travis-ci.org/mceachen/closure_tree.png?branch=master)](http://travis-ci.org/mceachen/closure_tree)
1
+ # Closure Tree
2
2
 
3
3
  ### Closure_tree lets your ActiveRecord models act as nodes in a [tree data structure](http://en.wikipedia.org/wiki/Tree_%28data_structure%29)
4
4
 
5
5
  Common applications include modeling hierarchical data, like tags, page graphs in CMSes,
6
6
  and tracking user referrals.
7
7
 
8
- Mostly API-compatible with other popular nesting gems for Rails, like
9
- [ancestry](https://github.com/stefankroes/ancestry),
10
- [acts_as_tree](https://github.com/amerine/acts_as_tree) and
11
- [awesome_nested_set](https://github.com/collectiveidea/awesome_nested_set/),
8
+ [![Build Status](https://secure.travis-ci.org/mceachen/closure_tree.png?branch=master)](http://travis-ci.org/mceachen/closure_tree)
9
+ [![Gem Version](https://badge.fury.io/rb/closure_tree.png)](http://rubygems.org/gems/closure_tree)
10
+
11
+ Substantially more efficient than
12
+ [ancestry](https://github.com/stefankroes/ancestry) and
13
+ [acts_as_tree](https://github.com/amerine/acts_as_tree), and even more
14
+ awesome than [awesome_nested_set](https://github.com/collectiveidea/awesome_nested_set/),
12
15
  closure_tree has some great features:
13
16
 
14
17
  * __Best-in-class select performance__:
@@ -93,8 +96,8 @@ Note that closure_tree only supports Rails 3.0 and later, and has test coverage
93
96
  6. Run ```rake db:migrate```
94
97
 
95
98
  7. If you're migrating from another system where your model already has a
96
- ```parent_id``` column, run ```Tag.rebuild!``` and the
97
- …_hierarchy table will be truncated and rebuilt.
99
+ ```parent_id``` column, run ```Tag.rebuild!``` and your
100
+ ```tag_hierarchies``` table will be truncated and rebuilt.
98
101
 
99
102
  If you're starting from scratch you don't need to call ```rebuild!```.
100
103
 
@@ -444,6 +447,16 @@ Parallelism is not tested with Rails 3.0.x nor 3.1.x due to this
444
447
 
445
448
  ## Change log
446
449
 
450
+ ### 4.0.1
451
+
452
+ * Numeric, deterministically ordered siblings will always be [0..#{self_and_siblings.count}]
453
+ (previously, the sort order might use negative values, which broke the preordering).
454
+ Resolves [issue 49](https://github.com/mceachen/closure_tree/issues/49). Thanks for the help,
455
+ [Leonel Galan](https://github.com/leonelgalan), [Juan Hoyos](https://github.com/elhoyos), and
456
+ [Michael Elfassy](https://github.com/elfassy)!
457
+
458
+ * The ```order``` option can be a symbol now. Resolves [issue 46](https://github.com/mceachen/closure_tree/issues/46).
459
+
447
460
  ### 4.0.0
448
461
 
449
462
  * Moved all of closure_tree's implementation-detail methods into a ```ClosureTree::Support```
@@ -45,6 +45,14 @@ module ClosureTree
45
45
  :through => :descendant_hierarchies,
46
46
  :source => :descendant,
47
47
  :order => "#{_ct.quoted_hierarchy_table_name}.generations asc")
48
+
49
+ scope :without, lambda { |instance|
50
+ if instance.new_record?
51
+ scoped
52
+ else
53
+ where(["#{_ct.quoted_table_name}.#{_ct.base_class.primary_key} != ?", instance.id])
54
+ end
55
+ }
48
56
  end
49
57
 
50
58
  # Delegate to the Support instance on the class:
@@ -110,8 +118,7 @@ module ClosureTree
110
118
  end
111
119
 
112
120
  def self_and_siblings
113
- s = _ct.base_class.where(_ct.parent_column_sym => parent)
114
- _ct.order_option.present? ? s.order(_ct.quoted_order_column) : s
121
+ _ct.scope_with_order(_ct.base_class.where(_ct.parent_column_sym => parent_id))
115
122
  end
116
123
 
117
124
  def siblings
@@ -249,8 +256,7 @@ module ClosureTree
249
256
  end
250
257
 
251
258
  def without_self(scope)
252
- return scope if self.new_record?
253
- scope.where(["#{_ct.quoted_table_name}.#{_ct.base_class.primary_key} != ?", self])
259
+ scope.without(self)
254
260
  end
255
261
 
256
262
  module ClassMethods
@@ -52,41 +52,35 @@ module ClosureTree
52
52
  end
53
53
  end
54
54
 
55
- def append_sibling(sibling_node, use_update_all = true)
56
- add_sibling(sibling_node, use_update_all, true)
55
+ def append_sibling(sibling_node)
56
+ add_sibling(sibling_node, true)
57
57
  end
58
58
 
59
- def prepend_sibling(sibling_node, use_update_all = true)
60
- add_sibling(sibling_node, use_update_all, false)
59
+ def prepend_sibling(sibling_node)
60
+ add_sibling(sibling_node, false)
61
61
  end
62
62
 
63
- def add_sibling(sibling_node, use_update_all = true, add_after = true)
63
+ def add_sibling(sibling_node, add_after = true)
64
64
  fail "can't add self as sibling" if self == sibling_node
65
65
  # issue 40: we need to lock the parent to prevent deadlocks on parallel sibling additions
66
66
  ct_with_advisory_lock do
67
- # issue 18: we need to set the order_value explicitly so subsequent orders will work.
68
- update_attribute(:order_value, 0) if self.order_value.nil?
69
- sibling_node.order_value = self.order_value.to_i + (add_after ? 1 : -1)
70
- # We need to incr the before_siblings to make room for sibling_node:
71
- if use_update_all
72
- col = _ct.quoted_order_column(false)
73
- # issue 21: we have to use the base class, so STI doesn't get in the way of only updating the child class instances:
74
- _ct.base_class.update_all(
75
- ["#{col} = #{col} #{add_after ? '+' : '-'} 1", "updated_at = now()"],
76
- ["#{_ct.quoted_parent_column_name} = ? AND #{col} #{add_after ? '>=' : '<='} ?",
77
- parent_id,
78
- sibling_node.order_value])
79
- else
80
- last_value = sibling_node.order_value.to_i
81
- (add_after ? siblings_after : siblings_before.reverse).each do |ea|
82
- last_value += (add_after ? 1 : -1)
83
- ea.order_value = last_value
84
- ea.save!
85
- end
67
+ if self.order_value.nil? || siblings_before.without(sibling_node).empty?
68
+ update_attribute(:order_value, 0)
86
69
  end
87
70
  sibling_node.parent = self.parent
88
- sibling_node.save!
89
- sibling_node.reload
71
+ starting_order_value = self.order_value.to_i
72
+ to_reorder = siblings_after.without(sibling_node).to_a
73
+ if add_after
74
+ to_reorder.unshift(sibling_node)
75
+ else
76
+ to_reorder.unshift(self)
77
+ sibling_node.update_attribute(:order_value, starting_order_value)
78
+ end
79
+
80
+ to_reorder.each_with_index do |ea, idx|
81
+ ea.update_attribute(:order_value, starting_order_value + idx + 1)
82
+ end
83
+ sibling_node.reload # because the parent may have changed.
90
84
  end
91
85
  end
92
86
  end
@@ -13,9 +13,7 @@ module ClosureTree
13
13
  :name_column => 'name',
14
14
  :with_advisory_lock => true
15
15
  }.merge(options)
16
-
17
16
  raise IllegalArgumentException, "name_column can't be 'path'" if options[:name_column] == 'path'
18
-
19
17
  end
20
18
 
21
19
  def connection
@@ -101,24 +99,24 @@ module ClosureTree
101
99
  connection.quote(field)
102
100
  end
103
101
 
102
+ def order_option?
103
+ !options[:order].nil?
104
+ end
105
+
104
106
  def order_option
105
- options[:order]
107
+ options[:order].to_s
106
108
  end
107
109
 
108
110
  def with_order_option(options)
109
- order_option ? options.merge(:order => order_option) : options
111
+ order_option? ? options.merge(:order => order_option) : options
110
112
  end
111
113
 
112
114
  def scope_with_order(scope, additional_order_by = nil)
113
- if order_option
114
- scope.order(*([additional_order_by, order_option].compact))
115
- else
116
- scope
117
- end
115
+ order_option? ? scope.order(*([additional_order_by, order_option].compact)) : scope
118
116
  end
119
117
 
120
118
  def with_order_option(options)
121
- if order_option
119
+ if order_option?
122
120
  options[:order] = [options[:order], order_option].compact.join(",")
123
121
  end
124
122
  options
@@ -126,14 +124,13 @@ module ClosureTree
126
124
 
127
125
  def order_is_numeric?
128
126
  # The table might not exist yet (in the case of ActiveRecord::Observer use, see issue 32)
129
- return false if order_option.nil? || !model_class.table_exists?
127
+ return false if !order_option? || !model_class.table_exists?
130
128
  c = model_class.columns_hash[order_option]
131
129
  c && c.type == :integer
132
130
  end
133
131
 
134
132
  def order_column
135
- o = order_option
136
- o.split(' ', 2).first if o
133
+ order_option.split(' ', 2).first if order_option?
137
134
  end
138
135
 
139
136
  def require_order_column
@@ -1,3 +1,3 @@
1
1
  module ClosureTree
2
- VERSION = "4.0.0" unless defined?(::ClosureTree::VERSION)
2
+ VERSION = "4.0.1" unless defined?(::ClosureTree::VERSION)
3
3
  end
@@ -230,7 +230,7 @@ describe Label do
230
230
  end
231
231
 
232
232
  it "when inserted before" do
233
- @b.append_sibling(@a, use_update_all = false)
233
+ @b.append_sibling(@a)
234
234
  # Have to reload because the sort_order will have changed out from under the references:
235
235
  @b.reload.sort_order.should be < @a.reload.sort_order
236
236
  @a.reload.sort_order.should be < @c.reload.sort_order
@@ -245,15 +245,19 @@ describe Label do
245
245
 
246
246
  a.append_sibling(b)
247
247
  root.reload.children.collect(&:name).should == %w(a b)
248
+ root.reload.children.collect(&:sort_order).should == [0, 1]
248
249
 
249
250
  a.prepend_sibling(b)
250
251
  root.reload.children.collect(&:name).should == %w(b a)
252
+ root.reload.children.collect(&:sort_order).should == [0, 1]
251
253
 
252
254
  a.append_sibling(c)
253
255
  root.reload.children.collect(&:name).should == %w(b a c)
256
+ root.reload.children.collect(&:sort_order).should == [0, 1, 2]
254
257
 
255
258
  b.append_sibling(c)
256
259
  root.reload.children.collect(&:name).should == %w(b c a)
260
+ root.reload.children.collect(&:sort_order).should == [0, 1, 2]
257
261
  end
258
262
 
259
263
  context "Deterministic siblings sort with custom integer column" do
@@ -280,9 +284,9 @@ describe Label do
280
284
  end
281
285
 
282
286
  it "should prepend a node as a sibling of another node (!update_all)" do
283
- labels(:c16).prepend_sibling(labels(:c17), false)
287
+ labels(:c16).prepend_sibling(labels(:c17))
284
288
  labels(:c16).self_and_siblings.to_a.should == [labels(:c17), labels(:c16), labels(:c18), labels(:c19)]
285
- labels(:c19).reload.prepend_sibling(labels(:c16).reload, false)
289
+ labels(:c19).reload.prepend_sibling(labels(:c16).reload)
286
290
  labels(:c16).self_and_siblings.to_a.should == [labels(:c17), labels(:c18), labels(:c16), labels(:c19)]
287
291
  labels(:c16).siblings_before.to_a.should == [labels(:c17), labels(:c18)]
288
292
  labels(:c16).siblings_after.to_a.should == [labels(:c19)]
@@ -316,7 +320,7 @@ describe Label do
316
320
 
317
321
  it "should move a node before another node" do
318
322
  labels(:c2).ancestry_path.should == %w{a1 b2 c2}
319
- labels(:b2).prepend_sibling(labels(:c2), false)
323
+ labels(:b2).prepend_sibling(labels(:c2))
320
324
  labels(:c2).ancestry_path.should == %w{a1 c2}
321
325
  labels(:c2).self_and_siblings.to_a.should == [labels(:b1), labels(:c2), labels(:b2)]
322
326
  end
@@ -343,10 +347,10 @@ describe Label do
343
347
 
344
348
  it "should move a node after another node" do
345
349
  labels(:c2).ancestry_path.should == %w{a1 b2 c2}
346
- labels(:b2).append_sibling(labels(:c2), false)
350
+ labels(:b2).append_sibling(labels(:c2))
347
351
  labels(:c2).ancestry_path.should == %w{a1 c2}
348
352
  labels(:c2).self_and_siblings.to_a.should == [labels(:b1), labels(:b2), labels(:c2)]
349
- labels(:c2).append_sibling(labels(:e2), false)
353
+ labels(:c2).append_sibling(labels(:e2))
350
354
  labels(:e2).self_and_siblings.to_a.should == [labels(:b1), labels(:b2), labels(:c2), labels(:e2)]
351
355
  labels(:a1).self_and_descendants.collect(&:name).should == %w(a1 b1 b2 c2 e2 d2 c1-six c1-seven c1-eight c1-nine)
352
356
  labels(:a1).leaves.collect(&:name).should == %w(b2 e2 d2 c1-six c1-seven c1-eight c1-nine)
@@ -43,8 +43,8 @@ class Contract < ActiveRecord::Base
43
43
  end
44
44
 
45
45
  class Label < ActiveRecord::Base
46
- attr_accessible :name # < - make sure order doesn't matter
47
- acts_as_tree :order => "sort_order",
46
+ attr_accessible :name # <- make sure order doesn't matter
47
+ acts_as_tree :order => :sort_order, # <- LOOK IT IS A SYMBOL OMG
48
48
  :parent_column_name => "mother_id",
49
49
  :dependent => :destroy
50
50
 
@@ -116,7 +116,7 @@ describe "empty db" do
116
116
  end
117
117
 
118
118
  it "supports siblings" do
119
- User._ct.order_option.should be_nil
119
+ User._ct.order_option?.should be_false
120
120
  a = User.create(:email => "a")
121
121
  b1 = a.children.create(:email => "b1")
122
122
  b2 = a.children.create(:email => "b2")
@@ -127,7 +127,7 @@ describe "empty db" do
127
127
 
128
128
  context "when a user is not yet saved" do
129
129
  it "supports siblings" do
130
- User._ct.order_option.should be_nil
130
+ User._ct.order_option?.should be_false
131
131
  a = User.create(:email => "a")
132
132
  b1 = a.children.new(:email => "b1")
133
133
  b2 = a.children.create(:email => "b2")
metadata CHANGED
@@ -1,205 +1,190 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: closure_tree
3
- version: !ruby/object:Gem::Version
4
- hash: 63
5
- prerelease:
6
- segments:
7
- - 4
8
- - 0
9
- - 0
10
- version: 4.0.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 4.0.1
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Matthew McEachen
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2013-05-18 00:00:00 -07:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
22
- requirement: &id001 !ruby/object:Gem::Requirement
23
- none: false
24
- requirements:
25
- - - ">="
26
- - !ruby/object:Gem::Version
27
- hash: 7
28
- segments:
29
- - 3
30
- - 0
31
- - 0
11
+ date: 2013-05-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activerecord
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
32
19
  version: 3.0.0
33
20
  type: :runtime
34
- name: activerecord
35
- version_requirements: *id001
36
21
  prerelease: false
37
- - !ruby/object:Gem::Dependency
38
- requirement: &id002 !ruby/object:Gem::Requirement
39
- none: false
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- hash: 19
44
- segments:
45
- - 0
46
- - 0
47
- - 6
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 3.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: with_advisory_lock
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
48
33
  version: 0.0.6
49
34
  type: :runtime
50
- name: with_advisory_lock
51
- version_requirements: *id002
52
35
  prerelease: false
53
- - !ruby/object:Gem::Dependency
54
- requirement: &id003 !ruby/object:Gem::Requirement
55
- none: false
56
- requirements:
57
- - - ">="
58
- - !ruby/object:Gem::Version
59
- hash: 3
60
- segments:
61
- - 0
62
- version: "0"
63
- type: :development
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: 0.0.6
41
+ - !ruby/object:Gem::Dependency
64
42
  name: rake
65
- version_requirements: *id003
66
- prerelease: false
67
- - !ruby/object:Gem::Dependency
68
- requirement: &id004 !ruby/object:Gem::Requirement
69
- none: false
70
- requirements:
71
- - - ">="
72
- - !ruby/object:Gem::Version
73
- hash: 3
74
- segments:
75
- - 0
76
- version: "0"
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
77
48
  type: :development
78
- name: yard
79
- version_requirements: *id004
80
49
  prerelease: false
81
- - !ruby/object:Gem::Dependency
82
- requirement: &id005 !ruby/object:Gem::Requirement
83
- none: false
84
- requirements:
85
- - - ">="
86
- - !ruby/object:Gem::Version
87
- hash: 3
88
- segments:
89
- - 0
90
- version: "0"
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: yard
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
91
62
  type: :development
92
- name: rspec
93
- version_requirements: *id005
94
63
  prerelease: false
95
- - !ruby/object:Gem::Dependency
96
- requirement: &id006 !ruby/object:Gem::Requirement
97
- none: false
98
- requirements:
99
- - - ">="
100
- - !ruby/object:Gem::Version
101
- hash: 3
102
- segments:
103
- - 0
104
- version: "0"
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
105
76
  type: :development
106
- name: rails
107
- version_requirements: *id006
108
77
  prerelease: false
109
- - !ruby/object:Gem::Dependency
110
- requirement: &id007 !ruby/object:Gem::Requirement
111
- none: false
112
- requirements:
113
- - - ">="
114
- - !ruby/object:Gem::Version
115
- hash: 3
116
- segments:
117
- - 0
118
- version: "0"
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rails
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
119
90
  type: :development
120
- name: rspec-rails
121
- version_requirements: *id007
122
91
  prerelease: false
123
- - !ruby/object:Gem::Dependency
124
- requirement: &id008 !ruby/object:Gem::Requirement
125
- none: false
126
- requirements:
127
- - - ">="
128
- - !ruby/object:Gem::Version
129
- hash: 3
130
- segments:
131
- - 0
132
- version: "0"
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec-rails
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ! '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
133
104
  type: :development
134
- name: mysql2
135
- version_requirements: *id008
136
105
  prerelease: false
137
- - !ruby/object:Gem::Dependency
138
- requirement: &id009 !ruby/object:Gem::Requirement
139
- none: false
140
- requirements:
141
- - - ">="
142
- - !ruby/object:Gem::Version
143
- hash: 3
144
- segments:
145
- - 0
146
- version: "0"
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: mysql2
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
147
118
  type: :development
148
- name: pg
149
- version_requirements: *id009
150
119
  prerelease: false
151
- - !ruby/object:Gem::Dependency
152
- requirement: &id010 !ruby/object:Gem::Requirement
153
- none: false
154
- requirements:
155
- - - ">="
156
- - !ruby/object:Gem::Version
157
- hash: 3
158
- segments:
159
- - 0
160
- version: "0"
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ! '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: pg
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
161
132
  type: :development
162
- name: sqlite3
163
- version_requirements: *id010
164
133
  prerelease: false
165
- - !ruby/object:Gem::Dependency
166
- requirement: &id011 !ruby/object:Gem::Requirement
167
- none: false
168
- requirements:
169
- - - ">="
170
- - !ruby/object:Gem::Version
171
- hash: 3
172
- segments:
173
- - 0
174
- version: "0"
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ! '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: sqlite3
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ! '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
175
146
  type: :development
176
- name: uuidtools
177
- version_requirements: *id011
178
147
  prerelease: false
179
- - !ruby/object:Gem::Dependency
180
- requirement: &id012 !ruby/object:Gem::Requirement
181
- none: false
182
- requirements:
183
- - - ">="
184
- - !ruby/object:Gem::Version
185
- hash: 3
186
- segments:
187
- - 0
188
- version: "0"
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ! '>='
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: uuidtools
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ! '>='
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
189
160
  type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ! '>='
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
190
168
  name: strong_parameters
191
- version_requirements: *id012
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ! '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
192
175
  prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ! '>='
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
193
181
  description: Easily and efficiently make your ActiveRecord model support hierarchies
194
- email:
182
+ email:
195
183
  - matthew-github@mceachen.org
196
184
  executables: []
197
-
198
185
  extensions: []
199
-
200
186
  extra_rdoc_files: []
201
-
202
- files:
187
+ files:
203
188
  - lib/closure_tree/acts_as_tree.rb
204
189
  - lib/closure_tree/deterministic_ordering.rb
205
190
  - lib/closure_tree/model.rb
@@ -225,41 +210,30 @@ files:
225
210
  - spec/support/models.rb
226
211
  - spec/tag_spec.rb
227
212
  - spec/user_spec.rb
228
- has_rdoc: true
229
213
  homepage: http://matthew.mceachen.us/closure_tree
230
214
  licenses: []
231
-
215
+ metadata: {}
232
216
  post_install_message:
233
217
  rdoc_options: []
234
-
235
- require_paths:
218
+ require_paths:
236
219
  - lib
237
- required_ruby_version: !ruby/object:Gem::Requirement
238
- none: false
239
- requirements:
240
- - - ">="
241
- - !ruby/object:Gem::Version
242
- hash: 3
243
- segments:
244
- - 0
245
- version: "0"
246
- required_rubygems_version: !ruby/object:Gem::Requirement
247
- none: false
248
- requirements:
249
- - - ">="
250
- - !ruby/object:Gem::Version
251
- hash: 3
252
- segments:
253
- - 0
254
- version: "0"
220
+ required_ruby_version: !ruby/object:Gem::Requirement
221
+ requirements:
222
+ - - ! '>='
223
+ - !ruby/object:Gem::Version
224
+ version: '0'
225
+ required_rubygems_version: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - ! '>='
228
+ - !ruby/object:Gem::Version
229
+ version: '0'
255
230
  requirements: []
256
-
257
231
  rubyforge_project:
258
- rubygems_version: 1.6.2
232
+ rubygems_version: 2.0.3
259
233
  signing_key:
260
- specification_version: 3
234
+ specification_version: 4
261
235
  summary: Easily and efficiently make your ActiveRecord model support hierarchies
262
- test_files:
236
+ test_files:
263
237
  - spec/cuisine_type_spec.rb
264
238
  - spec/db/database.yml
265
239
  - spec/db/schema.rb
@@ -274,3 +248,4 @@ test_files:
274
248
  - spec/support/models.rb
275
249
  - spec/tag_spec.rb
276
250
  - spec/user_spec.rb
251
+ has_rdoc: