spreedly-core-ruby 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +137 -114
- data/lib/spreedly-core-ruby.rb +9 -2
- data/lib/spreedly-core-ruby/base.rb +1 -1
- data/lib/spreedly-core-ruby/version.rb +1 -1
- data/test/configuration_test.rb +9 -4
- metadata +14 -14
data/README.md
CHANGED
@@ -1,101 +1,122 @@
|
|
1
1
|
SpreedlyCore
|
2
2
|
======
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
The beauty behind Spreedly Core is that you lower your
|
7
|
-
[PCI Compliance](https://www.pcisecuritystandards.org/) risk
|
8
|
-
by storing credit card information on their service while still having access
|
9
|
-
to make payments and credits. This is possible by having your customers POST their
|
10
|
-
credit card info to the spreedly core service while embedding a transparent
|
11
|
-
redirect URL back to your application. See "Submit payment form" on
|
12
|
-
[the quick start guide](https://spreedlycore.com/manual/quickstart)
|
13
|
-
how the magic happens.
|
4
|
+
spreedly-core-ruby is a Ruby library for accessing the [Spreedly Core API](https://spreedlycore.com/). Spreedly Core is a Software-as-a-Service billing solution that serves two major functions for companies and developers.
|
14
5
|
|
6
|
+
* First, it removes your [PCI Compliance](https://www.pcisecuritystandards.org/) requirement by pushing the card data handling and storage outside of your application. This is possible by having your customers POST their credit card info to the Spreedly Core service while embedding a transparent redirect URL back to your application (see "Submit payment form" on [the quick start guide](https://spreedlycore.com/manual/quickstart)).
|
7
|
+
* Second, it removes any possibility of your gateway locking you in by owning your customer billing data (yes, this happens). By allowing you to charge any card against whatever gateways you as a company have signed up for, you retain all of your customer data and can switch between gateways as you please. Also, expanding internationally won't require an additional technical integration with yet another gateway.
|
15
8
|
|
16
9
|
Quickstart
|
17
10
|
----------
|
11
|
+
Head over to the [Spreedly Core Website](https://www.spreedlycore.com) to sign up for an account. It's free to get started and play with test gateways/transactions using our specified test card data.
|
18
12
|
|
19
13
|
RubyGems:
|
20
14
|
|
21
|
-
|
15
|
+
export SPREEDLYCORE_API_LOGIN=your_login_here
|
16
|
+
export SPREEDLYCORE_API_SECRET=your_secret_here
|
17
|
+
gem install spreedly-core-ruby
|
22
18
|
irb
|
23
19
|
require 'rubygems'
|
24
|
-
require '
|
25
|
-
SpreedlyCore.configure
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
20
|
+
require 'spreedly-core-ruby'
|
21
|
+
SpreedlyCore.configure
|
22
|
+
|
23
|
+
The first thing we'll need to do is set up a test gateway that we can run transactions against. Then, we'll tell the gem to use the newly created gateway for all future calls.
|
24
|
+
|
25
|
+
tg = SpreedlyCore::TestGateway.get_or_create
|
26
|
+
tg.use!
|
27
|
+
|
28
|
+
Now that you have a test gateway set up, we'll need to set up your payment form to post the credit card data directly to Spreedly Core. Spreedly Core will receive your customer's credit card data, and immediately transfer them back to the location you define inside the web payments form. The user won't know that they're being taken off site to record to the card data, and you as the developer will be left with a token identifier. The token identifier is used to make your charges against, and to access the customer's non-sensitive billing information.
|
29
|
+
|
30
|
+
<form action="https://spreedlycore.com/v1/payment_methods" method="POST">
|
31
|
+
<fieldset>
|
32
|
+
<input name="redirect_url" type="hidden" value="http://example.com/transparent_redirect_complete" />
|
33
|
+
<input name="api_login" type="hidden" value="Ll6fAtoVSTyVMlJEmtpoJV8Shw5" />
|
34
|
+
<label for="credit_card_first_name">First name</label>
|
35
|
+
<input id="credit_card_first_name" name="credit_card[first_name]" type="text" />
|
36
|
+
|
37
|
+
<label for="credit_card_last_name">Last name</label>
|
38
|
+
<input id="credit_card_last_name" name="credit_card[last_name]" type="text" />
|
39
|
+
|
40
|
+
<label for="credit_card_number">Card Number</label>
|
41
|
+
<input id="credit_card_number" name="credit_card[number]" type="text" />
|
42
|
+
|
43
|
+
<label for="credit_card_verification_value">Security Code</label>
|
44
|
+
<input id="credit_card_verification_value" name="credit_card[verification_value]" type="text" />
|
45
|
+
|
46
|
+
<label for="credit_card_month">Expires on</label>
|
47
|
+
<input id="credit_card_month" name="credit_card[month]" type="text" />
|
48
|
+
<input id="credit_card_year" name="credit_card[year]" type="text" />
|
49
|
+
|
50
|
+
<button type='submit'>Submit Payment</button>
|
51
|
+
</fieldset>
|
52
|
+
</form>
|
53
|
+
|
54
|
+
Take special note of the **api_login** and **redirect_url** params hidden in the form, as Spreedly Core will use both of these fields to authenticate the developer's account and to send the customer back to the right location in your app.
|
55
|
+
|
56
|
+
A note about test card data
|
57
|
+
----------------
|
58
|
+
If you've just signed up and have not entered your billing information (or selected a Heroku paid plan), you will only be permitted to deal with test credit card data. Furthermore, we will outright reject any card data that doesn't correspond to the 8 numbers listed below.
|
59
|
+
|
60
|
+
DO NOT USE REAL CREDIT CARD DATA UNTIL YOUR APPLICATION IS LIVE.
|
61
|
+
|
62
|
+
* **Visa**
|
63
|
+
* Good Card - 4111111111111111
|
64
|
+
* Failed Card - 4012888888881881
|
65
|
+
* **MasterCard**
|
66
|
+
* Good Card - 5555555555554444
|
67
|
+
* Failed Card - 5105105105105100
|
68
|
+
* **American Express**
|
69
|
+
* Good Card - 378282246310005
|
70
|
+
* Failed Card - 371449635398431
|
71
|
+
* **Discover**
|
72
|
+
* Failed Card - 6011111111111117
|
73
|
+
* Failed Card - 6011000990139424
|
74
|
+
|
75
|
+
Once you've created your web form and submitted one of the test cards above, you should be returned to your app with a token identifier by which to identify your newly created payment method. Let's go ahead and look up that payment method by the token returned to your app, and we'll charge $5.50 to it.
|
31
76
|
|
32
|
-
payment_token =
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
77
|
+
payment_token = 'abc123' # extracted from the URL params
|
78
|
+
payment_method = SpreedlyCore::PaymentMethod.find(payment_token)
|
79
|
+
if payment_method.valid?
|
80
|
+
purchase_transaction = payment_method.purchase(550)
|
81
|
+
purchase_transaction.succeeded? # true
|
82
|
+
else
|
83
|
+
flash[:notice] = "Woops!\n" + payment_method.errors.join("\n")
|
84
|
+
end
|
37
85
|
|
38
|
-
|
39
|
-
integration testing can be a bit of a headache. No worries though:
|
86
|
+
One final point to take note of is that Spreedly Core does no validation of the information passed in by the customer. We simply return them back to your application, and it's up to you to check for any errors in the payment method before charging against it.
|
40
87
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
88
|
+
Saving Payment Methods
|
89
|
+
----------
|
90
|
+
Spreedly Core allows you to retain payment methods provided by your customer for future use. In general, removing the friction from your checkout process is one of the best things you can do for your application, and using Spreedly Core will allow you to avoid making your customer input their payment details for every purchase.
|
91
|
+
|
92
|
+
payment_token = 'abc123' # extracted from the URL params
|
93
|
+
payment_method = SpreedlyCore::PaymentMethod.find(payment_token)
|
94
|
+
if payment_method.valid?
|
95
|
+
puts "Retaining payment token #{payment_token}"
|
96
|
+
retain_transaction = payment_method.retain
|
97
|
+
retain_transaction.succeeded? # true
|
98
|
+
end
|
51
99
|
|
52
|
-
|
53
|
-
purchase_transaction = payment_method.purchase(100)
|
54
|
-
purchase_transaction.succeeded? # true
|
55
|
-
|
56
|
-
Let's now use a credit card that is configured to fail upon purchase:
|
100
|
+
Payment methods that you no longer want to retain can be redacted from Spreedly Core. Spreedly Core only charges for retained payment methods.
|
57
101
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
purchase_transaction.succeeded? # false
|
63
|
-
|
64
|
-
Other test cards available include :visa, :american_express, and :discover
|
102
|
+
payment_token = 'abc123' # extracted from the URL params
|
103
|
+
payment_method = SpreedlyCore::PaymentMethod.find(payment_token)
|
104
|
+
redact_transaction = payment_method.redact
|
105
|
+
redact_transaction.succeeded? # true
|
65
106
|
|
66
|
-
Usage
|
107
|
+
Usage Overview
|
67
108
|
----------
|
109
|
+
Make a purchase against a payment method
|
68
110
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
require 'spreedly_core/test_extensions' # allow creating payment methods from the command line
|
73
|
-
SpreedlyCore.configure("Your API Login", "Your API Secret", "Test Gateway Token")
|
74
|
-
# or if loading from YAML for example, configure takes a hash as well
|
75
|
-
SpreedlyCore.configure(:login => "Your API Login", :secret => "Your API Secret",
|
76
|
-
:token => "Test Gateway Token")
|
77
|
-
master_card_data = SpreedlyCore::TestHelper.cc_data(:master)
|
78
|
-
token = SpreedlyCore::PaymentMethod.create_test_token(master_card_data)
|
79
|
-
|
80
|
-
|
81
|
-
Look up a payment method:
|
82
|
-
|
83
|
-
payment_method = SpreedlyCore::PaymentMethod.find(token)
|
84
|
-
|
85
|
-
Retain a payment method for later use:
|
86
|
-
|
87
|
-
retain_transaction = payment_method.retain
|
88
|
-
retain_transaction.succeeded? # true
|
111
|
+
purchase_transaction = payment_method.purchase(1245)
|
112
|
+
|
113
|
+
Retain a payment method for future use
|
89
114
|
|
115
|
+
redact_transaction = payment_method.retain
|
116
|
+
|
90
117
|
Redact a previously retained payment method:
|
91
118
|
|
92
119
|
redact_transaction = payment_method.redact
|
93
|
-
redact_transaction.succeeded?
|
94
|
-
|
95
|
-
Make a purchase against a payment method:
|
96
|
-
|
97
|
-
purchase_transaction = payment_method.purchase(100)
|
98
|
-
purchase_transaction.succeeded? # true
|
99
120
|
|
100
121
|
Make an authorize request against a payment method, then capture the payment
|
101
122
|
|
@@ -113,7 +134,7 @@ Void a previous purchase:
|
|
113
134
|
|
114
135
|
purchase_transaction.void # void the purchase
|
115
136
|
|
116
|
-
Credit a previous purchase:
|
137
|
+
Credit (refund) a previous purchase:
|
117
138
|
|
118
139
|
purchase_transaction = payment_method.purchase(100) # make a purchase
|
119
140
|
purchase_transaction.credit
|
@@ -125,47 +146,40 @@ Credit part of a previous purchase:
|
|
125
146
|
purchase_transaction.credit(50) # provide a partial credit
|
126
147
|
purchase_transaction.succeeded? # true
|
127
148
|
|
128
|
-
Handling Exceptions:
|
129
149
|
|
130
|
-
|
150
|
+
Handling Exceptions
|
151
|
+
--------
|
152
|
+
There are 3 types of exceptions which can be raised by the library:
|
131
153
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
unexpected (I.E. we expect a HTTP response code of 200 bunt instead got a
|
136
|
-
500) or if the response does not contain an expected attribute. For
|
137
|
-
example, the response from retaining a payment method should contain an XML
|
138
|
-
attribute of "transaction". If this is not found (for example a HTTP
|
139
|
-
response 404 or 500 is returned), then an InvalidResponse is raised.
|
154
|
+
1. SpreedlyCore::TimeOutError is raised if communication with Spreedly Core takes longer than 10 seconds
|
155
|
+
2. SpreedlyCore::InvalidResponse is raised when the response code is unexpected (I.E. we expect a HTTP response code of 200 bunt instead got a 500) or if the response does not contain an expected attribute. For example, the response from retaining a payment method should contain an XML attribute of "transaction". If this is not found (for example a HTTP response 404 or 500 is returned), then an InvalidResponse is raised.
|
156
|
+
3. SpreedlyCore::UnprocessableRequest is raised when the response code is 422. This denotes a validation error where one or more of the data fields submitted were not valid, or the whole record was unable to be saved/updated. Inspection of the exception message will give an explanation of the issue.
|
140
157
|
|
141
158
|
|
142
|
-
|
159
|
+
Each of TimeOutError, InvalidResponse, and UnprocessableRequest subclass SpreedlyCore::Error.
|
143
160
|
|
144
|
-
|
161
|
+
For example, let's look up a payment method that does not exist:
|
145
162
|
|
146
163
|
begin
|
147
164
|
payment_method = SpreedlyCore::PaymentMethod.find("NOT-FOUND")
|
148
165
|
rescue SpreedlyCore::InvalidResponse => e
|
166
|
+
puts "Record does not exist"
|
149
167
|
puts e.inspect
|
150
168
|
end
|
151
169
|
|
152
170
|
|
153
171
|
Additional Field Validation
|
154
172
|
----------
|
173
|
+
The Spreely Core API provides validation of the credit card number, security code, and
|
174
|
+
first and last name. In most cases this is enough; however, sometimes you may want to
|
175
|
+
enforce the full billing information as well. This can be accomplished via the following:
|
155
176
|
|
156
|
-
|
157
|
-
The Spreedyly Core API provides validation of the credit card number, CVE, and
|
158
|
-
first and last name. In most cases this is enough, however sometimes you want to
|
159
|
-
enforce the billing information as well. This can be accomplished via:
|
160
|
-
|
161
|
-
require 'spreedly_core'
|
162
|
-
require 'spreedly_core/test_extensions'
|
163
|
-
SpreedlyCore.configure("Your API Login", "Your API Secret", "Test Gateway Token")
|
177
|
+
SpreedlyCore.configure
|
164
178
|
SpreedlyCore::PaymentMethod.additional_required_cc_fields :address1, :city, :state, :zip
|
165
179
|
master_card_data = SpreedlyCore::TestHelper.cc_data(:master)
|
166
180
|
token = SpreedlyCore::PaymentMethod.create_test_token(master_card_data)
|
167
181
|
payment_method = SpreedlyCore::PaymentMethod.find(token)
|
168
|
-
payment_method.valid? #
|
182
|
+
payment_method.valid? # false
|
169
183
|
payment_method.errors # ["Address1 can't be blank", "City can't be blank", "State can't be blank", "Zip can't be blank"]
|
170
184
|
master_card_data = SpreedlyCore::TestHelper.cc_data(:master, :credit_card => {:address1 => "742 Evergreen Terrace", :city => "Springfield", :state => "IL", 62701})
|
171
185
|
payment_method = SpreedlyCore::PaymentMethod.find(token)
|
@@ -173,31 +187,40 @@ enforce the billing information as well. This can be accomplished via:
|
|
173
187
|
payment_method.errors # []
|
174
188
|
|
175
189
|
|
176
|
-
Configuring SpreedlyCore
|
190
|
+
Configuring SpreedlyCore for use in production (Rails example)
|
177
191
|
----------
|
192
|
+
When you're ready for primetime, you'll need to complete a couple more steps to start processing real transactions.
|
178
193
|
|
179
|
-
|
194
|
+
1. First, you'll need to get your business (or personal) payment details on file with Spreedly Core so that we can collect transaction and card retention fees. For those of you using Heroku, simply change your Spreedly Core addon to the paid tier.
|
195
|
+
2. Second, you'll need to acquire a gateway that you can plug into the back of Spreedly Core. Any of the major players will work, and you're not at risk of lock-in because Spreedly Core happily plays middle man. Please consult our [list of supported gateways](https://www.spreedlycore.com/manual/gateways) to see exactly what information you'll need to pass to Spreedly Core when creating your gateway profile.
|
180
196
|
|
181
|
-
|
182
|
-
login: <Login Key>
|
183
|
-
secret: <Secret Key>
|
184
|
-
gateway_token: 'JncEWj22g59t3CRB1VnPXmUUgKc' # this is the test gateway, replace with your real gateway in production
|
185
|
-
test:
|
186
|
-
login: <Login Key>
|
187
|
-
secret: <Secret Key>
|
188
|
-
gateway_token: 'JncEWj22g59t3CRB1VnPXmUUgKc' # this is the test gateway, replace with your real gateway in production
|
189
|
-
production:
|
190
|
-
login: <Login Key>
|
191
|
-
secret: <Secret Key>
|
192
|
-
gateway_token: 'JncEWj22g59t3CRB1VnPXmUUgKc' # this is the test gateway, replace with your real gateway in production
|
197
|
+
For this example, I will be using an Authorize.net account that only has a login and password credential.
|
193
198
|
|
194
|
-
|
199
|
+
authorize_credentials = {:login => 'my_authorize_login', :password => 'my_authorize_password'}
|
200
|
+
SpreedlyCore.configure
|
201
|
+
gateway = SpreedlyCore::Gateway.create(authorize_credentials)
|
202
|
+
puts "Authorize.net gateway token is #{gateway.token}"
|
203
|
+
gateway.use!
|
204
|
+
|
205
|
+
For most users, you will start off using only 1 gateway token, and as such can configure an additional environment variable to hold your gateway token. In addition to the previous environment variables, the SpreedlyCore.configure method will also look for a SPREEDLYCORE_GATEWAY_TOKEN environment value.
|
195
206
|
|
196
|
-
|
197
|
-
|
207
|
+
# create an initializer at config/initializers/spreedly_core.rb
|
208
|
+
# values already set for ENV['SPREEDLYCORE_API_LOGIN'], ENV['SPREEDLYCORE_API_SECRET'], and ENV['SPREEDLYCORE_GATEWAY_TOKEN']
|
209
|
+
SpreedlyCore.configure
|
210
|
+
|
211
|
+
For those using multiple gateway tokens, there is a class variable that holds the active gateway token. Before running any sort of transaction against a payment method, you'll need to set the gateway token that you wish to charge against.
|
198
212
|
|
199
|
-
|
213
|
+
SpreedlyCore.configure
|
214
|
+
|
215
|
+
SpreedlyCore.gateway_token(paypal_gateway_token)
|
216
|
+
SpreedlyCore::PaymentMethod.find(pm_token).purchase(550)
|
217
|
+
|
218
|
+
SpreedlyCore.gateway_token(authorize_gateway_token)
|
219
|
+
SpreedlyCore::PaymentMethod.find(pm_token).purchase(2885)
|
220
|
+
|
221
|
+
If you wish to require additional credit card fields, the initializer is the best place to set this up.
|
200
222
|
|
223
|
+
SpreedlyCore.configure
|
201
224
|
SpreedlyCore::PaymentMethod.additional_required_cc_fields :address1, :city, :state, :zip
|
202
225
|
|
203
226
|
Contributing
|
data/lib/spreedly-core-ruby.rb
CHANGED
@@ -44,6 +44,7 @@ module SpreedlyCore
|
|
44
44
|
def self.configure(options = {})
|
45
45
|
login = ENV['SPREEDLYCORE_API_LOGIN']
|
46
46
|
secret = ENV['SPREEDLYCORE_API_SECRET']
|
47
|
+
gateway_token = ENV['SPREEDLYCORE_GATEWAY_TOKEN']
|
47
48
|
|
48
49
|
if options[:api_login]
|
49
50
|
Kernel.warn("ENV and arg both present for api_login. Defaulting to arg value") if login
|
@@ -51,13 +52,19 @@ module SpreedlyCore
|
|
51
52
|
end
|
52
53
|
|
53
54
|
if options[:api_secret]
|
54
|
-
Kernel.warn("ENV and arg both present for api_secret. Defaulting to arg value") if
|
55
|
+
Kernel.warn("ENV and arg both present for api_secret. Defaulting to arg value") if secret
|
55
56
|
secret = options[:api_secret]
|
56
57
|
end
|
57
58
|
|
59
|
+
if options[:gateway_token]
|
60
|
+
Kernel.warn("ENV and arg both present for gateway_token. Defaulting to arg value") if gateway_token
|
61
|
+
gateway_token = options[:gateway_token]
|
62
|
+
end
|
63
|
+
options[:gateway_token] ||= gateway_token
|
64
|
+
|
58
65
|
if options[:api_login] || options[:api_secret]
|
59
66
|
Kernel.warn("It is STRONGLY preferred that you house your Spreedly Core credentials only in environment variables.")
|
60
|
-
Kernel.warn("This gem prefers only environment variables named SPREEDLYCORE_API_LOGIN and
|
67
|
+
Kernel.warn("This gem prefers only environment variables named SPREEDLYCORE_API_LOGIN, SPREEDLYCORE_API_SECRET, and optionally SPREEDLYCORE_GATEWAY_TOKEN.")
|
61
68
|
end
|
62
69
|
|
63
70
|
if login.nil? || secret.nil?
|
@@ -14,7 +14,7 @@ module SpreedlyCore
|
|
14
14
|
# timeout requests after 10 seconds
|
15
15
|
default_timeout 10
|
16
16
|
|
17
|
-
base_uri "
|
17
|
+
base_uri "http://core.spreedly.dev:11001/#{API_VERSION}"
|
18
18
|
|
19
19
|
def self.configure(login, secret, options = {})
|
20
20
|
@@login = login
|
data/test/configuration_test.rb
CHANGED
@@ -6,10 +6,12 @@ module SpreedlyCore
|
|
6
6
|
def test_configure
|
7
7
|
old_verbose, $VERBOSE = $VERBOSE, nil
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
old_api_login = ENV['SPREEDLYCORE_API_LOGIN']
|
10
|
+
old_api_secret = ENV['SPREEDLYCORE_API_SECRET']
|
11
|
+
old_gateway_token = ENV['SPREEDLYCORE_GATEWAY_TOKEN']
|
11
12
|
ENV['SPREEDLYCORE_API_LOGIN'] = nil
|
12
13
|
ENV['SPREEDLYCORE_API_SECRET'] = nil
|
14
|
+
ENV['SPREEDLYCORE_GATEWAY_TOKEN'] = nil
|
13
15
|
|
14
16
|
assert_nothing_raised ArgumentError do
|
15
17
|
SpreedlyCore.configure :api_login => "test",
|
@@ -21,12 +23,15 @@ module SpreedlyCore
|
|
21
23
|
SpreedlyCore.configure
|
22
24
|
end
|
23
25
|
|
24
|
-
ENV['SPREEDLYCORE_API_LOGIN'] =
|
25
|
-
ENV['SPREEDLYCORE_API_SECRET'] =
|
26
|
+
ENV['SPREEDLYCORE_API_LOGIN'] = old_api_login
|
27
|
+
ENV['SPREEDLYCORE_API_SECRET'] = old_api_secret
|
28
|
+
ENV['SPREEDLYCORE_GATEWAY_TOKEN'] = old_gateway_token
|
26
29
|
|
30
|
+
SpreedlyCore.gateway_token = nil
|
27
31
|
assert_nothing_raised ArgumentError do
|
28
32
|
SpreedlyCore.configure
|
29
33
|
end
|
34
|
+
assert_not_nil SpreedlyCore.gateway_token
|
30
35
|
ensure
|
31
36
|
$VERBOSE = old_verbose
|
32
37
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spreedly-core-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,11 +10,11 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-03-
|
13
|
+
date: 2012-03-21 00:00:00.000000000Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: httparty
|
17
|
-
requirement: &
|
17
|
+
requirement: &70198459726880 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - =
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: 0.7.7
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *70198459726880
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: activesupport
|
28
|
-
requirement: &
|
28
|
+
requirement: &70198459725600 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ~>
|
@@ -33,10 +33,10 @@ dependencies:
|
|
33
33
|
version: 3.0.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *70198459725600
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: builder
|
39
|
-
requirement: &
|
39
|
+
requirement: &70198459724560 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ! '>='
|
@@ -44,10 +44,10 @@ dependencies:
|
|
44
44
|
version: '0'
|
45
45
|
type: :runtime
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *70198459724560
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: ruby-debug19
|
50
|
-
requirement: &
|
50
|
+
requirement: &70198459723100 !ruby/object:Gem::Requirement
|
51
51
|
none: false
|
52
52
|
requirements:
|
53
53
|
- - ! '>='
|
@@ -55,10 +55,10 @@ dependencies:
|
|
55
55
|
version: '0'
|
56
56
|
type: :development
|
57
57
|
prerelease: false
|
58
|
-
version_requirements: *
|
58
|
+
version_requirements: *70198459723100
|
59
59
|
- !ruby/object:Gem::Dependency
|
60
60
|
name: rake
|
61
|
-
requirement: &
|
61
|
+
requirement: &70198459721160 !ruby/object:Gem::Requirement
|
62
62
|
none: false
|
63
63
|
requirements:
|
64
64
|
- - =
|
@@ -66,10 +66,10 @@ dependencies:
|
|
66
66
|
version: 0.8.7
|
67
67
|
type: :development
|
68
68
|
prerelease: false
|
69
|
-
version_requirements: *
|
69
|
+
version_requirements: *70198459721160
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: webmock
|
72
|
-
requirement: &
|
72
|
+
requirement: &70198459719780 !ruby/object:Gem::Requirement
|
73
73
|
none: false
|
74
74
|
requirements:
|
75
75
|
- - ~>
|
@@ -77,7 +77,7 @@ dependencies:
|
|
77
77
|
version: 1.6.2
|
78
78
|
type: :development
|
79
79
|
prerelease: false
|
80
|
-
version_requirements: *
|
80
|
+
version_requirements: *70198459719780
|
81
81
|
description: Spreedly Core is a cloud service that allows you to store credit cards
|
82
82
|
and run transactions against them, enabling you to accept payments on your website
|
83
83
|
while avoiding all liability and PCI compliance requirements.
|