emailvision 2.1.22 → 2.2
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.
- checksums.yaml +15 -0
- data/lib/emailvision.rb +6 -1
- data/lib/emailvision/api.rb +34 -80
- data/lib/emailvision/exception.rb +1 -15
- data/lib/emailvision/malformed_response.rb +10 -0
- data/lib/emailvision/relation.rb +5 -4
- data/lib/emailvision/request.rb +67 -0
- data/lib/emailvision/request_error.rb +11 -0
- data/lib/emailvision/response.rb +52 -0
- data/lib/emailvision/session_error.rb +10 -0
- data/lib/emailvision/version.rb +1 -1
- metadata +16 -20
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
YWY1ODBhM2MyNTZkYzdkZGQ5YWNhYTQwYWU0MzQ5Y2IzM2MxZGE4MA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
YjdmZDM5M2RlN2U2YzJjYjY2NDIxNWM0YWM1OTYxYWEyZGMwZWU4Mw==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
YmNhZDA1NTM2MDYzYzI4NWIyMTZlMTU1NzdmZWJiNWM2OTQzMmY5ZWE5YzBm
|
10
|
+
NjRiZmM2NTVjYzk5NjYzMjU4MzYwNzMzZjU4MTMxY2MxYjAwMDIwNjM1Nzc2
|
11
|
+
M2FmYjkwZDViOGI4ZGQ1ODNiODQzYjExZDUyNTIyZWE2MjMyNjg=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
YzMxNDhjOTNlMWM0ZGQ3NzMwNGVmMzYyMjIyOWQ1YmNiYzU2OTRhZjk3NmJl
|
14
|
+
Y2VlMTk0ZWJlYjAyN2I0NmVlOTQzNTI4YzhmMmRiMjdlZGUyMzVjMWRkNWMw
|
15
|
+
NGYwNzNmYzI5MDc4MDZjMmFjNTEyZWQ2OWY4YmVlOWJhNzFlY2Y=
|
data/lib/emailvision.rb
CHANGED
@@ -10,10 +10,15 @@ module Emailvision
|
|
10
10
|
autoload :Api, 'emailvision/api'
|
11
11
|
autoload :Exception, 'emailvision/exception'
|
12
12
|
autoload :Logger, 'emailvision/logger'
|
13
|
+
autoload :MalformedResponse, 'emailvision/malformed_response'
|
13
14
|
autoload :Relation, 'emailvision/relation'
|
15
|
+
autoload :Request, 'emailvision/request'
|
16
|
+
autoload :RequestError, 'emailvision/request_error'
|
17
|
+
autoload :Response, 'emailvision/response'
|
18
|
+
autoload :SessionError, 'emailvision/session_error'
|
14
19
|
autoload :Tools, 'emailvision/tools'
|
15
20
|
autoload :Notification, 'emailvision/notification'
|
16
|
-
autoload :Version, 'emailvision/version'
|
21
|
+
autoload :Version, 'emailvision/version'
|
17
22
|
|
18
23
|
if defined?(Rails)
|
19
24
|
require 'emailvision/railtie'
|
data/lib/emailvision/api.rb
CHANGED
@@ -30,6 +30,15 @@ module Emailvision
|
|
30
30
|
|
31
31
|
# ----------------- BEGIN Pre-configured methods -----------------
|
32
32
|
|
33
|
+
# Reset session
|
34
|
+
#
|
35
|
+
# Useful when the session has expired.
|
36
|
+
#
|
37
|
+
def reset_session
|
38
|
+
close_connection
|
39
|
+
open_connection
|
40
|
+
end
|
41
|
+
|
33
42
|
# Login to Emailvision API
|
34
43
|
#
|
35
44
|
# @return [Boolean] true if the connection has been established.
|
@@ -74,49 +83,20 @@ module Emailvision
|
|
74
83
|
|
75
84
|
# Perform an API call
|
76
85
|
#
|
77
|
-
# @param [
|
78
|
-
# @param [String] method to call on the API
|
79
|
-
# @param [Hash] request parameters (optionnal)
|
86
|
+
# @param [Emailvsion::Request] Request to perform
|
80
87
|
#
|
81
|
-
def call(
|
82
|
-
params ||= {}
|
83
|
-
|
88
|
+
def call(request)
|
84
89
|
# == Check presence of these essential attributes ==
|
85
90
|
unless server_name and endpoint
|
86
|
-
raise Emailvision::Exception
|
91
|
+
raise Emailvision::Exception, "Cannot make an API call without a server name and an endpoint !"
|
87
92
|
end
|
88
93
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
retries = 2
|
93
|
-
begin
|
94
|
-
uri = prepare_uri(method, parameters)
|
95
|
-
body = prepare_body(parameters)
|
96
|
-
|
97
|
-
logger.send "#{uri} with query : #{parameters} and body : #{body}"
|
94
|
+
with_retries do
|
95
|
+
logger.send "#{request.uri} with query : #{request.parameters} and body : #{request.body}"
|
98
96
|
|
99
|
-
response = perform_request(
|
97
|
+
response = perform_request(request)
|
100
98
|
|
101
|
-
|
102
|
-
rescue Emailvision::Exception => e
|
103
|
-
if e.message =~ /Your session has expired/ or e.message =~ /The maximum number of connection allowed per session has been reached/
|
104
|
-
self.close_connection
|
105
|
-
self.open_connection
|
106
|
-
if((retries -= 1) >= 0)
|
107
|
-
retry
|
108
|
-
else
|
109
|
-
raise e
|
110
|
-
end
|
111
|
-
else
|
112
|
-
raise e
|
113
|
-
end
|
114
|
-
rescue Errno::ECONNRESET, Timeout::Error => e
|
115
|
-
if((retries -= 1) >= 0)
|
116
|
-
retry
|
117
|
-
else
|
118
|
-
raise e
|
119
|
-
end
|
99
|
+
Emailvision::Response.new(response, logger).extract
|
120
100
|
end
|
121
101
|
end
|
122
102
|
|
@@ -147,57 +127,18 @@ module Emailvision
|
|
147
127
|
# Generate call-chain triggers
|
148
128
|
HTTP_VERBS.each do |http_verb|
|
149
129
|
define_method(http_verb) do
|
150
|
-
Emailvision::Relation.new(self, http_verb)
|
130
|
+
Emailvision::Relation.new(self, build_request(http_verb))
|
151
131
|
end
|
152
132
|
end
|
153
133
|
|
154
134
|
private
|
155
135
|
|
156
|
-
def
|
157
|
-
|
158
|
-
if parameters[:uri]
|
159
|
-
uri += token ? "/#{token}/" : '/'
|
160
|
-
uri += (parameters[:uri].respond_to?(:join) ? parameters[:uri] : [parameters[:uri]]).compact.join '/'
|
161
|
-
parameters.delete :uri
|
162
|
-
elsif parameters[:body]
|
163
|
-
uri += token ? "/#{token}/" : '/'
|
164
|
-
else
|
165
|
-
parameters[:token] = token
|
166
|
-
end
|
167
|
-
uri
|
168
|
-
end
|
169
|
-
|
170
|
-
def prepare_body(parameters)
|
171
|
-
body = parameters[:body] || {}
|
172
|
-
parameters.delete :body
|
173
|
-
# 2. Camelize all keys
|
174
|
-
body = Emailvision::Tools.r_camelize body
|
175
|
-
# 3. Convert to xml
|
176
|
-
Emailvision::Tools.to_xml_as_is body
|
136
|
+
def build_request(http_verb)
|
137
|
+
Emailvision::Request.new(http_verb, token, server_name, endpoint)
|
177
138
|
end
|
178
139
|
|
179
|
-
def perform_request(
|
180
|
-
self.class.send http_verb, uri, :query => parameters, :body => body, :timeout => 30
|
181
|
-
end
|
182
|
-
|
183
|
-
def extract_response(response)
|
184
|
-
http_code = response.header.code
|
185
|
-
content = {}
|
186
|
-
begin
|
187
|
-
content = Crack::XML.parse response.body
|
188
|
-
rescue MultiXml::ParseError => e
|
189
|
-
logger.send "#{uri} Error when parsing response body (#{e.to_s})"
|
190
|
-
end
|
191
|
-
logger.receive content.inspect
|
192
|
-
|
193
|
-
if (http_code == "200") and (content and content["response"])
|
194
|
-
response = content["response"]["result"] || content["response"]
|
195
|
-
else
|
196
|
-
raise Emailvision::Exception.new "#{http_code} - #{content}"
|
197
|
-
end
|
198
|
-
end
|
199
|
-
|
200
|
-
def format_response()
|
140
|
+
def perform_request(request)
|
141
|
+
self.class.send request.http_verb, base_uri + request.uri, :query => request.parameters, :body => request.body, :timeout => 30
|
201
142
|
end
|
202
143
|
|
203
144
|
def assign_attributes(parameters)
|
@@ -207,6 +148,19 @@ module Emailvision
|
|
207
148
|
end
|
208
149
|
end
|
209
150
|
|
151
|
+
def with_retries
|
152
|
+
retries = 3
|
153
|
+
begin
|
154
|
+
yield
|
155
|
+
rescue Errno::ECONNRESET, Timeout::Error => e
|
156
|
+
if ((retries -= 1) > 0)
|
157
|
+
retry
|
158
|
+
else
|
159
|
+
raise e
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
210
164
|
def logger
|
211
165
|
if @logger.nil?
|
212
166
|
@logger = Emailvision::Logger.new(STDOUT)
|
@@ -2,21 +2,7 @@ module Emailvision
|
|
2
2
|
|
3
3
|
# API default exception
|
4
4
|
#
|
5
|
-
class Exception < ::
|
6
|
-
|
7
|
-
attr_accessor :http_status, :error
|
8
|
-
|
9
|
-
# Initialize
|
10
|
-
#
|
11
|
-
# @param [Integer] HTTP status code
|
12
|
-
# @param [String] Error message
|
13
|
-
#
|
14
|
-
def initializer(http_status, error)
|
15
|
-
self.http_status = http_status
|
16
|
-
self.error = error
|
17
|
-
|
18
|
-
super("EMV API returns #{http_status} status code")
|
19
|
-
end
|
5
|
+
class Exception < ::StandardError
|
20
6
|
|
21
7
|
end
|
22
8
|
end
|
data/lib/emailvision/relation.rb
CHANGED
@@ -3,12 +3,12 @@ module Emailvision
|
|
3
3
|
# Relation is used for API-chained call
|
4
4
|
#
|
5
5
|
# e.g. emv.get.campaign.last(:limit => 5).call
|
6
|
-
#
|
6
|
+
#
|
7
7
|
class Relation
|
8
8
|
|
9
|
-
def initialize(instance,
|
9
|
+
def initialize(instance, request)
|
10
10
|
@instance = instance
|
11
|
-
@
|
11
|
+
@request = request
|
12
12
|
@uri = []
|
13
13
|
@options = {}
|
14
14
|
end
|
@@ -20,7 +20,8 @@ module Emailvision
|
|
20
20
|
#
|
21
21
|
def call(*args)
|
22
22
|
@options.merge! extract_args(args)
|
23
|
-
@
|
23
|
+
@request.prepare(@uri.join('/'), @options)
|
24
|
+
@instance.call(@request)
|
24
25
|
end
|
25
26
|
|
26
27
|
def method_missing(method, *args)
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module Emailvision
|
2
|
+
|
3
|
+
# Request object
|
4
|
+
#
|
5
|
+
# This class aims to format the request for Emailvision
|
6
|
+
#
|
7
|
+
class Request
|
8
|
+
|
9
|
+
attr_reader(
|
10
|
+
:http_verb,
|
11
|
+
:token,
|
12
|
+
:server_name,
|
13
|
+
:endpoint,
|
14
|
+
:uri,
|
15
|
+
:body,
|
16
|
+
:parameters
|
17
|
+
)
|
18
|
+
|
19
|
+
def initialize(http_verb, token, server_name, endpoint)
|
20
|
+
@http_verb = http_verb
|
21
|
+
@token = token
|
22
|
+
@server_name = server_name
|
23
|
+
@endpoint = endpoint
|
24
|
+
end
|
25
|
+
|
26
|
+
def prepare(uri, parameters)
|
27
|
+
@uri = uri
|
28
|
+
@parameters = parameters || {}
|
29
|
+
|
30
|
+
@uri = prepare_uri
|
31
|
+
@body = prepare_body
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def prepare_uri
|
37
|
+
uri = @uri
|
38
|
+
if parameters[:uri]
|
39
|
+
uri += token ? "/#{token}/" : '/'
|
40
|
+
uri += (parameters[:uri].respond_to?(:join) ? parameters[:uri] : [parameters[:uri]]).compact.join '/'
|
41
|
+
parameters.delete :uri
|
42
|
+
elsif parameters[:body]
|
43
|
+
uri += token ? "/#{token}/" : '/'
|
44
|
+
else
|
45
|
+
parameters[:token] = token
|
46
|
+
end
|
47
|
+
uri
|
48
|
+
end
|
49
|
+
|
50
|
+
def prepare_body
|
51
|
+
body = parameters[:body] || {}
|
52
|
+
parameters.delete :body
|
53
|
+
# 2. Camelize all keys
|
54
|
+
body = Emailvision::Tools.r_camelize body
|
55
|
+
# 3. Convert to xml
|
56
|
+
Emailvision::Tools.to_xml_as_is body
|
57
|
+
end
|
58
|
+
|
59
|
+
def assign_attributes(attibutes)
|
60
|
+
attibutes or return
|
61
|
+
attibutes.each do |attribute, value|
|
62
|
+
public_send("#{attribute}=", value)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Emailvision
|
2
|
+
|
3
|
+
# Response object
|
4
|
+
#
|
5
|
+
# This class aims to extract the response from Emailvision
|
6
|
+
#
|
7
|
+
class Response
|
8
|
+
|
9
|
+
attr_reader :response, :logger
|
10
|
+
|
11
|
+
def initialize(response, logger)
|
12
|
+
@response = response
|
13
|
+
@logger = logger
|
14
|
+
end
|
15
|
+
|
16
|
+
def extract
|
17
|
+
logger.receive(content.inspect)
|
18
|
+
|
19
|
+
if succeed?
|
20
|
+
response = content["response"]["result"] || content["response"]
|
21
|
+
else
|
22
|
+
handle_errors
|
23
|
+
end
|
24
|
+
rescue MultiXml::ParseError, REXML::ParseException => error
|
25
|
+
wrapped_error = Emailvision::MalformedResponse.new(error)
|
26
|
+
raise wrapped_error, "Error when parsing response body"
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def succeed?
|
32
|
+
(http_code == "200") and (content and content["response"])
|
33
|
+
end
|
34
|
+
|
35
|
+
def handle_errors
|
36
|
+
if content =~ /Your session has expired/ or content =~ /The maximum number of connection allowed per session has been reached/
|
37
|
+
raise Emailvision::SessionError, content
|
38
|
+
else
|
39
|
+
raise Emailvision::RequestError, content
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def content
|
44
|
+
@content ||= Crack::XML.parse(response.body)
|
45
|
+
end
|
46
|
+
|
47
|
+
def http_code
|
48
|
+
response.header.code
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
data/lib/emailvision/version.rb
CHANGED
metadata
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: emailvision
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
5
|
-
prerelease:
|
4
|
+
version: '2.2'
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Bastien Gysler
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-10
|
11
|
+
date: 2013-11-10 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: httparty
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
17
|
- - ~>
|
20
18
|
- !ruby/object:Gem::Version
|
@@ -22,7 +20,6 @@ dependencies:
|
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
24
|
- - ~>
|
28
25
|
- !ruby/object:Gem::Version
|
@@ -30,7 +27,6 @@ dependencies:
|
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: crack
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
31
|
- - ~>
|
36
32
|
- !ruby/object:Gem::Version
|
@@ -38,7 +34,6 @@ dependencies:
|
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
38
|
- - ~>
|
44
39
|
- !ruby/object:Gem::Version
|
@@ -46,7 +41,6 @@ dependencies:
|
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: builder
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
45
|
- - ! '>='
|
52
46
|
- !ruby/object:Gem::Version
|
@@ -54,7 +48,6 @@ dependencies:
|
|
54
48
|
type: :runtime
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
52
|
- - ! '>='
|
60
53
|
- !ruby/object:Gem::Version
|
@@ -62,25 +55,23 @@ dependencies:
|
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: activesupport
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
59
|
- - ! '>='
|
68
60
|
- !ruby/object:Gem::Version
|
69
61
|
version: '3.0'
|
70
|
-
- -
|
62
|
+
- - ~>
|
71
63
|
- !ruby/object:Gem::Version
|
72
|
-
version:
|
64
|
+
version: 4.0.0
|
73
65
|
type: :runtime
|
74
66
|
prerelease: false
|
75
67
|
version_requirements: !ruby/object:Gem::Requirement
|
76
|
-
none: false
|
77
68
|
requirements:
|
78
69
|
- - ! '>='
|
79
70
|
- !ruby/object:Gem::Version
|
80
71
|
version: '3.0'
|
81
|
-
- -
|
72
|
+
- - ~>
|
82
73
|
- !ruby/object:Gem::Version
|
83
|
-
version:
|
74
|
+
version: 4.0.0
|
84
75
|
description: REST API wrapper interacting with Emailvision
|
85
76
|
email: basgys@gmail.com
|
86
77
|
executables: []
|
@@ -90,37 +81,42 @@ files:
|
|
90
81
|
- lib/emailvision/api.rb
|
91
82
|
- lib/emailvision/exception.rb
|
92
83
|
- lib/emailvision/logger.rb
|
84
|
+
- lib/emailvision/malformed_response.rb
|
93
85
|
- lib/emailvision/notification.rb
|
94
86
|
- lib/emailvision/railtie.rb
|
95
87
|
- lib/emailvision/relation.rb
|
88
|
+
- lib/emailvision/request.rb
|
89
|
+
- lib/emailvision/request_error.rb
|
90
|
+
- lib/emailvision/response.rb
|
91
|
+
- lib/emailvision/session_error.rb
|
96
92
|
- lib/emailvision/tools.rb
|
97
93
|
- lib/emailvision/version.rb
|
98
94
|
- lib/emailvision.rb
|
99
95
|
- lib/generators/install.rb
|
100
96
|
- lib/generators/templates/emailvision.yml
|
101
97
|
homepage: http://github.com/basgys/emailvision
|
102
|
-
licenses:
|
98
|
+
licenses:
|
99
|
+
- MIT
|
100
|
+
metadata: {}
|
103
101
|
post_install_message:
|
104
102
|
rdoc_options: []
|
105
103
|
require_paths:
|
106
104
|
- lib
|
107
105
|
required_ruby_version: !ruby/object:Gem::Requirement
|
108
|
-
none: false
|
109
106
|
requirements:
|
110
107
|
- - ! '>='
|
111
108
|
- !ruby/object:Gem::Version
|
112
109
|
version: '0'
|
113
110
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
114
|
-
none: false
|
115
111
|
requirements:
|
116
112
|
- - ! '>='
|
117
113
|
- !ruby/object:Gem::Version
|
118
114
|
version: '0'
|
119
115
|
requirements: []
|
120
116
|
rubyforge_project:
|
121
|
-
rubygems_version: 1.
|
117
|
+
rubygems_version: 2.1.4
|
122
118
|
signing_key:
|
123
|
-
specification_version:
|
119
|
+
specification_version: 4
|
124
120
|
summary: Emailvision
|
125
121
|
test_files: []
|
126
122
|
has_rdoc:
|