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 +7 -0
- data/Gemfile +1 -0
- data/History.txt +13 -0
- data/README.txt +1 -1
- data/Rakefile +1 -0
- data/ext/xmlhash/extconf.rb +1 -0
- data/ext/xmlhash/xmlhash.c +11 -2
- data/lib/xmlhash.rb +8 -2
- data/test/test_xmlhash.rb +100 -95
- metadata +42 -47
- data/.gemtest +0 -0
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
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']
|
data/ext/xmlhash/extconf.rb
CHANGED
data/ext/xmlhash/xmlhash.c
CHANGED
@@ -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,
|
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, "
|
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.
|
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
|
-
|
70
|
+
|
71
|
+
end
|
data/test/test_xmlhash.rb
CHANGED
@@ -1,123 +1,124 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
|
3
|
-
require "
|
3
|
+
require "minitest/autorun"
|
4
4
|
require "xmlhash"
|
5
5
|
require 'json'
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
<
|
12
|
-
<
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
<
|
17
|
-
|
18
|
-
|
19
|
-
<
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
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
|
-
} --></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
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
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,
|
51
|
+
assert_equal ret, Output
|
64
52
|
}
|
65
|
-
|
53
|
+
|
66
54
|
10000.times {
|
67
|
-
ret = Xmlhash.parse(
|
68
|
-
assert_equal ret,
|
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
|
-
|
75
|
-
<?xml version='1.0' encoding='UTF-8'?>
|
76
|
-
<directory count="4">
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
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
|
-
|
100
|
+
xml = "<?xml version='1.0' encoding='UTF-8'?><name>Adrian Schröter</name>"
|
100
101
|
|
101
|
-
|
102
|
-
|
102
|
+
ret = Xmlhash.parse(xml)
|
103
|
+
assert_equal ret, "Adrian Schröter"
|
103
104
|
|
104
|
-
|
105
|
-
|
106
|
-
|
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
|
-
|
109
|
+
assert_equal ret.get("value"), "Adrian Schröter"
|
109
110
|
end
|
110
111
|
|
111
112
|
def test_cdata
|
112
|
-
xml =
|
113
|
-
<sourcediff key="7ebf6606bf56a9f952dda73f0d861738">
|
114
|
-
|
115
|
-
|
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
|
-
|
133
|
+
assert_nil ret
|
134
|
+
end
|
135
|
+
|
136
|
+
def test_entities
|
137
|
+
ret = Xmlhash.parse("<ents><text><</text><text>></text></ents>")
|
138
|
+
assert_equal ret, {"text"=>["<", ">"]}
|
133
139
|
end
|
134
140
|
|
135
141
|
def test_utf8
|
136
|
-
|
142
|
+
xml = '<package name="libconfig" project="home:coolo">
|
137
143
|
<title>libconfig – 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>äÓþ</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
|
-
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:
|
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:
|
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: '
|
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: '
|
40
|
+
version: '0'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
|
-
name:
|
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.
|
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.
|
78
|
-
description:
|
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
|
-
|
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
|
-
|
125
|
-
|
126
|
-
|
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
|