streamsend-ruby 0.0.2.pre1 → 0.0.2.pre2
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/Gemfile +2 -1
- data/lib/spec/version.rb +1 -1
- data/lib/streamsend.rb +50 -21
- data/spec/streamsend_spec.rb +73 -53
- metadata +5 -5
data/Gemfile
CHANGED
data/lib/spec/version.rb
CHANGED
data/lib/streamsend.rb
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'httparty'
|
3
|
+
require "xmlsimple"
|
3
4
|
|
4
5
|
module StreamSend
|
5
6
|
include HTTParty
|
6
7
|
format :xml
|
7
8
|
|
8
9
|
def self.configure(username, password, host = "app.streamsend.com")
|
9
|
-
base_uri
|
10
|
-
basic_auth
|
10
|
+
base_uri(host)
|
11
|
+
basic_auth(username, password)
|
11
12
|
end
|
12
13
|
|
13
14
|
class Resource
|
@@ -20,10 +21,6 @@ module StreamSend
|
|
20
21
|
@new_record
|
21
22
|
end
|
22
23
|
|
23
|
-
def saved!
|
24
|
-
@new_record = false
|
25
|
-
end
|
26
|
-
|
27
24
|
def method_missing(method, *args, &block)
|
28
25
|
if method.to_s.match(/^(.*)=$/)
|
29
26
|
@data[$1] = *args
|
@@ -34,6 +31,14 @@ module StreamSend
|
|
34
31
|
end
|
35
32
|
end
|
36
33
|
|
34
|
+
def errors=(vals = [])
|
35
|
+
@errors = vals
|
36
|
+
end
|
37
|
+
|
38
|
+
def errors
|
39
|
+
@errors
|
40
|
+
end
|
41
|
+
|
37
42
|
def attributes
|
38
43
|
@data
|
39
44
|
end
|
@@ -42,6 +47,14 @@ module StreamSend
|
|
42
47
|
@data["id"]
|
43
48
|
end
|
44
49
|
|
50
|
+
def to_xml
|
51
|
+
XmlSimple.xml_out({:person => self.attributes.reject { |_,v| v.nil? || v.blank? }}, :keep_root => true)
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.to_xml(input_hash=self.attributes)
|
55
|
+
XmlSimple.xml_out({:person => input_hash.reject { |_,v| v.nil? || v.blank? }}, :keep_root => true)
|
56
|
+
end
|
57
|
+
|
45
58
|
def self.find(options={})
|
46
59
|
response = StreamSend.get(resource_path(options))
|
47
60
|
case response.code
|
@@ -62,18 +75,15 @@ module StreamSend
|
|
62
75
|
|
63
76
|
def save
|
64
77
|
if self.new_record?
|
65
|
-
|
66
|
-
self.
|
78
|
+
response = StreamSend.post(self.class.resource_path("audience_id" => self.audience_id),
|
79
|
+
:body => self.to_xml, :headers => { "Content-Type" => "application/xml" })
|
67
80
|
self.id = attributes["id"]
|
68
|
-
self.created_at = Time.now
|
69
|
-
self.saved!
|
70
81
|
else
|
71
|
-
|
82
|
+
response = StreamSend.put(self.class.resource_path({ "id" => self.id,
|
72
83
|
"audience_id" => self.audience_id,
|
73
|
-
}
|
74
|
-
self.updated_at = TIme.now
|
75
|
-
self.saved!
|
84
|
+
}), :body => self.to_xml, :headers => { "Content-Type" => "application/xml" })
|
76
85
|
end
|
86
|
+
handle_response(response)
|
77
87
|
end
|
78
88
|
|
79
89
|
def self.resource_name
|
@@ -84,6 +94,27 @@ module StreamSend
|
|
84
94
|
def self.resource_path(options={})
|
85
95
|
""
|
86
96
|
end
|
97
|
+
|
98
|
+
private
|
99
|
+
def saved!
|
100
|
+
if @new_record
|
101
|
+
self.created_at = Time.now
|
102
|
+
else
|
103
|
+
self.updated_at = Time.now
|
104
|
+
end
|
105
|
+
@new_record = false
|
106
|
+
end
|
107
|
+
|
108
|
+
def handle_response(response)
|
109
|
+
case response.code.to_i
|
110
|
+
when 200, 201
|
111
|
+
saved!
|
112
|
+
true
|
113
|
+
else
|
114
|
+
self.errors = response.parsed_response["errors"].values unless response.parsed_response.empty?
|
115
|
+
false
|
116
|
+
end
|
117
|
+
end
|
87
118
|
end
|
88
119
|
|
89
120
|
class Audience < Resource
|
@@ -111,18 +142,16 @@ module StreamSend
|
|
111
142
|
|
112
143
|
case response.code
|
113
144
|
when 200
|
114
|
-
response["people"].collect { |data| new(data, true)
|
145
|
+
response["people"].collect { |data| new(data, true)}
|
115
146
|
else
|
116
147
|
raise "Could not find any subscribers. Make sure your audience ID is correct. (#{response.code})"
|
117
148
|
end
|
118
149
|
end
|
119
150
|
|
120
|
-
def self.create(
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
raise("Could not create the subscriber.")
|
125
|
-
end
|
151
|
+
def self.create(subscriber_hash)
|
152
|
+
resource = new(subscriber_hash)
|
153
|
+
resource.save
|
154
|
+
resource
|
126
155
|
end
|
127
156
|
|
128
157
|
def self.find_by_email_address(email_address, options={})
|
data/spec/streamsend_spec.rb
CHANGED
@@ -24,13 +24,13 @@ describe "StreamSend" do
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
describe "
|
27
|
+
describe ".id" do
|
28
28
|
it "should return id" do
|
29
29
|
StreamSend::Resource.new({"id" => 99}).id.should == 99
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
-
describe "
|
33
|
+
describe ".attributes" do
|
34
34
|
before do
|
35
35
|
@attributes = { "id" => 99, "email_address" => "foo@example.org" }
|
36
36
|
end
|
@@ -38,6 +38,42 @@ describe "StreamSend" do
|
|
38
38
|
StreamSend::Resource.new(@attributes).attributes.should == @attributes
|
39
39
|
end
|
40
40
|
end
|
41
|
+
|
42
|
+
describe ".to_xml" do
|
43
|
+
before do
|
44
|
+
@resource = StreamSend::Resource.new("audience_id" => 2, "email_address" => "foo@example.com", "unsubscribed_at" => nil)
|
45
|
+
@xml = "<person audience_id=\"2\" email_address=\"foo@example.com\" />\n"
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should convert our object to xml" do
|
49
|
+
@resource.to_xml.should == @xml
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should not raise an error if there are nil values in the attributes" do
|
53
|
+
lambda { @resource.to_xml}.should_not raise_error
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "#to_xml" do
|
57
|
+
it "should return xml" do
|
58
|
+
StreamSend::Resource.to_xml("audience_id" => 2, "email_address" => "foo@example.com").should == @xml
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe "#errors" do
|
64
|
+
before do
|
65
|
+
@resource = StreamSend::Resource.new({})
|
66
|
+
@resource.errors = ["You did it wrong!"]
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should populate the errors" do
|
70
|
+
@resource.errors.should include("You did it wrong!")
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should not set errors on our attributes" do
|
74
|
+
@resource.attributes.has_key?("errors").should_not be_true, "errors should not be an attribute of Resource"
|
75
|
+
end
|
76
|
+
end
|
41
77
|
end
|
42
78
|
|
43
79
|
describe "Audience" do
|
@@ -74,10 +110,22 @@ describe "StreamSend" do
|
|
74
110
|
audience.id.should == @audience.id
|
75
111
|
audience.created_at.should == Time.parse("2009-07-23T18:07:46Z")
|
76
112
|
end
|
113
|
+
|
114
|
+
describe ".resource_path" do
|
115
|
+
it "should return a valid path to the resource" do
|
116
|
+
StreamSend::Audience.resource_path("id" => 1).should == "/audiences/1.xml"
|
117
|
+
end
|
118
|
+
end
|
77
119
|
end
|
78
120
|
end
|
79
121
|
|
80
122
|
describe "Subscriber" do
|
123
|
+
describe ".resource_path" do
|
124
|
+
it "should return a valid path to the resource" do
|
125
|
+
StreamSend::Subscriber.resource_path("id" => 12, "audience_id" => 1).should == "/audiences/1/people/12.xml"
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
81
129
|
describe ".all" do
|
82
130
|
describe "with subscribers" do
|
83
131
|
before(:each) do
|
@@ -95,7 +143,7 @@ describe "StreamSend" do
|
|
95
143
|
stub_http_request(:get, "http://#{@username}:#{@password}@#{@host}/audiences/1/people.xml").to_return(:body => xml)
|
96
144
|
end
|
97
145
|
|
98
|
-
it "should return array of one subscriber object" do
|
146
|
+
it "should return an array of one subscriber object" do
|
99
147
|
subscribers = StreamSend::Subscriber.all(1)
|
100
148
|
subscribers.size.should == 1
|
101
149
|
|
@@ -176,57 +224,21 @@ describe "StreamSend" do
|
|
176
224
|
end
|
177
225
|
end
|
178
226
|
|
179
|
-
=begin
|
180
|
-
describe "#show" do
|
181
|
-
describe "with valid subscriber instance" do
|
182
|
-
before(:each) do
|
183
|
-
xml = <<-"XML".gsub(/^\s+/,'')
|
184
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
185
|
-
<person>
|
186
|
-
<id type="integer">2</id>
|
187
|
-
<email-address>scott@gmail.com</email-address>
|
188
|
-
<created-at type="datetime">2009-09-18T01:27:05Z</created-at>
|
189
|
-
<first-name>Scott</first-name>
|
190
|
-
<last-name>Albertson</last-name>
|
191
|
-
</person>
|
192
|
-
XML
|
193
|
-
|
194
|
-
stub_http_request(:get, "http://#{@username}:#{@password}@#{@host}/audiences/1/people/2.xml").to_return(:body => xml)
|
195
|
-
end
|
196
|
-
|
197
|
-
it "should return subscriber" do
|
198
|
-
subscriber = StreamSend::Subscriber.new({"id" => 2}).show(1)
|
199
|
-
|
200
|
-
subscriber.should be_instance_of(StreamSend::Subscriber)
|
201
|
-
subscriber.id.should == 2
|
202
|
-
subscriber.email_address.should == "scott@gmail.com"
|
203
|
-
subscriber.created_at.should == Time.parse("2009-09-18T01:27:05Z")
|
204
|
-
subscriber.first_name.should == "Scott"
|
205
|
-
subscriber.last_name.should == "Albertson"
|
206
|
-
end
|
207
|
-
end
|
208
|
-
|
209
|
-
describe "with invalid subscriber instance" do
|
210
|
-
it "should return nil" do
|
211
|
-
lambda { StreamSend::Subscriber.new({:id => 99}).show(1) }.should raise_error
|
212
|
-
end
|
213
|
-
end
|
214
|
-
|
215
|
-
describe "with invalid audience" do
|
216
|
-
it "should raise exception" do
|
217
|
-
lambda { StreamSend::Subscriber.new({:id => 2}).show(99) }.should raise_error
|
218
|
-
end
|
219
|
-
end
|
220
|
-
end
|
221
|
-
=end
|
222
|
-
|
223
227
|
describe "#create" do
|
224
228
|
before(:each) do
|
225
|
-
@subscriber = StreamSend::Subscriber.new(:email_address =>"scott@example.com")
|
226
|
-
|
229
|
+
@subscriber = StreamSend::Subscriber.new(:email_address =>"scott@example.com", "audience_id" => 1)
|
230
|
+
stub_request(:post, "http://#{@username}:#{@password}@#{@host}/audiences/1/people.xml?").
|
231
|
+
with(:body => "<person audience_id=\"1\" email_address=\"scott@example.com\" />\n",
|
232
|
+
:headers => {'Content-Type'=>'application/xml'}).
|
233
|
+
to_return(:status => 201, :body => "", :headers => {})
|
234
|
+
|
235
|
+
@bad_subscriber = {:email_address =>"scott@example", "audience_id" => 1}
|
236
|
+
|
237
|
+
stub_request(:post, "http://#{@username}:#{@password}@#{@host}/audiences/1/people.xml?").
|
238
|
+
with(:body => "<person audience_id=\"1\" email_address=\"scott@example\" />\n",
|
239
|
+
:headers => {'Content-Type'=>'application/xml'}).
|
240
|
+
to_return(:status => 422, :body => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<errors>\n <error>Email address does not appear to be valid</error>\n</errors>\n", :headers => {})
|
227
241
|
|
228
|
-
@bad_subscriber = StreamSend::Subscriber.new(:email_address =>"scott@example")
|
229
|
-
stub_http_request(:post, "http://#{@username}:#{@password}@#{@host}/audiences/1/people.xml").with(:body => @bad_subscriber).to_return({ :response => Exception })
|
230
242
|
end
|
231
243
|
|
232
244
|
describe "with valid subscriber instance" do
|
@@ -240,8 +252,16 @@ describe "StreamSend" do
|
|
240
252
|
end
|
241
253
|
|
242
254
|
describe "with an invalid email address" do
|
243
|
-
|
244
|
-
StreamSend::Subscriber.create(
|
255
|
+
before do
|
256
|
+
@subscriber = StreamSend::Subscriber.create(@bad_subscriber)
|
257
|
+
end
|
258
|
+
|
259
|
+
it "should not save and be a new record" do
|
260
|
+
@subscriber.should be_new_record
|
261
|
+
end
|
262
|
+
|
263
|
+
it "should set errors on the unsaved record" do
|
264
|
+
@subscriber.errors.should include("Email address does not appear to be valid")
|
245
265
|
end
|
246
266
|
end
|
247
267
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: streamsend-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: -1876988183
|
5
5
|
prerelease: true
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
9
|
- 2
|
10
|
-
-
|
11
|
-
version: 0.0.2.
|
10
|
+
- pre2
|
11
|
+
version: 0.0.2.pre2
|
12
12
|
platform: ruby
|
13
13
|
authors:
|
14
14
|
- Gaslight Software
|
@@ -17,7 +17,7 @@ autorequire:
|
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
19
|
|
20
|
-
date: 2011-08-
|
20
|
+
date: 2011-08-24 00:00:00 -04:00
|
21
21
|
default_executable:
|
22
22
|
dependencies:
|
23
23
|
- !ruby/object:Gem::Dependency
|
@@ -116,6 +116,6 @@ rubyforge_project: streamsend-ruby
|
|
116
116
|
rubygems_version: 1.3.7
|
117
117
|
signing_key:
|
118
118
|
specification_version: 3
|
119
|
-
summary: streamsend-ruby 0.0.2.
|
119
|
+
summary: streamsend-ruby 0.0.2.pre2
|
120
120
|
test_files:
|
121
121
|
- spec/streamsend_spec.rb
|