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.
@@ -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: []