wadl 0.1.1
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/COPYING +676 -0
- data/ChangeLog +5 -0
- data/README +75 -0
- data/Rakefile +23 -0
- data/examples/YahooSearch.rb +7 -0
- data/examples/YahooSearch.wadl +88 -0
- data/examples/crummy.rb +17 -0
- data/examples/crummy.wadl +34 -0
- data/examples/delicious.rb +24 -0
- data/examples/delicious.wadl +348 -0
- data/examples/yahoo.rb +14 -0
- data/examples/yahoo.wadl +37 -0
- data/lib/wadl/version.rb +27 -0
- data/lib/wadl.rb +1263 -0
- data/test/test_wadl.rb +303 -0
- metadata +112 -0
data/test/test_wadl.rb
ADDED
@@ -0,0 +1,303 @@
|
|
1
|
+
# Unit tests for the Ruby WADL library.
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'wadl'
|
5
|
+
|
6
|
+
class WADLTest < Test::Unit::TestCase
|
7
|
+
|
8
|
+
def wadl(wadl)
|
9
|
+
WADL::Application.from_wadl(<<-EOT)
|
10
|
+
<?xml version="1.0"?>
|
11
|
+
<application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
12
|
+
xsi:schemaLocation="http://research.sun.com/wadl wadl.xsd"
|
13
|
+
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
14
|
+
xmlns="http://research.sun.com/wadl">
|
15
|
+
#{wadl}
|
16
|
+
</application>
|
17
|
+
EOT
|
18
|
+
end
|
19
|
+
|
20
|
+
# Null test to shut the compiler up.
|
21
|
+
def test_null
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
class FindingWhatYouNeed < WADLTest
|
27
|
+
|
28
|
+
def setup
|
29
|
+
@wadl = wadl(<<-EOT)
|
30
|
+
<resources base="http://www.example.com/">
|
31
|
+
<resource id="green_things" path="green">
|
32
|
+
<resource href="#frogs" />
|
33
|
+
<resource id="pistachios" path="pistachio" />
|
34
|
+
<method href="#fetch" />
|
35
|
+
</resource>
|
36
|
+
|
37
|
+
<resource id="hopping_things" path="hop">
|
38
|
+
<resource href="#frogs" />
|
39
|
+
</resource>
|
40
|
+
|
41
|
+
<resource id="frogs" path="frog">
|
42
|
+
<method name="POST" id="fetch_frog" />
|
43
|
+
</resource>
|
44
|
+
</resources>
|
45
|
+
|
46
|
+
<method name="GET" id="fetch" />
|
47
|
+
EOT
|
48
|
+
end
|
49
|
+
|
50
|
+
# Test the ability to find a resource by ID, to find a sub-resource
|
51
|
+
# of a resource, and to dereference a resource.
|
52
|
+
def test_find_resource_by_id
|
53
|
+
green_things = @wadl.find_resource(:green_things)
|
54
|
+
frogs = @wadl.find_resource(:frogs)
|
55
|
+
|
56
|
+
assert_equal(green_things.id, 'green_things')
|
57
|
+
assert_equal(frogs.path, 'frog')
|
58
|
+
assert_equal(green_things.find_resource(:frogs), frogs)
|
59
|
+
assert_equal(green_things.find_resource(:pistachios).path, "pistachio")
|
60
|
+
end
|
61
|
+
|
62
|
+
# Test the ability to find a resource by path.
|
63
|
+
def test_find_resource_by_path
|
64
|
+
green_things = @wadl.green
|
65
|
+
assert_equal(green_things.id, 'green_things')
|
66
|
+
|
67
|
+
green_things = @wadl.find_resource_by_path('green')
|
68
|
+
assert_equal(green_things.id, 'green_things')
|
69
|
+
|
70
|
+
green_things = @wadl.resource('green')
|
71
|
+
assert_equal(green_things.id, 'green_things')
|
72
|
+
|
73
|
+
frogs = green_things.find_resource_by_path('frog')
|
74
|
+
assert_equal(frogs.id, 'frogs')
|
75
|
+
end
|
76
|
+
|
77
|
+
# Dereference a resource two different ways and construct two different
|
78
|
+
# URIs from the same resource.
|
79
|
+
def test_dereference_resource
|
80
|
+
green_frogs = @wadl.green_things.frogs
|
81
|
+
assert_equal(green_frogs.uri, 'http://www.example.com/green/frog')
|
82
|
+
|
83
|
+
hopping_frogs = @wadl.hopping_things.frogs
|
84
|
+
assert_equal(hopping_frogs.uri, 'http://www.example.com/hop/frog')
|
85
|
+
end
|
86
|
+
|
87
|
+
# Find a resource's method by id or HTTP action.
|
88
|
+
def test_find_method
|
89
|
+
frogs = @wadl.find_resource(:frogs)
|
90
|
+
|
91
|
+
assert_equal(frogs.find_method_by_id(:fetch_frog).name, 'POST')
|
92
|
+
assert_equal(frogs.find_method_by_http_method('POST').id, 'fetch_frog')
|
93
|
+
end
|
94
|
+
|
95
|
+
# Dereference a resource's method.
|
96
|
+
def test_find_dereferenced_method
|
97
|
+
green_things = @wadl.find_resource(:green_things)
|
98
|
+
assert_equal(green_things.find_method_by_id(:fetch).name, 'GET')
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
102
|
+
|
103
|
+
class PathParameters < WADLTest
|
104
|
+
|
105
|
+
def setup
|
106
|
+
@wadl = wadl(<<-EOT)
|
107
|
+
<resources base="http://www.example.com/">
|
108
|
+
<resource id="mad" path="im/mad/because">
|
109
|
+
<resource href="#insult" />
|
110
|
+
</resource>
|
111
|
+
|
112
|
+
<resource id="insult" path="the/{person}/is/{a}">
|
113
|
+
<param name="a" default="dork" style="matrix" />
|
114
|
+
<param name="and" style="matrix" />
|
115
|
+
<resource id="so-let's" path="so-let's/{do something}" />
|
116
|
+
</resource>
|
117
|
+
</resources>
|
118
|
+
EOT
|
119
|
+
end
|
120
|
+
|
121
|
+
def test_path_parameter_substitution
|
122
|
+
insult_resource = @wadl.find_resource_by_path('the/{person}/is/{a}')
|
123
|
+
|
124
|
+
# Test simple substitution.
|
125
|
+
assert_equal(insult_resource.uri(:path => { 'person' => 'king', 'a' => 'fink' }),
|
126
|
+
'http://www.example.com/the/king/is/;a=fink')
|
127
|
+
# Test default values.
|
128
|
+
assert_equal(insult_resource.uri(:path => { 'person' => 'king' }),
|
129
|
+
'http://www.example.com/the/king/is/;a=dork')
|
130
|
+
|
131
|
+
# Test use of optional paramaters.
|
132
|
+
assert_equal(insult_resource.uri(:path => { 'person' => 'king', 'a' => 'fink',
|
133
|
+
'and' => 'he can bite me' }),
|
134
|
+
'http://www.example.com/the/king/is/;a=fink/;and=he%20can%20bite%20me')
|
135
|
+
|
136
|
+
# Don't provide required argument.
|
137
|
+
assert_raises(ArgumentError) { insult_resource.uri }
|
138
|
+
|
139
|
+
# Provide multiple values for single-valued argument.
|
140
|
+
assert_raises(ArgumentError) {
|
141
|
+
insult_resource.uri(:path => { :person => 'king', :a => ['fink', 'dolt'] })
|
142
|
+
}
|
143
|
+
end
|
144
|
+
|
145
|
+
# Test enumerated options for parameters
|
146
|
+
def test_options
|
147
|
+
resource = wadl(<<-EOT).find_resource('fate')
|
148
|
+
<resources base="http://www.example.com/">
|
149
|
+
<resource id="fate" path="fates/{fate}">
|
150
|
+
<param name="fate">
|
151
|
+
<option value="Clotho" />
|
152
|
+
<option value="Lachesis" />
|
153
|
+
<option value="Atropos" />
|
154
|
+
</param>
|
155
|
+
</resource>
|
156
|
+
</resources>
|
157
|
+
EOT
|
158
|
+
|
159
|
+
assert_equal(resource.uri(:path => { :fate => 'Clotho' }),
|
160
|
+
'http://www.example.com/fates/Clotho')
|
161
|
+
|
162
|
+
assert_raises(ArgumentError) { resource.uri(:path => { :fate => 'Groucho' }) }
|
163
|
+
end
|
164
|
+
|
165
|
+
# This one's complicated. We bind a resource's path parameters to
|
166
|
+
# specific values, then get a sub-resource of the bound resource and
|
167
|
+
# bind _its_ path parameters. This tests the BoundResource delegate
|
168
|
+
# class.
|
169
|
+
def test_bound_resource_traversal
|
170
|
+
im_mad_because = @wadl.find_resource('mad')
|
171
|
+
assert_equal(im_mad_because.uri, 'http://www.example.com/im/mad/because')
|
172
|
+
|
173
|
+
insult = im_mad_because.find_resource('insult')
|
174
|
+
assert_equal(insult.uri(:path => { 'person' => 'king', 'a' => 'fink' }),
|
175
|
+
'http://www.example.com/im/mad/because/the/king/is/;a=fink')
|
176
|
+
|
177
|
+
im_mad_because_hes_a_fink = insult.bind!(:path => { 'person' => 'king', 'a' => 'fink' })
|
178
|
+
assert_equal(im_mad_because_hes_a_fink.uri,
|
179
|
+
'http://www.example.com/im/mad/because/the/king/is/;a=fink')
|
180
|
+
|
181
|
+
im_mad_because_hes_a_fink_lets = im_mad_because_hes_a_fink.find_resource("so-let's")
|
182
|
+
assert_equal(im_mad_because_hes_a_fink_lets.uri(:path => { 'do something' => 'revolt' }),
|
183
|
+
"http://www.example.com/im/mad/because/the/king/is/;a=fink/so-let's/revolt")
|
184
|
+
|
185
|
+
im_mad_because_hes_a_fink_lets_revolt = im_mad_because_hes_a_fink_lets.
|
186
|
+
bind(:path => { 'person' => 'fink', 'do something' => 'revolt' })
|
187
|
+
|
188
|
+
assert_equal(im_mad_because_hes_a_fink_lets_revolt.uri,
|
189
|
+
"http://www.example.com/im/mad/because/the/king/is/;a=fink/so-let's/revolt")
|
190
|
+
end
|
191
|
+
|
192
|
+
def test_repeating_arguments
|
193
|
+
text = <<-EOT
|
194
|
+
<resources base="http://www.example.com/">
|
195
|
+
<resource id="list" path="i/want/{a}">
|
196
|
+
<param name="a" repeating="true" style="%s" />
|
197
|
+
</resource>
|
198
|
+
</resources>
|
199
|
+
EOT
|
200
|
+
|
201
|
+
# NOTE: Repeating plain arguments get separated by commas
|
202
|
+
# (an arbitrary decision on my part).
|
203
|
+
{ 'plain' => 'http://www.example.com/i/want/pony,water%20slide,BB%20gun',
|
204
|
+
'matrix' => 'http://www.example.com/i/want/;a=pony;a=water%20slide;a=BB%20gun' }.each { |style, uri|
|
205
|
+
list = wadl(text % style).find_resource('list')
|
206
|
+
assert_equal(list.uri(:path => { :a => ['pony', 'water slide', 'BB gun'] }), uri)
|
207
|
+
}
|
208
|
+
end
|
209
|
+
|
210
|
+
def test_fixed_values
|
211
|
+
poll = wadl(<<-EOT).find_resource('poll')
|
212
|
+
<resources base="http://www.example.com/">
|
213
|
+
<resource id="poll" path="big-brother-is/{opinion}">
|
214
|
+
<param name="opinion" fixed="doubleplusgood" />
|
215
|
+
</resource>
|
216
|
+
</resources>
|
217
|
+
EOT
|
218
|
+
|
219
|
+
assert_equal(poll.uri(:opinion => 'ungood'),
|
220
|
+
'http://www.example.com/big-brother-is/doubleplusgood')
|
221
|
+
end
|
222
|
+
|
223
|
+
def test_matrix_values
|
224
|
+
lights = wadl(<<-EOT).find_resource('blinkenlights')
|
225
|
+
<resources base="http://www.example.com/">
|
226
|
+
<resource id="blinkenlights" path="light-panel/{light1}{light2}{light3}">
|
227
|
+
<param name="light1" type="xsd:boolean" style="matrix" fixed="true" />
|
228
|
+
<param name="light2" type="xsd:boolean" style="matrix" fixed="false" />
|
229
|
+
<param name="light3" type="xsd:boolean" style="matrix" />
|
230
|
+
</resource>
|
231
|
+
</resources>
|
232
|
+
EOT
|
233
|
+
|
234
|
+
on_uri = 'http://www.example.com/light-panel/;light1;light3'
|
235
|
+
off_uri = 'http://www.example.com/light-panel/;light1'
|
236
|
+
|
237
|
+
assert_equal(lights.uri(:path => { :light3 => 'true' }), on_uri)
|
238
|
+
assert_equal(lights.uri(:path => { :light3 => '1' }), on_uri)
|
239
|
+
|
240
|
+
assert_equal(lights.uri, off_uri)
|
241
|
+
assert_equal(lights.uri(:path => { :light3 => 'false' }), off_uri)
|
242
|
+
assert_equal(lights.uri(:path => { :light3 => false }), off_uri)
|
243
|
+
assert_equal(lights.uri(:path => { :light3 => 'True' }), off_uri)
|
244
|
+
assert_equal(lights.uri(:path => { :light3 => true }), off_uri)
|
245
|
+
end
|
246
|
+
|
247
|
+
class RequestFormatTests < WADLTest
|
248
|
+
|
249
|
+
def setup
|
250
|
+
@wadl = wadl(<<-EOT)
|
251
|
+
<resources base="http://www.example.com/">
|
252
|
+
<resource id="top" path="palette">
|
253
|
+
<param style="form" name="api_key" />
|
254
|
+
<resource id="color" path="colors/{color}">
|
255
|
+
<method href="#get_graphic" />
|
256
|
+
<method href="#set_graphic" />
|
257
|
+
</resource>
|
258
|
+
</resource>
|
259
|
+
</resources>
|
260
|
+
|
261
|
+
<method name="GET" id="get_graphic">
|
262
|
+
<request>
|
263
|
+
<param name="shade" type="xsd:string" required="true" />
|
264
|
+
</request>
|
265
|
+
</method>
|
266
|
+
|
267
|
+
<method name="POST" id="set_graphic">
|
268
|
+
<request>
|
269
|
+
<representation mediaType="application/x-www-form-encoded">
|
270
|
+
<param name="new_graphic" type="xsd:string" required="true" />
|
271
|
+
<param name="filename" type="xsd:string" required="true" />
|
272
|
+
</representation>
|
273
|
+
</request>
|
274
|
+
</method>
|
275
|
+
EOT
|
276
|
+
|
277
|
+
@color = @wadl.find_resource('top').bind(:query => { :api_key => 'foobar' }).find_resource('color')
|
278
|
+
end
|
279
|
+
|
280
|
+
def test_query_vars
|
281
|
+
graphic = @color.find_method('get_graphic')
|
282
|
+
path = { :color => 'blue' }
|
283
|
+
query = { :shade => 'light' }
|
284
|
+
|
285
|
+
assert_equal(graphic.request.uri(@color, :path => path, :query => query),
|
286
|
+
'http://www.example.com/palette/colors/blue?shade=light')
|
287
|
+
|
288
|
+
assert_raises(ArgumentError) { graphic.request.uri(@color, path) }
|
289
|
+
end
|
290
|
+
|
291
|
+
def test_representation
|
292
|
+
graphic = @color.find_method('set_graphic')
|
293
|
+
representation = graphic.request.find_form
|
294
|
+
|
295
|
+
assert_equal(representation % { :new_graphic => 'foobar', 'filename' => 'blue.jpg' },
|
296
|
+
'new_graphic=foobar&filename=blue.jpg')
|
297
|
+
|
298
|
+
assert_raises(ArgumentError) { representation % { :new_graphic => 'foobar' } }
|
299
|
+
end
|
300
|
+
|
301
|
+
end
|
302
|
+
|
303
|
+
end
|
metadata
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: wadl
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
- 1
|
9
|
+
version: 0.1.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Leonard Richardson
|
13
|
+
- Jens Wille
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-05-07 00:00:00 +02:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: rest-open-uri
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 0
|
30
|
+
version: "0"
|
31
|
+
type: :runtime
|
32
|
+
version_requirements: *id001
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: mime-types
|
35
|
+
prerelease: false
|
36
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
segments:
|
41
|
+
- 0
|
42
|
+
version: "0"
|
43
|
+
type: :runtime
|
44
|
+
version_requirements: *id002
|
45
|
+
description: Ruby client for the Web Application Description Language.
|
46
|
+
email:
|
47
|
+
- leonardr@segfault.org
|
48
|
+
- jens.wille@uni-koeln.de
|
49
|
+
executables: []
|
50
|
+
|
51
|
+
extensions: []
|
52
|
+
|
53
|
+
extra_rdoc_files:
|
54
|
+
- COPYING
|
55
|
+
- ChangeLog
|
56
|
+
- README
|
57
|
+
files:
|
58
|
+
- lib/wadl.rb
|
59
|
+
- lib/wadl/version.rb
|
60
|
+
- README
|
61
|
+
- ChangeLog
|
62
|
+
- Rakefile
|
63
|
+
- COPYING
|
64
|
+
- examples/yahoo.wadl
|
65
|
+
- examples/YahooSearch.rb
|
66
|
+
- examples/crummy.rb
|
67
|
+
- examples/yahoo.rb
|
68
|
+
- examples/crummy.wadl
|
69
|
+
- examples/delicious.wadl
|
70
|
+
- examples/YahooSearch.wadl
|
71
|
+
- examples/delicious.rb
|
72
|
+
- test/test_wadl.rb
|
73
|
+
has_rdoc: true
|
74
|
+
homepage: http://github.com/blackwinter/wadl
|
75
|
+
licenses: []
|
76
|
+
|
77
|
+
post_install_message:
|
78
|
+
rdoc_options:
|
79
|
+
- --charset
|
80
|
+
- UTF-8
|
81
|
+
- --title
|
82
|
+
- wadl Application documentation
|
83
|
+
- --main
|
84
|
+
- README
|
85
|
+
- --line-numbers
|
86
|
+
- --inline-source
|
87
|
+
- --all
|
88
|
+
require_paths:
|
89
|
+
- lib
|
90
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
segments:
|
95
|
+
- 0
|
96
|
+
version: "0"
|
97
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
98
|
+
requirements:
|
99
|
+
- - ">="
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
segments:
|
102
|
+
- 0
|
103
|
+
version: "0"
|
104
|
+
requirements: []
|
105
|
+
|
106
|
+
rubyforge_project:
|
107
|
+
rubygems_version: 1.3.6
|
108
|
+
signing_key:
|
109
|
+
specification_version: 3
|
110
|
+
summary: Ruby client for the Web Application Description Language.
|
111
|
+
test_files: []
|
112
|
+
|