payture-api-v1 0.1.0 → 0.2.0

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: 888f47a3f03a4d6fc09a68c812fe6b27e71709a2
4
- data.tar.gz: 531825558335ba3b6d8d2e3f04c9c6f1122d4788
3
+ metadata.gz: dcaddf1bdb7e2343e34bb183bec3c0da0d1a09c5
4
+ data.tar.gz: 76159e5a3cbb8266a4c6c3b5b713cdb8488bda6e
5
5
  SHA512:
6
- metadata.gz: 917beabab481e35de2ff077d8657a8c1e838dea48c8b44ad915393a2db307991471b89f5cb0d198f4a1d507e51e51329dd28d4a2c6b5d979494465db54c613db
7
- data.tar.gz: 05e526497fc8582e73b46f7924f498227312eaa3fa11cff4110e6a26ef36e255fac4a662402672f27c65f9a1c5fc130505d646a79868871a71774e3546e13d77
6
+ metadata.gz: 98d04cc2af28ca2768254cbd4d9f2aa7358417c333ce2db62bf65c5f4772485d4b43e5498f44e420da0179650d4bc3d539c0581c1666d828fe9b64ec32767e41
7
+ data.tar.gz: 7f2ca31caae210459e6fe2a2dab5946ae26df4b53032803168e8f49f5aa718efd1f66a7f12d749b4b1c03dffd7666ae26edf2648cd8fd20c528cb0f9f2865021
data/.gitignore CHANGED
@@ -7,3 +7,4 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+ /test/cassettes/
data/Guardfile ADDED
@@ -0,0 +1,34 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ ## Uncomment and set this to only include directories you want to watch
5
+ # directories %w(app lib config test spec features)
6
+
7
+ ## Uncomment to clear the screen before every task
8
+ # clearing :on
9
+
10
+ ## Guard internally checks for changes in the Guardfile and exits.
11
+ ## If you want Guard to automatically start up again, run guard in a
12
+ ## shell loop, e.g.:
13
+ ##
14
+ ## $ while bundle exec guard; do echo "Restarting Guard..."; done
15
+ ##
16
+ ## Note: if you are using the `directories` clause above and you are not
17
+ ## watching the project directory ('.'), then you will want to move
18
+ ## the Guardfile to a watched dir and symlink it back, e.g.
19
+ #
20
+ # $ mkdir config
21
+ # $ mv Guardfile config/
22
+ # $ ln -s config/Guardfile .
23
+ #
24
+ # and, you'll have to watch "config/Guardfile" instead of "Guardfile"
25
+
26
+ guard :minitest do
27
+ # with Minitest::Unit
28
+ watch(%r{^test/(.*)\/?test_(.*)\.rb$})
29
+ watch(%r{^test/minitest_helper\.rb$}) { 'test' }
30
+
31
+ watch(%r{^lib/(.*/)?([^/]+)\.rb$}) { |m| "test/#{m[1]}test_#{m[2]}.rb" }
32
+ watch(%r{^lib/payture/api/v1/(.*/)?([^/]+)\.rb$}) { |m| "test/payture/test_#{m[2]}.rb" }
33
+ watch(%r{^lib/payture/api/v1/client(.*/)?([^/]+)\.rb$}) { |m| "test/payture/client/test_#{m[2]}.rb" }
34
+ end
data/README.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Payture API V1
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/payture-api-v1.png)](http://badge.fury.io/rb/payture-api-v1)
4
+ [![Build Status](https://secure.travis-ci.org/endorfin/payture-api-v1.png?branch=master)](https://travis-ci.org/endorfin/payture-api-v1)
5
+ [![Coverage Status](https://coveralls.io/repos/endorfin/payture-api-v1/badge.svg?branch=master)](https://coveralls.io/r/endorfin/payture-api-v1?branch=master)
6
+
3
7
  This library provides a wrapper to Version 1 of the Payture API
4
8
 
5
9
  ## Installation
@@ -3,7 +3,9 @@ class String
3
3
  self.scan(/[A-Z][a-z]*/).join('_').downcase
4
4
  end
5
5
 
6
- def to_camelcase
7
- self.split('_').map(&:capitalize).join
6
+ def to_camelcase(mappings=[])
7
+ retval = self.split('_').map(&:capitalize).join
8
+ mappings.each {|k,v| retval.sub!(k,v)}
9
+ retval
8
10
  end
9
11
  end
@@ -3,6 +3,8 @@ require "core_extensions/string"
3
3
  require "payture/api/v1/version"
4
4
  require "payture/api/v1/configuration"
5
5
  require "payture/api/v1/client"
6
+ require "payture/api/v1/request"
7
+ require "payture/api/v1/response"
6
8
 
7
9
  module Payture
8
10
  module Api
@@ -4,6 +4,7 @@ module Payture::Api::V1
4
4
  Dir[File.expand_path("../client/*.rb", __FILE__)].each{|f| require f}
5
5
 
6
6
  attr_accessor *Configuration::VALID_OPTIONS_KEYS
7
+ attr_reader :api_methods
7
8
 
8
9
  def initialize(options={})
9
10
  options = Payture::Api::V1.options.merge(options)
@@ -11,19 +12,22 @@ module Payture::Api::V1
11
12
  send("#{key}=", options[key])
12
13
  end
13
14
 
14
- self.class.send(:include, Client::PaytureApi) if 'api' == self.api_type
15
- self.class.send(:include, Client::PaytureApim) if 'apim' == self.api_type
16
- self.class.send(:include, Client::PaytureVwapi) if 'vwapi' == self.api_type
15
+ if 'api' == self.api_type
16
+ class << self; include Client::PaytureApi; end
17
+ elsif 'apim' == self.api_type
18
+ class << self; include Client::PaytureApim; end
19
+ elsif 'vwapi' == self.api_type
20
+ class << self; include Client::PaytureVwapi; end
21
+ end
17
22
  end
18
23
 
19
- def url
20
- "https://#{host}.#{Configuration::DOMAIN}/#{api_type}/"
24
+ def make_request(method, params)
25
+ Request.new(url_for(method), params)
21
26
  end
22
27
 
23
- def api_methods
24
- API_METHODS.map{|method| method.to_snakecase }
28
+ def url_for(method)
29
+ "https://#{host}.#{Configuration::DOMAIN}/#{api_type}/#{method}"
25
30
  end
26
-
27
31
  end
28
32
 
29
33
  end
@@ -3,17 +3,73 @@ module Payture::Api::V1
3
3
  class Client
4
4
  module PaytureApi
5
5
 
6
- API_METHODS = %w(Pay Block Charge Unblock Refund GetState)
7
-
8
- API_METHODS.each do |method_name|
9
- method = method_name.to_snakecase
10
- define_method method do |options|
11
- options ||= {}
12
- # TODO: response = api.get(method_name, options)
13
- end
6
+ def pay(pay_info, order_id, amount)
7
+ params = {
8
+ key: self.key,
9
+ pay_info: pay_info,
10
+ order_id: order_id,
11
+ amount: amount
12
+ }
13
+
14
+ request = make_request('Pay', params)
15
+ request.result
16
+ end
17
+
18
+ def block(pay_info, order_id, amount)
19
+ params = {
20
+ key: self.key,
21
+ pay_info: pay_info,
22
+ order_id: order_id,
23
+ amount: amount
24
+ }
25
+
26
+ request = make_request('Block', params)
27
+ request.result
28
+ end
29
+
30
+ def charge(order_id)
31
+ params = {
32
+ key: self.key,
33
+ order_id: order_id
34
+ }
35
+
36
+ request = make_request('Charge', params)
37
+ request.result
38
+ end
39
+
40
+ def unblock(order_id, amount)
41
+ params = {
42
+ key: self.key,
43
+ order_id: order_id,
44
+ amount: amount
45
+ }
46
+
47
+ request = make_request('Unblock', params)
48
+ request.result
49
+ end
50
+
51
+ def refund(order_id, amount)
52
+ params = {
53
+ key: self.key,
54
+ order_id: order_id,
55
+ amount: amount
56
+ }
57
+
58
+ request = make_request('Refund', params)
59
+ request.result
60
+ end
61
+
62
+ def get_state(order_id)
63
+ params = {
64
+ key: self.key,
65
+ order_id: order_id
66
+ }
67
+
68
+ request = make_request('GetState', params)
69
+ request.result
14
70
  end
15
71
 
16
72
  end
17
73
  end
18
74
 
19
- end
75
+ end
@@ -3,17 +3,40 @@ module Payture::Api::V1
3
3
  class Client
4
4
  module PaytureApim
5
5
 
6
- API_METHODS = %w(Init Pay Charge Unblock Refund PayStatus)
7
-
8
- API_METHODS.each do |method_name|
9
- underscore_method_name = method_name.to_snakecase
10
- define_method underscore_method_name do |options|
11
- options ||= {}
12
- # TODO: response = api.get(method_name, options)
13
- end
6
+ def init(session_type, order_id, amount, ip, options={})
7
+ data = {
8
+ session_type: session_type,
9
+ order_id: order_id,
10
+ amount: amount,
11
+ ip: ip
12
+ }.merge!(options)
13
+
14
+ params = {
15
+ key: self.key,
16
+ data: data
17
+ }
18
+
19
+ request = make_request('Init', params)
20
+ request.result
21
+ end
22
+
23
+ def pay_url(session_id)
24
+ "#{url_for('Pay')}?SessionId=#{session_id}"
25
+ end
26
+
27
+ def charge(order_id)
28
+ end
29
+
30
+ def unblock(order_id, amount)
31
+ end
32
+
33
+ def refund(order_id, amount)
34
+ end
35
+
36
+ def pay_status(order_id)
14
37
  end
15
38
 
16
39
  end
17
40
  end
18
41
 
19
- end
42
+ end
@@ -3,17 +3,63 @@ module Payture::Api::V1
3
3
  class Client
4
4
  module PaytureVwapi
5
5
 
6
- API_METHODS = %w(Register Update Delete Add Activate Remove GetList Init Pay SendCode Charge Unblock Refund PayStatus)
6
+ def register(options={})
7
+
8
+ end
9
+
10
+ def update(options={})
11
+
12
+ end
13
+
14
+ def delete(options={})
15
+
16
+ end
17
+
18
+ def add(options={})
19
+
20
+ end
21
+
22
+ def activate(options={})
23
+
24
+ end
25
+
26
+ def remove(options={})
27
+
28
+ end
29
+
30
+ def get_list(options={})
31
+
32
+ end
33
+
34
+ def init(options={})
35
+
36
+ end
37
+
38
+ def pay(options={})
39
+
40
+ end
41
+
42
+ def send_code(options={})
43
+
44
+ end
45
+
46
+ def charge(options={})
47
+
48
+ end
49
+
50
+ def unblock(options={})
51
+
52
+ end
53
+
54
+ def refund(options={})
55
+
56
+ end
57
+
58
+ def pay_status(options={})
7
59
 
8
- API_METHODS.each do |method_name|
9
- underscore_method_name = method_name.to_snakecase
10
- define_method underscore_method_name do |options|
11
- options ||= {}
12
- # TODO: response = api.get(method_name, options)
13
- end
14
60
  end
15
61
 
16
62
  end
17
63
  end
18
64
 
19
- end
65
+ end
@@ -7,7 +7,7 @@ module Payture
7
7
 
8
8
  DEFAULT_API_TYPE = 'api' # api, apim, vwapi
9
9
  DEFAULT_HOST = 'sandbox' # sandbox, secure
10
- DEFAULT_KEY = 'MerchantKey'
10
+ DEFAULT_KEY = 'Merchant'
11
11
  DEFAULT_PASSWORD = nil
12
12
  DEFAULT_USER_AGENT = "Payture API V1 Ruby Gem #{Payture::Api::V1::VERSION}".freeze
13
13
 
@@ -0,0 +1,45 @@
1
+ module Payture::Api::V1
2
+ class Request
3
+
4
+ attr_reader :response, :result
5
+
6
+ def initialize(url, params)
7
+ params = prepare_params(params)
8
+ @response = rest_client.post(url, params)
9
+ @result = Response.new(response).result
10
+ end
11
+
12
+ def rest_client
13
+ @rest_client ||= RestClient
14
+ end
15
+
16
+ def endode_data(data)
17
+ if data.kind_of?(Hash)
18
+ data = convert_keys(data)
19
+ data = Array[data.map {|k, v| "#{k}=#{v}" }].join(';')
20
+ data = CGI.escape(data)
21
+ end
22
+
23
+ data
24
+ end
25
+
26
+ def convert_keys(params)
27
+ mappings = {
28
+ 'Pan' => 'PAN',
29
+ 'Ip' => 'IP',
30
+ 'Data' => 'DATA',
31
+ 'VwId' => 'VWID',
32
+ 'VwUserLgn' => 'VWUserLgn',
33
+ 'VwUserPsw' => 'VWUserPsw'
34
+ }
35
+
36
+ Hash[params.map {|k, v| [k.to_s.to_camelcase(mappings), v] }]
37
+ end
38
+
39
+ def prepare_params(params)
40
+ params = convert_keys(params)
41
+ params = Hash[params.map {|k, v| v.kind_of?(Hash) ? [k, endode_data(v)] : [k, v] }]
42
+ end
43
+
44
+ end
45
+ end
@@ -0,0 +1,16 @@
1
+ require "rexml/document"
2
+
3
+ module Payture::Api::V1
4
+ class Response
5
+
6
+ attr_reader :result
7
+
8
+ def initialize(response)
9
+ #puts response.body
10
+ return nil if response.body.empty?
11
+ doc = REXML::Document.new(response.body)
12
+ @result = Hash[doc.elements.first.attributes.map { |a| [ a.first.to_snakecase.to_sym, a.last ] }]
13
+ end
14
+
15
+ end
16
+ end
@@ -1,7 +1,7 @@
1
1
  module Payture
2
2
  module Api
3
3
  module V1
4
- VERSION = "0.1.0"
4
+ VERSION = "0.2.0"
5
5
  end
6
6
  end
7
7
  end
@@ -17,9 +17,13 @@ Gem::Specification.new do |spec|
17
17
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
18
18
  spec.require_paths = ["lib"]
19
19
 
20
- spec.add_development_dependency "bundler", "~> 1.8"
20
+ spec.add_development_dependency "bundler"
21
21
  spec.add_development_dependency "rake"
22
22
  spec.add_development_dependency "minitest"
23
23
  spec.add_development_dependency "minitest-reporters"
24
+ spec.add_development_dependency "minitest-vcr"
25
+ spec.add_development_dependency "webmock"
24
26
  spec.add_development_dependency "coveralls"
27
+ spec.add_development_dependency "guard"
28
+ spec.add_development_dependency "guard-minitest"
25
29
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: payture-api-v1
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - René Kersten
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-25 00:00:00.000000000 Z
11
+ date: 2015-03-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - '>='
18
18
  - !ruby/object:Gem::Version
19
- version: '1.8'
19
+ version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - '>='
25
25
  - !ruby/object:Gem::Version
26
- version: '1.8'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +66,34 @@ dependencies:
66
66
  - - '>='
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest-vcr
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: webmock
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
69
97
  - !ruby/object:Gem::Dependency
70
98
  name: coveralls
71
99
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +108,34 @@ dependencies:
80
108
  - - '>='
81
109
  - !ruby/object:Gem::Version
82
110
  version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: guard
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: guard-minitest
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
83
139
  description: This library provides a wrapper to Version 1 of the Payture API
84
140
  email:
85
141
  - rene.kersten@gmail.com
@@ -92,6 +148,7 @@ files:
92
148
  - .travis.yml
93
149
  - CODE_OF_CONDUCT.md
94
150
  - Gemfile
151
+ - Guardfile
95
152
  - LICENSE.txt
96
153
  - README.md
97
154
  - Rakefile
@@ -102,6 +159,8 @@ files:
102
159
  - lib/payture/api/v1/client/payture_apim.rb
103
160
  - lib/payture/api/v1/client/payture_vwapi.rb
104
161
  - lib/payture/api/v1/configuration.rb
162
+ - lib/payture/api/v1/request.rb
163
+ - lib/payture/api/v1/response.rb
105
164
  - lib/payture/api/v1/version.rb
106
165
  - payture-api-v1.gemspec
107
166
  homepage: https://github.com/endorfin/payture-api-v1