moneta-api 1.0.1 → 1.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2bd8ba9619326c34b72b79371521849fe44e5b78
4
- data.tar.gz: 1a9a33ce255cb1a7c8bdf4a40c69999659992da7
3
+ metadata.gz: 24f8697207e35d2545e5ff4d599f06846e723d87
4
+ data.tar.gz: 4272d2c91359233ede767dbf3dd2492208e44b6f
5
5
  SHA512:
6
- metadata.gz: ecd96715a52e1fc07270eb7e872ec91b6b7fc69c0521ef99b79c403ec41eda12574308fad9b8b94e4a0a161e85c3d82d10fdaa0625113f4de21d2864df634f40
7
- data.tar.gz: d35540807da05ab55e0f9c7872da1f6567b36275a046d52d7ce27701ba89f4bbfc3555e0f44bbc03ed32824bbf9405c4c06e8d0d984ec71535ea0ac606b0aaf7
6
+ metadata.gz: 7bfc0ca2695fa20b40d3d108151c4698313e9b2daa576cdb0eeace9df5afe9d222b09949aad8055cf5a37386a0b698c45809809475180043b2aa3451f1faa395
7
+ data.tar.gz: 90a7004453ae3aaa2bd36ab266a55e8072e829ae3337f7ff5174eb5b81df640093ba95e495fd0f8f02d39ced298a4ce4e864dac3b0d2f04edf31766b0aa69f68
data/.travis.yml ADDED
@@ -0,0 +1,10 @@
1
+ language: ruby
2
+
3
+ rvm:
4
+ - 2.0.0
5
+ - 2.1
6
+ - 2.2
7
+ before_script:
8
+ - cp spec/support/moneta.example.yml spec/support/moneta.yml
9
+ script:
10
+ - CODECLIMATE_REPO_TOKEN=d10be753ffa1a760be2df97c61673629a3fa86270cdd898250b8366213b0799c bundle exec rspec
data/README.md CHANGED
@@ -1,31 +1,104 @@
1
- # Moneta::Api
1
+ [![Gem Version](https://badge.fury.io/rb/moneta-api.svg)](http://badge.fury.io/rb/moneta-api)
2
+ [![Build Status](https://travis-ci.org/ssnikolay/moneta-api.svg?branch=master)](https://travis-ci.org/ssnikolay/moneta-api)
3
+ [![Code Climate](https://codeclimate.com/github/ssnikolay/moneta-api/badges/gpa.svg)](https://codeclimate.com/github/ssnikolay/moneta-api)
4
+ [![Test Coverage](https://codeclimate.com/github/ssnikolay/moneta-api/badges/coverage.svg)](https://codeclimate.com/github/ssnikolay/moneta-api)
5
+ [![Inline docs](http://inch-ci.org/github/ssnikolay/moneta-api.svg?branch=master)](http://inch-ci.org/github/ssnikolay/moneta-api)
2
6
 
3
- TODO: Write a gem description
7
+ [Описание MerchantAPI](https://www.moneta.ru/doc/MONETA.MerchantAPI.v2.ru.pdf) | [RDoc](http://www.rubydoc.info/gems/moneta-api) |
8
+ [Список методов](http://www.rubydoc.info/gems/moneta-api/Moneta/Api/ServiceMethods)
4
9
 
5
- ## Installation
10
+ # moneta-api
6
11
 
7
- Add this line to your application's Gemfile:
12
+ МОНЕТА.РУ (MONETA.MerchantAPI.v2).
13
+
14
+ ## Установка
15
+
16
+ Добавьте эти строки в Gemfile вашего приложения:
8
17
 
9
18
  ```ruby
10
19
  gem 'moneta-api'
11
20
  ```
12
21
 
13
- And then execute:
22
+ И выполните:
14
23
 
15
24
  $ bundle
16
25
 
17
- Or install it yourself as:
26
+ Или установите напрямую:
18
27
 
19
28
  $ gem install moneta-api
20
29
 
21
- ## Usage
30
+ ## Использование
31
+
32
+ #### Базовый пример
33
+
34
+ ```ruby
35
+ require 'moneta/api'
36
+
37
+ # получить данные счета
38
+ service = Moneta::Api::Service.new('username', 'password', { demo_mode: true })
39
+ response = service.find_account_by_id(10999)
40
+ puts response.class.name
41
+ # => 'Moneta::Api::Responses::FindAccountByIdResponse'
42
+ puts "Баланс до пополнения: #{ response.account.balance} #{ response.account.currency }"
43
+ # => 'Баланс до пополнения: 100 RUB'
44
+
45
+ # перевод
46
+ transfer_request = Moneta::Api::Requests::TransferRequest.new.tap do |request|
47
+ request.payee = 28988504
48
+ request.payer = 10999
49
+ request.amount = 10
50
+ request.is_payer_amount = false
51
+ request.payment_password = '123456'
52
+ end
53
+ response = service.transfer(transfer_request)
54
+
55
+ # данные транзакции
56
+ puts response.class.name
57
+ # => 'Moneta::Api::Responses::TransferResponse'
58
+ puts response.status
59
+ # => 'SUCCEED'
60
+
61
+ # проверить данные счета
62
+ response = service.find_account_by_id(10999)
63
+ puts "Баланс после пополнения: #{ response.account.balance} #{ response.account.currency }"
64
+ # => 'Баланс после пополнения: 110 RUB'
65
+ ```
66
+
67
+ **Полный [список методов](http://www.rubydoc.info/gems/moneta-api/Moneta/Api/ServiceMethods), с помощью которых вы можете обратиться к MONETA.MerchantAPI.v2**
22
68
 
23
- TODO: Write usage instructions here
69
+ ### Настройки
70
+
71
+ #### Logger
72
+
73
+ ```ruby
74
+ Moneta::Api::Service.new('username', 'password', {
75
+ logger: Rails.logger,
76
+ log_level: :info,
77
+ filters: [:password]
78
+ })
79
+ ```
80
+
81
+ Доступны следующие настройки:
82
+
83
+ Название | Описание
84
+ ---------------------------|:-----------------------------------------------------------
85
+ `:logger` | **moneta-api** по умолчанию пишет логи в `$STDOUT` с помощью ruby Logger'а. Можно переопределить на любой другой Logger. (прим: `Rails.logger`)
86
+ `:log_level` | Используется для фильтрации вывода в log по приоритету. Допускаются следующие значения - `:info`, `:debug`, `:warn`, `:error`, `:fatal`.
87
+ `:log` | Определяет, нужно ли писать в log. (`true` или `false`)
88
+ `:filters` | Конфиденциальная информация, которую не следует писать в log.
89
+ `:pretty_print_xml` | Определяет, нужно ли выводить в log XML запроса\ответа. (`true` или `false`)
90
+
91
+ #### Demo режим
92
+ Для использования тестового сервера (http://demo.moneta.ru) следует инициализировать сервис со специальным флагом
93
+
94
+ ```ruby
95
+ Moneta::Api::Service.new('username', 'password', { demo_mode: true })
96
+ ```
24
97
 
25
98
  ## Contributing
26
99
 
27
- 1. Fork it ( https://github.com/[my-github-username]/moneta-api/fork )
28
- 2. Create your feature branch (`git checkout -b my-new-feature`)
29
- 3. Commit your changes (`git commit -am 'Add some feature'`)
30
- 4. Push to the branch (`git push origin my-new-feature`)
31
- 5. Create a new Pull Request
100
+ 1. Стандартная схема с pull-request workflow
101
+ 2. Для локального запуска тестов необходимо создать конфигурационный файл со своими demo доступами
102
+ ```bash
103
+ echo "username: 'username'\npassword: 'password'" > spec/support/moneta.yml
104
+ ```
@@ -21,22 +21,11 @@ module Moneta
21
21
  properties.each_with_object({}) do |(property, _), hash|
22
22
  value = send(property)
23
23
  unless value.nil?
24
- hash[ classify_with_lower(property.to_s) ] = to_hash_complex_value(value)
24
+ hash[ property.to_s.classify_with_lower ] = to_hash_complex_value(value)
25
25
  end
26
26
  end
27
27
  end
28
28
 
29
- def classify_with_lower(str)
30
- str = classify(str)
31
- str[0] = str[0].downcase
32
-
33
- str
34
- end
35
-
36
- def classify(str)
37
- str.split('_').map(&:capitalize).join
38
- end
39
-
40
29
  private
41
30
 
42
31
  def build_complex_value(type, value)
@@ -6,15 +6,8 @@ module Moneta
6
6
  # @return [Moneta::Api::Responses::*]
7
7
  def build(response)
8
8
  klass, data = response.to_hash.to_a.first
9
- klass = classify(klass)
10
9
 
11
- Object.const_get("Moneta::Api::Responses::#{ klass }").build(data)
12
- end
13
-
14
- private
15
-
16
- def classify(str)
17
- str.to_s.split('_').map(&:capitalize).join
10
+ Object.const_get("Moneta::Api::Responses::#{ klass.to_s.classify }").build(data)
18
11
  end
19
12
  end
20
13
  end
@@ -4,43 +4,43 @@ module Moneta
4
4
  # @param [Moneta::Api::Requests::AuthoriseTransactionRequest]
5
5
  # @return [Moneta::Api::Responses::AuthoriseTransactionResponse]
6
6
  def authorise_transaction(request)
7
- call(__method__, request.to_hash)
7
+ call(__method__, request)
8
8
  end
9
9
 
10
10
  # @param [Moneta::Api::Requests::AuthoriseTransactionBatchRequest]
11
11
  # @return [Moneta::Api::Responses::AuthoriseTransactionBatchResponse]
12
12
  def authorise_transaction_batch(request)
13
- call(__method__, request.to_hash)
13
+ call(__method__, request)
14
14
  end
15
15
 
16
16
  # @param [Moneta::Api::Requests::CancelTransactionRequest]
17
17
  # @return [Moneta::Api::Responses::CancelTransactionResponse]
18
18
  def cancel_transaction(request)
19
- call(__method__, request.to_hash)
19
+ call(__method__, request)
20
20
  end
21
21
 
22
22
  # @param [Moneta::Api::Requests::CancelTransactionBatchRequest]
23
23
  # @return [Moneta::Api::Responses::CancelTransactionBatchResponse]
24
24
  def cancel_transaction_batch(request)
25
- call(__method__, request.to_hash)
25
+ call(__method__, request)
26
26
  end
27
27
 
28
28
  # @param [Moneta::Api::Requests::ConfirmTransactionRequest]
29
29
  # @return [Moneta::Api::Responses::ConfirmTransactionResponse]
30
30
  def confirm_transaction(request)
31
- call(__method__, request.to_hash)
31
+ call(__method__, request)
32
32
  end
33
33
 
34
34
  # @param [Moneta::Api::Requests::ConfirmTransactionBatchRequest]
35
35
  # @return [Moneta::Api::Responses::ConfirmTransactionBatchResponse]
36
36
  def confirm_transaction_batch(request)
37
- call(__method__, request.to_hash)
37
+ call(__method__, request)
38
38
  end
39
39
 
40
40
  # @param [Moneta::Api::Requests::CreateAccountRequest]
41
41
  # @return [Moneta::Api::Responses::CreateAccountResponse]
42
42
  def create_account(request)
43
- call(__method__, request.to_hash)
43
+ call(__method__, request)
44
44
  end
45
45
 
46
46
  # @param [String]
@@ -52,19 +52,19 @@ module Moneta
52
52
  # @param [Moneta::Api::Requests::FindAccountsListRequest]
53
53
  # @return [Moneta::Api::Responses::FindAccountsListResponse]
54
54
  def find_accounts_list(request)
55
- call(__method__, request.to_hash)
55
+ call(__method__, request)
56
56
  end
57
57
 
58
58
  # @param [Moneta::Api::Requests::FindOperationsListRequest]
59
59
  # @return [Moneta::Api::Responses::FindOperationsListResponse]
60
60
  def find_operations_list(request)
61
- call(__method__, request.to_hash)
61
+ call(__method__, request)
62
62
  end
63
63
 
64
64
  # @param [Moneta::Api::Requests::ForecastTransactionRequest]
65
65
  # @return [Moneta::Api::Responses::ForecastTransactionResponse]
66
66
  def forecast_transaction(request)
67
- call(__method__, request.to_hash)
67
+ call(__method__, request)
68
68
  end
69
69
 
70
70
  # @param [Integer]
@@ -76,13 +76,13 @@ module Moneta
76
76
  # @param [Moneta::Api::Requests::FindLastOperationsListRequest]
77
77
  # @return [Moneta::Api::Responses::FindLastOperationsListResponse]
78
78
  def find_last_operations_list(request)
79
- call(__method__, request.to_hash)
79
+ call(__method__, request)
80
80
  end
81
81
 
82
82
  # @param [Moneta::Api::Requests::GetAccountPaymentPasswordChallengeRequest]
83
83
  # @return [Moneta::Api::Responses::GetAccountPaymentPasswordChallengeResponse]
84
84
  def get_account_payment_password_challenge(request)
85
- call(__method__, request.to_hash)
85
+ call(__method__, request)
86
86
  end
87
87
 
88
88
  # @param [Integer]
@@ -94,57 +94,77 @@ module Moneta
94
94
  # @param [Moneta::Api::Requests::InvoiceRequest]
95
95
  # @return [Moneta::Api::Responses::InvoiceResponse]
96
96
  def invoice(request)
97
- call(__method__, request.to_hash)
97
+ call(__method__, request)
98
98
  end
99
99
 
100
100
  # @param [Moneta::Api::Requests::InvoiceBatchRequest]
101
101
  # @return [Moneta::Api::Responses::InvoiceBatchResponse]
102
102
  def invoice_batch(request)
103
- call(__method__, request.to_hash)
103
+ call(__method__, request)
104
104
  end
105
105
 
106
106
  # @param [Moneta::Api::Requests::RefundRequest]
107
107
  # @return [Moneta::Api::Responses::RefundResponse]
108
108
  def refund(request)
109
- call(__method__, request.to_hash)
109
+ call(__method__, request)
110
110
  end
111
111
 
112
112
  # @param [Moneta::Api::Requests::TransferRequest]
113
113
  # @return [Moneta::Api::Responses::TransferResponse]
114
114
  def transfer(request)
115
- call(__method__, request.to_hash)
115
+ call(__method__, request)
116
116
  end
117
117
 
118
118
  # @param [Moneta::Api::Requests::PaymentRequest]
119
119
  # @return [Moneta::Api::Responses::PaymentResponse]
120
120
  def payment(request)
121
- call(__method__, request.to_hash)
121
+ call(__method__, request)
122
122
  end
123
123
 
124
124
  # @param [Moneta::Api::Requests::VerifyPaymentRequest]
125
125
  # @return [Moneta::Api::Responses::VerifyPaymentResponse]
126
126
  def verify_payment(request)
127
- call(__method__, request.to_hash)
127
+ call(__method__, request)
128
128
  end
129
129
 
130
130
  # @param [Moneta::Api::Requests::VerifyTransferRequest]
131
131
  # @return [Moneta::Api::Responses::VerifyTransferResponse]
132
132
  def verify_transfer(request)
133
- call(__method__, request.to_hash)
133
+ call(__method__, request)
134
134
  end
135
135
 
136
136
  # @param [Moneta::Api::Requests::VerifyTransactionRequest]
137
137
  # @return [Moneta::Api::Responses::VerifyTransactionResponse]
138
138
  def verify_transaction(request)
139
- call(__method__, request.to_hash)
139
+ call(__method__, request)
140
140
  end
141
141
 
142
142
  private
143
143
 
144
- def call(method, request_message)
145
- response = client.call(method, { message: request_message })
144
+ def call(method, request)
145
+ validate!(method, request)
146
+
147
+ response = client.call(method, {
148
+ message: request.respond_to?(:to_hash) ? request.to_hash : request
149
+ })
146
150
  ResponseFactory.build(response)
147
151
  end
152
+
153
+ def validate!(method, request)
154
+ expected_request_class = get_expected_request_class(method)
155
+
156
+ unless request.kind_of?(expected_request_class)
157
+ raise TypeError.new("#{ request.class.name } can't be coerced into #{ expected_request_class.name }")
158
+ end
159
+ end
160
+
161
+ def get_expected_request_class(method)
162
+ {
163
+ 'find_account_by_alias' => String,
164
+ 'find_account_by_id' => Integer,
165
+ 'get_operation_details_by_id' => Integer
166
+ }[ method.to_s ] || Object.const_get("Moneta::Api::Requests::#{ method.to_s.classify }Request")
167
+ end
148
168
  end
149
169
  end
150
170
  end
@@ -1,5 +1,5 @@
1
1
  module Moneta
2
2
  module Api
3
- VERSION = '1.0.1'
3
+ VERSION = '1.0.2'
4
4
  end
5
5
  end
data/lib/moneta/api.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'moneta/api/version'
2
2
  require 'savon'
3
3
 
4
+ require 'moneta/core_ext/string'
4
5
  require 'moneta/api/service_methods'
5
6
  require 'moneta/api/service'
6
7
  require 'moneta/api/data_mapper'
@@ -0,0 +1,29 @@
1
+ module Moneta
2
+ module CoreExt
3
+ module String
4
+
5
+ def self.included(base)
6
+ unless 'moneta'.respond_to?(:classify)
7
+ base.send(:include, Extension)
8
+ end
9
+ end
10
+
11
+ module Extension
12
+ def classify_with_lower
13
+ str = dup
14
+ str = str.classify
15
+ str[0] = str[0].downcase
16
+
17
+ str
18
+ end
19
+
20
+ def classify
21
+ dup.split('_').map(&:capitalize).join
22
+ end
23
+ end
24
+
25
+ end
26
+ end
27
+ end
28
+
29
+ String.send :include, Moneta::CoreExt::String
data/moneta-api.gemspec CHANGED
@@ -28,4 +28,5 @@ Gem::Specification.new do |spec|
28
28
  spec.add_development_dependency 'vcr'
29
29
  spec.add_development_dependency 'fakeweb'
30
30
  spec.add_development_dependency 'yard'
31
+ spec.add_development_dependency 'codeclimate-test-reporter'
31
32
  end
@@ -21,4 +21,8 @@ describe Moneta::Api::Service do
21
21
  it { is_expected.to eq 'https://www.moneta.ru/services.wsdl' }
22
22
  end
23
23
  end
24
+
25
+ describe 'request validate' do
26
+ it { expect { service.authorise_transaction('invalid request') }.to raise_exception(TypeError, "String can't be coerced into Moneta::Api::Requests::AuthoriseTransactionRequest") }
27
+ end
24
28
  end
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,8 @@
1
+ if ENV['CODECLIMATE_REPO_TOKEN']
2
+ require 'codeclimate-test-reporter'
3
+ CodeClimate::TestReporter.start
4
+ end
5
+
1
6
  require 'rspec'
2
7
  require 'pry'
3
8
  require 'rspec/its'
@@ -19,6 +24,7 @@ VCR.configure do |config|
19
24
  config.hook_into :fakeweb
20
25
  config.filter_sensitive_data('<USERNAME>') { $username }
21
26
  config.filter_sensitive_data('<PASSWORD>') { $password }
27
+ config.ignore_hosts 'codeclimate.com'
22
28
  end
23
29
 
24
30
  RSpec.configure do |config|
@@ -0,0 +1,2 @@
1
+ username: 'username'
2
+ password: 'password'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: moneta-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - ssnikolay
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-14 00:00:00.000000000 Z
11
+ date: 2015-04-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: savon
@@ -136,6 +136,20 @@ dependencies:
136
136
  - - '>='
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: codeclimate-test-reporter
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '>='
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
139
153
  description: МОНЕТА.РУ (MONETA.MerchantAPI.v2).
140
154
  email:
141
155
  - ssnikolay@gmail.com
@@ -145,6 +159,7 @@ extra_rdoc_files: []
145
159
  files:
146
160
  - .gitignore
147
161
  - .rspec
162
+ - .travis.yml
148
163
  - .yardopts
149
164
  - Gemfile
150
165
  - LICENSE.txt
@@ -225,6 +240,7 @@ files:
225
240
  - lib/moneta/api/types/verify_transaction_response_type.rb
226
241
  - lib/moneta/api/types/verify_transfer_response_type.rb
227
242
  - lib/moneta/api/version.rb
243
+ - lib/moneta/core_ext/string.rb
228
244
  - moneta-api.gemspec
229
245
  - spec/lib/moneta/api/requests/authorise_transaction_batch_request_spec.rb
230
246
  - spec/lib/moneta/api/requests/authorise_transaction_request_spec.rb
@@ -240,6 +256,7 @@ files:
240
256
  - spec/spec_helper.rb
241
257
  - spec/support/context.rb
242
258
  - spec/support/matchers.rb
259
+ - spec/support/moneta.example.yml
243
260
  - spec/support/wsdl
244
261
  - spec/vcr/moneta_api_requests_authorisetransactionbatchrequest/use_when_one_operation_transaction_transaction_.yml
245
262
  - spec/vcr/moneta_api_requests_authorisetransactionbatchrequest/use_when_two_operations_transaction_first_transaction_.yml
@@ -290,6 +307,7 @@ test_files:
290
307
  - spec/spec_helper.rb
291
308
  - spec/support/context.rb
292
309
  - spec/support/matchers.rb
310
+ - spec/support/moneta.example.yml
293
311
  - spec/support/wsdl
294
312
  - spec/vcr/moneta_api_requests_authorisetransactionbatchrequest/use_when_one_operation_transaction_transaction_.yml
295
313
  - spec/vcr/moneta_api_requests_authorisetransactionbatchrequest/use_when_two_operations_transaction_first_transaction_.yml