iterable-api-client 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b9fb91e7903cb57cc4b94cf4e09e55d30363b54814e3b4a4772bb0afcc9e0688
4
- data.tar.gz: b485aefb061f8378d1dc26b2df501468102a4d03e5b38a0f765f215053489f61
3
+ metadata.gz: d04be11184926b2bcffba1f777270fc08fbf83e676babb5c1e79756e33915464
4
+ data.tar.gz: 07723ae603767edd511e37a3c682f0348e6a9262ca435e881fd4d86a7e77b515
5
5
  SHA512:
6
- metadata.gz: 56c2eec26670adaaec5954136b1b458ea0e28680ed56e4872b4eb5bcdd9788082a80067d1fb7b5a0706254349ffda1bb83e08bd4218b2144c2bf841e98659177
7
- data.tar.gz: 267c86d3a69163e1ebc3a4a9005ad999c86e1fd906fe38fd0b2e43cc11ce5e5a47bf6332abc0d37d849e8b72d03933fb2b281ab084e365fee4fe35ef245cb4ed
6
+ metadata.gz: dc7f30727eaa45240f3a0f683e58128184397a305214e29e719ae34d0794ee04421bfb0bf496865a285f85edede66691d40e3f0e19a24652261efe38e1b6fa82
7
+ data.tar.gz: a90443045373add4a10ffd3ddbfb74114e71102b6be4f9f8392af1b179a02813e9432d15c3d743499ccb7ae27a8fcbb2e548fb43ec826aff3e1b4211b29a4e27
checksums.yaml.gz.sig CHANGED
Binary file
data/README.md CHANGED
@@ -87,89 +87,92 @@ reponse.uri
87
87
 
88
88
  ## API Endpoints
89
89
 
90
- * [Bulk Catalog Items](#bulk-catalog-items)
91
- * [Create](#bulk-catalog-items-create)
92
- * [Delete](#bulk-catalog-items-delete)
93
- * [Campaigns](#campaigns)
94
- * [All](#campaigns-all)
95
- * [Create](#campaigns-create)
96
- * [Metrics](#campaigns-metrics)
97
- * [Child Campaigns](#campaigns-child)
98
- * [Catalog Field Mappings](#catalog-field-mappings)
99
- * [Get](#catalog-field-mappings-get)
100
- * [Update](#catalog-field-mappings-update)
101
- * [Catalog Items](#catalog-items)
102
- * [All](#catalog-items-all)
103
- * [Create](#catalog-items-create)
104
- * [Update](#catalog-items-update)
105
- * [Get](#catalog-items-get)
106
- * [Delete](#catalog-items-delete)
107
- * [Catalogs](#catalogs)
108
- * [Create](#catalogs-create)
109
- * [Delete](#catalogs-delete)
110
- * [Names](#catalogs-names)
111
- * [Channels](#channels)
112
- * [All](#channels-all)
113
- * [Commerce](#commerce)
114
- * [Track Purchase](#commerce-track-purchase)
115
- * [Update Cart](#commerce-update-cart)
116
- * [Device](#device)
117
- * [Register Device Token](#device-register-token)
118
- * [Email](#email)
119
- * [View](#email-view)
120
- * [Target](#email-target)
121
- * [Email Templates](#email-templates)
122
- * [Get](#email-templates-get)
123
- * [Update](#email-templates-update)
124
- * [Upsert](#email-templates-upsert)
125
- * [Events](#events)
126
- * [For Email](#events-for-email)
127
- * [Track](#events-track)
128
- * [Track Push Open](#events-track-push-open)
129
- * [Experiments](#experiments)
130
- * [Metrics](#experiments-metrics)
131
- * [Export](#export)
132
- * [JSON](#export-json)
133
- * [CSV](#export-csv)
134
- * [Lists](#lists)
135
- * [All](#lists-all)
136
- * [Create](#lists-create)
137
- * [Delete](#lists-delete)
138
- * [Get Users](#lists-users)
139
- * [Subscribe](#lists-subscribe)
140
- * [Unsubscribe](#lists-unsubscribe)
141
- * [Message Types](#message-types)
142
- * [All](#message-types-all)
143
- * [Metadata](#metadata)
144
- * [Get](#metadata-get)
145
- * [List Keys](#metadata-list-keys)
146
- * [Delete](#metadata-delete)
147
- * [Get Key](#metadata-get-key)
148
- * [Remove Key](#metadata-remove-key)
149
- * [Add Key](#metadata-add-key)
150
- * [Push Templates](#push-templates)
151
- * [Get](#push-templates-get)
152
- * [Update](#push-templates-update)
153
- * [Upsert](#push-templates-upsert)
154
- * [Templates](#templates)
155
- * [All](#templates-all)
156
- * [Get](#templates-get)
157
- * [Users](#users)
158
- * [Update](#users-update)
159
- * [Bulk Update](#users-bulk-update)
160
- * [Update Subscriptions](#users-update-subscriptions)
161
- * [Bulk Update Subscriptions](#users-bulk-update-subscriptions)
162
- * [For Email](#users-for-email)
163
- * [By User ID](#users-by-id)
164
- * [Get Fields](#users-get-fields)
165
- * [Update Email](#users-update-email)
166
- * [Delete](#users-delete)
167
- * [Delete By ID](#users-delete-by-id)
168
- * [Register Browser Token](#users-register-browser-token)
169
- * [Disable Device](#users-disable-device)
170
- * [Get Sent Messages](#users-get-messages)
171
- * [Workflows](#workflows)
172
- * [Trigger](#workflows-trigger)
90
+ - [Bulk Catalog Items](#bulk-catalog-items)
91
+ - [Create](#bulk-catalog-items-create)
92
+ - [Delete](#bulk-catalog-items-delete)
93
+ - [Campaigns](#campaigns)
94
+ - [All](#campaigns-all)
95
+ - [Create](#campaigns-create)
96
+ - [Metrics](#campaigns-metrics)
97
+ - [Child Campaigns](#campaigns-child)
98
+ - [Catalog Field Mappings](#catalog-field-mappings)
99
+ - [Get](#catalog-field-mappings-get)
100
+ - [Update](#catalog-field-mappings-update)
101
+ - [Catalog Items](#catalog-items)
102
+ - [All](#catalog-items-all)
103
+ - [Create](#catalog-items-create)
104
+ - [Update](#catalog-items-update)
105
+ - [Get](#catalog-items-get)
106
+ - [Delete](#catalog-items-delete)
107
+ - [Catalogs](#catalogs)
108
+ - [Create](#catalogs-create)
109
+ - [Delete](#catalogs-delete)
110
+ - [Names](#catalogs-names)
111
+ - [Channels](#channels)
112
+ - [All](#channels-all)
113
+ - [Commerce](#commerce)
114
+ - [Track Purchase](#commerce-track-purchase)
115
+ - [Update Cart](#commerce-update-cart)
116
+ - [Device](#device)
117
+ - [Register Device Token](#device-register-token)
118
+ - [Email](#email)
119
+ - [View](#email-view)
120
+ - [Target](#email-target)
121
+ - [Email Templates](#email-templates)
122
+ - [Get](#email-templates-get)
123
+ - [Update](#email-templates-update)
124
+ - [Upsert](#email-templates-upsert)
125
+ - [Events](#events)
126
+ - [For Email](#events-for-email)
127
+ - [Track](#events-track)
128
+ - [Track Push Open](#events-track-push-open)
129
+ - [Experiments](#experiments)
130
+ - [Metrics](#experiments-metrics)
131
+ - [Export](#export)
132
+ - [JSON](#export-json)
133
+ - [CSV](#export-csv)
134
+ - [In App](#in-app)
135
+ - [Messages](#in-app-messages)
136
+ - [Lists](#lists)
137
+ - [All](#lists-all)
138
+ - [Create](#lists-create)
139
+ - [Delete](#lists-delete)
140
+ - [Get Users](#lists-users)
141
+ - [Subscribe](#lists-subscribe)
142
+ - [Unsubscribe](#lists-unsubscribe)
143
+ - [Message Types](#message-types)
144
+ - [All](#message-types-all)
145
+ - [Metadata](#metadata)
146
+ - [Get](#metadata-get)
147
+ - [List Keys](#metadata-list-keys)
148
+ - [Delete](#metadata-delete)
149
+ - [Get Key](#metadata-get-key)
150
+ - [Remove Key](#metadata-remove-key)
151
+ - [Add Key](#metadata-add-key)
152
+ - [Push Templates](#push-templates)
153
+ - [Get](#push-templates-get)
154
+ - [Update](#push-templates-update)
155
+ - [Upsert](#push-templates-upsert)
156
+ - [Templates](#templates)
157
+ - [All](#templates-all)
158
+ - [Get](#templates-get)
159
+ - [Users](#users)
160
+ - [Update](#users-update)
161
+ - [Bulk Update](#users-bulk-update)
162
+ - [Update Subscriptions](#users-update-subscriptions)
163
+ - [Bulk Update Subscriptions](#users-bulk-update-subscriptions)
164
+ - [For Email](#users-for-email)
165
+ - [By User ID](#users-by-id)
166
+ - [Get Fields](#users-get-fields)
167
+ - [Update Email](#users-update-email)
168
+ - [Delete](#users-delete)
169
+ - [Delete By ID](#users-delete-by-id)
170
+ - [Register Browser Token](#users-register-browser-token)
171
+ - [Disable Device](#users-disable-device)
172
+ - [Get Sent Messages](#users-get-messages)
173
+ - [Forget](#users-forget)
174
+ - [Workflows](#workflows)
175
+ - [Trigger](#workflows-trigger)
173
176
 
174
177
  ### Bulk Catalog Items
175
178
 
@@ -261,8 +264,8 @@ Endpoint: `POST /catalogs/{catalogName}`
261
264
 
262
265
  ```ruby
263
266
  catalog = 'my-catalog'
264
- catalog_items = Iterable::Catalogs.new(catalog)
265
- response = catalog_items.create
267
+ catalogs = Iterable::Catalogs.new(catalog)
268
+ response = catalogs.create
266
269
  ```
267
270
 
268
271
  #### Catalogs Delete
@@ -271,19 +274,19 @@ Endpoint: `DELETE /catalogs/{catalogName}`
271
274
 
272
275
  ```ruby
273
276
  catalog = 'my-catalog'
274
- catalog_items = Iterable::Catalogs.new(catalog)
275
- response = catalog_items.delete
277
+ catalogs = Iterable::Catalogs.new(catalog)
278
+ response = catalogs.delete
276
279
  ```
277
280
 
278
- #### Catalogs Delete
281
+ #### Catalogs Names
279
282
 
280
- Endpoint: `DELETE /catalogs/{catalogName}`
283
+ Endpoint: `GET /catalogs/{catalogName}`
281
284
 
282
285
  ```ruby
283
286
  catalog = 'my-catalog'
284
- catalog_items = Iterable::Catalogs.new(catalog)
287
+ catalogs = Iterable::Catalogs.new(catalog)
285
288
  params = { page: 1, pageSize: 20 }
286
- response = catalog_items.names(params)
289
+ response = catalogs.names(params)
287
290
  ```
288
291
 
289
292
  ### Catalog Field Mappings
@@ -296,8 +299,8 @@ Endpoint: `GET /catalogs/{catalogName}/fieldMappings`
296
299
 
297
300
  ```ruby
298
301
  catalog = 'my-catalog'
299
- catalog_items = Iterable::CatalogFieldMappings.new(catalog)
300
- response = catalog_items.field_mappings
302
+ catalog_field_mappings = Iterable::CatalogFieldMappings.new(catalog)
303
+ response = catalog_field_mappings.field_mappings
301
304
  ```
302
305
 
303
306
  #### Catalog Field Mappings Update
@@ -307,8 +310,8 @@ Endpoint: `PUT /catalogs/{catalogName}/fieldMappings`
307
310
  ```ruby
308
311
  catalog = 'my-catalog'
309
312
  field_mappings = [{fieldName: 'test-field', fieldType: 'string'}]
310
- catalog = Iterable::CatalogFieldMappings.new(catalog)
311
- catalog.update_field_mappings(field_mappings)
313
+ catalog_field_mappings = Iterable::CatalogFieldMappings.new(catalog)
314
+ catalog_field_mappings.update(field_mappings)
312
315
  ```
313
316
 
314
317
  ### Catalog Items
@@ -616,6 +619,29 @@ start_time = end_time - (60 * 60* 24 * 7) # 7 days ago
616
619
  response = exporter.export start_time, end_time
617
620
  ```
618
621
 
622
+ ### In App
623
+
624
+ #### In App Messages
625
+
626
+ Endpoint: `GET /inApp/getMessages`
627
+
628
+ ```ruby
629
+ in_app = Iterable::InApp.new
630
+
631
+ # Get messages for a user by email
632
+ email = 'user@example.com'
633
+ response = in_app.messages_for_email email, count: 10
634
+
635
+ # Get messages for a user by user_id
636
+ email = 'user@example.com'
637
+ response = in_app.messages_for_user_id 42, count: 2
638
+
639
+ # Pass in query parameters
640
+ email = 'user@example.com'
641
+ attrs = { 'platform' => 'iOS' }
642
+ response = in_app.messages_for_email: email, attrs
643
+ ```
644
+
619
645
  ### Lists
620
646
 
621
647
  #### Lists All
@@ -949,6 +975,17 @@ start_time = end_time - (60 * 60* 24 * 7) # 7 days ago
949
975
  response = users.sent_messages 'user@example.com', start_time, end_time, params
950
976
  ```
951
977
 
978
+ #### Users Forget
979
+
980
+ Endpoint: `POST /users/forget`
981
+
982
+ ```ruby
983
+ users = Iterable::Users.new
984
+ # Additional params to filter and query by
985
+ email = 'user@example.com'
986
+ response = users.forget email
987
+ ```
988
+
952
989
  ### Workflows
953
990
 
954
991
  #### Workflows Trigger
@@ -15,7 +15,7 @@ module Iterable
15
15
  #
16
16
  # @return [Iterable::ApiResource]
17
17
  def initialize(conf = nil)
18
- @conf = conf ? conf : default_config
18
+ @conf = conf || default_config
19
19
  end
20
20
 
21
21
  ##
@@ -58,9 +58,7 @@ module Iterable
58
58
  Iterable.request(conf, base_path).post(body)
59
59
  end
60
60
 
61
- private
62
-
63
- def base_path
61
+ private def base_path
64
62
  "/catalogs/#{@catalog}/items"
65
63
  end
66
64
  end
@@ -14,6 +14,7 @@ module Iterable
14
14
  # catalog = Iterable::CatalogFieldMappings.new("catalog-name", config)
15
15
  class CatalogFieldMappings < ApiResource
16
16
  attr_reader :catalog
17
+
17
18
  ##
18
19
  #
19
20
  # Initialize CatalogFieldMappings with a catalog name **currently in Beta only**
@@ -54,9 +55,7 @@ module Iterable
54
55
  Iterable.request(conf, base_path).put(body)
55
56
  end
56
57
 
57
- private
58
-
59
- def base_path
58
+ private def base_path
60
59
  "/catalogs/#{@catalog}/fieldMappings"
61
60
  end
62
61
  end
@@ -45,11 +45,11 @@ module Iterable
45
45
  #
46
46
  # Create a catalog item
47
47
  #
48
- # @param item_attrs [Hash] Item attributes to save or update with
48
+ # @param item_attrs [Hash] Item attributes to save or replace with
49
49
  #
50
50
  # @return [Iterable::Response] A response object
51
51
  def create(item_attrs = {})
52
- body = { update: item_attrs }
52
+ body = { value: item_attrs }
53
53
  Iterable.request(conf, base_path).put(body)
54
54
  end
55
55
  alias replace create
@@ -84,9 +84,7 @@ module Iterable
84
84
  Iterable.request(conf, base_path).delete
85
85
  end
86
86
 
87
- private
88
-
89
- def base_path
87
+ private def base_path
90
88
  path = "/catalogs/#{@catalog}/items"
91
89
  path += "/#{@item_id}" if @item_id
92
90
  path
@@ -14,6 +14,7 @@ module Iterable
14
14
  # catalog = Iterable::Catalogs.new("catalog-name", config)
15
15
  class Catalogs < ApiResource
16
16
  attr_reader :name
17
+
17
18
  ##
18
19
  #
19
20
  # Initialize Catalogs with a catalog name **currently in Beta only**
@@ -54,9 +55,7 @@ module Iterable
54
55
  Iterable.request(conf, '/catalogs', params).get
55
56
  end
56
57
 
57
- private
58
-
59
- def base_path
58
+ private def base_path
60
59
  "/catalogs/#{@name}"
61
60
  end
62
61
  end
@@ -56,13 +56,11 @@ module Iterable
56
56
  Iterable.request(conf, base_path).post(attrs)
57
57
  end
58
58
 
59
- private
60
-
61
- def base_path
59
+ private def base_path
62
60
  '/users/registerDeviceToken'
63
61
  end
64
62
 
65
- def device_data
63
+ private def device_data
66
64
  {
67
65
  token: @token,
68
66
  applicationName: @app,
@@ -13,6 +13,7 @@ module Iterable
13
13
  # templates = Iterable::Experiments.new([1, 2, 3], config)
14
14
  class Experiments < ApiResource
15
15
  attr_reader :experiment_ids
16
+
16
17
  ##
17
18
  #
18
19
  # Initialize Experiments with an array of experiment ids
@@ -57,7 +57,7 @@ module Iterable
57
57
  # @param conf [Iterable::Config] A config to optionally pass for requests
58
58
  #
59
59
  # @return [Iterable::Export]
60
- def initialize(data_type, only_fields = [], omit_fields = [], campaign_id = nil, conf = nil)
60
+ def initialize(data_type, only_fields = [], omit_fields = [], campaign_id = nil, conf = nil) # rubocop:disable Metrics/ParameterLists
61
61
  @data_type = data_type
62
62
  @only_fields = only_fields
63
63
  @omit_fields = omit_fields
@@ -103,20 +103,26 @@ module Iterable
103
103
  Iterable.request(conf, base_path, request_params(params)).get
104
104
  end
105
105
 
106
- protected
107
-
108
- def base_path
106
+ protected def base_path
109
107
  "/export/data.#{format}"
110
108
  end
111
109
 
112
- def request_params(params = {})
110
+ protected def request_params(params = {})
113
111
  default_params.merge params
114
112
  end
115
113
 
116
- def default_params
114
+ protected def only_fields?
115
+ @only_fields&.length.to_i.positive?
116
+ end
117
+
118
+ protected def omit_fields?
119
+ @omit_fields&.length.to_i.positive?
120
+ end
121
+
122
+ protected def default_params
117
123
  params = { dataTypeName: @data_type }
118
- params[:onlyFields] = @only_fields if @only_fields && @only_fields.length.positive?
119
- params[:omitFields] = @omit_fields.join(',') if @omit_fields && @omit_fields.length.positive?
124
+ params[:onlyFields] = @only_fields if only_fields?
125
+ params[:omitFields] = @omit_fields.join(',') if omit_fields?
120
126
  params[:campaignId] = @campaign_id if @campaign_id
121
127
  params
122
128
  end
@@ -0,0 +1,48 @@
1
+ module Iterable
2
+ ##
3
+ #
4
+ # Interact with /inApp API endpoints
5
+ #
6
+ # @example Creating in app endpoint object
7
+ # # With default config
8
+ # in_app = Iterable::InApp.new
9
+ #
10
+ # # With custom config
11
+ # conf = Iterable::Config.new(token: 'new-token')
12
+ # in_app = Iterable::InApp.new(config)
13
+ class InApp < ApiResource
14
+ ##
15
+ #
16
+ # Get in-app messages for a user by email
17
+ #
18
+ # @param email [String] *required* Email of user who received the message to view. Required if no user_id present.
19
+ # @param count [Integer] Number of messages to return, defaults to 1
20
+ # @param attrs [Hash] Hash of query attributes like platform, SDKVersion, etc.
21
+ #
22
+ # @return [Iterable::Response] A response object
23
+ def messages_for_email(email, count: 1, **attrs)
24
+ attrs[:email] = email
25
+ attrs[:count] = count
26
+ messages(attrs)
27
+ end
28
+
29
+ ##
30
+ #
31
+ # Get in-app messages for a user by user_id
32
+ #
33
+ # @param email [String] *required* Email of user who received the message to view. Required if no user_id present.
34
+ # @param count [Integer] Number of messages to return, defaults to 1
35
+ # @param attrs [Hash] Hash of query attributes like platform, SDKVersion, etc.
36
+ #
37
+ # @return [Iterable::Response] A response object
38
+ def messages_for_user_id(user_id, count: 1, **attrs)
39
+ attrs[:userId] = user_id
40
+ attrs[:count] = count
41
+ messages(attrs)
42
+ end
43
+
44
+ private def messages(**attrs)
45
+ Iterable.request(conf, '/inApp/getMessages', attrs).get
46
+ end
47
+ end
48
+ end
@@ -13,6 +13,7 @@ module Iterable
13
13
  # templates = Iterable::MetadataTable.new("table-name", config)
14
14
  class MetadataTable < ApiResource
15
15
  attr_reader :name
16
+
16
17
  ##
17
18
  #
18
19
  # Initialize a MetadataTable with a table name
@@ -82,9 +83,7 @@ module Iterable
82
83
  Iterable.request(conf, base_path(key)).delete
83
84
  end
84
85
 
85
- private
86
-
87
- def base_path(key = nil)
86
+ private def base_path(key = nil)
88
87
  path = "/metadata/#{@name}"
89
88
  path += "/#{key}" if key
90
89
  path
@@ -42,41 +42,39 @@ module Iterable
42
42
  execute :delete, body, headers
43
43
  end
44
44
 
45
- private
46
-
47
- def execute(verb, body = {}, headers = {})
45
+ private def execute(verb, body = {}, headers = {})
48
46
  http = connection(verb, body, headers)
49
47
  setup_http(http)
50
48
  transmit http
51
49
  end
52
50
 
53
- def connection(verb, body = {}, headers = {})
54
- conn_headers = DEFAULT_HEADERS.merge(headers)
51
+ private def connection(verb, body = {}, headers = {})
52
+ conn_headers = DEFAULT_HEADERS.dup.merge(headers)
53
+ conn_headers['Api-Key'] = @config.token if @config.token
55
54
  req = Net::HTTP.const_get(verb.to_s.capitalize, false).new(@uri, conn_headers)
56
55
  req.body = JSON.dump(body)
57
56
  req
58
57
  end
59
58
 
60
- def setup_http(http)
59
+ private def setup_http(http)
61
60
  DEFAULT_OPTIONS.dup.each do |option, value|
62
61
  setter = "#{option.to_sym}="
63
62
  http.send(setter, value) if http.respond_to?(setter)
64
63
  end
65
64
  end
66
65
 
67
- def build_uri(path, params = {})
66
+ private def build_uri(path, params = {})
68
67
  uri = @config.uri
69
68
  uri.path += path
70
- params['api_key'] = @config.token
71
- uri.query = URI.encode_www_form(params)
69
+ uri.query = URI.encode_www_form(params) unless params.empty?
72
70
  uri
73
71
  end
74
72
 
75
- def net_http
73
+ private def net_http
76
74
  Net::HTTP.new(@uri.hostname, @uri.port, nil, nil, nil, nil)
77
75
  end
78
76
 
79
- def transmit(req)
77
+ private def transmit(req)
80
78
  response = nil
81
79
  @net.start do |http|
82
80
  response = http.request(req, nil, &:read_body)
@@ -84,7 +82,7 @@ module Iterable
84
82
  handle_response response
85
83
  end
86
84
 
87
- def handle_response(response)
85
+ private def handle_response(response)
88
86
  redirected = response.is_a?(Net::HTTPRedirection) || response.code == '303'
89
87
  if redirected && response['location']
90
88
  Response.new Net::HTTP.get_response(uri_for_redirect(response))
@@ -93,7 +91,7 @@ module Iterable
93
91
  end
94
92
  end
95
93
 
96
- def uri_for_redirect(response)
94
+ private def uri_for_redirect(response)
97
95
  uri = @config.uri
98
96
  redirect_uri = URI(response['location'])
99
97
  uri.path = redirect_uri.path
@@ -12,7 +12,7 @@ module Iterable
12
12
  attr_reader :body
13
13
 
14
14
  # @!visibility private
15
- def initialize(resp) # @private
15
+ def initialize(resp)
16
16
  @resp = resp
17
17
  @body = parsed_body
18
18
  end
@@ -29,14 +29,12 @@ module Iterable
29
29
  end
30
30
  end
31
31
 
32
- private
33
-
34
32
  ##
35
33
  # Attempts to parse the response as JSON. Will rescue and return original
36
34
  # if unable to parse.
37
35
  #
38
36
  # @return [Hash,Array,String] A parsed JSON object or the original response body
39
- def parsed_body
37
+ private def parsed_body
40
38
  response_body = @resp.body
41
39
  MultiJson.load response_body
42
40
  rescue MultiJson::ParseError
@@ -186,5 +186,18 @@ module Iterable
186
186
  params[:endTime] = end_time.to_s if end_time
187
187
  Iterable.request(conf, '/users/getSentMessages', params).get
188
188
  end
189
+
190
+ ##
191
+ #
192
+ # Delete the specified user's data from the Iterable project and
193
+ # prevent future data collection about them.
194
+ #
195
+ # @param email [String] User email to forget
196
+ #
197
+ # @return [Iterable::Response] A response object
198
+ def forget(email)
199
+ attrs = { email: email }
200
+ Iterable.request(conf, '/users/forget').post(attrs)
201
+ end
189
202
  end
190
203
  end
data/lib/iterable.rb CHANGED
@@ -17,6 +17,7 @@ files = %w[
17
17
  campaigns
18
18
  channels
19
19
  events
20
+ in_app
20
21
  message_types
21
22
  templates
22
23
  email_templates
@@ -42,8 +43,6 @@ files.each { |path| require_relative "./iterable/#{path}" }
42
43
  module Iterable
43
44
  DATE_FORMAT = '%Y-%m-%d'.freeze
44
45
 
45
- module_function
46
-
47
46
  ##
48
47
  #
49
48
  # Configure a default [Iterable::Config] object to be used when interacting
@@ -53,21 +52,19 @@ module Iterable
53
52
  # Iterable.configure do |conf|
54
53
  # conf.token = 'secret-token'
55
54
  # end
56
- def configure
57
- config.tap do |conf|
58
- yield conf
59
- end
55
+ module_function def configure(&block)
56
+ config.tap(&block)
60
57
  end
61
58
 
62
59
  ##
63
60
  #
64
61
  # @return [Iterable::Config] The default config for API endpoints
65
- def config
62
+ module_function def config
66
63
  @config ||= Config.new
67
64
  end
68
65
 
69
66
  # @!visibility private
70
- def request(conf, path, params = {})
67
+ module_function def request(conf, path, params = {})
71
68
  Request.new conf, path, params
72
69
  end
73
70
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,40 +1,41 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: iterable-api-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chavez
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
- 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
- YWN0L0RDPWVsLWNoYXZlei9EQz1tZTAeFw0yMDAxMDYyMTE1MjJaFw0yMTAxMDUy
15
- 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
- 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
- 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
- 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
- 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
- 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
- cmiQYRVgH321DzTsQb1VdpDotkg6JQLqoh5PwIhIW+wugtc+bb17cEQDuNYGMP2p
22
- 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
- l2cUVrKORwqksMgBdBWFXnIFWELBQTjctlSzN+aVes7MiG8xL6GLhw8t4cRPuXuo
24
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
36
37
  -----END CERTIFICATE-----
37
- date: 2018-07-17 00:00:00.000000000 Z
38
+ date: 2022-06-08 00:00:00.000000000 Z
38
39
  dependencies:
39
40
  - !ruby/object:Gem::Dependency
40
41
  name: multi_json
@@ -51,187 +52,187 @@ dependencies:
51
52
  - !ruby/object:Gem::Version
52
53
  version: 1.12.0
53
54
  - !ruby/object:Gem::Dependency
54
- name: coveralls
55
+ name: dotenv
55
56
  requirement: !ruby/object:Gem::Requirement
56
57
  requirements:
57
58
  - - "~>"
58
59
  - !ruby/object:Gem::Version
59
- version: 0.8.21
60
+ version: 2.7.1
60
61
  type: :development
61
62
  prerelease: false
62
63
  version_requirements: !ruby/object:Gem::Requirement
63
64
  requirements:
64
65
  - - "~>"
65
66
  - !ruby/object:Gem::Version
66
- version: 0.8.21
67
+ version: 2.7.1
67
68
  - !ruby/object:Gem::Dependency
68
- name: dotenv
69
+ name: gemcutter
69
70
  requirement: !ruby/object:Gem::Requirement
70
71
  requirements:
71
72
  - - "~>"
72
73
  - !ruby/object:Gem::Version
73
- version: 2.2.0
74
+ version: 0.7.1
74
75
  type: :development
75
76
  prerelease: false
76
77
  version_requirements: !ruby/object:Gem::Requirement
77
78
  requirements:
78
79
  - - "~>"
79
80
  - !ruby/object:Gem::Version
80
- version: 2.2.0
81
+ version: 0.7.1
81
82
  - !ruby/object:Gem::Dependency
82
- name: gemcutter
83
+ name: pry
83
84
  requirement: !ruby/object:Gem::Requirement
84
85
  requirements:
85
86
  - - "~>"
86
87
  - !ruby/object:Gem::Version
87
- version: 0.7.1
88
+ version: 0.14.1
88
89
  type: :development
89
90
  prerelease: false
90
91
  version_requirements: !ruby/object:Gem::Requirement
91
92
  requirements:
92
93
  - - "~>"
93
94
  - !ruby/object:Gem::Version
94
- version: 0.7.1
95
+ version: 0.14.1
95
96
  - !ruby/object:Gem::Dependency
96
- name: multi_json
97
+ name: pry-byebug
97
98
  requirement: !ruby/object:Gem::Requirement
98
99
  requirements:
99
100
  - - "~>"
100
101
  - !ruby/object:Gem::Version
101
- version: 1.12.1
102
+ version: 3.8.0
102
103
  type: :development
103
104
  prerelease: false
104
105
  version_requirements: !ruby/object:Gem::Requirement
105
106
  requirements:
106
107
  - - "~>"
107
108
  - !ruby/object:Gem::Version
108
- version: 1.12.1
109
+ version: 3.8.0
109
110
  - !ruby/object:Gem::Dependency
110
- name: pry
111
+ name: pry-doc
111
112
  requirement: !ruby/object:Gem::Requirement
112
113
  requirements:
113
114
  - - "~>"
114
115
  - !ruby/object:Gem::Version
115
- version: 0.10.4
116
+ version: 1.3.0
116
117
  type: :development
117
118
  prerelease: false
118
119
  version_requirements: !ruby/object:Gem::Requirement
119
120
  requirements:
120
121
  - - "~>"
121
122
  - !ruby/object:Gem::Version
122
- version: 0.10.4
123
+ version: 1.3.0
123
124
  - !ruby/object:Gem::Dependency
124
- name: pry-byebug
125
+ name: rake
125
126
  requirement: !ruby/object:Gem::Requirement
126
127
  requirements:
127
128
  - - "~>"
128
129
  - !ruby/object:Gem::Version
129
- version: 3.4.2
130
+ version: 13.0.0
130
131
  type: :development
131
132
  prerelease: false
132
133
  version_requirements: !ruby/object:Gem::Requirement
133
134
  requirements:
134
135
  - - "~>"
135
136
  - !ruby/object:Gem::Version
136
- version: 3.4.2
137
+ version: 13.0.0
137
138
  - !ruby/object:Gem::Dependency
138
- name: pry-doc
139
+ name: redcarpet
139
140
  requirement: !ruby/object:Gem::Requirement
140
141
  requirements:
141
142
  - - "~>"
142
143
  - !ruby/object:Gem::Version
143
- version: 0.11.1
144
+ version: 3.5.0
144
145
  type: :development
145
146
  prerelease: false
146
147
  version_requirements: !ruby/object:Gem::Requirement
147
148
  requirements:
148
149
  - - "~>"
149
150
  - !ruby/object:Gem::Version
150
- version: 0.11.1
151
+ version: 3.5.0
151
152
  - !ruby/object:Gem::Dependency
152
- name: rake
153
+ name: rspec
153
154
  requirement: !ruby/object:Gem::Requirement
154
155
  requirements:
155
156
  - - "~>"
156
157
  - !ruby/object:Gem::Version
157
- version: 12.0.0
158
+ version: 3.11.0
158
159
  type: :development
159
160
  prerelease: false
160
161
  version_requirements: !ruby/object:Gem::Requirement
161
162
  requirements:
162
163
  - - "~>"
163
164
  - !ruby/object:Gem::Version
164
- version: 12.0.0
165
+ version: 3.11.0
165
166
  - !ruby/object:Gem::Dependency
166
- name: redcarpet
167
+ name: rubocop
167
168
  requirement: !ruby/object:Gem::Requirement
168
169
  requirements:
169
170
  - - "~>"
170
171
  - !ruby/object:Gem::Version
171
- version: 3.4.0
172
+ version: 1.29.1
172
173
  type: :development
173
174
  prerelease: false
174
175
  version_requirements: !ruby/object:Gem::Requirement
175
176
  requirements:
176
177
  - - "~>"
177
178
  - !ruby/object:Gem::Version
178
- version: 3.4.0
179
+ version: 1.29.1
179
180
  - !ruby/object:Gem::Dependency
180
- name: rspec
181
+ name: rubocop-performance
181
182
  requirement: !ruby/object:Gem::Requirement
182
183
  requirements:
183
184
  - - "~>"
184
185
  - !ruby/object:Gem::Version
185
- version: 3.6.0
186
+ version: 1.13.3
186
187
  type: :development
187
188
  prerelease: false
188
189
  version_requirements: !ruby/object:Gem::Requirement
189
190
  requirements:
190
191
  - - "~>"
191
192
  - !ruby/object:Gem::Version
192
- version: 3.6.0
193
+ version: 1.13.3
193
194
  - !ruby/object:Gem::Dependency
194
- name: rubocop
195
+ name: rubocop-rspec
195
196
  requirement: !ruby/object:Gem::Requirement
196
197
  requirements:
197
198
  - - "~>"
198
199
  - !ruby/object:Gem::Version
199
- version: 0.49.1
200
+ version: 2.11.0
200
201
  type: :development
201
202
  prerelease: false
202
203
  version_requirements: !ruby/object:Gem::Requirement
203
204
  requirements:
204
205
  - - "~>"
205
206
  - !ruby/object:Gem::Version
206
- version: 0.49.1
207
+ version: 2.11.0
207
208
  - !ruby/object:Gem::Dependency
208
209
  name: simplecov
209
210
  requirement: !ruby/object:Gem::Requirement
210
211
  requirements:
211
212
  - - "~>"
212
213
  - !ruby/object:Gem::Version
213
- version: 0.14.1
214
+ version: 0.21.2
214
215
  type: :development
215
216
  prerelease: false
216
217
  version_requirements: !ruby/object:Gem::Requirement
217
218
  requirements:
218
219
  - - "~>"
219
220
  - !ruby/object:Gem::Version
220
- version: 0.14.1
221
+ version: 0.21.2
221
222
  - !ruby/object:Gem::Dependency
222
223
  name: typhoeus
223
224
  requirement: !ruby/object:Gem::Requirement
224
225
  requirements:
225
226
  - - "~>"
226
227
  - !ruby/object:Gem::Version
227
- version: 1.3.0
228
+ version: 1.4.0
228
229
  type: :development
229
230
  prerelease: false
230
231
  version_requirements: !ruby/object:Gem::Requirement
231
232
  requirements:
232
233
  - - "~>"
233
234
  - !ruby/object:Gem::Version
234
- version: 1.3.0
235
+ version: 1.4.0
235
236
  - !ruby/object:Gem::Dependency
236
237
  name: vcr
237
238
  requirement: !ruby/object:Gem::Requirement
@@ -252,28 +253,28 @@ dependencies:
252
253
  requirements:
253
254
  - - "~>"
254
255
  - !ruby/object:Gem::Version
255
- version: 3.0.1
256
+ version: 3.14.0
256
257
  type: :development
257
258
  prerelease: false
258
259
  version_requirements: !ruby/object:Gem::Requirement
259
260
  requirements:
260
261
  - - "~>"
261
262
  - !ruby/object:Gem::Version
262
- version: 3.0.1
263
+ version: 3.14.0
263
264
  - !ruby/object:Gem::Dependency
264
265
  name: yard
265
266
  requirement: !ruby/object:Gem::Requirement
266
267
  requirements:
267
268
  - - "~>"
268
269
  - !ruby/object:Gem::Version
269
- version: 0.9.5
270
+ version: 0.9.11
270
271
  type: :development
271
272
  prerelease: false
272
273
  version_requirements: !ruby/object:Gem::Requirement
273
274
  requirements:
274
275
  - - "~>"
275
276
  - !ruby/object:Gem::Version
276
- version: 0.9.5
277
+ version: 0.9.11
277
278
  description: Ruby gem for the Iterable REST API
278
279
  email: contact@el-chavez.me
279
280
  executables: []
@@ -301,6 +302,7 @@ files:
301
302
  - lib/iterable/events.rb
302
303
  - lib/iterable/experiments.rb
303
304
  - lib/iterable/export.rb
305
+ - lib/iterable/in_app.rb
304
306
  - lib/iterable/json_exporter.rb
305
307
  - lib/iterable/lists.rb
306
308
  - lib/iterable/message_types.rb
@@ -313,11 +315,12 @@ files:
313
315
  - lib/iterable/users.rb
314
316
  - lib/iterable/workflows.rb
315
317
  - lib/iterable_api_client.rb
316
- homepage: http://gitlab.com/mtchavez/iterable
318
+ homepage: https://gitlab.com/mtchavez/iterable
317
319
  licenses:
318
320
  - MIT
319
- metadata: {}
320
- post_install_message:
321
+ metadata:
322
+ rubygems_mfa_required: 'true'
323
+ post_install_message:
321
324
  rdoc_options:
322
325
  - "--charset=UTF-8"
323
326
  - "--main=README.md"
@@ -327,7 +330,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
327
330
  requirements:
328
331
  - - ">="
329
332
  - !ruby/object:Gem::Version
330
- version: 2.3.0
333
+ version: 2.6.0
331
334
  required_rubygems_version: !ruby/object:Gem::Requirement
332
335
  requirements:
333
336
  - - ">="
@@ -335,7 +338,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
335
338
  version: '0'
336
339
  requirements: []
337
340
  rubygems_version: 3.0.3
338
- signing_key:
341
+ signing_key:
339
342
  specification_version: 4
340
343
  summary: Iterable REST API Client
341
344
  test_files: []
metadata.gz.sig CHANGED
Binary file