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