solidus_stripe 4.3.0 → 5.0.0.alpha.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (153) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +98 -23
  3. data/.github/stale.yml +1 -17
  4. data/.gitignore +3 -0
  5. data/.rubocop.yml +94 -2
  6. data/.yardopts +1 -0
  7. data/CHANGELOG.md +1 -231
  8. data/Gemfile +10 -25
  9. data/LICENSE +2 -2
  10. data/Procfile.dev +3 -0
  11. data/README.md +155 -223
  12. data/Rakefile +7 -3
  13. data/app/assets/javascripts/spree/backend/solidus_stripe.js +2 -0
  14. data/app/assets/stylesheets/spree/backend/solidus_stripe.css +4 -0
  15. data/app/controllers/solidus_stripe/intents_controller.rb +36 -52
  16. data/app/controllers/solidus_stripe/webhooks_controller.rb +28 -0
  17. data/app/models/concerns/solidus_stripe/log_entries.rb +31 -0
  18. data/app/models/solidus_stripe/customer.rb +21 -0
  19. data/app/models/solidus_stripe/gateway.rb +231 -0
  20. data/app/models/solidus_stripe/payment_intent.rb +111 -0
  21. data/app/models/solidus_stripe/payment_method.rb +106 -0
  22. data/app/models/solidus_stripe/payment_source.rb +31 -0
  23. data/app/models/solidus_stripe/slug_entry.rb +20 -0
  24. data/app/models/solidus_stripe.rb +7 -0
  25. data/app/subscribers/solidus_stripe/webhook/charge_subscriber.rb +28 -0
  26. data/app/subscribers/solidus_stripe/webhook/payment_intent_subscriber.rb +112 -0
  27. data/app/views/spree/admin/payments/source_forms/_stripe.html.erb +29 -0
  28. data/app/views/spree/admin/payments/source_forms/existing_payment/_stripe.html.erb +14 -0
  29. data/app/views/spree/admin/payments/source_forms/existing_payment/stripe/_card.html.erb +8 -0
  30. data/app/views/spree/admin/payments/source_forms/existing_payment/stripe/_default.html.erb +7 -0
  31. data/app/views/spree/admin/payments/source_views/_stripe.html.erb +15 -0
  32. data/app/views/spree/api/payments/source_views/_stripe.json.jbuilder +8 -0
  33. data/bin/dev +13 -0
  34. data/bin/dummy-app +29 -0
  35. data/bin/rails +38 -3
  36. data/bin/rails-dummy-app +3 -0
  37. data/bin/rails-engine +1 -11
  38. data/bin/rails-new +55 -0
  39. data/bin/rails-sandbox +1 -14
  40. data/bin/rspec +10 -0
  41. data/bin/sandbox +12 -74
  42. data/bin/setup +1 -0
  43. data/bin/update-migrations +56 -0
  44. data/codecov.yml +12 -0
  45. data/config/locales/en.yml +16 -1
  46. data/config/routes.rb +5 -11
  47. data/coverage.rb +42 -0
  48. data/db/migrate/20230109183332_create_solidus_stripe_payment_sources.rb +10 -0
  49. data/db/migrate/20230303154931_create_solidus_stripe_setup_intent.rb +10 -0
  50. data/db/migrate/20230306105520_create_solidus_stripe_payment_intents.rb +10 -0
  51. data/db/migrate/20230308122414_create_solidus_stripe_webhook_endpoints.rb +10 -0
  52. data/db/migrate/20230310152615_add_payment_method_reference_to_stripe_intents.rb +6 -0
  53. data/db/migrate/20230310171444_normalize_stripe_intent_id_attributes.rb +6 -0
  54. data/db/migrate/20230313150008_create_solidus_stripe_customers.rb +16 -0
  55. data/db/migrate/20230323154931_drop_solidus_stripe_setup_intent.rb +13 -0
  56. data/db/migrate/20230403094916_rename_webhook_endpoint_to_payment_method_slug_entries.rb +5 -0
  57. data/db/seeds.rb +6 -24
  58. data/lib/generators/solidus_stripe/install/install_generator.rb +121 -14
  59. data/lib/generators/solidus_stripe/install/templates/app/assets/stylesheets/spree/frontend/solidus_stripe.css +13 -0
  60. data/lib/generators/solidus_stripe/install/templates/app/javascript/controllers/solidus_stripe_confirm_controller.js +39 -0
  61. data/lib/generators/solidus_stripe/install/templates/app/javascript/controllers/solidus_stripe_payment_controller.js +89 -0
  62. data/lib/generators/solidus_stripe/install/templates/app/views/checkouts/existing_payment/_stripe.html.erb +16 -0
  63. data/lib/generators/solidus_stripe/install/templates/app/views/checkouts/existing_payment/stripe/_card.html.erb +8 -0
  64. data/lib/generators/solidus_stripe/install/templates/app/views/checkouts/existing_payment/stripe/_default.html.erb +7 -0
  65. data/lib/generators/solidus_stripe/install/templates/app/views/checkouts/payment/_stripe.html.erb +39 -0
  66. data/lib/generators/solidus_stripe/install/templates/app/views/orders/payment_info/_stripe.html.erb +20 -0
  67. data/lib/generators/solidus_stripe/install/templates/config/initializers/solidus_stripe.rb +31 -0
  68. data/lib/solidus_stripe/configuration.rb +24 -3
  69. data/lib/solidus_stripe/engine.rb +19 -6
  70. data/lib/solidus_stripe/money_to_stripe_amount_converter.rb +109 -0
  71. data/lib/solidus_stripe/refunds_synchronizer.rb +96 -0
  72. data/lib/solidus_stripe/seeds.rb +19 -0
  73. data/lib/solidus_stripe/testing_support/factories.rb +153 -0
  74. data/lib/solidus_stripe/version.rb +1 -1
  75. data/lib/solidus_stripe/webhook/event.rb +90 -0
  76. data/lib/solidus_stripe.rb +0 -2
  77. data/solidus_stripe.gemspec +29 -5
  78. data/spec/lib/solidus_stripe/configuration_spec.rb +21 -0
  79. data/spec/lib/solidus_stripe/money_to_stripe_amount_converter_spec.rb +133 -0
  80. data/spec/lib/solidus_stripe/refunds_synchronizer_spec.rb +238 -0
  81. data/spec/lib/solidus_stripe/seeds_spec.rb +43 -0
  82. data/spec/lib/solidus_stripe/webhook/event_spec.rb +134 -0
  83. data/spec/models/concerns/solidus_stripe/log_entries_spec.rb +54 -0
  84. data/spec/models/solidus_stripe/customer_spec.rb +47 -0
  85. data/spec/models/solidus_stripe/gateway_spec.rb +283 -0
  86. data/spec/models/solidus_stripe/payment_intent_spec.rb +17 -0
  87. data/spec/models/solidus_stripe/payment_method_spec.rb +137 -0
  88. data/spec/models/solidus_stripe/payment_source_spec.rb +25 -0
  89. data/spec/requests/solidus_stripe/intents_controller_spec.rb +29 -0
  90. data/spec/requests/solidus_stripe/webhooks_controller/charge/refunded_spec.rb +31 -0
  91. data/spec/requests/solidus_stripe/webhooks_controller/payment_intent/canceled_spec.rb +23 -0
  92. data/spec/requests/solidus_stripe/webhooks_controller/payment_intent/payment_failed_spec.rb +23 -0
  93. data/spec/requests/solidus_stripe/webhooks_controller/payment_intent/succeeded_spec.rb +29 -0
  94. data/spec/requests/solidus_stripe/webhooks_controller_spec.rb +52 -0
  95. data/spec/solidus_stripe_spec_helper.rb +10 -0
  96. data/spec/subscribers/solidus_stripe/webhook/charge_subscriber_spec.rb +33 -0
  97. data/spec/subscribers/solidus_stripe/webhook/payment_intent_subscriber_spec.rb +297 -0
  98. data/spec/support/solidus_stripe/backend_test_helper.rb +210 -0
  99. data/spec/support/solidus_stripe/checkout_test_helper.rb +339 -0
  100. data/spec/support/solidus_stripe/factories.rb +5 -0
  101. data/spec/support/solidus_stripe/webhook/data_fixtures.rb +106 -0
  102. data/spec/support/solidus_stripe/webhook/event_with_context_factory.rb +82 -0
  103. data/spec/support/solidus_stripe/webhook/request_helper.rb +32 -0
  104. data/spec/system/backend/solidus_stripe/orders/payments_spec.rb +119 -0
  105. data/spec/system/frontend/.keep +0 -0
  106. data/spec/system/frontend/solidus_stripe/checkout_spec.rb +187 -0
  107. data/tmp/.keep +0 -0
  108. metadata +210 -69
  109. data/.travis.yml +0 -28
  110. data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-cart-page-checkout.js +0 -122
  111. data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-elements.js +0 -148
  112. data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-init.js +0 -20
  113. data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-payment-intents.js +0 -84
  114. data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-payment-request-button-shared.js +0 -160
  115. data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-payment.js +0 -16
  116. data/app/assets/javascripts/spree/frontend/solidus_stripe.js +0 -6
  117. data/app/controllers/solidus_stripe/payment_request_controller.rb +0 -52
  118. data/app/controllers/spree/stripe_controller.rb +0 -13
  119. data/app/decorators/models/spree/order_update_attributes_decorator.rb +0 -39
  120. data/app/decorators/models/spree/payment_decorator.rb +0 -11
  121. data/app/decorators/models/spree/refund_decorator.rb +0 -9
  122. data/app/models/solidus_stripe/address_from_params_service.rb +0 -72
  123. data/app/models/solidus_stripe/create_intents_payment_service.rb +0 -114
  124. data/app/models/solidus_stripe/prepare_order_for_payment_service.rb +0 -46
  125. data/app/models/solidus_stripe/shipping_rates_service.rb +0 -46
  126. data/app/models/spree/payment_method/stripe_credit_card.rb +0 -217
  127. data/bin/r +0 -13
  128. data/bin/sandbox_rails +0 -18
  129. data/db/migrate/20181010123508_update_stripe_payment_method_type_to_credit_card.rb +0 -21
  130. data/lib/assets/stylesheets/spree/frontend/solidus_stripe.scss +0 -11
  131. data/lib/solidus_stripe/testing_support/card_input_helper.rb +0 -34
  132. data/lib/tasks/solidus_stripe/db/seed.rake +0 -14
  133. data/lib/views/api/spree/api/payments/source_views/_stripe.json.jbuilder +0 -3
  134. data/lib/views/backend/spree/admin/log_entries/_stripe.html.erb +0 -28
  135. data/lib/views/backend/spree/admin/payments/source_forms/_stripe.html.erb +0 -1
  136. data/lib/views/backend/spree/admin/payments/source_views/_stripe.html.erb +0 -1
  137. data/lib/views/frontend/spree/checkout/existing_payment/_stripe.html.erb +0 -1
  138. data/lib/views/frontend/spree/checkout/payment/_stripe.html.erb +0 -8
  139. data/lib/views/frontend/spree/checkout/payment/v2/_javascript.html.erb +0 -78
  140. data/lib/views/frontend/spree/checkout/payment/v3/_elements.html.erb +0 -1
  141. data/lib/views/frontend/spree/checkout/payment/v3/_form_elements.html.erb +0 -40
  142. data/lib/views/frontend/spree/checkout/payment/v3/_intents.html.erb +0 -1
  143. data/lib/views/frontend/spree/checkout/payment/v3/_stripe.html.erb +0 -2
  144. data/lib/views/frontend/spree/orders/_stripe_payment_request_button.html.erb +0 -14
  145. data/spec/features/stripe_checkout_spec.rb +0 -486
  146. data/spec/models/solidus_stripe/address_from_params_service_spec.rb +0 -87
  147. data/spec/models/solidus_stripe/create_intents_payment_service_spec.rb +0 -127
  148. data/spec/models/solidus_stripe/prepare_order_for_payment_service_spec.rb +0 -65
  149. data/spec/models/solidus_stripe/shipping_rates_service_spec.rb +0 -54
  150. data/spec/models/spree/payment_method/stripe_credit_card_spec.rb +0 -316
  151. data/spec/requests/payment_requests_spec.rb +0 -152
  152. data/spec/spec_helper.rb +0 -37
  153. data/spec/support/solidus_address_helper.rb +0 -15
@@ -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>∗∗∗∗&nbsp;∗∗∗∗&nbsp;∗∗∗∗&nbsp;<%= card.last4 %>&nbsp;</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>
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ attrs = [:id]
4
+ if @current_user_roles.include?("admin")
5
+ attrs += [:stripe_payment_method_id]
6
+ end
7
+
8
+ json.call(payment_source, *attrs)
data/bin/dev ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env sh
2
+
3
+ if ! gem list foreman -i --silent; then
4
+ echo "Installing foreman..."
5
+ gem install foreman
6
+ fi
7
+
8
+ if ! test -d sandbox; then
9
+ bin/sandbox
10
+ fi
11
+
12
+ export PORT=3000
13
+ exec foreman start -f Procfile.dev "$@"
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
- if %w[g generate].include? ARGV.first
4
- exec "#{__dir__}/rails-engine", *ARGV
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-sandbox", *ARGV
41
+ exec RbConfig.ruby, "#{__dir__}/rails", "sandbox", *ARGV
7
42
  end
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ exec RbConfig.ruby, "#{__dir__}/rails", "dummy-app", *ARGV
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
- ENGINE_ROOT = File.expand_path('..', __dir__)
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
- app_root = 'sandbox'
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
- ruby -rbundler -e'b = proc {system *ARGV}; Bundler.respond_to?(:with_unbundled_env) ? Bundler.with_unbundled_env(&b) : Bundler.with_clean_env(&b)' -- $@
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
- rm -rf ./sandbox
36
- unbundled bundle exec rails new sandbox --database="$RAILSDB" \
37
- --skip-bundle \
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 [ ! -d "sandbox" ]; then
46
- echo 'sandbox rails application failed'
47
- exit 1
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 spree: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
@@ -6,3 +6,4 @@ set -vx
6
6
  gem install bundler --conservative
7
7
  bundle update
8
8
  bin/rake clobber
9
+ rm -rf ./dummy-app
@@ -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
@@ -0,0 +1,12 @@
1
+ coverage:
2
+ status:
3
+ project:
4
+ default:
5
+ target: auto
6
+ threshold: 1%
7
+ base: auto
8
+ patch:
9
+ default:
10
+ target: auto
11
+ threshold: 1%
12
+ base: auto
@@ -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
- hello: Hello world
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
- Spree::Core::Engine.routes.draw do
4
- # route to a deprecated controller, will be removed in the future:
5
- post '/stripe/confirm_payment', to: 'stripe#confirm_payment'
6
-
7
- # payment intents routes:
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 CreateSolidusStripePaymentSources < ActiveRecord::Migration[5.2]
2
+ def change
3
+ create_table :solidus_stripe_payment_sources do |t|
4
+ t.integer :payment_method_id
5
+ t.string :stripe_payment_method_id
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ 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
@@ -0,0 +1,5 @@
1
+ class RenameWebhookEndpointToPaymentMethodSlugEntries < ActiveRecord::Migration[7.0]
2
+ def change
3
+ rename_table :solidus_stripe_webhook_endpoints, :solidus_stripe_slug_entries
4
+ end
5
+ end
data/db/seeds.rb CHANGED
@@ -1,26 +1,8 @@
1
- # frozen_string_literal: true
1
+ # frozen-string-literal: true
2
2
 
3
- secret_key = ENV['STRIPE_SEEDS_SECRET_KEY']
4
- publishable_key = ENV['STRIPE_SEEDS_PUBLISHABLE_KEY']
3
+ require "solidus_stripe/seeds"
5
4
 
6
- puts "Loading seed: solidus_stripe/stripe_payment_method"
7
-
8
- if secret_key.blank? || publishable_key.blank?
9
- puts "Failure: You have to set both STRIPE_SEEDS_SECRET_KEY and STRIPE_SEEDS_PUBLISHABLE_KEY environment variables."
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