stripe 1.8.3 → 1.8.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,7 @@
1
+ === 1.8.3 2013-07-11
2
+
3
+ * Add support for new cards API (Stripe API version 2013-07-05)
4
+
1
5
  === 1.8.3 2013-05-06
2
6
 
3
7
  * 1 bugfix:
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.8.3
1
+ 1.8.4
@@ -1,3 +1,3 @@
1
1
  source "https://rubygems.org"
2
2
  gemspec :path => File.join(File.dirname(__FILE__), "..")
3
- gem "activesupport"
3
+ gem "activesupport", "~> 3.0"
@@ -1,4 +1,4 @@
1
1
  source "https://rubygems.org"
2
2
  gemspec :path => File.join(File.dirname(__FILE__), "..")
3
3
  gem "json"
4
- gem "activesupport"
4
+ gem "activesupport", "~> 3.0"
@@ -1,4 +1,4 @@
1
1
  source "https://rubygems.org"
2
2
  gemspec :path => File.join(File.dirname(__FILE__), "..")
3
3
  gem "yajl-ruby"
4
- gem "activesupport"
4
+ gem "activesupport", "~> 3.0"
@@ -33,6 +33,7 @@ require 'stripe/token'
33
33
  require 'stripe/event'
34
34
  require 'stripe/transfer'
35
35
  require 'stripe/recipient'
36
+ require 'stripe/card'
36
37
 
37
38
  # Errors
38
39
  require 'stripe/errors/stripe_error'
@@ -0,0 +1,14 @@
1
+ module Stripe
2
+ class Card < APIResource
3
+ include Stripe::APIOperations::Update
4
+ include Stripe::APIOperations::Delete
5
+
6
+ def url
7
+ "#{Customer.url}/#{CGI.escape(customer)}/cards/#{CGI.escape(id)}"
8
+ end
9
+
10
+ def self.retrieve(id, api_key=nil)
11
+ raise NotImplementedError.new("Cards cannot be retrieved without a customer ID. Retrieve a card using customer.cards.retrieve('card_id')")
12
+ end
13
+ end
14
+ end
@@ -1,14 +1,35 @@
1
1
  module Stripe
2
2
  class ListObject < StripeObject
3
3
 
4
+ def [](k)
5
+ case k
6
+ when String, Symbol
7
+ super
8
+ else
9
+ raise ArgumentError.new("You tried to access the #{k.inspect} index, but ListObject types only support String keys. (HINT: List calls return an object with a 'data' (which is the data array). You likely want to call #data[#{k.inspect}])")
10
+ end
11
+ end
12
+
4
13
  def each(&blk)
5
14
  self.data.each(&blk)
6
15
  end
7
16
 
8
- def all(filters={})
9
- response, api_key = Stripe.request(:get, url, api_key, filters)
17
+ def retrieve(id, api_key=nil)
18
+ api_key ||= @api_key
19
+ response, api_key = Stripe.request(:get,"#{url}/#{CGI.escape(id)}", api_key)
10
20
  Util.convert_to_stripe_object(response, api_key)
11
21
  end
12
22
 
23
+ def create(params={}, api_key=nil)
24
+ api_key ||= @api_key
25
+ response, api_key = Stripe.request(:post, url, api_key, params)
26
+ Util.convert_to_stripe_object(response, api_key)
27
+ end
28
+
29
+ def all(params={}, api_key=nil)
30
+ api_key ||= @api_key
31
+ response, api_key = Stripe.request(:get, url, api_key, params)
32
+ Util.convert_to_stripe_object(response, api_key)
33
+ end
13
34
  end
14
35
  end
@@ -15,8 +15,8 @@ module Stripe
15
15
  end
16
16
  end
17
17
 
18
- def self.convert_to_stripe_object(resp, api_key)
19
- types = {
18
+ def self.object_classes
19
+ @object_classes ||= {
20
20
  'charge' => Charge,
21
21
  'customer' => Customer,
22
22
  'invoiceitem' => InvoiceItem,
@@ -26,24 +26,27 @@ module Stripe
26
26
  'event' => Event,
27
27
  'transfer' => Transfer,
28
28
  'recipient' => Recipient,
29
+ 'card' => Card,
29
30
  'list' => ListObject
30
31
  }
32
+ end
33
+
34
+ def self.convert_to_stripe_object(resp, api_key)
31
35
  case resp
32
36
  when Array
33
37
  resp.map { |i| convert_to_stripe_object(i, api_key) }
34
38
  when Hash
35
- # Try converting to a known object class. If none available, fall back to generic APIResource
36
- if klass_name = resp[:object]
37
- klass = types[klass_name]
38
- end
39
- klass ||= StripeObject
40
- klass.construct_from(resp, api_key)
39
+ # Try converting to a known object class. If none available, fall back to generic StripeObject
40
+ object_classes.fetch(resp[:object], StripeObject).construct_from(resp, api_key)
41
41
  else
42
42
  resp
43
43
  end
44
44
  end
45
45
 
46
46
  def self.file_readable(file)
47
+ # This is nominally equivalent to File.readable?, but that can
48
+ # report incorrect results on some more oddball filesystems
49
+ # (such as AFS)
47
50
  begin
48
51
  File.open(file) { |f| }
49
52
  rescue
@@ -1,3 +1,3 @@
1
1
  module Stripe
2
- VERSION = '1.8.3'
2
+ VERSION = '1.8.4'
3
3
  end
@@ -16,8 +16,8 @@ spec = Gem::Specification.new do |s|
16
16
  s.add_dependency('rest-client', '~> 1.4')
17
17
  s.add_dependency('multi_json', '>= 1.0.4', '< 2')
18
18
 
19
- s.add_development_dependency('mocha')
20
- s.add_development_dependency('shoulda')
19
+ s.add_development_dependency('mocha', '~> 0.13.2')
20
+ s.add_development_dependency('shoulda', '~> 3.4.0')
21
21
  s.add_development_dependency('test-unit')
22
22
  s.add_development_dependency('rake')
23
23
 
@@ -1,11 +1,11 @@
1
1
  require 'stringio'
2
2
  require 'test/unit'
3
3
  require 'stripe'
4
- require 'mocha'
4
+ require 'mocha/setup'
5
5
  include Mocha
6
6
 
7
7
  #monkeypatch request methods
8
- module Stripe
8
+ module Stripe
9
9
  @mock_rest_client = nil
10
10
 
11
11
  def self.mock_rest_client=(mock_client)
@@ -42,16 +42,9 @@ def test_customer(params={})
42
42
  :livemode => false,
43
43
  :object => "customer",
44
44
  :id => "c_test_customer",
45
- :active_card => {
46
- :type => "Visa",
47
- :last4 => "4242",
48
- :exp_month => 11,
49
- :country => "US",
50
- :exp_year => 2012,
51
- :id => "cc_test_card",
52
- :object => "card"
53
- },
54
- :created => 1304114758
45
+ :default_card => "cc_test_card",
46
+ :created => 1304114758,
47
+ :cards => test_card_array('c_test_customer')
55
48
  }.merge(params)
56
49
  end
57
50
 
@@ -88,12 +81,20 @@ end
88
81
 
89
82
  def test_charge_array
90
83
  {
91
- :data => [test_charge, test_charge, test_charge],
84
+ :data => [test_charge, test_charge, test_charge],
92
85
  :object => 'list',
93
86
  :url => '/v1/charges'
94
87
  }
95
88
  end
96
89
 
90
+ def test_card_array(customer_id)
91
+ {
92
+ :data => [test_card, test_card, test_card],
93
+ :object => 'list',
94
+ :url => '/v1/customers/' + customer_id + '/cards'
95
+ }
96
+ end
97
+
97
98
  def test_card(params={})
98
99
  {
99
100
  :type => "Visa",
@@ -102,7 +103,8 @@ def test_card(params={})
102
103
  :country => "US",
103
104
  :exp_year => 2012,
104
105
  :id => "cc_test_card",
105
- :object => "card"
106
+ :customer => 'c_test_customer',
107
+ :object => "card"
106
108
  }.merge(params)
107
109
  end
108
110
 
@@ -112,7 +114,7 @@ def test_coupon(params={})
112
114
  :duration_in_months => 3,
113
115
  :percent_off => 25,
114
116
  :id => "co_test_coupon",
115
- :object => "coupon"
117
+ :object => "coupon"
116
118
  }.merge(params)
117
119
  end
118
120
 
@@ -2,7 +2,7 @@
2
2
  require File.expand_path('../test_helper', __FILE__)
3
3
  require 'test/unit'
4
4
  require 'shoulda'
5
- require 'mocha'
5
+ require 'mocha/setup'
6
6
  require 'pp'
7
7
  require 'rest-client'
8
8
  require 'cgi'
@@ -454,12 +454,6 @@ class TestStripeRuby < Test::Unit::TestCase
454
454
  assert_equal c.mnemonic, "bar"
455
455
  end
456
456
 
457
- should "customers should have Card objects associated with their active_ard property" do
458
- @mock.expects(:get).once.returns(test_response(test_customer))
459
- c = Stripe::Customer.retrieve("test_customer")
460
- assert c.active_card.kind_of?(Stripe::StripeObject) && c.active_card.object == 'card'
461
- end
462
-
463
457
  should "create should return a new customer" do
464
458
  @mock.expects(:post).once.returns(test_response(test_customer))
465
459
  c = Stripe::Customer.create
@@ -512,8 +506,51 @@ class TestStripeRuby < Test::Unit::TestCase
512
506
  end
513
507
 
514
508
  context "card tests" do
509
+ should "be able to create a new card for a customer" do
510
+ @mock.expects(:get).once.returns(test_response(test_customer))
511
+ customer = Stripe::Customer.retrieve("test_customer")
512
+
513
+ @mock.expects(:post).once.returns(test_response(test_card))
514
+ card = customer.cards.create(:card => 'card')
515
+ assert card.kind_of? Stripe::Card
516
+ end
517
+
518
+ should "be able to retrieve a card for a customer" do
519
+ @mock.expects(:get).once.with("#{Stripe.api_base}/v1/customers/c_test_customer", nil, nil).returns(test_response(test_customer))
520
+ customer = Stripe::Customer.retrieve("c_test_customer")
521
+
522
+ @mock.expects(:get).once.with("#{Stripe.api_base}/v1/customers/c_test_customer/cards/cc_test_card", nil, nil).returns(test_response(test_card))
523
+ card = customer.cards.retrieve("cc_test_card")
524
+ assert card.kind_of? Stripe::Card
525
+ end
526
+
527
+ should "be able to list all cards for a customer" do
528
+ @mock.expects(:get).once.with("#{Stripe.api_base}/v1/customers/c_test_customer", nil, nil).returns(test_response(test_customer))
529
+ customer = Stripe::Customer.retrieve("c_test_customer")
530
+
531
+ @mock.expects(:get).once.with("#{Stripe.api_base}/v1/customers/c_test_customer/cards", nil, nil).returns(test_response(test_card_array("c_test_customer")))
532
+ cards = customer.cards.all()
533
+ assert cards.data.kind_of? Array
534
+ cards.each do |card|
535
+ assert card.kind_of?(Stripe::Card)
536
+ end
537
+ end
538
+
539
+ should "be able to update a card for a customer" do
540
+ @mock.expects(:get).once.with("#{Stripe.api_base}/v1/customers/c_test_customer", nil, nil).returns(test_response(test_customer))
541
+ customer = Stripe::Customer.retrieve("c_test_customer")
542
+ @mock.expects(:get).once.with("#{Stripe.api_base}/v1/customers/c_test_customer/cards/cc_test_card", nil, nil).returns(test_response(test_card))
543
+ card = customer.cards.retrieve("cc_test_card")
544
+
545
+ @mock.expects(:post).once.with("#{Stripe.api_base}/v1/customers/c_test_customer/cards/cc_test_card", nil, "address_zip=zippy").returns(test_response(test_card(:address_zip => 'zippy')))
546
+ card.address_zip = "zippy"
547
+ card.save
548
+
549
+ assert_equal "zippy", card.address_zip
550
+ end
515
551
  end
516
552
 
553
+
517
554
  context "coupon tests" do
518
555
  should "create should return a new coupon" do
519
556
  @mock.expects(:post).once.returns(test_response(test_coupon))
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stripe
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.3
4
+ version: 1.8.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-05-06 00:00:00.000000000 Z
13
+ date: 2013-07-12 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rest-client
@@ -55,33 +55,33 @@ dependencies:
55
55
  requirement: !ruby/object:Gem::Requirement
56
56
  none: false
57
57
  requirements:
58
- - - ! '>='
58
+ - - ~>
59
59
  - !ruby/object:Gem::Version
60
- version: '0'
60
+ version: 0.13.2
61
61
  type: :development
62
62
  prerelease: false
63
63
  version_requirements: !ruby/object:Gem::Requirement
64
64
  none: false
65
65
  requirements:
66
- - - ! '>='
66
+ - - ~>
67
67
  - !ruby/object:Gem::Version
68
- version: '0'
68
+ version: 0.13.2
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: shoulda
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
- - - ! '>='
74
+ - - ~>
75
75
  - !ruby/object:Gem::Version
76
- version: '0'
76
+ version: 3.4.0
77
77
  type: :development
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  none: false
81
81
  requirements:
82
- - - ! '>='
82
+ - - ~>
83
83
  - !ruby/object:Gem::Version
84
- version: '0'
84
+ version: 3.4.0
85
85
  - !ruby/object:Gem::Dependency
86
86
  name: test-unit
87
87
  requirement: !ruby/object:Gem::Requirement
@@ -145,6 +145,7 @@ files:
145
145
  - lib/stripe/api_operations/list.rb
146
146
  - lib/stripe/api_operations/update.rb
147
147
  - lib/stripe/api_resource.rb
148
+ - lib/stripe/card.rb
148
149
  - lib/stripe/charge.rb
149
150
  - lib/stripe/coupon.rb
150
151
  - lib/stripe/customer.rb
@@ -199,4 +200,3 @@ test_files:
199
200
  - test/test_helper.rb
200
201
  - test/test_stripe.rb
201
202
  - test/test_stripe_with_active_support.rb
202
- has_rdoc: