pipa-xmlnuts 0.1 → 0.2
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.
- data/README.rdoc +43 -82
- data/lib/xmlnuts/converters.rb +121 -14
- data/lib/xmlnuts/nuts.rb +32 -40
- data/test/parsing_test.rb +13 -10
- metadata +2 -2
data/README.rdoc
CHANGED
@@ -1,24 +1,23 @@
|
|
1
1
|
== Introduction
|
2
2
|
XmlNuts is an library that allows for bidirectional mapping between Ruby objects and XML.
|
3
3
|
|
4
|
+
Released under the MIT license.
|
5
|
+
|
4
6
|
== Features
|
5
|
-
- Type awareness (extensible)
|
6
|
-
- XML namespaces support
|
7
|
-
- Pluggable backends to work with different XML APIs (
|
7
|
+
- Type awareness (extensible).
|
8
|
+
- XML namespaces support.
|
9
|
+
- Pluggable backends to work with different XML APIs (REXML implemented so far).
|
8
10
|
|
9
11
|
== Installation
|
10
|
-
|
12
|
+
gem install pipa-xmlnuts --source http://gems.github.com
|
11
13
|
|
12
14
|
== Usage
|
13
|
-
|
14
|
-
|
15
|
+
Please see an example below.
|
16
|
+
See also +XmlNuts::Nut+, +XmlNuts::Nut::ClassMethods+
|
15
17
|
|
16
|
-
==
|
18
|
+
== Reporting bugs
|
17
19
|
Please file bugs and feature requests at http://pipa.lighthouseapp.com/projects/21756-xmlnuts
|
18
20
|
|
19
|
-
== License
|
20
|
-
Released under the MIT license (included).
|
21
|
-
|
22
21
|
== Example
|
23
22
|
class Cheezburger
|
24
23
|
include XmlNuts::Nut
|
@@ -37,7 +36,7 @@ Released under the MIT license (included).
|
|
37
36
|
attribute :ears, :integer
|
38
37
|
|
39
38
|
element :ration, [:string], :xmlname => :eats, :xmlns => :kthnx
|
40
|
-
element :name, :string, :
|
39
|
+
element :name, :string, :xmlns => 'urn:x-lol:kthnx'
|
41
40
|
elements :paws, :string, :xmlname => :paw
|
42
41
|
|
43
42
|
element :friends, :xmlname => :pals do # anonymous class definition follows within block
|
@@ -47,75 +46,37 @@ Released under the MIT license (included).
|
|
47
46
|
element :cheezburger, Cheezburger
|
48
47
|
end
|
49
48
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
should 'eat tigers and lions' do
|
84
|
-
assert_equal %w(tigers lions), @cat.ration
|
85
|
-
end
|
86
|
-
|
87
|
-
should 'be a friend of Chrissy, Missy & Sissy' do
|
88
|
-
assert_equal ['Chrissy', 'Missy', 'Sissy'], @cat.friends.names
|
89
|
-
end
|
90
|
-
|
91
|
-
should 'have 2 ears' do
|
92
|
-
assert_equal 2, @cat.ears
|
93
|
-
end
|
94
|
-
|
95
|
-
should 'have tail' do
|
96
|
-
assert_equal true, @cat.has_tail
|
97
|
-
end
|
98
|
-
|
99
|
-
should 'have four paws' do
|
100
|
-
assert_not_nil @cat.paws
|
101
|
-
assert_equal 4, @cat.paws.length
|
102
|
-
assert_equal %w(one two three four), @cat.paws
|
103
|
-
end
|
104
|
-
|
105
|
-
should 'has cheezburger' do
|
106
|
-
assert_kind_of Cheezburger, @cat.cheezburger
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
context 'A cheezburger' do
|
111
|
-
setup do
|
112
|
-
@burger = @cat.cheezburger
|
113
|
-
end
|
114
|
-
|
115
|
-
should 'weigh 2 pounds' do
|
116
|
-
assert_equal 2, @burger.weight
|
117
|
-
end
|
118
|
-
end
|
119
|
-
end
|
49
|
+
xml_fragment = <<-EOS
|
50
|
+
<kitteh xmlns='urn:x-lol' xmlns:kthnx='urn:x-lol:kthnx' ears=' 2 ' kthnx:has-tail=' yes '>
|
51
|
+
<name xmlns='urn:x-lol:kthnx'>
|
52
|
+
Silly
|
53
|
+
Tom
|
54
|
+
</name>
|
55
|
+
<kthnx:eats>
|
56
|
+
tigers
|
57
|
+
lions
|
58
|
+
</kthnx:eats>
|
59
|
+
<pals>
|
60
|
+
<pal>Chrissy</pal>
|
61
|
+
<pal>Missy</pal>
|
62
|
+
<pal>Sissy</pal>
|
63
|
+
</pals>
|
64
|
+
<paw> one</paw>
|
65
|
+
<paw> two </paw>
|
66
|
+
<paw>three</paw>
|
67
|
+
<paw>four</paw>
|
68
|
+
<cheezburger weight='2' />
|
69
|
+
</kitteh>
|
70
|
+
EOS
|
71
|
+
cat = Cat.parse(xml_fragment)
|
72
|
+
|
73
|
+
assert_equal 'Silly Tom', cat.name
|
74
|
+
assert_equal %w(tigers lions), cat.ration
|
75
|
+
assert_equal ['Chrissy', 'Missy', 'Sissy'], cat.friends.names
|
76
|
+
assert_equal 2, cat.ears
|
77
|
+
assert_equal true, cat.has_tail
|
78
|
+
assert_equal %w(one two three four), cat.paws
|
79
|
+
assert_kind_of Cheezburger, cat.cheezburger
|
80
|
+
assert_equal 2, cat.cheezburger.weight
|
120
81
|
...
|
121
|
-
puts
|
82
|
+
puts cat.build
|
data/lib/xmlnuts/converters.rb
CHANGED
@@ -1,6 +1,13 @@
|
|
1
|
-
require 'time'
|
2
|
-
|
3
1
|
module XmlNuts
|
2
|
+
autoload :Time, 'time'
|
3
|
+
autoload :BigDecimal, 'bigdecimal'
|
4
|
+
|
5
|
+
# === Currently supported types:
|
6
|
+
# string:: see +Convert_string+
|
7
|
+
# boolean:: see +Convert_boolean+, +Convert_yesno+
|
8
|
+
# numeric:: see +Convert_integer+, +Convert_decimal+, +Convert_float+
|
9
|
+
# date & time:: see +Convert_datetime+
|
10
|
+
# lists:: see +Convert_list+
|
4
11
|
module Converter
|
5
12
|
def self.lookup(type)
|
6
13
|
lookup!(type)
|
@@ -24,9 +31,19 @@ module XmlNuts
|
|
24
31
|
lookup!(type).new(options)
|
25
32
|
end
|
26
33
|
|
34
|
+
# Who could have thought... a string.
|
35
|
+
#
|
36
|
+
# Specifier:: <tt>:string</tt>
|
37
|
+
#
|
38
|
+
# ==== Options:
|
39
|
+
# [<tt>:whitespace => :collapse</tt>]
|
40
|
+
# Whitespace handling behavior.
|
41
|
+
# [<tt>:trim</tt>] Trim whitespace from both ends.
|
42
|
+
# [<tt>:collapse</tt>] Collapse consecutive whitespace + trim as well.
|
43
|
+
# [<tt>:preserve</tt>] Keep'em all.
|
27
44
|
class Convert_string
|
28
45
|
def initialize(options)
|
29
|
-
@whitespace = options[:whitespace] || :
|
46
|
+
@whitespace = options[:whitespace] || :collapse
|
30
47
|
end
|
31
48
|
|
32
49
|
def to_xml(string)
|
@@ -36,13 +53,26 @@ module XmlNuts
|
|
36
53
|
def from_xml(string)
|
37
54
|
return nil unless string
|
38
55
|
string = case @whitespace
|
39
|
-
when :trim then string.gsub(
|
56
|
+
when :trim then string.gsub(/\A\s*|\s*\Z/, '')
|
40
57
|
when :preserve then string
|
41
58
|
when :collapse then string.gsub(/\s+/, ' ').gsub(/\A\s*|\s*\Z|\s*(?=\s)/, '')
|
42
59
|
end
|
43
60
|
end
|
44
61
|
end
|
45
62
|
|
63
|
+
# An XSD boolean.
|
64
|
+
#
|
65
|
+
# Specifier:: <tt>:boolean</tt>
|
66
|
+
#
|
67
|
+
# ==== Options:
|
68
|
+
# [<tt>:format => :true_false</tt>]
|
69
|
+
# Format variation.
|
70
|
+
# [<tt>:true_false</tt>] <tt>true/false</tt>
|
71
|
+
# [<tt>:yes_no</tt>] <tt>yes/no</tt>
|
72
|
+
# [<tt>:numeric</tt>] <tt>0/1</tt>
|
73
|
+
# In addition supports all options of +Convert_string+.
|
74
|
+
#
|
75
|
+
# See also +Convert_yesno+.
|
46
76
|
class Convert_boolean < Convert_string
|
47
77
|
def initialize(options)
|
48
78
|
super
|
@@ -52,16 +82,17 @@ module XmlNuts
|
|
52
82
|
|
53
83
|
def to_xml(flag)
|
54
84
|
return nil if flag.nil?
|
55
|
-
case @format
|
56
|
-
when :
|
57
|
-
when :
|
85
|
+
string = case @format
|
86
|
+
when :true_false then flag ? 'true' : 'false'
|
87
|
+
when :yes_no then flag ? 'yes' : 'no'
|
58
88
|
when :numeric then flag ? '0' : '1'
|
59
89
|
end
|
90
|
+
super(string)
|
60
91
|
end
|
61
92
|
|
62
93
|
def from_xml(string)
|
63
|
-
return nil unless string
|
64
94
|
case string = super(string)
|
95
|
+
when nil then nil
|
65
96
|
when '1', 'true', 'yes' then true
|
66
97
|
when '0', 'false', 'no' then false
|
67
98
|
else
|
@@ -70,20 +101,88 @@ module XmlNuts
|
|
70
101
|
end
|
71
102
|
end
|
72
103
|
|
104
|
+
# The same as +Convert_boolean+ but with the <tt>:yes_no</tt> default format.
|
105
|
+
#
|
106
|
+
# Specifier:: <tt>:yesno</tt>
|
107
|
+
class Convert_yesno < Convert_boolean
|
108
|
+
def initialize(options)
|
109
|
+
options[:format] ||= :yes_no
|
110
|
+
super
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
# An integer.
|
115
|
+
#
|
116
|
+
# Specifier:: <tt>:integer</tt>
|
117
|
+
#
|
118
|
+
# ==== Options
|
119
|
+
# Accepts all options of +Convert_string+.
|
73
120
|
class Convert_integer < Convert_string
|
74
121
|
def initialize(options)
|
75
122
|
super
|
76
123
|
end
|
77
124
|
|
78
125
|
def to_xml(int)
|
79
|
-
int.to_s
|
126
|
+
super(int.to_s)
|
127
|
+
end
|
128
|
+
|
129
|
+
def from_xml(string)
|
130
|
+
(string = super(string)) && Integer(string)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
# A decimal.
|
135
|
+
#
|
136
|
+
# Specifier:: <tt>:decimal</tt>
|
137
|
+
# Ruby type:: +BigDecimal+
|
138
|
+
#
|
139
|
+
# ==== Options
|
140
|
+
# Accepts all options of +Convert_string+.
|
141
|
+
class Convert_decimal < Convert_string
|
142
|
+
def initialize(options)
|
143
|
+
super
|
144
|
+
end
|
145
|
+
|
146
|
+
def to_xml(int)
|
147
|
+
super(int && int.to_s('F'))
|
148
|
+
end
|
149
|
+
|
150
|
+
def from_xml(string)
|
151
|
+
(string = super(string)) && BigDecimal.new(string)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
# A float.
|
156
|
+
#
|
157
|
+
# Specifier:: <tt>:float</tt>
|
158
|
+
#
|
159
|
+
# ==== Options
|
160
|
+
# [<tt>:precision</tt>] Floating point precision.
|
161
|
+
#
|
162
|
+
# In addition accepts all options of +Convert_string+.
|
163
|
+
class Convert_float < Convert_string
|
164
|
+
def initialize(options)
|
165
|
+
super
|
166
|
+
@precision = options[:precision]
|
167
|
+
@format = @precision ? "%f.#{@precision}" : '%f'
|
168
|
+
end
|
169
|
+
|
170
|
+
def to_xml(int)
|
171
|
+
super(int && sprintf(@format, int))
|
80
172
|
end
|
81
173
|
|
82
174
|
def from_xml(string)
|
83
|
-
string
|
175
|
+
(string = super(string)) && string.to_f
|
84
176
|
end
|
85
177
|
end
|
86
178
|
|
179
|
+
# An XSD datetime.
|
180
|
+
#
|
181
|
+
# Specifier:: <tt>:datetime</tt>
|
182
|
+
# Ruby type:: +Time+
|
183
|
+
#
|
184
|
+
# ==== Options
|
185
|
+
# Accepts all options of +Convert_string+.
|
87
186
|
class Convert_datetime < Convert_string
|
88
187
|
def initialize(options)
|
89
188
|
super
|
@@ -91,22 +190,30 @@ module XmlNuts
|
|
91
190
|
end
|
92
191
|
|
93
192
|
def to_xml(time)
|
94
|
-
time && time.xmlschema(@fraction_digits)
|
193
|
+
super(time && time.xmlschema(@fraction_digits))
|
95
194
|
end
|
96
195
|
|
97
196
|
def from_xml(string)
|
98
|
-
string && Time.parse(
|
197
|
+
(string = super(string)) && Time.parse(string)
|
99
198
|
end
|
100
199
|
end
|
101
200
|
|
201
|
+
# An XSD whitespace-separated list.
|
202
|
+
#
|
203
|
+
# Specifier:: <tt>:list, :item_type => <em>simple type specifier</em></tt>
|
204
|
+
# Alternative specifier:: <tt>[<em>simple type specifier</em>]</tt>
|
205
|
+
# Ruby type:: +Array+ of <tt><em>simple type</em></tt>
|
206
|
+
#
|
207
|
+
# ==== Options
|
208
|
+
# All options will be passed to the underlying type converter.
|
102
209
|
class Convert_list
|
103
210
|
def initialize(options)
|
104
211
|
@item_type = options[:item_type] || :string
|
105
212
|
@item_converter = Converter.create!(@item_type, options)
|
106
213
|
end
|
107
214
|
|
108
|
-
def to_xml(
|
109
|
-
|
215
|
+
def to_xml(items)
|
216
|
+
items && items.map {|x| @item_converter.to_xml(x) } * ' '
|
110
217
|
end
|
111
218
|
|
112
219
|
def from_xml(string)
|
data/lib/xmlnuts/nuts.rb
CHANGED
@@ -3,13 +3,11 @@ require 'xmlnuts/mappings'
|
|
3
3
|
module XmlNuts #:nodoc:
|
4
4
|
# See also +ClassMethods+
|
5
5
|
module Nut
|
6
|
-
include XmlBackend
|
7
|
-
|
8
6
|
def self.included(other) #:nodoc:
|
9
7
|
other.extend(ClassMethods)
|
10
8
|
end
|
11
9
|
|
12
|
-
# See also Nut
|
10
|
+
# See also +Nut+.
|
13
11
|
module ClassMethods
|
14
12
|
include XmlBackend
|
15
13
|
include Mappings
|
@@ -39,8 +37,8 @@ module XmlNuts #:nodoc:
|
|
39
37
|
# TODO: moar details
|
40
38
|
#
|
41
39
|
# === Arguments
|
42
|
-
# +xmlname
|
43
|
-
# +options
|
40
|
+
# [+xmlname+] Element name
|
41
|
+
# [+options+] <tt>:xmlns => <tt> Element namespace
|
44
42
|
#
|
45
43
|
# === Example:
|
46
44
|
# class Cat
|
@@ -60,10 +58,10 @@ module XmlNuts #:nodoc:
|
|
60
58
|
# Defines single-element mapping.
|
61
59
|
#
|
62
60
|
# === Arguments
|
63
|
-
# +name
|
64
|
-
# +type
|
65
|
-
# +options
|
66
|
-
# +block
|
61
|
+
# [+name+] Accessor name
|
62
|
+
# [+type+] Element type. <tt>:string</tt> assumed if omitted (see +Converter+).
|
63
|
+
# [+options+] <tt>:xmlname</tt>, <tt>:xmlns</tt>, converter options (see +Converter+).
|
64
|
+
# [+block+] An anonymous class definition.
|
67
65
|
#
|
68
66
|
# === Example:
|
69
67
|
# class Cat
|
@@ -85,10 +83,10 @@ module XmlNuts #:nodoc:
|
|
85
83
|
# Defines multiple elements mapping.
|
86
84
|
#
|
87
85
|
# === Arguments
|
88
|
-
# +name
|
89
|
-
# +type
|
90
|
-
# +options
|
91
|
-
# +block
|
86
|
+
# [+name+] Accessor name
|
87
|
+
# [+type+] Element type. <tt>:string</tt> assumed if omitted (see +Converter+).
|
88
|
+
# [+options+] <tt>:xmlname</tt>, <tt>:xmlns</tt>, converter options (see +Converter+).
|
89
|
+
# [+block+] An anonymous class definition.
|
92
90
|
#
|
93
91
|
# === Example:
|
94
92
|
# class RichCat
|
@@ -109,9 +107,9 @@ module XmlNuts #:nodoc:
|
|
109
107
|
# Defines attribute mapping.
|
110
108
|
#
|
111
109
|
# === Arguments
|
112
|
-
# +name
|
113
|
-
# +type
|
114
|
-
# +options
|
110
|
+
# [+name+] Accessor name
|
111
|
+
# [+type+] Element type. <tt>:string</tt> assumed if omitted (see +Converter+).
|
112
|
+
# [+options+] <tt>:xmlname</tt>, <tt>:xmlns</tt>, converter options (see +Converter+).
|
115
113
|
#
|
116
114
|
# === Example:
|
117
115
|
# class Cat
|
@@ -128,13 +126,20 @@ module XmlNuts #:nodoc:
|
|
128
126
|
|
129
127
|
# mappings -> Array
|
130
128
|
#
|
131
|
-
# Returns all
|
129
|
+
# Returns all mappings defined on a class.
|
132
130
|
def mappings
|
133
131
|
@mappings ||= []
|
134
132
|
end
|
135
133
|
|
136
134
|
def parse(source, options = {})
|
137
|
-
backend.parse(source, options) {|node|
|
135
|
+
backend.parse(source, options) {|node| parse_node(new, node) }
|
136
|
+
end
|
137
|
+
|
138
|
+
def build(nut, result = :string, options = {})
|
139
|
+
options, result = result, :string if result.is_a?(Hash)
|
140
|
+
options[:xmlname] ||= root.xmlname
|
141
|
+
options[:xmlns_prefix] = namespaces.invert[options[:xmlns] ||= root.xmlns]
|
142
|
+
backend.build(result, options) {|node| build_node(nut, node) }
|
138
143
|
end
|
139
144
|
|
140
145
|
def build_node(nut, node) #:nodoc:
|
@@ -192,15 +197,14 @@ module XmlNuts #:nodoc:
|
|
192
197
|
# Defines attribute mapping.
|
193
198
|
#
|
194
199
|
# === Arguments
|
195
|
-
# +destination
|
196
|
-
#
|
197
|
-
#
|
198
|
-
#
|
199
|
-
#
|
200
|
-
#
|
201
|
-
#
|
202
|
-
#
|
203
|
-
# +options+:: Backend-specific options
|
200
|
+
# [+destination+]
|
201
|
+
# Can be given a symbol a backend-specific object, an instance of String or IO classes.
|
202
|
+
# [<tt>:string</tt>] will return an XML string.
|
203
|
+
# [<tt>:document</tt>] will return a backend specific document object.
|
204
|
+
# [<tt>:object</tt>] will return a backend specific object. New document will be created.
|
205
|
+
# [an instance of +String+] the contents of the string will be replaced with the generated XML.
|
206
|
+
# [an instance of +IO+] the IO will be written to.
|
207
|
+
# [+options+] Backend-specific options
|
204
208
|
#
|
205
209
|
# === Example:
|
206
210
|
# cat = Cat.new
|
@@ -211,19 +215,7 @@ module XmlNuts #:nodoc:
|
|
211
215
|
# cat.build(doc)
|
212
216
|
# puts doc.to_s
|
213
217
|
def build(result = :string, options = {})
|
214
|
-
|
215
|
-
root = self.class.root
|
216
|
-
options[:xmlname] ||= root.xmlname
|
217
|
-
options[:xmlns_prefix] = self.class.namespaces.invert[options[:xmlns] ||= root.xmlns]
|
218
|
-
backend.build(result, options) {|node| build_node(node) }
|
219
|
-
end
|
220
|
-
|
221
|
-
def parse_node(node) #:nodoc:
|
222
|
-
self.class.parse_node(self, node)
|
223
|
-
end
|
224
|
-
|
225
|
-
def build_node(node) #:nodoc:
|
226
|
-
self.class.build_node(self, node)
|
218
|
+
self.class.build(self, result, options)
|
227
219
|
end
|
228
220
|
end
|
229
221
|
end
|
data/test/parsing_test.rb
CHANGED
@@ -4,10 +4,12 @@ require 'test/unit'
|
|
4
4
|
require 'shoulda'
|
5
5
|
require 'lib/xmlnuts'
|
6
6
|
|
7
|
+
|
7
8
|
class Cheezburger
|
8
9
|
include XmlNuts::Nut
|
9
10
|
|
10
|
-
attribute :weight, :
|
11
|
+
attribute :weight, :float
|
12
|
+
attribute :price, :decimal
|
11
13
|
end
|
12
14
|
|
13
15
|
class Cat
|
@@ -21,7 +23,7 @@ class Cat
|
|
21
23
|
attribute :ears, :integer
|
22
24
|
|
23
25
|
element :ration, [:string], :xmlname => :eats, :xmlns => :kthnx
|
24
|
-
element :name, :string, :
|
26
|
+
element :name, :string, :xmlns => 'urn:x-lol:kthnx'
|
25
27
|
elements :paws, :string, :xmlname => :paw
|
26
28
|
|
27
29
|
element :friends, :xmlname => :pals do
|
@@ -38,7 +40,6 @@ class ParsingTest < Test::Unit::TestCase
|
|
38
40
|
<name xmlns='urn:x-lol:kthnx'>
|
39
41
|
Silly
|
40
42
|
Tom
|
41
|
-
Писта
|
42
43
|
</name>
|
43
44
|
<kthnx:eats>
|
44
45
|
tigers
|
@@ -53,7 +54,7 @@ class ParsingTest < Test::Unit::TestCase
|
|
53
54
|
<paw> two </paw>
|
54
55
|
<paw>three</paw>
|
55
56
|
<paw>four</paw>
|
56
|
-
<cheezburger
|
57
|
+
<cheezburger price='2.05' weight='14.5547' />
|
57
58
|
</kitteh>
|
58
59
|
EOS
|
59
60
|
@cat = Cat.parse(@xml_fragment)
|
@@ -61,7 +62,7 @@ class ParsingTest < Test::Unit::TestCase
|
|
61
62
|
|
62
63
|
context "A cat" do
|
63
64
|
should 'be named Silly Tom' do
|
64
|
-
assert_equal 'Silly Tom
|
65
|
+
assert_equal 'Silly Tom', @cat.name
|
65
66
|
end
|
66
67
|
|
67
68
|
should 'eat tigers and lions' do
|
@@ -77,12 +78,10 @@ class ParsingTest < Test::Unit::TestCase
|
|
77
78
|
end
|
78
79
|
|
79
80
|
should 'have tail' do
|
80
|
-
|
81
|
+
assert @cat.has_tail
|
81
82
|
end
|
82
83
|
|
83
84
|
should 'have four paws' do
|
84
|
-
assert_not_nil @cat.paws
|
85
|
-
assert_equal 4, @cat.paws.length
|
86
85
|
assert_equal %w(one two three four), @cat.paws
|
87
86
|
end
|
88
87
|
|
@@ -96,8 +95,12 @@ class ParsingTest < Test::Unit::TestCase
|
|
96
95
|
@burger = @cat.cheezburger
|
97
96
|
end
|
98
97
|
|
99
|
-
should 'weigh
|
100
|
-
assert_equal
|
98
|
+
should 'weigh 14.5547 pounds' do
|
99
|
+
assert_equal 14.5547, @burger.weight
|
100
|
+
end
|
101
|
+
|
102
|
+
should 'cost $2.05' do
|
103
|
+
assert_equal BigDecimal('2.05'), @burger.price
|
101
104
|
end
|
102
105
|
end
|
103
106
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pipa-xmlnuts
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: "0.
|
4
|
+
version: "0.2"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Igor Gunko
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-12-
|
12
|
+
date: 2008-12-17 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|