ancestry 4.0.0 → 4.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d7d01ac0d4c8faa7ad66a0a8e5454625d723fc9226a7e0eb84b358fd25003148
4
- data.tar.gz: e27cf882086e2c674972251bf35a52eca003d601dcf5d9ba390c1785f8900033
3
+ metadata.gz: 236bf763182abf156d175085f58ec757d196523e4b6f388cfbd4830768194adb
4
+ data.tar.gz: b69ba3c642ee2ea03f46c62c23e7f45207d366f57ccfce2e77d0040fe3286a00
5
5
  SHA512:
6
- metadata.gz: b2b1a7a69fa27d6f40f1c39a700c5926d3fa1b5da4637800b87d1ad274458cb0ca39a497d505f2b6224031914a484349cef8c433b191ba131e1396431fce767d
7
- data.tar.gz: 9fd95019be895afcc8eeee14be8a7776a90a29ded86d25a3cb82a92097cfa7a141f8a765a062e4ac6f5665e6bf7656d8e9fbde030329b713f286f9d96fa179b7
6
+ metadata.gz: 0a29628a71c79f4d2889620833f91c25266bf491e0925edf8cdf38a74f0ee813f186ffc9dd1beb4d134ea0bcdb091a619f00fafcd557305a797468f4601cd75c
7
+ data.tar.gz: 9cbe99bad12c8b2a6a8a6f09b003d5ce17530e668f2dcf17be9502053606d26bf4f9b7ee7493a13a7b4d9fc44df8cd5d450477604fdbfa1aafbd2877193dc894
data/CHANGELOG.md CHANGED
@@ -5,6 +5,14 @@ a nice looking [Changelog](http://keepachangelog.com).
5
5
 
6
6
  ## Version [HEAD] <sub><sup>now</sub></sup>
7
7
 
8
+ ## Version [4.1.0] <sub><sup>2021-06-25</sub></sup>
9
+
10
+ * `parent` with an invalid id now returns nil (thx @vanboom)
11
+ * `root` returns self if ancestry is invalid (thx @vanboom)
12
+ * fix case where invalid object prevented ancestry updates (thx @d-m-u)
13
+ * oracleenhanced uses nulls first for sorting (thx @lual)
14
+ * fix counter cache and STI (thx @mattvague)
15
+
8
16
  ## Version [4.0.0] <sub><sup>2021-04-12</sub></sup>
9
17
 
10
18
  * dropped support for rails 4.2 and 5.0 (thx @d-m-u)
@@ -255,7 +263,8 @@ Missed 2 commits (which are feature adds)
255
263
  * Validations
256
264
 
257
265
 
258
- [HEAD]: https://github.com/stefankroes/ancestry/compare/v4.0.0...HEAD
266
+ [HEAD]: https://github.com/stefankroes/ancestry/compare/v4.1.0...HEAD
267
+ [4.1.0]: https://github.com/stefankroes/ancestry/compare/v4.0.0...v4.1.0
259
268
  [4.0.0]: https://github.com/stefankroes/ancestry/compare/v3.2.1...v4.0.0
260
269
  [3.2.1]: https://github.com/stefankroes/ancestry/compare/v3.2.0...v3.2.1
261
270
  [3.2.0]: https://github.com/stefankroes/ancestry/compare/v3.1.0...v3.2.0
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- [![Build Status](https://travis-ci.org/stefankroes/ancestry.svg?branch=master)](https://travis-ci.org/stefankroes/ancestry) [![Coverage Status](https://coveralls.io/repos/stefankroes/ancestry/badge.svg)](https://coveralls.io/r/stefankroes/ancestry) [![Gitter](https://badges.gitter.im/Join+Chat.svg)](https://gitter.im/stefankroes/ancestry?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Security](https://hakiri.io/github/stefankroes/ancestry/master.svg)](https://hakiri.io/github/stefankroes/ancestry/master)
1
+ [![Gitter](https://badges.gitter.im/Join+Chat.svg)](https://gitter.im/stefankroes/ancestry?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Security](https://hakiri.io/github/stefankroes/ancestry/master.svg)](https://hakiri.io/github/stefankroes/ancestry/master)
2
2
 
3
3
  # Ancestry
4
4
 
@@ -52,6 +52,17 @@ $ rails g migration add_ancestry_to_[table] ancestry:string:index
52
52
  $ rake db:migrate
53
53
  ```
54
54
 
55
+ Depending upon your comfort with databases, you may want to create the column
56
+ with `C` or `POSIX` encoding. This is a more primitive encoding and just compares
57
+ bytes. Since this column will just contains numbers and slashes, it works much
58
+ better. It also works better for the uuid case as well.
59
+
60
+
61
+ If you opt out of this, and are trying to run tests on postgres, you may need to
62
+ set the environment variable `COLLATE_SYMBOLS=false`. Sorry to say that a discussion
63
+ on this topic is out of scope. The important take away is postgres sort order is
64
+ not consistent across operating systems but other databases do not have this same
65
+ issue.
55
66
 
56
67
  ## Add ancestry to your model
57
68
  * Add to app/models/[model.rb]:
@@ -8,7 +8,7 @@ module Ancestry
8
8
  # Update descendants with new ancestry (before save)
9
9
  def update_descendants_with_new_ancestry
10
10
  # If enabled and node is existing and ancestry was updated and the new ancestry is sane ...
11
- if !ancestry_callbacks_disabled? && !new_record? && ancestry_changed? && sane_ancestry?
11
+ if !ancestry_callbacks_disabled? && !new_record? && ancestry_changed? && sane_ancestor_ids?
12
12
  # ... for each descendant ...
13
13
  unscoped_descendants.each do |descendant|
14
14
  # ... replace old ancestry with new ancestry
@@ -62,7 +62,7 @@ module Ancestry
62
62
 
63
63
  # Counter Cache
64
64
  def increase_parent_counter_cache
65
- self.class.increment_counter _counter_cache_column, parent_id
65
+ self.ancestry_base_class.increment_counter _counter_cache_column, parent_id
66
66
  end
67
67
 
68
68
  def decrease_parent_counter_cache
@@ -74,7 +74,7 @@ module Ancestry
74
74
  return if defined?(@_trigger_destroy_callback) && !@_trigger_destroy_callback
75
75
  return if ancestry_callbacks_disabled?
76
76
 
77
- self.class.decrement_counter _counter_cache_column, parent_id
77
+ self.ancestry_base_class.decrement_counter _counter_cache_column, parent_id
78
78
  end
79
79
 
80
80
  def update_parent_counter_cache
@@ -83,10 +83,10 @@ module Ancestry
83
83
  return unless changed
84
84
 
85
85
  if parent_id_was = parent_id_before_last_save
86
- self.class.decrement_counter _counter_cache_column, parent_id_was
86
+ self.ancestry_base_class.decrement_counter _counter_cache_column, parent_id_was
87
87
  end
88
88
 
89
- parent_id && self.class.increment_counter(_counter_cache_column, parent_id)
89
+ parent_id && self.ancestry_base_class.increment_counter(_counter_cache_column, parent_id)
90
90
  end
91
91
 
92
92
  def _counter_cache_column
@@ -108,7 +108,20 @@ module Ancestry
108
108
  end
109
109
 
110
110
  def sane_ancestor_ids?
111
- valid? || errors[self.ancestry_base_class.ancestry_column].blank?
111
+ current_context, self.validation_context = validation_context, nil
112
+ errors.clear
113
+
114
+ attribute = ancestry_base_class.ancestry_column
115
+ ancestry_value = send(attribute)
116
+ return true unless ancestry_value
117
+
118
+ self.class.validators_on(attribute).each do |validator|
119
+ validator.validate_each(self, attribute, ancestry_value)
120
+ end
121
+ ancestry_exclude_self
122
+ errors.none?
123
+ ensure
124
+ self.validation_context = current_context
112
125
  end
113
126
 
114
127
  def ancestors depth_options = {}
@@ -158,7 +171,11 @@ module Ancestry
158
171
  alias :parent_id? :ancestors?
159
172
 
160
173
  def parent
161
- unscoped_find(parent_id) if has_parent?
174
+ if has_parent?
175
+ unscoped_where do |scope|
176
+ scope.find_by id: parent_id
177
+ end
178
+ end
162
179
  end
163
180
 
164
181
  def parent_of?(node)
@@ -172,7 +189,11 @@ module Ancestry
172
189
  end
173
190
 
174
191
  def root
175
- has_parent? ? unscoped_find(root_id) : self
192
+ if has_parent?
193
+ unscoped_where { |scope| scope.find_by(id: root_id) } || self
194
+ else
195
+ self
196
+ end
176
197
  end
177
198
 
178
199
  def is_root?
@@ -67,7 +67,7 @@ module Ancestry
67
67
  def ordered_by_ancestry(order = nil)
68
68
  if %w(mysql mysql2 sqlite sqlite3).include?(connection.adapter_name.downcase)
69
69
  reorder(arel_table[ancestry_column], order)
70
- elsif %w(postgresql).include?(connection.adapter_name.downcase) && ActiveRecord::VERSION::STRING >= "6.1"
70
+ elsif %w(postgresql oracleenhanced).include?(connection.adapter_name.downcase) && ActiveRecord::VERSION::STRING >= "6.1"
71
71
  reorder(Arel::Nodes::Ascending.new(arel_table[ancestry_column]).nulls_first, order)
72
72
  else
73
73
  reorder(
@@ -82,13 +82,6 @@ module Ancestry
82
82
  end
83
83
 
84
84
  module InstanceMethods
85
-
86
- # Validates the ancestry, but can also be applied if validation is bypassed to determine if children should be affected
87
- def sane_ancestry?
88
- ancestry_value = read_attribute(self.ancestry_base_class.ancestry_column)
89
- (ancestry_value.nil? || !ancestor_ids.include?(self.id)) && valid?
90
- end
91
-
92
85
  # optimization - better to go directly to column and avoid parsing
93
86
  def ancestors?
94
87
  read_attribute(self.ancestry_base_class.ancestry_column).present?
@@ -3,7 +3,7 @@ module Ancestry
3
3
  # Update descendants with new ancestry (before save)
4
4
  def update_descendants_with_new_ancestry
5
5
  # If enabled and node is existing and ancestry was updated and the new ancestry is sane ...
6
- if !ancestry_callbacks_disabled? && !new_record? && ancestry_changed? && sane_ancestry?
6
+ if !ancestry_callbacks_disabled? && !new_record? && ancestry_changed? && sane_ancestor_ids?
7
7
  ancestry_column = ancestry_base_class.ancestry_column
8
8
  old_ancestry = path_ids_in_database.join(Ancestry::MaterializedPath::ANCESTRY_DELIMITER)
9
9
  new_ancestry = path_ids.join(Ancestry::MaterializedPath::ANCESTRY_DELIMITER)
@@ -1,3 +1,3 @@
1
1
  module Ancestry
2
- VERSION = "4.0.0"
2
+ VERSION = "4.1.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ancestry
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0
4
+ version: 4.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stefan Kroes
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-04-13 00:00:00.000000000 Z
12
+ date: 2021-06-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
@@ -17,14 +17,14 @@ dependencies:
17
17
  requirements:
18
18
  - - ">="
19
19
  - !ruby/object:Gem::Version
20
- version: 5.2.4.5
20
+ version: 5.2.6
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - ">="
26
26
  - !ruby/object:Gem::Version
27
- version: 5.2.4.5
27
+ version: 5.2.6
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: appraisal
30
30
  requirement: !ruby/object:Gem::Requirement
@@ -67,6 +67,20 @@ dependencies:
67
67
  - - "~>"
68
68
  - !ruby/object:Gem::Version
69
69
  version: '13.0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: simplecov
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
70
84
  - !ruby/object:Gem::Dependency
71
85
  name: yard
72
86
  requirement: !ruby/object:Gem::Requirement
@@ -123,14 +137,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
123
137
  requirements:
124
138
  - - ">="
125
139
  - !ruby/object:Gem::Version
126
- version: 2.0.0
140
+ version: '2.5'
127
141
  required_rubygems_version: !ruby/object:Gem::Requirement
128
142
  requirements:
129
143
  - - ">="
130
144
  - !ruby/object:Gem::Version
131
145
  version: '0'
132
146
  requirements: []
133
- rubygems_version: 3.1.2
147
+ rubygems_version: 3.2.16
134
148
  signing_key:
135
149
  specification_version: 4
136
150
  summary: Organize ActiveRecord model into a tree structure