nested_array 2.0.4 → 2.2.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 +4 -4
- data/.gitignore +1 -0
- data/Gemfile.lock +2 -2
- data/README-ru.md +162 -42
- data/README.md +1 -0
- data/lib/nested_array/nested.rb +8 -4
- data/lib/nested_array/version.rb +1 -1
- data/test.old/Gemfile +5 -0
- data/test.old/Gemfile.lock +34 -0
- data/test.old/bash/run/bundle.sh +9 -0
- data/test.old/bash/run/test.sh +9 -0
- data/test.old/test.rb +42 -0
- metadata +8 -6
- data/.byebug_history +0 -18
- data/lib/.byebug_history +0 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9e82939abe3e113f9ce8e54713fd52221362f5e68f5e510ec00153e5504c7198
|
4
|
+
data.tar.gz: 7a854bb61bbb605396b154246b71f2c4e482c1356b37f1f6cb9c2bc4bda6e7f4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1dc59a5a4ae0393bc3f3ab1156273e5490b2ac9a3495595d9ff23a0d9d3dfd79f215f7762f7a361ab0c0827f4a7bbcd606b105dec23c2b22ec3d92e3faf7f2ac
|
7
|
+
data.tar.gz: a0a0b98e8f8a3c440a8d8c56f1744352b0f94fbc626cb2380fe0b382fbbae2f52cd84ea05812fa2f03b1bda0402e9f7b6c9fc4139c58030c28307c21b55bb855
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
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
|
[
|
@@ -18,99 +20,217 @@
|
|
18
20
|
```
|
19
21
|
|
20
22
|
|
23
|
+
|
24
|
+
|
21
25
|
## Установка
|
22
26
|
|
23
27
|
Добавте строку в _Gemfile_ вашего приложения:
|
24
28
|
|
25
29
|
```ruby
|
26
|
-
|
30
|
+
# Версия не расширяет базовый класс Array методами гема. Для использования необходимо преобразовать данные к новому типу, см ниже.
|
31
|
+
|
32
|
+
# Работа с древовидными массивами.
|
33
|
+
gem 'nested_array', '~> 1.0.0'
|
34
|
+
|
35
|
+
# Версия с автоматическим расширением базового класса Array методами гема.
|
36
|
+
|
37
|
+
# Работа с древовидными массивами.
|
38
|
+
gem "nested_array", "~> 2.0.0"
|
27
39
|
```
|
28
40
|
|
29
|
-
И затем выполните `bundle`.
|
41
|
+
И затем выполните `bundle install`.
|
30
42
|
|
31
43
|
Или установите его как `gem install nested_array`
|
32
44
|
|
33
45
|
|
46
|
+
|
47
|
+
|
34
48
|
## Использование
|
35
49
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
50
|
+
<a name="methods"></a>
|
51
|
+
__Список методов__
|
52
|
+
|
53
|
+
* [to_nested](#to_nested) — преобразует плоскую структуру во вложенную;
|
54
|
+
* [each_nested](#each_nested) — перебирает вложенную стуктуру;
|
55
|
+
* [each_nested!](#each_nested) — перебирает вложенную стуктуру, предоставляя доступ к исходным данным;
|
56
|
+
* [nested_to_html](#nested_to_html) — преобразует вложенную структуру в html вёрстку (многоуровневый список `<ul><li>…`);
|
57
|
+
* [nested_to_options](#nested_to_options) — преобразует вложенную структуру в массив для формирования опций html-тега `<select>` с псевдографикой;
|
58
|
+
* [concat_nested](#concat_nested) — скеивание вложенных структур, ноды склеиваются если путь к ним одинаков.
|
59
|
+
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
<a name="to_nested"></a>
|
64
|
+
### to_nested [↑](#methods "К методам")
|
65
|
+
|
66
|
+
Преобразует плоскую структуру во вложенную.
|
67
|
+
|
68
|
+
```ruby
|
69
|
+
a = [{'id' => 1, 'parent_id' => nil}]
|
70
|
+
a = NestedArray::Array.new a
|
71
|
+
b = a.to_nested
|
42
72
|
```
|
43
73
|
|
44
|
-
__Опции
|
74
|
+
__Опции__
|
45
75
|
|
46
|
-
|
76
|
+
У каждой ноды вложенной структуры есть базовые свойства, такие как
|
77
|
+
идентификатор, идентификатор предка и другие. Для доступа к этим данным
|
78
|
+
используются ключи, которые можно настроить как в примере ниже. По умолчанию
|
79
|
+
используются следующие __строковые__ (_чувствительны к string/symbol_) ключи:
|
80
|
+
|
81
|
+
```ruby
|
82
|
+
b = a.to_nested({
|
83
|
+
id: 'id', # указывает какое свойство ноды является идентификатором;
|
84
|
+
parent_id: 'parent_id', # -//- предком;
|
85
|
+
children: 'children', # -//- массивом потомков;
|
86
|
+
level: 'level' # -//- дополнительным свойством с уровнем вложенности;
|
87
|
+
root_id: nil # определяет что является корнем для построения дерева,
|
88
|
+
# например, для построения ветви корнем корнем
|
89
|
+
# является идентификатор одной из нод.
|
90
|
+
})
|
91
|
+
```
|
47
92
|
|
48
|
-
|
93
|
+
Дополнительные опции преобразования:
|
49
94
|
|
95
|
+
```ruby
|
96
|
+
b = a.to_nested({
|
97
|
+
hashed: false, # потомки могут храниться не в массиве а в хэше;
|
98
|
+
add_level: false, # добавляет в ноду информацию о уровене вложенности ноды;
|
99
|
+
})
|
50
100
|
```
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
101
|
+
|
102
|
+
|
103
|
+
|
104
|
+
|
105
|
+
<a name="each_nested"></a>
|
106
|
+
### each_nested [↑](#methods "К методам")
|
107
|
+
|
108
|
+
Перебирает вложенную стуктуру.
|
109
|
+
|
110
|
+
```ruby
|
111
|
+
nested.each_nested do |node, parents, level, is_last_children|
|
112
|
+
puts node # > {'id' => ...}
|
113
|
+
puts parents # > [{'id' => ...}]
|
114
|
+
puts level # > 0
|
115
|
+
puts is_last_children # > false
|
116
|
+
end
|
55
117
|
```
|
56
118
|
|
57
|
-
Дополнительные параметры преобразования:
|
58
119
|
|
120
|
+
|
121
|
+
|
122
|
+
<a name="nested_to_html"></a>
|
123
|
+
### nested_to_html [↑](#methods "К методам")
|
124
|
+
|
125
|
+
Формирует _html_-код для вывода вложенных структур с использованием вложенных друг в друга списков `<ul>`.
|
126
|
+
|
127
|
+
__Пример__
|
128
|
+
|
129
|
+
```ruby
|
130
|
+
[
|
131
|
+
{'id' => 1, 'parent_id' => nil, 'name' => 'first'},
|
132
|
+
{'id' => 2, 'parent_id' => 1, 'name' => 'second'},
|
133
|
+
{'id' => 3, 'parent_id' => 1, 'name' => 'third'}
|
134
|
+
].to_nested.nested_to_html do |node|
|
135
|
+
node['name']
|
136
|
+
end
|
59
137
|
```
|
60
|
-
|
61
|
-
|
62
|
-
|
138
|
+
|
139
|
+
Вернёт
|
140
|
+
|
141
|
+
```html
|
142
|
+
<li>first
|
143
|
+
<ul>
|
144
|
+
<li>second</li>
|
145
|
+
<li>third</li>
|
146
|
+
</ul>
|
147
|
+
</li>
|
63
148
|
```
|
64
149
|
|
65
|
-
__
|
150
|
+
__Расширенный пример__
|
66
151
|
|
152
|
+
```ruby
|
153
|
+
.nested_to_html li: '<li class="my">', _ul: '<i></i></ul>' do |node, parents, level|
|
154
|
+
block_options = {}
|
155
|
+
block_options[:li] = '<li class="my current">' if node['id'] == 2
|
156
|
+
[
|
157
|
+
"id: #{node['id']}, #{node['name']}, parent name: #{parents[level]&.[]('name')}",
|
158
|
+
block_options
|
159
|
+
]
|
160
|
+
end
|
67
161
|
```
|
162
|
+
|
163
|
+
__Опции__
|
164
|
+
|
165
|
+
Все опции могут быть аргументами метода, и только некоторые опции влияют на результат через блок — на лету (последняя строка блока).
|
166
|
+
|
167
|
+
```ruby
|
68
168
|
tabulated: true,
|
69
169
|
inline: false,
|
70
170
|
tab: "\t",
|
71
|
-
ul: '<ul>',
|
171
|
+
ul: '<ul>', # может задаваться блоком
|
72
172
|
_ul: '</ul>',
|
73
|
-
li: '<li>',
|
173
|
+
li: '<li>', # может задаваться блоком
|
74
174
|
_li: '</li>',
|
75
175
|
```
|
76
176
|
|
77
|
-
### "Скеивание" вложенных структур `concat_nested`
|
78
177
|
|
79
|
-
Ноды склеиваются если путь к ним одинаков;
|
80
|
-
Путь определяется из сложения Текстов (конфигурируемо через :path_key);
|
81
178
|
|
82
|
-
__Опции `nested_to_html`__
|
83
179
|
|
84
|
-
|
85
|
-
|
86
|
-
path_key: 'text',
|
87
|
-
```
|
180
|
+
<a name="nested_to_options"></a>
|
181
|
+
### nested_to_options [↑](#methods "К методам")
|
88
182
|
|
89
|
-
|
183
|
+
Формирования опций для html-тега <select>
|
90
184
|
|
91
185
|
Возвращает массив с псевдографикой, позволяющей вывести древовидную структуру.
|
92
186
|
|
93
|
-
```
|
187
|
+
```ruby
|
188
|
+
|
94
189
|
[['option_text1', 'option_value1'],['option_text2', 'option_value2'],…]
|
95
190
|
```
|
96
191
|
|
97
|
-
__Опции
|
192
|
+
__Опции__
|
98
193
|
|
99
|
-
```
|
194
|
+
```ruby
|
100
195
|
option_value: 'id', # Что брать в качестве значений при формировании опций селекта.
|
101
196
|
option_text: 'name',
|
102
197
|
```
|
103
198
|
|
104
|
-
## Development
|
105
199
|
|
106
|
-
After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
107
200
|
|
108
|
-
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
109
201
|
|
110
|
-
|
202
|
+
<a name="concat_nested"></a>
|
203
|
+
### concat_nested [↑](#methods "К методам")
|
204
|
+
|
205
|
+
Скеивание вложенных структур.
|
206
|
+
|
207
|
+
* Ноды склеиваются если путь к ним одинаков;
|
208
|
+
* Путь определяется из сложения Текстов (конфигурируемо через :path_key);
|
209
|
+
|
210
|
+
__Опции__
|
211
|
+
|
212
|
+
```ruby
|
213
|
+
path_separator: '-=path_separator=-',
|
214
|
+
path_key: 'text',
|
215
|
+
```
|
216
|
+
|
217
|
+
|
218
|
+
|
219
|
+
|
220
|
+
## Разработка
|
221
|
+
|
222
|
+
…
|
223
|
+
|
224
|
+
|
225
|
+
|
226
|
+
|
227
|
+
## Содействие
|
228
|
+
|
229
|
+
…
|
230
|
+
|
231
|
+
|
111
232
|
|
112
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/Zlatov/nested_array.
|
113
233
|
|
114
|
-
##
|
234
|
+
## Лицензия
|
115
235
|
|
116
|
-
|
236
|
+
В соответствии с условиями [лицензии MIT](https://opensource.org/licenses/MIT).
|
data/README.md
CHANGED
data/lib/nested_array/nested.rb
CHANGED
@@ -38,6 +38,9 @@ module NestedArray::Nested
|
|
38
38
|
}
|
39
39
|
end
|
40
40
|
|
41
|
+
#
|
42
|
+
# Перебирает вложенную стуктуру.
|
43
|
+
#
|
41
44
|
def each_nested options={}
|
42
45
|
options = NESTED_OPTIONS.merge options
|
43
46
|
level = 0
|
@@ -249,15 +252,16 @@ module NestedArray::Nested
|
|
249
252
|
i[level]+= 1
|
250
253
|
if node != nil
|
251
254
|
|
255
|
+
node_html, node_options = yield(node.clone, parents.clone, level)
|
252
256
|
html+= options[:tab] * (level * 2 + 1) if options[:tabulated]
|
253
|
-
html+= options[:li]
|
254
|
-
html+=
|
257
|
+
html+= node_options&.[](:li) || options[:li]
|
258
|
+
html+= node_html.to_s
|
255
259
|
|
256
260
|
if !node[options[:children]].nil? && node[options[:children]].length > 0
|
257
261
|
level+= 1
|
258
262
|
html+= "\n" if !options[:inline]
|
259
263
|
html+= options[:tab] * (level * 2) if options[:tabulated]
|
260
|
-
html+= options[:ul]
|
264
|
+
html+= node_options&.[](:ul) || options[:ul]
|
261
265
|
html+= "\n" if !options[:inline]
|
262
266
|
parents[level] = node.clone
|
263
267
|
cache[level] = node[options[:children]]
|
@@ -298,7 +302,7 @@ module NestedArray::Nested
|
|
298
302
|
node_level = (1..level).map{|l| last[l] == true ? ' ' : '┃'}.join
|
299
303
|
node_last = is_last ? '┗' : '┣'
|
300
304
|
node_children = node[options[:children]].present? && node[options[:children]].length > 0 ? '┳' : '━'
|
301
|
-
option_text = "#{node_level}#{node_last}#{node_children}
|
305
|
+
option_text = "#{node_level}#{node_last}#{node_children}╸".html_safe + "#{node_text}"
|
302
306
|
option_value = node[options[:option_value]]
|
303
307
|
ret.push [option_text, option_value]
|
304
308
|
end
|
data/lib/nested_array/version.rb
CHANGED
data/test.old/Gemfile
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
PATH
|
2
|
+
remote: ..
|
3
|
+
specs:
|
4
|
+
nested_array (1.0.1)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: https://rubygems.org/
|
8
|
+
specs:
|
9
|
+
activesupport (6.0.2.1)
|
10
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
11
|
+
i18n (>= 0.7, < 2)
|
12
|
+
minitest (~> 5.1)
|
13
|
+
tzinfo (~> 1.1)
|
14
|
+
zeitwerk (~> 2.2)
|
15
|
+
awesome_print (1.8.0)
|
16
|
+
concurrent-ruby (1.1.6)
|
17
|
+
i18n (1.8.2)
|
18
|
+
concurrent-ruby (~> 1.0)
|
19
|
+
minitest (5.14.0)
|
20
|
+
thread_safe (0.3.6)
|
21
|
+
tzinfo (1.2.6)
|
22
|
+
thread_safe (~> 0.1)
|
23
|
+
zeitwerk (2.2.2)
|
24
|
+
|
25
|
+
PLATFORMS
|
26
|
+
ruby
|
27
|
+
|
28
|
+
DEPENDENCIES
|
29
|
+
activesupport
|
30
|
+
awesome_print
|
31
|
+
nested_array!
|
32
|
+
|
33
|
+
BUNDLED WITH
|
34
|
+
2.0.1
|
data/test.old/test.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'active_support/all'
|
2
|
+
require 'awesome_print'
|
3
|
+
require 'nested_array'
|
4
|
+
|
5
|
+
puts 'Начато тестирование.'.blue
|
6
|
+
puts "Версия руби: #{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}"
|
7
|
+
|
8
|
+
def to_nested_1
|
9
|
+
puts "Тестирование #{__method__}".blue
|
10
|
+
a = [
|
11
|
+
{'id' => 1, 'parent_id' => nil, 'name' => 'first'},
|
12
|
+
{'id' => 2, 'parent_id' => 1, 'name' => 'second'},
|
13
|
+
{'id' => 3, 'parent_id' => 1, 'name' => 'third'}
|
14
|
+
]
|
15
|
+
a = NestedArray::Array.new a
|
16
|
+
b = a.to_nested
|
17
|
+
return false if b != [
|
18
|
+
{'id' => 1, 'parent_id' => nil, 'name' => 'first', 'children' => [
|
19
|
+
{'id' => 2, 'parent_id' => 1, 'name' => 'second'},
|
20
|
+
{'id' => 3, 'parent_id' => 1, 'name' => 'third'}
|
21
|
+
]},
|
22
|
+
]
|
23
|
+
b = a.to_nested add_level: true
|
24
|
+
return false if b != [
|
25
|
+
{'id' => 1, 'parent_id' => nil, 'name' => 'first', 'level' => 0, 'children' => [
|
26
|
+
{'id' => 2, 'parent_id' => 1, 'name' => 'second', 'level' => 1},
|
27
|
+
{'id' => 3, 'parent_id' => 1, 'name' => 'third', 'level' => 1}
|
28
|
+
]},
|
29
|
+
]
|
30
|
+
return true
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
begin
|
37
|
+
raise if !to_nested_1
|
38
|
+
rescue => e
|
39
|
+
puts 'Тестирование не пройдено.'.red
|
40
|
+
exit 1
|
41
|
+
end
|
42
|
+
puts 'Тестирование пройдено.'.green
|
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.2.1
|
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-14 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"
|
@@ -109,11 +108,15 @@ files:
|
|
109
108
|
- bin/rspec
|
110
109
|
- bin/setup
|
111
110
|
- dev/nested_options.rb
|
112
|
-
- lib/.byebug_history
|
113
111
|
- lib/nested_array.rb
|
114
112
|
- lib/nested_array/nested.rb
|
115
113
|
- lib/nested_array/version.rb
|
116
114
|
- nested_array.gemspec
|
115
|
+
- test.old/Gemfile
|
116
|
+
- test.old/Gemfile.lock
|
117
|
+
- test.old/bash/run/bundle.sh
|
118
|
+
- test.old/bash/run/test.sh
|
119
|
+
- test.old/test.rb
|
117
120
|
homepage: https://github.com/Zlatov/nested_array
|
118
121
|
licenses:
|
119
122
|
- MIT
|
@@ -136,8 +139,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
136
139
|
- !ruby/object:Gem::Version
|
137
140
|
version: '0'
|
138
141
|
requirements: []
|
139
|
-
|
140
|
-
rubygems_version: 2.7.6
|
142
|
+
rubygems_version: 3.2.25
|
141
143
|
signing_key:
|
142
144
|
specification_version: 4
|
143
145
|
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__
|