solidus_stripe 4.4.1 → 5.0.0.alpha.1
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 +4 -4
- data/.circleci/config.yml +92 -52
- data/.gitignore +3 -0
- data/.rubocop.yml +94 -4
- data/.yardopts +1 -0
- data/Gemfile +10 -30
- data/LICENSE +2 -2
- data/Procfile.dev +3 -0
- data/README.md +145 -215
- data/Rakefile +5 -44
- data/app/assets/javascripts/spree/backend/solidus_stripe.js +2 -0
- data/app/assets/stylesheets/spree/backend/solidus_stripe.css +4 -0
- data/app/controllers/solidus_stripe/intents_controller.rb +36 -52
- data/app/controllers/solidus_stripe/webhooks_controller.rb +28 -0
- data/app/models/concerns/solidus_stripe/log_entries.rb +31 -0
- data/app/models/solidus_stripe/customer.rb +21 -0
- data/app/models/solidus_stripe/gateway.rb +231 -0
- data/app/models/solidus_stripe/payment_intent.rb +111 -0
- data/app/models/solidus_stripe/payment_method.rb +106 -0
- data/app/models/solidus_stripe/payment_source.rb +31 -0
- data/app/models/solidus_stripe/slug_entry.rb +20 -0
- data/app/models/solidus_stripe.rb +7 -0
- data/app/subscribers/solidus_stripe/webhook/charge_subscriber.rb +28 -0
- data/app/subscribers/solidus_stripe/webhook/payment_intent_subscriber.rb +112 -0
- data/app/views/spree/admin/payments/source_forms/_stripe.html.erb +29 -0
- data/app/views/spree/admin/payments/source_forms/existing_payment/_stripe.html.erb +14 -0
- data/app/views/spree/admin/payments/source_forms/existing_payment/stripe/_card.html.erb +8 -0
- data/app/views/spree/admin/payments/source_forms/existing_payment/stripe/_default.html.erb +7 -0
- data/app/views/spree/admin/payments/source_views/_stripe.html.erb +15 -0
- data/app/views/spree/api/payments/source_views/_stripe.json.jbuilder +8 -0
- data/bin/dev +13 -0
- data/bin/dummy-app +29 -0
- data/bin/rails +38 -3
- data/bin/rails-dummy-app +3 -0
- data/bin/rails-engine +1 -11
- data/bin/rails-new +55 -0
- data/bin/rails-sandbox +1 -14
- data/bin/rspec +10 -0
- data/bin/sandbox +12 -74
- data/bin/setup +1 -0
- data/bin/update-migrations +56 -0
- data/codecov.yml +12 -0
- data/config/locales/en.yml +16 -1
- data/config/routes.rb +5 -11
- data/coverage.rb +42 -0
- data/db/migrate/20230109183332_create_solidus_stripe_payment_sources.rb +10 -0
- data/db/migrate/20230303154931_create_solidus_stripe_setup_intent.rb +10 -0
- data/db/migrate/20230306105520_create_solidus_stripe_payment_intents.rb +10 -0
- data/db/migrate/20230308122414_create_solidus_stripe_webhook_endpoints.rb +10 -0
- data/db/migrate/20230310152615_add_payment_method_reference_to_stripe_intents.rb +6 -0
- data/db/migrate/20230310171444_normalize_stripe_intent_id_attributes.rb +6 -0
- data/db/migrate/20230313150008_create_solidus_stripe_customers.rb +16 -0
- data/db/migrate/20230323154931_drop_solidus_stripe_setup_intent.rb +13 -0
- data/db/migrate/20230403094916_rename_webhook_endpoint_to_payment_method_slug_entries.rb +5 -0
- data/db/seeds.rb +6 -24
- data/lib/generators/solidus_stripe/install/install_generator.rb +121 -14
- data/lib/generators/solidus_stripe/install/templates/app/assets/stylesheets/spree/frontend/solidus_stripe.css +13 -0
- data/lib/generators/solidus_stripe/install/templates/app/javascript/controllers/solidus_stripe_confirm_controller.js +39 -0
- data/lib/generators/solidus_stripe/install/templates/app/javascript/controllers/solidus_stripe_payment_controller.js +89 -0
- data/lib/generators/solidus_stripe/install/templates/app/views/checkouts/existing_payment/_stripe.html.erb +16 -0
- data/lib/generators/solidus_stripe/install/templates/app/views/checkouts/existing_payment/stripe/_card.html.erb +8 -0
- data/lib/generators/solidus_stripe/install/templates/app/views/checkouts/existing_payment/stripe/_default.html.erb +7 -0
- data/lib/generators/solidus_stripe/install/templates/app/views/checkouts/payment/_stripe.html.erb +39 -0
- data/lib/generators/solidus_stripe/install/templates/app/views/orders/payment_info/_stripe.html.erb +20 -0
- data/lib/generators/solidus_stripe/install/templates/config/initializers/solidus_stripe.rb +31 -0
- data/lib/solidus_stripe/configuration.rb +24 -3
- data/lib/solidus_stripe/engine.rb +19 -6
- data/lib/solidus_stripe/money_to_stripe_amount_converter.rb +109 -0
- data/lib/solidus_stripe/refunds_synchronizer.rb +96 -0
- data/lib/solidus_stripe/seeds.rb +19 -0
- data/lib/solidus_stripe/testing_support/factories.rb +153 -0
- data/lib/solidus_stripe/version.rb +1 -1
- data/lib/solidus_stripe/webhook/event.rb +90 -0
- data/lib/solidus_stripe.rb +0 -2
- data/solidus_stripe.gemspec +29 -6
- data/spec/lib/solidus_stripe/configuration_spec.rb +21 -0
- data/spec/lib/solidus_stripe/money_to_stripe_amount_converter_spec.rb +133 -0
- data/spec/lib/solidus_stripe/refunds_synchronizer_spec.rb +238 -0
- data/spec/lib/solidus_stripe/seeds_spec.rb +43 -0
- data/spec/lib/solidus_stripe/webhook/event_spec.rb +134 -0
- data/spec/models/concerns/solidus_stripe/log_entries_spec.rb +54 -0
- data/spec/models/solidus_stripe/customer_spec.rb +47 -0
- data/spec/models/solidus_stripe/gateway_spec.rb +283 -0
- data/spec/models/solidus_stripe/payment_intent_spec.rb +17 -0
- data/spec/models/solidus_stripe/payment_method_spec.rb +137 -0
- data/spec/models/solidus_stripe/payment_source_spec.rb +25 -0
- data/spec/requests/solidus_stripe/intents_controller_spec.rb +29 -0
- data/spec/requests/solidus_stripe/webhooks_controller/charge/refunded_spec.rb +31 -0
- data/spec/requests/solidus_stripe/webhooks_controller/payment_intent/canceled_spec.rb +23 -0
- data/spec/requests/solidus_stripe/webhooks_controller/payment_intent/payment_failed_spec.rb +23 -0
- data/spec/requests/solidus_stripe/webhooks_controller/payment_intent/succeeded_spec.rb +29 -0
- data/spec/requests/solidus_stripe/webhooks_controller_spec.rb +52 -0
- data/spec/solidus_stripe_spec_helper.rb +10 -0
- data/spec/subscribers/solidus_stripe/webhook/charge_subscriber_spec.rb +33 -0
- data/spec/subscribers/solidus_stripe/webhook/payment_intent_subscriber_spec.rb +297 -0
- data/spec/support/solidus_stripe/backend_test_helper.rb +210 -0
- data/spec/support/solidus_stripe/checkout_test_helper.rb +339 -0
- data/spec/support/solidus_stripe/factories.rb +5 -0
- data/spec/support/solidus_stripe/webhook/data_fixtures.rb +106 -0
- data/spec/support/solidus_stripe/webhook/event_with_context_factory.rb +82 -0
- data/spec/support/solidus_stripe/webhook/request_helper.rb +32 -0
- data/spec/system/backend/solidus_stripe/orders/payments_spec.rb +119 -0
- data/spec/system/frontend/.keep +0 -0
- data/spec/system/frontend/solidus_stripe/checkout_spec.rb +187 -0
- data/tmp/.keep +0 -0
- metadata +202 -78
- data/.rubocop_todo.yml +0 -298
- data/.travis.yml +0 -28
- data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-cart-page-checkout.js +0 -122
- data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-elements.js +0 -148
- data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-init.js +0 -20
- data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-payment-intents.js +0 -84
- data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-payment-request-button-shared.js +0 -160
- data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-payment.js +0 -16
- data/app/assets/javascripts/spree/frontend/solidus_stripe.js +0 -6
- data/app/controllers/solidus_stripe/payment_request_controller.rb +0 -52
- data/app/controllers/spree/stripe_controller.rb +0 -13
- data/app/decorators/models/spree/order_update_attributes_decorator.rb +0 -39
- data/app/decorators/models/spree/payment_decorator.rb +0 -11
- data/app/decorators/models/spree/refund_decorator.rb +0 -9
- data/app/models/solidus_stripe/address_from_params_service.rb +0 -72
- data/app/models/solidus_stripe/create_intents_payment_service.rb +0 -114
- data/app/models/solidus_stripe/prepare_order_for_payment_service.rb +0 -46
- data/app/models/solidus_stripe/shipping_rates_service.rb +0 -46
- data/app/models/spree/payment_method/stripe_credit_card.rb +0 -230
- data/bin/r +0 -13
- data/bin/sandbox_rails +0 -18
- data/db/migrate/20181010123508_update_stripe_payment_method_type_to_credit_card.rb +0 -21
- data/lib/assets/stylesheets/spree/frontend/solidus_stripe.scss +0 -11
- data/lib/solidus_stripe/testing_support/card_input_helper.rb +0 -34
- data/lib/tasks/solidus_stripe/db/seed.rake +0 -14
- data/lib/views/api/spree/api/payments/source_views/_stripe.json.jbuilder +0 -3
- data/lib/views/backend/spree/admin/log_entries/_stripe.html.erb +0 -28
- data/lib/views/backend/spree/admin/payments/source_forms/_stripe.html.erb +0 -1
- data/lib/views/backend/spree/admin/payments/source_views/_stripe.html.erb +0 -1
- data/lib/views/frontend/spree/checkout/existing_payment/_stripe.html.erb +0 -1
- data/lib/views/frontend/spree/checkout/payment/_stripe.html.erb +0 -8
- data/lib/views/frontend/spree/checkout/payment/v2/_javascript.html.erb +0 -78
- data/lib/views/frontend/spree/checkout/payment/v3/_elements.html.erb +0 -1
- data/lib/views/frontend/spree/checkout/payment/v3/_form_elements.html.erb +0 -40
- data/lib/views/frontend/spree/checkout/payment/v3/_intents.html.erb +0 -1
- data/lib/views/frontend/spree/checkout/payment/v3/_stripe.html.erb +0 -2
- data/lib/views/frontend/spree/orders/_stripe_payment_request_button.html.erb +0 -14
- data/spec/features/stripe_checkout_spec.rb +0 -486
- data/spec/models/solidus_stripe/address_from_params_service_spec.rb +0 -87
- data/spec/models/solidus_stripe/create_intents_payment_service_spec.rb +0 -127
- data/spec/models/solidus_stripe/prepare_order_for_payment_service_spec.rb +0 -65
- data/spec/models/solidus_stripe/shipping_rates_service_spec.rb +0 -54
- data/spec/models/spree/payment_method/stripe_credit_card_spec.rb +0 -354
- data/spec/requests/payment_requests_spec.rb +0 -152
- data/spec/solidus_frontend_app_template.rb +0 -17
- data/spec/spec_helper.rb +0 -37
- data/spec/support/solidus_address_helper.rb +0 -15
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<%
|
|
2
|
+
# https://stripe.com/docs/api/payment_methods/object#payment_method_object-type
|
|
3
|
+
partial_base = "spree/admin/payments/source_forms/existing_payment/stripe"
|
|
4
|
+
payment_type = stripe_payment_method.type
|
|
5
|
+
|
|
6
|
+
# Fallback on the default partial if a specialized partial is not available.
|
|
7
|
+
payment_type = 'default' if lookup_context.find_all("#{partial_base}/_#{payment_type}").none?
|
|
8
|
+
%>
|
|
9
|
+
|
|
10
|
+
<div>
|
|
11
|
+
<label>
|
|
12
|
+
<%= render "#{partial_base}/#{payment_type}", stripe_payment_method: stripe_payment_method %>
|
|
13
|
+
</label>
|
|
14
|
+
</div>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
<% card = stripe_payment_method.card %>
|
|
2
|
+
<%#
|
|
3
|
+
Add credit card logos:
|
|
4
|
+
https://support.stripe.com/questions/where-to-find-logos-for-accepted-credit-card-types
|
|
5
|
+
%>
|
|
6
|
+
💳 <%= card.brand %>
|
|
7
|
+
<span>∗∗∗∗ ∗∗∗∗ ∗∗∗∗ <%= card.last4 %> </span>
|
|
8
|
+
(<%= t 'spree.expiration' %>: <%= card.exp_month %>/<%= card.exp_year %>)
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<% logger.error(
|
|
2
|
+
%{Can't find a partial for payments with type #{payment_type} } +
|
|
3
|
+
%{please add a partial named "#{partial_base}/_#{payment_type}.html.erb".}
|
|
4
|
+
) %>
|
|
5
|
+
|
|
6
|
+
<%= stripe_payment_method.type.humanize %>
|
|
7
|
+
(<%= time_ago_in_words Time.at(stripe_payment_method.created) %>)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<%= intent_id = SolidusStripe::PaymentMethod.intent_id_for_payment(payment) %>
|
|
2
|
+
|
|
3
|
+
<fieldset data-hook="credit_card">
|
|
4
|
+
<legend align="center"><%= SolidusStripe::PaymentSource.model_name.human %></legend>
|
|
5
|
+
|
|
6
|
+
<div class="row">
|
|
7
|
+
<div class="col-4">
|
|
8
|
+
<%= link_to(
|
|
9
|
+
"Open in the Stripe dashboard ↗",
|
|
10
|
+
payment.payment_method.stripe_dashboard_url(intent_id),
|
|
11
|
+
target: :_blank,
|
|
12
|
+
) %>
|
|
13
|
+
</div>
|
|
14
|
+
</div>
|
|
15
|
+
</fieldset>
|
data/bin/dev
ADDED
data/bin/dummy-app
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
set -e
|
|
4
|
+
|
|
5
|
+
extension_name="solidus_stripe"
|
|
6
|
+
app_name="dummy-app"
|
|
7
|
+
|
|
8
|
+
bin/rails-new "$app_name"
|
|
9
|
+
|
|
10
|
+
# Stay away from the bundler env of the containing extension.
|
|
11
|
+
function unbundled {
|
|
12
|
+
echo "~~> Running: $@"
|
|
13
|
+
ruby -rbundler -e'Bundler.with_unbundled_env {system *ARGV}' -- env BUNDLE_SUPPRESS_INSTALL_USING_MESSAGES=true "$@"
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
cd ./dummy-app
|
|
17
|
+
|
|
18
|
+
# Coverage
|
|
19
|
+
echo "require_relative '../../coverage.rb' if ENV['COVERAGE']" >> config/boot.rb
|
|
20
|
+
echo "gem 'rspec_junit_formatter', require: false" >> Gemfile
|
|
21
|
+
echo "gem 'simplecov', '~> 0.22', require: false" >> Gemfile
|
|
22
|
+
echo "gem 'simplecov-cobertura', require: false" >> Gemfile
|
|
23
|
+
unbundled bundle install
|
|
24
|
+
|
|
25
|
+
unbundled bundle add solidus --github solidusio/solidus --branch "${SOLIDUS_BRANCH:-master}" --version '> 0.a'
|
|
26
|
+
unbundled bundle exec rake db:drop db:create
|
|
27
|
+
unbundled bundle exec rails generate solidus:install --auto-accept --payment-method=none --no-seed --no-sample "$@"
|
|
28
|
+
unbundled bundle add $extension_name --path ..
|
|
29
|
+
unbundled bundle exec rails generate $extension_name:install --migrate --load-seeds=false --specs=all
|
data/bin/rails
CHANGED
|
@@ -1,7 +1,42 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
case ARGV.first
|
|
4
|
+
when "dummy-app", "sandbox"
|
|
5
|
+
app_name = ARGV.shift
|
|
6
|
+
root = "#{__dir__}/.."
|
|
7
|
+
app_root = "#{root}/#{app_name}"
|
|
8
|
+
|
|
9
|
+
unless File.exist? "#{app_root}/bin/rails"
|
|
10
|
+
warn "Creating the #{app_name} app..."
|
|
11
|
+
Dir.chdir root do
|
|
12
|
+
system "#{root}/bin/#{app_name}" or begin
|
|
13
|
+
warn "Automatic creation of the #{app_name} app failed"
|
|
14
|
+
exit 1
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
Dir.chdir app_root
|
|
20
|
+
exec "#{app_root}/bin/rails", *ARGV
|
|
21
|
+
when "engine"
|
|
22
|
+
ARGV.shift
|
|
23
|
+
|
|
24
|
+
# Rails will try to match the contents of bin/rails to /(APP|ENGINE)_PATH/
|
|
25
|
+
# and use that file instead of running, this disrupts the sandbox creation
|
|
26
|
+
# so we need to break the match in order for this to work.
|
|
27
|
+
# rubocop:disable Lint/LiteralInInterpolation
|
|
28
|
+
Object.const_set "ENGINE_#{:ROOT}", File.expand_path('..', __dir__)
|
|
29
|
+
Object.const_set "ENGINE_#{:PATH}", File.expand_path('../lib/solidus_stripe/engine', __dir__)
|
|
30
|
+
# rubocop:enable Lint/LiteralInInterpolation
|
|
31
|
+
|
|
32
|
+
# Set up gems listed in the Gemfile.
|
|
33
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)
|
|
34
|
+
require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
|
|
35
|
+
|
|
36
|
+
require 'rails/all'
|
|
37
|
+
require 'rails/engine/commands'
|
|
38
|
+
when "g", "generate"
|
|
39
|
+
exec RbConfig.ruby, "#{__dir__}/rails", "engine", *ARGV
|
|
5
40
|
else
|
|
6
|
-
exec "#{__dir__}/rails
|
|
41
|
+
exec RbConfig.ruby, "#{__dir__}/rails", "sandbox", *ARGV
|
|
7
42
|
end
|
data/bin/rails-dummy-app
ADDED
data/bin/rails-engine
CHANGED
|
@@ -1,13 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
|
-
# This command will automatically be run when you run "rails" with Rails gems
|
|
3
|
-
# installed from the root of your application.
|
|
4
2
|
|
|
5
|
-
|
|
6
|
-
ENGINE_PATH = File.expand_path('../lib/solidus_stripe/engine', __dir__)
|
|
7
|
-
|
|
8
|
-
# Set up gems listed in the Gemfile.
|
|
9
|
-
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)
|
|
10
|
-
require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
|
|
11
|
-
|
|
12
|
-
require 'rails/all'
|
|
13
|
-
require 'rails/engine/commands'
|
|
3
|
+
exec RbConfig.ruby, "#{__dir__}/rails", "engine", *ARGV
|
data/bin/rails-new
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
set -e
|
|
4
|
+
|
|
5
|
+
app_name="$1"
|
|
6
|
+
|
|
7
|
+
root_path="$PWD"
|
|
8
|
+
app_path="${root_path}/${app_name}"
|
|
9
|
+
ruby_version=`ruby -e'puts RUBY_VERSION'`
|
|
10
|
+
rails_version=`bundle exec ruby -rrails/version -e'puts Rails.version'`
|
|
11
|
+
solidus_version=`bundle exec ruby -rspree/core/version -e'puts Spree::VERSION'`
|
|
12
|
+
cache_path="tmp/cache/rails-new/${app_name}-${rails_version}-${solidus_version}-${ruby_version}.zip"
|
|
13
|
+
|
|
14
|
+
# Stay away from the bundler env of the containing extension.
|
|
15
|
+
function unbundled {
|
|
16
|
+
echo "~~> Running: $@"
|
|
17
|
+
ruby -rbundler -e'Bundler.with_unbundled_env {system *ARGV}' -- env BUNDLE_SUPPRESS_INSTALL_USING_MESSAGES=true "$@"
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
# "sqlite" is set by the ORB extension instead of "sqlite3",
|
|
21
|
+
# all other options are already in the format expected by `rails new`.
|
|
22
|
+
test "$DB" = "sqlite" && export DB="sqlite3"
|
|
23
|
+
|
|
24
|
+
rm -rf "$app_path"
|
|
25
|
+
mkdir -p tmp/cache/rails-new
|
|
26
|
+
|
|
27
|
+
if [ -f "${cache_path}" ]; then
|
|
28
|
+
echo "~~> Using cached rails ${app_name}"
|
|
29
|
+
unzip -q "${cache_path}" -d ./
|
|
30
|
+
cd "${app_path}"
|
|
31
|
+
unbundled bundle install
|
|
32
|
+
cd "${root_path}"
|
|
33
|
+
else
|
|
34
|
+
echo "~~> Creating rails ${app_name}"
|
|
35
|
+
rails _${rails_version}_ new ${app_name} \
|
|
36
|
+
--database=${DB:-sqlite3} \
|
|
37
|
+
--skip-git \
|
|
38
|
+
--skip-rc
|
|
39
|
+
|
|
40
|
+
cd "$app_path"
|
|
41
|
+
unbundled bundle add listen --group development
|
|
42
|
+
unbundled bundle add solidus --github solidusio/solidus --branch "${BRANCH:-master}" --version '> 0.a'
|
|
43
|
+
unbundled bundle exec rake db:drop db:create
|
|
44
|
+
unbundled bundle exec rails generate solidus:install --auto-accept --payment-method=none
|
|
45
|
+
cd "${root_path}"
|
|
46
|
+
|
|
47
|
+
echo "~~> Creating rails ${app_name} cache"
|
|
48
|
+
rm -rf ${app_name}/tmp/solidus_starter_frontend*
|
|
49
|
+
zip -q -r "${cache_path}" ${app_name}
|
|
50
|
+
fi
|
|
51
|
+
|
|
52
|
+
if [ ! -d "${app_name}" ]; then
|
|
53
|
+
echo '~~> Creation of the ${app_name} rails application failed'
|
|
54
|
+
exit 1
|
|
55
|
+
fi
|
data/bin/rails-sandbox
CHANGED
|
@@ -1,16 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
unless File.exist? "#{app_root}/bin/rails"
|
|
6
|
-
warn 'Creating the sandbox app...'
|
|
7
|
-
Dir.chdir "#{__dir__}/.." do
|
|
8
|
-
system "#{__dir__}/sandbox" or begin
|
|
9
|
-
warn 'Automatic creation of the sandbox app failed'
|
|
10
|
-
exit 1
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
Dir.chdir app_root
|
|
16
|
-
exec 'bin/rails', *ARGV
|
|
3
|
+
exec RbConfig.ruby, "#{__dir__}/rails", "sandbox", *ARGV
|
data/bin/rspec
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
system(
|
|
3
|
+
"bin/rails dummy-app generate solidus_stripe:install --force --migrate --specs=all --sync --no-load-seeds",
|
|
4
|
+
out: "tmp/rspec-sync.log",
|
|
5
|
+
err: :out,
|
|
6
|
+
) or abort(File.read("tmp/rspec-sync.log"))
|
|
7
|
+
|
|
8
|
+
system("bin/update-migrations", "dummy-app") unless ENV['CI']
|
|
9
|
+
Dir.chdir "dummy-app/"
|
|
10
|
+
exec "bundle", "exec", "rspec", *ARGV
|
data/bin/sandbox
CHANGED
|
@@ -2,85 +2,23 @@
|
|
|
2
2
|
|
|
3
3
|
set -e
|
|
4
4
|
|
|
5
|
-
case "$DB" in
|
|
6
|
-
postgres|postgresql)
|
|
7
|
-
RAILSDB="postgresql"
|
|
8
|
-
;;
|
|
9
|
-
mysql)
|
|
10
|
-
RAILSDB="mysql"
|
|
11
|
-
;;
|
|
12
|
-
sqlite|'')
|
|
13
|
-
RAILSDB="sqlite3"
|
|
14
|
-
;;
|
|
15
|
-
*)
|
|
16
|
-
echo "Invalid DB specified: $DB"
|
|
17
|
-
exit 1
|
|
18
|
-
;;
|
|
19
|
-
esac
|
|
20
|
-
|
|
21
|
-
if [ ! -z $SOLIDUS_BRANCH ]
|
|
22
|
-
then
|
|
23
|
-
BRANCH=$SOLIDUS_BRANCH
|
|
24
|
-
else
|
|
25
|
-
BRANCH="master"
|
|
26
|
-
fi
|
|
27
|
-
|
|
28
5
|
extension_name="solidus_stripe"
|
|
6
|
+
app_name="sandbox"
|
|
7
|
+
|
|
8
|
+
bin/rails-new "$app_name"
|
|
29
9
|
|
|
30
10
|
# Stay away from the bundler env of the containing extension.
|
|
31
11
|
function unbundled {
|
|
32
|
-
|
|
12
|
+
echo "~~> Running: $@"
|
|
13
|
+
ruby -rbundler -e'Bundler.with_unbundled_env {system *ARGV}' -- env BUNDLE_SUPPRESS_INSTALL_USING_MESSAGES=true "$@"
|
|
33
14
|
}
|
|
34
15
|
|
|
35
|
-
|
|
36
|
-
unbundled bundle
|
|
37
|
-
|
|
38
|
-
--skip-git \
|
|
39
|
-
--skip-keeps \
|
|
40
|
-
--skip-rc \
|
|
41
|
-
--skip-spring \
|
|
42
|
-
--skip-test \
|
|
43
|
-
--skip-javascript
|
|
16
|
+
cd "./$app_name"
|
|
17
|
+
unbundled bundle add $extension_name --path ..
|
|
18
|
+
unbundled bundle exec rails generate $extension_name:install --migrate --specs=all
|
|
44
19
|
|
|
45
|
-
if [
|
|
46
|
-
echo
|
|
47
|
-
|
|
20
|
+
if [[ -n "$SOLIDUS_STRIPE_API_KEY" ]]; then
|
|
21
|
+
echo "~~> Creating the stripe payment method using env credentials..."
|
|
22
|
+
unbundled bundle exec rails runner \
|
|
23
|
+
'p SolidusStripe::PaymentMethod.create!(name: "SolidusStripe", preference_source: "solidus_stripe_env_credentials", position: -1)'
|
|
48
24
|
fi
|
|
49
|
-
|
|
50
|
-
cd ./sandbox
|
|
51
|
-
cat <<RUBY >> Gemfile
|
|
52
|
-
gem 'solidus', github: 'solidusio/solidus', branch: '$BRANCH'
|
|
53
|
-
gem 'solidus_auth_devise', '>= 2.1.0'
|
|
54
|
-
gem 'rails-i18n'
|
|
55
|
-
gem 'solidus_i18n'
|
|
56
|
-
|
|
57
|
-
gem '$extension_name', path: '..'
|
|
58
|
-
|
|
59
|
-
group :test, :development do
|
|
60
|
-
platforms :mri do
|
|
61
|
-
gem 'pry-byebug'
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
RUBY
|
|
65
|
-
|
|
66
|
-
unbundled bundle install --gemfile Gemfile
|
|
67
|
-
|
|
68
|
-
unbundled bundle exec rake db:drop db:create
|
|
69
|
-
|
|
70
|
-
unbundled bundle exec rails generate solidus:install \
|
|
71
|
-
--auto-accept \
|
|
72
|
-
--user_class=Spree::User \
|
|
73
|
-
--enforce_available_locales=true \
|
|
74
|
-
--with-authentication=false \
|
|
75
|
-
--payment-method=none \
|
|
76
|
-
$@
|
|
77
|
-
|
|
78
|
-
unbundled bundle exec rails generate solidus:auth:install
|
|
79
|
-
unbundled bundle exec rails generate ${extension_name}:install
|
|
80
|
-
|
|
81
|
-
echo
|
|
82
|
-
echo "🚀 Sandbox app successfully created for $extension_name!"
|
|
83
|
-
echo "🚀 Using $RAILSDB and Solidus $BRANCH"
|
|
84
|
-
echo "🚀 Use 'export DB=[postgres|mysql|sqlite]' to control the DB adapter"
|
|
85
|
-
echo "🚀 Use 'export SOLIDUS_BRANCH=<BRANCH-NAME>' to control the Solidus version"
|
|
86
|
-
echo "🚀 This app is intended for test purposes."
|
data/bin/setup
CHANGED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
app = ARGV.shift || abort("Please provide the APP_NAME as the first argument")
|
|
4
|
+
extension_name = "solidus_stripe"
|
|
5
|
+
|
|
6
|
+
source_migrations = {}
|
|
7
|
+
Dir['db/migrate/*.rb'].sort.each do |path|
|
|
8
|
+
basename = File.basename(path, ".rb").sub(/^\d+_/, '')
|
|
9
|
+
source_migrations[basename] = path
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
app_migrations = {}
|
|
13
|
+
Dir["#{app}/db/migrate/*.#{extension_name}.rb"].sort.each do |path|
|
|
14
|
+
_timestamp, basename = File.basename(path, ".#{extension_name}.rb").split('_', 2)
|
|
15
|
+
app_migrations[basename] = path
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
migrate_app = -> do
|
|
19
|
+
puts "migrating #{app}..."
|
|
20
|
+
Dir.chdir(app) { system("bin/rails db:migrate RAILS_ENV=test") }
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
base_time = Time.now.utc.to_i
|
|
24
|
+
install_migration = ->(basename) do
|
|
25
|
+
path = source_migrations[basename]
|
|
26
|
+
base_time += 1
|
|
27
|
+
puts "installing #{basename}..."
|
|
28
|
+
timestamp = Time.at(base_time).strftime("%F%T").delete('-:') # rubocop:disable Rails/TimeZone
|
|
29
|
+
contents = File.read(path)
|
|
30
|
+
|
|
31
|
+
File.write("#{app}/db/migrate/#{timestamp}_#{basename}.#{extension_name}.rb", contents)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
reinstall_migrations = -> do
|
|
35
|
+
app_migrations.each_value { |path| File.delete(path) }
|
|
36
|
+
Dir["#{app}/db/*{.sqlite3,schema.rb}"].each { File.delete(_1) }
|
|
37
|
+
source_migrations.each_key(&install_migration)
|
|
38
|
+
migrate_app.call
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
exit reinstall_migrations.call if ARGV.shift == "--force"
|
|
42
|
+
|
|
43
|
+
app_migrations.each_key do |basename|
|
|
44
|
+
source_content = File.read(source_migrations[basename]) if source_migrations[basename]
|
|
45
|
+
app_content = File.read(app_migrations[basename])
|
|
46
|
+
|
|
47
|
+
next if source_content == app_content
|
|
48
|
+
|
|
49
|
+
reinstall_migrations.call
|
|
50
|
+
exit
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
if (missing_migrations = source_migrations.keys - app_migrations.keys).any?
|
|
54
|
+
missing_migrations.each(&install_migration)
|
|
55
|
+
migrate_app.call
|
|
56
|
+
end
|
data/codecov.yml
ADDED
data/config/locales/en.yml
CHANGED
|
@@ -2,4 +2,19 @@
|
|
|
2
2
|
# See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
|
|
3
3
|
|
|
4
4
|
en:
|
|
5
|
-
|
|
5
|
+
solidus_stripe:
|
|
6
|
+
loading: "Loading..."
|
|
7
|
+
|
|
8
|
+
intent_status: &intent_status
|
|
9
|
+
canceled: "Your payment has been canceled."
|
|
10
|
+
processing: "Your payment is processing."
|
|
11
|
+
requires_action: "Some action is needed on your payment before proceeding."
|
|
12
|
+
requires_capture: "Payment successfully authorized!"
|
|
13
|
+
requires_confirmation: "Please confirm the payment in order to proceed."
|
|
14
|
+
requires_payment_method: "Your payment was not successful, please try again."
|
|
15
|
+
succeeded: "Payment succeeded!"
|
|
16
|
+
|
|
17
|
+
activerecord:
|
|
18
|
+
models:
|
|
19
|
+
solidus_stripe/payment_source: Solidus Stripe Payment Source
|
|
20
|
+
solidus_stripe/payment_method: Solidus Stripe Payment Method
|
data/config/routes.rb
CHANGED
|
@@ -1,14 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
post '/stripe/create_intent', to: '/solidus_stripe/intents#create_intent'
|
|
9
|
-
post '/stripe/create_payment', to: '/solidus_stripe/intents#create_payment'
|
|
10
|
-
|
|
11
|
-
# payment request routes:
|
|
12
|
-
post '/stripe/shipping_rates', to: '/solidus_stripe/payment_request#shipping_rates'
|
|
13
|
-
post '/stripe/update_order', to: '/solidus_stripe/payment_request#update_order'
|
|
3
|
+
SolidusStripe::Engine.routes.draw do
|
|
4
|
+
scope ':slug' do
|
|
5
|
+
get :after_confirmation, to: 'intents#after_confirmation'
|
|
6
|
+
post :webhooks, to: 'webhooks#create', format: false
|
|
7
|
+
end
|
|
14
8
|
end
|
data/coverage.rb
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'coverage'
|
|
4
|
+
require 'simplecov'
|
|
5
|
+
|
|
6
|
+
SimpleCov.root File.expand_path(__dir__)
|
|
7
|
+
|
|
8
|
+
if ENV['CODECOV_TOKEN']
|
|
9
|
+
require 'simplecov-cobertura'
|
|
10
|
+
|
|
11
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
|
|
12
|
+
SimpleCov::Formatter::CoberturaFormatter,
|
|
13
|
+
SimpleCov.formatter,
|
|
14
|
+
])
|
|
15
|
+
else
|
|
16
|
+
warn "Provide a CODECOV_TOKEN environment variable to enable Codecov uploads"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def (SimpleCov::ResultAdapter).call(result)
|
|
20
|
+
result = result.transform_keys do |path|
|
|
21
|
+
template_path = path.sub(
|
|
22
|
+
"#{SimpleCov.root}/dummy-app/",
|
|
23
|
+
"#{SimpleCov.root}/lib/generators/solidus_stripe/install/templates/"
|
|
24
|
+
)
|
|
25
|
+
File.exist?(template_path) ? template_path : path
|
|
26
|
+
end
|
|
27
|
+
result.each do |path, coverage|
|
|
28
|
+
next unless path.end_with?('.erb')
|
|
29
|
+
|
|
30
|
+
# Remove the extra trailing lines added by ERB
|
|
31
|
+
coverage[:lines] = coverage[:lines][...File.read(path).lines.size]
|
|
32
|
+
end
|
|
33
|
+
result
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
warn "Tracking coverage on process #{$$}..."
|
|
37
|
+
SimpleCov.start do
|
|
38
|
+
root __dir__
|
|
39
|
+
enable_coverage_for_eval
|
|
40
|
+
add_filter %r{dummy-app/(db|config|spec|tmp)/}
|
|
41
|
+
track_files "#{SimpleCov.root}/{dummy-app,lib,app}/**/*.{rb,erb}}"
|
|
42
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
class CreateSolidusStripeSetupIntent < ActiveRecord::Migration[7.0]
|
|
2
|
+
def change
|
|
3
|
+
create_table :solidus_stripe_setup_intents do |t|
|
|
4
|
+
t.string :stripe_setup_intent_id
|
|
5
|
+
t.references :order, null: false, foreign_key: { to_table: :spree_orders }
|
|
6
|
+
|
|
7
|
+
t.timestamps
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
class CreateSolidusStripePaymentIntents < ActiveRecord::Migration[7.0]
|
|
2
|
+
def change
|
|
3
|
+
create_table :solidus_stripe_payment_intents do |t|
|
|
4
|
+
t.string :stripe_payment_intent_id
|
|
5
|
+
t.references :order, null: false, foreign_key: { to_table: :spree_orders }
|
|
6
|
+
|
|
7
|
+
t.timestamps
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
class CreateSolidusStripeWebhookEndpoints < ActiveRecord::Migration[5.2]
|
|
2
|
+
def change
|
|
3
|
+
create_table :solidus_stripe_webhook_endpoints do |t|
|
|
4
|
+
t.references :payment_method, null: false, foreign_key: { to_table: :spree_payment_methods }
|
|
5
|
+
t.string :slug, null: false, index: { unique: true }
|
|
6
|
+
|
|
7
|
+
t.timestamps
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
class AddPaymentMethodReferenceToStripeIntents < ActiveRecord::Migration[7.0]
|
|
2
|
+
def change
|
|
3
|
+
add_reference :solidus_stripe_setup_intents, :payment_method, null: false, foreign_key: { to_table: :spree_payment_methods }
|
|
4
|
+
add_reference :solidus_stripe_payment_intents, :payment_method, null: false, foreign_key: { to_table: :spree_payment_methods }
|
|
5
|
+
end
|
|
6
|
+
end
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
class NormalizeStripeIntentIdAttributes < ActiveRecord::Migration[7.0]
|
|
2
|
+
def change
|
|
3
|
+
rename_column :solidus_stripe_payment_intents, :stripe_payment_intent_id, :stripe_intent_id
|
|
4
|
+
rename_column :solidus_stripe_setup_intents, :stripe_setup_intent_id, :stripe_intent_id
|
|
5
|
+
end
|
|
6
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
class CreateSolidusStripeCustomers < ActiveRecord::Migration[7.0]
|
|
2
|
+
def change
|
|
3
|
+
create_table :solidus_stripe_customers do |t|
|
|
4
|
+
t.references :payment_method, null: false, foreign_key: { to_table: :spree_payment_methods }
|
|
5
|
+
|
|
6
|
+
t.string :source_type
|
|
7
|
+
t.integer :source_id
|
|
8
|
+
|
|
9
|
+
t.string :stripe_id, index: true
|
|
10
|
+
|
|
11
|
+
t.timestamps
|
|
12
|
+
|
|
13
|
+
t.index [:payment_method_id, :source_type, :source_id], unique: true, name: :payment_method_and_source
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
class DropSolidusStripeSetupIntent < ActiveRecord::Migration[7.0]
|
|
2
|
+
def change
|
|
3
|
+
drop_table "solidus_stripe_setup_intents", force: :cascade do |t|
|
|
4
|
+
t.string "stripe_intent_id"
|
|
5
|
+
t.integer "order_id", null: false
|
|
6
|
+
t.datetime "created_at", null: false
|
|
7
|
+
t.datetime "updated_at", null: false
|
|
8
|
+
t.integer "payment_method_id", null: false
|
|
9
|
+
t.index ["order_id"], name: "index_solidus_stripe_setup_intents_on_order_id"
|
|
10
|
+
t.index ["payment_method_id"], name: "index_solidus_stripe_setup_intents_on_payment_method_id"
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
data/db/seeds.rb
CHANGED
|
@@ -1,26 +1,8 @@
|
|
|
1
|
-
#
|
|
1
|
+
# frozen-string-literal: true
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
publishable_key = ENV['STRIPE_SEEDS_PUBLISHABLE_KEY']
|
|
3
|
+
require "solidus_stripe/seeds"
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
else
|
|
11
|
-
stripe_payment_method = Spree::PaymentMethod::StripeCreditCard.new do |payment_method|
|
|
12
|
-
payment_method.name = 'Credit Card'
|
|
13
|
-
payment_method.preferred_test_mode = true
|
|
14
|
-
payment_method.preferred_secret_key = secret_key
|
|
15
|
-
payment_method.preferred_publishable_key = publishable_key
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
if stripe_payment_method.save
|
|
19
|
-
puts "Stripe Payment Method correctly created."
|
|
20
|
-
else
|
|
21
|
-
puts "There was some problems with creating Stripe Payment Method:"
|
|
22
|
-
stripe_payment_method.errors.full_messages.each do |error|
|
|
23
|
-
puts error
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
end
|
|
5
|
+
# rubocop:disable Rails/Output
|
|
6
|
+
puts "Creating refund reason for Stripe refunds"
|
|
7
|
+
SolidusStripe::Seeds.refund_reasons
|
|
8
|
+
# rubocop:enable Rails/Output
|