parentry 1.0.0 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "appraisal"
6
+ gem "activerecord", "6.0.0"
7
+
8
+ gemspec path: "../"
@@ -0,0 +1,143 @@
1
+ PATH
2
+ remote: ..
3
+ specs:
4
+ parentry (1.3.0)
5
+ activerecord (>= 5.1, < 6.2)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ actionpack (6.0.0)
11
+ actionview (= 6.0.0)
12
+ activesupport (= 6.0.0)
13
+ rack (~> 2.0)
14
+ rack-test (>= 0.6.3)
15
+ rails-dom-testing (~> 2.0)
16
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
17
+ actionview (6.0.0)
18
+ activesupport (= 6.0.0)
19
+ builder (~> 3.1)
20
+ erubi (~> 1.4)
21
+ rails-dom-testing (~> 2.0)
22
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
23
+ activemodel (6.0.0)
24
+ activesupport (= 6.0.0)
25
+ activerecord (6.0.0)
26
+ activemodel (= 6.0.0)
27
+ activesupport (= 6.0.0)
28
+ activesupport (6.0.0)
29
+ concurrent-ruby (~> 1.0, >= 1.0.2)
30
+ i18n (>= 0.7, < 2)
31
+ minitest (~> 5.1)
32
+ tzinfo (~> 1.1)
33
+ zeitwerk (~> 2.1, >= 2.1.8)
34
+ appraisal (2.2.0)
35
+ bundler
36
+ rake
37
+ thor (>= 0.14.0)
38
+ ast (2.4.0)
39
+ builder (3.2.3)
40
+ coderay (1.1.2)
41
+ combustion (1.1.1)
42
+ activesupport (>= 3.0.0)
43
+ railties (>= 3.0.0)
44
+ thor (>= 0.14.6)
45
+ concurrent-ruby (1.1.5)
46
+ crass (1.0.4)
47
+ database_cleaner (1.7.0)
48
+ diff-lcs (1.3)
49
+ docile (1.3.2)
50
+ erubi (1.8.0)
51
+ i18n (1.6.0)
52
+ concurrent-ruby (~> 1.0)
53
+ jaro_winkler (1.5.4)
54
+ json (2.3.1)
55
+ loofah (2.2.3)
56
+ crass (~> 1.0.2)
57
+ nokogiri (>= 1.5.9)
58
+ method_source (0.9.2)
59
+ mini_portile2 (2.4.0)
60
+ minitest (5.11.3)
61
+ nokogiri (1.10.7)
62
+ mini_portile2 (~> 2.4.0)
63
+ parallel (1.19.1)
64
+ parser (2.7.0.2)
65
+ ast (~> 2.4.0)
66
+ pg (1.2.2)
67
+ pry (0.12.2)
68
+ coderay (~> 1.1.0)
69
+ method_source (~> 0.9.0)
70
+ rack (2.0.7)
71
+ rack-test (1.1.0)
72
+ rack (>= 1.0, < 3)
73
+ rails-dom-testing (2.0.3)
74
+ activesupport (>= 4.2.0)
75
+ nokogiri (>= 1.6)
76
+ rails-html-sanitizer (1.2.0)
77
+ loofah (~> 2.2, >= 2.2.2)
78
+ railties (6.0.0)
79
+ actionpack (= 6.0.0)
80
+ activesupport (= 6.0.0)
81
+ method_source
82
+ rake (>= 0.8.7)
83
+ thor (>= 0.20.3, < 2.0)
84
+ rainbow (3.0.0)
85
+ rake (12.3.3)
86
+ rspec-core (3.8.2)
87
+ rspec-support (~> 3.8.0)
88
+ rspec-expectations (3.8.4)
89
+ diff-lcs (>= 1.2.0, < 2.0)
90
+ rspec-support (~> 3.8.0)
91
+ rspec-mocks (3.8.1)
92
+ diff-lcs (>= 1.2.0, < 2.0)
93
+ rspec-support (~> 3.8.0)
94
+ rspec-rails (3.8.2)
95
+ actionpack (>= 3.0)
96
+ activesupport (>= 3.0)
97
+ railties (>= 3.0)
98
+ rspec-core (~> 3.8.0)
99
+ rspec-expectations (~> 3.8.0)
100
+ rspec-mocks (~> 3.8.0)
101
+ rspec-support (~> 3.8.0)
102
+ rspec-support (3.8.2)
103
+ rubocop (0.79.0)
104
+ jaro_winkler (~> 1.5.1)
105
+ parallel (~> 1.10)
106
+ parser (>= 2.7.0.1)
107
+ rainbow (>= 2.2.2, < 4.0)
108
+ ruby-progressbar (~> 1.7)
109
+ unicode-display_width (>= 1.4.0, < 1.7)
110
+ rubocop-rspec (1.37.1)
111
+ rubocop (>= 0.68.1)
112
+ ruby-progressbar (1.10.1)
113
+ simplecov (0.17.0)
114
+ docile (~> 1.1)
115
+ json (>= 1.8, < 3)
116
+ simplecov-html (~> 0.10.0)
117
+ simplecov-html (0.10.2)
118
+ thor (0.20.3)
119
+ thread_safe (0.3.6)
120
+ tzinfo (1.2.8)
121
+ thread_safe (~> 0.1)
122
+ unicode-display_width (1.6.1)
123
+ zeitwerk (2.1.9)
124
+
125
+ PLATFORMS
126
+ ruby
127
+
128
+ DEPENDENCIES
129
+ activerecord (= 6.0.0)
130
+ appraisal
131
+ bundler (~> 2.1)
132
+ combustion (~> 1.1)
133
+ database_cleaner (~> 1.6)
134
+ parentry!
135
+ pg (~> 1.2)
136
+ pry (~> 0.10)
137
+ rake (~> 12.3)
138
+ rspec-rails (~> 3.7)
139
+ rubocop-rspec (~> 1.37)
140
+ simplecov (~> 0.16)
141
+
142
+ BUNDLED WITH
143
+ 2.1.4
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "appraisal"
6
+ gem "activerecord", "6.0.0"
7
+
8
+ gemspec path: "../"
@@ -0,0 +1,147 @@
1
+ PATH
2
+ remote: ..
3
+ specs:
4
+ parentry (1.3.0)
5
+ activerecord (>= 5.1, < 6.2)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ actionpack (6.0.0)
11
+ actionview (= 6.0.0)
12
+ activesupport (= 6.0.0)
13
+ rack (~> 2.0)
14
+ rack-test (>= 0.6.3)
15
+ rails-dom-testing (~> 2.0)
16
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
17
+ actionview (6.0.0)
18
+ activesupport (= 6.0.0)
19
+ builder (~> 3.1)
20
+ erubi (~> 1.4)
21
+ rails-dom-testing (~> 2.0)
22
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
23
+ activemodel (6.0.0)
24
+ activesupport (= 6.0.0)
25
+ activerecord (6.0.0)
26
+ activemodel (= 6.0.0)
27
+ activesupport (= 6.0.0)
28
+ activesupport (6.0.0)
29
+ concurrent-ruby (~> 1.0, >= 1.0.2)
30
+ i18n (>= 0.7, < 2)
31
+ minitest (~> 5.1)
32
+ tzinfo (~> 1.1)
33
+ zeitwerk (~> 2.1, >= 2.1.8)
34
+ appraisal (2.3.0)
35
+ bundler
36
+ rake
37
+ thor (>= 0.14.0)
38
+ ast (2.4.1)
39
+ builder (3.2.4)
40
+ coderay (1.1.3)
41
+ combustion (1.3.1)
42
+ activesupport (>= 3.0.0)
43
+ railties (>= 3.0.0)
44
+ thor (>= 0.14.6)
45
+ concurrent-ruby (1.1.7)
46
+ crass (1.0.6)
47
+ database_cleaner (1.8.5)
48
+ diff-lcs (1.4.4)
49
+ docile (1.3.2)
50
+ erubi (1.10.0)
51
+ i18n (1.8.5)
52
+ concurrent-ruby (~> 1.0)
53
+ loofah (2.7.0)
54
+ crass (~> 1.0.2)
55
+ nokogiri (>= 1.5.9)
56
+ method_source (1.0.0)
57
+ mini_portile2 (2.4.0)
58
+ minitest (5.14.2)
59
+ nokogiri (1.10.10)
60
+ mini_portile2 (~> 2.4.0)
61
+ parallel (1.20.0)
62
+ parser (2.7.2.0)
63
+ ast (~> 2.4.1)
64
+ pg (1.2.3)
65
+ pry (0.13.1)
66
+ coderay (~> 1.1)
67
+ method_source (~> 1.0)
68
+ rack (2.2.3)
69
+ rack-test (1.1.0)
70
+ rack (>= 1.0, < 3)
71
+ rails-dom-testing (2.0.3)
72
+ activesupport (>= 4.2.0)
73
+ nokogiri (>= 1.6)
74
+ rails-html-sanitizer (1.3.0)
75
+ loofah (~> 2.3)
76
+ railties (6.0.0)
77
+ actionpack (= 6.0.0)
78
+ activesupport (= 6.0.0)
79
+ method_source
80
+ rake (>= 0.8.7)
81
+ thor (>= 0.20.3, < 2.0)
82
+ rainbow (3.0.0)
83
+ rake (12.3.3)
84
+ regexp_parser (1.8.2)
85
+ rexml (3.2.4)
86
+ rspec-core (3.9.3)
87
+ rspec-support (~> 3.9.3)
88
+ rspec-expectations (3.9.3)
89
+ diff-lcs (>= 1.2.0, < 2.0)
90
+ rspec-support (~> 3.9.0)
91
+ rspec-mocks (3.9.1)
92
+ diff-lcs (>= 1.2.0, < 2.0)
93
+ rspec-support (~> 3.9.0)
94
+ rspec-rails (3.9.1)
95
+ actionpack (>= 3.0)
96
+ activesupport (>= 3.0)
97
+ railties (>= 3.0)
98
+ rspec-core (~> 3.9.0)
99
+ rspec-expectations (~> 3.9.0)
100
+ rspec-mocks (~> 3.9.0)
101
+ rspec-support (~> 3.9.0)
102
+ rspec-support (3.9.4)
103
+ rubocop (0.93.1)
104
+ parallel (~> 1.10)
105
+ parser (>= 2.7.1.5)
106
+ rainbow (>= 2.2.2, < 4.0)
107
+ regexp_parser (>= 1.8)
108
+ rexml
109
+ rubocop-ast (>= 0.6.0)
110
+ ruby-progressbar (~> 1.7)
111
+ unicode-display_width (>= 1.4.0, < 2.0)
112
+ rubocop-ast (1.1.1)
113
+ parser (>= 2.7.1.5)
114
+ rubocop-rspec (1.44.1)
115
+ rubocop (~> 0.87)
116
+ rubocop-ast (>= 0.7.1)
117
+ ruby-progressbar (1.10.1)
118
+ simplecov (0.19.1)
119
+ docile (~> 1.1)
120
+ simplecov-html (~> 0.11)
121
+ simplecov-html (0.12.3)
122
+ thor (1.0.1)
123
+ thread_safe (0.3.6)
124
+ tzinfo (1.2.8)
125
+ thread_safe (~> 0.1)
126
+ unicode-display_width (1.7.0)
127
+ zeitwerk (2.4.2)
128
+
129
+ PLATFORMS
130
+ ruby
131
+
132
+ DEPENDENCIES
133
+ activerecord (= 6.0.0)
134
+ appraisal
135
+ bundler (~> 2.1)
136
+ combustion (~> 1.1)
137
+ database_cleaner (~> 1.6)
138
+ parentry!
139
+ pg (~> 1.2)
140
+ pry (~> 0.10)
141
+ rake (~> 12.3)
142
+ rspec-rails (~> 3.7)
143
+ rubocop-rspec (~> 1.37)
144
+ simplecov (~> 0.16)
145
+
146
+ BUNDLED WITH
147
+ 2.1.4
@@ -6,50 +6,49 @@ module Parentry
6
6
  autoload :Navigation, 'parentry/navigation'
7
7
  autoload :ClassMethods, 'parentry/class_methods'
8
8
 
9
- def self.included(base)
10
- base.class_eval do
11
- mattr_accessor :parentry_strategy, :parentry_column, :depth_offset, :cache_depth, :touch_ancestors
12
-
13
- belongs_to :parent, class_name: base_class.name
14
- has_many :children, class_name: base_class.name, foreign_key: :parent_id, dependent: :destroy
15
-
16
- validate do
17
- unless parent.blank? || parent.persisted?
18
- errors.add(:parent, 'must be persisted')
19
- end
20
- end
21
-
22
- validate :prevent_circular_parentry
23
-
24
- after_create :commit_parentry
25
- before_update :assign_parentry, if: proc { changes[:parent_id].present? }
26
- after_update :cascade_parentry, if: proc { saved_changes[parentry_column].present? }
27
-
28
- before_validation :cache_parentry_depth, if: proc { cache_depth }
29
- before_save :cache_parentry_depth, if: proc { cache_depth }
30
-
31
- after_save :touch_ancestors_callback
32
- after_touch :touch_ancestors_callback
33
- after_destroy :touch_ancestors_callback
34
-
35
- scope :order_by_parentry, -> { order(parentry_depth_function) }
36
-
37
- scope :before_depth, ->(depth) { where("#{parentry_depth_function} - 1 < ?", depth + depth_offset) }
38
- scope :to_depth, ->(depth) { where("#{parentry_depth_function} - 1 <= ?", depth + depth_offset) }
39
- scope :at_depth, ->(depth) { where("#{parentry_depth_function} - 1 = ?", depth + depth_offset) }
40
- scope :from_depth, ->(depth) { where("#{parentry_depth_function} - 1 >= ?", depth + depth_offset) }
41
- scope :after_depth, ->(depth) { where("#{parentry_depth_function} - 1 > ?", depth + depth_offset) }
42
-
43
- scope :roots, -> { where("#{parentry_depth_function} = 1") }
44
- scope :ancestors_of, ->(node) { where(node.ancestor_conditions).where.not(id: node.id) }
45
- scope :children_of, ->(node) { where(parent_id: node.id) }
46
- scope :descendants_of, ->(node) { subtree_of(node).where.not(id: node.id) }
47
- scope :subtree_of, ->(node) { where(node.subtree_conditions) }
48
- scope :siblings_of, ->(node) { where(parent_id: node.parent_id).where.not(id: node.id) }
9
+ extend ActiveSupport::Concern
10
+
11
+ # rubocop:disable Metrics/BlockLength
12
+ included do
13
+ include Navigation
14
+ include InstanceMethods
15
+
16
+ mattr_accessor :parentry_strategy, :parentry_column, :depth_offset, :cache_depth, :touch_ancestors
17
+
18
+ belongs_to :parent, class_name: base_class.name, optional: true
19
+ has_many :children, class_name: base_class.name, foreign_key: :parent_id, dependent: :destroy
20
+
21
+ validate do
22
+ errors.add(:parent, 'must be persisted') unless parent.blank? || parent.persisted?
49
23
  end
50
24
 
51
- base.send :include, Navigation
52
- base.send :include, InstanceMethods
53
- base.extend ClassMethods
25
+ validate :prevent_circular_parentry
26
+
27
+ after_create :commit_parentry
28
+ before_update :assign_parentry, if: proc { changes[:parent_id].present? }
29
+ after_update :cascade_parentry, if: proc { saved_changes[parentry_column].present? }
30
+
31
+ before_validation :cache_parentry_depth, if: proc { cache_depth }
32
+ before_save :cache_parentry_depth, if: proc { cache_depth }
33
+
34
+ after_save :touch_ancestors_callback
35
+ after_touch :touch_ancestors_callback
36
+ after_destroy :touch_ancestors_callback
37
+
38
+ scope :order_by_parentry, -> { order(parentry_depth_function) }
39
+
40
+ scope :before_depth, ->(depth) { where("#{parentry_depth_function} - 1 < ?", depth + depth_offset) }
41
+ scope :to_depth, ->(depth) { where("#{parentry_depth_function} - 1 <= ?", depth + depth_offset) }
42
+ scope :at_depth, ->(depth) { where("#{parentry_depth_function} - 1 = ?", depth + depth_offset) }
43
+ scope :from_depth, ->(depth) { where("#{parentry_depth_function} - 1 >= ?", depth + depth_offset) }
44
+ scope :after_depth, ->(depth) { where("#{parentry_depth_function} - 1 > ?", depth + depth_offset) }
45
+
46
+ scope :roots, -> { where("#{parentry_depth_function} = 1") }
47
+ scope :ancestors_of, ->(node) { where(node.ancestor_conditions).where.not(id: node.id) }
48
+ scope :children_of, ->(node) { where(parent_id: node.id) }
49
+ scope :descendants_of, ->(node) { subtree_of(node).where.not(id: node.id) }
50
+ scope :subtree_of, ->(node) { where(node.subtree_conditions) }
51
+ scope :siblings_of, ->(node) { where(parent_id: node.parent_id).where.not(id: node.id) }
54
52
  end
53
+ # rubocop:enable Metrics/BlockLength
55
54
  end
@@ -11,12 +11,13 @@ module Parentry
11
11
  include Strategy::Array if parentry_strategy == 'array'
12
12
  end
13
13
 
14
+ # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
14
15
  def arrange(options = {})
15
16
  scope =
16
17
  if (order = options.delete(:order))
17
- self.base_class.order_by_parentry.order(order)
18
+ base_class.order_by_parentry.order(order)
18
19
  else
19
- self.base_class.order_by_parentry
20
+ base_class.order_by_parentry
20
21
  end
21
22
 
22
23
  scope.where(options).each_with_object(Hash.new { |h, k| h[k] = {} }) do |node, memo|
@@ -27,5 +28,6 @@ module Parentry
27
28
  insert_node[node] = {}
28
29
  end
29
30
  end
31
+ # rubocop:enable Metrics/AbcSize,Metrics/MethodLength
30
32
  end
31
33
  end
@@ -46,6 +46,7 @@ module Parentry
46
46
 
47
47
  def ancestor_ids_was
48
48
  return [] unless saved_changes[parentry_column]
49
+
49
50
  parse_parentry(saved_changes[parentry_column][0]).tap(&:pop)
50
51
  end
51
52
  end
@@ -33,9 +33,9 @@ module Parentry
33
33
  end
34
34
 
35
35
  def leaf?
36
- children.size == 0
36
+ children.size.zero?
37
37
  end
38
- alias_method :childless?, :leaf?
38
+ alias childless? leaf?
39
39
 
40
40
  def children?
41
41
  !leaf?
@@ -50,7 +50,7 @@ module Parentry
50
50
  end
51
51
 
52
52
  def siblings?
53
- siblings.size > 0
53
+ siblings.size.positive?
54
54
  end
55
55
 
56
56
  def only_child?
@@ -80,6 +80,7 @@ module Parentry
80
80
  def depth
81
81
  return depth_offset if root?
82
82
  return parent.depth + 1 if changes[:parent_id].present?
83
+
83
84
  path_ids.size - 1 + depth_offset
84
85
  end
85
86