gatling_gun 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 +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: []
|