trycourier 1.0.2 → 1.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 23f5a0957ead43adbaf9f97c33e6236149902be1df820f120214515d36a2d26b
4
- data.tar.gz: 304eff5f123c7adf297bb6e4b1d3a2eb620295bc3a9c2e254e2f369ba194befe
3
+ metadata.gz: 2e2e7e6f4ad2900f3ad0d118062208c74492851e96976da6795c6309c95ad9ea
4
+ data.tar.gz: ce78409870df6608de59bc5ea4a628732b09f8d3ec7b304202f1721d07ff5836
5
5
  SHA512:
6
- metadata.gz: 5423807878697faef75fd27e31aee0dd43ce669f176275d6b321d57f03b38736c5a96d1ad9a0baff93c6f83442b22f1fe80efce496de6e6c0f1dd3bbdb8cbae8
7
- data.tar.gz: db0ad387345128716957853b682c0f6639e6a4f14978b7787383228ee76bcccbe97837b8503a840c68bdbe4e18d5d3e078920a21c2ded5a8125c1689031132a5
6
+ metadata.gz: 060ff6e98ab2a50557b9e54cf2e1fe2f13d02a4569e335f4ffe31c7bd8fa55c8bbcaef7df686c19c9c98ae0c032e024ba6bc705242bc4df5f26bd9c780174538
7
+ data.tar.gz: fd9c70f99624a1d82e3a0c6825b17cea6526a0d8c46e0a221c8740514e366851ba59854454919f723cd8a3b205ae8800462fe8965fe05aab9fb2dafe667b0333
@@ -0,0 +1,51 @@
1
+ name: Ruby Gem
2
+
3
+ on:
4
+ push:
5
+ branches: [master]
6
+ tags:
7
+ - v*
8
+ pull_request:
9
+ branches: [master]
10
+
11
+ jobs:
12
+ test:
13
+ runs-on: ubuntu-latest
14
+
15
+ strategy:
16
+ matrix:
17
+ ruby-version: ['2.7', '3.0', '3.1', 'head']
18
+
19
+ steps:
20
+ - uses: actions/checkout@v2
21
+ - name: Set up Ruby
22
+ uses: ruby/setup-ruby@v1
23
+ with:
24
+ ruby-version: ${{ matrix.ruby-version }}
25
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
26
+ - name: Run tests
27
+ # Skipping rubocop for now
28
+ # run: bundle exec rake
29
+ run: bundle exec rspec spec
30
+ build:
31
+ name: Build + Publish
32
+ needs: test
33
+ if: startsWith(github.ref, 'refs/tags/v')
34
+ runs-on: ubuntu-latest
35
+
36
+ steps:
37
+ - uses: actions/checkout@v2
38
+ - name: Set up Ruby
39
+ uses: ruby/setup-ruby@v1
40
+ with:
41
+ ruby-version: 2.7
42
+ - name: Publish to RubyGems
43
+ run: |
44
+ mkdir -p $HOME/.gem
45
+ touch $HOME/.gem/credentials
46
+ chmod 0600 $HOME/.gem/credentials
47
+ printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
48
+ gem build *.gemspec
49
+ gem push *.gem
50
+ env:
51
+ GEM_HOST_API_KEY: "${{secrets.RUBYGEMS_AUTH_TOKEN}}"
data/CHANGELOG.md ADDED
@@ -0,0 +1,100 @@
1
+ # Change Log
2
+
3
+ All notable changes to this project will be documented in this file.
4
+ This project adheres to [Semantic Versioning](http://semver.org/).
5
+
6
+ ## [Unreleased][unreleased]
7
+
8
+ ## [v1.4.0] - 2022-01-31
9
+
10
+ ### Added
11
+
12
+ - Support for enhanced Send API by @tk26
13
+
14
+ ## [v1.3.0] - 2022-01-26
15
+
16
+ ### Added
17
+
18
+ - Support for Bulk API by @tk26
19
+
20
+ ## [v1.2.0] - 2021-04-08
21
+
22
+ ### Added
23
+
24
+ - Support for [Automation API](https://docs.courier.com/reference/automation-api) by @tk26
25
+ - `POST /automations/invoke` with `client.automations.invoke` method
26
+ - `POST /automations/{template_id}/invoke` with `client.automations.invoke_template` method
27
+
28
+ ## [v1.1.0] - 2021-01-26
29
+
30
+ ### Added
31
+
32
+ - Support for Basic Auth
33
+ - ENV variables `COURIER_AUTH_USERNAME` and `COURIER_AUTH_PASSWORD` OR set with params
34
+ - Token Auth using ENV variables
35
+ - `COURIER_AUTH_TOKEN`
36
+ - Base URL parameter (with default of api.courier.com)
37
+ - ENV variable `COURIER_BASE_URL`
38
+ - Support for Lists API by @jrweingart
39
+
40
+ - `POST /send/list` with `client.lists.send` method
41
+ - `GET /lists` with `client.lists.list` method
42
+ - `GET /lists/{list_id}` with `client.lists.get` method
43
+ - `PUT /lists/{list_id}` with `client.lists.put` method
44
+ - `DELETE /lists/{list_id}` with `client.lists.delete` method
45
+ - `PUT /lists/{list_id}/restore` with `client.lists.restore` method
46
+ - `GET /lists/{list_id}/subscriptions` with `client.lists.get_subscriptions` method
47
+ - `PUT /lists/{list_id}/subscriptions` with `client.lists.put_subscriptions` method
48
+ - `PUT /lists/{list_id}/subscriptions/{recipient_id}` with `client.lists.subscribe` method
49
+ - `DELETE /lists/{list_id}/subscriptions/{recipient_id}` with `client.lists.unsubscribe` method
50
+
51
+ - Support for Profiles API by @jrweingart
52
+
53
+ - `GET /profiles/{recipient_id}` with `client.profiles.get` method
54
+ - `GET /profiles/{recipient_id}/lists` with `client.profiles.get_subscriptions` method
55
+ - `PUT /profiles/{recipient_id}` with `client.profiles.replace` and `client.profiles.add` methods
56
+ - `PATCH /profiles/{recipient_id}` with `client.profiles.patch` method
57
+ - `POST /profiles/{recipient_id}` with `client.profiles.merge` method
58
+
59
+ - Support for Messages API by @jrweingart
60
+
61
+ - `GET /messages` with `client.messages.list` method
62
+ - `GET /messages/{message_id}` with `client.messages.get` method
63
+ - `GET /messages/{message_id}/history` with `client.messages.get_history` method
64
+
65
+ - Support for Events API by @jrweingart
66
+
67
+ - `GET /events` with `client.events.list` method
68
+ - `GET /events/{event_id}` with `client.event.get` method
69
+ - `PUT /events/{event_id}` with `client.events.replace` and `client.events.add` methods
70
+
71
+ - Support for Brands API by @jrweingart
72
+ - `GET /brands` with `client.brands.list` method
73
+ - `GET /brands/brand_id` with `client.brands.get` method
74
+ - `POST /brands` with `client.brands.create` method
75
+ - `PUT /brands/brand_id` with `client.brands.replace` method
76
+ - `DELETE /brands/brand_id` with `client.brands.delete` method
77
+
78
+ ## [v1.0.2] - 2021-01-06
79
+
80
+ ### Added
81
+
82
+ - Minor bug fixes to ensure proper SSL certification by @scarney81
83
+
84
+ ## [v1.0.1] - 2020-03-04
85
+
86
+ ### Added
87
+
88
+ - Support for Send API by @troy
89
+
90
+ ## v1.0.0 - 2020-03-03
91
+
92
+ Initial release by @troygoode
93
+
94
+ [unreleased]: https://github.com/trycourier/courier-ruby/compare/v1.4.0...HEAD
95
+ [v1.4.0]: https://github.com/trycourier/courier-ruby/compare/v1.3.0...v1.4.0
96
+ [v1.3.0]: https://github.com/trycourier/courier-ruby/compare/v1.2.0...v1.3.0
97
+ [v1.2.0]: https://github.com/trycourier/courier-ruby/compare/v1.1.0...v1.2.0
98
+ [v1.1.0]: https://github.com/trycourier/courier-ruby/compare/v1.0.2...v1.1.0
99
+ [v1.0.2]: https://github.com/trycourier/courier-ruby/compare/v1.0.1...v1.0.2
100
+ [v1.0.1]: https://github.com/trycourier/courier-ruby/compare/v1.0.0...v1.0.1
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,28 @@
1
+ # Contributing
2
+
3
+ Bug reports and pull requests are welcome on GitHub at https://github.com/trycourier/courier-ruby
4
+
5
+ ## Local development
6
+
7
+ - Fork this repository
8
+ - Clone your fork
9
+ - Run `bundle install`
10
+ - Write code!
11
+ - Test your code using `bundle exec rspec spec`
12
+
13
+ ## Releasing New Versions
14
+
15
+ To publish Courier Ruby to RUBYGEMS.ORG
16
+
17
+ - Update the CHANGELOG.md
18
+ - Bump the package version in `lib/trycourier/version.rb`
19
+ - Submit a PR to merge changes into main
20
+ - Create and push a new version tag
21
+
22
+ ```bash
23
+ git tag -a v<VERSION> -m v<VERSION>
24
+ git push origin v<VERSION>
25
+ ```
26
+
27
+ - Wait for GitHub Action to test and deploy
28
+ - Confirm you are able to successfully install the new version by running `gem install trycourier`
data/Gemfile CHANGED
@@ -5,3 +5,4 @@ gemspec
5
5
 
6
6
  gem "rake", "~> 12.0"
7
7
  gem "rspec", "~> 3.0"
8
+ gem "standard", group: [:development, :test]
data/Gemfile.lock CHANGED
@@ -1,26 +1,62 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- trycourier (1.0.2)
4
+ trycourier (1.4.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
- diff-lcs (1.3)
9
+ addressable (2.8.0)
10
+ public_suffix (>= 2.0.2, < 5.0)
11
+ ast (2.4.2)
12
+ crack (0.4.5)
13
+ rexml
14
+ diff-lcs (1.5.0)
15
+ hashdiff (1.0.1)
16
+ parallel (1.21.0)
17
+ parser (3.1.0.0)
18
+ ast (~> 2.4.1)
19
+ public_suffix (4.0.6)
20
+ rainbow (3.1.1)
10
21
  rake (12.3.3)
11
- rspec (3.9.0)
12
- rspec-core (~> 3.9.0)
13
- rspec-expectations (~> 3.9.0)
14
- rspec-mocks (~> 3.9.0)
15
- rspec-core (3.9.1)
16
- rspec-support (~> 3.9.1)
17
- rspec-expectations (3.9.0)
22
+ regexp_parser (2.2.0)
23
+ rexml (3.2.5)
24
+ rspec (3.10.0)
25
+ rspec-core (~> 3.10.0)
26
+ rspec-expectations (~> 3.10.0)
27
+ rspec-mocks (~> 3.10.0)
28
+ rspec-core (3.10.2)
29
+ rspec-support (~> 3.10.0)
30
+ rspec-expectations (3.10.2)
18
31
  diff-lcs (>= 1.2.0, < 2.0)
19
- rspec-support (~> 3.9.0)
20
- rspec-mocks (3.9.1)
32
+ rspec-support (~> 3.10.0)
33
+ rspec-mocks (3.10.2)
21
34
  diff-lcs (>= 1.2.0, < 2.0)
22
- rspec-support (~> 3.9.0)
23
- rspec-support (3.9.2)
35
+ rspec-support (~> 3.10.0)
36
+ rspec-support (3.10.3)
37
+ rubocop (1.25.0)
38
+ parallel (~> 1.10)
39
+ parser (>= 3.1.0.0)
40
+ rainbow (>= 2.2.2, < 4.0)
41
+ regexp_parser (>= 1.8, < 3.0)
42
+ rexml
43
+ rubocop-ast (>= 1.15.1, < 2.0)
44
+ ruby-progressbar (~> 1.7)
45
+ unicode-display_width (>= 1.4.0, < 3.0)
46
+ rubocop-ast (1.15.1)
47
+ parser (>= 3.0.1.1)
48
+ rubocop-performance (1.13.2)
49
+ rubocop (>= 1.7.0, < 2.0)
50
+ rubocop-ast (>= 0.4.0)
51
+ ruby-progressbar (1.11.0)
52
+ standard (1.7.0)
53
+ rubocop (= 1.25.0)
54
+ rubocop-performance (= 1.13.2)
55
+ unicode-display_width (2.1.0)
56
+ webmock (3.14.0)
57
+ addressable (>= 2.8.0)
58
+ crack (>= 0.3.2)
59
+ hashdiff (>= 0.4.0, < 2.0.0)
24
60
 
25
61
  PLATFORMS
26
62
  ruby
@@ -28,7 +64,9 @@ PLATFORMS
28
64
  DEPENDENCIES
29
65
  rake (~> 12.0)
30
66
  rspec (~> 3.0)
67
+ standard
31
68
  trycourier!
69
+ webmock (>= 1.24.2)
32
70
 
33
71
  BUNDLED WITH
34
- 2.1.4
72
+ 2.2.15
data/README.md CHANGED
@@ -20,33 +20,405 @@ Or install it yourself as:
20
20
 
21
21
  ## Usage
22
22
 
23
+ After installing, make sure to include this line at the top of your ruby file:
24
+
23
25
  ```ruby
24
26
  require "trycourier"
27
+ ```
28
+
29
+ To create a Courier Ruby client, all you need to do is pass in your authentication information. Then, you can start sending!
30
+
31
+ ### Using token authentication (most secure)
32
+
33
+ ```ruby
34
+ client = Courier::Client.new "your-auth-token" # or set via COURIER_AUTH_TOKEN env var (recommended)
35
+ ```
36
+
37
+ ### Using basic authentication
38
+
39
+ ```ruby
40
+ client = Courier::Client.new(username: "USERNAME", password: "PASSWORD") # or set via COURIER_AUTH_USERNAME and COURIER_AUTH_PASSWORD env vars
41
+ ```
42
+
43
+ ### Sending a message to an individual recipient
25
44
 
26
- begin
27
- client = Courier::Client.new "your-auth-token" # or set via COURIER_AUTH_TOKEN env var
28
- res = client.send({
45
+ ```ruby
46
+ client = Courier::Client.new "your-auth-token" # or set via COURIER_AUTH_TOKEN env var
47
+ res = client.send({
29
48
  "event" => "your-event-id",
30
49
  "recipient" => "your-recipient-id",
31
50
 
32
- "profile" => {
51
+ "profile" => { #optional (include any key-value pairs required by your chosen integrations. This information can also be stored in the recipient's profile in Courier)
33
52
  "email": "example@example.com",
34
53
  "phone_number": "555-867-5309"
35
54
  },
36
55
 
37
- "data" => {
56
+ "data" => { #any data you want to pass to a message template
38
57
  "world" => "Ruby!"
39
58
  }
40
59
  })
60
+ puts res.code # the HTTP response code
61
+ puts res.message_id # if the code is 200, this will be the Courier message ID for this notification
62
+ rescue Courier::CourierAPIError => re #error sent from from the API
63
+ puts re.message
64
+ end
65
+ ```
66
+
67
+ ## Advanced Usage
41
68
 
69
+ ### Send API enhanced
70
+
71
+ ```ruby
72
+ client = Courier::Client.new "your-auth-token" # or set via COURIER_AUTH_TOKEN env var
73
+ res = client.send_message({
74
+ message => {
75
+ template => "my-template",
76
+ to => {
77
+ email => "foo@bar.com"
78
+ }
79
+ }
80
+ })
42
81
  puts res.code # the HTTP response code
43
- puts res.message_id # if 200, this will be the Courier message ID for this notification
44
- rescue Courier::ResponseError => re
82
+ puts res.request_id # if the code is 202, this will be the Courier request ID for this message
83
+ rescue Courier::CourierAPIError => re #error sent from from the API
45
84
  puts re.message
46
- rescue Courier::InputError => ie
47
- puts ie.message
48
85
  end
86
+ ```
87
+
88
+ ### Lists
89
+
90
+ ```ruby
91
+ require "trycourier"
92
+ client = Courier::Client.new "your-auth-token" # or set via COURIER_AUTH_TOKEN env var
93
+
94
+ """
95
+ Creating a List
96
+ """
97
+ res = client.lists.put(list_id, name)
98
+ puts res
99
+
100
+ """
101
+ Example: send a message to a list
102
+ """
103
+ resp = client.lists.send(
104
+ event: "your-event-id",
105
+ list: "your.list.id",
106
+ brand: "your-brand-id", # optional
107
+ data: {}, # optional
108
+ override: {} # optional
109
+ )
110
+ puts resp['messageId'])
111
+
112
+ """
113
+ Example: send a message to a list pattern
114
+ """
115
+ resp = client.lists.send(
116
+ event: "your-event-id",
117
+ pattern: "your.list.*", #PATTERN (will send to all list ids that start with "your.list.")
118
+ brand: "your-brand-id", # optional
119
+ data: {}, # optional
120
+ override: {} # optional
121
+ )
122
+ puts resp['messageId'])
49
123
 
124
+ """
125
+ Example: get all lists
126
+ """
127
+ resp = client.lists.list(
128
+ cursor: "MTU4OTQ5NTI1ODY4NywxLTVlYmRjNWRhLTEwODZlYWFjMWRmMjEwMTNjM2I0ZjVhMA", # optional
129
+ )
130
+ puts resp
131
+
132
+ """
133
+ Example: get a specific list
134
+ """
135
+ resp = client.lists.get(list_id: "your-list-id")
136
+ puts resp
137
+
138
+
139
+ """
140
+ Example: delete a list
141
+ """
142
+ client.lists.delete(list_id: "your-list-id")
143
+
144
+ """
145
+ Example: restore a list
146
+ """
147
+ client.lists.restore(list_id: "your-list-id")
148
+
149
+ """
150
+ Example: get a list's subscribptions
151
+ """
152
+ resp = client.lists.get_subscriptions(list_id: "your-list-id",
153
+ cursor: "MTU4OTQ5NTI1ODY4NywxLTVlYmRjNWRhLTEwODZlYWFjMWRmMjEwMTNjM2I0ZjVhMA", # optional
154
+ )
155
+ puts resp
156
+
157
+ """
158
+ Example: replace many recipients to a new or existing list
159
+ """
160
+ client.lists.put_subscriptions(list_id: "your-list-id", recipients: [
161
+ "RECIPIENT_ID_1",
162
+ "RECIPIENT_ID_2"
163
+ ])
164
+
165
+ """
166
+ Example: Example: subscribe single recipient to a new or existing list
167
+ """
168
+ client.lists.subscribe(list_id: "your-list-id", recipient_id: "your-recipient-id")
169
+
170
+ """
171
+ Example: unsubscribe recipient from list
172
+ """
173
+ client.lists.unsubscribe(list_id: "your-list-id", recipient_id: "your-recipient-id")
174
+ ```
175
+
176
+ ### Profiles
177
+
178
+ ```Ruby
179
+ """
180
+ Example: create a recipient's profile
181
+ """
182
+ resp = client.profiles.add(
183
+ recipient_id: "your-recipient-id",
184
+ profile: {
185
+ "email" => "example@example.com",
186
+ "name" => "Example Name"
187
+ }
188
+ )
189
+
190
+ """
191
+ Example: replace or create a recipient's profile
192
+ """
193
+ resp = client.profiles.replace(
194
+ recipient_id: "your-recipient-id",
195
+ profile: {
196
+ "email" => "example@example.com"
197
+ }
198
+ )
199
+ puts resp['status']
200
+
201
+ """
202
+ Example: merge or create a recipient's profile
203
+ """
204
+ resp = client.profiles.merge(
205
+ recipient_id: "your-recipient-id",
206
+ profile: {
207
+ "phone_number" => "+15555555555"
208
+ }
209
+ )
210
+ puts resp['status']
211
+
212
+ """
213
+ Example: get the subscribed lists of a recipient
214
+ """
215
+ resp = client.profiles.get_subscriptions(
216
+ recipient_id: "your-recipient-id",
217
+ cursor: "MTU4OTQ5NTI1ODY4NywxLTVlYmRjNWRhLTEwODZlYWFjMWRmMjEwMTNjM2I0ZjVhMA" #optional
218
+ )
219
+ puts resp
220
+
221
+ """
222
+ Example: edit the contents of a recipient's profile with a patch operation
223
+ (follows JSON Patch conventions: RFC 6902).
224
+ """
225
+ resp = client.profiles.patch(
226
+ recipient_id: "your-recipient-id",
227
+ operations: [
228
+ {
229
+ "op" => "add", #operation 1: add this email to profile
230
+ "path" => "/parent",
231
+ "value" => "example@example.com"
232
+ }
233
+ {
234
+ "op" => "replace", #operation 2: update with new email
235
+ "path" => "/parent",
236
+ "value" => "jane@doe.com"
237
+ }
238
+ {
239
+ "op" => "copy", #operation 3: copy that email to /emergency_contact
240
+ "from" => "/parent",
241
+ "path" => "/emergency_contact"
242
+ }
243
+ ...
244
+ ]
245
+ )
246
+ puts resp
247
+
248
+
249
+ """
250
+ Example: get a recipient's profile
251
+ """
252
+ resp = client.profiles.get(recipient_id: "your-recipient-id")
253
+ puts resp
254
+ ```
255
+
256
+ ### Messages
257
+
258
+ ```Ruby
259
+ """
260
+ Example: fetch the statuses of messages you've previously sent.
261
+ """
262
+ resp = client.messages.list(
263
+ cursor: "MTU4OTQ5NTI1ODY4NywxLTVlYmRjNWRhLTEwODZlYWFjMWRmMjEwMTNjM2I0ZjVhMA", # optional
264
+ event: "your-event-id", # optional
265
+ list: "your-list-id", #optional
266
+ message_id: "your-message-id" #optional
267
+ notification: ["message-status-1", "message-status-2",...] #optional
268
+ recipient: "recipient-id" # optional
269
+ )
270
+ puts resp
271
+
272
+ """
273
+ Example: fetch the status of a message you've previously sent
274
+ """
275
+ resp = client.messages.get(message_id: "your-message-id")
276
+ puts resp
277
+
278
+ """
279
+ Example: fetch the array of events of a message you've previously sent.
280
+ """
281
+ resp = client.messages.get_history(
282
+ message_id: "your-message-id",
283
+ type: "list-type" #optional ("FILTERED", "RENDERED", "MAPPED", "PROFILE_LOADED")
284
+ )
285
+ puts resp
286
+ ```
287
+
288
+ ### Events
289
+
290
+ ```Ruby
291
+ """
292
+ Example: fetch the list of events
293
+ """
294
+ resp = client.events.list
295
+ puts resp
296
+
297
+ """
298
+ Example: fetch a specific event by event ID
299
+ """
300
+ resp = client.events.get(event_id: "your-event-id")
301
+ puts resp
302
+
303
+ """
304
+ Example: create or replace an event
305
+ """
306
+ resp = client.events.replace(
307
+ event_id: "your-event-id",
308
+ notification_id: "notification_id",
309
+ type: "notificaton" ## optional, defaults to notification
310
+ )
311
+ puts resp
312
+
313
+ """
314
+ Example: get all brands
315
+ """
316
+ resp = client.brands.list(
317
+ cursor: "MTU4OTQ5NTI1ODY4NywxLTVlYmRjNWRhLTEwODZlYWFjMWRmMjEwMTNjM2I0ZjVhMA", # optional
318
+ )
319
+ puts resp
320
+
321
+ """
322
+ Example: get a specific brand
323
+ """
324
+ resp = client.brands.get(brand_id: "brand_id")
325
+ puts resp
326
+
327
+ """
328
+ Example: create a brand
329
+ """
330
+ resp = client.brands.create(
331
+ name: "brand-name",
332
+ settings: {
333
+ "color" => {
334
+ "primary" => "#0000FF",
335
+ "secondary" => "#FF0000",
336
+ "tertiary" => "#00FF00"
337
+ }
338
+ },
339
+ id: "my-brand-id", #optional
340
+ snippets: {}, #optional
341
+ idempotency_key: "my-idemp-key", #optional
342
+ )
343
+ puts resp
344
+
345
+ """
346
+ Example: replace a brand
347
+ """
348
+ resp = client.brands.replace(
349
+ brand_id: "your-brand-id",
350
+ name: "brand-name",
351
+ settings: {}
352
+ "color" => {
353
+ "primary" => "#FF0000",
354
+ "secondary" => "#00FF00",
355
+ "tertiary" => "#0000FF"
356
+ }
357
+ },
358
+ snippets: {} #optional
359
+ )
360
+ puts resp
361
+
362
+ """
363
+ Example: delete a brand
364
+ """
365
+ resp = client.brands.delete(brand_id: "your-brand-id")
366
+ puts resp
367
+ ```
368
+
369
+ ### Automations
370
+
371
+ ````Ruby
372
+ """
373
+ Example: invoke ad-hoc automation
374
+ """
375
+ steps = [
376
+ {
377
+ "action" => "send"
378
+ }
379
+ ]
380
+ automation = {
381
+ "steps" => steps
382
+ }
383
+
384
+ resp = client.automations.invoke(
385
+ automation: automation,
386
+ brand: "your-brand-id", # optional
387
+ data: {}, # optional
388
+ profile: {
389
+ "email" => "example@example.com",
390
+ }, # optional
391
+ recipient: "your-recipient-id", # optional
392
+ template: "your-notification-template-id" # optional
393
+ )
394
+ puts resp['runId']
395
+
396
+ """
397
+ Example: invoke automation template
398
+ """
399
+ resp = client.automations.invoke_template(
400
+ template_id: "your-automation-template-id",
401
+ brand: "your-brand-id", # optional
402
+ data: {}, # optional
403
+ profile: {
404
+ "email" => "example@example.com",
405
+ }, # optional
406
+ recipient: "your-recipient-id", # optional
407
+ template: "your-notification-template-id" # optional
408
+ )
409
+ puts resp['runId']
410
+
411
+ ### Notes on input and errors
412
+ With the exception of passing an auth token to create a client, and ```client.send(body)```, every parameter (optional or required) is sent using keyword arguments.
413
+ In the case of ```client.send(body)```, if the hash does not have the required components, it will throw an InputError exception, which can be caught with rescue blocks:
414
+ ```ruby
415
+ rescue InputError
416
+ ````
417
+
418
+ Any other errors from the API are thrown as a CourierAPIError. Catch these errors by putting this after your method calls:
419
+
420
+ ```ruby
421
+ rescue CourierAPIError
50
422
  ```
51
423
 
52
424
  ## Development