closure_tree 6.6.0 → 7.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +7 -6
  3. data/Appraisals +59 -1
  4. data/CHANGELOG.md +21 -0
  5. data/Gemfile +0 -12
  6. data/README.md +40 -3
  7. data/closure_tree.gemspec +10 -7
  8. data/lib/closure_tree/finders.rb +15 -5
  9. data/lib/closure_tree/has_closure_tree.rb +2 -0
  10. data/lib/closure_tree/has_closure_tree_root.rb +2 -6
  11. data/lib/closure_tree/hash_tree_support.rb +1 -1
  12. data/lib/closure_tree/hierarchy_maintenance.rb +3 -3
  13. data/lib/closure_tree/model.rb +31 -1
  14. data/lib/closure_tree/numeric_deterministic_ordering.rb +11 -2
  15. data/lib/closure_tree/numeric_order_support.rb +3 -0
  16. data/lib/closure_tree/support.rb +7 -3
  17. data/lib/closure_tree/support_attributes.rb +9 -0
  18. data/lib/closure_tree/support_flags.rb +1 -4
  19. data/lib/closure_tree/version.rb +1 -1
  20. data/lib/generators/closure_tree/migration_generator.rb +8 -0
  21. data/lib/generators/closure_tree/templates/create_hierarchies_table.rb.erb +1 -1
  22. metadata +28 -76
  23. data/gemfiles/activerecord_4.2.gemfile +0 -19
  24. data/gemfiles/activerecord_5.0.gemfile +0 -19
  25. data/gemfiles/activerecord_5.1.gemfile +0 -19
  26. data/gemfiles/activerecord_edge.gemfile +0 -20
  27. data/img/example.png +0 -0
  28. data/img/preorder.png +0 -0
  29. data/spec/cache_invalidation_spec.rb +0 -39
  30. data/spec/cuisine_type_spec.rb +0 -38
  31. data/spec/db/database.yml +0 -21
  32. data/spec/db/models.rb +0 -128
  33. data/spec/db/schema.rb +0 -166
  34. data/spec/fixtures/tags.yml +0 -98
  35. data/spec/generators/migration_generator_spec.rb +0 -48
  36. data/spec/has_closure_tree_root_spec.rb +0 -154
  37. data/spec/hierarchy_maintenance_spec.rb +0 -16
  38. data/spec/label_spec.rb +0 -554
  39. data/spec/matcher_spec.rb +0 -34
  40. data/spec/metal_spec.rb +0 -55
  41. data/spec/model_spec.rb +0 -9
  42. data/spec/namespace_type_spec.rb +0 -13
  43. data/spec/parallel_spec.rb +0 -159
  44. data/spec/pool_spec.rb +0 -27
  45. data/spec/spec_helper.rb +0 -24
  46. data/spec/support/database.rb +0 -52
  47. data/spec/support/database_cleaner.rb +0 -14
  48. data/spec/support/exceed_query_limit.rb +0 -18
  49. data/spec/support/hash_monkey_patch.rb +0 -13
  50. data/spec/support/query_counter.rb +0 -18
  51. data/spec/support/sqlite3_with_advisory_lock.rb +0 -10
  52. data/spec/support_spec.rb +0 -14
  53. data/spec/tag_examples.rb +0 -665
  54. data/spec/tag_spec.rb +0 -6
  55. data/spec/user_spec.rb +0 -174
  56. data/spec/uuid_tag_spec.rb +0 -6
@@ -1,38 +0,0 @@
1
- require 'spec_helper'
2
-
3
- def assert_lineage(e, m)
4
- expect(m.parent).to eq(e)
5
- expect(m.self_and_ancestors).to eq([m, e])
6
-
7
- # make sure reloading doesn't affect the self_and_ancestors:
8
- m.reload
9
- expect(m.self_and_ancestors).to eq([m, e])
10
- end
11
-
12
- describe CuisineType do
13
- it "finds self and parents when children << is used" do
14
- e = CuisineType.new(:name => "e")
15
- m = CuisineType.new(:name => "m")
16
- e.children << m
17
- e.save
18
- assert_lineage(e, m)
19
- end
20
-
21
- it "finds self and parents properly if the constructor is used" do
22
- e = CuisineType.create(:name => "e")
23
- m = CuisineType.create(:name => "m", :parent => e)
24
- assert_lineage(e, m)
25
- end
26
-
27
- it "sets the table_name of the hierarchy class properly" do
28
- expect(CuisineTypeHierarchy.table_name).to eq(ActiveRecord::Base.table_name_prefix + "cuisine_type_hierarchies" + ActiveRecord::Base.table_name_suffix)
29
- end
30
-
31
- it 'fixes self_and_ancestors properly on reparenting' do
32
- a = CuisineType.create! :name => 'a'
33
- b = CuisineType.create! :name => 'b'
34
- expect(b.self_and_ancestors.to_a).to eq([b])
35
- a.children << b
36
- expect(b.self_and_ancestors.to_a).to eq([b, a])
37
- end
38
- end
@@ -1,21 +0,0 @@
1
- common: &common
2
- database: <%= db_name %>
3
- host: localhost
4
- pool: 50
5
- timeout: 5000
6
- reaping_frequency: 1000
7
- min_messages: ERROR
8
-
9
- sqlite:
10
- <<: *common
11
- adapter: <%= "jdbc" if defined? JRUBY_VERSION %>sqlite3
12
-
13
- postgresql:
14
- <<: *common
15
- adapter: postgresql
16
- username: postgres
17
-
18
- mysql:
19
- <<: *common
20
- adapter: mysql2
21
- username: root
@@ -1,128 +0,0 @@
1
- class Tag < ActiveRecord::Base
2
- has_closure_tree :dependent => :destroy, :order => :name
3
- before_destroy :add_destroyed_tag
4
-
5
- def to_s
6
- name
7
- end
8
-
9
- def add_destroyed_tag
10
- # Proof for the tests that the destroy rather than the delete method was called:
11
- DestroyedTag.create(:name => name)
12
- end
13
- end
14
-
15
- class UUIDTag < ActiveRecord::Base
16
- self.primary_key = :uuid
17
- before_create :set_uuid
18
- has_closure_tree dependent: :destroy, order: 'name', parent_column_name: 'parent_uuid'
19
- before_destroy :add_destroyed_tag
20
-
21
- def set_uuid
22
- self.uuid = SecureRandom.uuid
23
- end
24
-
25
- def to_s
26
- name
27
- end
28
-
29
- def add_destroyed_tag
30
- # Proof for the tests that the destroy rather than the delete method was called:
31
- DestroyedTag.create(:name => name)
32
- end
33
- end
34
-
35
- class DestroyedTag < ActiveRecord::Base
36
- end
37
-
38
- class Group < ActiveRecord::Base
39
- has_closure_tree_root :root_user
40
- end
41
-
42
- class Grouping < ActiveRecord::Base
43
- has_closure_tree_root :root_person, class_name: "User", foreign_key: :group_id
44
- end
45
-
46
- class UserSet < ActiveRecord::Base
47
- has_closure_tree_root :root_user, class_name: "Useur"
48
- end
49
-
50
- class Team < ActiveRecord::Base
51
- has_closure_tree_root :root_user, class_name: "User", foreign_key: :grp_id
52
- end
53
-
54
- class User < ActiveRecord::Base
55
- acts_as_tree :parent_column_name => "referrer_id",
56
- :name_column => 'email',
57
- :hierarchy_class_name => 'ReferralHierarchy',
58
- :hierarchy_table_name => 'referral_hierarchies'
59
-
60
- has_many :contracts, inverse_of: :user
61
- belongs_to :group # Can't use and don't need inverse_of here when using has_closure_tree_root.
62
-
63
- def indirect_contracts
64
- Contract.where(:user_id => descendant_ids)
65
- end
66
-
67
- def to_s
68
- email
69
- end
70
- end
71
-
72
- class Contract < ActiveRecord::Base
73
- belongs_to :user, inverse_of: :contracts
74
- belongs_to :contract_type, inverse_of: :contracts
75
- end
76
-
77
- class ContractType < ActiveRecord::Base
78
- has_many :contracts, inverse_of: :contract_type
79
- end
80
-
81
- class Label < ActiveRecord::Base
82
- # make sure order doesn't matter
83
- acts_as_tree :order => :column_whereby_ordering_is_inferred, # <- symbol, and not "sort_order"
84
- :parent_column_name => "mother_id",
85
- :dependent => :destroy
86
-
87
- def to_s
88
- "#{self.class}: #{name}"
89
- end
90
- end
91
-
92
- class EventLabel < Label
93
- end
94
-
95
- class DateLabel < Label
96
- end
97
-
98
- class DirectoryLabel < Label
99
- end
100
-
101
- class CuisineType < ActiveRecord::Base
102
- acts_as_tree
103
- end
104
-
105
- module Namespace
106
- def self.table_name_prefix
107
- 'namespace_'
108
- end
109
- class Type < ActiveRecord::Base
110
- has_closure_tree dependent: :destroy
111
- end
112
- end
113
-
114
- class Metal < ActiveRecord::Base
115
- self.table_name = "#{table_name_prefix}metal#{table_name_suffix}"
116
- has_closure_tree order: 'sort_order', name_column: 'value'
117
- self.inheritance_column = 'metal_type'
118
- end
119
-
120
- class Adamantium < Metal
121
- end
122
-
123
- class Unobtanium < Metal
124
- end
125
-
126
- class MenuItem < ActiveRecord::Base
127
- has_closure_tree touch: true, with_advisory_lock: false
128
- end
@@ -1,166 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- ActiveRecord::Schema.define(:version => 0) do
4
-
5
- create_table "tags" do |t|
6
- t.string "name"
7
- t.string "title"
8
- t.references "parent"
9
- t.integer "sort_order"
10
- t.timestamps null: false
11
- end
12
-
13
- add_foreign_key(:tags, :tags, :column => 'parent_id')
14
-
15
- create_table "tag_hierarchies", :id => false do |t|
16
- t.references "ancestor", :null => false
17
- t.references "descendant", :null => false
18
- t.integer "generations", :null => false
19
- end
20
-
21
- add_foreign_key(:tag_hierarchies, :tags, :column => 'ancestor_id')
22
- add_foreign_key(:tag_hierarchies, :tags, :column => 'descendant_id')
23
-
24
- create_table "uuid_tags", :id => false do |t|
25
- t.string "uuid", :unique => true
26
- t.string "name"
27
- t.string "title"
28
- t.string "parent_uuid"
29
- t.integer "sort_order"
30
- t.timestamps null: false
31
- end
32
-
33
- create_table "uuid_tag_hierarchies", :id => false do |t|
34
- t.string "ancestor_id", :null => false
35
- t.string "descendant_id", :null => false
36
- t.integer "generations", :null => false
37
- end
38
-
39
- create_table "destroyed_tags" do |t|
40
- t.string "name"
41
- end
42
-
43
- add_index "tag_hierarchies", [:ancestor_id, :descendant_id, :generations], :unique => true, :name => "tag_anc_desc_idx"
44
- add_index "tag_hierarchies", [:descendant_id], :name => "tag_desc_idx"
45
-
46
- create_table "groups" do |t|
47
- t.string "name", null: false
48
- end
49
-
50
- create_table "groupings" do |t|
51
- t.string "name", null: false
52
- end
53
-
54
- create_table "user_sets" do |t|
55
- t.string "name", null: false
56
- end
57
-
58
- create_table "teams" do |t|
59
- t.string "name", null: false
60
- end
61
-
62
- create_table "users" do |t|
63
- t.string "email"
64
- t.references "referrer"
65
- t.integer "group_id"
66
- t.timestamps null: false
67
- end
68
-
69
- add_foreign_key(:users, :users, :column => 'referrer_id')
70
-
71
- create_table "contracts" do |t|
72
- t.references "user", :null => false
73
- t.references "contract_type"
74
- t.string "title"
75
- end
76
-
77
- create_table "contract_types" do |t|
78
- t.string "name", :null => false
79
- end
80
-
81
- create_table "referral_hierarchies", :id => false do |t|
82
- t.references "ancestor", :null => false
83
- t.references "descendant", :null => false
84
- t.integer "generations", :null => false
85
- end
86
-
87
- add_index "referral_hierarchies", [:ancestor_id, :descendant_id, :generations], :unique => true, :name => "ref_anc_desc_idx"
88
- add_index "referral_hierarchies", [:descendant_id], :name => "ref_desc_idx"
89
-
90
- create_table "labels" do |t|
91
- t.string "name"
92
- t.string "type"
93
- t.integer "column_whereby_ordering_is_inferred"
94
- t.references "mother"
95
- end
96
-
97
- add_foreign_key(:labels, :labels, :column => 'mother_id')
98
-
99
- create_table "label_hierarchies", :id => false do |t|
100
- t.references "ancestor", :null => false
101
- t.references "descendant", :null => false
102
- t.integer "generations", :null => false
103
- end
104
-
105
- add_index "label_hierarchies", [:ancestor_id, :descendant_id, :generations], :unique => true, :name => "lh_anc_desc_idx"
106
- add_index "label_hierarchies", [:descendant_id], :name => "lh_desc_idx"
107
-
108
- create_table "cuisine_types" do |t|
109
- t.string "name"
110
- t.references "parent"
111
- end
112
-
113
- create_table "cuisine_type_hierarchies", :id => false do |t|
114
- t.references "ancestor", :null => false
115
- t.references "descendant", :null => false
116
- t.integer "generations", :null => false
117
- end
118
-
119
- create_table "namespace_types" do |t|
120
- t.string "name"
121
- t.references "parent"
122
- end
123
-
124
- create_table "namespace_type_hierarchies", :id => false do |t|
125
- t.references "ancestor", :null => false
126
- t.references "descendant", :null => false
127
- t.integer "generations", :null => false
128
- end
129
-
130
- create_table "metal" do |t|
131
- t.references "parent"
132
- t.string "metal_type"
133
- t.string "value"
134
- t.string "description"
135
- t.integer "sort_order"
136
- end
137
-
138
- add_foreign_key(:metal, :metal, :column => 'parent_id')
139
-
140
- create_table "metal_hierarchies", :id => false do |t|
141
- t.references "ancestor", :null => false
142
- t.references "descendant", :null => false
143
- t.integer "generations", :null => false
144
- end
145
-
146
- add_foreign_key(:metal_hierarchies, :metal, :column => 'ancestor_id')
147
- add_foreign_key(:metal_hierarchies, :metal, :column => 'descendant_id')
148
-
149
- create_table 'menu_items' do |t|
150
- t.string 'name'
151
- t.references 'parent'
152
- t.timestamps null: false
153
- end
154
-
155
- add_foreign_key(:menu_items, :menu_items, :column => 'parent_id')
156
-
157
- create_table 'menu_item_hierarchies', :id => false do |t|
158
- t.references 'ancestor', :null => false
159
- t.references 'descendant', :null => false
160
- t.integer 'generations', :null => false
161
- end
162
-
163
- add_foreign_key(:menu_item_hierarchies, :menu_items, :column => 'ancestor_id')
164
- add_foreign_key(:menu_item_hierarchies, :menu_items, :column => 'descendant_id')
165
-
166
- end
@@ -1,98 +0,0 @@
1
- # Read about fixtures at http://api.rubyonrails.org/classes/Fixtures.html
2
-
3
- grandparent:
4
- name: grandparent
5
- title: Nonnie
6
-
7
- parent:
8
- name: parent
9
- parent: grandparent
10
- title: Mom
11
-
12
- child:
13
- name: child
14
- parent: parent
15
- title: Kid
16
-
17
- people:
18
- name: people
19
-
20
- # people has no children
21
-
22
- events:
23
- name: events
24
-
25
- # events has only one child
26
-
27
- birthday:
28
- name: birthday
29
- parent: events
30
-
31
- places:
32
- name: places
33
-
34
- # places has many children, with many depths
35
-
36
- home:
37
- name: home
38
- parent: places
39
-
40
- indoor:
41
- name: indoor
42
- parent: places
43
-
44
- outdoor:
45
- name: outdoor
46
- parent: places
47
-
48
- museum:
49
- name: museum
50
- parent: places
51
-
52
- united_states:
53
- name: united_states
54
- parent: places
55
-
56
- california:
57
- name: california
58
- parent: united_states
59
-
60
- san_francisco:
61
- name: san_francisco
62
- parent: california
63
-
64
-
65
- # Move and deletion test tree
66
-
67
- a1:
68
- name: a1
69
-
70
- b1:
71
- name: b1
72
- parent: a1
73
-
74
- b2:
75
- name: b2
76
- parent: a1
77
-
78
- c1a:
79
- name: c1a
80
- parent: b1
81
- sort_order: 2
82
-
83
- c1b:
84
- name: c1b
85
- parent: b1
86
- sort_order: 1
87
-
88
- c2:
89
- name: c2
90
- parent: b2
91
-
92
- d2:
93
- name: d2
94
- parent: c2
95
-
96
- e2:
97
- name: e2
98
- parent: d2