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 CHANGED
@@ -1,101 +1,122 @@
1
1
  SpreedlyCore
2
2
  ======
3
3
 
4
- SpreedlyCore is a Ruby library for accessing the [Spreedly Core API](https://spreedlycore.com/).
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
- gem install spreedly_core
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 'spreedly_core'
25
- SpreedlyCore.configure("Your API Login", "Your API Secret", "Test Gateway Token")
26
- See the [quickstart guide](https://spreedlycore.com/manual/quickstart) for
27
- information regarding tokens.
28
-
29
- We'll now look up the payment method stored on SpreedlyCore using token param
30
- from the transparent redirect URL
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 = SpreedlyCore::PaymentMethod.find(payment_token)
33
- transaction = payment_token.purchase(100)
34
-
35
- Test Integration
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
- Since your web form handles the creation of payment methods on their service,
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
- require 'spreedly_core'
42
- require 'spreedly_core/test_extensions'
43
- SpreedlyCore.configure("Your API Login", "Your API Secret", "Test Gateway Token")
44
- master_card_data = SpreedlyCore::TestHelper.cc_data(:master) # Lookup test credit card data
45
- token = SpreedlyCore::PaymentMethod.create_test_token(master_card_data)
46
-
47
- You now have access to a payment method token, which can be used just like your
48
- application would use it. Note, you should use a test gateway since you are
49
- actually hitting the Spreedly Core service. Let's use the test credit card
50
- payment method to make a purchase:
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
- payment_method = SpreedlyCore::PaymentMethod.find(token)
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
- master_card_data = SpreedlyCore::TestHelper.cc_data(:master, :card_type => :failed)
59
- token = SpreedlyCore::PaymentMethod.create_test_token(master_card_data)
60
- payment_method = SpreedlyCore::PaymentMethod.find(token)
61
- purchase_transaction = payment_method.purchase(100)
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
- Using spreedly_core in irb:
70
-
71
- require 'spreedly_core'
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
- There are 2 types of exceptions which can be raised by the library:
150
+ Handling Exceptions
151
+ --------
152
+ There are 3 types of exceptions which can be raised by the library:
131
153
 
132
- 1. SpreedlyCore::TimeOutError is raised if communication with SpreedlyCore
133
- takes longer than 10 seconds
134
- 2. SpreedlyCore::InvalidResponse is raised when the response code is
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
- Both TimeOutError and InvalidResponse subclass SpreedlyCore::Error.
159
+ Each of TimeOutError, InvalidResponse, and UnprocessableRequest subclass SpreedlyCore::Error.
143
160
 
144
- Look up a payment method that does not exist:
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? # returns false
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 with Rails
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
- Inside your Rails project create config/spreedly_core.yml formatted like config/database.yml. For example:
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
- development:
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
- Then create config/initializers/spreedly_core.rb with the following:
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
- config = YAML.load(File.read(RAILS_ROOT + '/config/spreedly_core.yml'))[RAILS_ENV]
197
- SpreedlyCore.configure(config)
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
- Optionally require additional credit card fields:
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
@@ -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 login
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 SPREEDLYCORE_API_SECRET.")
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 "https://www.spreedlycore.com/#{API_VERSION}"
17
+ base_uri "http://core.spreedly.dev:11001/#{API_VERSION}"
18
18
 
19
19
  def self.configure(login, secret, options = {})
20
20
  @@login = login
@@ -1,4 +1,4 @@
1
1
  module SpreedlyCore
2
- Version = VERSION = "0.1.2"
2
+ Version = VERSION = "0.1.3"
3
3
  ApiVersion = API_VERSION = "v1"
4
4
  end
@@ -6,10 +6,12 @@ module SpreedlyCore
6
6
  def test_configure
7
7
  old_verbose, $VERBOSE = $VERBOSE, nil
8
8
 
9
- old_login = ENV['SPREEDLYCORE_API_LOGIN']
10
- old_secret = ENV['SPREEDLYCORE_API_SECRET']
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'] = old_login
25
- ENV['SPREEDLYCORE_API_SECRET'] = old_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.2
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-20 00:00:00.000000000Z
13
+ date: 2012-03-21 00:00:00.000000000Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: httparty
17
- requirement: &70142956731160 !ruby/object:Gem::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: *70142956731160
25
+ version_requirements: *70198459726880
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: activesupport
28
- requirement: &70142956730560 !ruby/object:Gem::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: *70142956730560
36
+ version_requirements: *70198459725600
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: builder
39
- requirement: &70142956730120 !ruby/object:Gem::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: *70142956730120
47
+ version_requirements: *70198459724560
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: ruby-debug19
50
- requirement: &70142956729500 !ruby/object:Gem::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: *70142956729500
58
+ version_requirements: *70198459723100
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: rake
61
- requirement: &70142956728940 !ruby/object:Gem::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: *70142956728940
69
+ version_requirements: *70198459721160
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: webmock
72
- requirement: &70142956728360 !ruby/object:Gem::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: *70142956728360
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.