spark-component 1.0.1 → 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: 707be6971c26fd122f03a9da00e0396b2b6cb5eaac221ce27a94a884e865b2db
4
- data.tar.gz: 375416e9a317b550911aaabf4509cb6eb8e827aa8b39bad7987808cb452c0829
3
+ metadata.gz: 1be4ebc3a6ecf66978f87558cbc83f349fcf41e15b4aff6aa9e5609d88b12a5f
4
+ data.tar.gz: 4a94a2bf74570d0f9cc7b531bb4d815c2e068c92162390d9da08e0885f3e6576
5
5
  SHA512:
6
- metadata.gz: 870ddc6e2e84950a12f59525294f00f8968f9e75ce52631fc9a029d4a51cd7f80cd911e69372c060a13c08dfae13567634d6f12469da5e62755c7d2dfb5f16c3
7
- data.tar.gz: 483b152823ed0f681257b826451747c4aa2e26497e350bb30231ea6fd593a7f9ff5971093ed6a7b2c6807590f31e37a9bfbb9033721dd242f4d90f66cc474f95
6
+ metadata.gz: 699b6ed45fd2c908648bdd7a78c09dcb916e1289e414181dbc0efef84b766eae81dd1694511e3ef499e0ae1b9ccb500e3e0154d9ffbd5695847436bd8e59557e
7
+ data.tar.gz: f588d817b0a446b3dff251c0b8687c6c712131aa50f9d652e0a63199b4a2a1f08ecc06d34678fc6072c28d7c8b966758e30e01568f72b54637376b6f8e826cf3
@@ -18,3 +18,7 @@ jobs:
18
18
  gem install bundler
19
19
  bundle install --jobs 4 --retry 3
20
20
  bundle exec rake
21
+ - name: Rubocop checks
22
+ uses: gimenete/rubocop-action@1.0
23
+ env:
24
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
data/.rubocop.yml CHANGED
@@ -1,8 +1,8 @@
1
1
  AllCops:
2
2
  TargetRubyVersion: 2.6.3
3
3
 
4
- Metrics/LineLength:
5
- Max: 120
4
+ Layout/LineLength:
5
+ Max: 100
6
6
 
7
7
  Metrics/MethodLength:
8
8
  Max: 20
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ # v1.1.0 - 2020-01-10
2
+
3
+ - New: Class method `attribute_default_group` makes it easy to set defaults for multiple attributes based on a single component argument. It's great for theming, where setting `theme: :notice` can set attributes for color, layout, etc.
4
+ - New: Class methods `tag_attribute`, `data_attribute`, and `aria_attribute` make it easy to sync component arguments to tag_attrs object.
5
+
1
6
  # v1.0.1 - 2020-01-08
2
7
 
3
8
  - Fix: added `deep_compact` to Attr and TagAttr to ensure that `nil` or `empty?` objects are ignored.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- spark-component (1.0.1)
4
+ spark-component (1.1.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -91,7 +91,7 @@ GEM
91
91
  nokogiri (1.10.7)
92
92
  mini_portile2 (~> 2.4.0)
93
93
  parallel (1.19.1)
94
- parser (2.6.5.0)
94
+ parser (2.7.0.2)
95
95
  ast (~> 2.4.0)
96
96
  pry (0.12.2)
97
97
  coderay (~> 1.1.0)
@@ -130,10 +130,10 @@ GEM
130
130
  thor (>= 0.20.3, < 2.0)
131
131
  rainbow (3.0.0)
132
132
  rake (10.5.0)
133
- rubocop (0.77.0)
133
+ rubocop (0.79.0)
134
134
  jaro_winkler (~> 1.5.1)
135
135
  parallel (~> 1.10)
136
- parser (>= 2.6)
136
+ parser (>= 2.7.0.1)
137
137
  rainbow (>= 2.2.2, < 4.0)
138
138
  ruby-progressbar (~> 1.7)
139
139
  unicode-display_width (>= 1.4.0, < 1.7)
@@ -38,9 +38,9 @@ module Spark
38
38
  end
39
39
 
40
40
  def deep_compact(hash)
41
- hash.select do |key, val|
41
+ hash.reject do |_key, val|
42
42
  val = deep_compact(val) if val.is_a?(Hash)
43
- !(val.nil? || val.respond_to?(:empty?) && val.empty?)
43
+ (val.nil? || val.respond_to?(:empty?) && val.empty?)
44
44
  end
45
45
  end
46
46
 
@@ -43,13 +43,7 @@ require "spark/component/tag_attr"
43
43
  #
44
44
  module Spark
45
45
  module Component
46
- BASE_ATTRIBUTES = {
47
- id: nil,
48
- class: nil,
49
- data: {},
50
- aria: {},
51
- html: {}
52
- }.freeze
46
+ BASE_ATTRIBUTES = %i[id class data aria html].freeze
53
47
 
54
48
  module Attribute
55
49
  # All components and elements will support these attributes
@@ -66,6 +60,11 @@ module Spark
66
60
  def initialize_attributes(attrs = nil)
67
61
  attrs ||= {}
68
62
 
63
+ # Filter out attributes which aren't defined by class method
64
+ attrs.select! { |key, _value| self.class.attributes.keys.include?(key) }
65
+
66
+ initialize_attribute_default_groups(attrs)
67
+
69
68
  self.class.attributes.each do |name, default|
70
69
  default = (!default.nil? ? default : nil)
71
70
  value = attrs[name].nil? ? default : attrs[name]
@@ -76,6 +75,28 @@ module Spark
76
75
  end
77
76
  end
78
77
 
78
+ def initialize_attribute_default_groups(attrs)
79
+ self.class.attribute_default_groups.each do |group, group_options|
80
+ # Determine what group name is set for this attribute.
81
+ name = attrs[group] || self.class.attributes[group]
82
+
83
+ # Get defaults to set from group name
84
+ defaults = group_options[name]
85
+
86
+ next unless defaults
87
+ unless defaults.is_a?(Hash)
88
+ raise("In argument group `:#{name}`, value `#{defaults}` must be a hash.")
89
+ end
90
+
91
+ defaults.each do |key, value|
92
+ if attrs[key].nil?
93
+ attrs[key] = value
94
+ instance_variable_set(:"@#{key}", value)
95
+ end
96
+ end
97
+ end
98
+ end
99
+
79
100
  def attribute(name)
80
101
  attributes[name]
81
102
  end
@@ -108,12 +129,17 @@ module Spark
108
129
  end
109
130
  end
110
131
 
111
- # Initialize tag attributes from BASE_ATTRIBUTES
132
+ # Initialize tag attributes
112
133
  #
113
- # If a component or element has arguments defined as base attributes
114
- # they will automatically be added to the tag_attrs
134
+ # If a component or element defines tag_attributes, aria_attributes, or data_attributes
135
+ # Automatically assign add arguments to tag_attrs
115
136
  def tag_attrs
116
- @tag_attrs ||= TagAttr.new.add attr_hash(*BASE_ATTRIBUTES.keys)
137
+ return @tag_attrs if @tag_attrs
138
+
139
+ @tag_attrs = TagAttr.new.add(attr_hash(*self.class.tag_attributes))
140
+ @tag_attrs.add(aria: attr_hash(*self.class.aria_attributes))
141
+ @tag_attrs.add(data: attr_hash(*self.class.data_attributes))
142
+ @tag_attrs
117
143
  end
118
144
 
119
145
  # Easy reference a tag's classname
@@ -142,7 +168,10 @@ module Spark
142
168
 
143
169
  module ClassMethods
144
170
  def attributes
145
- @attributes ||= Spark::Component::BASE_ATTRIBUTES.dup
171
+ # Set attributes default to a hash using keys defined by BASE_ATTRIBUTES
172
+ @attributes ||= Spark::Component::BASE_ATTRIBUTES.each_with_object({}) do |val, obj|
173
+ obj[val] = nil
174
+ end
146
175
  end
147
176
 
148
177
  # Sets attributes, accepts an array of keys, pass a hash to set default values
@@ -177,7 +206,9 @@ module Spark
177
206
  name = :"attribute_#{name}"
178
207
 
179
208
  if (choices = options.delete(:choices))
180
- supported_choices = choices.map { |c| c.is_a?(String) ? c.to_sym : c.to_s }.concat(choices)
209
+ supported_choices = choices.map do |c|
210
+ c.is_a?(String) ? c.to_sym : c.to_s
211
+ end.concat(choices)
181
212
 
182
213
  choices = choices.map(&:inspect).to_sentence(last_word_connector: ", or ")
183
214
  message = "\"%<value>s\" is not valid. Options include: #{choices}."
@@ -188,6 +219,57 @@ module Spark
188
219
  validates(name, options)
189
220
  end
190
221
 
222
+ # Store attributes to be added to tag_attrs
223
+ def tag_attributes
224
+ @tag_attributes ||= BASE_ATTRIBUTES.dup
225
+ end
226
+
227
+ # Store attributes to be added to tag_attrs aria
228
+ def aria_attributes
229
+ @aria_attributes ||= []
230
+ end
231
+
232
+ # Store attributes to be added to tag_attrs data
233
+ def data_attributes
234
+ @data_attributes ||= []
235
+ end
236
+
237
+ # Add attribute(s) and automatically add to tag_attr
238
+ def tag_attribute(*args)
239
+ attr_object = hash_from_args(*args)
240
+
241
+ if (aria_object = attr_object.delete(:aria))
242
+ attribute(aria_object)
243
+ aria_attributes.concat(aria_object.keys)
244
+ end
245
+
246
+ if (data_object = attr_object.delete(:data))
247
+ attribute(data_object)
248
+ data_attributes.concat(data_object.keys)
249
+ end
250
+
251
+ attribute(attr_object)
252
+ tag_attributes.concat(attr_object.keys)
253
+ end
254
+
255
+ # Add attribute(s) and automatically add to tag_attr's aria hash
256
+ def aria_attribute(*args)
257
+ tag_attribute(aria: hash_from_args(*args))
258
+ end
259
+
260
+ # Add attribute(s) and automatically add to tag_attr's data hash
261
+ def data_attribute(*args)
262
+ tag_attribute(data: hash_from_args(*args))
263
+ end
264
+
265
+ def attribute_default_group(object)
266
+ attribute_default_groups.merge!(object)
267
+ end
268
+
269
+ def attribute_default_groups
270
+ @attribute_default_groups ||= {}
271
+ end
272
+
191
273
  private
192
274
 
193
275
  # Store attributes and define methods for validation
@@ -200,6 +282,14 @@ module Spark
200
282
  instance_variable_get(:"@#{name}")
201
283
  end
202
284
  end
285
+
286
+ # Convert mixed arguments to a hash
287
+ # Example: (:a, :b, c: true) => { a: nil, b: nil, c: true }
288
+ def hash_from_args(*args)
289
+ args.each_with_object({}) do |arg, obj|
290
+ arg.is_a?(Hash) ? obj.merge!(arg) : obj[arg] = nil
291
+ end
292
+ end
203
293
  end
204
294
  end
205
295
  end
@@ -200,7 +200,7 @@ module Spark
200
200
 
201
201
  private
202
202
 
203
- # If an element extends a component, extend that component's class and include the necessary modules
203
+ # If an element extends a component, extend that class and include necessary modules
204
204
  def extend_class(component, &config)
205
205
  base = Class.new(component || Spark::Component::Element::Base, &config)
206
206
  define_model_name(base) if defined?(ActiveModel)
@@ -211,12 +211,15 @@ module Spark
211
211
  base.define_singleton_method(:source_component) { component }
212
212
 
213
213
  # Override component when used as an element
214
- base.include(Spark::Component::Integration::Element) if defined?(Spark::Component::Integration)
214
+ if defined?(Spark::Component::Integration)
215
+ base.include(Spark::Component::Integration::Element)
216
+ end
215
217
 
216
218
  base
217
219
  end
218
220
 
219
- # ActiveModel validations require a model_name. This helps connect new classes to their proper model names.
221
+ # ActiveModel validations require a model_name.
222
+ # This connects new classes to their proper model names.
220
223
  def define_model_name(klass)
221
224
  klass.define_singleton_method(:model_name) do
222
225
  # try the current class, the parent class, or default to Spark::Component
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Spark
4
4
  module Component
5
- VERSION = "1.0.1"
5
+ VERSION = "1.1.0"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spark-component
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brandon Mathis
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-01-08 00:00:00.000000000 Z
11
+ date: 2020-01-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionview-component