solidus_core 3.0.0 → 4.5.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 (444) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -2
  3. data/Rakefile +7 -2
  4. data/app/assets/images/logo/solidus.svg +18 -1
  5. data/app/assets/images/logo/solidus_logo.png +0 -0
  6. data/app/controllers/spree/base_controller.rb +1 -3
  7. data/app/helpers/spree/base_helper.rb +3 -3
  8. data/app/helpers/spree/core/controller_helpers/auth.rb +66 -0
  9. data/app/helpers/spree/core/controller_helpers/common.rb +82 -0
  10. data/app/helpers/spree/core/controller_helpers/order.rb +86 -0
  11. data/app/helpers/spree/core/controller_helpers/payment_parameters.rb +165 -0
  12. data/{lib/spree/core/controller_helpers/current_host.rb → app/helpers/spree/core/controller_helpers/pricing.rb} +6 -4
  13. data/app/helpers/spree/core/controller_helpers/search.rb +16 -0
  14. data/app/helpers/spree/core/controller_helpers/store.rb +19 -0
  15. data/app/helpers/spree/core/controller_helpers/strong_parameters.rb +74 -0
  16. data/app/helpers/spree/products_helper.rb +2 -2
  17. data/app/mailers/spree/base_mailer.rb +1 -1
  18. data/app/mailers/spree/carton_mailer.rb +1 -1
  19. data/app/mailers/spree/order_mailer.rb +3 -3
  20. data/app/mailers/spree/reimbursement_mailer.rb +1 -1
  21. data/app/models/concerns/spree/active_storage_adapter/attachment.rb +30 -11
  22. data/app/models/concerns/spree/active_storage_adapter/normalization.rb +1 -1
  23. data/app/models/concerns/spree/active_storage_adapter.rb +1 -18
  24. data/app/models/concerns/spree/default_price.rb +30 -10
  25. data/app/models/concerns/spree/display_money.rb +1 -1
  26. data/app/models/concerns/spree/metadata.rb +64 -0
  27. data/app/models/concerns/spree/named_type.rb +2 -0
  28. data/app/models/concerns/spree/ordered_property_value_list.rb +2 -2
  29. data/app/models/concerns/spree/ransackable_attributes.rb +9 -5
  30. data/app/models/concerns/spree/user_address_book.rb +19 -10
  31. data/app/models/concerns/spree/user_methods.rb +40 -6
  32. data/app/models/spree/address.rb +11 -9
  33. data/app/models/spree/adjustment.rb +15 -76
  34. data/app/models/spree/adjustment_reason.rb +2 -0
  35. data/app/models/spree/calculator/flat_fee.rb +21 -0
  36. data/app/models/spree/calculator/returns/default_refund_amount.rb +1 -1
  37. data/app/models/spree/carton.rb +3 -3
  38. data/app/models/spree/core/state_machines/inventory_unit.rb +42 -0
  39. data/app/models/spree/core/state_machines/order/class_methods.rb +217 -0
  40. data/app/models/spree/core/state_machines/order.rb +42 -0
  41. data/app/models/spree/core/state_machines/payment.rb +61 -0
  42. data/app/models/spree/core/state_machines/reimbursement.rb +33 -0
  43. data/app/models/spree/core/state_machines/return_authorization.rb +32 -0
  44. data/app/models/spree/core/state_machines/return_item/acceptance_status.rb +51 -0
  45. data/app/models/spree/core/state_machines/return_item/reception_status.rb +42 -0
  46. data/app/models/spree/core/state_machines/shipment.rb +58 -0
  47. data/app/models/spree/country.rb +1 -1
  48. data/app/models/spree/credit_card.rb +13 -10
  49. data/app/models/spree/customer_return.rb +6 -3
  50. data/app/models/spree/deprecated_configurable_class.rb +40 -0
  51. data/app/models/spree/fulfilment_changer.rb +56 -29
  52. data/app/models/spree/image/active_storage_attachment.rb +2 -7
  53. data/app/models/spree/image/paperclip_attachment.rb +2 -2
  54. data/app/models/spree/inventory_unit.rb +2 -2
  55. data/app/models/spree/item_total.rb +28 -0
  56. data/app/models/spree/legacy_user.rb +1 -0
  57. data/app/models/spree/line_item.rb +26 -8
  58. data/app/models/spree/log_entry.rb +98 -1
  59. data/app/models/spree/money.rb +120 -0
  60. data/app/models/spree/null_promotion_adjuster.rb +13 -0
  61. data/app/models/spree/null_promotion_advertiser.rb +9 -0
  62. data/app/models/spree/null_promotion_finder.rb +9 -0
  63. data/app/models/spree/null_promotion_handler.rb +44 -0
  64. data/app/models/spree/option_type.rb +1 -1
  65. data/app/models/spree/option_value.rb +4 -3
  66. data/app/models/spree/order/number_generator.rb +7 -1
  67. data/app/models/spree/order.rb +143 -96
  68. data/app/models/spree/order_cancellations.rb +8 -8
  69. data/app/models/spree/order_inventory.rb +7 -5
  70. data/app/models/spree/order_merger.rb +5 -7
  71. data/app/models/spree/order_mutex.rb +2 -2
  72. data/app/models/spree/order_shipping.rb +15 -19
  73. data/app/models/spree/order_taxation.rb +7 -4
  74. data/app/models/spree/order_update_attributes.rb +3 -1
  75. data/app/models/spree/order_updater.rb +25 -63
  76. data/app/models/spree/payment/processing.rb +60 -57
  77. data/app/models/spree/payment.rb +14 -27
  78. data/app/models/spree/payment_create.rb +1 -1
  79. data/app/models/spree/payment_method/bogus_credit_card.rb +18 -14
  80. data/app/models/spree/payment_method/credit_card.rb +0 -4
  81. data/app/models/spree/payment_method/simple_bogus_credit_card.rb +18 -4
  82. data/app/models/spree/payment_method/store_credit.rb +1 -1
  83. data/app/models/spree/payment_method.rb +29 -10
  84. data/app/models/spree/payment_source.rb +5 -1
  85. data/app/models/spree/permission_set.rb +11 -0
  86. data/app/models/spree/permission_sets/base.rb +45 -0
  87. data/app/models/spree/permission_sets/configuration_display.rb +53 -0
  88. data/app/models/spree/permission_sets/configuration_management.rb +52 -0
  89. data/app/models/spree/permission_sets/dashboard_display.rb +28 -0
  90. data/app/models/spree/permission_sets/default_customer.rb +83 -0
  91. data/app/models/spree/permission_sets/order_display.rb +50 -0
  92. data/app/models/spree/permission_sets/order_management.rb +50 -0
  93. data/app/models/spree/permission_sets/product_display.rb +43 -0
  94. data/app/models/spree/permission_sets/product_management.rb +47 -0
  95. data/app/models/spree/permission_sets/restricted_stock_display.rb +33 -0
  96. data/app/models/spree/permission_sets/restricted_stock_management.rb +33 -0
  97. data/app/models/spree/permission_sets/stock_display.rb +26 -0
  98. data/app/models/spree/permission_sets/stock_management.rb +26 -0
  99. data/app/models/spree/permission_sets/super_user.rb +26 -0
  100. data/app/models/spree/permission_sets/user_display.rb +27 -0
  101. data/app/models/spree/permission_sets/user_management.rb +44 -0
  102. data/app/models/spree/preference.rb +1 -1
  103. data/app/models/spree/price.rb +3 -3
  104. data/app/models/spree/product/scopes.rb +23 -10
  105. data/app/models/spree/product.rb +30 -23
  106. data/app/models/spree/product_property.rb +1 -1
  107. data/app/models/spree/property.rb +1 -1
  108. data/app/models/spree/refund.rb +13 -3
  109. data/app/models/spree/refund_reason.rb +6 -1
  110. data/app/models/spree/reimbursement.rb +6 -6
  111. data/app/models/spree/reimbursement_performer.rb +3 -3
  112. data/app/models/spree/reimbursement_tax_calculator.rb +3 -3
  113. data/app/models/spree/reimbursement_type/credit.rb +1 -1
  114. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +6 -6
  115. data/app/models/spree/reimbursement_type/store_credit.rb +1 -1
  116. data/app/models/spree/reimbursement_type.rb +6 -1
  117. data/app/models/spree/return_authorization.rb +3 -1
  118. data/app/models/spree/return_item.rb +13 -15
  119. data/app/models/spree/return_reason.rb +6 -1
  120. data/app/models/spree/role.rb +3 -1
  121. data/app/models/spree/role_permission.rb +8 -0
  122. data/app/models/spree/shipment.rb +12 -10
  123. data/app/models/spree/shipping_category.rb +2 -0
  124. data/app/models/spree/shipping_rate.rb +2 -3
  125. data/app/models/spree/shipping_rate_tax.rb +1 -1
  126. data/app/models/spree/{order_contents.rb → simple_order_contents.rb} +10 -13
  127. data/app/models/spree/state.rb +1 -1
  128. data/app/models/spree/stock/allocator/on_hand_first.rb +2 -2
  129. data/app/models/spree/stock/availability.rb +11 -3
  130. data/app/models/spree/stock/estimator.rb +1 -1
  131. data/app/models/spree/stock/inventory_unit_builder.rb +1 -1
  132. data/app/models/spree/stock/package.rb +2 -2
  133. data/app/models/spree/stock/quantifier.rb +12 -8
  134. data/app/models/spree/stock/simple_coordinator.rb +38 -28
  135. data/app/models/spree/stock/splitter/shipping_category.rb +1 -1
  136. data/app/models/spree/stock_item.rb +2 -1
  137. data/app/models/spree/stock_location.rb +7 -7
  138. data/app/models/spree/stock_movement.rb +2 -2
  139. data/app/models/spree/store.rb +3 -1
  140. data/app/models/spree/store_credit.rb +31 -16
  141. data/app/models/spree/store_credit_event.rb +4 -3
  142. data/app/models/spree/store_credit_prioritizer.rb +17 -0
  143. data/app/models/spree/store_credit_reason.rb +6 -1
  144. data/app/models/spree/store_selector/by_server_name.rb +1 -1
  145. data/app/models/spree/tax/item_tax.rb +3 -2
  146. data/app/models/spree/tax/order_tax.rb +3 -1
  147. data/app/models/spree/tax/tax_helpers.rb +14 -3
  148. data/app/models/spree/tax/tax_location.rb +4 -7
  149. data/app/models/spree/tax_calculator/default.rb +32 -1
  150. data/app/models/spree/tax_calculator/shipping_rate.rb +2 -2
  151. data/app/models/spree/tax_category.rb +3 -1
  152. data/app/models/spree/tax_rate.rb +14 -1
  153. data/app/models/spree/taxon/active_storage_attachment.rb +2 -2
  154. data/app/models/spree/taxon/paperclip_attachment.rb +4 -4
  155. data/app/models/spree/taxon.rb +25 -3
  156. data/app/models/spree/taxon_brand_selector.rb +22 -0
  157. data/app/models/spree/taxonomy.rb +4 -3
  158. data/app/models/spree/unauthorized_redirect_handler.rb +24 -0
  159. data/app/models/spree/unit_cancel.rb +1 -2
  160. data/app/models/spree/user_address.rb +9 -3
  161. data/app/models/spree/user_last_url_storer/rules/authentication_rule.rb +1 -1
  162. data/app/models/spree/variant/price_selector.rb +25 -8
  163. data/app/models/spree/variant/scopes.rb +4 -0
  164. data/app/models/spree/variant/vat_price_generator.rb +1 -1
  165. data/app/models/spree/variant.rb +64 -37
  166. data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +4 -4
  167. data/app/models/spree/wallet.rb +2 -2
  168. data/app/models/spree/zone.rb +1 -1
  169. data/app/subscribers/spree/order_mailer_subscriber.rb +35 -0
  170. data/app/views/layouts/spree/base_mailer.html.erb +2 -2
  171. data/app/views/spree/order_mailer/cancel_email.html.erb +1 -1
  172. data/app/views/spree/order_mailer/cancel_email.text.erb +1 -1
  173. data/app/views/spree/order_mailer/confirm_email.html.erb +5 -5
  174. data/app/views/spree/order_mailer/confirm_email.text.erb +5 -5
  175. data/app/views/spree/order_mailer/inventory_cancellation_email.html.erb +0 -1
  176. data/config/i18n-tasks.yml +134 -0
  177. data/config/locales/en.yml +439 -338
  178. data/db/default/spree/permission_sets.rb +10 -0
  179. data/db/default/spree/return_reasons.rb +3 -1
  180. data/db/default/spree/states.rb +2 -2
  181. data/db/migrate/20160101010000_solidus_one_four.rb +0 -127
  182. data/db/migrate/20180710170104_create_spree_store_credit_reasons_table.rb +2 -2
  183. data/db/migrate/20201127212108_add_type_before_removal_to_spree_payment_methods.rb +7 -0
  184. data/db/migrate/20210312061050_change_column_null_on_prices.rb +7 -0
  185. data/db/migrate/20210815004823_add_unique_index_to_option_values_variants.rb +16 -0
  186. data/db/migrate/20220419170826_remove_archived_user_addresses.rb +12 -0
  187. data/db/migrate/20220805202442_add_level_to_spree_tax_rates.rb +5 -0
  188. data/db/migrate/20221123152807_add_shipping_category_to_spree_variants.rb +5 -0
  189. data/db/migrate/20230321161854_change_column_null_option_values_option_type_id.rb +5 -0
  190. data/db/migrate/20230425103509_remove_taxon_position.rb +5 -0
  191. data/db/migrate/20230427095534_drop_deprecated_address_id_from_shipments.rb +11 -0
  192. data/db/migrate/20240821173254_create_spree_permission_sets_in_core.rb +9 -0
  193. data/db/migrate/20240821173341_create_spree_roles_permissions_in_core.rb +9 -0
  194. data/db/migrate/20240821173641_add_description_to_spree_roles.rb +5 -0
  195. data/db/migrate/20240904152041_add_privilege_and_category_to_spree_permission_sets.rb +6 -0
  196. data/db/migrate/20250129061658_add_metadata_to_spree_resources.rb +28 -0
  197. data/db/migrate/20250201172950_add_gtin_and_condition_to_spree_variant.rb +6 -0
  198. data/db/migrate/20250207104016_add_primary_taxon_to_products.rb +7 -0
  199. data/db/migrate/20250221152004_add_metadata_to_users.rb +13 -0
  200. data/db/seeds.rb +5 -1
  201. data/lib/generators/solidus/install/app_templates/authentication/custom.rb +16 -0
  202. data/lib/generators/solidus/install/app_templates/authentication/devise.rb +16 -0
  203. data/lib/generators/solidus/install/app_templates/authentication/existing.rb +10 -0
  204. data/lib/generators/solidus/install/app_templates/authentication/none.rb +1 -0
  205. data/lib/generators/solidus/install/app_templates/frontend/none.rb +1 -0
  206. data/lib/generators/solidus/install/app_templates/frontend/starter.rb +1 -0
  207. data/lib/generators/solidus/install/app_templates/payment_method/braintree.rb +5 -0
  208. data/lib/generators/solidus/install/app_templates/payment_method/none.rb +1 -0
  209. data/lib/generators/solidus/install/app_templates/payment_method/paypal.rb +5 -0
  210. data/lib/generators/solidus/install/app_templates/payment_method/stripe.rb +5 -0
  211. data/lib/generators/solidus/install/install_generator.rb +210 -156
  212. data/lib/generators/solidus/install/templates/config/initializers/spree.rb.tt +27 -33
  213. data/lib/generators/solidus/install/templates/vendor/assets/javascripts/spree/backend/all.js +2 -2
  214. data/lib/generators/solidus/update/templates/config/initializers/new_solidus_defaults.rb.tt +30 -0
  215. data/lib/generators/solidus/update/update_generator.rb +124 -0
  216. data/lib/generators/spree/custom_user/custom_user_generator.rb +6 -4
  217. data/lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt +2 -6
  218. data/lib/generators/spree/custom_user/templates/migration.rb.tt +7 -3
  219. data/lib/generators/spree/dummy/dummy_generator.rb +12 -9
  220. data/lib/generators/spree/dummy/templates/rails/application.rb.tt +1 -2
  221. data/lib/generators/spree/dummy/templates/rails/database.yml +48 -63
  222. data/lib/generators/spree/dummy/templates/rails/manifest.js +3 -0
  223. data/lib/generators/spree/dummy/templates/rails/test.rb +7 -2
  224. data/lib/spree/app_configuration.rb +220 -71
  225. data/lib/spree/bus.rb +11 -0
  226. data/lib/spree/core/class_constantizer.rb +2 -2
  227. data/lib/spree/core/controller_helpers/auth.rb +5 -69
  228. data/lib/spree/core/controller_helpers/common.rb +5 -80
  229. data/lib/spree/core/controller_helpers/order.rb +5 -86
  230. data/lib/spree/core/controller_helpers/payment_parameters.rb +5 -165
  231. data/lib/spree/core/controller_helpers/pricing.rb +5 -17
  232. data/lib/spree/core/controller_helpers/search.rb +5 -14
  233. data/lib/spree/core/controller_helpers/store.rb +5 -17
  234. data/lib/spree/core/controller_helpers/strong_parameters.rb +5 -71
  235. data/lib/spree/core/engine.rb +49 -16
  236. data/lib/spree/core/environment/calculators.rb +35 -3
  237. data/lib/spree/core/environment/promotions.rb +25 -4
  238. data/lib/spree/core/environment_extension.rb +16 -2
  239. data/lib/spree/core/importer/order.rb +6 -6
  240. data/lib/spree/core/importer/product.rb +3 -3
  241. data/lib/spree/core/nested_class_set.rb +28 -0
  242. data/lib/spree/core/null_promotion_configuration.rb +84 -0
  243. data/lib/spree/core/product_duplicator.rb +1 -1
  244. data/lib/spree/core/product_filters.rb +2 -2
  245. data/lib/spree/core/search/base.rb +18 -9
  246. data/lib/spree/core/search/variant.rb +2 -2
  247. data/lib/spree/core/state_machines/inventory_unit.rb +5 -40
  248. data/lib/spree/core/state_machines/order.rb +5 -247
  249. data/lib/spree/core/state_machines/payment.rb +5 -59
  250. data/lib/spree/core/state_machines/reimbursement.rb +5 -31
  251. data/lib/spree/core/state_machines/return_authorization.rb +5 -30
  252. data/lib/spree/core/state_machines/return_item/acceptance_status.rb +5 -49
  253. data/lib/spree/core/state_machines/return_item/reception_status.rb +5 -40
  254. data/lib/spree/core/state_machines/shipment.rb +5 -56
  255. data/lib/spree/core/state_machines.rb +48 -81
  256. data/lib/spree/core/stock_configuration.rb +18 -0
  257. data/lib/spree/core/validators/email.rb +2 -4
  258. data/lib/spree/core/version.rb +5 -1
  259. data/lib/spree/core/versioned_value.rb +75 -0
  260. data/lib/spree/core.rb +40 -16
  261. data/lib/spree/deprecated_instance_variable_proxy.rb +57 -0
  262. data/lib/spree/deprecation.rb +3 -51
  263. data/lib/spree/deprecator.rb +9 -0
  264. data/lib/spree/i18n.rb +1 -1
  265. data/lib/spree/mailer_previews/carton_preview.rb +1 -1
  266. data/lib/spree/migration_helpers.rb +3 -3
  267. data/lib/spree/migrations.rb +13 -11
  268. data/lib/spree/money.rb +5 -118
  269. data/lib/spree/permission_sets/base.rb +5 -30
  270. data/lib/spree/permission_sets/configuration_display.rb +5 -23
  271. data/lib/spree/permission_sets/configuration_management.rb +5 -23
  272. data/lib/spree/permission_sets/dashboard_display.rb +5 -9
  273. data/lib/spree/permission_sets/default_customer.rb +5 -35
  274. data/lib/spree/permission_sets/order_display.rb +5 -19
  275. data/lib/spree/permission_sets/order_management.rb +5 -20
  276. data/lib/spree/permission_sets/product_display.rb +5 -17
  277. data/lib/spree/permission_sets/product_management.rb +5 -19
  278. data/lib/spree/permission_sets/restricted_stock_display.rb +5 -16
  279. data/lib/spree/permission_sets/restricted_stock_management.rb +5 -16
  280. data/lib/spree/permission_sets/stock_display.rb +5 -10
  281. data/lib/spree/permission_sets/stock_management.rb +5 -10
  282. data/lib/spree/permission_sets/super_user.rb +5 -9
  283. data/lib/spree/permission_sets/user_display.rb +5 -11
  284. data/lib/spree/permission_sets/user_management.rb +5 -23
  285. data/lib/spree/permission_sets.rb +5 -18
  286. data/lib/spree/permitted_attributes.rb +35 -14
  287. data/lib/spree/preferences/configuration.rb +88 -0
  288. data/lib/spree/preferences/persistable.rb +7 -1
  289. data/lib/spree/preferences/preferable.rb +13 -0
  290. data/lib/spree/preferences/preferable_class_methods.rb +12 -4
  291. data/lib/spree/preferences/preference_differentiator.rb +29 -0
  292. data/lib/spree/preferences/static_model_preferences.rb +25 -10
  293. data/lib/spree/preferences/store.rb +2 -2
  294. data/lib/spree/testing_support/blacklist_urls.rb +1 -1
  295. data/lib/spree/testing_support/bus_helpers.rb +101 -0
  296. data/lib/spree/testing_support/capybara_ext.rb +11 -1
  297. data/lib/spree/testing_support/common_rake.rb +76 -23
  298. data/lib/spree/testing_support/dummy_ability.rb +7 -0
  299. data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/backend/all.js +1 -1
  300. data/lib/spree/testing_support/dummy_app/assets/stylesheets/solidus_admin/tailwind.css +1 -0
  301. data/lib/spree/testing_support/dummy_app/database.yml +39 -28
  302. data/lib/spree/testing_support/dummy_app/migrations.rb +8 -15
  303. data/lib/spree/testing_support/dummy_app/rake_tasks.rb +3 -10
  304. data/lib/spree/testing_support/dummy_app.rb +71 -42
  305. data/lib/spree/testing_support/extension_rake.rb +2 -2
  306. data/lib/spree/testing_support/factories/address_factory.rb +9 -13
  307. data/lib/spree/testing_support/factories/adjustment_factory.rb +1 -13
  308. data/lib/spree/testing_support/factories/adjustment_reason_factory.rb +0 -5
  309. data/lib/spree/testing_support/factories/calculator_factory.rb +4 -10
  310. data/lib/spree/testing_support/factories/carton_factory.rb +2 -10
  311. data/lib/spree/testing_support/factories/country_factory.rb +1 -7
  312. data/lib/spree/testing_support/factories/credit_card_factory.rb +0 -5
  313. data/lib/spree/testing_support/factories/customer_return_factory.rb +2 -11
  314. data/lib/spree/testing_support/factories/image_factory.rb +0 -5
  315. data/lib/spree/testing_support/factories/inventory_unit_factory.rb +4 -14
  316. data/lib/spree/testing_support/factories/line_item_factory.rb +0 -8
  317. data/lib/spree/testing_support/factories/option_type_factory.rb +0 -8
  318. data/lib/spree/testing_support/factories/option_value_factory.rb +0 -5
  319. data/lib/spree/testing_support/factories/order_factory.rb +19 -38
  320. data/lib/spree/testing_support/factories/payment_factory.rb +0 -10
  321. data/lib/spree/testing_support/factories/payment_method_factory.rb +0 -5
  322. data/lib/spree/testing_support/factories/price_factory.rb +0 -7
  323. data/lib/spree/testing_support/factories/product_factory.rb +5 -13
  324. data/lib/spree/testing_support/factories/product_option_type_factory.rb +0 -8
  325. data/lib/spree/testing_support/factories/product_property_factory.rb +0 -8
  326. data/lib/spree/testing_support/factories/property_factory.rb +0 -5
  327. data/lib/spree/testing_support/factories/refund_factory.rb +0 -8
  328. data/lib/spree/testing_support/factories/refund_reason_factory.rb +0 -5
  329. data/lib/spree/testing_support/factories/reimbursement_factory.rb +0 -7
  330. data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +0 -5
  331. data/lib/spree/testing_support/factories/return_authorization_factory.rb +0 -9
  332. data/lib/spree/testing_support/factories/return_item_factory.rb +0 -9
  333. data/lib/spree/testing_support/factories/return_reason_factory.rb +0 -5
  334. data/lib/spree/testing_support/factories/role_factory.rb +0 -5
  335. data/lib/spree/testing_support/factories/shipment_factory.rb +1 -11
  336. data/lib/spree/testing_support/factories/shipping_category_factory.rb +0 -5
  337. data/lib/spree/testing_support/factories/shipping_method_factory.rb +0 -9
  338. data/lib/spree/testing_support/factories/shipping_rate_factory.rb +0 -8
  339. data/lib/spree/testing_support/factories/state_factory.rb +8 -10
  340. data/lib/spree/testing_support/factories/stock_item_factory.rb +5 -9
  341. data/lib/spree/testing_support/factories/stock_location_factory.rb +0 -9
  342. data/lib/spree/testing_support/factories/stock_movement_factory.rb +0 -7
  343. data/lib/spree/testing_support/factories/stock_package_factory.rb +1 -9
  344. data/lib/spree/testing_support/factories/store_credit_category_factory.rb +0 -5
  345. data/lib/spree/testing_support/factories/store_credit_event_factory.rb +0 -8
  346. data/lib/spree/testing_support/factories/store_credit_factory.rb +4 -13
  347. data/lib/spree/testing_support/factories/store_credit_reason_factory.rb +0 -5
  348. data/lib/spree/testing_support/factories/store_credit_type_factory.rb +0 -5
  349. data/lib/spree/testing_support/factories/store_factory.rb +0 -5
  350. data/lib/spree/testing_support/factories/tax_category_factory.rb +0 -8
  351. data/lib/spree/testing_support/factories/tax_rate_factory.rb +0 -9
  352. data/lib/spree/testing_support/factories/taxon_factory.rb +5 -10
  353. data/lib/spree/testing_support/factories/taxonomy_factory.rb +3 -6
  354. data/lib/spree/testing_support/factories/user_factory.rb +6 -9
  355. data/lib/spree/testing_support/factories/variant_factory.rb +0 -10
  356. data/lib/spree/testing_support/factories/variant_property_rule_condition_factory.rb +0 -8
  357. data/lib/spree/testing_support/factories/variant_property_rule_factory.rb +0 -9
  358. data/lib/spree/testing_support/factories/variant_property_rule_value_factory.rb +0 -8
  359. data/lib/spree/testing_support/factories/zone_factory.rb +1 -9
  360. data/lib/spree/testing_support/factory_bot.rb +6 -29
  361. data/lib/spree/testing_support/flaky.rb +22 -0
  362. data/lib/spree/testing_support/order_walkthrough.rb +7 -6
  363. data/lib/spree/testing_support/sequences.rb +0 -5
  364. data/lib/spree/testing_support/shared_examples/calculator.rb +10 -0
  365. data/lib/spree/testing_support/shared_examples/order_factory.rb +141 -0
  366. data/lib/spree/testing_support/shared_examples/working_factory.rb +15 -0
  367. data/lib/spree/testing_support/silence_deprecations.rb +9 -0
  368. data/lib/spree/user_class_handle.rb +2 -2
  369. data/lib/tasks/colorado_delivery_fee.rake +28 -0
  370. data/lib/tasks/payment_method.rake +29 -0
  371. data/lib/tasks/solidus/delete_prices_with_nil_amount.rake +8 -0
  372. data/solidus_core.gemspec +18 -8
  373. metadata +233 -117
  374. data/app/jobs/spree/promotion_code_batch_job.rb +0 -26
  375. data/app/mailers/spree/promotion_code_batch_mailer.rb +0 -15
  376. data/app/models/spree/calculator/distributed_amount.rb +0 -33
  377. data/app/models/spree/calculator/flat_percent_item_total.rb +0 -23
  378. data/app/models/spree/calculator/flexi_rate.rb +0 -22
  379. data/app/models/spree/calculator/percent_on_line_item.rb +0 -13
  380. data/app/models/spree/calculator/tiered_flat_rate.rb +0 -52
  381. data/app/models/spree/calculator/tiered_percent.rb +0 -62
  382. data/app/models/spree/line_item_action.rb +0 -8
  383. data/app/models/spree/order_promotion.rb +0 -27
  384. data/app/models/spree/promotion/actions/create_adjustment.rb +0 -77
  385. data/app/models/spree/promotion/actions/create_item_adjustments.rb +0 -99
  386. data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +0 -139
  387. data/app/models/spree/promotion/actions/free_shipping.rb +0 -58
  388. data/app/models/spree/promotion/rules/first_order.rb +0 -38
  389. data/app/models/spree/promotion/rules/first_repeat_purchase_since.rb +0 -36
  390. data/app/models/spree/promotion/rules/item_total.rb +0 -53
  391. data/app/models/spree/promotion/rules/nth_order.rb +0 -45
  392. data/app/models/spree/promotion/rules/one_use_per_user.rb +0 -25
  393. data/app/models/spree/promotion/rules/option_value.rb +0 -50
  394. data/app/models/spree/promotion/rules/product.rb +0 -74
  395. data/app/models/spree/promotion/rules/store.rb +0 -22
  396. data/app/models/spree/promotion/rules/taxon.rb +0 -87
  397. data/app/models/spree/promotion/rules/user.rb +0 -30
  398. data/app/models/spree/promotion/rules/user_logged_in.rb +0 -20
  399. data/app/models/spree/promotion/rules/user_role.rb +0 -45
  400. data/app/models/spree/promotion.rb +0 -284
  401. data/app/models/spree/promotion_action.rb +0 -43
  402. data/app/models/spree/promotion_category.rb +0 -8
  403. data/app/models/spree/promotion_chooser.rb +0 -34
  404. data/app/models/spree/promotion_code/batch_builder.rb +0 -64
  405. data/app/models/spree/promotion_code.rb +0 -50
  406. data/app/models/spree/promotion_code_batch.rb +0 -27
  407. data/app/models/spree/promotion_handler/cart.rb +0 -55
  408. data/app/models/spree/promotion_handler/coupon.rb +0 -123
  409. data/app/models/spree/promotion_handler/page.rb +0 -26
  410. data/app/models/spree/promotion_handler/shipping.rb +0 -61
  411. data/app/models/spree/promotion_rule.rb +0 -55
  412. data/app/models/spree/promotion_rule_role.rb +0 -8
  413. data/app/models/spree/promotion_rule_store.rb +0 -10
  414. data/app/models/spree/promotion_rule_taxon.rb +0 -8
  415. data/app/models/spree/promotion_rule_user.rb +0 -10
  416. data/app/models/spree/tax/shipping_rate_taxer.rb +0 -24
  417. data/app/subscribers/spree/mailer_subscriber.rb +0 -25
  418. data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_errored.text.erb +0 -2
  419. data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_finished.text.erb +0 -2
  420. data/db/migrate/20161017102621_create_spree_promotion_code_batch.rb +0 -38
  421. data/db/migrate/20180202190713_create_promotion_rule_stores.rb +0 -12
  422. data/db/migrate/20180328172631_add_join_characters_to_promotion_code_batch.rb +0 -11
  423. data/db/migrate/20190106184413_remove_code_from_spree_promotions.rb +0 -42
  424. data/lib/generators/solidus/install/templates/vendor/assets/javascripts/spree/frontend/all.js +0 -10
  425. data/lib/generators/solidus/install/templates/vendor/assets/stylesheets/spree/frontend/all.css +0 -9
  426. data/lib/generators/spree/dummy/templates/rails/script/rails +0 -6
  427. data/lib/solidus/migrations/promotions_with_code_handlers.rb +0 -66
  428. data/lib/spree/event/adapters/active_support_notifications.rb +0 -67
  429. data/lib/spree/event/configuration.rb +0 -25
  430. data/lib/spree/event/subscriber.rb +0 -86
  431. data/lib/spree/event/subscriber_registry.rb +0 -94
  432. data/lib/spree/event.rb +0 -119
  433. data/lib/spree/permission_sets/promotion_display.rb +0 -15
  434. data/lib/spree/permission_sets/promotion_management.rb +0 -15
  435. data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/frontend/all.js +0 -10
  436. data/lib/spree/testing_support/dummy_app/assets/stylesheets/spree/frontend/all.css +0 -9
  437. data/lib/spree/testing_support/dummy_app/views/layouts/application.html.erb +0 -1
  438. data/lib/spree/testing_support/factories/order_promotion_factory.rb +0 -16
  439. data/lib/spree/testing_support/factories/promotion_category_factory.rb +0 -12
  440. data/lib/spree/testing_support/factories/promotion_code_factory.rb +0 -16
  441. data/lib/spree/testing_support/factories/promotion_factory.rb +0 -92
  442. data/lib/spree/testing_support/factories.rb +0 -11
  443. data/lib/spree/testing_support.rb +0 -31
  444. data/lib/tasks/upgrade.rake +0 -15
@@ -1,50 +1,121 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'rails/version'
3
4
  require 'rails/generators'
5
+ require 'rails/generators/app_base'
4
6
 
5
7
  module Solidus
6
8
  # @private
7
- class InstallGenerator < Rails::Generators::Base
9
+ class InstallGenerator < Rails::Generators::AppBase
10
+ argument :app_path, type: :string, default: Rails.root
11
+
8
12
  CORE_MOUNT_ROUTE = "mount Spree::Core::Engine"
9
13
 
10
- PAYMENT_METHODS = {
11
- 'paypal' => 'solidus_paypal_commerce_platform',
12
- 'none' => nil,
13
- }
14
+ FRONTENDS = [
15
+ { name: 'starter', description: 'Generate all necessary controllers and views directly in your Rails app', default: true },
16
+ { name: 'none', description: 'Skip installing a frontend' }
17
+ ]
18
+
19
+ AUTHENTICATIONS = [
20
+ { name: 'devise', description: 'Install and configure the standard `devise` integration', default: true },
21
+ { name: 'existing', description: 'Integrate and configure an existing `devise` setup' },
22
+ { name: 'custom', description: 'A starter configuration for rolling your own authentication system' },
23
+ { name: 'none', description: 'Don\'t add any configuration for authentication' }
24
+ ]
25
+
26
+ PAYMENT_METHODS = [
27
+ { name: 'paypal', description: 'Install `solidus_paypal_commerce_platform`', default: true },
28
+ { name: 'stripe', description: 'Install `solidus_stripe`', default: false },
29
+ { name: 'braintree', description: 'Install `solidus_braintree`', default: false },
30
+ { name: 'none', description: 'Skip installing a payment method', default: false }
31
+ ]
14
32
 
15
33
  class_option :migrate, type: :boolean, default: true, banner: 'Run Solidus migrations'
16
34
  class_option :seed, type: :boolean, default: true, banner: 'Load seed data (migrations must be run)'
17
- class_option :sample, type: :boolean, default: true, banner: 'Load sample data (migrations must be run)'
35
+ class_option :sample, type: :boolean, default: true, banner: 'Load sample data (migrations and seeds must be run)'
18
36
  class_option :active_storage, type: :boolean, default: true, banner: 'Install ActiveStorage as image attachments handler for products and taxons'
37
+ class_option :admin_preview, type: :boolean, default: true, desc: 'Install the admin preview'
38
+ class_option :build_admin_tailwind, type: :boolean, default: true, desc: 'Build and install Solidus Admin Tailwind CSS file and rake tasks'
19
39
  class_option :auto_accept, type: :boolean
20
40
  class_option :user_class, type: :string
21
41
  class_option :admin_email, type: :string
22
42
  class_option :admin_password, type: :string
23
- class_option :lib_name, type: :string, default: 'spree'
24
- class_option :with_authentication, type: :boolean, default: true
25
- class_option :enforce_available_locales, type: :boolean, default: nil
26
- class_option :payment_method,
27
- type: :string,
28
- enum: PAYMENT_METHODS.keys,
29
- default: PAYMENT_METHODS.keys.first,
30
- desc: "Indicates which payment method to install."
31
-
32
- def self.source_paths
33
- paths = superclass.source_paths
34
- paths << File.expand_path('../templates', "../../#{__FILE__}")
35
- paths << File.expand_path('../templates', "../#{__FILE__}")
36
- paths << File.expand_path('templates', __dir__)
37
- paths.flatten
43
+ class_option :mount_point, type: :string, desc: "Indicates where Solidus should be mounted. Defaults to '/'"
44
+
45
+ class_option :frontend, type: :string, enum: FRONTENDS.map { _1[:name] }, default: nil, desc: "Indicates which frontend to install."
46
+ class_option :authentication, type: :string, enum: AUTHENTICATIONS.map { _1[:name] }, default: nil, desc: "Indicates which authentication system to install."
47
+ class_option :payment_method, type: :string, enum: PAYMENT_METHODS.map { _1[:name] }, default: nil, desc: "Indicates which payment method to install."
48
+
49
+ source_root "#{__dir__}/templates"
50
+
51
+ def self.exit_on_failure?
52
+ true
38
53
  end
39
54
 
40
55
  def prepare_options
41
56
  @run_migrations = options[:migrate]
42
- @load_seed_data = options[:seed]
43
- @load_sample_data = options[:sample]
57
+ @load_seed_data = options[:seed] && @run_migrations
58
+ @load_sample_data = options[:sample] && @run_migrations && @load_seed_data
59
+
60
+ @selected_frontend = selected_option_for(
61
+ 'frontend',
62
+ selected: ENV['FRONTEND'] || options[:frontend],
63
+ available_options: FRONTENDS,
64
+ )
65
+
66
+ @selected_authentication = selected_option_for(
67
+ 'authentication',
68
+ selected:
69
+ ('devise' if @selected_frontend == 'starter') ||
70
+ ('devise' if has_gem?('solidus_auth_devise')) ||
71
+ ENV['AUTHENTICATION'] || options[:authentication],
72
+ available_options: AUTHENTICATIONS,
73
+ )
74
+
75
+ @selected_payment_method = selected_option_for(
76
+ 'payment method',
77
+ selected:
78
+ ('paypal' if has_gem?('solidus_paypal_commerce_platform')) ||
79
+ ('stripe' if has_gem?('solidus_stripe')) ||
80
+ ('bolt' if has_gem?('solidus_bolt')) ||
81
+ ENV['PAYMENT_METHOD'] || options[:payment_method],
82
+ available_options: PAYMENT_METHODS,
83
+ )
84
+
85
+ # Silence verbose output (e.g. Rails migrations will rely on this environment variable)
86
+ ENV['VERBOSE'] = 'false'
87
+
88
+ # No reason to check for their presence if we're about to install them
89
+ ENV['SOLIDUS_SKIP_MIGRATIONS_CHECK'] = 'true'
90
+ end
44
91
 
45
- unless @run_migrations
46
- @load_seed_data = false
47
- @load_sample_data = false
92
+ def install_routes
93
+ if Pathname(app_path).join('config', 'routes.rb').read.include? CORE_MOUNT_ROUTE
94
+ say_status :route_exist, CORE_MOUNT_ROUTE, :blue
95
+ else
96
+ say_status :installing, "solidus routes"
97
+ mount_point = options[:mount_point] || ask_with_default(
98
+ desc: 'Where would you like to mount Solidus? (E.g. "/store" or "/shop")',
99
+ default: '/',
100
+ )
101
+
102
+ shell.mute do
103
+ route <<~RUBY
104
+ # This line mounts Solidus's routes at the root of your application.
105
+ #
106
+ # Unless you manually picked only a subset of Solidus components, this will mount routes for:
107
+ # - solidus_backend
108
+ # - solidus_api
109
+ # This means, any requests to URLs such as /admin/products, will go to Spree::Admin::ProductsController.
110
+ #
111
+ # If you are using the Starter Frontend as your frontend, be aware that all the storefront routes are defined
112
+ # separately in this file and are not part of the Solidus::Core::Engine engine.
113
+ #
114
+ # If you would like to change where this engine is mounted, simply change the :at option to something different.
115
+ # We ask that you don't use the :as option here, as Solidus relies on it being the default of "spree"
116
+ #{CORE_MOUNT_ROUTE}, at: '#{mount_point}'
117
+ RUBY
118
+ end
48
119
  end
49
120
  end
50
121
 
@@ -54,45 +125,22 @@ module Solidus
54
125
 
55
126
  def install_file_attachment
56
127
  if options[:active_storage]
57
- say "Installing Active Storage", :green
128
+ say_status :assets, "Active Storage", :green
58
129
  rake 'active_storage:install'
59
130
  else
60
- say "Installing Paperclip", :green
61
- gsub_file 'config/initializers/spree.rb', "ActiveStorageAttachment", "PaperclipAttachment"
131
+ say_status :assets, "Paperclip", :green
132
+ gsub_file 'config/initializers/spree.rb', "::ActiveStorageAttachment", "::PaperclipAttachment"
62
133
  end
63
134
  end
64
135
 
65
- def additional_tweaks
66
- return unless File.exist? 'public/robots.txt'
67
-
68
- append_file "public/robots.txt", <<-ROBOTS.strip_heredoc
69
- User-agent: *
70
- Disallow: /checkout
71
- Disallow: /cart
72
- Disallow: /orders
73
- Disallow: /user
74
- Disallow: /account
75
- Disallow: /api
76
- Disallow: /password
77
- ROBOTS
78
- end
79
-
80
136
  def setup_assets
81
- @lib_name = 'spree'
82
-
83
137
  empty_directory 'app/assets/images'
84
138
 
85
139
  %w{javascripts stylesheets images}.each do |path|
86
- empty_directory "vendor/assets/#{path}/spree/frontend" if defined? Spree::Frontend || Rails.env.test?
87
- empty_directory "vendor/assets/#{path}/spree/backend" if defined? Spree::Backend || Rails.env.test?
140
+ empty_directory "vendor/assets/#{path}/spree/backend" if defined?(Spree::Backend) || Rails.env.test?
88
141
  end
89
142
 
90
- if defined? Spree::Frontend || Rails.env.test?
91
- template "vendor/assets/javascripts/spree/frontend/all.js"
92
- template "vendor/assets/stylesheets/spree/frontend/all.css"
93
- end
94
-
95
- if defined? Spree::Backend || Rails.env.test?
143
+ if defined?(Spree::Backend) || Rails.env.test?
96
144
  template "vendor/assets/javascripts/spree/backend/all.js"
97
145
  template "vendor/assets/stylesheets/spree/backend/all.css"
98
146
  end
@@ -102,73 +150,15 @@ module Solidus
102
150
  empty_directory "app/overrides"
103
151
  end
104
152
 
105
- def configure_application
106
- application <<-RUBY
107
- # Load application's model / class decorators
108
- initializer 'spree.decorators' do |app|
109
- config.to_prepare do
110
- Dir.glob(Rails.root.join('app/**/*_decorator*.rb')) do |path|
111
- require_dependency(path)
112
- end
113
- end
114
- end
115
- RUBY
116
-
117
- if !options[:enforce_available_locales].nil?
118
- application <<-RUBY
119
- # Prevent this deprecation message: https://github.com/svenfuchs/i18n/commit/3b6e56e
120
- I18n.enforce_available_locales = #{options[:enforce_available_locales]}
121
- RUBY
122
- end
123
- end
124
-
125
- def plugin_install_preparation
126
- @plugins_to_be_installed = []
127
- @plugin_generators_to_run = []
128
- end
129
-
130
- def install_auth_plugin
131
- if options[:with_authentication] && (options[:auto_accept] || !no?("
132
- Solidus has a default authentication extension that uses Devise.
133
- You can find more info at https://github.com/solidusio/solidus_auth_devise.
134
-
135
- Would you like to install it? (y/n)"))
136
-
137
- @plugins_to_be_installed << 'solidus_auth_devise'
138
- @plugin_generators_to_run << 'solidus:auth:install'
139
- end
140
- end
141
-
142
- def install_payment_method
143
- name = options[:payment_method]
144
-
145
- unless options[:auto_accept]
146
- available_names = PAYMENT_METHODS.keys
147
-
148
- name = ask("
149
- You can select a payment method to be included in the installation process.
150
- Please select a payment method name:", limited_to: available_names, default: available_names.first)
151
- end
152
-
153
- gem_name = PAYMENT_METHODS.fetch(name)
154
-
155
- if gem_name
156
- @plugins_to_be_installed << gem_name
157
- @plugin_generators_to_run << "#{gem_name}:install"
158
- end
159
- end
160
-
161
153
  def include_seed_data
162
- append_file "db/seeds.rb", <<-RUBY.strip_heredoc
163
-
164
- Spree::Core::Engine.load_seed if defined?(Spree::Core)
165
- Spree::Auth::Engine.load_seed if defined?(Spree::Auth)
154
+ append_file "db/seeds.rb", <<~RUBY
155
+ Spree::Core::Engine.load_seed
166
156
  RUBY
167
157
  end
168
158
 
169
159
  def install_migrations
170
160
  say_status :copying, "migrations"
171
- `rake railties:install:migrations`
161
+ rake 'railties:install:migrations'
172
162
  end
173
163
 
174
164
  def create_database
@@ -176,32 +166,35 @@ module Solidus
176
166
  rake 'db:create'
177
167
  end
178
168
 
179
- def run_bundle_install_if_needed_by_plugins
180
- @plugins_to_be_installed.each do |plugin_name|
181
- gem plugin_name
182
- end
183
-
184
- bundle_cleanly{ run "bundle install" } if @plugins_to_be_installed.any?
185
- run "spring stop" if defined?(Spring)
186
-
187
- @plugin_generators_to_run.each do |plugin_generator_name|
188
- generate "#{plugin_generator_name} --skip_migrations=true"
189
- end
190
- end
191
-
192
169
  def run_migrations
193
170
  if @run_migrations
194
171
  say_status :running, "migrations"
195
172
 
196
- rake 'db:migrate VERBOSE=false'
173
+ rake 'db:migrate'
197
174
  else
198
175
  say_status :skipping, "migrations (don't forget to run rake db:migrate)"
199
176
  end
200
177
  end
201
178
 
179
+ def install_subcomponents
180
+ apply_template_for :authentication, @selected_authentication
181
+ apply_template_for :frontend, @selected_frontend
182
+ apply_template_for :payment_method, @selected_payment_method
183
+ end
184
+
185
+ def install_solidus_admin
186
+ return unless options[:admin_preview]
187
+
188
+ say_status :installing, "SolidusAdmin", :blue
189
+ unless File.read(app_path.join('Gemfile')).include?('solidus_admin')
190
+ bundle_command 'add solidus_admin -v ">= 0.2"'
191
+ end
192
+ generate "solidus_admin:install #{'--tailwind' if options[:build_admin_tailwind]}"
193
+ end
194
+
202
195
  def populate_seed_data
203
196
  if @load_seed_data
204
- say_status :loading, "seed data"
197
+ say_status :loading, "seed data"
205
198
  rake_options = []
206
199
  rake_options << "AUTO_ACCEPT=1" if options[:auto_accept]
207
200
  rake_options << "ADMIN_EMAIL=#{options[:admin_email]}" if options[:admin_email]
@@ -222,43 +215,104 @@ module Solidus
222
215
  end
223
216
  end
224
217
 
225
- def install_routes
226
- routes_file_path = File.join('config', 'routes.rb')
227
- unless File.read(routes_file_path).include? CORE_MOUNT_ROUTE
228
- insert_into_file routes_file_path, after: "Rails.application.routes.draw do\n" do
229
- <<-RUBY
230
- # This line mounts Solidus's routes at the root of your application.
231
- # This means, any requests to URLs such as /products, will go to Spree::ProductsController.
232
- # If you would like to change where this engine is mounted, simply change the :at option to something different.
233
- #
234
- # We ask that you don't use the :as option here, as Solidus relies on it being the default of "spree"
235
- #{CORE_MOUNT_ROUTE}, at: '/'
218
+ def complete
219
+ say_status :complete, "Solidus has been installed successfully. Enjoy!"
220
+ end
236
221
 
237
- RUBY
222
+ private
223
+
224
+ def bundle_command(command, env = {})
225
+ # Make `bundle install` less verbose by skipping the "Using ..." messages
226
+ super(command, env.reverse_merge('BUNDLE_SUPPRESS_INSTALL_USING_MESSAGES' => 'true'))
227
+ ensure
228
+ Bundler.reset_paths!
229
+ end
230
+
231
+ def ask_with_default(desc:, default:)
232
+ if options[:auto_accept]
233
+ say_status :using, "#{default} (default)"
234
+ return default
235
+ end
236
+
237
+ default_label = " (#{set_color :default, :bold}: \"#{default}\")" if default
238
+
239
+ say_status :question, "#{desc}#{default_label}.", :yellow
240
+ answer = ask(set_color("answer:".rjust(13), :blue, :bold)).to_s.downcase.presence
241
+
242
+ case answer
243
+ when nil
244
+ say_status :using, "#{default} (default)"
245
+ default
246
+ else
247
+ say_status :using, answer
248
+ answer
249
+ end
250
+ end
251
+
252
+ def ask_with_description(desc:, limited_to:, default:)
253
+ loop do
254
+ say_status :question, desc, :yellow
255
+ answer = ask(set_color("answer:".rjust(13), :blue, :bold)).to_s.downcase.presence
256
+
257
+ case answer
258
+ when nil
259
+ say_status :using, "#{default} (default)"
260
+ break default
261
+ when *limited_to.map(&:to_s)
262
+ say_status :using, answer
263
+ break answer
264
+ else say_status :error, "Please select a valid answer:", :red
238
265
  end
239
266
  end
267
+ end
268
+
269
+ def apply_template_for(topic, selected)
270
+ template_path = Dir["#{__dir__}/app_templates/#{topic}/*.rb"].find do |path|
271
+ File.basename(path, '.rb') == selected
272
+ end
240
273
 
241
- unless options[:quiet]
242
- puts "*" * 50
243
- puts "We added the following line to your application's config/routes.rb file:"
244
- puts " "
245
- puts " #{CORE_MOUNT_ROUTE}, at: '/'"
274
+ unless template_path
275
+ say_status :warning, "Unknown #{topic}: #{selected.inspect}, attempting to run it with `rails app:template`"
276
+ template_path = selected
246
277
  end
278
+
279
+ say_status :installing, "[#{topic}] #{selected}", :blue
280
+ apply template_path
247
281
  end
248
282
 
249
- def complete
250
- unless options[:quiet]
251
- puts "*" * 50
252
- puts "Solidus has been installed successfully. You're all ready to go!"
253
- puts " "
254
- puts "Enjoy!"
283
+ def with_env(vars)
284
+ original = ENV.to_hash
285
+ vars.each { |k, v| ENV[k] = v }
286
+
287
+ begin
288
+ yield
289
+ ensure
290
+ ENV.replace(original)
255
291
  end
256
292
  end
257
293
 
258
- private
294
+ def has_gem?(name)
295
+ Bundler.locked_gems.dependencies[name]
296
+ end
297
+
298
+ def selected_option_for(name, selected:, available_options:)
299
+ return selected if selected
300
+
301
+ option_description = ->(name:, description:, default: false, **) do
302
+ default_label = " (#{set_color :default, :bold})" if default
303
+
304
+ "- [#{set_color name, :bold}] #{description}#{default_label}."
305
+ end
259
306
 
260
- def bundle_cleanly(&block)
261
- Bundler.respond_to?(:with_unbundled_env) ? Bundler.with_unbundled_env(&block) : Bundler.with_clean_env(&block)
307
+ default = available_options.find { _1[:default] }
308
+ (options[:auto_accept] && default[:name]) || ask_with_description(
309
+ default: default[:name],
310
+ limited_to: available_options.map { _1[:name] },
311
+ desc: <<~TEXT
312
+ Which #{name} would you like to use?
313
+ #{available_options.map { option_description[**_1] }.join("\n")}
314
+ TEXT
315
+ )
262
316
  end
263
317
  end
264
318
  end
@@ -1,15 +1,14 @@
1
1
  # Configure Solidus Preferences
2
2
  # See http://docs.solidus.io/Spree/AppConfiguration.html for details
3
3
 
4
+ # Solidus version defaults for preferences that are not overridden
5
+ Spree.load_defaults '<%= Spree.solidus_version %>'
6
+
4
7
  Spree.config do |config|
5
8
  # Core:
6
-
7
9
  # Default currency for new sites
8
10
  config.currency = "USD"
9
11
 
10
- # from address for transactional emails
11
- config.mails_from = "store@example.com"
12
-
13
12
  # Uncomment to stop tracking inventory levels in the application
14
13
  # config.track_inventory_levels = false
15
14
 
@@ -29,43 +28,27 @@ Spree.config do |config|
29
28
  # to a custom users role:
30
29
  # config.roles.assign_permissions :role_name, ['Spree::PermissionSets::CustomPermissionSet']
31
30
 
32
-
33
- # Frontend:
34
-
35
- # Custom logo for the frontend
36
- # config.logo = "logo/solidus.svg"
37
-
38
- # Template to use when rendering layout
39
- # config.layout = "spree/layouts/spree_application"
40
-
41
-
42
31
  # Admin:
43
32
 
44
33
  # Custom logo for the admin
45
34
  # config.admin_interface_logo = "logo/solidus.svg"
46
35
 
47
- # Gateway credentials can be configured statically here and referenced from
36
+ # Payment gateway credentials can be configured statically here and referenced from
48
37
  # the admin. They can also be fully configured from the admin.
49
38
  #
50
- # Please note that you need to use the solidus_stripe gem to have
51
- # Stripe working: https://github.com/solidusio-contrib/solidus_stripe
39
+ # Please note that the example below requires the `solidus_stripe` ~> 5.0 gem
40
+ # in order to work properly (see https://github.com/solidusio-contrib/solidus_stripe).
52
41
  #
53
42
  # config.static_model_preferences.add(
54
- # Spree::PaymentMethod::StripeCreditCard,
55
- # 'stripe_env_credentials',
56
- # secret_key: ENV['STRIPE_SECRET_KEY'],
57
- # publishable_key: ENV['STRIPE_PUBLISHABLE_KEY'],
58
- # server: Rails.env.production? ? 'production' : 'test',
59
- # test_mode: !Rails.env.production?
43
+ # 'SolidusStripe::PaymentMethod',
44
+ # 'solidus_stripe_env_credentials',
45
+ # api_key: ENV.fetch('SOLIDUS_STRIPE_API_KEY'),
46
+ # publishable_key: ENV.fetch('SOLIDUS_STRIPE_PUBLISHABLE_KEY'),
47
+ # test_mode: ENV.fetch('SOLIDUS_STRIPE_API_KEY').start_with?('sk_test_'),
48
+ # webhook_endpoint_signing_secret: ENV.fetch('SOLIDUS_STRIPE_WEBHOOK_SIGNING_SECRET')
60
49
  # )
61
50
  end
62
51
 
63
- <% if defined?(Spree::Frontend::Engine) -%>
64
- Spree::Frontend::Config.configure do |config|
65
- config.locale = 'en'
66
- end
67
- <% end -%>
68
-
69
52
  <% if defined?(Spree::Backend::Engine) -%>
70
53
  Spree::Backend::Config.configure do |config|
71
54
  config.locale = 'en'
@@ -74,10 +57,19 @@ Spree::Backend::Config.configure do |config|
74
57
  # a new menu item:
75
58
  #
76
59
  # config.menu_items << config.class::MenuItem.new(
77
- # [:section],
78
- # 'icon-name',
79
- # url: 'https://solidus.io/'
60
+ # label: :my_reports,
61
+ # icon: 'file-text-o', # see https://fontawesome.com/v4/icons/
62
+ # url: :my_admin_reports_path,
63
+ # condition: -> { can?(:admin, MyReports) },
64
+ # partial: 'spree/admin/shared/my_reports_sub_menu',
65
+ # match_path: '/reports',
80
66
  # )
67
+
68
+ # Custom frontend product path
69
+ #
70
+ # config.frontend_product_path = ->(template_context, product) {
71
+ # template_context.spree.product_path(product)
72
+ # }
81
73
  end
82
74
  <% end -%>
83
75
 
@@ -87,7 +79,9 @@ Spree::Api::Config.configure do |config|
87
79
  end
88
80
  <% end -%>
89
81
 
90
- Spree.user_class = <%= (options[:user_class].blank? ? "Spree::LegacyUser" : options[:user_class]).inspect %>
82
+ <% if options[:user_class].present? -%>
83
+ Spree.user_class = <%= options[:user_class].inspect %>
84
+ <% end -%>
91
85
 
92
86
  # Rules for avoiding to store the current path into session for redirects
93
87
  # When at least one rule is matched, the request path will not be stored
@@ -1,10 +1,10 @@
1
1
  // This is a manifest file that'll be compiled into including all the files listed below.
2
- // Add new JavaScript/Coffee code in separate files in this directory and they'll automatically
2
+ // Add new JavaScript code in separate files in this directory and they'll automatically
3
3
  // be included in the compiled file accessible from http://example.com/assets/application.js
4
4
  // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
5
5
  // the compiled file.
6
6
  //
7
- //= require jquery
7
+ //= require jquery3
8
8
  //= require rails-ujs
9
9
  //= require spree/backend
10
10
  //= require_tree .
@@ -0,0 +1,30 @@
1
+ # This initializer lets you preview the defaults that have changed on the new
2
+ # Solidus version.
3
+ #
4
+ # It allows you to enable them one by one while you adapt your application.
5
+ # When you're done with all of them, you can safely remove this file and add
6
+ # the updated `load_defaults` calls to the top of the config blocks in your
7
+ # Solidus main initializer. You can also call `Spree.load_defaults(version)` to
8
+ # target all components at once.
9
+
10
+ Spree.config do |config|
11
+ <%= @core_changes %>
12
+ end
13
+
14
+ <% if defined?(Spree::Frontend::Engine) -%>
15
+ Spree::Frontend::Config.configure do |config|
16
+ <%= @frontend_changes %>
17
+ end
18
+ <% end -%>
19
+
20
+ <% if defined?(Spree::Backend::Engine) -%>
21
+ Spree::Backend::Config.configure do |config|
22
+ <%= @backend_changes %>
23
+ end
24
+ <% end -%>
25
+
26
+ <% if defined?(Spree::Api::Engine) -%>
27
+ Spree::Api::Config.configure do |config|
28
+ <%= @api_changes %>
29
+ end
30
+ <% end -%>