nested_array 2.0.4 → 2.2.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/Gemfile.lock +2 -2
- data/README-ru.md +149 -41
- data/README.md +1 -0
- data/lib/nested_array/nested.rb +7 -3
- 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 -5
- 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: d8f6db479729f7d6924b27d7b18d12ef9f20eab329ceb794624b98203316569b
|
4
|
+
data.tar.gz: a0114a0c9169e8247a69081dc5f037ef14aead1bdc64410ea82ccee8eea323f2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 84f1752a4dc9d6158c735ed68622cbc136838bee43cc780a5e415e9f2f0725455f7dcba4c5c60ec2d02de74fe3ef2d5490f4b16bf761ddfdb21857b960ff366e
|
7
|
+
data.tar.gz: 751204ab59242230156ebf4891897a98bafc67cd328173bf44f2cfcabe86d8b1839e5b8c6dc0ca204b16d5135ed929de7d2345dc65cc88dab690e6792392f860
|
data/Gemfile.lock
CHANGED
data/README-ru.md
CHANGED
@@ -18,99 +18,207 @@
|
|
18
18
|
```
|
19
19
|
|
20
20
|
|
21
|
+
|
22
|
+
|
21
23
|
## Установка
|
22
24
|
|
23
25
|
Добавте строку в _Gemfile_ вашего приложения:
|
24
26
|
|
25
27
|
```ruby
|
26
|
-
gem 'nested_array', '~>
|
28
|
+
gem 'nested_array', '~> 1.0.0' # версия не расширяет базовый класс Array методами гема. Для использования необходимо преобразовать данные к новому типу, см ниже.
|
29
|
+
gem 'nested_array', '~> 2.0.0' # Версия с автоматическим расширением базового класса Array методами гема.
|
27
30
|
```
|
28
31
|
|
29
|
-
И затем выполните `bundle`.
|
32
|
+
И затем выполните `bundle install`.
|
30
33
|
|
31
34
|
Или установите его как `gem install nested_array`
|
32
35
|
|
33
36
|
|
37
|
+
|
38
|
+
|
34
39
|
## Использование
|
35
40
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
41
|
+
<a name="methods"></a>
|
42
|
+
__Список методов__
|
43
|
+
|
44
|
+
* [to_nested](#to_nested) — преобразует плоскую структуру во вложенную;
|
45
|
+
* [each_nested](#each_nested) — перебирает вложенную стуктуру;
|
46
|
+
* [each_nested!](#each_nested) — перебирает вложенную стуктуру, предоставляя доступ к исходным данным;
|
47
|
+
* [nested_to_html](#nested_to_html) — преобразует вложенную структуру в html вёрстку (многоуровневый список `<ul><li>…`);
|
48
|
+
* [nested_to_options](#nested_to_options) — преобразует вложенную структуру в массив для формирования опций html-тега `<select>` с псевдографикой;
|
49
|
+
* [concat_nested](#concat_nested) — скеивание вложенных структур, ноды склеиваются если путь к ним одинаков.
|
50
|
+
|
51
|
+
|
52
|
+
|
53
|
+
|
54
|
+
<a name="to_nested"></a>
|
55
|
+
### to_nested [↑](#methods "К методам")
|
56
|
+
|
57
|
+
Преобразует плоскую структуру во вложенную.
|
58
|
+
|
59
|
+
```ruby
|
60
|
+
a = [{'id' => 1, 'parent_id' => nil}]
|
61
|
+
a = NestedArray::Array.new a
|
62
|
+
b = a.to_nested
|
42
63
|
```
|
43
64
|
|
44
|
-
__Опции
|
65
|
+
__Опции__
|
45
66
|
|
46
|
-
|
67
|
+
У каждой ноды вложенной структуры есть базовые свойства, такие как идентификатор, идентификатор предка и другие. Для доступа к этим данным используются ключи, которые можно настроить как в примере ниже. По умолчанию используются следующие __строковые__ (_чувствительны к string/symbol_) ключи:
|
47
68
|
|
48
|
-
|
69
|
+
```ruby
|
70
|
+
b = a.to_nested({
|
71
|
+
id: 'id', # указывает какое свойство ноды является идентификатором;
|
72
|
+
parent_id: 'parent_id', # -//- предком;
|
73
|
+
children: 'children', # -//- массивом потомков;
|
74
|
+
level: 'level' # -//- дополнительным свойством с уровнем вложенности;
|
75
|
+
root_id: nil # определяет что является корнем для построения дерева,
|
76
|
+
# например, для построения ветви корнем корнем
|
77
|
+
# является идентификатор одной из нод.
|
78
|
+
})
|
79
|
+
```
|
49
80
|
|
81
|
+
Дополнительные опции преобразования:
|
82
|
+
|
83
|
+
```ruby
|
84
|
+
b = a.to_nested({
|
85
|
+
hashed: false, # потомки могут храниться не в массиве а в хэше;
|
86
|
+
add_level: false, # добавляет в ноду информацию о уровене вложенности ноды;
|
87
|
+
})
|
50
88
|
```
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
89
|
+
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
<a name="each_nested"></a>
|
94
|
+
### each_nested [↑](#methods "К методам")
|
95
|
+
|
96
|
+
Перебирает вложенную стуктуру.
|
97
|
+
|
98
|
+
```ruby
|
99
|
+
nested.each_nested do |node, parents, level, is_last_children|
|
100
|
+
puts node # > {'id' => ...}
|
101
|
+
puts parents # > [{'id' => ...}]
|
102
|
+
puts level # > 0
|
103
|
+
puts is_last_children # > false
|
104
|
+
end
|
55
105
|
```
|
56
106
|
|
57
|
-
Дополнительные параметры преобразования:
|
58
107
|
|
108
|
+
|
109
|
+
|
110
|
+
<a name="nested_to_html"></a>
|
111
|
+
### nested_to_html [↑](#methods "К методам")
|
112
|
+
|
113
|
+
Формирует _html_-код для вывода вложенных структур с использованием вложенных друг в друга списков `<ul>`.
|
114
|
+
|
115
|
+
__Пример__
|
116
|
+
|
117
|
+
```ruby
|
118
|
+
[
|
119
|
+
{'id' => 1, 'parent_id' => nil, 'name' => 'first'},
|
120
|
+
{'id' => 2, 'parent_id' => 1, 'name' => 'second'},
|
121
|
+
{'id' => 3, 'parent_id' => 1, 'name' => 'third'}
|
122
|
+
].to_nested.nested_to_html do |node|
|
123
|
+
node['name']
|
124
|
+
end
|
59
125
|
```
|
60
|
-
|
61
|
-
|
62
|
-
|
126
|
+
|
127
|
+
Вернёт
|
128
|
+
|
129
|
+
```html
|
130
|
+
<li>first
|
131
|
+
<ul>
|
132
|
+
<li>second</li>
|
133
|
+
<li>third</li>
|
134
|
+
</ul>
|
135
|
+
</li>
|
63
136
|
```
|
64
137
|
|
65
|
-
__
|
138
|
+
__Расширенный пример__
|
66
139
|
|
140
|
+
```ruby
|
141
|
+
.nested_to_html li: '<li class="my">', _ul: '<i></i></ul>' do |node, parents, level|
|
142
|
+
block_options = {}
|
143
|
+
block_options[:li] = '<li class="my current">' if node['id'] == 2
|
144
|
+
[
|
145
|
+
"id: #{node['id']}, #{node['name']}, parent name: #{parents[level]&.[]('name')}",
|
146
|
+
block_options
|
147
|
+
]
|
148
|
+
end
|
67
149
|
```
|
150
|
+
|
151
|
+
__Опции__
|
152
|
+
|
153
|
+
Все опции могут быть аргументами метода, и только некоторые опции влияют на результат через блок — на лету (последняя строка блока).
|
154
|
+
|
155
|
+
```ruby
|
68
156
|
tabulated: true,
|
69
157
|
inline: false,
|
70
158
|
tab: "\t",
|
71
|
-
ul: '<ul>',
|
159
|
+
ul: '<ul>', # может задаваться блоком
|
72
160
|
_ul: '</ul>',
|
73
|
-
li: '<li>',
|
161
|
+
li: '<li>', # может задаваться блоком
|
74
162
|
_li: '</li>',
|
75
163
|
```
|
76
164
|
|
77
|
-
### "Скеивание" вложенных структур `concat_nested`
|
78
165
|
|
79
|
-
Ноды склеиваются если путь к ним одинаков;
|
80
|
-
Путь определяется из сложения Текстов (конфигурируемо через :path_key);
|
81
166
|
|
82
|
-
__Опции `nested_to_html`__
|
83
167
|
|
84
|
-
|
85
|
-
|
86
|
-
path_key: 'text',
|
87
|
-
```
|
168
|
+
<a name="nested_to_options"></a>
|
169
|
+
### nested_to_options [↑](#methods "К методам")
|
88
170
|
|
89
|
-
|
171
|
+
Формирования опций для html-тега <select>
|
90
172
|
|
91
173
|
Возвращает массив с псевдографикой, позволяющей вывести древовидную структуру.
|
92
174
|
|
93
|
-
```
|
175
|
+
```ruby
|
176
|
+
|
94
177
|
[['option_text1', 'option_value1'],['option_text2', 'option_value2'],…]
|
95
178
|
```
|
96
179
|
|
97
|
-
__Опции
|
180
|
+
__Опции__
|
98
181
|
|
99
|
-
```
|
182
|
+
```ruby
|
100
183
|
option_value: 'id', # Что брать в качестве значений при формировании опций селекта.
|
101
184
|
option_text: 'name',
|
102
185
|
```
|
103
186
|
|
104
|
-
## Development
|
105
187
|
|
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
188
|
|
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
189
|
|
110
|
-
|
190
|
+
<a name="concat_nested"></a>
|
191
|
+
### concat_nested [↑](#methods "К методам")
|
192
|
+
|
193
|
+
Скеивание вложенных структур.
|
194
|
+
|
195
|
+
* Ноды склеиваются если путь к ним одинаков;
|
196
|
+
* Путь определяется из сложения Текстов (конфигурируемо через :path_key);
|
197
|
+
|
198
|
+
__Опции__
|
199
|
+
|
200
|
+
```ruby
|
201
|
+
path_separator: '-=path_separator=-',
|
202
|
+
path_key: 'text',
|
203
|
+
```
|
204
|
+
|
205
|
+
|
206
|
+
|
207
|
+
|
208
|
+
## Разработка
|
209
|
+
|
210
|
+
…
|
211
|
+
|
212
|
+
|
213
|
+
|
214
|
+
|
215
|
+
## Содействие
|
216
|
+
|
217
|
+
…
|
218
|
+
|
219
|
+
|
111
220
|
|
112
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/Zlatov/nested_array.
|
113
221
|
|
114
|
-
##
|
222
|
+
## Лицензия
|
115
223
|
|
116
|
-
|
224
|
+
В соответствии с условиями [лицензии 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]]
|
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.0
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- zlatov
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-03-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -109,11 +109,15 @@ files:
|
|
109
109
|
- bin/rspec
|
110
110
|
- bin/setup
|
111
111
|
- dev/nested_options.rb
|
112
|
-
- lib/.byebug_history
|
113
112
|
- lib/nested_array.rb
|
114
113
|
- lib/nested_array/nested.rb
|
115
114
|
- lib/nested_array/version.rb
|
116
115
|
- nested_array.gemspec
|
116
|
+
- test.old/Gemfile
|
117
|
+
- test.old/Gemfile.lock
|
118
|
+
- test.old/bash/run/bundle.sh
|
119
|
+
- test.old/bash/run/test.sh
|
120
|
+
- test.old/test.rb
|
117
121
|
homepage: https://github.com/Zlatov/nested_array
|
118
122
|
licenses:
|
119
123
|
- MIT
|
@@ -136,8 +140,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
136
140
|
- !ruby/object:Gem::Version
|
137
141
|
version: '0'
|
138
142
|
requirements: []
|
139
|
-
|
140
|
-
rubygems_version: 2.7.6
|
143
|
+
rubygems_version: 3.0.3
|
141
144
|
signing_key:
|
142
145
|
specification_version: 4
|
143
146
|
summary: Convert a flat array into a nested one in 1 pass and another…
|