nested_array 2.2.0 → 2.3.0
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 +4 -4
- data/.gitignore +1 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +9 -7
- data/README-ru.md +16 -4
- data/TODO.md +26 -0
- data/lib/nested_array/nested.rb +9 -5
- data/lib/nested_array/version.rb +1 -1
- metadata +4 -4
- data/.byebug_history +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0f9301a9227bde8d348c788d152e3f673629fe658bf5081f7dbf46510b26159b
|
4
|
+
data.tar.gz: 6bdd98b0b83e52224afa7db078007805ffc19762ae9cb1f042dfe40f0add9248
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 106227d9e4b3f3c79fc2cac1ca1c340e18019ea674291d72d4712f5a780209d86913cc9c2f069f9be830bda1235a1f9572cf3a8b73f4dcff0d5c725853a29136
|
7
|
+
data.tar.gz: 0c2bb221a8a49d0ac5d4deaeb0f6879ccb472a0be79866603a7c56843503a6aedec3a8910c6f396548cd6a986ed07304842076f4d4df2178be7931e5b5f72413
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,23 +1,24 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
nested_array (2.2.
|
4
|
+
nested_array (2.2.1)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
8
8
|
specs:
|
9
|
-
activesupport (
|
9
|
+
activesupport (6.0.3.2)
|
10
10
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
11
11
|
i18n (>= 0.7, < 2)
|
12
12
|
minitest (~> 5.1)
|
13
13
|
tzinfo (~> 1.1)
|
14
|
+
zeitwerk (~> 2.2, >= 2.2.2)
|
14
15
|
awesome_print (1.8.0)
|
15
16
|
byebug (11.0.1)
|
16
|
-
concurrent-ruby (1.1.
|
17
|
+
concurrent-ruby (1.1.6)
|
17
18
|
diff-lcs (1.3)
|
18
|
-
i18n (1.
|
19
|
+
i18n (1.8.3)
|
19
20
|
concurrent-ruby (~> 1.0)
|
20
|
-
minitest (5.
|
21
|
+
minitest (5.14.1)
|
21
22
|
rake (10.5.0)
|
22
23
|
rspec (3.9.0)
|
23
24
|
rspec-core (~> 3.9.0)
|
@@ -33,14 +34,15 @@ GEM
|
|
33
34
|
rspec-support (~> 3.9.0)
|
34
35
|
rspec-support (3.9.0)
|
35
36
|
thread_safe (0.3.6)
|
36
|
-
tzinfo (1.2.
|
37
|
+
tzinfo (1.2.7)
|
37
38
|
thread_safe (~> 0.1)
|
39
|
+
zeitwerk (2.3.0)
|
38
40
|
|
39
41
|
PLATFORMS
|
40
42
|
ruby
|
41
43
|
|
42
44
|
DEPENDENCIES
|
43
|
-
activesupport (~>
|
45
|
+
activesupport (~> 6.0)
|
44
46
|
awesome_print (~> 1.8)
|
45
47
|
bundler (~> 2.0)
|
46
48
|
byebug (~> 11.0)
|
data/README-ru.md
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# NestedArray
|
2
2
|
|
3
|
-
Предназначен для преобразования в древовидную структуру плоских данных описанных
|
3
|
+
Предназначен для преобразования в древовидную структуру плоских данных описанных
|
4
|
+
по паттерну «Список смежности» (Adjacency List), то есть в нодах указа предок
|
5
|
+
`parent_id`. Например:
|
4
6
|
|
5
7
|
```ruby
|
6
8
|
[
|
@@ -25,8 +27,15 @@
|
|
25
27
|
Добавте строку в _Gemfile_ вашего приложения:
|
26
28
|
|
27
29
|
```ruby
|
28
|
-
|
29
|
-
|
30
|
+
# Версия не расширяет базовый класс Array методами гема. Для использования необходимо преобразовать данные к новому типу, см ниже.
|
31
|
+
|
32
|
+
# Работа с древовидными массивами.
|
33
|
+
gem 'nested_array', '~> 1.0.0'
|
34
|
+
|
35
|
+
# Версия с автоматическим расширением базового класса Array методами гема.
|
36
|
+
|
37
|
+
# Работа с древовидными массивами.
|
38
|
+
gem "nested_array", "~> 2.0.0"
|
30
39
|
```
|
31
40
|
|
32
41
|
И затем выполните `bundle install`.
|
@@ -64,7 +73,10 @@ b = a.to_nested
|
|
64
73
|
|
65
74
|
__Опции__
|
66
75
|
|
67
|
-
У каждой ноды вложенной структуры есть базовые свойства, такие как
|
76
|
+
У каждой ноды вложенной структуры есть базовые свойства, такие как
|
77
|
+
идентификатор, идентификатор предка и другие. Для доступа к этим данным
|
78
|
+
используются ключи, которые можно настроить как в примере ниже. По умолчанию
|
79
|
+
используются следующие __строковые__ (_чувствительны к string/symbol_) ключи:
|
68
80
|
|
69
81
|
```ruby
|
70
82
|
b = a.to_nested({
|
data/TODO.md
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# Что реализовано, необходимо реализовать и почему
|
2
|
+
|
3
|
+
## Почему
|
4
|
+
|
5
|
+
### Почему возвращаем массив Hash
|
6
|
+
|
7
|
+
Когда хотим из плоской структуры получить древовидную, то на руках мы можем
|
8
|
+
иметь данные различного типа, например, массив Hash или массив ActiveRecord,
|
9
|
+
результатом обработки должен быть массив объектов у которых должно быть поле
|
10
|
+
children содержащее потомков. Именно поэтому мы не можем оставлять в результате
|
11
|
+
массив ActiveRecord, так как поле children будет конфликтовать с уже
|
12
|
+
существующим методом, например при использовании гема closure_tree. С другой
|
13
|
+
стороны мы моглибы внедрить поле nested_children во все объекты ActiveRecord,
|
14
|
+
но такой подход, мне кажется, похож на «Monkey patch».
|
15
|
+
|
16
|
+
|
17
|
+
## TODO
|
18
|
+
|
19
|
+
Хочу возвращать массив OpenStruct вместо массива Hash.
|
20
|
+
|
21
|
+
При возврате массива OpenStruct (всегда) пропадает смысл метода `each_nested!`
|
22
|
+
который должен отдавать в переменной node исходные данные (ну они не исходые
|
23
|
+
уже). Поэтому необходимо выпустить версию 3.0.0 с удалением метода
|
24
|
+
`each_nested!`.
|
25
|
+
|
26
|
+
Переработать README-ru и на английский доперевести в конце концов.
|
data/lib/nested_array/nested.rb
CHANGED
@@ -56,7 +56,7 @@ module NestedArray::Nested
|
|
56
56
|
if node != nil
|
57
57
|
is_last_children = cache[level][i[level]].blank?
|
58
58
|
|
59
|
-
yield(node.clone, parents.clone, level, is_last_children)
|
59
|
+
yield(node.clone, parents.clone, level, is_last_children, node.origin)
|
60
60
|
|
61
61
|
if !node[options[:children]].nil? && node[options[:children]].length > 0
|
62
62
|
level+= 1
|
@@ -85,8 +85,9 @@ module NestedArray::Nested
|
|
85
85
|
node = cache[level][i[level]]
|
86
86
|
i[level]+= 1
|
87
87
|
if node != nil
|
88
|
+
is_last_children = cache[level][i[level]].blank?
|
88
89
|
|
89
|
-
yield(node, parents, level)
|
90
|
+
yield(node, parents, level, is_last_children, node.origin)
|
90
91
|
|
91
92
|
if !node[options[:children]].nil? && node[options[:children]].length > 0
|
92
93
|
level+= 1
|
@@ -115,13 +116,14 @@ module NestedArray::Nested
|
|
115
116
|
nested = options[:hashed] ? {} : []
|
116
117
|
# Перебираем элементы в любом порядке!
|
117
118
|
self.each do |value|
|
119
|
+
origin = value
|
118
120
|
value = value.serializable_hash if !value.is_a? Hash
|
119
121
|
# 1. Если нет родителя текущего элемента, и текущий элемент не корневой, то:
|
120
122
|
# 1.1 создадим родителя
|
121
123
|
# 1.2 поместим в кэш
|
122
124
|
if !(cache.key? value[fields[:parent_id]]) && (value[fields[:parent_id]] != options[:root_id])
|
123
125
|
# 1.1
|
124
|
-
temp =
|
126
|
+
temp = OpenStruct.new
|
125
127
|
fields.each do |key, field|
|
126
128
|
case key
|
127
129
|
when :id
|
@@ -151,6 +153,7 @@ module NestedArray::Nested
|
|
151
153
|
value.keys.each do |field|
|
152
154
|
cache[value[fields[:id]]][field] = value[field] if !(field.in? fields)
|
153
155
|
end
|
156
|
+
cache[value[fields[:id]]].origin = origin
|
154
157
|
# 2.2
|
155
158
|
# Если текущий элемент не корневой - поместим в родителя, беря его из кэш
|
156
159
|
if value[fields[:parent_id]] != options[:root_id]
|
@@ -174,7 +177,7 @@ module NestedArray::Nested
|
|
174
177
|
# 3.3 поместим в родителя
|
175
178
|
else
|
176
179
|
# 3.1
|
177
|
-
temp =
|
180
|
+
temp = OpenStruct.new
|
178
181
|
fields.each do |key, field|
|
179
182
|
case key
|
180
183
|
when :id
|
@@ -190,6 +193,7 @@ module NestedArray::Nested
|
|
190
193
|
value.keys.each do |field|
|
191
194
|
temp[field] = value[field] if !(field.in? fields)
|
192
195
|
end
|
196
|
+
temp.origin = origin
|
193
197
|
# 3.2
|
194
198
|
cache[value[fields[:id]]] = temp
|
195
199
|
# 3.3
|
@@ -302,7 +306,7 @@ module NestedArray::Nested
|
|
302
306
|
node_level = (1..level).map{|l| last[l] == true ? ' ' : '┃'}.join
|
303
307
|
node_last = is_last ? '┗' : '┣'
|
304
308
|
node_children = node[options[:children]].present? && node[options[:children]].length > 0 ? '┳' : '━'
|
305
|
-
option_text = "#{node_level}#{node_last}#{node_children}
|
309
|
+
option_text = "#{node_level}#{node_last}#{node_children}╸".html_safe + "#{node_text}"
|
306
310
|
option_value = node[options[:option_value]]
|
307
311
|
ret.push [option_text, option_value]
|
308
312
|
end
|
data/lib/nested_array/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nested_array
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- zlatov
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-01-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -87,7 +87,6 @@ executables: []
|
|
87
87
|
extensions: []
|
88
88
|
extra_rdoc_files: []
|
89
89
|
files:
|
90
|
-
- ".byebug_history"
|
91
90
|
- ".gitignore"
|
92
91
|
- ".rspec"
|
93
92
|
- ".ruby-version"
|
@@ -97,6 +96,7 @@ files:
|
|
97
96
|
- README-ru.md
|
98
97
|
- README.md
|
99
98
|
- Rakefile
|
99
|
+
- TODO.md
|
100
100
|
- bash/build/gem.sh
|
101
101
|
- bash/push/gem.sh
|
102
102
|
- bash/test/gem.sh
|
@@ -140,7 +140,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
140
140
|
- !ruby/object:Gem::Version
|
141
141
|
version: '0'
|
142
142
|
requirements: []
|
143
|
-
rubygems_version: 3.
|
143
|
+
rubygems_version: 3.2.25
|
144
144
|
signing_key:
|
145
145
|
specification_version: 4
|
146
146
|
summary: Convert a flat array into a nested one in 1 pass and another…
|
data/.byebug_history
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
c
|
2
|
-
fixture.first.deep_symbolize_keys
|
3
|
-
fixture.first
|
4
|
-
fixture.deep_symbolize_keys
|
5
|
-
fixture
|
6
|
-
fixture = JSON.parse File.read(fixture_path)
|
7
|
-
File.exist?(fixture_path)
|
8
|
-
fixture_path = Pathname.new(Dir.pwd).join("spec", "fixtures", "json", "#{name}.json")
|
9
|
-
name
|
10
|
-
Dir.pwd
|
11
|
-
b = a.join $0
|
12
|
-
a = Pathname.new Dir.pwd
|
13
|
-
$0
|
14
|
-
Dir.pwd
|
15
|
-
Pathname
|
16
|
-
Dir.entries(File.dirname(__FILE__)).reject{|e| e == '.' || e == '..'}.select{|e| File.directory? e}
|
17
|
-
File.dirname(__FILE__)
|
18
|
-
__FILE__
|