stripe-rails 1.9.1 → 1.10.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
  SHA256:
3
- metadata.gz: d661efe56433d2aa86e274141263a5b4af3247a8cd52d2e73063ff69be0f98e9
4
- data.tar.gz: cc7e38b9e922026ea6a0ca78554bc985782ebda75ba3782accf20f65c729b0de
3
+ metadata.gz: 95873fe1e4c135546d576191494250facd47172be4b3a91f7325ff69c3ec5723
4
+ data.tar.gz: a16c59f3cdf162b62103a89332fb749a4f2c44ff45665576e4c00cc7f0637d16
5
5
  SHA512:
6
- metadata.gz: 3cdd009d3999ed6cbe4ad59a5e3d4869d890dba2ed9cc5c41aa1c8928b98413ed3ef6a0b2748c72ec644963a3e20cc2110ba316cfbf0917b9c8fb46cbff15301
7
- data.tar.gz: af6c42593780777428cc9f00db3b9e18e7c9bf284bb51ea8f244b9f0c641318e1df20417e7137c834b2c06690c2d55800b2ab06bc955768fa81597103bcb2e4a
6
+ metadata.gz: eb222107648581b675d6a1348d4e7773ed93f0f4326dd6a708a66753d08fcad6a5e2a131375d397c48480570772532d0ec3ccf242739ada5d08417c18a9fb9d7
7
+ data.tar.gz: dab6fd8cae0e0a23dca3281b63f2734c3252dff6f9b3bd3dc431e75ab425a7ef1418087234493b950f2e0d303777a03f24911a539815890422a525cab0418998
@@ -1,6 +1,6 @@
1
1
  name: Ruby
2
2
 
3
- on: [push]
3
+ on: [push, pull_request]
4
4
 
5
5
  jobs:
6
6
  build:
@@ -8,7 +8,7 @@ jobs:
8
8
 
9
9
  strategy:
10
10
  matrix:
11
- ruby: [2.3.x, 2.4.x, 2.5.x, 2.6.x]
11
+ ruby: [2.4.x, 2.5.x, 2.6.x]
12
12
  gemfile: [Gemfile, gemfiles/rails4.gemfile]
13
13
 
14
14
  steps:
@@ -28,6 +28,7 @@ jobs:
28
28
  CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }}
29
29
  RUBY_VERSION: ${{ matrix.ruby }}
30
30
  run: |
31
+ gem uninstall bundler
31
32
  gem install bundler -v 1.17.3
32
33
  bundle install --jobs 4 --retry 3
33
34
  bundle exec rake
@@ -1,3 +1,7 @@
1
+ ## 1.10.0 (2020-03-31)
2
+
3
+ - Adds support for using multiple tiers in a plan, thanks @cpsoinos
4
+
1
5
  ## 1.9.1 (2019-10-28)
2
6
 
3
7
  - Fixes issue with `rake stripe:verify` thanks @Millariel !
data/Gemfile CHANGED
@@ -11,7 +11,7 @@ end
11
11
 
12
12
  group :test do
13
13
  gem 'mocha'
14
- gem 'simplecov', require: false
14
+ gem 'simplecov', '< 0.18', require: false
15
15
  gem 'stripe-ruby-mock'
16
16
  gem 'webmock'
17
17
  # Required for system tests
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Stripe::Rails: A Rails Engine for use with [stripe.com](https://stripe.com)
2
- [![Gem Version](https://badge.fury.io/rb/stripe-rails.png)](http://badge.fury.io/rb/stripe-rails)
3
- [![Build Status](https://travis-ci.org/tansengming/stripe-rails.png?branch=master)](https://travis-ci.org/tansengming/stripe-rails)
2
+ [![Gem Version](https://badge.fury.io/rb/stripe-rails.svg)](https://badge.fury.io/rb/stripe-rails)
3
+ [![Build Status](https://travis-ci.org/tansengming/stripe-rails.svg?branch=master)](https://travis-ci.org/tansengming/stripe-rails)
4
4
  [![Code Climate](https://codeclimate.com/github/tansengming/stripe-rails/badges/gpa.svg)](https://codeclimate.com/github/tansengming/stripe-rails)
5
5
  [![Test Coverage](https://codeclimate.com/github/tansengming/stripe-rails/badges/coverage.svg)](https://codeclimate.com/github/tansengming/stripe-rails/coverage)
6
6
  [![Tidelift](https://tidelift.com/badges/github/tansengming/stripe-rails)](#)
@@ -188,6 +188,23 @@ Stripe.plan :bronze do |plan|
188
188
  plan.product_id = 'prod_XXXXXXXXXXXXXX'
189
189
  plan.amount = 999 # $9.99
190
190
  plan.interval = 'month'
191
+
192
+ # Use graduated pricing tiers
193
+ # ref: https://stripe.com/docs/api/plans/object#plan_object-tiers
194
+ plan.tiers = [
195
+ {
196
+ unit_amount: 1500,
197
+ up_to: 10
198
+ },
199
+ {
200
+ unit_amount: 1000,
201
+ up_to: 'inf'
202
+ }
203
+ ]
204
+ plan.tiers_mode = 'graduated'
205
+
206
+ # set the usage type to 'metered'
207
+ plan.usage_type = 'metered'
191
208
  end
192
209
  ```
193
210
 
@@ -1,6 +1,7 @@
1
1
  source :rubygems
2
2
 
3
3
  gem 'rails', '~> 4.2'
4
+ gem 'sprockets', '< 4'
4
5
 
5
6
  gem 'rake'
6
7
  gem 'responders', '~> 2.0' # to support Rails 4.2
@@ -11,9 +11,9 @@
11
11
  # product.type = 'service'
12
12
  # end
13
13
 
14
- # Once you have your productss defined, you can run
14
+ # Once you have your products defined, you can run
15
15
  #
16
16
  # rake stripe:prepare
17
17
  #
18
- # This will export any new plans to stripe.com so that you can
18
+ # This will export any new products to stripe.com so that you can
19
19
  # begin using them in your API calls.
@@ -0,0 +1,34 @@
1
+ module Stripe
2
+ module Plans
3
+ class BillingTier
4
+ include ActiveModel::Validations
5
+
6
+ validates_presence_of :up_to
7
+ validates_presence_of :flat_amount, if: ->(tier) { tier.unit_amount.nil? },
8
+ message: 'one of `flat_amount` or `unit_amount` must be specified!'
9
+ validates_presence_of :unit_amount, if: ->(tier) { tier.flat_amount.nil? },
10
+ message: 'one of `flat_amount` or `unit_amount` must be specified!'
11
+ validates_absence_of :flat_amount, if: ->(tier) { tier.unit_amount.present? },
12
+ message: 'only one of `flat_amount` or `unit_amount` should be specified!'
13
+ validates_absence_of :unit_amount, if: ->(tier) { tier.flat_amount.present? },
14
+ message: 'only one of `flat_amount` or `unit_amount` should be specified!'
15
+
16
+ attr_accessor :up_to, :flat_amount, :unit_amount
17
+
18
+ def initialize(attrs)
19
+ @up_to = attrs[:up_to]
20
+ @flat_amount = attrs[:flat_amount]
21
+ @unit_amount = attrs[:unit_amount]
22
+ end
23
+
24
+ def to_h
25
+ {
26
+ up_to: up_to,
27
+ flat_amount: flat_amount,
28
+ unit_amount: unit_amount
29
+ }.compact
30
+ end
31
+
32
+ end
33
+ end
34
+ end
@@ -12,16 +12,20 @@ module Stripe
12
12
  :interval,
13
13
  :interval_count,
14
14
  :metadata,
15
- :name,
15
+ :name,
16
16
  :nickname,
17
17
  :product_id,
18
18
  :statement_descriptor,
19
+ :tiers,
19
20
  :tiers_mode,
21
+ :transform_usage,
20
22
  :trial_period_days,
21
23
  :usage_type
22
24
 
23
- validates_presence_of :id, :amount, :currency
24
-
25
+ validates_presence_of :id, :currency
26
+ validates_presence_of :amount, unless: ->(p) { p.billing_scheme == 'tiered' }
27
+ validates_absence_of :transform_usage, if: ->(p) { p.billing_scheme == 'tiered' }
28
+ validates_presence_of :tiers_mode, if: ->(p) { p.billing_scheme == 'tiered' }
25
29
  validates_inclusion_of :interval,
26
30
  in: %w(day week month year),
27
31
  message: "'%{value}' is not one of 'day', 'week', 'month' or 'year'"
@@ -38,6 +42,11 @@ module Stripe
38
42
  validate :aggregate_usage_must_be_metered, if: ->(p) { p.aggregate_usage.present? }
39
43
  validate :valid_constant_name, unless: ->(p) { p.constant_name.nil? }
40
44
 
45
+ # validations for when using tiered billing
46
+ validate :tiers_must_be_array, if: ->(p) { p.tiers.present? }
47
+ validate :billing_scheme_must_be_tiered, if: ->(p) { p.tiers.present? }
48
+ validate :validate_tiers, if: ->(p) { p.billing_scheme == 'tiered' }
49
+
41
50
  def initialize(*args)
42
51
  super(*args)
43
52
  @currency = 'usd'
@@ -54,6 +63,22 @@ module Stripe
54
63
  errors.add(:base, 'must have a product_id or a name') unless (@product_id.present? ^ @name.present?)
55
64
  end
56
65
 
66
+ def billing_scheme_must_be_tiered
67
+ errors.add(:billing_scheme, 'must be set to `tiered` when specifying `tiers`') unless billing_scheme == 'tiered'
68
+ end
69
+
70
+ def tiers_must_be_array
71
+ errors.add(:tiers, 'must be an Array') unless tiers.is_a?(Array)
72
+ end
73
+
74
+ def billing_tiers
75
+ @billing_tiers = tiers.map { |t| Stripe::Plans::BillingTier.new(t) } if tiers
76
+ end
77
+
78
+ def validate_tiers
79
+ billing_tiers.all?(&:valid?)
80
+ end
81
+
57
82
  module ConstTester; end
58
83
  def valid_constant_name
59
84
  ConstTester.const_set(constant_name.to_s.upcase, constant_name)
@@ -82,8 +107,11 @@ module Stripe
82
107
  usage_type: usage_type,
83
108
  aggregate_usage: aggregate_usage,
84
109
  billing_scheme: billing_scheme,
85
- nickname: nickname
86
- }
110
+ nickname: nickname,
111
+ tiers: tiers ? tiers.map(&:to_h) : nil,
112
+ tiers_mode: tiers_mode,
113
+ transform_usage: transform_usage
114
+ }.compact
87
115
  end
88
116
 
89
117
  def product_options
@@ -11,6 +11,7 @@ module Stripe
11
11
  :caption,
12
12
  :metadata,
13
13
  :shippable,
14
+ :unit_label,
14
15
  :url,
15
16
  :statement_descriptor
16
17
 
@@ -42,6 +43,7 @@ module Stripe
42
43
  caption: caption,
43
44
  metadata: metadata,
44
45
  shippable: shippable,
46
+ unit_label: unit_label,
45
47
  url: url,
46
48
  statement_descriptor: statement_descriptor
47
49
  }
@@ -4,6 +4,7 @@ require 'stripe/engine'
4
4
  require 'stripe/configuration_builder'
5
5
  require 'stripe/current_api_version'
6
6
  require 'stripe/plans'
7
+ require 'stripe/billing_tier'
7
8
  require 'stripe/coupons'
8
9
  require 'stripe/products'
9
10
  require 'stripe/callbacks'
@@ -1,5 +1,5 @@
1
1
  module Stripe
2
2
  module Rails
3
- VERSION = '1.9.1'.freeze
3
+ VERSION = '1.10.0'.freeze
4
4
  end
5
5
  end
@@ -26,3 +26,24 @@ Stripe.plan :metered do |plan|
26
26
  plan.aggregate_usage = 'max'
27
27
  plan.billing_scheme = 'per_unit'
28
28
  end
29
+
30
+ Stripe.plan :tiered do |plan|
31
+ plan.name = 'Tiered'
32
+ plan.aggregate_usage = 'max'
33
+ plan.billing_scheme = 'tiered'
34
+ # interval must be either 'day', 'week', 'month' or 'year'
35
+ plan.interval = 'month'
36
+ plan.interval_count = 1
37
+ plan.tiers = [
38
+ {
39
+ unit_amount: 1500,
40
+ up_to: 10
41
+ },
42
+ {
43
+ unit_amount: 1000,
44
+ up_to: 'inf'
45
+ }
46
+ ]
47
+ plan.tiers_mode = 'graduated'
48
+ plan.usage_type = 'metered'
49
+ end
@@ -275,6 +275,82 @@ describe 'building plans' do
275
275
  Stripe::Plans::METERED.put!
276
276
  end
277
277
 
278
+ it 'creates a tiered plan' do
279
+ Stripe::Plan.expects(:create).with(
280
+ :id => :tiered,
281
+ :currency => 'usd',
282
+ :product => {
283
+ :name => 'Tiered',
284
+ :statement_descriptor => nil,
285
+ },
286
+ :interval => 'month',
287
+ :interval_count => 1,
288
+ :trial_period_days => 0,
289
+ :usage_type => 'metered',
290
+ :aggregate_usage => 'max',
291
+ :billing_scheme => 'tiered',
292
+ :tiers => [
293
+ {
294
+ :unit_amount => 1500,
295
+ :up_to => 10
296
+ },
297
+ {
298
+ :unit_amount => 1000,
299
+ :up_to => 'inf'
300
+ }
301
+ ],
302
+ :tiers_mode => 'graduated'
303
+ )
304
+ plan = Stripe::Plans::TIERED
305
+ Stripe::Plans::TIERED.put!
306
+ end
307
+
308
+ describe 'when passed invalid arguments for tiered pricing' do
309
+ it 'raises a Stripe::InvalidConfigurationError when billing tiers are invalid' do
310
+ lambda {
311
+ Stripe.plan "Bad Tiers".to_sym do |plan|
312
+ plan.name = 'Acme as a service BAD TIERS'
313
+ plan.constant_name = 'BAD_TIERS'
314
+ plan.interval = 'month'
315
+ plan.interval_count = 1
316
+ plan.trial_period_days = 30
317
+ plan.usage_type = 'metered'
318
+ plan.tiers_mode = 'graduated'
319
+ plan.billing_scheme = 'per_unit'
320
+ plan.aggregate_usage = 'sum'
321
+ plan.tiers = [
322
+ {
323
+ unit_amount: 1500,
324
+ up_to: 10
325
+ },
326
+ {
327
+ unit_amount: 1000,
328
+ }
329
+ ]
330
+ end
331
+ }.must_raise Stripe::InvalidConfigurationError
332
+ end
333
+
334
+ it 'raises a Stripe::InvalidConfigurationError when billing tiers is not an array' do
335
+ lambda {
336
+ Stripe.plan "Bad Tiers".to_sym do |plan|
337
+ plan.name = 'Acme as a service BAD TIERS'
338
+ plan.constant_name = 'BAD_TIERS'
339
+ plan.interval = 'month'
340
+ plan.interval_count = 1
341
+ plan.trial_period_days = 30
342
+ plan.usage_type = 'metered'
343
+ plan.tiers_mode = 'graduated'
344
+ plan.billing_scheme = 'per_unit'
345
+ plan.aggregate_usage = 'sum'
346
+ plan.tiers = {
347
+ unit_amount: 1500,
348
+ up_to: 10
349
+ }
350
+ end
351
+ }.must_raise Stripe::InvalidConfigurationError
352
+ end
353
+ end
278
354
 
279
355
  describe 'when using a product id' do
280
356
  before do
@@ -346,7 +422,7 @@ describe 'building plans' do
346
422
  proc {Stripe.plan(:bad) {}}.must_raise Stripe::InvalidConfigurationError
347
423
  end
348
424
  end
349
-
425
+
350
426
  describe 'with custom constant name' do
351
427
  before do
352
428
  Stripe.plan "Primo Plan".to_sym do |plan|
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stripe-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.1
4
+ version: 1.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Charles Lowell
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2019-10-28 00:00:00.000000000 Z
13
+ date: 2020-03-31 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rails
@@ -93,6 +93,7 @@ files:
93
93
  - lib/generators/templates/plans.rb
94
94
  - lib/generators/templates/products.rb
95
95
  - lib/stripe-rails.rb
96
+ - lib/stripe/billing_tier.rb
96
97
  - lib/stripe/callbacks.rb
97
98
  - lib/stripe/callbacks/builder.rb
98
99
  - lib/stripe/configuration_builder.rb