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,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 399ac5f6deb63991f5d809be4cfb1ff91814122c
4
+ data.tar.gz: 2e0edbc7c6f951004b3ab07b3b7549518e8eb2ec
5
+ SHA512:
6
+ metadata.gz: 4d5835097d80f4988c1134090077b06e6b15193733455d4fcef4faeb1898d50a0d78b845535d29eb687f5ab135a0819e13ed26025de1f03acfcd306d850065a8
7
+ data.tar.gz: f08e9b1009bed397d34a7cf88629639d76ba344ca260857baded67fa09920afc1a95aaa20bc6b722f040c8f9cdf8cba985d6790c9bf70a4d4e159e8e42a87e1b
@@ -0,0 +1,23 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
23
+ .DS_Store
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.0
4
+ - jruby-19mode
5
+ - rbx-2
6
+ - ruby-head
7
+ - jruby-head
8
+ - ree
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in drip-ruby.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Derrick Reimer
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,78 @@
1
+ # Drip Ruby Bindings
2
+
3
+ A Ruby toolkit for the [Drip](https://www.getdrip.com/) API.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'drip-ruby'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install drip-ruby
18
+
19
+ ## Usage
20
+
21
+ To begin making requests, spin up a new Drip client:
22
+
23
+ ```ruby
24
+ client = Drip::Client.new do |c|
25
+ c.api_key = "YOUR_API_TOKEN"
26
+ c.account_id = "YOUR_ACCOUNT_ID"
27
+ end
28
+ ```
29
+
30
+ You can find your API key [here](https://www.getdrip.com/settings/general)
31
+ and your account ID [here](https://www.getdrip.com/settings/site).
32
+
33
+ Since the Drip client is a flat API client, most API actions are available
34
+ as methods on the client object. The following methods are currently available:
35
+
36
+ | Action | Method |
37
+ | :------------------------- | :--------------------------------------------------- |
38
+ | Create/update a subscriber | `#create_or_update_subscriber(email, options = {})` |
39
+ | Fetch a subscriber | `#subscriber(id_or_email)` |
40
+ | Subscribe to a campaign | `#subscribe(email, campaign_id, options = {})` |
41
+ | Unsubscribe | `#unsubscribe(id_or_email, options = {})` |
42
+ | Apply a tag | `#apply_tag(email, tag)` |
43
+ | Remove a tag | `#remove_tag(email, tag)` |
44
+ | Track an event | `#track_event(email, action, properties = {})` |
45
+
46
+
47
+ **Note:** We do not have complete API coverage yet. If we are missing an API method
48
+ that you need to use in your application, please file an issue and/or open a
49
+ pull request. [See the official REST API docs](https://www.getdrip.com/docs/rest-api)
50
+ for a complete API reference.
51
+
52
+ ## Examples
53
+
54
+ ```ruby
55
+ client = Drip::Client.new do |c|
56
+ c.api_key = "YOUR_API_TOKEN"
57
+ c.account_id = "YOUR_ACCOUNT_ID"
58
+ end
59
+
60
+ # Fetch a subscriber
61
+ resp = client.subscriber("foo@example.com")
62
+ # => <Drip::Response ...>
63
+
64
+ resp.success?
65
+ # => true
66
+
67
+ subscriber = resp.subscribers.first
68
+ subscriber.email
69
+ # => "foo@example.com"
70
+ ```
71
+
72
+ ## Contributing
73
+
74
+ 1. Fork it ( https://github.com/DripEmail/drip-ruby/fork )
75
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
76
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
77
+ 4. Push to the branch (`git push origin my-new-feature`)
78
+ 5. Create a new Pull Request
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+ require "rake/testtask"
4
+
5
+ Rake::TestTask.new do |t|
6
+ t.libs << "lib"
7
+ t.pattern = "test/**/*_test.rb"
8
+ t.verbose = true
9
+ end
10
+
11
+ desc "Run tests"
12
+ task :default => :test
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'drip/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "drip-ruby"
8
+ spec.version = Drip::VERSION
9
+ spec.authors = ["Derrick Reimer"]
10
+ spec.email = ["derrickreimer@gmail.com"]
11
+ spec.summary = %q{A Ruby gem for interacting with the Drip API}
12
+ spec.description = %q{A simple wrapper for the Drip API}
13
+ spec.homepage = "http://github.com/DripEmail/drip-ruby"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.6"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "shoulda-context", "~> 1.0"
24
+ spec.add_development_dependency "mocha"
25
+
26
+ spec.add_runtime_dependency "faraday"
27
+ spec.add_runtime_dependency "faraday_middleware"
28
+ spec.add_runtime_dependency "json"
29
+ end
@@ -0,0 +1,2 @@
1
+ require "drip/version"
2
+ require "drip/client"
@@ -0,0 +1,82 @@
1
+ require "drip/response"
2
+ require "drip/client/subscribers"
3
+ require "drip/client/tags"
4
+ require "drip/client/events"
5
+ require "faraday"
6
+ require "faraday_middleware"
7
+ require "json"
8
+
9
+ module Drip
10
+ class Client
11
+ include Subscribers
12
+ include Tags
13
+ include Events
14
+
15
+ attr_accessor :api_key, :account_id
16
+
17
+ def initialize
18
+ yield(self) if block_given?
19
+ end
20
+
21
+ def generate_resource(key, *args)
22
+ { key => args }
23
+ end
24
+
25
+ def content_type
26
+ 'application/vnd.api+json'
27
+ end
28
+
29
+ def get(url, options = {})
30
+ build_response do
31
+ connection.get do |req|
32
+ req.url url
33
+ req.params = options
34
+ end
35
+ end
36
+ end
37
+
38
+ def post(url, options = {})
39
+ build_response do
40
+ connection.post do |req|
41
+ req.url url
42
+ req.body = options.to_json
43
+ end
44
+ end
45
+ end
46
+
47
+ def put(url, options = {})
48
+ build_response do
49
+ connection.put do |req|
50
+ req.url url
51
+ req.body = options.to_json
52
+ end
53
+ end
54
+ end
55
+
56
+ def delete(url, options = {})
57
+ build_response do
58
+ connection.delete do |req|
59
+ req.url url
60
+ req.body = options.to_json
61
+ end
62
+ end
63
+ end
64
+
65
+ def build_response(&block)
66
+ response = yield
67
+ Drip::Response.new(response.status, response.body)
68
+ end
69
+
70
+ def connection
71
+ @connection ||= Faraday.new do |f|
72
+ f.adapter :net_http
73
+ f.url_prefix = "https://api.getdrip.com/v2/"
74
+ f.headers['User-Agent'] = "Drip Ruby v#{Drip::VERSION}"
75
+ f.headers['Content-Type'] = content_type
76
+ f.headers['Accept'] = "*/*"
77
+ f.basic_auth api_key, ""
78
+ f.response :json, :content_type => /\bjson$/
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,20 @@
1
+ require "cgi"
2
+
3
+ module Drip
4
+ class Client
5
+ module Events
6
+ # Public: Track an event.
7
+ #
8
+ # email - Required. The String email address of the subscriber.
9
+ # action - Required. The String event action.
10
+ # properties - Optional. A Hash of event properties.
11
+ #
12
+ # Returns a Drip::Response.
13
+ # See https://www.getdrip.com/docs/rest-api#record_event
14
+ def track_event(email, action, properties = {})
15
+ data = { "email" => email, "action" => action, "properties" => properties }
16
+ post "#{account_id}/events", generate_resource("events", data)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,81 @@
1
+ require "cgi"
2
+
3
+ module Drip
4
+ class Client
5
+ module Subscribers
6
+ # Public: Fetch a subscriber.
7
+ #
8
+ # id_or_email - Required. The String id or email address of the subscriber.
9
+ #
10
+ # Returns a Drip::Response.
11
+ # See https://www.getdrip.com/docs/rest-api#fetch_subscriber
12
+ def subscriber(id_or_email)
13
+ get "#{account_id}/subscribers/#{CGI.escape id_or_email}"
14
+ end
15
+
16
+ # Public: Create or update a subscriber.
17
+ #
18
+ # options - A Hash of options.
19
+ # - email - Required. The String subscriber email address.
20
+ # - new_email - Optional. A new email address for the subscriber.
21
+ # If provided and a subscriber with the email above
22
+ # does not exist, this address will be used to
23
+ # create a new subscriber.
24
+ # - time_zone - Optional. The subscriber's time zone (in Olsen
25
+ # format). Defaults to Etc/UTC.
26
+ # - custom_fields - Optional. A Hash of custom field data.
27
+ # - tags - Optional. An Array of tags.
28
+ #
29
+ # Returns a Drip::Response.
30
+ # See https://www.getdrip.com/docs/rest-api#create_or_update_subscriber
31
+ def create_or_update_subscriber(email, options = {})
32
+ data = options.merge(:email => email)
33
+ post "#{account_id}/subscribers", generate_resource("subscribers", data)
34
+ end
35
+
36
+ # Public: Unsubscribe a subscriber globally or from a specific campaign.
37
+ #
38
+ # id_or_email - Required. The String id or email address of the subscriber.
39
+ # options - A Hash of options.
40
+ # - campaign_id - Optional. The campaign from which to
41
+ # unsubscribe the subscriber. Defaults to all.
42
+ #
43
+ # Returns a Drip::Response.
44
+ # See https://www.getdrip.com/docs/rest-api#unsubscribe
45
+ def unsubscribe(id_or_email, options = {})
46
+ url = "#{account_id}/subscribers/#{CGI.escape id_or_email}/unsubscribe"
47
+ url += options[:campaign_id] ? "?campaign_id=#{options[:campaign_id]}" : ""
48
+ post url
49
+ end
50
+
51
+ # Public: Subscribe to a campaign.
52
+ #
53
+ # email - Required. The String email address of the subscriber.
54
+ # campaign_id - Required. The String campaign id.
55
+ # options - Optional. A Hash of options.
56
+ # - double_optin - Optional. If true, the double opt-in confirmation
57
+ # email is sent; if false, the confirmation
58
+ # email is skipped. Defaults to the value set
59
+ # on the campaign.
60
+ # - starting_email_index - Optional. The index (zero-based) of
61
+ # the email to send first. Defaults to 0.
62
+ # - time_zone - Optional. The subscriber's time zone (in Olsen
63
+ # format). Defaults to Etc/UTC.
64
+ # - custom_fields - Optional. A Hash of custom field data.
65
+ # - tags - Optional. An Array of tags.
66
+ # - reactivate_if_removed - Optional. If true, re-subscribe
67
+ # the subscriber to the campaign if there
68
+ # is a removed subscriber in Drip with the same
69
+ # email address; otherwise, respond with
70
+ # 422 Unprocessable Entity. Defaults to true.
71
+ #
72
+ # Returns a Drip::Response.
73
+ # See https://www.getdrip.com/docs/rest-api#subscribe
74
+ def subscribe(email, campaign_id, options = {})
75
+ data = options.merge("email" => email)
76
+ url = "#{account_id}/campaigns/#{campaign_id}/subscribers"
77
+ post url, generate_resource("subscribers", data)
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,30 @@
1
+ require "cgi"
2
+
3
+ module Drip
4
+ class Client
5
+ module Tags
6
+ # Public: Apply a tag to a subscriber.
7
+ #
8
+ # email - The String email address of the subscriber.
9
+ # tag - The String tag to apply.
10
+ #
11
+ # Returns a Drip::Response.
12
+ # See https://www.getdrip.com/docs/rest-api#apply_tag
13
+ def apply_tag(email, tag)
14
+ data = { "email" => email, "tag" => tag }
15
+ post "#{account_id}/tags", generate_resource("tags", data)
16
+ end
17
+
18
+ # Public: Remove a tag from a subscriber.
19
+ #
20
+ # email - The String email address of the subscriber.
21
+ # tag - The String tag to remove.
22
+ #
23
+ # Returns a Drip::Response.
24
+ # See https://www.getdrip.com/docs/rest-api#remove_tag
25
+ def remove_tag(email, tag)
26
+ delete "#{account_id}/subscribers/#{CGI.escape email}/tags/#{CGI.escape tag}"
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,39 @@
1
+ module Drip
2
+ class Collection
3
+ include Enumerable
4
+
5
+ attr_reader :raw_items, :items
6
+
7
+ def initialize(raw_items)
8
+ @raw_items = raw_items.dup.freeze
9
+ @items = parse_items
10
+ end
11
+
12
+ def self.collection_name
13
+ "resources"
14
+ end
15
+
16
+ def self.resource_name
17
+ "resource"
18
+ end
19
+
20
+ def item_class
21
+ @item_class ||= Drip::Resources.
22
+ find_class(self.class.resource_name)
23
+ end
24
+
25
+ def parse_items
26
+ raw_items.map do |raw_item|
27
+ item_class.new(raw_item)
28
+ end
29
+ end
30
+
31
+ def singular?
32
+ items.length < 2
33
+ end
34
+
35
+ def each(&block)
36
+ items.each { |item| yield(item) }
37
+ end
38
+ end
39
+ end