killbill-litle 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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