xml-mixup 0.1.9 → 0.1.10

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: 48a86946adc9a44a1bc9d986416ef411991303edb21e9504c65298780133b57d
4
- data.tar.gz: da5b71064ada3a7d49ce014c30432aed83a0d04543ef581b2952279522bda033
3
+ metadata.gz: 74f33a7307a517d3447e6cc3e41b79a964d7002dcd41118f20f77854ad20c7c9
4
+ data.tar.gz: c0fe7162ce9a6b6d0b27880b6127e783bbe2f340358be29e2cc9386345ef6cff
5
5
  SHA512:
6
- metadata.gz: 4b841ff188b208a3986ccc97b8a44df1c29b0371bef01d113cf03358c8757ed728e906e8585ec1233acccdf16d2676a78052fbeb50eb75e972d073785b28ad1f
7
- data.tar.gz: 6c83a42f76ba918526bf2bc192de5e101fea497593983e8c5d8415a66eefabe5c786302f58bbb488f01954ba6a45dbdab133f6598c8d129794f4fb34a73d05d5
6
+ metadata.gz: c50bb0074170d8b936bf83084d5d471ab3f6f70703ec87e4c7e1b3f8d02bff4bb557986367f648bfec14f62cdb0a6b7b0ddaa7b88cdc3308e6922eb377b8619d
7
+ data.tar.gz: 86e2f6b2ba2f89808215e1176031bc2079ff254f425d5c3a8e2d6f9a8f81506e9bc921b9605d531b3708fca92cf3dc18cb3f8ceca6dd8615b76b2eeed1f7deee
data/README.md CHANGED
@@ -148,6 +148,21 @@ flattened like this:
148
148
  # => <foo array="a b" hash="c: d e: f"/>
149
149
  ```
150
150
 
151
+ Note that attribute values can also be a `Proc`, which are fed
152
+ arbitrary arguments from the `markup` method. The `Proc` is expected
153
+ to return something which can subsequently flattened. If an attribute
154
+ value is `nil` or ultimately resolves to `nil`, or an empty `Array` or
155
+ `Hash`, that attribute will be omitted. `nil` values in arrays or
156
+ hashes will also be skipped, as will empty-string values in
157
+ arrays. This is different behaviour from versions prior to 0.1.10,
158
+ where `nil` (or, e.g., `[]`) would produce an attribute containing the
159
+ empty string.
160
+
161
+ This change was made to eliminate a lot of clunky logic in application
162
+ code to determine whether or not to include a given attribute. If you
163
+ need to render attributes explicitly with empty strings, then
164
+ explicitly pass in the empty string.
165
+
151
166
  #### Processing instructions
152
167
 
153
168
  ```ruby
data/lib/xml/mixup.rb CHANGED
@@ -216,7 +216,7 @@ module XML::Mixup
216
216
  # now we dispatch based on the name
217
217
  if name == '#comment'
218
218
  # first up, comments
219
- node = doc.create_comment flatten(children, args)
219
+ node = doc.create_comment flatten(children, args).to_s
220
220
 
221
221
  # attach it
222
222
  ADJACENT[adj].call node, nodes[adj]
@@ -230,11 +230,12 @@ module XML::Mixup
230
230
  content = ''
231
231
  if (c = children[1..children.length]) and c.length > 0
232
232
  #warn c.inspect
233
- content = flatten(c, args)
233
+ content = flatten(c, args).to_s
234
234
  else
235
235
  content = attr.sort.map { |pair|
236
- "#{pair[0].to_s}=\"#{flatten(pair[1], args)}\""
237
- }.join(' ')
236
+ v = flatten(pair[1], args) or next
237
+ "#{pair[0].to_s}=\"#{v}\""
238
+ }.compact.join(' ')
238
239
  end
239
240
 
240
241
  node = Nokogiri::XML::ProcessingInstruction.new(doc, target, content)
@@ -292,11 +293,12 @@ module XML::Mixup
292
293
  ns = {}
293
294
  at = {}
294
295
  attr.each do |k, v|
295
- v = flatten(v, args)
296
- if (md = /^xmlns(?::(.*))?$/i.match(k.to_s))
296
+ k = k.to_s
297
+ v = flatten(v, args) or next
298
+ if (md = /^xmlns(?::(.*))?$/i.match(k))
297
299
  ns[md[1]] = v
298
300
  else
299
- at[k.to_s] = v
301
+ at[k] = v
300
302
  end
301
303
  end
302
304
 
@@ -545,26 +547,33 @@ module XML::Mixup
545
547
  elem.add_namespace((p.nil? ? p : p.to_s), ns[p].to_s)
546
548
  end
547
549
  attr.sort.each do |k, v|
548
- elem[k.to_s] = flatten(v, args)
550
+ v = flatten(v, args) or next
551
+ elem[k.to_s] = v
549
552
  end
550
553
 
551
554
  elem
552
555
  end
553
556
 
554
- ATOMS = [String, Symbol, Numeric, NilClass, FalseClass, TrueClass].freeze
557
+ ATOMS = [String, Symbol, Numeric, FalseClass, TrueClass].freeze
555
558
 
556
559
  # yo dawg
557
560
 
558
561
  def flatten obj, args
562
+ return if obj.nil?
559
563
  # early bailout for most likely condition
560
564
  if ATOMS.any? { |x| obj.is_a? x }
561
565
  obj.to_s
562
566
  elsif obj.is_a? Hash
563
- obj.sort.map { |kv| "#{kv[0].to_s}: #{flatten(kv[1], args)}" }.join(' ')
567
+ tmp = obj.sort.map do |kv|
568
+ v = flatten(kv[1], args)
569
+ v.nil? ? nil : "#{kv[0].to_s}: #{v}"
570
+ end.compact
571
+ tmp.empty? ? nil : tmp.join(' ')
564
572
  elsif obj.respond_to? :call
565
- obj.call(*args)
573
+ flatten(obj.call(*args), args)
566
574
  elsif obj.respond_to? :map
567
- obj.map { |x| flatten(x, args) }.join(' ')
575
+ tmp = obj.map { |x| flatten(x, args) }.reject { |x| x.nil? || x == '' }
576
+ tmp.empty? ? nil : tmp.join(' ')
568
577
  else
569
578
  obj.to_s
570
579
  end
@@ -1,5 +1,5 @@
1
1
  module XML
2
2
  module Mixup
3
- VERSION = "0.1.9"
3
+ VERSION = "0.1.10"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xml-mixup
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.9
4
+ version: 0.1.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dorian Taylor
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-06-25 00:00:00.000000000 Z
11
+ date: 2019-07-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -105,7 +105,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
105
105
  version: '0'
106
106
  requirements: []
107
107
  rubyforge_project:
108
- rubygems_version: 2.7.6.2
108
+ rubygems_version: 2.7.6
109
109
  signing_key:
110
110
  specification_version: 4
111
111
  summary: A mixin for (XML) markup