payture-api-v1 0.1.0 → 0.2.0

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