sendgrid-ruby 6.3.1 → 6.3.6

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