emailyak 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,3 @@
1
+ module Emailyak
2
+ VERSION = "0.0.1"
3
+ end
data/lib/emailyak.rb ADDED
@@ -0,0 +1,220 @@
1
+ require 'cgi'
2
+ require 'set'
3
+
4
+ require 'rubygems'
5
+ require 'json'
6
+ require 'openssl'
7
+ require 'rest_client'
8
+
9
+ # A lot of the structure here is borrowed from the Stripe Ruby
10
+ # bindings (https://github.com/stripe/stripe-ruby).
11
+
12
+ # Further adapted from https://github.com/gdb/emailyak-ruby
13
+ # because I couldn't get it to install on heroku and
14
+ # I wanted to add to it
15
+ module EmailYak
16
+ # @@version = '0.0.1'
17
+ @@ssl_bundle_path = File.join(File.dirname(__FILE__), 'data/ca-certificates.crt')
18
+ @@api_key = nil
19
+ @@api_base = 'https://api.emailyak.com/v1'
20
+ @@verify_ssl_certs = true
21
+
22
+ module Util
23
+ def self.file_readable(file)
24
+ begin
25
+ File.open(file) { |f| }
26
+ rescue
27
+ false
28
+ else
29
+ true
30
+ end
31
+ end
32
+ end
33
+
34
+ class EmailYakError < StandardError; end
35
+ class APIConnectionError < EmailYakError; end
36
+ class APIResponseCodeError < EmailYakError
37
+ attr_reader :rcode, :rbody
38
+
39
+ def initialize(message, rcode, rbody)
40
+ super(message)
41
+ @rcody = rcode
42
+ @rbody = rbody
43
+ end
44
+ end
45
+
46
+ def self.api_url(url=''); [@@api_base, api_key, 'json', url].join('/'); end
47
+ def self.api_key=(api_key); @@api_key = api_key; end
48
+ def self.api_key; @@api_key; end
49
+ def self.api_base=(api_base); @@api_base = api_base; end
50
+ def self.api_base; @@api_base; end
51
+ def self.verify_ssl_certs=(verify); @@verify_ssl_certs = verify; end
52
+ def self.verify_ssl_certs; @@verify_ssl_certs; end
53
+ # def self.version; @@version; end
54
+
55
+ module Email
56
+ def self.all(params={})
57
+ EmailYak.request(:get, 'get/all/email/', nil, params)
58
+ end
59
+
60
+ def self.get(params={})
61
+ EmailYak.request(:get, 'get/email/', nil, params)
62
+ end
63
+
64
+ def self.list(params={})
65
+ EmailYak.request(:get, 'get/email/list/', nil, params)
66
+ end
67
+
68
+ def self.new(params={})
69
+ EmailYak.request(:get, 'get/new/email/', nil, params)
70
+ end
71
+
72
+ def self.delete(params={})
73
+ EmailYak.request(:post, 'delete/email/', nil, params)
74
+ end
75
+
76
+ def self.send(params={})
77
+ EmailYak.request(:post, 'send/email/', nil, params)
78
+ end
79
+ end
80
+
81
+ module Address
82
+ def self.register(params={})
83
+ EmailYak.request(:post, 'register/address/', nil, params)
84
+ end
85
+ end
86
+
87
+ module Domain
88
+ def self.register(params={})
89
+ EmailYak.request(:post, 'register/domain/', nil, params)
90
+ end
91
+ end
92
+
93
+ def self.request(method, url, api_key, params=nil, headers={})
94
+ api_key ||= @@api_key
95
+ raise EmailYakError.new('No API key provided. (HINT: set your API key using "EmailYak.api_key = <API-KEY>".') unless api_key
96
+
97
+ if !verify_ssl_certs
98
+ unless @no_verify
99
+ $stderr.puts "WARNING: Running without SSL cert verification. Execute 'EmailYak.verify_ssl_certs = true' to enable verification."
100
+ @no_verify = true
101
+ end
102
+ ssl_opts = { :verify_ssl => false }
103
+ elsif !Util.file_readable(@@ssl_bundle_path)
104
+ unless @no_bundle
105
+ $stderr.puts "WARNING: Running without SSL cert verification because #{@@ssl_bundle_path} isn't readable"
106
+ @no_bundle = true
107
+ end
108
+ ssl_opts = { :verify_ssl => false }
109
+ else
110
+ ssl_opts = {
111
+ :verify_ssl => OpenSSL::SSL::VERIFY_PEER,
112
+ :ssl_ca_file => @@ssl_bundle_path
113
+ }
114
+ end
115
+
116
+ case method.to_s.downcase.to_sym
117
+ when :get, :head, :delete
118
+ # Make params into GET parameters
119
+ headers = { :params => params }.merge(headers)
120
+ payload = nil
121
+ else
122
+ payload = params
123
+ end
124
+ opts = {
125
+ :method => method,
126
+ :url => self.api_url(url),
127
+ :user => api_key,
128
+ :headers => headers,
129
+ :open_timeout => 30,
130
+ :payload => payload,
131
+ :timeout => 80
132
+ }.merge(ssl_opts)
133
+
134
+ begin
135
+ response = execute_request(opts)
136
+ rescue SocketError => e
137
+ self.handle_restclient_error(e)
138
+ rescue NoMethodError => e
139
+ # Work around RestClient bug
140
+ if e.message =~ /\WRequestFailed\W/
141
+ e = APIConnectionError.new('Unexpected HTTP response code')
142
+ self.handle_restclient_error(e)
143
+ else
144
+ raise
145
+ end
146
+ rescue RestClient::ExceptionWithResponse => e
147
+ if rcode = e.http_code and rbody = e.http_body
148
+ self.handle_api_error(rcode, rbody)
149
+ else
150
+ self.handle_restclient_error(e)
151
+ end
152
+ rescue RestClient::Exception, Errno::ECONNREFUSED => e
153
+ self.handle_restclient_error(e)
154
+ end
155
+
156
+ rbody = response.body
157
+ rcode = response.code
158
+ begin
159
+ resp = JSON.parse(rbody, :symbolize_names => true)
160
+ rescue JSON::ParseError
161
+ raise APIError.new("Invalid response object from API: #{rbody.inspect} (HTTP response code was #{rcode})")
162
+ end
163
+
164
+ [resp, api_key]
165
+ end
166
+
167
+ private
168
+
169
+ def self.execute_request(opts)
170
+ RestClient::Request.execute(opts)
171
+ end
172
+
173
+ def self.handle_api_error(rcode, rbody)
174
+ case rcode
175
+ when 402
176
+ raise APIResponseCodeError.new('Invalid JSON/XML. Malformed JSON/XML syntax.', rcode, rbody)
177
+ when 403
178
+ raise APIResponseCodeError.new('Permission denied.', rcode, rbody)
179
+ when 420
180
+ raise APIResponseCodeError.new('Internal Error. There was an error in the system.', rcode, rbody)
181
+ when 421
182
+ raise APIResponseCodeError.new('Input Parameter Error.', rcode, rbody)
183
+ when 423
184
+ raise APIResponseCodeError.new('API key does not exist.', rcode, rbody)
185
+ when 424
186
+ raise APIResponseCodeError.new('Account disabled.', rcode, rbody)
187
+ when 426
188
+ raise APIResponseCodeError.new('Domain has been disabled.', rcode, rbody)
189
+ when 427
190
+ raise APIResponseCodeError.new('The domain is not registered with Email Yak.', rcode, rbody)
191
+ when 428
192
+ raise APIResponseCodeError.new('The requested record is not found.', rcode, rbody)
193
+ when 430
194
+ raise APIResponseCodeError.new('Account not allowed access to requested version of API.', rcode, rbody)
195
+ when 431
196
+ raise APIResponseCodeError.new('Invalid Response Format. In the url, specify ../json/.. or ../xml/..', rcode, rbody)
197
+ when 432
198
+ raise APIResponseCodeError.new('Invalid when 431(Request Format. Needs to be JSON or XML.', rcode, rbody)
199
+ when 503
200
+ raise APIResponseCodeError.new('Service is Temporarily Down. Please stand by.', rcode, rbody)
201
+ else
202
+ raise APIResponseCodeError.new("Unrecognized return code #{rcode}", rcode, rbody)
203
+ end
204
+ end
205
+
206
+ def self.handle_restclient_error(e)
207
+ case e
208
+ when RestClient::ServerBrokeConnection, RestClient::RequestTimeout
209
+ message = "Could not connect to EmailYak (#{@@api_base}). Please check your internet connection and try again."
210
+ when RestClient::SSLCertificateNotVerified
211
+ message = "Could not verify EmailYak's SSL certificate. Please make sure that your network is not intercepting certificates."
212
+ when SocketError
213
+ message = "Unexpected error communicating when trying to connect to EmailYak. HINT: You may be seeing this message because your DNS is not working. To check, try running 'host emailyak.com' from the command line."
214
+ else
215
+ message = "Unexpected error communicating with EmailYak."
216
+ end
217
+ message += "\n\n(Network error: #{e.message})"
218
+ raise APIConnectionError.new(message)
219
+ end
220
+ end
metadata ADDED
@@ -0,0 +1,104 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: emailyak
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Scott Ballantyne
14
+ - Greg Brockman
15
+ autorequire:
16
+ bindir: bin
17
+ cert_chain: []
18
+
19
+ date: 2011-10-02 00:00:00 +08:00
20
+ default_executable:
21
+ dependencies:
22
+ - !ruby/object:Gem::Dependency
23
+ name: rest-client
24
+ prerelease: false
25
+ requirement: &id001 !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ">="
29
+ - !ruby/object:Gem::Version
30
+ hash: 3
31
+ segments:
32
+ - 0
33
+ version: "0"
34
+ type: :runtime
35
+ version_requirements: *id001
36
+ - !ruby/object:Gem::Dependency
37
+ name: json
38
+ prerelease: false
39
+ requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ hash: 3
45
+ segments:
46
+ - 0
47
+ version: "0"
48
+ type: :runtime
49
+ version_requirements: *id002
50
+ description: making several different emailyak projects into a gem description
51
+ email:
52
+ - ussballantyne@gmail.cm
53
+ - gdb@gregbrockman.com
54
+ executables: []
55
+
56
+ extensions: []
57
+
58
+ extra_rdoc_files: []
59
+
60
+ files:
61
+ - .gitignore
62
+ - Gemfile
63
+ - Gemfile.lock
64
+ - Rakefile
65
+ - emailyak.gemspec
66
+ - lib/data/ca-certificates.crt
67
+ - lib/emailyak.rb
68
+ - lib/emailyak/version.rb
69
+ has_rdoc: true
70
+ homepage: ""
71
+ licenses: []
72
+
73
+ post_install_message:
74
+ rdoc_options: []
75
+
76
+ require_paths:
77
+ - lib
78
+ required_ruby_version: !ruby/object:Gem::Requirement
79
+ none: false
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ hash: 3
84
+ segments:
85
+ - 0
86
+ version: "0"
87
+ required_rubygems_version: !ruby/object:Gem::Requirement
88
+ none: false
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ hash: 3
93
+ segments:
94
+ - 0
95
+ version: "0"
96
+ requirements: []
97
+
98
+ rubyforge_project: emailyak
99
+ rubygems_version: 1.3.7
100
+ signing_key:
101
+ specification_version: 3
102
+ summary: making several different emailyak projects into a gem
103
+ test_files: []
104
+