wadl 0.1.2 → 0.1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README +1 -1
- data/Rakefile +1 -1
- data/TODO +2 -0
- data/examples/README +2 -0
- data/lib/wadl.rb +24 -1234
- data/lib/wadl/address.rb +193 -0
- data/lib/wadl/application.rb +71 -0
- data/lib/wadl/cheap_schema.rb +343 -0
- data/lib/wadl/documentation.rb +41 -0
- data/lib/wadl/fault.rb +48 -0
- data/lib/wadl/fault_format.rb +67 -0
- data/lib/wadl/has_docs.rb +49 -0
- data/lib/wadl/http_method.rb +108 -0
- data/lib/wadl/link.rb +40 -0
- data/lib/wadl/option.rb +40 -0
- data/lib/wadl/param.rb +134 -0
- data/lib/wadl/representation_container.rb +47 -0
- data/lib/wadl/representation_format.rb +73 -0
- data/lib/wadl/request_format.rb +68 -0
- data/lib/wadl/resource.rb +163 -0
- data/lib/wadl/resource_and_address.rb +108 -0
- data/lib/wadl/resource_container.rb +58 -0
- data/lib/wadl/resource_type.rb +44 -0
- data/lib/wadl/resources.rb +44 -0
- data/lib/wadl/response.rb +36 -0
- data/lib/wadl/response_format.rb +108 -0
- data/lib/wadl/uri_parts.rb +63 -0
- data/lib/wadl/version.rb +1 -1
- data/lib/wadl/xml_representation.rb +64 -0
- data/test/test_wadl.rb +7 -0
- metadata +43 -8
@@ -0,0 +1,47 @@
|
|
1
|
+
#--
|
2
|
+
###############################################################################
|
3
|
+
# #
|
4
|
+
# A component of wadl, the super cheap Ruby WADL client. #
|
5
|
+
# #
|
6
|
+
# Copyright (C) 2006-2008 Leonard Richardson #
|
7
|
+
# Copyright (C) 2010 Jens Wille #
|
8
|
+
# #
|
9
|
+
# Authors: #
|
10
|
+
# Leonard Richardson <leonardr@segfault.org> (Original author) #
|
11
|
+
# Jens Wille <jens.wille@uni-koeln.de> #
|
12
|
+
# #
|
13
|
+
# wadl is free software; you can redistribute it and/or modify it under the #
|
14
|
+
# terms of the GNU General Public License as published by the Free Software #
|
15
|
+
# Foundation; either version 3 of the License, or (at your option) any later #
|
16
|
+
# version. #
|
17
|
+
# #
|
18
|
+
# wadl is distributed in the hope that it will be useful, but WITHOUT ANY #
|
19
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
|
20
|
+
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more #
|
21
|
+
# details. #
|
22
|
+
# #
|
23
|
+
# You should have received a copy of the GNU General Public License along #
|
24
|
+
# with wadl. If not, see <http://www.gnu.org/licenses/>. #
|
25
|
+
# #
|
26
|
+
###############################################################################
|
27
|
+
#++
|
28
|
+
|
29
|
+
require 'wadl'
|
30
|
+
|
31
|
+
module WADL
|
32
|
+
|
33
|
+
# A mixin for objects that contain representations
|
34
|
+
|
35
|
+
module RepresentationContainer
|
36
|
+
|
37
|
+
def find_representation_by_media_type(type)
|
38
|
+
representations.find { |r| r.mediaType == type }
|
39
|
+
end
|
40
|
+
|
41
|
+
def find_form
|
42
|
+
representations.find { |r| r.is_form_representation? }
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
#--
|
2
|
+
###############################################################################
|
3
|
+
# #
|
4
|
+
# A component of wadl, the super cheap Ruby WADL client. #
|
5
|
+
# #
|
6
|
+
# Copyright (C) 2006-2008 Leonard Richardson #
|
7
|
+
# Copyright (C) 2010 Jens Wille #
|
8
|
+
# #
|
9
|
+
# Authors: #
|
10
|
+
# Leonard Richardson <leonardr@segfault.org> (Original author) #
|
11
|
+
# Jens Wille <jens.wille@uni-koeln.de> #
|
12
|
+
# #
|
13
|
+
# wadl is free software; you can redistribute it and/or modify it under the #
|
14
|
+
# terms of the GNU General Public License as published by the Free Software #
|
15
|
+
# Foundation; either version 3 of the License, or (at your option) any later #
|
16
|
+
# version. #
|
17
|
+
# #
|
18
|
+
# wadl is distributed in the hope that it will be useful, but WITHOUT ANY #
|
19
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
|
20
|
+
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more #
|
21
|
+
# details. #
|
22
|
+
# #
|
23
|
+
# You should have received a copy of the GNU General Public License along #
|
24
|
+
# with wadl. If not, see <http://www.gnu.org/licenses/>. #
|
25
|
+
# #
|
26
|
+
###############################################################################
|
27
|
+
#++
|
28
|
+
|
29
|
+
require 'cgi'
|
30
|
+
require 'wadl'
|
31
|
+
|
32
|
+
module WADL
|
33
|
+
|
34
|
+
class RepresentationFormat < HasDocs
|
35
|
+
|
36
|
+
in_document 'representation'
|
37
|
+
has_attributes :id, :mediaType, :element
|
38
|
+
has_many Param
|
39
|
+
may_be_reference
|
40
|
+
|
41
|
+
def is_form_representation?
|
42
|
+
mediaType == 'application/x-www-form-encoded' || mediaType == 'multipart/form-data'
|
43
|
+
end
|
44
|
+
|
45
|
+
# Creates a representation by plugging a set of parameters
|
46
|
+
# into a representation format.
|
47
|
+
def %(values)
|
48
|
+
unless mediaType == 'application/x-www-form-encoded'
|
49
|
+
raise "wadl.rb can't instantiate a representation of type #{mediaType}"
|
50
|
+
end
|
51
|
+
|
52
|
+
representation = []
|
53
|
+
|
54
|
+
params.each { |param|
|
55
|
+
name = param.name
|
56
|
+
|
57
|
+
if param.fixed
|
58
|
+
p_values = [param.fixed]
|
59
|
+
elsif p_values = values[name] || values[name.to_sym]
|
60
|
+
p_values = [p_values] if !param.repeating? || !p_values.respond_to?(:each) || p_values.respond_to?(:to_str)
|
61
|
+
else
|
62
|
+
raise ArgumentError, "Your proposed representation is missing a value for #{param.name}" if param.required?
|
63
|
+
end
|
64
|
+
|
65
|
+
p_values.each { |v| representation << "#{CGI::escape(name)}=#{CGI::escape(v.to_s)}" } if p_values
|
66
|
+
}
|
67
|
+
|
68
|
+
representation.join('&')
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
#--
|
2
|
+
###############################################################################
|
3
|
+
# #
|
4
|
+
# A component of wadl, the super cheap Ruby WADL client. #
|
5
|
+
# #
|
6
|
+
# Copyright (C) 2006-2008 Leonard Richardson #
|
7
|
+
# Copyright (C) 2010 Jens Wille #
|
8
|
+
# #
|
9
|
+
# Authors: #
|
10
|
+
# Leonard Richardson <leonardr@segfault.org> (Original author) #
|
11
|
+
# Jens Wille <jens.wille@uni-koeln.de> #
|
12
|
+
# #
|
13
|
+
# wadl is free software; you can redistribute it and/or modify it under the #
|
14
|
+
# terms of the GNU General Public License as published by the Free Software #
|
15
|
+
# Foundation; either version 3 of the License, or (at your option) any later #
|
16
|
+
# version. #
|
17
|
+
# #
|
18
|
+
# wadl is distributed in the hope that it will be useful, but WITHOUT ANY #
|
19
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
|
20
|
+
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more #
|
21
|
+
# details. #
|
22
|
+
# #
|
23
|
+
# You should have received a copy of the GNU General Public License along #
|
24
|
+
# with wadl. If not, see <http://www.gnu.org/licenses/>. #
|
25
|
+
# #
|
26
|
+
###############################################################################
|
27
|
+
#++
|
28
|
+
|
29
|
+
require 'wadl'
|
30
|
+
|
31
|
+
module WADL
|
32
|
+
|
33
|
+
class RequestFormat < HasDocs
|
34
|
+
|
35
|
+
include RepresentationContainer
|
36
|
+
|
37
|
+
in_document 'request'
|
38
|
+
has_many RepresentationFormat, Param
|
39
|
+
|
40
|
+
# Returns a URI and a set of HTTP headers for this request.
|
41
|
+
def uri(resource, args = {})
|
42
|
+
uri = resource.uri(args)
|
43
|
+
|
44
|
+
query_values = args[:query] || {}
|
45
|
+
header_values = args[:headers] || {}
|
46
|
+
|
47
|
+
params.each { |param|
|
48
|
+
name = param.name
|
49
|
+
|
50
|
+
if param.style == 'header'
|
51
|
+
value = header_values[name] || header_values[name.to_sym]
|
52
|
+
value = param % value
|
53
|
+
|
54
|
+
uri.headers[name] = value if value
|
55
|
+
else
|
56
|
+
value = query_values[name] || query_values[name.to_sym]
|
57
|
+
value = param.format(value, nil, 'query')
|
58
|
+
|
59
|
+
uri.query << value if value
|
60
|
+
end
|
61
|
+
}
|
62
|
+
|
63
|
+
uri
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
@@ -0,0 +1,163 @@
|
|
1
|
+
#--
|
2
|
+
###############################################################################
|
3
|
+
# #
|
4
|
+
# A component of wadl, the super cheap Ruby WADL client. #
|
5
|
+
# #
|
6
|
+
# Copyright (C) 2006-2008 Leonard Richardson #
|
7
|
+
# Copyright (C) 2010 Jens Wille #
|
8
|
+
# #
|
9
|
+
# Authors: #
|
10
|
+
# Leonard Richardson <leonardr@segfault.org> (Original author) #
|
11
|
+
# Jens Wille <jens.wille@uni-koeln.de> #
|
12
|
+
# #
|
13
|
+
# wadl is free software; you can redistribute it and/or modify it under the #
|
14
|
+
# terms of the GNU General Public License as published by the Free Software #
|
15
|
+
# Foundation; either version 3 of the License, or (at your option) any later #
|
16
|
+
# version. #
|
17
|
+
# #
|
18
|
+
# wadl is distributed in the hope that it will be useful, but WITHOUT ANY #
|
19
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
|
20
|
+
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more #
|
21
|
+
# details. #
|
22
|
+
# #
|
23
|
+
# You should have received a copy of the GNU General Public License along #
|
24
|
+
# with wadl. If not, see <http://www.gnu.org/licenses/>. #
|
25
|
+
# #
|
26
|
+
###############################################################################
|
27
|
+
#++
|
28
|
+
|
29
|
+
require 'set'
|
30
|
+
require 'wadl'
|
31
|
+
|
32
|
+
module WADL
|
33
|
+
|
34
|
+
class Resource < HasDocs
|
35
|
+
|
36
|
+
include ResourceContainer
|
37
|
+
|
38
|
+
in_document 'resource'
|
39
|
+
has_attributes :id, :path
|
40
|
+
has_many Resource, HTTPMethod, Param, ResourceType
|
41
|
+
may_be_reference # not conforming to spec (20090831), but tests make use of it
|
42
|
+
|
43
|
+
def initialize(*args)
|
44
|
+
super
|
45
|
+
end
|
46
|
+
|
47
|
+
def dereference_with_context(child)
|
48
|
+
ResourceAndAddress.new(child, parent.address)
|
49
|
+
end
|
50
|
+
|
51
|
+
# Returns a ResourceAndAddress object bound to this resource
|
52
|
+
# and the given query variables.
|
53
|
+
def bind(args = {})
|
54
|
+
ResourceAndAddress.new(self).bind!(args)
|
55
|
+
end
|
56
|
+
|
57
|
+
# Sets basic auth parameters
|
58
|
+
def with_basic_auth(user, pass, header = 'Authorization')
|
59
|
+
bind(:headers => { header => "Basic #{["#{user}:#{pass}"].pack('m')}" })
|
60
|
+
end
|
61
|
+
|
62
|
+
# Sets OAuth parameters
|
63
|
+
#
|
64
|
+
# Args:
|
65
|
+
# :consumer_key
|
66
|
+
# :consumer_secret
|
67
|
+
# :access_token
|
68
|
+
# :token_secret
|
69
|
+
def with_oauth(*args)
|
70
|
+
header, prefix = HTTPMethod::OAUTH_HEADER, HTTPMethod::OAUTH_PREFIX
|
71
|
+
bind(:headers => { header => "#{prefix}#{args.to_yaml}" })
|
72
|
+
end
|
73
|
+
|
74
|
+
def uri(args = {}, working_address = nil)
|
75
|
+
address(working_address).uri(args)
|
76
|
+
end
|
77
|
+
|
78
|
+
# Returns an Address object refering to this resource
|
79
|
+
def address(working_address = nil)
|
80
|
+
working_address &&= working_address.deep_copy
|
81
|
+
|
82
|
+
working_address ||= if parent.respond_to?(:base)
|
83
|
+
address = Address.new
|
84
|
+
address.path_fragments << parent.base
|
85
|
+
address
|
86
|
+
else
|
87
|
+
parent.address.deep_copy
|
88
|
+
end
|
89
|
+
|
90
|
+
working_address.path_fragments << path.dup
|
91
|
+
|
92
|
+
# Install path, query, and header parameters in the Address. These
|
93
|
+
# may override existing parameters with the same names, but if
|
94
|
+
# you've got a WADL application that works that way, you should
|
95
|
+
# have bound parameters to values earlier.
|
96
|
+
new_path_fragments = []
|
97
|
+
embedded_param_names = Set.new(Address.embedded_param_names(path))
|
98
|
+
|
99
|
+
params.each { |param|
|
100
|
+
name = param.name
|
101
|
+
|
102
|
+
if embedded_param_names.include?(name)
|
103
|
+
working_address.path_params[name] = param
|
104
|
+
else
|
105
|
+
if param.style == 'query'
|
106
|
+
working_address.query_params[name] = param
|
107
|
+
elsif param.style == 'header'
|
108
|
+
working_address.header_params[name] = param
|
109
|
+
else
|
110
|
+
new_path_fragments << param
|
111
|
+
working_address.path_params[name] = param
|
112
|
+
end
|
113
|
+
end
|
114
|
+
}
|
115
|
+
|
116
|
+
working_address.path_fragments << new_path_fragments unless new_path_fragments.empty?
|
117
|
+
|
118
|
+
working_address
|
119
|
+
end
|
120
|
+
|
121
|
+
def representation_for(http_method, request = true, all = false)
|
122
|
+
method = find_method_by_http_method(http_method)
|
123
|
+
representations = (request ? method.request : method.response).representations
|
124
|
+
|
125
|
+
all ? representations : representations[0]
|
126
|
+
end
|
127
|
+
|
128
|
+
def find_by_id(id)
|
129
|
+
id = id.to_s
|
130
|
+
resources.find { |r| r.dereference.id == id }
|
131
|
+
end
|
132
|
+
|
133
|
+
# Find HTTP methods in this resource and in the mixed-in types
|
134
|
+
def each_http_method
|
135
|
+
[self, *resource_types].each { |t| t.http_methods.each { |m| yield m } }
|
136
|
+
end
|
137
|
+
|
138
|
+
def find_method_by_id(id)
|
139
|
+
id = id.to_s
|
140
|
+
each_http_method { |m| return m if m.dereference.id == id }
|
141
|
+
end
|
142
|
+
|
143
|
+
def find_method_by_http_method(action)
|
144
|
+
action = action.to_s.downcase
|
145
|
+
each_http_method { |m| return m if m.dereference.name.downcase == action }
|
146
|
+
end
|
147
|
+
|
148
|
+
# Methods for reading or writing this resource
|
149
|
+
def self.define_http_methods(klass = self, methods = %w[get post put delete])
|
150
|
+
methods.each { |method|
|
151
|
+
klass.class_eval <<-EOT, __FILE__, __LINE__ + 1
|
152
|
+
def #{method}(*args, &block)
|
153
|
+
find_method_by_http_method(:#{method}).call(self, *args, &block)
|
154
|
+
end
|
155
|
+
EOT
|
156
|
+
}
|
157
|
+
end
|
158
|
+
|
159
|
+
define_http_methods
|
160
|
+
|
161
|
+
end
|
162
|
+
|
163
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
#--
|
2
|
+
###############################################################################
|
3
|
+
# #
|
4
|
+
# A component of wadl, the super cheap Ruby WADL client. #
|
5
|
+
# #
|
6
|
+
# Copyright (C) 2006-2008 Leonard Richardson #
|
7
|
+
# Copyright (C) 2010 Jens Wille #
|
8
|
+
# #
|
9
|
+
# Authors: #
|
10
|
+
# Leonard Richardson <leonardr@segfault.org> (Original author) #
|
11
|
+
# Jens Wille <jens.wille@uni-koeln.de> #
|
12
|
+
# #
|
13
|
+
# wadl is free software; you can redistribute it and/or modify it under the #
|
14
|
+
# terms of the GNU General Public License as published by the Free Software #
|
15
|
+
# Foundation; either version 3 of the License, or (at your option) any later #
|
16
|
+
# version. #
|
17
|
+
# #
|
18
|
+
# wadl is distributed in the hope that it will be useful, but WITHOUT ANY #
|
19
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
|
20
|
+
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more #
|
21
|
+
# details. #
|
22
|
+
# #
|
23
|
+
# You should have received a copy of the GNU General Public License along #
|
24
|
+
# with wadl. If not, see <http://www.gnu.org/licenses/>. #
|
25
|
+
# #
|
26
|
+
###############################################################################
|
27
|
+
#++
|
28
|
+
|
29
|
+
require 'delegate'
|
30
|
+
require 'wadl'
|
31
|
+
|
32
|
+
module WADL
|
33
|
+
|
34
|
+
# A resource bound beneath a certain address. Used to keep track of a
|
35
|
+
# path through a twisting resource hierarchy that includes references.
|
36
|
+
|
37
|
+
class ResourceAndAddress < DelegateClass(Resource)
|
38
|
+
|
39
|
+
def initialize(resource, address = nil, combine_address_with_resource = true)
|
40
|
+
@resource = resource
|
41
|
+
@address = combine_address_with_resource ? resource.address(address) : address
|
42
|
+
|
43
|
+
super(resource)
|
44
|
+
end
|
45
|
+
|
46
|
+
# The id method is not delegated, because it's the name of a
|
47
|
+
# (deprecated) built-in Ruby method. We wnat to delegate it.
|
48
|
+
def id
|
49
|
+
@resource.id
|
50
|
+
end
|
51
|
+
|
52
|
+
def to_s
|
53
|
+
inspect
|
54
|
+
end
|
55
|
+
|
56
|
+
def inspect
|
57
|
+
"ResourceAndAddress\n Resource: #{@resource}\n #{@address.inspect}"
|
58
|
+
end
|
59
|
+
|
60
|
+
def address
|
61
|
+
@address
|
62
|
+
end
|
63
|
+
|
64
|
+
def bind(*args)
|
65
|
+
ResourceAndAddress.new(@resource, @address.deep_copy, false).bind!(*args)
|
66
|
+
end
|
67
|
+
|
68
|
+
def bind!(args = {})
|
69
|
+
@address.bind!(args)
|
70
|
+
self
|
71
|
+
end
|
72
|
+
|
73
|
+
def uri(args = {})
|
74
|
+
@address.deep_copy.bind!(args).uri
|
75
|
+
end
|
76
|
+
|
77
|
+
# method_missing is to catch generated methods that don't get delegated.
|
78
|
+
def method_missing(name, *args, &block)
|
79
|
+
if @resource.respond_to?(name)
|
80
|
+
result = @resource.send(name, *args, &block)
|
81
|
+
result.is_a?(Resource) ? ResourceAndAddress.new(result, @address.dup) : result
|
82
|
+
else
|
83
|
+
super
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
# method_missing won't catch these guys because they were defined in
|
88
|
+
# the delegation operation.
|
89
|
+
def resource(*args, &block)
|
90
|
+
resource = @resource.resource(*args, &block)
|
91
|
+
resource && ResourceAndAddress.new(resource, @address)
|
92
|
+
end
|
93
|
+
|
94
|
+
def find_resource(*args, &block)
|
95
|
+
resource = @resource.find_resource(*args, &block)
|
96
|
+
resource && ResourceAndAddress.new(resource, @address)
|
97
|
+
end
|
98
|
+
|
99
|
+
def find_resource_by_path(*args, &block)
|
100
|
+
resource = @resource.find_resource_by_path(*args, &block)
|
101
|
+
resource && ResourceAndAddress.new(resource, @address)
|
102
|
+
end
|
103
|
+
|
104
|
+
Resource.define_http_methods(self)
|
105
|
+
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|