sendgrid_web 0.0.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.
- data/.gitignore +17 -0
- data/.travis.yml +7 -0
- data/Gemfile +10 -0
- data/LICENSE.txt +22 -0
- data/README.md +72 -0
- data/Rakefile +5 -0
- data/bin/sendgrid_web +5 -0
- data/lib/sendgrid_web.rb +62 -0
- data/lib/sendgrid_web/request.rb +46 -0
- data/lib/sendgrid_web/utils.rb +35 -0
- data/lib/sendgrid_web/version.rb +3 -0
- data/lib/tasks/tests.rake +17 -0
- data/sendgrid_web.gemspec +21 -0
- data/test/integration/sendgrid_web_test.rb +66 -0
- data/test/test_helper.rb +1 -0
- metadata +86 -0
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Jeremiah Heller
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
# SendgridWeb
|
2
|
+
|
3
|
+
Ruby interface for working with SendGrid's Web (HTTP) API. Read more at http://docs.sendgrid.com/documentation/api/web-api/.
|
4
|
+
|
5
|
+
## Build Status [<img src="https://secure.travis-ci.org/inertialbit/sendgrid_web.png"/>](http://travis-ci.org/inertialbit/sendgrid_web)
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
gem 'sendgrid_web'
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install sendgrid_web
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
Something like the following would be nice.
|
24
|
+
|
25
|
+
### Configuration
|
26
|
+
|
27
|
+
SendgridWeb.configure do |config|
|
28
|
+
config.api_user = 'sendgrid-user'
|
29
|
+
config.api_key = 'sendgrid-secret'
|
30
|
+
end
|
31
|
+
|
32
|
+
### Running Programmatically
|
33
|
+
|
34
|
+
response = SendgridWeb.unsubscribes(:get, :xml) do |request|
|
35
|
+
request.option :timeout => 30
|
36
|
+
request.option :open_timeout => 30
|
37
|
+
request.header 'HTTP-HEADER' => 'value'
|
38
|
+
|
39
|
+
request.with_date # special to enforce api rule of required value of 1
|
40
|
+
|
41
|
+
request.param 'start_date' => 2012-07-31
|
42
|
+
request.param 'email' => 'me@test.com'
|
43
|
+
end
|
44
|
+
|
45
|
+
if response.success?
|
46
|
+
# do stuff...
|
47
|
+
else
|
48
|
+
# do other stuff...
|
49
|
+
end
|
50
|
+
|
51
|
+
### Running Manually
|
52
|
+
|
53
|
+
not implemented yet!!
|
54
|
+
|
55
|
+
$ sendgrid_web get unsubscribes --with-date --days 30 --start_date 2012-07-01 --end_date 2012-07-31 --limit 20 --offset 0 --email 'blah@test.com'
|
56
|
+
$ sendgrid_web delete unsubscribes.xml --email 'blah@test.com'
|
57
|
+
$ sendgrid_web delete unsubscribes.json --after 2012-07-01 --before 2012-07-31
|
58
|
+
$ sendgrid_web get bounces --with-date --days-ago 30 # default is json
|
59
|
+
|
60
|
+
## Todo
|
61
|
+
|
62
|
+
- more tests
|
63
|
+
- implement as Faraday middleware (support async calls)
|
64
|
+
- CLI
|
65
|
+
|
66
|
+
## Contributing
|
67
|
+
|
68
|
+
1. Fork it
|
69
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
70
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
71
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
72
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
data/bin/sendgrid_web
ADDED
data/lib/sendgrid_web.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
require "sendgrid_web/version"
|
2
|
+
require "sendgrid_web/request"
|
3
|
+
|
4
|
+
##
|
5
|
+
#
|
6
|
+
# Module to provide thin ruby API to SendGrid Web API.
|
7
|
+
# Uses Faraday to make requests. Currently supports synchronous calls only.
|
8
|
+
#
|
9
|
+
# Exposes both Sendgrid and Faraday interfaces.
|
10
|
+
#
|
11
|
+
module SendgridWeb
|
12
|
+
|
13
|
+
##
|
14
|
+
#
|
15
|
+
# Primary interface. Simply call the desired module directly on SendgridWeb
|
16
|
+
# and pass in the verb, format and a block to set any needed parameters.
|
17
|
+
#
|
18
|
+
# Example usage:
|
19
|
+
#
|
20
|
+
# # Make a request to SendGrid module, say Unsubscribes
|
21
|
+
# # fetching a specific email.
|
22
|
+
# faraday_response = SendgridWeb.unsubscribes(:get, :json) { request.param :email => 'me@test.com' }
|
23
|
+
#
|
24
|
+
# # Send an email.
|
25
|
+
# faraday_response = SendgridWeb.mail(:send, :xml) do
|
26
|
+
# request.param :to => 'me@test.com', :subject => 'Tada!', :from => 'you@test.com'
|
27
|
+
# request.param :text => 'sample message body'
|
28
|
+
# request.param :html => '<p>sample message body</p>'
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
def self.method_missing(resource, verb, format=:json, &block)
|
32
|
+
Request.configure do |request|
|
33
|
+
request.verb = verb
|
34
|
+
request.resource = resource
|
35
|
+
request.format = format
|
36
|
+
|
37
|
+
yield request
|
38
|
+
end
|
39
|
+
process
|
40
|
+
end
|
41
|
+
|
42
|
+
class << self
|
43
|
+
attr_accessor :host, :scheme, :api_namespace, :api_user, :api_key
|
44
|
+
|
45
|
+
def configure
|
46
|
+
yield self
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def self.process
|
53
|
+
url = URI.join(Request.url, Request.url_action).to_s
|
54
|
+
Faraday.get(url, Request.params, Request.headers)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
SendgridWeb.configure do |config|
|
59
|
+
config.scheme = "https"
|
60
|
+
config.host = "sendgrid.com"
|
61
|
+
config.api_namespace = "api"
|
62
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'sendgrid_web/utils'
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'faraday'
|
5
|
+
rescue LoadError => e
|
6
|
+
require 'rubygems'
|
7
|
+
require 'faraday'
|
8
|
+
p "Warning: requiring rubygems since faraday failed to load on it's own."
|
9
|
+
end
|
10
|
+
|
11
|
+
module SendgridWeb
|
12
|
+
module Request
|
13
|
+
class << self
|
14
|
+
attr_accessor :headers, :options, :callbacks
|
15
|
+
include URL
|
16
|
+
|
17
|
+
##
|
18
|
+
#
|
19
|
+
# Configure a Request. +@options+ and +@headers+ are
|
20
|
+
# passed through to Faraday.
|
21
|
+
#
|
22
|
+
def configure &block
|
23
|
+
@callbacks = {}
|
24
|
+
@headers = []
|
25
|
+
@options = []
|
26
|
+
|
27
|
+
unless SendgridWeb.api_user.nil? or SendgridWeb.api_key.nil?
|
28
|
+
param(:api_user => SendgridWeb.api_user)
|
29
|
+
param(:api_key => SendgridWeb.api_key)
|
30
|
+
end
|
31
|
+
|
32
|
+
yield self
|
33
|
+
end
|
34
|
+
|
35
|
+
def option(option)
|
36
|
+
@options ||= {}
|
37
|
+
@options.merge!(option)
|
38
|
+
end
|
39
|
+
|
40
|
+
def header(header)
|
41
|
+
@headers ||= {}
|
42
|
+
@headers.merge!(header)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module SendgridWeb
|
2
|
+
##
|
3
|
+
#
|
4
|
+
# Utility to assemble a URL for Sendgrid.
|
5
|
+
#
|
6
|
+
module URL
|
7
|
+
attr_accessor :url, :params, :format, :resource, :verb
|
8
|
+
|
9
|
+
def url
|
10
|
+
@url ||= "#{SendgridWeb.scheme}://#{SendgridWeb.host}/"
|
11
|
+
end
|
12
|
+
|
13
|
+
# Returns action portion of Sendgrid URL, e.g.
|
14
|
+
# "api/resource.verb.format"
|
15
|
+
def url_action
|
16
|
+
parts = []
|
17
|
+
parts << SendgridWeb.api_namespace
|
18
|
+
parts << [resource, verb, format].join('.')
|
19
|
+
parts.join('/')
|
20
|
+
end
|
21
|
+
|
22
|
+
# Add or overwrite a param in +@params+ hash.
|
23
|
+
# These are passed through to Faraday.
|
24
|
+
def param(param)
|
25
|
+
@params ||= {}
|
26
|
+
@params.merge!(param)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Convenience method to add param with
|
30
|
+
# strict Sendgrid requirements.
|
31
|
+
def with_date
|
32
|
+
param(:date => 1)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# run tests
|
2
|
+
begin
|
3
|
+
require 'rake/testtask'
|
4
|
+
rescue LoadError => e
|
5
|
+
end
|
6
|
+
|
7
|
+
if defined? Rake::TestTask
|
8
|
+
namespace :test do
|
9
|
+
SENDGRID_WEB_ROOT = File.expand_path(File.join(File.dirname(__FILE__), "..",".."))
|
10
|
+
Rake::TestTask.new(:sendgrid_web) do |t|
|
11
|
+
t.libs << "#{SENDGRID_WEB_ROOT}/test"
|
12
|
+
t.libs << "#{SENDGRID_WEB_ROOT}/lib"
|
13
|
+
t.pattern = "#{SENDGRID_WEB_ROOT}/test/**/*_test.rb"
|
14
|
+
t.verbose = true
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'sendgrid_web/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "sendgrid_web"
|
8
|
+
gem.version = SendgridWeb::VERSION
|
9
|
+
gem.authors = ["Jeremiah Heller"]
|
10
|
+
gem.email = ["jeremiah@inertialbit.net"]
|
11
|
+
gem.description = %q{Ruby interface for working with SendGrid's Web (HTTP) API. Read more at http://docs.sendgrid.com/documentation/api/web-api/.}
|
12
|
+
gem.summary = %q{Wraps SendGrid Web API and works with rack on ruby 1.8.7, 1.9.2, 1.9.3.}
|
13
|
+
gem.homepage = ""
|
14
|
+
|
15
|
+
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
|
+
gem.require_paths = ["lib"]
|
19
|
+
|
20
|
+
gem.add_dependency("faraday", ["= 0.8.4"])
|
21
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'cgi'
|
3
|
+
require 'uri'
|
4
|
+
require 'sendgrid_web'
|
5
|
+
|
6
|
+
class SendgridWebTest < Test::Unit::TestCase
|
7
|
+
def self.sendgrid_modules
|
8
|
+
[
|
9
|
+
{:bounces => [:get, :delete]},
|
10
|
+
{:blocks => [:get, :delete]},
|
11
|
+
{:parse => [:get, :set, :edit, :delete]},
|
12
|
+
{:filter => [:get, :activate, :deactivate, :setup, :getsettings]},
|
13
|
+
{:invalidemails => [:get, :delete]},
|
14
|
+
{:mail => [:send]},
|
15
|
+
{:profile => [:get, :set, :setUsername, :setPassword, :setEmail]},
|
16
|
+
{:spamreports => [:get, :delete]},
|
17
|
+
{:stats => [:get]},
|
18
|
+
{:unsubscribes => [:add, :get, :delete]}
|
19
|
+
]
|
20
|
+
end
|
21
|
+
|
22
|
+
def normalize_query(url)
|
23
|
+
url.query.split('&').map{|pair| k,v = pair.split('='); {k.to_sym => CGI.unescape(v)}}
|
24
|
+
end
|
25
|
+
|
26
|
+
sendgrid_modules.each do |sg_module|
|
27
|
+
define_method "test_#{sg_module}_wrapper" do
|
28
|
+
sg_module.each do |sg_module_name, sg_module_actions|
|
29
|
+
sg_module_actions.each do |action|
|
30
|
+
|
31
|
+
email = 'me@test.com'
|
32
|
+
start_date = '2012-07-31'
|
33
|
+
api_user = 'user'
|
34
|
+
api_key = 'secret'
|
35
|
+
expected_url = URI("https://sendgrid.com/api/#{sg_module_name}.#{action}.json?api_user=#{api_user}&api_key=#{api_key}&start_date=#{start_date}&email=#{email}")
|
36
|
+
|
37
|
+
SendgridWeb.configure do |config|
|
38
|
+
config.api_user = api_user
|
39
|
+
config.api_key = api_key
|
40
|
+
end
|
41
|
+
|
42
|
+
response = SendgridWeb.send(sg_module_name, action, :json) do |request|
|
43
|
+
request.with_date # special to enforce api rule of required value of 1
|
44
|
+
|
45
|
+
request.param :start_date => start_date
|
46
|
+
request.param :email => email
|
47
|
+
end
|
48
|
+
|
49
|
+
generated_url = response.env[:url]
|
50
|
+
|
51
|
+
%w(scheme host path).each do |part|
|
52
|
+
assert_equal(expected_url.send(part), generated_url.send(part), "generated #{part} didn't match expected")
|
53
|
+
end
|
54
|
+
|
55
|
+
generated_query = normalize_query(generated_url)
|
56
|
+
expected_query = normalize_query(expected_url)
|
57
|
+
|
58
|
+
expected_query.each do |param|
|
59
|
+
assert(generated_query.include?(param), "generated query missing #{param.inspect}")
|
60
|
+
end
|
61
|
+
|
62
|
+
end # sg_module_actions#each
|
63
|
+
end # sg_module#each
|
64
|
+
end # define_method
|
65
|
+
end # sendgrid_modules#each
|
66
|
+
end # SendgridWebTest
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'test/unit'
|
metadata
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sendgrid_web
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Jeremiah Heller
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-10-20 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: faraday
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - '='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.8.4
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - '='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.8.4
|
30
|
+
description: Ruby interface for working with SendGrid's Web (HTTP) API. Read more
|
31
|
+
at http://docs.sendgrid.com/documentation/api/web-api/.
|
32
|
+
email:
|
33
|
+
- jeremiah@inertialbit.net
|
34
|
+
executables:
|
35
|
+
- sendgrid_web
|
36
|
+
extensions: []
|
37
|
+
extra_rdoc_files: []
|
38
|
+
files:
|
39
|
+
- .gitignore
|
40
|
+
- .travis.yml
|
41
|
+
- Gemfile
|
42
|
+
- LICENSE.txt
|
43
|
+
- README.md
|
44
|
+
- Rakefile
|
45
|
+
- bin/sendgrid_web
|
46
|
+
- lib/sendgrid_web.rb
|
47
|
+
- lib/sendgrid_web/request.rb
|
48
|
+
- lib/sendgrid_web/utils.rb
|
49
|
+
- lib/sendgrid_web/version.rb
|
50
|
+
- lib/tasks/tests.rake
|
51
|
+
- sendgrid_web.gemspec
|
52
|
+
- test/integration/sendgrid_web_test.rb
|
53
|
+
- test/test_helper.rb
|
54
|
+
homepage: ''
|
55
|
+
licenses: []
|
56
|
+
post_install_message:
|
57
|
+
rdoc_options: []
|
58
|
+
require_paths:
|
59
|
+
- lib
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
segments:
|
67
|
+
- 0
|
68
|
+
hash: 2860537481081348625
|
69
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
|
+
none: false
|
71
|
+
requirements:
|
72
|
+
- - ! '>='
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
segments:
|
76
|
+
- 0
|
77
|
+
hash: 2860537481081348625
|
78
|
+
requirements: []
|
79
|
+
rubyforge_project:
|
80
|
+
rubygems_version: 1.8.24
|
81
|
+
signing_key:
|
82
|
+
specification_version: 3
|
83
|
+
summary: Wraps SendGrid Web API and works with rack on ruby 1.8.7, 1.9.2, 1.9.3.
|
84
|
+
test_files:
|
85
|
+
- test/integration/sendgrid_web_test.rb
|
86
|
+
- test/test_helper.rb
|