gatling_gun 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/.rvmrc +1 -0
- data/README.markdown +71 -0
- data/Rakefile +6 -0
- data/data/ca-bundle.crt +7989 -0
- data/gatling_gun.gemspec +30 -0
- data/lib/gatling_gun.rb +195 -0
- data/lib/gatling_gun/api_call.rb +25 -0
- data/lib/gatling_gun/response.rb +59 -0
- metadata +55 -0
data/gatling_gun.gemspec
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
DIR = File.dirname(__FILE__)
|
2
|
+
LIB = File.join(DIR, *%w[lib gatling_gun.rb])
|
3
|
+
VERSION = open(LIB) { |lib|
|
4
|
+
lib.each { |line|
|
5
|
+
if v = line[/^\s*VERSION\s*=\s*(['"])(\d\.\d\.\d)\1/, 2]
|
6
|
+
break v
|
7
|
+
end
|
8
|
+
}
|
9
|
+
}
|
10
|
+
|
11
|
+
SPEC = Gem::Specification.new do |s|
|
12
|
+
s.name = "gatling_gun"
|
13
|
+
s.version = VERSION
|
14
|
+
s.platform = Gem::Platform::RUBY
|
15
|
+
s.authors = ["James Edward Gray II"]
|
16
|
+
s.email = ["james@graysoftinc.com"]
|
17
|
+
s.homepage = "https://github.com/okrb/gatling_gun"
|
18
|
+
s.summary = "A Ruby library wrapping SendGrid's Newsletter API."
|
19
|
+
s.description = <<-END_DESCRIPTION.gsub(/\s+/, " ").strip
|
20
|
+
A library for working with SendGrid's Newsletter API. The code is intended
|
21
|
+
for managing and sending newletters.
|
22
|
+
END_DESCRIPTION
|
23
|
+
|
24
|
+
s.required_ruby_version = ">= 1.9.2"
|
25
|
+
s.required_rubygems_version = ">= 1.3.7"
|
26
|
+
|
27
|
+
s.files = `git ls-files`.split("\n")
|
28
|
+
# s.test_files = `git ls-files -- test/*.rb`.split("\n")
|
29
|
+
s.require_paths = %w[lib]
|
30
|
+
end
|
data/lib/gatling_gun.rb
ADDED
@@ -0,0 +1,195 @@
|
|
1
|
+
require "json"
|
2
|
+
require "net/https"
|
3
|
+
require "openssl"
|
4
|
+
require "time"
|
5
|
+
require "uri"
|
6
|
+
|
7
|
+
require "gatling_gun/api_call"
|
8
|
+
require "gatling_gun/response"
|
9
|
+
|
10
|
+
class GatlingGun
|
11
|
+
VERSION = "0.0.1"
|
12
|
+
|
13
|
+
def initialize(api_user, api_key)
|
14
|
+
@api_user = api_user
|
15
|
+
@api_key = api_key
|
16
|
+
end
|
17
|
+
|
18
|
+
###################
|
19
|
+
### Newsletters ###
|
20
|
+
###################
|
21
|
+
|
22
|
+
def add_newsletter(newsletter, details)
|
23
|
+
fail ArgumentError, "details must be a Hash" unless details.is_a? Hash
|
24
|
+
%w[identity subject].each do |field|
|
25
|
+
unless details[field.to_sym] or details[field]
|
26
|
+
fail ArgumentError, "#{field} is a required detail"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
unless details[:text] or details["text"] or
|
30
|
+
details[:html] or details["html"]
|
31
|
+
fail ArgumentError, "either text or html must be provided as a detail"
|
32
|
+
end
|
33
|
+
make_api_call("add", details.merge(name: newsletter))
|
34
|
+
end
|
35
|
+
|
36
|
+
def edit_newsletter(newsletter, details)
|
37
|
+
fail ArgumentError, "details must be a Hash" unless details.is_a? Hash
|
38
|
+
fail ArgumentError, "details cannot be empty" if details.empty?
|
39
|
+
make_api_call("edit", details.merge(name: newsletter))
|
40
|
+
end
|
41
|
+
|
42
|
+
def get_newsletter(newsletter)
|
43
|
+
make_api_call("edit", name: newsletter)
|
44
|
+
end
|
45
|
+
|
46
|
+
def list_newsletters(newsletter = nil)
|
47
|
+
parameters = { }
|
48
|
+
parameters[:name] = newsletter if newsletter
|
49
|
+
make_api_call("list", parameters)
|
50
|
+
end
|
51
|
+
|
52
|
+
def delete_newsletter(newsletter)
|
53
|
+
make_api_call("delete", name: newsletter)
|
54
|
+
end
|
55
|
+
|
56
|
+
#############
|
57
|
+
### Lists ###
|
58
|
+
#############
|
59
|
+
|
60
|
+
def add_list(list, details = { })
|
61
|
+
fail ArgumentError, "details must be a Hash" unless details.is_a? Hash
|
62
|
+
make_api_call("lists/add", details.merge(list: list))
|
63
|
+
end
|
64
|
+
|
65
|
+
def edit_list(list, details = { })
|
66
|
+
fail ArgumentError, "details must be a Hash" unless details.is_a? Hash
|
67
|
+
fail ArgumentError, "details cannot be empty" if details.empty?
|
68
|
+
make_api_call("lists/edit", details.merge(list: list))
|
69
|
+
end
|
70
|
+
|
71
|
+
def get_list(list = nil)
|
72
|
+
parameters = { }
|
73
|
+
parameters[:list] = list if list
|
74
|
+
make_api_call("lists/get", parameters)
|
75
|
+
end
|
76
|
+
alias_method :list_lists, :get_list
|
77
|
+
|
78
|
+
def delete_list(list)
|
79
|
+
make_api_call("lists/delete", list: list)
|
80
|
+
end
|
81
|
+
|
82
|
+
##############
|
83
|
+
### Emails ###
|
84
|
+
##############
|
85
|
+
|
86
|
+
def add_email(list, data)
|
87
|
+
json_data = case data
|
88
|
+
when Hash then data.to_json
|
89
|
+
when Array then data.map(&:to_json)
|
90
|
+
else fail ArgumentError,
|
91
|
+
"details must be a Hash or Array"
|
92
|
+
end
|
93
|
+
make_api_call("lists/email/add", list: list, data: json_data)
|
94
|
+
end
|
95
|
+
alias_method :add_emails, :add_email
|
96
|
+
|
97
|
+
def get_email(list, emails = nil)
|
98
|
+
parameters = {list: list}
|
99
|
+
parameters[:email] = emails if emails
|
100
|
+
make_api_call("lists/email/get", parameters)
|
101
|
+
end
|
102
|
+
alias_method :get_emails, :get_email
|
103
|
+
alias_method :list_emails, :get_email
|
104
|
+
|
105
|
+
def delete_email(list, emails)
|
106
|
+
make_api_call("lists/email/delete", list: list, email: emails)
|
107
|
+
end
|
108
|
+
alias_method :delete_emails, :delete_email
|
109
|
+
|
110
|
+
################
|
111
|
+
### Identity ###
|
112
|
+
################
|
113
|
+
|
114
|
+
def add_identity(identity, details)
|
115
|
+
fail ArgumentError, "details must be a Hash" unless details.is_a? Hash
|
116
|
+
%w[name email address city state zip country].each do |field|
|
117
|
+
unless details[field.to_sym] or details[field]
|
118
|
+
fail ArgumentError, "#{field} is a required detail"
|
119
|
+
end
|
120
|
+
end
|
121
|
+
make_api_call("identity/add", details.merge(identity: identity))
|
122
|
+
end
|
123
|
+
|
124
|
+
def edit_identity(identity, details)
|
125
|
+
fail ArgumentError, "details must be a Hash" unless details.is_a? Hash
|
126
|
+
fail ArgumentError, "details cannot be empty" if details.empty?
|
127
|
+
make_api_call("identity/edit", details.merge(identity: identity))
|
128
|
+
end
|
129
|
+
|
130
|
+
def get_identity(identity)
|
131
|
+
make_api_call("identity/get", identity: identity)
|
132
|
+
end
|
133
|
+
|
134
|
+
def list_identities(identity = nil)
|
135
|
+
parameters = { }
|
136
|
+
parameters[:identity] = identity if identity
|
137
|
+
make_api_call("identity/list", parameters)
|
138
|
+
end
|
139
|
+
|
140
|
+
def delete_identity(identity)
|
141
|
+
make_api_call("identity/delete", identity: identity)
|
142
|
+
end
|
143
|
+
|
144
|
+
##################
|
145
|
+
### Recipients ###
|
146
|
+
##################
|
147
|
+
|
148
|
+
def add_recipient(newsletter, list)
|
149
|
+
make_api_call("recipients/add", name: newsletter, list: list)
|
150
|
+
end
|
151
|
+
alias_method :add_recipients, :add_recipient
|
152
|
+
|
153
|
+
def get_recipient(newsletter)
|
154
|
+
make_api_call("recipients/get", name: newsletter)
|
155
|
+
end
|
156
|
+
alias_method :get_recipients, :get_recipient
|
157
|
+
alias_method :list_recipients, :get_recipient
|
158
|
+
|
159
|
+
def delete_recipient(newsletter, list)
|
160
|
+
make_api_call("recipients/delete", name: newsletter, list: list)
|
161
|
+
end
|
162
|
+
alias_method :delete_recipients, :delete_recipient
|
163
|
+
|
164
|
+
#################
|
165
|
+
### Schedules ###
|
166
|
+
#################
|
167
|
+
|
168
|
+
def add_schedule(newsletter, details = { })
|
169
|
+
parameters = {after: details[:after]}
|
170
|
+
parameters[:at] = details[:at].iso8601.sub("T", " ") \
|
171
|
+
if details[:at].respond_to? :iso8601
|
172
|
+
if not details[:after].nil? and ( not details[:after].is_a?(Integer) or
|
173
|
+
details[:after] < 1 )
|
174
|
+
fail ArgumentError, "after must be a positive integer"
|
175
|
+
end
|
176
|
+
make_api_call("schedule/add", parameters.merge(name: newsletter))
|
177
|
+
end
|
178
|
+
|
179
|
+
def get_schedule(newsletter)
|
180
|
+
make_api_call("schedule/get", name: newsletter)
|
181
|
+
end
|
182
|
+
|
183
|
+
def delete_schedule(newsletter)
|
184
|
+
make_api_call("schedule/delete", name: newsletter)
|
185
|
+
end
|
186
|
+
|
187
|
+
#######
|
188
|
+
private
|
189
|
+
#######
|
190
|
+
|
191
|
+
def make_api_call(action, parameters = { })
|
192
|
+
ApiCall.new( action, parameters.merge( api_user: @api_user,
|
193
|
+
api_key: @api_key ) ).response
|
194
|
+
end
|
195
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class GatlingGun
|
2
|
+
class ApiCall
|
3
|
+
BASE_URL = "https://sendgrid.com/api/newsletter"
|
4
|
+
CA_PATH = File.join(File.dirname(__FILE__), *%w[.. .. data ca-bundle.crt])
|
5
|
+
|
6
|
+
def initialize(action, parameters)
|
7
|
+
@action = action
|
8
|
+
@parameters = parameters
|
9
|
+
end
|
10
|
+
|
11
|
+
def response
|
12
|
+
url = URI.parse("#{BASE_URL}/#{@action}.json")
|
13
|
+
http = Net::HTTP.new(url.host, url.port)
|
14
|
+
http.use_ssl = true
|
15
|
+
http.ca_file = CA_PATH
|
16
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
17
|
+
http.verify_depth = 5
|
18
|
+
post = Net::HTTP::Post.new(url.path)
|
19
|
+
post.set_form_data(@parameters)
|
20
|
+
Response.new(http.start { |session| session.request(post) })
|
21
|
+
rescue => error
|
22
|
+
Response.new("error" => error.message)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
class GatlingGun
|
2
|
+
class Response
|
3
|
+
include Enumerable
|
4
|
+
|
5
|
+
def initialize(response)
|
6
|
+
if response.is_a? Hash
|
7
|
+
@success = false
|
8
|
+
@http_response_code = nil
|
9
|
+
@data = response
|
10
|
+
else
|
11
|
+
@success = response.is_a? Net::HTTPSuccess
|
12
|
+
@http_response_code = response.code
|
13
|
+
@data = parse(response.body)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_reader :http_response_code
|
18
|
+
|
19
|
+
def success?
|
20
|
+
@success
|
21
|
+
end
|
22
|
+
|
23
|
+
def error?
|
24
|
+
not success?
|
25
|
+
end
|
26
|
+
|
27
|
+
def error_messages
|
28
|
+
Array(self[:errors]) + Array(self[:error])
|
29
|
+
end
|
30
|
+
|
31
|
+
def [](field)
|
32
|
+
case @data
|
33
|
+
when Hash
|
34
|
+
@data[field.to_s]
|
35
|
+
when Array
|
36
|
+
@data[field]
|
37
|
+
else
|
38
|
+
nil
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def each(&iterator)
|
43
|
+
if @data.is_a? Enumerable
|
44
|
+
@data.each(&iterator)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
#######
|
49
|
+
private
|
50
|
+
#######
|
51
|
+
|
52
|
+
def parse(body)
|
53
|
+
JSON.parse(body)
|
54
|
+
rescue JSON::JSONError => error
|
55
|
+
@success = false
|
56
|
+
@data = {"error" => error.message}
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
metadata
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gatling_gun
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- James Edward Gray II
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-09-18 00:00:00.000000000Z
|
13
|
+
dependencies: []
|
14
|
+
description: A library for working with SendGrid's Newsletter API. The code is intended
|
15
|
+
for managing and sending newletters.
|
16
|
+
email:
|
17
|
+
- james@graysoftinc.com
|
18
|
+
executables: []
|
19
|
+
extensions: []
|
20
|
+
extra_rdoc_files: []
|
21
|
+
files:
|
22
|
+
- .gitignore
|
23
|
+
- .rvmrc
|
24
|
+
- README.markdown
|
25
|
+
- Rakefile
|
26
|
+
- data/ca-bundle.crt
|
27
|
+
- gatling_gun.gemspec
|
28
|
+
- lib/gatling_gun.rb
|
29
|
+
- lib/gatling_gun/api_call.rb
|
30
|
+
- lib/gatling_gun/response.rb
|
31
|
+
homepage: https://github.com/okrb/gatling_gun
|
32
|
+
licenses: []
|
33
|
+
post_install_message:
|
34
|
+
rdoc_options: []
|
35
|
+
require_paths:
|
36
|
+
- lib
|
37
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
38
|
+
none: false
|
39
|
+
requirements:
|
40
|
+
- - ! '>='
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 1.9.2
|
43
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
44
|
+
none: false
|
45
|
+
requirements:
|
46
|
+
- - ! '>='
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: 1.3.7
|
49
|
+
requirements: []
|
50
|
+
rubyforge_project:
|
51
|
+
rubygems_version: 1.7.2
|
52
|
+
signing_key:
|
53
|
+
specification_version: 3
|
54
|
+
summary: A Ruby library wrapping SendGrid's Newsletter API.
|
55
|
+
test_files: []
|