lite-component 1.0.9 → 1.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: fb7847b78bc4df9d5b25648f75500cc44b25f618a3c94a7d9ef63f300b5895dd
4
- data.tar.gz: 92803d6916eaec8cea78e52ec90d3ff7fe9c8e84c28bb7c15cb9f6894e3c8d57
3
+ metadata.gz: 94fe577f5d86072b350e7397dc6d7025f08a93966806b75d040ba575cc5f8d6a
4
+ data.tar.gz: 8c2ff2ffdb573cdf74178d4bf35a4d6fd006fb330e5a71b8db26632f45fc0aa2
5
5
  SHA512:
6
- metadata.gz: ee11120c0cd193aacadfe3dfe67a4da98e92937c53cee918a8e84795acddeedc5b157aa7563262bdfa5dfdb14e9b170894e653b5839893e76ae3daaa00238ec9
7
- data.tar.gz: 4ab99d6a718dcafa47fdd390456a1b175d6a0d845f65b130caa0aab723f4b13a590f1da9bd7e6d483d0dacf2b2b08ab7939b1dd532b2ddb9af043441a42f9e58
6
+ metadata.gz: 8d62c2c14499a4ca7510cf040f8891c86e8a4e5494f4977828a169e93f56229514dc21916d8d5c1acf192254a8aaf58b1f4acd962970a001d4792821eeb46a3c
7
+ data.tar.gz: 17e6ad40cc126de92f2bdf5550c613451bf780a72c3f7ffe1f37f8e007f6b7313e087a13e1964dfdba3b0be20f85b901d42c0a036961af8608f690c181de013f
data/.rubocop.yml CHANGED
@@ -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: 3.0
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:
@@ -26,7 +38,19 @@ RSpec/ExampleLength:
26
38
  Enabled: false
27
39
  RSpec/MultipleExpectations:
28
40
  Enabled: false
41
+ Style/ArgumentsForwarding:
42
+ Enabled: false
29
43
  Style/Documentation:
30
44
  Enabled: false
31
45
  Style/ExpandPathArguments:
32
46
  Enabled: false
47
+ Style/ExponentialNotation:
48
+ Enabled: true
49
+ Style/HashEachMethods:
50
+ Enabled: true
51
+ Style/HashTransformKeys:
52
+ Enabled: true
53
+ Style/HashTransformValues:
54
+ Enabled: true
55
+ Style/SlicingWithRange:
56
+ Enabled: false
data/CHANGELOG.md CHANGED
@@ -6,6 +6,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [1.2.0] - 2021-07-19
10
+ ### Added
11
+ - Added Ruby 3.0 support
12
+
13
+ ## [1.1.0] - 2021-01-20
14
+ ### Added
15
+ - Add improved collection rendering
16
+ ### Removed
17
+ - Collection class is no longer needed
18
+
19
+ ## [1.0.11] - 2020-04-24
20
+ ### Added
21
+ - Added `to_h` and `to_hash` aliases for dumping locals
22
+
23
+ ## [1.0.10] - 2020-04-06
24
+ ### Added
25
+ - Added `render?` method for checking complex logic
26
+
9
27
  ## [1.0.9] - 2020-01-08
10
28
  ### Added
11
29
  - Added block support to yield other components
data/Gemfile.lock CHANGED
@@ -1,59 +1,60 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- lite-component (1.0.9)
4
+ lite-component (1.2.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.4)
11
+ actionview (= 6.1.4)
12
+ activesupport (= 6.1.4)
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.4)
18
+ activesupport (= 6.1.4)
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.4)
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.2)
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.9)
33
+ crass (1.0.6)
34
+ diff-lcs (1.4.4)
35
+ erubi (1.10.0)
36
+ fasterer (0.9.0)
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.1)
42
+ i18n (1.8.10)
43
43
  concurrent-ruby (~> 1.0)
44
- jaro_winkler (1.5.4)
45
- loofah (2.4.0)
44
+ loofah (2.10.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.7.0.2)
55
- ast (~> 2.4.0)
56
- rack (2.0.8)
47
+ method_source (1.0.0)
48
+ mini_portile2 (2.5.3)
49
+ minitest (5.14.4)
50
+ nokogiri (1.11.7)
51
+ mini_portile2 (~> 2.5.0)
52
+ racc (~> 1.4)
53
+ parallel (1.20.1)
54
+ parser (3.0.2.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.4)
66
+ actionpack (= 6.1.4)
67
+ activesupport (= 6.1.4)
67
68
  method_source
68
- rake (>= 0.8.7)
69
- thor (>= 0.20.3, < 2.0)
69
+ rake (>= 0.13)
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.1)
77
- rspec-support (~> 3.9.1)
78
- rspec-expectations (3.9.0)
72
+ rake (13.0.6)
73
+ regexp_parser (2.1.1)
74
+ rexml (3.2.5)
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.1)
83
+ rspec-support (~> 3.10.0)
84
+ rspec-mocks (3.10.2)
82
85
  diff-lcs (>= 1.2.0, < 2.0)
83
- rspec-support (~> 3.9.0)
84
- rspec-support (3.9.2)
85
- rubocop (0.79.0)
86
- jaro_winkler (~> 1.5.1)
86
+ rspec-support (~> 3.10.0)
87
+ rspec-support (3.10.2)
88
+ rubocop (1.18.3)
87
89
  parallel (~> 1.10)
88
- parser (>= 2.7.0.1)
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.7.0, < 2.0)
90
95
  ruby-progressbar (~> 1.7)
91
- unicode-display_width (>= 1.4.0, < 1.7)
92
- rubocop-performance (1.5.2)
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)
98
- 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.6)
103
- thread_safe (~> 0.1)
104
- unicode-display_width (1.6.0)
105
- zeitwerk (2.2.2)
96
+ unicode-display_width (>= 1.4.0, < 3.0)
97
+ rubocop-ast (1.8.0)
98
+ parser (>= 3.0.1.1)
99
+ rubocop-performance (1.11.4)
100
+ rubocop (>= 1.7.0, < 2.0)
101
+ rubocop-ast (>= 0.4.0)
102
+ rubocop-rake (0.6.0)
103
+ rubocop (~> 1.0)
104
+ rubocop-rspec (2.4.0)
105
+ rubocop (~> 1.0)
106
+ rubocop-ast (>= 1.1.0)
107
+ ruby-progressbar (1.11.0)
108
+ ruby_parser (3.16.0)
109
+ sexp_processor (~> 4.15, >= 4.15.1)
110
+ sexp_processor (4.15.3)
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.2.24
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
@@ -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
 
@@ -8,23 +8,24 @@ module Lite
8
8
  include ActionView::Helpers
9
9
 
10
10
  attr_accessor :components
11
- attr_reader :context, :options
12
- attr_writer :iteration
11
+ attr_reader :context, :iteration, :options
13
12
 
14
- # rubocop:disable Lint/UnusedMethodArgument
13
+ # rubocop:disable Layout/LineLength
15
14
  def initialize(context, options = {}, &block)
15
+ @components = []
16
+ @iteration = (options[:locals] || {}).delete(:iteration) || Lite::Component::Iteration.new(1, 0)
17
+
16
18
  @context = context
17
19
  @options = default_options.deep_merge(options)
18
20
 
19
- @components = []
20
-
21
- yield(self) if block_given?
21
+ yield(self) if block
22
22
  end
23
- # rubocop:enable Lint/UnusedMethodArgument
23
+ # rubocop:enable Layout/LineLength
24
24
 
25
25
  alias helpers context
26
26
  alias c context
27
27
  alias h helpers
28
+ alias i iteration
28
29
 
29
30
  class << self
30
31
 
@@ -53,12 +54,6 @@ module Lite
53
54
  components << [name, options, block]
54
55
  end
55
56
 
56
- def iteration
57
- @iteration ||= Lite::Component::Iteration.new(1, 0)
58
- end
59
-
60
- alias i iteration
61
-
62
57
  def locals
63
58
  @locals ||= Lite::Component::Locals.new(options[:locals])
64
59
  end
@@ -66,14 +61,16 @@ module Lite
66
61
  alias l locals
67
62
 
68
63
  def render
64
+ return unless render?
65
+
69
66
  collection = options.delete(:collection)
70
- 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
71
71
 
72
- Lite::Component::Collection.render(
73
- collection,
74
- component: self,
75
- spacer_template: options.delete(:spacer_template)
76
- )
72
+ def render?
73
+ true
77
74
  end
78
75
 
79
76
  def render_content
@@ -103,6 +100,22 @@ module Lite
103
100
  }
104
101
  end
105
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
+
106
119
  def yield_content
107
120
  components.map do |name, options, block|
108
121
  klass = self.class.build(name)
@@ -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.9'
6
+ VERSION = '1.2.0'
7
7
 
8
8
  end
9
9
  end
@@ -25,7 +25,7 @@ Gem::Specification.new do |spec|
25
25
  )
26
26
  else
27
27
  raise 'RubyGems 2.0 or newer is required to protect against ' \
28
- 'public gem pushes.'
28
+ 'public gem pushes.'
29
29
  end
30
30
 
31
31
  # Specify which files should be added to the gem when it is released.
@@ -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.9
4
+ version: 1.2.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: 2020-01-08 00:00:00.000000000 Z
11
+ date: 2021-07-20 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.2
195
- signing_key:
207
+ rubygems_version: 3.2.24
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