drip-ruby 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,21 @@
1
+ require "drip/collections/subscribers"
2
+ require "drip/collections/errors"
3
+
4
+ module Drip
5
+ module Collections
6
+ def self.classes
7
+ [
8
+ Drip::Subscribers,
9
+ Drip::Errors
10
+ ]
11
+ end
12
+
13
+ def self.find_class(name)
14
+ matches = self.classes.select do |c|
15
+ c.collection_name == name
16
+ end
17
+
18
+ matches.first || Drip::Collection
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,13 @@
1
+ require "drip/collection"
2
+
3
+ module Drip
4
+ class Errors < Collection
5
+ def self.collection_name
6
+ "errors"
7
+ end
8
+
9
+ def self.resource_name
10
+ "error"
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ require "drip/collection"
2
+
3
+ module Drip
4
+ class Subscribers < Collection
5
+ def self.collection_name
6
+ "subscribers"
7
+ end
8
+
9
+ def self.resource_name
10
+ "subscriber"
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,50 @@
1
+ module Drip
2
+ class Resource
3
+ attr_reader :raw_attributes, :attributes
4
+
5
+ def initialize(raw_data = {})
6
+ @raw_attributes = raw_data.dup.freeze
7
+ @attributes = process(@raw_attributes)
8
+ end
9
+
10
+ def self.resource_name
11
+ "resource"
12
+ end
13
+
14
+ def attribute_keys
15
+ []
16
+ end
17
+
18
+ def singular?
19
+ true
20
+ end
21
+
22
+ def respond_to?(method_name, include_private = false)
23
+ attribute_keys.include?(method_name) || super
24
+ end
25
+
26
+ def method_missing(method_name, *args, &block)
27
+ attribute_keys.include?(method_name) ? attributes[method_name] : super
28
+ end
29
+
30
+ private
31
+
32
+ def process(attributes)
33
+ {}.tap do |attrs|
34
+ attribute_keys.each do |key|
35
+ raw_value = attributes[key.to_s]
36
+ attrs[key] = process_attribute(key, raw_value)
37
+ end
38
+ end
39
+ end
40
+
41
+ def process_attribute(key, raw_value)
42
+ case key
43
+ when :created_at, :updated_at
44
+ raw_value ? Time.parse(raw_value) : nil
45
+ else
46
+ raw_value
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,21 @@
1
+ require "drip/resources/subscriber"
2
+ require "drip/resources/error"
3
+
4
+ module Drip
5
+ module Resources
6
+ def self.classes
7
+ [
8
+ Drip::Subscriber,
9
+ Drip::Error
10
+ ]
11
+ end
12
+
13
+ def self.find_class(name)
14
+ matches = self.classes.select do |c|
15
+ c.resource_name == name
16
+ end
17
+
18
+ matches.first || Drip::Resource
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,13 @@
1
+ require "drip/resource"
2
+
3
+ module Drip
4
+ class Error < Resource
5
+ def self.resource_name
6
+ "error"
7
+ end
8
+
9
+ def attribute_keys
10
+ %i{code attribute message}
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ require "drip/resource"
2
+ require "time"
3
+
4
+ module Drip
5
+ class Subscriber < Resource
6
+ def self.resource_name
7
+ "subscriber"
8
+ end
9
+
10
+ def attribute_keys
11
+ %i{id status email custom_fields tags time_zone
12
+ utc_offset visitor_uuid created_at href}
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,68 @@
1
+ require "drip/resources"
2
+ require "drip/collections"
3
+
4
+ module Drip
5
+ class Response
6
+ attr_reader :status, :body, :links, :meta, :members
7
+
8
+ def initialize(status, body)
9
+ @status = status
10
+ @body = body
11
+ @links = parse_links
12
+ @meta = parse_meta
13
+ @members = parse_members
14
+
15
+ @body.freeze
16
+ end
17
+
18
+ def ==(other)
19
+ status == other.status &&
20
+ body == other.body
21
+ end
22
+
23
+ def success?
24
+ (200..299).include?(status)
25
+ end
26
+
27
+ def respond_to?(method_name, include_private = false)
28
+ member_map.keys.include?(method_name) || super
29
+ end
30
+
31
+ def method_missing(method_name, *args, &block)
32
+ return super unless member_map.keys.include?(method_name)
33
+ members[member_map[method_name]]
34
+ end
35
+
36
+ private
37
+
38
+ def parse_links
39
+ body.is_a?(Hash) ? body.delete("links") : nil
40
+ end
41
+
42
+ def parse_meta
43
+ body.is_a?(Hash) ? body.delete("meta") : nil
44
+ end
45
+
46
+ def parse_members
47
+ {}.tap do |members|
48
+ if body.is_a?(Hash)
49
+ body.each do |key, value|
50
+ klass = if value.is_a?(Array)
51
+ Drip::Collections.find_class(key)
52
+ else
53
+ Drip::Resources.find_class(key)
54
+ end
55
+
56
+ members[key] = klass.new(value)
57
+ end
58
+ end
59
+ end
60
+ end
61
+
62
+ def member_map
63
+ @member_map ||= {}.tap do |map|
64
+ members.each { |key, value| map[key.to_sym] = key }
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,3 @@
1
+ module Drip
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,42 @@
1
+ require File.dirname(__FILE__) + '/../../test_helper.rb'
2
+ require "faraday"
3
+
4
+ class Drip::Client::EventsTest < Drip::TestCase
5
+ def setup
6
+ @stubs = Faraday::Adapter::Test::Stubs.new
7
+
8
+ @connection = Faraday.new do |builder|
9
+ builder.adapter :test, @stubs
10
+ end
11
+
12
+ @client = Drip::Client.new { |c| c.account_id = "12345" }
13
+ @client.expects(:connection).at_least_once.returns(@connection)
14
+ end
15
+
16
+ context "#track_event" do
17
+ setup do
18
+ @email = "derrick@getdrip.com"
19
+ @action = "Signed up"
20
+ @properties = { "foo" => "bar" }
21
+ @payload = {
22
+ "events" => [{
23
+ "email" => @email,
24
+ "action" => @action,
25
+ "properties" => @properties
26
+ }]
27
+ }.to_json
28
+
29
+ @response_status = 201
30
+ @response_body = stub
31
+
32
+ @stubs.post "12345/events", @payload do
33
+ [@response_status, {}, @response_body]
34
+ end
35
+ end
36
+
37
+ should "send the right request" do
38
+ expected = Drip::Response.new(@response_status, @response_body)
39
+ assert_equal expected, @client.track_event(@email, @action, @properties)
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,132 @@
1
+ require File.dirname(__FILE__) + '/../../test_helper.rb'
2
+ require "faraday"
3
+
4
+ class Drip::Client::SubscribersTest < Drip::TestCase
5
+ def setup
6
+ @stubs = Faraday::Adapter::Test::Stubs.new
7
+
8
+ @connection = Faraday.new do |builder|
9
+ builder.adapter :test, @stubs
10
+ end
11
+
12
+ @client = Drip::Client.new { |c| c.account_id = "12345" }
13
+ @client.expects(:connection).at_least_once.returns(@connection)
14
+ end
15
+
16
+ context "#subscriber" do
17
+ setup do
18
+ @id = "derrick@getdrip.com"
19
+ @response_status = 201
20
+ @response_body = stub
21
+
22
+ @stubs.get "12345/subscribers/#{CGI.escape @id}" do
23
+ [@response_status, {}, @response_body]
24
+ end
25
+ end
26
+
27
+ should "send the right request" do
28
+ expected = Drip::Response.new(@response_status, @response_body)
29
+ assert_equal expected, @client.subscriber(@id)
30
+ end
31
+ end
32
+
33
+ context "#create_or_update_subscriber" do
34
+ setup do
35
+ @email = "derrick@getdrip.com"
36
+ @data = { "time_zone" => "America/Los_Angeles" }
37
+ @payload = { "subscribers" => [@data.merge(:email => @email)] }.to_json
38
+
39
+ @response_status = 201
40
+ @response_body = stub
41
+
42
+ @stubs.post "12345/subscribers", @payload do
43
+ [@response_status, {}, @response_body]
44
+ end
45
+ end
46
+
47
+ should "send the right request" do
48
+ expected = Drip::Response.new(@response_status, @response_body)
49
+ assert_equal expected, @client.create_or_update_subscriber(@email, @data)
50
+ end
51
+ end
52
+
53
+ context "#subscribe" do
54
+ setup do
55
+ @email = "derrick@getdrip.com"
56
+ @campaign_id = "12345"
57
+ @data = { "time_zone" => "America/Los_Angeles" }
58
+ @payload = { "subscribers" => [@data.merge(:email => @email)] }.to_json
59
+
60
+ @response_status = 201
61
+ @response_body = stub
62
+
63
+ @stubs.post "12345/campaigns/#{@campaign_id}/subscribers", @payload do
64
+ [@response_status, {}, @response_body]
65
+ end
66
+ end
67
+
68
+ should "send the right request" do
69
+ expected = Drip::Response.new(@response_status, @response_body)
70
+ assert_equal expected, @client.subscribe(@email, @campaign_id, @data)
71
+ end
72
+ end
73
+
74
+ context "#unsubscribe" do
75
+ context "if no campaign id is provided" do
76
+ setup do
77
+ @id = "derrick@getdrip.com"
78
+
79
+ @response_status = 201
80
+ @response_body = stub
81
+
82
+ @stubs.post "12345/subscribers/#{CGI.escape @id}/unsubscribe" do
83
+ [@response_status, {}, @response_body]
84
+ end
85
+ end
86
+
87
+ should "send the right request" do
88
+ expected = Drip::Response.new(@response_status, @response_body)
89
+ assert_equal expected, @client.unsubscribe(@id)
90
+ end
91
+ end
92
+
93
+ context "if a campaign id is provided" do
94
+ setup do
95
+ @id = "derrick@getdrip.com"
96
+ @campaign = "12345"
97
+
98
+ @response_status = 201
99
+ @response_body = stub
100
+
101
+ @stubs.post "12345/subscribers/#{CGI.escape @id}/unsubscribe?campaign_id=#{@campaign}" do
102
+ [@response_status, {}, @response_body]
103
+ end
104
+ end
105
+
106
+ should "send the right request" do
107
+ expected = Drip::Response.new(@response_status, @response_body)
108
+ assert_equal expected, @client.unsubscribe(@id, campaign_id: @campaign)
109
+ end
110
+ end
111
+ end
112
+
113
+ context "#apply_tag" do
114
+ setup do
115
+ @email = "derrick@getdrip.com"
116
+ @tag = "Customer"
117
+ @payload = { "tags" => [{ "email" => @email, "tag" => @tag }] }.to_json
118
+
119
+ @response_status = 201
120
+ @response_body = stub
121
+
122
+ @stubs.post "12345/tags", @payload do
123
+ [@response_status, {}, @response_body]
124
+ end
125
+ end
126
+
127
+ should "send the right request" do
128
+ expected = Drip::Response.new(@response_status, @response_body)
129
+ assert_equal expected, @client.apply_tag(@email, @tag)
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,54 @@
1
+ require File.dirname(__FILE__) + '/../../test_helper.rb'
2
+ require "faraday"
3
+
4
+ class Drip::Client::TagsTest < Drip::TestCase
5
+ def setup
6
+ @stubs = Faraday::Adapter::Test::Stubs.new
7
+
8
+ @connection = Faraday.new do |builder|
9
+ builder.adapter :test, @stubs
10
+ end
11
+
12
+ @client = Drip::Client.new { |c| c.account_id = "12345" }
13
+ @client.expects(:connection).at_least_once.returns(@connection)
14
+ end
15
+
16
+ context "#apply_tag" do
17
+ setup do
18
+ @email = "derrick@getdrip.com"
19
+ @tag = "Customer"
20
+ @payload = { "tags" => [{ "email" => @email, "tag" => @tag }] }.to_json
21
+
22
+ @response_status = 201
23
+ @response_body = stub
24
+
25
+ @stubs.post "12345/tags", @payload do
26
+ [@response_status, {}, @response_body]
27
+ end
28
+ end
29
+
30
+ should "send the right request" do
31
+ expected = Drip::Response.new(@response_status, @response_body)
32
+ assert_equal expected, @client.apply_tag(@email, @tag)
33
+ end
34
+ end
35
+
36
+ context "#remove_tag" do
37
+ setup do
38
+ @email = "derrick@getdrip.com"
39
+ @tag = "Customer"
40
+
41
+ @response_status = 204
42
+ @response_body = stub
43
+
44
+ @stubs.delete "12345/subscribers/#{CGI.escape @email}/tags/#{CGI.escape @tag}" do
45
+ [@response_status, {}, @response_body]
46
+ end
47
+ end
48
+
49
+ should "send the right request" do
50
+ expected = Drip::Response.new(@response_status, @response_body)
51
+ assert_equal expected, @client.remove_tag(@email, @tag)
52
+ end
53
+ end
54
+ end