customerio 0.1.0 → 0.2.0
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/CHANGELOG.markdown +17 -0
- data/Gemfile.lock +6 -1
- data/customerio.gemspec +1 -0
- data/lib/customerio/client.rb +71 -20
- data/lib/customerio/version.rb +1 -1
- data/readme.markdown +16 -21
- data/spec/client_spec.rb +128 -62
- metadata +19 -2
    
        data/CHANGELOG.markdown
    ADDED
    
    | @@ -0,0 +1,17 @@ | |
| 1 | 
            +
            ## Customerio 0.2.0 - Nov 21, 2012 ##
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            * Allow raw hashes to be passed into `identify` and `track` methods rather than a customer object.
         | 
| 4 | 
            +
            * Passing a customer object has been depreciated.
         | 
| 5 | 
            +
            * Customizing ids with `Customerio::Client.id` block is deprecated.
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            ## Customerio 0.1.0 - Nov 15, 2012 ##
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            * Allow tracking of anonymous events.
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            ## Customerio 0.0.3 - Nov 5, 2012 ## 
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            * Bump httparty dependency to the latest version.
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            ## Customerio 0.0.2 - May 22, 2012 ##
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            * First release.
         | 
    
        data/Gemfile.lock
    CHANGED
    
    | @@ -1,17 +1,22 @@ | |
| 1 1 | 
             
            PATH
         | 
| 2 2 | 
             
              remote: .
         | 
| 3 3 | 
             
              specs:
         | 
| 4 | 
            -
                customerio (0.0 | 
| 4 | 
            +
                customerio (0.2.0)
         | 
| 5 | 
            +
                  activesupport
         | 
| 5 6 | 
             
                  httparty (~> 0.9.0)
         | 
| 6 7 |  | 
| 7 8 | 
             
            GEM
         | 
| 8 9 | 
             
              remote: https://rubygems.org/
         | 
| 9 10 | 
             
              specs:
         | 
| 11 | 
            +
                activesupport (3.2.9)
         | 
| 12 | 
            +
                  i18n (~> 0.6)
         | 
| 13 | 
            +
                  multi_json (~> 1.0)
         | 
| 10 14 | 
             
                diff-lcs (1.1.3)
         | 
| 11 15 | 
             
                fakeweb (1.3.0)
         | 
| 12 16 | 
             
                httparty (0.9.0)
         | 
| 13 17 | 
             
                  multi_json (~> 1.0)
         | 
| 14 18 | 
             
                  multi_xml
         | 
| 19 | 
            +
                i18n (0.6.1)
         | 
| 15 20 | 
             
                multi_json (1.3.7)
         | 
| 16 21 | 
             
                multi_xml (0.5.1)
         | 
| 17 22 | 
             
                rake (0.9.2.2)
         | 
    
        data/customerio.gemspec
    CHANGED
    
    
    
        data/lib/customerio/client.rb
    CHANGED
    
    | @@ -1,13 +1,20 @@ | |
| 1 1 | 
             
            require 'httparty'
         | 
| 2 | 
            +
            require 'active_support/hash_with_indifferent_access'
         | 
| 2 3 |  | 
| 3 4 | 
             
            module Customerio
         | 
| 4 5 | 
             
              class Client
         | 
| 5 6 | 
             
            	  include HTTParty
         | 
| 6 7 | 
             
            	  base_uri 'https://app.customer.io'
         | 
| 7 8 |  | 
| 9 | 
            +
                CustomerProxy = Struct.new("Customer", :id)
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                class MissingIdAttributeError < RuntimeError; end
         | 
| 12 | 
            +
                class InvalidResponse < RuntimeError; end
         | 
| 13 | 
            +
             | 
| 8 14 | 
             
            	  @@id_block = nil
         | 
| 9 15 |  | 
| 10 16 | 
             
            	  def self.id(&block)
         | 
| 17 | 
            +
                  warn "[DEPRECATION] Customerio::Client.id customization is deprecated."
         | 
| 11 18 | 
             
                  @@id_block = block
         | 
| 12 19 | 
             
            	  end
         | 
| 13 20 |  | 
| @@ -19,40 +26,47 @@ module Customerio | |
| 19 26 | 
             
            	    @auth = { :username => site_id, :password => secret_key }
         | 
| 20 27 | 
             
            	  end
         | 
| 21 28 |  | 
| 22 | 
            -
            	  def identify( | 
| 23 | 
            -
             | 
| 29 | 
            +
            	  def identify(*args)
         | 
| 30 | 
            +
                  attributes = extract_attributes(args)
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  if args.any?
         | 
| 33 | 
            +
                    customer   = args.first
         | 
| 34 | 
            +
                    attributes = attributes_from(customer).merge(attributes)
         | 
| 35 | 
            +
                  end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
            	    create_or_update(attributes)
         | 
| 24 38 | 
             
            	  end
         | 
| 25 39 |  | 
| 26 40 | 
             
            	  def track(*args)
         | 
| 27 | 
            -
                   | 
| 41 | 
            +
                  attributes = extract_attributes(args)
         | 
| 28 42 |  | 
| 29 43 | 
             
                  if args.length == 1
         | 
| 30 44 | 
             
                    # Only passed in an event name, create an anonymous event
         | 
| 31 | 
            -
                     | 
| 45 | 
            +
                    event_name = args.first
         | 
| 46 | 
            +
                    create_anonymous_event(event_name, attributes)
         | 
| 32 47 | 
             
                  else
         | 
| 33 48 | 
             
                    # Passed in a customer and an event name.
         | 
| 34 49 | 
             
                    # Track the event for the given customer
         | 
| 35 50 | 
             
                    customer, event_name = args
         | 
| 36 51 |  | 
| 37 | 
            -
                    identify(customer)
         | 
| 38 | 
            -
                    create_customer_event(customer, event_name,  | 
| 52 | 
            +
                    identify(attributes_from(customer))
         | 
| 53 | 
            +
                    create_customer_event(id_from(customer), event_name, attributes)
         | 
| 39 54 | 
             
                  end
         | 
| 40 55 | 
             
            	  end
         | 
| 41 56 |  | 
| 42 57 | 
             
            	  private
         | 
| 43 58 |  | 
| 44 | 
            -
            	  def create_or_update( | 
| 45 | 
            -
             | 
| 46 | 
            -
             | 
| 47 | 
            -
             | 
| 48 | 
            -
             | 
| 49 | 
            -
            	    }.merge(attributes)
         | 
| 59 | 
            +
            	  def create_or_update(attributes = {})
         | 
| 60 | 
            +
                  raise MissingIdAttributeError.new("Must provide an customer id") unless attributes[:id]
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                  url = customer_path(attributes[:id])
         | 
| 63 | 
            +
                  attributes[:id] = custom_id(attributes[:id])
         | 
| 50 64 |  | 
| 51 | 
            -
            	    self.class.put( | 
| 65 | 
            +
            	    verify_response(self.class.put(url, options.merge(:body => attributes)))
         | 
| 52 66 | 
             
            	  end
         | 
| 53 67 |  | 
| 54 | 
            -
            	  def create_customer_event( | 
| 55 | 
            -
                  create_event("#{customer_path( | 
| 68 | 
            +
            	  def create_customer_event(customer_id, event_name, attributes = {})
         | 
| 69 | 
            +
                  create_event("#{customer_path(customer_id)}/events", event_name, attributes)
         | 
| 56 70 | 
             
            	  end
         | 
| 57 71 |  | 
| 58 72 | 
             
                def create_anonymous_event(event_name, attributes = {})
         | 
| @@ -61,17 +75,54 @@ module Customerio | |
| 61 75 |  | 
| 62 76 | 
             
            	  def create_event(url, event_name, attributes = {})
         | 
| 63 77 | 
             
            	  	body = { :name => event_name, :data => attributes }
         | 
| 64 | 
            -
            	    self.class.post(url, options.merge(:body => body))
         | 
| 78 | 
            +
            	    verify_response(self.class.post(url, options.merge(:body => body)))
         | 
| 65 79 | 
             
            	  end
         | 
| 66 80 |  | 
| 67 | 
            -
            	  def customer_path( | 
| 68 | 
            -
            	    "/api/v1/customers/#{id | 
| 81 | 
            +
            	  def customer_path(id)
         | 
| 82 | 
            +
            	    "/api/v1/customers/#{custom_id(id)}"
         | 
| 69 83 | 
             
            	  end
         | 
| 70 84 |  | 
| 71 | 
            -
             | 
| 72 | 
            -
             | 
| 85 | 
            +
                def verify_response(response)
         | 
| 86 | 
            +
                  if response.code >= 200 && response.code < 300
         | 
| 87 | 
            +
                    response
         | 
| 88 | 
            +
                  else
         | 
| 89 | 
            +
                    raise InvalidResponse.new("Customer.io API returned an invalid response: #{response.code}")
         | 
| 90 | 
            +
                  end
         | 
| 91 | 
            +
                end
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                def extract_attributes(args)
         | 
| 94 | 
            +
                  HashWithIndifferentAccess.new(args.last.is_a?(Hash) ? args.pop : {})
         | 
| 95 | 
            +
                end
         | 
| 96 | 
            +
             | 
| 97 | 
            +
                def attributes_from(customer)
         | 
| 98 | 
            +
                  if id?(customer)
         | 
| 99 | 
            +
                    HashWithIndifferentAccess.new(:id => customer)
         | 
| 100 | 
            +
                  else
         | 
| 101 | 
            +
                    HashWithIndifferentAccess.new(
         | 
| 102 | 
            +
                      :id => id_from(customer),
         | 
| 103 | 
            +
                      :email => customer.email,
         | 
| 104 | 
            +
                      :created_at => customer.created_at.to_i
         | 
| 105 | 
            +
                    )
         | 
| 106 | 
            +
                  end
         | 
| 107 | 
            +
                end
         | 
| 108 | 
            +
             | 
| 109 | 
            +
                def id_from(customer)
         | 
| 110 | 
            +
                  if id?(customer)
         | 
| 111 | 
            +
                    customer
         | 
| 112 | 
            +
                  else
         | 
| 113 | 
            +
                    warn "[DEPRECATION] Passing a customer object to Customerio::Client is deprecated. Just pass a hash with an id key."
         | 
| 114 | 
            +
                    customer.id
         | 
| 115 | 
            +
                  end
         | 
| 116 | 
            +
                end
         | 
| 117 | 
            +
             | 
| 118 | 
            +
            	  def custom_id(id)
         | 
| 119 | 
            +
            	  	@@id_block ? @@id_block.call(id) : id
         | 
| 73 120 | 
             
            	  end
         | 
| 74 121 |  | 
| 122 | 
            +
                def id?(object)
         | 
| 123 | 
            +
                  object.is_a?(Integer) || object.is_a?(String)
         | 
| 124 | 
            +
                end
         | 
| 125 | 
            +
             | 
| 75 126 | 
             
            	  def options
         | 
| 76 127 | 
             
            	    { :basic_auth => @auth }
         | 
| 77 128 | 
             
            	  end
         | 
    
        data/lib/customerio/version.rb
    CHANGED
    
    
    
        data/readme.markdown
    CHANGED
    
    | @@ -49,12 +49,6 @@ If you're using Rails, create an initializer `config/initializers/customerio.rb` | |
| 49 49 |  | 
| 50 50 | 
             
                $customerio = Customerio::Client.new("YOUR SITE ID", "YOUR API SECRET KEY")
         | 
| 51 51 |  | 
| 52 | 
            -
            By default, this gem identifies customers by just their `id`. However, a common approach is to use `production_2342` as the id attribute for the javascript snippet. You'll want to use the same format by customizing the id in `config/initializers/customerio.rb`:
         | 
| 53 | 
            -
             | 
| 54 | 
            -
                Customerio::Client.id do |customer|
         | 
| 55 | 
            -
                  "#{Rails.env}_#{customer.id}"
         | 
| 56 | 
            -
                end
         | 
| 57 | 
            -
             | 
| 58 52 | 
             
            ### Identify logged in customers
         | 
| 59 53 |  | 
| 60 54 | 
             
            Tracking data of logged in customers is a key part of [Customer.io](http://customer.io). In order to
         | 
| @@ -77,16 +71,17 @@ You'll want to indentify your customers when they sign up for your app and any t | |
| 77 71 | 
             
            key information changes. This keeps [Customer.io](http://customer.io) up to date with your customer information.
         | 
| 78 72 |  | 
| 79 73 | 
             
                # Arguments
         | 
| 80 | 
            -
                #  | 
| 81 | 
            -
                #                          | 
| 82 | 
            -
                #                          | 
| 83 | 
            -
                #                         created_at  - a timestamp which represents when the
         | 
| 84 | 
            -
                #                                       customer was first created.
         | 
| 85 | 
            -
                #
         | 
| 86 | 
            -
                # attributes (optional) - a hash of information about the customer. You can pass any
         | 
| 87 | 
            -
                #                         information that would be useful in your triggers.
         | 
| 74 | 
            +
                # attributes (required) - a hash of information about the customer. You can pass any
         | 
| 75 | 
            +
                #                         information that would be useful in your triggers. You 
         | 
| 76 | 
            +
                #                         must at least pass in an id, email, and created_at timestamp.
         | 
| 88 77 |  | 
| 89 | 
            -
                $customerio.identify( | 
| 78 | 
            +
                $customerio.identify(
         | 
| 79 | 
            +
                  id: 5,
         | 
| 80 | 
            +
                  email: "bob@example.com,
         | 
| 81 | 
            +
                  created_at: customer.created_at.to_i,
         | 
| 82 | 
            +
                  first_name: "Bob",
         | 
| 83 | 
            +
                  plan: "basic"
         | 
| 84 | 
            +
                )
         | 
| 90 85 |  | 
| 91 86 |  | 
| 92 87 | 
             
            ### Tracking a custom event
         | 
| @@ -97,13 +92,13 @@ with automated emails, and track conversions when you're sending automated email | |
| 97 92 | 
             
            encourage your customers to perform an action.
         | 
| 98 93 |  | 
| 99 94 | 
             
                # Arguments
         | 
| 100 | 
            -
                #  | 
| 101 | 
            -
                # name (required) | 
| 102 | 
            -
                # attributes (optional) | 
| 103 | 
            -
                # | 
| 104 | 
            -
                # | 
| 95 | 
            +
                # customer_id (required) - the id of the customer who you want to associate with the event.
         | 
| 96 | 
            +
                # name (required)        - the name of the event you want to track.
         | 
| 97 | 
            +
                # attributes (optional)  - any related information you'd like to attach to this
         | 
| 98 | 
            +
                #                          event. These attributes can be used in your triggers to control who should
         | 
| 99 | 
            +
                #                          receive the triggered email. You can set any number of data values.
         | 
| 105 100 |  | 
| 106 | 
            -
                $customerio.track( | 
| 101 | 
            +
                $customerio.track(5, "purchase", type: "socks", price: "13.99")
         | 
| 107 102 |  | 
| 108 103 | 
             
            ## Contributing
         | 
| 109 104 |  | 
    
        data/spec/client_spec.rb
    CHANGED
    
    | @@ -3,6 +3,13 @@ require 'spec_helper' | |
| 3 3 | 
             
            describe Customerio::Client do
         | 
| 4 4 | 
             
            	let(:client)   { Customerio::Client.new("SITE_ID", "API_KEY") }
         | 
| 5 5 | 
             
            	let(:customer) { mock("Customer", :id => 5, :email => "customer@example.com", :created_at => Time.now) }
         | 
| 6 | 
            +
              let(:response) { mock("Response", code: 200) }
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              before do
         | 
| 9 | 
            +
                # Dont call out to customer.io
         | 
| 10 | 
            +
                Customerio::Client.stub(:post).and_return(response)
         | 
| 11 | 
            +
                Customerio::Client.stub(:put).and_return(response)
         | 
| 12 | 
            +
              end
         | 
| 6 13 |  | 
| 7 14 | 
             
              describe ".base_uri" do
         | 
| 8 15 | 
             
              	it "should be set to customer.io's api" do
         | 
| @@ -11,52 +18,78 @@ describe Customerio::Client do | |
| 11 18 | 
             
              end
         | 
| 12 19 |  | 
| 13 20 | 
             
              describe "#identify" do
         | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
                  client.identify( | 
| 17 | 
            -
             | 
| 21 | 
            +
                it "sends a PUT request to customer.io's customer API" do
         | 
| 22 | 
            +
                  Customerio::Client.should_receive(:put).with("/api/v1/customers/5", anything()).and_return(response)
         | 
| 23 | 
            +
                  client.identify(:id => 5)
         | 
| 24 | 
            +
                end
         | 
| 18 25 |  | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
              		})
         | 
| 26 | 
            +
                it "raises an error if PUT doesn't return a 2xx response code" do
         | 
| 27 | 
            +
                  Customerio::Client.should_receive(:put).and_return(mock("Response", code: 500))
         | 
| 28 | 
            +
                  lambda { client.identify(:id => 5) }.should raise_error(Customerio::Client::InvalidResponse)
         | 
| 29 | 
            +
                end
         | 
| 24 30 |  | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 31 | 
            +
                it "uses the site_id and api key for basic auth" do
         | 
| 32 | 
            +
                  Customerio::Client.should_receive(:put).with("/api/v1/customers/5", {
         | 
| 33 | 
            +
                    :basic_auth => { :username => "SITE_ID", :password => "API_KEY" },
         | 
| 34 | 
            +
                    :body => anything()
         | 
| 35 | 
            +
                  }).and_return(response)
         | 
| 27 36 |  | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
              			:basic_auth => anything(),
         | 
| 31 | 
            -
              			:body => {
         | 
| 32 | 
            -
              				:id => 5,
         | 
| 33 | 
            -
            	        :email => "customer@example.com",
         | 
| 34 | 
            -
            	        :created_at => Time.now.to_i
         | 
| 35 | 
            -
              			}
         | 
| 36 | 
            -
              		})
         | 
| 37 | 
            +
                  client.identify(:id => 5)
         | 
| 38 | 
            +
                end
         | 
| 37 39 |  | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 40 | 
            +
                it "sends along all attributes" do
         | 
| 41 | 
            +
                  Customerio::Client.should_receive(:put).with("/api/v1/customers/5", {
         | 
| 42 | 
            +
                    :basic_auth => anything(),
         | 
| 43 | 
            +
                    :body => {
         | 
| 44 | 
            +
                      :id => 5,
         | 
| 45 | 
            +
                      :email => "customer@example.com",
         | 
| 46 | 
            +
                      :created_at => Time.now.to_i,
         | 
| 47 | 
            +
                      :first_name => "Bob",
         | 
| 48 | 
            +
                      :plan => "basic"
         | 
| 49 | 
            +
                    }.stringify_keys
         | 
| 50 | 
            +
                  }).and_return(response)
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                  client.identify(:id => 5, :email => "customer@example.com", :created_at => Time.now.to_i, :first_name => "Bob", :plan => "basic")
         | 
| 53 | 
            +
                end
         | 
| 40 54 |  | 
| 41 | 
            -
             | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 44 | 
            -
              			:body => {
         | 
| 45 | 
            -
              				:id => 5,
         | 
| 46 | 
            -
            	        :email => "customer@example.com",
         | 
| 47 | 
            -
            	        :created_at => Time.now.to_i,
         | 
| 48 | 
            -
            	        :first_name => "Bob",
         | 
| 49 | 
            -
            	        :plan => "basic"
         | 
| 50 | 
            -
              			}
         | 
| 51 | 
            -
              		})
         | 
| 55 | 
            +
                it "requires an id attribute" do
         | 
| 56 | 
            +
                  lambda { client.identify(:email => "customer@example.com") }.should raise_error(Customerio::Client::MissingIdAttributeError)
         | 
| 57 | 
            +
                end
         | 
| 52 58 |  | 
| 53 | 
            -
             | 
| 54 | 
            -
             | 
| 59 | 
            +
                context "customer object passed in" do
         | 
| 60 | 
            +
                  it "sends the customer's id, email, and created_at timestamp" do
         | 
| 61 | 
            +
                    Customerio::Client.should_receive(:put).with("/api/v1/customers/5", {
         | 
| 62 | 
            +
                      :basic_auth => anything(),
         | 
| 63 | 
            +
                      :body => {
         | 
| 64 | 
            +
                        :id => 5,
         | 
| 65 | 
            +
                        :email => "customer@example.com",
         | 
| 66 | 
            +
                        :created_at => Time.now.to_i
         | 
| 67 | 
            +
                      }.stringify_keys
         | 
| 68 | 
            +
                    }).and_return(response)
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                    client.identify(customer)
         | 
| 71 | 
            +
                  end
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                  it "sends any optional attributes" do
         | 
| 74 | 
            +
                    Customerio::Client.should_receive(:put).with("/api/v1/customers/5", {
         | 
| 75 | 
            +
                      :basic_auth => anything(),
         | 
| 76 | 
            +
                      :body => {
         | 
| 77 | 
            +
                        :id => 5,
         | 
| 78 | 
            +
                        :email => "customer@example.com",
         | 
| 79 | 
            +
                        :created_at => Time.now.to_i,
         | 
| 80 | 
            +
                        :first_name => "Bob",
         | 
| 81 | 
            +
                        :plan => "basic"
         | 
| 82 | 
            +
                      }.stringify_keys
         | 
| 83 | 
            +
                    }).and_return(response)
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                    client.identify(customer, :first_name => "Bob", :plan => "basic")
         | 
| 86 | 
            +
                  end
         | 
| 87 | 
            +
                end
         | 
| 55 88 |  | 
| 56 89 | 
             
                context "client has customized identities" do
         | 
| 57 90 | 
             
                  before do
         | 
| 58 | 
            -
                    Customerio::Client.id do | | 
| 59 | 
            -
                      "production_#{ | 
| 91 | 
            +
                    Customerio::Client.id do |customer_id|
         | 
| 92 | 
            +
                      "production_#{customer_id}"
         | 
| 60 93 | 
             
                    end
         | 
| 61 94 | 
             
                  end
         | 
| 62 95 |  | 
| @@ -67,28 +100,40 @@ describe Customerio::Client do | |
| 67 100 | 
             
                        :id => "production_5",
         | 
| 68 101 | 
             
                        :email => "customer@example.com",
         | 
| 69 102 | 
             
                        :created_at => Time.now.to_i
         | 
| 70 | 
            -
                      }
         | 
| 71 | 
            -
                    })
         | 
| 103 | 
            +
                      }.stringify_keys
         | 
| 104 | 
            +
                    }).and_return(response)
         | 
| 72 105 |  | 
| 73 106 | 
             
                    client.identify(customer)
         | 
| 74 107 | 
             
                  end
         | 
| 108 | 
            +
             | 
| 109 | 
            +
                  it "uses custom identity when using a pure hash" do
         | 
| 110 | 
            +
                    Customerio::Client.should_receive(:put).with("/api/v1/customers/production_5", {
         | 
| 111 | 
            +
                      :basic_auth => anything(),
         | 
| 112 | 
            +
                      :body => {
         | 
| 113 | 
            +
                        :id => "production_5",
         | 
| 114 | 
            +
                        :email => "customer@example.com",
         | 
| 115 | 
            +
                        :created_at => Time.now.to_i
         | 
| 116 | 
            +
                      }.stringify_keys
         | 
| 117 | 
            +
                    }).and_return(response)
         | 
| 118 | 
            +
             | 
| 119 | 
            +
                    client.identify(:id => 5, :email => "customer@example.com", :created_at => Time.now.to_i)
         | 
| 120 | 
            +
                  end
         | 
| 75 121 | 
             
                end
         | 
| 76 122 | 
             
              end
         | 
| 77 123 |  | 
| 78 124 | 
             
              describe "#track" do
         | 
| 79 | 
            -
              	before do
         | 
| 80 | 
            -
              		# Don't actually send identify requests
         | 
| 81 | 
            -
              		Customerio::Client.stub(:put)
         | 
| 82 | 
            -
              	end
         | 
| 83 | 
            -
             | 
| 84 125 | 
             
              	it "sends a POST request to the customer.io's event API" do
         | 
| 85 | 
            -
              		Customerio::Client.should_receive(:post).with("/api/v1/customers/5/events", anything())
         | 
| 126 | 
            +
              		Customerio::Client.should_receive(:post).with("/api/v1/customers/5/events", anything()).and_return(response)
         | 
| 86 127 | 
             
                  client.track(customer, "purchase")
         | 
| 87 128 | 
             
              	end
         | 
| 88 129 |  | 
| 89 | 
            -
             | 
| 90 | 
            -
             | 
| 91 | 
            -
             | 
| 130 | 
            +
                it "raises an error if POST doesn't return a 2xx response code" do
         | 
| 131 | 
            +
                  Customerio::Client.should_receive(:post).and_return(mock("Response", code: 500))
         | 
| 132 | 
            +
                  lambda { client.track(customer, "purchase") }.should raise_error(Customerio::Client::InvalidResponse)
         | 
| 133 | 
            +
                end
         | 
| 134 | 
            +
             | 
| 135 | 
            +
              	it "calls identify with the user's attributes to ensure they've been properly identified" do
         | 
| 136 | 
            +
              		client.should_receive(:identify).with({ :id => 5, :email => "customer@example.com", :created_at => Time.now.to_i }.stringify_keys).and_return(response)
         | 
| 92 137 | 
             
              		client.track(customer, "purchase")
         | 
| 93 138 | 
             
              	end
         | 
| 94 139 |  | 
| @@ -105,7 +150,7 @@ describe Customerio::Client do | |
| 105 150 | 
             
              		Customerio::Client.should_receive(:post).with("/api/v1/customers/5/events", {
         | 
| 106 151 | 
             
              			:basic_auth => anything(),
         | 
| 107 152 | 
             
              			:body => { :name => "purchase", :data => {} }
         | 
| 108 | 
            -
              		})
         | 
| 153 | 
            +
              		}).and_return(response)
         | 
| 109 154 |  | 
| 110 155 | 
             
                  client.track(customer, "purchase")
         | 
| 111 156 | 
             
              	end
         | 
| @@ -115,33 +160,54 @@ describe Customerio::Client do | |
| 115 160 | 
             
              			:basic_auth => anything(),
         | 
| 116 161 | 
             
              			:body => {
         | 
| 117 162 | 
             
              				:name => "purchase",
         | 
| 118 | 
            -
              			  :data => { :type => "socks", :price => "13.99" }
         | 
| 163 | 
            +
              			  :data => { :type => "socks", :price => "13.99" }.stringify_keys
         | 
| 119 164 | 
             
              			}
         | 
| 120 | 
            -
              		})
         | 
| 165 | 
            +
              		}).and_return(response)
         | 
| 121 166 |  | 
| 122 167 | 
             
                  client.track(customer, "purchase", :type => "socks", :price => "13.99")
         | 
| 123 168 | 
             
              	end
         | 
| 124 169 |  | 
| 170 | 
            +
                it "allows tracking by customer id as well" do
         | 
| 171 | 
            +
              		Customerio::Client.should_receive(:post).with("/api/v1/customers/5/events", {
         | 
| 172 | 
            +
              			:basic_auth => anything(),
         | 
| 173 | 
            +
              			:body => {
         | 
| 174 | 
            +
              				:name => "purchase",
         | 
| 175 | 
            +
              			  :data => { :type => "socks", :price => "13.99" }.stringify_keys
         | 
| 176 | 
            +
              			}
         | 
| 177 | 
            +
              		}).and_return(response)
         | 
| 178 | 
            +
             | 
| 179 | 
            +
                  client.track(5, "purchase", :type => "socks", :price => "13.99")
         | 
| 180 | 
            +
                end
         | 
| 181 | 
            +
             | 
| 125 182 | 
             
                context "client has customized identities" do
         | 
| 126 183 | 
             
                  before do
         | 
| 127 | 
            -
                    Customerio::Client.id do | | 
| 128 | 
            -
                      "production_#{ | 
| 184 | 
            +
                    Customerio::Client.id do |customer_id|
         | 
| 185 | 
            +
                      "production_#{customer_id}"
         | 
| 129 186 | 
             
                    end
         | 
| 130 187 | 
             
                  end
         | 
| 131 188 |  | 
| 132 189 | 
             
                  it "identifies the customer with the identification method" do
         | 
| 133 190 | 
             
                    Customerio::Client.should_receive(:post).with("/api/v1/customers/production_5/events", {
         | 
| 134 | 
            -
             | 
| 135 | 
            -
             | 
| 136 | 
            -
             | 
| 191 | 
            +
                      :basic_auth => anything(),
         | 
| 192 | 
            +
                      :body => anything()
         | 
| 193 | 
            +
                    }).and_return(response)
         | 
| 137 194 |  | 
| 138 | 
            -
             | 
| 195 | 
            +
                    client.track(customer, "purchase")
         | 
| 196 | 
            +
                  end
         | 
| 197 | 
            +
             | 
| 198 | 
            +
                  it "uses the identification method when tracking by id" do
         | 
| 199 | 
            +
                    Customerio::Client.should_receive(:post).with("/api/v1/customers/production_5/events", {
         | 
| 200 | 
            +
                      :basic_auth => anything(),
         | 
| 201 | 
            +
                      :body => anything()
         | 
| 202 | 
            +
                    }).and_return(response)
         | 
| 203 | 
            +
             | 
| 204 | 
            +
                    client.track(5, "purchase")
         | 
| 139 205 | 
             
                  end
         | 
| 140 206 | 
             
                end
         | 
| 141 207 |  | 
| 142 208 | 
             
                context "tracking an anonymous event" do
         | 
| 143 209 | 
             
                  it "sends a POST request to the customer.io's anonymous event API" do
         | 
| 144 | 
            -
                    Customerio::Client.should_receive(:post).with("/api/v1/events", anything())
         | 
| 210 | 
            +
                    Customerio::Client.should_receive(:post).with("/api/v1/events", anything()).and_return(response)
         | 
| 145 211 | 
             
                    client.track("purchase")
         | 
| 146 212 | 
             
                  end
         | 
| 147 213 |  | 
| @@ -149,7 +215,7 @@ describe Customerio::Client do | |
| 149 215 | 
             
                    Customerio::Client.should_receive(:post).with("/api/v1/events", {
         | 
| 150 216 | 
             
                      :basic_auth => { :username => "SITE_ID", :password => "API_KEY" },
         | 
| 151 217 | 
             
                      :body => anything()
         | 
| 152 | 
            -
                    })
         | 
| 218 | 
            +
                    }).and_return(response)
         | 
| 153 219 |  | 
| 154 220 | 
             
                    client.track("purchase")
         | 
| 155 221 | 
             
                  end
         | 
| @@ -158,7 +224,7 @@ describe Customerio::Client do | |
| 158 224 | 
             
                    Customerio::Client.should_receive(:post).with("/api/v1/events", {
         | 
| 159 225 | 
             
                      :basic_auth => anything(),
         | 
| 160 226 | 
             
                      :body => { :name => "purchase", :data => {} }
         | 
| 161 | 
            -
                    })
         | 
| 227 | 
            +
                    }).and_return(response)
         | 
| 162 228 |  | 
| 163 229 | 
             
                    client.track("purchase")
         | 
| 164 230 | 
             
                  end
         | 
| @@ -168,9 +234,9 @@ describe Customerio::Client do | |
| 168 234 | 
             
                      :basic_auth => anything(),
         | 
| 169 235 | 
             
                      :body => {
         | 
| 170 236 | 
             
                        :name => "purchase",
         | 
| 171 | 
            -
                        :data => { :type => "socks", :price => "13.99" }
         | 
| 237 | 
            +
                        :data => { :type => "socks", :price => "13.99" }.stringify_keys
         | 
| 172 238 | 
             
                      }
         | 
| 173 | 
            -
                    })
         | 
| 239 | 
            +
                    }).and_return(response)
         | 
| 174 240 |  | 
| 175 241 | 
             
                    client.track("purchase", :type => "socks", :price => "13.99")
         | 
| 176 242 | 
             
                  end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: customerio
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.2.0
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors:
         | 
| @@ -9,7 +9,7 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date: 2012-11- | 
| 12 | 
            +
            date: 2012-11-22 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: httparty
         | 
| @@ -27,6 +27,22 @@ dependencies: | |
| 27 27 | 
             
                - - ~>
         | 
| 28 28 | 
             
                  - !ruby/object:Gem::Version
         | 
| 29 29 | 
             
                    version: 0.9.0
         | 
| 30 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 31 | 
            +
              name: activesupport
         | 
| 32 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 33 | 
            +
                none: false
         | 
| 34 | 
            +
                requirements:
         | 
| 35 | 
            +
                - - ! '>='
         | 
| 36 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 37 | 
            +
                    version: '0'
         | 
| 38 | 
            +
              type: :runtime
         | 
| 39 | 
            +
              prerelease: false
         | 
| 40 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 41 | 
            +
                none: false
         | 
| 42 | 
            +
                requirements:
         | 
| 43 | 
            +
                - - ! '>='
         | 
| 44 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 45 | 
            +
                    version: '0'
         | 
| 30 46 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 31 47 | 
             
              name: rake
         | 
| 32 48 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -84,6 +100,7 @@ extra_rdoc_files: [] | |
| 84 100 | 
             
            files:
         | 
| 85 101 | 
             
            - .gitignore
         | 
| 86 102 | 
             
            - .travis.yml
         | 
| 103 | 
            +
            - CHANGELOG.markdown
         | 
| 87 104 | 
             
            - Gemfile
         | 
| 88 105 | 
             
            - Gemfile.lock
         | 
| 89 106 | 
             
            - LICENSE
         |