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 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
@@ -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
+ #
2
+ # service_exception.rb
3
+ # Iterable
4
+ #
5
+ # Copyright (c) 2017 Kyle Schutt. All rights reserved.
6
+
7
+ module Iterable
8
+ module Exceptions
9
+ class ServiceException < Exception; end
10
+ end
11
+ 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,4 @@
1
+ module Iterable
2
+ class DataFields < Hashie::Mash
3
+ end
4
+ end
@@ -0,0 +1,8 @@
1
+ module Iterable
2
+ class ListDetails < Iterable::Base
3
+ property :id, coerce: Integer
4
+ property :name
5
+ property :createdAt
6
+ property :listType
7
+ end
8
+ 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,10 @@
1
+ module Iterable
2
+ module Responses
3
+ class Error < Iterable::Base
4
+ property :msg
5
+ property :code
6
+ property :response
7
+ property :params, coerce: Hashie::Mash
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ module Iterable
2
+ module Responses
3
+ class General < Iterable::Base
4
+ property :msg
5
+ property :code
6
+ property :params, coerce: Hashie::Mash
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ module Iterable
2
+ module Responses
3
+ class Lists < Iterable::Base
4
+ property :lists, coerce: Array[Iterable::ListDetails]
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ module Iterable
2
+ module Responses
3
+ class Subscribe < Iterable::Base
4
+ property :successCount
5
+ property :failCount
6
+ property :invalidEmails, coerce: Array[String]
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ module Iterable
2
+ module Responses
3
+ class User < Iterable::Base
4
+ property :user, coerce: Iterable::User
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ module Iterable
2
+ class User < Iterable::Base
3
+ property :email, required: true, coerce: String
4
+
5
+ property :userId, coerce: String
6
+
7
+ property :dataFields, coerce: DataFields
8
+ end
9
+ 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
@@ -0,0 +1,3 @@
1
+ module Iterable
2
+ VERSION = "0.2.0".freeze
3
+ 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: []