lite-component 1.0.7 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7a8da63bbff0a8b2ff1ed61b3c3a8ae03219c44c068f3a4ae341f2cf28505e16
4
- data.tar.gz: 9e47f787be905cc2f3d08818aec1d8a91f111f3998e8f36bdfdd322d6c1f817f
3
+ metadata.gz: 2d9bdfa9c79cc9a007b6b1e35c42072dcbbbf6cf319c09b7d69738ef0133f284
4
+ data.tar.gz: 790df7f0ced92eec0f4403740ac4e433dc80e11f1f5ab2305d3d2fe935359afd
5
5
  SHA512:
6
- metadata.gz: '029d1ed5a40fc81b0692d7a911a75a6f0238e2bc5bf54e2f41398f4a0293f75a44a32c44b990b181377ffe68c245d84b8ab9cc50e5e7e5e76eb4837b6a5da285'
7
- data.tar.gz: 8db291f7a80fcbb8824460c0fc7bc8d92beb8baf5300fefc630242f5e159f5bcf9e4cfb5a94ec3fa84ad06b88a1a5fa978f68d62b55ed9d9ff79427791e46272
6
+ metadata.gz: bda36b4310e86b25b3f1f6e57b24a42b8a1eec4afe178bcdcf4886a7bffcd025de9110a15aba00589062c3aacf5ae5294763acccfa70bd2690f8a45229db4196
7
+ data.tar.gz: 139d5bd118979cdb4d6ed7edcfe5f5e95e34d517aba028a5ef6bd462fe5955e7a2c36bed6dd7381bd79bba81eb69b95d48d3dbbc65f09eb870d26d9e507b917f
@@ -1,10 +1,16 @@
1
1
  require:
2
2
  - rubocop-performance
3
+ - rubocop-rake
3
4
  - rubocop-rspec
4
5
  AllCops:
5
- TargetRubyVersion: 2.6
6
+ TargetRubyVersion: 2.7
6
7
  DisplayCopNames: true
7
8
  DisplayStyleGuide: true
9
+ NewCops: enable
10
+ Gemspec/RequiredRubyVersion:
11
+ Enabled: false
12
+ Layout/EmptyLinesAroundAttributeAccessor:
13
+ Enabled: true
8
14
  Layout/EmptyLinesAroundBlockBody:
9
15
  Exclude:
10
16
  - 'spec/**/**/*'
@@ -14,6 +20,12 @@ Layout/EmptyLinesAroundModuleBody:
14
20
  EnforcedStyle: empty_lines_except_namespace
15
21
  Layout/LineLength:
16
22
  Max: 100
23
+ Layout/SpaceAroundMethodCallOperator:
24
+ Enabled: true
25
+ Lint/RaiseException:
26
+ Enabled: true
27
+ Lint/StructNewOverride:
28
+ Enabled: true
17
29
  Metrics/BlockLength:
18
30
  Enabled: false
19
31
  Metrics/ClassLength:
@@ -30,3 +42,13 @@ Style/Documentation:
30
42
  Enabled: false
31
43
  Style/ExpandPathArguments:
32
44
  Enabled: false
45
+ Style/ExponentialNotation:
46
+ Enabled: true
47
+ Style/HashEachMethods:
48
+ Enabled: true
49
+ Style/HashTransformKeys:
50
+ Enabled: true
51
+ Style/HashTransformValues:
52
+ Enabled: true
53
+ Style/SlicingWithRange:
54
+ Enabled: false
@@ -6,6 +6,30 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [1.1.0] - 2021-01-20
10
+ ### Added
11
+ - Add improved collection rendering
12
+ ### Removed
13
+ - Collection class is no longer needed
14
+
15
+ ## [1.0.11] - 2020-04-24
16
+ ### Added
17
+ - Added `to_h` and `to_hash` aliases for dumping locals
18
+
19
+ ## [1.0.10] - 2020-04-06
20
+ ### Added
21
+ - Added `render?` method for checking complex logic
22
+
23
+ ## [1.0.9] - 2020-01-08
24
+ ### Added
25
+ - Added block support to yield other components
26
+ ### Changed
27
+ - Changed how the helper generated the component
28
+
29
+ ## [1.0.8] - 2019-12-26
30
+ ### Added
31
+ - Added `c` local variable to access the component
32
+
9
33
  ## [1.0.7] - 2019-12-24
10
34
  ### Changed
11
35
  - Fixed path to nested partials
@@ -1,59 +1,60 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- lite-component (1.0.7)
4
+ lite-component (1.1.0)
5
5
  actionview
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- actionpack (6.0.2.1)
11
- actionview (= 6.0.2.1)
12
- activesupport (= 6.0.2.1)
13
- rack (~> 2.0, >= 2.0.8)
10
+ actionpack (6.1.1)
11
+ actionview (= 6.1.1)
12
+ activesupport (= 6.1.1)
13
+ rack (~> 2.0, >= 2.0.9)
14
14
  rack-test (>= 0.6.3)
15
15
  rails-dom-testing (~> 2.0)
16
16
  rails-html-sanitizer (~> 1.0, >= 1.2.0)
17
- actionview (6.0.2.1)
18
- activesupport (= 6.0.2.1)
17
+ actionview (6.1.1)
18
+ activesupport (= 6.1.1)
19
19
  builder (~> 3.1)
20
20
  erubi (~> 1.4)
21
21
  rails-dom-testing (~> 2.0)
22
22
  rails-html-sanitizer (~> 1.1, >= 1.2.0)
23
- activesupport (6.0.2.1)
23
+ activesupport (6.1.1)
24
24
  concurrent-ruby (~> 1.0, >= 1.0.2)
25
- i18n (>= 0.7, < 2)
26
- minitest (~> 5.1)
27
- tzinfo (~> 1.1)
28
- zeitwerk (~> 2.2)
29
- ast (2.4.0)
25
+ i18n (>= 1.6, < 2)
26
+ minitest (>= 5.1)
27
+ tzinfo (~> 2.0)
28
+ zeitwerk (~> 2.3)
29
+ ast (2.4.1)
30
30
  builder (3.2.4)
31
31
  colorize (0.8.1)
32
- concurrent-ruby (1.1.5)
33
- crass (1.0.5)
34
- diff-lcs (1.3)
35
- erubi (1.9.0)
36
- fasterer (0.8.1)
32
+ concurrent-ruby (1.1.8)
33
+ crass (1.0.6)
34
+ diff-lcs (1.4.4)
35
+ erubi (1.10.0)
36
+ fasterer (0.8.3)
37
37
  colorize (~> 0.7)
38
38
  ruby_parser (>= 3.14.1)
39
39
  generator_spec (0.9.4)
40
40
  activesupport (>= 3.0.0)
41
41
  railties (>= 3.0.0)
42
- i18n (1.7.0)
42
+ i18n (1.8.7)
43
43
  concurrent-ruby (~> 1.0)
44
- jaro_winkler (1.5.4)
45
- loofah (2.4.0)
44
+ loofah (2.9.0)
46
45
  crass (~> 1.0.2)
47
46
  nokogiri (>= 1.5.9)
48
- method_source (0.9.2)
49
- mini_portile2 (2.4.0)
50
- minitest (5.13.0)
51
- nokogiri (1.10.7)
52
- mini_portile2 (~> 2.4.0)
53
- parallel (1.19.1)
54
- parser (2.6.5.0)
55
- ast (~> 2.4.0)
56
- rack (2.0.8)
47
+ method_source (1.0.0)
48
+ mini_portile2 (2.5.0)
49
+ minitest (5.14.3)
50
+ nokogiri (1.11.1)
51
+ mini_portile2 (~> 2.5.0)
52
+ racc (~> 1.4)
53
+ parallel (1.20.1)
54
+ parser (3.0.0.0)
55
+ ast (~> 2.4.1)
56
+ racc (1.5.2)
57
+ rack (2.2.3)
57
58
  rack-test (1.1.0)
58
59
  rack (>= 1.0, < 3)
59
60
  rails-dom-testing (2.0.3)
@@ -61,48 +62,57 @@ GEM
61
62
  nokogiri (>= 1.6)
62
63
  rails-html-sanitizer (1.3.0)
63
64
  loofah (~> 2.3)
64
- railties (6.0.2.1)
65
- actionpack (= 6.0.2.1)
66
- activesupport (= 6.0.2.1)
65
+ railties (6.1.1)
66
+ actionpack (= 6.1.1)
67
+ activesupport (= 6.1.1)
67
68
  method_source
68
69
  rake (>= 0.8.7)
69
- thor (>= 0.20.3, < 2.0)
70
+ thor (~> 1.0)
70
71
  rainbow (3.0.0)
71
- rake (13.0.1)
72
- rspec (3.9.0)
73
- rspec-core (~> 3.9.0)
74
- rspec-expectations (~> 3.9.0)
75
- rspec-mocks (~> 3.9.0)
76
- rspec-core (3.9.0)
77
- rspec-support (~> 3.9.0)
78
- rspec-expectations (3.9.0)
72
+ rake (13.0.3)
73
+ regexp_parser (2.0.3)
74
+ rexml (3.2.4)
75
+ rspec (3.10.0)
76
+ rspec-core (~> 3.10.0)
77
+ rspec-expectations (~> 3.10.0)
78
+ rspec-mocks (~> 3.10.0)
79
+ rspec-core (3.10.1)
80
+ rspec-support (~> 3.10.0)
81
+ rspec-expectations (3.10.1)
79
82
  diff-lcs (>= 1.2.0, < 2.0)
80
- rspec-support (~> 3.9.0)
81
- rspec-mocks (3.9.0)
83
+ rspec-support (~> 3.10.0)
84
+ rspec-mocks (3.10.1)
82
85
  diff-lcs (>= 1.2.0, < 2.0)
83
- rspec-support (~> 3.9.0)
84
- rspec-support (3.9.0)
85
- rubocop (0.78.0)
86
- jaro_winkler (~> 1.5.1)
86
+ rspec-support (~> 3.10.0)
87
+ rspec-support (3.10.1)
88
+ rubocop (1.8.1)
87
89
  parallel (~> 1.10)
88
- parser (>= 2.6)
90
+ parser (>= 3.0.0.0)
89
91
  rainbow (>= 2.2.2, < 4.0)
92
+ regexp_parser (>= 1.8, < 3.0)
93
+ rexml
94
+ rubocop-ast (>= 1.2.0, < 2.0)
90
95
  ruby-progressbar (~> 1.7)
91
- unicode-display_width (>= 1.4.0, < 1.7)
92
- rubocop-performance (1.5.1)
93
- rubocop (>= 0.71.0)
94
- rubocop-rspec (1.37.1)
95
- rubocop (>= 0.68.1)
96
- ruby-progressbar (1.10.1)
97
- ruby_parser (3.14.1)
96
+ unicode-display_width (>= 1.4.0, < 3.0)
97
+ rubocop-ast (1.4.0)
98
+ parser (>= 2.7.1.5)
99
+ rubocop-performance (1.9.2)
100
+ rubocop (>= 0.90.0, < 2.0)
101
+ rubocop-ast (>= 0.4.0)
102
+ rubocop-rake (0.5.1)
103
+ rubocop
104
+ rubocop-rspec (2.1.0)
105
+ rubocop (~> 1.0)
106
+ rubocop-ast (>= 1.1.0)
107
+ ruby-progressbar (1.11.0)
108
+ ruby_parser (3.15.1)
98
109
  sexp_processor (~> 4.9)
99
- sexp_processor (4.13.0)
100
- thor (1.0.1)
101
- thread_safe (0.3.6)
102
- tzinfo (1.2.5)
103
- thread_safe (~> 0.1)
104
- unicode-display_width (1.6.0)
105
- zeitwerk (2.2.2)
110
+ sexp_processor (4.15.2)
111
+ thor (1.1.0)
112
+ tzinfo (2.0.4)
113
+ concurrent-ruby (~> 1.0)
114
+ unicode-display_width (2.0.0)
115
+ zeitwerk (2.4.2)
106
116
 
107
117
  PLATFORMS
108
118
  ruby
@@ -116,7 +126,8 @@ DEPENDENCIES
116
126
  rspec
117
127
  rubocop
118
128
  rubocop-performance
129
+ rubocop-rake
119
130
  rubocop-rspec
120
131
 
121
132
  BUNDLED WITH
122
- 2.0.2
133
+ 2.1.4
data/README.md CHANGED
@@ -104,6 +104,20 @@ Render collection of components just as you would render collections of partials
104
104
  <%= component("comment_card", collection: @comments, spacer_template: "components/spacer") %>
105
105
  ```
106
106
 
107
+ If you can skip rendering by evaluating complex logic in the `render?` method:
108
+
109
+ ```ruby
110
+ # app/components/alert_component.rb
111
+
112
+ class AlertComponent < Lite::Component::Base
113
+
114
+ def render?
115
+ object.some_complex_check?
116
+ end
117
+
118
+ end
119
+ ```
120
+
107
121
  ### Context
108
122
 
109
123
  All components include `ActionView::Context` which will give you access to request context such as
@@ -146,6 +160,7 @@ end
146
160
  ### Locals
147
161
 
148
162
  All components include access to partial locals via the `locals` or `l` methods.
163
+ You can dump locals to hash via the `to_h` and `to_hash` methods.
149
164
  *Note: Objects will be automatically added to locals when rendering collections.*
150
165
 
151
166
  ```erb
@@ -220,7 +235,7 @@ accessed by their key.
220
235
  ```
221
236
 
222
237
  Access to anything provided within its `*_component.rb` file can be done using the
223
- `component` local which is the instance of the component.
238
+ `component` or `c` local methods which is the instance of the component.
224
239
 
225
240
  ```erb
226
241
  <%# app/views/components/_alert.html.erb %>
@@ -262,6 +277,36 @@ class AlertComponent < Lite::Component::Base
262
277
  end
263
278
  ```
264
279
 
280
+ To add components as part of another component build a `block` and `yield` it in the component's view.
281
+
282
+ ```erb
283
+ <%# app/views/components/_sidebar.html.erb %>
284
+
285
+ <div class="sidebar">
286
+ <%= component("sidebar/navigation", locals: { class_name: "js-nav-links" }) do |c| %>
287
+ <% c.add("sidebar/navigation/link", locals: { text: "Link: 1", path: "/home", active: false }) %>
288
+ <% c.add("sidebar/navigation/link", locals: { text: "Link: 2", path: "/about", active: true }) %>
289
+ <% c.add("sidebar/navigation/link", locals: { text: "Link: 3", path: "/help", active: false }) do |n_c| %>
290
+ <% n_c.add("sidebar/something", locals: { test: "something" }) %>
291
+ <% end %>
292
+ <% end %>
293
+ </div>
294
+ ```
295
+
296
+ ```erb
297
+ <%# app/views/components/sidebar/_navigation.html.erb %>
298
+
299
+ <div class="sidebar-navigation">
300
+ <%= c.yield %>
301
+ </div>
302
+ ```
303
+
304
+ ```erb
305
+ <%# app/views/components/sidebar/navigation/_link.html.erb %>
306
+
307
+ <%= link_to(text, path, class: ("active" if l.active)) %>
308
+ ```
309
+
265
310
  ## Development
266
311
 
267
312
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -4,9 +4,9 @@ module Lite
4
4
  module Component
5
5
  module ComponentHelper
6
6
 
7
- def component(name, options = {})
8
- name = name.component_path if name.respond_to?(:component_path)
9
- "#{name}_component".classify.constantize.render(self, options)
7
+ def component(name, options = {}, &block)
8
+ klass = Lite::Component::Base.build(name)
9
+ klass.render(self, options, &block)
10
10
  end
11
11
 
12
12
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'action_view'
4
4
 
5
- %w[version engine iteration collection locals base].each do |filename|
5
+ %w[version engine iteration locals base].each do |filename|
6
6
  require "lite/component/#{filename}"
7
7
  end
8
8
 
@@ -7,20 +7,34 @@ module Lite
7
7
  include ActionView::Context
8
8
  include ActionView::Helpers
9
9
 
10
- attr_reader :context, :options
11
- attr_writer :iteration
10
+ attr_accessor :components
11
+ attr_reader :context, :iteration, :options
12
+
13
+ # rubocop:disable Layout/LineLength
14
+ def initialize(context, options = {}, &block)
15
+ @components = []
16
+ @iteration = (options[:locals] || {}).delete(:iteration) || Lite::Component::Iteration.new(1, 0)
12
17
 
13
- def initialize(context, options = {})
14
18
  @context = context
15
19
  @options = default_options.deep_merge(options)
20
+
21
+ yield(self) if block
16
22
  end
23
+ # rubocop:enable Layout/LineLength
17
24
 
18
25
  alias helpers context
19
26
  alias c context
20
27
  alias h helpers
28
+ alias i iteration
21
29
 
22
30
  class << self
23
31
 
32
+ def build(name)
33
+ return name if name.respond_to?(:component_path)
34
+
35
+ "#{name}_component".classify.constantize
36
+ end
37
+
24
38
  def component_name
25
39
  component_path.split('/').last
26
40
  end
@@ -29,19 +43,17 @@ module Lite
29
43
  name.underscore.sub('_component', '')
30
44
  end
31
45
 
32
- def render(context, options = {})
33
- klass = new(context, options)
46
+ def render(context, options = {}, &block)
47
+ klass = new(context, options, &block)
34
48
  klass.render
35
49
  end
36
50
 
37
51
  end
38
52
 
39
- def iteration
40
- @iteration ||= Lite::Component::Iteration.new(1, 0)
53
+ def add(name, options = {}, &block)
54
+ components << [name, options, block]
41
55
  end
42
56
 
43
- alias i iteration
44
-
45
57
  def locals
46
58
  @locals ||= Lite::Component::Locals.new(options[:locals])
47
59
  end
@@ -49,14 +61,16 @@ module Lite
49
61
  alias l locals
50
62
 
51
63
  def render
64
+ return unless render?
65
+
52
66
  collection = options.delete(:collection)
53
- return render_content if collection.nil? || !collection.respond_to?(:each)
67
+ return render_collection(collection) if collection.respond_to?(:each)
68
+
69
+ render_content
70
+ end
54
71
 
55
- Lite::Component::Collection.render(
56
- collection,
57
- component: self,
58
- spacer_template: options.delete(:spacer_template)
59
- )
72
+ def render?
73
+ true
60
74
  end
61
75
 
62
76
  def render_content
@@ -67,6 +81,10 @@ module Lite
67
81
  "components/#{self.class.component_path}"
68
82
  end
69
83
 
84
+ def yield
85
+ context.safe_join(yield_content)
86
+ end
87
+
70
88
  private
71
89
 
72
90
  def default_options
@@ -75,12 +93,36 @@ module Lite
75
93
  object: self,
76
94
  as: :component,
77
95
  locals: {
96
+ c: self,
78
97
  object: nil,
79
98
  iteration: iteration
80
99
  }
81
100
  }
82
101
  end
83
102
 
103
+ # rubocop:disable Metrics/AbcSize
104
+ def render_collection(collection)
105
+ collection_size = collection.size
106
+ spacer_template = options.delete(:spacer_template)
107
+
108
+ results = collection.each_with_object([]).with_index do |(item, array), index|
109
+ array << context.render(spacer_template) if index.positive? && spacer_template
110
+ iteration = Lite::Component::Iteration.new(collection_size, index)
111
+ instance = self.class.new(context, locals: { object: item, iteration: iteration })
112
+ array << instance.render
113
+ end
114
+
115
+ context.safe_join(results)
116
+ end
117
+ # rubocop:enable Metrics/AbcSize
118
+
119
+ def yield_content
120
+ components.map do |name, options, block|
121
+ klass = self.class.build(name)
122
+ klass.render(context, options, &block)
123
+ end
124
+ end
125
+
84
126
  end
85
127
  end
86
128
  end
@@ -6,6 +6,9 @@ module Lite
6
6
 
7
7
  attr_reader :locals
8
8
 
9
+ alias to_hash locals
10
+ alias to_h locals
11
+
9
12
  def initialize(locals)
10
13
  @locals = (locals || {}).symbolize_keys
11
14
  end
@@ -3,7 +3,7 @@
3
3
  module Lite
4
4
  module Component
5
5
 
6
- VERSION ||= '1.0.7'
6
+ VERSION ||= '1.1.0'
7
7
 
8
8
  end
9
9
  end
@@ -46,5 +46,6 @@ Gem::Specification.new do |spec|
46
46
  spec.add_development_dependency 'rspec'
47
47
  spec.add_development_dependency 'rubocop'
48
48
  spec.add_development_dependency 'rubocop-performance'
49
+ spec.add_development_dependency 'rubocop-rake'
49
50
  spec.add_development_dependency 'rubocop-rspec'
50
51
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lite-component
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.7
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Juan Gomez
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-12-24 00:00:00.000000000 Z
11
+ date: 2021-01-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionview
@@ -122,6 +122,20 @@ dependencies:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rubocop-rake
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: rubocop-rspec
127
141
  requirement: !ruby/object:Gem::Requirement
@@ -136,7 +150,7 @@ dependencies:
136
150
  - - ">="
137
151
  - !ruby/object:Gem::Version
138
152
  version: '0'
139
- description:
153
+ description:
140
154
  email:
141
155
  - j.gomez@drexed.com
142
156
  executables: []
@@ -166,7 +180,6 @@ files:
166
180
  - lib/generators/rails/templates/component.scss
167
181
  - lib/lite/component.rb
168
182
  - lib/lite/component/base.rb
169
- - lib/lite/component/collection.rb
170
183
  - lib/lite/component/engine.rb
171
184
  - lib/lite/component/iteration.rb
172
185
  - lib/lite/component/locals.rb
@@ -176,7 +189,7 @@ homepage: http://drexed.github.io/lite-component
176
189
  licenses:
177
190
  - MIT
178
191
  metadata: {}
179
- post_install_message:
192
+ post_install_message:
180
193
  rdoc_options: []
181
194
  require_paths:
182
195
  - lib
@@ -191,8 +204,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
191
204
  - !ruby/object:Gem::Version
192
205
  version: '0'
193
206
  requirements: []
194
- rubygems_version: 3.1.1
195
- signing_key:
207
+ rubygems_version: 3.2.5
208
+ signing_key:
196
209
  specification_version: 4
197
210
  summary: Generate component from collections of data points
198
211
  test_files: []
@@ -1,58 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Lite
4
- module Component
5
- class Collection
6
-
7
- attr_reader :collection, :component, :spacer_template
8
-
9
- def initialize(collection, component:, spacer_template: nil)
10
- @collection = collection
11
- @component = component
12
- @spacer_template = spacer_template
13
- end
14
-
15
- class << self
16
-
17
- def render(collection, component)
18
- klass = new(collection, component)
19
- klass.render
20
- end
21
-
22
- end
23
-
24
- def render
25
- component.context.safe_join(iterated_collection)
26
- end
27
-
28
- private
29
-
30
- def collection_size
31
- @collection_size ||= begin
32
- if collection.respond_to?(:size)
33
- collection.size
34
- elsif collection.respond_to?(:to_a)
35
- collection.to_a.size
36
- elsif collection.respond_to?(:to_hash)
37
- collection.to_hash.size
38
- end
39
- end
40
- end
41
-
42
- # rubocop:disable Metrics/AbcSize
43
- def iterated_collection
44
- collection.each_with_object([]).with_index do |(object, array), index|
45
- component.iteration = Lite::Component::Iteration.new(collection_size, index)
46
- component.options.deep_merge!(locals: { object: object, iteration: component.iteration })
47
-
48
- array << component.render_content
49
- next unless spacer_template && !component.iteration.last?
50
-
51
- array << component.context.render(spacer_template)
52
- end
53
- end
54
- # rubocop:enable Metrics/AbcSize
55
-
56
- end
57
- end
58
- end