relief 0.0.4 → 0.0.5
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/Rakefile +2 -1
- data/VERSION.yml +1 -1
- data/lib/relief/element.rb +8 -2
- data/lib/relief/parser.rb +6 -1
- data/spec/parser_spec.rb +53 -4
- metadata +8 -6
data/Rakefile
CHANGED
@@ -12,8 +12,9 @@ begin
|
|
12
12
|
gem.email = "tyler@tylerhunt.com"
|
13
13
|
gem.homepage = "http://github.com/tylerhunt/relief"
|
14
14
|
gem.authors = ["Tyler Hunt"]
|
15
|
+
gem.rubyforge_project = 'relief'
|
15
16
|
|
16
|
-
gem.add_dependency 'nokogiri', '~> 1.
|
17
|
+
gem.add_dependency 'nokogiri', '~> 1.3.3'
|
17
18
|
|
18
19
|
gem.add_development_dependency('jeweler', '~> 0.11.0')
|
19
20
|
end
|
data/VERSION.yml
CHANGED
data/lib/relief/element.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'time'
|
2
|
+
|
1
3
|
module Relief
|
2
4
|
class Element
|
3
5
|
attr_reader :name, :options, :children
|
@@ -24,9 +26,13 @@ module Relief
|
|
24
26
|
else
|
25
27
|
value = target.to_s
|
26
28
|
|
27
|
-
if type
|
29
|
+
if type.nil? then value
|
30
|
+
elsif value.empty? then nil
|
31
|
+
elsif type == Integer then value.to_i
|
28
32
|
elsif type == Float then value.to_f
|
29
33
|
elsif type == Date then Date.parse(value)
|
34
|
+
elsif type == Time then Time.parse(value)
|
35
|
+
elsif type == DateTime then DateTime.parse(value)
|
30
36
|
elsif type.is_a?(Parser) then type.parse(document)
|
31
37
|
else value
|
32
38
|
end
|
@@ -65,7 +71,7 @@ module Relief
|
|
65
71
|
else
|
66
72
|
attribute = @options[:attribute]
|
67
73
|
attribute = name if attribute == true
|
68
|
-
!attribute ? "#{name}/text()" : "
|
74
|
+
!attribute ? "#{name}/text()" : ".//@#{attribute}"
|
69
75
|
end
|
70
76
|
end
|
71
77
|
end
|
data/lib/relief/parser.rb
CHANGED
@@ -1,7 +1,10 @@
|
|
1
|
-
gem 'nokogiri', '~> 1.
|
1
|
+
gem 'nokogiri', '~> 1.3.3'
|
2
2
|
require 'nokogiri'
|
3
3
|
|
4
4
|
module Relief
|
5
|
+
class Error < StandardError ; end
|
6
|
+
class ParseError < Error ; end
|
7
|
+
|
5
8
|
class Parser
|
6
9
|
attr_reader :root
|
7
10
|
|
@@ -14,6 +17,8 @@ module Relief
|
|
14
17
|
document = Nokogiri::XML(document.to_s)
|
15
18
|
end
|
16
19
|
|
20
|
+
raise ParseError if document.root.nil?
|
21
|
+
|
17
22
|
@root.parse(document)
|
18
23
|
end
|
19
24
|
end
|
data/spec/parser_spec.rb
CHANGED
@@ -1,6 +1,17 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
2
|
|
3
3
|
describe Relief::Parser do
|
4
|
+
it "raises a ParseError if the document can't be parsed" do
|
5
|
+
parser = Relief::Parser.new(:photo) do
|
6
|
+
element :name
|
7
|
+
element :url
|
8
|
+
end
|
9
|
+
|
10
|
+
lambda {
|
11
|
+
parser.parse('')
|
12
|
+
}.should raise_error(Relief::ParseError)
|
13
|
+
end
|
14
|
+
|
4
15
|
it "parses elements" do
|
5
16
|
parser = Relief::Parser.new(:photo) do
|
6
17
|
element :name
|
@@ -50,6 +61,8 @@ describe Relief::Parser do
|
|
50
61
|
|
51
62
|
it "parses attributes" do
|
52
63
|
parser = Relief::Parser.new(:photos) do
|
64
|
+
attribute :status
|
65
|
+
|
53
66
|
elements :photo do
|
54
67
|
attribute :name
|
55
68
|
attribute :url
|
@@ -58,13 +71,14 @@ describe Relief::Parser do
|
|
58
71
|
|
59
72
|
photos = parser.parse(<<-XML)
|
60
73
|
<?xml version="1.0" encoding="UTF-8"?>
|
61
|
-
<photos>
|
74
|
+
<photos status="fine">
|
62
75
|
<photo name="Cucumbers" url="/photos/cucumbers.jpg" />
|
63
76
|
<photo name="Lemons" url="/photos/lemons.jpg" />
|
64
77
|
</photos>
|
65
78
|
XML
|
66
79
|
|
67
80
|
photos.should == {
|
81
|
+
:status => 'fine',
|
68
82
|
:photo => [
|
69
83
|
{ :name => 'Cucumbers', :url => '/photos/cucumbers.jpg' },
|
70
84
|
{ :name => 'Lemons', :url => '/photos/lemons.jpg' }
|
@@ -128,7 +142,9 @@ describe Relief::Parser do
|
|
128
142
|
parser = Relief::Parser.new(:photo) do
|
129
143
|
element :id, :type => Integer
|
130
144
|
element :rating, :type => Float
|
131
|
-
element :
|
145
|
+
element :taken, :type => Date
|
146
|
+
element :modified, :type => Time
|
147
|
+
element :published, :type => DateTime
|
132
148
|
end
|
133
149
|
|
134
150
|
photo = parser.parse(<<-XML)
|
@@ -136,14 +152,18 @@ describe Relief::Parser do
|
|
136
152
|
<photo>
|
137
153
|
<id>86634</id>
|
138
154
|
<rating>3.5</rating>
|
139
|
-
<
|
155
|
+
<taken>2009-05-06</taken>
|
156
|
+
<modified>2009-05-08T18:23:48-07:00</modified>
|
157
|
+
<published>2009-05-08T18:23:26-07:00</published>
|
140
158
|
</photo>
|
141
159
|
XML
|
142
160
|
|
143
161
|
photo.should == {
|
144
162
|
:id => 86634,
|
145
163
|
:rating => 3.5,
|
146
|
-
:
|
164
|
+
:taken => Date.new(2009, 5, 6),
|
165
|
+
:modified => Time.parse('2009-05-08T18:23:48-07:00'),
|
166
|
+
:published => DateTime.new(2009, 5, 8, 18, 23, 26, Date.time_to_day_fraction(-7, 0, 0))
|
147
167
|
}
|
148
168
|
end
|
149
169
|
|
@@ -174,4 +194,33 @@ describe Relief::Parser do
|
|
174
194
|
}
|
175
195
|
}
|
176
196
|
end
|
197
|
+
|
198
|
+
it "doesn't type cast elements with empty values" do
|
199
|
+
parser = Relief::Parser.new(:photo) do
|
200
|
+
element :name
|
201
|
+
element :id, :type => Integer
|
202
|
+
element :rating, :type => Float
|
203
|
+
element :taken, :type => Date
|
204
|
+
element :published, :type => DateTime
|
205
|
+
end
|
206
|
+
|
207
|
+
photo = parser.parse(<<-XML)
|
208
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
209
|
+
<photo>
|
210
|
+
<name></name>
|
211
|
+
<id></id>
|
212
|
+
<rating></rating>
|
213
|
+
<taken></taken>
|
214
|
+
<published></published>
|
215
|
+
</photo>
|
216
|
+
XML
|
217
|
+
|
218
|
+
photo.should == {
|
219
|
+
:name => '',
|
220
|
+
:id => nil,
|
221
|
+
:rating => nil,
|
222
|
+
:taken => nil,
|
223
|
+
:published => nil
|
224
|
+
}
|
225
|
+
end
|
177
226
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: relief
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tyler Hunt
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-08-31 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -20,7 +20,7 @@ dependencies:
|
|
20
20
|
requirements:
|
21
21
|
- - ~>
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version: 1.
|
23
|
+
version: 1.3.3
|
24
24
|
version:
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: jeweler
|
@@ -53,6 +53,8 @@ files:
|
|
53
53
|
- spec/spec_helper.rb
|
54
54
|
has_rdoc: true
|
55
55
|
homepage: http://github.com/tylerhunt/relief
|
56
|
+
licenses: []
|
57
|
+
|
56
58
|
post_install_message:
|
57
59
|
rdoc_options:
|
58
60
|
- --charset=UTF-8
|
@@ -72,10 +74,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
72
74
|
version:
|
73
75
|
requirements: []
|
74
76
|
|
75
|
-
rubyforge_project:
|
76
|
-
rubygems_version: 1.3.
|
77
|
+
rubyforge_project: relief
|
78
|
+
rubygems_version: 1.3.5
|
77
79
|
signing_key:
|
78
|
-
specification_version:
|
80
|
+
specification_version: 3
|
79
81
|
summary: An XML to hash Ruby parser DSL.
|
80
82
|
test_files:
|
81
83
|
- spec/parser_spec.rb
|