messagebus_ruby_api 0.0.1
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/.bundle/config +2 -0
- data/.gitignore +1 -0
- data/.rvmrc +1 -0
- data/Gemfile +12 -0
- data/Gemfile.lock +28 -0
- data/Rakefile +2 -0
- data/lib/messagebus_ruby_api/client.rb +72 -0
- data/lib/messagebus_ruby_api/core_extensions.rb +5 -0
- data/lib/messagebus_ruby_api/errors.rb +15 -0
- data/lib/messagebus_ruby_api/version.rb +3 -0
- data/lib/messagebus_ruby_api.rb +7 -0
- data/messagebus.gemspec +21 -0
- data/spec/messagebus_ruby_api/client_spec.rb +135 -0
- data/spec/messagebus_ruby_api/spec_core_extensions.rb +5 -0
- data/spec/spec_helper.rb +8 -0
- metadata +84 -0
data/.bundle/config
ADDED
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
.idea/*
|
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm use ree-1.8.7-2010.02@messagebus_ruby_api
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
messagebus_ruby_api (0.0.1)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: http://rubygems.org/
|
8
|
+
specs:
|
9
|
+
diff-lcs (1.1.2)
|
10
|
+
fakeweb (1.3.0)
|
11
|
+
rr (1.0.2)
|
12
|
+
rspec (2.5.0)
|
13
|
+
rspec-core (~> 2.5.0)
|
14
|
+
rspec-expectations (~> 2.5.0)
|
15
|
+
rspec-mocks (~> 2.5.0)
|
16
|
+
rspec-core (2.5.1)
|
17
|
+
rspec-expectations (2.5.0)
|
18
|
+
diff-lcs (~> 1.1.2)
|
19
|
+
rspec-mocks (2.5.0)
|
20
|
+
|
21
|
+
PLATFORMS
|
22
|
+
ruby
|
23
|
+
|
24
|
+
DEPENDENCIES
|
25
|
+
fakeweb
|
26
|
+
messagebus_ruby_api!
|
27
|
+
rr (= 1.0.2)
|
28
|
+
rspec (= 2.5.0)
|
data/Rakefile
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
module MessagebusRubyApi
|
2
|
+
API_ENDPOINT = URI.parse('https://api.messagebus.com:443')
|
3
|
+
|
4
|
+
class Client
|
5
|
+
attr_reader :api_key
|
6
|
+
|
7
|
+
def initialize(api_key)
|
8
|
+
@api_key = verified_reasonable_api_key(api_key)
|
9
|
+
@http = api_endpoint_http_connection
|
10
|
+
@http.use_ssl = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def api_endpoint_http_connection
|
14
|
+
Net::HTTP.new(API_ENDPOINT.host, API_ENDPOINT.port)
|
15
|
+
end
|
16
|
+
|
17
|
+
def complete_url(options)
|
18
|
+
params_string = to_param(check_params(options))
|
19
|
+
url = "/send?operation=sendEmail&#{params_string}"
|
20
|
+
url
|
21
|
+
end
|
22
|
+
|
23
|
+
def api_request(options)
|
24
|
+
Net::HTTP::Post.new(complete_url(options)) #, {"User-Agent" => "messagebus.com Messagebus Ruby API v1"})
|
25
|
+
end
|
26
|
+
|
27
|
+
def send_email(options)
|
28
|
+
verify_required_params(options)
|
29
|
+
response = @http.start do |http|
|
30
|
+
request = api_request(options)
|
31
|
+
http.request(request)
|
32
|
+
end
|
33
|
+
|
34
|
+
raise MessagebusRubyApi::UnknownError unless response.body.match(/^OK/)
|
35
|
+
response
|
36
|
+
end
|
37
|
+
|
38
|
+
def check_params(params)
|
39
|
+
params[:plain_text] = check_plain_text(params[:plain_text]) unless params[:plain_text].nil?
|
40
|
+
params[:priority] = check_priority(params[:priority]) unless params[:priority].nil?
|
41
|
+
params
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_param(params)
|
45
|
+
params.map { |name, val| [name.to_s.camelize, val] }.sort.map { |param_name, param_value| "#{CGI.escape(param_name)}=#{CGI.escape(param_value)}" }.join("&")
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def check_plain_text(plain_text)
|
51
|
+
raise APIParameterError.new(":plain_text can only be true or false, not \"#{plain_text}\" of type #{plain_text.class}") unless [true, false].include?(plain_text)
|
52
|
+
plain_text ? "1" : "0"
|
53
|
+
end
|
54
|
+
|
55
|
+
def check_priority(priority)
|
56
|
+
raise APIParameterError.new(":priority can only be an integer between 1 and 5, not \"#{priority}\"") unless priority.is_a?(Integer) && (1..5).include?(priority)
|
57
|
+
priority.to_s
|
58
|
+
end
|
59
|
+
|
60
|
+
def verified_reasonable_api_key(api_key)
|
61
|
+
raise BadAPIKeyError unless api_key.match(/[a-zA-Z0-9]{20}/)
|
62
|
+
api_key
|
63
|
+
end
|
64
|
+
|
65
|
+
def verify_required_params(params)
|
66
|
+
raise APIParameterError.new("to_email") unless params[:to_email]
|
67
|
+
raise APIParameterError.new("from_email") unless params[:from_email]
|
68
|
+
raise APIParameterError.new("subject") unless params[:subject]
|
69
|
+
raise APIParameterError.new("body") unless params[:body]
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module MessagebusRubyApi
|
2
|
+
|
3
|
+
class APIParameterError < StandardError
|
4
|
+
def initialize(problematic_parameter="")
|
5
|
+
super("missing or malformed parameter #{problematic_parameter}")
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class BadAPIKeyError < StandardError;
|
10
|
+
end
|
11
|
+
|
12
|
+
class UnknownError < StandardError;
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
data/messagebus.gemspec
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "messagebus_ruby_api/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "messagebus_ruby_api"
|
7
|
+
s.version = MessagebusRubyApi::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Messagebus dev team"]
|
10
|
+
s.email = ["messagebus@googlegroups.com"]
|
11
|
+
s.homepage = ""
|
12
|
+
s.summary = %q{Send email through Messagebus service}
|
13
|
+
s.description = %q{Allows you to use the Messagebus API }
|
14
|
+
|
15
|
+
s.rubyforge_project = "messagebus_ruby_api"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
end
|
@@ -0,0 +1,135 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe MessagebusRubyApi::Client do
|
4
|
+
attr_reader :client, :api_key, :required_params
|
5
|
+
before do
|
6
|
+
FakeWeb.allow_net_connect = false
|
7
|
+
|
8
|
+
@api_key = "3"*32
|
9
|
+
@client = MessagebusRubyApi::Client.new(api_key)
|
10
|
+
@required_params = {:to_email => "bob@example.com", :from_email => "alice@example.com", :body => "a nice ocean", :subject => "test subject"}
|
11
|
+
end
|
12
|
+
|
13
|
+
it "requires an api key" do
|
14
|
+
expect do
|
15
|
+
MessagebusRubyApi::Client.new("foo")
|
16
|
+
end.should raise_error(MessagebusRubyApi::BadAPIKeyError)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "knows its API key" do
|
20
|
+
client.api_key.should == api_key
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "required parameters" do
|
24
|
+
it "works when the minimum params are sent" do
|
25
|
+
url_params = client.to_param(required_params)
|
26
|
+
FakeWeb.register_uri(:post, api_url_from_params(url_params), :body => "OK:OK")
|
27
|
+
expect do
|
28
|
+
client.send_email(required_params)
|
29
|
+
end.should_not raise_error
|
30
|
+
end
|
31
|
+
|
32
|
+
it "raises errors when missing to_email param" do
|
33
|
+
api_response = "ERR :Missing required paramater toEmail"
|
34
|
+
expect_api_errors(required_params.without(:to_email), api_response, "to_email")
|
35
|
+
end
|
36
|
+
|
37
|
+
it "raises errors when missing from_email param" do
|
38
|
+
api_response = "ERR:Missing required paramater fromEmail"
|
39
|
+
expect_api_errors(required_params.without(:from_email), api_response, "from_email")
|
40
|
+
end
|
41
|
+
|
42
|
+
it "raises errors when missing subject param" do
|
43
|
+
api_response = "ERR:Missing required paramater subject"
|
44
|
+
expect_api_errors(required_params.without(:subject), api_response, "subject")
|
45
|
+
end
|
46
|
+
|
47
|
+
it "raises errors when missing body param" do
|
48
|
+
api_response = "ERR:Missing required paramater body"
|
49
|
+
expect_api_errors(required_params.without(:body), api_response, "body")
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "optional parameters" do
|
54
|
+
it "allows to_name" do
|
55
|
+
expect_api_success(required_params.merge(:to_name => "Chuck Norris"))
|
56
|
+
end
|
57
|
+
|
58
|
+
it "allows from_name" do
|
59
|
+
expect_api_success(required_params.merge(:from_name => "Sally Norris"))
|
60
|
+
end
|
61
|
+
|
62
|
+
it "allows tag" do
|
63
|
+
expect_api_success(required_params.merge(:tag => "weekly"))
|
64
|
+
end
|
65
|
+
|
66
|
+
it "allows priority with values 1 through 5" do
|
67
|
+
expect_api_success(required_params.merge(:priority => 1))
|
68
|
+
expect_api_success(required_params.merge(:priority => 2))
|
69
|
+
expect_api_success(required_params.merge(:priority => 3))
|
70
|
+
expect_api_success(required_params.merge(:priority => 4))
|
71
|
+
expect_api_success(required_params.merge(:priority => 5))
|
72
|
+
|
73
|
+
expect do
|
74
|
+
client.send_email(required_params.merge(:priority => "foo"))
|
75
|
+
end.should raise_error(MessagebusRubyApi::APIParameterError)
|
76
|
+
|
77
|
+
expect do
|
78
|
+
client.send_email(required_params.merge(:priority => 0))
|
79
|
+
end.should raise_error(MessagebusRubyApi::APIParameterError)
|
80
|
+
|
81
|
+
expect do
|
82
|
+
client.send_email(required_params.merge(:priority => 6))
|
83
|
+
end.should raise_error(MessagebusRubyApi::APIParameterError)
|
84
|
+
end
|
85
|
+
|
86
|
+
it "allows reply_to" do
|
87
|
+
expect_api_success(required_params.merge(:reply_to => "obiwan@example.com"))
|
88
|
+
end
|
89
|
+
|
90
|
+
it "allows unsubscribe_email" do
|
91
|
+
expect_api_success(required_params.merge(:unsubscribe_email => "unsubscribe@aol.com"))
|
92
|
+
end
|
93
|
+
|
94
|
+
it "allows unsubscribe_url" do
|
95
|
+
expect_api_success(required_params.merge(:unsubscribe_url => "http://foobar.com/unsubscribe"))
|
96
|
+
end
|
97
|
+
|
98
|
+
it "allows plain_text" do
|
99
|
+
expect_api_success(required_params.merge(:plain_text => false))
|
100
|
+
expect_api_success(required_params.merge(:plain_text => true))
|
101
|
+
|
102
|
+
expect do
|
103
|
+
client.send_email(required_params.merge(:plain_text => "omg not a boolean or nil"))
|
104
|
+
end.should raise_error(MessagebusRubyApi::APIParameterError)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
describe "#to_param" do
|
109
|
+
it "camelizes param names and sorts them" do
|
110
|
+
client.to_param({:to_email => "bob@example.com", :from_email => "alex@example.com"}).should == "fromEmail=alex%40example.com&toEmail=bob%40example.com"
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def expect_api_success(params)
|
116
|
+
expected_url = api_url_from_params(client.to_param(client.check_params(params.dup)))
|
117
|
+
FakeWeb.register_uri(:post, expected_url, :body => "OK:OK")
|
118
|
+
expect do
|
119
|
+
response = client.send_email(params)
|
120
|
+
response.body.should == "OK:OK"
|
121
|
+
end.should_not raise_error
|
122
|
+
end
|
123
|
+
|
124
|
+
def expect_api_errors(params, fake_response, expected_error_message="")
|
125
|
+
expected_params = client.to_param(params.dup)
|
126
|
+
FakeWeb.register_uri(:post, api_url_from_params(expected_params),
|
127
|
+
:body => fake_response)
|
128
|
+
expect do
|
129
|
+
client.send_email(params)
|
130
|
+
end.should raise_error(MessagebusRubyApi::APIParameterError, "missing or malformed parameter #{expected_error_message}")
|
131
|
+
end
|
132
|
+
|
133
|
+
def api_url_from_params(url_param_string)
|
134
|
+
"https://api.messagebus.com/send?operation=sendEmail&#{url_param_string}"
|
135
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: messagebus_ruby_api
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Messagebus dev team
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-04-14 00:00:00 -07:00
|
19
|
+
default_executable:
|
20
|
+
dependencies: []
|
21
|
+
|
22
|
+
description: "Allows you to use the Messagebus API "
|
23
|
+
email:
|
24
|
+
- messagebus@googlegroups.com
|
25
|
+
executables: []
|
26
|
+
|
27
|
+
extensions: []
|
28
|
+
|
29
|
+
extra_rdoc_files: []
|
30
|
+
|
31
|
+
files:
|
32
|
+
- .bundle/config
|
33
|
+
- .gitignore
|
34
|
+
- .rvmrc
|
35
|
+
- Gemfile
|
36
|
+
- Gemfile.lock
|
37
|
+
- Rakefile
|
38
|
+
- lib/messagebus_ruby_api.rb
|
39
|
+
- lib/messagebus_ruby_api/client.rb
|
40
|
+
- lib/messagebus_ruby_api/core_extensions.rb
|
41
|
+
- lib/messagebus_ruby_api/errors.rb
|
42
|
+
- lib/messagebus_ruby_api/version.rb
|
43
|
+
- messagebus.gemspec
|
44
|
+
- spec/messagebus_ruby_api/client_spec.rb
|
45
|
+
- spec/messagebus_ruby_api/spec_core_extensions.rb
|
46
|
+
- spec/spec_helper.rb
|
47
|
+
has_rdoc: true
|
48
|
+
homepage: ""
|
49
|
+
licenses: []
|
50
|
+
|
51
|
+
post_install_message:
|
52
|
+
rdoc_options: []
|
53
|
+
|
54
|
+
require_paths:
|
55
|
+
- lib
|
56
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
hash: 3
|
62
|
+
segments:
|
63
|
+
- 0
|
64
|
+
version: "0"
|
65
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
hash: 3
|
71
|
+
segments:
|
72
|
+
- 0
|
73
|
+
version: "0"
|
74
|
+
requirements: []
|
75
|
+
|
76
|
+
rubyforge_project: messagebus_ruby_api
|
77
|
+
rubygems_version: 1.6.2
|
78
|
+
signing_key:
|
79
|
+
specification_version: 3
|
80
|
+
summary: Send email through Messagebus service
|
81
|
+
test_files:
|
82
|
+
- spec/messagebus_ruby_api/client_spec.rb
|
83
|
+
- spec/messagebus_ruby_api/spec_core_extensions.rb
|
84
|
+
- spec/spec_helper.rb
|