spreedly-core-ruby 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/{spreedly_core.rb → spreedly-core-ruby.rb} +19 -5
- data/lib/{spreedly_core → spreedly-core-ruby}/base.rb +8 -3
- data/lib/spreedly-core-ruby/gateway.rb +59 -0
- data/lib/{spreedly_core → spreedly-core-ruby}/payment_method.rb +20 -2
- data/lib/{spreedly_core → spreedly-core-ruby}/test_extensions.rb +16 -14
- data/lib/spreedly-core-ruby/test_gateway.rb +16 -0
- data/lib/{spreedly_core → spreedly-core-ruby}/transactions.rb +7 -0
- data/lib/{spreedly_core → spreedly-core-ruby}/version.rb +1 -1
- data/test/configuration_test.rb +19 -11
- data/test/gateway_test.rb +23 -0
- data/test/spreedly_core_test.rb +2 -9
- data/test/test_common.rb +20 -0
- data/test/test_factory.rb +3 -4
- data/test/test_helper.rb +3 -2
- data/test/transaction_test.rb +2 -9
- metadata +47 -27
- data/lib/spreedly_core/gateway.rb +0 -23
- data/lib/spreedly_core/test_gateway.rb +0 -32
- data/test/config/spreedly_core.yml.example +0 -3
@@ -1,12 +1,14 @@
|
|
1
1
|
require 'set'
|
2
2
|
|
3
3
|
require 'httparty'
|
4
|
+
require 'active_support/core_ext/hash/conversions'
|
4
5
|
|
5
|
-
require '
|
6
|
-
require '
|
7
|
-
require '
|
8
|
-
require '
|
9
|
-
require '
|
6
|
+
require 'spreedly-core-ruby/base'
|
7
|
+
require 'spreedly-core-ruby/payment_method'
|
8
|
+
require 'spreedly-core-ruby/gateway'
|
9
|
+
require 'spreedly-core-ruby/test_gateway'
|
10
|
+
require 'spreedly-core-ruby/transactions'
|
11
|
+
require 'active_support/core_ext/hash/conversions'
|
10
12
|
|
11
13
|
module SpreedlyCore
|
12
14
|
# Hash of user friendly credit card name to SpreedlyCore API name
|
@@ -18,6 +20,7 @@ module SpreedlyCore
|
|
18
20
|
}
|
19
21
|
|
20
22
|
class Error < RuntimeError; end
|
23
|
+
|
21
24
|
# Custom exception which occurs when a request to SpreedlyCore times out
|
22
25
|
# See SpreedlyCore::Base.default_timeout
|
23
26
|
class TimeOutError < Error; end
|
@@ -27,6 +30,13 @@ module SpreedlyCore
|
|
27
30
|
end
|
28
31
|
end
|
29
32
|
|
33
|
+
class UnprocessableRequest < Error
|
34
|
+
def initialize(errors)
|
35
|
+
errors = [errors] unless errors.is_a?(Array)
|
36
|
+
super(errors.join("\n"))
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
30
40
|
# Configure SpreedlyCore with a particular account.
|
31
41
|
# Strongly prefers environment variables for credentials
|
32
42
|
# and will issue a stern warning should they not be present.
|
@@ -60,6 +70,10 @@ module SpreedlyCore
|
|
60
70
|
Base.gateway_token = gateway_token
|
61
71
|
end
|
62
72
|
|
73
|
+
def self.gateway_token
|
74
|
+
Base.gateway_token
|
75
|
+
end
|
76
|
+
|
63
77
|
# returns the configured SpreedlyCore login
|
64
78
|
def self.login; Base.login; end
|
65
79
|
|
@@ -5,15 +5,16 @@ module SpreedlyCore
|
|
5
5
|
|
6
6
|
# Net::HTTP::Options is configured to not have a body.
|
7
7
|
# Lets give it the body it's always dreamed of
|
8
|
+
old_verbose, $VERBOSE = $VERBOSE, nil
|
8
9
|
Net::HTTP::Options::RESPONSE_HAS_BODY = true
|
10
|
+
$VERBOSE = old_verbose
|
9
11
|
|
10
12
|
format :xml
|
11
13
|
|
12
14
|
# timeout requests after 10 seconds
|
13
15
|
default_timeout 10
|
14
16
|
|
15
|
-
|
16
|
-
base_uri "http://core.spreedly.dev:11001/#{API_VERSION}"
|
17
|
+
base_uri "https://www.spreedlycore.com/#{API_VERSION}"
|
17
18
|
|
18
19
|
def self.configure(login, secret, options = {})
|
19
20
|
@@login = login
|
@@ -34,7 +35,7 @@ module SpreedlyCore
|
|
34
35
|
# make a put request to path
|
35
36
|
# If the request succeeds, provide the respones to the &block
|
36
37
|
def self.verify_put(path, options={}, &block)
|
37
|
-
verify_request(:put, path, options,
|
38
|
+
verify_request(:put, path, options, 200, 422, &block)
|
38
39
|
end
|
39
40
|
|
40
41
|
# make a get request to path
|
@@ -70,6 +71,10 @@ module SpreedlyCore
|
|
70
71
|
raise InvalidResponse.new(response, "Expected parsed response to contain key '#{options[:has_key]}'")
|
71
72
|
end
|
72
73
|
|
74
|
+
if (response.code == 422 && !response.parsed_response.nil? && response.parsed_response.has_key?("errors"))
|
75
|
+
raise UnprocessableRequest.new(response.parsed_response["errors"]["error"])
|
76
|
+
end
|
77
|
+
|
73
78
|
block.call(response).tap do |obj|
|
74
79
|
obj.instance_variable_set("@http_code", response.code)
|
75
80
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module SpreedlyCore
|
2
|
+
class Gateway < Base
|
3
|
+
attr_reader(:name, :token, :gateway_type, :auth_modes, :supports_capture,
|
4
|
+
:supports_authorize, :supports_purchase, :supports_void,
|
5
|
+
:supports_credit, :redacted)
|
6
|
+
|
7
|
+
# returns an array of Gateway which are supported
|
8
|
+
def self.supported_gateways
|
9
|
+
verify_options("/gateways.xml") do |response|
|
10
|
+
response.parsed_response["gateways"]["gateway"].map{|h| new(h) }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# returns an array of all the Gateways owned by the account
|
15
|
+
def self.all
|
16
|
+
verify_get("/gateways.xml") do |response|
|
17
|
+
# will return Hash if only 1 gateways->gateway, Array otherwise
|
18
|
+
gateways = begin
|
19
|
+
response.parsed_response["gateways"]["gateway"]
|
20
|
+
rescue
|
21
|
+
nil
|
22
|
+
end
|
23
|
+
if gateways
|
24
|
+
gateways = [gateways] unless gateways.is_a?(Array)
|
25
|
+
|
26
|
+
return gateways.collect{|gateway_hash| new gateway_hash}
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
return []
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.create(gateway_options)
|
34
|
+
raise ArgumentError.new("gateway_options must be a hash") unless gateway_options.is_a?(Hash)
|
35
|
+
|
36
|
+
opts = {
|
37
|
+
:headers => {"Content-Type" => "application/xml"},
|
38
|
+
:body => gateway_options.to_xml(:root => :gateway, :dasherize => false),
|
39
|
+
}
|
40
|
+
|
41
|
+
verify_post("/gateways.xml", opts) do |response|
|
42
|
+
return new response.parsed_response["gateway"]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def initialize(attrs={})
|
47
|
+
attrs.merge!(attrs.delete("characteristics") || {})
|
48
|
+
super(attrs)
|
49
|
+
end
|
50
|
+
|
51
|
+
def use!
|
52
|
+
self.class.gateway_token = self.token
|
53
|
+
end
|
54
|
+
|
55
|
+
def ==(other)
|
56
|
+
self.token == other.token
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -25,6 +25,12 @@ module SpreedlyCore
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
+
def self.create(credit_card)
|
29
|
+
verify_post("/payment_methods.xml", :body => {:credit_card => credit_card}) do |response|
|
30
|
+
AddPaymentMethodTransaction.new(response.parsed_response["transaction"])
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
28
34
|
# Create a new PaymentMethod based on the attrs hash and then validate
|
29
35
|
def initialize(attrs={})
|
30
36
|
super(attrs)
|
@@ -33,14 +39,14 @@ module SpreedlyCore
|
|
33
39
|
|
34
40
|
# Retain the payment method
|
35
41
|
def retain
|
36
|
-
verify_put("/payment_methods/#{token}/retain.xml", :body => {}, :has_key => "transaction") do |response|
|
42
|
+
self.class.verify_put("/payment_methods/#{token}/retain.xml", :body => {}, :has_key => "transaction") do |response|
|
37
43
|
RetainTransaction.new(response.parsed_response["transaction"])
|
38
44
|
end
|
39
45
|
end
|
40
46
|
|
41
47
|
# Redact the payment method
|
42
48
|
def redact
|
43
|
-
verify_put("/payment_methods/#{token}/redact.xml", :body => {}, :has_key => "transaction") do |response|
|
49
|
+
self.class.verify_put("/payment_methods/#{token}/redact.xml", :body => {}, :has_key => "transaction") do |response|
|
44
50
|
RedactTransaction.new(response.parsed_response["transaction"])
|
45
51
|
end
|
46
52
|
end
|
@@ -55,6 +61,18 @@ module SpreedlyCore
|
|
55
61
|
purchase_or_authorize(:authorize, amount, currency, _gateway_token, ip_address)
|
56
62
|
end
|
57
63
|
|
64
|
+
# Update the attributes of a payment method
|
65
|
+
def update(attributes)
|
66
|
+
opts = {
|
67
|
+
:headers => {"Content-Type" => "application/xml"},
|
68
|
+
:body => attributes.to_xml(:root => "payment_method", :dasherize => false)
|
69
|
+
}
|
70
|
+
|
71
|
+
self.class.verify_put("/payment_methods/#{token}.xml", opts) do |response|
|
72
|
+
PaymentMethod.new(response.parsed_response["payment_method"])
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
58
76
|
# Returns the URL that CC data should be submitted to.
|
59
77
|
def self.submit_url
|
60
78
|
Base.base_uri + '/payment_methods'
|
@@ -38,24 +38,26 @@ module SpreedlyCore
|
|
38
38
|
end
|
39
39
|
|
40
40
|
class PaymentMethod
|
41
|
-
|
42
41
|
# Call spreedly core to create a test token.
|
43
42
|
# pass_through_data will be added as the "data" field.
|
44
43
|
#
|
45
|
-
def self.create_test_token(
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
44
|
+
def self.create_test_token(cc_overrides = {})
|
45
|
+
card = {
|
46
|
+
:first_name => "John",
|
47
|
+
:last_name => "Foo",
|
48
|
+
:card_type => :visa,
|
49
|
+
:number => '4111111111111111',
|
50
|
+
:verification_value => 123,
|
51
|
+
:month => 4,
|
52
|
+
:year => Time.now.year + 1
|
53
|
+
}
|
54
|
+
if cc_overrides.is_a?(Hash)
|
55
|
+
overrides = cc_overrides[:credit_card] || cc_overrides["credit_card"] || cc_overrides
|
56
|
+
card.merge!(overrides)
|
56
57
|
end
|
57
|
-
|
58
|
-
|
58
|
+
|
59
|
+
pm = PaymentMethod.create(card)
|
60
|
+
pm.payment_method["token"]
|
59
61
|
end
|
60
62
|
end
|
61
63
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module SpreedlyCore
|
2
|
+
class TestGateway < Gateway
|
3
|
+
# gets a test gateway, creates if necessary
|
4
|
+
def self.get_or_create
|
5
|
+
# get the list of gateways and return the first test gateway
|
6
|
+
# if none exist, create one
|
7
|
+
gateways = Gateway.all
|
8
|
+
gateways.each do |g|
|
9
|
+
return g if g.gateway_type == "test" && g.redacted == false
|
10
|
+
end
|
11
|
+
|
12
|
+
# no test gateway yet, let's create one
|
13
|
+
return Gateway.create(:gateway_type => "test")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -138,5 +138,12 @@ module SpreedlyCore
|
|
138
138
|
handles "Credit"
|
139
139
|
attr_reader :reference_token
|
140
140
|
end
|
141
|
+
|
142
|
+
class AddPaymentMethodTransaction < Transaction
|
143
|
+
include HasIpAddress
|
144
|
+
|
145
|
+
handles "AddPaymentMethod"
|
146
|
+
attr_reader :payment_method
|
147
|
+
end
|
141
148
|
|
142
149
|
end
|
data/test/configuration_test.rb
CHANGED
@@ -4,23 +4,31 @@ module SpreedlyCore
|
|
4
4
|
class ConfigureTest < Test::Unit::TestCase
|
5
5
|
|
6
6
|
def test_configure
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
7
|
+
old_verbose, $VERBOSE = $VERBOSE, nil
|
8
|
+
|
9
|
+
old_login = ENV['SPREEDLYCORE_API_LOGIN']
|
10
|
+
old_secret = ENV['SPREEDLYCORE_API_SECRET']
|
11
|
+
ENV['SPREEDLYCORE_API_LOGIN'] = nil
|
12
|
+
ENV['SPREEDLYCORE_API_SECRET'] = nil
|
13
|
+
|
14
|
+
assert_nothing_raised ArgumentError do
|
15
|
+
SpreedlyCore.configure :api_login => "test",
|
16
|
+
:api_secret => "secret",
|
17
|
+
:gateway_token => "token"
|
18
|
+
end
|
16
19
|
|
17
20
|
assert_raises ArgumentError do
|
18
21
|
SpreedlyCore.configure
|
19
22
|
end
|
20
23
|
|
21
|
-
|
22
|
-
|
24
|
+
ENV['SPREEDLYCORE_API_LOGIN'] = old_login
|
25
|
+
ENV['SPREEDLYCORE_API_SECRET'] = old_secret
|
26
|
+
|
27
|
+
assert_nothing_raised ArgumentError do
|
28
|
+
SpreedlyCore.configure
|
23
29
|
end
|
30
|
+
ensure
|
31
|
+
$VERBOSE = old_verbose
|
24
32
|
end
|
25
33
|
|
26
34
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'test_common'
|
2
|
+
|
3
|
+
module SpreedlyCore
|
4
|
+
class GatewayTest < Test::Unit::TestCase
|
5
|
+
include TestCommon
|
6
|
+
|
7
|
+
def test_gets_all
|
8
|
+
tg1 = TestGateway.get_or_create
|
9
|
+
all = Gateway.all
|
10
|
+
assert all.include?(tg1)
|
11
|
+
|
12
|
+
tg2 = Gateway.create(:gateway_type => 'test')
|
13
|
+
all = Gateway.all
|
14
|
+
[tg1, tg2].each{|g| assert all.include?(g)}
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_create_succeeds_for_test
|
18
|
+
assert_nothing_raised InvalidResponse do
|
19
|
+
Gateway.create(:gateway_type => 'test')
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/test/spreedly_core_test.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'test_common'
|
2
2
|
|
3
3
|
|
4
4
|
# In order to run tests
|
@@ -6,14 +6,7 @@ require 'test_helper'
|
|
6
6
|
# 2. Add your spreedly core credentials to test/config/spreedly_core.yml
|
7
7
|
module SpreedlyCore
|
8
8
|
class SpreedlyCoreTest < Test::Unit::TestCase
|
9
|
-
include
|
10
|
-
include TestFactory
|
11
|
-
|
12
|
-
def setup
|
13
|
-
config = YAML.load(File.read(File.dirname(__FILE__) + '/config/spreedly_core.yml'))
|
14
|
-
SpreedlyCore.configure(config)
|
15
|
-
PaymentMethod.reset_additional_required_cc_fields
|
16
|
-
end
|
9
|
+
include TestCommon
|
17
10
|
|
18
11
|
def test_mocked_500_error
|
19
12
|
with_disabled_network do
|
data/test/test_common.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module SpreedlyCore
|
4
|
+
module TestCommon
|
5
|
+
include TestHelper
|
6
|
+
include TestFactory
|
7
|
+
|
8
|
+
def setup
|
9
|
+
raise "environment variables for SPREEDLYCORE_API_LOGIN and SPREEDLYCORE_API_SECRET must be set" unless ENV['SPREEDLYCORE_API_LOGIN'] && ENV['SPREEDLYCORE_API_SECRET']
|
10
|
+
|
11
|
+
SpreedlyCore.configure
|
12
|
+
unless SpreedlyCore.gateway_token
|
13
|
+
gateway = SpreedlyCore::TestGateway.get_or_create
|
14
|
+
gateway.use!
|
15
|
+
end
|
16
|
+
|
17
|
+
PaymentMethod.reset_additional_required_cc_fields
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/test/test_factory.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
module SpreedlyCore
|
2
2
|
module TestFactory
|
3
3
|
def given_a_payment_method(cc_card=:master, card_options={})
|
4
|
-
token = PaymentMethod.create_test_token cc_data(cc_card, card_options)
|
5
|
-
assert payment_method = PaymentMethod.find(token)
|
6
|
-
assert_equal "customer-42", payment_method.data
|
4
|
+
token = PaymentMethod.create_test_token cc_data(cc_card, card_options)
|
5
|
+
assert payment_method = PaymentMethod.find(token), "Couldn't find payment method with token(#{token})"
|
7
6
|
assert_equal token, payment_method.token
|
8
7
|
payment_method
|
9
8
|
end
|
@@ -92,7 +91,7 @@ module SpreedlyCore
|
|
92
91
|
assert_equal credit_amount, credit.amount
|
93
92
|
assert_equal ip_address, credit.ip
|
94
93
|
assert credit.succeeded?
|
95
|
-
|
94
|
+
assert_equal CreditTransaction, credit.class
|
96
95
|
credit
|
97
96
|
end
|
98
97
|
end
|
data/test/test_helper.rb
CHANGED
@@ -8,8 +8,8 @@ Bundler.setup(:default, :development)
|
|
8
8
|
Bundler.require(:default, :development)
|
9
9
|
|
10
10
|
$LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
|
11
|
-
require '
|
12
|
-
require '
|
11
|
+
require 'spreedly-core-ruby'
|
12
|
+
require 'spreedly-core-ruby/test_extensions'
|
13
13
|
require 'test_factory'
|
14
14
|
|
15
15
|
require 'webmock/test_unit'
|
@@ -20,6 +20,7 @@ require 'webmock'
|
|
20
20
|
|
21
21
|
class Test::Unit::TestCase
|
22
22
|
def assert_false(test, failure_message=nil)
|
23
|
+
failure_message = "" if failure_message.nil?
|
23
24
|
assert(!test, failure_message)
|
24
25
|
end
|
25
26
|
|
data/test/transaction_test.rb
CHANGED
@@ -1,15 +1,8 @@
|
|
1
|
-
require '
|
1
|
+
require 'test_common'
|
2
2
|
|
3
3
|
module SpreedlyCore
|
4
4
|
class TransactionTest < Test::Unit::TestCase
|
5
|
-
include
|
6
|
-
include TestFactory
|
7
|
-
|
8
|
-
def setup
|
9
|
-
config = YAML.load(File.read(File.dirname(__FILE__) + '/config/spreedly_core.yml'))
|
10
|
-
SpreedlyCore.configure(config)
|
11
|
-
PaymentMethod.reset_additional_required_cc_fields
|
12
|
-
end
|
5
|
+
include TestCommon
|
13
6
|
|
14
7
|
def test_not_found_transaction
|
15
8
|
assert_raises InvalidResponse do
|
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.2
|
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-20 00:00:00.000000000Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: httparty
|
17
|
-
requirement: &
|
17
|
+
requirement: &70142956731160 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - =
|
@@ -22,10 +22,32 @@ dependencies:
|
|
22
22
|
version: 0.7.7
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *70142956731160
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: activesupport
|
28
|
+
requirement: &70142956730560 !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 3.0.0
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: *70142956730560
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: builder
|
39
|
+
requirement: &70142956730120 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ! '>='
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
45
|
+
type: :runtime
|
46
|
+
prerelease: false
|
47
|
+
version_requirements: *70142956730120
|
26
48
|
- !ruby/object:Gem::Dependency
|
27
49
|
name: ruby-debug19
|
28
|
-
requirement: &
|
50
|
+
requirement: &70142956729500 !ruby/object:Gem::Requirement
|
29
51
|
none: false
|
30
52
|
requirements:
|
31
53
|
- - ! '>='
|
@@ -33,10 +55,10 @@ dependencies:
|
|
33
55
|
version: '0'
|
34
56
|
type: :development
|
35
57
|
prerelease: false
|
36
|
-
version_requirements: *
|
58
|
+
version_requirements: *70142956729500
|
37
59
|
- !ruby/object:Gem::Dependency
|
38
60
|
name: rake
|
39
|
-
requirement: &
|
61
|
+
requirement: &70142956728940 !ruby/object:Gem::Requirement
|
40
62
|
none: false
|
41
63
|
requirements:
|
42
64
|
- - =
|
@@ -44,10 +66,10 @@ dependencies:
|
|
44
66
|
version: 0.8.7
|
45
67
|
type: :development
|
46
68
|
prerelease: false
|
47
|
-
version_requirements: *
|
69
|
+
version_requirements: *70142956728940
|
48
70
|
- !ruby/object:Gem::Dependency
|
49
71
|
name: webmock
|
50
|
-
requirement: &
|
72
|
+
requirement: &70142956728360 !ruby/object:Gem::Requirement
|
51
73
|
none: false
|
52
74
|
requirements:
|
53
75
|
- - ~>
|
@@ -55,8 +77,10 @@ dependencies:
|
|
55
77
|
version: 1.6.2
|
56
78
|
type: :development
|
57
79
|
prerelease: false
|
58
|
-
version_requirements: *
|
59
|
-
description:
|
80
|
+
version_requirements: *70142956728360
|
81
|
+
description: Spreedly Core is a cloud service that allows you to store credit cards
|
82
|
+
and run transactions against them, enabling you to accept payments on your website
|
83
|
+
while avoiding all liability and PCI compliance requirements.
|
60
84
|
email: support@spreedly.com
|
61
85
|
executables: []
|
62
86
|
extensions: []
|
@@ -65,18 +89,19 @@ files:
|
|
65
89
|
- README.md
|
66
90
|
- Rakefile
|
67
91
|
- LICENSE
|
68
|
-
- lib/
|
69
|
-
- lib/
|
70
|
-
- lib/
|
71
|
-
- lib/
|
72
|
-
- lib/
|
73
|
-
- lib/
|
74
|
-
- lib/
|
75
|
-
- lib/
|
76
|
-
- test/config/spreedly_core.yml.example
|
92
|
+
- lib/spreedly-core-ruby/base.rb
|
93
|
+
- lib/spreedly-core-ruby/gateway.rb
|
94
|
+
- lib/spreedly-core-ruby/payment_method.rb
|
95
|
+
- lib/spreedly-core-ruby/test_extensions.rb
|
96
|
+
- lib/spreedly-core-ruby/test_gateway.rb
|
97
|
+
- lib/spreedly-core-ruby/transactions.rb
|
98
|
+
- lib/spreedly-core-ruby/version.rb
|
99
|
+
- lib/spreedly-core-ruby.rb
|
77
100
|
- test/configuration_test.rb
|
78
101
|
- test/factories.rb
|
102
|
+
- test/gateway_test.rb
|
79
103
|
- test/spreedly_core_test.rb
|
104
|
+
- test/test_common.rb
|
80
105
|
- test/test_factory.rb
|
81
106
|
- test/test_helper.rb
|
82
107
|
- test/transaction_test.rb
|
@@ -92,22 +117,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
92
117
|
- - ! '>='
|
93
118
|
- !ruby/object:Gem::Version
|
94
119
|
version: '0'
|
95
|
-
segments:
|
96
|
-
- 0
|
97
|
-
hash: 2785672719963464473
|
98
120
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
99
121
|
none: false
|
100
122
|
requirements:
|
101
123
|
- - ! '>='
|
102
124
|
- !ruby/object:Gem::Version
|
103
125
|
version: '0'
|
104
|
-
segments:
|
105
|
-
- 0
|
106
|
-
hash: 2785672719963464473
|
107
126
|
requirements: []
|
108
127
|
rubyforge_project:
|
109
128
|
rubygems_version: 1.8.17
|
110
129
|
signing_key:
|
111
130
|
specification_version: 3
|
112
|
-
summary: Ruby
|
131
|
+
summary: Ruby interface for Spreedly Core
|
113
132
|
test_files: []
|
133
|
+
has_rdoc:
|
@@ -1,23 +0,0 @@
|
|
1
|
-
module SpreedlyCore
|
2
|
-
class Gateway < Base
|
3
|
-
attr_reader(:name, :token, :gateway_type, :auth_modes, :supports_capture,
|
4
|
-
:supports_authorize, :supports_purchase, :supports_void,
|
5
|
-
:supports_credit, :redacted)
|
6
|
-
|
7
|
-
# returns an array of Gateway which are supported
|
8
|
-
def self.supported_gateways
|
9
|
-
verify_options("/gateways.xml") do |response|
|
10
|
-
response.parsed_response["gateways"]["gateway"].map{|h| new(h) }
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def initialize(attrs={})
|
15
|
-
attrs.merge!(attrs.delete("characteristics") || {})
|
16
|
-
super(attrs)
|
17
|
-
end
|
18
|
-
|
19
|
-
def use!
|
20
|
-
self.class.gateway_token = self.token
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
module SpreedlyCore
|
2
|
-
class TestGateway < Gateway
|
3
|
-
# gets a test gateway, creates if necessary
|
4
|
-
def self.get_or_create
|
5
|
-
# get the list of gateways and return the first test gateway
|
6
|
-
# if none exist, create one
|
7
|
-
verify_get("/gateways.xml") do |response|
|
8
|
-
# will return Hash if only 1 gateways->gateway, Array otherwise
|
9
|
-
gateways = response.parsed_response["gateways"]["gateway"]
|
10
|
-
gateways = [gateways] unless gateways.is_a?(Array)
|
11
|
-
|
12
|
-
gateways.each do |gateway_hash|
|
13
|
-
g = new gateway_hash
|
14
|
-
return g if g.gateway_type == "test" && g.redacted == false
|
15
|
-
end unless gateways.nil?
|
16
|
-
end
|
17
|
-
|
18
|
-
# no test gateway yet, let's create one
|
19
|
-
opts = {
|
20
|
-
:headers => {"Content-Type" => "application/xml"},
|
21
|
-
:body => '<gateway><gateway_type>test</gateway_type></gateway>'
|
22
|
-
}
|
23
|
-
|
24
|
-
verify_post("/gateways.xml", opts) do |response|
|
25
|
-
return new response.parsed_response["gateway"]
|
26
|
-
end
|
27
|
-
|
28
|
-
# HTTP 724
|
29
|
-
return nil
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|