killbill-litle 1.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.
@@ -0,0 +1,34 @@
1
+ module Killbill::Litle
2
+ class PrivatePaymentPlugin
3
+ include Singleton
4
+
5
+ def register_token!(kb_account_id, paypage_registration_id, options = {})
6
+ litle_response = gateway.store paypage_registration_id, options
7
+ response = save_response litle_response, :register_token
8
+
9
+ # Create the payment method (not associated to a Killbill payment method yet)
10
+ LitlePaymentMethod.create! :kb_account_id => kb_account_id, :kb_payment_method_id => nil, :litle_token => response.litle_token
11
+ end
12
+
13
+ private
14
+
15
+ def save_response(litle_response, api_call)
16
+ logger.warn "Unsuccessful #{api_call}: #{litle_response.message}" unless litle_response.success?
17
+
18
+ # Save the response to our logs
19
+ response = LitleResponse.from_response(api_call, nil, litle_response)
20
+ response.save!
21
+ response
22
+ end
23
+
24
+ def gateway
25
+ # The gateway should have been configured when the plugin started
26
+ Killbill::Litle::Gateway.instance
27
+ end
28
+
29
+ def logger
30
+ # The logger should have been configured when the plugin started
31
+ Killbill::Litle.logger
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,126 @@
1
+ <!-- Inspired from the Litle official example: https://cert01.securepaypage.litle.com/checkout/dontSeeCard.html -->
2
+ <html>
3
+ <head>
4
+ <title>Pay Page Checkout</title>
5
+ <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
6
+ <script src="<%= secure_page_url %>/LitlePayPage/litle-api.js" type="text/javascript"></script>
7
+ <script>
8
+ $(document).ready(
9
+ function() {
10
+ function setLitleResponseFields(response) {
11
+ document.getElementById('response_code').value = response.response;
12
+ document.getElementById('response_message').value = response.message;
13
+ document.getElementById('response_response_time').value = response.responseTime;
14
+ document.getElementById('response_litle_txn_id').value = response.litleTxnId;
15
+ document.getElementById('response_type').value = response.type;
16
+ }
17
+
18
+ function submitAfterLitle(response) {
19
+ setLitleResponseFields(response);
20
+ document.forms['form_checkout'].submit();
21
+ }
22
+
23
+ function timeoutOnLitle() {
24
+ alert("We are experiencing technical difficulties. Please try your query again later.");
25
+ }
26
+
27
+ function onErrorAfterLitle(response) {
28
+ setLitleResponseFields(response);
29
+ if (response.response == '871') {
30
+ alert("Invalid card number. Check and retry. (Not Mod10)");
31
+ }
32
+ else if (response.response == '872') {
33
+ alert("Invalid card number. Check and retry. (Too short)");
34
+ }
35
+ else if (response.response == '873') {
36
+ alert("Invalid card number. Check and retry. (Too long)");
37
+ }
38
+ else if (response.response == '874') {
39
+ alert("Invalid card number. Check and retry. (Not a number)");
40
+ }
41
+ else if (response.response == '875') {
42
+ alert("We are experiencing technical difficulties. Please try your query again later.");
43
+ }
44
+ else if (response.response == '876') {
45
+ alert("Invalid card number. Check and retry. (Failure from Server)");
46
+ }
47
+ else if (response.response == '880') {
48
+ alert("Invalid report group. Check and retry. (Failure from Server)");
49
+ }
50
+ else if (response.response == '889') {
51
+ alert("We are experiencing technical difficulties. Please try your query again later.");
52
+ }
53
+ return false;
54
+ }
55
+
56
+ var formFields = {
57
+ "accountNum": document.getElementById('cc_num'),
58
+ "paypageRegistrationId": document.getElementById('response_paypage_registration_id'),
59
+ "bin": document.getElementById('response_bin')
60
+ };
61
+
62
+ $("#submitId").click(
63
+ function() {
64
+ // Clear test fields
65
+ setLitleResponseFields({"response":"", "message":""});
66
+
67
+ var litleRequest = {
68
+ "paypageId": document.getElementById("request_paypage_id").value,
69
+ "reportGroup": document.getElementById("request_report_group").value,
70
+ "orderId": document.getElementById("request_order_id").value,
71
+ "id": document.getElementById("request_merchant_txn_id").value,
72
+ "url": "<%= secure_page_url %>"
73
+ };
74
+
75
+ sendToLitle(litleRequest, formFields, submitAfterLitle, onErrorAfterLitle, timeoutOnLitle, 5000);
76
+ return false;
77
+ }
78
+ );
79
+ }
80
+ );
81
+ </script>
82
+ </head>
83
+ <body>
84
+ <h2>Checkout Form</h2>
85
+ <form method="post" id="form_checkout" name="form_checkout" action="/plugins/killbill-litle/checkout">
86
+ <input type="hidden" id="kb_account_id" name="kb_account_id" value="<%= kb_account_id %>"/>
87
+
88
+ <input type="hidden" id="request_paypage_id" name="request_paypage_id" value="<%= paypage_id %>"/>
89
+ <input type="hidden" id="request_merchant_txn_id" name="request_merchant_txn_id" value="<%= merchant_txn_id %>"/>
90
+ <input type="hidden" id="request_order_id" name="request_order_id" value="<%= order_id %>"/>
91
+ <input type="hidden" id="request_report_group" name="request_report_group" value="<%= report_group %>"/>
92
+
93
+ <table>
94
+ <tr><td>First Name</td><td><input type="text" id="first_name" name="first_name" size="20" /></td></tr>
95
+ <tr><td>Last Name</td><td><input type="text" id="last_name" name="last_name" size="20" /></td></tr>
96
+ <tr><td>Credit Card</td><td><input type="text" id="cc_num" name="cc_num" size="20" /></td></tr>
97
+ <tr><td>CVV</td><td><input type="text" id="cvv" name="cvv" size="5" /></td></tr>
98
+ <tr><td>Exp Date</td><td><input type="text" id="exp_date" name="exp_date" size="5" /></td></tr>
99
+ <tr><td>&nbsp;</td></tr>
100
+ <tr><td></td><td align="right">
101
+ <script>
102
+ document.write('<button type="button" id="submitId" onclick="callLitle()">Check out with Pay Page</button>');
103
+ </script>
104
+ <noscript>
105
+ <button type="button" id="submitId">Enable JavaScript!</button>
106
+ </noscript>
107
+ </td></tr>
108
+ </table>
109
+
110
+ <input type="hidden" id="response_paypage_registration_id" name="response_paypage_registration_id" readOnly="true" value=""/>
111
+ <input type="hidden" id="response_bin" name="response_bin" readOnly="true"/>
112
+ <input type="hidden" id="response_code" name="response_code" readOnly="true"/>
113
+ <input type="hidden" id="response_message" name="response_message" readOnly="true"/>
114
+ <input type="hidden" id="response_response_time" name="response_response_time" readOnly="true"/>
115
+ <input type="hidden" id="response_type" name="response_type" readOnly="true"/>
116
+ <input type="hidden" id="response_litle_txn_id" name="response_litle_txn_id" readOnly="true"/>
117
+ </form>
118
+ </body>
119
+ <script>
120
+ function callLitle() {
121
+ if(typeof sendToLitle != 'function') {
122
+ alert("We are experiencing technical difficulties. Please try your query again later (API unavailable).");
123
+ }
124
+ }
125
+ </script>
126
+ </html>
data/lib/litle.rb ADDED
@@ -0,0 +1,27 @@
1
+ require 'active_record'
2
+ require 'activemerchant'
3
+ require 'pathname'
4
+ require 'sinatra'
5
+ require 'singleton'
6
+ require 'yaml'
7
+
8
+ require 'killbill'
9
+
10
+ require 'litle/config/configuration'
11
+ require 'litle/config/properties'
12
+
13
+ require 'litle/api'
14
+ require 'litle/private_api'
15
+
16
+ require 'litle/models/litle_payment_method'
17
+ require 'litle/models/litle_response'
18
+ require 'litle/models/litle_transaction'
19
+
20
+ require 'litle/litle_utils'
21
+ require 'litle/litle/gateway'
22
+
23
+ class Object
24
+ def blank?
25
+ respond_to?(:empty?) ? empty? : !self
26
+ end
27
+ end
data/pom.xml ADDED
@@ -0,0 +1,35 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!--
3
+ ~ Copyright 2010-2013 Ning, Inc.
4
+ ~
5
+ ~ Ning licenses this file to you under the Apache License, version 2.0
6
+ ~ (the "License"); you may not use this file except in compliance with the
7
+ ~ License. You may obtain a copy of the License at:
8
+ ~
9
+ ~ http://www.apache.org/licenses/LICENSE-2.0
10
+ ~
11
+ ~ Unless required by applicable law or agreed to in writing, software
12
+ ~ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13
+ ~ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14
+ ~ License for the specific language governing permissions and limitations
15
+ ~ under the License.
16
+ -->
17
+
18
+ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
19
+ <parent>
20
+ <groupId>org.sonatype.oss</groupId>
21
+ <artifactId>oss-parent</artifactId>
22
+ <version>5</version>
23
+ </parent>
24
+ <modelVersion>4.0.0</modelVersion>
25
+ <groupId>com.ning.killbill.ruby</groupId>
26
+ <artifactId>litle-plugin</artifactId>
27
+ <packaging>pom</packaging>
28
+ <version>1.0.0</version>
29
+ <name>litle-plugin</name>
30
+ <scm>
31
+ <connection>scm:git:git://github.com/killbill/killbill-litle-plugin.git</connection>
32
+ <url>https://github.com/killbill/killbill-litle-plugin/</url>
33
+ <developerConnection>scm:git:git@github.com:killbill/killbill-litle-plugin.git</developerConnection>
34
+ </scm>
35
+ </project>
data/release.sh ADDED
@@ -0,0 +1,11 @@
1
+ VERSION=`grep -E '<version>([0-9]+\.[0-9]+\.[0-9]+)</version>' pom.xml | sed 's/[\t \n]*<version>\(.*\)<\/version>[\t \n]*/\1/'`
2
+ ARTIFACT="$PWD/pkg/killbill-litle-$VERSION.tar.gz"
3
+ echo "Pushing $ARTIFACT to Maven Central"
4
+ mvn gpg:sign-and-deploy-file \
5
+ -DgroupId=com.ning.killbill.ruby \
6
+ -DartifactId=litle-plugin \
7
+ -Dversion=$VERSION \
8
+ -Dpackaging=tar.gz \
9
+ -DrepositoryId=ossrh-releases \
10
+ -Durl=https://oss.sonatype.org/service/local/staging/deploy/maven2/ \
11
+ -Dfile=$ARTIFACT
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe Killbill::Litle::PaymentPlugin do
4
+ before(:each) do
5
+ Dir.mktmpdir do |dir|
6
+ file = File.new(File.join(dir, 'litle.yml'), "w+")
7
+ file.write(<<-eos)
8
+ :litle:
9
+ :merchant_id: 'merchant_id'
10
+ :password: 'password'
11
+ :database:
12
+ :adapter: 'sqlite3'
13
+ :database: 'shouldntmatter.db'
14
+ eos
15
+ file.close
16
+
17
+ @plugin = Killbill::Litle::PaymentPlugin.new
18
+ @plugin.root = File.dirname(file)
19
+ @plugin.logger = Logger.new(STDOUT)
20
+
21
+ # Start the plugin here - since the config file will be deleted
22
+ @plugin.start_plugin
23
+ end
24
+ end
25
+
26
+ it "should start and stop correctly" do
27
+ @plugin.stop_plugin
28
+ end
29
+ end
@@ -0,0 +1,85 @@
1
+ require 'spec_helper'
2
+ require 'logger'
3
+
4
+ ActiveMerchant::Billing::Base.mode = :test
5
+
6
+ describe Killbill::Litle::PaymentPlugin do
7
+ before(:each) do
8
+ @plugin = Killbill::Litle::PaymentPlugin.new
9
+ @plugin.root = File.expand_path(File.dirname(__FILE__) + '../../../')
10
+ @plugin.logger = Logger.new(STDOUT)
11
+ @plugin.start_plugin
12
+ end
13
+
14
+ after(:each) do
15
+ @plugin.stop_plugin
16
+ end
17
+
18
+ it "should be able to create and retrieve payment methods" do
19
+ pm = create_payment_method
20
+
21
+ pms = @plugin.get_payment_methods(pm.kb_account_id)
22
+ pms.size.should == 1
23
+ pms[0].external_payment_method_id.should == pm.litle_token
24
+
25
+ pm_details = @plugin.get_payment_method_detail(pm.kb_account_id, pm.kb_payment_method_id)
26
+ pm_details.external_payment_method_id.should == pm.litle_token
27
+
28
+ @plugin.delete_payment_method(pm.kb_account_id, pm.kb_payment_method_id)
29
+
30
+ @plugin.get_payment_methods(pm.kb_account_id).size.should == 0
31
+ lambda { @plugin.get_payment_method_detail(pm.kb_account_id, pm.kb_payment_method_id) }.should raise_error RuntimeError
32
+ end
33
+
34
+ it "should be able to charge and refund" do
35
+ pm = create_payment_method
36
+ amount_in_cents = 10000
37
+ currency = 'USD'
38
+ kb_payment_id = SecureRandom.uuid
39
+
40
+ payment_response = @plugin.process_payment pm.kb_account_id, kb_payment_id, pm.kb_payment_method_id, amount_in_cents, currency
41
+ payment_response.amount_in_cents.should == amount_in_cents
42
+ payment_response.status.should == Killbill::Plugin::PaymentStatus::SUCCESS
43
+
44
+ # Verify our table directly
45
+ response = Killbill::Litle::LitleResponse.find_by_api_call_and_kb_payment_id :charge, kb_payment_id
46
+ response.test.should be_true
47
+ response.success.should be_true
48
+ response.message.should == "Approved"
49
+ response.params_litleonelineresponse_saleresponse_order_id.should == Killbill::Litle::Utils.compact_uuid(kb_payment_id)
50
+
51
+ payment_response = @plugin.get_payment_info pm.kb_account_id, kb_payment_id
52
+ payment_response.amount_in_cents.should == amount_in_cents
53
+ payment_response.status.should == Killbill::Plugin::PaymentStatus::SUCCESS
54
+
55
+ # Check we cannot refund an amount greater than the original charge
56
+ lambda { @plugin.process_refund pm.kb_account_id, kb_payment_id, amount_in_cents + 1, currency }.should raise_error RuntimeError
57
+
58
+ refund_response = @plugin.process_refund pm.kb_account_id, kb_payment_id, amount_in_cents, currency
59
+ refund_response.amount_in_cents.should == amount_in_cents
60
+ refund_response.status.should == Killbill::Plugin::PaymentStatus::SUCCESS
61
+
62
+ # Verify our table directly
63
+ response = Killbill::Litle::LitleResponse.find_by_api_call_and_kb_payment_id :refund, kb_payment_id
64
+ response.test.should be_true
65
+ response.success.should be_true
66
+
67
+ # Make sure we can charge again the same payment method
68
+ second_amount_in_cents = 29471
69
+ second_kb_payment_id = SecureRandom.uuid
70
+
71
+ payment_response = @plugin.process_payment pm.kb_account_id, second_kb_payment_id, pm.kb_payment_method_id, second_amount_in_cents, currency
72
+ payment_response.amount_in_cents.should == second_amount_in_cents
73
+ payment_response.status.should == Killbill::Plugin::PaymentStatus::SUCCESS
74
+ end
75
+
76
+ private
77
+
78
+ def create_payment_method
79
+ kb_account_id = SecureRandom.uuid
80
+ kb_payment_method_id = SecureRandom.uuid
81
+ # litle tokens are between 13 and 25 characters long
82
+ litle_token = "17283748291029384756"
83
+ Killbill::Litle::LitlePaymentMethod.create :kb_account_id => kb_account_id, :kb_payment_method_id => kb_payment_method_id, :litle_token => litle_token
84
+ end
85
+ end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ describe Killbill::Litle::Utils do
4
+ it "should convert back and forth UUIDs" do
5
+ uuid = SecureRandom.uuid
6
+ packed = Killbill::Litle::Utils.compact_uuid(uuid)
7
+ unpacked = Killbill::Litle::Utils.unpack_uuid(packed)
8
+ unpacked.should == uuid
9
+ end
10
+ end
@@ -0,0 +1,35 @@
1
+ require 'bundler'
2
+ require 'litle'
3
+
4
+ require 'logger'
5
+
6
+ require 'rspec'
7
+
8
+ RSpec.configure do |config|
9
+ config.color_enabled = true
10
+ config.tty = true
11
+ config.formatter = 'documentation'
12
+ end
13
+
14
+ require 'active_record'
15
+ ActiveRecord::Base.establish_connection(
16
+ :adapter => 'sqlite3',
17
+ :database => 'test.db'
18
+ )
19
+ # Create the schema
20
+ require File.expand_path(File.dirname(__FILE__) + '../../db/schema.rb')
21
+
22
+ begin
23
+ require 'securerandom'
24
+ SecureRandom.uuid
25
+ rescue LoadError, NoMethodError
26
+ # See http://jira.codehaus.org/browse/JRUBY-6176
27
+ module SecureRandom
28
+ def self.uuid
29
+ ary = self.random_bytes(16).unpack("NnnnnN")
30
+ ary[2] = (ary[2] & 0x0fff) | 0x4000
31
+ ary[3] = (ary[3] & 0x3fff) | 0x8000
32
+ "%08x-%04x-%04x-%04x-%04x%08x" % ary
33
+ end unless respond_to?(:uuid)
34
+ end
35
+ end
metadata ADDED
@@ -0,0 +1,276 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: killbill-litle
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 1.0.1
6
+ platform: ruby
7
+ authors:
8
+ - Killbill core team
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-04-11 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: killbill
16
+ version_requirements: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: 1.0.12
21
+ none: false
22
+ requirement: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.0.12
27
+ none: false
28
+ prerelease: false
29
+ type: :runtime
30
+ - !ruby/object:Gem::Dependency
31
+ name: activemerchant
32
+ version_requirements: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - "~>"
35
+ - !ruby/object:Gem::Version
36
+ version: 1.31.1
37
+ none: false
38
+ requirement: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: 1.31.1
43
+ none: false
44
+ prerelease: false
45
+ type: :runtime
46
+ - !ruby/object:Gem::Dependency
47
+ name: activerecord
48
+ version_requirements: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - "~>"
51
+ - !ruby/object:Gem::Version
52
+ version: 3.2.1
53
+ none: false
54
+ requirement: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - "~>"
57
+ - !ruby/object:Gem::Version
58
+ version: 3.2.1
59
+ none: false
60
+ prerelease: false
61
+ type: :runtime
62
+ - !ruby/object:Gem::Dependency
63
+ name: sinatra
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 1.3.4
69
+ none: false
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: 1.3.4
75
+ none: false
76
+ prerelease: false
77
+ type: :runtime
78
+ - !ruby/object:Gem::Dependency
79
+ name: LitleOnline
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - "~>"
83
+ - !ruby/object:Gem::Version
84
+ version: 8.16.0
85
+ none: false
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: 8.16.0
91
+ none: false
92
+ prerelease: false
93
+ type: :runtime
94
+ - !ruby/object:Gem::Dependency
95
+ name: xml-mapping
96
+ version_requirements: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - "~>"
99
+ - !ruby/object:Gem::Version
100
+ version: 0.9.1
101
+ none: false
102
+ requirement: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - "~>"
105
+ - !ruby/object:Gem::Version
106
+ version: 0.9.1
107
+ none: false
108
+ prerelease: false
109
+ type: :runtime
110
+ - !ruby/object:Gem::Dependency
111
+ name: xml-object
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: 0.9.93
117
+ none: false
118
+ requirement: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - "~>"
121
+ - !ruby/object:Gem::Version
122
+ version: 0.9.93
123
+ none: false
124
+ prerelease: false
125
+ type: :runtime
126
+ - !ruby/object:Gem::Dependency
127
+ name: activerecord-jdbcmysql-adapter
128
+ version_requirements: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - "~>"
131
+ - !ruby/object:Gem::Version
132
+ version: 1.2.9
133
+ none: false
134
+ requirement: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: 1.2.9
139
+ none: false
140
+ prerelease: false
141
+ type: :runtime
142
+ - !ruby/object:Gem::Dependency
143
+ name: jbundler
144
+ version_requirements: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - "~>"
147
+ - !ruby/object:Gem::Version
148
+ version: 0.4.1
149
+ none: false
150
+ requirement: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - "~>"
153
+ - !ruby/object:Gem::Version
154
+ version: 0.4.1
155
+ none: false
156
+ prerelease: false
157
+ type: :development
158
+ - !ruby/object:Gem::Dependency
159
+ name: rake
160
+ version_requirements: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - ">="
163
+ - !ruby/object:Gem::Version
164
+ version: 10.0.0
165
+ none: false
166
+ requirement: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - ">="
169
+ - !ruby/object:Gem::Version
170
+ version: 10.0.0
171
+ none: false
172
+ prerelease: false
173
+ type: :development
174
+ - !ruby/object:Gem::Dependency
175
+ name: rspec
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: 2.12.0
181
+ none: false
182
+ requirement: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - "~>"
185
+ - !ruby/object:Gem::Version
186
+ version: 2.12.0
187
+ none: false
188
+ prerelease: false
189
+ type: :development
190
+ - !ruby/object:Gem::Dependency
191
+ name: activerecord-jdbcsqlite3-adapter
192
+ version_requirements: !ruby/object:Gem::Requirement
193
+ requirements:
194
+ - - "~>"
195
+ - !ruby/object:Gem::Version
196
+ version: 1.2.6
197
+ none: false
198
+ requirement: !ruby/object:Gem::Requirement
199
+ requirements:
200
+ - - "~>"
201
+ - !ruby/object:Gem::Version
202
+ version: 1.2.6
203
+ none: false
204
+ prerelease: false
205
+ type: :development
206
+ description: Killbill payment plugin for Litle & Co.
207
+ email: killbilling-users@googlegroups.com
208
+ executables: []
209
+ extensions: []
210
+ extra_rdoc_files: []
211
+ files:
212
+ - ".gitignore"
213
+ - ".travis.yml"
214
+ - Gemfile
215
+ - Jarfile
216
+ - README.md
217
+ - Rakefile
218
+ - VERSION
219
+ - config.ru
220
+ - db/schema.rb
221
+ - killbill-litle.gemspec
222
+ - killbill.properties
223
+ - lib/litle.rb
224
+ - lib/litle/api.rb
225
+ - lib/litle/config/application.rb
226
+ - lib/litle/config/configuration.rb
227
+ - lib/litle/config/properties.rb
228
+ - lib/litle/litle/gateway.rb
229
+ - lib/litle/litle_utils.rb
230
+ - lib/litle/models/litle_payment_method.rb
231
+ - lib/litle/models/litle_response.rb
232
+ - lib/litle/models/litle_transaction.rb
233
+ - lib/litle/private_api.rb
234
+ - lib/litle/views/paypage.erb
235
+ - pom.xml
236
+ - release.sh
237
+ - spec/litle/base_plugin_spec.rb
238
+ - spec/litle/integration_spec.rb
239
+ - spec/litle/utils_spec.rb
240
+ - spec/spec_helper.rb
241
+ homepage: http://www.killbilling.org
242
+ licenses:
243
+ - Apache License (2.0)
244
+ post_install_message:
245
+ rdoc_options:
246
+ - "--exclude"
247
+ - "."
248
+ require_paths:
249
+ - lib
250
+ required_ruby_version: !ruby/object:Gem::Requirement
251
+ requirements:
252
+ - - ">="
253
+ - !ruby/object:Gem::Version
254
+ version: 1.9.3
255
+ none: false
256
+ required_rubygems_version: !ruby/object:Gem::Requirement
257
+ requirements:
258
+ - - ">="
259
+ - !ruby/object:Gem::Version
260
+ segments:
261
+ - 0
262
+ hash: 2
263
+ version: !binary |-
264
+ MA==
265
+ none: false
266
+ requirements: []
267
+ rubyforge_project:
268
+ rubygems_version: 1.8.24
269
+ signing_key:
270
+ specification_version: 3
271
+ summary: Plugin to use Litle & Co. as a gateway.
272
+ test_files:
273
+ - spec/litle/base_plugin_spec.rb
274
+ - spec/litle/integration_spec.rb
275
+ - spec/litle/utils_spec.rb
276
+ - spec/spec_helper.rb