multi_xml 0.5.5 → 0.6.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.
@@ -5,17 +5,20 @@ module MultiXml
5
5
  module Parsers
6
6
  module Nokogiri #:nodoc:
7
7
  include Libxml2Parser
8
-
9
8
  extend self
10
9
 
11
- def parse_error() ::Nokogiri::XML::SyntaxError end
10
+ def parse_error
11
+ ::Nokogiri::XML::SyntaxError
12
+ end
12
13
 
13
14
  def parse(xml)
14
15
  doc = ::Nokogiri::XML(xml)
15
- raise doc.errors.first if doc.errors.length > 0
16
+ raise(doc.errors.first) unless doc.errors.empty?
16
17
  node_to_hash(doc.root)
17
18
  end
18
19
 
20
+ private
21
+
19
22
  def each_child(node, &block)
20
23
  node.children.each(&block)
21
24
  end
@@ -0,0 +1,73 @@
1
+ require 'oga' unless defined?(Oga)
2
+ require 'multi_xml/parsers/libxml2_parser'
3
+
4
+ module MultiXml
5
+ module Parsers
6
+ module Oga #:nodoc:
7
+ include Libxml2Parser
8
+ extend self
9
+
10
+ def parse_error
11
+ LL::ParserError
12
+ end
13
+
14
+ def parse(io)
15
+ document = ::Oga.parse_xml(io)
16
+ node_to_hash(document.children[0])
17
+ end
18
+
19
+ def node_to_hash(node, hash = {}) # rubocop:disable AbcSize, CyclomaticComplexity, MethodLength, PerceivedComplexity
20
+ node_hash = {MultiXml::CONTENT_ROOT => ''}
21
+
22
+ name = node_name(node)
23
+
24
+ # Insert node hash into parent hash correctly.
25
+ case hash[name]
26
+ when Array
27
+ hash[name] << node_hash
28
+ when Hash
29
+ hash[name] = [hash[name], node_hash]
30
+ when NilClass
31
+ hash[name] = node_hash
32
+ end
33
+
34
+ # Handle child elements
35
+ each_child(node) do |c|
36
+ if c.is_a?(::Oga::XML::Element)
37
+ node_to_hash(c, node_hash)
38
+ elsif c.is_a?(::Oga::XML::Text) || c.is_a?(::Oga::XML::Cdata)
39
+ node_hash[MultiXml::CONTENT_ROOT] << c.text
40
+ end
41
+ end
42
+
43
+ # Remove content node if it is empty
44
+ if node_hash[MultiXml::CONTENT_ROOT].strip.empty?
45
+ node_hash.delete(MultiXml::CONTENT_ROOT)
46
+ end
47
+
48
+ # Handle attributes
49
+ each_attr(node) do |a|
50
+ key = node_name(a)
51
+ v = node_hash[key]
52
+ node_hash[key] = (v ? [a.value, v] : a.value)
53
+ end
54
+
55
+ hash
56
+ end
57
+
58
+ private
59
+
60
+ def each_child(node, &block)
61
+ node.children.each(&block)
62
+ end
63
+
64
+ def each_attr(node, &block)
65
+ node.attributes.each(&block)
66
+ end
67
+
68
+ def node_name(node)
69
+ node.name
70
+ end
71
+ end # Oga
72
+ end # Parsers
73
+ end # MultiXml
@@ -21,7 +21,6 @@ require 'ox' unless defined?(Ox)
21
21
  module MultiXml
22
22
  module Parsers
23
23
  module Ox #:nodoc:
24
-
25
24
  extend self
26
25
 
27
26
  def parse_error
@@ -37,7 +36,7 @@ module MultiXml
37
36
  class Handler
38
37
  attr_accessor :stack
39
38
 
40
- def initialize()
39
+ def initialize
41
40
  @stack = []
42
41
  end
43
42
 
@@ -46,9 +45,7 @@ module MultiXml
46
45
  end
47
46
 
48
47
  def attr(name, value)
49
- unless @stack.empty?
50
- append(name, value)
51
- end
48
+ append(name, value) unless @stack.empty?
52
49
  end
53
50
 
54
51
  def text(value)
@@ -60,26 +57,24 @@ module MultiXml
60
57
  end
61
58
 
62
59
  def start_element(name)
63
- if @stack.empty?
64
- @stack.push(Hash.new)
65
- end
66
- h = Hash.new
60
+ @stack.push({}) if @stack.empty?
61
+ h = {}
67
62
  append(name, h)
68
63
  @stack.push(h)
69
64
  end
70
65
 
71
- def end_element(name)
72
- @stack.pop()
66
+ def end_element(_)
67
+ @stack.pop
73
68
  end
74
69
 
75
70
  def error(message, line, column)
76
- raise Exception.new("#{message} at #{line}:#{column}")
71
+ raise(Exception.new("#{message} at #{line}:#{column}"))
77
72
  end
78
73
 
79
74
  def append(key, value)
80
75
  key = key.to_s
81
76
  h = @stack.last
82
- if h.has_key?(key)
77
+ if h.key?(key)
83
78
  v = h[key]
84
79
  if v.is_a?(Array)
85
80
  v << value
@@ -90,7 +85,6 @@ module MultiXml
90
85
  h[key] = value
91
86
  end
92
87
  end
93
-
94
88
  end # Handler
95
89
  end # Ox
96
90
  end # Parsers
@@ -4,7 +4,10 @@ module MultiXml
4
4
  module Parsers
5
5
  module Rexml #:nodoc:
6
6
  extend self
7
- def parse_error; ::REXML::ParseException; end
7
+
8
+ def parse_error
9
+ ::REXML::ParseException
10
+ end
8
11
 
9
12
  # Parse an XML Document IO into a simple hash using REXML
10
13
  #
@@ -12,14 +15,11 @@ module MultiXml
12
15
  # XML Document IO to parse
13
16
  def parse(xml)
14
17
  doc = REXML::Document.new(xml)
15
- if doc.root
16
- merge_element!({}, doc.root)
17
- else
18
- raise REXML::ParseException, "The document #{doc.to_s.inspect} does not have a valid root"
19
- end
18
+ raise(REXML::ParseException.new("The document #{doc.to_s.inspect} does not have a valid root")) unless doc.root
19
+ merge_element!({}, doc.root)
20
20
  end
21
21
 
22
- private
22
+ private
23
23
 
24
24
  # Convert an XML element and merge into the hash
25
25
  #
@@ -39,7 +39,7 @@ module MultiXml
39
39
  hash = get_attributes(element)
40
40
 
41
41
  if element.has_elements?
42
- element.each_element {|child| merge_element!(hash, child) }
42
+ element.each_element { |child| merge_element!(hash, child) }
43
43
  merge_texts!(hash, element) unless empty_content?(element)
44
44
  hash
45
45
  else
@@ -54,13 +54,13 @@ module MultiXml
54
54
  # element::
55
55
  # XML element whose texts are to me merged into the hash
56
56
  def merge_texts!(hash, element)
57
- unless element.has_text?
58
- hash
59
- else
57
+ if element.has_text?
60
58
  # must use value to prevent double-escaping
61
59
  texts = ''
62
60
  element.texts.each { |t| texts << t.value }
63
61
  merge!(hash, MultiXml::CONTENT_ROOT, texts)
62
+ else
63
+ hash
64
64
  end
65
65
  end
66
66
 
@@ -76,7 +76,7 @@ module MultiXml
76
76
  # value::
77
77
  # Value to be associated with key.
78
78
  def merge!(hash, key, value)
79
- if hash.has_key?(key)
79
+ if hash.key?(key)
80
80
  if hash[key].instance_of?(Array)
81
81
  hash[key] << value
82
82
  else
@@ -97,7 +97,7 @@ module MultiXml
97
97
  # XML element to extract attributes from.
98
98
  def get_attributes(element)
99
99
  attributes = {}
100
- element.attributes.each { |n,v| attributes[n] = v }
100
+ element.attributes.each { |n, v| attributes[n] = v }
101
101
  attributes
102
102
  end
103
103
 
@@ -1,3 +1,45 @@
1
1
  module MultiXml
2
- VERSION = "0.5.5" unless defined?(MultiXML::VERSION)
2
+ module Version
3
+ module_function
4
+
5
+ # @return [Integer]
6
+ def major
7
+ 0
8
+ end
9
+
10
+ # @return [Integer]
11
+ def minor
12
+ 6
13
+ end
14
+
15
+ # @return [Integer]
16
+ def patch
17
+ 0
18
+ end
19
+
20
+ # @return [Integer, NilClass]
21
+ def pre
22
+ nil
23
+ end
24
+
25
+ # @return [Hash]
26
+ def to_h
27
+ {
28
+ :major => major,
29
+ :minor => minor,
30
+ :patch => patch,
31
+ :pre => pre,
32
+ }
33
+ end
34
+
35
+ # @return [Array]
36
+ def to_a
37
+ [major, minor, patch, pre].compact
38
+ end
39
+
40
+ # @return [String]
41
+ def to_s
42
+ to_a.join('.')
43
+ end
44
+ end
3
45
  end
@@ -5,20 +5,15 @@ require 'multi_xml/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
7
  spec.add_development_dependency 'bundler', '~> 1.0'
8
- spec.author = "Erik Michaels-Ober"
9
- spec.cert_chain = ['certs/sferik.pem']
10
- spec.description = %q{Provides swappable XML backends utilizing LibXML, Nokogiri, Ox, or REXML.}
8
+ spec.author = 'Erik Michaels-Ober'
9
+ spec.description = 'Provides swappable XML backends utilizing LibXML, Nokogiri, Ox, or REXML.'
11
10
  spec.email = 'sferik@gmail.com'
12
- spec.files = %w(.yardopts CHANGELOG.md CONTRIBUTING.md LICENSE.md README.md Rakefile multi_xml.gemspec)
13
- spec.files += Dir.glob("lib/**/*.rb")
14
- spec.files += Dir.glob("spec/**/*")
11
+ spec.files = %w(.yardopts CHANGELOG.md CONTRIBUTING.md LICENSE.md README.md multi_xml.gemspec) + Dir['lib/**/*.rb']
15
12
  spec.homepage = 'https://github.com/sferik/multi_xml'
16
13
  spec.licenses = ['MIT']
17
14
  spec.name = 'multi_xml'
18
15
  spec.require_paths = ['lib']
19
16
  spec.required_rubygems_version = '>= 1.3.5'
20
- spec.signing_key = File.expand_path("~/.gem/private_key.pem") if $0 =~ /gem\z/
21
- spec.summary = %q{A generic swappable back-end for XML parsing}
22
- spec.test_files = Dir.glob("spec/**/*")
23
- spec.version = MultiXml::VERSION
17
+ spec.summary = 'A generic swappable back-end for XML parsing'
18
+ spec.version = MultiXml::Version
24
19
  end
metadata CHANGED
@@ -1,57 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: multi_xml
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.5
5
- prerelease:
4
+ version: 0.6.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Erik Michaels-Ober
9
8
  autorequire:
10
9
  bindir: bin
11
- cert_chain:
12
- - !binary |-
13
- LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURMakNDQWhhZ0F3SUJB
14
- Z0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREE5TVE4d0RRWURWUVFEREFaelpt
15
- VnkKYVdzeEZUQVRCZ29Ka2lhSmsvSXNaQUVaRmdWbmJXRnBiREVUTUJFR0Nn
16
- bVNKb21UOGl4a0FSa1dBMk52YlRBZQpGdzB4TXpBeU1ETXhNREF5TWpkYUZ3
17
- MHhOREF5TURNeE1EQXlNamRhTUQweER6QU5CZ05WQkFNTUJuTm1aWEpwCmF6
18
- RVZNQk1HQ2dtU0pvbVQ4aXhrQVJrV0JXZHRZV2xzTVJNd0VRWUtDWkltaVpQ
19
- eUxHUUJHUllEWTI5dE1JSUIKSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4
20
- QU1JSUJDZ0tDQVFFQWwweDVkeDh1S3hpN1Rrckl1eUJVVEpWQgp2MW85M25V
21
- QjlqL3k0TTk2Z1Yycll3QWNpMUpQQnNlTmQ2RnliempvM1lHdUhsN0VRSHVT
22
- SE5hZjFwMmx4ZXcvCnk2MEpYSUpCQmdQY0RLL0tDUDROVUhvZm0wamZvWUQr
23
- SDV1TkpmSENOcTcvWnNUeE90RTNSYTkyczBCQ01UcG0Kd0JNTWxXUjVNdGRF
24
- aElZdUJPNFhobmVqWWdIMEwvN0JMMmx5bW50Vm5zci9hZ2RRb29qUUNOMUlR
25
- bXNSSnZyUgpkdVpSTzN0WnZvSW8xcEJjNEpFZWhEdXFDZXlCZ1BMT3FNb0t0
26
- UWxvbGQxVFFzMWtXVUJLN0tXTUZFaEtDL0tnCnp5ektSSFFvOXlEWXdPdllu
27
- Z29CTFkrVC9sd0NUNGR5c3NkaHpSYmZueEFoYUt1NFNBc3NJd2FDMDF5Vm93
28
- SUQKQVFBQm96a3dOekFKQmdOVkhSTUVBakFBTUIwR0ExVWREZ1FXQkJTMHJ1
29
- RGZSYWs1Y2kxT3BETlgvWmRERWtJcwppVEFMQmdOVkhROEVCQU1DQkxBd0RR
30
- WUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFISFNNcy9NUDBzT2FMa0V2NEpvCnp2
31
- a20zcW41QTZ0MHZhSHg3NzRjbWVqeU1VKzV3eVN4UmV6c3BMN1VMaDlOZXVL
32
- Mk9oVStPZTNUcHFyQWc1VEsKUjhHUUlMblZ1MkZlbUdBNnNBa1BEbGNQdGdB
33
- NmllSTE5UFpPRjZIVkxtYy9JRC9kUC9OZ1pXV3pFZXFRS21jSwoyK0hNK1NF
34
- RURoWmtTY1lla3c0Wk9lMTY0WnRaRzgxNm9BdjV4MHBHaXRTSWt1bVVwN1Y4
35
- aUVaLzZlaHI3WTllClhPZzRlZXVuNUwvSmptakFSb1cya05kdmtSRDNjMkVl
36
- U0xxV3ZRUnNCbHlwSGZoczZKSnVMbHlaUEdoVTNSL3YKU2YzbFZLcEJDV2dS
37
- cEdUdnk0NVhWcEIrNTl5MzNQSm1FdVExUFRFT1l2UXlhbzlVS01BQWFBTi83
38
- cVdRdGpsMApobHc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
39
- date: 2013-08-06 00:00:00.000000000 Z
10
+ cert_chain: []
11
+ date: 2016-12-06 00:00:00.000000000 Z
40
12
  dependencies:
41
13
  - !ruby/object:Gem::Dependency
42
14
  name: bundler
43
15
  requirement: !ruby/object:Gem::Requirement
44
- none: false
45
16
  requirements:
46
- - - ~>
17
+ - - "~>"
47
18
  - !ruby/object:Gem::Version
48
19
  version: '1.0'
49
20
  type: :development
50
21
  prerelease: false
51
22
  version_requirements: !ruby/object:Gem::Requirement
52
- none: false
53
23
  requirements:
54
- - - ~>
24
+ - - "~>"
55
25
  - !ruby/object:Gem::Version
56
26
  version: '1.0'
57
27
  description: Provides swappable XML backends utilizing LibXML, Nokogiri, Ox, or REXML.
@@ -60,52 +30,42 @@ executables: []
60
30
  extensions: []
61
31
  extra_rdoc_files: []
62
32
  files:
63
- - .yardopts
33
+ - ".yardopts"
64
34
  - CHANGELOG.md
65
35
  - CONTRIBUTING.md
66
36
  - LICENSE.md
67
37
  - README.md
68
- - Rakefile
69
- - multi_xml.gemspec
38
+ - lib/multi_xml.rb
70
39
  - lib/multi_xml/parsers/libxml.rb
71
40
  - lib/multi_xml/parsers/libxml2_parser.rb
72
41
  - lib/multi_xml/parsers/nokogiri.rb
42
+ - lib/multi_xml/parsers/oga.rb
73
43
  - lib/multi_xml/parsers/ox.rb
74
44
  - lib/multi_xml/parsers/rexml.rb
75
45
  - lib/multi_xml/version.rb
76
- - lib/multi_xml.rb
77
- - spec/helper.rb
78
- - spec/multi_xml_spec.rb
79
- - spec/parser_shared_example.rb
80
- - spec/speed.rb
46
+ - multi_xml.gemspec
81
47
  homepage: https://github.com/sferik/multi_xml
82
48
  licenses:
83
49
  - MIT
50
+ metadata: {}
84
51
  post_install_message:
85
52
  rdoc_options: []
86
53
  require_paths:
87
54
  - lib
88
55
  required_ruby_version: !ruby/object:Gem::Requirement
89
- none: false
90
56
  requirements:
91
- - - ! '>='
57
+ - - ">="
92
58
  - !ruby/object:Gem::Version
93
59
  version: '0'
94
60
  required_rubygems_version: !ruby/object:Gem::Requirement
95
- none: false
96
61
  requirements:
97
- - - ! '>='
62
+ - - ">="
98
63
  - !ruby/object:Gem::Version
99
64
  version: 1.3.5
100
65
  requirements: []
101
66
  rubyforge_project:
102
- rubygems_version: 1.8.23
67
+ rubygems_version: 2.5.2
103
68
  signing_key:
104
- specification_version: 3
69
+ specification_version: 4
105
70
  summary: A generic swappable back-end for XML parsing
106
- test_files:
107
- - spec/helper.rb
108
- - spec/multi_xml_spec.rb
109
- - spec/parser_shared_example.rb
110
- - spec/speed.rb
111
- has_rdoc:
71
+ test_files: []
data.tar.gz.sig DELETED
Binary file
data/Rakefile DELETED
@@ -1,21 +0,0 @@
1
- require 'bundler'
2
- Bundler::GemHelper.install_tasks
3
-
4
- require 'rspec/core/rake_task'
5
- RSpec::Core::RakeTask.new(:spec)
6
-
7
- task :test => :spec
8
- task :default => :spec
9
-
10
- namespace :doc do
11
- require 'yard'
12
- YARD::Rake::YardocTask.new do |task|
13
- task.files = ['lib/**/*.rb', '-', 'LICENSE.md']
14
- task.options = [
15
- '--no-private',
16
- '--protected',
17
- '--output-dir', 'doc/yard',
18
- '--markup', 'markdown',
19
- ]
20
- end
21
- end