sendgrid-ruby 6.0.0 → 6.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.
Files changed (133) hide show
  1. checksums.yaml +5 -5
  2. data/.codeclimate.yml +1 -1
  3. data/.gitignore +2 -0
  4. data/.rubocop.yml +8 -0
  5. data/.rubocop_todo.yml +111 -0
  6. data/.travis.yml +26 -25
  7. data/CHANGELOG.md +185 -10
  8. data/CODE_OF_CONDUCT.md +57 -25
  9. data/CONTRIBUTING.md +11 -23
  10. data/Dockerfile +14 -0
  11. data/FIRST_TIMERS.md +79 -0
  12. data/Gemfile +0 -1
  13. data/ISSUE_TEMPLATE.md +30 -0
  14. data/LICENSE +21 -0
  15. data/Makefile +15 -0
  16. data/PULL_REQUEST_TEMPLATE.md +31 -0
  17. data/README.md +28 -37
  18. data/Rakefile +2 -3
  19. data/TROUBLESHOOTING.md +9 -7
  20. data/USAGE.md +146 -39
  21. data/examples/accesssettings/accesssettings.rb +9 -12
  22. data/examples/alerts/alerts.rb +8 -11
  23. data/examples/apikeys/apikeys.rb +12 -15
  24. data/examples/asm/asm.rb +27 -30
  25. data/examples/browsers/browsers.rb +0 -3
  26. data/examples/campaigns/campaigns.rb +29 -32
  27. data/examples/categories/categories.rb +0 -3
  28. data/examples/clients/clients.rb +1 -4
  29. data/examples/contactdb/contactdb.rb +63 -66
  30. data/examples/devices/devices.rb +0 -3
  31. data/examples/emailactivity/emailactivity.rb +52 -0
  32. data/examples/geo/geo.rb +0 -3
  33. data/examples/helpers/eventwebhook/example.rb +16 -0
  34. data/examples/helpers/mail/example.rb +19 -13
  35. data/examples/helpers/settings/example.rb +1 -1
  36. data/examples/helpers/stats/example.rb +4 -4
  37. data/examples/ips/ips.rb +19 -22
  38. data/examples/mail/mail.rb +72 -75
  39. data/examples/mailboxproviders/mailboxproviders.rb +0 -3
  40. data/examples/mailsettings/mailsettings.rb +21 -24
  41. data/examples/partnersettings/partnersettings.rb +3 -6
  42. data/examples/scopes/scopes.rb +8 -10
  43. data/examples/senderauthentication/senderauthentication.rb +41 -44
  44. data/examples/senders/senders.rb +28 -31
  45. data/examples/stats/stats.rb +0 -3
  46. data/examples/subusers/subusers.rb +17 -20
  47. data/examples/suppression/suppression.rb +15 -18
  48. data/examples/templates/templates.rb +29 -31
  49. data/examples/trackingsettings/trackingsettings.rb +14 -17
  50. data/examples/user/user.rb +41 -44
  51. data/lib/rack/sendgrid_webhook_verification.rb +55 -0
  52. data/lib/sendgrid-ruby.rb +5 -1
  53. data/lib/sendgrid/base_interface.rb +40 -0
  54. data/lib/sendgrid/helpers/eventwebhook/eventwebhook.rb +50 -0
  55. data/lib/sendgrid/helpers/inbound/README.md +5 -5
  56. data/lib/sendgrid/helpers/inbound/app.rb +2 -2
  57. data/lib/sendgrid/helpers/inbound/public/index.html +1 -1
  58. data/lib/sendgrid/helpers/inbound/send.rb +3 -3
  59. data/lib/sendgrid/helpers/ip_management/ip_management.rb +1 -1
  60. data/lib/sendgrid/helpers/mail/README.md +3 -3
  61. data/lib/sendgrid/helpers/mail/asm.rb +4 -18
  62. data/lib/sendgrid/helpers/mail/attachment.rb +12 -43
  63. data/lib/sendgrid/helpers/mail/bcc_settings.rb +4 -18
  64. data/lib/sendgrid/helpers/mail/bypass_list_management.rb +6 -18
  65. data/lib/sendgrid/helpers/mail/category.rb +2 -4
  66. data/lib/sendgrid/helpers/mail/click_tracking.rb +4 -18
  67. data/lib/sendgrid/helpers/mail/content.rb +2 -3
  68. data/lib/sendgrid/helpers/mail/custom_arg.rb +4 -10
  69. data/lib/sendgrid/helpers/mail/email.rb +8 -5
  70. data/lib/sendgrid/helpers/mail/footer.rb +5 -27
  71. data/lib/sendgrid/helpers/mail/ganalytics.rb +9 -55
  72. data/lib/sendgrid/helpers/mail/header.rb +4 -10
  73. data/lib/sendgrid/helpers/mail/mail.rb +30 -48
  74. data/lib/sendgrid/helpers/mail/mail_settings.rb +7 -25
  75. data/lib/sendgrid/helpers/mail/open_tracking.rb +4 -18
  76. data/lib/sendgrid/helpers/mail/personalization.rb +32 -27
  77. data/lib/sendgrid/helpers/mail/section.rb +4 -10
  78. data/lib/sendgrid/helpers/mail/spam_check.rb +5 -27
  79. data/lib/sendgrid/helpers/mail/subscription_tracking.rb +6 -36
  80. data/lib/sendgrid/helpers/mail/substitution.rb +4 -10
  81. data/lib/sendgrid/helpers/mail/tracking_settings.rb +6 -20
  82. data/lib/sendgrid/helpers/permissions/scope.rb +2 -2
  83. data/lib/sendgrid/helpers/settings/README.md +2 -2
  84. data/lib/sendgrid/helpers/settings/settings.rb +1 -1
  85. data/lib/sendgrid/helpers/settings/tracking_settings_dto.rb +3 -5
  86. data/lib/sendgrid/helpers/stats/metrics.rb +5 -7
  87. data/lib/sendgrid/helpers/stats/stats_response.rb +0 -2
  88. data/lib/sendgrid/sendgrid.rb +21 -0
  89. data/lib/sendgrid/twilio_email.rb +21 -0
  90. data/lib/sendgrid/version.rb +1 -1
  91. data/mail_helper_v3.md +12 -12
  92. data/sendgrid-ruby.gemspec +11 -10
  93. data/spec/fixtures/event_webhook.rb +22 -0
  94. data/spec/rack/sendgrid_webhook_verification_spec.rb +142 -0
  95. data/spec/sendgrid/helpers/eventwebhook/eventwebhook_spec.rb +105 -0
  96. data/spec/sendgrid/helpers/settings/mail_settings_dto_spec.rb +1 -1
  97. data/spec/sendgrid/helpers/settings/partner_settings_dto_spec.rb +1 -1
  98. data/spec/sendgrid/helpers/settings/settings_spec.rb +2 -2
  99. data/spec/sendgrid/helpers/settings/tracking_settings_dto_spec.rb +1 -1
  100. data/spec/sendgrid/helpers/settings/user_settings_dto_spec.rb +1 -1
  101. data/spec/sendgrid/helpers/stats/email_stats_spec.rb +22 -23
  102. data/spec/sendgrid/helpers/stats/metrics_spec.rb +19 -20
  103. data/spec/sendgrid/helpers/stats/stats_response_spec.rb +22 -23
  104. data/spec/sendgrid/sendgrid_spec.rb +11 -0
  105. data/spec/sendgrid/twilio_email_spec.rb +11 -0
  106. data/spec/spec_helper.rb +3 -1
  107. data/static/img/github-fork.png +0 -0
  108. data/static/img/github-sign-up.png +0 -0
  109. data/test/sendgrid/helpers/mail/test_attachment.rb +4 -6
  110. data/test/sendgrid/helpers/mail/test_category.rb +0 -2
  111. data/test/sendgrid/helpers/mail/test_email.rb +17 -10
  112. data/test/sendgrid/helpers/mail/test_mail.rb +101 -102
  113. data/test/sendgrid/helpers/mail/test_personalizations.rb +133 -93
  114. data/test/sendgrid/permissions/test_scopes.rb +1 -3
  115. data/test/sendgrid/test_sendgrid-ruby.rb +1967 -1985
  116. data/twilio_sendgrid_logo.png +0 -0
  117. data/use-cases/README.md +16 -0
  118. data/use-cases/domain-authentication.md +5 -0
  119. data/use-cases/email-statistics.md +52 -0
  120. data/use-cases/legacy-templates.md +98 -0
  121. data/use-cases/sms.md +39 -0
  122. data/use-cases/transactional-templates.md +111 -0
  123. data/use-cases/twilio-email.md +13 -0
  124. data/use-cases/twilio-setup.md +54 -0
  125. metadata +88 -34
  126. data/.github/ISSUE_TEMPLATE +0 -17
  127. data/.github/PULL_REQUEST_TEMPLATE +0 -26
  128. data/LICENSE.txt +0 -22
  129. data/USE_CASES.md +0 -377
  130. data/docker/Dockerfile +0 -12
  131. data/docker/README.md +0 -30
  132. data/lib/sendgrid/client.rb +0 -38
  133. data/test/prism.sh +0 -42
@@ -2,6 +2,8 @@ require 'json'
2
2
 
3
3
  module SendGrid
4
4
  class Ganalytics
5
+ attr_accessor :enable, :utm_source, :utm_medium, :utm_term, :utm_content, :utm_name, :utm_campaign
6
+
5
7
  def initialize(enable: nil, utm_source: nil, utm_medium: nil, utm_term: nil, utm_content: nil, utm_campaign: nil, utm_name: nil)
6
8
  @enable = enable
7
9
  @utm_source = utm_source
@@ -12,63 +14,15 @@ module SendGrid
12
14
  @utm_name = utm_name
13
15
  end
14
16
 
15
- def enable=(enable)
16
- @enable = enable
17
- end
18
-
19
- def enable
20
- @enable
21
- end
22
-
23
- def utm_source=(utm_source)
24
- @utm_source = utm_source
25
- end
26
-
27
- def utm_source
28
- @utm_source
29
- end
30
-
31
- def utm_medium=(utm_medium)
32
- @utm_medium = utm_medium
33
- end
34
-
35
- def utm_medium
36
- @utm_medium
37
- end
38
-
39
- def utm_term=(utm_term)
40
- @utm_term = utm_term
41
- end
42
-
43
- def utm_term
44
- @utm_term
45
- end
46
-
47
- def utm_content=(utm_content)
48
- @utm_content = utm_content
49
- end
50
-
51
- def utm_content
52
- @utm_content
53
- end
54
-
55
- def utm_campaign=(utm_campaign)
56
- @utm_campaign = utm_campaign
57
- end
58
-
59
- def utm_campaign
60
- @utm_campaign
61
- end
62
-
63
17
  def to_json(*)
64
18
  {
65
- 'enable' => self.enable,
66
- 'utm_source' => self.utm_source,
67
- 'utm_medium' => self.utm_medium,
68
- 'utm_term' => self.utm_term,
69
- 'utm_content' => self.utm_content,
70
- 'utm_campaign' => self.utm_campaign
19
+ 'enable' => enable,
20
+ 'utm_source' => utm_source,
21
+ 'utm_medium' => utm_medium,
22
+ 'utm_term' => utm_term,
23
+ 'utm_content' => utm_content,
24
+ 'utm_campaign' => utm_campaign
71
25
  }.delete_if { |_, value| value.to_s.strip == '' }
72
26
  end
73
27
  end
74
- end
28
+ end
@@ -2,22 +2,16 @@ require 'json'
2
2
 
3
3
  module SendGrid
4
4
  class Header
5
+ attr_accessor :header
6
+
5
7
  def initialize(key: nil, value: nil)
6
8
  @header = {}
7
- (key.nil? || value.nil?) ? @header = nil : @header[key] = value
8
- end
9
-
10
- def header=(header)
11
- @header = header
12
- end
13
-
14
- def header
15
- @header
9
+ key.nil? || value.nil? ? @header = nil : @header[key] = value
16
10
  end
17
11
 
18
12
  def to_json(*)
19
13
  {
20
- 'header' => self.header
14
+ 'header' => header
21
15
  }.delete_if { |_, value| value.to_s.strip == '' }
22
16
  end
23
17
  end
@@ -4,11 +4,13 @@ require 'json'
4
4
 
5
5
  module SendGrid
6
6
  class Mail
7
-
8
7
  attr_accessor :subject, :ip_pool_name, :template_id, :send_at, :batch_id
9
8
  attr_reader :personalizations, :contents, :attachments, :categories, :sections, :headers, :custom_args
9
+ attr_writer :from, :asm, :mail_settings, :tracking_settings, :reply_to
10
10
 
11
- def initialize(from_email=nil, subj=nil, to_email=nil, cont=nil)
11
+ # We allow for all nil values here to create uninitialized Mail objects
12
+ # (e.g. <project-root>/use-cases/transactional-templates.md)
13
+ def initialize(from_email = nil, subj = nil, to_email = nil, cont = nil) # rubocop:disable Metrics/ParameterLists
12
14
  @from = nil
13
15
  @subject = nil
14
16
  @personalizations = []
@@ -27,18 +29,14 @@ module SendGrid
27
29
  @tracking_settings = nil
28
30
  @reply_to = nil
29
31
 
30
- if !(from_email.nil? && subj.nil? && to_email.nil? && cont.nil?)
31
- self.from = from_email
32
- self.subject = subj
33
- personalization = Personalization.new
34
- personalization.add_to(to_email)
35
- self.add_personalization(personalization)
36
- self.add_content(cont)
37
- end
38
- end
32
+ return if from_email.nil? && subj.nil? && to_email.nil? && cont.nil?
39
33
 
40
- def from=(from)
41
- @from = from
34
+ self.from = from_email
35
+ self.subject = subj
36
+ personalization = Personalization.new
37
+ personalization.add_to(to_email)
38
+ add_personalization(personalization)
39
+ add_content(cont)
42
40
  end
43
41
 
44
42
  def from
@@ -56,7 +54,7 @@ module SendGrid
56
54
  def check_for_secrets(patterns)
57
55
  contents = @contents.map { |content| content['value'] }.join(' ')
58
56
  patterns.each do |pattern|
59
- raise SecurityError.new('Content contains sensitive information.') if contents.match(pattern)
57
+ raise SecurityError, 'Content contains sensitive information.' if contents.match(pattern)
60
58
  end
61
59
  end
62
60
 
@@ -83,58 +81,42 @@ module SendGrid
83
81
  @custom_args = @custom_args.merge(custom_arg['custom_arg'])
84
82
  end
85
83
 
86
- def asm=(asm)
87
- @asm = asm
88
- end
89
-
90
84
  def asm
91
85
  @asm.nil? ? nil : @asm.to_json
92
86
  end
93
87
 
94
- def mail_settings=(mail_settings)
95
- @mail_settings = mail_settings
96
- end
97
-
98
88
  def mail_settings
99
89
  @mail_settings.nil? ? nil : @mail_settings.to_json
100
90
  end
101
91
 
102
- def tracking_settings=(tracking_settings)
103
- @tracking_settings = tracking_settings
104
- end
105
-
106
92
  def tracking_settings
107
93
  @tracking_settings.nil? ? nil : @tracking_settings.to_json
108
94
  end
109
95
 
110
- def reply_to=(reply_to)
111
- @reply_to = reply_to
112
- end
113
-
114
96
  def reply_to
115
97
  @reply_to.nil? ? nil : @reply_to.to_json
116
98
  end
117
99
 
118
100
  def to_json(*)
119
101
  {
120
- 'from' => self.from,
121
- 'subject' => self.subject,
122
- 'personalizations' => self.personalizations,
123
- 'content' => self.contents,
124
- 'attachments' => self.attachments,
125
- 'template_id' => self.template_id,
126
- 'sections' => self.sections,
127
- 'headers' => self.headers,
128
- 'categories' => self.categories,
129
- 'custom_args' => self.custom_args,
130
- 'send_at' => self.send_at,
131
- 'batch_id' => self.batch_id,
132
- 'asm' => self.asm,
133
- 'ip_pool_name' => self.ip_pool_name,
134
- 'mail_settings' => self.mail_settings,
135
- 'tracking_settings' => self.tracking_settings,
136
- 'reply_to' => self.reply_to
137
- }.delete_if { |_, value| value.to_s.strip == '' || value == [] || value == {}}
102
+ 'from' => from,
103
+ 'subject' => subject,
104
+ 'personalizations' => personalizations,
105
+ 'content' => contents,
106
+ 'attachments' => attachments,
107
+ 'template_id' => template_id,
108
+ 'sections' => sections,
109
+ 'headers' => headers,
110
+ 'categories' => categories,
111
+ 'custom_args' => custom_args,
112
+ 'send_at' => send_at,
113
+ 'batch_id' => batch_id,
114
+ 'asm' => asm,
115
+ 'ip_pool_name' => ip_pool_name,
116
+ 'mail_settings' => mail_settings,
117
+ 'tracking_settings' => tracking_settings,
118
+ 'reply_to' => reply_to
119
+ }.delete_if { |_, value| value.to_s.strip == '' || value == [] || value == {} }
138
120
  end
139
121
  end
140
122
  end
@@ -2,6 +2,8 @@ require 'json'
2
2
 
3
3
  module SendGrid
4
4
  class MailSettings
5
+ attr_writer :sandbox_mode, :footer, :bcc, :spam_check, :bypass_list_management
6
+
5
7
  def initialize
6
8
  @bcc = nil
7
9
  @bypass_list_management = nil
@@ -10,53 +12,33 @@ module SendGrid
10
12
  @spam_check = nil
11
13
  end
12
14
 
13
- def sandbox_mode=(sandbox_mode)
14
- @sandbox_mode = sandbox_mode
15
- end
16
-
17
15
  def sandbox_mode
18
16
  @sandbox_mode.nil? ? nil : @sandbox_mode.to_json
19
17
  end
20
18
 
21
- def bypass_list_management=(bypass_list_management)
22
- @bypass_list_management = bypass_list_management
23
- end
24
-
25
19
  def bypass_list_management
26
20
  @bypass_list_management.nil? ? nil : @bypass_list_management.to_json
27
21
  end
28
22
 
29
- def footer=(footer)
30
- @footer = footer
31
- end
32
-
33
23
  def footer
34
24
  @footer.nil? ? nil : @footer.to_json
35
25
  end
36
26
 
37
- def bcc=(bcc)
38
- @bcc = bcc
39
- end
40
-
41
27
  def bcc
42
28
  @bcc.nil? ? nil : @bcc.to_json
43
29
  end
44
30
 
45
- def spam_check=(spam_check)
46
- @spam_check = spam_check
47
- end
48
-
49
31
  def spam_check
50
32
  @spam_check.nil? ? nil : @spam_check.to_json
51
33
  end
52
34
 
53
35
  def to_json(*)
54
36
  {
55
- 'bcc' => self.bcc,
56
- 'bypass_list_management' => self.bypass_list_management,
57
- 'footer' => self.footer,
58
- 'sandbox_mode' => self.sandbox_mode,
59
- 'spam_check' => self.spam_check
37
+ 'bcc' => bcc,
38
+ 'bypass_list_management' => bypass_list_management,
39
+ 'footer' => footer,
40
+ 'sandbox_mode' => sandbox_mode,
41
+ 'spam_check' => spam_check
60
42
  }.delete_if { |_, value| value.to_s.strip == '' }
61
43
  end
62
44
  end
@@ -2,31 +2,17 @@ require 'json'
2
2
 
3
3
  module SendGrid
4
4
  class OpenTracking
5
+ attr_accessor :enable, :substitution_tag
6
+
5
7
  def initialize(enable: nil, substitution_tag: nil)
6
8
  @enable = enable
7
9
  @substitution_tag = substitution_tag
8
10
  end
9
11
 
10
- def enable=(enable)
11
- @enable = enable
12
- end
13
-
14
- def enable
15
- @enable
16
- end
17
-
18
- def substitution_tag=(substitution_tag)
19
- @substitution_tag = substitution_tag
20
- end
21
-
22
- def substitution_tag
23
- @substitution_tag
24
- end
25
-
26
12
  def to_json(*)
27
13
  {
28
- 'enable' => self.enable,
29
- 'substitution_tag' => self.substitution_tag
14
+ 'enable' => enable,
15
+ 'substitution_tag' => substitution_tag
30
16
  }.delete_if { |_, value| value.to_s.strip == '' }
31
17
  end
32
18
  end
@@ -2,9 +2,10 @@ require 'json'
2
2
 
3
3
  module SendGrid
4
4
  class Personalization
5
-
6
5
  attr_reader :tos, :ccs, :bccs, :headers, :substitutions, :custom_args,
7
- :dynamic_template_data
6
+ :dynamic_template_data
7
+
8
+ attr_accessor :send_at, :subject
8
9
 
9
10
  def initialize
10
11
  @tos = []
@@ -19,23 +20,21 @@ module SendGrid
19
20
  end
20
21
 
21
22
  def add_to(to)
23
+ raise DuplicatePersonalizationError if duplicate?(to)
24
+
22
25
  @tos << to.to_json
23
26
  end
24
27
 
25
28
  def add_cc(cc)
29
+ raise DuplicatePersonalizationError if duplicate?(cc)
30
+
26
31
  @ccs << cc.to_json
27
32
  end
28
33
 
29
34
  def add_bcc(bcc)
30
- @bccs << bcc.to_json
31
- end
32
-
33
- def subject=(subject)
34
- @subject = subject
35
- end
35
+ raise DuplicatePersonalizationError if duplicate?(bcc)
36
36
 
37
- def subject
38
- @subject
37
+ @bccs << bcc.to_json
39
38
  end
40
39
 
41
40
  def add_header(header)
@@ -57,26 +56,32 @@ module SendGrid
57
56
  @dynamic_template_data.merge!(dynamic_template_data)
58
57
  end
59
58
 
60
- def send_at=(send_at)
61
- @send_at = send_at
59
+ def to_json(*)
60
+ {
61
+ 'to' => tos,
62
+ 'cc' => ccs,
63
+ 'bcc' => bccs,
64
+ 'subject' => subject,
65
+ 'headers' => headers,
66
+ 'substitutions' => substitutions,
67
+ 'custom_args' => custom_args,
68
+ 'dynamic_template_data' => dynamic_template_data,
69
+ 'send_at' => send_at
70
+ }.delete_if { |_, value| value.to_s.strip == '' || value == [] || value == {} }
62
71
  end
63
72
 
64
- def send_at
65
- @send_at
66
- end
73
+ private
67
74
 
68
- def to_json(*)
69
- {
70
- 'to' => self.tos,
71
- 'cc' => self.ccs,
72
- 'bcc' => self.bccs,
73
- 'subject' => self.subject,
74
- 'headers' => self.headers,
75
- 'substitutions' => self.substitutions,
76
- 'custom_args' => self.custom_args,
77
- 'dynamic_template_data' => self.dynamic_template_data,
78
- 'send_at' => self.send_at
79
- }.delete_if { |_, value| value.to_s.strip == '' || value == [] || value == {}}
75
+ def duplicate?(addition)
76
+ additional_email = addition.email.downcase
77
+
78
+ [@tos, @ccs, @bccs].flatten.each do |elm|
79
+ return true if elm&.dig('email')&.downcase == additional_email
80
+ end
81
+
82
+ false
80
83
  end
81
84
  end
85
+
86
+ class DuplicatePersonalizationError < StandardError; end
82
87
  end
@@ -2,22 +2,16 @@ require 'json'
2
2
 
3
3
  module SendGrid
4
4
  class Section
5
+ attr_accessor :section
6
+
5
7
  def initialize(key: nil, value: nil)
6
8
  @section = {}
7
- (key.nil? || value.nil?) ? @section = nil : @section[key] = value
8
- end
9
-
10
- def section=(section)
11
- @section = section
12
- end
13
-
14
- def section
15
- @section
9
+ key.nil? || value.nil? ? @section = nil : @section[key] = value
16
10
  end
17
11
 
18
12
  def to_json(*)
19
13
  {
20
- 'section' => self.section
14
+ 'section' => section
21
15
  }.delete_if { |_, value| value.to_s.strip == '' }
22
16
  end
23
17
  end