xmlhash 1.3.5 → 1.3.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 3f72be19a08e60ff2efe59afb44753d23f3bb9eea969e98c6dbb80e03df376a8
4
+ data.tar.gz: e1114dead31f0e4ecedf639a22dac1f114ba136f21875183b35a65dd88867e5b
5
+ SHA512:
6
+ metadata.gz: c57699c0ca0943c498b154dfefd9d9e2039fd05daf19427852417b634dd364b75c0f03280e0017ea1da04745684e82e19d68176ef3382c864db111c9dfb292c2
7
+ data.tar.gz: fb8689064ee31b7dcd827682ac0d25bbc1b7c8eed41284118d283ec6aecd59a076e984d37c9539b3dbbd70fdd8b75f940743004cc86fe1846c9e86fa5fcd2606
data/Gemfile CHANGED
@@ -4,3 +4,4 @@ gem 'hoe'
4
4
  gem 'rake-compiler'
5
5
  gem 'pkg-config'
6
6
  gem 'json'
7
+ gem 'minitest', '>= 5.0.0', group: :test
data/History.txt CHANGED
@@ -1,3 +1,16 @@
1
+ === 1.3.8 / 2022-04-04
2
+
3
+ * Do not replace entities while parsing
4
+
5
+ === 1.3.7 / 2016-07-04
6
+
7
+ * Fix XML parsing: ignore comments and parse huge TXT nodes
8
+
9
+ === 1.3.6 / 2013-09-11
10
+
11
+ * Wrap libxml2 parsing in a synchronize block - otherwise the stacking
12
+ will not work and it's too much work to make it reentrant
13
+
1
14
  === 1.3.5 / 2012-12-21 ("final edition")
2
15
 
3
16
  * Initialize result so we don't return something random in case of parse error
data/README.txt CHANGED
@@ -37,7 +37,7 @@ and generate the RDoc.
37
37
 
38
38
  (The MIT License)
39
39
 
40
- Copyright (c) 2012 Stephan Kulow
40
+ Copyright (c) 2012-2022 Stephan Kulow
41
41
 
42
42
  Permission is hereby granted, free of charge, to any person obtaining
43
43
  a copy of this software and associated documentation files (the
data/Rakefile CHANGED
@@ -7,6 +7,7 @@ require 'rake/extensiontask'
7
7
  Hoe.spec 'xmlhash' do
8
8
  developer('Stephan Kulow', 'coolo@suse.com')
9
9
  self.readme_file = 'README.txt'
10
+ self.license('MIT')
10
11
  self.spec_extras = { :extensions => ["ext/xmlhash/extconf.rb"] }
11
12
  self.extra_dev_deps << ['rake-compiler', '>= 0']
12
13
  self.extra_deps << ['pkg-config']
@@ -4,4 +4,5 @@ unless find_library('xml2', 'xmlAddID')
4
4
  abort "xml2 is missing. please install libxml2"
5
5
  end
6
6
  $CFLAGS << ' ' + PackageConfig.new('libxml-2.0').cflags
7
+ $CFLAGS += " -Werror "
7
8
  create_makefile('xmlhash/xmlhash')
@@ -19,6 +19,7 @@
19
19
  static VALUE m_current = Qnil;
20
20
  static VALUE m_stack = Qnil;
21
21
  static VALUE m_cstring = Qnil;
22
+ static VALUE m_mutex = Qnil;
22
23
  static VALUE m_result = Qnil;
23
24
  static VALUE m_xmlClass = Qnil;
24
25
  #ifdef HAVE_RUBY_ENCODING_H
@@ -150,6 +151,9 @@ void processNode(xmlTextReaderPtr reader)
150
151
 
151
152
  nodetype = xmlTextReaderNodeType(reader);
152
153
 
154
+ if (nodetype == XML_READER_TYPE_COMMENT)
155
+ return; // ignore
156
+
153
157
  if (nodetype == XML_READER_TYPE_END_ELEMENT) {
154
158
  xml_hash_end_element(name);
155
159
  assert(value == NULL);
@@ -192,6 +196,8 @@ void processNode(xmlTextReaderPtr reader)
192
196
 
193
197
  static VALUE parse_xml_hash(VALUE self, VALUE rb_xml)
194
198
  {
199
+ rb_mutex_lock(m_mutex);
200
+
195
201
  char *data;
196
202
  xmlTextReaderPtr reader;
197
203
  int ret;
@@ -209,7 +215,7 @@ static VALUE parse_xml_hash(VALUE self, VALUE rb_xml)
209
215
  memcpy(data, StringValuePtr(rb_xml), RSTRING_LEN(rb_xml));
210
216
 
211
217
  reader = xmlReaderForMemory(data, RSTRING_LEN(rb_xml),
212
- NULL, NULL, XML_PARSE_NOENT | XML_PARSE_NOERROR | XML_PARSE_NOWARNING );
218
+ NULL, NULL, XML_PARSE_NOERROR | XML_PARSE_NOWARNING | XML_PARSE_HUGE );
213
219
  init_XmlhashParserData();
214
220
 
215
221
  if (reader != NULL) {
@@ -228,6 +234,7 @@ static VALUE parse_xml_hash(VALUE self, VALUE rb_xml)
228
234
  #ifdef HAVE_RUBY_ENCODING_H
229
235
  m_current_encoding = 0;
230
236
  #endif
237
+ rb_mutex_unlock(m_mutex);
231
238
  return m_result;
232
239
  }
233
240
 
@@ -236,9 +243,11 @@ void Init_xmlhash()
236
243
  VALUE mXmlhash;
237
244
 
238
245
  LIBXML_TEST_VERSION
246
+ m_mutex = rb_mutex_new();
247
+ rb_global_variable(&m_mutex);
239
248
  mXmlhash = rb_define_module("Xmlhash");
240
249
  m_xmlClass = rb_define_class_under(mXmlhash, "XMLHash", rb_cHash);
241
- rb_define_singleton_method(mXmlhash, "parse", &parse_xml_hash, 1);
250
+ rb_define_singleton_method(mXmlhash, "parse_int", &parse_xml_hash, 1);
242
251
  m_stack = rb_ary_new();
243
252
  rb_global_variable(&m_stack);
244
253
  m_cstring = rb_ary_new();
data/lib/xmlhash.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'xmlhash/xmlhash'
2
2
 
3
3
  module Xmlhash
4
- VERSION = '1.3.5'
4
+ VERSION = '1.3.8'
5
5
 
6
6
  class XMLHash < Hash
7
7
 
@@ -61,5 +61,11 @@ module Xmlhash
61
61
  def inspect
62
62
  "X(#{super})"
63
63
  end
64
+
65
+ end
66
+
67
+ def self.parse(str)
68
+ parse_int(str)
64
69
  end
65
- end
70
+
71
+ end
data/test/test_xmlhash.rb CHANGED
@@ -1,123 +1,124 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require "test/unit"
3
+ require "minitest/autorun"
4
4
  require "xmlhash"
5
5
  require 'json'
6
-
7
- class TestXmlhash < Test::Unit::TestCase
8
- def test_xml
9
- xml = <<eos
10
- <request id="93651">
11
- <action type="submit">
12
- <source project="server:dns" package="pdns" rev="65"/>
13
- <target project="openSUSE:Factory" package="pdns"/>
14
- </action>
15
- <state name="revoked" who="coolo" when="2011-12-19T13:20:50">
16
- <comment/>
17
- </state>
18
- <review state="accepted" by_group="legal-auto" who="licensedigger" when="2011-11-25T15:09:55">
19
- <comment>{"approve": "preliminary, version number changed"} &lt;!-- {
20
- "dest": {
21
- "ldb": {
22
- "review": "done",
23
- "rpm_license": "GPLv2+",
24
- "status": "production",
25
- "version": "3.0.rc1"
26
- },
27
- "license": "GPLv2+",
28
- "version": "2.9.22"
29
- },
30
- "hint": [
31
- "src('3.0') and dest('2.9.22') version numbers differ"
32
- ],
33
- "plugin": "0.35",
34
- "src": {
35
- "auto-co": "/api.opensuse.org/server:dns/pdns%3.0%r65",
36
- "license": "GPLv2+",
37
- "rev": "65",
38
- "version": "3.0"
39
- }
40
- } --&gt;</comment>
41
- </review>
42
- <review state="new" by_group="factory-auto"/>
43
- <history name="review" who="coolo" when="2011-11-25T15:02:53"/>
44
- <history name="declined" who="coolo" when="2011-11-25T16:17:30">
45
- <comment>please make sure to wait before these depencencies are in openSUSE:Factory: libopendbx-devel, libopendbx1, libopendbxplus1, opendbx-backend-pgsql</comment>
46
- </history>
47
- <description>update and factory fix (forwarded request 86230 from -miska-)</description>
48
- </request>
6
+ require 'thread'
7
+
8
+ Minitest::Test.make_my_diffs_pretty!
9
+
10
+ Xml = <<~eos
11
+ <request id="93651">
12
+ <action type="submit">
13
+ <source project="server:dns" package="pdns" rev="65"/>
14
+ <target project="openSUSE:Factory" package="pdns"/>
15
+ </action>
16
+ <state name="revoked" who="coolo" when="2011-12-19T13:20:50">
17
+ <comment/>
18
+ </state>
19
+ <review state="accepted" by_group="legal-auto" who="licensedigger" when="2011-11-25T15:09:55">
20
+ <comment>Big comment</comment>
21
+ </review>
22
+ <review state="new" by_group="factory-auto"/>
23
+ <history name="review" who="coolo" when="2011-11-25T15:02:53"/>
24
+ <history name="declined" who="coolo" when="2011-11-25T16:17:30">
25
+ <comment>please make sure to wait before these depencencies are in openSUSE:Factory: libopendbx-devel, libopendbx1, libopendbxplus1, opendbx-backend-pgsql</comment>
26
+ </history>
27
+ <description>update and factory fix (forwarded request 86230 from -miska-)</description>
28
+ </request>
49
29
  eos
50
30
 
51
- rubyoutput = {"history"=>
52
- [ {"name"=>"review", "when"=>"2011-11-25T15:02:53", "who"=>"coolo"},
53
- {"comment"=>"please make sure to wait before these depencencies are in openSUSE:Factory: libopendbx-devel, libopendbx1, libopendbxplus1, opendbx-backend-pgsql",
54
- "name"=>"declined", "when"=>"2011-11-25T16:17:30", "who"=>"coolo"}
55
- ],
56
- "review"=>
57
- [
58
- {"comment"=>"{\"approve\": \"preliminary, version number changed\"} <!-- {\n \"dest\": {\n \"ldb\": {\n \"review\": \"done\", \n \"rpm_license\": \"GPLv2+\", \n \"status\": \"production\", \n \"version\": \"3.0.rc1\"\n }, \n \"license\": \"GPLv2+\", \n \"version\": \"2.9.22\"\n }, \n \"hint\": [\n \"src('3.0') and dest('2.9.22') version numbers differ\"\n ], \n \"plugin\": \"0.35\", \n \"src\": {\n \"auto-co\": \"/api.opensuse.org/server:dns/pdns%3.0%r65\", \n \"license\": \"GPLv2+\", \n \"rev\": \"65\", \n \"version\": \"3.0\"\n }\n} -->", "by_group"=>"legal-auto", "when"=>"2011-11-25T15:09:55", "who"=>"licensedigger", "state"=>"accepted"}, {"by_group"=>"factory-auto", "state"=>"new"}], "action"=>{"type"=>"submit", "target"=>{"project"=>"openSUSE:Factory", "package"=>"pdns"}, "source"=>{"rev"=>"65", "project"=>"server:dns", "package"=>"pdns"}}, "id"=>"93651", "description"=>"update and factory fix (forwarded request 86230 from -miska-)", "state"=>{"comment"=>{}, "name"=>"revoked", "when"=>"2011-12-19T13:20:50", "who"=>"coolo"}}
59
-
60
- 1000.times {
61
- ret = Xmlhash.parse(xml)
31
+ Output = { "history" =>
32
+ [{ "name" => "review", "when" => "2011-11-25T15:02:53", "who" => "coolo" },
33
+ { "comment" => "please make sure to wait before these depencencies are in openSUSE:Factory: libopendbx-devel, libopendbx1, libopendbxplus1, opendbx-backend-pgsql",
34
+ "name" => "declined", "when" => "2011-11-25T16:17:30", "who" => "coolo" }],
35
+ "review" =>
36
+ [
37
+ { "comment" => "Big comment",
38
+ "by_group" => "legal-auto",
39
+ "when" => "2011-11-25T15:09:55",
40
+ "who" => "licensedigger",
41
+ "state" => "accepted" },
42
+ { "by_group" => "factory-auto",
43
+ "state" => "new" }
44
+ ], "action" => { "type" => "submit", "target" => { "project" => "openSUSE:Factory", "package" => "pdns" }, "source" => { "rev" => "65", "project" => "server:dns", "package" => "pdns" } }, "id" => "93651", "description" => "update and factory fix (forwarded request 86230 from -miska-)", "state" => { "comment" => {}, "name" => "revoked", "when" => "2011-12-19T13:20:50", "who" => "coolo" } }
45
+
46
+ class TestXmlhash < Minitest::Test
47
+ def test_xml
48
+ 1000.times { |i|
49
+ ret = Xmlhash.parse(Xml)
62
50
  GC.start
63
- assert_equal ret, rubyoutput
51
+ assert_equal ret, Output
64
52
  }
65
-
53
+
66
54
  10000.times {
67
- ret = Xmlhash.parse(xml)
68
- assert_equal ret, rubyoutput
69
- }
55
+ ret = Xmlhash.parse(Xml)
56
+ assert_equal ret, Output
57
+ }
58
+ end
70
59
 
60
+ def test_threading
61
+ counter = Array.new(10, 100)
62
+ threads = []
63
+ 10.times do |t|
64
+ threads << Thread.new do
65
+ while counter[t] > 0 do
66
+ ret = Xmlhash.parse(Xml)
67
+ counter[t] -= 1
68
+ assert_equal ret, Output
69
+ end
70
+ end
71
+ end
72
+ threads.each { |thr| thr.join }
71
73
  end
72
74
 
73
75
  def test_entry
74
- xml = <<eos
75
- <?xml version='1.0' encoding='UTF-8'?>
76
- <directory count="4">
77
- <entry name="Apache"/>
78
- <entry name="Apache:APR_Pool_Debug"/>
79
- <entry name="Apache:MirrorBrain"/>
80
- <entry name="Apache:Modules"/>
81
- </directory>
82
- eos
76
+ xml = <<~eos
77
+ <?xml version='1.0' encoding='UTF-8'?>
78
+ <directory count="4">
79
+ <entry name="Apache"/>
80
+ <entry name="Apache:APR_Pool_Debug"/>
81
+ <entry name="Apache:MirrorBrain"/>
82
+ <entry name="Apache:Modules"/>
83
+ </directory>
84
+ eos
85
+
86
+ rubyoutput = { "count" => "4",
87
+ "entry" =>
88
+ [{ "name" => "Apache" },
89
+ { "name" => "Apache:APR_Pool_Debug" },
90
+ { "name" => "Apache:MirrorBrain" },
91
+ { "name" => "Apache:Modules" }] }
83
92
 
84
- rubyoutput = {"count" => "4",
85
- "entry"=>
86
- [{"name"=>"Apache"},
87
- {"name"=>"Apache:APR_Pool_Debug"},
88
- {"name"=>"Apache:MirrorBrain"},
89
- {"name"=>"Apache:Modules"}]}
90
-
91
93
  ret = Xmlhash.parse(xml)
92
94
  assert_equal ret, rubyoutput
93
95
 
94
96
  assert_equal ret.elements("entry").first.value("name"), "Apache"
95
-
96
97
  end
97
98
 
98
99
  def test_encoding
99
- xml = "<?xml version='1.0' encoding='UTF-8'?><name>Adrian Schröter</name>"
100
+ xml = "<?xml version='1.0' encoding='UTF-8'?><name>Adrian Schröter</name>"
100
101
 
101
- ret = Xmlhash.parse(xml)
102
- assert_equal ret, "Adrian Schröter"
102
+ ret = Xmlhash.parse(xml)
103
+ assert_equal ret, "Adrian Schröter"
103
104
 
104
- xml = "<?xml version='1.0' encoding='UTF-8'?><name value='Adrian Schröter'/>"
105
- ret = Xmlhash.parse(xml)
106
- assert_equal ret, {"value"=>"Adrian Schröter"}
105
+ xml = "<?xml version='1.0' encoding='UTF-8'?><name value='Adrian Schröter'/>"
106
+ ret = Xmlhash.parse(xml)
107
+ assert_equal ret, { "value" => "Adrian Schröter" }
107
108
 
108
- assert_equal ret.get("value"), "Adrian Schröter"
109
+ assert_equal ret.get("value"), "Adrian Schröter"
109
110
  end
110
111
 
111
112
  def test_cdata
112
- xml = <<eos
113
- <sourcediff key="7ebf6606bf56a9f952dda73f0d861738">
114
- <new name="myfile" md5="299d8fe34c516b078c3d367e3fb460b9" size="12"/>
115
- <diff lines="1">DummyContent</diff>
116
- </sourcediff>
117
- eos
113
+ xml = <<~eos
114
+ <sourcediff key="7ebf6606bf56a9f952dda73f0d861738">
115
+ <new name="myfile" md5="299d8fe34c516b078c3d367e3fb460b9" size="12"/>
116
+ <diff lines="1">DummyContent</diff>
117
+ </sourcediff>
118
+ eos
118
119
 
119
120
  ret = Xmlhash.parse(xml)
120
- assert_equal ret['diff'], {"lines" => "1", "_content" => "DummyContent" }
121
+ assert_equal ret['diff'], { "lines" => "1", "_content" => "DummyContent" }
121
122
  end
122
123
 
123
124
  def test_empty
@@ -129,11 +130,16 @@ eos
129
130
  def test_garbage
130
131
  # unfortunately it's rather challening testing nothing is printed to stderr
131
132
  ret = Xmlhash.parse("asdasdaskdladka")
132
- assert_equal nil, ret
133
+ assert_nil ret
134
+ end
135
+
136
+ def test_entities
137
+ ret = Xmlhash.parse("<ents><text>&lt;</text><text>&gt;</text></ents>")
138
+ assert_equal ret, {"text"=>["<", ">"]}
133
139
  end
134
140
 
135
141
  def test_utf8
136
- xml = '<package name="libconfig" project="home:coolo">
142
+ xml = '<package name="libconfig" project="home:coolo">
137
143
  <title>libconfig &#8211; C/C++ Configuration File Library</title>
138
144
  <description>Libconfig is a simple library for processing structured configuration files, like this one: test.cfg. This file format is more compact and more readable than XML. And unlike XML, it is type-aware, so it is not necessary to do string parsing in application code.
139
145
 
@@ -154,12 +160,11 @@ The library includes bindings for both the C and C++ languages. It works on POSI
154
160
  xml.encode!('ISO-8859-1')
155
161
  xh = Xmlhash.parse(xml)
156
162
  assert_equal "ISO-8859-1", xh['title'].encoding.to_s
157
-
163
+
158
164
  xml = '<?xml version="1.0" encoding="ISO-8859-1"?>
159
165
  <package><title>&#228;&#211;&#254;</title></package>'
160
166
  xml.encode!('US-ASCII')
161
167
  xh = Xmlhash.parse(xml)
162
168
  assert_equal "UTF-8", xh['title'].encoding.to_s
163
-
164
169
  end
165
170
  end
metadata CHANGED
@@ -1,83 +1,80 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xmlhash
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.5
5
- prerelease:
4
+ version: 1.3.8
6
5
  platform: ruby
7
6
  authors:
8
7
  - Stephan Kulow
9
- autorequire:
8
+ autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-12-21 00:00:00.000000000 Z
11
+ date: 2022-04-04 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: pkg-config
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ">="
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
27
  - !ruby/object:Gem::Dependency
31
- name: rdoc
28
+ name: rake-compiler
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ~>
31
+ - - ">="
36
32
  - !ruby/object:Gem::Version
37
- version: '3.10'
33
+ version: '0'
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ~>
38
+ - - ">="
44
39
  - !ruby/object:Gem::Version
45
- version: '3.10'
40
+ version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
- name: rake-compiler
42
+ name: rdoc
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - ">="
52
46
  - !ruby/object:Gem::Version
53
- version: '0'
47
+ version: '4.0'
48
+ - - "<"
49
+ - !ruby/object:Gem::Version
50
+ version: '7'
54
51
  type: :development
55
52
  prerelease: false
56
53
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
54
  requirements:
59
- - - ! '>='
55
+ - - ">="
60
56
  - !ruby/object:Gem::Version
61
- version: '0'
57
+ version: '4.0'
58
+ - - "<"
59
+ - !ruby/object:Gem::Version
60
+ version: '7'
62
61
  - !ruby/object:Gem::Dependency
63
62
  name: hoe
64
63
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
64
  requirements:
67
- - - ~>
65
+ - - "~>"
68
66
  - !ruby/object:Gem::Version
69
- version: '3.3'
67
+ version: '3.23'
70
68
  type: :development
71
69
  prerelease: false
72
70
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
71
  requirements:
75
- - - ~>
72
+ - - "~>"
76
73
  - !ruby/object:Gem::Version
77
- version: '3.3'
78
- description: ! 'A small C module that wraps libxml2''s xmlreader to parse a XML
79
-
80
- string into a ruby hash'
74
+ version: '3.23'
75
+ description: |-
76
+ A small C module that wraps libxml2's xmlreader to parse a XML
77
+ string into a ruby hash
81
78
  email:
82
79
  - coolo@suse.com
83
80
  executables: []
@@ -88,8 +85,8 @@ extra_rdoc_files:
88
85
  - Manifest.txt
89
86
  - README.txt
90
87
  files:
91
- - .autotest
92
- - .travis.yml
88
+ - ".autotest"
89
+ - ".travis.yml"
93
90
  - Gemfile
94
91
  - History.txt
95
92
  - Manifest.txt
@@ -99,33 +96,31 @@ files:
99
96
  - ext/xmlhash/xmlhash.c
100
97
  - lib/xmlhash.rb
101
98
  - test/test_xmlhash.rb
102
- - .gemtest
103
99
  homepage: https://github.com/coolo/xmlhash
104
- licenses: []
105
- post_install_message:
100
+ licenses:
101
+ - MIT
102
+ metadata:
103
+ homepage_uri: https://github.com/coolo/xmlhash
104
+ post_install_message:
106
105
  rdoc_options:
107
- - --main
106
+ - "--main"
108
107
  - README.txt
109
108
  require_paths:
110
109
  - lib
111
110
  required_ruby_version: !ruby/object:Gem::Requirement
112
- none: false
113
111
  requirements:
114
- - - ! '>='
112
+ - - ">="
115
113
  - !ruby/object:Gem::Version
116
114
  version: '0'
117
115
  required_rubygems_version: !ruby/object:Gem::Requirement
118
- none: false
119
116
  requirements:
120
- - - ! '>='
117
+ - - ">="
121
118
  - !ruby/object:Gem::Version
122
119
  version: '0'
123
120
  requirements: []
124
- rubyforge_project: xmlhash
125
- rubygems_version: 1.8.23
126
- signing_key:
127
- specification_version: 3
121
+ rubygems_version: 3.3.7
122
+ signing_key:
123
+ specification_version: 4
128
124
  summary: A small C module that wraps libxml2's xmlreader to parse a XML string into
129
125
  a ruby hash
130
- test_files:
131
- - test/test_xmlhash.rb
126
+ test_files: []
data/.gemtest DELETED
File without changes