supercharged 2.0.4 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5e8d7ac5853344d5679abd3e17acf7dc1b6279b6
4
+ data.tar.gz: 6960d5ece3a7b407c7b13ca86dd57715452b7bea
5
+ SHA512:
6
+ metadata.gz: 602af557001d93eb89e6e76412b6e1a1beea04be1a75f98850710471a3ec073e15805fbbf1587bfedde64532b1d87d0877fa1fb23a19c6fb11456b6eef571c80
7
+ data.tar.gz: ac0b75823e466d61dd7c05c399b6e3cb008f739491a2059443a0f6dd9f7265140fdcf315f686c9a4d1fe85d4a4e002a33ddbbe40152c752a3e7e8e2fd8ca060d
data/README.md CHANGED
@@ -36,6 +36,7 @@ Create config/initializers/supercharged.rb
36
36
 
37
37
  ```ruby
38
38
  ActiveMerchant::Billing::Base.integration_mode = Rails.env.production? ? :production : :test
39
+ ActiveMerchant::Billing::Base.mode = Rails.env.production? ? :production : :test
39
40
  ```
40
41
 
41
42
  Add
@@ -81,7 +82,8 @@ supercharged controllers: {charges: :charges, gateway_notifications: :gateway_no
81
82
  Create model in app/models/charge.rb and inherit from Supercharged::Charge::Base
82
83
 
83
84
  ```ruby
84
- class Charge < Supercharged::Charge::Base
85
+ class Charge < ActiveRecord::Base
86
+ include Supercharged::Charge::Base
85
87
  # your custom code here
86
88
 
87
89
  def approve(real_amount)
@@ -5,7 +5,7 @@ class @SuperchargedForm
5
5
 
6
6
  @amount_input = @form.find("[role='charge-amount']")
7
7
  @gateway_name_input = @form.find("[role='charge-gateway-name']")
8
- @id_input = if @form.find("[role='charge-id']").length then @form.find("[role='charge-id']") else @form.find("[value='<%= Supercharged::ChargesHelper::FAKE_ORDER_ID %>']")
8
+ @id_input = @form.find("[role='payment-form-order']")
9
9
 
10
10
  @form.submit =>
11
11
  valid = @startPayment()
@@ -39,7 +39,7 @@ class @SuperchargedForm
39
39
  async: false,
40
40
  data: {charge: charge_attributes},
41
41
  success: (response) ->
42
- options.success(response)
42
+ options.success(response.charge)
43
43
  error: (jqXHR, status, errorThrown)=>
44
44
  return unless jqXHR.status == 422
45
45
 
@@ -8,7 +8,7 @@ class Supercharged::ChargesController < ApplicationController
8
8
  charge.user = current_user
9
9
 
10
10
  if charge.save
11
- render json: charge.as_json(only: [:id])
11
+ render json: { charge: charge.as_json(only: [:id]) }
12
12
  else
13
13
  render json: { errors: charge.errors }, status: :unprocessable_entity
14
14
  end
@@ -9,10 +9,10 @@ class Supercharged::GatewayNotificationsController < ApplicationController
9
9
  @notification = GatewayNotification.create!(params: params, gateway: params[:gateway], raw_post: request.raw_post)
10
10
  @notification.logger = persistent_logger
11
11
 
12
- error = if !@notification.complete?
13
- "not_completed"
14
- elsif !@notification.acknowledge
12
+ error = if !@notification.acknowledge
15
13
  "acknowledge_failed"
14
+ elsif !@notification.complete?
15
+ "not_completed"
16
16
  elsif !@notification.charge
17
17
  "charge_not_found"
18
18
  end
@@ -23,7 +23,7 @@ class Supercharged::GatewayNotificationsController < ApplicationController
23
23
  charge = @notification.charge
24
24
 
25
25
  if charge && !charge.error?
26
- @notification.charge.failed!
26
+ @notification.charge.fail
27
27
  @notification.charge.update_attribute(:error, error)
28
28
  end
29
29
 
@@ -1,6 +1,5 @@
1
1
  module Supercharged::ChargesHelper
2
2
  # No order id while generating form. It will be added later via JS
3
- # JS finds order input by this fake id because id and name will be integration specific
4
3
  FAKE_ORDER_ID = "[payment_order_id]"
5
4
 
6
5
  def charge_form_for(service_name, options = {}, &block)
@@ -12,10 +11,11 @@ module Supercharged::ChargesHelper
12
11
  options = with_default_html_options(options)
13
12
 
14
13
  account = options.delete(:account)
15
- notify_url = gateways_result_url(service_name)
16
14
 
17
15
  payment_service_for(FAKE_ORDER_ID, account, options) do |service|
18
- service.notify_url notify_url
16
+ service.notify_url gateways_result_url(service_name)
17
+ service.return_url root_url
18
+ service.cancel_return_url new_charge_url
19
19
  block.call(service)
20
20
  end
21
21
  end
@@ -40,9 +40,7 @@ module Supercharged::ChargesHelper
40
40
  {
41
41
  role: "charge-amount",
42
42
  required: true,
43
- data: {
44
- min_value: Charge.min_amount
45
- }
43
+ min: Charge.new(user: current_user).min_amount
46
44
  }
47
45
  end
48
46
 
data/app/models/charge.rb CHANGED
@@ -1,2 +1,3 @@
1
- class Charge < Supercharged::Charge::Base
1
+ class Charge < ActiveRecord::Base
2
+ include Supercharged::Charge::Base
2
3
  end
@@ -12,7 +12,13 @@ class GatewayNotification < ActiveRecord::Base
12
12
  attr_accessor :raw_post, :logger
13
13
 
14
14
  def acknowledge
15
- adapter.acknowledge
15
+ res = adapter.acknowledge
16
+
17
+ if charge_id.nil? && adapter.item_id
18
+ update_column(:charge_id, adapter.item_id)
19
+ end
20
+
21
+ res
16
22
  end
17
23
 
18
24
  def complete?
@@ -28,12 +34,14 @@ class GatewayNotification < ActiveRecord::Base
28
34
  end
29
35
 
30
36
  def approve
37
+ raise EmptyChargeIdError unless charge_id
38
+
31
39
  logger.info "real amount = #{real_amount}"
32
40
  charge.approve(real_amount) unless charge.ok?
33
41
  end
34
42
 
35
43
  def real_amount
36
- params[service.mappings[:amount]]
44
+ adapter.gross
37
45
  end
38
46
 
39
47
  private
@@ -44,12 +52,9 @@ class GatewayNotification < ActiveRecord::Base
44
52
  raise "Unknown integration '#{gateway}'"
45
53
  end
46
54
 
47
- def service
48
- "ActiveMerchant::Billing::Integrations::#{gateway.classify}::Helper".classify.constantize
49
- end
50
-
51
55
  def set_charge_id
52
- self.charge_id = adapter.item_id || raise(EmptyChargeIdError)
56
+ self.charge_id ||= adapter.item_id
57
+ true
53
58
  end
54
59
 
55
60
  end
@@ -1,51 +1,52 @@
1
1
  module Supercharged
2
2
  module Charge
3
- class Base < ActiveRecord::Base
4
- include ActiveModel::ForbiddenAttributesProtection
3
+ module Base
4
+ extend ActiveSupport::Concern
5
5
 
6
- self.table_name = "charges"
7
- self.abstract_class = true
6
+ included do
7
+ self.table_name = "charges"
8
8
 
9
- belongs_to :user
10
- has_many :gateway_input_notifications
11
- has_many :gateway_responses
9
+ belongs_to :user
10
+ has_many :gateway_input_notifications
11
+ has_many :gateway_responses
12
12
 
13
- validates :amount, presence: true, numericality: {
14
- greater_than_or_equal_to: ->(model) {
15
- model.class.min_amount
13
+ validates :amount, presence: true, numericality: {
14
+ greater_than_or_equal_to: :min_amount
16
15
  }
17
- }
18
16
 
19
- scope :latest, order("created_at DESC")
20
- scope :by_gateway, ->(gateway_name) { where(gateway_name: gateway_name.to_s) }
17
+ scope :latest, ->{ order("created_at DESC") }
18
+ scope :by_gateway, ->(gateway_name) { where(gateway_name: gateway_name.to_s) }
21
19
 
22
- state_machine :state, initial: :new do
23
- # store_audit_trail
20
+ state_machine :state, initial: :new do
21
+ # store_audit_trail
24
22
 
25
- state :new
26
- state :rejected
27
- state :ok
28
- state :error
23
+ state :new
24
+ state :rejected
25
+ state :ok
26
+ state :error
29
27
 
30
- event :set_ok do
31
- transition [:new, :error, :pending] => :ok
32
- end
28
+ event :set_ok do
29
+ transition [:new, :error, :pending] => :ok
30
+ end
33
31
 
34
- event :failed do
35
- transition [:new, :pending] => :error
36
- end
32
+ event :set_failed do
33
+ transition [:new, :pending] => :error
34
+ end
37
35
 
38
- event :reject do
39
- transition [:new, :error, :pending] => :rejected
40
- end
36
+ event :reject do
37
+ transition [:new, :error, :pending] => :rejected
38
+ end
41
39
 
42
- event :set_pending do
43
- transition [:new, :error] => :pending
40
+ event :set_pending do
41
+ transition [:new, :error] => :pending
42
+ end
44
43
  end
45
44
  end
46
45
 
47
- def self.with_token(token)
48
- where(gateway_token: token).first
46
+ module ClassMethods
47
+ def with_token(token)
48
+ where(gateway_token: token).first
49
+ end
49
50
  end
50
51
 
51
52
  # require implicit amount from gateway, not from user
@@ -54,7 +55,12 @@ module Supercharged
54
55
  set_ok!
55
56
  end
56
57
 
57
- def self.min_amount
58
+ def fail
59
+ self.state_event = "set_failed"
60
+ save(validate: false)
61
+ end
62
+
63
+ def min_amount
58
64
  1
59
65
  end
60
66
 
data/config/routes.rb CHANGED
@@ -15,7 +15,7 @@ module ActionDispatch::Routing
15
15
  end
16
16
  end
17
17
 
18
- match "gateways/:gateway/result" => "#{controllers[:gateway_notifications]}#create", as: :gateways_result
18
+ post "gateways/:gateway/result" => "#{controllers[:gateway_notifications]}#create", as: :gateways_result
19
19
  end
20
20
 
21
21
  end
@@ -1,3 +1,3 @@
1
1
  module Supercharged
2
- VERSION = "2.0.4"
2
+ VERSION = "2.1.0"
3
3
  end
data/test/fake_app.rb CHANGED
@@ -10,6 +10,7 @@ app = Class.new(Rails::Application)
10
10
  app.config.secret_token = "3b7cd727ee24e8444053437c36cc66c4"
11
11
  app.config.session_store :cookie_store, :key => "_fakeapp_session"
12
12
  app.config.active_support.deprecation = :log
13
+ app.config.eager_load = false
13
14
  app.initialize!
14
15
 
15
16
  Rails.application.routes.draw do
@@ -2,14 +2,14 @@ require 'test_helper'
2
2
 
3
3
  describe Supercharged::ChargesController do
4
4
  describe "create action" do
5
- context "authorized" do
5
+ describe "authorized" do
6
6
  let(:fake_user) { User.create! }
7
7
 
8
8
  before do
9
9
  Supercharged::ChargesController.any_instance.stubs(:current_user).returns(fake_user)
10
10
  end
11
11
 
12
- context "correct conditions" do
12
+ describe "correct conditions" do
13
13
  it "response contains id in json" do
14
14
  post :create, charge: { amount: 100 }
15
15
 
@@ -20,7 +20,7 @@ describe Supercharged::ChargesController do
20
20
  end
21
21
  end
22
22
 
23
- context "bad conditions" do
23
+ describe "bad conditions" do
24
24
  it "response contains errors in json" do
25
25
  post :create, charge: { amount: 0 }
26
26
 
@@ -2,18 +2,18 @@ require 'test_helper'
2
2
 
3
3
  describe Supercharged::GatewayNotificationsController do
4
4
  describe "create" do
5
- let(:charge) { Charge.create!({user_id: 1, amount: 10}, without_protection: true) }
5
+ let(:charge) { Charge.create!(user_id: 1, amount: 10) }
6
6
 
7
- context "authorized" do
7
+ describe "authorized" do
8
8
  let(:fake_user) { stub(id: 1) }
9
9
 
10
10
  before do
11
11
  GatewayNotification.any_instance.stubs(:current_user).returns(fake_user)
12
12
  end
13
13
 
14
- context "correct conditions" do
14
+ describe "correct conditions" do
15
15
  it "works with good notification" do
16
- adapter = stub(item_id: 1, "complete?" => true, acknowledge: true, charge: charge)
16
+ adapter = stub(item_id: 1, "complete?" => true, acknowledge: true, charge: charge, gross: 100)
17
17
 
18
18
  GatewayNotification.any_instance.stubs(:adapter).returns(adapter)
19
19
 
@@ -26,7 +26,7 @@ describe Supercharged::GatewayNotificationsController do
26
26
  end
27
27
  end
28
28
 
29
- context "bad conditions" do
29
+ describe "bad conditions" do
30
30
  it "completed = false" do
31
31
  adapter = stub(item_id: 1, "complete?" => false, acknowledge: true, charge: charge)
32
32
 
@@ -38,7 +38,7 @@ describe Supercharged::GatewayNotificationsController do
38
38
  charge.state_name.must_equal :error
39
39
  charge.error.must_equal "not_completed"
40
40
 
41
- assert_response :bad_request
41
+ assert_response :found
42
42
  end
43
43
 
44
44
  it "acknowledge = false" do
@@ -52,12 +52,12 @@ describe Supercharged::GatewayNotificationsController do
52
52
  charge.state_name.must_equal :error
53
53
  charge.error.must_equal "acknowledge_failed"
54
54
 
55
- assert_response :bad_request
55
+ assert_response :found
56
56
  end
57
57
  end
58
58
  end
59
59
 
60
- context "without any payload params" do
60
+ describe "without any payload params" do
61
61
  it "returns bad_request" do
62
62
  post :create, gateway: "paypal"
63
63
 
@@ -2,7 +2,9 @@ require 'test_helper'
2
2
 
3
3
  class Supercharged::ChargesHelperTest < ActionView::TestCase
4
4
  def test_min_value
5
- field = charge_form_amount_field(sample_service, { min: 500 })
5
+ self.stubs(:current_user).returns(User.new)
6
+ Charge.any_instance.stubs(:min_amount).returns(500)
7
+ field = charge_form_amount_field(sample_service)
6
8
  field.must_include 'min="500"'
7
9
  end
8
10
 
@@ -21,7 +21,7 @@ describe Charge do
21
21
  end
22
22
 
23
23
  describe "states" do
24
- subject { Charge.create!({user_id: 1, amount: 10}, without_protection: true) }
24
+ subject { Charge.create!(user_id: 1, amount: 10) }
25
25
 
26
26
  describe "initial state" do
27
27
  it "initial state is new" do
@@ -4,18 +4,20 @@ describe GatewayNotification do
4
4
  describe "create" do
5
5
  it "raise EmptyChargeId if charge_id = nil" do
6
6
  ->{
7
- GatewayNotification.create!(gateway: "webmoney")
7
+ notification = GatewayNotification.create!(gateway: "webmoney")
8
+ notification.approve
8
9
  }.must_raise GatewayNotification::EmptyChargeIdError
9
10
  end
10
11
 
11
- it "charge id is inherited from adapter" do
12
+ it "populates params with result" do
12
13
  gateway_notification = GatewayNotification.new
13
14
 
14
15
  adapter = stub(item_id: 42)
15
16
  gateway_notification.stubs(:adapter).returns(adapter)
16
17
 
17
18
  gateway_notification.save!
19
+
18
20
  gateway_notification.charge_id.must_equal 42
19
21
  end
20
22
  end
21
- end
23
+ end
data/test/test_helper.rb CHANGED
@@ -3,7 +3,6 @@ ENV["RAILS_ENV"] = "test"
3
3
  require "minitest/autorun"
4
4
  require "minitest/spec"
5
5
  require "minitest/pride"
6
- require "minitest-spec-context"
7
6
  require "mocha/setup"
8
7
 
9
8
  require 'rails'
@@ -15,7 +14,6 @@ require "minitest/rails"
15
14
 
16
15
  require 'state_machine'
17
16
  require 'state_machine-audit_trail'
18
- require 'strong_parameters'
19
17
 
20
18
  require "supercharged"
21
19
  require "fake_app"
metadata CHANGED
@@ -1,174 +1,125 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: supercharged
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.4
5
- prerelease:
4
+ version: 2.1.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - divineforest
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-10-11 00:00:00.000000000 Z
11
+ date: 2014-02-10 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rails
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
- version: '3.1'
19
+ version: '4'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - "~>"
28
25
  - !ruby/object:Gem::Version
29
- version: '3.1'
26
+ version: '4'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: state_machine
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - ">="
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - ">="
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: state_machine-audit_trail
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - ">="
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - ">="
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: activemerchant
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - ">="
68
60
  - !ruby/object:Gem::Version
69
61
  version: '0'
70
62
  type: :runtime
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
76
- - !ruby/object:Gem::Version
77
- version: '0'
78
- - !ruby/object:Gem::Dependency
79
- name: strong_parameters
80
- requirement: !ruby/object:Gem::Requirement
81
- none: false
82
- requirements:
83
- - - ! '>='
84
- - !ruby/object:Gem::Version
85
- version: '0'
86
- type: :runtime
87
- prerelease: false
88
- version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
- requirements:
91
- - - ! '>='
66
+ - - ">="
92
67
  - !ruby/object:Gem::Version
93
68
  version: '0'
94
69
  - !ruby/object:Gem::Dependency
95
70
  name: sqlite3
96
71
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
72
  requirements:
99
- - - ! '>='
73
+ - - ">="
100
74
  - !ruby/object:Gem::Version
101
75
  version: '0'
102
76
  type: :development
103
77
  prerelease: false
104
78
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
79
  requirements:
107
- - - ! '>='
80
+ - - ">="
108
81
  - !ruby/object:Gem::Version
109
82
  version: '0'
110
83
  - !ruby/object:Gem::Dependency
111
84
  name: minitest
112
85
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
- requirements:
115
- - - ~>
116
- - !ruby/object:Gem::Version
117
- version: '3.0'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
- requirements:
123
- - - ~>
124
- - !ruby/object:Gem::Version
125
- version: '3.0'
126
- - !ruby/object:Gem::Dependency
127
- name: minitest-spec-context
128
- requirement: !ruby/object:Gem::Requirement
129
- none: false
130
86
  requirements:
131
- - - ! '>='
87
+ - - ">="
132
88
  - !ruby/object:Gem::Version
133
89
  version: '0'
134
90
  type: :development
135
91
  prerelease: false
136
92
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
93
  requirements:
139
- - - ! '>='
94
+ - - ">="
140
95
  - !ruby/object:Gem::Version
141
96
  version: '0'
142
97
  - !ruby/object:Gem::Dependency
143
98
  name: minitest-rails
144
99
  requirement: !ruby/object:Gem::Requirement
145
- none: false
146
100
  requirements:
147
- - - ! '>='
101
+ - - ">="
148
102
  - !ruby/object:Gem::Version
149
103
  version: '0'
150
104
  type: :development
151
105
  prerelease: false
152
106
  version_requirements: !ruby/object:Gem::Requirement
153
- none: false
154
107
  requirements:
155
- - - ! '>='
108
+ - - ">="
156
109
  - !ruby/object:Gem::Version
157
110
  version: '0'
158
111
  - !ruby/object:Gem::Dependency
159
112
  name: mocha
160
113
  requirement: !ruby/object:Gem::Requirement
161
- none: false
162
114
  requirements:
163
- - - ! '>='
115
+ - - ">="
164
116
  - !ruby/object:Gem::Version
165
117
  version: '0'
166
118
  type: :development
167
119
  prerelease: false
168
120
  version_requirements: !ruby/object:Gem::Requirement
169
- none: false
170
121
  requirements:
171
- - - ! '>='
122
+ - - ">="
172
123
  - !ruby/object:Gem::Version
173
124
  version: '0'
174
125
  description:
@@ -177,6 +128,9 @@ executables: []
177
128
  extensions: []
178
129
  extra_rdoc_files: []
179
130
  files:
131
+ - MIT-LICENSE
132
+ - README.md
133
+ - Rakefile
180
134
  - app/assets/javascripts/charge_form.js.coffee.erb
181
135
  - app/assets/javascripts/supercharged.js
182
136
  - app/controllers/supercharged/charges_controller.rb
@@ -192,13 +146,10 @@ files:
192
146
  - config/routes.rb
193
147
  - lib/generators/supercharged/migrations_generator.rb
194
148
  - lib/generators/supercharged/templates/install_migration.rb
149
+ - lib/supercharged.rb
195
150
  - lib/supercharged/activemerchant.rb
196
151
  - lib/supercharged/helpers.rb
197
152
  - lib/supercharged/version.rb
198
- - lib/supercharged.rb
199
- - MIT-LICENSE
200
- - Rakefile
201
- - README.md
202
153
  - test/fake_app.rb
203
154
  - test/supercharged/controllers/charges_controller_test.rb
204
155
  - test/supercharged/controllers/gateway_notifications_controller_test.rb
@@ -208,33 +159,26 @@ files:
208
159
  - test/test_helper.rb
209
160
  homepage:
210
161
  licenses: []
162
+ metadata: {}
211
163
  post_install_message:
212
164
  rdoc_options: []
213
165
  require_paths:
214
166
  - lib
215
167
  required_ruby_version: !ruby/object:Gem::Requirement
216
- none: false
217
168
  requirements:
218
- - - ! '>='
169
+ - - ">="
219
170
  - !ruby/object:Gem::Version
220
171
  version: '0'
221
- segments:
222
- - 0
223
- hash: -682491328917340782
224
172
  required_rubygems_version: !ruby/object:Gem::Requirement
225
- none: false
226
173
  requirements:
227
- - - ! '>='
174
+ - - ">="
228
175
  - !ruby/object:Gem::Version
229
176
  version: '0'
230
- segments:
231
- - 0
232
- hash: -682491328917340782
233
177
  requirements: []
234
178
  rubyforge_project:
235
- rubygems_version: 1.8.23
179
+ rubygems_version: 2.2.0
236
180
  signing_key:
237
- specification_version: 3
181
+ specification_version: 4
238
182
  summary: MVC solution for charges in rails
239
183
  test_files:
240
184
  - test/fake_app.rb