closure_tree 3.10.0 → 3.10.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.
- checksums.yaml +5 -5
- data/README.md +11 -0
- data/lib/closure_tree/acts_as_tree.rb +7 -5
- data/lib/closure_tree/columns.rb +13 -0
- data/lib/closure_tree/version.rb +1 -1
- data/spec/db/schema.rb +11 -0
- data/spec/namespace_type_spec.rb +13 -0
- data/spec/parallel_prepend_sibling_spec.rb +1 -1
- data/spec/support/models.rb +7 -0
- data/spec/tag_spec.rb +10 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
SHA512:
|
3
|
-
metadata.gz: e94fc2a743703667fdfdc150ad5d24ea7799956355191476d15856f81213154f4f2cc8a0981ca978ad80278ccc1201b38ccd9143e1ec00e1ffa243a238ad1d8a
|
4
|
-
data.tar.gz: b5c221f82dbf36750c90a834632b550baa0b2e7d82bc3d9f41621716958e0ed26eb29be8ab480800ff5509b0dafd207dfef558f2079189a5b4f1be8b9eea6809
|
5
2
|
SHA1:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 50404d7f26719cd30625a177d0c7fbc9c4396843
|
4
|
+
data.tar.gz: 38ae281b5a8f92005839a0c2f08a4e4774881001
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c862247bb1c73a3e98bd531a51a49274d7478453ee77777927fdad9a88502aa5f733183690c538e49a37d307bbb868d726239189671eac6782ac0b618966a0dc
|
7
|
+
data.tar.gz: 6b533b01ff64e084af4c41e669d0847dc98f8464634b78e365ab2cc6d4245e7f4a0991b65701ca869ff67e4e3151ba30283b85d6f99553bbff9bfd345439cc5c
|
data/README.md
CHANGED
@@ -444,6 +444,17 @@ Parallelism is not tested with Rails 3.0.x nor 3.1.x due to this
|
|
444
444
|
|
445
445
|
## Change log
|
446
446
|
|
447
|
+
### 3.10.1
|
448
|
+
|
449
|
+
* Multipart constant names like "Admin::PageHierarchy" are now supported.
|
450
|
+
Resolves [issue 47](https://github.com/mceachen/closure_tree/issues/47).
|
451
|
+
Thanks for the perfect pull request, [Simon Menke](https://github.com/fd)!
|
452
|
+
|
453
|
+
* Committing transactions involving large numbers of hierarchy model classes was very slow due
|
454
|
+
to hash collisions in the hierarchy class. A better hash implementation addressed
|
455
|
+
[issue 48](https://github.com/mceachen/closure_tree/issues/48).
|
456
|
+
Thanks, [Joel Turkel](https://github.com/jturkel)!
|
457
|
+
|
447
458
|
### 3.10.0
|
448
459
|
|
449
460
|
* Added ```#roots_and_descendants_preordered```.
|
@@ -29,17 +29,19 @@ module ClosureTree
|
|
29
29
|
# Auto-inject the hierarchy table
|
30
30
|
# See https://github.com/patshaughnessy/class_factory/blob/master/lib/class_factory/class_factory.rb
|
31
31
|
class_attribute :hierarchy_class
|
32
|
-
self.hierarchy_class =
|
32
|
+
self.hierarchy_class = ct_class.parent.const_set short_hierarchy_class_name, Class.new(ActiveRecord::Base)
|
33
33
|
|
34
34
|
self.hierarchy_class.class_eval <<-RUBY
|
35
35
|
belongs_to :ancestor, :class_name => "#{ct_class.to_s}"
|
36
36
|
belongs_to :descendant, :class_name => "#{ct_class.to_s}"
|
37
37
|
attr_accessible :ancestor, :descendant, :generations
|
38
|
-
def ==(
|
39
|
-
|
40
|
-
self.attributes == comparison_object.attributes
|
38
|
+
def ==(other)
|
39
|
+
self.class == other.class && ancestor == other.ancestor && descendant == other.descendant
|
41
40
|
end
|
42
41
|
alias :eql? :==
|
42
|
+
def hash
|
43
|
+
ancestor_id.hash << 31 ^ descendant_id.hash
|
44
|
+
end
|
43
45
|
RUBY
|
44
46
|
|
45
47
|
self.hierarchy_class.table_name = hierarchy_table_name
|
@@ -51,4 +53,4 @@ module ClosureTree
|
|
51
53
|
end
|
52
54
|
end
|
53
55
|
end
|
54
|
-
end
|
56
|
+
end
|
data/lib/closure_tree/columns.rb
CHANGED
@@ -37,6 +37,19 @@ module ClosureTree
|
|
37
37
|
closure_tree_options[:hierarchy_class_name] || ct_class.to_s + "Hierarchy"
|
38
38
|
end
|
39
39
|
|
40
|
+
|
41
|
+
#
|
42
|
+
# Returns the constant name of the hierarchy_class
|
43
|
+
#
|
44
|
+
# @return [String] the constant name
|
45
|
+
#
|
46
|
+
# @example
|
47
|
+
# Namespace::Model.hierarchy_class_name # => "Namespace::ModelHierarchy"
|
48
|
+
# Namespace::Model.short_hierarchy_class_name # => "ModelHierarchy"
|
49
|
+
def short_hierarchy_class_name
|
50
|
+
hierarchy_class_name.split('::').last
|
51
|
+
end
|
52
|
+
|
40
53
|
def quoted_hierarchy_table_name
|
41
54
|
connection.quote_table_name hierarchy_table_name
|
42
55
|
end
|
data/lib/closure_tree/version.rb
CHANGED
data/spec/db/schema.rb
CHANGED
@@ -95,4 +95,15 @@ ActiveRecord::Schema.define(:version => 0) do
|
|
95
95
|
t.integer "descendant_id", :null => false
|
96
96
|
t.integer "generations", :null => false
|
97
97
|
end
|
98
|
+
|
99
|
+
create_table "namespace_types", :force => true do |t|
|
100
|
+
t.string "name"
|
101
|
+
t.integer "parent_id"
|
102
|
+
end
|
103
|
+
|
104
|
+
create_table "namespace_type_hierarchies", :id => false, :force => true do |t|
|
105
|
+
t.integer "ancestor_id", :null => false
|
106
|
+
t.integer "descendant_id", :null => false
|
107
|
+
t.integer "generations", :null => false
|
108
|
+
end
|
98
109
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Namespace::Type do
|
4
|
+
|
5
|
+
context "class injection" do
|
6
|
+
it "should build hierarchy classname correctly" do
|
7
|
+
Namespace::Type.hierarchy_class.to_s.should == "Namespace::TypeHierarchy"
|
8
|
+
Namespace::Type.hierarchy_class_name.should == "Namespace::TypeHierarchy"
|
9
|
+
Namespace::Type.short_hierarchy_class_name.should == "TypeHierarchy"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
@@ -42,4 +42,4 @@ describe "threadhot" do
|
|
42
42
|
end
|
43
43
|
|
44
44
|
# SQLite doesn't like parallelism, and Rails 3.0 and 3.1 have known threading issues. SKIP.
|
45
|
-
end if ((ENV["DB"] != "
|
45
|
+
end if ((ENV["DB"] != "sqlite") && (ActiveRecord::VERSION::STRING =~ /^3.2/))
|
data/spec/support/models.rb
CHANGED
data/spec/tag_spec.rb
CHANGED
@@ -130,6 +130,15 @@ shared_examples_for "Tag (1)" do
|
|
130
130
|
TagHierarchy.find_all_by_ancestor_id(@root.id).should == root_hiers
|
131
131
|
TagHierarchy.find_all_by_descendant_id(@root.id).should == root_hiers
|
132
132
|
end
|
133
|
+
|
134
|
+
it "should have different hash codes for each hierarchy model" do
|
135
|
+
hashes = TagHierarchy.all.map(&:hash)
|
136
|
+
hashes.should =~ hashes.uniq
|
137
|
+
end
|
138
|
+
|
139
|
+
it "should return the same hash code for equal hierarchy models" do
|
140
|
+
TagHierarchy.first.hash.should == TagHierarchy.first.hash
|
141
|
+
end
|
133
142
|
end
|
134
143
|
|
135
144
|
it "performs as the readme says it does" do
|
@@ -244,6 +253,7 @@ shared_examples_for "Tag (2)" do
|
|
244
253
|
it "should build hierarchy classname correctly" do
|
245
254
|
Tag.hierarchy_class.to_s.should == "TagHierarchy"
|
246
255
|
Tag.hierarchy_class_name.should == "TagHierarchy"
|
256
|
+
Tag.short_hierarchy_class_name.should == "TagHierarchy"
|
247
257
|
end
|
248
258
|
|
249
259
|
it "should have a correct parent column name" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: closure_tree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.10.
|
4
|
+
version: 3.10.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthew McEachen
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2013-03-
|
12
|
+
date: 2013-03-23 00:00:00 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
@@ -142,6 +142,7 @@ files:
|
|
142
142
|
- spec/fixtures/tags.yml
|
143
143
|
- spec/hash_tree_spec.rb
|
144
144
|
- spec/label_spec.rb
|
145
|
+
- spec/namespace_type_spec.rb
|
145
146
|
- spec/parallel_prepend_sibling_spec.rb
|
146
147
|
- spec/parallel_spec.rb
|
147
148
|
- spec/spec_helper.rb
|
@@ -179,6 +180,7 @@ test_files:
|
|
179
180
|
- spec/fixtures/tags.yml
|
180
181
|
- spec/hash_tree_spec.rb
|
181
182
|
- spec/label_spec.rb
|
183
|
+
- spec/namespace_type_spec.rb
|
182
184
|
- spec/parallel_prepend_sibling_spec.rb
|
183
185
|
- spec/parallel_spec.rb
|
184
186
|
- spec/spec_helper.rb
|