stripe_rails 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -12,7 +12,7 @@ gem 'stripe_rails'
12
12
 
13
13
  h3. Compatibility
14
14
 
15
- The gem works with rails 3.2.x and mongoid 3.0.0, support for active record will be coming in the very next release.
15
+ The gem works with rails 3.2.x and mongoid and active:record when using model relationships. It uses rails cache to cache the stripe object for 1 hour on subsequent get requests.
16
16
 
17
17
  h2. Usage
18
18
 
@@ -0,0 +1,7 @@
1
+ module StripeRails
2
+ if Object.const_defined? 'ActiveRecord'
3
+ class StripeCustomer < ActiveRecord::Base
4
+
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ class CreateStripeRailsCustomers < ActiveRecord::Migration
2
+ def change
3
+ create_table :stripe_rails_stripe_customers do |t|
4
+ t.primary :stripe_customer_id
5
+ end
6
+ end
7
+ end
@@ -1,7 +1,7 @@
1
- require "stripe_rails/engine"
2
- require "stripe_rails/pci_compliance"
3
- require "stripe_rails/errors"
1
+ require "stripe_rails/cache"
2
+ require "stripe_rails/helpers"
4
3
  require "stripe_rails/autoload_const_defined"
4
+ require "stripe_rails/engine"
5
5
 
6
6
  module StripeRails
7
7
  end
@@ -2,11 +2,21 @@ module StripeRails::ActsAsCustomer
2
2
  extend ActiveSupport::Concern
3
3
 
4
4
  included do
5
- has_one :stripe, class_name: 'StripeRails::Customer', autobuild: true, dependent: :destroy, as: :stripe_customer
6
- before_create :create_stripe_customer
7
5
 
8
- StripeRails::Customer.send :belongs_to, :stripe_customer, class_name: self.to_s, polymorphic: true
9
- StripeRails::Customer.send :validates_presence_of, :stripe_customer_id
6
+ # Mongoid
7
+ if self.respond_to?(:field)
8
+ field :stripe_customer_id
9
+ elsif self.kind_of(ActiveRecord::Base)
10
+ StripeRails::StripeCustomer.send :belongs_to, :stripe_customerable, class_name: self.to_s, polymorphic: true, dependent: :destroy
11
+ has_one :stripe_customer, class_name: 'StripeRails::StripeCustomer', as: :stripe_customerable
12
+ delegate :stripe_customer_id, :stripe_customer
13
+ else
14
+ raise "ORM is not supported, use ActiveRecord or Mongoid"
15
+ end
16
+
17
+ def stripe
18
+ Stripe::Customer.retrieve(stripe_customer_id) if stripe_customer_id
19
+ end
10
20
 
11
21
  def self.stripe_description(method)
12
22
  send :define_method, :stripe_description do
@@ -37,7 +47,14 @@ module StripeRails::ActsAsCustomer
37
47
  end
38
48
 
39
49
  def create_stripe_customer
40
- self.stripe.create_customer
50
+ return false if stripe
51
+ params = {}
52
+ params['description'] = stripe_description if respond_to? :stripe_description
53
+ self.stripe_customer_id = Stripe::Customer.create(params).id
54
+
55
+ #stripe.update_subscription(plan: stripe_subscription_plan }) if respond_to? :stripe_subscription_plan
56
+
57
+ save!
41
58
  end
42
59
 
43
60
  end
@@ -0,0 +1,25 @@
1
+ module Stripe
2
+ class Customer < APIResource
3
+
4
+ def refresh
5
+
6
+ key = Digest::MD5.hexdigest "#{url}_#{@api_key}_stripe"
7
+
8
+ value = Rails.cache.fetch key, expires_in: 1.hour, force: @force, compress: true do
9
+ @force = false
10
+ super.to_json
11
+ end
12
+
13
+ response = Util.symbolize_names Stripe::JSON.load value
14
+
15
+ refresh_from(response, @api_key)
16
+
17
+ end
18
+
19
+ def refresh!
20
+ @force = true
21
+ refresh
22
+ end
23
+
24
+ end
25
+ end
@@ -7,10 +7,5 @@ module StripeRails
7
7
  config.autoload_paths += Dir["#{config.root}/lib**/"]
8
8
  config.autoload_paths += Dir["#{config.root}/stripe_callbacks/**"]
9
9
 
10
- initializer "Pci Compliance" do
11
- ::Stripe::Token.send(:include, Stripe::PciCompliance) if Rails.application.config.respond_to?(:stripe_pci_compliance) && Rails.application.config.stripe_pci_compliance
12
- Rails.application.config.autoload_paths += Dir["#{Rails.root.to_s}/app/stripe_callbacks/**"]
13
- end
14
-
15
10
  end
16
11
  end
@@ -0,0 +1,15 @@
1
+ module Stripe
2
+ class Customer < APIResource
3
+
4
+ def days_remaining_in_trial
5
+ if subscription && subscription.status == 'trialing'
6
+ ((Time.at(subscription.trial_end) - Time.now) / 24 / 60 / 60).ceil
7
+ elsif subscription
8
+ 0
9
+ else
10
+ nil
11
+ end
12
+ end
13
+
14
+ end
15
+ end
@@ -1,3 +1,3 @@
1
1
  module StripeRails
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
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: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,24 +9,24 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-12 00:00:00.000000000 Z
12
+ date: 2012-08-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ~>
19
+ - - ! '>='
20
20
  - !ruby/object:Gem::Version
21
- version: 3.2.5
21
+ version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  none: false
26
26
  requirements:
27
- - - ~>
27
+ - - ! '>='
28
28
  - !ruby/object:Gem::Version
29
- version: 3.2.5
29
+ version: '0'
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: jquery-rails
32
32
  requirement: !ruby/object:Gem::Requirement
@@ -59,22 +59,6 @@ dependencies:
59
59
  - - ! '>='
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
- - !ruby/object:Gem::Dependency
63
- name: mongoid
64
- requirement: !ruby/object:Gem::Requirement
65
- none: false
66
- requirements:
67
- - - ~>
68
- - !ruby/object:Gem::Version
69
- version: 3.0.0.rc
70
- type: :runtime
71
- prerelease: false
72
- version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
- requirements:
75
- - - ~>
76
- - !ruby/object:Gem::Version
77
- version: 3.0.0.rc
78
62
  - !ruby/object:Gem::Dependency
79
63
  name: rspec-rails
80
64
  requirement: !ruby/object:Gem::Requirement
@@ -92,8 +76,8 @@ dependencies:
92
76
  - !ruby/object:Gem::Version
93
77
  version: '0'
94
78
  description: Stripe Rails was built on top of the official stripe gem to bring ease
95
- of use of stripe in your models. The gem also caches the stripe customer response
96
- so that if you often use it to check a customers subscription status, it wont have
79
+ of use of stripe in your models. The gem also uses your applications cache to store
80
+ objects locally so that you dont have to continuously hit Stripes API, it wont have
97
81
  to reach the stripe API on every page load. Lastly, this gem has built in responses
98
82
  for stripe webhooks/callbacks.
99
83
  email:
@@ -110,21 +94,19 @@ files:
110
94
  - app/controllers/stripe_rails/callbacks_controller.rb
111
95
  - app/helpers/stripe_rails/application_helper.rb
112
96
  - app/helpers/stripe_rails/callbacks_helper.rb
113
- - app/models/stripe_rails/charge.rb
114
- - app/models/stripe_rails/customer.rb
115
- - app/models/stripe_rails/invoice.rb
97
+ - app/models/stripe_rails/stripe_customer.rb
116
98
  - app/stripe_callbacks/ping_callback.rb
117
99
  - app/views/layouts/stripe_rails/application.html.erb
118
100
  - config/routes.rb
119
- - db/migrate/20120608044024_create_stripe_rails_customers.rb
101
+ - db/migrate/20120822045452_create_stripe_rails_stripe_customers.rb
120
102
  - lib/generators/stripe_callback/stripe_callback_generator.rb
121
103
  - lib/generators/stripe_callback/USAGE
122
104
  - lib/stripe_rails/acts_as_customer.rb
123
105
  - lib/stripe_rails/autoload_const_defined.rb
106
+ - lib/stripe_rails/cache.rb
124
107
  - lib/stripe_rails/callback.rb
125
108
  - lib/stripe_rails/engine.rb
126
- - lib/stripe_rails/errors.rb
127
- - lib/stripe_rails/pci_compliance.rb
109
+ - lib/stripe_rails/helpers.rb
128
110
  - lib/stripe_rails/version.rb
129
111
  - lib/stripe_rails.rb
130
112
  - lib/tasks/stripe_rails_tasks.rake
@@ -151,10 +133,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
151
133
  version: '0'
152
134
  requirements: []
153
135
  rubyforge_project:
154
- rubygems_version: 1.8.21
136
+ rubygems_version: 1.8.23
155
137
  signing_key:
156
138
  specification_version: 3
157
139
  summary: Stripe Rails was built on top of the official stripe gem for easier integration
158
140
  into a rails project.
159
141
  test_files: []
160
- has_rdoc:
@@ -1,27 +0,0 @@
1
- module StripeRails
2
- class Charge
3
-
4
- def initialize(customer)
5
- @customer = customer
6
- raise Stripe::InvalidObjectError, 'Object is not a stripe customer!' unless @customer.kind_of? Stripe::Customer
7
- end
8
-
9
- def all(options = {})
10
- Stripe::Charge.all(options.merge({ customer: @customer.id }))
11
- end
12
-
13
- def create(amount, options = {})
14
- Stripe::Charge.create(options.merge({ amount: amount, customer: @customer.id }))
15
- end
16
-
17
- def retrieve(id)
18
- charge = Stripe::Charge.retrieve(id)
19
- raise Stripe::ChargeAssociationError, 'The charge does not belong to this customer!' unless charge.customer == @customer.id
20
- end
21
-
22
- def refund(id)
23
- retrieve(id).refund
24
- end
25
-
26
- end
27
- end
@@ -1,135 +0,0 @@
1
- module StripeRails
2
- class Customer
3
-
4
- # Support for mongoid
5
- include Mongoid::Document
6
- include Mongoid::Timestamps
7
-
8
- store_in collection: "stripe_customers"
9
-
10
- field :data, type: String, default: -> { nil }
11
- field :unit_price, type: Float
12
- field :_id, type: String, default: -> { nil }
13
-
14
- attr_readonly :_id
15
-
16
- def charges
17
- StripeRails::Charge.new(@customer)
18
- end
19
-
20
- ActionDispatch::Session::CookieStore
21
-
22
- def invoices
23
- StripeRails::Invoice.new(@customer)
24
- end
25
-
26
- def initialize(attributes={}, options={})
27
- attributes = { data: attributes.to_json.to_a.pack('m') } if self.new_record?
28
- super(attributes,options)
29
- end
30
-
31
- # All returns items from the stripe API
32
- def self.all(*args)
33
- return super(nil) if args.first && args.first[:local] == true
34
- Stripe::Customer.all(*args)
35
- end
36
-
37
- def self.find(id)
38
- customer = self.find_or_initialize_by(_id: id)
39
- customer.save if customer.new_record?
40
- customer
41
- end
42
-
43
- # Privatize methods that can potential break caching and updating
44
- class << self
45
- alias :retrieve :find
46
- private :find_by
47
- end
48
-
49
- private :attributes=, :update_attributes, :update_attributes!
50
-
51
- def method_missing(meth, *args, &block)
52
- if @customer.respond_to?(meth.to_sym)
53
- value = @customer.send meth, *args
54
- refresh_from @customer
55
- value
56
- elsif meth =~ /=$/ && %w(card= description= coupon= email=).include?(meth.to_s)
57
- value = @customer.send meth, *args
58
- refresh_from @customer
59
- value
60
- else
61
- super
62
- end
63
- end
64
-
65
- # Callbacks
66
- after_initialize :stripe_read
67
- before_update :stripe_update
68
- before_destroy :stripe_destroy
69
-
70
- def delete(options={})
71
- @customer.delete
72
- super(options)
73
- end
74
-
75
- def refresh!
76
- @customer = Stripe::Customer.retrieve(id)
77
- send :data=, @customer.to_json.to_a.pack('m')
78
- save
79
- self
80
- end
81
-
82
- def days_remaining_in_trial
83
- if subscription && subscription.status == 'trialing'
84
- ((Time.at(subscription.trial_end) - Time.now) / 24 / 60 / 60).ceil
85
- elsif subscription
86
- 0
87
- else
88
- nil
89
- end
90
- end
91
-
92
- # Using a callback so that we can call create and save on a new record
93
- def create_customer
94
- params = {}
95
- params['description'] = stripe_customer.stripe_description if stripe_customer.respond_to? :stripe_description
96
- refresh_from Stripe::Customer.create(params)
97
-
98
- if stripe_customer.respond_to? :stripe_subscription_plan
99
- @customer.update_subscription({ plan: stripe_customer.stripe_subscription_plan })
100
- refresh_from @customer
101
- end
102
-
103
- self._id = @customer.id
104
- self.unit_price = stripe_customer.stripe_unit_price
105
-
106
- save
107
- end
108
-
109
- private
110
-
111
- def refresh_from(stripe_object)
112
- raise Stripe::InvalidObjectError, "Is not a stripe customer!" unless stripe_object.kind_of? Stripe::Customer
113
- @customer = stripe_object
114
- send :data=, @customer.to_json.to_a.pack('m')
115
- self
116
- end
117
-
118
- def stripe_read
119
- if !new_record? && updated_at && updated_at < 1.day.ago
120
- self.refresh!
121
- else
122
- @customer = Stripe::Customer.construct_from(JSON.parse data.unpack('m').first ) if data && data.unpack('m').first.present?
123
- end
124
- end
125
-
126
- def stripe_update
127
- refresh_from @customer.save
128
- end
129
-
130
- def stripe_destroy
131
- @customer.delete
132
- end
133
-
134
- end
135
- end
@@ -1,5 +0,0 @@
1
- module StripeRails
2
- class Invoice < ActiveRecord::Base
3
- # attr_accessible :title, :body
4
- end
5
- end
@@ -1,10 +0,0 @@
1
- class CreateStripeRailsCharges < ActiveRecord::Migration
2
- def change
3
- create_table :stripe_rails_charges do |t|
4
- t.text :data
5
- t.float :unit_price
6
- t.string :_id
7
- t.timestamps
8
- end
9
- end
10
- end
@@ -1,45 +0,0 @@
1
- module Stripe
2
-
3
- class PciComplianceError < StandardError
4
- def initialize(msg)
5
- super
6
- end
7
- end
8
-
9
- class InvalidObjectError < StandardError
10
- def initialize(msg)
11
- super
12
- end
13
- end
14
-
15
- class CollectionInvalidError < StandardError
16
- def initialize(msg)
17
- super
18
- end
19
- end
20
-
21
- class PriceInvalidError < StandardError
22
- def initialize(msg)
23
- super
24
- end
25
- end
26
-
27
- class ChargeAssociationError < StandardError
28
- def initialize(msg)
29
- super
30
- end
31
- end
32
-
33
- class InvalidEventError < StandardError
34
- def initialize(msg='Event is invalid!')
35
- super
36
- end
37
- end
38
-
39
- class InvalidCallbackResponseError < StandardError
40
- def initialize(msg='Response must be a hash!')
41
- super
42
- end
43
- end
44
-
45
- end
@@ -1,5 +0,0 @@
1
- module Stripe::PciCompliance
2
- ::Stripe::Token.send :define_singleton_method, :create do
3
- raise Stripe::PciComplianceError, "Method disabled due to pci compliance!"
4
- end
5
- end