resthome 0.7.1 → 0.8.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/README.rdoc +37 -1
- data/VERSION +1 -1
- data/examples/amazon_ses_service.rb +29 -0
- data/lib/resthome.rb +36 -12
- data/resthome.gemspec +4 -2
- data/spec/lib/resthome_spec.rb +51 -0
- metadata +7 -5
data/README.rdoc
CHANGED
@@ -60,7 +60,7 @@ Create a simple lorem lipsum generator, using http://www.lipsum.com.
|
|
60
60
|
|
61
61
|
== LastFM Example query arguments
|
62
62
|
|
63
|
-
How to
|
63
|
+
How to replace query parameters with function arguments.
|
64
64
|
|
65
65
|
class LastFmWebService < RESTHome
|
66
66
|
base_uri 'http://ws.audioscrobbler.com'
|
@@ -87,6 +87,42 @@ How to use replace query parameters with function arguments.
|
|
87
87
|
|
88
88
|
TwilioWebService.service.send_sms_message '5551112222', 'Verification Code: 2121'
|
89
89
|
|
90
|
+
== Amazon Simple Email Service (SES)
|
91
|
+
|
92
|
+
How to replace body parameters with function arguments.
|
93
|
+
|
94
|
+
require 'digest/sha2'
|
95
|
+
require 'base64'
|
96
|
+
|
97
|
+
class AmazonSESService < RESTHome
|
98
|
+
base_uri 'https://email.us-east-1.amazonaws.com'
|
99
|
+
|
100
|
+
@@digest256 = OpenSSL::Digest::Digest.new("sha256")
|
101
|
+
|
102
|
+
route :verify_email_address, '/', :body => {'Action' => 'VerifyEmailAddress', 'EmailAddress' => :arg1}, :method => :post, :expected_status => 200, :no_body => true do |res|
|
103
|
+
res['VerifyEmailAddressResponse']
|
104
|
+
end
|
105
|
+
|
106
|
+
def initialize(access_key, secret)
|
107
|
+
@access_key = access_key
|
108
|
+
@secret = secret
|
109
|
+
end
|
110
|
+
|
111
|
+
def build_options!(options)
|
112
|
+
date = Time.now.getutc.httpdate
|
113
|
+
options[:headers] ||= {}
|
114
|
+
options[:headers]['Date'] = date
|
115
|
+
options[:headers]['X-Amzn-Authorization'] = "AWS3-HTTPS AWSAccessKeyId=#{@access_key},Algorithm=HMACSHA256,Signature=#{AmazonSESService.sign_request(@secret, date)}"
|
116
|
+
end
|
117
|
+
|
118
|
+
def self.sign_request(secret, date)
|
119
|
+
Base64.encode64(OpenSSL::HMAC.digest(@@digest256, secret, date)).gsub("\n","")
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
service = AmazonSESService.new 'my-access-key', 'it-s-a-secret'
|
124
|
+
service.verify_email_address 'test@test.dev'
|
125
|
+
|
90
126
|
== Contributing to RESTHome
|
91
127
|
|
92
128
|
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.8.0
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'resthome'
|
2
|
+
require 'digest/sha2'
|
3
|
+
require 'base64'
|
4
|
+
|
5
|
+
class AmazonSESService < RESTHome
|
6
|
+
base_uri 'https://email.us-east-1.amazonaws.com'
|
7
|
+
|
8
|
+
@@digest256 = OpenSSL::Digest::Digest.new("sha256")
|
9
|
+
|
10
|
+
route :verify_email_address, '/', :body => {'Action' => 'VerifyEmailAddress', 'EmailAddress' => :arg1}, :method => :post, :expected_status => 200, :no_body => true do |res|
|
11
|
+
res['VerifyEmailAddressResponse']
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(access_key, secret)
|
15
|
+
@access_key = access_key
|
16
|
+
@secret = secret
|
17
|
+
end
|
18
|
+
|
19
|
+
def build_options!(options)
|
20
|
+
date = Time.now.getutc.httpdate
|
21
|
+
options[:headers] ||= {}
|
22
|
+
options[:headers]['Date'] = date
|
23
|
+
options[:headers]['X-Amzn-Authorization'] = "AWS3-HTTPS AWSAccessKeyId=#{@access_key},Algorithm=HMACSHA256,Signature=#{AmazonSESService.sign_request(@secret, date)}"
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.sign_request(secret, date)
|
27
|
+
Base64.encode64(OpenSSL::HMAC.digest(@@digest256, secret, date)).gsub("\n","")
|
28
|
+
end
|
29
|
+
end
|
data/lib/resthome.rb
CHANGED
@@ -38,22 +38,17 @@ class RESTHome
|
|
38
38
|
# Removes the body argument from a post/put route
|
39
39
|
# [:query]
|
40
40
|
# Default set of query arguments
|
41
|
+
# [:body]
|
42
|
+
# Default set of body arguments
|
41
43
|
def self.route(name, path, options={}, &block)
|
42
44
|
args = path.scan /:[a-z_]+/
|
43
45
|
path = "#{@path_prefix.join if @path_prefix}#{path}"
|
44
46
|
function_args = args.collect{ |arg| arg[1..-1] }
|
45
47
|
|
46
|
-
|
47
|
-
|
48
|
-
options[:query].each do |n, v|
|
49
|
-
next unless v.is_a?(Symbol)
|
50
|
-
idx = v.to_s.gsub(/[^\d]/, '').to_i
|
51
|
-
query_args[idx] = n.to_s
|
52
|
-
options[:query].delete n
|
53
|
-
end
|
54
|
-
query_args.compact!
|
55
|
-
end
|
48
|
+
body_args = get_function_args options, :body
|
49
|
+
function_args += body_args.map { |a| a.downcase.gsub(/[^a-z0-9_]/, '_').sub(/^\d+/, '') }
|
56
50
|
|
51
|
+
query_args = get_function_args options, :query
|
57
52
|
function_args += query_args.map { |a| a.downcase.gsub(/[^a-z0-9_]/, '_').sub(/^\d+/, '') }
|
58
53
|
|
59
54
|
method = options[:method]
|
@@ -96,10 +91,18 @@ class RESTHome
|
|
96
91
|
method_src << "path.sub! '#{arg}', URI.escape(#{function_args[idx]}.to_s)\n"
|
97
92
|
end
|
98
93
|
|
99
|
-
if options[:no_body]
|
94
|
+
if options[:no_body]
|
95
|
+
if options[:body]
|
96
|
+
method_src << "options[:body] = #{options[:body].inspect}.merge(options[:body] || {})\n"
|
97
|
+
elsif body_args.size > 0
|
98
|
+
method_src << "options[:body] ||= {}\n"
|
99
|
+
end
|
100
|
+
else
|
100
101
|
if method == 'post' || method == 'put'
|
101
102
|
if options[:resource]
|
102
103
|
method_src << "options[:body] = {'#{options[:resource].to_s}' => body}\n"
|
104
|
+
elsif options[:body]
|
105
|
+
method_src << "options[:body] = #{options[:body].inspect}.merge(body || {})\n"
|
103
106
|
else
|
104
107
|
method_src << "options[:body] = body\n"
|
105
108
|
end
|
@@ -112,8 +115,13 @@ class RESTHome
|
|
112
115
|
method_src << "options[:query] ||= {}\n"
|
113
116
|
end
|
114
117
|
|
115
|
-
|
118
|
+
body_args.each_with_index do |arg, idx|
|
116
119
|
idx += args.size
|
120
|
+
method_src << "options[:body]['#{arg}'] = #{function_args[idx]}\n"
|
121
|
+
end
|
122
|
+
|
123
|
+
query_args.each_with_index do |arg, idx|
|
124
|
+
idx += body_args.size + args.size
|
117
125
|
method_src << "options[:query]['#{arg}'] = #{function_args[idx]}\n"
|
118
126
|
end
|
119
127
|
|
@@ -338,4 +346,20 @@ class RESTHome
|
|
338
346
|
obj = yield(obj) if block_given?
|
339
347
|
obj
|
340
348
|
end
|
349
|
+
|
350
|
+
private
|
351
|
+
|
352
|
+
def self.get_function_args(options, fld)
|
353
|
+
args = []
|
354
|
+
if options[fld]
|
355
|
+
options[fld].each do |n, v|
|
356
|
+
next unless v.is_a?(Symbol)
|
357
|
+
idx = v.to_s.gsub(/[^\d]/, '').to_i
|
358
|
+
args[idx] = n.to_s
|
359
|
+
options[fld].delete n
|
360
|
+
end
|
361
|
+
args.compact!
|
362
|
+
end
|
363
|
+
args
|
364
|
+
end
|
341
365
|
end
|
data/resthome.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{resthome}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.8.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Doug Youch"]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-03-09}
|
13
13
|
s.description = %q{Simple wrapper class generator for consuming RESTful web services}
|
14
14
|
s.email = %q{doug@cykod.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -25,6 +25,7 @@ Gem::Specification.new do |s|
|
|
25
25
|
"Rakefile",
|
26
26
|
"VERSION",
|
27
27
|
"examples/amazon_product_web_service.rb",
|
28
|
+
"examples/amazon_ses_service.rb",
|
28
29
|
"examples/chargify_web_service.rb",
|
29
30
|
"examples/last_fm_web_service.rb",
|
30
31
|
"examples/twilio_web_service.rb",
|
@@ -42,6 +43,7 @@ Gem::Specification.new do |s|
|
|
42
43
|
s.summary = %q{RESTful web services consumer}
|
43
44
|
s.test_files = [
|
44
45
|
"examples/amazon_product_web_service.rb",
|
46
|
+
"examples/amazon_ses_service.rb",
|
45
47
|
"examples/chargify_web_service.rb",
|
46
48
|
"examples/last_fm_web_service.rb",
|
47
49
|
"examples/twilio_web_service.rb",
|
data/spec/lib/resthome_spec.rb
CHANGED
@@ -473,4 +473,55 @@ describe RESTHome do
|
|
473
473
|
@service.request_options[:query]['artist'].should == 'cher'
|
474
474
|
@service.request_options[:query]['track'].should == 'believe'
|
475
475
|
end
|
476
|
+
|
477
|
+
it "should support body arguments" do
|
478
|
+
@service_class.class_eval do
|
479
|
+
base_uri 'http://test.dev'
|
480
|
+
route :tracks, '/:version/', :body => {'method' => 'track.getinfo', 'artist' => :arg1, 'track' => :arg2}, :method => :post, :no_body => true
|
481
|
+
end
|
482
|
+
@service = @service_class.new
|
483
|
+
|
484
|
+
fakeweb_response(:post, %r|http://test.dev/2.0/|, 200, [])
|
485
|
+
@service.tracks '2.0', 'cher', 'believe'
|
486
|
+
|
487
|
+
@service.request_method.should == :post
|
488
|
+
@service.request_url.should == 'http://test.dev/2.0/'
|
489
|
+
@service.request_options[:body]['method'].should == 'track.getinfo'
|
490
|
+
@service.request_options[:body]['artist'].should == 'cher'
|
491
|
+
@service.request_options[:body]['track'].should == 'believe'
|
492
|
+
end
|
493
|
+
|
494
|
+
it "should support body arguments" do
|
495
|
+
@service_class.class_eval do
|
496
|
+
base_uri 'http://test.dev'
|
497
|
+
route :tracks, '/:version/', :body => {'method' => 'track.getinfo', 'artist' => :arg1, 'track' => :arg2}, :method => :post
|
498
|
+
end
|
499
|
+
@service = @service_class.new
|
500
|
+
|
501
|
+
fakeweb_response(:post, %r|http://test.dev/2.0/|, 200, [])
|
502
|
+
@service.tracks '2.0', 'cher', 'believe', 'method' => 'track.getinfo2'
|
503
|
+
|
504
|
+
@service.request_method.should == :post
|
505
|
+
@service.request_url.should == 'http://test.dev/2.0/'
|
506
|
+
@service.request_options[:body]['method'].should == 'track.getinfo2'
|
507
|
+
@service.request_options[:body]['artist'].should == 'cher'
|
508
|
+
@service.request_options[:body]['track'].should == 'believe'
|
509
|
+
end
|
510
|
+
|
511
|
+
it "should support body and query arguments" do
|
512
|
+
@service_class.class_eval do
|
513
|
+
base_uri 'http://test.dev'
|
514
|
+
route :tracks, '/:version/', :body => {'method' => 'track.getinfo', 'artist' => :arg1, 'track' => :arg2}, :query => {'auth' => 'xx', 'Sign' => :arg1}, :method => :post
|
515
|
+
end
|
516
|
+
@service = @service_class.new
|
517
|
+
|
518
|
+
fakeweb_response(:post, 'http://test.dev/2.0/?auth=xx&Sign=secret', 200, [])
|
519
|
+
@service.tracks '2.0', 'cher', 'believe', 'secret', 'method' => 'track.getinfo2'
|
520
|
+
|
521
|
+
@service.request_method.should == :post
|
522
|
+
@service.request_url.should == 'http://test.dev/2.0/'
|
523
|
+
@service.request_options[:body]['method'].should == 'track.getinfo2'
|
524
|
+
@service.request_options[:body]['artist'].should == 'cher'
|
525
|
+
@service.request_options[:body]['track'].should == 'believe'
|
526
|
+
end
|
476
527
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: resthome
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 63
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 8
|
9
|
+
- 0
|
10
|
+
version: 0.8.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Doug Youch
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-03-09 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -138,6 +138,7 @@ files:
|
|
138
138
|
- Rakefile
|
139
139
|
- VERSION
|
140
140
|
- examples/amazon_product_web_service.rb
|
141
|
+
- examples/amazon_ses_service.rb
|
141
142
|
- examples/chargify_web_service.rb
|
142
143
|
- examples/last_fm_web_service.rb
|
143
144
|
- examples/twilio_web_service.rb
|
@@ -183,6 +184,7 @@ specification_version: 3
|
|
183
184
|
summary: RESTful web services consumer
|
184
185
|
test_files:
|
185
186
|
- examples/amazon_product_web_service.rb
|
187
|
+
- examples/amazon_ses_service.rb
|
186
188
|
- examples/chargify_web_service.rb
|
187
189
|
- examples/last_fm_web_service.rb
|
188
190
|
- examples/twilio_web_service.rb
|