mangopay 3.0.19 → 3.0.20

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 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