nested_array 3.0.0 → 3.0.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: 1cbdc891f87c006049f2995ac7d0337e6b0c36b3fd18eb9e71ff57725c1b3302
4
- data.tar.gz: 07ab1ff64ded9400e418042fe8159c82e46db8603947f4da77eaa49a50b16752
3
+ metadata.gz: fb4bd2f5d859ff9b134dda8114ebeea68041db5c043684cb10c8aa9d6fd0c951
4
+ data.tar.gz: 69282d083a602fb6f9066285e2a9c41206a2e9cc9f5cfac156ee0bc51df616ac
5
5
  SHA512:
6
- metadata.gz: f0cd5151f188b7323a42cddbfd114a645b6677df026933c2254e446022d04206c45d9042d3ae3d8fcada6a76efe00b2ec4184c86c8a9a6d6c2d08f2aed98b731
7
- data.tar.gz: 49b10c6de7ab78ce83ab61e75653a9564dc9359060f3acf4c7bed9512c916302b0b6a4766516a0890144d373b1fac1207ad4bfce2c870f8c35cd21f76d492d95
6
+ metadata.gz: d8a38d1edc476a6b97bdcaf43cbc480925f6fdf8540be7dcbd12a7a917908447e1f0f44574647b405816fd59417b41ed3a9749ed45e46c85d8716910e9e86328
7
+ data.tar.gz: 26e869340517a302653028977a709a262beb6a43d0690464fa835466920b225315d7fdfbf8101fb686c2f68818f236a3c3837b62617fa93ed45e073614bdc57b
data/README-ru.md CHANGED
@@ -532,7 +532,22 @@ puts nested.pretty_inspect
532
532
 
533
533
  ## Разработка
534
534
 
535
- Для подключения локальной версии гема замените в строке подключения
535
+ Часто используемые команды
536
+
537
+ ```sh
538
+ # rspec управляет загружаемыми гемами, поэтому сам rspec запускается НЕ `bundle
539
+ # exec rspec`, а просто `rspec` или `./bin/rspec`.
540
+ rspec ./spec/lib/nested_array_spec.rb
541
+ rspec ./spec/lib/nested_array/nested_spec.rb
542
+ rspec # Прогон тестов
543
+ subl lib/nested_array/version.rb # Обновление версии
544
+ bundle exec yard doc # Обновление документации в doc/_index.html
545
+ git … # Git-фиксация в origin/master и тег
546
+ gem build # Сборка гема
547
+ gem push ./nested_array-… # Публикация гема
548
+ ```
549
+
550
+ Для подключения локальной версии гема в rails замените в строке подключения
536
551
  (файл Gemfile) второй аргумент (версию) на опцию path:
537
552
 
538
553
  ```rb
@@ -540,9 +555,3 @@ puts nested.pretty_inspect
540
555
  # Работа с древовидными массивами
541
556
  gem "nested_array", path: "../nested_array"
542
557
  ```
543
-
544
- Часто используемые команды
545
-
546
- ```sh
547
-
548
- ```
@@ -0,0 +1,11 @@
1
+ # Определим класс Engine только если гем используется в окружении Rails
2
+ # (например, в приложении Ruby on Rails).
3
+ #
4
+ # Это позволяет использовать ассеты гема (например, CSS) в Rails-приложении,
5
+ # но при этом не мешает запускать тесты RSpec вне Rails-среды.
6
+ if defined?(Rails)
7
+ module NestedArray
8
+ class Engine < ::Rails::Engine
9
+ end
10
+ end
11
+ end
@@ -50,6 +50,7 @@ module NestedArray::Nested
50
50
  }
51
51
  end
52
52
 
53
+ # Преобразует во вложенную структуру на основании parent_id
53
54
  def to_nested(options = {})
54
55
  options = NESTED_OPTIONS.merge options
55
56
  # Зарезервированные поля узла.
@@ -313,9 +314,9 @@ module NestedArray::Nested
313
314
  ret
314
315
  end
315
316
 
316
- #
317
- # Возвращает массив для формирования опций html-тега <select>
317
+ # Возвращает массив для формирования опций html-тега &lt;select&gt;
318
318
  # с псевдографикой, позволяющей вывести древовидную структуру.
319
+ #
319
320
  # ```
320
321
  # [['option_text1', 'option_value1'],['option_text2', 'option_value2'],…]
321
322
  # ```
@@ -1,3 +1,3 @@
1
1
  module NestedArray
2
- VERSION = "3.0.0"
2
+ VERSION = "3.0.1"
3
3
  end
data/lib/nested_array.rb CHANGED
@@ -2,16 +2,15 @@ require "active_support/all"
2
2
 
3
3
  require_relative "nested_array/version"
4
4
  require_relative "nested_array/nested"
5
+ require_relative "nested_array/engine" # Подключаем engine отдельно
5
6
 
6
7
  module NestedArray
7
8
  class Array < ::Array
8
9
  include NestedArray::Nested
9
10
  end
10
-
11
- class Engine < ::Rails::Engine
12
- end
13
11
  end
14
12
 
13
+ # Monkey-patch стандартного Array
15
14
  class Array
16
15
  include ::NestedArray::Nested
17
16
  end
data/nested_array.gemspec CHANGED
@@ -29,9 +29,19 @@ Gem::Specification.new do |spec|
29
29
 
30
30
  # Specify which files should be added to the gem when it is released.
31
31
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
32
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
33
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
34
- end
32
+
33
+ # spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
34
+ # `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
35
+ # end
36
+ spec.files = Dir[
37
+ "lib/**/*",
38
+ "vendor/assets/**/*",
39
+ "exe/**/*",
40
+ "README*",
41
+ "LICENSE*",
42
+ "*.gemspec"
43
+ ]
44
+
35
45
  spec.bindir = "exe"
36
46
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
37
47
  spec.require_paths = ["lib"]
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: 3.0.0
4
+ version: 3.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - zlatov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-09-13 00:00:00.000000000 Z
11
+ date: 2025-07-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -87,48 +87,11 @@ executables: []
87
87
  extensions: []
88
88
  extra_rdoc_files: []
89
89
  files:
90
- - ".gitignore"
91
- - ".rspec"
92
- - ".rubocop.yml"
93
- - ".ruby-version"
94
- - CHANGELOG.md
95
- - Gemfile
96
- - Gemfile.lock
97
90
  - LICENSE.txt
98
- - README-ru-old.md
99
91
  - README-ru.md
100
92
  - README.md
101
- - Rakefile
102
- - TODO.md
103
- - bash/build/gem.sh
104
- - bash/push/gem.sh
105
- - bash/test/gem.sh
106
- - bin/bundle
107
- - bin/byebug
108
- - bin/console
109
- - bin/htmldiff
110
- - bin/ldiff
111
- - bin/rake
112
- - bin/rspec
113
- - bin/setup
114
- - dev/nested_options.rb
115
- - doc/images/2.1.3.1.png
116
- - doc/images/2.1.3.2.png
117
- - doc/images/2.2.1.1.png
118
- - doc/images/2.2.1.2.png
119
- - doc/images/2.2.1.3-1.png
120
- - doc/images/2.2.1.3-2.png
121
- - doc/images/2.2.1.4-1.png
122
- - doc/images/2.2.1.4-2.png
123
- - doc/images/2.2.1.5.png
124
- - doc/images/2.2.2.1.png
125
- - doc/images/2.2.2.2.png
126
- - doc/images/2.2.2.3.png
127
- - doc/images/2.2.2.4.png
128
- - doc/images/2.2.3.1.png
129
- - doc/images/2.2.3.2.png
130
- - doc/images/2.2.3.3.png
131
93
  - lib/nested_array.rb
94
+ - lib/nested_array/engine.rb
132
95
  - lib/nested_array/nested.rb
133
96
  - lib/nested_array/version.rb
134
97
  - nested_array.gemspec
data/.gitignore DELETED
@@ -1,9 +0,0 @@
1
- /.bundle/
2
- /.yardoc
3
- /_yardoc/
4
- /coverage/
5
- /pkg/
6
- /spec/reports/
7
- /tmp/
8
- *.gem
9
- .byebug_history
data/.rspec DELETED
@@ -1,4 +0,0 @@
1
- --color # Вывод в цвете
2
- --require spec_helper # Подключить файл по умолчанию
3
- --order rand # В случайном порядке
4
- --format doc # Вывод в формате
data/.rubocop.yml DELETED
@@ -1,125 +0,0 @@
1
- # Игнорировать отсутствие магического комментария:
2
- # frozen_string_literal: true
3
- #
4
- # Надо понимать что мы теряем производительность если не используем замороженные
5
- # строки там где это возможно, применяйте!: ` -"неизменяемая строка" `
6
- Style/FrozenStringLiteralComment:
7
- Enabled: false
8
-
9
- # Надо понимать что есть качественное различие между
10
- #
11
- # module Foo
12
- # class Bar
13
- # end
14
- # end
15
- #
16
- # и
17
- #
18
- # class Foo::Bar
19
- # end
20
- #
21
- # Если где то в модуль вынесен код:
22
- #
23
- # module Foo
24
- # X = 42
25
- # end
26
- #
27
- # то следует инициализировать модуль До класса-потомка, иначе ошибка. Как выход,
28
- # рубокоп предлагает везде использовать первый синтаксис, а это некрасиво)
29
- Style/ClassAndModuleChildren:
30
- Enabled: false
31
-
32
- # Корячить пустые методы с точка-запятой, нет уж извините!
33
- Style/EmptyMethod:
34
- Enabled: false
35
-
36
- # Не даёт сравнимать с нуль (... == 0), заставляет переписывать на `.zero?`, как-то вообще не согласен!
37
- Style/NumericPredicate:
38
- Enabled: false
39
-
40
- Style/SymbolArray:
41
- # Предпочитаю полный синтаксис вместо %i[foo bar], пстоянно забываю что
42
- # такое %i, %w, %g, %Ж, %П, %x, %y, %й, %н, %я.
43
- # EnforcedStyle: brackets
44
- # Хотя нет, стиль написания может быть любым, учись понимать и так и сяк.
45
- Enabled: false
46
-
47
- # fail обычно бросает исключение, raise пребрасывает после отлова при
48
- # необходимости.
49
- Style/SignalException:
50
- Enabled: false
51
-
52
- # Что может быть более привычным чем простой if
53
- Style/NegatedIf:
54
- Enabled: false
55
-
56
- Style/SymbolProc:
57
- # Аргументы отдельно блоки отдельно:
58
- # something.do_something(foo) { |o| o.bar }
59
- # AllowMethodsWithArguments: true
60
- # Отключена проверка стиля передачи блоков в метод, и так и сяк должно быть
61
- # понятным.
62
- Enabled: false
63
-
64
- # Короткий синтаксис для слабаков! =) на мой взгляд, когда в одном хэш смешан
65
- # короткий и полный синтаксис, тогда код читается рывками (читаем один
66
- # синтаксис, преключаемся на другой, продолжать читать и потом вдруг обратно).
67
- # Возможно дело привычки.
68
- Style/HashSyntax:
69
- EnforcedShorthandSyntax: never
70
-
71
- # Разбивать метод или блок на подметоды только ради красоты кода не хочу, если
72
- # всё что нужно сделать в методе задокумментировано и это не дублирующий код а
73
- # просто большая отдельная задача, то почему бы и не 2000 строк.
74
- Metrics/MethodLength:
75
- Max: 100
76
- Metrics/BlockLength:
77
- Max: 300
78
- Metrics/CyclomaticComplexity:
79
- Max: 30
80
- Metrics/PerceivedComplexity:
81
- Max: 30
82
-
83
- Metrics/ClassLength:
84
- Max: 300
85
- Metrics/ModuleLength:
86
- Max: 300
87
-
88
- # Assignment - присвоения, в том числе +=...
89
- # Branch - явное прямое ветвление программы (вызов методов).
90
- # Condition - логические выражения
91
- # AbcSize = Math.sqrt(A * A + B * B + C * C)
92
- Metrics/AbcSize:
93
- # Enabled: false
94
- Max: 100
95
- CountRepeatedAttributes: false
96
-
97
- # Я так привык — каждый пробел (отступ) должен быть обоснован, а не нафигачен
98
- # до «красивого» отступа.
99
- Layout/ArgumentAlignment:
100
- EnforcedStyle: with_fixed_indentation
101
-
102
- Layout/HashAlignment:
103
- EnforcedHashRocketStyle: table
104
- EnforcedColonStyle: key
105
-
106
- Layout/FirstHashElementIndentation:
107
- EnforcedStyle: consistent
108
-
109
- # Терпеть не могу пробелы ради выравнивания, предпочитаю устанавливать
110
- # необходимое количество отступов (отступ в ruby − кратен двум пробелам).
111
- Layout/MultilineOperationIndentation:
112
- EnforcedStyle: indented
113
- Layout/MultilineMethodCallIndentation:
114
- EnforcedStyle: indented
115
-
116
- # Эммм, это ж короткий синтаксис, нахуй пробелы! array.map{|x| x.id}
117
- Layout/SpaceBeforeBlockBraces:
118
- EnforcedStyle: no_space
119
- Layout/SpaceInsideBlockBraces:
120
- EnforcedStyle: no_space
121
- SpaceBeforeBlockParameters: false
122
-
123
- # На какой вертикали начался блок, на той и должен закрываться.
124
- Layout/BlockAlignment:
125
- EnforcedStyleAlignWith: start_of_block
data/.ruby-version DELETED
@@ -1 +0,0 @@
1
- 2.7.8
data/CHANGELOG.md DELETED
@@ -1,41 +0,0 @@
1
- # Changelog
2
-
3
- ## [2.4.0](https://github.com/Zlatov/nested_array/tree/2.4.0) (2023-01-19)
4
-
5
- [Full Changelog](https://github.com/Zlatov/nested_array/compare/2.3.0...2.4.0)
6
-
7
- ## [2.3.0](https://github.com/Zlatov/nested_array/tree/2.3.0) (2023-01-18)
8
-
9
- [Full Changelog](https://github.com/Zlatov/nested_array/compare/2.2.1...2.3.0)
10
-
11
- **Security fixes:**
12
-
13
- - \[Security\] Bump activesupport from 5.2.4.1 to 6.0.3.2 [\#5](https://github.com/Zlatov/nested_array/pull/5) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
14
-
15
- ## [2.2.1](https://github.com/Zlatov/nested_array/tree/2.2.1) (2023-01-14)
16
-
17
- [Full Changelog](https://github.com/Zlatov/nested_array/compare/2.2.0...2.2.1)
18
-
19
- ## [2.2.0](https://github.com/Zlatov/nested_array/tree/2.2.0) (2020-03-10)
20
-
21
- [Full Changelog](https://github.com/Zlatov/nested_array/compare/1.1.0...2.2.0)
22
-
23
- ## [1.1.0](https://github.com/Zlatov/nested_array/tree/1.1.0) (2020-02-14)
24
-
25
- [Full Changelog](https://github.com/Zlatov/nested_array/compare/2.0.4...1.1.0)
26
-
27
- ## [2.0.4](https://github.com/Zlatov/nested_array/tree/2.0.4) (2020-01-19)
28
-
29
- [Full Changelog](https://github.com/Zlatov/nested_array/compare/2.0.3...2.0.4)
30
-
31
- ## [2.0.3](https://github.com/Zlatov/nested_array/tree/2.0.3) (2020-01-19)
32
-
33
- [Full Changelog](https://github.com/Zlatov/nested_array/compare/2.0.2...2.0.3)
34
-
35
- ## [2.0.2](https://github.com/Zlatov/nested_array/tree/2.0.2) (2020-01-19)
36
-
37
- [Full Changelog](https://github.com/Zlatov/nested_array/compare/784a121dd18007e7e7d113f03c665eb39aa9b018...2.0.2)
38
-
39
-
40
-
41
- \* *This Changelog was automatically generated by [github_changelog_generator] (https://github.com/github-changelog-generator/github-changelog-generator)*
data/Gemfile DELETED
@@ -1,12 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gemspec
4
-
5
- gem 'activesupport', '~> 6.0'
6
-
7
- group :test do
8
- gem 'rspec', '~> 3.10'
9
- end
10
-
11
- # Следим за кодом
12
- gem 'rubocop', require: false
data/Gemfile.lock DELETED
@@ -1,75 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- nested_array (3.0.0)
5
-
6
- GEM
7
- remote: https://rubygems.org/
8
- specs:
9
- activesupport (6.0.3.2)
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, >= 2.2.2)
15
- ast (2.4.2)
16
- awesome_print (1.8.0)
17
- byebug (11.0.1)
18
- concurrent-ruby (1.1.6)
19
- diff-lcs (1.5.0)
20
- i18n (1.8.3)
21
- concurrent-ruby (~> 1.0)
22
- minitest (5.14.1)
23
- parallel (1.22.1)
24
- parser (3.2.1.1)
25
- ast (~> 2.4.1)
26
- rainbow (3.1.1)
27
- rake (10.5.0)
28
- regexp_parser (2.7.0)
29
- rexml (3.2.5)
30
- rspec (3.12.0)
31
- rspec-core (~> 3.12.0)
32
- rspec-expectations (~> 3.12.0)
33
- rspec-mocks (~> 3.12.0)
34
- rspec-core (3.12.1)
35
- rspec-support (~> 3.12.0)
36
- rspec-expectations (3.12.2)
37
- diff-lcs (>= 1.2.0, < 2.0)
38
- rspec-support (~> 3.12.0)
39
- rspec-mocks (3.12.3)
40
- diff-lcs (>= 1.2.0, < 2.0)
41
- rspec-support (~> 3.12.0)
42
- rspec-support (3.12.0)
43
- rubocop (1.28.2)
44
- parallel (~> 1.10)
45
- parser (>= 3.1.0.0)
46
- rainbow (>= 2.2.2, < 4.0)
47
- regexp_parser (>= 1.8, < 3.0)
48
- rexml
49
- rubocop-ast (>= 1.17.0, < 2.0)
50
- ruby-progressbar (~> 1.7)
51
- unicode-display_width (>= 1.4.0, < 3.0)
52
- rubocop-ast (1.17.0)
53
- parser (>= 3.1.1.0)
54
- ruby-progressbar (1.13.0)
55
- thread_safe (0.3.6)
56
- tzinfo (1.2.7)
57
- thread_safe (~> 0.1)
58
- unicode-display_width (2.4.2)
59
- zeitwerk (2.3.0)
60
-
61
- PLATFORMS
62
- ruby
63
-
64
- DEPENDENCIES
65
- activesupport (~> 6.0)
66
- awesome_print (~> 1.8)
67
- bundler (~> 2.0)
68
- byebug (~> 11.0)
69
- nested_array!
70
- rake (~> 10.0)
71
- rspec (~> 3.10)
72
- rubocop
73
-
74
- BUNDLED WITH
75
- 2.1.4
data/README-ru-old.md DELETED
@@ -1,333 +0,0 @@
1
- # NestedArray
2
-
3
- Предназначен для преобразования в древовидную структуру плоских данных описанных
4
- по паттерну «Список смежности» (Adjacency List), то есть в нодах указа предок
5
- `parent_id`. Например:
6
-
7
- ```ruby
8
- [
9
- {id: 1, parent_id: nil, name: 'first', …},
10
- {id: 2, parent_id: 1, name: 'second', …},
11
- {id: 3, parent_id: 1, name: 'third', …}
12
- ]
13
- # ↓ ↓ ↓
14
- [
15
- {id: 1, parent_id: nil, name: 'first', children: [
16
- {id: 2, parent_id: 1, name: 'second', …},
17
- {id: 3, parent_id: 1, name: 'third', …}
18
- ], …}
19
- ]
20
- ```
21
-
22
-
23
-
24
-
25
- ## Установка
26
-
27
- Добавте строку в _Gemfile_ вашего приложения:
28
-
29
- ```ruby
30
- # Работа с древовидными массивами.
31
- gem "nested_array", "~> 3.0"
32
- ```
33
-
34
- И затем выполните `bundle install`.
35
-
36
- Или установите его как `gem install nested_array`
37
-
38
- Если вы планируете использовать скромный CSS гема, добавте в
39
- файл _app/assets/stylesheets/application.scss_:
40
-
41
- ```css
42
- /* Отображение древовидных массивов. */
43
- @import "nested_array";
44
- ```
45
-
46
-
47
- ## Использование
48
-
49
- <a name="methods"></a>
50
- * Список методов
51
- * [to_nested](#to_nested) — преобразует плоскую структуру во вложенную;
52
- * [each_nested](#each_nested) — перебирает вложенную стуктуру;
53
- * [each_nested!](#each_nested) — перебирает вложенную стуктуру, предоставляя доступ к исходным данным;
54
- * [nested_to_html](#nested_to_html) — преобразует вложенную структуру в html вёрстку (многоуровневый список `<ul><li>…`);
55
- * [nested_to_options](#nested_to_options) — преобразует вложенную структуру в массив для формирования опций html-тега `<select>` с псевдографикой;
56
- * [nested_to_collection_select](#nested_to_collection_select) — преобразует вложенную структуру в плоскую но добавляет псевдографику в тектовое поле для формирования тэга `<select>`;
57
- * [concat_nested](#concat_nested) — скеивание вложенных структур, ноды склеиваются если путь к ним одинаков.
58
- * Вывод
59
- * Вложенный список ul > li
60
-
61
-
62
- ### Список методов
63
-
64
- <a name="to_nested"></a>
65
- #### to_nested [↑](#methods "К методам")
66
-
67
- Преобразует плоскую структуру во вложенную.
68
-
69
- ```ruby
70
- a = [{'id' => 1, 'parent_id' => nil}]
71
- a = NestedArray::Array.new a
72
- b = a.to_nested
73
- ```
74
-
75
- __Опции__
76
-
77
- У каждой ноды вложенной структуры есть базовые свойства, такие как
78
- идентификатор, идентификатор предка и другие. Для доступа к этим данным
79
- используются ключи, которые можно настроить как в примере ниже. По умолчанию
80
- используются следующие __строковые__ (_чувствительны к string/symbol_) ключи:
81
-
82
- ```ruby
83
- b = a.to_nested({
84
- id: 'id', # указывает какое свойство ноды является идентификатором;
85
- parent_id: 'parent_id', # -//- предком;
86
- children: 'children', # -//- массивом потомков;
87
- level: 'level' # -//- дополнительным свойством с уровнем вложенности;
88
- root_id: nil # определяет что является корнем для построения дерева,
89
- # например, для построения ветви корнем корнем
90
- # является идентификатор одной из нод.
91
- })
92
- ```
93
-
94
- Дополнительные опции преобразования:
95
-
96
- ```ruby
97
- b = a.to_nested({
98
- hashed: false, # потомки могут храниться не в массиве а в хэше;
99
- add_level: false, # добавляет в ноду информацию о уровене вложенности ноды;
100
- })
101
- ```
102
-
103
-
104
-
105
-
106
- <a name="each_nested"></a>
107
- #### each_nested [↑](#methods "К методам")
108
-
109
- Перебирает вложенную стуктуру.
110
-
111
- ```ruby
112
- nested.each_nested do |node, parents, level, is_last_children|
113
- puts node # > {'id' => ...}
114
- puts parents # > [{'id' => ...}]
115
- puts level # > 0
116
- puts is_last_children # > false
117
- end
118
- ```
119
-
120
-
121
-
122
-
123
- <a name="nested_to_html"></a>
124
- #### nested_to_html [↑](#methods "К методам")
125
-
126
- Формирует _html_-код для вывода вложенных структур с использованием вложенных друг в друга списков `<ul>`.
127
-
128
- __Пример__
129
-
130
- ```ruby
131
- [
132
- {'id' => 1, 'parent_id' => nil, 'name' => 'first'},
133
- {'id' => 2, 'parent_id' => 1, 'name' => 'second'},
134
- {'id' => 3, 'parent_id' => 1, 'name' => 'third'}
135
- ].to_nested.nested_to_html do |node|
136
- node['name']
137
- end
138
- ```
139
-
140
- Вернёт
141
-
142
- ```html
143
- <li>first
144
- <ul>
145
- <li>second</li>
146
- <li>third</li>
147
- </ul>
148
- </li>
149
- ```
150
-
151
- __Расширенный пример__
152
-
153
- ```ruby
154
- .nested_to_html li: '<li class="my">', _ul: '<i></i></ul>' do |node, parents, level|
155
- block_options = {}
156
- block_options[:li] = '<li class="my current">' if node['id'] == 2
157
- [
158
- "id: #{node['id']}, #{node['name']}, parent name: #{parents[level]&.[]('name')}",
159
- block_options
160
- ]
161
- end
162
- ```
163
-
164
- __Опции__
165
-
166
- Все опции могут быть аргументами метода, и только некоторые опции влияют на результат через блок — на лету (последняя строка блока).
167
-
168
- ```ruby
169
- tabulated: true,
170
- inline: false,
171
- tab: "\t",
172
- ul: '<ul>', # может задаваться блоком
173
- _ul: '</ul>',
174
- li: '<li>', # может задаваться блоком
175
- _li: '</li>',
176
- ```
177
-
178
-
179
-
180
-
181
- <a name="nested_to_options"></a>
182
- #### nested_to_options [↑](#methods "К методам")
183
-
184
- Формирования опций для html-тега &lt;select&gt;
185
-
186
- Возвращает массив с псевдографикой, позволяющей вывести древовидную структуру.
187
-
188
- ```ruby
189
-
190
- [['option_text1', 'option_value1'],['option_text2', 'option_value2'],…]
191
- ```
192
-
193
- __Опции__
194
-
195
- ```ruby
196
- option_value: 'id', # Что брать в качестве значений при формировании опций селекта.
197
- option_text: 'name',
198
- ```
199
-
200
-
201
-
202
-
203
- <a name="nested_to_collection_select"></a>
204
- #### nested_to_collection_select [↑](#methods "К методам")
205
-
206
- Преобразует вложенную структуру данных в плоскую, но добавляет в значение поля
207
- отвечающего за текстовое представление (:name) псевдографику древовидной
208
- структуры.
209
-
210
- Это позволяет вывести тэг select в сносном виде для использования с вложенными
211
- структурами.
212
-
213
- Пример с хелпером `collection_select`
214
-
215
- ```rb
216
- <%= form.collection_select :catalog_ids,
217
- Catalog.all.to_a.to_nested.nested_to_collection_select, :id, :name,
218
- {
219
- # prompt: true
220
- # include_blank: true
221
- },
222
- {
223
- multiple: true,
224
- size: 10
225
- }
226
- %>
227
- ```
228
-
229
- Пример с хелпером `select` в сочетании с `options_from_collection_for_select`
230
-
231
- ```erb
232
- <% catalogs = Catalog.all.to_a %>
233
- <%= form.select :catalog_ids,
234
- options_from_collection_for_select(
235
- catalogs.to_nested.nested_to_collection_select, :id, :name,
236
- disabled: catalogs.select{|x| x.hidden?}.pluck(:id),
237
- selected: form.object.catalog_ids
238
- ),
239
- {
240
- # prompt: true
241
- # include_blank: true
242
- },
243
- {
244
- multiple: true,
245
- size: 10
246
- }
247
- %>
248
- ```
249
-
250
-
251
-
252
-
253
- <a name="concat_nested"></a>
254
- #### concat_nested [↑](#methods "К методам")
255
-
256
- Скеивание вложенных структур.
257
-
258
- * Ноды склеиваются если путь к ним одинаков;
259
- * Путь определяется из сложения Текстов (конфигурируемо через :path_key);
260
-
261
- __Опции__
262
-
263
- ```ruby
264
- path_separator: '-=path_separator=-',
265
- path_key: 'text',
266
- ```
267
-
268
-
269
-
270
- ### Вывод
271
-
272
- #### Вложенный список ul-li
273
-
274
- ![Screenshot](doc/images/01.png)
275
-
276
- ```ruby
277
- <ul>
278
- <% @catalogs.to_a.to_nested.each_nested do |node, origin| %>
279
- <%= node.before -%>
280
- <%= node.name -%>
281
- <%= node.after -%>
282
- <% end %>
283
- </ul>
284
- ```
285
-
286
- ![Screenshot](doc/images/02.png)
287
-
288
- #### Вложенный расскрывающийся список
289
-
290
- ```ruby
291
- <ul class="nested_array-details">
292
- <% @catalogs.to_a.to_nested.each_nested details: true do |node, origin| %>
293
- <%= node.before -%>
294
- <%= node.name -%>
295
- <%= node.after -%>
296
- <% end %>
297
- </ul>
298
- ```
299
-
300
- ![Screenshot](doc/images/03.png)
301
-
302
- Если необходимо открыть некоторые узлы
303
-
304
- ```ruby
305
- <ul class="nested_array-details">
306
- <% @catalogs.to_a.to_nested.each_nested details: true do |node, origin| %>
307
- <%= node.before -%>
308
- <%= node.name -%>
309
- <%= node.after(open: node.is_has_children) -%>
310
- <% end %>
311
- </ul>
312
- ```
313
-
314
- ![Screenshot](doc/images/04.png)
315
-
316
-
317
- ## Разработка
318
-
319
-
320
-
321
-
322
-
323
-
324
- ## Содействие
325
-
326
-
327
-
328
-
329
-
330
-
331
- ## Лицензия
332
-
333
- В соответствии с условиями [лицензии MIT](https://opensource.org/licenses/MIT).
data/Rakefile DELETED
@@ -1,2 +0,0 @@
1
- require "bundler/gem_tasks"
2
- task :default => :spec
data/TODO.md DELETED
@@ -1,12 +0,0 @@
1
- При возврате массива OpenStruct (всегда) пропадает смысл метода `each_nested!`
2
- который должен отдавать в переменной node исходные данные (ну они не исходые
3
- уже). Поэтому необходимо выпустить версию 3.0.0 с удалением метода
4
- `each_nested!`.
5
-
6
- Добавлен метод nested_to_collection_select, нужно пересмотреть метод
7
- nested_to_options (возможно удалить в следующей версии).
8
-
9
- Переработать README-ru и на английский доперевести в конце концов.
10
-
11
- Нужно интегрировать Rails::Engine класс, а то ругается при тестах. Класс нужен
12
- чтобы в рельсе можно было использовать ассеты.
data/bash/build/gem.sh DELETED
@@ -1,9 +0,0 @@
1
- #!/usr/bin/env bash
2
-
3
- set -eu
4
-
5
- cd "$(dirname "${0}")"
6
-
7
- cd ../..
8
-
9
- gem build nested_array
data/bash/push/gem.sh DELETED
@@ -1,15 +0,0 @@
1
- #!/usr/bin/env bash
2
-
3
- set -eu
4
-
5
- cd "$(dirname "${0}")"
6
-
7
- cd ../..
8
-
9
- if [[ -z ${1-} ]]
10
- then
11
- echo "Не указан путь к скомпилированному гему" 1>&2;
12
- exit 0
13
- fi
14
-
15
- gem push $1
data/bash/test/gem.sh DELETED
@@ -1,11 +0,0 @@
1
- #!/usr/bin/env bash
2
-
3
- set -eu
4
-
5
- cd "$(dirname "${0}")"
6
-
7
- cd ../..
8
-
9
- # rspec управляет загружаемыми гемами, поэтому сам rspec запускается НЕ `bundle exec rspec`, а просто `rspec`
10
- ./bin/rspec --format doc ./spec/array_spec.rb
11
- ./bin/rspec --format doc ./spec/nested_array_array_spec.rb
data/bin/bundle DELETED
@@ -1,105 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- #
5
- # This file was generated by Bundler.
6
- #
7
- # The application 'bundle' is installed as part of a gem, and
8
- # this file is here to facilitate running it.
9
- #
10
-
11
- require "rubygems"
12
-
13
- m = Module.new do
14
- module_function
15
-
16
- def invoked_as_script?
17
- File.expand_path($0) == File.expand_path(__FILE__)
18
- end
19
-
20
- def env_var_version
21
- ENV["BUNDLER_VERSION"]
22
- end
23
-
24
- def cli_arg_version
25
- return unless invoked_as_script? # don't want to hijack other binstubs
26
- return unless "update".start_with?(ARGV.first || " ") # must be running `bundle update`
27
- bundler_version = nil
28
- update_index = nil
29
- ARGV.each_with_index do |a, i|
30
- if update_index && update_index.succ == i && a =~ Gem::Version::ANCHORED_VERSION_PATTERN
31
- bundler_version = a
32
- end
33
- next unless a =~ /\A--bundler(?:[= ](#{Gem::Version::VERSION_PATTERN}))?\z/
34
- bundler_version = $1 || ">= 0.a"
35
- update_index = i
36
- end
37
- bundler_version
38
- end
39
-
40
- def gemfile
41
- gemfile = ENV["BUNDLE_GEMFILE"]
42
- return gemfile if gemfile && !gemfile.empty?
43
-
44
- File.expand_path("../../Gemfile", __FILE__)
45
- end
46
-
47
- def lockfile
48
- lockfile =
49
- case File.basename(gemfile)
50
- when "gems.rb" then gemfile.sub(/\.rb$/, gemfile)
51
- else "#{gemfile}.lock"
52
- end
53
- File.expand_path(lockfile)
54
- end
55
-
56
- def lockfile_version
57
- return unless File.file?(lockfile)
58
- lockfile_contents = File.read(lockfile)
59
- return unless lockfile_contents =~ /\n\nBUNDLED WITH\n\s{2,}(#{Gem::Version::VERSION_PATTERN})\n/
60
- Regexp.last_match(1)
61
- end
62
-
63
- def bundler_version
64
- @bundler_version ||= begin
65
- env_var_version || cli_arg_version ||
66
- lockfile_version || "#{Gem::Requirement.default}.a"
67
- end
68
- end
69
-
70
- def load_bundler!
71
- ENV["BUNDLE_GEMFILE"] ||= gemfile
72
-
73
- # must dup string for RG < 1.8 compatibility
74
- activate_bundler(bundler_version.dup)
75
- end
76
-
77
- def activate_bundler(bundler_version)
78
- if Gem::Version.correct?(bundler_version) && Gem::Version.new(bundler_version).release < Gem::Version.new("2.0")
79
- bundler_version = "< 2"
80
- end
81
- gem_error = activation_error_handling do
82
- gem "bundler", bundler_version
83
- end
84
- return if gem_error.nil?
85
- require_error = activation_error_handling do
86
- require "bundler/version"
87
- end
88
- return if require_error.nil? && Gem::Requirement.new(bundler_version).satisfied_by?(Gem::Version.new(Bundler::VERSION))
89
- warn "Activating bundler (#{bundler_version}) failed:\n#{gem_error.message}\n\nTo install the version of bundler this project requires, run `gem install bundler -v '#{bundler_version}'`"
90
- exit 42
91
- end
92
-
93
- def activation_error_handling
94
- yield
95
- nil
96
- rescue StandardError, LoadError => e
97
- e
98
- end
99
- end
100
-
101
- m.load_bundler!
102
-
103
- if m.invoked_as_script?
104
- load Gem.bin_path("bundler", "bundle")
105
- end
data/bin/byebug DELETED
@@ -1,29 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- #
5
- # This file was generated by Bundler.
6
- #
7
- # The application 'byebug' is installed as part of a gem, and
8
- # this file is here to facilitate running it.
9
- #
10
-
11
- require "pathname"
12
- ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
- Pathname.new(__FILE__).realpath)
14
-
15
- bundle_binstub = File.expand_path("../bundle", __FILE__)
16
-
17
- if File.file?(bundle_binstub)
18
- if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
- load(bundle_binstub)
20
- else
21
- abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
- Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
- end
24
- end
25
-
26
- require "rubygems"
27
- require "bundler/setup"
28
-
29
- load Gem.bin_path("byebug", "byebug")
data/bin/console DELETED
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require "bundler/setup"
4
- require "nested_array"
5
-
6
- # You can add fixtures and/or initialization code here to make experimenting
7
- # with your gem easier. You can also use a different console, if you like.
8
-
9
- # (If you use this, don't forget to add pry to your Gemfile!)
10
- # require "pry"
11
- # Pry.start
12
-
13
- require "irb"
14
- IRB.start(__FILE__)
data/bin/htmldiff DELETED
@@ -1,29 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- #
5
- # This file was generated by Bundler.
6
- #
7
- # The application 'htmldiff' is installed as part of a gem, and
8
- # this file is here to facilitate running it.
9
- #
10
-
11
- require "pathname"
12
- ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
- Pathname.new(__FILE__).realpath)
14
-
15
- bundle_binstub = File.expand_path("../bundle", __FILE__)
16
-
17
- if File.file?(bundle_binstub)
18
- if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
- load(bundle_binstub)
20
- else
21
- abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
- Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
- end
24
- end
25
-
26
- require "rubygems"
27
- require "bundler/setup"
28
-
29
- load Gem.bin_path("diff-lcs", "htmldiff")
data/bin/ldiff DELETED
@@ -1,29 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- #
5
- # This file was generated by Bundler.
6
- #
7
- # The application 'ldiff' is installed as part of a gem, and
8
- # this file is here to facilitate running it.
9
- #
10
-
11
- require "pathname"
12
- ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
- Pathname.new(__FILE__).realpath)
14
-
15
- bundle_binstub = File.expand_path("../bundle", __FILE__)
16
-
17
- if File.file?(bundle_binstub)
18
- if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
- load(bundle_binstub)
20
- else
21
- abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
- Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
- end
24
- end
25
-
26
- require "rubygems"
27
- require "bundler/setup"
28
-
29
- load Gem.bin_path("diff-lcs", "ldiff")
data/bin/rake DELETED
@@ -1,29 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- #
5
- # This file was generated by Bundler.
6
- #
7
- # The application 'rake' is installed as part of a gem, and
8
- # this file is here to facilitate running it.
9
- #
10
-
11
- require "pathname"
12
- ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
- Pathname.new(__FILE__).realpath)
14
-
15
- bundle_binstub = File.expand_path("../bundle", __FILE__)
16
-
17
- if File.file?(bundle_binstub)
18
- if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
- load(bundle_binstub)
20
- else
21
- abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
- Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
- end
24
- end
25
-
26
- require "rubygems"
27
- require "bundler/setup"
28
-
29
- load Gem.bin_path("rake", "rake")
data/bin/rspec DELETED
@@ -1,29 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- #
5
- # This file was generated by Bundler.
6
- #
7
- # The application 'rspec' is installed as part of a gem, and
8
- # this file is here to facilitate running it.
9
- #
10
-
11
- require "pathname"
12
- ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
- Pathname.new(__FILE__).realpath)
14
-
15
- bundle_binstub = File.expand_path("../bundle", __FILE__)
16
-
17
- if File.file?(bundle_binstub)
18
- if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
- load(bundle_binstub)
20
- else
21
- abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
- Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
- end
24
- end
25
-
26
- require "rubygems"
27
- require "bundler/setup"
28
-
29
- load Gem.bin_path("rspec-core", "rspec")
data/bin/setup DELETED
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
- IFS=$'\n\t'
4
- set -vx
5
-
6
- bundle install
7
-
8
- # Do any other automated setup that you need to do here
@@ -1,25 +0,0 @@
1
- require_relative '../lib/nested_array.rb'
2
- require 'awesome_print'
3
-
4
- a = [
5
- {'id' => 1, 'parent_id' => nil, 'name' => 'category 1'},
6
- {'id' => 2, 'parent_id' => nil, 'name' => 'category 2'},
7
- {'id' => 3, 'parent_id' => 2, 'name' => 'category 3'},
8
- {'id' => 4, 'parent_id' => nil, 'name' => 'category 4'},
9
- {'id' => 5, 'parent_id' => 4, 'name' => 'category 5'},
10
- {'id' => 6, 'parent_id' => 5, 'name' => 'category 6'},
11
- {'id' => 7, 'parent_id' => nil, 'name' => 'category 7'},
12
- {'id' => 8, 'parent_id' => 7, 'name' => 'category 8'},
13
- {'id' => 9, 'parent_id' => 7, 'name' => 'category 9'},
14
- {'id' => 10, 'parent_id' => 9, 'name' => 'category 10'},
15
- {'id' => 11, 'parent_id' => 9, 'name' => 'category 11'}
16
- ]
17
-
18
- b = a.shuffle
19
-
20
- array = b.to_nested.nested_to_options
21
- print 'array: '.red; p array
22
-
23
- array.each do |v|
24
- puts v[0]
25
- end
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file