gatling_gun 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -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: []