solidus_paypal_braintree 1.1.1 โ†’ 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +3 -0
  3. data/.github/stale.yml +1 -17
  4. data/.github_changelog_generator +2 -0
  5. data/.gitignore +4 -3
  6. data/.rubocop.yml +1 -2
  7. data/CHANGELOG.md +32 -0
  8. data/Gemfile +17 -13
  9. data/README.md +41 -17
  10. data/app/assets/stylesheets/spree/backend/solidus_paypal_braintree.css +4 -0
  11. data/app/models/solidus_paypal_braintree/configuration.rb +1 -3
  12. data/app/models/solidus_paypal_braintree/gateway.rb +4 -3
  13. data/app/models/solidus_paypal_braintree/source.rb +4 -2
  14. data/app/models/solidus_paypal_braintree/transaction_address.rb +1 -0
  15. data/bin/rails +4 -12
  16. data/bin/rails-engine +13 -0
  17. data/bin/rails-sandbox +16 -0
  18. data/bin/rake +7 -0
  19. data/bin/sandbox +103 -0
  20. data/bin/setup +1 -1
  21. data/lib/generators/solidus_paypal_braintree/install/install_generator.rb +9 -4
  22. data/lib/generators/solidus_paypal_braintree/install/templates/initializer.rb +6 -0
  23. data/lib/solidus_paypal_braintree/engine.rb +6 -5
  24. data/lib/solidus_paypal_braintree/extension_configuration.rb +23 -0
  25. data/lib/solidus_paypal_braintree/request_protection.rb +2 -2
  26. data/lib/solidus_paypal_braintree/{factories.rb โ†’ testing_support/factories.rb} +5 -5
  27. data/lib/solidus_paypal_braintree/version.rb +1 -1
  28. data/lib/solidus_paypal_braintree.rb +5 -3
  29. data/lib/views/frontend/solidus_paypal_braintree/payments/_payment.html.erb +3 -3
  30. data/solidus_paypal_braintree.gemspec +39 -39
  31. data/spec/controllers/solidus_paypal_braintree/checkouts_controller_spec.rb +99 -0
  32. data/spec/controllers/solidus_paypal_braintree/client_tokens_controller_spec.rb +55 -0
  33. data/spec/controllers/solidus_paypal_braintree/configurations_controller_spec.rb +73 -0
  34. data/spec/controllers/solidus_paypal_braintree/transactions_controller_spec.rb +183 -0
  35. data/spec/features/backend/configuration_spec.rb +23 -0
  36. data/spec/features/backend/new_payment_spec.rb +137 -0
  37. data/spec/features/frontend/braintree_credit_card_checkout_spec.rb +191 -0
  38. data/spec/features/frontend/paypal_checkout_spec.rb +166 -0
  39. data/spec/features/frontend/venmo_checkout_spec.rb +194 -0
  40. data/spec/fixtures/cassettes/admin/invalid_credit_card.yml +63 -0
  41. data/spec/fixtures/cassettes/admin/resubmit_credit_card.yml +352 -0
  42. data/spec/fixtures/cassettes/admin/valid_credit_card.yml +412 -0
  43. data/spec/fixtures/cassettes/braintree/create_profile.yml +71 -0
  44. data/spec/fixtures/cassettes/braintree/generate_token.yml +63 -0
  45. data/spec/fixtures/cassettes/braintree/token.yml +63 -0
  46. data/spec/fixtures/cassettes/checkout/invalid_credit_card.yml +63 -0
  47. data/spec/fixtures/cassettes/checkout/resubmit_credit_card.yml +216 -0
  48. data/spec/fixtures/cassettes/checkout/update.yml +71 -0
  49. data/spec/fixtures/cassettes/checkout/valid_credit_card.yml +171 -0
  50. data/spec/fixtures/cassettes/checkout/valid_venmo_transaction.yml +599 -0
  51. data/spec/fixtures/cassettes/gateway/authorize/credit_card/address.yml +86 -0
  52. data/spec/fixtures/cassettes/gateway/authorize/merchant_account/EUR.yml +154 -0
  53. data/spec/fixtures/cassettes/gateway/authorize/paypal/EUR.yml +90 -0
  54. data/spec/fixtures/cassettes/gateway/authorize/paypal/address.yml +90 -0
  55. data/spec/fixtures/cassettes/gateway/authorize.yml +86 -0
  56. data/spec/fixtures/cassettes/gateway/authorized_transaction.yml +73 -0
  57. data/spec/fixtures/cassettes/gateway/cancel/missing.yml +63 -0
  58. data/spec/fixtures/cassettes/gateway/cancel/refunds.yml +272 -0
  59. data/spec/fixtures/cassettes/gateway/cancel/void.yml +201 -0
  60. data/spec/fixtures/cassettes/gateway/capture.yml +141 -0
  61. data/spec/fixtures/cassettes/gateway/complete.yml +157 -0
  62. data/spec/fixtures/cassettes/gateway/credit.yml +208 -0
  63. data/spec/fixtures/cassettes/gateway/customer.yml +79 -0
  64. data/spec/fixtures/cassettes/gateway/purchase.yml +87 -0
  65. data/spec/fixtures/cassettes/gateway/settled_transaction.yml +140 -0
  66. data/spec/fixtures/cassettes/gateway/void.yml +137 -0
  67. data/spec/fixtures/cassettes/source/bin.yml +295 -0
  68. data/spec/fixtures/cassettes/source/card_type.yml +267 -0
  69. data/spec/fixtures/cassettes/source/last4.yml +267 -0
  70. data/spec/fixtures/cassettes/transaction/import/valid/capture.yml +224 -0
  71. data/spec/fixtures/cassettes/transaction/import/valid.yml +71 -0
  72. data/spec/fixtures/views/spree/orders/edit.html.erb +50 -0
  73. data/spec/helpers/solidus_paypal_braintree/braintree_admin_helper_spec.rb +17 -0
  74. data/spec/helpers/solidus_paypal_braintree/braintree_checkout_helper_spec.rb +70 -0
  75. data/spec/models/solidus_paypal_braintree/address_spec.rb +71 -0
  76. data/spec/models/solidus_paypal_braintree/avs_result_spec.rb +317 -0
  77. data/spec/models/solidus_paypal_braintree/gateway_spec.rb +742 -0
  78. data/spec/models/solidus_paypal_braintree/response_spec.rb +280 -0
  79. data/spec/models/solidus_paypal_braintree/source_spec.rb +539 -0
  80. data/spec/models/solidus_paypal_braintree/transaction_address_spec.rb +235 -0
  81. data/spec/models/solidus_paypal_braintree/transaction_import_spec.rb +302 -0
  82. data/spec/models/solidus_paypal_braintree/transaction_spec.rb +86 -0
  83. data/spec/models/spree/store_spec.rb +14 -0
  84. data/spec/requests/spree/api/orders_controller_spec.rb +36 -0
  85. data/spec/spec_helper.rb +32 -0
  86. data/spec/support/capybara.rb +7 -0
  87. data/spec/support/gateway_helpers.rb +29 -0
  88. data/spec/support/order_ready_for_payment.rb +37 -0
  89. data/spec/support/vcr.rb +42 -0
  90. data/spec/support/views.rb +1 -0
  91. metadata +149 -18
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 63e1ccf774638a7a86d78396a9faf2ded82d2ac849bd197c9f554b52d2257d23
4
- data.tar.gz: 7aad39ea3e0eb572558213b51093e3fab40fed516a39802e2dafa6ae62914432
3
+ metadata.gz: f5a99cf586082f26611d58fc0ab61e282c4cbcc00ccf1bb26702fc1051a41ff0
4
+ data.tar.gz: fddad0e0df126342b1ae1b4d5267d6cce177b66a41c051ad4cfda28127bbd86a
5
5
  SHA512:
6
- metadata.gz: 3bffb9a52eacfa27ed6633a7f7c01eacc8aec2f0f2b2e25ca5cb1e7ef66556f2486f320260b0544186516a7f87663d3b10ef52c267343089ab822612fb0ca4c2
7
- data.tar.gz: 3e4827feb921fc1e2d324408333ef34c89dfb01837bf1973fc998529323cfe2112970ff1d33b8f4d8792ad37df3c474516c9c2d35e5ed0fb03ee6408f969cd85
6
+ metadata.gz: ad6a2ad7d62c46d6a801252db48ff2cadb08d29581601898a207ce5d46338373ec455999e6a46f1be9a62d0eb2785aa1e42373ff380c66bf9bdff029b9b5143a
7
+ data.tar.gz: 74c45a0105ffe812e456896c96455db6be96f500a400e9f2285e1cb5e650d16a77af68737f57df13d69eb0de6c80aade23ad3fc48f142024494c8271d90604ff
data/.circleci/config.yml CHANGED
@@ -1,6 +1,7 @@
1
1
  version: 2.1
2
2
 
3
3
  orbs:
4
+ # Required for feature specs.
4
5
  browser-tools: circleci/browser-tools@1.1
5
6
 
6
7
  # Always take the latest version of the orb, this allows us to
@@ -23,6 +24,7 @@ jobs:
23
24
  lint-code:
24
25
  executor: solidusio_extensions/sqlite-memory
25
26
  steps:
27
+ - browser-tools/install-browser-tools
26
28
  - solidusio_extensions/lint-code
27
29
 
28
30
  workflows:
@@ -31,6 +33,7 @@ workflows:
31
33
  - run-specs-with-postgres
32
34
  - run-specs-with-mysql
33
35
  - lint-code
36
+
34
37
  "Weekly run specs against master":
35
38
  triggers:
36
39
  - schedule:
data/.github/stale.yml CHANGED
@@ -1,17 +1 @@
1
- # Number of days of inactivity before an issue becomes stale
2
- daysUntilStale: 60
3
- # Number of days of inactivity before a stale issue is closed
4
- daysUntilClose: 7
5
- # Issues with these labels will never be considered stale
6
- exemptLabels:
7
- - pinned
8
- - security
9
- # Label to use when marking an issue as stale
10
- staleLabel: wontfix
11
- # Comment to post when marking an issue as stale. Set to `false` to disable
12
- markComment: >
13
- This issue has been automatically marked as stale because it has not had
14
- recent activity. It will be closed if no further activity occurs. Thank you
15
- for your contributions.
16
- # Comment to post when closing a stale issue. Set to `false` to disable
17
- closeComment: false
1
+ _extends: .github
@@ -0,0 +1,2 @@
1
+ issues=false
2
+ exclude-labels=infrastructure
data/.gitignore CHANGED
@@ -7,7 +7,6 @@
7
7
  .project
8
8
  .sass-cache
9
9
  coverage
10
- Gemfile-local
11
10
  Gemfile.lock
12
11
  tmp
13
12
  nbproject
@@ -15,5 +14,7 @@ pkg
15
14
  *.swp
16
15
  spec/dummy
17
16
  spec/examples.txt
18
- .bundle/
19
- .env
17
+ /sandbox
18
+ .rvmrc
19
+ .ruby-version
20
+ .ruby-gemset
data/.rubocop.yml CHANGED
@@ -2,8 +2,7 @@ require:
2
2
  - solidus_dev_support/rubocop
3
3
 
4
4
  AllCops:
5
- NewCops: enable
6
- TargetRubyVersion: 2.5
5
+ NewCops: disable
7
6
 
8
7
  Layout/FirstArgumentIndentation:
9
8
  EnforcedStyle: consistent
data/CHANGELOG.md CHANGED
@@ -1,5 +1,37 @@
1
1
  # Changelog
2
2
 
3
+ ## [v1.2.0](https://github.com/solidusio/solidus_paypal_braintree/tree/v1.2.0) (2022-12-12)
4
+
5
+ [Full Changelog](https://github.com/solidusio/solidus_paypal_braintree/compare/v1.1.2...v1.2.0)
6
+
7
+ **Fixed bugs:**
8
+
9
+ - Sandbox script is not able to install bundle due to empty $BRANCH value [\#337](https://github.com/solidusio/solidus_paypal_braintree/issues/337)
10
+ - Do not safeguard including of Spree::Preferences::Persistable [\#316](https://github.com/solidusio/solidus_paypal_braintree/pull/316) ([tvdeyen](https://github.com/tvdeyen))
11
+
12
+ **Merged pull requests:**
13
+
14
+ - Update to the latest dev-support defaults [\#339](https://github.com/solidusio/solidus_paypal_braintree/pull/339) ([elia](https://github.com/elia))
15
+ - Fix setup intructions on Rails 7 [\#332](https://github.com/solidusio/solidus_paypal_braintree/pull/332) ([waiting-for-dev](https://github.com/waiting-for-dev))
16
+ - Fix sandbox generator [\#329](https://github.com/solidusio/solidus_paypal_braintree/pull/329) ([RyanofWoods](https://github.com/RyanofWoods))
17
+ - Fix broken specs [\#328](https://github.com/solidusio/solidus_paypal_braintree/pull/328) ([RyanofWoods](https://github.com/RyanofWoods))
18
+ - Drop compatibility with Solidus \< 2.4 [\#326](https://github.com/solidusio/solidus_paypal_braintree/pull/326) ([mamhoff](https://github.com/mamhoff))
19
+ - Add BIN \(bank identification number\) to SolidusPaypalBraintree::Source [\#308](https://github.com/solidusio/solidus_paypal_braintree/pull/308) ([RyanofWoods](https://github.com/RyanofWoods))
20
+ - Improve README PayPal styling information [\#307](https://github.com/solidusio/solidus_paypal_braintree/pull/307) ([RyanofWoods](https://github.com/RyanofWoods))
21
+ - Make extension compliant to solidus\_dev\_support [\#289](https://github.com/solidusio/solidus_paypal_braintree/pull/289) ([MinasMazar](https://github.com/MinasMazar))
22
+
23
+ ## [v1.1.2](https://github.com/solidusio/solidus_paypal_braintree/tree/v1.1.2) (2022-10-14)
24
+
25
+ [Full Changelog](https://github.com/solidusio/solidus_paypal_braintree/compare/v1.1.1...v1.1.2)
26
+
27
+ **Merged pull requests:**
28
+
29
+ - Fix broken factory [\#325](https://github.com/solidusio/solidus_paypal_braintree/pull/325) ([johnpitchko](https://github.com/johnpitchko))
30
+ - Update to use forked solidus\_frontend when needed [\#324](https://github.com/solidusio/solidus_paypal_braintree/pull/324) ([waiting-for-dev](https://github.com/waiting-for-dev))
31
+ - Fix specs to stub spree\_current\_user [\#323](https://github.com/solidusio/solidus_paypal_braintree/pull/323) ([gsmendoza](https://github.com/gsmendoza))
32
+ - Bump Rubocop TargetRubyVersion from 2.5 to 2.6 [\#319](https://github.com/solidusio/solidus_paypal_braintree/pull/319) ([RyanofWoods](https://github.com/RyanofWoods))
33
+ - Fix exception when other payment methods active [\#318](https://github.com/solidusio/solidus_paypal_braintree/pull/318) ([embold-tyler](https://github.com/embold-tyler))
34
+
3
35
  ## [v1.1.1](https://github.com/solidusio/solidus_paypal_braintree/tree/v1.1.1) (2022-06-30)
4
36
 
5
37
  [Full Changelog](https://github.com/solidusio/solidus_paypal_braintree/compare/v1.1.0...v1.1.1)
data/Gemfile CHANGED
@@ -6,17 +6,18 @@ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
6
6
  branch = ENV.fetch('SOLIDUS_BRANCH', 'master')
7
7
  gem 'solidus', github: 'solidusio/solidus', branch: branch
8
8
 
9
- gem 'rails', ENV.fetch('RAILS_VERSION', nil)
9
+ # The solidus_frontend gem has been pulled out since v3.2
10
+ gem 'solidus_frontend', github: 'solidusio/solidus_frontend' if branch == 'master'
11
+ gem 'solidus_frontend' if branch >= 'v3.2' # rubocop:disable Bundler/DuplicatedGem
12
+
13
+ # Needed to help Bundler figure out how to resolve dependencies,
14
+ # otherwise it takes forever to resolve them.
15
+ # See https://github.com/bundler/bundler/issues/6677
16
+ gem 'rails', '>0.a'
10
17
 
11
18
  # Provides basic authentication functionality for testing parts of your engine
12
19
  gem 'solidus_auth_devise'
13
20
 
14
- # Asset compilation speed
15
- gem 'mini_racer'
16
- gem 'sassc-rails', platforms: :mri
17
-
18
- gem 'bourbon'
19
-
20
21
  case ENV.fetch('DB', nil)
21
22
  when 'mysql'
22
23
  gem 'mysql2'
@@ -26,13 +27,16 @@ else
26
27
  gem 'sqlite3'
27
28
  end
28
29
 
29
- group :test do
30
- gem 'rails-controller-testing'
31
- gem 'webdrivers'
32
- end
30
+ # While we still support Ruby < 3 we need to workaround a limitation in
31
+ # the 'async' gem that relies on the latest ruby, since RubyGems doesn't
32
+ # resolve gems based on the required ruby version.
33
+ gem 'async', '< 3' if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3')
33
34
 
34
35
  gemspec
35
36
 
36
37
  # Use a local Gemfile to include development dependencies that might not be
37
- # relevant for the project or for other contributors, e.g.: `gem 'pry-debug'`.
38
- eval_gemfile 'Gemfile-local' if File.exist? 'Gemfile-local'
38
+ # relevant for the project or for other contributors, e.g. pry-byebug.
39
+ #
40
+ # We use `send` instead of calling `eval_gemfile` to work around an issue with
41
+ # how Dependabot parses projects: https://github.com/dependabot/dependabot-core/issues/1658.
42
+ send(:eval_gemfile, 'Gemfile-local') if File.exist? 'Gemfile-local'
data/README.md CHANGED
@@ -1,12 +1,13 @@
1
- SolidusPaypalBraintree
2
- ======================
1
+ # SolidusPaypalBraintree
3
2
 
4
- [![CircleCI](https://circleci.com/gh/solidusio/solidus_paypal_braintree.svg?style=svg)](https://circleci.com/gh/solidusio/solidus_paypal_braintree)
3
+ [![CircleCI](https://circleci.com/gh/solidusio/solidus_paypal_braintree.svg?style=shield)](https://circleci.com/gh/solidusio/solidus_paypal_braintree)
4
+ [![codecov](https://codecov.io/gh/solidusio/solidus_paypal_braintree/branch/master/graph/badge.svg)](https://codecov.io/gh/solidusio/solidus_paypal_braintree)
5
5
 
6
6
  `solidus_paypal_braintree` is an extension that adds support for using [Braintree](https://www.braintreepayments.com) as a payment source in your [Solidus](https://solidus.io/) store. It supports Apple Pay, PayPal, and credit card transactions.
7
7
 
8
- Installation
9
- ------------
8
+ ๐Ÿšง This extension is currently only compatible with the legacy `solidus_frontend` ๐Ÿšง
9
+
10
+ ## Installation
10
11
 
11
12
  Add solidus_paypal_braintree to your Gemfile:
12
13
 
@@ -39,8 +40,8 @@ Payment methods can accept preferences either directly entered in admin, or from
39
40
  1. Set static preferences in an initializer
40
41
  ```ruby
41
42
  # config/initializers/spree.rb
42
- Spree::Config.config do |config|
43
- config.static_model_preferences.add(
43
+ Rails.application.config.to_prepare do
44
+ Spree::Config.static_model_preferences.add(
44
45
  SolidusPaypalBraintree::Gateway,
45
46
  'braintree_credentials', {
46
47
  environment: Rails.env.production? ? 'production' : 'sandbox',
@@ -198,19 +199,22 @@ Note, other images such as Venmo's full logo and shortened "V" logo are included
198
199
 
199
200
  Ensure that you follow [Venmo's guidelines](https://developer.paypal.com/braintree/docs/files/venmo-merchant-integration-guidelines.pdf) when making other style changes, otherwise failing to comply can lead to an interruption of your Venmo service.
200
201
 
201
- PayPal
202
- ------
202
+ ## PayPal
203
203
 
204
204
  A default checkout view is provided that will display PayPal as a payment option.
205
205
  It will only be displayed if the `SolidusPaypalBraintree::Gateway` payment
206
206
  method is configured to display on the frontend and PayPal is enabled in the
207
207
  store's configuration.
208
208
 
209
- You can find button configuration options in
209
+ You can find button configuration options in
210
210
  `/solidus_paypal_braintree/configurations/list` if you want to change the color,
211
- shape, layout, and a few other options. Keep in mind that the `paypal_button_tagline`
212
- does not work when the `paypal_button_layout` is set to `vertical`, and will be
213
- ignored in that case.
211
+ shape, layout, and a few other options. For more information check out
212
+ [PayPal's documentation](https://developer.paypal.com/docs/platforms/checkout/reference/style-guide/#layout).
213
+
214
+ Keep in mind that:
215
+ - `paypal_button_tagline` does not work when the `paypal_button_layout` is set to `vertical`, and will be ignored; and
216
+ - `paypal_button_layout` of `horizontal` limits financing options/buttons to 2, where as `vertical` is 4.
217
+ Other available financing options after the limit will not be rendered in the PayPal's iframe DOM.
214
218
 
215
219
  The checkout view
216
220
  [initializes the PayPal button](/lib/views/frontend/spree/checkout/payment/_paypal_braintree.html.erb)
@@ -336,8 +340,7 @@ Once enabled, you can use the following card numbers to test 3DS 2 on your
336
340
  client side in sandbox:
337
341
  https://developers.braintreepayments.com/guides/3d-secure/migration/javascript/v3#client-side-sandbox-testing.
338
342
 
339
- Testing
340
- -------
343
+ ## Testing
341
344
 
342
345
  To run the specs it is required to set the Braintree test account data in these environment variables:
343
346
  `BRAINTREE_PUBLIC_KEY`, `BRAINTREE_PRIVATE_KEY`, `BRAINTREE_MERCHANT_ID` and `BRAINTREE_PAYPAL_PAYEE_EMAIL`
@@ -356,14 +359,35 @@ Simply add this require statement to your spec_helper:
356
359
  require 'solidus_paypal_braintree/factories'
357
360
  ```
358
361
 
359
- Development
360
- -------
362
+ ## Development
361
363
 
362
364
  ### Mocking your buyer country
363
365
  PayPal looks at the buyer's IP geolocation to determine what funding sources should be available to them. Because for example, Venmo is currently only available to US buyers. Because of this, you may want to pretend that you are from US so you can check if Venmo is correctly integrated for these customers. To do this, set the payment method's preference of `force_buyer_country` to "US". See more information about preferences above.
364
366
 
365
367
  This preference has no effect on production.
366
368
 
369
+ ### Running the sandbox
370
+
371
+ To run this extension in a sandboxed Solidus application, you can run `bin/sandbox`. The path for
372
+ the sandbox app is `./sandbox` and `bin/rails` will forward any Rails commands to
373
+ `sandbox/bin/rails`.
374
+
375
+ Here's an example:
376
+
377
+ ```
378
+ $ bin/rails server
379
+ => Booting Puma
380
+ => Rails 7.0.4 application starting in development
381
+ * Listening on tcp://127.0.0.1:3000
382
+ Use Ctrl-C to stop
383
+ ```
384
+
385
+
386
+ ### Releasing new versions
387
+
388
+ Please refer to the dedicated [page](https://github.com/solidusio/solidus/wiki/How-to-release-extensions) on Solidus wiki.
389
+
390
+
367
391
  ## License
368
392
 
369
393
  Copyright (c) 2016-2020 Stembolt and others contributors, released under the New BSD License
@@ -0,0 +1,4 @@
1
+ /*
2
+ Placeholder manifest file.
3
+ the installer will append this file to the app vendored assets here: 'vendor/assets/stylesheets/spree/backend/all.css'
4
+ */
@@ -11,9 +11,7 @@ module SolidusPaypalBraintree
11
11
  messaging: { availables: %w[true false], default: 'false' }
12
12
  }.freeze
13
13
 
14
- unless respond_to?(:preference)
15
- include ::Spree::Preferences::Persistable
16
- end
14
+ include ::Spree::Preferences::Persistable
17
15
 
18
16
  belongs_to :store, class_name: 'Spree::Store', optional: false
19
17
 
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'braintree'
4
+ require 'solidus_paypal_braintree/request_protection'
4
5
 
5
6
  module SolidusPaypalBraintree
6
7
  class Gateway < ::Spree::PaymentMethod
@@ -11,9 +12,9 @@ module SolidusPaypalBraintree
11
12
  # Error message from Braintree that gets returned by a non voidable transaction
12
13
  NON_VOIDABLE_STATUS_ERROR_REGEXP = /can only be voided if status is authorized/.freeze
13
14
 
14
- TOKEN_GENERATION_DISABLED_MESSAGE = 'Token generation is disabled.' \
15
- ' To re-enable set the `token_generation_enabled` preference on the' \
16
- ' gateway to `true`.'
15
+ TOKEN_GENERATION_DISABLED_MESSAGE = 'Token generation is disabled. ' \
16
+ 'To re-enable set the `token_generation_enabled` preference on the ' \
17
+ 'gateway to `true`.'
17
18
 
18
19
  ALLOWED_BRAINTREE_OPTIONS = [
19
20
  :device_data,
@@ -1,7 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'solidus_paypal_braintree/request_protection'
4
+
3
5
  module SolidusPaypalBraintree
4
- class Source < SolidusSupport.payment_source_parent_class
6
+ class Source < ::Spree::PaymentSource
5
7
  include RequestProtection
6
8
 
7
9
  PAYPAL = "PayPalAccount"
@@ -28,7 +30,7 @@ module SolidusPaypalBraintree
28
30
  scope(:with_payment_profile, -> { joins(:customer) })
29
31
  scope(:credit_card, -> { where(payment_type: CREDIT_CARD) })
30
32
 
31
- delegate :last_4, :card_type, :expiration_month, :expiration_year, :email,
33
+ delegate :bin, :last_4, :card_type, :expiration_month, :expiration_year, :email,
32
34
  :username, :source_description, to: :braintree_payment_method, allow_nil: true
33
35
 
34
36
  # Aliases to match Spree::CreditCard's interface
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'active_model'
4
+ require 'solidus_paypal_braintree/country_mapper'
4
5
 
5
6
  module SolidusPaypalBraintree
6
7
  class TransactionAddress
data/bin/rails CHANGED
@@ -1,15 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- # frozen_string_literal: true
4
-
5
- app_root = 'spec/dummy'
6
-
7
- unless File.exist? "#{app_root}/bin/rails"
8
- system "bin/rake", app_root or begin
9
- warn "Automatic creation of the dummy app failed"
10
- exit 1
11
- end
3
+ if %w[g generate].include? ARGV.first
4
+ exec "#{__dir__}/rails-engine", *ARGV
5
+ else
6
+ exec "#{__dir__}/rails-sandbox", *ARGV
12
7
  end
13
-
14
- Dir.chdir app_root
15
- exec 'bin/rails', *ARGV
data/bin/rails-engine ADDED
@@ -0,0 +1,13 @@
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
+
5
+ ENGINE_ROOT = File.expand_path('..', __dir__)
6
+ ENGINE_PATH = File.expand_path('../lib/solidus_paypal_braintree/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'
data/bin/rails-sandbox ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
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
data/bin/rake ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "rubygems"
5
+ require "bundler/setup"
6
+
7
+ load Gem.bin_path("rake", "rake")
data/bin/sandbox ADDED
@@ -0,0 +1,103 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -e
4
+ if [ -n "$DEBUG" ]
5
+ then
6
+ set -x
7
+ fi
8
+
9
+ case "$DB" in
10
+ postgres|postgresql)
11
+ RAILSDB="postgresql"
12
+ ;;
13
+ mysql)
14
+ RAILSDB="mysql"
15
+ ;;
16
+ sqlite3|sqlite)
17
+ RAILSDB="sqlite3"
18
+ ;;
19
+ '')
20
+ echo "~~> Use 'export DB=[postgres|mysql|sqlite]' to control the DB adapter"
21
+ RAILSDB="sqlite3"
22
+ ;;
23
+ *)
24
+ echo "Invalid value specified for the Solidus sandbox: DB=\"$DB\"."
25
+ echo "Please use 'postgres', 'mysql', or 'sqlite' instead."
26
+ exit 1
27
+ ;;
28
+ esac
29
+ echo "~~> Using $RAILSDB as the database engine"
30
+
31
+ if [ -z "$SOLIDUS_BRANCH" ]
32
+ then
33
+ echo "~~> Use 'export SOLIDUS_BRANCH=[master|v3.2|...]' to control the Solidus branch"
34
+ SOLIDUS_BRANCH="master"
35
+ fi
36
+ echo "~~> Using branch $SOLIDUS_BRANCH of solidus"
37
+
38
+ if [ -z "$SOLIDUS_FRONTEND" ]
39
+ then
40
+ echo "~~> Use 'export SOLIDUS_FRONTEND=[solidus_frontend|solidus_starter_frontend]' to control the Solidus frontend"
41
+ SOLIDUS_FRONTEND="solidus_frontend"
42
+ fi
43
+ echo "~~> Using branch $SOLIDUS_FRONTEND as the solidus frontend"
44
+
45
+ extension_name="solidus_paypal_braintree"
46
+
47
+ # Stay away from the bundler env of the containing extension.
48
+ function unbundled {
49
+ ruby -rbundler -e'b = proc {system *ARGV}; Bundler.respond_to?(:with_unbundled_env) ? Bundler.with_unbundled_env(&b) : Bundler.with_clean_env(&b)' -- $@
50
+ }
51
+
52
+ rm -rf ./sandbox
53
+ unbundled bundle exec rails new sandbox --database="$RAILSDB" \
54
+ --skip-bundle \
55
+ --skip-git \
56
+ --skip-keeps \
57
+ --skip-rc \
58
+ --skip-spring \
59
+ --skip-test \
60
+ --skip-javascript
61
+
62
+ if [ ! -d "sandbox" ]; then
63
+ echo 'sandbox rails application failed'
64
+ exit 1
65
+ fi
66
+
67
+ cd ./sandbox
68
+ cat <<RUBY >> Gemfile
69
+ gem 'solidus', github: 'solidusio/solidus', branch: '$SOLIDUS_BRANCH'
70
+ gem 'rails-i18n'
71
+ gem 'solidus_i18n'
72
+
73
+ # This Braintree extension contains a user decorator, so the user class must be loaded first.
74
+ gem "solidus_auth_devise", "~> 2.5"
75
+ gem '$extension_name', path: '..'
76
+
77
+ group :test, :development do
78
+ platforms :mri do
79
+ gem 'pry-byebug'
80
+ end
81
+ end
82
+ RUBY
83
+
84
+ unbundled bundle install --gemfile Gemfile
85
+
86
+ unbundled bundle exec rake db:drop db:create
87
+
88
+ # Still request "devise". Solidus will skip installing it again but will include its seeds.
89
+ unbundled bundle exec rails generate solidus:install \
90
+ --auto-accept \
91
+ --user_class=Spree::User \
92
+ --enforce_available_locales=true \
93
+ --authentication="devise" \
94
+ --payment-method=none \
95
+ --frontend=${SOLIDUS_FRONTEND} \
96
+ $@
97
+
98
+ unbundled bundle exec rails generate solidus:auth:install --auto-run-migrations
99
+ unbundled bundle exec rails generate ${extension_name}:install --auto-run-migrations
100
+
101
+ echo
102
+ echo "๐Ÿš€ Sandbox app successfully created for $extension_name!"
103
+ echo "๐Ÿงช This app is intended for test purposes."
data/bin/setup CHANGED
@@ -5,4 +5,4 @@ set -vx
5
5
 
6
6
  gem install bundler --conservative
7
7
  bundle update
8
- bundle exec rake clobber
8
+ bin/rake clobber
@@ -4,9 +4,14 @@ module SolidusPaypalBraintree
4
4
  module Generators
5
5
  class InstallGenerator < Rails::Generators::Base
6
6
  class_option :auto_run_migrations, type: :boolean, default: false
7
+ source_root File.expand_path('templates', __dir__)
8
+
9
+ def copy_initializer
10
+ template 'initializer.rb', 'config/initializers/solidus_paypal_braintree.rb'
11
+ end
7
12
 
8
13
  def add_javascripts
9
- append_file 'vendor/assets/javascripts/spree/frontend/all.js', "//= require solidus_paypal_braintree/frontend\n"
14
+ append_file 'vendor/assets/javascripts/spree/frontend/all.js', "//= require spree/frontend/solidus_paypal_braintree\n" # rubocop:disable Layout/LineLength
10
15
  append_file 'vendor/assets/javascripts/spree/backend/all.js', "//= require spree/backend/solidus_paypal_braintree\n" # rubocop:disable Layout/LineLength
11
16
  end
12
17
 
@@ -16,7 +21,7 @@ module SolidusPaypalBraintree
16
21
  end
17
22
 
18
23
  def add_migrations
19
- run 'bundle exec rake railties:install:migrations FROM=solidus_paypal_braintree'
24
+ run 'bin/rails railties:install:migrations FROM=solidus_paypal_braintree'
20
25
  end
21
26
 
22
27
  def mount_engine
@@ -28,9 +33,9 @@ module SolidusPaypalBraintree
28
33
  def run_migrations
29
34
  run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask('Would you like to run the migrations now? [Y/n]')) # rubocop:disable Layout/LineLength
30
35
  if run_migrations
31
- run 'bundle exec rake db:migrate'
36
+ run 'bin/rails db:migrate'
32
37
  else
33
- say_status :skipping, 'rake db:migrate, don\'t forget to run it!'
38
+ puts 'Skipping bin/rails db:migrate, don\'t forget to run it!' # rubocop:disable Rails/Output
34
39
  end
35
40
  end
36
41
  end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ SolidusPaypalBraintree.configure do |config|
4
+ # TODO: Remember to change this with the actual preferences you have implemented!
5
+ # config.sample_preference = 'sample_value'
6
+ end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'solidus_core'
3
4
  require 'solidus_support'
4
5
 
5
6
  module SolidusPaypalBraintree
@@ -13,11 +14,6 @@ module SolidusPaypalBraintree
13
14
  inflect.acronym 'AVS'
14
15
  end
15
16
 
16
- # use rspec for tests
17
- config.generators do |g|
18
- g.test_framework :rspec
19
- end
20
-
21
17
  initializer "register_solidus_paypal_braintree_gateway", after: "spree.register.payment_methods" do |app|
22
18
  config.to_prepare do
23
19
  app.config.spree.payment_methods << SolidusPaypalBraintree::Gateway
@@ -64,5 +60,10 @@ module SolidusPaypalBraintree
64
60
  end
65
61
  end
66
62
  end
63
+
64
+ # use rspec for tests
65
+ config.generators do |g|
66
+ g.test_framework :rspec
67
+ end
67
68
  end
68
69
  end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusPaypalBraintree
4
+ # Deviating from the usual `Configuration` name proposed by
5
+ # `solidus_dev_support` because it's already taken by a model.
6
+ class ExtensionConfiguration
7
+ # Define here the settings for this extension, e.g.:
8
+ #
9
+ # attr_accessor :my_setting
10
+ end
11
+
12
+ class << self
13
+ def configuration
14
+ @configuration ||= ExtensionConfiguration.new
15
+ end
16
+
17
+ alias config configuration
18
+
19
+ def configure
20
+ yield configuration
21
+ end
22
+ end
23
+ end
@@ -6,7 +6,7 @@ module SolidusPaypalBraintree
6
6
  module RequestProtection
7
7
  include ActiveMerchant::NetworkConnectionRetries
8
8
 
9
- def protected_request
9
+ def protected_request(&block)
10
10
  raise ArgumentError unless block_given?
11
11
 
12
12
  options = {
@@ -15,7 +15,7 @@ module SolidusPaypalBraintree
15
15
  },
16
16
  logger: Rails.logger
17
17
  }
18
- retry_exceptions(options) { yield }
18
+ retry_exceptions(options, &block)
19
19
  end
20
20
  end
21
21
  end