xmlhasher 1.0.3 → 1.0.4

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: 3240088f05621e61ec077b6353d4efa8c11e38c58e6a9f5cb32fb926493a0c86
4
- data.tar.gz: d7cda5ca749826197b782c8d260f13445ab573e86587a43645508a0ea0565f51
3
+ metadata.gz: 0141c719c75bbae939e900964c22fc208f9dd1edcd5043d7dfa3ea1191a41d50
4
+ data.tar.gz: 4c598efe5871498e9fea2a12d9ecd4acd2a930c7a783a13e5b5715f03e8dc881
5
5
  SHA512:
6
- metadata.gz: f421d05d16de43a6e78b4f19d8704f602a36b785299b392cce444eef1a7341c57dee5ac3bc723feae03b5b68b056f65af3cd98dcac3b4e947150e68740847fcb
7
- data.tar.gz: 6d7e68640d6ada4d53a77a268c20696c51df152dbd0846248e8babb65c0bfd4dd60e0e35d4c752903b3b341c82110469a6ddca695e5ba13327f4b2549daea0db
6
+ metadata.gz: 81f2afb7c5cb3fa22b51f3567ef84e1c1538a92103f3b1d131ba1d1550f55e7b8e7c7fb18ad506d047cd847d5cff9b13a3bf73b60cbcaeb9d06b0a7eeb182388
7
+ data.tar.gz: 51242da088ffc005df4db1769582fc1a1ac7adbb7756ff9ecefa0212d54eee3ea45b30804758b230a72f824a9334034adeaa397e7d05978a0a38ac320f56f150
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- ruby-2.5.1
1
+ 2.5.1
data/.travis.yml CHANGED
@@ -1,12 +1,10 @@
1
1
  language: ruby
2
- bundler_args: "--without development"
3
- before_install:
4
- - gem install bundler
5
2
  rvm:
6
3
  - 1.9.3
7
4
  - 2.0.0
8
5
  - 2.2.3
9
6
  - 2.3.0
7
+ - 2.5.1
10
8
  script:
11
9
  - gem build xmlhasher.gemspec
12
10
  - gem install xmlhasher-*
data/Gemfile CHANGED
@@ -2,11 +2,9 @@ source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
5
- gem 'rake'
6
-
7
5
  group :test do
8
6
  gem 'minitest'
9
7
  gem 'test-unit'
10
8
  gem 'simplecov', :require => false
11
9
  gem 'coveralls', :require => false
12
- end
10
+ end
data/README.md CHANGED
@@ -56,30 +56,29 @@ XmlHasher.parse("<tag1><tag2>content</tag2></tag1>")
56
56
  ```
57
57
  ## Benchmarks
58
58
 
59
- How fast is it? Try it for yourself - [benchmark.rb](https://github.com/cloocher/xmlhasher/blob/master/benchmark/benchmark.rb)
59
+ How fast is it? Try it for yourself `rake benchmark`
60
60
 
61
- ```
61
+ ```sh
62
62
  Converting small xml from text to Hash:
63
-
64
- user system total real
65
- activesupport(rexml) 0.380000 0.000000 0.380000 ( 0.385326)
66
- activesupport(libxml) 0.060000 0.000000 0.060000 ( 0.062008)
67
- activesupport(nokogiri) 0.090000 0.000000 0.090000 ( 0.089466)
68
- xmlsimple 0.480000 0.010000 0.490000 ( 0.490938)
69
- nori 0.120000 0.000000 0.120000 ( 0.123612)
70
- xmlhasher 0.010000 0.000000 0.010000 ( 0.017366)
63
+ user system total real
64
+ activesupport(rexml) 0.196861 0.000692 0.197553 ( 0.197756)
65
+ activesupport(libxml) 0.028840 0.000176 0.029016 ( 0.029037)
66
+ activesupport(nokogiri) 0.044063 0.000516 0.044579 ( 0.044618)
67
+ xmlsimple 0.225291 0.014291 0.239582 ( 0.239756)
68
+ nori 0.048385 0.000379 0.048764 ( 0.048806)
69
+ xmlhasher 0.011791 0.000098 0.011889 ( 0.011895)
71
70
 
72
71
  Converting large xml from file to Hash:
72
+ user system total real
73
+ activesupport(rexml) 25.891326 0.144542 26.035868 ( 26.052577)
74
+ activesupport(libxml) 3.911317 0.072332 3.983649 ( 3.985904)
75
+ activesupport(nokogiri) 6.126251 0.061193 6.187444 ( 6.191296)
76
+ xmlsimple 26.128386 0.120480 26.248866 ( 26.265013)
77
+ nori 6.347459 0.028522 6.375981 ( 6.380416)
78
+ xmlhasher 1.738668 0.027549 1.766217 ( 1.767256)
73
79
 
74
- user system total real
75
- activesupport(rexml) 57.230000 0.240000 57.470000 ( 57.460510)
76
- activesupport(libxml) # Segmentation fault
77
- activesupport(nokogiri) 12.650000 0.250000 12.900000 ( 12.908073)
78
- xmlsimple 49.980000 0.160000 50.140000 ( 50.140775)
79
- nori 15.590000 0.110000 15.700000 ( 15.697411)
80
- xmlhasher 4.290000 0.030000 4.320000 ( 4.316379)
81
80
  ```
82
- Note: benchmarks were generated on a Macbook Pro using Ruby 1.9.3p392
81
+ Note: benchmarks were generated on a 2015 Macbook Pro using Ruby 2.5.1
83
82
 
84
83
  ## Requirements
85
84
 
data/Rakefile CHANGED
@@ -7,4 +7,9 @@ Rake::TestTask.new(:test) do |t|
7
7
  t.verbose = true
8
8
  end
9
9
 
10
+ desc "Run the benchmarks"
11
+ task :benchmark do
12
+ system("ruby", File.join(File.dirname(__FILE__), "benchmark", "benchmark.rb"))
13
+ end
14
+
10
15
  task :default => :test
@@ -4,92 +4,66 @@ require 'benchmark'
4
4
  require 'xmlhasher'
5
5
  begin
6
6
  require 'nori'
7
- rescue
7
+ rescue LoadError
8
8
  puts "nori gem in not installed, run 'gem install nori'"
9
9
  end
10
10
  begin
11
11
  require 'active_support/core_ext/hash/conversions'
12
- rescue
12
+ rescue LoadError
13
13
  puts "active_support gem in not installed, run 'gem install activesupport'"
14
14
  end
15
15
  begin
16
16
  require 'xmlsimple'
17
- rescue
17
+ rescue LoadError
18
18
  puts "xmlsimple gem in not installed, run 'gem install xml-simple'"
19
19
  end
20
20
  begin
21
21
  require 'nokogiri'
22
- rescue
22
+ rescue LoadError
23
23
  puts "nokogiri gem in not installed, run 'gem install nokogiri'"
24
24
  end
25
25
  begin
26
26
  require 'libxml'
27
- rescue
27
+ rescue LoadError
28
28
  puts "libxml gem in not installed, run 'gem install libxml-ruby'"
29
29
  end
30
30
 
31
31
 
32
- runs = 100
33
- xml = File.read(File.expand_path('../../test/fixtures/institution.xml', __FILE__))
34
- puts 'Converting small xml from text to Hash:'
35
- Benchmark.bm 10 do |x|
36
- ActiveSupport::XmlMini.backend = ActiveSupport::XmlMini_REXML
37
- x.report 'activesupport(rexml) ' do
38
- runs.times { Hash.from_xml(xml) }
39
- end
32
+ def benchmark(runs, xml)
33
+ label_width = 25 # needs to be >= any label's size
40
34
 
41
- ActiveSupport::XmlMini.backend = 'LibXML'
42
- x.report 'activesupport(libxml) ' do
43
- runs.times { Hash.from_xml(xml) }
44
- end
35
+ Benchmark.bm(label_width) do |x|
36
+ ActiveSupport::XmlMini.backend = ActiveSupport::XmlMini_REXML
37
+ x.report 'activesupport(rexml)' do
38
+ runs.times { Hash.from_xml(xml) }
39
+ end
45
40
 
46
- ActiveSupport::XmlMini.backend = 'Nokogiri'
47
- x.report 'activesupport(nokogiri)' do
48
- runs.times { Hash.from_xml(xml) }
49
- end
41
+ ActiveSupport::XmlMini.backend = 'LibXML'
42
+ x.report 'activesupport(libxml)' do
43
+ runs.times { Hash.from_xml(xml) }
44
+ end
50
45
 
51
- x.report 'xmlsimple ' do
52
- runs.times { XmlSimple.xml_in(xml) }
53
- end
46
+ ActiveSupport::XmlMini.backend = 'Nokogiri'
47
+ x.report 'activesupport(nokogiri)' do
48
+ runs.times { Hash.from_xml(xml) }
49
+ end
54
50
 
55
- x.report 'nori ' do
56
- runs.times { Nori.new(:advanced_typecasting => false).parse(xml) }
57
- end
51
+ x.report 'xmlsimple' do
52
+ runs.times { XmlSimple.xml_in(xml) }
53
+ end
58
54
 
59
- x.report 'xmlhasher ' do
60
- runs.times { XmlHasher.parse(xml) }
55
+ x.report 'nori' do
56
+ runs.times { Nori.new(:advanced_typecasting => false).parse(xml) }
57
+ end
58
+
59
+ x.report 'xmlhasher' do
60
+ runs.times { XmlHasher.parse(xml) }
61
+ end
61
62
  end
62
63
  end
63
64
 
64
- puts
65
- runs = 5
66
- path = File.expand_path('../../test/fixtures/institutions.xml', __FILE__)
65
+ puts 'Converting small xml from text to Hash:'
66
+ benchmark(100, File.read(File.expand_path('../../test/fixtures/institution.xml', __FILE__)))
67
67
  puts 'Converting large xml from file to Hash:'
68
- Benchmark.bm 5 do |x|
69
- ActiveSupport::XmlMini.backend = ActiveSupport::XmlMini_REXML
70
- x.report 'activesupport(rexml) ' do
71
- runs.times { Hash.from_xml(File.new(path)) }
72
- end
73
-
74
- ActiveSupport::XmlMini.backend = 'LibXML'
75
- x.report 'activesupport(libxml) ' do
76
- #runs.times { Hash.from_xml(File.new(path)) } # Segmentation fault
77
- end
78
-
79
- ActiveSupport::XmlMini.backend = 'Nokogiri'
80
- x.report 'activesupport(nokogiri)' do
81
- runs.times { Hash.from_xml(File.new(path)) }
82
- end
83
-
84
- x.report 'xmlsimple ' do
85
- runs.times { XmlSimple.xml_in(path) }
86
- end
87
-
88
- x.report 'nori ' do
89
- runs.times { Nori.new(:advanced_typecasting => false).parse(File.new(path).read) } # Nori doesn't support reading from a stream, load the file in memory
90
- end
91
-
92
- x.report 'xmlhasher ' do
93
- runs.times { XmlHasher.parse(File.new(path)) }
94
- end
95
- end
68
+ benchmark(5, File.read(File.expand_path('../../test/fixtures/institutions.xml', __FILE__)))
69
+ puts
data/bin/rake ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+ #
4
+ # This file was generated by Bundler.
5
+ #
6
+ # The application 'rake' is installed as part of a gem, and
7
+ # this file is here to facilitate running it.
8
+ #
9
+
10
+ require "pathname"
11
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
12
+ Pathname.new(__FILE__).realpath)
13
+
14
+ require "rubygems"
15
+ require "bundler/setup"
16
+
17
+ load Gem.bin_path("rake", "rake")
@@ -26,6 +26,10 @@ module XmlHasher
26
26
  @stack.last.text = escape(value)
27
27
  end
28
28
 
29
+ def cdata(str)
30
+ @stack.last.text = escape(str)
31
+ end
32
+
29
33
  def end_element(name)
30
34
  if @stack.size == 1
31
35
  @hash = @stack.pop.to_hash
@@ -17,7 +17,7 @@ module XmlHasher
17
17
  if children.size == 1
18
18
  h[name].merge!(children.first.to_hash)
19
19
  else
20
- h[name].merge!(children.group_by { |child| child.name }.inject({}) { |r, (k, v)| v.length == 1 ? r.merge!(v.first.to_hash) : r[k] = v.map { |c| c.to_hash[c.name] }; r })
20
+ h[name].merge!(children.group_by { |c| c.name }.inject({}) { |r, (k, v)| v.length == 1 ? r.merge!(v.first.to_hash) : r[k] = v.map { |c| c.to_hash[c.name] }; r })
21
21
  end
22
22
  end
23
23
  h[name] = nil if h[name].empty?
@@ -1,3 +1,3 @@
1
1
  module XmlHasher
2
- VERSION = '1.0.3'
2
+ VERSION = '1.0.4'
3
3
  end
@@ -241,4 +241,10 @@ class XmlhasherTest < Test::Unit::TestCase
241
241
  expected = {:tag => nil}
242
242
  assert_equal expected, XmlHasher::Parser.new.parse(xml)
243
243
  end
244
+
245
+ def test_cdata_value
246
+ xml = %[<title><![CDATA[Midhir uploaded a photo.]]></title>]
247
+ expected = {:title => "Midhir uploaded a photo."}
248
+ assert_equal expected, XmlHasher::Parser.new.parse(xml)
249
+ end
244
250
  end
data/xmlhasher.gemspec CHANGED
@@ -14,16 +14,19 @@ Gem::Specification.new do |spec|
14
14
  spec.license = 'MIT'
15
15
 
16
16
  spec.files = `git ls-files`.split($/)
17
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
17
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
18
  spec.require_paths = ['lib']
20
19
 
21
20
  spec.required_ruby_version = '>= 1.9.3'
22
21
  spec.required_rubygems_version = '>= 1.3.6'
23
22
 
24
- spec.add_dependency 'ox', '2.10.0'
25
- spec.add_dependency 'escape_utils', '~> 1.2', '>= 1.2.0'
23
+ spec.add_dependency 'ox', '~> 2.10.0'
24
+ spec.add_dependency 'escape_utils', '~> 1.2'
26
25
 
27
- spec.add_development_dependency 'rake', '~> 0'
28
- spec.add_development_dependency 'bundler', '~> 0'
26
+ spec.add_development_dependency 'rake'
27
+ spec.add_development_dependency 'bundler'
28
+ spec.add_development_dependency 'minitest', '~> 5.10'
29
+ spec.add_development_dependency 'test-unit', '~> 3.2'
30
+ spec.add_development_dependency 'simplecov', '~> 0.14.1'
31
+ spec.add_development_dependency 'coveralls', '~> 0.8.21'
29
32
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xmlhasher
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gene Drabkin
@@ -14,14 +14,14 @@ dependencies:
14
14
  name: ox
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '='
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: 2.10.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '='
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 2.10.0
27
27
  - !ruby/object:Gem::Dependency
@@ -31,9 +31,6 @@ dependencies:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '1.2'
34
- - - ">="
35
- - !ruby/object:Gem::Version
36
- version: 1.2.0
37
34
  type: :runtime
38
35
  prerelease: false
39
36
  version_requirements: !ruby/object:Gem::Requirement
@@ -41,37 +38,90 @@ dependencies:
41
38
  - - "~>"
42
39
  - !ruby/object:Gem::Version
43
40
  version: '1.2'
44
- - - ">="
45
- - !ruby/object:Gem::Version
46
- version: 1.2.0
47
41
  - !ruby/object:Gem::Dependency
48
42
  name: rake
49
43
  requirement: !ruby/object:Gem::Requirement
50
44
  requirements:
51
- - - "~>"
45
+ - - ">="
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
51
  requirements:
58
- - - "~>"
52
+ - - ">="
59
53
  - !ruby/object:Gem::Version
60
54
  version: '0'
61
55
  - !ruby/object:Gem::Dependency
62
56
  name: bundler
63
57
  requirement: !ruby/object:Gem::Requirement
64
58
  requirements:
65
- - - "~>"
59
+ - - ">="
66
60
  - !ruby/object:Gem::Version
67
61
  version: '0'
68
62
  type: :development
69
63
  prerelease: false
70
64
  version_requirements: !ruby/object:Gem::Requirement
71
65
  requirements:
72
- - - "~>"
66
+ - - ">="
73
67
  - !ruby/object:Gem::Version
74
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '5.10'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '5.10'
83
+ - !ruby/object:Gem::Dependency
84
+ name: test-unit
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.2'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.2'
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.14.1
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.14.1
111
+ - !ruby/object:Gem::Dependency
112
+ name: coveralls
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 0.8.21
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 0.8.21
75
125
  description: Fast XML to Ruby Hash converter
76
126
  email:
77
127
  - gene.drabkin@gmail.com
@@ -88,6 +138,7 @@ files:
88
138
  - README.md
89
139
  - Rakefile
90
140
  - benchmark/benchmark.rb
141
+ - bin/rake
91
142
  - lib/xmlhasher.rb
92
143
  - lib/xmlhasher/configurable.rb
93
144
  - lib/xmlhasher/handler.rb