trycourier 1.0.1 → 1.3.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: 5b256b56c28effeb0a31e46d1d4d38626527e9bd2e740f4395137624fd46a9b0
4
- data.tar.gz: 1933d201eef9368b794166b48cf5723b5f3f442ef6e6ca0b61c5a2efd0a979ff
3
+ metadata.gz: 43ad4d30cf60c972878593e731297e16218eb733d5f234d42630c76ee4e61b70
4
+ data.tar.gz: 1cf5722063320f2a9bd2365b28da54c2aed796c80fe26b5fd36f1e6409579c1e
5
5
  SHA512:
6
- metadata.gz: f78837d22fe0c63fad281ed61c676aa1d8af8a8685a3a3af35ac2b587ee3e772d0f9e16eae763be6e030aee1caa39f7065dddcbb74123c7b32a56fbd1038327a
7
- data.tar.gz: e0499506e39f2a6e33178f7de0dc43b184dc7b05ced7d88a04d4f0af7f4d67dba5a8844a9f971293c92e661f80ded499bb20e3c4172ddda8b93fff625ba4ea46
6
+ metadata.gz: '08b2ec48d0f42bc45e87cfa2877d100b5deb2eb9927985a6544dbce6546a7950819a8d7885ffcd1d86c94c300ca2246d536ff57cb6589db0bb6f67be34c20107'
7
+ data.tar.gz: d4a47fc88397e68f9160fb03fcee6ed11591c2d78eb044e279ab0463b225c22ebc2c0eb78a0eb4f879c79c76e65851a4d807f960676f1cce2424bae072e1198d
@@ -0,0 +1,49 @@
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
+ steps:
16
+ - uses: actions/checkout@v2
17
+ - name: Set up Ruby 2.7
18
+ uses: actions/setup-ruby@v1
19
+ with:
20
+ ruby-version: 2.7.x
21
+ - name: Install dependencies
22
+ run: bundle install
23
+ - name: Run tests
24
+ # Skipping rubocop for now
25
+ # run: bundle exec rake
26
+ run: bundle exec rspec spec
27
+ build:
28
+ name: Build + Publish
29
+ needs: test
30
+ if: startsWith(github.ref, 'refs/tags/v')
31
+ runs-on: ubuntu-latest
32
+
33
+ steps:
34
+ - uses: actions/checkout@v2
35
+ - name: Set up Ruby 2.7
36
+ uses: actions/setup-ruby@v1
37
+ with:
38
+ ruby-version: 2.7.x
39
+
40
+ - name: Publish to RubyGems
41
+ run: |
42
+ mkdir -p $HOME/.gem
43
+ touch $HOME/.gem/credentials
44
+ chmod 0600 $HOME/.gem/credentials
45
+ printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
46
+ gem build *.gemspec
47
+ gem push *.gem
48
+ env:
49
+ GEM_HOST_API_KEY: "${{secrets.RUBYGEMS_AUTH_TOKEN}}"
data/CHANGELOG.md ADDED
@@ -0,0 +1,93 @@
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.3.0] - 2022-01-26
9
+
10
+ ### Added
11
+
12
+ - Support for Bulk API by @tk26
13
+
14
+ ## [v1.2.0] - 2021-04-08
15
+
16
+ ### Added
17
+
18
+ - Support for [Automation API](https://docs.courier.com/reference/automation-api) by @tk26
19
+ - `POST /automations/invoke` with `client.automations.invoke` method
20
+ - `POST /automations/{template_id}/invoke` with `client.automations.invoke_template` method
21
+
22
+ ## [v1.1.0] - 2021-01-26
23
+
24
+ ### Added
25
+
26
+ - Support for Basic Auth
27
+ - ENV variables `COURIER_AUTH_USERNAME` and `COURIER_AUTH_PASSWORD` OR set with params
28
+ - Token Auth using ENV variables
29
+ - `COURIER_AUTH_TOKEN`
30
+ - Base URL parameter (with default of api.courier.com)
31
+ - ENV variable `COURIER_BASE_URL`
32
+ - Support for Lists API by @jrweingart
33
+
34
+ - `POST /send/list` with `client.lists.send` method
35
+ - `GET /lists` with `client.lists.list` method
36
+ - `GET /lists/{list_id}` with `client.lists.get` method
37
+ - `PUT /lists/{list_id}` with `client.lists.put` method
38
+ - `DELETE /lists/{list_id}` with `client.lists.delete` method
39
+ - `PUT /lists/{list_id}/restore` with `client.lists.restore` method
40
+ - `GET /lists/{list_id}/subscriptions` with `client.lists.get_subscriptions` method
41
+ - `PUT /lists/{list_id}/subscriptions` with `client.lists.put_subscriptions` method
42
+ - `PUT /lists/{list_id}/subscriptions/{recipient_id}` with `client.lists.subscribe` method
43
+ - `DELETE /lists/{list_id}/subscriptions/{recipient_id}` with `client.lists.unsubscribe` method
44
+
45
+ - Support for Profiles API by @jrweingart
46
+
47
+ - `GET /profiles/{recipient_id}` with `client.profiles.get` method
48
+ - `GET /profiles/{recipient_id}/lists` with `client.profiles.get_subscriptions` method
49
+ - `PUT /profiles/{recipient_id}` with `client.profiles.replace` and `client.profiles.add` methods
50
+ - `PATCH /profiles/{recipient_id}` with `client.profiles.patch` method
51
+ - `POST /profiles/{recipient_id}` with `client.profiles.merge` method
52
+
53
+ - Support for Messages API by @jrweingart
54
+
55
+ - `GET /messages` with `client.messages.list` method
56
+ - `GET /messages/{message_id}` with `client.messages.get` method
57
+ - `GET /messages/{message_id}/history` with `client.messages.get_history` method
58
+
59
+ - Support for Events API by @jrweingart
60
+
61
+ - `GET /events` with `client.events.list` method
62
+ - `GET /events/{event_id}` with `client.event.get` method
63
+ - `PUT /events/{event_id}` with `client.events.replace` and `client.events.add` methods
64
+
65
+ - Support for Brands API by @jrweingart
66
+ - `GET /brands` with `client.brands.list` method
67
+ - `GET /brands/brand_id` with `client.brands.get` method
68
+ - `POST /brands` with `client.brands.create` method
69
+ - `PUT /brands/brand_id` with `client.brands.replace` method
70
+ - `DELETE /brands/brand_id` with `client.brands.delete` method
71
+
72
+ ## [v1.0.2] - 2021-01-06
73
+
74
+ ### Added
75
+
76
+ - Minor bug fixes to ensure proper SSL certification by @scarney81
77
+
78
+ ## [v1.0.1] - 2020-03-04
79
+
80
+ ### Added
81
+
82
+ - Support for Send API by @troy
83
+
84
+ ## v1.0.0 - 2020-03-03
85
+
86
+ Initial release by @troygoode
87
+
88
+ [unreleased]: https://github.com/trycourier/courier-ruby/compare/v1.3.0...HEAD
89
+ [v1.3.0]: https://github.com/trycourier/courier-ruby/compare/v1.2.0...v1.3.0
90
+ [v1.2.0]: https://github.com/trycourier/courier-ruby/compare/v1.1.0...v1.2.0
91
+ [v1.1.0]: https://github.com/trycourier/courier-ruby/compare/v1.0.2...v1.1.0
92
+ [v1.0.2]: https://github.com/trycourier/courier-ruby/compare/v1.0.1...v1.0.2
93
+ [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,13 +1,26 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- trycourier (1.0.0)
4
+ trycourier (1.0.2)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
+ addressable (2.7.0)
10
+ public_suffix (>= 2.0.2, < 5.0)
11
+ ast (2.4.1)
12
+ crack (0.4.5)
13
+ rexml
9
14
  diff-lcs (1.3)
15
+ hashdiff (1.0.1)
16
+ parallel (1.20.1)
17
+ parser (3.0.0.0)
18
+ ast (~> 2.4.1)
19
+ public_suffix (4.0.6)
20
+ rainbow (3.0.0)
10
21
  rake (12.3.3)
22
+ regexp_parser (2.0.3)
23
+ rexml (3.2.4)
11
24
  rspec (3.9.0)
12
25
  rspec-core (~> 3.9.0)
13
26
  rspec-expectations (~> 3.9.0)
@@ -21,6 +34,29 @@ GEM
21
34
  diff-lcs (>= 1.2.0, < 2.0)
22
35
  rspec-support (~> 3.9.0)
23
36
  rspec-support (3.9.2)
37
+ rubocop (1.4.2)
38
+ parallel (~> 1.10)
39
+ parser (>= 2.7.1.5)
40
+ rainbow (>= 2.2.2, < 4.0)
41
+ regexp_parser (>= 1.8)
42
+ rexml
43
+ rubocop-ast (>= 1.1.1)
44
+ ruby-progressbar (~> 1.7)
45
+ unicode-display_width (>= 1.4.0, < 2.0)
46
+ rubocop-ast (1.4.0)
47
+ parser (>= 2.7.1.5)
48
+ rubocop-performance (1.9.1)
49
+ rubocop (>= 0.90.0, < 2.0)
50
+ rubocop-ast (>= 0.4.0)
51
+ ruby-progressbar (1.11.0)
52
+ standard (0.10.2)
53
+ rubocop (= 1.4.2)
54
+ rubocop-performance (= 1.9.1)
55
+ unicode-display_width (1.7.0)
56
+ webmock (3.11.0)
57
+ addressable (>= 2.3.6)
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
72
  2.1.4
data/README.md CHANGED
@@ -20,33 +20,386 @@ 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
  })
41
-
42
60
  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
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
45
63
  puts re.message
46
- rescue Courier::InputError => ie
47
- puts ie.message
48
64
  end
65
+ ```
66
+
67
+ ## Advanced Usage
68
+
69
+ ### Lists
70
+
71
+ ```ruby
72
+ require "trycourier"
73
+ client = Courier::Client.new "your-auth-token" # or set via COURIER_AUTH_TOKEN env var
74
+
75
+ """
76
+ Creating a List
77
+ """
78
+ res = client.lists.put(list_id, name)
79
+ puts res
80
+
81
+ """
82
+ Example: send a message to a list
83
+ """
84
+ resp = client.lists.send(
85
+ event: "your-event-id",
86
+ list: "your.list.id",
87
+ brand: "your-brand-id", # optional
88
+ data: {}, # optional
89
+ override: {} # optional
90
+ )
91
+ puts resp['messageId'])
92
+
93
+ """
94
+ Example: send a message to a list pattern
95
+ """
96
+ resp = client.lists.send(
97
+ event: "your-event-id",
98
+ pattern: "your.list.*", #PATTERN (will send to all list ids that start with "your.list.")
99
+ brand: "your-brand-id", # optional
100
+ data: {}, # optional
101
+ override: {} # optional
102
+ )
103
+ puts resp['messageId'])
104
+
105
+ """
106
+ Example: get all lists
107
+ """
108
+ resp = client.lists.list(
109
+ cursor: "MTU4OTQ5NTI1ODY4NywxLTVlYmRjNWRhLTEwODZlYWFjMWRmMjEwMTNjM2I0ZjVhMA", # optional
110
+ )
111
+ puts resp
112
+
113
+ """
114
+ Example: get a specific list
115
+ """
116
+ resp = client.lists.get(list_id: "your-list-id")
117
+ puts resp
118
+
119
+
120
+ """
121
+ Example: delete a list
122
+ """
123
+ client.lists.delete(list_id: "your-list-id")
124
+
125
+ """
126
+ Example: restore a list
127
+ """
128
+ client.lists.restore(list_id: "your-list-id")
129
+
130
+ """
131
+ Example: get a list's subscribptions
132
+ """
133
+ resp = client.lists.get_subscriptions(list_id: "your-list-id",
134
+ cursor: "MTU4OTQ5NTI1ODY4NywxLTVlYmRjNWRhLTEwODZlYWFjMWRmMjEwMTNjM2I0ZjVhMA", # optional
135
+ )
136
+ puts resp
137
+
138
+ """
139
+ Example: replace many recipients to a new or existing list
140
+ """
141
+ client.lists.put_subscriptions(list_id: "your-list-id", recipients: [
142
+ "RECIPIENT_ID_1",
143
+ "RECIPIENT_ID_2"
144
+ ])
145
+
146
+ """
147
+ Example: Example: subscribe single recipient to a new or existing list
148
+ """
149
+ client.lists.subscribe(list_id: "your-list-id", recipient_id: "your-recipient-id")
150
+
151
+ """
152
+ Example: unsubscribe recipient from list
153
+ """
154
+ client.lists.unsubscribe(list_id: "your-list-id", recipient_id: "your-recipient-id")
155
+ ```
156
+
157
+ ### Profiles
158
+
159
+ ```Ruby
160
+ """
161
+ Example: create a recipient's profile
162
+ """
163
+ resp = client.profiles.add(
164
+ recipient_id: "your-recipient-id",
165
+ profile: {
166
+ "email" => "example@example.com",
167
+ "name" => "Example Name"
168
+ }
169
+ )
49
170
 
171
+ """
172
+ Example: replace or create a recipient's profile
173
+ """
174
+ resp = client.profiles.replace(
175
+ recipient_id: "your-recipient-id",
176
+ profile: {
177
+ "email" => "example@example.com"
178
+ }
179
+ )
180
+ puts resp['status']
181
+
182
+ """
183
+ Example: merge or create a recipient's profile
184
+ """
185
+ resp = client.profiles.merge(
186
+ recipient_id: "your-recipient-id",
187
+ profile: {
188
+ "phone_number" => "+15555555555"
189
+ }
190
+ )
191
+ puts resp['status']
192
+
193
+ """
194
+ Example: get the subscribed lists of a recipient
195
+ """
196
+ resp = client.profiles.get_subscriptions(
197
+ recipient_id: "your-recipient-id",
198
+ cursor: "MTU4OTQ5NTI1ODY4NywxLTVlYmRjNWRhLTEwODZlYWFjMWRmMjEwMTNjM2I0ZjVhMA" #optional
199
+ )
200
+ puts resp
201
+
202
+ """
203
+ Example: edit the contents of a recipient's profile with a patch operation
204
+ (follows JSON Patch conventions: RFC 6902).
205
+ """
206
+ resp = client.profiles.patch(
207
+ recipient_id: "your-recipient-id",
208
+ operations: [
209
+ {
210
+ "op" => "add", #operation 1: add this email to profile
211
+ "path" => "/parent",
212
+ "value" => "example@example.com"
213
+ }
214
+ {
215
+ "op" => "replace", #operation 2: update with new email
216
+ "path" => "/parent",
217
+ "value" => "jane@doe.com"
218
+ }
219
+ {
220
+ "op" => "copy", #operation 3: copy that email to /emergency_contact
221
+ "from" => "/parent",
222
+ "path" => "/emergency_contact"
223
+ }
224
+ ...
225
+ ]
226
+ )
227
+ puts resp
228
+
229
+
230
+ """
231
+ Example: get a recipient's profile
232
+ """
233
+ resp = client.profiles.get(recipient_id: "your-recipient-id")
234
+ puts resp
235
+ ```
236
+
237
+ ### Messages
238
+
239
+ ```Ruby
240
+ """
241
+ Example: fetch the statuses of messages you've previously sent.
242
+ """
243
+ resp = client.messages.list(
244
+ cursor: "MTU4OTQ5NTI1ODY4NywxLTVlYmRjNWRhLTEwODZlYWFjMWRmMjEwMTNjM2I0ZjVhMA", # optional
245
+ event: "your-event-id", # optional
246
+ list: "your-list-id", #optional
247
+ message_id: "your-message-id" #optional
248
+ notification: ["message-status-1", "message-status-2",...] #optional
249
+ recipient: "recipient-id" # optional
250
+ )
251
+ puts resp
252
+
253
+ """
254
+ Example: fetch the status of a message you've previously sent
255
+ """
256
+ resp = client.messages.get(message_id: "your-message-id")
257
+ puts resp
258
+
259
+ """
260
+ Example: fetch the array of events of a message you've previously sent.
261
+ """
262
+ resp = client.messages.get_history(
263
+ message_id: "your-message-id",
264
+ type: "list-type" #optional ("FILTERED", "RENDERED", "MAPPED", "PROFILE_LOADED")
265
+ )
266
+ puts resp
267
+ ```
268
+
269
+ ### Events
270
+
271
+ ```Ruby
272
+ """
273
+ Example: fetch the list of events
274
+ """
275
+ resp = client.events.list
276
+ puts resp
277
+
278
+ """
279
+ Example: fetch a specific event by event ID
280
+ """
281
+ resp = client.events.get(event_id: "your-event-id")
282
+ puts resp
283
+
284
+ """
285
+ Example: create or replace an event
286
+ """
287
+ resp = client.events.replace(
288
+ event_id: "your-event-id",
289
+ notification_id: "notification_id",
290
+ type: "notificaton" ## optional, defaults to notification
291
+ )
292
+ puts resp
293
+
294
+ """
295
+ Example: get all brands
296
+ """
297
+ resp = client.brands.list(
298
+ cursor: "MTU4OTQ5NTI1ODY4NywxLTVlYmRjNWRhLTEwODZlYWFjMWRmMjEwMTNjM2I0ZjVhMA", # optional
299
+ )
300
+ puts resp
301
+
302
+ """
303
+ Example: get a specific brand
304
+ """
305
+ resp = client.brands.get(brand_id: "brand_id")
306
+ puts resp
307
+
308
+ """
309
+ Example: create a brand
310
+ """
311
+ resp = client.brands.create(
312
+ name: "brand-name",
313
+ settings: {
314
+ "color" => {
315
+ "primary" => "#0000FF",
316
+ "secondary" => "#FF0000",
317
+ "tertiary" => "#00FF00"
318
+ }
319
+ },
320
+ id: "my-brand-id", #optional
321
+ snippets: {}, #optional
322
+ idempotency_key: "my-idemp-key", #optional
323
+ )
324
+ puts resp
325
+
326
+ """
327
+ Example: replace a brand
328
+ """
329
+ resp = client.brands.replace(
330
+ brand_id: "your-brand-id",
331
+ name: "brand-name",
332
+ settings: {}
333
+ "color" => {
334
+ "primary" => "#FF0000",
335
+ "secondary" => "#00FF00",
336
+ "tertiary" => "#0000FF"
337
+ }
338
+ },
339
+ snippets: {} #optional
340
+ )
341
+ puts resp
342
+
343
+ """
344
+ Example: delete a brand
345
+ """
346
+ resp = client.brands.delete(brand_id: "your-brand-id")
347
+ puts resp
348
+ ```
349
+
350
+ ### Automations
351
+
352
+ ````Ruby
353
+ """
354
+ Example: invoke ad-hoc automation
355
+ """
356
+ steps = [
357
+ {
358
+ "action" => "send"
359
+ }
360
+ ]
361
+ automation = {
362
+ "steps" => steps
363
+ }
364
+
365
+ resp = client.automations.invoke(
366
+ automation: automation,
367
+ brand: "your-brand-id", # optional
368
+ data: {}, # optional
369
+ profile: {
370
+ "email" => "example@example.com",
371
+ }, # optional
372
+ recipient: "your-recipient-id", # optional
373
+ template: "your-notification-template-id" # optional
374
+ )
375
+ puts resp['runId']
376
+
377
+ """
378
+ Example: invoke automation template
379
+ """
380
+ resp = client.automations.invoke_template(
381
+ template_id: "your-automation-template-id",
382
+ brand: "your-brand-id", # optional
383
+ data: {}, # optional
384
+ profile: {
385
+ "email" => "example@example.com",
386
+ }, # optional
387
+ recipient: "your-recipient-id", # optional
388
+ template: "your-notification-template-id" # optional
389
+ )
390
+ puts resp['runId']
391
+
392
+ ### Notes on input and errors
393
+ 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.
394
+ 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:
395
+ ```ruby
396
+ rescue InputError
397
+ ````
398
+
399
+ Any other errors from the API are thrown as a CourierAPIError. Catch these errors by putting this after your method calls:
400
+
401
+ ```ruby
402
+ rescue CourierAPIError
50
403
  ```
51
404
 
52
405
  ## Development
@@ -57,7 +410,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
57
410
 
58
411
  ## Contributing
59
412
 
60
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/trycourier.
413
+ Bug reports and pull requests are welcome on GitHub at https://github.com/trycourier/courier-ruby.
61
414
 
62
415
  ## License
63
416
 
data/Rakefile CHANGED
@@ -1,6 +1,7 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "rspec/core/rake_task"
3
+ require "standard/rake"
3
4
 
4
5
  RSpec::Core::RakeTask.new(:spec)
5
6
 
6
- task :default => :spec
7
+ task default: %i[spec standard]