emailvision 2.1.22 → 2.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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=
@@ -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'
@@ -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 [:get, :post] HTTP verb to use for the API call
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(http_verb, method, parameters = {})
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.new "Cannot make an API call without a server name and an endpoint !"
91
+ raise Emailvision::Exception, "Cannot make an API call without a server name and an endpoint !"
87
92
  end
88
93
 
89
- # == Sanitize parameters ==
90
- parameters = Emailvision::Tools.sanitize_parameters(parameters)
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(http_verb, uri, parameters, body)
97
+ response = perform_request(request)
100
98
 
101
- extract_response(response)
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 prepare_uri(method, parameters)
157
- uri = base_uri + method
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(http_verb, uri, parameters, body)
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 < ::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
@@ -0,0 +1,10 @@
1
+ module Emailvision
2
+
3
+ # Malformed response
4
+ #
5
+ # This error is raised when the response from Emailvision
6
+ # cannot be parsed.
7
+ class MalformedResponse < Exception
8
+ end
9
+
10
+ end
@@ -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, http_verb)
9
+ def initialize(instance, request)
10
10
  @instance = instance
11
- @http_verb = http_verb
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
- @instance.call @http_verb, @uri.join('/'), @options
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,11 @@
1
+ module Emailvision
2
+
3
+ # Malformed response
4
+ #
5
+ # This error is raised when the response from Emailvision
6
+ # cannot be parsed.
7
+ class RequestError < Exception
8
+
9
+ end
10
+
11
+ 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
@@ -0,0 +1,10 @@
1
+ module Emailvision
2
+
3
+ # Session Error
4
+ #
5
+ # This error is raised when the token has expired
6
+ # or the number of connections has been reached
7
+ class SessionError < Exception
8
+ end
9
+
10
+ end
@@ -1,3 +1,3 @@
1
1
  module Emailvision
2
- Version = VERSION = '2.1.22'
2
+ Version = VERSION = '2.2'
3
3
  end
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.1.22
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-16 00:00:00.000000000 Z
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: '4.0'
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: '4.0'
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.8.23
117
+ rubygems_version: 2.1.4
122
118
  signing_key:
123
- specification_version: 3
119
+ specification_version: 4
124
120
  summary: Emailvision
125
121
  test_files: []
126
122
  has_rdoc: