mangopay 3.0.19 → 3.0.20

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b83a705cc7f7ea7dd6954de6b6b0ff58f44c5170
4
- data.tar.gz: 3d8eaabef7fce1e401810458ec9010366a5832c3
3
+ metadata.gz: 59eb15c892bf9c2910edac5e22503bfcf6b9dcac
4
+ data.tar.gz: 8457994e7e6dc82e85c826846b2f5406a484e729
5
5
  SHA512:
6
- metadata.gz: 1bf56bfe55dfdec69bd83df86a5fe9be1d758af762d5f2c96674b0dd988242ecd85058493013ee8c584b4648311c3aa610bec1304d8da1856139b2167aacb4b4
7
- data.tar.gz: 5426a2cbec6a3191a4db3253e52dc54f5b3ba5f0f9c8541be07479285d13db7ad421477ec5ebad2a56fa00062b4907471b465d7783f9936f7d821c7f6eb5d10b
6
+ metadata.gz: 3722786d484342d20e913a2b3836b38b5239603c53225e2816d90995b60c61ef1d8409fd91528cbf98ae0eb7b96446f6070f7c4fef58747c226c2e157042eeb1
7
+ data.tar.gz: c49c240cf33683a926ee11525c5c20d162c28cf494880feff76cbe57a611e51478708791ee4a8eeda6f7fc63c243d11417f8b841b8491ac6483187b304608ba8
data/lib/mangopay.rb CHANGED
@@ -74,15 +74,22 @@ module MangoPay
74
74
  # - +url+: the part after Configuration#root_url
75
75
  # - +params+: hash; entity data for creation, update etc.; will dump it by JSON and assign to Net::HTTPRequest#body
76
76
  # - +filters+: hash; pagination params etc.; will encode it by URI and assign to URI#query
77
- # - +headers+: hash; request_headers by default
77
+ # - +headers_or_idempotency_key+: hash of headers; or replaced by request_headers if nil; or added to request_headers as idempotency key otherwise (see https://docs.mangopay.com/api-references/idempotency-support/)
78
78
  # - +before_request_proc+: optional proc; will call it passing the Net::HTTPRequest instance just before Net::HTTPRequest#request
79
79
  #
80
80
  # Raises MangoPay::ResponseError if response code != 200.
81
81
  #
82
- def request(method, url, params={}, filters={}, headers = request_headers, before_request_proc = nil)
82
+ def request(method, url, params={}, filters={}, headers_or_idempotency_key = nil, before_request_proc = nil)
83
83
  uri = api_uri(url)
84
84
  uri.query = URI.encode_www_form(filters) unless filters.empty?
85
85
 
86
+ if headers_or_idempotency_key.is_a?(Hash)
87
+ headers = headers_or_idempotency_key
88
+ else
89
+ headers = request_headers
90
+ headers['Idempotency-Key'] = headers_or_idempotency_key if headers_or_idempotency_key != nil
91
+ end
92
+
86
93
  res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
87
94
  req = Net::HTTP::const_get(method.capitalize).new(uri.request_uri, headers)
88
95
  req.body = JSON.dump(params)
@@ -93,7 +100,6 @@ module MangoPay
93
100
  # decode json data
94
101
  data = JSON.load(res.body.to_s) rescue {}
95
102
 
96
-
97
103
  unless res.is_a?(Net::HTTPOK)
98
104
  raise MangoPay::ResponseError.new(uri, res.code, data)
99
105
  end
@@ -106,6 +112,13 @@ module MangoPay
106
112
  data
107
113
  end
108
114
 
115
+ # Retrieve a previous response by idempotency_key
116
+ # See https://docs.mangopay.com/api-references/idempotency-support/
117
+ def fetch_response(idempotency_key)
118
+ url = "#{api_path}/responses/#{idempotency_key}"
119
+ request(:get, url)
120
+ end
121
+
109
122
  private
110
123
 
111
124
  def user_agent
@@ -4,9 +4,9 @@ module MangoPay
4
4
  class BankAccount < Resource
5
5
  include HTTPCalls::Fetch
6
6
  class << self
7
- def create(user_id, params)
7
+ def create(user_id, params, idempotency_key = nil)
8
8
  type = params.fetch(:Type) { |no_symbol_key| params.fetch('Type') }
9
- MangoPay.request(:post, "#{url(user_id)}/#{type}", params)
9
+ MangoPay.request(:post, "#{url(user_id)}/#{type}", params, {}, idempotency_key)
10
10
  end
11
11
 
12
12
  # Fetches:
@@ -51,9 +51,9 @@ module MangoPay
51
51
  end
52
52
 
53
53
  # +params+: hash; see https://docs.mangopay.com/api-references/disputes/settlement-transfers/
54
- def create_settlement_transfer(repudiation_id, params)
54
+ def create_settlement_transfer(repudiation_id, params, idempotency_key = nil)
55
55
  url = "#{MangoPay.api_path}/repudiations/#{repudiation_id}/settlementtransfer/"
56
- MangoPay.request(:post, url, params)
56
+ MangoPay.request(:post, url, params, {}, idempotency_key)
57
57
  end
58
58
 
59
59
  #####################################################
@@ -61,9 +61,9 @@ module MangoPay
61
61
  #####################################################
62
62
 
63
63
  # +params+: hash; see https://docs.mangopay.com/api-references/disputes/dispute-documents/
64
- def create_document(dispute_id, params)
64
+ def create_document(dispute_id, params, idempotency_key = nil)
65
65
  url = url(dispute_id) + "/documents/"
66
- MangoPay.request(:post, url, params)
66
+ MangoPay.request(:post, url, params, {}, idempotency_key)
67
67
  end
68
68
 
69
69
  def fetch_document(document_id)
@@ -105,7 +105,7 @@ module MangoPay
105
105
  # - Base64 encoded file content
106
106
  # - or nil: in this case pass the file path in the next param
107
107
  #
108
- def create_document_page(dispute_id, document_id, file_content_base64, file_path = nil)
108
+ def create_document_page(dispute_id, document_id, file_content_base64, file_path = nil, idempotency_key = nil)
109
109
  if file_content_base64.nil? && !file_path.nil?
110
110
  bts = File.open(file_path, 'rb') { |f| f.read }
111
111
  file_content_base64 = Base64.encode64(bts)
@@ -113,7 +113,7 @@ module MangoPay
113
113
  # normally it returns 204 HTTP code on success
114
114
  begin
115
115
  url = url(dispute_id) + "/documents/#{document_id}/pages"
116
- MangoPay.request(:post, url, {'File' => file_content_base64})
116
+ MangoPay.request(:post, url, {'File' => file_content_base64}, {}, idempotency_key)
117
117
  rescue ResponseError => ex
118
118
  raise ex unless ex.code == '204'
119
119
  end
@@ -3,9 +3,14 @@ module MangoPay
3
3
  module Create
4
4
  module ClassMethods
5
5
 
6
- def create(*id, params)
7
- id = id.empty? ? nil : id[0]
8
- MangoPay.request(:post, url(id), params)
6
+ def create(params, id = nil, idempotency_key = nil)
7
+ # LEGACY SUPPORT FOR OLD SIGNATURE: def create(*id, params)
8
+ if !params.is_a?(Hash) && id.is_a?(Hash)
9
+ temp = params
10
+ params = id
11
+ id = temp
12
+ end
13
+ MangoPay.request(:post, url(id), params, {}, idempotency_key)
9
14
  end
10
15
  end
11
16
 
@@ -67,8 +72,8 @@ module MangoPay
67
72
 
68
73
  # See http://docs.mangopay.com/api-references/refund/%E2%80%A2-refund-a-pay-in/
69
74
  # See http://docs.mangopay.com/api-references/refund/%E2%80%A2-refund-a-transfer/
70
- def refund(id = nil, params = {})
71
- MangoPay.request(:post, url(id) + '/refunds', params)
75
+ def refund(id = nil, params = {}, idempotency_key = nil)
76
+ MangoPay.request(:post, url(id) + '/refunds', params, {}, idempotency_key)
72
77
  end
73
78
  end
74
79
 
@@ -5,8 +5,8 @@ module MangoPay
5
5
  # See http://docs.mangopay.com/api-references/kyc/documents/
6
6
  class KycDocument < Resource
7
7
  class << self
8
- def create(user_id, params)
9
- MangoPay.request(:post, url(user_id), params)
8
+ def create(user_id, params, idempotency_key = nil)
9
+ MangoPay.request(:post, url(user_id), params, {}, idempotency_key)
10
10
  end
11
11
 
12
12
  def update(user_id, document_id, params = {})
@@ -44,14 +44,14 @@ module MangoPay
44
44
  # - Base64 encoded file content
45
45
  # - or nil: in this case pass the file path in the next param
46
46
  #
47
- def create_page(user_id, document_id, file_content_base64, file_path = nil)
47
+ def create_page(user_id, document_id, file_content_base64, file_path = nil, idempotency_key = nil)
48
48
  if file_content_base64.nil? && !file_path.nil?
49
49
  bts = File.open(file_path, 'rb') { |f| f.read }
50
50
  file_content_base64 = Base64.encode64(bts)
51
51
  end
52
52
  # normally it returns 204 HTTP code on success
53
53
  begin
54
- MangoPay.request(:post, url(user_id, document_id) + '/pages', {'File' => file_content_base64})
54
+ MangoPay.request(:post, url(user_id, document_id) + '/pages', {'File' => file_content_base64}, {}, idempotency_key)
55
55
  rescue ResponseError => ex
56
56
  raise ex unless ex.code == '204'
57
57
  end
@@ -5,8 +5,8 @@ module MangoPay
5
5
  include HTTPCalls::Update
6
6
  include HTTPCalls::Fetch
7
7
 
8
- def self.create(params)
9
- MangoPay.request(:post, "#{url}/card/direct", params)
8
+ def self.create(params, idempotency_key = nil)
9
+ MangoPay.request(:post, "#{url}/card/direct", params, {}, idempotency_key)
10
10
  end
11
11
 
12
12
  end
data/lib/mangopay/temp.rb CHANGED
@@ -57,9 +57,9 @@ module MangoPay
57
57
  # Received data:
58
58
  # Normal card web payin transaction, with the addition of:
59
59
  # - PaymentCardId e.g. "322311"
60
- def self.immediate_payin(params)
60
+ def self.immediate_payin(params, idempotency_key = nil)
61
61
  url = "#{MangoPay.api_path}/temp/immediate-payins"
62
- MangoPay.request(:post, url, params)
62
+ MangoPay.request(:post, url, params, {}, idempotency_key)
63
63
  end
64
64
 
65
65
  def self.url(id = nil)
@@ -9,7 +9,6 @@ module MangoPay
9
9
  # - +Status+: TransactionStatus {CREATED, SUCCEEDED, FAILED}
10
10
  # - +Type+: TransactionType {PAYIN, PAYOUT, TRANSFER}
11
11
  # - +Nature+: TransactionNature {NORMAL, REFUND, REPUDIATION}
12
- # - +Direction+: TransactionDirection {DEBIT, CREDIT}
13
12
  # - +BeforeDate+ (timestamp): filters transactions with CreationDate _before_ this date
14
13
  # - +AfterDate+ (timestamp): filters transactions with CreationDate _after_ this date
15
14
  def fetch(wallet_id, filters={})
@@ -1,3 +1,3 @@
1
1
  module MangoPay
2
- VERSION = '3.0.19' # disputes
2
+ VERSION = '3.0.20' # idempotency support
3
3
  end
@@ -0,0 +1,41 @@
1
+ describe MangoPay do
2
+
3
+ # see https://docs.mangopay.com/api-references/idempotency-support/
4
+
5
+ include_context 'users'
6
+ require 'securerandom'
7
+
8
+ describe 'post requests' do
9
+
10
+ it 'if called with no idempotency key, act independently' do
11
+ u = define_new_natural_user
12
+ u1 = MangoPay::NaturalUser.create(u)
13
+ u2 = MangoPay::NaturalUser.create(u)
14
+ expect(u2['Id']).to be > u1['Id']
15
+ end
16
+
17
+ it 'if called with same idempotency key, the 2nd call is blocked' do
18
+ idempotency_key = SecureRandom.uuid
19
+ u = define_new_natural_user
20
+ u1 = MangoPay::NaturalUser.create(u, nil, idempotency_key)
21
+ expect {
22
+ u2 = MangoPay::NaturalUser.create(u, nil, idempotency_key)
23
+ }.to raise_error(MangoPay::ResponseError)
24
+ end
25
+
26
+ it 'if called with different idempotency key, act independently and responses may be retreived later' do
27
+ idempotency_key1 = SecureRandom.uuid
28
+ idempotency_key2 = SecureRandom.uuid
29
+ u = define_new_natural_user
30
+ u1 = MangoPay::NaturalUser.create(u, nil, idempotency_key1)
31
+ u2 = MangoPay::NaturalUser.create(u, nil, idempotency_key2)
32
+ expect(u2['Id']).to be > u1['Id']
33
+
34
+ resp1 = MangoPay.fetch_response(idempotency_key1)
35
+ resp2 = MangoPay.fetch_response(idempotency_key2)
36
+ expect(resp1['Resource']['Id']).to eq u1['Id']
37
+ expect(resp2['Resource']['Id']).to eq u2['Id']
38
+ end
39
+
40
+ end
41
+ end
@@ -34,8 +34,8 @@ shared_context 'users' do
34
34
  ###############################################
35
35
 
36
36
  let(:new_natural_user) { create_new_natural_user }
37
- def create_new_natural_user
38
- MangoPay::NaturalUser.create({
37
+ def define_new_natural_user
38
+ {
39
39
  Tag: 'Test natural user',
40
40
  Email: 'my@email.com',
41
41
  FirstName: 'John',
@@ -54,7 +54,10 @@ shared_context 'users' do
54
54
  CountryOfResidence: 'FR',
55
55
  Occupation: 'Worker',
56
56
  IncomeRange: 1
57
- })
57
+ }
58
+ end
59
+ def create_new_natural_user
60
+ MangoPay::NaturalUser.create(define_new_natural_user)
58
61
  end
59
62
 
60
63
  let(:new_legal_user) {
@@ -48,13 +48,6 @@ describe MangoPay::Transaction do
48
48
  expect(by_type_pyout.count).to eq 1
49
49
  expect(by_type_pyin.first['Id']).to eq payin['Id']
50
50
  expect(by_type_pyout.first['Id']).to eq payout['Id']
51
-
52
- by_dir_cred = MangoPay::Transaction.fetch(wallet_id, {'Direction' => 'CREDIT'})
53
- by_dir_debt = MangoPay::Transaction.fetch(wallet_id, {'Direction' => 'DEBIT'})
54
- expect(by_dir_cred.count).to eq 1
55
- expect(by_dir_debt.count).to eq 1
56
- expect(by_dir_cred.first['Id']).to eq payin['Id']
57
- expect(by_dir_debt.first['Id']).to eq payout['Id']
58
51
  end
59
52
 
60
53
  end
@@ -74,13 +74,6 @@ describe MangoPay::Wallet do
74
74
  expect(by_type_pyout.count).to eq 1
75
75
  expect(by_type_pyin.first['Id']).to eq payin['Id']
76
76
  expect(by_type_pyout.first['Id']).to eq payout['Id']
77
-
78
- by_dir_cred = MangoPay::Wallet.transactions(wallet_id, {'Direction' => 'CREDIT'})
79
- by_dir_debt = MangoPay::Wallet.transactions(wallet_id, {'Direction' => 'DEBIT'})
80
- expect(by_dir_cred.count).to eq 1
81
- expect(by_dir_debt.count).to eq 1
82
- expect(by_dir_cred.first['Id']).to eq payin['Id']
83
- expect(by_dir_debt.first['Id']).to eq payout['Id']
84
77
  end
85
78
 
86
79
  end
data/spec/spec_helper.rb CHANGED
@@ -8,7 +8,15 @@ def reset_mangopay_configuration
8
8
  MangoPay.configure do |c|
9
9
  c.preproduction = true
10
10
  c.client_id = 'sdk-unit-tests'
11
- c.client_passphrase = 'cqFfFrWfCcb7UadHNxx2C9Lo6Djw8ZduLi7J9USTmu8bhxxpju'
11
+
12
+ # sandbox environment:
13
+ # c.root_url = 'https://api.sandbox.mangopay.com'
14
+ # c.client_passphrase = 'cqFfFrWfCcb7UadHNxx2C9Lo6Djw8ZduLi7J9USTmu8bhxxpju'
15
+
16
+ # test environment:
17
+ c.root_url = 'https://api-test.mangopay.com'
18
+ c.client_passphrase = '9RMGpwVUwFLK0SurxObJ2yaadDcO0zeKFKxWmthjB93SQjFzy0'
19
+
12
20
  c.temp_dir = File.expand_path('../tmp', __FILE__)
13
21
  require 'fileutils'
14
22
  FileUtils.mkdir_p(c.temp_dir) unless File.directory?(c.temp_dir)
@@ -19,8 +27,8 @@ reset_mangopay_configuration
19
27
 
20
28
  ################################################################################
21
29
  # uncomment it for logging all http calls in tests
22
- #require 'http_logger'
23
- #require 'logger'
24
- #HttpLogger.logger = Logger.new(STDOUT)
25
- #HttpLogger.colorize = true
26
- #HttpLogger.log_headers = false
30
+ # require 'http_logger'
31
+ # require 'logger'
32
+ # HttpLogger.logger = Logger.new(STDOUT)
33
+ # HttpLogger.colorize = true
34
+ # HttpLogger.log_headers = true # false
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mangopay
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.19
4
+ version: 3.0.20
5
5
  platform: ruby
6
6
  authors:
7
7
  - Geoffroy Lorieux
@@ -9,48 +9,48 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-10-23 00:00:00.000000000 Z
12
+ date: 2016-01-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: multi_json
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - '>='
18
+ - - ">="
19
19
  - !ruby/object:Gem::Version
20
20
  version: 1.7.7
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - '>='
25
+ - - ">="
26
26
  - !ruby/object:Gem::Version
27
27
  version: 1.7.7
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: rake
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - '>='
32
+ - - ">="
33
33
  - !ruby/object:Gem::Version
34
34
  version: 10.1.0
35
35
  type: :development
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - '>='
39
+ - - ">="
40
40
  - !ruby/object:Gem::Version
41
41
  version: 10.1.0
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: rspec
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - '>='
46
+ - - ">="
47
47
  - !ruby/object:Gem::Version
48
48
  version: 3.0.0
49
49
  type: :development
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
- - - '>='
53
+ - - ">="
54
54
  - !ruby/object:Gem::Version
55
55
  version: 3.0.0
56
56
  description: |2
@@ -63,8 +63,8 @@ executables:
63
63
  extensions: []
64
64
  extra_rdoc_files: []
65
65
  files:
66
- - .gitignore
67
- - .rspec
66
+ - ".gitignore"
67
+ - ".rspec"
68
68
  - Gemfile
69
69
  - LICENSE
70
70
  - README.md
@@ -108,6 +108,7 @@ files:
108
108
  - spec/mangopay/event_spec.rb
109
109
  - spec/mangopay/fetch_filters_spec.rb
110
110
  - spec/mangopay/hook_spec.rb
111
+ - spec/mangopay/idempotency_spec
111
112
  - spec/mangopay/kyc_document_spec.png
112
113
  - spec/mangopay/kyc_document_spec.rb
113
114
  - spec/mangopay/payin_bankwire_direct_spec.rb
@@ -136,17 +137,17 @@ require_paths:
136
137
  - lib
137
138
  required_ruby_version: !ruby/object:Gem::Requirement
138
139
  requirements:
139
- - - '>='
140
+ - - ">="
140
141
  - !ruby/object:Gem::Version
141
142
  version: 1.9.2
142
143
  required_rubygems_version: !ruby/object:Gem::Requirement
143
144
  requirements:
144
- - - '>='
145
+ - - ">="
145
146
  - !ruby/object:Gem::Version
146
147
  version: '0'
147
148
  requirements: []
148
149
  rubyforge_project:
149
- rubygems_version: 2.0.3
150
+ rubygems_version: 2.4.5.1
150
151
  signing_key:
151
152
  specification_version: 4
152
153
  summary: Ruby bindings for the version 2 of the MangoPay API
@@ -161,6 +162,7 @@ test_files:
161
162
  - spec/mangopay/event_spec.rb
162
163
  - spec/mangopay/fetch_filters_spec.rb
163
164
  - spec/mangopay/hook_spec.rb
165
+ - spec/mangopay/idempotency_spec
164
166
  - spec/mangopay/kyc_document_spec.png
165
167
  - spec/mangopay/kyc_document_spec.rb
166
168
  - spec/mangopay/payin_bankwire_direct_spec.rb