drip-ruby 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.
@@ -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