sendgrid-ruby 6.3.9 → 6.5.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/ISSUE_TEMPLATE/config.yml +10 -0
- data/.rubocop_todo.yml +2 -0
- data/.travis.yml +15 -14
- data/CHANGELOG.md +24 -0
- data/README.md +0 -1
- data/TROUBLESHOOTING.md +12 -0
- data/examples/helpers/mail/example.rb +5 -0
- data/lib/sendgrid/base_interface.rb +6 -3
- data/lib/sendgrid/helpers/mail/personalization.rb +3 -1
- data/lib/sendgrid/sendgrid.rb +3 -2
- data/lib/sendgrid/version.rb +1 -1
- data/spec/sendgrid/helpers/settings/mail_settings_dto_spec.rb +2 -2
- data/spec/sendgrid/helpers/settings/partner_settings_dto_spec.rb +2 -2
- data/spec/sendgrid/helpers/settings/tracking_settings_dto_spec.rb +2 -2
- data/spec/sendgrid/helpers/settings/user_settings_dto_spec.rb +2 -2
- data/test/sendgrid/test_sendgrid-ruby.rb +19 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e9ae3c96f2f17a8c259ea3f8e369e19c37bb8764074abe57a2cbf9af9e14879e
|
4
|
+
data.tar.gz: 2bd8adf75c2e77b81c5c8d5f6c3e01cb4d8a52ea25252bdea2e24b8cbb9dbaa2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5e6c60136a7aac529987dc16543daa49da5ad7f65120ab994e41f66f00a86665e68aeea7990089893d39f43161d4601ebc08df37f05264b9dc967a169f3fdb7b
|
7
|
+
data.tar.gz: f940ee99e5254db6ae88e5bc6297ec16f941ad6bf2f1e619c1cefc1605cf9577c8a838ce0423e2ba8dc7e58f875f88aedb287a1ef50e59e4676491cc0e1011d6
|
@@ -0,0 +1,10 @@
|
|
1
|
+
contact_links:
|
2
|
+
- name: Twilio SendGrid Support
|
3
|
+
url: https://support.sendgrid.com
|
4
|
+
about: Get Support
|
5
|
+
- name: Stack Overflow
|
6
|
+
url: https://stackoverflow.com/questions/tagged/sendgrid-ruby+or+sendgrid+ruby
|
7
|
+
about: Ask questions on Stack Overflow
|
8
|
+
- name: Documentation
|
9
|
+
url: https://sendgrid.com/docs/for-developers/
|
10
|
+
about: View Reference Documentation
|
data/.rubocop_todo.yml
CHANGED
@@ -34,6 +34,8 @@ Metrics/BlockLength:
|
|
34
34
|
# Configuration parameters: CountComments, CountAsOne.
|
35
35
|
Metrics/ClassLength:
|
36
36
|
Max: 2006
|
37
|
+
Exclude:
|
38
|
+
- 'test/sendgrid/test_sendgrid-ruby.rb'
|
37
39
|
|
38
40
|
# Offense count: 41
|
39
41
|
# Configuration parameters: CountComments, CountAsOne, ExcludedMethods.
|
data/.travis.yml
CHANGED
@@ -1,25 +1,26 @@
|
|
1
1
|
language: ruby
|
2
2
|
env:
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
3
|
+
- version=ruby:3.0
|
4
|
+
- version=ruby:2.7
|
5
|
+
- version=ruby:2.6
|
6
|
+
- version=ruby:2.5
|
7
|
+
- version=ruby:2.4
|
8
|
+
- version=jruby:9.2
|
9
9
|
gemfile:
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
10
|
+
- gemfiles/Sinatra_1.gemfile
|
11
|
+
- gemfiles/Sinatra_2.gemfile
|
12
|
+
script:
|
13
|
+
- if [[ "$TRAVIS_BRANCH" == "main" || "$TRAVIS_BRANCH" == "travis" ]] && [ "$TRAVIS_PULL_REQUEST" == "false" ]; then
|
14
|
+
echo "${DOCKER_PASSWORD}" | docker login -u "${DOCKER_USERNAME}" --password-stdin;
|
15
|
+
fi
|
16
|
+
- make test-docker
|
15
17
|
deploy:
|
16
18
|
provider: rubygems
|
17
|
-
api_key: $RUBYGEMS_API_KEY
|
19
|
+
api_key: "$RUBYGEMS_API_KEY"
|
18
20
|
gem: sendgrid-ruby
|
19
21
|
on:
|
20
22
|
tags: true
|
21
23
|
condition: $version = ruby:2.4 && $BUNDLE_GEMFILE = *"gemfiles/Sinatra_1.gemfile"
|
22
|
-
|
23
24
|
notifications:
|
24
25
|
slack:
|
25
26
|
if: branch = main
|
@@ -27,4 +28,4 @@ notifications:
|
|
27
28
|
on_success: never
|
28
29
|
on_failure: change
|
29
30
|
rooms:
|
30
|
-
|
31
|
+
secure: oSeohwM+ernyiRYSRLpNlICk0wgj0lku3y5LuouJLRHs45tCAzLZLbgxsor18wCSJkmhfn2vg4Rn969VnskFuj70OhJSLBKL4UXBnR1Ji0ClpfJlGojcbY/5Z8N/eGDrvf5ofA0Jc+L/ut+oSCMXnstEGbx4wBpPTajHuRtvb34=
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,30 @@
|
|
1
1
|
# Change Log
|
2
2
|
All notable changes to this project will be documented in this file.
|
3
3
|
|
4
|
+
[2021-10-18] Version 6.5.2
|
5
|
+
--------------------------
|
6
|
+
**Library - Docs**
|
7
|
+
- [PR #472](https://github.com/sendgrid/sendgrid-ruby/pull/472): improve signed webhook event validation docs. Thanks to [@shwetha-manvinkurke](https://github.com/shwetha-manvinkurke)!
|
8
|
+
|
9
|
+
|
10
|
+
[2021-09-08] Version 6.5.1
|
11
|
+
--------------------------
|
12
|
+
**Library - Chore**
|
13
|
+
- [PR #470](https://github.com/sendgrid/sendgrid-ruby/pull/470): add support for ruby 3.0. Thanks to [@shwetha-manvinkurke](https://github.com/shwetha-manvinkurke)!
|
14
|
+
|
15
|
+
|
16
|
+
[2021-08-11] Version 6.5.0
|
17
|
+
--------------------------
|
18
|
+
**Library - Feature**
|
19
|
+
- [PR #466](https://github.com/sendgrid/sendgrid-ruby/pull/466): Add From address to personalization. Thanks to [@grin](https://github.com/grin)!
|
20
|
+
|
21
|
+
|
22
|
+
[2021-02-10] Version 6.4.0
|
23
|
+
--------------------------
|
24
|
+
**Library - Feature**
|
25
|
+
- [PR #455](https://github.com/sendgrid/sendgrid-ruby/pull/455): Add http_options as a param in the SendGrid::API's constructor. Thanks to [@hoangtuanictvn](https://github.com/hoangtuanictvn)!
|
26
|
+
|
27
|
+
|
4
28
|
[2021-01-27] Version 6.3.9
|
5
29
|
--------------------------
|
6
30
|
**Library - Fix**
|
data/README.md
CHANGED
@@ -2,7 +2,6 @@
|
|
2
2
|
|
3
3
|
[![Travis Badge](https://travis-ci.com/sendgrid/sendgrid-ruby.svg?branch=main)](https://travis-ci.com/sendgrid/sendgrid-ruby)
|
4
4
|
[![Gem Version](https://badge.fury.io/rb/sendgrid-ruby.svg)](https://badge.fury.io/rb/sendgrid-ruby)
|
5
|
-
[![Email Notifications Badge](https://dx.sendgrid.com/badge/ruby)](https://dx.sendgrid.com/newsletter/ruby)
|
6
5
|
[![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
|
7
6
|
[![Twitter Follow](https://img.shields.io/twitter/follow/sendgrid.svg?style=social&label=Follow)](https://twitter.com/sendgrid)
|
8
7
|
[![GitHub contributors](https://img.shields.io/github/contributors/sendgrid/sendgrid-ruby.svg)](https://github.com/sendgrid/sendgrid-ruby/graphs/contributors)
|
data/TROUBLESHOOTING.md
CHANGED
@@ -17,6 +17,7 @@ If you can't find a solution below, please open an [issue](https://github.com/se
|
|
17
17
|
* [Rails Specifics](#rails-specifics)
|
18
18
|
* [Ruby Versions](#ruby-versions)
|
19
19
|
* [Viewing the Request Body](#viewing-the-request-body)
|
20
|
+
* [Verifying Event Webhooks](#signed-webhooks)
|
20
21
|
|
21
22
|
<a name="migrating"></a>
|
22
23
|
## Migrating from v2 to v3
|
@@ -137,3 +138,14 @@ You can do this before `response = sg.client.mail._('send').post(request_body: m
|
|
137
138
|
```ruby
|
138
139
|
puts mail.to_json
|
139
140
|
```
|
141
|
+
|
142
|
+
<a name="signed-webhooks"></a>
|
143
|
+
## Signed Webhook Verification
|
144
|
+
|
145
|
+
Twilio SendGrid's Event Webhook will notify a URL via HTTP POST with information about events that occur as your mail is processed. [This](https://docs.sendgrid.com/for-developers/tracking-events/getting-started-event-webhook-security-features) article covers all you need to know to secure the Event Webhook, allowing you to verify that incoming requests originate from Twilio SendGrid. The sendgrid-ruby library can help you verify these Signed Event Webhooks.
|
146
|
+
|
147
|
+
You can find the usage example [here](examples/helpers/eventwebhook/example.rb) and the tests [here](spec/sendgrid/helpers/eventwebhook/eventwebhook_spec.rb).
|
148
|
+
If you are still having trouble getting the validation to work, follow the following instructions:
|
149
|
+
- Be sure to use the *raw* payload for validation
|
150
|
+
- Be sure to include a trailing carriage return and newline in your payload
|
151
|
+
- In case of multi-event webhooks, make sure you include the trailing newline and carriage return after *each* event
|
@@ -18,6 +18,7 @@ def hello_world
|
|
18
18
|
puts response.headers
|
19
19
|
end
|
20
20
|
|
21
|
+
# rubocop:disable Metrics/AbcSize
|
21
22
|
def kitchen_sink
|
22
23
|
mail = SendGrid::Mail.new
|
23
24
|
mail.from = Email.new(email: 'test@example.com')
|
@@ -29,6 +30,9 @@ def kitchen_sink
|
|
29
30
|
personalization.add_cc(Email.new(email: 'test4@example.com', name: 'Example User'))
|
30
31
|
personalization.add_bcc(Email.new(email: 'test5@example.com', name: 'Example User'))
|
31
32
|
personalization.add_bcc(Email.new(email: 'test6@example.com', name: 'Example User'))
|
33
|
+
# Note, the domain of the from email property specified in any personalization must
|
34
|
+
# match the domain of the from email property specified at root level
|
35
|
+
personalization.from = Email.new(email: 'alias@example.com', name: "My alias")
|
32
36
|
personalization.subject = 'Hello World from the Personalized Twilio SendGrid Ruby Library'
|
33
37
|
personalization.add_header(Header.new(key: 'X-Test', value: 'True'))
|
34
38
|
personalization.add_header(Header.new(key: 'X-Mock', value: 'False'))
|
@@ -124,6 +128,7 @@ def kitchen_sink
|
|
124
128
|
puts response.body
|
125
129
|
puts response.headers
|
126
130
|
end
|
131
|
+
# rubocop:enable Metrics/AbcSize
|
127
132
|
|
128
133
|
def dynamic_template_data_hello_world
|
129
134
|
mail = Mail.new
|
@@ -4,7 +4,7 @@ require_relative 'version'
|
|
4
4
|
# Initialize the HTTP client
|
5
5
|
class BaseInterface
|
6
6
|
attr_accessor :client
|
7
|
-
attr_reader :request_headers, :host, :version, :impersonate_subuser
|
7
|
+
attr_reader :request_headers, :host, :version, :impersonate_subuser, :http_options
|
8
8
|
|
9
9
|
# * *Args* :
|
10
10
|
# - +auth+ -> authorization header value
|
@@ -14,8 +14,9 @@ class BaseInterface
|
|
14
14
|
# currently only "v3" is supported
|
15
15
|
# - +impersonate_subuser+ -> the subuser to impersonate, will be passed
|
16
16
|
# in the "On-Behalf-Of" header
|
17
|
+
# - +http_options+ -> http options that you want to be globally applied to each request
|
17
18
|
#
|
18
|
-
def initialize(auth:, host:, request_headers: nil, version: nil, impersonate_subuser: nil)
|
19
|
+
def initialize(auth:, host:, request_headers: nil, version: nil, impersonate_subuser: nil, http_options: {})
|
19
20
|
@auth = auth
|
20
21
|
@host = host
|
21
22
|
@version = version || 'v3'
|
@@ -31,7 +32,9 @@ class BaseInterface
|
|
31
32
|
@request_headers['On-Behalf-Of'] = @impersonate_subuser if @impersonate_subuser
|
32
33
|
|
33
34
|
@request_headers = @request_headers.merge(request_headers) if request_headers
|
35
|
+
@http_options = http_options
|
34
36
|
@client = SendGrid::Client.new(host: "#{@host}/#{@version}",
|
35
|
-
request_headers: @request_headers
|
37
|
+
request_headers: @request_headers,
|
38
|
+
http_options: @http_options)
|
36
39
|
end
|
37
40
|
end
|
@@ -5,10 +5,11 @@ module SendGrid
|
|
5
5
|
attr_reader :tos, :ccs, :bccs, :headers, :substitutions, :custom_args,
|
6
6
|
:dynamic_template_data
|
7
7
|
|
8
|
-
attr_accessor :send_at, :subject
|
8
|
+
attr_accessor :send_at, :subject, :from
|
9
9
|
|
10
10
|
def initialize
|
11
11
|
@tos = []
|
12
|
+
@from = nil
|
12
13
|
@ccs = []
|
13
14
|
@bccs = []
|
14
15
|
@subject = nil
|
@@ -59,6 +60,7 @@ module SendGrid
|
|
59
60
|
def to_json(*)
|
60
61
|
{
|
61
62
|
'to' => tos,
|
63
|
+
'from' => from,
|
62
64
|
'cc' => ccs,
|
63
65
|
'bcc' => bccs,
|
64
66
|
'subject' => subject,
|
data/lib/sendgrid/sendgrid.rb
CHANGED
@@ -9,12 +9,13 @@ module SendGrid
|
|
9
9
|
# currently only "v3" is supported
|
10
10
|
# - +impersonate_subuser+ -> the subuser to impersonate, will be passed
|
11
11
|
# in the "On-Behalf-Of" header
|
12
|
+
# - +http_options+ -> http options that you want to be globally applied to each request
|
12
13
|
#
|
13
|
-
def initialize(api_key:, host: nil, request_headers: nil, version: nil, impersonate_subuser: nil)
|
14
|
+
def initialize(api_key:, host: nil, request_headers: nil, version: nil, impersonate_subuser: nil, http_options: {})
|
14
15
|
auth = "Bearer #{api_key}"
|
15
16
|
host ||= 'https://api.sendgrid.com'
|
16
17
|
|
17
|
-
super(auth: auth, host: host, request_headers: request_headers, version: version, impersonate_subuser: impersonate_subuser)
|
18
|
+
super(auth: auth, host: host, request_headers: request_headers, version: version, impersonate_subuser: impersonate_subuser, http_options: http_options)
|
18
19
|
end
|
19
20
|
end
|
20
21
|
end
|
data/lib/sendgrid/version.rb
CHANGED
@@ -19,14 +19,14 @@ describe SendGrid::MailSettingsDto do
|
|
19
19
|
describe '.fetch' do
|
20
20
|
it 'calls get on sendgrid_client' do
|
21
21
|
args = { sendgrid_client: sendgrid_client, name: setting_name, query_params: {} }
|
22
|
-
expect(mail_settings.fetch(args)).to be_a SendGrid::Response
|
22
|
+
expect(mail_settings.fetch(**args)).to be_a SendGrid::Response
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
26
|
describe '.update' do
|
27
27
|
it 'calls patch on sendgrid_client' do
|
28
28
|
args = { sendgrid_client: sendgrid_client, name: setting_name, request_body: setting_params }
|
29
|
-
expect(mail_settings.update(args)).to be_a SendGrid::Response
|
29
|
+
expect(mail_settings.update(**args)).to be_a SendGrid::Response
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
@@ -11,14 +11,14 @@ describe SendGrid::PartnerSettingsDto do
|
|
11
11
|
describe '.fetch' do
|
12
12
|
it 'calls get on sendgrid_client' do
|
13
13
|
args = { sendgrid_client: sendgrid_client, name: setting_name, query_params: {} }
|
14
|
-
expect(partner_settings.fetch(args)).to be_a SendGrid::Response
|
14
|
+
expect(partner_settings.fetch(**args)).to be_a SendGrid::Response
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
18
|
describe '.update' do
|
19
19
|
it 'calls patch on sendgrid_client' do
|
20
20
|
args = { sendgrid_client: sendgrid_client, name: setting_name, request_body: setting_params }
|
21
|
-
expect(partner_settings.update(args)).to be_a SendGrid::Response
|
21
|
+
expect(partner_settings.update(**args)).to be_a SendGrid::Response
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
@@ -14,14 +14,14 @@ describe SendGrid::TrackingSettingsDto do
|
|
14
14
|
describe '.fetch' do
|
15
15
|
it 'calls get on sendgrid_client' do
|
16
16
|
args = { sendgrid_client: sendgrid_client, name: setting_name, query_params: {} }
|
17
|
-
expect(tracking_settings.fetch(args)).to be_a SendGrid::Response
|
17
|
+
expect(tracking_settings.fetch(**args)).to be_a SendGrid::Response
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
21
|
describe '.update' do
|
22
22
|
it 'calls patch on sendgrid_client' do
|
23
23
|
args = { sendgrid_client: sendgrid_client, name: setting_name, request_body: setting_params }
|
24
|
-
expect(tracking_settings.update(args)).to be_a SendGrid::Response
|
24
|
+
expect(tracking_settings.update(**args)).to be_a SendGrid::Response
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|
@@ -11,14 +11,14 @@ describe SendGrid::UserSettingsDto do
|
|
11
11
|
describe '.fetch' do
|
12
12
|
it 'calls get on sendgrid_client' do
|
13
13
|
args = { sendgrid_client: sendgrid_client, name: setting_name, query_params: {} }
|
14
|
-
expect(user_settings.fetch(args)).to be_a SendGrid::Response
|
14
|
+
expect(user_settings.fetch(**args)).to be_a SendGrid::Response
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
18
|
describe '.update' do
|
19
19
|
it 'calls patch on sendgrid_client' do
|
20
20
|
args = { sendgrid_client: sendgrid_client, name: setting_name, request_body: setting_params }
|
21
|
-
expect(user_settings.update(args)).to be_a SendGrid::Response
|
21
|
+
expect(user_settings.update(**args)).to be_a SendGrid::Response
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
@@ -33,8 +33,9 @@ class TestAPI < MiniTest::Test
|
|
33
33
|
assert_equal(test_headers, sg.request_headers)
|
34
34
|
assert_equal('v3', sg.version)
|
35
35
|
assert_equal(subuser, sg.impersonate_subuser)
|
36
|
-
assert_equal('6.
|
36
|
+
assert_equal('6.5.2', SendGrid::VERSION)
|
37
37
|
assert_instance_of(SendGrid::Client, sg.client)
|
38
|
+
assert_equal({}, sg.http_options)
|
38
39
|
end
|
39
40
|
|
40
41
|
def test_init_when_impersonate_subuser_is_not_given
|
@@ -42,6 +43,23 @@ class TestAPI < MiniTest::Test
|
|
42
43
|
refute_includes(sg.request_headers, 'On-Behalf-Of')
|
43
44
|
end
|
44
45
|
|
46
|
+
def test_init_when_http_options_is_given
|
47
|
+
params = JSON.parse('{"subuser": "test_string", "ip": "test_string", "limit": 1, "exclude_whitelabels": "true", "offset": 1}')
|
48
|
+
headers = JSON.parse('{"X-Mock": 200}')
|
49
|
+
http_options = {
|
50
|
+
open_timeout: 40,
|
51
|
+
read_timeout: 40
|
52
|
+
}
|
53
|
+
|
54
|
+
sg = SendGrid::API.new(api_key: 'SENDGRID_API_KEY', version: 'v3', http_options: http_options)
|
55
|
+
client = sg.client.ips
|
56
|
+
response = client.get(query_params: params, request_headers: headers)
|
57
|
+
|
58
|
+
assert_equal(40, client.http.open_timeout)
|
59
|
+
assert_equal(40, client.http.read_timeout)
|
60
|
+
assert_equal('200', response.status_code)
|
61
|
+
end
|
62
|
+
|
45
63
|
def test_access_settings_activity_get
|
46
64
|
params = JSON.parse('{"limit": 1}')
|
47
65
|
headers = JSON.parse('{"X-Mock": 200}')
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sendgrid-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.
|
4
|
+
version: 6.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Elmer Thomas
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2021-
|
13
|
+
date: 2021-10-18 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: ruby_http_client
|
@@ -167,6 +167,7 @@ extra_rdoc_files: []
|
|
167
167
|
files:
|
168
168
|
- ".codeclimate.yml"
|
169
169
|
- ".env_sample"
|
170
|
+
- ".github/ISSUE_TEMPLATE/config.yml"
|
170
171
|
- ".gitignore"
|
171
172
|
- ".rubocop.yml"
|
172
173
|
- ".rubocop_todo.yml"
|