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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 615dfa5d6f5e62fb074c1582e8f7b89d825d39e5240a0fca57fe6d87d59e893e
4
- data.tar.gz: 108c8eeae031fa0c6340455534132df7238f98c027dc12c3ce811eb20134a210
3
+ metadata.gz: d8f6db479729f7d6924b27d7b18d12ef9f20eab329ceb794624b98203316569b
4
+ data.tar.gz: a0114a0c9169e8247a69081dc5f037ef14aead1bdc64410ea82ccee8eea323f2
5
5
  SHA512:
6
- metadata.gz: a211a97ca7211c64aafe1eace4649ec6c35fdff531897a68696da3ac42f5cd2f022d755e1b535d46313de9c444e7840ca0d78ca87770be9ac1a46f51ccdaf785
7
- data.tar.gz: 66ec5538a88d030de339df95637be069a2fc78c7c2b0ba46b72c4462cfbe465da9f58e1b3327a2f8f63d8eff419d3569a2fc6fb8fcc2d4f4d8868e227ae37fc0
6
+ metadata.gz: 84f1752a4dc9d6158c735ed68622cbc136838bee43cc780a5e415e9f2f0725455f7dcba4c5c60ec2d02de74fe3ef2d5490f4b16bf761ddfdb21857b960ff366e
7
+ data.tar.gz: 751204ab59242230156ebf4891897a98bafc67cd328173bf44f2cfcabe86d8b1839e5b8c6dc0ca204b16d5135ed929de7d2345dc65cc88dab690e6792392f860
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- nested_array (2.0.3)
4
+ nested_array (2.2.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -49,4 +49,4 @@ DEPENDENCIES
49
49
  rspec (~> 3.9)
50
50
 
51
51
  BUNDLED WITH
52
- 2.0.1
52
+ 2.1.4
@@ -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', '~> 2.0.0'
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
- ```html
37
- <ul>
38
- <%= Catalogs.all.to_a.to_nested.nested_to_html do |node| %>
39
- <% link_to "#{node['name']}", catalog_view_path(node['slug']) %>
40
- <% end %>
41
- </ul>
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
- __Опции `to_nested`__
65
+ __Опции__
45
66
 
46
- `Catalogs.all.to_a.to_nested(options)`
67
+ У каждой ноды вложенной структуры есть базовые свойства, такие как идентификатор, идентификатор предка и другие. Для доступа к этим данным используются ключи, которые можно настроить как в примере ниже. По умолчанию используются следующие __строковые__ (_чувствительны к string/symbol_) ключи:
47
68
 
48
- Для указания базовых имён полей ноды (чувствительны к string/symbol):
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
- id: 'id',
52
- parent_id: 'parent_id',
53
- children: 'children',
54
- level: 'level',
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
- hashed: false,
61
- add_level: false,
62
- root_id: nil,
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
- __Опции `nested_to_html`__
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
- path_separator: '-=path_separator=-',
86
- path_key: 'text',
87
- ```
168
+ <a name="nested_to_options"></a>
169
+ ### nested_to_options [↑](#methods "К методам")
88
170
 
89
- ### Формирования опций для html-тега &lt;select&gt; `nested_to_options`
171
+ Формирования опций для html-тега &lt;select&gt;
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
- __Опции `nested_to_options`__
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
- ## Contributing
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
- ## License
222
+ ## Лицензия
115
223
 
116
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
224
+ В соответствии с условиями [лицензии MIT](https://opensource.org/licenses/MIT).
data/README.md CHANGED
@@ -23,6 +23,7 @@ It is intended for transformation into a tree structure of flat data described b
23
23
  Add this line to your application's Gemfile:
24
24
 
25
25
  ```ruby
26
+ gem 'nested_array', '~> 1.0.0'
26
27
  gem 'nested_array', '~> 2.0.0'
27
28
  ```
28
29
 
@@ -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+= yield(node.clone, parents.clone, level)
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]]
@@ -1,3 +1,3 @@
1
1
  module NestedArray
2
- VERSION = "2.0.4"
2
+ VERSION = "2.2.0"
3
3
  end
@@ -0,0 +1,5 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem 'activesupport'
4
+ gem 'awesome_print'
5
+ gem 'nested_array', path: '../'
@@ -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
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -eu
4
+
5
+ cd "$(dirname "${0}")"
6
+
7
+ cd ../..
8
+
9
+ bundle install
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -eu
4
+
5
+ cd "$(dirname "${0}")"
6
+
7
+ cd ../..
8
+
9
+ bundle exec ruby test.rb
@@ -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
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-01-19 00:00:00.000000000 Z
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
- rubyforge_project:
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…
@@ -1,10 +0,0 @@
1
- continue
2
- NestedArrayModule.class
3
- NestedArrayModule
4
- NestedArrayMod
5
- NestedArray.class
6
- NestedArray
7
- self.parent
8
- self.class
9
- continue
10
- NestedArray.class