spark_components 1.2.2 → 1.3.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 +4 -4
- data/lib/spark_components/attributes.rb +127 -15
- data/lib/spark_components/element.rb +41 -82
- data/lib/spark_components/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: adcc859e7bb3c58976280b05b17c030842ee61a93452376c8a0de38b00c5da55
|
4
|
+
data.tar.gz: e5b968c9e8bd2317a77edd3883dcf986a1376f821fccaef690d46a380a5c8785
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3307a090147aabd5ae4146148903012d685ddc8c092774c8cfc949c691f34fea43077c2f4b19fffe6b92795c0ac669d3ba50163d0cac00cf3b11b0b71cddb2aa
|
7
|
+
data.tar.gz: 92da07e9a0c368009f2e06a7149b795901de8dc54e66950a71da1b47af60bc37d4e6a2d82e158dd3146ee39052a4137e3e2d2db5e7a3ec8aca914ec176aeb40e
|
@@ -5,25 +5,31 @@ module SparkComponents
|
|
5
5
|
class Hash < Hash
|
6
6
|
def prefix; end
|
7
7
|
|
8
|
-
def add(
|
9
|
-
|
8
|
+
def add(*args)
|
9
|
+
args.each do |arg|
|
10
|
+
arg.is_a?(::Hash) ? merge!(arg) : self[arg.to_sym] = nil
|
11
|
+
end
|
10
12
|
self
|
11
13
|
end
|
12
14
|
|
13
|
-
# Output all attributes as [
|
15
|
+
# Output all attributes as [prefix-]name="value"
|
14
16
|
def to_s
|
15
17
|
each_with_object([]) do |(name, value), array|
|
16
|
-
|
17
|
-
|
18
|
-
|
18
|
+
if value.is_a?(Attributes::Hash)
|
19
|
+
# Flatten nested hashs and inject them unless empty
|
20
|
+
value = value.to_s
|
21
|
+
array << value unless value.empty?
|
22
|
+
else
|
23
|
+
name = [prefix, name].compact.join("-").gsub(/[\W_]+/, "-")
|
24
|
+
array << %(#{name}="#{value}") unless value.nil?
|
25
|
+
end
|
26
|
+
end.sort.join(" ")
|
19
27
|
end
|
20
28
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
obj[name] = value unless value.nil? || value.is_a?(String) && value.empty?
|
26
|
-
end
|
29
|
+
# Easy assess to create a new Attributes::Hash
|
30
|
+
def new(*args)
|
31
|
+
new_obj = self.class.new
|
32
|
+
new_obj.add(*args)
|
27
33
|
end
|
28
34
|
end
|
29
35
|
|
@@ -57,7 +63,7 @@ module SparkComponents
|
|
57
63
|
# Ensure base class is the first element in the classes array.
|
58
64
|
#
|
59
65
|
def base=(klass)
|
60
|
-
return if klass.
|
66
|
+
return if klass.nil? || klass.empty?
|
61
67
|
|
62
68
|
if @base_set
|
63
69
|
self[0] = klass
|
@@ -79,11 +85,117 @@ module SparkComponents
|
|
79
85
|
end
|
80
86
|
|
81
87
|
def add(*args)
|
82
|
-
push(*args.uniq.reject { |a| a.nil? || include?(a) })
|
88
|
+
push(*args.flatten.uniq.reject { |a| a.nil? || include?(a) })
|
89
|
+
self
|
90
|
+
end
|
91
|
+
|
92
|
+
# Easy assess to create a new Attributes::Classname
|
93
|
+
def new(*args)
|
94
|
+
new_arr = self.class.new
|
95
|
+
|
96
|
+
unless args.empty?
|
97
|
+
new_arr.base = args.shift
|
98
|
+
new_arr.add(*args)
|
99
|
+
end
|
100
|
+
|
101
|
+
new_arr
|
102
|
+
end
|
103
|
+
|
104
|
+
def join_class(name, separator = "-")
|
105
|
+
raise(SparkComponents::Attributes::Error, "Base class not defined for `join_class(#{name}, …)`") if base.nil?
|
106
|
+
|
107
|
+
[base, name].join(separator)
|
108
|
+
end
|
109
|
+
|
110
|
+
def to_s
|
111
|
+
join(" ")
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
class Tag
|
116
|
+
attr_reader :attrs
|
117
|
+
|
118
|
+
def initialize(obj = {})
|
119
|
+
@attrs = Attributes::Hash.new
|
120
|
+
merge!(obj)
|
121
|
+
end
|
122
|
+
|
123
|
+
def root(obj = {})
|
124
|
+
attrs.add(obj) unless obj.empty?
|
125
|
+
attrs
|
126
|
+
end
|
127
|
+
|
128
|
+
def aria(obj = {})
|
129
|
+
attrs[:aria] ||= Aria.new
|
130
|
+
attrs[:aria].add(obj) unless obj.empty?
|
131
|
+
attrs[:aria]
|
132
|
+
end
|
133
|
+
|
134
|
+
def data(obj = {})
|
135
|
+
attrs[:data] ||= Data.new
|
136
|
+
attrs[:data].add(obj) unless obj.empty?
|
137
|
+
attrs[:data]
|
138
|
+
end
|
139
|
+
|
140
|
+
def classnames(*args)
|
141
|
+
attrs[:class] ||= Classname.new
|
142
|
+
attrs[:class].add(*args) unless args.empty?
|
143
|
+
attrs[:class]
|
144
|
+
end
|
145
|
+
|
146
|
+
def add_class(*args)
|
147
|
+
classnames.add(*args)
|
148
|
+
end
|
149
|
+
|
150
|
+
def base_class(name)
|
151
|
+
classnames.base = name unless name.nil?
|
152
|
+
classnames.base
|
153
|
+
end
|
154
|
+
|
155
|
+
def join_class(*args)
|
156
|
+
classnames.join_class(*args)
|
157
|
+
end
|
158
|
+
|
159
|
+
def new(obj = {})
|
160
|
+
self.class.new(obj)
|
161
|
+
end
|
162
|
+
|
163
|
+
# Ensure each attribute is distinct
|
164
|
+
def dup
|
165
|
+
new(attrs.each_with_object(Attributes::Hash.new) do |(k, v), obj|
|
166
|
+
obj[k] = v.dup
|
167
|
+
end)
|
168
|
+
end
|
169
|
+
|
170
|
+
def merge!(obj = {})
|
171
|
+
merge_obj(self, obj)
|
172
|
+
end
|
173
|
+
|
174
|
+
def merge(obj = {})
|
175
|
+
merge_obj(dup, obj)
|
176
|
+
end
|
177
|
+
|
178
|
+
def merge_obj(tag, obj = {})
|
179
|
+
# If merging another Tag, extract attrs to merge
|
180
|
+
obj = obj.attrs if obj.is_a?(Tag)
|
181
|
+
|
182
|
+
obj.each do |key, val|
|
183
|
+
if val.is_a?(Classname)
|
184
|
+
# preserve object state
|
185
|
+
tag.attrs[:class] = val
|
186
|
+
else
|
187
|
+
case key.to_sym
|
188
|
+
when :class then tag.classnames.add(val)
|
189
|
+
when :data, :aria then tag.send(key).add(val)
|
190
|
+
else; tag.attrs[key] = val
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
tag
|
83
195
|
end
|
84
196
|
|
85
197
|
def to_s
|
86
|
-
|
198
|
+
attrs.to_s
|
87
199
|
end
|
88
200
|
end
|
89
201
|
end
|
@@ -15,10 +15,6 @@ module SparkComponents
|
|
15
15
|
@attributes ||= {}
|
16
16
|
end
|
17
17
|
|
18
|
-
def self.themes
|
19
|
-
@themes ||= {}
|
20
|
-
end
|
21
|
-
|
22
18
|
def self.elements
|
23
19
|
@elements ||= {}
|
24
20
|
end
|
@@ -45,48 +41,38 @@ module SparkComponents
|
|
45
41
|
end
|
46
42
|
end
|
47
43
|
|
48
|
-
def self.base_class(name)
|
49
|
-
|
44
|
+
def self.base_class(name = nil)
|
45
|
+
tag_attrs.base_class(name)
|
50
46
|
end
|
51
47
|
|
52
48
|
def self.add_class(*args)
|
53
|
-
|
54
|
-
end
|
55
|
-
|
56
|
-
def self.add_theme(hash)
|
57
|
-
themes.merge!(hash)
|
58
|
-
return if attributes[:theme]
|
59
|
-
|
60
|
-
if hash.key?(:default)
|
61
|
-
attribute(theme: :default)
|
62
|
-
else
|
63
|
-
attribute(:theme)
|
64
|
-
end
|
49
|
+
tag_attrs.add_class(*args)
|
65
50
|
end
|
66
51
|
|
67
52
|
def self.data_attr(*args)
|
68
|
-
|
53
|
+
tag_attrs.data(attribute(*args))
|
69
54
|
end
|
70
55
|
|
71
56
|
def self.aria_attr(*args)
|
72
|
-
|
57
|
+
arg = attribute(*args)
|
58
|
+
tag_attrs.aria(arg)
|
73
59
|
end
|
74
60
|
|
75
|
-
def self.
|
76
|
-
|
61
|
+
def self.root_attr(*args)
|
62
|
+
tag_attrs.root(attribute(*args))
|
77
63
|
end
|
78
64
|
|
79
|
-
def self.
|
80
|
-
|
65
|
+
def self.tag_attrs
|
66
|
+
@tag_attrs ||= SparkComponents::Attributes::Tag.new
|
81
67
|
end
|
82
68
|
|
83
|
-
def self.
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
69
|
+
def self.validates_choice(name, choices)
|
70
|
+
validates(name,
|
71
|
+
inclusion: {
|
72
|
+
presence: true,
|
73
|
+
in: choices,
|
74
|
+
message: "\"%{value}\" is not a valid option. Options include: #{choices.join(', ')}"
|
75
|
+
})
|
90
76
|
end
|
91
77
|
|
92
78
|
# rubocop:disable Metrics/AbcSize
|
@@ -144,22 +130,18 @@ module SparkComponents
|
|
144
130
|
def self.inherited(subclass)
|
145
131
|
attributes.each { |name, options| subclass.set_attribute(name, options.dup) }
|
146
132
|
elements.each { |name, options| subclass.elements[name] = options.dup }
|
147
|
-
subclass.themes.merge!(themes)
|
148
133
|
|
149
|
-
subclass.
|
150
|
-
obj[k] = v.dup
|
151
|
-
end)
|
134
|
+
subclass.tag_attrs.merge!(tag_attrs.dup)
|
152
135
|
end
|
153
136
|
|
154
137
|
def initialize(view, attributes = nil, &block)
|
155
138
|
@view = view
|
156
139
|
attributes ||= {}
|
157
|
-
|
158
|
-
|
140
|
+
initialize_tag_attrs
|
141
|
+
assign_tag_attrs(attributes)
|
159
142
|
initialize_attributes(attributes)
|
160
143
|
initialize_elements
|
161
144
|
extend_view_methods
|
162
|
-
initialize_themes
|
163
145
|
after_init
|
164
146
|
@yield = block_given? ? @view.capture(self, &block) : nil
|
165
147
|
validate!
|
@@ -177,8 +159,8 @@ module SparkComponents
|
|
177
159
|
@parents.last
|
178
160
|
end
|
179
161
|
|
180
|
-
def classnames
|
181
|
-
@
|
162
|
+
def classnames(*args)
|
163
|
+
@tag_attrs.classnames(*args)
|
182
164
|
end
|
183
165
|
|
184
166
|
def base_class(name = nil)
|
@@ -187,33 +169,27 @@ module SparkComponents
|
|
187
169
|
end
|
188
170
|
|
189
171
|
def add_class(*args)
|
190
|
-
classnames
|
172
|
+
classnames(*args)
|
191
173
|
end
|
192
174
|
|
193
|
-
def join_class(
|
194
|
-
|
175
|
+
def join_class(*args)
|
176
|
+
classnames.join_class(*args)
|
195
177
|
end
|
196
178
|
|
197
179
|
def data_attr(*args)
|
198
|
-
@
|
180
|
+
@tag_attrs.data(*args)
|
199
181
|
end
|
200
182
|
|
201
183
|
def aria_attr(*args)
|
202
|
-
@
|
184
|
+
@tag_attrs.aria(*args)
|
203
185
|
end
|
204
186
|
|
205
|
-
def
|
206
|
-
@
|
187
|
+
def root_attr(*args)
|
188
|
+
@tag_attrs.root(*args)
|
207
189
|
end
|
208
190
|
|
209
|
-
def
|
210
|
-
|
211
|
-
# attrtiubte order: id, class, data-, aria-, misc tag attributes
|
212
|
-
atr[:class] = classnames if add_class
|
213
|
-
atr.merge!(data_attr.collapse)
|
214
|
-
atr.merge!(aria_attr.collapse)
|
215
|
-
atr.merge!(tag_attr)
|
216
|
-
atr
|
191
|
+
def tag_attrs
|
192
|
+
@tag_attrs.attrs
|
217
193
|
end
|
218
194
|
|
219
195
|
def to_s
|
@@ -230,9 +206,9 @@ module SparkComponents
|
|
230
206
|
protected
|
231
207
|
|
232
208
|
# Set tag attribute values from from parameters
|
233
|
-
def
|
234
|
-
%i[aria data
|
235
|
-
@
|
209
|
+
def update_tag_attr(name)
|
210
|
+
%i[aria data root].each do |el|
|
211
|
+
@tag_attrs.send(el)[name] = get_instance_variable(name) if @tag_attrs.send(el).key?(name)
|
236
212
|
end
|
237
213
|
end
|
238
214
|
|
@@ -240,40 +216,23 @@ module SparkComponents
|
|
240
216
|
@view.render(partial: file, object: self)
|
241
217
|
end
|
242
218
|
|
243
|
-
def
|
244
|
-
@
|
245
|
-
obj[name] = options.dup
|
246
|
-
end
|
219
|
+
def initialize_tag_attrs
|
220
|
+
@tag_attrs = self.class.tag_attrs.dup
|
247
221
|
end
|
248
222
|
|
249
|
-
|
223
|
+
# Assign tag attributes from arguments
|
224
|
+
def assign_tag_attrs(attributes)
|
250
225
|
# support default data, class, and aria attribute names
|
251
226
|
data_attr(attributes.delete(:data)) if attributes[:data]
|
252
227
|
aria_attr(attributes.delete(:aria)) if attributes[:aria]
|
253
228
|
add_class(*attributes.delete(:class)) if attributes[:class]
|
254
|
-
|
229
|
+
root_attr(attributes.delete(:splat)) if attributes[:splat]
|
255
230
|
end
|
256
231
|
|
257
232
|
def initialize_attributes(attributes)
|
258
233
|
self.class.attributes.each do |name, options|
|
259
234
|
set_instance_variable(name, attributes[name] || (options[:default] && options[:default].dup))
|
260
|
-
|
261
|
-
end
|
262
|
-
end
|
263
|
-
|
264
|
-
# Add a class based on the chosen theme
|
265
|
-
def initialize_themes
|
266
|
-
themes = self.class.themes.stringify_keys
|
267
|
-
return if themes.empty? || @theme.nil?
|
268
|
-
|
269
|
-
theme = @theme.to_s
|
270
|
-
|
271
|
-
if !themes.key?(theme)
|
272
|
-
theme_list = self.class.themes.keys.map(&:inspect).join(", ")
|
273
|
-
msg = "Unsupported theme: #{@theme.inspect} is not a valid theme. Try: #{theme_list}."
|
274
|
-
return raise(SparkComponents::Error, msg)
|
275
|
-
else
|
276
|
-
add_class themes[theme]
|
235
|
+
update_tag_attr(name)
|
277
236
|
end
|
278
237
|
end
|
279
238
|
|
@@ -291,7 +250,7 @@ module SparkComponents
|
|
291
250
|
|
292
251
|
# Define common view methods to "alias"
|
293
252
|
def view_methods
|
294
|
-
%i[tag content_tag image_tag concat content_for link_to component]
|
253
|
+
%i[tag content_tag image_tag concat content_for link_to component capture]
|
295
254
|
end
|
296
255
|
|
297
256
|
def extend_view_methods
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spark_components
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brandon Mathis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-08-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -77,7 +77,7 @@ files:
|
|
77
77
|
- lib/spark_components/railtie.rb
|
78
78
|
- lib/spark_components/version.rb
|
79
79
|
- lib/tasks/components_tasks.rake
|
80
|
-
homepage: https://github.com/
|
80
|
+
homepage: https://github.com/spark-engine/components
|
81
81
|
licenses:
|
82
82
|
- MIT
|
83
83
|
metadata: {}
|