streamsend-ruby 0.0.1 → 0.0.2.pre1
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.md +40 -0
- data/Rakefile +13 -0
- data/lib/spec/version.rb +2 -2
- data/lib/streamsend.rb +101 -24
- data/spec/streamsend_spec.rb +90 -17
- metadata +16 -11
data/README.md
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
The Streamsend Ruby Gem
|
2
|
+
====================
|
3
|
+
A Ruby wrapper for the [Streamsend API](http://app.streamsend.com/docs/api/index.html).
|
4
|
+
|
5
|
+
Installation
|
6
|
+
------------
|
7
|
+
gem install streamsend-ruby
|
8
|
+
|
9
|
+
Documentation
|
10
|
+
-------------
|
11
|
+
[http://github.com/gaslightsoftware/streamsend-ruby](http://github.com/gaslightsoftware/streamsend-ruby)
|
12
|
+
|
13
|
+
What's new in 0.0.2?
|
14
|
+
------------------
|
15
|
+
|
16
|
+
Added create method to Subscriber, added StreamSend::Audience, moved find method into Resource, and added a default rake task.
|
17
|
+
|
18
|
+
**0.0.1**
|
19
|
+
|
20
|
+
Everything! This is the initial gemified version forked from the original author [salbertson](http://github.com/salbertson/streamsend-ruby).
|
21
|
+
|
22
|
+
Usage Examples
|
23
|
+
--------------
|
24
|
+
require "rubygems"
|
25
|
+
require "streamsend"
|
26
|
+
|
27
|
+
login_id = '1234567890AB'
|
28
|
+
key = 'AbCdEfGhIjKlMnOp'
|
29
|
+
audience = 2
|
30
|
+
|
31
|
+
# Configure the connection
|
32
|
+
StreamSend.configure(login_id, key)
|
33
|
+
|
34
|
+
# Get all subscribers for a specific audience
|
35
|
+
subscribers = StreamSend::Subscriber.all(audience)
|
36
|
+
puts subscribers.count # 100 <- current page limit
|
37
|
+
|
38
|
+
# Find a subscriber
|
39
|
+
subscriber = StreamSend::Subscriber.find(audience, 'bob@example.com')
|
40
|
+
puts subscriber.opt_status # "unsubscribed"
|
data/Rakefile
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
require 'rake'
|
3
|
+
require 'spec'
|
4
|
+
|
5
|
+
Bundler::GemHelper.install_tasks
|
6
|
+
|
7
|
+
namespace :spec do
|
8
|
+
spec_files = Dir[File.dirname(__FILE__) + '/spec/**/*_spec.rb'].join(' ')
|
9
|
+
sh exec "spec #{spec_files}"
|
10
|
+
end
|
11
|
+
|
12
|
+
task :test => :spec
|
13
|
+
task :default => :spec
|
data/lib/spec/version.rb
CHANGED
data/lib/streamsend.rb
CHANGED
@@ -11,62 +11,139 @@ module StreamSend
|
|
11
11
|
end
|
12
12
|
|
13
13
|
class Resource
|
14
|
-
def initialize(data)
|
14
|
+
def initialize(data, from_api=nil)
|
15
15
|
@data = data
|
16
|
+
@new_record = !from_api
|
17
|
+
end
|
18
|
+
|
19
|
+
def new_record?
|
20
|
+
@new_record
|
21
|
+
end
|
22
|
+
|
23
|
+
def saved!
|
24
|
+
@new_record = false
|
16
25
|
end
|
17
26
|
|
18
27
|
def method_missing(method, *args, &block)
|
19
|
-
if
|
28
|
+
if method.to_s.match(/^(.*)=$/)
|
29
|
+
@data[$1] = *args
|
30
|
+
elsif @data.has_key?(method.to_s)
|
20
31
|
@data[method.to_s]
|
21
32
|
else
|
22
33
|
super
|
23
34
|
end
|
24
35
|
end
|
25
36
|
|
37
|
+
def attributes
|
38
|
+
@data
|
39
|
+
end
|
40
|
+
|
26
41
|
def id
|
27
42
|
@data["id"]
|
28
43
|
end
|
44
|
+
|
45
|
+
def self.find(options={})
|
46
|
+
response = StreamSend.get(resource_path(options))
|
47
|
+
case response.code
|
48
|
+
when 200
|
49
|
+
if resource = response[resource_name]
|
50
|
+
self.new(resource, true)
|
51
|
+
elsif resources = response['people']
|
52
|
+
results = []
|
53
|
+
resources.each { |r| results << self.new(r, true) }
|
54
|
+
results.count == 1 ? results.first : results
|
55
|
+
else
|
56
|
+
nil
|
57
|
+
end
|
58
|
+
else
|
59
|
+
raise "Could not find the #{resource_name}. Make sure the ID is correct. (#{response.code})"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def save
|
64
|
+
if self.new_record?
|
65
|
+
attributes = StreamSend.post(self.class.resource_path("audience_id" => self.audience_id),
|
66
|
+
self.attributes)
|
67
|
+
self.id = attributes["id"]
|
68
|
+
self.created_at = Time.now
|
69
|
+
self.saved!
|
70
|
+
else
|
71
|
+
attributes = StreamSend.put(self.class.resource_path({ "id" => self.id,
|
72
|
+
"audience_id" => self.audience_id,
|
73
|
+
}.merge( self.attributes)))
|
74
|
+
self.updated_at = TIme.now
|
75
|
+
self.saved!
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def self.resource_name
|
80
|
+
# we will need to deal with CamelCased names eventually
|
81
|
+
self.name.downcase.split('::').last
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.resource_path(options={})
|
85
|
+
""
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
class Audience < Resource
|
90
|
+
def self.resource_path(options={})
|
91
|
+
"/audiences/#{options["id"]}.xml"
|
92
|
+
end
|
29
93
|
end
|
30
94
|
|
31
95
|
class Subscriber < Resource
|
96
|
+
|
97
|
+
def email_address
|
98
|
+
@data['email_address']
|
99
|
+
end
|
100
|
+
|
101
|
+
def email_address=(val)
|
102
|
+
@data['email_address'] = val
|
103
|
+
end
|
104
|
+
|
105
|
+
def to_s
|
106
|
+
"#{self.email_address}#{%{ (#{self.email_content_format})} unless self.email_content_format.blank?}"
|
107
|
+
end
|
108
|
+
|
32
109
|
def self.all(audience_id)
|
33
110
|
response = StreamSend.get("/audiences/#{audience_id}/people.xml")
|
34
111
|
|
35
112
|
case response.code
|
36
113
|
when 200
|
37
|
-
response["people"].collect { |data| new(data) }
|
114
|
+
response["people"].collect { |data| new(data, true) }
|
38
115
|
else
|
39
116
|
raise "Could not find any subscribers. Make sure your audience ID is correct. (#{response.code})"
|
40
117
|
end
|
41
118
|
end
|
42
119
|
|
43
|
-
def self.
|
44
|
-
|
45
|
-
|
46
|
-
case response.code
|
47
|
-
when 200
|
48
|
-
if subscriber = response["people"].first
|
49
|
-
new(subscriber)
|
50
|
-
else
|
51
|
-
nil
|
52
|
-
end
|
120
|
+
def self.create(audience_id, subscriber_hash)
|
121
|
+
if attributes = StreamSend.post(resource_path("audience_id" => audience_id), subscriber_hash)
|
122
|
+
new(attributes, true)
|
53
123
|
else
|
54
|
-
raise
|
124
|
+
raise("Could not create the subscriber.")
|
55
125
|
end
|
56
126
|
end
|
57
127
|
|
58
|
-
def
|
59
|
-
|
128
|
+
def self.find_by_email_address(email_address, options={})
|
129
|
+
audience_id = options["audience_id"] || 1
|
130
|
+
result = find("audience_id" => audience_id, "email_address" => email_address )
|
131
|
+
result == [] ? nil : result
|
132
|
+
end
|
60
133
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
134
|
+
def self.resource_name
|
135
|
+
"person"
|
136
|
+
end
|
137
|
+
|
138
|
+
def self.resource_path(options={})
|
139
|
+
opts = options.dup
|
140
|
+
audience_id = opts.delete("audience_id") || 1
|
141
|
+
id = opts.delete('id')
|
142
|
+
if id.nil?
|
143
|
+
params = opts.collect {|k,v| "#{k}=#{v}" }
|
144
|
+
"/audiences/#{audience_id}/people.xml?#{params.join('&')}"
|
68
145
|
else
|
69
|
-
|
146
|
+
"/audiences/#{audience_id}/people/#{id}.xml"
|
70
147
|
end
|
71
148
|
end
|
72
149
|
end
|
data/spec/streamsend_spec.rb
CHANGED
@@ -3,6 +3,16 @@ require 'webmock/rspec'
|
|
3
3
|
require 'streamsend'
|
4
4
|
|
5
5
|
describe "StreamSend" do
|
6
|
+
before(:each) do
|
7
|
+
stub_http_request(:any, //).to_return(:body => "Page not found.", :status => 404)
|
8
|
+
|
9
|
+
@username = "scott"
|
10
|
+
@password = "topsecret"
|
11
|
+
@host = "test.host"
|
12
|
+
|
13
|
+
StreamSend.configure(@username, @password, @host)
|
14
|
+
end
|
15
|
+
|
6
16
|
describe "Resource" do
|
7
17
|
describe "with missing method" do
|
8
18
|
before(:each) do
|
@@ -19,23 +29,59 @@ describe "StreamSend" do
|
|
19
29
|
StreamSend::Resource.new({"id" => 99}).id.should == 99
|
20
30
|
end
|
21
31
|
end
|
32
|
+
|
33
|
+
describe "#attributes" do
|
34
|
+
before do
|
35
|
+
@attributes = { "id" => 99, "email_address" => "foo@example.org" }
|
36
|
+
end
|
37
|
+
it "should return a hash of attributes" do
|
38
|
+
StreamSend::Resource.new(@attributes).attributes.should == @attributes
|
39
|
+
end
|
40
|
+
end
|
22
41
|
end
|
23
42
|
|
24
|
-
describe "
|
25
|
-
before
|
26
|
-
|
43
|
+
describe "Audience" do
|
44
|
+
before do
|
45
|
+
@audience = StreamSend::Audience.new({"id"=> 1, "name" => "subscriber_list" })
|
46
|
+
end
|
27
47
|
|
28
|
-
|
29
|
-
|
30
|
-
|
48
|
+
describe "#find" do
|
49
|
+
before(:each) do
|
50
|
+
xml = <<-"XML".gsub(/^\s+/,'')
|
51
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
52
|
+
<audience>
|
53
|
+
<active-people-count type="integer">121677</active-people-count>
|
54
|
+
<created-at type="datetime">2009-07-23T18:07:46Z</created-at>
|
55
|
+
<description nil="true"></description>
|
56
|
+
<id type="integer">1</id>
|
57
|
+
<inactive-people-count type="integer">23768</inactive-people-count>
|
58
|
+
<name>subscriber_list</name>
|
59
|
+
<pending-people-count type="integer">8</pending-people-count>
|
60
|
+
<status type="enum">active</status>
|
61
|
+
<tracking-hash encoding="base64" type="binary">ek1Q
|
62
|
+
</tracking-hash>
|
63
|
+
<unsubscribed-people-count type="integer">4328</unsubscribed-people-count>
|
64
|
+
<updated-at type="datetime">2009-07-23T18:08:16Z</updated-at>
|
65
|
+
</audience>
|
66
|
+
XML
|
67
|
+
|
68
|
+
stub_http_request(:any, //).to_return(:body => xml, :status => 200)
|
69
|
+
end
|
31
70
|
|
32
|
-
|
71
|
+
it "should return an audience object" do
|
72
|
+
audience = StreamSend::Audience.find("id" => 1)
|
73
|
+
audience.should be_instance_of(StreamSend::Audience)
|
74
|
+
audience.id.should == @audience.id
|
75
|
+
audience.created_at.should == Time.parse("2009-07-23T18:07:46Z")
|
76
|
+
end
|
33
77
|
end
|
78
|
+
end
|
34
79
|
|
80
|
+
describe "Subscriber" do
|
35
81
|
describe ".all" do
|
36
82
|
describe "with subscribers" do
|
37
83
|
before(:each) do
|
38
|
-
xml = <<-XML
|
84
|
+
xml = <<-"XML".gsub(/^\s+/,'')
|
39
85
|
<?xml version="1.0" encoding="UTF-8"?>
|
40
86
|
<people type="array">
|
41
87
|
<person>
|
@@ -62,7 +108,7 @@ describe "StreamSend" do
|
|
62
108
|
|
63
109
|
describe "with no subscribers" do
|
64
110
|
before(:each) do
|
65
|
-
xml = <<-XML
|
111
|
+
xml = <<-"XML".gsub(/^\s+/,'')
|
66
112
|
<?xml version="1.0" encoding="UTF-8"?>
|
67
113
|
<people type="array"/>
|
68
114
|
XML
|
@@ -82,10 +128,10 @@ describe "StreamSend" do
|
|
82
128
|
end
|
83
129
|
end
|
84
130
|
|
85
|
-
describe ".
|
131
|
+
describe ".find_by_email_address" do
|
86
132
|
describe "with matching subscriber" do
|
87
133
|
before(:each) do
|
88
|
-
xml = <<-XML
|
134
|
+
xml = <<-"XML".gsub(/^\s+/,'')
|
89
135
|
<?xml version="1.0" encoding="UTF-8"?>
|
90
136
|
<people type="array">
|
91
137
|
<person>
|
@@ -100,8 +146,7 @@ describe "StreamSend" do
|
|
100
146
|
end
|
101
147
|
|
102
148
|
it "should return subscriber" do
|
103
|
-
subscriber = StreamSend::Subscriber.
|
104
|
-
|
149
|
+
subscriber = StreamSend::Subscriber.find_by_email_address("scott@gmail.com")
|
105
150
|
subscriber.should be_instance_of(StreamSend::Subscriber)
|
106
151
|
subscriber.id.should == 2
|
107
152
|
subscriber.email_address.should == "scott@gmail.com"
|
@@ -111,7 +156,7 @@ describe "StreamSend" do
|
|
111
156
|
|
112
157
|
describe "with no matching subscriber" do
|
113
158
|
before(:each) do
|
114
|
-
xml = <<-XML
|
159
|
+
xml = <<-"XML".gsub(/^\s+/,'')
|
115
160
|
<?xml version="1.0" encoding="UTF-8"?>
|
116
161
|
<people type="array"\>
|
117
162
|
XML
|
@@ -120,21 +165,22 @@ describe "StreamSend" do
|
|
120
165
|
end
|
121
166
|
|
122
167
|
it "should return nil" do
|
123
|
-
StreamSend::Subscriber.
|
168
|
+
StreamSend::Subscriber.find_by_email_address("bad.email@gmail.com").should == nil
|
124
169
|
end
|
125
170
|
end
|
126
171
|
|
127
172
|
describe "with invalid audience" do
|
128
173
|
it "should raise an exception" do
|
129
|
-
lambda { StreamSend::Subscriber.
|
174
|
+
lambda { StreamSend::Subscriber.find_by_email_address("scott@gmail.com", :audience_id => 99) }.should raise_error
|
130
175
|
end
|
131
176
|
end
|
132
177
|
end
|
133
178
|
|
179
|
+
=begin
|
134
180
|
describe "#show" do
|
135
181
|
describe "with valid subscriber instance" do
|
136
182
|
before(:each) do
|
137
|
-
xml = <<-XML
|
183
|
+
xml = <<-"XML".gsub(/^\s+/,'')
|
138
184
|
<?xml version="1.0" encoding="UTF-8"?>
|
139
185
|
<person>
|
140
186
|
<id type="integer">2</id>
|
@@ -172,5 +218,32 @@ describe "StreamSend" do
|
|
172
218
|
end
|
173
219
|
end
|
174
220
|
end
|
221
|
+
=end
|
222
|
+
|
223
|
+
describe "#create" do
|
224
|
+
before(:each) do
|
225
|
+
@subscriber = StreamSend::Subscriber.new(:email_address =>"scott@example.com")
|
226
|
+
stub_http_request(:post, "http://#{@username}:#{@password}@#{@host}/audiences/1/people.xml").with(:body => @subscriber).to_return({ :response => true })
|
227
|
+
|
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
|
+
end
|
231
|
+
|
232
|
+
describe "with valid subscriber instance" do
|
233
|
+
it "should return instance of subscriber" do
|
234
|
+
s = StreamSend::Subscriber.new(@subscriber.attributes.merge("audience_id" => 1))
|
235
|
+
s.should be_instance_of(StreamSend::Subscriber)
|
236
|
+
s.should be_new_record
|
237
|
+
s.save
|
238
|
+
s.should_not be_new_record
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
describe "with an invalid email address" do
|
243
|
+
it "should raise exception" do
|
244
|
+
StreamSend::Subscriber.create(1, @bad_subscriber.attributes).should raise_error
|
245
|
+
end
|
246
|
+
end
|
247
|
+
end
|
175
248
|
end
|
176
249
|
end
|
metadata
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: streamsend-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 270495464
|
5
|
+
prerelease: true
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
|
9
|
+
- 2
|
10
|
+
- pre1
|
11
|
+
version: 0.0.2.pre1
|
11
12
|
platform: ruby
|
12
13
|
authors:
|
13
14
|
- Gaslight Software
|
@@ -16,7 +17,7 @@ autorequire:
|
|
16
17
|
bindir: bin
|
17
18
|
cert_chain: []
|
18
19
|
|
19
|
-
date: 2011-
|
20
|
+
date: 2011-08-04 00:00:00 -04:00
|
20
21
|
default_executable:
|
21
22
|
dependencies:
|
22
23
|
- !ruby/object:Gem::Dependency
|
@@ -74,6 +75,8 @@ extra_rdoc_files: []
|
|
74
75
|
files:
|
75
76
|
- .gitignore
|
76
77
|
- Gemfile
|
78
|
+
- README.md
|
79
|
+
- Rakefile
|
77
80
|
- lib/spec/version.rb
|
78
81
|
- lib/streamsend.rb
|
79
82
|
- spec/streamsend_spec.rb
|
@@ -99,18 +102,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
99
102
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
100
103
|
none: false
|
101
104
|
requirements:
|
102
|
-
- - "
|
105
|
+
- - ">"
|
103
106
|
- !ruby/object:Gem::Version
|
104
|
-
hash:
|
107
|
+
hash: 25
|
105
108
|
segments:
|
106
|
-
-
|
107
|
-
|
109
|
+
- 1
|
110
|
+
- 3
|
111
|
+
- 1
|
112
|
+
version: 1.3.1
|
108
113
|
requirements: []
|
109
114
|
|
110
115
|
rubyforge_project: streamsend-ruby
|
111
|
-
rubygems_version: 1.
|
116
|
+
rubygems_version: 1.3.7
|
112
117
|
signing_key:
|
113
118
|
specification_version: 3
|
114
|
-
summary: streamsend-ruby 0.0.
|
119
|
+
summary: streamsend-ruby 0.0.2.pre1
|
115
120
|
test_files:
|
116
121
|
- spec/streamsend_spec.rb
|