wadl 0.1.3.1 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|