stripe-cli 1.5.0 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: afab1ce2dae3b3d4d5c028e647829d329ff2e324
4
- data.tar.gz: d3a8fbcc13accd0a239dc90a3c01ccd47633d734
3
+ metadata.gz: 7acf8c013d963492b3c5b5c5be0b6d491939d3f3
4
+ data.tar.gz: aaca783bc677b2505e7e0239bda542135e951cf2
5
5
  SHA512:
6
- metadata.gz: 30a7abda94bd08232483b3b480e2099f00856247ad3e6749f8e56e420b530b0ad3b331b8f2ba85751794a0bf15f90d6ac3f6bbdca51e3c1fdadc2f9baa139479
7
- data.tar.gz: a6b057451bf64665368bd64a755c5030b892e2b0a84456421419e5ab097b618123d4bdbf63ee83ab27450b8f971bb9440c8dfff19b7f725188bf44a210c95627
6
+ metadata.gz: 43c0d8e42b469f3317c53acf525195af22efcd534fd6c77ede122b9bf42381b7696060748dc75d214d59487215f3682cfc6a41f9b4cc75fd616d640a30b2b1d7
7
+ data.tar.gz: c49672d4a38e69f465fc86aeb2b7a35b9c2e11e9da1cd381069baf823dbdfe07c3695d17304ce73fdba953d56e8fb363abcef4ac6d8b496625a05c4bfe6be787
data/lib/stripe/cli.rb CHANGED
@@ -10,4 +10,17 @@ module Stripe
10
10
  autoload :Runner, 'stripe/cli/runner'
11
11
  autoload :Commands, 'stripe/cli/commands'
12
12
  end
13
+
14
+ # `alias_method_chain' style patch to tweek the user-agent header sent with every API request
15
+ # Doing this adds context to request data that can be viewed using the Stripe Dashboard
16
+ # Differentiating requests made by application code from those made using the Stripe-CLI gem
17
+ class<<self
18
+ def add_stripe_cli_to_user_agent_string api_key
19
+ user_agent = original_request_headers(api_key)[:user_agent]
20
+ original_request_headers(api_key).update(:user_agent => user_agent<<"/Stripe-CLI v#{Stripe::CLI::VERSION}")
21
+ end
22
+ alias_method :original_request_headers, :request_headers
23
+ alias_method :request_headers, :add_stripe_cli_to_user_agent_string
24
+ private :request_headers
25
+ end
13
26
  end
@@ -82,7 +82,7 @@ module Stripe
82
82
  when Stripe::ListObject
83
83
  inspect object.data
84
84
  when Stripe::StripeObject
85
- inspect object.to_hash
85
+ inspect object.instance_variable_get(:@values)
86
86
  when Numeric
87
87
  object > 1000000000 ? Time.at( object ) : object
88
88
  else
@@ -10,7 +10,7 @@ module Stripe
10
10
  option :limit, :desc => "a limit on the number of resources returned, between 1 and 100"
11
11
  option :offset, :desc => "the starting index to be used, relative to the entire list"
12
12
  option :count, :desc => "depricated: use limit"
13
- option :owner, :required => true, :desc => "id of owner to search within"
13
+ option :owner, :required => true, :desc => "id of customer or recipient to search within"
14
14
  def list
15
15
  if owner = retrieve_owner(options.delete :owner)
16
16
  super owner.cards, options
@@ -18,7 +18,7 @@ module Stripe
18
18
  end
19
19
 
20
20
  desc "find ID", "find ID card for OWNER (customer or recipient)"
21
- option :owner, :required => true, :desc => "id of card owner to search within"
21
+ option :owner, :required => true, :desc => "id of customer or recipient to search within"
22
22
  def find card_id
23
23
  if owner = retrieve_owner(options.delete :owner)
24
24
  super owner.cards, card_id
@@ -27,15 +27,14 @@ module Stripe
27
27
 
28
28
 
29
29
  desc "create", "create a new card for OWNER (customer or recipient)"
30
- option :token
31
- option :card_number
32
- option :card_exp_month
33
- option :card_exp_year
34
- option :card_cvc
35
- option :card_name
30
+ option :card, :aliases => :token, :desc => "credit card Token or ID. May also be created interactively."
31
+ option :card_number, :aliases => :number
32
+ option :card_exp_month, :aliases => :exp_month, :desc => "Two digit expiration month of card"
33
+ option :card_exp_year, :aliases => :exp_year, :desc => "Four digit expiration year of card"
34
+ option :card_cvc, :aliases => :cvc, :desc => "Three or four digit security code located on the back of card"
35
+ option :card_name, :aliases => :name, :desc => "Cardholder's full name as displayed on card"
36
36
  option :owner, :required => true, :desc => "id of customer or recipient receiving new card"
37
37
  def create
38
- options[:card] = options.delete(:token)
39
38
  options[:card] ||= credit_card( options )
40
39
  if owner = retrieve_owner(options.delete :owner)
41
40
  super owner.cards, options
@@ -43,7 +42,7 @@ module Stripe
43
42
  end
44
43
 
45
44
  desc "delete ID", "delete ID card for OWNER (customer or recipient)"
46
- option :owner, :required => true, :desc => "id of owner to search within"
45
+ option :owner, :required => true, :desc => "id of customer or recipient to search within"
47
46
  def delete card_id
48
47
  if owner = retrieve_owner(options.delete :owner) and
49
48
  card = retrieve_card(owner, card_id)
@@ -51,29 +50,6 @@ module Stripe
51
50
  end
52
51
  end
53
52
 
54
- private
55
-
56
- def retrieve_owner id
57
- begin
58
- if id.start_with? "r"
59
- Stripe::Recipient.retrieve(id, api_key)
60
- else
61
- Stripe::Customer.retrieve(id, api_key)
62
- end
63
- rescue Exception => e
64
- ap e.message
65
- false
66
- end
67
- end
68
-
69
- def retrieve_card owner, id
70
- begin
71
- owner.cards.retrieve(id)
72
- rescue Exception => e
73
- ap e.message
74
- false
75
- end
76
- end
77
53
  end
78
54
  end
79
55
  end
@@ -10,7 +10,7 @@ module Stripe
10
10
  option :limit, :desc => "a limit on the number of resources returned, between 1 and 100"
11
11
  option :offset, :desc => "the starting index to be used, relative to the entire list"
12
12
  option :count, :desc => "depricated: use limit"
13
- option :customer
13
+ option :customer, :desc => "a customer ID to filter results by"
14
14
  def list
15
15
  super Stripe::Charge, options
16
16
  end
@@ -22,7 +22,7 @@ module Stripe
22
22
 
23
23
  desc "refund ID", "Refund a charge"
24
24
  option :amount, :type => :numeric, :desc => "Refund amount in dollars. (Entire charge by default)"
25
- option :metadata, :type => :hash
25
+ option :metadata, :type => :hash, :desc => "a key/value store of additional user-defined data"
26
26
  option :refund_application_fee, :type => :boolean, :default => false, :desc => "Whether or not to refund the application fee"
27
27
  def refund charge_id
28
28
  options[:amount] = (Float(options[:amount]) * 100).to_i if options[:amount]
@@ -37,18 +37,18 @@ module Stripe
37
37
  end
38
38
 
39
39
  desc "create", "Create a charge"
40
- option :customer, :desc => "The ID of an existing customer"
41
- option :card
42
- option :card_number
43
- option :card_exp_month
44
- option :card_exp_year
45
- option :card_cvc
46
- option :card_name
40
+ option :customer, :desc => "The ID of an existing customer to charge"
41
+ option :card, :aliases => :token, :desc => "credit card Token or ID. May also be created interactively."
42
+ option :card_number, :aliases => :number
43
+ option :card_exp_month, :aliases => :exp_month, :desc => "Two digit expiration month of card"
44
+ option :card_exp_year, :aliases => :exp_year, :desc => "Four digit expiration year of card"
45
+ option :card_cvc, :aliases => :cvc, :desc => "Three or four digit security code located on the back of card"
46
+ option :card_name, :aliases => :name, :desc => "Cardholder's full name as displayed on card"
47
47
  option :amount, :type => :numeric, :desc => "Charge amount in dollars"
48
- option :currency, :default => 'usd'
49
- option :description
50
- option :capture, :type => :boolean, :default => true
51
- option :metadata, :type => :hash
48
+ option :currency, :default => "usd"
49
+ option :description, :desc => "Arbitrary description of charge"
50
+ option :capture, :type => :boolean, :default => true, :desc => "Whether or not to immediately capture the charge. Uncaptured charges expire in 7 days"
51
+ option :metadata, :type => :hash, :desc => "A key/value store of additional user-defined data"
52
52
  option :statement_description, :desc => "Displayed alongside your company name on your customer's card statement (15 character max)"
53
53
  option :receipt_email, :desc => "Email address to send receipt to. Overrides default email settings."
54
54
  def create
@@ -60,17 +60,6 @@ module Stripe
60
60
  super Stripe::Charge, options
61
61
  end
62
62
 
63
- private
64
-
65
- def retrieve_charge id
66
- begin
67
- Stripe::Charge.retrieve(id, api_key)
68
- rescue Exception => e
69
- ap e.message
70
- false
71
- end
72
- end
73
-
74
63
  end
75
64
  end
76
65
  end
@@ -29,11 +29,11 @@ module Stripe
29
29
  option :percent_off, :type => :numeric
30
30
  option :amount_off, :type => :numeric
31
31
  option :duration, :enum => [ :forever, :once, :repeating ]
32
- option :redeem_by, :type => :numeric, :default => nil
32
+ option :redeem_by, :desc => "coupon will no longer be accepted after this date."
33
33
  option :max_redemptions, :type => :numeric
34
34
  option :duration_in_months
35
35
  option :currency, :default => 'usd'
36
- option :metadata, :type => :hash
36
+ option :metadata, :type => :hash, :desc => "a key/value store of additional user-defined data"
37
37
  def create
38
38
  unless options[:percent_off] || options[:amount_off]
39
39
  discount = ask('(e.g. 25% or $10) specify discount:')
@@ -1,3 +1,4 @@
1
+ require 'chronic'
1
2
  module Stripe
2
3
  module CLI
3
4
  module Commands
@@ -25,20 +26,20 @@ module Stripe
25
26
  end
26
27
 
27
28
  desc "create", "Create a new customer"
28
- option :description
29
- option :email
30
- option :plan
31
- option :coupon
32
- option :quantity
33
- option :trial_end
34
- option :account_balance
35
- option :card
36
- option :card_number
37
- option :card_exp_month
38
- option :card_exp_year
39
- option :card_cvc
40
- option :card_name
41
- option :metadata, :type => :hash
29
+ option :description, :desc => "Arbitrary description to be displayed in Stripe Dashboard."
30
+ option :email, :desc => "Customer's email address. Will be displayed in Stripe Dashboard."
31
+ option :plan, :desc => "The ID of a Plan this customer should be subscribed to. Requires a credit card."
32
+ option :coupon, :desc => "The ID of a Coupon to be applied to all of Customer's recurring charges"
33
+ option :quantity, :desc => "A multiplier for the plan option. defaults to `1'"
34
+ option :trial_end, :desc => "apply a trial period until this date. Override plan's trial period."
35
+ option :account_balance, :desc => "customer's starting account balance in cents. A positive amount will be added to the next invoice while a negitive amount will act as a credit."
36
+ option :card, :aliases => :token, :desc => "credit card Token or ID. May also be created interactively."
37
+ option :card_number, :aliases => :number
38
+ option :card_exp_month, :aliases => :exp_month, :desc => "Two digit expiration month of card"
39
+ option :card_exp_year, :aliases => :exp_year, :desc => "Four digit expiration year of card"
40
+ option :card_cvc, :aliases => :cvc, :desc => "Three or four digit security code located on the back of card"
41
+ option :card_name, :aliases => :name, :desc => "Cardholder's full name as displayed on card"
42
+ option :metadata, :type => :hash, :desc => "a key/value store of additional user-defined data"
42
43
  def create
43
44
  options[:email] ||= ask('Customer\'s Email:')
44
45
  options[:description] ||= ask('Provide a description:')
@@ -50,7 +51,10 @@ module Stripe
50
51
  end
51
52
  options.delete( :coupon ) if options[:coupon] == ""
52
53
 
53
- options[:card] ||= credit_card( options ) if options[:plan]
54
+ if options[:plan]
55
+ options[:card] ||= credit_card( options )
56
+ options[:trial_end] = Chronic.parse(options[:trial_end]).to_i.to_s if options[:trial_end]
57
+ end
54
58
 
55
59
  super Stripe::Customer, options
56
60
  end
@@ -9,6 +9,8 @@ module Stripe
9
9
  option :limit, :desc => "a limit on the number of resources returned, between 1 and 100"
10
10
  option :offset, :desc => "the starting index to be used, relative to the entire list"
11
11
  option :count, :desc => "depricated: use limit"
12
+ option :object_id, :desc => "only list events pertaining to the object with this ID"
13
+ option :type, :desc => "only list events of type TYPE"
12
14
  def list
13
15
  super Stripe::Event, options
14
16
  end
@@ -9,7 +9,7 @@ module Stripe
9
9
  option :limit, :desc => "a limit on the number of resources returned, between 1 and 100"
10
10
  option :offset, :desc => "the starting index to be used, relative to the entire list"
11
11
  option :count, :desc => "depricated: use limit"
12
- option :customer
12
+ option :customer, :desc => "a customer ID to filter results by"
13
13
  def list
14
14
  super Stripe::Invoice, options
15
15
  end
@@ -24,14 +24,14 @@ module Stripe
24
24
  end
25
25
 
26
26
  desc "create", "Create a new plan"
27
- option :name
28
- option :id
29
- option :amount, :type => :numeric
30
- option :interval, :default => 'month'
31
- option :interval_count, :type => :numeric, :default => 1
32
- option :currency, :default => 'usd'
33
- option :trial_period_days, :type => :numeric, :default => 0
34
- option :metadata, :type => :hash
27
+ option :name, :desc => "Name displayed on invoices and in the Dashboard"
28
+ option :id, :desc => "Unique name used to identify this plan when subscribing a customer"
29
+ option :amount, :type => :numeric, :desc => "Amount in dollars"
30
+ option :interval, :enum => %w( day week month year ), :default => "month", :desc => "Billing frequency"
31
+ option :interval_count, :type => :numeric, :default => 1, :desc => "The number of intervals between each subscription billing."
32
+ option :currency, :default => "usd"
33
+ option :trial_period_days, :type => :numeric, :default => 0, :desc => "Number of days to delay a customer's initial bill"
34
+ option :metadata, :type => :hash, :desc => "a key/value store of additional user-defined data"
35
35
  def create
36
36
  options[:amount] ||= ask('Amount in dollars:')
37
37
  options[:amount] = (Float(options[:amount]) * 100).to_i
@@ -2,6 +2,7 @@ module Stripe
2
2
  module CLI
3
3
  module Commands
4
4
  class Recipients < Command
5
+ include Stripe::Utils
5
6
 
6
7
  desc "list", "List recipients"
7
8
  option :starting_after, :desc => "The ID of the last object in the previous paged result set. For cursor-based pagination."
@@ -24,8 +25,8 @@ module Stripe
24
25
  super Stripe::Recipient, recipient_id
25
26
  end
26
27
 
27
- desc "create", "create a new recipient"
28
- option :name
28
+ desc "create", "create a new recipient. Either an Individual or a Corporation."
29
+ option :name, :desc => "Full legal name of Individual or Corporation"
29
30
  option :type, :enum => %w( individual corporation )
30
31
  option :individual, :type => :boolean, :aliases => :i
31
32
  option :corporation, :type => :boolean, :aliases => :c
@@ -36,34 +37,57 @@ module Stripe
36
37
  option :country
37
38
  option :account_number
38
39
  option :routing_number
39
- option :metadata, :type => :hash
40
+ option :card, :aliases => :token, :desc => "credit card Token or ID. May also be created interactively."
41
+ option :card_number, :aliases => :number
42
+ option :card_exp_month, :aliases => :exp_month, :desc => "Two digit expiration month of card"
43
+ option :card_exp_year, :aliases => :exp_year, :desc => "Four digit expiration year of card"
44
+ option :card_cvc, :aliases => :cvc, :desc => "Three or four digit security code located on the back of card"
45
+ option :card_name, :desc => "Cardholder's full name as displayed on card"
46
+ option :metadata, :type => :hash, :desc => "a key/value store of additional user-defined data"
40
47
  def create
41
- options[:name] ||= ask('Recipient\'s Name:')
42
- options[:email] ||= ask('Recipient\'s Email:')
43
- options[:type] ||= if options.delete(:individual) then 'individual'
44
- elsif options.delete(:corporation) then 'corporation'
45
- else yes?('Corporation? (Y/n)') ? 'corporation' : 'individual'
46
- end
47
- options[:tax_id] ||= case options[:type]
48
- when 'individual' then ask('Tax ID (SSN):')
49
- when 'corporation' then ask('Tax ID (EIN):')
50
- end
48
+ options[:type] ||= recipient_type(options)
49
+
50
+ case options[:type]
51
+ when 'individual'
52
+ options[:name] ||= ask('Recipient\'s full, legal name:')
53
+ options[:tax_id] ||= ask('Tax ID (SSN):')
54
+ when 'corporation'
55
+ options[:name] ||= ask('Full Incorporated Name:')
56
+ options[:tax_id] ||= ask('Tax ID (EIN):')
57
+ end unless options[:name] && options[:tax_id]
58
+
51
59
  options[:tax_id].gsub!(/[^\d]/,"")
52
60
 
53
- unless options[:bank_account]
54
- options[:country] ||= 'US'
55
- options[:account_number] ||= ask('Bank Account Number:')
56
- options[:routing_number] ||= ask('Bank Routing Number:')
61
+ options[:email] ||= ask('Email Address:')
62
+
63
+ unless options[:card] || no?('add a Debit Card? [yN]',:yellow)
64
+ options[:card_name] ||= options[:name] if yes?('Name on card same as recipient name? [yN]')
65
+ options[:card] = credit_card( options )
66
+ end
57
67
 
58
- options[:bank_account] = {
59
- :country => options.delete(:country),
60
- :account_number => options.delete(:account_number),
61
- :routing_number => options.delete(:routing_number)
62
- }
68
+ unless options[:bank_account] || no?('add a Bank Account? [yN]',:yellow)
69
+ options[:bank_account] = bank_account( options )
63
70
  end
64
71
 
72
+ options.delete :country
73
+ options.delete :account_number
74
+ options.delete :routing_number
75
+ options.delete :card_number
76
+ options.delete :card_exp_month
77
+ options.delete :card_exp_year
78
+ options.delete :card_cvc
79
+ options.delete :card_name
80
+
65
81
  super Stripe::Recipient, options
66
82
  end
83
+
84
+ private
85
+
86
+ def recipient_type opt
87
+ opt.delete(:individual) ? 'individual' :
88
+ opt.delete(:corporation) ? 'corporation' :
89
+ yes?('Corporation? [yN]') ? 'corporation' : 'individual'
90
+ end
67
91
  end
68
92
  end
69
93
  end
@@ -2,13 +2,15 @@ module Stripe
2
2
  module CLI
3
3
  module Commands
4
4
  class Refunds < Command
5
+ include Stripe::Utils
6
+
5
7
  desc "list", "List refunds for CHARGE charge"
6
8
  option :starting_after, :desc => "The ID of the last object in the previous paged result set. For cursor-based pagination."
7
9
  option :ending_before, :desc => "The ID of the first object in the previous paged result set, when paging backwards through the list."
8
10
  option :limit, :desc => "a limit on the number of resources returned, between 1 and 100"
9
11
  option :offset, :desc => "the starting index to be used, relative to the entire list"
10
12
  option :count, :desc => "depricated: use limit"
11
- option :charge, :aliases => :c, :required => true, :desc => "Id of charge to search"
13
+ option :charge, :aliases => :c, :required => true, :desc => "Id of charge to search within"
12
14
  def list
13
15
  if charge = retrieve_charge(options.delete :charge)
14
16
  super charge.refunds, options
@@ -25,7 +27,7 @@ module Stripe
25
27
 
26
28
  desc "create", "apply a new refund to CHARGE charge"
27
29
  option :amount, :type => :numeric, :desc => "Refund amount in dollars. (Entire charge by default)"
28
- option :metadata, :type => :hash
30
+ option :metadata, :type => :hash, :desc => "a key/value store of additional user-defined data"
29
31
  option :refund_application_fee, :type => :boolean, :default => false, :desc => "Whether or not to refund the application fee"
30
32
  option :charge, :aliases => :c, :required => true, :desc => "Id of charge to apply refund"
31
33
  def create
@@ -35,17 +37,6 @@ module Stripe
35
37
  end
36
38
  end
37
39
 
38
- private
39
-
40
- def retrieve_charge id
41
- begin
42
- Stripe::Charge.retrieve(id, api_key)
43
- rescue Exception => e
44
- ap e.message
45
- false
46
- end
47
- end
48
-
49
40
  end
50
41
  end
51
42
  end
@@ -1,3 +1,4 @@
1
+ require 'chronic'
1
2
  module Stripe
2
3
  module CLI
3
4
  module Commands
@@ -10,7 +11,7 @@ module Stripe
10
11
  option :limit, :desc => "a limit on the number of resources returned, between 1 and 100"
11
12
  option :offset, :desc => "the starting index to be used, relative to the entire list"
12
13
  option :count, :desc => "depricated: use limit"
13
- option :customer, :aliases => :c, :required => true, :desc => "id of customer to search within"
14
+ option :customer, :aliases => :c, :required => true, :desc => "ID of customer to search within"
14
15
  def list
15
16
  if cust = retrieve_customer(options.delete :customer)
16
17
  super cust.subscriptions, options
@@ -18,7 +19,7 @@ module Stripe
18
19
  end
19
20
 
20
21
  desc "find ID", "find ID subscription for CUSTOMER customer"
21
- option :customer, :aliases => :c, :required => true, :desc => "id of customer to search within"
22
+ option :customer, :aliases => :c, :required => true, :desc => "ID of customer to search within"
22
23
  def find subscription_id
23
24
  if cust = retrieve_customer(options.delete :customer)
24
25
  super cust.subscriptions, subscription_id
@@ -28,21 +29,22 @@ module Stripe
28
29
  desc "create", "create a subscription for CUSTOMER customer"
29
30
  option :plan, :desc => "the plan to assign to CUSTOMER customer"
30
31
  option :coupon, :desc => "id of a coupon to apply"
31
- option :trial_end, :desc => "apply a trial period until this date"
32
- option :card
33
- option :card_number
34
- option :card_exp_month
35
- option :card_exp_year
36
- option :card_cvc
37
- option :card_name
38
- option :metadata, :type => :hash
39
- option :customer, :aliases => :c, :required => true, :desc => "id of customer receiving the new subscription"
32
+ option :trial_end, :desc => "apply a trial period until this date. Override plan's trial period."
33
+ option :card, :aliases => :token, :desc => "credit card Token or ID. May also be created interactively."
34
+ option :card_number, :aliases => :number
35
+ option :card_exp_month, :aliases => :exp_month, :desc => "Two digit expiration month of card"
36
+ option :card_exp_year, :aliases => :exp_year, :desc => "Four digit expiration year of card"
37
+ option :card_cvc, :aliases => :cvc, :desc => "Three or four digit security code located on the back of card"
38
+ option :card_name, :aliases => :name, :desc => "Cardholder's full name as displayed on card"
39
+ option :metadata, :type => :hash, :desc => "a key/value store of additional user-defined data"
40
+ option :customer, :aliases => :c, :required => true, :desc => "ID of customer receiving the new subscription"
40
41
  def create
41
42
  options[:plan] ||= ask('Assign a plan:')
43
+ options.delete( :plan ) if options[:plan] == ""
42
44
  options[:coupon] ||= ask('Apply a coupon:')
43
45
  options.delete( :coupon ) if options[:coupon] == ""
44
46
  options[:card] ||= credit_card( options ) if yes?("add a new credit card? [yN]",:yellow)
45
- options[:trial_end] = options[:trial_end].to_i if options[:trial_end]
47
+ options[:trial_end] = Chronic.parse(options[:trial_end]).to_i.to_s if options[:trial_end]
46
48
  if cust = retrieve_customer(options.delete :customer)
47
49
  super cust.subscriptions, options
48
50
  end
@@ -53,6 +55,7 @@ module Stripe
53
55
  option :at_period_end, :type => :boolean, :default => false, :desc => "delay cancellation until end of current period"
54
56
  option :customer, :aliases => :c, :required => true, :desc => "id of customer to search within"
55
57
  def cancel subscription_id
58
+ options[:at_period_end] ||= yes?("delay until end of current period? [yN]",:yellow)
56
59
  if cust = retrieve_customer(options.delete :customer) and
57
60
  subscription = retrieve_subscription(cust, subscription_id)
58
61
  request subscription, :delete, options
@@ -68,25 +71,6 @@ module Stripe
68
71
  end
69
72
  end
70
73
 
71
- private
72
-
73
- def retrieve_customer id
74
- begin
75
- Stripe::Customer.retrieve(id, api_key)
76
- rescue Exception => e
77
- ap e.message
78
- false
79
- end
80
- end
81
-
82
- def retrieve_subscription cust, id
83
- begin
84
- cust.subscriptions.retrieve(id)
85
- rescue Exception => e
86
- ap e.message
87
- false
88
- end
89
- end
90
74
  end
91
75
  end
92
76
  end
@@ -10,42 +10,26 @@ module Stripe
10
10
  end
11
11
 
12
12
  desc "create TYPE", "create a new token of type TYPE(card or account)"
13
- option :card, :type => :hash
14
- option :card_name
15
- option :card_number
16
- option :card_cvc
17
- option :card_exp_month
18
- option :card_exp_year
13
+ option :card, :type => :hash, :desc => "hash of card parameters which may also be provided individually or added interactively if not provided."
14
+ option :card_number, :aliases => :number
15
+ option :card_exp_month, :aliases => :exp_month, :desc => "Two digit expiration month of card"
16
+ option :card_exp_year, :aliases => :exp_year, :desc => "Four digit expiration year of card"
17
+ option :card_cvc, :aliases => :cvc, :desc => "Three or four digit security code located on the back of card"
18
+ option :card_name, :aliases => :name, :desc => "Cardholder's full name as displayed on card"
19
19
  option :bank_account, :type => :hash
20
20
  option :country
21
21
  option :routing_number
22
22
  option :account_number
23
23
  def create type
24
24
  case type
25
- when 'card', 'credit_card'
26
- options[:card] ||= credit_card( options )
27
- options.delete(:bank_account)
28
- options.delete(:country)
29
- options.delete(:routing_number)
30
- options.delete(:account_number)
31
- when 'account', 'bank_account'
32
- unless options[:bank_account]
33
- options[:account_number] ||= ask('Account Number:')
34
- options[:routing_number] ||= ask('Routing Number:')
35
- options[:country] ||= 'US'
36
-
37
- options[:bank_account] = {
38
- :account_number => options.delete(:account_number),
39
- :routing_number => options.delete(:routing_number),
40
- :country => options.delete(:country)
41
- }
42
- options.delete(:card)
43
- options.delete(:card_name)
44
- options.delete(:card_number)
45
- options.delete(:card_cvc)
46
- options.delete(:card_exp_month)
47
- options.delete(:card_exp_year)
48
- end
25
+ when 'card', 'credit_card', 'credit card'
26
+ credit_card = options[:card] ||= credit_card( options )
27
+ options = {}
28
+ options[:card] = credit_card
29
+ when 'account', 'bank_account', 'bank account'
30
+ bank_account = options[:bank_account] ||= bank_account( options )
31
+ options = {}
32
+ options[:bank_account] = bank_account
49
33
  end
50
34
 
51
35
  super Stripe::Token, options
@@ -28,7 +28,7 @@ module Stripe
28
28
  option :statement_descriptor
29
29
  option :balance, :type => :boolean
30
30
  option :self, :type => :boolean
31
- option :metadata, :type => :hash
31
+ option :metadata, :type => :hash, :desc => "a key/value store of additional user-defined data"
32
32
  def create
33
33
  if options.delete(:balance) == true
34
34
  options[:amount] = Stripe::Balance.retrieve(api_key).available.first.amount
@@ -1,5 +1,5 @@
1
1
  module Stripe
2
2
  module CLI
3
- VERSION = "1.5.0"
3
+ VERSION = "1.6.0"
4
4
  end
5
5
  end
data/lib/stripe/utils.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  module Stripe
2
2
  module Utils
3
3
 
4
+ private
5
+
4
6
  def credit_card options = {}
5
7
  {
6
8
  :name => options.delete(:card_name) || ask('Name on Card:'),
@@ -11,5 +13,66 @@ module Stripe
11
13
  }
12
14
  end
13
15
 
16
+ def bank_account options = {}
17
+ {
18
+ :account_number => options.delete(:account_number) || ask('Account Number:'),
19
+ :routing_number => options.delete(:routing_number) || ask('Routing Number:'),
20
+ :country => options.delete(:country) || 'US'
21
+ }
22
+ end
23
+
24
+ def retrieve_customer id
25
+ begin
26
+ ::Stripe::Customer.retrieve(id, api_key)
27
+ rescue Exception => e
28
+ ap e.message
29
+ false
30
+ end
31
+ end
32
+
33
+ def retrieve_charge id
34
+ begin
35
+ ::Stripe::Charge.retrieve(id, api_key)
36
+ rescue Exception => e
37
+ ap e.message
38
+ false
39
+ end
40
+ end
41
+
42
+ def retrieve_recipient id
43
+ begin
44
+ ::Stripe::Recipient.retrieve(id, api_key)
45
+ rescue Exception => e
46
+ ap e.message
47
+ false
48
+ end
49
+ end
50
+
51
+ def retrieve_subscription cust, id
52
+ begin
53
+ cust.subscriptions.retrieve(id)
54
+ rescue Exception => e
55
+ ap e.message
56
+ false
57
+ end
58
+ end
59
+
60
+ def retrieve_card owner, id
61
+ begin
62
+ owner.cards.retrieve(id)
63
+ rescue Exception => e
64
+ ap e.message
65
+ false
66
+ end
67
+ end
68
+
69
+ def retrieve_owner id
70
+ if id.start_with? "r"
71
+ retrieve_recipient(id)
72
+ else
73
+ retrieve_customer(id)
74
+ end
75
+ end
76
+
14
77
  end
15
78
  end
data/spec/command_spec.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Stripe::CLI::Command do
4
+
4
5
  let(:_id_) { "random-id-string" }
5
6
 
6
7
  describe "#find" do
@@ -6,17 +6,17 @@ describe Stripe::CLI::Commands::Charges do
6
6
 
7
7
  describe "#refund" do
8
8
 
9
- it "takes a charge_id and refunds the associated charge entirely" do
10
- request_hash = Stripe::CLI::Runner.start ["charges", "refund", _id_]
11
- request_hash[:url].should == "https://api.stripe.com/v1/charges/a-charge-id/refund"
12
- request_hash[:payload].should == ""
13
- end
14
-
15
- it "takes a charge_id and an optional [--amount] and partially refunds the associated charge" do
16
- request_hash = Stripe::CLI::Runner.start ["charges", "refund", _id_, "--amount=100.99"]
17
- request_hash[:url].should == "https://api.stripe.com/v1/charges/a-charge-id/refund"
18
- request_hash[:payload].should == "amount=10099"
19
- end
9
+ # it "takes a charge_id and refunds the associated charge entirely" do
10
+ # request_hash = Stripe::CLI::Runner.start ["charges", "refund", _id_]
11
+ # request_hash[:url].should == "https://api.stripe.com/v1/charges/a-charge-id/refund"
12
+ # request_hash[:payload].should == ""
13
+ # end
14
+ #
15
+ # it "takes a charge_id and an optional [--amount] and partially refunds the associated charge" do
16
+ # request_hash = Stripe::CLI::Runner.start ["charges", "refund", _id_, "--amount=100.99"]
17
+ # request_hash[:url].should == "https://api.stripe.com/v1/charges/a-charge-id/refund"
18
+ # request_hash[:payload].should == "amount=10099"
19
+ # end
20
20
 
21
21
  end
22
22
 
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe Stripe::CLI::Commands::Recipients do
4
+
5
+ describe "#create" do
6
+
7
+ it "can determine recipient type from the passed options" do
8
+ Stripe.should_receive(:execute_request).with do |opts|
9
+ opts[:headers][:authorization] == 'Bearer stripe-key'
10
+ end
11
+ request_hash = Stripe::CLI::Runner.start ["recipients", "create", "--corporation", "--name=John Doe"]
12
+ expect(request_hash[:url]).to eq("https://api.stripe.com/v1/recipients")
13
+ expect(request_hash[:payload]).to eq("type=individual&name=John Doe")
14
+ end
15
+
16
+
17
+ end
18
+
19
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,12 +1,421 @@
1
1
  require 'rspec'
2
2
  require_relative '../lib/stripe/cli.rb'
3
3
 
4
- f = Tempfile.new('config')
5
- f.write "key = stripe-key" and f.rewind
6
- Stripe::CLI::Command.class_variable_set :@@config, f
7
-
8
4
  module Stripe
9
- def self.execute_request(opts)
10
- return OpenStruct.new(body: opts.to_json)
5
+ class StripeObject
6
+ def body
7
+ @stripe_values[:body]
8
+ end
9
+ end
10
+ module CLI
11
+ class Command < Thor
12
+ protected
13
+ def api_key
14
+ "stripe-key"
15
+ end
16
+ end
17
+ end
18
+ end
19
+ module Stripe
20
+ def self.execute_request(body)
21
+ body = JSON.generate(body) if !(body.kind_of? String)
22
+ m = StripeObject.new
23
+ m.instance_variable_set('@stripe_values', { :body => body })
24
+ m
25
+ end
26
+
27
+ def test_balance(params={})
28
+ {
29
+ :pending => [
30
+ {:amount => 12345, :currency => "usd"}
31
+ ],
32
+ :available => [
33
+ {:amount => 6789, :currency => "usd"}
34
+ ],
35
+ :livemode => false,
36
+ :object => "balance"
37
+ }.merge(params)
38
+ end
39
+
40
+ def test_balance_transaction(params={})
41
+ {
42
+ :amount => 100,
43
+ :net => 41,
44
+ :currency => "usd",
45
+ :type => "charge",
46
+ :created => 1371945005,
47
+ :available_on => 1372549805,
48
+ :status => "pending",
49
+ :description => "A test balance transaction",
50
+ :fee => 59,
51
+ :object => "balance_transaction"
52
+ }.merge(params)
53
+ end
54
+
55
+ def test_balance_transaction_array
56
+ {
57
+ :data => [test_balance_transaction, test_balance_transaction, test_balance_transaction],
58
+ :object => "list",
59
+ :url => "/v1/balance/history"
60
+ }
61
+ end
62
+
63
+ def test_application_fee(params={})
64
+ id = params[:id] || 'fee_test_fee'
65
+ {
66
+ :refunded => false,
67
+ :amount => 100,
68
+ :application => "ca_test_application",
69
+ :user => "acct_test_user",
70
+ :charge => "ch_test_charge",
71
+ :id => id,
72
+ :livemode => false,
73
+ :currency => "usd",
74
+ :object => "application_fee",
75
+ :refunds => test_application_fee_refund_array(id),
76
+ :created => 1304114826
77
+ }.merge(params)
78
+ end
79
+
80
+ def test_application_fee_refund(params = {})
81
+ {
82
+ :object => 'fee_refund',
83
+ :amount => 30,
84
+ :currency => "usd",
85
+ :created => 1308595038,
86
+ :id => "ref_test_app_fee_refund",
87
+ :fee => "ca_test_application",
88
+ :metadata => {}
89
+ }.merge(params)
90
+ end
91
+
92
+ def test_application_fee_array
93
+ {
94
+ :data => [test_application_fee, test_application_fee, test_application_fee],
95
+ :object => 'list',
96
+ :url => '/v1/application_fees'
97
+ }
98
+ end
99
+
100
+ def test_application_fee_refund_array(fee_id)
101
+ {
102
+ :data => [test_application_fee_refund, test_application_fee_refund, test_application_fee_refund],
103
+ :object => 'list',
104
+ :url => '/v1/application_fees/' + fee_id + '/refunds'
105
+ }
106
+ end
107
+
108
+ def test_customer(params={})
109
+ id = params[:id] || 'c_test_customer'
110
+ {
111
+ :subscription_history => [],
112
+ :bills => [],
113
+ :charges => [],
114
+ :livemode => false,
115
+ :object => "customer",
116
+ :id => id,
117
+ :default_card => "cc_test_card",
118
+ :created => 1304114758,
119
+ :cards => test_card_array(id),
120
+ :metadata => {},
121
+ :subscriptions => test_subscription_array(id)
122
+ }.merge(params)
123
+ end
124
+
125
+ def test_customer_array
126
+ {
127
+ :data => [test_customer, test_customer, test_customer],
128
+ :object => 'list',
129
+ :url => '/v1/customers'
130
+ }
131
+ end
132
+
133
+ def test_charge(params={})
134
+ id = params[:id] || 'ch_test_charge'
135
+ {
136
+ :refunded => false,
137
+ :paid => true,
138
+ :amount => 100,
139
+ :card => {
140
+ :type => "Visa",
141
+ :last4 => "4242",
142
+ :exp_month => 11,
143
+ :country => "US",
144
+ :exp_year => 2012,
145
+ :id => "cc_test_card",
146
+ :object => "card"
147
+ },
148
+ :id => id,
149
+ :reason => "execute_charge",
150
+ :livemode => false,
151
+ :currency => "usd",
152
+ :object => "charge",
153
+ :created => 1304114826,
154
+ :refunds => test_refund_array(id),
155
+ :metadata => {}
156
+ }.merge(params)
157
+ end
158
+
159
+ def test_charge_array
160
+ {
161
+ :data => [test_charge, test_charge, test_charge],
162
+ :object => 'list',
163
+ :url => '/v1/charges'
164
+ }
165
+ end
166
+
167
+ def test_card_array(customer_id)
168
+ {
169
+ :data => [test_card, test_card, test_card],
170
+ :object => 'list',
171
+ :url => '/v1/customers/' + customer_id + '/cards'
172
+ }
173
+ end
174
+
175
+ def test_card(params={})
176
+ {
177
+ :type => "Visa",
178
+ :last4 => "4242",
179
+ :exp_month => 11,
180
+ :country => "US",
181
+ :exp_year => 2012,
182
+ :id => "cc_test_card",
183
+ :customer => 'c_test_customer',
184
+ :object => "card"
185
+ }.merge(params)
186
+ end
187
+
188
+ def test_coupon(params={})
189
+ {
190
+ :duration => 'repeating',
191
+ :duration_in_months => 3,
192
+ :percent_off => 25,
193
+ :id => "co_test_coupon",
194
+ :object => "coupon"
195
+ }.merge(params)
196
+ end
197
+
198
+ #FIXME nested overrides would be better than hardcoding plan_id
199
+ def test_subscription(params = {})
200
+ plan = params.delete(:plan) || 'gold'
201
+ {
202
+ :current_period_end => 1308681468,
203
+ :status => "trialing",
204
+ :plan => {
205
+ :interval => "month",
206
+ :amount => 7500,
207
+ :trial_period_days => 30,
208
+ :object => "plan",
209
+ :identifier => plan
210
+ },
211
+ :current_period_start => 1308595038,
212
+ :start => 1308595038,
213
+ :object => "subscription",
214
+ :trial_start => 1308595038,
215
+ :trial_end => 1308681468,
216
+ :customer => "c_test_customer",
217
+ :id => 's_test_subscription'
218
+ }.merge(params)
11
219
  end
220
+
221
+ def test_refund(params = {})
222
+ {
223
+ :object => 'refund',
224
+ :amount => 30,
225
+ :currency => "usd",
226
+ :created => 1308595038,
227
+ :id => "ref_test_refund",
228
+ :charge => "ch_test_charge",
229
+ :metadata => {}
230
+ }.merge(params)
231
+ end
232
+
233
+ def test_subscription_array(customer_id)
234
+ {
235
+ :data => [test_subscription, test_subscription, test_subscription],
236
+ :object => 'list',
237
+ :url => '/v1/customers/' + customer_id + '/subscriptions'
238
+ }
239
+ end
240
+
241
+ def test_refund_array(charge_id)
242
+ {
243
+ :data => [test_refund, test_refund, test_refund],
244
+ :object => 'list',
245
+ :url => '/v1/charges/' + charge_id + '/refunds'
246
+ }
247
+ end
248
+
249
+
250
+ def test_invoice
251
+ {
252
+ :id => 'in_test_invoice',
253
+ :object => 'invoice',
254
+ :livemode => false,
255
+ :amount_due => 1000,
256
+ :attempt_count => 0,
257
+ :attempted => false,
258
+ :closed => false,
259
+ :currency => 'usd',
260
+ :customer => 'c_test_customer',
261
+ :date => 1349738950,
262
+ :lines => {
263
+ "invoiceitems" => [
264
+ {
265
+ :id => 'ii_test_invoice_item',
266
+ :object => '',
267
+ :livemode => false,
268
+ :amount => 1000,
269
+ :currency => 'usd',
270
+ :customer => 'c_test_customer',
271
+ :date => 1349738950,
272
+ :description => "A Test Invoice Item",
273
+ :invoice => 'in_test_invoice'
274
+ },
275
+ ],
276
+ },
277
+ :paid => false,
278
+ :period_end => 1349738950,
279
+ :period_start => 1349738950,
280
+ :starting_balance => 0,
281
+ :subtotal => 1000,
282
+ :total => 1000,
283
+ :charge => nil,
284
+ :discount => nil,
285
+ :ending_balance => nil,
286
+ :next_payemnt_attempt => 1349825350,
287
+ }
288
+ end
289
+
290
+ def test_paid_invoice
291
+ test_invoice.merge({
292
+ :attempt_count => 1,
293
+ :attempted => true,
294
+ :closed => true,
295
+ :paid => true,
296
+ :charge => 'ch_test_charge',
297
+ :ending_balance => 0,
298
+ :next_payment_attempt => nil,
299
+ })
300
+ end
301
+
302
+ def test_invoice_customer_array
303
+ {
304
+ :data => [test_invoice],
305
+ :object => 'list',
306
+ :url => '/v1/invoices?customer=test_customer'
307
+ }
308
+ end
309
+
310
+ def test_recipient(params={})
311
+ id = params[:id] || 'rp_test_recipient'
312
+ {
313
+ :name => "Stripe User",
314
+ :type => "individual",
315
+ :livemode => false,
316
+ :object => "recipient",
317
+ :id => "rp_test_recipient",
318
+ :cards => test_card_array(id),
319
+ :default_card => "debit_test_card",
320
+ :active_account => {
321
+ :last4 => "6789",
322
+ :bank_name => "STRIPE TEST BANK",
323
+ :country => "US",
324
+ :object => "bank_account"
325
+ },
326
+ :created => 1304114758,
327
+ :verified => true,
328
+ :metadata => {}
329
+ }.merge(params)
330
+ end
331
+
332
+ def test_recipient_array
333
+ {
334
+ :data => [test_recipient, test_recipient, test_recipient],
335
+ :object => 'list',
336
+ :url => '/v1/recipients'
337
+ }
338
+ end
339
+
340
+ def test_transfer(params={})
341
+ {
342
+ :status => 'pending',
343
+ :amount => 100,
344
+ :account => {
345
+ :object => 'bank_account',
346
+ :country => 'US',
347
+ :bank_name => 'STRIPE TEST BANK',
348
+ :last4 => '6789'
349
+ },
350
+ :recipient => 'test_recipient',
351
+ :fee => 0,
352
+ :fee_details => [],
353
+ :id => "tr_test_transfer",
354
+ :livemode => false,
355
+ :currency => "usd",
356
+ :object => "transfer",
357
+ :date => 1304114826,
358
+ :metadata => {}
359
+ }.merge(params)
360
+ end
361
+
362
+ def test_transfer_array
363
+ {
364
+ :data => [test_transfer, test_transfer, test_transfer],
365
+ :object => 'list',
366
+ :url => '/v1/transfers'
367
+ }
368
+ end
369
+
370
+ def test_canceled_transfer
371
+ test_transfer.merge({
372
+ :status => 'canceled'
373
+ })
374
+ end
375
+
376
+ def test_invalid_api_key_error
377
+ {
378
+ "error" => {
379
+ "type" => "invalid_request_error",
380
+ "message" => "Invalid API Key provided: invalid"
381
+ }
382
+ }
383
+ end
384
+
385
+ def test_invalid_exp_year_error
386
+ {
387
+ "error" => {
388
+ "code" => "invalid_expiry_year",
389
+ "param" => "exp_year",
390
+ "type" => "card_error",
391
+ "message" => "Your card's expiration year is invalid"
392
+ }
393
+ }
394
+ end
395
+
396
+ def test_missing_id_error
397
+ {
398
+ :error => {
399
+ :param => "id",
400
+ :type => "invalid_request_error",
401
+ :message => "Missing id"
402
+ }
403
+ }
404
+ end
405
+
406
+ def test_api_error
407
+ {
408
+ :error => {
409
+ :type => "api_error"
410
+ }
411
+ }
412
+ end
413
+
414
+ def test_delete_discount_response
415
+ {
416
+ :deleted => true,
417
+ :id => "di_test_coupon"
418
+ }
419
+ end
420
+
12
421
  end
data/stripe-cli.gemspec CHANGED
@@ -25,7 +25,7 @@ Gem::Specification.new do |spec|
25
25
  spec.add_development_dependency 'bundler', '~> 1.3'
26
26
  spec.add_development_dependency 'rspec', '~> 2.12', '>= 2.12.0'
27
27
  spec.add_runtime_dependency 'thor', '~> 0.18', '>= 0.18.1'
28
- spec.add_runtime_dependency 'stripe', '~> 1.11', '>= 1.11.0'
28
+ spec.add_runtime_dependency 'stripe', '~> 1.12', '>= 1.12.0'
29
29
  spec.add_runtime_dependency 'awesome_print', '~> 1.2', '>= 1.2.0'
30
30
  spec.add_runtime_dependency 'parseconfig', '~> 1.0', '>= 1.0.4'
31
31
  spec.add_runtime_dependency 'chronic', '~> 0.10', '>= 0.10.2'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stripe-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex MacCaw
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-08-10 00:00:00.000000000 Z
12
+ date: 2014-09-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -71,20 +71,20 @@ dependencies:
71
71
  requirements:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
- version: '1.11'
74
+ version: '1.12'
75
75
  - - ">="
76
76
  - !ruby/object:Gem::Version
77
- version: 1.11.0
77
+ version: 1.12.0
78
78
  type: :runtime
79
79
  prerelease: false
80
80
  version_requirements: !ruby/object:Gem::Requirement
81
81
  requirements:
82
82
  - - "~>"
83
83
  - !ruby/object:Gem::Version
84
- version: '1.11'
84
+ version: '1.12'
85
85
  - - ">="
86
86
  - !ruby/object:Gem::Version
87
- version: 1.11.0
87
+ version: 1.12.0
88
88
  - !ruby/object:Gem::Dependency
89
89
  name: awesome_print
90
90
  requirement: !ruby/object:Gem::Requirement
@@ -186,6 +186,7 @@ files:
186
186
  - lib/stripe/utils.rb
187
187
  - spec/command_spec.rb
188
188
  - spec/commands/charges_spec.rb
189
+ - spec/commands/recipient_spec.rb
189
190
  - spec/spec_helper.rb
190
191
  - stripe-cli.gemspec
191
192
  homepage: https://stripe.com
@@ -208,11 +209,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
208
209
  version: '0'
209
210
  requirements: []
210
211
  rubyforge_project:
211
- rubygems_version: 2.2.2
212
+ rubygems_version: 2.4.1
212
213
  signing_key:
213
214
  specification_version: 4
214
215
  summary: Command line interface to Stripe
215
216
  test_files:
216
217
  - spec/command_spec.rb
217
218
  - spec/commands/charges_spec.rb
219
+ - spec/commands/recipient_spec.rb
218
220
  - spec/spec_helper.rb