stripe-rails 1.9.1 → 1.10.0

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.
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