xmlhash 1.3.5 → 1.3.8

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 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