xml-simple 1.1.4 → 1.1.9

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.
Files changed (3) hide show
  1. checksums.yaml +5 -5
  2. data/lib/xmlsimple.rb +45 -16
  3. metadata +21 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 068e3be25c5a9565cee2d420a9c396c851fb66e4
4
- data.tar.gz: 21523e733014986f92569c8a2e0e32e0617945c1
2
+ SHA256:
3
+ metadata.gz: 83fdfe764b21f66e184a245f9f908d2ed9678edd6d0734a33cac93030449c324
4
+ data.tar.gz: ecd9ac1ed12a0fb03f2b8fee924db65ec844dffda64f9553b76a626b2532635a
5
5
  SHA512:
6
- metadata.gz: e4fd65ac9b33e3723968f59030366b0400ff14c61c290eecc6cd7d24e06a6768279a64ff514c3f4111c8cd89a06d8a5373e976c7e97fce2eba03d5631527d4bb
7
- data.tar.gz: 9fede257f59b389c890003c9995762c1714f6e70d6c9e0067f200c4dfb7d90fe3a69f068f24229265c8f483d274393f123a89ff7fda9117cf41c824d0c86acb3
6
+ metadata.gz: 652f1cbb3ef139e5450cdd2ad01fc4a22e23ec3174bd3d88c58b973f1c5c955673a365bbaa3e3c910ad60c190994e3e0e88fd4678af69d5981aadd2b0ecb019d
7
+ data.tar.gz: 40e7a0e3e6b0a42d178e8f6b782aca2e8a6d65ce87ab8aa06953d7dfe41b4ce115793018df2bab0b6238298d1c35ccdaa2fee9a0ea46ac927f2d2238d2f0146d
data/lib/xmlsimple.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # = XmlSimple
2
2
  #
3
3
  # Author:: Maik Schmidt <contact@maik-schmidt.de>
4
- # Copyright:: Copyright (c) 2003-2014 Maik Schmidt
4
+ # Copyright:: Copyright (c) 2003-2021 Maik Schmidt
5
5
  # License:: Distributes under the same terms as Ruby.
6
6
  #
7
7
  require 'rexml/document'
@@ -11,7 +11,7 @@ require 'stringio'
11
11
  class XmlSimple
12
12
  include REXML
13
13
 
14
- @@VERSION = '1.1.4'
14
+ @@VERSION = '1.1.9'
15
15
 
16
16
  # A simple cache for XML documents that were already transformed
17
17
  # by xml_in.
@@ -121,7 +121,7 @@ class XmlSimple
121
121
  # Create a "global" cache.
122
122
  @@cache = Cache.new
123
123
 
124
- # Creates and intializes a new XmlSimple object.
124
+ # Creates and initializes a new XmlSimple object.
125
125
  #
126
126
  # defaults::
127
127
  # Default values for options.
@@ -264,15 +264,15 @@ class XmlSimple
264
264
  # Declare options that are valid for xml_in and xml_out.
265
265
  KNOWN_OPTIONS = {
266
266
  'in' => %w(
267
- keyattr keeproot forcecontent contentkey noattr
268
- searchpath forcearray suppressempty anonymoustag
269
- cache grouptags normalisespace normalizespace
270
- variables varattr keytosymbol attrprefix conversions
267
+ keyattr keeproot forcecontent contentkey noattr searchpath
268
+ forcearray suppressempty anonymoustag cache grouptags
269
+ normalisespace normalizespace variables varattr keytosymbol
270
+ attrtosymbol attrprefix conversions kebabtosnakecase
271
271
  ),
272
272
  'out' => %w(
273
273
  keyattr keeproot contentkey noattr rootname
274
274
  xmldeclaration outputfile noescape suppressempty
275
- anonymoustag indent grouptags noindent attrprefix
275
+ anonymoustag indent grouptags noindent attrprefix selfclose
276
276
  )
277
277
  }
278
278
 
@@ -285,11 +285,13 @@ class XmlSimple
285
285
  DEF_FORCE_ARRAY = true
286
286
  DEF_INDENTATION = ' '
287
287
  DEF_KEY_TO_SYMBOL = false
288
+ DEF_ATTR_TO_SYMBOL = false
289
+ DEF_KEBAB_TO_SNAKE = false
288
290
 
289
291
  # Normalizes option names in a hash, i.e., turns all
290
292
  # characters to lower case and removes all underscores.
291
- # Additionally, this method checks, if an unknown option
292
- # was used and raises an according exception.
293
+ # Additionally, this method checks if an unknown option
294
+ # was used, and raises an according exception.
293
295
  #
294
296
  # options::
295
297
  # Hash to be normalized.
@@ -301,7 +303,7 @@ class XmlSimple
301
303
  options.each { |key, value|
302
304
  lkey = key.to_s.downcase.gsub(/_/, '')
303
305
  if !known_options.member?(lkey)
304
- raise ArgumentError, "Unrecognised option: #{lkey}."
306
+ raise ArgumentError, "Unrecognized option: #{lkey}."
305
307
  end
306
308
  result[lkey] = value
307
309
  }
@@ -353,6 +355,8 @@ class XmlSimple
353
355
 
354
356
  @options['keytosymbol'] = DEF_KEY_TO_SYMBOL unless @options.has_key?('keytosymbol')
355
357
 
358
+ @options['attrtosymbol'] = DEF_ATTR_TO_SYMBOL unless @options.has_key?('attrtosymbol')
359
+
356
360
  if @options.has_key?('contentkey')
357
361
  if @options['contentkey'] =~ /^-(.*)$/
358
362
  @options['contentkey'] = $1
@@ -451,6 +455,8 @@ class XmlSimple
451
455
  elsif @options.has_key?('varattr')
452
456
  @_var_values = {}
453
457
  end
458
+
459
+ @options['kebabtosnakecase'] = DEF_KEBAB_TO_SNAKE unless @options.has_key?('kebabtosnakecase')
454
460
  end
455
461
 
456
462
  # Actually converts an XML document element into a data structure.
@@ -479,7 +485,7 @@ class XmlSimple
479
485
  result[@options['contentkey']] = content
480
486
  end
481
487
  elsif element.has_text? # i.e. it has only text.
482
- return collapse_text_node(result, element)
488
+ return collapse_text_node(result, element) # calls merge, which converts
483
489
  end
484
490
 
485
491
  # Turn Arrays into Hashes if key fields present.
@@ -488,8 +494,11 @@ class XmlSimple
488
494
  # Disintermediate grouped tags.
489
495
  if @options.has_key?('grouptags')
490
496
  result.each { |key, value|
497
+ # In results, key should already be converted
498
+ raise("Unconverted key '#{key}' found. Should be '#{kebab_to_snake_case key}'.") if (key != kebab_to_snake_case(key))
491
499
  next unless (value.is_a?(Hash) && (value.size == 1))
492
500
  child_key, child_value = value.to_a[0]
501
+ child_key = kebab_to_snake_case child_key # todo test whether necessary
493
502
  if @options['grouptags'][key] == child_key
494
503
  result[key] = child_value
495
504
  end
@@ -545,6 +554,7 @@ class XmlSimple
545
554
  keyattr = @options['keyattr']
546
555
  if (keyattr.is_a?(Array) || keyattr.is_a?(Hash))
547
556
  hash.each { |key, value|
557
+ key = kebab_to_snake_case key
548
558
  if value.is_a?(Array)
549
559
  if keyattr.is_a?(Array)
550
560
  hash[key] = fold_array(value)
@@ -641,6 +651,7 @@ class XmlSimple
641
651
  # value::
642
652
  # Value to be associated with key.
643
653
  def merge(hash, key, value)
654
+ key = kebab_to_snake_case key
644
655
  if value.is_a?(String)
645
656
  value = normalise_space(value) if @options['normalisespace'] == 2
646
657
 
@@ -655,7 +666,7 @@ class XmlSimple
655
666
 
656
667
  # look for variable definitions
657
668
  if @options.has_key?('varattr')
658
- varattr = @options['varattr']
669
+ varattr = kebab_to_snake_case @options['varattr']
659
670
  if hash.has_key?(varattr)
660
671
  set_var(hash[varattr], value)
661
672
  end
@@ -709,10 +720,14 @@ class XmlSimple
709
720
  def get_attributes(node)
710
721
  attributes = {}
711
722
  if @options['attrprefix']
712
- node.attributes.each { |n,v| attributes["@" + n] = v }
723
+ node.attributes.each { |n,v| attributes["@" + kebab_to_snake_case(n)] = v }
724
+ elsif @options.has_key?('attrtosymbol') and @options['attrtosymbol'] == true
725
+ #patch for converting attribute names to symbols
726
+ node.attributes.each { |n,v| attributes[kebab_to_snake_case(n).to_sym] = v }
713
727
  else
714
- node.attributes.each { |n,v| attributes[n] = v }
728
+ node.attributes.each { |n,v| attributes[kebab_to_snake_case(n)] = v }
715
729
  end
730
+
716
731
  attributes
717
732
  end
718
733
 
@@ -820,7 +835,7 @@ class XmlSimple
820
835
  end
821
836
  end
822
837
  }
823
- else
838
+ elsif !@options['selfclose']
824
839
  text_content = ''
825
840
  end
826
841
 
@@ -1028,6 +1043,20 @@ class XmlSimple
1028
1043
  }
1029
1044
  end
1030
1045
  end
1046
+
1047
+ # Substitutes underscores for hyphens if the KebabToSnakeCase option is selected. For when you don't
1048
+ # want to refer to keys by hash[:'my-key'] but instead as hash[:my_key]
1049
+ #
1050
+ # key::
1051
+ # Key to be converted.
1052
+ def kebab_to_snake_case(key)
1053
+ return key unless (@options['kebabtosnakecase'])
1054
+
1055
+ is_symbol = key.is_a? Symbol
1056
+ key = key.to_s.gsub(/-/, '_')
1057
+ key = key.to_sym if is_symbol
1058
+ key
1059
+ end
1031
1060
  end
1032
1061
 
1033
1062
  # vim:sw=2
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xml-simple
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.4
4
+ version: 1.1.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maik Schmidt
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-02 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2021-01-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rexml
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  description:
14
28
  email: contact@maik-schmidt.de
15
29
  executables: []
@@ -19,7 +33,7 @@ files:
19
33
  - lib/xmlsimple.rb
20
34
  homepage: https://github.com/maik/xml-simple
21
35
  licenses:
22
- - Ruby
36
+ - MIT
23
37
  metadata: {}
24
38
  post_install_message:
25
39
  rdoc_options: []
@@ -27,17 +41,16 @@ require_paths:
27
41
  - lib
28
42
  required_ruby_version: !ruby/object:Gem::Requirement
29
43
  requirements:
30
- - - '>='
44
+ - - ">="
31
45
  - !ruby/object:Gem::Version
32
46
  version: '0'
33
47
  required_rubygems_version: !ruby/object:Gem::Requirement
34
48
  requirements:
35
- - - '>='
49
+ - - ">="
36
50
  - !ruby/object:Gem::Version
37
51
  version: '0'
38
52
  requirements: []
39
- rubyforge_project: xml-simple
40
- rubygems_version: 2.0.6
53
+ rubygems_version: 3.1.2
41
54
  signing_key:
42
55
  specification_version: 4
43
56
  summary: A simple API for XML processing.