sendgrid-ruby 0.0.3 → 1.0.0.alpha.1

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
  SHA1:
3
- metadata.gz: 852d4c2923fcdcae762675d591aae678ff97664d
4
- data.tar.gz: 95acbc4f1b36c036fceac5cda5eba764718021b0
3
+ metadata.gz: 151bbef80094a16705ac90105265586a3b297f72
4
+ data.tar.gz: 978bc5da9b1f788440e1e7e55cb821a0864571da
5
5
  SHA512:
6
- metadata.gz: abd3afa7292e24ef33ea86f70515a49f9a81b40484fc3c6f88ad37b430d00f42bbb0bee6f7aa3d50384d34055afd9738d66df170772f6cc4f298219c6b89d27b
7
- data.tar.gz: 9c77400d124690b7deb810e760d1f1f3dcc6c35d8cf8a908a04205eeb8738d3591d341d13361e3b78f9803ab281db61c701f7a34796124a11a7b2c2020be6b7f
6
+ metadata.gz: 6445b8feda2318bb755c4a0a448f3456610d2de94982ae223acee641e1c5a1ea4ac6177e94fd89fd46323434f71512221528f904a967738f5aed176c0634e6c7
7
+ data.tar.gz: 379ae309fb47ad14331bc2747b226f016a865c8671d45567ab725eef5f2fdb8db4daf305ffba6143d3070b99302472863017484f860282b052b5d32116b18f6d
data/.gitignore CHANGED
@@ -1,21 +1,39 @@
1
+ # Created by https://www.gitignore.io
2
+
3
+ ### Ruby ###
1
4
  *.gem
2
5
  *.rbc
3
- .bundle
4
- .config
5
- .yardoc
6
+ /.config
7
+ /coverage/
8
+ /InstalledFiles
9
+ /pkg/
10
+ /spec/reports/
11
+ /test/tmp/
12
+ /test/version_tmp/
13
+ /tmp/
14
+
15
+ ## Specific to RubyMotion:
16
+ .dat*
17
+ .repl_history
18
+ build/
19
+
20
+ ## Documentation cache and generated files:
21
+ /.yardoc/
22
+ /_yardoc/
23
+ /doc/
24
+ /rdoc/
25
+
26
+ ## Environment normalisation:
27
+ /.bundle/
28
+ /vendor/bundle
29
+ /lib/bundler/man/
30
+
31
+ # for a library or gem, you might want to ignore these files since the code is
32
+ # intended to run in multiple environments; otherwise, check them in:
6
33
  Gemfile.lock
7
- InstalledFiles
8
- _yardoc
9
- coverage
10
- doc/
11
- lib/bundler/man
12
- pkg
13
- rdoc
34
+ .ruby-version
35
+ .ruby-gemset
36
+
37
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
38
+ .rvmrc
14
39
 
15
- tmp
16
- *.bundle
17
- *.so
18
- *.o
19
- *.a
20
- mkmf.log
21
- .DS_Store
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,30 @@
1
+ Metrics/AbcSize:
2
+ Max: 37
3
+
4
+ # Configuration parameters: CountComments.
5
+ Metrics/ClassLength:
6
+ Max: 109
7
+
8
+ Metrics/CyclomaticComplexity:
9
+ Max: 7
10
+
11
+ # Configuration parameters: AllowURI, URISchemes.
12
+ Metrics/LineLength:
13
+ Max: 132
14
+
15
+ # Configuration parameters: CountComments.
16
+ Metrics/MethodLength:
17
+ Max: 22
18
+
19
+ Style/Documentation:
20
+ Enabled: false
21
+
22
+ # Cop supports --auto-correct.
23
+ # Configuration parameters: EnforcedStyle, SupportedStyles, EnforcedStyleForEmptyBraces, SpaceBeforeBlockParameters.
24
+ Style/SpaceInsideBlockBraces:
25
+ Enabled: false
26
+
27
+ # Cop supports --auto-correct.
28
+ # Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBraces, SupportedStyles.
29
+ Style/SpaceInsideHashLiteralBraces:
30
+ Enabled: false
data/.travis.yml ADDED
@@ -0,0 +1,20 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2
4
+ - 2.0
5
+ - 1.9.3
6
+ notifications:
7
+ hipchat:
8
+ rooms:
9
+ secure: gYBEwOGBTxHE2nrxsHQqp2UdjRtCX04wVLYEimeT9RG/0LClS4nzJF7DaXLWlAwgLPmk+KV2+nXuLO5oausBr9ODmWhho8G0F90RPR47NupcvT1RM+I2ZbxSjHCUICL22mdnZd8ye/mrk/YtFWYmgmH7ILRK3BuYovXFoKoRnLg=
10
+ template:
11
+ - '<a href="https://travis-ci.org/%{repository}/builds/%{build_id}">%{repository}
12
+ Build %{build_number}</a> on branch <i>%{branch}</i> by %{author}: <strong>%{message}</strong>
13
+ <a href="https://github.com/sendgrid/docs/commits/%{commit}">View on GitHub</a>'
14
+ format: html
15
+ notify: true
16
+ before_script:
17
+ - bundle install
18
+ script:
19
+ - rubocop --fail-level=W
20
+ - rake
data/Guardfile CHANGED
@@ -1,12 +1,10 @@
1
1
  notification :gntp
2
- guard 'rspec' do
3
- # watch /lib/ files
4
- watch(%r{^lib/(.+).rb$}) do |m|
5
- "spec/#{m[1]}_spec.rb"
6
- end
2
+ guard :rspec, cmd: 'rspec' do
3
+ watch(%r{^spec/.+_spec\.rb$})
4
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
5
+ watch('spec/spec_helper.rb') { 'spec' }
6
+ end
7
7
 
8
- # watch /spec/ files
9
- watch(%r{^spec/(.+).rb$}) do |m|
10
- "spec/#{m[1]}.rb"
11
- end
8
+ guard :rubocop, all_on_start: false do
9
+ watch(%r{^lib/(.+)\.rb$})
12
10
  end
data/README.md CHANGED
@@ -4,6 +4,8 @@ This Gem allows you to quickly and easily send emails through SendGrid's Web API
4
4
 
5
5
  You can read our official documentation on the Web API's Mail feature [here](https://sendgrid.com/docs/API_Reference/Web_API/mail.html).
6
6
 
7
+ [![BuildStatus](https://travis-ci.org/sendgrid/sendgrid-ruby.svg?branch=master)](https://travis-ci.org/sendgrid/sendgrid-ruby)
8
+
7
9
 
8
10
  ## Installation
9
11
 
@@ -49,11 +51,18 @@ puts client.send(mail)
49
51
  # {"message":"success"}
50
52
  ```
51
53
 
52
- You can also create a mail object with a hash.
54
+ You can also create a mail object with a hash:
53
55
  ```ruby
54
56
  client.send(SendGrid::Mail.new(to: 'example@example.com', from: 'taco@cat.limo', subject: 'Hello world!', text: 'Hi there!', html: '<b>Hi there!</b>'))
55
57
 
56
- # {"message":"success"}
58
+ # {"message":"success"}
59
+ ```
60
+
61
+ #### Attachments
62
+
63
+ Attachments can be added to a mail object with the `add_attachment` method. The first parameter is the path to the file, the second (optional) parameter is the desired name of the file. If a file name is not provided, it will use the original filename.
64
+ ```ruby
65
+ mail.add_attachment('/tmp/report.pdf', 'july_report.pdf')
57
66
  ```
58
67
 
59
68
  #### Available Params
data/Rakefile CHANGED
@@ -1,8 +1,8 @@
1
- require 'rspec/core/rake_task'
2
1
  require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
3
5
 
4
- RSpec::Core::RakeTask.new(:spec) do |task|
5
- task.rspec_opts = ['--color', '--format', 'nested']
6
- end
6
+ task test: :spec
7
7
 
8
- task default: :spec
8
+ task default: :test
@@ -0,0 +1,63 @@
1
+ require 'faraday'
2
+
3
+ module SendGrid
4
+ class Client
5
+ attr_accessor :api_user, :api_key, :protocol, :host, :port, :url, :endpoint,
6
+ :user_agent
7
+ attr_writer :adapter, :conn, :raise_exceptions
8
+
9
+ def initialize(params = {})
10
+ self.api_user = params.fetch(:api_user, nil)
11
+ self.api_key = params.fetch(:api_key, nil)
12
+ self.protocol = params.fetch(:protocol, 'https')
13
+ self.host = params.fetch(:host, 'api.sendgrid.com')
14
+ self.port = params.fetch(:port, nil)
15
+ self.url = params.fetch(:url, protocol + '://' + host + (port ? ":#{port}" : ''))
16
+ self.endpoint = params.fetch(:endpoint, '/api/mail.send.json')
17
+ self.adapter = params.fetch(:adapter, adapter)
18
+ self.conn = params.fetch(:conn, conn)
19
+ self.user_agent = params.fetch(:user_agent, "sendgrid/#{SendGrid::VERSION};ruby")
20
+ self.raise_exceptions = params.fetch(:raise_exceptions, true)
21
+ yield self if block_given?
22
+ end
23
+
24
+ def send(mail)
25
+ res = conn.post do |req|
26
+ payload = mail.to_h
27
+
28
+ req.url(endpoint)
29
+
30
+ # Check if using username + password or API key
31
+ if api_user
32
+ # Username + password
33
+ payload = payload.merge(api_user: api_user, api_key: api_key)
34
+ else
35
+ # API key
36
+ req.headers['Authorization'] = "Bearer #{api_key}"
37
+ end
38
+
39
+ req.body = payload
40
+ end
41
+
42
+ fail SendGrid::Exception, res.body if raise_exceptions? && res.status != 200
43
+
44
+ SendGrid::Response.new(code: res.status, headers: res.headers, body: res.body)
45
+ end
46
+
47
+ def conn
48
+ @conn ||= Faraday.new(url: url) do |conn|
49
+ conn.request :multipart
50
+ conn.request :url_encoded
51
+ conn.adapter adapter
52
+ end
53
+ end
54
+
55
+ def adapter
56
+ @adapter ||= Faraday.default_adapter
57
+ end
58
+
59
+ def raise_exceptions?
60
+ @raise_exceptions
61
+ end
62
+ end
63
+ end
data/lib/sendgrid/mail.rb CHANGED
@@ -3,58 +3,138 @@ require 'smtpapi'
3
3
 
4
4
  module SendGrid
5
5
  class Mail
6
- attr_accessor :to, :to_name, :from, :from_name, :subject, :text, :html, :cc,
7
- :bcc, :reply_to, :date, :smtpapi, :attachments
6
+ attr_accessor :to, :to_name, :from, :from_name, :subject, :text, :html, :cc,
7
+ :bcc, :reply_to, :date, :smtpapi, :attachments
8
8
 
9
9
  def initialize(params = {})
10
10
  params.each do |k, v|
11
- instance_variable_set("@#{k}", v) unless v.nil?
11
+ send(:"#{k}=", v) unless v.nil?
12
12
  end
13
- @headers ||= {}
14
- @attachments ||= []
15
- @smtpapi ||= Smtpapi::Header.new
16
13
  yield self if block_given?
17
14
  end
18
15
 
19
- def add_to(to_email)
20
- @smtpapi.add_to to_email
16
+ def add_to(email, name = nil)
17
+ if email.is_a?(Array)
18
+ to.concat(email)
19
+ else
20
+ to << email
21
+ end
22
+ add_to_name(name) if name
23
+ end
24
+
25
+ def to
26
+ @to ||= []
27
+ end
28
+
29
+ def to_name
30
+ @to_name ||= []
31
+ end
32
+
33
+ def add_to_name(name)
34
+ if name.is_a?(Array)
35
+ to_name.concat(name)
36
+ else
37
+ to_name << name
38
+ end
39
+ end
40
+
41
+ def cc
42
+ @cc ||= []
43
+ end
44
+
45
+ def cc_name
46
+ @cc_name ||= []
47
+ end
48
+
49
+ def add_cc(email, name = nil)
50
+ if email.is_a?(Array)
51
+ cc.concat(email)
52
+ else
53
+ cc << email
54
+ end
55
+ add_cc_name(name) if name
56
+ end
57
+
58
+ def add_cc_name(name)
59
+ if name.is_a?(Array)
60
+ cc_name.concat(name)
61
+ else
62
+ cc_name << name
63
+ end
64
+ end
65
+
66
+ def bcc
67
+ @bcc ||= []
68
+ end
69
+
70
+ def bcc_name
71
+ @bcc_name ||= []
72
+ end
73
+
74
+ def add_bcc(email, name = nil)
75
+ if email.is_a?(Array)
76
+ bcc.concat(email)
77
+ else
78
+ bcc << email
79
+ end
80
+ add_bcc_name(name)
81
+ end
82
+
83
+ def add_bcc_name(name)
84
+ if name.is_a?(Array)
85
+ bcc_name.concat(name)
86
+ else
87
+ bcc_name << name
88
+ end
21
89
  end
22
90
 
23
91
  def add_attachment(path, name = nil)
24
92
  file = File.new(path)
25
93
  name ||= File.basename(file)
26
- @attachments << {file: file, name: name}
94
+ attachments << {file: file, name: name}
95
+ end
96
+
97
+ def headers
98
+ @headers ||= {}
27
99
  end
28
100
 
101
+ def attachments
102
+ @attachments ||= []
103
+ end
104
+
105
+ def smtpapi
106
+ @smtpapi ||= Smtpapi::Header.new
107
+ end
108
+
109
+ # rubocop:disable Style/HashSyntax
29
110
  def to_h
30
111
  payload = {
31
- :from => @from,
32
- :fromname => @from_name,
33
- :subject => @subject,
34
- :to => @to,
35
- :toname => @to_name,
36
- :date => @date,
37
- :replyto => @reply_to,
38
- :cc => @cc,
39
- :bcc => @bcc,
40
- :text => @text,
41
- :html => @html,
42
- :'x-smtpapi' => @smtpapi.to_json,
43
- :files => ({} unless @attachments.empty?)
44
- }.reject {|k,v| v.nil?}
45
-
46
- # smtpapi fixer
47
- if @to.nil? and not @smtpapi.to.empty?
48
- payload[:to] = payload[:from]
49
- end
50
-
51
- unless @attachments.empty?
52
- @attachments.each do |file|
53
- payload[:files][file[:name]] = file[:file]
54
- end
55
- end
112
+ :from => from,
113
+ :fromname => from_name,
114
+ :subject => subject,
115
+ :to => to,
116
+ :toname => to_name,
117
+ :date => date,
118
+ :replyto => reply_to,
119
+ :cc => cc,
120
+ :bcc => bcc,
121
+ :text => text,
122
+ :html => html,
123
+ :'x-smtpapi' => smtpapi.to_json,
124
+ :files => ({} unless attachments.empty?)
125
+ }.reject {|_, v| v.nil? || v.empty?}
126
+
127
+ payload.delete(:'x-smtpapi') if payload[:'x-smtpapi'] == '{}'
128
+
129
+ payload[:to] = payload[:from] unless payload[:to].nil? && smtpapi.to.empty?
56
130
 
131
+ return payload if attachments.empty?
132
+
133
+ attachments.each do |file|
134
+ payload[:files][file[:name]] = file[:file]
135
+ end
57
136
  payload
58
137
  end
138
+ # rubocop:enable Style/HashSyntax
59
139
  end
60
140
  end
@@ -0,0 +1,14 @@
1
+ require 'json'
2
+
3
+ module SendGrid
4
+ class Response
5
+ attr_reader :code, :headers, :body, :raw_body
6
+
7
+ def initialize(params)
8
+ @code = params[:code]
9
+ @headers = params[:headers]
10
+ @body = JSON.parse(params[:body])
11
+ @raw_body = params[:body]
12
+ end
13
+ end
14
+ end
@@ -1,3 +1,3 @@
1
1
  module SendGrid
2
- VERSION = '0.0.3'
2
+ VERSION = '1.0.0.alpha.1'.freeze
3
3
  end
@@ -0,0 +1,5 @@
1
+ require_relative 'sendgrid/client'
2
+ require_relative 'sendgrid/exceptions'
3
+ require_relative 'sendgrid/mail'
4
+ require_relative 'sendgrid/response'
5
+ require_relative 'sendgrid/version'
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
9
9
  spec.authors = ['Robin Johnson', 'Eddie Zaneski']
10
10
  spec.email = 'community@sendgrid.com'
11
11
  spec.summary = 'Official SendGrid Gem'
12
- spec.description = 'Interact with SendGrids API in Native Ruby'
12
+ spec.description = 'Interact with SendGrids API in native Ruby'
13
13
  spec.homepage = 'http://github.com/sendgrid/sendgrid-ruby'
14
14
  spec.license = 'MIT'
15
15
 
@@ -18,12 +18,16 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(/^(test|spec|features)/)
19
19
  spec.require_paths = ['lib']
20
20
 
21
- spec.add_dependency 'smtpapi'
22
- spec.add_dependency 'rest-client'
21
+ spec.add_dependency 'smtpapi', '~> 0.1'
22
+ spec.add_dependency 'faraday', '~> 0.9'
23
23
  spec.add_development_dependency 'rake'
24
24
  spec.add_development_dependency 'rspec'
25
25
  spec.add_development_dependency 'rspec-nc'
26
+ spec.add_development_dependency 'webmock'
26
27
  spec.add_development_dependency 'guard'
27
28
  spec.add_development_dependency 'guard-rspec'
29
+ spec.add_development_dependency 'rubocop'
30
+ spec.add_development_dependency 'guard-rubocop'
31
+ spec.add_development_dependency 'ruby_gntp'
28
32
  spec.add_development_dependency 'bundler', '~> 1.6'
29
33
  end
@@ -0,0 +1,83 @@
1
+ require 'json'
2
+ require 'spec_helper'
3
+ require 'webmock/rspec'
4
+
5
+ describe 'SendGrid::Client' do
6
+ it 'should accept a username and password' do
7
+ expect(SendGrid::Client.new(api_user: 'test', api_key: 'test')).to be_an_instance_of(SendGrid::Client)
8
+ end
9
+
10
+ it 'should accept an api key' do
11
+ expect(SendGrid::Client.new(api_key: 'sendgrid_123')).to be_an_instance_of(SendGrid::Client)
12
+ end
13
+
14
+ it 'should build the default url' do
15
+ expect(SendGrid::Client.new.url).to eq('https://api.sendgrid.com')
16
+ end
17
+
18
+ it 'should build a custom url' do
19
+ expect(SendGrid::Client.new(port: 3000, host: 'foo.sendgrid.com', protocol: 'tacos').url).to eq('tacos://foo.sendgrid.com:3000')
20
+ end
21
+
22
+ it 'should use the default endpoint' do
23
+ expect(SendGrid::Client.new.endpoint).to eq('/api/mail.send.json')
24
+ end
25
+
26
+ describe ':send' do
27
+ it 'should make a request to sendgrid' do
28
+ stub_request(:any, 'https://api.sendgrid.com/api/mail.send.json')
29
+ .to_return(body: {message: 'success'}.to_json, status: 200, headers: {'X-TEST' => 'yes'})
30
+
31
+ client = SendGrid::Client.new(api_key: 'abc123')
32
+ mail = SendGrid::Mail.new
33
+ res = client.send(mail)
34
+ expect(res.code).to eq(200)
35
+ end
36
+
37
+ it 'should have an auth header when using an api key' do
38
+ stub_request(:any, 'https://api.sendgrid.com/api/mail.send.json')
39
+ .to_return(body: {message: 'success'}.to_json, status: 200, headers: {'X-TEST' => 'yes'})
40
+
41
+ client = SendGrid::Client.new(api_key: 'abc123')
42
+ mail = SendGrid::Mail.new
43
+
44
+ client.send(mail)
45
+
46
+ expect(WebMock).to have_requested(:post, 'https://api.sendgrid.com/api/mail.send.json')
47
+ .with(headers: {'Authorization' => 'Bearer abc123'})
48
+ end
49
+
50
+ it 'should have a username + password when using them' do
51
+ stub_request(:any, 'https://api.sendgrid.com/api/mail.send.json')
52
+ .to_return(body: {message: 'success'}.to_json, status: 200, headers: {'X-TEST' => 'yes'})
53
+
54
+ client = SendGrid::Client.new(api_user: 'foobar', api_key: 'abc123')
55
+ mail = SendGrid::Mail.new
56
+
57
+ client.send(mail)
58
+
59
+ expect(WebMock).to have_requested(:post, 'https://api.sendgrid.com/api/mail.send.json')
60
+ .with(body: 'api_key=abc123&api_user=foobar')
61
+ end
62
+
63
+ it 'should raise a SendGrid::Exception if status is not 200' do
64
+ stub_request(:any, 'https://api.sendgrid.com/api/mail.send.json')
65
+ .to_return(body: {message: 'error', errors: ['Bad username / password']}.to_json, status: 400, headers: {'X-TEST' => 'yes'})
66
+
67
+ client = SendGrid::Client.new(api_user: 'foobar', api_key: 'abc123')
68
+ mail = SendGrid::Mail.new
69
+
70
+ expect {client.send(mail)}.to raise_error(SendGrid::Exception)
71
+ end
72
+
73
+ it 'should not raise a SendGrid::Exception if raise_exceptions is disabled' do
74
+ stub_request(:any, 'https://api.sendgrid.com/api/mail.send.json')
75
+ .to_return(body: {message: 'error', errors: ['Bad username / password']}.to_json, status: 400, headers: {'X-TEST' => 'yes'})
76
+
77
+ client = SendGrid::Client.new(api_user: 'foobar', api_key: 'abc123', raise_exceptions: false)
78
+ mail = SendGrid::Mail.new
79
+
80
+ expect {client.send(mail)}.not_to raise_error
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,123 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'SendGrid::Mail' do
4
+ before(:each) do
5
+ @mail = SendGrid::Mail.new
6
+ end
7
+
8
+ it 'should create an instance' do
9
+ expect(SendGrid::Mail.new).to be_an_instance_of(SendGrid::Mail)
10
+ end
11
+
12
+ describe 'add_to_name' do
13
+ it 'should accept a name' do
14
+ @mail.add_to_name('Frank Foo')
15
+ expect(@mail.to_name).to eq(['Frank Foo'])
16
+ end
17
+
18
+ it 'should accept an array of names' do
19
+ @mail.add_to_name(['Frank Foo', 'Bob Bar'])
20
+ expect(@mail.to_name).to eq(['Frank Foo', 'Bob Bar'])
21
+ end
22
+ end
23
+
24
+ describe 'add_to' do
25
+ it 'should accept an email' do
26
+ @mail.add_to('foo@example.com')
27
+ expect(@mail.to).to eq(['foo@example.com'])
28
+
29
+ @mail.add_to('bar@example.com')
30
+ expect(@mail.to).to eq(['foo@example.com', 'bar@example.com'])
31
+ end
32
+
33
+ it 'should accept an email and name' do
34
+ @mail.add_to('foo@example.com', 'Frank Foo')
35
+ expect(@mail.to).to eq(['foo@example.com'])
36
+ expect(@mail.to_name).to eq(['Frank Foo'])
37
+
38
+ @mail.add_to('bar@example.com', 'Bob Bar')
39
+ expect(@mail.to).to eq(['foo@example.com', 'bar@example.com'])
40
+ expect(@mail.to_name).to eq(['Frank Foo', 'Bob Bar'])
41
+ end
42
+
43
+ it 'should accept an array of emails' do
44
+ @mail.add_to(['foo@example.com', 'bar@example.com'])
45
+ expect(@mail.to).to eq(['foo@example.com', 'bar@example.com'])
46
+ end
47
+
48
+ it 'should accept an array of emails and names' do
49
+ @mail.add_to(['foo@example.com', 'bar@example.com'], ['Frank Foo', 'Bob Bar'])
50
+ expect(@mail.to).to eq(['foo@example.com', 'bar@example.com'])
51
+ expect(@mail.to_name).to eq(['Frank Foo', 'Bob Bar'])
52
+ end
53
+ end
54
+
55
+ describe 'add_cc' do
56
+ it 'should accept an email' do
57
+ @mail.add_cc('foo@example.com')
58
+ expect(@mail.cc).to eq(['foo@example.com'])
59
+ end
60
+
61
+ it 'should accept an email and a name' do
62
+ @mail.add_cc('foo@example.com', 'Frank Foo')
63
+ expect(@mail.cc).to eq(['foo@example.com'])
64
+ expect(@mail.cc_name).to eq(['Frank Foo'])
65
+ end
66
+
67
+ it 'should accept an array of emails' do
68
+ @mail.add_cc(['foo@example.com', 'bar@example.com'])
69
+ expect(@mail.cc).to eq(['foo@example.com', 'bar@example.com'])
70
+ end
71
+
72
+ it 'should accept an array of emails and names' do
73
+ @mail.add_cc(['foo@example.com', 'bar@example.com'], ['Frank Foo', 'Bob Bar'])
74
+ expect(@mail.cc).to eq(['foo@example.com', 'bar@example.com'])
75
+ expect(@mail.cc_name).to eq(['Frank Foo', 'Bob Bar'])
76
+ end
77
+ end
78
+
79
+ describe 'add_bcc' do
80
+ it 'should accept an email' do
81
+ @mail.add_bcc('foo@example.com')
82
+ expect(@mail.bcc).to eq(['foo@example.com'])
83
+ end
84
+
85
+ it 'should accept an email and a name' do
86
+ @mail.add_bcc('foo@example.com', 'Frank Foo')
87
+ expect(@mail.bcc).to eq(['foo@example.com'])
88
+ expect(@mail.bcc_name).to eq(['Frank Foo'])
89
+ end
90
+
91
+ it 'should accept an array of emails' do
92
+ @mail.add_bcc(['foo@example.com', 'bar@example.com'])
93
+ expect(@mail.bcc).to eq(['foo@example.com', 'bar@example.com'])
94
+ end
95
+
96
+ it 'should accept an array of emails and names' do
97
+ @mail.add_bcc(['foo@example.com', 'bar@example.com'], ['Frank Foo', 'Bob Bar'])
98
+ expect(@mail.bcc).to eq(['foo@example.com', 'bar@example.com'])
99
+ expect(@mail.bcc_name).to eq(['Frank Foo', 'Bob Bar'])
100
+ end
101
+ end
102
+
103
+ describe 'to' do
104
+ it 'should be set' do
105
+ @mail.to = 'foo@example.com'
106
+ expect(@mail.to).to eq('foo@example.com')
107
+ end
108
+ end
109
+
110
+ describe 'from_name' do
111
+ it 'should be set' do
112
+ @mail.from_name = 'Frank Foo'
113
+ expect(@mail.from_name).to eq('Frank Foo')
114
+ end
115
+ end
116
+
117
+ describe 'reply_to' do
118
+ it 'should be set' do
119
+ @mail.reply_to = 'foo@example.com'
120
+ expect(@mail.reply_to).to eq('foo@example.com')
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'SendGrid' do
4
+ it 'should have a version' do
5
+ expect(SendGrid::VERSION).to eq('1.0.0.alpha.1')
6
+ end
7
+ end
@@ -0,0 +1 @@
1
+ require_relative '../lib/sendgrid_ruby'
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: 0.0.3
4
+ version: 1.0.0.alpha.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robin Johnson
@@ -9,16 +9,44 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-08-13 00:00:00.000000000 Z
12
+ date: 2015-06-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: smtpapi
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '0.1'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '0.1'
28
+ - !ruby/object:Gem::Dependency
29
+ name: faraday
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '0.9'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '0.9'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rake
16
44
  requirement: !ruby/object:Gem::Requirement
17
45
  requirements:
18
46
  - - ">="
19
47
  - !ruby/object:Gem::Version
20
48
  version: '0'
21
- type: :runtime
49
+ type: :development
22
50
  prerelease: false
23
51
  version_requirements: !ruby/object:Gem::Requirement
24
52
  requirements:
@@ -26,13 +54,13 @@ dependencies:
26
54
  - !ruby/object:Gem::Version
27
55
  version: '0'
28
56
  - !ruby/object:Gem::Dependency
29
- name: rest-client
57
+ name: rspec
30
58
  requirement: !ruby/object:Gem::Requirement
31
59
  requirements:
32
60
  - - ">="
33
61
  - !ruby/object:Gem::Version
34
62
  version: '0'
35
- type: :runtime
63
+ type: :development
36
64
  prerelease: false
37
65
  version_requirements: !ruby/object:Gem::Requirement
38
66
  requirements:
@@ -40,7 +68,7 @@ dependencies:
40
68
  - !ruby/object:Gem::Version
41
69
  version: '0'
42
70
  - !ruby/object:Gem::Dependency
43
- name: rake
71
+ name: rspec-nc
44
72
  requirement: !ruby/object:Gem::Requirement
45
73
  requirements:
46
74
  - - ">="
@@ -54,7 +82,7 @@ dependencies:
54
82
  - !ruby/object:Gem::Version
55
83
  version: '0'
56
84
  - !ruby/object:Gem::Dependency
57
- name: rspec
85
+ name: webmock
58
86
  requirement: !ruby/object:Gem::Requirement
59
87
  requirements:
60
88
  - - ">="
@@ -68,7 +96,7 @@ dependencies:
68
96
  - !ruby/object:Gem::Version
69
97
  version: '0'
70
98
  - !ruby/object:Gem::Dependency
71
- name: rspec-nc
99
+ name: guard
72
100
  requirement: !ruby/object:Gem::Requirement
73
101
  requirements:
74
102
  - - ">="
@@ -82,7 +110,7 @@ dependencies:
82
110
  - !ruby/object:Gem::Version
83
111
  version: '0'
84
112
  - !ruby/object:Gem::Dependency
85
- name: guard
113
+ name: guard-rspec
86
114
  requirement: !ruby/object:Gem::Requirement
87
115
  requirements:
88
116
  - - ">="
@@ -96,7 +124,35 @@ dependencies:
96
124
  - !ruby/object:Gem::Version
97
125
  version: '0'
98
126
  - !ruby/object:Gem::Dependency
99
- name: guard-rspec
127
+ name: rubocop
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ - !ruby/object:Gem::Dependency
141
+ name: guard-rubocop
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ type: :development
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ - !ruby/object:Gem::Dependency
155
+ name: ruby_gntp
100
156
  requirement: !ruby/object:Gem::Requirement
101
157
  requirements:
102
158
  - - ">="
@@ -123,23 +179,32 @@ dependencies:
123
179
  - - "~>"
124
180
  - !ruby/object:Gem::Version
125
181
  version: '1.6'
126
- description: Interact with SendGrids API in Native Ruby
182
+ description: Interact with SendGrids API in native Ruby
127
183
  email: community@sendgrid.com
128
184
  executables: []
129
185
  extensions: []
130
186
  extra_rdoc_files: []
131
187
  files:
132
188
  - ".gitignore"
189
+ - ".rspec"
190
+ - ".rubocop.yml"
191
+ - ".travis.yml"
133
192
  - Gemfile
134
193
  - Guardfile
135
194
  - LICENSE.txt
136
195
  - README.md
137
196
  - Rakefile
138
- - lib/sendgrid-ruby.rb
197
+ - lib/sendgrid/client.rb
139
198
  - lib/sendgrid/exceptions.rb
140
199
  - lib/sendgrid/mail.rb
200
+ - lib/sendgrid/response.rb
141
201
  - lib/sendgrid/version.rb
202
+ - lib/sendgrid_ruby.rb
142
203
  - sendgrid-ruby.gemspec
204
+ - spec/lib/sendgrid/client_spec.rb
205
+ - spec/lib/sendgrid/mail_spec.rb
206
+ - spec/lib/sendgrid_spec.rb
207
+ - spec/spec_helper.rb
143
208
  homepage: http://github.com/sendgrid/sendgrid-ruby
144
209
  licenses:
145
210
  - MIT
@@ -155,13 +220,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
155
220
  version: '0'
156
221
  required_rubygems_version: !ruby/object:Gem::Requirement
157
222
  requirements:
158
- - - ">="
223
+ - - ">"
159
224
  - !ruby/object:Gem::Version
160
- version: '0'
225
+ version: 1.3.1
161
226
  requirements: []
162
227
  rubyforge_project:
163
- rubygems_version: 2.4.1
228
+ rubygems_version: 2.4.5
164
229
  signing_key:
165
230
  specification_version: 4
166
231
  summary: Official SendGrid Gem
167
- test_files: []
232
+ test_files:
233
+ - spec/lib/sendgrid/client_spec.rb
234
+ - spec/lib/sendgrid/mail_spec.rb
235
+ - spec/lib/sendgrid_spec.rb
236
+ - spec/spec_helper.rb
data/lib/sendgrid-ruby.rb DELETED
@@ -1,43 +0,0 @@
1
- require_relative 'sendgrid/exceptions'
2
- require_relative 'sendgrid/mail'
3
- require_relative 'sendgrid/version'
4
-
5
- require 'rest-client'
6
-
7
- module SendGrid
8
- class Client
9
- attr_accessor :api_user, :api_key, :host, :endpoint
10
-
11
- def initialize(params = {})
12
- @api_user = params.fetch(:api_user, nil)
13
- @api_key = params.fetch(:api_key, nil)
14
- @host = params.fetch(:host, 'https://api.sendgrid.com')
15
- @endpoint = params.fetch(:endpoint, '/api/mail.send.json')
16
- @conn = params.fetch(:conn, create_conn)
17
- @user_agent = params.fetch(:user_agent, 'sendgrid/' + SendGrid::VERSION + ';ruby')
18
- yield self if block_given?
19
- raise SendGrid::Exception.new('api_user and api_key are required') unless @api_user && @api_key
20
- end
21
-
22
- def send(mail)
23
- payload = mail.to_h.merge({api_user: @api_user, api_key: @api_key})
24
- @conn[@endpoint].post(payload, {user_agent: @user_agent}) do |response, request, result|
25
- case response.code.to_s
26
- when /2\d\d/
27
- response
28
- when /4\d\d|5\d\d/
29
- raise SendGrid::Exception.new(response)
30
- else
31
- # TODO: What will reach this?
32
- "DEFAULT #{response.code} #{response}"
33
- end
34
- end
35
- end
36
-
37
- private
38
-
39
- def create_conn
40
- @conn = RestClient::Resource.new(@host)
41
- end
42
- end
43
- end