khipu-rails 0.0.1
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.
- data/.gitignore +17 -0
- data/.rspec +1 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +86 -0
- data/Rakefile +7 -0
- data/khipu-rails.gemspec +25 -0
- data/lib/khipu-rails.rb +7 -0
- data/lib/khipu_rails.rb +2 -0
- data/lib/khipu_rails/button_helper.rb +57 -0
- data/lib/khipu_rails/config.rb +33 -0
- data/lib/khipu_rails/version.rb +3 -0
- data/spec/khipu_rails/khipu_helpers_spec.rb +104 -0
- data/spec/khipu_rails_spec.rb +8 -0
- data/spec/spec_helper.rb +9 -0
- metadata +128 -0
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Klaus Hott Vidal
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
# KhipuRails
|
2
|
+
|
3
|
+
[Khipu](https://khipu.com/home) is a service that facilitates web billing and collection in Chile.
|
4
|
+
It handles very elegantly bank transfers and allows to generate bills in batches.
|
5
|
+
It offers an API for developers to create via POST new charges.
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add to your Gemfile and run the `bundle` command to install it.
|
10
|
+
```ruby
|
11
|
+
gem 'khipu-rails'
|
12
|
+
```
|
13
|
+
|
14
|
+
Create an initializer with the following code.
|
15
|
+
```ruby
|
16
|
+
KhipuRails::Config.user_id = ID
|
17
|
+
KhipuRails::Config.api_key = API KEY
|
18
|
+
```
|
19
|
+
|
20
|
+
*ID and API KEY can be found [here](https://khipu.com/merchant/profile#instant-notification-data)*
|
21
|
+
|
22
|
+
# Features
|
23
|
+
|
24
|
+
## Creating a button for a single bill
|
25
|
+
|
26
|
+
This gem provides a helper to build a button using the right parameters provided in the [API documentation](https://khipu.com/page/api#creacion-formulario).
|
27
|
+
|
28
|
+
### khipu_button
|
29
|
+
**khipu_button subject, amount, options = {}**
|
30
|
+
|
31
|
+
Params:
|
32
|
+
* **subject**: The subject of the bill. *(max 255 chars)*
|
33
|
+
* **amount**: Amount to charge.
|
34
|
+
|
35
|
+
Options:
|
36
|
+
* **:body**: Further description of the charge.
|
37
|
+
* **:return_url**: callback URL to specify to the browser once the payment is comlpeted.
|
38
|
+
* **:cancel_url**: callback URL to specify to the browser if the user decides not to proceed with the transaction.
|
39
|
+
* **:transaction_id**: additional identifier related to the transaction.
|
40
|
+
* **:payer_email**: The email of the payer. If this is set, Khipu will pre-fill this field in the payment page.
|
41
|
+
* **:picture_url**: The URL of the product or service related to this charge.
|
42
|
+
* **:custom**: Additional information related to this charge such as shipment instructions.
|
43
|
+
* **:button_image**: Identifier of the button to display. If you designed your own button you can also provide the URL. *(It defaults to __"50x25"__ when __nil__ given)*
|
44
|
+
* **:receiver_id**: You can specify a receiver if you don't want to use the data stored in the **KhipuRails::Config.user_id** variable.
|
45
|
+
* **:secret**: You can specify a secret if you don't want to use the data stored in the **KhipuRails::Config.api_key** variable.
|
46
|
+
|
47
|
+
**[Button Images provided by Khipu](https://khipu.com/page/botones-de-pago)**
|
48
|
+
|
49
|
+
**50x25**: 
|
50
|
+
|
51
|
+
**100x25**: 
|
52
|
+
|
53
|
+
**100x50**: 
|
54
|
+
|
55
|
+
**150x25**: 
|
56
|
+
|
57
|
+
**150x50**: 
|
58
|
+
|
59
|
+
**150x75**: 
|
60
|
+
|
61
|
+
**150x75-B**: 
|
62
|
+
|
63
|
+
**200x50**: 
|
64
|
+
|
65
|
+
**200x75**: 
|
66
|
+
|
67
|
+
# TODO:
|
68
|
+
|
69
|
+
## Validation of payment notifications
|
70
|
+
|
71
|
+
If you provide an URL for Khipu to deliver [notifications](https://khipu.com/page/api#notification-instantanea) on succesfull payments, this gem provides a validation method to prevent forgery of notifications.
|
72
|
+
|
73
|
+
### khipu_validation
|
74
|
+
|
75
|
+
**khipu_validation params, local_validation = false**
|
76
|
+
|
77
|
+
* **params**: The POST params delivered by Khipu.
|
78
|
+
* **local_validation**: Wether the validation should be done at the [local machine](https://khipu.com/page/api#validacion-local) or by [Khipu's API](https://khipu.com/page/api#validacion-web-service).
|
79
|
+
|
80
|
+
## Contributing
|
81
|
+
|
82
|
+
1. Fork it
|
83
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
84
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
85
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
86
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
data/khipu-rails.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'khipu_rails/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "khipu-rails"
|
8
|
+
gem.version = KhipuRails::VERSION
|
9
|
+
gem.authors = ["Klaus Hott Vidal"]
|
10
|
+
gem.email = ["klahott@gmail.com"]
|
11
|
+
gem.description = %q{This gem provides a rails wrapper for the khipu api.}
|
12
|
+
gem.summary = %q{This gem provides a rails wrapper for the khipu api.}
|
13
|
+
gem.homepage = %q{https://github.com/janther/khipu-rails}
|
14
|
+
|
15
|
+
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
|
+
gem.require_paths = ["lib"]
|
19
|
+
|
20
|
+
gem.add_dependency "rails", "~> 3.1.10"
|
21
|
+
|
22
|
+
gem.add_development_dependency "rspec-rails"
|
23
|
+
gem.add_development_dependency "nokogiri"
|
24
|
+
gem.add_development_dependency "capybara", "~> 1.1.2"
|
25
|
+
end
|
data/lib/khipu-rails.rb
ADDED
data/lib/khipu_rails.rb
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module KhipuRails
|
3
|
+
module ButtonHelper
|
4
|
+
def khipu_button subject, amount, options = {}
|
5
|
+
options.reverse_merge! body: '',
|
6
|
+
return_url: '',
|
7
|
+
cancel_url: '',
|
8
|
+
transaction_id: '',
|
9
|
+
payer_email: '',
|
10
|
+
picture_url: '',
|
11
|
+
custom: '',
|
12
|
+
button_image: '50x25', #Default Button Image
|
13
|
+
receiver_id: KhipuRails::Config.user_id, #Loads user id from configuration
|
14
|
+
secret: KhipuRails::Config.api_key #Loads api key from configuration
|
15
|
+
|
16
|
+
options[:subject] = subject #Adds the subject param to the options for khipu_hash
|
17
|
+
options[:amount] = amount #Adds the amount param to the options for khipu_hash
|
18
|
+
|
19
|
+
button_image = KhipuRails::Config.khipu_images()[options[:button_image]] || options[:button_image]
|
20
|
+
|
21
|
+
form_tag 'https://khipu.com/payment/api/createPaymentPage', authenticity_token: false do
|
22
|
+
[].tap do |i|
|
23
|
+
i << hidden_field_tag(:receiver_id, options[:receiver_id])
|
24
|
+
i << hidden_field_tag(:subject, subject)
|
25
|
+
i << hidden_field_tag(:body, options[:body])
|
26
|
+
i << hidden_field_tag(:amount, amount)
|
27
|
+
i << hidden_field_tag(:return_url, options[:return_url])
|
28
|
+
i << hidden_field_tag(:cancel_url, options[:cancel_url])
|
29
|
+
i << hidden_field_tag(:custom, options[:custom])
|
30
|
+
i << hidden_field_tag(:transaction_id, options[:transaction_id])
|
31
|
+
i << hidden_field_tag(:payer_email, options[:payer_email])
|
32
|
+
i << hidden_field_tag(:picture_url, options[:picture_url])
|
33
|
+
i << hidden_field_tag(:hash, khipu_hash(options))
|
34
|
+
i << image_submit_tag(button_image, name: :submit)
|
35
|
+
end.join.html_safe
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
def khipu_hash options = {}
|
41
|
+
raw = [
|
42
|
+
"receiver_id=#{options[:receiver_id]}",
|
43
|
+
"subject=#{options[:subject]}",
|
44
|
+
"body=#{options[:body]}",
|
45
|
+
"amount=#{options[:amount]}",
|
46
|
+
"return_url=#{options[:return_url]}",
|
47
|
+
"cancel_url=#{options[:cancel_url]}",
|
48
|
+
"custom=#{options[:custom]}",
|
49
|
+
"transaction_id=#{options[:transaction_id]}",
|
50
|
+
"picture_url=#{options[:picture_url]}",
|
51
|
+
"payer_email=#{options[:payer_email]}",
|
52
|
+
"secret=#{options[:secret]}"
|
53
|
+
].join('&')
|
54
|
+
Digest::SHA1.hexdigest raw
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module KhipuRails
|
2
|
+
class Config
|
3
|
+
def self.khipu_images
|
4
|
+
{
|
5
|
+
"50x25" => "https://s3.amazonaws.com/static.khipu.com/buttons/50x25.png",
|
6
|
+
"100x25" => "https://s3.amazonaws.com/static.khipu.com/buttons/100x25.png",
|
7
|
+
"100x50" => "https://s3.amazonaws.com/static.khipu.com/buttons/100x50.png",
|
8
|
+
"150x25" => "https://s3.amazonaws.com/static.khipu.com/buttons/150x25.png",
|
9
|
+
"150x50" => "https://s3.amazonaws.com/static.khipu.com/buttons/150x50.png",
|
10
|
+
"150x75" => "https://s3.amazonaws.com/static.khipu.com/buttons/150x75.png",
|
11
|
+
"150x75-B" => "https://s3.amazonaws.com/static.khipu.com/buttons/150x75.png",
|
12
|
+
"200x50" => "https://s3.amazonaws.com/static.khipu.com/buttons/200x50.png",
|
13
|
+
"200x75" => "https://s3.amazonaws.com/static.khipu.com/buttons/200x75.png"
|
14
|
+
}
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.user_id= value
|
18
|
+
@@user_id = value
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.api_key= value
|
22
|
+
@@api_key = value
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.user_id
|
26
|
+
@@user_id
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.api_key
|
30
|
+
@@api_key
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe KhipuRails::ButtonHelper do
|
5
|
+
before :all do
|
6
|
+
@view = ActionView::Base.new
|
7
|
+
end
|
8
|
+
|
9
|
+
it "generates a form with the action provided by khipu" do
|
10
|
+
button = Nokogiri::HTML.parse(@view.khipu_button "minimal", 2000)
|
11
|
+
form = button.css('form')
|
12
|
+
form.attribute('action').value.should == 'https://khipu.com/payment/api/createPaymentPage'
|
13
|
+
end
|
14
|
+
|
15
|
+
it "generates a form with the method post" do
|
16
|
+
button = Nokogiri::HTML.parse(@view.khipu_button "minimal", 2000)
|
17
|
+
form = button.css('form')
|
18
|
+
form.attribute('method').value.should == 'post'
|
19
|
+
end
|
20
|
+
|
21
|
+
context "given a form with minimal data was correctly generated, it" do
|
22
|
+
before :all do
|
23
|
+
@receiver_id = KhipuRails::Config.user_id
|
24
|
+
@secret = KhipuRails::Config.api_key
|
25
|
+
@button = Nokogiri::HTML.parse(@view.khipu_button "minimal", 2000)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "has an input called reciever_id" do
|
29
|
+
input = @button.css('form input[name=receiver_id]')
|
30
|
+
input.attribute('value').value.to_i.should == @receiver_id
|
31
|
+
end
|
32
|
+
|
33
|
+
it "has an input called subject" do
|
34
|
+
input = @button.css('form input[name=subject]')
|
35
|
+
input.attribute('value').value.should == 'minimal'
|
36
|
+
end
|
37
|
+
|
38
|
+
it "has an input called body" do
|
39
|
+
input = @button.css('form input[name=body]')
|
40
|
+
input.attribute('value').value.should == ''
|
41
|
+
end
|
42
|
+
|
43
|
+
it "has an input called amount" do
|
44
|
+
input = @button.css('form input[name=amount]')
|
45
|
+
input.attribute('value').value.should == '2000'
|
46
|
+
end
|
47
|
+
|
48
|
+
it "has an input called return_url" do
|
49
|
+
input = @button.css('form input[name=return_url]')
|
50
|
+
input.attribute('value').value.should == ''
|
51
|
+
end
|
52
|
+
|
53
|
+
it "has an input called cancel_url" do
|
54
|
+
input = @button.css('form input[name=cancel_url]')
|
55
|
+
input.attribute('value').value.should == ''
|
56
|
+
end
|
57
|
+
|
58
|
+
it "has an input called transaction_id" do
|
59
|
+
input = @button.css('form input[name=transaction_id]')
|
60
|
+
input.attribute('value').value.should == ''
|
61
|
+
end
|
62
|
+
|
63
|
+
it "has an input called custom" do
|
64
|
+
input = @button.css('form input[name=custom]')
|
65
|
+
input.attribute('value').value.should == ''
|
66
|
+
end
|
67
|
+
|
68
|
+
it "has an input called payer_email" do
|
69
|
+
input = @button.css('form input[name=payer_email]')
|
70
|
+
input.attribute('value').value.should == ''
|
71
|
+
end
|
72
|
+
|
73
|
+
it "has an input called picture_url" do
|
74
|
+
input = @button.css('form input[name=picture_url]')
|
75
|
+
input.attribute('value').value.should == ''
|
76
|
+
end
|
77
|
+
|
78
|
+
it "has an input called hash" do
|
79
|
+
input = @button.css('form input[name=hash]')
|
80
|
+
input.attribute('type').value.should == 'hidden'
|
81
|
+
def get_value attribute
|
82
|
+
@button.css("form input[name=#{attribute}]").attribute('value').value
|
83
|
+
end
|
84
|
+
raw = "receiver_id=#{get_value :receiver_id}&"
|
85
|
+
raw += "subject=#{get_value :subject}&"
|
86
|
+
raw += "body=#{get_value :body}&"
|
87
|
+
raw += "amount=#{get_value :amount}&"
|
88
|
+
raw += "return_url=#{get_value :return_url}&"
|
89
|
+
raw += "cancel_url=#{get_value :cancel_url}&"
|
90
|
+
raw += "custom=#{get_value :custom}&"
|
91
|
+
raw += "transaction_id=#{get_value :transaction_id}&"
|
92
|
+
raw += "picture_url=#{get_value :picture_url}&"
|
93
|
+
raw += "payer_email=#{get_value :payer_email}&"
|
94
|
+
raw += "secret=#{@secret}"
|
95
|
+
input.attribute('value').value.should == Digest::SHA1.hexdigest(raw)
|
96
|
+
end
|
97
|
+
|
98
|
+
it "has an image submit" do
|
99
|
+
input = @button.css('form input[name=submit]')
|
100
|
+
input.attribute('type').value.should == 'image'
|
101
|
+
input.attribute('src').value.should == 'https://s3.amazonaws.com/static.khipu.com/buttons/50x25.png'
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: khipu-rails
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Klaus Hott Vidal
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-01-21 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rails
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 3.1.10
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 3.1.10
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rspec-rails
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: nokogiri
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: capybara
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 1.1.2
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 1.1.2
|
78
|
+
description: This gem provides a rails wrapper for the khipu api.
|
79
|
+
email:
|
80
|
+
- klahott@gmail.com
|
81
|
+
executables: []
|
82
|
+
extensions: []
|
83
|
+
extra_rdoc_files: []
|
84
|
+
files:
|
85
|
+
- .gitignore
|
86
|
+
- .rspec
|
87
|
+
- CHANGELOG.md
|
88
|
+
- Gemfile
|
89
|
+
- LICENSE.txt
|
90
|
+
- README.md
|
91
|
+
- Rakefile
|
92
|
+
- khipu-rails.gemspec
|
93
|
+
- lib/khipu-rails.rb
|
94
|
+
- lib/khipu_rails.rb
|
95
|
+
- lib/khipu_rails/button_helper.rb
|
96
|
+
- lib/khipu_rails/config.rb
|
97
|
+
- lib/khipu_rails/version.rb
|
98
|
+
- spec/khipu_rails/khipu_helpers_spec.rb
|
99
|
+
- spec/khipu_rails_spec.rb
|
100
|
+
- spec/spec_helper.rb
|
101
|
+
homepage: https://github.com/janther/khipu-rails
|
102
|
+
licenses: []
|
103
|
+
post_install_message:
|
104
|
+
rdoc_options: []
|
105
|
+
require_paths:
|
106
|
+
- lib
|
107
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
108
|
+
none: false
|
109
|
+
requirements:
|
110
|
+
- - ! '>='
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '0'
|
113
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - ! '>='
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
requirements: []
|
120
|
+
rubyforge_project:
|
121
|
+
rubygems_version: 1.8.24
|
122
|
+
signing_key:
|
123
|
+
specification_version: 3
|
124
|
+
summary: This gem provides a rails wrapper for the khipu api.
|
125
|
+
test_files:
|
126
|
+
- spec/khipu_rails/khipu_helpers_spec.rb
|
127
|
+
- spec/khipu_rails_spec.rb
|
128
|
+
- spec/spec_helper.rb
|