wadl 0.1.3.1 → 0.1.4
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/README +1 -1
- data/TODO +0 -1
- data/bin/wadl +31 -0
- data/examples/config.yaml +5 -0
- data/examples/crummy.wadl +1 -1
- data/lib/wadl/cli.rb +318 -0
- data/lib/wadl/http_method.rb +6 -2
- data/lib/wadl/representation_format.rb +2 -2
- data/lib/wadl/version.rb +1 -1
- data/test/test_wadl.rb +1 -1
- metadata +9 -7
data/README
CHANGED
data/TODO
CHANGED
data/bin/wadl
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
|
3
|
+
#--
|
4
|
+
###############################################################################
|
5
|
+
# #
|
6
|
+
# wadl -- Super cheap Ruby WADL client #
|
7
|
+
# #
|
8
|
+
# Copyright (C) 2010 Jens Wille #
|
9
|
+
# #
|
10
|
+
# Authors: #
|
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/cli'
|
30
|
+
|
31
|
+
WADL::CLI.execute(ARGV, STDIN, STDOUT, STDERR)
|
data/examples/crummy.wadl
CHANGED
@@ -18,7 +18,7 @@
|
|
18
18
|
|
19
19
|
<method name="POST" id="add">
|
20
20
|
<request>
|
21
|
-
<representation mediaType="application/x-www-form-
|
21
|
+
<representation mediaType="application/x-www-form-urlencoded">
|
22
22
|
<param name="password" type="xsd:string" required="true" />
|
23
23
|
<param name="entry" type="xsd:string" required="true" />
|
24
24
|
<param name="title" type="xsd:string" />
|
data/lib/wadl/cli.rb
ADDED
@@ -0,0 +1,318 @@
|
|
1
|
+
#--
|
2
|
+
###############################################################################
|
3
|
+
# #
|
4
|
+
# A component of wadl, the super cheap Ruby WADL client. #
|
5
|
+
# #
|
6
|
+
# Copyright (C) 2010 Jens Wille #
|
7
|
+
# #
|
8
|
+
# Authors: #
|
9
|
+
# Jens Wille <jens.wille@uni-koeln.de> #
|
10
|
+
# #
|
11
|
+
# wadl is free software; you can redistribute it and/or modify it under the #
|
12
|
+
# terms of the GNU General Public License as published by the Free Software #
|
13
|
+
# Foundation; either version 3 of the License, or (at your option) any later #
|
14
|
+
# version. #
|
15
|
+
# #
|
16
|
+
# wadl is distributed in the hope that it will be useful, but WITHOUT ANY #
|
17
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
|
18
|
+
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more #
|
19
|
+
# details. #
|
20
|
+
# #
|
21
|
+
# You should have received a copy of the GNU General Public License along #
|
22
|
+
# with wadl. If not, see <http://www.gnu.org/licenses/>. #
|
23
|
+
# #
|
24
|
+
###############################################################################
|
25
|
+
#++
|
26
|
+
|
27
|
+
require 'optparse'
|
28
|
+
require 'yaml'
|
29
|
+
require 'highline'
|
30
|
+
require 'stringio'
|
31
|
+
require 'wadl'
|
32
|
+
|
33
|
+
begin
|
34
|
+
require 'oauth/cli'
|
35
|
+
rescue LoadError
|
36
|
+
warn "For OAuth support, install the 'oauth' library."
|
37
|
+
end
|
38
|
+
|
39
|
+
module WADL
|
40
|
+
|
41
|
+
class CLI
|
42
|
+
|
43
|
+
USAGE = "Usage: #{$0} [-h|--help] [options] <resource-path> [-- arguments]"
|
44
|
+
|
45
|
+
DEFAULTS = {
|
46
|
+
:config => 'config.yaml',
|
47
|
+
:method => 'GET',
|
48
|
+
:user => ENV['USER'] || '',
|
49
|
+
:request_token_url => '%s/oauth/request_token',
|
50
|
+
:access_token_url => '%s/oauth/access_token',
|
51
|
+
:authorize_url => '%s/oauth/authorize'
|
52
|
+
}
|
53
|
+
|
54
|
+
OPTION_RE = %r{\A--?(\w+)}
|
55
|
+
RESOURCE_PATH_RE = %r{[. /]}
|
56
|
+
|
57
|
+
def self.execute(*args)
|
58
|
+
new.execute(*args)
|
59
|
+
end
|
60
|
+
|
61
|
+
attr_reader :options, :config, :defaults
|
62
|
+
attr_reader :stdin, :stdout, :stderr
|
63
|
+
attr_reader :resource_path, :opts
|
64
|
+
|
65
|
+
def initialize(defaults = DEFAULTS)
|
66
|
+
@defaults = defaults
|
67
|
+
|
68
|
+
reset
|
69
|
+
|
70
|
+
# prevent backtrace on ^C
|
71
|
+
trap(:INT) { exit 130 }
|
72
|
+
end
|
73
|
+
|
74
|
+
def execute(arguments = [], *inouterr)
|
75
|
+
reset(*inouterr)
|
76
|
+
|
77
|
+
abort USAGE if arguments.empty?
|
78
|
+
parse_options(arguments, defaults)
|
79
|
+
|
80
|
+
abort YAML.dump(options), 0, stdout if options.delete(:dump_config)
|
81
|
+
|
82
|
+
parse_arguments(arguments)
|
83
|
+
abort USAGE if resource_path.empty?
|
84
|
+
|
85
|
+
abort 'WADL required' unless options[:wadl]
|
86
|
+
options[:wadl] %= options[:base_url] if options[:base_url]
|
87
|
+
|
88
|
+
response = auth_resource.send(options[:method].downcase, :query => opts)
|
89
|
+
|
90
|
+
stderr.puts response.code.join(' ')
|
91
|
+
stdout.puts response.representation unless response.code.first =~ /\A[45]/
|
92
|
+
end
|
93
|
+
|
94
|
+
def api
|
95
|
+
@api ||= WADL::Application.from_wadl(open(options[:wadl]))
|
96
|
+
end
|
97
|
+
|
98
|
+
def resource
|
99
|
+
@resource ||= begin
|
100
|
+
path = [options[:api_base], *resource_path].compact.join(' ')
|
101
|
+
path.split(RESOURCE_PATH_RE).inject(api) { |m, n| m.send(n) }
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def auth_resource
|
106
|
+
@auth_resource ||= if options[:basic]
|
107
|
+
basic_auth_resource
|
108
|
+
elsif options[:oauth]
|
109
|
+
oauth_resource
|
110
|
+
else
|
111
|
+
resource
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def reset(stdin = STDIN, stdout = STDOUT, stderr = STDERR)
|
116
|
+
@stdin, @stdout, @stderr = stdin, stdout, stderr
|
117
|
+
@api = @resource = @auth_resource = nil
|
118
|
+
@options, @config = {}, {}
|
119
|
+
end
|
120
|
+
|
121
|
+
private
|
122
|
+
|
123
|
+
def ask(question, &block)
|
124
|
+
HighLine.new(stdin, stdout).ask(question, &block)
|
125
|
+
end
|
126
|
+
|
127
|
+
def abort(msg = nil, status = 1, output = stderr)
|
128
|
+
output.puts msg if msg
|
129
|
+
exit status
|
130
|
+
end
|
131
|
+
|
132
|
+
def parse_options(arguments, defaults)
|
133
|
+
option_parser(defaults).parse!(arguments)
|
134
|
+
|
135
|
+
config_file = options[:config] || defaults[:config]
|
136
|
+
@config = YAML.load_file(config_file) if File.readable?(config_file)
|
137
|
+
|
138
|
+
[config, defaults].each { |hash| hash.each { |key, value| options[key] ||= value } }
|
139
|
+
end
|
140
|
+
|
141
|
+
def parse_arguments(arguments)
|
142
|
+
@resource_path, @opts, skip = [], {}, false
|
143
|
+
|
144
|
+
arguments.each_with_index { |arg, index|
|
145
|
+
if skip
|
146
|
+
skip = false
|
147
|
+
next
|
148
|
+
end
|
149
|
+
|
150
|
+
case arg
|
151
|
+
when OPTION_RE
|
152
|
+
key, value = $1, arguments[index + 1]
|
153
|
+
|
154
|
+
value =~ OPTION_RE ? value = '1' : skip = true
|
155
|
+
|
156
|
+
opts[key] = value
|
157
|
+
else
|
158
|
+
resource_path << arg
|
159
|
+
end
|
160
|
+
}
|
161
|
+
end
|
162
|
+
|
163
|
+
def basic_auth_resource
|
164
|
+
user, pass = options.values_at(:user, :password)
|
165
|
+
pass ||= ask("Password for user #{user}: ") { |q| q.echo = false }
|
166
|
+
|
167
|
+
abort 'USER and PASSWORD required' unless user && pass
|
168
|
+
|
169
|
+
resource.with_basic_auth(user, pass)
|
170
|
+
end
|
171
|
+
|
172
|
+
def oauth_resource
|
173
|
+
consumer_key, consumer_secret = options.values_at(:consumer_key, :consumer_secret)
|
174
|
+
access_token, token_secret = options.values_at(:token, :secret)
|
175
|
+
|
176
|
+
abort "CONSUMER KEY and SECRET required" unless consumer_key && consumer_secret
|
177
|
+
|
178
|
+
unless access_token && token_secret
|
179
|
+
access_token, token_secret = oauthorize(consumer_key, consumer_secret)
|
180
|
+
abort 'Authorization failed!?' unless access_token && token_secret
|
181
|
+
end
|
182
|
+
|
183
|
+
resource.with_oauth(consumer_key, consumer_secret, access_token, token_secret)
|
184
|
+
end
|
185
|
+
|
186
|
+
def oauthorize(consumer_key, consumer_secret)
|
187
|
+
strio = StringIO.new
|
188
|
+
|
189
|
+
def strio.puts(*args)
|
190
|
+
stdout.puts(*args)
|
191
|
+
super
|
192
|
+
end
|
193
|
+
|
194
|
+
base_url = options[:base_url] || File.dirname(options[:wadl])
|
195
|
+
|
196
|
+
OAuth::CLI.execute(stdout, stdin, stderr, [
|
197
|
+
'--consumer-key', consumer_key,
|
198
|
+
'--consumer-secret', consumer_secret,
|
199
|
+
'--request-token-url', options[:request_token_url] % base_url,
|
200
|
+
'--access-token-url', options[:access_token_url] % base_url,
|
201
|
+
'--authorize-url', options[:authorize_url] % base_url,
|
202
|
+
'--callback-url', 'oob',
|
203
|
+
'authorize'
|
204
|
+
])
|
205
|
+
|
206
|
+
result = strio.string
|
207
|
+
access_token = result[/^\s+oauth_token:\s+(.*)$/, 1]
|
208
|
+
token_secret = result[/^\s+oauth_token_secret:\s+(.*)$/, 1]
|
209
|
+
|
210
|
+
return unless access_token && token_secret
|
211
|
+
|
212
|
+
if File.writable?(options[:config])
|
213
|
+
config[:token] = access_token
|
214
|
+
config[:token_secret] = token_secret
|
215
|
+
|
216
|
+
File.open(options[:config], 'w') { |f| YAML.dump(config, f) }
|
217
|
+
end
|
218
|
+
|
219
|
+
[access_token, token_secret]
|
220
|
+
end
|
221
|
+
|
222
|
+
def option_parser(defaults)
|
223
|
+
OptionParser.new { |opts|
|
224
|
+
opts.banner = USAGE
|
225
|
+
|
226
|
+
opts.separator ''
|
227
|
+
opts.separator 'Options:'
|
228
|
+
|
229
|
+
opts.on('-c', '--config YAML', "Config file [Default: #{defaults[:config]}#{' (currently not present)' unless File.readable?(defaults[:config])}]") { |config|
|
230
|
+
options[:config] = config
|
231
|
+
}
|
232
|
+
|
233
|
+
opts.separator ''
|
234
|
+
|
235
|
+
opts.on('-w', '--wadl FILE_OR_URL', "Path or URL to WADL file") { |wadl|
|
236
|
+
options[:wadl] = wadl
|
237
|
+
}
|
238
|
+
|
239
|
+
opts.on('-m', '--method METHOD', "Request method [Default: #{defaults[:method]}]") { |method|
|
240
|
+
options[:method] = method.upcase
|
241
|
+
}
|
242
|
+
|
243
|
+
opts.on('-a', '--api-base PATH', "Base path for API") { |api_base|
|
244
|
+
options[:api_base] = api_base
|
245
|
+
}
|
246
|
+
|
247
|
+
opts.separator ''
|
248
|
+
opts.separator 'Basic auth options:'
|
249
|
+
|
250
|
+
opts.on('-B', '--basic [USER]', "Perform Basic auth (with optional user)") { |user|
|
251
|
+
options[:basic] = true
|
252
|
+
options[:user] = user if user
|
253
|
+
}
|
254
|
+
|
255
|
+
opts.on('--password PASSWORD', "Password for user") { |password|
|
256
|
+
options[:password] = password
|
257
|
+
}
|
258
|
+
|
259
|
+
opts.separator ''
|
260
|
+
opts.separator 'OAuth options:'
|
261
|
+
|
262
|
+
opts.on('-O', '--oauth [CONSUMER_KEY]', "Perform OAuth (with optional consumer key)") { |consumer_key|
|
263
|
+
options[:oauth] = true
|
264
|
+
options[:consumer_key] = consumer_key if consumer_key
|
265
|
+
}
|
266
|
+
|
267
|
+
opts.on('--consumer-secret SECRET', "Consumer secret to use") { |consumer_secret|
|
268
|
+
options[:consumer_secret] = consumer_secret
|
269
|
+
}
|
270
|
+
|
271
|
+
opts.separator ''
|
272
|
+
|
273
|
+
opts.on('--token TOKEN', "Access token to use") { |token|
|
274
|
+
options[:token] = token
|
275
|
+
}
|
276
|
+
|
277
|
+
opts.on('--secret SECRET', "Token secret to use") { |secret|
|
278
|
+
options[:secret] = secret
|
279
|
+
}
|
280
|
+
|
281
|
+
opts.separator ''
|
282
|
+
|
283
|
+
opts.on('-b', '--base-url URL', "Base URL [Default: \"dirname\" of WADL]") { |base_url|
|
284
|
+
options[:base_url] = base_url
|
285
|
+
}
|
286
|
+
|
287
|
+
opts.on('--request-token-url URL', "Request token URL [Default: #{defaults[:request_token_url] % 'BASE_URL'}]") { |request_token_url|
|
288
|
+
options[:request_token_url] = request_token_url
|
289
|
+
}
|
290
|
+
|
291
|
+
opts.on('--access-token-url URL', "Access token URL [Default: #{defaults[:access_token_url] % 'BASE_URL'}]") { |access_token_url|
|
292
|
+
options[:access_token_url] = access_token_url
|
293
|
+
}
|
294
|
+
|
295
|
+
opts.on('--authorize-url URL', "Authorize URL [Default: #{defaults[:authorize_url] % 'BASE_URL'}]") { |authorize_url|
|
296
|
+
options[:authorize_url] = authorize_url
|
297
|
+
}
|
298
|
+
|
299
|
+
opts.separator ''
|
300
|
+
opts.separator 'Generic options:'
|
301
|
+
|
302
|
+
opts.on('-h', '--help', 'Print this help message and exit') {
|
303
|
+
abort opts.to_s
|
304
|
+
}
|
305
|
+
|
306
|
+
opts.on('--version', 'Print program version and exit') {
|
307
|
+
abort "#{File.basename($0)} v#{WADL::VERSION}"
|
308
|
+
}
|
309
|
+
|
310
|
+
opts.on('-D', '--dump-config', "Dump config and exit") {
|
311
|
+
options[:dump_config] = true
|
312
|
+
}
|
313
|
+
}
|
314
|
+
end
|
315
|
+
|
316
|
+
end
|
317
|
+
|
318
|
+
end
|
data/lib/wadl/http_method.rb
CHANGED
@@ -30,6 +30,12 @@ require 'yaml'
|
|
30
30
|
require 'rest-open-uri'
|
31
31
|
require 'wadl'
|
32
32
|
|
33
|
+
begin
|
34
|
+
require 'oauth/client/helper'
|
35
|
+
rescue LoadError
|
36
|
+
warn "For OAuth support, install the 'oauth' library."
|
37
|
+
end
|
38
|
+
|
33
39
|
module WADL
|
34
40
|
|
35
41
|
class HTTPMethod < HasDocs
|
@@ -85,8 +91,6 @@ module WADL
|
|
85
91
|
|
86
92
|
consumer_key, consumer_secret, access_token, token_secret = YAML.load(yaml)
|
87
93
|
|
88
|
-
require 'oauth/client/helper'
|
89
|
-
|
90
94
|
request = OpenURI::Methods[headers[:method]].new(uri.to_s)
|
91
95
|
|
92
96
|
consumer = OAuth::Consumer.new(consumer_key, consumer_secret)
|
@@ -39,13 +39,13 @@ module WADL
|
|
39
39
|
may_be_reference
|
40
40
|
|
41
41
|
def is_form_representation?
|
42
|
-
mediaType == 'application/x-www-form-
|
42
|
+
mediaType == 'application/x-www-form-urlencoded' || mediaType == 'multipart/form-data'
|
43
43
|
end
|
44
44
|
|
45
45
|
# Creates a representation by plugging a set of parameters
|
46
46
|
# into a representation format.
|
47
47
|
def %(values)
|
48
|
-
unless mediaType == 'application/x-www-form-
|
48
|
+
unless mediaType == 'application/x-www-form-urlencoded'
|
49
49
|
raise "wadl.rb can't instantiate a representation of type #{mediaType}"
|
50
50
|
end
|
51
51
|
|
data/lib/wadl/version.rb
CHANGED
data/test/test_wadl.rb
CHANGED
@@ -273,7 +273,7 @@ class PathParameters < WADLTest
|
|
273
273
|
|
274
274
|
<method name="POST" id="set_graphic">
|
275
275
|
<request>
|
276
|
-
<representation mediaType="application/x-www-form-
|
276
|
+
<representation mediaType="application/x-www-form-urlencoded">
|
277
277
|
<param name="new_graphic" type="xsd:string" required="true" />
|
278
278
|
<param name="filename" type="xsd:string" required="true" />
|
279
279
|
</representation>
|
metadata
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wadl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
|
11
|
-
version: 0.1.3.1
|
9
|
+
- 4
|
10
|
+
version: 0.1.4
|
12
11
|
platform: ruby
|
13
12
|
authors:
|
14
13
|
- Leonard Richardson
|
@@ -17,7 +16,7 @@ autorequire:
|
|
17
16
|
bindir: bin
|
18
17
|
cert_chain: []
|
19
18
|
|
20
|
-
date: 2010-05-
|
19
|
+
date: 2010-05-28 00:00:00 +02:00
|
21
20
|
default_executable:
|
22
21
|
dependencies:
|
23
22
|
- !ruby/object:Gem::Dependency
|
@@ -52,8 +51,8 @@ description: Ruby client for the Web Application Description Language.
|
|
52
51
|
email:
|
53
52
|
- leonardr@segfault.org
|
54
53
|
- jens.wille@uni-koeln.de
|
55
|
-
executables:
|
56
|
-
|
54
|
+
executables:
|
55
|
+
- wadl
|
57
56
|
extensions: []
|
58
57
|
|
59
58
|
extra_rdoc_files:
|
@@ -69,6 +68,7 @@ files:
|
|
69
68
|
- lib/wadl/representation_container.rb
|
70
69
|
- lib/wadl/documentation.rb
|
71
70
|
- lib/wadl/param.rb
|
71
|
+
- lib/wadl/cli.rb
|
72
72
|
- lib/wadl/xml_representation.rb
|
73
73
|
- lib/wadl/uri_parts.rb
|
74
74
|
- lib/wadl/application.rb
|
@@ -98,9 +98,11 @@ files:
|
|
98
98
|
- examples/yahoo.rb
|
99
99
|
- examples/crummy.wadl
|
100
100
|
- examples/delicious.wadl
|
101
|
+
- examples/config.yaml
|
101
102
|
- examples/YahooSearch.wadl
|
102
103
|
- examples/delicious.rb
|
103
104
|
- test/test_wadl.rb
|
105
|
+
- bin/wadl
|
104
106
|
has_rdoc: true
|
105
107
|
homepage: http://github.com/blackwinter/wadl
|
106
108
|
licenses: []
|