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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 615dfa5d6f5e62fb074c1582e8f7b89d825d39e5240a0fca57fe6d87d59e893e
4
- data.tar.gz: 108c8eeae031fa0c6340455534132df7238f98c027dc12c3ce811eb20134a210
3
+ metadata.gz: 9e82939abe3e113f9ce8e54713fd52221362f5e68f5e510ec00153e5504c7198
4
+ data.tar.gz: 7a854bb61bbb605396b154246b71f2c4e482c1356b37f1f6cb9c2bc4bda6e7f4
5
5
  SHA512:
6
- metadata.gz: a211a97ca7211c64aafe1eace4649ec6c35fdff531897a68696da3ac42f5cd2f022d755e1b535d46313de9c444e7840ca0d78ca87770be9ac1a46f51ccdaf785
7
- data.tar.gz: 66ec5538a88d030de339df95637be069a2fc78c7c2b0ba46b72c4462cfbe465da9f58e1b3327a2f8f63d8eff419d3569a2fc6fb8fcc2d4f4d8868e227ae37fc0
6
+ metadata.gz: 1dc59a5a4ae0393bc3f3ab1156273e5490b2ac9a3495595d9ff23a0d9d3dfd79f215f7762f7a361ab0c0827f4a7bbcd606b105dec23c2b22ec3d92e3faf7f2ac
7
+ data.tar.gz: a0a0b98e8f8a3c440a8d8c56f1744352b0f94fbc626cb2380fe0b382fbbae2f52cd84ea05812fa2f03b1bda0402e9f7b6c9fc4139c58030c28307c21b55bb855
data/.gitignore CHANGED
@@ -7,3 +7,4 @@
7
7
  /spec/reports/
8
8
  /tmp/
9
9
  *.gem
10
+ .byebug_history
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- nested_array (2.0.3)
4
+ nested_array (2.2.1)
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
data/README-ru.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # NestedArray
2
2
 
3
- Предназначен для преобразования в древовидную структуру плоских данных описанных по паттерну «Список смежности» (Adjacency List), то есть в нодах указа предок `parent_id`. Например:
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
- gem 'nested_array', '~> 2.0.0'
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
- ```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>
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
- __Опции `to_nested`__
74
+ __Опции__
45
75
 
46
- `Catalogs.all.to_a.to_nested(options)`
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
- Для указания базовых имён полей ноды (чувствительны к string/symbol):
93
+ Дополнительные опции преобразования:
49
94
 
95
+ ```ruby
96
+ b = a.to_nested({
97
+ hashed: false, # потомки могут храниться не в массиве а в хэше;
98
+ add_level: false, # добавляет в ноду информацию о уровене вложенности ноды;
99
+ })
50
100
  ```
51
- id: 'id',
52
- parent_id: 'parent_id',
53
- children: 'children',
54
- level: 'level',
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
- hashed: false,
61
- add_level: false,
62
- root_id: nil,
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
- __Опции `nested_to_html`__
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
- path_separator: '-=path_separator=-',
86
- path_key: 'text',
87
- ```
180
+ <a name="nested_to_options"></a>
181
+ ### nested_to_options [↑](#methods "К методам")
88
182
 
89
- ### Формирования опций для html-тега &lt;select&gt; `nested_to_options`
183
+ Формирования опций для html-тега &lt;select&gt;
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
- __Опции `nested_to_options`__
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
- ## Contributing
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
- ## License
234
+ ## Лицензия
115
235
 
116
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
236
+ В соответствии с условиями [лицензии 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]]
@@ -298,7 +302,7 @@ module NestedArray::Nested
298
302
  node_level = (1..level).map{|l| last[l] == true ? '&nbsp;' : '┃'}.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}╸#{node_text}"
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
@@ -1,3 +1,3 @@
1
1
  module NestedArray
2
- VERSION = "2.0.4"
2
+ VERSION = "2.2.1"
3
3
  end
data/test.old/Gemfile ADDED
@@ -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
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
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: 2020-01-19 00:00:00.000000000 Z
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
- rubyforge_project:
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__
data/lib/.byebug_history DELETED
@@ -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