iterable-api 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.
- checksums.yaml +7 -0
- data/lib/iterable/api.rb +59 -0
- data/lib/iterable/exceptions/service_exception.rb +11 -0
- data/lib/iterable/models/base.rb +11 -0
- data/lib/iterable/models/commerce_item.rb +30 -0
- data/lib/iterable/models/data_fields.rb +4 -0
- data/lib/iterable/models/list_details.rb +8 -0
- data/lib/iterable/models/requests/subscribe.rb +19 -0
- data/lib/iterable/models/requests/track_purchase.rb +43 -0
- data/lib/iterable/models/requests/user_update.rb +18 -0
- data/lib/iterable/models/responses/error.rb +10 -0
- data/lib/iterable/models/responses/general.rb +9 -0
- data/lib/iterable/models/responses/lists.rb +7 -0
- data/lib/iterable/models/responses/subscribe.rb +9 -0
- data/lib/iterable/models/responses/user.rb +7 -0
- data/lib/iterable/models/user.rb +9 -0
- data/lib/iterable/services/base_service.rb +79 -0
- data/lib/iterable/services/commerce_service.rb +18 -0
- data/lib/iterable/services/list_service.rb +27 -0
- data/lib/iterable/services/user_service.rb +34 -0
- data/lib/iterable/util/config.rb +74 -0
- data/lib/iterable/util/helpers.rb +27 -0
- data/lib/iterable/version.rb +3 -0
- data/lib/iterable.rb +49 -0
- metadata +191 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 42bb2967ea2ef08f5cc93822d27af65b36d0b440
|
4
|
+
data.tar.gz: 750faebd5fe328830223b5618c8c8cc3da28e4a3
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a0d1cdf1e7041b5bdc8d28860283d2e1a8caf8da169b4f92565727af42ac1e953f13e8f7dc0b64484162eeda84d4f0e7fff7726015d276430262152e69000e50
|
7
|
+
data.tar.gz: 1d626042d1471182ab013508a722a52914caac7262b78c4d41a905f5e31ab20094b4c9381e31c6334653122f95d758cc4aefde208555889022e0fbe6f5a4e95e
|
data/lib/iterable/api.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
#
|
2
|
+
# api.rb
|
3
|
+
# Iterable
|
4
|
+
#
|
5
|
+
# Copyright (c) 2017 Kyle Schutt. All rights reserved.
|
6
|
+
|
7
|
+
module Iterable
|
8
|
+
class Api
|
9
|
+
# Class constructor
|
10
|
+
# @param [String] api_key - Iterable API Key
|
11
|
+
# @return
|
12
|
+
def initialize(api_key = nil)
|
13
|
+
Services::BaseService.api_key = api_key || Util::Config.get('auth.api_key')
|
14
|
+
if Services::BaseService.api_key.nil? || Services::BaseService.api_key == ''
|
15
|
+
raise ArgumentError.new(Util::Config.get('errors.api_key_missing'))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
#
|
20
|
+
# List Services
|
21
|
+
#
|
22
|
+
def lists
|
23
|
+
Services::ListService.all
|
24
|
+
end
|
25
|
+
|
26
|
+
def lists_subscribe(list_id, subscribers)
|
27
|
+
Services::ListService.subscribe(list_id, subscribers)
|
28
|
+
end
|
29
|
+
|
30
|
+
def list_by_id(list_id)
|
31
|
+
Services::ListService.find_by_id(list_id)
|
32
|
+
end
|
33
|
+
|
34
|
+
#
|
35
|
+
# User Services
|
36
|
+
#
|
37
|
+
def user_by_email(email)
|
38
|
+
Services::UserService.find_by_email(email)
|
39
|
+
end
|
40
|
+
|
41
|
+
def user_by_id(id)
|
42
|
+
Services::UserService.find_by_id(id)
|
43
|
+
end
|
44
|
+
|
45
|
+
def user_update(user)
|
46
|
+
Services::UserService.update(user)
|
47
|
+
end
|
48
|
+
|
49
|
+
def user_subscriptions_update
|
50
|
+
end
|
51
|
+
|
52
|
+
#
|
53
|
+
# Commerce Services
|
54
|
+
#
|
55
|
+
def track_purchase(track_purchase_request)
|
56
|
+
Services::CommerceService.track_purchase(track_purchase_request)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Iterable
|
2
|
+
class Base < Hashie::Dash
|
3
|
+
include Hashie::Extensions::Dash::Coercion
|
4
|
+
include Hashie::Extensions::Dash::PropertyTranslation
|
5
|
+
|
6
|
+
def initialize(hash = {})
|
7
|
+
# ensure we symbolize keys
|
8
|
+
super(Hashie.symbolize_keys!(hash))
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# {
|
2
|
+
# "id": "",
|
3
|
+
# "sku": "",
|
4
|
+
# "name": "",
|
5
|
+
# "description": "",
|
6
|
+
# "categories": [
|
7
|
+
# ""
|
8
|
+
# ],
|
9
|
+
# "price": 0,
|
10
|
+
# "quantity": 0,
|
11
|
+
# "imageUrl": "",
|
12
|
+
# "url": "",
|
13
|
+
# "dataFields": "Map[string, object]"
|
14
|
+
# }
|
15
|
+
module Iterable
|
16
|
+
class CommerceItem < Iterable::Base
|
17
|
+
property :id, required: true, coerce: String
|
18
|
+
property :name, required: true
|
19
|
+
property :price, required: true, coerce: Float
|
20
|
+
property :quantity, required: true, coerce: Integer
|
21
|
+
|
22
|
+
property :sku
|
23
|
+
property :description
|
24
|
+
property :imageUrl
|
25
|
+
property :url
|
26
|
+
|
27
|
+
property :categories, coerce: Array[String]
|
28
|
+
property :dataFields, coerce: DataFields
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# Example request
|
2
|
+
# {
|
3
|
+
# listId": 0,
|
4
|
+
# "subscribers": [
|
5
|
+
# {
|
6
|
+
# "email": "",
|
7
|
+
# "dataFields": "Map[string, object]",
|
8
|
+
# "userId": ""
|
9
|
+
# }
|
10
|
+
# ]
|
11
|
+
# }
|
12
|
+
module Iterable
|
13
|
+
module Requests
|
14
|
+
class Subscribe < Iterable::Base
|
15
|
+
property :listId, coerce: Integer, required: true
|
16
|
+
property :subscribers, coerce: Array[Iterable::User]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# Example request
|
2
|
+
# {
|
3
|
+
# "user": {
|
4
|
+
# "email": "",
|
5
|
+
# "dataFields": "Map[string, object]",
|
6
|
+
# "userId": "",
|
7
|
+
# "mergeNestedObjects": false
|
8
|
+
# },
|
9
|
+
# "items": [
|
10
|
+
# {
|
11
|
+
# "id": "",
|
12
|
+
# "sku": "",
|
13
|
+
# "name": "",
|
14
|
+
# "description": "",
|
15
|
+
# "categories": [
|
16
|
+
# ""
|
17
|
+
# ],
|
18
|
+
# "price": 0,
|
19
|
+
# "quantity": 0,
|
20
|
+
# "imageUrl": "",
|
21
|
+
# "url": "",
|
22
|
+
# "dataFields": "Map[string, object]"
|
23
|
+
# }
|
24
|
+
# ],
|
25
|
+
# "campaignId": 0,
|
26
|
+
# "templateId": 0,
|
27
|
+
# "total": 0,
|
28
|
+
# "createdAt": 0,
|
29
|
+
# "dataFields": "Map[string, object]"
|
30
|
+
# }
|
31
|
+
module Iterable
|
32
|
+
module Requests
|
33
|
+
class TrackPurchase < Iterable::Base
|
34
|
+
property :user, coerce: Iterable::Requests::UserUpdate, required: true
|
35
|
+
property :items, coerce: Array[Iterable::CommerceItem], required: true
|
36
|
+
property :campaignId
|
37
|
+
property :templateId
|
38
|
+
property :total, required: true
|
39
|
+
property :createdAt
|
40
|
+
property :dataFields, coerce: DataFields
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# Example request
|
2
|
+
# {
|
3
|
+
# listId": 0,
|
4
|
+
# "subscribers": [
|
5
|
+
# {
|
6
|
+
# "email": "",
|
7
|
+
# "dataFields": "Map[string, object]",
|
8
|
+
# "userId": ""
|
9
|
+
# }
|
10
|
+
# ]
|
11
|
+
# }
|
12
|
+
module Iterable
|
13
|
+
module Requests
|
14
|
+
class UserUpdate < Iterable::User
|
15
|
+
property :mergeNestedObjects, default: false
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
#
|
2
|
+
# base_service.rb
|
3
|
+
# Iterable
|
4
|
+
#
|
5
|
+
# Copyright (c) 2017 Kyle Schutt. All rights reserved.
|
6
|
+
|
7
|
+
module Iterable
|
8
|
+
module Services
|
9
|
+
class BaseService
|
10
|
+
class << self
|
11
|
+
attr_accessor :api_key
|
12
|
+
|
13
|
+
protected
|
14
|
+
|
15
|
+
def get(path, params = {}, response_type = Iterable::Responses::General)
|
16
|
+
url = URI::join(Util::Config.get('endpoints.base_url'), path).to_s
|
17
|
+
url = build_url(url, params)
|
18
|
+
response = RestClient.get(url, get_headers())
|
19
|
+
begin
|
20
|
+
response_type.new JSON.parse(response.body)
|
21
|
+
rescue
|
22
|
+
Hashie::Mash.new JSON.parse(response.body)
|
23
|
+
end
|
24
|
+
rescue RestClient::BadRequest => e
|
25
|
+
Iterable::Responses::Error.new(response: e.response.body, msg: e.message, code: 400)
|
26
|
+
end
|
27
|
+
|
28
|
+
def post(path, body = {}, params = {}, response_type = Iterable::Responses::General)
|
29
|
+
url = URI::join(Util::Config.get('endpoints.base_url'), path).to_s
|
30
|
+
url = build_url(url, params)
|
31
|
+
response = RestClient.post(url, body.to_json, get_headers())
|
32
|
+
begin
|
33
|
+
response_type.new JSON.parse(response.body)
|
34
|
+
rescue
|
35
|
+
Hashie::Mash.new JSON.parse(response.body)
|
36
|
+
end
|
37
|
+
rescue RestClient::BadRequest => e
|
38
|
+
Iterable::Responses::Error.new(response: e.response.body, msg: e.message, code: 400)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Return required headers for making an http request with Iterable
|
42
|
+
# @param [String] content_type - The MIME type of the body of the request, default is 'application/json'
|
43
|
+
# @return [Hash] - authorization headers
|
44
|
+
def get_headers(content_type = 'application/json')
|
45
|
+
{
|
46
|
+
:content_type => content_type,
|
47
|
+
:accept => 'application/json',
|
48
|
+
:user_agent => "Iterable Ruby SDK v#{Iterable::VERSION} (#{RUBY_DESCRIPTION})",
|
49
|
+
:x_ctct_request_source => "sdk.ruby.#{Iterable::VERSION}",
|
50
|
+
'Api-Key' => BaseService.api_key
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
54
|
+
# Build a url from the base url and query parameters hash. Query parameters
|
55
|
+
# should not be URL encoded because this method will handle that
|
56
|
+
# @param [String] url - The base url
|
57
|
+
# @param [Hash] params - A hash with query parameters
|
58
|
+
# @return [String] - the url with query parameters hash
|
59
|
+
def build_url(url, params = nil)
|
60
|
+
if params.respond_to? :each
|
61
|
+
params.each do |key, value|
|
62
|
+
# Convert dates to CC date format
|
63
|
+
if value.respond_to? :iso8601
|
64
|
+
params[key] = value.iso8601
|
65
|
+
end
|
66
|
+
|
67
|
+
if key.to_s == 'next' && value.match(/^.*?next=(.*)$/)
|
68
|
+
params[key] = $1
|
69
|
+
end
|
70
|
+
end
|
71
|
+
else
|
72
|
+
params ||= {}
|
73
|
+
end
|
74
|
+
url + '?' + Util::Helpers.http_build_query(params)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
#
|
2
|
+
# commerce_service.rb
|
3
|
+
# Iterable
|
4
|
+
#
|
5
|
+
# Copyright (c) 2017 Kyle Schutt. All rights reserved.
|
6
|
+
|
7
|
+
module Iterable
|
8
|
+
module Services
|
9
|
+
class CommerceService < BaseService
|
10
|
+
class << self
|
11
|
+
def track_purchase(request)
|
12
|
+
raise Exceptions::ServiceException, "Must be a Iterable::Requests::TrackPurchase" unless request.is_a?(Iterable::Requests::TrackPurchase)
|
13
|
+
post(Util::Config.get('endpoints.track_purchase'), request)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
#
|
2
|
+
# list_service.rb
|
3
|
+
# Iterable
|
4
|
+
#
|
5
|
+
# Copyright (c) 2017 Kyle Schutt. All rights reserved.
|
6
|
+
|
7
|
+
module Iterable
|
8
|
+
module Services
|
9
|
+
class ListService < BaseService
|
10
|
+
class << self
|
11
|
+
def all
|
12
|
+
get(Util::Config.get('endpoints.lists'), nil, Iterable::Responses::Lists)
|
13
|
+
end
|
14
|
+
|
15
|
+
def find_by_id(id)
|
16
|
+
# iterate over all lists to find the id
|
17
|
+
all.lists.select{|x| x.id == id.to_i}.first
|
18
|
+
end
|
19
|
+
|
20
|
+
def subscribe(list_id, subscribers)
|
21
|
+
request = Iterable::Requests::Subscribe.new(listId: list_id, subscribers: subscribers)
|
22
|
+
post(Util::Config.get('endpoints.lists_subscribe'), request, nil, Iterable::Responses::Subscribe)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
#
|
2
|
+
# user_service.rb
|
3
|
+
# Iterable
|
4
|
+
#
|
5
|
+
# Copyright (c) 2017 Kyle Schutt. All rights reserved.
|
6
|
+
|
7
|
+
module Iterable
|
8
|
+
module Services
|
9
|
+
class UserService < BaseService
|
10
|
+
class << self
|
11
|
+
def find_by_email(email)
|
12
|
+
raise Exceptions::ServiceException, "Email is required." if email.nil?
|
13
|
+
find_by((Util::Config.get('endpoints.user_by_email') % [email]))
|
14
|
+
end
|
15
|
+
|
16
|
+
def find_by_id(id)
|
17
|
+
raise Exceptions::ServiceException, "Id is required." if id.nil?
|
18
|
+
find_by((Util::Config.get('endpoints.user_by_id') % [id]))
|
19
|
+
end
|
20
|
+
|
21
|
+
def update(user)
|
22
|
+
raise Exceptions::ServiceException, "Must be a Iterable::Requests::UserUpdate" unless user.is_a?(Iterable::Requests::UserUpdate)
|
23
|
+
post(Util::Config.get('endpoints.user_update'), user)
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def find_by(path)
|
29
|
+
get(path, nil, Iterable::Responses::User)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
#
|
2
|
+
# config.rb
|
3
|
+
# Iterable
|
4
|
+
#
|
5
|
+
# Copyright (c) 2017 Kyle Schutt. All rights reserved.
|
6
|
+
|
7
|
+
module Iterable
|
8
|
+
module Util
|
9
|
+
class Config
|
10
|
+
|
11
|
+
# Return a hash of configuration strings
|
12
|
+
# @return [Hash] - hash of configuration properties
|
13
|
+
@props = {
|
14
|
+
# REST endpoints
|
15
|
+
:endpoints => {
|
16
|
+
:base_url => 'https://api.iterable.com:443/api/',
|
17
|
+
|
18
|
+
# subscribers (users)
|
19
|
+
:user_by_email => 'users/%s',
|
20
|
+
:user_by_id => 'users/byUserId/%s',
|
21
|
+
:user_update => 'users/update',
|
22
|
+
:user_subscriptions_update => 'users/updateSubscriptions',
|
23
|
+
|
24
|
+
# subscriptions (lists)
|
25
|
+
:lists => 'lists',
|
26
|
+
:lists_subscribe => 'lists/subscribe',
|
27
|
+
|
28
|
+
# purchases (commerce)
|
29
|
+
:track_purchase => 'commerce/trackPurchase',
|
30
|
+
},
|
31
|
+
|
32
|
+
# Authorization related configuration options
|
33
|
+
:auth => {
|
34
|
+
:api_key => ''
|
35
|
+
},
|
36
|
+
|
37
|
+
# Errors to be returned for various exceptions
|
38
|
+
:errors => {
|
39
|
+
:api_key_missing => 'api_key required either explicitly or in configuration.',
|
40
|
+
}
|
41
|
+
}
|
42
|
+
|
43
|
+
class << self
|
44
|
+
attr_accessor :props
|
45
|
+
|
46
|
+
def configure
|
47
|
+
yield props if block_given?
|
48
|
+
end
|
49
|
+
|
50
|
+
# Get a configuration property given a specified location, example usage: Config::get('auth.token_endpoint')
|
51
|
+
# @param [String] index - location of the property to obtain
|
52
|
+
# @return [String]
|
53
|
+
def get(index)
|
54
|
+
properties = index.split('.')
|
55
|
+
get_value(properties, props)
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
# Navigate through a config array looking for a particular index
|
61
|
+
# @param [Array] index The index sequence we are navigating down
|
62
|
+
# @param [Hash, String] value The portion of the config array to process
|
63
|
+
# @return [String]
|
64
|
+
def get_value(index, value)
|
65
|
+
index = index.is_a?(Array) ? index : [index]
|
66
|
+
key = index.shift.to_sym
|
67
|
+
value.is_a?(Hash) and value[key] and value[key].is_a?(Hash) ?
|
68
|
+
get_value(index, value[key]) :
|
69
|
+
value[key]
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
#
|
2
|
+
# helpers.rb
|
3
|
+
# Iterable
|
4
|
+
#
|
5
|
+
# Copyright (c) 2017 Kyle Schutt. All rights reserved.
|
6
|
+
|
7
|
+
module Iterable
|
8
|
+
module Util
|
9
|
+
class Helpers
|
10
|
+
class << self
|
11
|
+
|
12
|
+
# Build the HTTP query from the given parameters
|
13
|
+
# @param [Hash] params
|
14
|
+
# @return [String] query string
|
15
|
+
def http_build_query(params)
|
16
|
+
params.collect{ |k,v| "#{k}=#{encode(v)}" }.reverse.join('&')
|
17
|
+
end
|
18
|
+
|
19
|
+
# Escape special characters
|
20
|
+
# @param [String] str
|
21
|
+
def encode(str)
|
22
|
+
CGI.escape(str).gsub('.', '%2E').gsub('-', '%2D')
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/iterable.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
|
2
|
+
require 'rubygems'
|
3
|
+
require 'rest_client'
|
4
|
+
require 'json'
|
5
|
+
require 'hashie'
|
6
|
+
require 'openssl'
|
7
|
+
require 'base64'
|
8
|
+
|
9
|
+
module Iterable
|
10
|
+
autoload :Api, 'iterable/api'
|
11
|
+
autoload :VERSION, 'iterable/version'
|
12
|
+
|
13
|
+
# Models
|
14
|
+
autoload :Base, 'iterable/models/base'
|
15
|
+
autoload :User, 'iterable/models/user'
|
16
|
+
autoload :DataFields, 'iterable/models/data_fields'
|
17
|
+
autoload :ListDetails, 'iterable/models/list_details'
|
18
|
+
autoload :CommerceItem, 'iterable/models/commerce_item'
|
19
|
+
|
20
|
+
module Responses
|
21
|
+
autoload :Error, 'iterable/models/responses/error'
|
22
|
+
autoload :General, 'iterable/models/responses/general'
|
23
|
+
autoload :Lists, 'iterable/models/responses/lists'
|
24
|
+
autoload :Subscribe, 'iterable/models/responses/subscribe'
|
25
|
+
autoload :User, 'iterable/models/responses/user'
|
26
|
+
end
|
27
|
+
|
28
|
+
module Requests
|
29
|
+
autoload :Subscribe, 'iterable/models/requests/subscribe'
|
30
|
+
autoload :TrackPurchase, 'iterable/models/requests/track_purchase'
|
31
|
+
autoload :UserUpdate, 'iterable/models/requests/user_update'
|
32
|
+
end
|
33
|
+
|
34
|
+
module Services
|
35
|
+
autoload :BaseService, 'iterable/services/base_service'
|
36
|
+
autoload :CommerceService, 'iterable/services/commerce_service'
|
37
|
+
autoload :ListService, 'iterable/services/list_service'
|
38
|
+
autoload :UserService, 'iterable/services/user_service'
|
39
|
+
end
|
40
|
+
|
41
|
+
module Exceptions
|
42
|
+
autoload :ServiceException, 'iterable/exceptions/service_exception'
|
43
|
+
end
|
44
|
+
|
45
|
+
module Util
|
46
|
+
autoload :Config, 'iterable/util/config'
|
47
|
+
autoload :Helpers, 'iterable/util/helpers'
|
48
|
+
end
|
49
|
+
end
|
metadata
ADDED
@@ -0,0 +1,191 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: iterable-api
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Iterable
|
8
|
+
- Revv
|
9
|
+
- Kyle Schutt
|
10
|
+
autorequire:
|
11
|
+
bindir: exe
|
12
|
+
cert_chain: []
|
13
|
+
date: 2017-07-20 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rest-client
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
requirements:
|
19
|
+
- - "<"
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '4.0'
|
22
|
+
- - ">="
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: 1.6.7
|
25
|
+
type: :runtime
|
26
|
+
prerelease: false
|
27
|
+
version_requirements: !ruby/object:Gem::Requirement
|
28
|
+
requirements:
|
29
|
+
- - "<"
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
version: '4.0'
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: 1.6.7
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: json
|
37
|
+
requirement: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - "~>"
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '1.8'
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: 1.8.1
|
45
|
+
type: :runtime
|
46
|
+
prerelease: false
|
47
|
+
version_requirements: !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - "~>"
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '1.8'
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.8.1
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: mime-types
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "<"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '4.0'
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: 1.25.1
|
65
|
+
type: :runtime
|
66
|
+
prerelease: false
|
67
|
+
version_requirements: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - "<"
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '4.0'
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 1.25.1
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: hashie
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "<"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '4.0'
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: 1.2.0
|
85
|
+
type: :runtime
|
86
|
+
prerelease: false
|
87
|
+
version_requirements: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - "<"
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '4.0'
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: 1.2.0
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: bundler
|
97
|
+
requirement: !ruby/object:Gem::Requirement
|
98
|
+
requirements:
|
99
|
+
- - "~>"
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '1.12'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
requirements:
|
106
|
+
- - "~>"
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '1.12'
|
109
|
+
- !ruby/object:Gem::Dependency
|
110
|
+
name: rake
|
111
|
+
requirement: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - "~>"
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: '10.0'
|
116
|
+
type: :development
|
117
|
+
prerelease: false
|
118
|
+
version_requirements: !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - "~>"
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: '10.0'
|
123
|
+
- !ruby/object:Gem::Dependency
|
124
|
+
name: rspec
|
125
|
+
requirement: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - "~>"
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: '3.0'
|
130
|
+
type: :development
|
131
|
+
prerelease: false
|
132
|
+
version_requirements: !ruby/object:Gem::Requirement
|
133
|
+
requirements:
|
134
|
+
- - "~>"
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
version: '3.0'
|
137
|
+
description:
|
138
|
+
email:
|
139
|
+
- info@revv.co
|
140
|
+
executables: []
|
141
|
+
extensions: []
|
142
|
+
extra_rdoc_files: []
|
143
|
+
files:
|
144
|
+
- lib/iterable.rb
|
145
|
+
- lib/iterable/api.rb
|
146
|
+
- lib/iterable/exceptions/service_exception.rb
|
147
|
+
- lib/iterable/models/base.rb
|
148
|
+
- lib/iterable/models/commerce_item.rb
|
149
|
+
- lib/iterable/models/data_fields.rb
|
150
|
+
- lib/iterable/models/list_details.rb
|
151
|
+
- lib/iterable/models/requests/subscribe.rb
|
152
|
+
- lib/iterable/models/requests/track_purchase.rb
|
153
|
+
- lib/iterable/models/requests/user_update.rb
|
154
|
+
- lib/iterable/models/responses/error.rb
|
155
|
+
- lib/iterable/models/responses/general.rb
|
156
|
+
- lib/iterable/models/responses/lists.rb
|
157
|
+
- lib/iterable/models/responses/subscribe.rb
|
158
|
+
- lib/iterable/models/responses/user.rb
|
159
|
+
- lib/iterable/models/user.rb
|
160
|
+
- lib/iterable/services/base_service.rb
|
161
|
+
- lib/iterable/services/commerce_service.rb
|
162
|
+
- lib/iterable/services/list_service.rb
|
163
|
+
- lib/iterable/services/user_service.rb
|
164
|
+
- lib/iterable/util/config.rb
|
165
|
+
- lib/iterable/util/helpers.rb
|
166
|
+
- lib/iterable/version.rb
|
167
|
+
homepage: https://github.com/revvco/iterable-api
|
168
|
+
licenses:
|
169
|
+
- MIT
|
170
|
+
metadata: {}
|
171
|
+
post_install_message:
|
172
|
+
rdoc_options: []
|
173
|
+
require_paths:
|
174
|
+
- lib
|
175
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
176
|
+
requirements:
|
177
|
+
- - ">="
|
178
|
+
- !ruby/object:Gem::Version
|
179
|
+
version: '0'
|
180
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
181
|
+
requirements:
|
182
|
+
- - ">="
|
183
|
+
- !ruby/object:Gem::Version
|
184
|
+
version: '0'
|
185
|
+
requirements: []
|
186
|
+
rubyforge_project:
|
187
|
+
rubygems_version: 2.4.5.1
|
188
|
+
signing_key:
|
189
|
+
specification_version: 4
|
190
|
+
summary: Ruby Library for interactions with the Iterable API
|
191
|
+
test_files: []
|