magnetik 0.0.1

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: 35a46c9a2d11334ebca571e3fe836d3d8bf656a8
4
+ data.tar.gz: 350300551b7c0ee49b9c408efaf1f14112cb401d
5
+ SHA512:
6
+ metadata.gz: 56d4e8c1739fe928d6db5f4b401665d484e132804b050a819cede53ed4ae09de8e473f82331c33a71fc58f000759f456b8cc04adfc583c013b142554d9946d77
7
+ data.tar.gz: 5f919801c65fedf55aee44084ae326859714656ff750adb51085e9f3ae353d3ec1cb06ff90138705734987639357f548104c6491a86347b8715319bc1398baae
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2015 Anton Ivanopoulos
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,21 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ require 'appraisal'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+
8
+ APP_RAKEFILE = File.expand_path('../spec/dummy/Rakefile', __FILE__)
9
+ load 'rails/tasks/engine.rake'
10
+
11
+ Bundler::GemHelper.install_tasks
12
+
13
+ Dir[File.join(File.dirname(__FILE__), 'tasks/**/*.rake')].each { |f| load f }
14
+
15
+ require 'rspec/core'
16
+ require 'rspec/core/rake_task'
17
+
18
+ desc 'Run all specs in spec directory (excluding plugin specs)'
19
+ RSpec::Core::RakeTask.new(spec: 'app:db:test:prepare')
20
+
21
+ task default: :spec
@@ -0,0 +1,13 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file.
9
+ //
10
+ // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require_tree .
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any styles
10
+ * defined in the other CSS/SCSS files in this directory. It is generally better to create a new
11
+ * file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,4 @@
1
+ module Magnetik
2
+ class ApplicationController < ActionController::Base
3
+ end
4
+ end
@@ -0,0 +1,74 @@
1
+ require_dependency "magnetik/application_controller"
2
+
3
+ module Magnetik
4
+ class CreditCardsController < ApplicationController
5
+ before_filter :authenticate!
6
+
7
+ respond_to :json
8
+
9
+ def index
10
+ render json: { credit_cards: collection }
11
+ end
12
+
13
+ def create
14
+ @token = create_params[:token]
15
+ @use_case = CreateCreditCard.perform(user, @token)
16
+
17
+ if @use_case.success?
18
+ render json: { credit_card: @use_case.local_card }, status: :ok
19
+ else
20
+ render json: { errors: @use_case.errors }, status: :unprocessable_entity
21
+ end
22
+ end
23
+
24
+ def update
25
+ @credit_card = CreditCard.find(params[:id])
26
+ @use_case = UpdateCreditCard.perform(@credit_card, update_params)
27
+
28
+ if @use_case.success?
29
+ render json: { credit_card: @credit_card }, status: :ok
30
+ else
31
+ render json: { errors: @use_case.errors }, status: :unprocessable_entity
32
+ end
33
+ end
34
+
35
+ def destroy
36
+ @credit_card = CreditCard.find(params[:id])
37
+ @use_case = DestroyCreditCard.perform(@credit_card)
38
+
39
+ if @use_case.success?
40
+ render nothing: true, status: :no_content
41
+ else
42
+ render json: { errors: @use_case.errors }, status: :unprocessable_entity
43
+ end
44
+ end
45
+
46
+ private
47
+
48
+ def authenticate!
49
+ method(Magnetik.authentication_method).call
50
+ end
51
+
52
+ def user
53
+ @user ||= method(Magnetik.current_user_method).call
54
+ end
55
+
56
+ def collection
57
+ @credit_cards ||= user.credit_cards.limit(30)
58
+ end
59
+
60
+ def create_params
61
+ params.require(:credit_card).permit(
62
+ :token
63
+ )
64
+ end
65
+
66
+ def update_params
67
+ params.require(:credit_card).permit(
68
+ :exp_month,
69
+ :exp_year,
70
+ :is_default
71
+ )
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,4 @@
1
+ module Magnetik
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,15 @@
1
+ module Magnetik
2
+ class CreditCard < ActiveRecord::Base
3
+ # Associations:
4
+ belongs_to :customer, polymorphic: true
5
+
6
+ # Validations:
7
+ validates :customer_id, presence: true
8
+ validates :customer_type, presence: true
9
+ validates :stripe_card_id, presence: true
10
+ validates :last_4_digits, presence: true
11
+ validates :exp_month, presence: true
12
+ validates :exp_year, presence: true
13
+ validates :brand, presence: true
14
+ end
15
+ end
@@ -0,0 +1,69 @@
1
+ module Magnetik
2
+ class CreateCreditCard
3
+ include UseCase
4
+
5
+ attr_reader :local_card
6
+
7
+ def initialize(user, token)
8
+ @token = token
9
+ @user = user
10
+ @remote_customer = nil
11
+ end
12
+
13
+ def perform
14
+ if @user.has_customer?
15
+ fetch_customer
16
+ else
17
+ create_remote_customer
18
+ create_local_customer
19
+ end
20
+
21
+ if @remote_customer && create_remote_card
22
+ create_local_card
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ attr_reader :remote_customer, :remote_card
29
+
30
+ def fetch_customer
31
+ @remote_customer = Stripe::Customer.retrieve(@user.stripe_customer_id)
32
+ end
33
+
34
+ def create_remote_customer
35
+ @remote_customer = Stripe::Customer.create({
36
+ description: "Stuff"
37
+ })
38
+ end
39
+
40
+ def create_local_customer
41
+ @user.update_attributes(stripe_customer_id: remote_customer.id).tap do |success|
42
+ errors.add(:base, "User failed to save") unless success
43
+ end
44
+ end
45
+
46
+ def create_remote_card
47
+ @remote_card = remote_customer.sources.create(source: @token)
48
+ rescue Stripe::CardError => e
49
+ errors.add(:base, "Credit card failed to save")
50
+ return false
51
+ end
52
+
53
+ def create_local_card
54
+ @local_card = CreditCard.new({
55
+ customer: @user,
56
+ stripe_card_id: remote_card[:id],
57
+ last_4_digits: remote_card[:last4],
58
+ exp_month: remote_card[:exp_month],
59
+ exp_year: remote_card[:exp_year],
60
+ brand: remote_card[:brand]
61
+ })
62
+
63
+ @local_card.save.tap do |success|
64
+ errors.add(:base, "Credit card failed to save") unless success
65
+ end
66
+ end
67
+
68
+ end
69
+ end
@@ -0,0 +1,41 @@
1
+ module Magnetik
2
+ class DestroyCreditCard
3
+ include UseCase
4
+
5
+ def initialize(card)
6
+ @card = card
7
+ end
8
+
9
+ def perform
10
+ if fetch_customer && fetch_card
11
+ if destroy_local_card
12
+ destroy_remote_card
13
+ end
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ attr_reader :remote_customer, :remote_card
20
+
21
+ def fetch_customer
22
+ @remote_customer = Stripe::Customer.retrieve(@card.customer.stripe_customer_id)
23
+ end
24
+
25
+ def fetch_card
26
+ @remote_card = remote_customer.sources.retrieve(@card.stripe_card_id)
27
+ end
28
+
29
+ def destroy_local_card
30
+ @card.destroy.tap do |success|
31
+ errors.add(:base, "Credit card failed to delete") unless success
32
+ end
33
+ end
34
+
35
+ def destroy_remote_card
36
+ remote_card.delete.tap do |success|
37
+ errors.add(:base, "Credit card failed to delete") unless success
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,48 @@
1
+ module Magnetik
2
+ class UpdateCreditCard
3
+ include UseCase
4
+
5
+ attr_reader :local_card
6
+
7
+ def initialize(card, params)
8
+ @card = card
9
+ @params = params
10
+ end
11
+
12
+ def perform
13
+ if fetch_customer && fetch_card
14
+ if update_remote_card
15
+ update_local_card
16
+ end
17
+ end
18
+ end
19
+
20
+ private
21
+
22
+ attr_reader :remote_customer, :remote_card
23
+
24
+ def fetch_customer
25
+ @remote_customer = Stripe::Customer.retrieve(@card.customer.stripe_customer_id)
26
+ end
27
+
28
+ def fetch_card
29
+ @remote_card = @remote_customer.sources.retrieve(@card.stripe_card_id)
30
+ end
31
+
32
+ def update_remote_card
33
+ remote_card.exp_month = @params[:exp_month]
34
+ remote_card.exp_year = @params[:exp_year]
35
+ remote_card.save.tap do |success|
36
+ errors.add(:base, "Credit card failed to save") unless success
37
+ end
38
+ rescue Stripe::CardError => e
39
+ errors.add(:base, "Credit card failed to save")
40
+ end
41
+
42
+ def update_local_card
43
+ @card.update_attributes(@params).tap do |success|
44
+ errors.add(:base, "Credit card failed to save") unless success
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,21 @@
1
+ module UseCase
2
+ extend ActiveSupport::Concern
3
+ include ActiveModel::Validations
4
+
5
+ module ClassMethods
6
+ # The perform method of a UseCase should always return itself
7
+ def perform(*args)
8
+ new(*args).tap { |use_case| use_case.perform }
9
+ end
10
+ end
11
+
12
+ # implement all the steps required to complete this use case
13
+ def perform
14
+ raise NotImplementedError
15
+ end
16
+
17
+ # inside of perform, add errors if the use case did not succeed
18
+ def success?
19
+ errors.none?
20
+ end
21
+ end
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Magnetik</title>
5
+ <%= stylesheet_link_tag "magnetik/application", media: "all" %>
6
+ <%= javascript_include_tag "magnetik/application" %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+
11
+ <%= yield %>
12
+
13
+ </body>
14
+ </html>
data/config/routes.rb ADDED
@@ -0,0 +1,3 @@
1
+ Magnetik::Engine.routes.draw do
2
+ resources :credit_cards
3
+ end
@@ -0,0 +1,36 @@
1
+ require 'rails/generators/active_record'
2
+
3
+ module ActiveRecord
4
+ module Generators
5
+ class MagnetikGenerator < ActiveRecord::Generators::Base
6
+ include Rails::Generators::Migration
7
+
8
+ source_root File.expand_path('../templates', __FILE__)
9
+
10
+ def copy_migrations
11
+ if (behavior == :invoke && model_exists?)
12
+ migration_template 'migration_customers.rb', "db/migrate/make_#{table_name}_magnetik_customers.rb"
13
+ migration_template 'migration_credit_cards.rb', 'db/migrate/magnetik_create_credit_cards.rb'
14
+ end
15
+ end
16
+
17
+ # Implement the required interface for Rails::Generators::Migration.
18
+ def self.next_migration_number(dirname)
19
+ next_migration_number = current_migration_number(dirname) + 1
20
+ if ActiveRecord::Base.timestamped_migrations
21
+ [Time.now.utc.strftime('%Y%m%d%H%M%S'), '%.14d' % next_migration_number].max
22
+ else
23
+ '%.3d' % next_migration_number
24
+ end
25
+ end
26
+
27
+ def model_exists?
28
+ File.exists?(File.join(destination_root, model_path))
29
+ end
30
+
31
+ def model_path
32
+ @model_path ||= File.join("app", "models", "#{file_path}.rb")
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,17 @@
1
+ class MagnetikCreateCreditCards < ActiveRecord::Migration
2
+ def change
3
+ create_table :magnetik_credit_cards do |t|
4
+ t.string :stripe_card_id
5
+ t.string :last_4_digits
6
+ t.string :exp_month
7
+ t.string :exp_year
8
+ t.string :brand
9
+ t.boolean :is_default
10
+ t.integer :customer_id
11
+ t.string :customer_type
12
+ t.index [:customer_id, :customer_id]
13
+
14
+ t.timestamps null: false
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,7 @@
1
+ class Make<%= table_name.camelize %>MagnetikCustomers < ActiveRecord::Migration
2
+ def change
3
+ change_table :<%= table_name %> do |t|
4
+ t.string :stripe_customer_id
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,15 @@
1
+ require 'rails/generators/active_record'
2
+
3
+ module Magnetik
4
+ module Generators
5
+ class InstallGenerator < Rails::Generators::Base
6
+ include Rails::Generators::Migration
7
+
8
+ source_root File.expand_path('../templates', __FILE__)
9
+
10
+ def copy_initializer
11
+ template 'initializer.rb', 'config/initializers/magnetik.rb'
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,7 @@
1
+ Magnetik.setup do |config|
2
+ # Magnetik will call this within CreditCardsController to ensure the user is authenticated.
3
+ config.authentication_method = :authenticate_user!
4
+
5
+ # Magnetik will call this within CreditCardsController to return the current logged in user.
6
+ config.current_user_method = :current_user
7
+ end
@@ -0,0 +1,18 @@
1
+ require 'rails/generators/named_base'
2
+
3
+ module Magnetik
4
+ module Generators
5
+ class MagnetikGenerator < Rails::Generators::NamedBase
6
+ include Rails::Generators::ResourceHelpers
7
+
8
+ namespace "magnetik"
9
+ source_root File.expand_path('../templates', __FILE__)
10
+
11
+ desc "Generates a credit card model (if it doesn't already exist) plus " <<
12
+ "a migration convert the model with the given NAME to a magnetik " <<
13
+ "customer by adding in the stripe_customer_id field."
14
+
15
+ hook_for :orm
16
+ end
17
+ end
18
+ end
data/lib/magnetik.rb ADDED
@@ -0,0 +1,29 @@
1
+ require 'magnetik/engine'
2
+ require 'responders'
3
+
4
+ module Magnetik
5
+ extend ActiveSupport::Autoload
6
+
7
+ autoload :ActsAsMagnetikCustomer, 'magnetik/acts_as_magnetik_customer'
8
+
9
+ # Method to authenticate a user:
10
+ mattr_accessor :authentication_method
11
+ @@authentication_method = nil
12
+
13
+ # Method to retrieve the current authenticated user:
14
+ mattr_accessor :current_user_method
15
+ @@current_user_method = nil
16
+
17
+ private
18
+
19
+ # Default way to setup Magnetik:
20
+ def self.setup
21
+ yield self
22
+ end
23
+ end
24
+
25
+ module ActiveRecord
26
+ class Base
27
+ include Magnetik::ActsAsMagnetikCustomer
28
+ end
29
+ end
@@ -0,0 +1,22 @@
1
+ module Magnetik
2
+ module ActsAsMagnetikCustomer
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ end
7
+
8
+ module ClassMethods
9
+ def acts_as_magnetik_customer(_options = {})
10
+ include Magnetik::ActsAsMagnetikCustomer::LocalInstanceMethods
11
+
12
+ has_many :credit_cards, as: :customer, class_name: 'Magnetik::CreditCard'
13
+ end
14
+ end
15
+
16
+ module LocalInstanceMethods
17
+ def has_customer?
18
+ stripe_customer_id.present?
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,12 @@
1
+ module Magnetik
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace Magnetik
4
+
5
+ config.generators do |g|
6
+ g.test_framework :rspec
7
+ g.fixture_replacement :factory_girl, dir: 'spec/factories'
8
+ g.assets false
9
+ g.helper false
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,3 @@
1
+ module Magnetik
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :magnetik do
3
+ # # Task goes here
4
+ # end
metadata ADDED
@@ -0,0 +1,197 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: magnetik
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Anton Ivanopoulos
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-05-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 4.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 4.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: responders
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: stripe
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: sqlite3
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec-rails
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: factory_girl_rails
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: appraisal
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: stripe-ruby-mock
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: 2.1.1
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: 2.1.1
139
+ description: Magnetik is a mountable rails engine that allows a model to be turned
140
+ into a vessel for a Stripe customer, as well as providing routes for credit card
141
+ management via Stripe, including creating, updating and deleting credit cards.
142
+ email:
143
+ - ai@papercloud.com
144
+ executables: []
145
+ extensions: []
146
+ extra_rdoc_files: []
147
+ files:
148
+ - MIT-LICENSE
149
+ - Rakefile
150
+ - app/assets/javascripts/magnetik/application.js
151
+ - app/assets/stylesheets/magnetik/application.css
152
+ - app/controllers/magnetik/application_controller.rb
153
+ - app/controllers/magnetik/credit_cards_controller.rb
154
+ - app/helpers/magnetik/application_helper.rb
155
+ - app/models/magnetik/credit_card.rb
156
+ - app/use_cases/magnetik/create_credit_card.rb
157
+ - app/use_cases/magnetik/destroy_credit_card.rb
158
+ - app/use_cases/magnetik/update_credit_card.rb
159
+ - app/use_cases/use_case.rb
160
+ - app/views/layouts/magnetik/application.html.erb
161
+ - config/routes.rb
162
+ - lib/generators/active_record/magnetik_generator.rb
163
+ - lib/generators/active_record/templates/migration_credit_cards.rb
164
+ - lib/generators/active_record/templates/migration_customers.rb
165
+ - lib/generators/magnetik/install/install_generator.rb
166
+ - lib/generators/magnetik/install/templates/initializer.rb
167
+ - lib/generators/magnetik/magnetik_generator.rb
168
+ - lib/magnetik.rb
169
+ - lib/magnetik/acts_as_magnetik_customer.rb
170
+ - lib/magnetik/engine.rb
171
+ - lib/magnetik/version.rb
172
+ - lib/tasks/magnetik_tasks.rake
173
+ homepage: http://www.papercloud.com.au
174
+ licenses:
175
+ - MIT
176
+ metadata: {}
177
+ post_install_message:
178
+ rdoc_options: []
179
+ require_paths:
180
+ - lib
181
+ required_ruby_version: !ruby/object:Gem::Requirement
182
+ requirements:
183
+ - - ">="
184
+ - !ruby/object:Gem::Version
185
+ version: '0'
186
+ required_rubygems_version: !ruby/object:Gem::Requirement
187
+ requirements:
188
+ - - ">="
189
+ - !ruby/object:Gem::Version
190
+ version: '0'
191
+ requirements: []
192
+ rubyforge_project:
193
+ rubygems_version: 2.4.5
194
+ signing_key:
195
+ specification_version: 4
196
+ summary: Rails engine for credit card management via Stripe.
197
+ test_files: []