mangopay-v4 4.0.0 → 4.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (234) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +29 -29
  3. data/.rspec +3 -3
  4. data/.rubocop.yml +1 -1
  5. data/.travis.yml +21 -13
  6. data/Gemfile +2 -2
  7. data/LICENSE +20 -20
  8. data/README.md +379 -379
  9. data/bin/mangopay +9 -9
  10. data/lib/mangopay.rb +132 -132
  11. data/lib/mangopay/api/api.rb +8 -8
  12. data/lib/mangopay/api/api_methods.rb +160 -136
  13. data/lib/mangopay/api/auth_token_manager.rb +173 -173
  14. data/lib/mangopay/api/http_client.rb +324 -324
  15. data/lib/mangopay/api/service/bank_accounts.rb +145 -145
  16. data/lib/mangopay/api/service/banking_aliases.rb +83 -0
  17. data/lib/mangopay/api/service/cards.rb +151 -151
  18. data/lib/mangopay/api/service/client_wallets.rb +88 -88
  19. data/lib/mangopay/api/service/clients.rb +67 -67
  20. data/lib/mangopay/api/service/dispute_documents.rb +157 -157
  21. data/lib/mangopay/api/service/disputes.rb +186 -186
  22. data/lib/mangopay/api/service/e_money.rb +63 -41
  23. data/lib/mangopay/api/service/events.rb +46 -46
  24. data/lib/mangopay/api/service/hooks.rb +92 -92
  25. data/lib/mangopay/api/service/kyc_documents.rb +152 -152
  26. data/lib/mangopay/api/service/mandates.rb +141 -141
  27. data/lib/mangopay/api/service/oauth_tokens.rb +24 -24
  28. data/lib/mangopay/api/service/pay_ins.rb +369 -259
  29. data/lib/mangopay/api/service/pay_outs.rb +53 -53
  30. data/lib/mangopay/api/service/pre_authorizations.rb +126 -68
  31. data/lib/mangopay/api/service/refunds.rb +159 -61
  32. data/lib/mangopay/api/service/reports.rb +150 -150
  33. data/lib/mangopay/api/service/repudiations.rb +31 -31
  34. data/lib/mangopay/api/service/responses.rb +101 -101
  35. data/lib/mangopay/api/service/settlement_transfers.rb +54 -54
  36. data/lib/mangopay/api/service/transactions.rb +246 -182
  37. data/lib/mangopay/api/service/transfers.rb +53 -53
  38. data/lib/mangopay/api/service/ubo_declarations.rb +94 -69
  39. data/lib/mangopay/api/service/users.rb +162 -162
  40. data/lib/mangopay/api/service/wallets.rb +98 -98
  41. data/lib/mangopay/api/uri_provider.rb +32 -34
  42. data/lib/mangopay/common/json_tag_converter.rb +70 -67
  43. data/lib/mangopay/common/jsonifier.rb +266 -248
  44. data/lib/mangopay/common/log_provider.rb +33 -33
  45. data/lib/mangopay/common/rate_limit_interval.rb +16 -16
  46. data/lib/mangopay/common/read_only_fields.rb +26 -26
  47. data/lib/mangopay/common/response_error.rb +61 -61
  48. data/lib/mangopay/common/sort_direction.rb +14 -14
  49. data/lib/mangopay/common/sort_field.rb +12 -12
  50. data/lib/mangopay/common/template_url_options.rb +8 -8
  51. data/lib/mangopay/configuration.rb +38 -38
  52. data/lib/mangopay/environment.rb +65 -65
  53. data/lib/mangopay/model/address.rb +26 -26
  54. data/lib/mangopay/model/billing.rb +13 -0
  55. data/lib/mangopay/model/birthplace.rb +15 -0
  56. data/lib/mangopay/model/declared_ubo.rb +20 -20
  57. data/lib/mangopay/model/dispute_reason.rb +14 -14
  58. data/lib/mangopay/model/document_page_consult.rb +14 -14
  59. data/lib/mangopay/model/e_money.rb +17 -17
  60. data/lib/mangopay/model/entity/account/bank_account.rb +25 -25
  61. data/lib/mangopay/model/entity/account/ca_bank_account.rb +26 -26
  62. data/lib/mangopay/model/entity/account/debited_bank_account.rb +31 -0
  63. data/lib/mangopay/model/entity/account/gb_bank_account.rb +20 -20
  64. data/lib/mangopay/model/entity/account/iban_bank_account.rb +20 -20
  65. data/lib/mangopay/model/entity/account/other_bank_account.rb +23 -23
  66. data/lib/mangopay/model/entity/account/us_bank_account.rb +23 -23
  67. data/lib/mangopay/model/entity/banking_alias.rb +27 -0
  68. data/lib/mangopay/model/entity/card.rb +44 -44
  69. data/lib/mangopay/model/entity/card_registration.rb +42 -42
  70. data/lib/mangopay/model/entity/client.rb +65 -62
  71. data/lib/mangopay/model/entity/client_wallet.rb +22 -22
  72. data/lib/mangopay/model/entity/dispute.rb +49 -49
  73. data/lib/mangopay/model/entity/dispute_document.rb +28 -28
  74. data/lib/mangopay/model/entity/entity_base.rb +17 -17
  75. data/lib/mangopay/model/entity/hook.rb +25 -25
  76. data/lib/mangopay/model/entity/kyc_document.rb +27 -27
  77. data/lib/mangopay/model/entity/mandate.rb +50 -50
  78. data/lib/mangopay/model/entity/pay_in/apple_pay_direct_pay_in.rb +26 -0
  79. data/lib/mangopay/model/entity/pay_in/bank_wire_direct_pay_in.rb +24 -21
  80. data/lib/mangopay/model/entity/pay_in/bank_wire_external_instruction_pay_in.rb +19 -0
  81. data/lib/mangopay/model/entity/pay_in/card_direct_pay_in.rb +41 -32
  82. data/lib/mangopay/model/entity/pay_in/card_pre_authorized_pay_in.rb +15 -12
  83. data/lib/mangopay/model/entity/pay_in/card_web_pay_in.rb +36 -39
  84. data/lib/mangopay/model/entity/pay_in/direct_debit_direct_pay_in.rb +25 -22
  85. data/lib/mangopay/model/entity/pay_in/direct_debit_web_pay_in.rb +37 -37
  86. data/lib/mangopay/model/entity/pay_in/google_pay_direct_pay_in.rb +28 -0
  87. data/lib/mangopay/model/entity/pay_in/pay_in.rb +18 -15
  88. data/lib/mangopay/model/entity/pay_in/paypal_web_pay_in.rb +15 -0
  89. data/lib/mangopay/model/entity/pay_out.rb +21 -21
  90. data/lib/mangopay/model/entity/pre_authorization.rb +74 -67
  91. data/lib/mangopay/model/entity/refund.rb +17 -17
  92. data/lib/mangopay/model/entity/report.rb +50 -50
  93. data/lib/mangopay/model/entity/repudiation.rb +17 -17
  94. data/lib/mangopay/model/entity/settlement_transfer.rb +16 -16
  95. data/lib/mangopay/model/entity/transaction.rb +51 -51
  96. data/lib/mangopay/model/entity/transfer.rb +12 -12
  97. data/lib/mangopay/model/entity/ubo.rb +30 -0
  98. data/lib/mangopay/model/entity/ubo_declaration.rb +29 -31
  99. data/lib/mangopay/model/entity/user/legal_user.rb +55 -52
  100. data/lib/mangopay/model/entity/user/natural_user.rb +49 -49
  101. data/lib/mangopay/model/entity/user/user.rb +17 -17
  102. data/lib/mangopay/model/entity/wallet.rb +27 -27
  103. data/lib/mangopay/model/enum/account_type.rb +23 -23
  104. data/lib/mangopay/model/enum/avs_result.rb +19 -0
  105. data/lib/mangopay/model/enum/banking_alias_type.rb +12 -0
  106. data/lib/mangopay/model/enum/business_type.rb +17 -0
  107. data/lib/mangopay/model/enum/card_status.rb +14 -14
  108. data/lib/mangopay/model/enum/card_type.rb +32 -32
  109. data/lib/mangopay/model/enum/card_validity.rb +18 -18
  110. data/lib/mangopay/model/enum/country_iso.rb +758 -758
  111. data/lib/mangopay/model/enum/culture_code.rb +43 -43
  112. data/lib/mangopay/model/enum/currency_iso.rb +551 -551
  113. data/lib/mangopay/model/enum/declared_ubo_refused_reason_type.rb +15 -15
  114. data/lib/mangopay/model/enum/declared_ubo_status.rb +17 -17
  115. data/lib/mangopay/model/enum/deposit_type.rb +14 -14
  116. data/lib/mangopay/model/enum/direct_debit_type.rb +12 -12
  117. data/lib/mangopay/model/enum/dispute_doc_refused_reason_type.rb +24 -24
  118. data/lib/mangopay/model/enum/dispute_document_type.rb +22 -22
  119. data/lib/mangopay/model/enum/dispute_reason_type.rb +32 -32
  120. data/lib/mangopay/model/enum/dispute_status.rb +20 -20
  121. data/lib/mangopay/model/enum/dispute_type.rb +14 -14
  122. data/lib/mangopay/model/enum/document_status.rb +20 -20
  123. data/lib/mangopay/model/enum/download_format.rb +10 -10
  124. data/lib/mangopay/model/enum/event_type.rb +76 -73
  125. data/lib/mangopay/model/enum/funds_type.rb +14 -14
  126. data/lib/mangopay/model/enum/hook_status.rb +12 -12
  127. data/lib/mangopay/model/enum/hook_validity.rb +14 -14
  128. data/lib/mangopay/model/enum/income_range.rb +20 -20
  129. data/lib/mangopay/model/enum/kyc_doc_refused_reason_type.rb +36 -36
  130. data/lib/mangopay/model/enum/kyc_document_type.rb +18 -18
  131. data/lib/mangopay/model/enum/kyc_level.rb +12 -12
  132. data/lib/mangopay/model/enum/legal_person_type.rb +14 -14
  133. data/lib/mangopay/model/enum/mandate_culture_code.rb +22 -22
  134. data/lib/mangopay/model/enum/mandate_execution_type.rb +10 -10
  135. data/lib/mangopay/model/enum/mandate_scheme.rb +12 -12
  136. data/lib/mangopay/model/enum/mandate_status.rb +23 -23
  137. data/lib/mangopay/model/enum/mandate_type.rb +10 -10
  138. data/lib/mangopay/model/enum/natural_user_capacity.rb +14 -14
  139. data/lib/mangopay/model/enum/pay_in_execution_type.rb +17 -17
  140. data/lib/mangopay/model/enum/pay_in_payment_type.rb +29 -20
  141. data/lib/mangopay/model/enum/pay_out_payment_type.rb +10 -10
  142. data/lib/mangopay/model/enum/payment_status.rb +20 -20
  143. data/lib/mangopay/model/enum/person_type.rb +14 -14
  144. data/lib/mangopay/model/enum/platform_type.rb +22 -22
  145. data/lib/mangopay/model/enum/pre_authorization_execution_type.rb +10 -10
  146. data/lib/mangopay/model/enum/pre_authorization_status.rb +17 -17
  147. data/lib/mangopay/model/enum/refund_reason_type.rb +20 -20
  148. data/lib/mangopay/model/enum/report_status.rb +16 -16
  149. data/lib/mangopay/model/enum/report_type.rb +12 -12
  150. data/lib/mangopay/model/enum/sector.rb +29 -0
  151. data/lib/mangopay/model/enum/secure_mode.rb +15 -15
  152. data/lib/mangopay/model/enum/transaction_nature.rb +16 -16
  153. data/lib/mangopay/model/enum/transaction_status.rb +14 -14
  154. data/lib/mangopay/model/enum/transaction_type.rb +14 -14
  155. data/lib/mangopay/model/enum/ubo_declaration_refused_reason_type.rb +18 -18
  156. data/lib/mangopay/model/enum/ubo_declaration_status.rb +20 -20
  157. data/lib/mangopay/model/event.rb +17 -17
  158. data/lib/mangopay/model/model.rb +214 -193
  159. data/lib/mangopay/model/money.rb +16 -16
  160. data/lib/mangopay/model/pay_in_web_extended_view.rb +30 -30
  161. data/lib/mangopay/model/platform_categorization.rb +15 -0
  162. data/lib/mangopay/model/refund_reason.rb +14 -14
  163. data/lib/mangopay/model/report_filter.rb +82 -82
  164. data/lib/mangopay/model/request/cancel_request.rb +15 -15
  165. data/lib/mangopay/model/request/complete_registration_request.rb +12 -12
  166. data/lib/mangopay/model/request/currency_request.rb +12 -12
  167. data/lib/mangopay/model/request/deactivation_request.rb +9 -9
  168. data/lib/mangopay/model/request/filter_request.rb +37 -37
  169. data/lib/mangopay/model/request/submit_document_request.rb +13 -13
  170. data/lib/mangopay/model/request/submit_ubo_declaration_request.rb +16 -13
  171. data/lib/mangopay/model/request/upload_file_request.rb +8 -8
  172. data/lib/mangopay/model/response_replica.rb +26 -26
  173. data/lib/mangopay/model/security_info.rb +13 -0
  174. data/lib/mangopay/util/custom_formatter.rb +11 -11
  175. data/lib/mangopay/util/custom_logger.rb +33 -33
  176. data/lib/mangopay/util/enum.rb +51 -51
  177. data/lib/mangopay/util/file_encoder.rb +15 -15
  178. data/lib/mangopay/util/non_instantiable.rb +5 -5
  179. data/lib/mangopay/util/storage_strategy.rb +9 -9
  180. data/lib/mangopay/util/void_logger.rb +5 -5
  181. data/mangopay-v4.gemspec +32 -0
  182. data/mangopay.gemspec +32 -32
  183. data/spec/context/address_context.rb +24 -24
  184. data/spec/context/bank_account_context.rb +137 -137
  185. data/spec/context/banking_alias_context.rb +17 -0
  186. data/spec/context/birthplace_context.rb +17 -0
  187. data/spec/context/card_context.rb +45 -45
  188. data/spec/context/client_context.rb +43 -44
  189. data/spec/context/dispute_context.rb +36 -36
  190. data/spec/context/dispute_document_context.rb +19 -19
  191. data/spec/context/hook_context.rb +15 -15
  192. data/spec/context/kyc_document_context.rb +22 -22
  193. data/spec/context/mandate_context.rb +26 -26
  194. data/spec/context/pay_in_context.rb +319 -224
  195. data/spec/context/pay_out_context.rb +39 -38
  196. data/spec/context/pre_authorization_context.rb +44 -40
  197. data/spec/context/refund_context.rb +32 -32
  198. data/spec/context/report_context.rb +21 -21
  199. data/spec/context/repudiation_context.rb +18 -18
  200. data/spec/context/settlement_transfer_context.rb +27 -27
  201. data/spec/context/transfer_context.rb +50 -50
  202. data/spec/context/ubo_declaration_context.rb +29 -24
  203. data/spec/context/user_context.rb +83 -82
  204. data/spec/context/wallet_context.rb +52 -52
  205. data/spec/mangopay/bank_accounts_spec.rb +228 -228
  206. data/spec/mangopay/banking_alias_spec.rb +85 -0
  207. data/spec/mangopay/cards_spec.rb +133 -134
  208. data/spec/mangopay/client_wallets_spec.rb +147 -147
  209. data/spec/mangopay/clients_spec.rb +56 -54
  210. data/spec/mangopay/configuration_spec.rb +125 -125
  211. data/spec/mangopay/dispute_documents_spec.rb +173 -173
  212. data/spec/mangopay/disputes_spec.rb +264 -264
  213. data/spec/mangopay/e_money_spec.rb +57 -37
  214. data/spec/mangopay/events_spec.rb +49 -49
  215. data/spec/mangopay/hooks_spec.rb +70 -70
  216. data/spec/mangopay/kyc_documents_spec.rb +179 -179
  217. data/spec/mangopay/mandates_spec.rb +218 -218
  218. data/spec/mangopay/oauth_tokens_spec.rb +40 -40
  219. data/spec/mangopay/pay_ins_spec.rb +279 -180
  220. data/spec/mangopay/pay_outs_spec.rb +38 -38
  221. data/spec/mangopay/pre_authorizations_spec.rb +134 -57
  222. data/spec/mangopay/refunds_spec.rb +187 -39
  223. data/spec/mangopay/reports_spec.rb +118 -120
  224. data/spec/mangopay/responses_spec.rb +324 -294
  225. data/spec/mangopay/settlement_transfers_spec.rb +36 -36
  226. data/spec/mangopay/transactions_spec.rb +347 -232
  227. data/spec/mangopay/transfers_spec.rb +37 -37
  228. data/spec/mangopay/ubo_declarations_spec.rb +127 -64
  229. data/spec/mangopay/users_spec.rb +145 -145
  230. data/spec/mangopay/wallets_spec.rb +103 -103
  231. data/spec/spec_helper.rb +72 -72
  232. data/spec/tmp/MangoPay.AuthorizationToken.FileStore.tmp +6 -0
  233. data/spec/tmp/mangopay.log.tmp +1201 -0
  234. metadata +31 -5
@@ -1,173 +1,173 @@
1
- require 'fileutils'
2
- require_relative '../common/log_provider'
3
-
4
- module MangoApi
5
-
6
- # Manages acquisition and storage of API authorization token.
7
- module AuthTokenManager
8
- LOG = MangoPay::LogProvider.provide(self)
9
-
10
- class << self
11
-
12
- # Provides a valid authorization token for API calls.
13
- def token
14
- client_id = MangoPay.configuration.client_id
15
- token_valid? && storage.retrieve_for(client_id) || refresh_token
16
- end
17
-
18
- private
19
-
20
- # Retrieves authorization token storage object.
21
- def storage
22
- return @storage if @storage
23
- init_storage
24
- end
25
-
26
- # Initializes storage strategy for OAuth tokens.
27
- # Returns the storage object.
28
- def init_storage
29
- client_id = MangoPay.configuration.client_id
30
- dir = MangoPay.configuration.temp_dir
31
- @storage = dir ? FileStorage.new : MemoryStorage.new
32
- strategy = @storage.class.name.split('::').last
33
- location_if_file = dir ? " at '/#{dir}'" : ''
34
- LOG.info 'Using {}{} for {} client\'s OAuth tokens',
35
- strategy, location_if_file, client_id
36
- @storage
37
- end
38
-
39
- # Returns true if the current client's
40
- # authorization token is valid
41
- def token_valid?
42
- !token_invalid?
43
- end
44
-
45
- # Returns true if the current client's
46
- # stored token is no longer valid.
47
- def token_invalid?
48
- token = storage.retrieve_for MangoPay.configuration.client_id
49
- token.nil? ||
50
- token['expire_time'].nil? ||
51
- token['expire_time'] <= Time.now ||
52
- token['environment_key'] != environment_key
53
- end
54
-
55
- # Provides a configuration-specific hash key.
56
- def environment_key
57
- config = MangoPay.configuration
58
- key = [config.root_url, config.client_id, config.client_passphrase]
59
- .join('|')
60
- Digest::MD5.hexdigest(key)
61
- end
62
-
63
- # Refreshes the stored authorization token.
64
- def refresh_token
65
- LOG.info 'Refreshing OAuth token'
66
- config = MangoPay.configuration
67
- unless config.client_id && config.client_passphrase
68
- raise 'You must specify your client ID and passphrase'
69
- end
70
- token = MangoApi::OAuthTokens.create(config)
71
- append_data token
72
- store_token token
73
- token
74
- end
75
-
76
- # Appends some useful data to the token object.
77
- #
78
- # @param +token+ the token object
79
- def append_data(token)
80
- token['expire_time'] = Time.now + token['expires_in'].to_i
81
- token['environment_key'] = environment_key
82
- end
83
-
84
- # Stores the OAuth token.
85
- #
86
- # @param +token+ the OAuth token to be stored
87
- def store_token(token)
88
- client_id = MangoPay.configuration.client_id
89
- storage.store_for client_id, token
90
- LOG.info 'OAuth token stored in {} for client {}',
91
- storage.class.name.split('::').last, client_id
92
- end
93
- end
94
- end
95
-
96
- # Stores client-specific OAuth tokens in-memory.
97
- class MemoryStorage
98
- def initialize
99
- @token = {}
100
- end
101
-
102
- # Retrieves a client-specific OAuth token.
103
- #
104
- # @param +client_id+ ID of the client whose token to retrieve
105
- def retrieve_for(client_id)
106
- @token[client_id]
107
- end
108
-
109
- # Stores a client-specific OAuth token.
110
- #
111
- # @param +client_id+ ID of the client for which token is being stored
112
- # @param +token+ OAuth token for this client
113
- def store_for(client_id, token)
114
- @token[client_id] = token
115
- end
116
- end
117
-
118
- # Stores client-specific OAuth tokens in temporary files
119
- # in the user-specified directory.
120
- class FileStorage
121
- require 'yaml'
122
-
123
- def initialize
124
- @temp_dir = MangoPay.configuration.temp_dir
125
- raise 'Path to temporary folder is not defined' unless @temp_dir
126
- end
127
-
128
- # Retrieves a client's OAuth token from its storage file.
129
- #
130
- # @param +client_id+ ID of the client whose OAuth token to retrieve
131
- #
132
- # noinspection RubyResolve
133
- def retrieve_for(client_id)
134
- path = file_path(client_id)
135
- return nil unless File.exist? path
136
- File.open(path, 'r') do |file|
137
- file.flock File::LOCK_SH
138
- oauth_data = file.read
139
- YAML.load oauth_data || nil
140
- end
141
- end
142
-
143
- # Generates the file path to a certain client's OAuth token file.
144
- #
145
- # @param +client_id+ ID of the client whose file path to generate
146
- def file_path(client_id)
147
- File.join(@temp_dir, "mangopay_oauth_token_#{client_id}.tmp")
148
- end
149
-
150
- # Stores client-specific OAuth token in its own file.
151
- #
152
- # @param +client_id+ ID of the client whose token is being stored
153
- # @param +token+ OAuth token for this client
154
- #
155
- # noinspection RubyResolve
156
- def store_for(client_id, token)
157
- ensure_folder_exists MangoPay.configuration.temp_dir
158
- File.open(file_path(client_id), 'w') do |file|
159
- file.flock File::LOCK_EX
160
- file.truncate(0)
161
- file.rewind
162
- file.puts YAML.dump(token)
163
- end
164
- end
165
-
166
- # Creates a folder at the given path if none exists.
167
- #
168
- # @param +folder+ path at which folder should exist
169
- def ensure_folder_exists(folder)
170
- FileUtils.mkdir_p folder unless File.directory?(folder)
171
- end
172
- end
173
- end
1
+ require 'fileutils'
2
+ require_relative '../common/log_provider'
3
+
4
+ module MangoApi
5
+
6
+ # Manages acquisition and storage of API authorization token.
7
+ module AuthTokenManager
8
+ LOG = MangoPay::LogProvider.provide(self)
9
+
10
+ class << self
11
+
12
+ # Provides a valid authorization token for API calls.
13
+ def token
14
+ client_id = MangoPay.configuration.client_id
15
+ token_valid? && storage.retrieve_for(client_id) || refresh_token
16
+ end
17
+
18
+ private
19
+
20
+ # Retrieves authorization token storage object.
21
+ def storage
22
+ return @storage if @storage
23
+ init_storage
24
+ end
25
+
26
+ # Initializes storage strategy for OAuth tokens.
27
+ # Returns the storage object.
28
+ def init_storage
29
+ client_id = MangoPay.configuration.client_id
30
+ dir = MangoPay.configuration.temp_dir
31
+ @storage = dir ? FileStorage.new : MemoryStorage.new
32
+ strategy = @storage.class.name.split('::').last
33
+ location_if_file = dir ? " at '/#{dir}'" : ''
34
+ LOG.info 'Using {}{} for {} client\'s OAuth tokens',
35
+ strategy, location_if_file, client_id
36
+ @storage
37
+ end
38
+
39
+ # Returns true if the current client's
40
+ # authorization token is valid
41
+ def token_valid?
42
+ !token_invalid?
43
+ end
44
+
45
+ # Returns true if the current client's
46
+ # stored token is no longer valid.
47
+ def token_invalid?
48
+ token = storage.retrieve_for MangoPay.configuration.client_id
49
+ token.nil? ||
50
+ token['expire_time'].nil? ||
51
+ token['expire_time'] <= Time.now ||
52
+ token['environment_key'] != environment_key
53
+ end
54
+
55
+ # Provides a configuration-specific hash key.
56
+ def environment_key
57
+ config = MangoPay.configuration
58
+ key = [config.root_url, config.client_id, config.client_apiKey]
59
+ .join('|')
60
+ Digest::MD5.hexdigest(key)
61
+ end
62
+
63
+ # Refreshes the stored authorization token.
64
+ def refresh_token
65
+ LOG.info 'Refreshing OAuth token'
66
+ config = MangoPay.configuration
67
+ unless config.client_id && config.client_apiKey
68
+ raise 'You must specify your client ID and apiKey'
69
+ end
70
+ token = MangoApi::OAuthTokens.create(config)
71
+ append_data token
72
+ store_token token
73
+ token
74
+ end
75
+
76
+ # Appends some useful data to the token object.
77
+ #
78
+ # @param +token+ the token object
79
+ def append_data(token)
80
+ token['expire_time'] = Time.now + token['expires_in'].to_i
81
+ token['environment_key'] = environment_key
82
+ end
83
+
84
+ # Stores the OAuth token.
85
+ #
86
+ # @param +token+ the OAuth token to be stored
87
+ def store_token(token)
88
+ client_id = MangoPay.configuration.client_id
89
+ storage.store_for client_id, token
90
+ LOG.info 'OAuth token stored in {} for client {}',
91
+ storage.class.name.split('::').last, client_id
92
+ end
93
+ end
94
+ end
95
+
96
+ # Stores client-specific OAuth tokens in-memory.
97
+ class MemoryStorage
98
+ def initialize
99
+ @token = {}
100
+ end
101
+
102
+ # Retrieves a client-specific OAuth token.
103
+ #
104
+ # @param +client_id+ ID of the client whose token to retrieve
105
+ def retrieve_for(client_id)
106
+ @token[client_id]
107
+ end
108
+
109
+ # Stores a client-specific OAuth token.
110
+ #
111
+ # @param +client_id+ ID of the client for which token is being stored
112
+ # @param +token+ OAuth token for this client
113
+ def store_for(client_id, token)
114
+ @token[client_id] = token
115
+ end
116
+ end
117
+
118
+ # Stores client-specific OAuth tokens in temporary files
119
+ # in the user-specified directory.
120
+ class FileStorage
121
+ require 'yaml'
122
+
123
+ def initialize
124
+ @temp_dir = MangoPay.configuration.temp_dir
125
+ raise 'Path to temporary folder is not defined' unless @temp_dir
126
+ end
127
+
128
+ # Retrieves a client's OAuth token from its storage file.
129
+ #
130
+ # @param +client_id+ ID of the client whose OAuth token to retrieve
131
+ #
132
+ # noinspection RubyResolve
133
+ def retrieve_for(client_id)
134
+ path = file_path(client_id)
135
+ return nil unless File.exist? path
136
+ File.open(path, 'r') do |file|
137
+ file.flock File::LOCK_SH
138
+ oauth_data = file.read
139
+ YAML.load oauth_data || nil
140
+ end
141
+ end
142
+
143
+ # Generates the file path to a certain client's OAuth token file.
144
+ #
145
+ # @param +client_id+ ID of the client whose file path to generate
146
+ def file_path(client_id)
147
+ File.join(@temp_dir, "mangopay_oauth_token_#{client_id}.tmp")
148
+ end
149
+
150
+ # Stores client-specific OAuth token in its own file.
151
+ #
152
+ # @param +client_id+ ID of the client whose token is being stored
153
+ # @param +token+ OAuth token for this client
154
+ #
155
+ # noinspection RubyResolve
156
+ def store_for(client_id, token)
157
+ ensure_folder_exists MangoPay.configuration.temp_dir
158
+ File.open(file_path(client_id), 'w') do |file|
159
+ file.flock File::LOCK_EX
160
+ file.truncate(0)
161
+ file.rewind
162
+ file.puts YAML.dump(token)
163
+ end
164
+ end
165
+
166
+ # Creates a folder at the given path if none exists.
167
+ #
168
+ # @param +folder+ path at which folder should exist
169
+ def ensure_folder_exists(folder)
170
+ FileUtils.mkdir_p folder unless File.directory?(folder)
171
+ end
172
+ end
173
+ end
@@ -1,325 +1,325 @@
1
- require 'net/http'
2
- require 'json'
3
- require_relative '../../mangopay'
4
- require_relative '../common/log_provider'
5
-
6
- module MangoApi
7
-
8
- # Handles HTTP communication.
9
- module HttpClient
10
- LOG = MangoPay::LogProvider.provide(self)
11
-
12
- class << self
13
-
14
- # Launches a self-configuring POST request,
15
- # with headers required by the API.
16
- #
17
- # @param +uri+ [String] request URI
18
- # @param +entity+ [Object] object to be JSON-serialized and sent as body
19
- # Must include Jsonifier.
20
- # @param +id_key+ [String] idempotency key for future response replication
21
- # @return [Hash] hashed request response JSON body
22
- def post(uri, entity, id_key = nil)
23
- request proc { |ury, &block| post_raw(ury, &block) },
24
- uri,
25
- entity,
26
- nil,
27
- id_key
28
- end
29
-
30
- # Launches a fully customizable POST request.
31
- # Expects to be given a block to which it yields the
32
- # request object before execution to be configured.
33
- #
34
- # @param +uri+ [String] request URI
35
- # @return [Hash] hashed request response JSON body
36
- def post_raw(uri, &block)
37
- request_raw Net::HTTP::Post,
38
- uri,
39
- &block
40
- end
41
-
42
- # Launches a self-configuring PUT request,
43
- # with headers required by the API.
44
- #
45
- # @param +uri+ [URI] request URI
46
- # @param +entity+ [Object] object to be JSON-serialized and sent as body
47
- # Must include Jsonifier.
48
- # @return [Hash] hashed request response JSON body
49
- def put(uri, entity = nil)
50
- request proc { |ury, &block| put_raw(ury, &block) },
51
- uri,
52
- entity
53
- end
54
-
55
- # Launches a fully customizable PUT request.
56
- # Expects to be given a block to which it yields the
57
- # request object before execution to be configured.
58
- #
59
- # @param +uri+ [String] request URI
60
- # @return [Hash] hashed request response JSON body
61
- def put_raw(uri, &block)
62
- request_raw Net::HTTP::Put,
63
- uri,
64
- &block
65
- end
66
-
67
- # Launches a self-configuring GET request,
68
- # with headers required by the API.
69
- # Applies filters if provided.
70
- #
71
- # @param +uri+ [URI] request URI
72
- # @param +filters+ [FilterRequest] response entity filtering object
73
- # @return [Hash] hashed request response JSON body
74
- def get(uri, filter_request = nil)
75
- request proc { |ury, &block| get_raw(ury, &block) },
76
- uri,
77
- nil,
78
- filter_request
79
- end
80
-
81
- # Launches a fully customizable GET request.
82
- # Expects to be given a block to which it yields the
83
- # request object before execution to be configured.
84
- #
85
- # @param +uri+ [URI] request URI
86
- # @return [Hash] hashed request response JSON body
87
- def get_raw(uri, &block)
88
- request_raw Net::HTTP::Get,
89
- uri,
90
- &block
91
- end
92
-
93
- # Provides a hash containing necessary headers for API calls.
94
- def api_headers
95
- initialize_headers unless @default_headers
96
- @default_headers
97
- end
98
-
99
- private
100
-
101
- # Launches a self-configuring generic request,
102
- # with headers required by the API.
103
- # Applies filters and idempotency key header if provided.
104
- # Sends JSON serialization of an object as body if provided.
105
- #
106
- # @param +http_client_method+ [Proc] proc representing the HttpClient
107
- # method to be called for this particular request
108
- # @param +uri+ [URI] request URI
109
- # @param +entity+ [Object] object to be JSON-serialized and sent as body
110
- # Must include Jsonifier.
111
- # @param +filter+ [FilterRequest] response entity filtering object
112
- # @param +id_key+ [String] idempotency key for future response replication
113
- # @return [Hash] hashed request response JSON body
114
- def request(http_client_method,
115
- uri,
116
- entity = nil,
117
- filter = nil,
118
- id_key = nil)
119
- validate entity if entity
120
- apply_filter(uri, filter) if filter
121
- http_client_method.call(uri) do |request|
122
- api_headers.each { |k, v| request.add_field(k, v) }
123
- request.add_field('Idempotency-Key', id_key) if id_key
124
- request.body = entity.jsonify! if entity
125
- end
126
- end
127
-
128
- # Launches a fully customizable generic request.
129
- # Expects to be given a block to which it yields the
130
- # request object before execution to be configured.
131
- #
132
- # @param +http_method+ [HTTPRequest] method type class
133
- # @param +uri+ [URI] request URI
134
- # @return [Hash] hashed request response JSON body
135
- def request_raw(http_method, uri)
136
- http_timeout = MangoPay.configuration.http_timeout
137
- response = Net::HTTP.start(uri.host,
138
- uri.port,
139
- use_ssl: true,
140
- read_timeout: http_timeout) do |http|
141
- request = http_method.new(uri.request_uri)
142
- yield request if block_given?
143
- log_request request
144
- http.request request
145
- end
146
- handle response
147
- end
148
-
149
- # Validates a provided object as being serializable
150
- # into an API-acceptable JSON format. Raises if validation fails.
151
- #
152
- # @param +entity+ [Object] object meant to be serialized and sent as body
153
- def validate(entity)
154
- included_modules = entity.singleton_class.included_modules
155
- raise 'Request body entity must include Jsonifier module'\
156
- unless included_modules.include? MangoPay::Jsonifier
157
- end
158
-
159
- # Applies provided filters as path params
160
- # to the provided URI.
161
- #
162
- # @param +uri+ [URI] URI upon which to apply filters
163
- # @param +filter+ [FilterRequest] the filtering object
164
- def apply_filter(uri, filter)
165
- query = []
166
- paging = paging_filter(filter.page, filter.per_page)
167
- sorting = sorting_filter(filter.sort_field, filter.sort_direction)
168
- others = other_filters(filter)
169
- query << paging if paging
170
- query << sorting if sorting
171
- query << others if others
172
- uri.query = query.join('&')
173
- end
174
-
175
- # Builds query string corresponding to paging filter components.
176
- #
177
- # @param +page+ [Integer] number of page of results
178
- # @param +per_page+ [Integer] number of results per page
179
- # @return [String] query string corresponding to provided values
180
- def paging_filter(page, per_page)
181
- return nil unless page && per_page
182
- paging_filter = {}
183
- paging_filter['Page'] = page || 1
184
- paging_filter['Per_Page'] = per_page
185
- URI.encode_www_form paging_filter
186
- end
187
-
188
- # Builds query string corresponding to sorting filter components.
189
- #
190
- # @param +field+ [SortField] field by which to sort results
191
- # @param +direction+ [SortDirection] direction to sort results in
192
- # @return [String] query string corresponding to provided values
193
- def sorting_filter(field, direction)
194
- return nil unless field && direction
195
- sort_param = field.to_s + ':' + direction.to_s
196
- sorting_filter = { Sort: sort_param }
197
- URI.encode_www_form sorting_filter
198
- end
199
-
200
- # Builds query string corresponding to all other filter parameters except
201
- # the ones for paging and sorting
202
- #
203
- # @param +filter+ [FilterRequest] the filtering object
204
- # @return [String] query string corresponding to provided values
205
- def other_filters(filter)
206
- filters = {}
207
- filters['BeforeDate'] = filter.before_date if filter.before_date
208
- filters['AfterDate'] = filter.after_date if filter.after_date
209
- filters['Status'] = filter.status.to_s if filter.status
210
- filters['Nature'] = filter.nature.to_s if filter.nature
211
- filters['Type'] = filter.type.to_s if filter.type
212
- filters['EventType'] = filter.event_type.to_s if filter.event_type
213
- return nil if filters.empty?
214
- URI.encode_www_form filters
215
- end
216
-
217
- # Handles responses from the API.
218
- def handle(response)
219
- update_rate_limits response
220
- log_response response
221
- code = response.code.to_i
222
- body_object = code == 204 ? nil : objectify(response.body)
223
- unless (200..299).cover? code
224
- raise MangoPay::ResponseError.new response.uri,
225
- response.code,
226
- body_object
227
- end
228
- body_object
229
- end
230
-
231
- # Turns response body into a Hash object if it is JSON-standard.
232
- def objectify(response_body)
233
- JSON.parse(response_body)
234
- rescue
235
- response_body
236
- end
237
-
238
- # Handles external responses (from raw HTTP calls).
239
- def handle_raw(response)
240
- code = response.code.to_i
241
- unless (200..299).cover? code
242
- raise "#{code} #{response.message}: #{response.body}"
243
- end
244
- response.body
245
- end
246
-
247
- # Updates the current environment's rate limit
248
- # data from response headers.
249
- #
250
- # @param +response+ response object from API
251
- def update_rate_limits(response)
252
- rate_limits = {}
253
- response.each_header do |k, v|
254
- next unless k.include? 'x-ratelimit'
255
- rate_limits[k] = v.split(', ')
256
- end
257
- MangoPay.environment.update_rate_limits rate_limits if rate_limits.any?
258
- end
259
-
260
- # Logs request data.
261
- #
262
- # @param +request+ the request that should be logged
263
- def log_request(request)
264
- LOG.debug 'Launching request: {}', request.method
265
- LOG.debug 'Full URL: {}{}',
266
- MangoPay.configuration.root_url, request.path
267
- request.each_header do |k, v|
268
- LOG.debug 'Request header: {} -> {}', k, v
269
- end
270
- LOG.debug 'Request body: {}', request.body if request.body
271
- end
272
-
273
- # Logs response data.
274
- #
275
- # @param +response+ the response that should be logged
276
- def log_response(response)
277
- LOG.debug 'Received response: {} {}', response.code, response.message
278
- response.header.each do |k, v|
279
- LOG.debug 'Response header: {} -> {}', k, v
280
- end
281
- LOG.debug 'Response body: {}', response.body if response.body
282
- end
283
-
284
- # Initializes the default headers necessary for API calls.
285
- #
286
- # noinspection RubyStringKeysInHashInspection
287
- def initialize_headers
288
- auth_token = MangoApi::AuthTokenManager.token
289
- @default_headers = {
290
- 'User-Agent' => "MANGOPAY V2 RubyBindings/#{MangoPay::VERSION}",
291
- 'Authorization' => "#{auth_token['token_type']} "\
292
- "#{auth_token['access_token']}",
293
- 'Content-Type' => 'application/json'
294
- }
295
- append_user_agent
296
- end
297
-
298
- def append_user_agent
299
- @default_headers.update('x_mangopay_client_user_agent' =>
300
- JSON.dump(user_agent))
301
- rescue => e
302
- @default_headers.update('x_mangopay_client_raw_user_agent' =>
303
- user_agent.inspect,
304
- error: "#{e} (#{e.class})")
305
- end
306
-
307
- def user_agent
308
- {
309
- bindings_version: MangoPay::VERSION,
310
- lang: 'ruby',
311
- lang_version: "#{RUBY_VERSION} p#{RUBY_PATCHLEVEL} "\
312
- "(#{RUBY_RELEASE_DATE})",
313
- platform: RUBY_PLATFORM,
314
- uname: uname
315
- }
316
- end
317
-
318
- def uname
319
- `uname -a 2>/dev/null`.strip if RUBY_PLATFORM =~ /linux|darwin/i
320
- rescue Errno::ENOMEM
321
- 'uname lookup failed'
322
- end
323
- end
324
- end
1
+ require 'net/http'
2
+ require 'json'
3
+ require_relative '../../mangopay'
4
+ require_relative '../common/log_provider'
5
+
6
+ module MangoApi
7
+
8
+ # Handles HTTP communication.
9
+ module HttpClient
10
+ LOG = MangoPay::LogProvider.provide(self)
11
+
12
+ class << self
13
+
14
+ # Launches a self-configuring POST request,
15
+ # with headers required by the API.
16
+ #
17
+ # @param +uri+ [String] request URI
18
+ # @param +entity+ [Object] object to be JSON-serialized and sent as body
19
+ # Must include Jsonifier.
20
+ # @param +id_key+ [String] idempotency key for future response replication
21
+ # @return [Hash] hashed request response JSON body
22
+ def post(uri, entity, id_key = nil)
23
+ request proc { |ury, &block| post_raw(ury, &block) },
24
+ uri,
25
+ entity,
26
+ nil,
27
+ id_key
28
+ end
29
+
30
+ # Launches a fully customizable POST request.
31
+ # Expects to be given a block to which it yields the
32
+ # request object before execution to be configured.
33
+ #
34
+ # @param +uri+ [String] request URI
35
+ # @return [Hash] hashed request response JSON body
36
+ def post_raw(uri, &block)
37
+ request_raw Net::HTTP::Post,
38
+ uri,
39
+ &block
40
+ end
41
+
42
+ # Launches a self-configuring PUT request,
43
+ # with headers required by the API.
44
+ #
45
+ # @param +uri+ [URI] request URI
46
+ # @param +entity+ [Object] object to be JSON-serialized and sent as body
47
+ # Must include Jsonifier.
48
+ # @return [Hash] hashed request response JSON body
49
+ def put(uri, entity = nil)
50
+ request proc { |ury, &block| put_raw(ury, &block) },
51
+ uri,
52
+ entity
53
+ end
54
+
55
+ # Launches a fully customizable PUT request.
56
+ # Expects to be given a block to which it yields the
57
+ # request object before execution to be configured.
58
+ #
59
+ # @param +uri+ [String] request URI
60
+ # @return [Hash] hashed request response JSON body
61
+ def put_raw(uri, &block)
62
+ request_raw Net::HTTP::Put,
63
+ uri,
64
+ &block
65
+ end
66
+
67
+ # Launches a self-configuring GET request,
68
+ # with headers required by the API.
69
+ # Applies filters if provided.
70
+ #
71
+ # @param +uri+ [URI] request URI
72
+ # @param +filters+ [FilterRequest] response entity filtering object
73
+ # @return [Hash] hashed request response JSON body
74
+ def get(uri, filter_request = nil)
75
+ request proc { |ury, &block| get_raw(ury, &block) },
76
+ uri,
77
+ nil,
78
+ filter_request
79
+ end
80
+
81
+ # Launches a fully customizable GET request.
82
+ # Expects to be given a block to which it yields the
83
+ # request object before execution to be configured.
84
+ #
85
+ # @param +uri+ [URI] request URI
86
+ # @return [Hash] hashed request response JSON body
87
+ def get_raw(uri, &block)
88
+ request_raw Net::HTTP::Get,
89
+ uri,
90
+ &block
91
+ end
92
+
93
+ # Provides a hash containing necessary headers for API calls.
94
+ def api_headers
95
+ initialize_headers unless @default_headers
96
+ @default_headers
97
+ end
98
+
99
+ private
100
+
101
+ # Launches a self-configuring generic request,
102
+ # with headers required by the API.
103
+ # Applies filters and idempotency key header if provided.
104
+ # Sends JSON serialization of an object as body if provided.
105
+ #
106
+ # @param +http_client_method+ [Proc] proc representing the HttpClient
107
+ # method to be called for this particular request
108
+ # @param +uri+ [URI] request URI
109
+ # @param +entity+ [Object] object to be JSON-serialized and sent as body
110
+ # Must include Jsonifier.
111
+ # @param +filter+ [FilterRequest] response entity filtering object
112
+ # @param +id_key+ [String] idempotency key for future response replication
113
+ # @return [Hash] hashed request response JSON body
114
+ def request(http_client_method,
115
+ uri,
116
+ entity = nil,
117
+ filter = nil,
118
+ id_key = nil)
119
+ validate entity if entity
120
+ apply_filter(uri, filter) if filter
121
+ http_client_method.call(uri) do |request|
122
+ api_headers.each { |k, v| request.add_field(k, v) }
123
+ request.add_field('Idempotency-Key', id_key) if id_key
124
+ request.body = entity.jsonify! if entity
125
+ end
126
+ end
127
+
128
+ # Launches a fully customizable generic request.
129
+ # Expects to be given a block to which it yields the
130
+ # request object before execution to be configured.
131
+ #
132
+ # @param +http_method+ [HTTPRequest] method type class
133
+ # @param +uri+ [URI] request URI
134
+ # @return [Hash] hashed request response JSON body
135
+ def request_raw(http_method, uri)
136
+ http_timeout = MangoPay.configuration.http_timeout
137
+ response = Net::HTTP.start(uri.host,
138
+ uri.port,
139
+ use_ssl: true,
140
+ read_timeout: http_timeout) do |http|
141
+ request = http_method.new(uri.request_uri)
142
+ yield request if block_given?
143
+ log_request request
144
+ http.request request
145
+ end
146
+ handle response
147
+ end
148
+
149
+ # Validates a provided object as being serializable
150
+ # into an API-acceptable JSON format. Raises if validation fails.
151
+ #
152
+ # @param +entity+ [Object] object meant to be serialized and sent as body
153
+ def validate(entity)
154
+ included_modules = entity.singleton_class.included_modules
155
+ raise 'Request body entity must include Jsonifier module'\
156
+ unless included_modules.include? MangoPay::Jsonifier
157
+ end
158
+
159
+ # Applies provided filters as path params
160
+ # to the provided URI.
161
+ #
162
+ # @param +uri+ [URI] URI upon which to apply filters
163
+ # @param +filter+ [FilterRequest] the filtering object
164
+ def apply_filter(uri, filter)
165
+ query = []
166
+ paging = paging_filter(filter.page, filter.per_page)
167
+ sorting = sorting_filter(filter.sort_field, filter.sort_direction)
168
+ others = other_filters(filter)
169
+ query << paging if paging
170
+ query << sorting if sorting
171
+ query << others if others
172
+ uri.query = query.join('&')
173
+ end
174
+
175
+ # Builds query string corresponding to paging filter components.
176
+ #
177
+ # @param +page+ [Integer] number of page of results
178
+ # @param +per_page+ [Integer] number of results per page
179
+ # @return [String] query string corresponding to provided values
180
+ def paging_filter(page, per_page)
181
+ return nil unless page && per_page
182
+ paging_filter = {}
183
+ paging_filter['Page'] = page || 1
184
+ paging_filter['Per_Page'] = per_page
185
+ URI.encode_www_form paging_filter
186
+ end
187
+
188
+ # Builds query string corresponding to sorting filter components.
189
+ #
190
+ # @param +field+ [SortField] field by which to sort results
191
+ # @param +direction+ [SortDirection] direction to sort results in
192
+ # @return [String] query string corresponding to provided values
193
+ def sorting_filter(field, direction)
194
+ return nil unless field && direction
195
+ sort_param = field.to_s + ':' + direction.to_s
196
+ sorting_filter = { Sort: sort_param }
197
+ URI.encode_www_form sorting_filter
198
+ end
199
+
200
+ # Builds query string corresponding to all other filter parameters except
201
+ # the ones for paging and sorting
202
+ #
203
+ # @param +filter+ [FilterRequest] the filtering object
204
+ # @return [String] query string corresponding to provided values
205
+ def other_filters(filter)
206
+ filters = {}
207
+ filters['BeforeDate'] = filter.before_date if filter.before_date
208
+ filters['AfterDate'] = filter.after_date if filter.after_date
209
+ filters['Status'] = filter.status.to_s if filter.status
210
+ filters['Nature'] = filter.nature.to_s if filter.nature
211
+ filters['Type'] = filter.type.to_s if filter.type
212
+ filters['EventType'] = filter.event_type.to_s if filter.event_type
213
+ return nil if filters.empty?
214
+ URI.encode_www_form filters
215
+ end
216
+
217
+ # Handles responses from the API.
218
+ def handle(response)
219
+ update_rate_limits response
220
+ log_response response
221
+ code = response.code.to_i
222
+ body_object = code == 204 ? nil : objectify(response.body)
223
+ unless (200..299).cover? code
224
+ raise MangoPay::ResponseError.new response.uri,
225
+ response.code,
226
+ body_object
227
+ end
228
+ body_object
229
+ end
230
+
231
+ # Turns response body into a Hash object if it is JSON-standard.
232
+ def objectify(response_body)
233
+ JSON.parse(response_body)
234
+ rescue
235
+ response_body
236
+ end
237
+
238
+ # Handles external responses (from raw HTTP calls).
239
+ def handle_raw(response)
240
+ code = response.code.to_i
241
+ unless (200..299).cover? code
242
+ raise "#{code} #{response.message}: #{response.body}"
243
+ end
244
+ response.body
245
+ end
246
+
247
+ # Updates the current environment's rate limit
248
+ # data from response headers.
249
+ #
250
+ # @param +response+ response object from API
251
+ def update_rate_limits(response)
252
+ rate_limits = {}
253
+ response.each_header do |k, v|
254
+ next unless k.include? 'x-ratelimit'
255
+ rate_limits[k] = v.split(', ')
256
+ end
257
+ MangoPay.environment.update_rate_limits rate_limits if rate_limits.any?
258
+ end
259
+
260
+ # Logs request data.
261
+ #
262
+ # @param +request+ the request that should be logged
263
+ def log_request(request)
264
+ LOG.debug 'Launching request: {}', request.method
265
+ LOG.debug 'Full URL: {}{}',
266
+ MangoPay.configuration.root_url, request.path
267
+ request.each_header do |k, v|
268
+ LOG.debug 'Request header: {} -> {}', k, v
269
+ end
270
+ LOG.debug 'Request body: {}', request.body if request.body
271
+ end
272
+
273
+ # Logs response data.
274
+ #
275
+ # @param +response+ the response that should be logged
276
+ def log_response(response)
277
+ LOG.debug 'Received response: {} {}', response.code, response.message
278
+ response.header.each do |k, v|
279
+ LOG.debug 'Response header: {} -> {}', k, v
280
+ end
281
+ LOG.debug 'Response body: {}', response.body if response.body
282
+ end
283
+
284
+ # Initializes the default headers necessary for API calls.
285
+ #
286
+ # noinspection RubyStringKeysInHashInspection
287
+ def initialize_headers
288
+ auth_token = MangoApi::AuthTokenManager.token
289
+ @default_headers = {
290
+ 'User-Agent' => "MANGOPAY V2 RubyBindings/#{MangoPay::VERSION}",
291
+ 'Authorization' => "#{auth_token['token_type']} "\
292
+ "#{auth_token['access_token']}",
293
+ 'Content-Type' => 'application/json'
294
+ }
295
+ append_user_agent
296
+ end
297
+
298
+ def append_user_agent
299
+ @default_headers.update('x_mangopay_client_user_agent' =>
300
+ JSON.dump(user_agent))
301
+ rescue => e
302
+ @default_headers.update('x_mangopay_client_raw_user_agent' =>
303
+ user_agent.inspect,
304
+ error: "#{e} (#{e.class})")
305
+ end
306
+
307
+ def user_agent
308
+ {
309
+ bindings_version: MangoPay::VERSION,
310
+ lang: 'ruby',
311
+ lang_version: "#{RUBY_VERSION} p#{RUBY_PATCHLEVEL} "\
312
+ "(#{RUBY_RELEASE_DATE})",
313
+ platform: RUBY_PLATFORM,
314
+ uname: uname
315
+ }
316
+ end
317
+
318
+ def uname
319
+ `uname -a 2>/dev/null`.strip if RUBY_PLATFORM =~ /linux|darwin/i
320
+ rescue Errno::ENOMEM
321
+ 'uname lookup failed'
322
+ end
323
+ end
324
+ end
325
325
  end