dozuki 0.0.1 → 0.0.3
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/CI +13 -0
- data/Gemfile.lock +21 -20
- data/{README.rdoc → README.markdown} +48 -37
- data/Rakefile +17 -0
- data/dozuki.gemspec +4 -3
- data/features/each_accessor.feature +22 -50
- data/features/exists_accessor.feature +3 -4
- data/features/float_accessor.feature +22 -28
- data/features/get_accessor.feature +17 -46
- data/features/int_accessor.feature +22 -28
- data/features/steps/collection_steps.rb +11 -0
- data/features/steps/error_steps.rb +11 -0
- data/features/steps/format_steps.rb +19 -0
- data/features/steps/xml_steps.rb +4 -53
- data/features/string_accessor.feature +16 -27
- data/lib/dozuki.rb +5 -1
- data/lib/dozuki/exceptions.rb +23 -0
- data/lib/dozuki/node.rb +53 -0
- data/lib/dozuki/node_collection.rb +25 -0
- data/lib/dozuki/parsers.rb +29 -0
- data/lib/dozuki/version.rb +1 -1
- data/lib/dozuki/xml.rb +3 -8
- data/spec/dozuki/node_collection_spec.rb +114 -0
- data/spec/dozuki/{xml/node_spec.rb → node_spec.rb} +40 -40
- data/spec/dozuki/{xml/parser_spec.rb → parsers_spec.rb} +37 -29
- data/spec/dozuki/xml_spec.rb +14 -11
- metadata +33 -33
- data/lib/dozuki/xml/exceptions.rb +0 -27
- data/lib/dozuki/xml/node.rb +0 -54
- data/lib/dozuki/xml/node_collection.rb +0 -27
- data/lib/dozuki/xml/parser.rb +0 -23
- data/spec/dozuki/xml/node_collection_spec.rb +0 -117
@@ -0,0 +1,29 @@
|
|
1
|
+
module Dozuki
|
2
|
+
module Parsers
|
3
|
+
module String
|
4
|
+
def self.parse(node)
|
5
|
+
node.text.strip
|
6
|
+
end
|
7
|
+
end
|
8
|
+
module Integer
|
9
|
+
def self.parse(node)
|
10
|
+
string = String.parse(node)
|
11
|
+
begin
|
12
|
+
Integer(string)
|
13
|
+
rescue ArgumentError
|
14
|
+
raise InvalidFormat.new(:node => node, :value => string, :format => "integer")
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
module Float
|
19
|
+
def self.parse(node)
|
20
|
+
string = String.parse(node)
|
21
|
+
begin
|
22
|
+
Float(string)
|
23
|
+
rescue ArgumentError
|
24
|
+
raise InvalidFormat.new(:node => node, :value => string, :format => "float")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/dozuki/version.rb
CHANGED
data/lib/dozuki/xml.rb
CHANGED
@@ -1,12 +1,7 @@
|
|
1
|
-
require 'dozuki/xml/node'
|
2
|
-
require 'dozuki/xml/node_collection'
|
3
|
-
require 'dozuki/xml/parser'
|
4
|
-
require 'dozuki/xml/exceptions'
|
5
|
-
|
6
1
|
module Dozuki
|
7
2
|
module XML
|
8
|
-
def self.parse(
|
9
|
-
Node.new(Nokogiri::XML.parse(
|
3
|
+
def self.parse(*args)
|
4
|
+
Node.new(Nokogiri::XML.parse(*args))
|
10
5
|
end
|
11
6
|
end
|
12
|
-
end
|
7
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Dozuki
|
3
|
+
describe NodeCollection do
|
4
|
+
|
5
|
+
describe "as_node" do
|
6
|
+
let(:collection){mock "some_nodes"}
|
7
|
+
let(:blk){Proc.new{}}
|
8
|
+
let(:node_collection){NodeCollection.new(collection)}
|
9
|
+
let(:collection_item){mock "collection item"}
|
10
|
+
let(:new_node){mock "new node"}
|
11
|
+
before(:each) do
|
12
|
+
collection.stub(:each).and_yield(collection_item)
|
13
|
+
Node.stub(:new).and_return(new_node)
|
14
|
+
end
|
15
|
+
|
16
|
+
subject{node_collection.as_node(&blk)}
|
17
|
+
|
18
|
+
it "should iterate through the collection" do
|
19
|
+
collection.should_receive(:each)
|
20
|
+
subject
|
21
|
+
end
|
22
|
+
it "should create a new Node with the yielded collection item" do
|
23
|
+
Node.should_receive(:new).with(collection_item)
|
24
|
+
subject
|
25
|
+
end
|
26
|
+
it "should call the bloc with the node" do
|
27
|
+
blk.should_receive(:call).with(new_node)
|
28
|
+
subject
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "as_string" do
|
33
|
+
let(:collection){mock "some_nodes"}
|
34
|
+
let(:blk){Proc.new{}}
|
35
|
+
let(:node_collection){NodeCollection.new(collection)}
|
36
|
+
let(:collection_item){mock "collection item"}
|
37
|
+
let(:string){"string"}
|
38
|
+
before(:each) do
|
39
|
+
collection.stub(:each).and_yield(collection_item)
|
40
|
+
Dozuki::Parsers::String.stub(:parse).and_return(string)
|
41
|
+
end
|
42
|
+
|
43
|
+
subject{node_collection.as_string(&blk)}
|
44
|
+
|
45
|
+
it "should iterate through the collection" do
|
46
|
+
collection.should_receive(:each)
|
47
|
+
subject
|
48
|
+
end
|
49
|
+
it "should create a new Node with the yielded collection item" do
|
50
|
+
Dozuki::Parsers::String.should_receive(:parse).with(collection_item)
|
51
|
+
subject
|
52
|
+
end
|
53
|
+
it "should call the bloc with the node" do
|
54
|
+
blk.should_receive(:call).with("string")
|
55
|
+
subject
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe "as_int" do
|
60
|
+
let(:collection){mock "some_nodes"}
|
61
|
+
let(:blk){Proc.new{}}
|
62
|
+
let(:node_collection){NodeCollection.new(collection)}
|
63
|
+
let(:collection_item){mock "collection item"}
|
64
|
+
let(:int){39}
|
65
|
+
before(:each) do
|
66
|
+
collection.stub(:each).and_yield(collection_item)
|
67
|
+
Dozuki::Parsers::Integer.stub(:parse).and_return(int)
|
68
|
+
end
|
69
|
+
|
70
|
+
subject{node_collection.as_int(&blk)}
|
71
|
+
|
72
|
+
it "should iterate through the collection" do
|
73
|
+
collection.should_receive(:each)
|
74
|
+
subject
|
75
|
+
end
|
76
|
+
it "should create a new Node with the yielded collection item" do
|
77
|
+
Dozuki::Parsers::Integer.should_receive(:parse).with(collection_item)
|
78
|
+
subject
|
79
|
+
end
|
80
|
+
it "should call the bloc with the node" do
|
81
|
+
blk.should_receive(:call).with(int)
|
82
|
+
subject
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe "as_float" do
|
87
|
+
let(:collection){mock "some_nodes"}
|
88
|
+
let(:blk){Proc.new{}}
|
89
|
+
let(:node_collection){NodeCollection.new(collection)}
|
90
|
+
let(:collection_item){mock "collection item"}
|
91
|
+
let(:float){39.50}
|
92
|
+
before(:each) do
|
93
|
+
collection.stub(:each).and_yield(collection_item)
|
94
|
+
Dozuki::Parsers::Float.stub(:parse).and_return(float)
|
95
|
+
end
|
96
|
+
|
97
|
+
subject{node_collection.as_float(&blk)}
|
98
|
+
|
99
|
+
it "should iterate through the collection" do
|
100
|
+
collection.should_receive(:each)
|
101
|
+
subject
|
102
|
+
end
|
103
|
+
it "should create a new Node with the yielded collection item" do
|
104
|
+
Dozuki::Parsers::Float.should_receive(:parse).with(collection_item)
|
105
|
+
subject
|
106
|
+
end
|
107
|
+
it "should call the bloc with the node" do
|
108
|
+
blk.should_receive(:call).with(float)
|
109
|
+
subject
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
end
|
@@ -1,14 +1,14 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
module Dozuki
|
3
|
+
module Dozuki
|
4
4
|
describe Node do
|
5
|
-
|
5
|
+
|
6
6
|
describe "initialization" do
|
7
7
|
let(:nokogiri_node){mock("nokogiri_node")}
|
8
8
|
subject{Node.new(nokogiri_node)}
|
9
9
|
its(:nokogiri_node){should == nokogiri_node}
|
10
10
|
end
|
11
|
-
|
11
|
+
|
12
12
|
describe "missing methods" do
|
13
13
|
let(:nokogiri_node){mock("nokogiri node")}
|
14
14
|
subject{Node.new(nokogiri_node)}
|
@@ -26,8 +26,8 @@ module Dozuki::XML
|
|
26
26
|
nokogiri_node.should_receive(:blah).with(&blk)
|
27
27
|
subject.blah(&blk)
|
28
28
|
end
|
29
|
-
end
|
30
|
-
|
29
|
+
end
|
30
|
+
|
31
31
|
describe "responding to nokogiri's methods" do
|
32
32
|
let(:nokogiri_node){mock("nokogiri node")}
|
33
33
|
let(:node){Node.new(nokogiri_node)}
|
@@ -45,7 +45,7 @@ module Dozuki::XML
|
|
45
45
|
end
|
46
46
|
end
|
47
47
|
end
|
48
|
-
|
48
|
+
|
49
49
|
describe "each" do
|
50
50
|
let(:nokogiri_node) {mock("nokogiri_node")}
|
51
51
|
let(:xpath) {"/some/xpath"}
|
@@ -59,21 +59,21 @@ module Dozuki::XML
|
|
59
59
|
|
60
60
|
end
|
61
61
|
subject{node.each(xpath)}
|
62
|
-
|
62
|
+
|
63
63
|
it "should get the collection from the nokogiri node" do
|
64
64
|
nokogiri_node.should_receive(:xpath).with(xpath)
|
65
65
|
subject
|
66
66
|
end
|
67
|
-
|
67
|
+
|
68
68
|
it "should create a new NodeCollection with the collection" do
|
69
69
|
NodeCollection.should_receive(:new).with(collection)
|
70
70
|
subject
|
71
71
|
end
|
72
|
-
|
72
|
+
|
73
73
|
it "should return the collection" do
|
74
74
|
subject.should == node_collection
|
75
75
|
end
|
76
|
-
|
76
|
+
|
77
77
|
context "where no block is passed" do
|
78
78
|
before(:each) do
|
79
79
|
node_collection.stub(:as_node).and_return(node_collection)
|
@@ -85,27 +85,27 @@ module Dozuki::XML
|
|
85
85
|
end
|
86
86
|
end
|
87
87
|
end
|
88
|
-
|
88
|
+
|
89
89
|
describe "string" do
|
90
90
|
let(:nokogiri_node) { mock("nokogiri_node") }
|
91
91
|
let(:xpath) { "/some/xpath" }
|
92
92
|
let(:node) { Node.new(nokogiri_node) }
|
93
93
|
let(:text_node) { mock "some node" }
|
94
94
|
let(:parsed) { mock "parsed result" }
|
95
|
-
|
95
|
+
|
96
96
|
before(:each) do
|
97
97
|
nokogiri_node.stub(:xpath).and_return([text_node])
|
98
|
-
|
98
|
+
Dozuki::Parsers::String.stub(:parse).and_return(parsed)
|
99
99
|
end
|
100
|
-
|
100
|
+
|
101
101
|
subject{ node.string(xpath) }
|
102
|
-
|
102
|
+
|
103
103
|
it "should get the collection from the nokogiri node" do
|
104
104
|
nokogiri_node.should_receive(:xpath).with(xpath)
|
105
105
|
subject
|
106
106
|
end
|
107
107
|
it "should parse the node to a string" do
|
108
|
-
|
108
|
+
Dozuki::Parsers::String.should_receive(:parse).with(text_node)
|
109
109
|
subject
|
110
110
|
end
|
111
111
|
it "should return the parsed result" do
|
@@ -116,31 +116,31 @@ module Dozuki::XML
|
|
116
116
|
nokogiri_node.should_receive(:xpath).and_return([])
|
117
117
|
end
|
118
118
|
it "should raise a NotFound error" do
|
119
|
-
expect{subject}.to raise_error(NotFound)
|
119
|
+
expect{subject}.to raise_error(Dozuki::NotFound)
|
120
120
|
end
|
121
121
|
end
|
122
122
|
end
|
123
|
-
|
123
|
+
|
124
124
|
describe "int" do
|
125
125
|
let(:nokogiri_node) { mock("nokogiri_node") }
|
126
126
|
let(:xpath) { "/some/xpath" }
|
127
127
|
let(:node) { Node.new(nokogiri_node) }
|
128
128
|
let(:int_node) { mock "some node" }
|
129
129
|
let(:parsed) { mock "parsed result" }
|
130
|
-
|
130
|
+
|
131
131
|
before(:each) do
|
132
132
|
nokogiri_node.stub(:xpath).and_return([int_node])
|
133
|
-
|
133
|
+
Dozuki::Parsers::Integer.stub(:parse).and_return(parsed)
|
134
134
|
end
|
135
|
-
|
135
|
+
|
136
136
|
subject{ node.int(xpath) }
|
137
|
-
|
137
|
+
|
138
138
|
it "should get the collection from the nokogiri node" do
|
139
139
|
nokogiri_node.should_receive(:xpath).with(xpath)
|
140
140
|
subject
|
141
141
|
end
|
142
142
|
it "should parse the node to an int" do
|
143
|
-
|
143
|
+
Dozuki::Parsers::Integer.should_receive(:parse).with(int_node)
|
144
144
|
subject
|
145
145
|
end
|
146
146
|
it "should return the parsed result" do
|
@@ -151,31 +151,31 @@ module Dozuki::XML
|
|
151
151
|
nokogiri_node.should_receive(:xpath).and_return([])
|
152
152
|
end
|
153
153
|
it "should raise a NotFound error" do
|
154
|
-
expect{subject}.to raise_error(NotFound)
|
154
|
+
expect{subject}.to raise_error(Dozuki::NotFound)
|
155
155
|
end
|
156
156
|
end
|
157
157
|
end
|
158
|
-
|
158
|
+
|
159
159
|
describe "float" do
|
160
160
|
let(:nokogiri_node) { mock("nokogiri_node") }
|
161
161
|
let(:xpath) { "/some/xpath" }
|
162
162
|
let(:node) { Node.new(nokogiri_node) }
|
163
163
|
let(:float_node) { mock "some node" }
|
164
164
|
let(:parsed) { mock "parsed result" }
|
165
|
-
|
165
|
+
|
166
166
|
before(:each) do
|
167
167
|
nokogiri_node.stub(:xpath).and_return([float_node])
|
168
|
-
|
168
|
+
Dozuki::Parsers::Float.stub(:parse).and_return(parsed)
|
169
169
|
end
|
170
|
-
|
170
|
+
|
171
171
|
subject{ node.float(xpath) }
|
172
|
-
|
172
|
+
|
173
173
|
it "should get the collection from the nokogiri node" do
|
174
174
|
nokogiri_node.should_receive(:xpath).with(xpath)
|
175
175
|
subject
|
176
176
|
end
|
177
177
|
it "should parse the node to an int" do
|
178
|
-
|
178
|
+
Dozuki::Parsers::Float.should_receive(:parse).with(float_node)
|
179
179
|
subject
|
180
180
|
end
|
181
181
|
it "should return the parsed result" do
|
@@ -186,23 +186,23 @@ module Dozuki::XML
|
|
186
186
|
nokogiri_node.should_receive(:xpath).and_return([])
|
187
187
|
end
|
188
188
|
it "should raise a NotFound error" do
|
189
|
-
expect{subject}.to raise_error(NotFound)
|
189
|
+
expect{subject}.to raise_error(Dozuki::NotFound)
|
190
190
|
end
|
191
191
|
end
|
192
192
|
end
|
193
|
-
|
193
|
+
|
194
194
|
describe "get" do
|
195
195
|
let(:nokogiri_node) { mock("nokogiri_node") }
|
196
196
|
let(:xpath) { "/some/xpath" }
|
197
197
|
let(:node) { Node.new(nokogiri_node) }
|
198
198
|
let(:wanted_node) { mock "some node" }
|
199
|
-
|
199
|
+
|
200
200
|
before(:each) do
|
201
201
|
nokogiri_node.stub(:xpath).and_return([wanted_node])
|
202
202
|
end
|
203
|
-
|
203
|
+
|
204
204
|
subject{ node.get(xpath) }
|
205
|
-
|
205
|
+
|
206
206
|
it "should get the collection from the nokogiri node" do
|
207
207
|
nokogiri_node.should_receive(:xpath).with(xpath)
|
208
208
|
subject
|
@@ -210,13 +210,13 @@ module Dozuki::XML
|
|
210
210
|
it "should return the new dozuki node" do
|
211
211
|
subject.nokogiri_node.should == wanted_node
|
212
212
|
end
|
213
|
-
|
213
|
+
|
214
214
|
context "where the xpath returns no node" do
|
215
215
|
before(:each) do
|
216
216
|
nokogiri_node.should_receive(:xpath).and_return([])
|
217
217
|
end
|
218
218
|
it "should raise a NotFound error" do
|
219
|
-
expect{subject}.to raise_error(NotFound)
|
219
|
+
expect{subject}.to raise_error(Dozuki::NotFound)
|
220
220
|
end
|
221
221
|
end
|
222
222
|
context "where a block is passed" do
|
@@ -228,7 +228,7 @@ module Dozuki::XML
|
|
228
228
|
end
|
229
229
|
end
|
230
230
|
end
|
231
|
-
|
231
|
+
|
232
232
|
describe "exists?" do
|
233
233
|
let(:nokogiri_node) { mock("nokogiri_node") }
|
234
234
|
let(:xpath) { "/some/xpath" }
|
@@ -252,6 +252,6 @@ module Dozuki::XML
|
|
252
252
|
end
|
253
253
|
end
|
254
254
|
end
|
255
|
-
|
255
|
+
|
256
256
|
end
|
257
|
-
end
|
257
|
+
end
|
@@ -1,12 +1,13 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
module Dozuki
|
4
|
-
module
|
5
|
-
|
6
|
-
|
4
|
+
module Parsers
|
5
|
+
|
6
|
+
describe String do
|
7
|
+
describe ".parse" do
|
7
8
|
let(:string){"something"}
|
8
9
|
let(:node){mock "node", :text => string}
|
9
|
-
subject{
|
10
|
+
subject{String.parse(node)}
|
10
11
|
it "should get the text" do
|
11
12
|
subject.should == "something"
|
12
13
|
end
|
@@ -17,10 +18,13 @@ module Dozuki
|
|
17
18
|
end
|
18
19
|
end
|
19
20
|
end
|
20
|
-
|
21
|
+
end
|
22
|
+
|
23
|
+
describe Integer do
|
24
|
+
describe ".parse" do
|
21
25
|
let(:string){"2"}
|
22
26
|
let(:node){mock "node", :text => string}
|
23
|
-
subject{
|
27
|
+
subject{Integer.parse(node)}
|
24
28
|
it "should get the integer" do
|
25
29
|
subject.should == 2
|
26
30
|
end
|
@@ -34,7 +38,7 @@ module Dozuki
|
|
34
38
|
context "where there is characters in the string" do
|
35
39
|
let(:string){"fjkdsk"}
|
36
40
|
it "should raise an error" do
|
37
|
-
expect{subject}.to raise_error(InvalidFormat)
|
41
|
+
expect{subject}.to raise_error(InvalidFormat, "Cannot parse 'fjkdsk' to integer")
|
38
42
|
end
|
39
43
|
end
|
40
44
|
context "where there are dots" do
|
@@ -45,34 +49,38 @@ module Dozuki
|
|
45
49
|
end
|
46
50
|
end
|
47
51
|
end
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
subject.
|
54
|
-
|
55
|
-
|
56
|
-
let(:string){"\n\n22.59"}
|
57
|
-
it "should strip the whitespace" do
|
58
|
-
subject.should == 22.59
|
52
|
+
|
53
|
+
describe Float do
|
54
|
+
describe ".parse" do
|
55
|
+
let(:string){"22.50"}
|
56
|
+
let(:node){mock "node", :text => string}
|
57
|
+
subject{Float.parse(node)}
|
58
|
+
it "should get the float" do
|
59
|
+
subject.should == 22.50
|
59
60
|
end
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
it "should raise an error" do
|
65
|
-
expect{subject}.to raise_error(InvalidFormat)
|
61
|
+
context "where the string has whitespace" do
|
62
|
+
let(:string){"\n\n22.59"}
|
63
|
+
it "should strip the whitespace" do
|
64
|
+
subject.should == 22.59
|
66
65
|
end
|
67
66
|
end
|
68
|
-
context "where
|
69
|
-
|
70
|
-
|
71
|
-
|
67
|
+
context "where the string is badly formatted" do
|
68
|
+
context "where there is characters in the string" do
|
69
|
+
let(:string){"fjkdsk"}
|
70
|
+
it "should raise an error" do
|
71
|
+
expect{subject}.to raise_error(InvalidFormat, "Cannot parse 'fjkdsk' to float")
|
72
|
+
end
|
73
|
+
end
|
74
|
+
context "where there are multiple dots" do
|
75
|
+
let(:string){"0.0.4"}
|
76
|
+
it "should raise an error" do
|
77
|
+
expect{subject}.to raise_error(InvalidFormat)
|
78
|
+
end
|
72
79
|
end
|
73
80
|
end
|
74
81
|
end
|
75
82
|
end
|
83
|
+
|
76
84
|
end
|
77
85
|
end
|
78
|
-
end
|
86
|
+
end
|