wsdsl 0.4.3 → 0.5.0
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/VERSION +1 -1
- data/lib/params.rb +7 -0
- data/lib/response.rb +60 -0
- data/lib/wsdsl.rb +67 -44
- data/spec/test_services.rb +13 -13
- data/spec/wsdsl_spec.rb +104 -29
- data/wsdsl.gemspec +11 -11
- metadata +3 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.5.0
|
data/lib/params.rb
CHANGED
@@ -50,6 +50,13 @@ class WSDSL
|
|
50
50
|
@options[:space_name]
|
51
51
|
end
|
52
52
|
|
53
|
+
# Converts the rule into a hash with its name and options.
|
54
|
+
#
|
55
|
+
# @return [Hash]
|
56
|
+
def to_hash
|
57
|
+
{:name => name, :options => options}
|
58
|
+
end
|
59
|
+
|
53
60
|
end # of Rule
|
54
61
|
|
55
62
|
# The namespace used if any
|
data/lib/response.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
1
3
|
class WSDSL
|
2
4
|
# Response DSL class
|
3
5
|
# @api public
|
@@ -77,6 +79,26 @@ class WSDSL
|
|
77
79
|
@elements.find{|e| e.name.to_s == name.to_s}
|
78
80
|
end
|
79
81
|
|
82
|
+
|
83
|
+
# Converts the object into a JSON representation
|
84
|
+
# @return [String] JSON representation of the response
|
85
|
+
def to_json(*args)
|
86
|
+
if nodes.size > 1
|
87
|
+
nodes.to_json(*args)
|
88
|
+
else
|
89
|
+
nodes.first.to_json(*args)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
class Params
|
95
|
+
class Rule
|
96
|
+
def to_hash
|
97
|
+
{:name => name, :options => options}
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
80
102
|
# The Response element class describing each element of a service response.
|
81
103
|
# Instances are usually not instiated directly but via the Response#element accessor.
|
82
104
|
#
|
@@ -312,6 +334,44 @@ class WSDSL
|
|
312
334
|
attribute({name => :datetime}.merge(opts))
|
313
335
|
end
|
314
336
|
|
337
|
+
# Converts an element into a hash representation
|
338
|
+
#
|
339
|
+
# @return [Hash] the element attributes formated in a hash
|
340
|
+
def to_hash
|
341
|
+
attrs = {}
|
342
|
+
attributes.each{ |attr| attrs[attr.name] = attr.type }
|
343
|
+
elements.each{ |el| attrs[el.name] = el.to_hash } if elements
|
344
|
+
if self.class == Vector
|
345
|
+
name ? {name => [attrs]} : [attrs]
|
346
|
+
else
|
347
|
+
name ? {name => attrs} : attrs
|
348
|
+
end
|
349
|
+
end
|
350
|
+
|
351
|
+
def to_html
|
352
|
+
output = ""
|
353
|
+
if name
|
354
|
+
output << "<li>"
|
355
|
+
output << "<span class='label notice'>#{name}</span> of type <span class='label success'>#{self.is_a?(Vector) ? 'Array' : 'Object'}</span>"
|
356
|
+
end
|
357
|
+
if self.is_a? Vector
|
358
|
+
output << "<h6>Properties of each array item:</h6>"
|
359
|
+
else
|
360
|
+
output << "<h6>Properties:</h6>"
|
361
|
+
end
|
362
|
+
output << "<ul>"
|
363
|
+
properties.each do |prop|
|
364
|
+
output << "<li><span class='label notice'>#{prop.name}</span> of type <span class='label success'>#{prop.type}</span> "
|
365
|
+
output << prop.doc unless prop.doc.blank?
|
366
|
+
output << "</li>"
|
367
|
+
end
|
368
|
+
arrays.each{ |arr| output << arr.html }
|
369
|
+
elements.each {|el| output << el.to_html } if elements
|
370
|
+
output << "</ul>"
|
371
|
+
output << "</li>" if name
|
372
|
+
output
|
373
|
+
end
|
374
|
+
|
315
375
|
private
|
316
376
|
|
317
377
|
# Create a meta element attribute
|
data/lib/wsdsl.rb
CHANGED
@@ -8,14 +8,14 @@ require File.expand_path('ws_list', File.dirname(__FILE__))
|
|
8
8
|
# their params, http verbs, formats expected as well as the documentation
|
9
9
|
# for all these aspects of a web service.
|
10
10
|
#
|
11
|
-
# This DSL is only meant to describe a web service and isn't meant to cover any type
|
11
|
+
# This DSL is only meant to describe a web service and isn't meant to cover any type
|
12
12
|
# of implementation details. It is meant to be framework/tool agnostic.
|
13
13
|
#
|
14
14
|
# However, tools can be built around the Web Service DSL data structure to extract documentation,
|
15
15
|
# generate routing information, verify that an incoming request is valid, generate automated tests...
|
16
16
|
#
|
17
|
-
#
|
18
|
-
#
|
17
|
+
#
|
18
|
+
#
|
19
19
|
# WSDSL
|
20
20
|
# |
|
21
21
|
# |__ service options (name, url, SSL, auth required formats, verbs, controller name, action, version, extra)
|
@@ -37,71 +37,71 @@ require File.expand_path('ws_list', File.dirname(__FILE__))
|
|
37
37
|
# |_ response (instance of Documentation.new)
|
38
38
|
# |_ elements (array of instances of WSDSL::Documentation::ElementDoc, each element has a name and a list of attributes)
|
39
39
|
# |_ attributes (Hash with the key being the attribute name and the value being the attribute's documentation)
|
40
|
-
#
|
40
|
+
#
|
41
41
|
# @since 0.0.3
|
42
42
|
# @api public
|
43
43
|
class WSDSL
|
44
|
-
|
44
|
+
|
45
45
|
# Returns the service url
|
46
46
|
#
|
47
47
|
# @return [String] The service url
|
48
48
|
# @api public
|
49
49
|
attr_reader :url
|
50
|
-
|
50
|
+
|
51
51
|
# List of all the service params
|
52
52
|
#
|
53
53
|
# @return [Array<WSDSL::Params>]
|
54
54
|
# @api public
|
55
55
|
attr_reader :defined_params
|
56
|
-
|
56
|
+
|
57
57
|
# Documentation instance containing all the service doc
|
58
58
|
#
|
59
59
|
# @return [WSDSL::Documentation]
|
60
60
|
# @api public
|
61
61
|
attr_reader :doc
|
62
|
-
|
62
|
+
|
63
63
|
# The HTTP verb supported
|
64
64
|
#
|
65
65
|
# @return [Symbol]
|
66
66
|
# @api public
|
67
67
|
attr_reader :verb
|
68
|
-
|
68
|
+
|
69
69
|
# Service's version
|
70
70
|
#
|
71
71
|
# @return [String]
|
72
72
|
# @api public
|
73
73
|
attr_reader :version
|
74
|
-
|
74
|
+
|
75
75
|
# Controller instance associated with the service
|
76
76
|
#
|
77
77
|
# @return [WSController]
|
78
78
|
# @api public
|
79
79
|
attr_reader :controller
|
80
|
-
|
81
|
-
# Name of the controller action associated with the service
|
80
|
+
|
81
|
+
# Name of the controller action associated with the service
|
82
82
|
#
|
83
83
|
# @return [String]
|
84
84
|
# @api public
|
85
85
|
attr_accessor :action
|
86
|
-
|
86
|
+
|
87
87
|
# Name of the controller associated with the service
|
88
88
|
#
|
89
89
|
# @return [String]
|
90
90
|
# @api public
|
91
91
|
attr_accessor :controller_name
|
92
|
-
|
92
|
+
|
93
93
|
# Name of the service
|
94
94
|
#
|
95
95
|
# @return [String]
|
96
96
|
# @api public
|
97
97
|
attr_reader :name
|
98
|
-
|
98
|
+
|
99
99
|
# Is SSL required?
|
100
100
|
#
|
101
101
|
# @return [Boolean]
|
102
102
|
# @api public
|
103
103
|
attr_reader :ssl
|
104
|
-
|
104
|
+
|
105
105
|
# Is authentication required?
|
106
106
|
#
|
107
107
|
# @return [Boolean]
|
@@ -109,12 +109,12 @@ class WSDSL
|
|
109
109
|
attr_reader :auth_required
|
110
110
|
|
111
111
|
# Extra placeholder to store data in based on developer's discretion.
|
112
|
-
#
|
112
|
+
#
|
113
113
|
# @return [Hash] A hash storing extra data based.
|
114
114
|
# @api public
|
115
115
|
# @since 0.1
|
116
116
|
attr_reader :extra
|
117
|
-
|
117
|
+
|
118
118
|
# Service constructor which is usually used via {Kernel#describe_service}
|
119
119
|
#
|
120
120
|
# @param [String] url Service's url
|
@@ -142,7 +142,7 @@ class WSDSL
|
|
142
142
|
@auth_required = true
|
143
143
|
@extra = {}
|
144
144
|
end
|
145
|
-
|
145
|
+
|
146
146
|
# Checks the WSDSL flag to see if the controller names are pluralized.
|
147
147
|
#
|
148
148
|
# @return [Boolean] The updated value, default to false
|
@@ -155,7 +155,7 @@ class WSDSL
|
|
155
155
|
# Sets a WSDSL global flag so all controller names will be automatically pluralized.
|
156
156
|
#
|
157
157
|
# @param [Boolean] True if the controllers are pluralized, False otherwise.
|
158
|
-
#
|
158
|
+
#
|
159
159
|
# @return [Boolean] The updated value
|
160
160
|
# @api public
|
161
161
|
# @since 0.1.1
|
@@ -176,7 +176,7 @@ class WSDSL
|
|
176
176
|
# Sets a WSDSL global flag so the controller settings can be generated
|
177
177
|
# Setting this flag will automatically set the controller/action names.
|
178
178
|
# @param [Boolean] True if the controllers are pluralized, False otherwise.
|
179
|
-
#
|
179
|
+
#
|
180
180
|
# @return [Boolean] The updated value
|
181
181
|
# @api public
|
182
182
|
# @since 0.1.1
|
@@ -194,9 +194,10 @@ class WSDSL
|
|
194
194
|
# @api private
|
195
195
|
def controller_dispatch(app)
|
196
196
|
unless @controller
|
197
|
-
|
198
|
-
|
199
|
-
|
197
|
+
klass = @controller_name.split("::")
|
198
|
+
begin
|
199
|
+
@controller = klass.inject(Object) { |const,k| const.const_get(k) }
|
200
|
+
rescue NameError => e
|
200
201
|
raise "The #{@controller_name} class was not found"
|
201
202
|
end
|
202
203
|
end
|
@@ -204,8 +205,8 @@ class WSDSL
|
|
204
205
|
# param verification could be done when the controller gets initialized.
|
205
206
|
@controller.new(app, self).send(@action)
|
206
207
|
end
|
207
|
-
|
208
|
-
# Returns the defined params
|
208
|
+
|
209
|
+
# Returns the defined params
|
209
210
|
# for DSL use only!
|
210
211
|
# To keep the distinction between the request params and the service params
|
211
212
|
# using the +defined_params+ accessor is recommended.
|
@@ -221,7 +222,7 @@ class WSDSL
|
|
221
222
|
end
|
222
223
|
end
|
223
224
|
alias :param :params
|
224
|
-
|
225
|
+
|
225
226
|
# Returns true if the DSL defined any params
|
226
227
|
#
|
227
228
|
# @return [Boolean]
|
@@ -236,7 +237,7 @@ class WSDSL
|
|
236
237
|
def required_rules
|
237
238
|
@defined_params.list_required
|
238
239
|
end
|
239
|
-
|
240
|
+
|
240
241
|
# Returns an array of optional param rules
|
241
242
|
#
|
242
243
|
# @return [Array<WSDSL::Params::Rule>]Only the optional param rules
|
@@ -244,7 +245,7 @@ class WSDSL
|
|
244
245
|
def optional_rules
|
245
246
|
@defined_params.list_optional
|
246
247
|
end
|
247
|
-
|
248
|
+
|
248
249
|
# Returns an array of namespaced params
|
249
250
|
# @see WSDSL::Params#namespaced_params
|
250
251
|
#
|
@@ -253,7 +254,7 @@ class WSDSL
|
|
253
254
|
def nested_params
|
254
255
|
@defined_params.namespaced_params
|
255
256
|
end
|
256
|
-
|
257
|
+
|
257
258
|
# Mark that the service doesn't require authentication.
|
258
259
|
# Note: Authentication is turned on by default
|
259
260
|
#
|
@@ -262,7 +263,7 @@ class WSDSL
|
|
262
263
|
def disable_auth
|
263
264
|
@auth_required = false
|
264
265
|
end
|
265
|
-
|
266
|
+
|
266
267
|
# Mark that the service requires a SSL connection
|
267
268
|
#
|
268
269
|
# @return [Boolean]
|
@@ -270,19 +271,19 @@ class WSDSL
|
|
270
271
|
def enable_ssl
|
271
272
|
@ssl = true
|
272
273
|
end
|
273
|
-
|
274
|
+
|
274
275
|
# Mark the current service as not accepting any params.
|
275
|
-
# This is purely for expressing the developer's objective since
|
276
|
+
# This is purely for expressing the developer's objective since
|
276
277
|
# by default an error is raise if no params are defined and some
|
277
278
|
# params are sent.
|
278
|
-
#
|
279
|
+
#
|
279
280
|
# @return [Nil]
|
280
281
|
# @api public
|
281
282
|
def accept_no_params!
|
282
283
|
# no op operation since this is the default behavior
|
283
284
|
# unless params get defined. Makes sense for documentation tho.
|
284
285
|
end
|
285
|
-
|
286
|
+
|
286
287
|
# Returns the service response
|
287
288
|
# @yield The service response object
|
288
289
|
#
|
@@ -295,7 +296,7 @@ class WSDSL
|
|
295
296
|
@response
|
296
297
|
end
|
297
298
|
end
|
298
|
-
|
299
|
+
|
299
300
|
# Sets or returns the supported formats
|
300
301
|
# @param [String, Symbol] f_types Format type supported, such as :xml
|
301
302
|
#
|
@@ -305,7 +306,7 @@ class WSDSL
|
|
305
306
|
f_types.each{|f| @formats << f unless @formats.include?(f) }
|
306
307
|
@formats
|
307
308
|
end
|
308
|
-
|
309
|
+
|
309
310
|
# Sets the accepted HTTP verbs or return it if nothing is passed.
|
310
311
|
#
|
311
312
|
# @return [String, Symbol]
|
@@ -318,7 +319,7 @@ class WSDSL
|
|
318
319
|
update_restful_action(@verb)
|
319
320
|
@verb
|
320
321
|
end
|
321
|
-
|
322
|
+
|
322
323
|
# Yields and returns the documentation object
|
323
324
|
# @yield [WSDSL::Documentation]
|
324
325
|
#
|
@@ -328,17 +329,39 @@ class WSDSL
|
|
328
329
|
yield(doc)
|
329
330
|
end
|
330
331
|
|
331
|
-
|
332
|
+
# Assign a route loading point to compare two routes.
|
333
|
+
# Using this point value, one can load routes with the more globbing
|
334
|
+
# routes later than short routes.
|
335
|
+
#
|
336
|
+
# @return [Integer] point value
|
337
|
+
def route_loading_point
|
338
|
+
url =~ /(.*?):(.*?)[\/\.](.*)/
|
339
|
+
return url.size if $1.nil?
|
340
|
+
# The shortest the prepend, the further the service should be loaded
|
341
|
+
prepend = $1.size
|
342
|
+
# The shortest the placeholder, the further it should be in the queue
|
343
|
+
place_holder = $2.size
|
344
|
+
# The shortest the trail, the further it should be in the queue
|
345
|
+
trail = $3.size
|
346
|
+
prepend + place_holder + trail
|
347
|
+
end
|
348
|
+
|
349
|
+
# Compare two services using the route loading point
|
350
|
+
def <=> (other)
|
351
|
+
route_loading_point <=> other.route_loading_point
|
352
|
+
end
|
353
|
+
|
354
|
+
SERVICE_ROOT_REGEXP = /(.*?)[\/\(\.]/
|
332
355
|
SERVICE_ACTION_REGEXP = /[\/\(\.]([a-z0-9_]+)[\/\(\.\?]/i
|
333
356
|
SERVICE_RESTFUL_SHOW_REGEXP = /\/:[a-z0-9_]+\.\w{3}$/
|
334
|
-
|
357
|
+
|
335
358
|
private
|
336
|
-
|
359
|
+
|
337
360
|
# extracts the service root name out of the url using a regexp
|
338
361
|
def extract_service_root_name(url)
|
339
362
|
url[SERVICE_ROOT_REGEXP, 1] || url
|
340
363
|
end
|
341
|
-
|
364
|
+
|
342
365
|
# extracts the action name out of the url using a regexp
|
343
366
|
# Defaults to the list action
|
344
367
|
def extract_service_action(url)
|
@@ -348,7 +371,7 @@ class WSDSL
|
|
348
371
|
url[SERVICE_ACTION_REGEXP, 1] || 'list'
|
349
372
|
end
|
350
373
|
end
|
351
|
-
|
374
|
+
|
352
375
|
# Check if we need to use a restful route in which case we need
|
353
376
|
# to update the service action
|
354
377
|
def update_restful_action(verb)
|
@@ -388,5 +411,5 @@ module Kernel
|
|
388
411
|
WSList.add(service)
|
389
412
|
service
|
390
413
|
end
|
391
|
-
|
414
|
+
|
392
415
|
end
|
data/spec/test_services.rb
CHANGED
@@ -3,35 +3,35 @@ WSDSLSpecOptions = ['RSpec', 'Bacon'] # usually pulled from a model
|
|
3
3
|
describe_service "services/test.xml" do |service|
|
4
4
|
service.formats :xml, :json
|
5
5
|
service.http_verb :get
|
6
|
-
|
6
|
+
|
7
7
|
service.params do |p|
|
8
8
|
p.string :framework, :in => WSDSLSpecOptions, :null => false, :required => true
|
9
|
-
|
9
|
+
|
10
10
|
p.datetime :timestamp, :default => Time.now
|
11
11
|
p.string :alpha, :in => ['a', 'b', 'c']
|
12
12
|
p.string :version, :null => false
|
13
13
|
p.integer :num, :minvalue => 42
|
14
14
|
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
# service.param :delta, :optional => true, :type => 'float'
|
18
|
-
# # if the optional flag isn't passed, the param is considered required.
|
18
|
+
# # if the optional flag isn't passed, the param is considered required.
|
19
19
|
# service.param :epsilon, :type => 'string'
|
20
|
-
|
20
|
+
|
21
21
|
service.params.namespace :user do |user|
|
22
22
|
user.integer :id, :required => :true
|
23
23
|
user.string :sex, :in => %Q{female, male}
|
24
24
|
user.boolean :mailing_list, :default => true
|
25
25
|
end
|
26
|
-
|
27
|
-
# the response contains a list of player creation ratings each object in the list
|
28
|
-
|
26
|
+
|
27
|
+
# the response contains a list of player creation ratings each object in the list
|
28
|
+
|
29
29
|
service.response do |response|
|
30
30
|
response.element(:name => "player_creation_ratings") do |e|
|
31
31
|
e.attribute :id => :integer, :doc => "id doc"
|
32
32
|
e.attribute :is_accepted => :boolean, :doc => "is accepted doc"
|
33
33
|
e.attribute :name => :string, :doc => "name doc"
|
34
|
-
|
34
|
+
|
35
35
|
e.array :player_creation_rating, 'PlayerCreationRating' do |a|
|
36
36
|
a.attribute :comments => :string, :doc => "comments doc"
|
37
37
|
a.attribute :player_id => :integer, :doc => "player_id doc"
|
@@ -40,17 +40,17 @@ describe_service "services/test.xml" do |service|
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
service.documentation do |doc|
|
45
45
|
# doc.overall <markdown description text>
|
46
46
|
doc.overall <<-DOC
|
47
47
|
This is a test service used to test the framework.
|
48
48
|
DOC
|
49
|
-
|
49
|
+
|
50
50
|
# doc.params <name>, <definition>
|
51
51
|
doc.param :framework, "The test framework used, could be one of the two following: #{WSDSLSpecOptions.join(", ")}."
|
52
52
|
doc.param :version, "The version of the framework to use."
|
53
|
-
|
53
|
+
|
54
54
|
# doc.example <markdown text>
|
55
55
|
doc.example <<-DOC
|
56
56
|
The most common way to use this service looks like that:
|
@@ -69,7 +69,7 @@ end
|
|
69
69
|
describe_service "services.xml" do |service|
|
70
70
|
service.formats :xml
|
71
71
|
service.http_verb :put
|
72
|
-
|
72
|
+
|
73
73
|
end
|
74
74
|
|
75
75
|
describe_service "services/array_param.xml" do |s|
|
data/spec/wsdsl_spec.rb
CHANGED
@@ -1,25 +1,25 @@
|
|
1
1
|
require File.expand_path("spec_helper", File.dirname(__FILE__))
|
2
2
|
|
3
3
|
describe WSDSL do
|
4
|
-
|
4
|
+
|
5
5
|
before :all do
|
6
6
|
@service = WSList.all.find{|s| s.url == 'services/test.xml'}
|
7
7
|
@service.should_not be_nil
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
it "should have an url" do
|
11
11
|
# dummy test since that's how we found the service, but oh well
|
12
12
|
@service.url.should == 'services/test.xml'
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
it "should have some http verbs defined" do
|
16
16
|
@service.verb.should == :get
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
it "should have supported formats defined" do
|
20
20
|
@service.formats.should == [:xml, :json]
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
it "should have params info" do
|
24
24
|
@service.params.should be_an_instance_of(WSDSL::Params)
|
25
25
|
end
|
@@ -27,15 +27,89 @@ describe WSDSL do
|
|
27
27
|
it "should have direct access to the required params" do
|
28
28
|
@service.required_rules.should == @service.params.list_required
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
it "should have direct access to the optional params" do
|
32
32
|
@service.optional_rules.should == @service.params.list_optional
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
it "should have direct access to the nested params" do
|
36
36
|
@service.nested_params.should == @service.params.namespaced_params
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
|
+
describe "#controller_dispatch" do
|
40
|
+
|
41
|
+
class ProjectsController
|
42
|
+
def initialize(app, service)
|
43
|
+
@app = app
|
44
|
+
@service = service.name
|
45
|
+
end
|
46
|
+
|
47
|
+
def send(action)
|
48
|
+
[@app, @service, action]
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
module Projects
|
53
|
+
class TasksController < ProjectsController
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
module Projects
|
58
|
+
module Tasks
|
59
|
+
class ItemsController < ProjectsController
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
before :all do
|
65
|
+
@original_use_controller_dispatch = WSDSL.use_controller_dispatch
|
66
|
+
WSDSL.use_controller_dispatch = true
|
67
|
+
@original_services = WSList.all.dup
|
68
|
+
WSList.all.clear
|
69
|
+
end
|
70
|
+
|
71
|
+
after :all do
|
72
|
+
WSDSL.use_controller_dispatch = @original_use_controller_dispatch
|
73
|
+
WSList.all.replace @original_services
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should be able to dispatch controller" do
|
77
|
+
describe_service("projects.xml") { |s| }
|
78
|
+
service = WSList["projects.xml"]
|
79
|
+
service.controller_dispatch("application").
|
80
|
+
should == ["application", "projects", "list"]
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should be able to dispatch namespaced controller" do
|
84
|
+
describe_service("project/:project_id/tasks.xml") do |service|
|
85
|
+
service.controller_name = "Projects::TasksController"
|
86
|
+
service.action = "list"
|
87
|
+
end
|
88
|
+
|
89
|
+
describe_service("project/:project_id/task/:task_id/items.xml") do |service|
|
90
|
+
service.controller_name = "Projects::Tasks::ItemsController"
|
91
|
+
service.action = "list"
|
92
|
+
end
|
93
|
+
|
94
|
+
service = WSList["project/:project_id/tasks.xml"]
|
95
|
+
service.controller_dispatch("application").should == ["application", "project", "list"]
|
96
|
+
|
97
|
+
service = WSList["project/:project_id/task/:task_id/items.xml"]
|
98
|
+
service.controller_dispatch("application").should == ["application", "project", "list"]
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should raise exception when controller class is not found" do
|
102
|
+
describe_service("unknown.xml") do |service|
|
103
|
+
service.controller_name = "UnknownController"
|
104
|
+
service.action = "list"
|
105
|
+
end
|
106
|
+
service = WSList["unknown.xml"]
|
107
|
+
lambda { service.controller_dispatch("application") }.
|
108
|
+
should raise_error("The UnknownController class was not found")
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
|
39
113
|
describe "With controller dispatch on" do
|
40
114
|
before :all do
|
41
115
|
@original_services = WSList.all.dup
|
@@ -58,12 +132,12 @@ describe WSDSL do
|
|
58
132
|
ExtlibCopy.classify('preferences').should == 'Preferences'
|
59
133
|
service.controller_name.should == 'PreferencesController'
|
60
134
|
end
|
61
|
-
|
135
|
+
|
62
136
|
it "should set the action accordingly" do
|
63
137
|
@c_service.action.should_not be_nil
|
64
|
-
@c_service.action.should == 'test'
|
138
|
+
@c_service.action.should == 'test'
|
65
139
|
end
|
66
|
-
|
140
|
+
|
67
141
|
it "should support restful routes based on the HTTP verb" do
|
68
142
|
service = WSList.all.find{|s| s.url == "services.xml"}
|
69
143
|
service.should_not be_nil
|
@@ -110,21 +184,22 @@ describe WSDSL do
|
|
110
184
|
service.controller_name.should == "CustomController"
|
111
185
|
service.action.should == "foo"
|
112
186
|
end
|
187
|
+
|
113
188
|
end
|
114
189
|
|
115
190
|
|
116
191
|
describe WSDSL::Params do
|
117
|
-
|
192
|
+
|
118
193
|
before(:all) do
|
119
194
|
@sparams = @service.params
|
120
195
|
end
|
121
|
-
|
196
|
+
|
122
197
|
it "should have the possibility to have a space name" do
|
123
198
|
@sparams.should respond_to(:space_name)
|
124
199
|
service_params = WSDSL::Params.new(:space_name => 'spec_test')
|
125
200
|
service_params.space_name.should == 'spec_test'
|
126
201
|
end
|
127
|
-
|
202
|
+
|
128
203
|
it "should have a list of required param rules" do
|
129
204
|
@sparams.list_required.should be_an_instance_of(Array)
|
130
205
|
@sparams.list_required.length.should == 1
|
@@ -134,52 +209,52 @@ describe WSDSL do
|
|
134
209
|
@sparams.list_optional.should be_an_instance_of(Array)
|
135
210
|
@sparams.list_optional.length.should == 4
|
136
211
|
end
|
137
|
-
|
212
|
+
|
138
213
|
it "should have a list of namespaced param rules" do
|
139
214
|
@sparams.namespaced_params.should be_an_instance_of(Array)
|
140
215
|
@sparams.namespaced_params.length.should == 1
|
141
216
|
@sparams.namespaced_params.first.space_name.should == :user
|
142
217
|
end
|
143
|
-
|
218
|
+
|
144
219
|
describe WSDSL::Params::Rule do
|
145
220
|
before :all do
|
146
221
|
@rule = @sparams.list_required.first
|
147
222
|
@rule.should_not be_nil
|
148
223
|
end
|
149
|
-
|
224
|
+
|
150
225
|
it "should have a name" do
|
151
226
|
@rule.name.should == :framework
|
152
227
|
end
|
153
|
-
|
228
|
+
|
154
229
|
it "should have options" do
|
155
230
|
@rule.options[:type].should == :string
|
156
231
|
@rule.options[:in].should == WSDSLSpecOptions
|
157
232
|
@rule.options[:null].should be_false
|
158
233
|
end
|
159
234
|
end
|
160
|
-
|
235
|
+
|
161
236
|
end
|
162
|
-
|
237
|
+
|
163
238
|
it "should have some documentation" do
|
164
239
|
@service.doc.should be_an_instance_of(WSDSL::Documentation)
|
165
240
|
end
|
166
|
-
|
241
|
+
|
167
242
|
describe WSDSL::Documentation do
|
168
243
|
before(:all) do
|
169
244
|
@doc = @service.doc
|
170
245
|
@doc.should_not be_nil
|
171
246
|
end
|
172
|
-
|
247
|
+
|
173
248
|
it "should have an overall description" do
|
174
249
|
@doc.desc.strip.should == "This is a test service used to test the framework."
|
175
250
|
end
|
176
|
-
|
251
|
+
|
177
252
|
it "should have a list of params doc" do
|
178
253
|
@doc.params_doc.should be_an_instance_of(Hash)
|
179
254
|
@doc.params_doc.keys.sort.should == [:framework, :version]
|
180
255
|
@doc.params_doc[:framework].should == "The test framework used, could be one of the two following: #{WSDSLSpecOptions.join(", ")}."
|
181
256
|
end
|
182
|
-
|
257
|
+
|
183
258
|
it "should allow to define namespaced params doc" do
|
184
259
|
service = WSList.all.find{|s| s.url == "services.xml"}
|
185
260
|
service.documentation do |doc|
|
@@ -192,7 +267,7 @@ describe WSDSL do
|
|
192
267
|
ns.should_not be_nil
|
193
268
|
ns.params[:id].should == "Ze id."
|
194
269
|
end
|
195
|
-
|
270
|
+
|
196
271
|
it "should have an optional list of examples" do
|
197
272
|
@doc.examples.should be_an_instance_of(Array)
|
198
273
|
@doc.examples.first.should == <<-DOC
|
@@ -200,11 +275,11 @@ The most common way to use this service looks like that:
|
|
200
275
|
http://example.com/services/test.xml?framework=rspec&version=2.0.0
|
201
276
|
DOC
|
202
277
|
end
|
203
|
-
|
278
|
+
|
204
279
|
it "should have the service response documented" do
|
205
280
|
@doc.response.should_not be_nil
|
206
281
|
end
|
207
|
-
|
282
|
+
|
208
283
|
it "should have documentation for the response elements via the response itself" do
|
209
284
|
@service.response.elements.first.should_not be_nil
|
210
285
|
@service.response.elements.first.doc.should_not be_nil
|
@@ -215,7 +290,7 @@ The most common way to use this service looks like that:
|
|
215
290
|
@service.response.elements.first.doc.attributes.should_not be_empty
|
216
291
|
@service.response.elements.first.doc.attributes[:id].should == "id doc"
|
217
292
|
end
|
218
|
-
|
293
|
+
|
219
294
|
it "should have documentation for a response element array" do
|
220
295
|
element = @service.response.elements.first
|
221
296
|
element.arrays.should_not be_empty
|
@@ -223,7 +298,7 @@ The most common way to use this service looks like that:
|
|
223
298
|
element.arrays.first.type.should == "PlayerCreationRating"
|
224
299
|
element.arrays.first.attributes.should_not be_empty
|
225
300
|
end
|
226
|
-
|
301
|
+
|
227
302
|
it "should have documentation for the attributes of an response element array" do
|
228
303
|
element = @service.response.elements.first
|
229
304
|
array = element.arrays.first
|
data/wsdsl.gemspec
CHANGED
@@ -4,14 +4,14 @@
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
8
|
-
s.version = "0.
|
7
|
+
s.name = "wsdsl"
|
8
|
+
s.version = "0.5.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = [
|
12
|
-
s.date =
|
13
|
-
s.description =
|
14
|
-
s.email =
|
11
|
+
s.authors = ["Matt Aimonetti"]
|
12
|
+
s.date = "2012-01-10"
|
13
|
+
s.description = "A Ruby DSL describing Web Services without implementation details."
|
14
|
+
s.email = "mattaimonetti@gmail.com"
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"LICENSE",
|
17
17
|
"README.md"
|
@@ -43,11 +43,11 @@ Gem::Specification.new do |s|
|
|
43
43
|
"spec/wsdsl_spec.rb",
|
44
44
|
"wsdsl.gemspec"
|
45
45
|
]
|
46
|
-
s.homepage =
|
47
|
-
s.licenses = [
|
48
|
-
s.require_paths = [
|
49
|
-
s.rubygems_version =
|
50
|
-
s.summary =
|
46
|
+
s.homepage = "http://github.com/mattetti/wsdsl"
|
47
|
+
s.licenses = ["MIT"]
|
48
|
+
s.require_paths = ["lib"]
|
49
|
+
s.rubygems_version = "1.8.10"
|
50
|
+
s.summary = "Web Service DSL"
|
51
51
|
|
52
52
|
if s.respond_to? :specification_version then
|
53
53
|
s.specification_version = 3
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wsdsl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2012-01-10 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: A Ruby DSL describing Web Services without implementation details.
|
15
15
|
email: mattaimonetti@gmail.com
|
@@ -65,7 +65,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
65
65
|
version: '0'
|
66
66
|
requirements: []
|
67
67
|
rubyforge_project:
|
68
|
-
rubygems_version: 1.8.
|
68
|
+
rubygems_version: 1.8.10
|
69
69
|
signing_key:
|
70
70
|
specification_version: 3
|
71
71
|
summary: Web Service DSL
|