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.
Files changed (153) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +92 -52
  3. data/.gitignore +3 -0
  4. data/.rubocop.yml +94 -4
  5. data/.yardopts +1 -0
  6. data/Gemfile +10 -30
  7. data/LICENSE +2 -2
  8. data/Procfile.dev +3 -0
  9. data/README.md +145 -215
  10. data/Rakefile +5 -44
  11. data/app/assets/javascripts/spree/backend/solidus_stripe.js +2 -0
  12. data/app/assets/stylesheets/spree/backend/solidus_stripe.css +4 -0
  13. data/app/controllers/solidus_stripe/intents_controller.rb +36 -52
  14. data/app/controllers/solidus_stripe/webhooks_controller.rb +28 -0
  15. data/app/models/concerns/solidus_stripe/log_entries.rb +31 -0
  16. data/app/models/solidus_stripe/customer.rb +21 -0
  17. data/app/models/solidus_stripe/gateway.rb +231 -0
  18. data/app/models/solidus_stripe/payment_intent.rb +111 -0
  19. data/app/models/solidus_stripe/payment_method.rb +106 -0
  20. data/app/models/solidus_stripe/payment_source.rb +31 -0
  21. data/app/models/solidus_stripe/slug_entry.rb +20 -0
  22. data/app/models/solidus_stripe.rb +7 -0
  23. data/app/subscribers/solidus_stripe/webhook/charge_subscriber.rb +28 -0
  24. data/app/subscribers/solidus_stripe/webhook/payment_intent_subscriber.rb +112 -0
  25. data/app/views/spree/admin/payments/source_forms/_stripe.html.erb +29 -0
  26. data/app/views/spree/admin/payments/source_forms/existing_payment/_stripe.html.erb +14 -0
  27. data/app/views/spree/admin/payments/source_forms/existing_payment/stripe/_card.html.erb +8 -0
  28. data/app/views/spree/admin/payments/source_forms/existing_payment/stripe/_default.html.erb +7 -0
  29. data/app/views/spree/admin/payments/source_views/_stripe.html.erb +15 -0
  30. data/app/views/spree/api/payments/source_views/_stripe.json.jbuilder +8 -0
  31. data/bin/dev +13 -0
  32. data/bin/dummy-app +29 -0
  33. data/bin/rails +38 -3
  34. data/bin/rails-dummy-app +3 -0
  35. data/bin/rails-engine +1 -11
  36. data/bin/rails-new +55 -0
  37. data/bin/rails-sandbox +1 -14
  38. data/bin/rspec +10 -0
  39. data/bin/sandbox +12 -74
  40. data/bin/setup +1 -0
  41. data/bin/update-migrations +56 -0
  42. data/codecov.yml +12 -0
  43. data/config/locales/en.yml +16 -1
  44. data/config/routes.rb +5 -11
  45. data/coverage.rb +42 -0
  46. data/db/migrate/20230109183332_create_solidus_stripe_payment_sources.rb +10 -0
  47. data/db/migrate/20230303154931_create_solidus_stripe_setup_intent.rb +10 -0
  48. data/db/migrate/20230306105520_create_solidus_stripe_payment_intents.rb +10 -0
  49. data/db/migrate/20230308122414_create_solidus_stripe_webhook_endpoints.rb +10 -0
  50. data/db/migrate/20230310152615_add_payment_method_reference_to_stripe_intents.rb +6 -0
  51. data/db/migrate/20230310171444_normalize_stripe_intent_id_attributes.rb +6 -0
  52. data/db/migrate/20230313150008_create_solidus_stripe_customers.rb +16 -0
  53. data/db/migrate/20230323154931_drop_solidus_stripe_setup_intent.rb +13 -0
  54. data/db/migrate/20230403094916_rename_webhook_endpoint_to_payment_method_slug_entries.rb +5 -0
  55. data/db/seeds.rb +6 -24
  56. data/lib/generators/solidus_stripe/install/install_generator.rb +121 -14
  57. data/lib/generators/solidus_stripe/install/templates/app/assets/stylesheets/spree/frontend/solidus_stripe.css +13 -0
  58. data/lib/generators/solidus_stripe/install/templates/app/javascript/controllers/solidus_stripe_confirm_controller.js +39 -0
  59. data/lib/generators/solidus_stripe/install/templates/app/javascript/controllers/solidus_stripe_payment_controller.js +89 -0
  60. data/lib/generators/solidus_stripe/install/templates/app/views/checkouts/existing_payment/_stripe.html.erb +16 -0
  61. data/lib/generators/solidus_stripe/install/templates/app/views/checkouts/existing_payment/stripe/_card.html.erb +8 -0
  62. data/lib/generators/solidus_stripe/install/templates/app/views/checkouts/existing_payment/stripe/_default.html.erb +7 -0
  63. data/lib/generators/solidus_stripe/install/templates/app/views/checkouts/payment/_stripe.html.erb +39 -0
  64. data/lib/generators/solidus_stripe/install/templates/app/views/orders/payment_info/_stripe.html.erb +20 -0
  65. data/lib/generators/solidus_stripe/install/templates/config/initializers/solidus_stripe.rb +31 -0
  66. data/lib/solidus_stripe/configuration.rb +24 -3
  67. data/lib/solidus_stripe/engine.rb +19 -6
  68. data/lib/solidus_stripe/money_to_stripe_amount_converter.rb +109 -0
  69. data/lib/solidus_stripe/refunds_synchronizer.rb +96 -0
  70. data/lib/solidus_stripe/seeds.rb +19 -0
  71. data/lib/solidus_stripe/testing_support/factories.rb +153 -0
  72. data/lib/solidus_stripe/version.rb +1 -1
  73. data/lib/solidus_stripe/webhook/event.rb +90 -0
  74. data/lib/solidus_stripe.rb +0 -2
  75. data/solidus_stripe.gemspec +29 -6
  76. data/spec/lib/solidus_stripe/configuration_spec.rb +21 -0
  77. data/spec/lib/solidus_stripe/money_to_stripe_amount_converter_spec.rb +133 -0
  78. data/spec/lib/solidus_stripe/refunds_synchronizer_spec.rb +238 -0
  79. data/spec/lib/solidus_stripe/seeds_spec.rb +43 -0
  80. data/spec/lib/solidus_stripe/webhook/event_spec.rb +134 -0
  81. data/spec/models/concerns/solidus_stripe/log_entries_spec.rb +54 -0
  82. data/spec/models/solidus_stripe/customer_spec.rb +47 -0
  83. data/spec/models/solidus_stripe/gateway_spec.rb +283 -0
  84. data/spec/models/solidus_stripe/payment_intent_spec.rb +17 -0
  85. data/spec/models/solidus_stripe/payment_method_spec.rb +137 -0
  86. data/spec/models/solidus_stripe/payment_source_spec.rb +25 -0
  87. data/spec/requests/solidus_stripe/intents_controller_spec.rb +29 -0
  88. data/spec/requests/solidus_stripe/webhooks_controller/charge/refunded_spec.rb +31 -0
  89. data/spec/requests/solidus_stripe/webhooks_controller/payment_intent/canceled_spec.rb +23 -0
  90. data/spec/requests/solidus_stripe/webhooks_controller/payment_intent/payment_failed_spec.rb +23 -0
  91. data/spec/requests/solidus_stripe/webhooks_controller/payment_intent/succeeded_spec.rb +29 -0
  92. data/spec/requests/solidus_stripe/webhooks_controller_spec.rb +52 -0
  93. data/spec/solidus_stripe_spec_helper.rb +10 -0
  94. data/spec/subscribers/solidus_stripe/webhook/charge_subscriber_spec.rb +33 -0
  95. data/spec/subscribers/solidus_stripe/webhook/payment_intent_subscriber_spec.rb +297 -0
  96. data/spec/support/solidus_stripe/backend_test_helper.rb +210 -0
  97. data/spec/support/solidus_stripe/checkout_test_helper.rb +339 -0
  98. data/spec/support/solidus_stripe/factories.rb +5 -0
  99. data/spec/support/solidus_stripe/webhook/data_fixtures.rb +106 -0
  100. data/spec/support/solidus_stripe/webhook/event_with_context_factory.rb +82 -0
  101. data/spec/support/solidus_stripe/webhook/request_helper.rb +32 -0
  102. data/spec/system/backend/solidus_stripe/orders/payments_spec.rb +119 -0
  103. data/spec/system/frontend/.keep +0 -0
  104. data/spec/system/frontend/solidus_stripe/checkout_spec.rb +187 -0
  105. data/tmp/.keep +0 -0
  106. metadata +202 -78
  107. data/.rubocop_todo.yml +0 -298
  108. data/.travis.yml +0 -28
  109. data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-cart-page-checkout.js +0 -122
  110. data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-elements.js +0 -148
  111. data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-init.js +0 -20
  112. data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-payment-intents.js +0 -84
  113. data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-payment-request-button-shared.js +0 -160
  114. data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-payment.js +0 -16
  115. data/app/assets/javascripts/spree/frontend/solidus_stripe.js +0 -6
  116. data/app/controllers/solidus_stripe/payment_request_controller.rb +0 -52
  117. data/app/controllers/spree/stripe_controller.rb +0 -13
  118. data/app/decorators/models/spree/order_update_attributes_decorator.rb +0 -39
  119. data/app/decorators/models/spree/payment_decorator.rb +0 -11
  120. data/app/decorators/models/spree/refund_decorator.rb +0 -9
  121. data/app/models/solidus_stripe/address_from_params_service.rb +0 -72
  122. data/app/models/solidus_stripe/create_intents_payment_service.rb +0 -114
  123. data/app/models/solidus_stripe/prepare_order_for_payment_service.rb +0 -46
  124. data/app/models/solidus_stripe/shipping_rates_service.rb +0 -46
  125. data/app/models/spree/payment_method/stripe_credit_card.rb +0 -230
  126. data/bin/r +0 -13
  127. data/bin/sandbox_rails +0 -18
  128. data/db/migrate/20181010123508_update_stripe_payment_method_type_to_credit_card.rb +0 -21
  129. data/lib/assets/stylesheets/spree/frontend/solidus_stripe.scss +0 -11
  130. data/lib/solidus_stripe/testing_support/card_input_helper.rb +0 -34
  131. data/lib/tasks/solidus_stripe/db/seed.rake +0 -14
  132. data/lib/views/api/spree/api/payments/source_views/_stripe.json.jbuilder +0 -3
  133. data/lib/views/backend/spree/admin/log_entries/_stripe.html.erb +0 -28
  134. data/lib/views/backend/spree/admin/payments/source_forms/_stripe.html.erb +0 -1
  135. data/lib/views/backend/spree/admin/payments/source_views/_stripe.html.erb +0 -1
  136. data/lib/views/frontend/spree/checkout/existing_payment/_stripe.html.erb +0 -1
  137. data/lib/views/frontend/spree/checkout/payment/_stripe.html.erb +0 -8
  138. data/lib/views/frontend/spree/checkout/payment/v2/_javascript.html.erb +0 -78
  139. data/lib/views/frontend/spree/checkout/payment/v3/_elements.html.erb +0 -1
  140. data/lib/views/frontend/spree/checkout/payment/v3/_form_elements.html.erb +0 -40
  141. data/lib/views/frontend/spree/checkout/payment/v3/_intents.html.erb +0 -1
  142. data/lib/views/frontend/spree/checkout/payment/v3/_stripe.html.erb +0 -2
  143. data/lib/views/frontend/spree/orders/_stripe_payment_request_button.html.erb +0 -14
  144. data/spec/features/stripe_checkout_spec.rb +0 -486
  145. data/spec/models/solidus_stripe/address_from_params_service_spec.rb +0 -87
  146. data/spec/models/solidus_stripe/create_intents_payment_service_spec.rb +0 -127
  147. data/spec/models/solidus_stripe/prepare_order_for_payment_service_spec.rb +0 -65
  148. data/spec/models/solidus_stripe/shipping_rates_service_spec.rb +0 -54
  149. data/spec/models/spree/payment_method/stripe_credit_card_spec.rb +0 -354
  150. data/spec/requests/payment_requests_spec.rb +0 -152
  151. data/spec/solidus_frontend_app_template.rb +0 -17
  152. data/spec/spec_helper.rb +0 -37
  153. 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>∗∗∗∗&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 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
@@ -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