faster_xml_simple 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
data/COPYING ADDED
@@ -0,0 +1,18 @@
1
+ Copyright (c) 2006 Michael Koziarski
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
4
+ this software and associated documentation files (the "Software"), to deal in the
5
+ Software without restriction, including without limitation the rights to use,
6
+ copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
7
+ Software, and to permit persons to whom the Software is furnished to do so,
8
+ subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
15
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
16
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
17
+ AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README ADDED
@@ -0,0 +1,8 @@
1
+ FasterXmlSimple
2
+
3
+ FasterXS is intended to be a drop in replacement for the xml input functionality
4
+ from XmlSimple. Instead of using rexml, it uses libxml and the associated ruby
5
+ bindings. This reduces CPU utilisation and memory consumption considerably.
6
+
7
+ Preliminary benchmarks show it between 3 and 10 times as fast, and using a
8
+ fraction of the ram.
@@ -0,0 +1,54 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/testtask'
4
+ require 'rake/rdoctask'
5
+ require 'rake/packagetask'
6
+ require 'rake/gempackagetask'
7
+ require 'lib/faster_xml_simple'
8
+
9
+ task :default => :test
10
+
11
+ Rake::TestTask.new do |test|
12
+ test.pattern = 'test/*_test.rb'
13
+ test.verbose = true
14
+ end
15
+
16
+
17
+ Rake::RDocTask.new do |rdoc|
18
+ rdoc.rdoc_dir = 'doc'
19
+ rdoc.title = "FasterXmlSimple, a libxml based replacement for XmlSimple"
20
+ rdoc.options << '--line-numbers' << '--inline-source'
21
+ rdoc.rdoc_files.include('README')
22
+ rdoc.rdoc_files.include('COPYING')
23
+ rdoc.rdoc_files.include('lib/**/*.rb')
24
+ end
25
+
26
+ namespace :dist do
27
+
28
+ spec = Gem::Specification.new do |s|
29
+ s.name = 'faster_xml_simple'
30
+ s.version = Gem::Version.new(FasterXmlSimple::Version)
31
+ s.summary = "A libxml based replacement for XmlSimple"
32
+ s.description = s.summary
33
+ s.email = 'michael@koziarski.com'
34
+ s.author = 'Michael Koziarski'
35
+ s.has_rdoc = true
36
+ s.extra_rdoc_files = %w(README COPYING)
37
+ s.homepage = 'http://fasterxs.rubyforge.org'
38
+ s.rubyforge_project = 'fasterxs'
39
+ s.files = FileList['Rakefile', 'lib/**/*.rb']
40
+ s.test_files = Dir['test/**/*']
41
+
42
+ s.add_dependency 'libxml-ruby', '>= 0.3.8.4'
43
+ s.rdoc_options = ['--title', "",
44
+ '--main', 'README',
45
+ '--line-numbers', '--inline-source']
46
+ end
47
+ Rake::GemPackageTask.new(spec) do |pkg|
48
+ pkg.need_tar_gz = true
49
+ pkg.package_files.include('{lib,test}/**/*')
50
+ pkg.package_files.include('README')
51
+ pkg.package_files.include('COPYING')
52
+ pkg.package_files.include('Rakefile')
53
+ end
54
+ end
@@ -0,0 +1,187 @@
1
+ #
2
+ # Copyright (c) 2006 Michael Koziarski
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of
5
+ # this software and associated documentation files (the "Software"), to deal in the
6
+ # Software without restriction, including without limitation the rights to use,
7
+ # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
8
+ # Software, and to permit persons to whom the Software is furnished to do so,
9
+ # subject to the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included in all
12
+ # copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
16
+ # FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
17
+ # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
18
+ # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
19
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20
+
21
+ require 'rubygems'
22
+ require 'xml/libxml'
23
+
24
+ class FasterXmlSimple
25
+ Version = '0.5.0'
26
+ class << self
27
+ # Take an string containing XML, and returns a hash representing that
28
+ # XML document. For example:
29
+ #
30
+ # FasterXmlSimple.xml_in("<root><something>1</something></root>")
31
+ # {"root"=>{"something"=>{"__content__"=>"1"}}}
32
+ #
33
+ # Faster XML Simple is designed to be a drop in replacement for the xml_in
34
+ # functionality of http://xml-simple.rubyforge.org
35
+ #
36
+ # The following options are supported:
37
+ #
38
+ # * <tt>contentkey</tt>: The key to use for the content of text elements,
39
+ # defaults to '\_\_content__'
40
+ # * <tt>forcearray</tt>: The list of elements which should always be returned
41
+ # as arrays. Under normal circumstances single element arrays are inlined.
42
+ # * <tt>suppressempty</tt>: The value to return for empty elements, pass +true+
43
+ # to remove empty elements entirely.
44
+ # * <tt>keeproot</tt>: By default the hash returned has a single key with the
45
+ # name of the root element. If the name of the root element isn't
46
+ # interesting to you, pass +false+.
47
+ # * <tt>forcecontent</tt>: By default a text element with no attributes, will
48
+ # be collapsed to just a string instead of a hash with a single key.
49
+ # Pass +true+ to prevent this.
50
+ #
51
+ #
52
+ def xml_in(string, options={})
53
+ new(string, options).out
54
+ end
55
+ end
56
+
57
+ def initialize(string, options) #:nodoc:
58
+ @doc = parse(string)
59
+ @options = default_options.merge options
60
+ end
61
+
62
+ def out #:nodoc:
63
+ if @options['keeproot']
64
+ {@doc.root.name => collapse(@doc.root)}
65
+ else
66
+ collapse(@doc.root)
67
+ end
68
+ end
69
+
70
+ private
71
+ def default_options
72
+ {'contentkey' => '__content__', 'forcearray' => [], 'keeproot'=>true}
73
+ end
74
+
75
+ def collapse(element)
76
+ result = hash_of_attributes(element)
77
+ if text_node? element
78
+ text = collapse_text(element)
79
+ result[content_key] = text if text =~ /\S/
80
+ elsif element.children?
81
+ element.inject(result) do |hash, child|
82
+ unless child.text?
83
+ child_result = collapse(child)
84
+ (hash[child.name] ||= []) << child_result
85
+ end
86
+ hash
87
+ end
88
+ end
89
+ if result.empty?
90
+ return empty_element
91
+ end
92
+ # Compact them to ensure it complies with the user's requests
93
+ inline_single_element_arrays(result)
94
+ remove_empty_elements(result) if suppress_empty?
95
+ if content_only?(result) && !force_content?
96
+ result[content_key]
97
+ else
98
+ result
99
+ end
100
+ end
101
+
102
+ def content_only?(result)
103
+ result.keys == [content_key]
104
+ end
105
+
106
+ def content_key
107
+ @options['contentkey']
108
+ end
109
+
110
+ def force_array?(key_name)
111
+ Array(@options['forcearray']).include?(key_name)
112
+ end
113
+
114
+ def inline_single_element_arrays(result)
115
+ result.each do |key, value|
116
+ if value.size == 1 && value.is_a?(Array) && !force_array?(key)
117
+ result[key] = value.first
118
+ end
119
+ end
120
+ end
121
+
122
+ def remove_empty_elements(result)
123
+ result.each do |key, value|
124
+ if value == empty_element
125
+ result.delete key
126
+ end
127
+ end
128
+ end
129
+
130
+ def suppress_empty?
131
+ @options['suppressempty'] == true
132
+ end
133
+
134
+ def empty_element
135
+ if !@options.has_key? 'suppressempty'
136
+ {}
137
+ else
138
+ @options['suppressempty']
139
+ end
140
+ end
141
+
142
+ # removes the content if it's nothing but blanks, prevents
143
+ # the hash being polluted with lots of content like "\n\t\t\t"
144
+ def suppress_empty_content(result)
145
+ result.delete content_key if result[content_key] !~ /\S/
146
+ end
147
+
148
+ def force_content?
149
+ @options['forcecontent']
150
+ end
151
+
152
+ # a text node is one with 1 or more child nodes which are
153
+ # text nodes, and no non-text children, there's no sensible
154
+ # way to support nodes which are text and markup like:
155
+ # <p>Something <b>Bold</b> </p>
156
+ def text_node?(element)
157
+ !element.text? && element.all? {|c| c.text?}
158
+ end
159
+
160
+ # takes a text node, and collapses it into a string
161
+ def collapse_text(element)
162
+ element.map {|c| c.content } * ''
163
+ end
164
+
165
+ def hash_of_attributes(element)
166
+ result = {}
167
+ element.each_attr do |attribute|
168
+ name = attribute.name
169
+ name = [attribute.ns, attribute.name].join(':') if attribute.ns?
170
+ result[name] = attribute.value
171
+ end
172
+ result
173
+ end
174
+
175
+ def parse(string)
176
+ if string == ''
177
+ string = ' '
178
+ end
179
+ XML::Parser.string(string).parse
180
+ end
181
+ end
182
+
183
+ class XmlSimple # :nodoc:
184
+ def self.xml_in(*args)
185
+ FasterXmlSimple.xml_in *args
186
+ end
187
+ end
@@ -0,0 +1,4 @@
1
+ ---
2
+ something:
3
+ something-else:
4
+ __content__: testing
@@ -0,0 +1,3 @@
1
+ <something>
2
+ <something-else>testing</something-else>
3
+ </something>
@@ -0,0 +1,4 @@
1
+ ---
2
+ something:
3
+ something-else:
4
+ - __content__: testing
@@ -0,0 +1,6 @@
1
+ ---
2
+ something:
3
+ something-else:
4
+ __content__: testing
5
+ child_attribute: "15"
6
+ root_attribute: "12"
@@ -0,0 +1,3 @@
1
+ <something root_attribute="12">
2
+ <something-else child_attribute="15">testing</something-else>
3
+ </something>
@@ -0,0 +1,6 @@
1
+ ---
2
+ something:
3
+ something-else:
4
+ - __content__: testing
5
+ child_attribute: "15"
6
+ root_attribute: "12"
@@ -0,0 +1,6 @@
1
+ ---
2
+ something:
3
+ something-else:
4
+ __content__: "\n\
5
+ \t\ttesting\n\
6
+ \t"
@@ -0,0 +1,5 @@
1
+ <something>
2
+ <something-else>
3
+ testing
4
+ </something-else>
5
+ </something>
@@ -0,0 +1,6 @@
1
+ ---
2
+ something:
3
+ something-else:
4
+ - __content__: "\n\
5
+ \t\ttesting\n\
6
+ \t"
@@ -0,0 +1,5 @@
1
+ ---
2
+ something:
3
+ something-else:
4
+ another_child:
5
+ attribute: "4"
@@ -0,0 +1,7 @@
1
+ <something>
2
+ <something-else>
3
+ testing
4
+ <another_child attribute='4' />
5
+ testing
6
+ </something-else>
7
+ </something>
@@ -0,0 +1,5 @@
1
+ ---
2
+ something:
3
+ something-else:
4
+ - another_child:
5
+ attribute: "4"
@@ -0,0 +1,8 @@
1
+ ---
2
+ something:
3
+ something-else:
4
+ - __content__: testing
5
+ - __content__: testing
6
+ - __content__: testing
7
+ - __content__: testing
8
+ - __content__: testing
@@ -0,0 +1,7 @@
1
+ <something>
2
+ <something-else>testing</something-else>
3
+ <something-else>testing</something-else>
4
+ <something-else>testing</something-else>
5
+ <something-else>testing</something-else>
6
+ <something-else>testing</something-else>
7
+ </something>
@@ -0,0 +1,8 @@
1
+ ---
2
+ something:
3
+ something-else:
4
+ - __content__: testing
5
+ - __content__: testing
6
+ - __content__: testing
7
+ - __content__: testing
8
+ - __content__: testing
@@ -0,0 +1,43 @@
1
+ ---
2
+ ListBucketResult:
3
+ Prefix: {}
4
+
5
+ Name:
6
+ __content__: projectionist
7
+ MaxKeys:
8
+ __content__: "1000"
9
+ Contents:
10
+ - StorageClass:
11
+ __content__: STANDARD
12
+ Owner:
13
+ DisplayName:
14
+ __content__: noradio
15
+ ID:
16
+ __content__: bb2041a25975c3d4ce9775fe9e93e5b77a6a9fad97dc7e00686191f3790b13f1
17
+ Size:
18
+ __content__: "186870"
19
+ ETag:
20
+ __content__: "\"2ac1aa042e20ab7e1a9879b0df9f17b7\""
21
+ LastModified:
22
+ __content__: "2006-11-15T05:49:39.000Z"
23
+ Key:
24
+ __content__: 1973-plymouth-satellite-sebring.jpg
25
+ - StorageClass:
26
+ __content__: STANDARD
27
+ Owner:
28
+ DisplayName:
29
+ __content__: noradio
30
+ ID:
31
+ __content__: bb2041a25975c3d4ce9775fe9e93e5b77a6a9fad97dc7e00686191f3790b13f1
32
+ Size:
33
+ __content__: "43562"
34
+ ETag:
35
+ __content__: "\"4ead118ba91491f9c9697153264a1943\""
36
+ LastModified:
37
+ __content__: "2006-11-15T05:51:20.000Z"
38
+ Key:
39
+ __content__: 37-cluster.jpg
40
+ Marker: {}
41
+
42
+ IsTruncated:
43
+ __content__: "false"
@@ -0,0 +1,29 @@
1
+ <ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
2
+ <Name>projectionist</Name>
3
+ <Prefix/>
4
+ <Marker/>
5
+ <MaxKeys>1000</MaxKeys>
6
+ <IsTruncated>false</IsTruncated>
7
+ <Contents>
8
+ <Key>1973-plymouth-satellite-sebring.jpg</Key>
9
+ <LastModified>2006-11-15T05:49:39.000Z</LastModified>
10
+ <ETag>"2ac1aa042e20ab7e1a9879b0df9f17b7"</ETag>
11
+ <Size>186870</Size>
12
+ <Owner>
13
+ <ID>bb2041a25975c3d4ce9775fe9e93e5b77a6a9fad97dc7e00686191f3790b13f1</ID>
14
+ <DisplayName>noradio</DisplayName>
15
+ </Owner>
16
+ <StorageClass>STANDARD</StorageClass>
17
+ </Contents>
18
+ <Contents>
19
+ <Key>37-cluster.jpg</Key>
20
+ <LastModified>2006-11-15T05:51:20.000Z</LastModified>
21
+ <ETag>"4ead118ba91491f9c9697153264a1943"</ETag>
22
+ <Size>43562</Size>
23
+ <Owner>
24
+ <ID>bb2041a25975c3d4ce9775fe9e93e5b77a6a9fad97dc7e00686191f3790b13f1</ID>
25
+ <DisplayName>noradio</DisplayName>
26
+ </Owner>
27
+ <StorageClass>STANDARD</StorageClass>
28
+ </Contents>
29
+ </ListBucketResult>
@@ -0,0 +1,41 @@
1
+ ---
2
+ ListBucketResult:
3
+ Prefix:
4
+ Name:
5
+ __content__: projectionist
6
+ MaxKeys:
7
+ __content__: "1000"
8
+ Contents:
9
+ - StorageClass:
10
+ __content__: STANDARD
11
+ Owner:
12
+ DisplayName:
13
+ __content__: noradio
14
+ ID:
15
+ __content__: bb2041a25975c3d4ce9775fe9e93e5b77a6a9fad97dc7e00686191f3790b13f1
16
+ Size:
17
+ __content__: "186870"
18
+ ETag:
19
+ __content__: "\"2ac1aa042e20ab7e1a9879b0df9f17b7\""
20
+ LastModified:
21
+ __content__: "2006-11-15T05:49:39.000Z"
22
+ Key:
23
+ __content__: 1973-plymouth-satellite-sebring.jpg
24
+ - StorageClass:
25
+ __content__: STANDARD
26
+ Owner:
27
+ DisplayName:
28
+ __content__: noradio
29
+ ID:
30
+ __content__: bb2041a25975c3d4ce9775fe9e93e5b77a6a9fad97dc7e00686191f3790b13f1
31
+ Size:
32
+ __content__: "43562"
33
+ ETag:
34
+ __content__: "\"4ead118ba91491f9c9697153264a1943\""
35
+ LastModified:
36
+ __content__: "2006-11-15T05:51:20.000Z"
37
+ Key:
38
+ __content__: 37-cluster.jpg
39
+ Marker:
40
+ IsTruncated:
41
+ __content__: "false"
@@ -0,0 +1,23 @@
1
+ ---
2
+ AccessControlPolicy:
3
+ AccessControlList:
4
+ Grant:
5
+ - Permission:
6
+ __content__: FULL_CONTROL
7
+ Grantee:
8
+ DisplayName:
9
+ __content__: noradio
10
+ ID:
11
+ __content__: bb2041a25975c3d4ce9775fe9e93e5b77a6a9fad97dc7e00686191f3790b13f1
12
+ xsi:type: CanonicalUser
13
+ - Permission:
14
+ __content__: READ
15
+ Grantee:
16
+ URI:
17
+ __content__: http://acs.amazonaws.com/groups/global/AllUsers
18
+ xsi:type: Group
19
+ Owner:
20
+ DisplayName:
21
+ __content__: noradio
22
+ ID:
23
+ __content__: bb2041a25975c3d4ce9775fe9e93e5b77a6a9fad97dc7e00686191f3790b13f1
@@ -0,0 +1,22 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <AccessControlPolicy xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
3
+ <Owner>
4
+ <ID>bb2041a25975c3d4ce9775fe9e93e5b77a6a9fad97dc7e00686191f3790b13f1</ID>
5
+ <DisplayName>noradio</DisplayName>
6
+ </Owner>
7
+ <AccessControlList>
8
+ <Grant>
9
+ <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
10
+ <ID>bb2041a25975c3d4ce9775fe9e93e5b77a6a9fad97dc7e00686191f3790b13f1</ID>
11
+ <DisplayName>noradio</DisplayName>
12
+ </Grantee>
13
+ <Permission>FULL_CONTROL</Permission>
14
+ </Grant>
15
+ <Grant>
16
+ <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group">
17
+ <URI>http://acs.amazonaws.com/groups/global/AllUsers</URI>
18
+ </Grantee>
19
+ <Permission>READ</Permission>
20
+ </Grant>
21
+ </AccessControlList>
22
+ </AccessControlPolicy>
@@ -0,0 +1,22 @@
1
+ AccessControlPolicy:
2
+ Owner:
3
+ DisplayName:
4
+ __content__: noradio
5
+ ID:
6
+ __content__: bb2041a25975c3d4ce9775fe9e93e5b77a6a9fad97dc7e00686191f3790b13f1
7
+ AccessControlList:
8
+ Grant:
9
+ - Permission:
10
+ __content__: FULL_CONTROL
11
+ Grantee:
12
+ DisplayName:
13
+ __content__: noradio
14
+ ID:
15
+ __content__: bb2041a25975c3d4ce9775fe9e93e5b77a6a9fad97dc7e00686191f3790b13f1
16
+ xsi:type: CanonicalUser
17
+ - Permission:
18
+ __content__: READ
19
+ Grantee:
20
+ URI:
21
+ __content__: http://acs.amazonaws.com/groups/global/AllUsers
22
+ xsi:type: Group
@@ -0,0 +1,14 @@
1
+ ---
2
+ topic:
3
+ parent-id: {}
4
+
5
+ title: {}
6
+
7
+ approved:
8
+ type: boolean
9
+ id:
10
+ type: integer
11
+ viewed-at:
12
+ type: datetime
13
+ written-on:
14
+ type: date
@@ -0,0 +1,8 @@
1
+ <topic>
2
+ <title></title>
3
+ <id type="integer"></id>
4
+ <approved type="boolean"></approved>
5
+ <written-on type="date"></written-on>
6
+ <viewed-at type="datetime"></viewed-at>
7
+ <parent-id></parent-id>
8
+ </topic>
@@ -0,0 +1,11 @@
1
+ topic:
2
+ title:
3
+ id:
4
+ type: integer
5
+ approved:
6
+ type: boolean
7
+ parent-id:
8
+ viewed-at:
9
+ type: datetime
10
+ written-on:
11
+ type: date
@@ -0,0 +1,47 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class RegressionTest < FasterXSTest
4
+ def test_content_nil_regressions
5
+ expected = {"asdf"=>{"jklsemicolon"=>{}}}
6
+ assert_equal expected, FasterXmlSimple.xml_in("<asdf><jklsemicolon /></asdf>")
7
+ assert_equal expected, FasterXmlSimple.xml_in("<asdf><jklsemicolon /></asdf>", 'forcearray'=>['asdf'])
8
+ end
9
+
10
+ def test_s3_regression
11
+ str = File.read("test/fixtures/test-7.xml")
12
+ assert_nil FasterXmlSimple.xml_in(str)["AccessControlPolicy"]["AccessControlList"]["__content__"]
13
+ end
14
+
15
+ def test_xml_simple_transparency
16
+ assert_equal XmlSimple.xml_in("<asdf />"), FasterXmlSimple.xml_in("<asdf />")
17
+ end
18
+
19
+ def test_suppress_empty_variations
20
+ str = "<asdf><fdsa /></asdf>"
21
+
22
+ assert_equal Hash.new, FasterXmlSimple.xml_in(str)["asdf"]["fdsa"]
23
+ assert_nil FasterXmlSimple.xml_in(str, 'suppressempty'=>nil)["asdf"]["fdsa"]
24
+ assert_equal '', FasterXmlSimple.xml_in(str, 'suppressempty'=>'')["asdf"]["fdsa"]
25
+ assert !FasterXmlSimple.xml_in(str, 'suppressempty'=>true)["asdf"].has_key?("fdsa")
26
+ end
27
+
28
+ def test_empty_string_doesnt_crash
29
+ assert_raise(XML::Parser::ParseError) do
30
+ silence_stderr do
31
+ FasterXmlSimple.xml_in('')
32
+ end
33
+ end
34
+ end
35
+
36
+ def test_keeproot_false
37
+ str = "<asdf><fdsa>1</fdsa></asdf>"
38
+ expected = {"fdsa"=>"1"}
39
+ assert_equal expected, FasterXmlSimple.xml_in(str, 'keeproot'=>false)
40
+ end
41
+
42
+ def test_keeproot_false_with_force_content
43
+ str = "<asdf><fdsa>1</fdsa></asdf>"
44
+ expected = {"fdsa"=>{"__content__"=>"1"}}
45
+ assert_equal expected, FasterXmlSimple.xml_in(str, 'keeproot'=>false, 'forcecontent'=>true)
46
+ end
47
+ end
@@ -0,0 +1,17 @@
1
+
2
+ require 'test/unit'
3
+ require 'faster_xml_simple'
4
+
5
+ class FasterXSTest < Test::Unit::TestCase
6
+ def default_test
7
+ end
8
+
9
+ def silence_stderr
10
+ str = STDERR.dup
11
+ STDERR.reopen("/dev/null")
12
+ STDERR.sync=true
13
+ yield
14
+ ensure
15
+ STDERR.reopen(str)
16
+ end
17
+ end
@@ -0,0 +1,46 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+ require 'yaml'
3
+
4
+ class XmlSimpleComparisonTest < FasterXSTest
5
+
6
+ # Define test methods
7
+
8
+ Dir["test/fixtures/test-*.xml"].each do |file_name|
9
+ xml_file_name = file_name
10
+ method_name = File.basename(file_name, ".xml").gsub('-', '_')
11
+ yml_file_name = file_name.gsub('xml', 'yml')
12
+ rails_yml_file_name = file_name.gsub('xml', 'rails.yml')
13
+ class_eval <<-EOV, __FILE__, __LINE__
14
+ def #{method_name}
15
+ assert_equal YAML.load(File.read('#{yml_file_name}')),
16
+ FasterXmlSimple.xml_in(File.read('#{xml_file_name}'), default_options )
17
+ end
18
+
19
+ def #{method_name}_rails
20
+ assert_equal YAML.load(File.read('#{rails_yml_file_name}')),
21
+ FasterXmlSimple.xml_in(File.read('#{xml_file_name}'), rails_options)
22
+ end
23
+ EOV
24
+ end
25
+
26
+ def default_options
27
+ {
28
+ 'keeproot' => true,
29
+ 'contentkey' => '__content__',
30
+ 'forcecontent' => true,
31
+ 'suppressempty' => nil,
32
+ 'forcearray' => ['something-else']
33
+ }
34
+ end
35
+
36
+ def rails_options
37
+ {
38
+ 'forcearray' => false,
39
+ 'forcecontent' => true,
40
+ 'keeproot' => true,
41
+ 'contentkey' => '__content__'
42
+ }
43
+ end
44
+
45
+
46
+ end
metadata ADDED
@@ -0,0 +1,90 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.9.0
3
+ specification_version: 1
4
+ name: faster_xml_simple
5
+ version: !ruby/object:Gem::Version
6
+ version: 0.5.0
7
+ date: 2006-12-24 00:00:00 +13:00
8
+ summary: A libxml based replacement for XmlSimple
9
+ require_paths:
10
+ - lib
11
+ email: michael@koziarski.com
12
+ homepage: http://fasterxs.rubyforge.org
13
+ rubyforge_project: fasterxs
14
+ description: A libxml based replacement for XmlSimple
15
+ autorequire:
16
+ default_executable:
17
+ bindir: bin
18
+ has_rdoc: true
19
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
+ requirements:
21
+ - - ">"
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.0
24
+ version:
25
+ platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ post_install_message:
29
+ authors:
30
+ - Michael Koziarski
31
+ files:
32
+ - Rakefile
33
+ - lib/faster_xml_simple.rb
34
+ - README
35
+ - COPYING
36
+ test_files:
37
+ - test/fixtures
38
+ - test/regression_test.rb
39
+ - test/test_helper.rb
40
+ - test/xml_simple_comparison_test.rb
41
+ - test/fixtures/test-1.rails.yml
42
+ - test/fixtures/test-1.xml
43
+ - test/fixtures/test-1.yml
44
+ - test/fixtures/test-2.rails.yml
45
+ - test/fixtures/test-2.xml
46
+ - test/fixtures/test-2.yml
47
+ - test/fixtures/test-3.rails.yml
48
+ - test/fixtures/test-3.xml
49
+ - test/fixtures/test-3.yml
50
+ - test/fixtures/test-4.rails.yml
51
+ - test/fixtures/test-4.xml
52
+ - test/fixtures/test-4.yml
53
+ - test/fixtures/test-5.rails.yml
54
+ - test/fixtures/test-5.xml
55
+ - test/fixtures/test-5.yml
56
+ - test/fixtures/test-6.rails.yml
57
+ - test/fixtures/test-6.xml
58
+ - test/fixtures/test-6.yml
59
+ - test/fixtures/test-7.rails.yml
60
+ - test/fixtures/test-7.xml
61
+ - test/fixtures/test-7.yml
62
+ - test/fixtures/test-8.rails.yml
63
+ - test/fixtures/test-8.xml
64
+ - test/fixtures/test-8.yml
65
+ rdoc_options:
66
+ - --title
67
+ - ""
68
+ - --main
69
+ - README
70
+ - --line-numbers
71
+ - --inline-source
72
+ extra_rdoc_files:
73
+ - README
74
+ - COPYING
75
+ executables: []
76
+
77
+ extensions: []
78
+
79
+ requirements: []
80
+
81
+ dependencies:
82
+ - !ruby/object:Gem::Dependency
83
+ name: libxml-ruby
84
+ version_requirement:
85
+ version_requirements: !ruby/object:Gem::Version::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: 0.3.8.4
90
+ version: