spree_core 4.10.1 → 5.0.0.rc1

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 (476) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/config/spree_core_manifest.js +4 -0
  3. data/app/assets/images/google_on_white_hdpi.png +0 -0
  4. data/app/controllers/spree/base_controller.rb +1 -4
  5. data/app/finders/spree/orders/find_complete.rb +14 -2
  6. data/app/finders/spree/products/find.rb +74 -23
  7. data/app/finders/spree/stores/find_current.rb +6 -2
  8. data/app/helpers/spree/addresses_helper.rb +106 -0
  9. data/app/helpers/spree/base_helper.rb +83 -55
  10. data/app/helpers/spree/currency_helper.rb +12 -0
  11. data/app/helpers/spree/images_helper.rb +18 -0
  12. data/app/helpers/spree/mail_helper.rb +24 -0
  13. data/app/helpers/spree/products_helper.rb +1 -20
  14. data/app/javascript/spree/core/controllers/address_autocomplete_controller.js +233 -0
  15. data/app/javascript/spree/core/controllers/address_form_controller.js +98 -0
  16. data/app/javascript/spree/core/controllers/enable_button_controller.js +29 -0
  17. data/app/javascript/spree/core/helpers/address_autocomplete/google_places_suggestions_provider.js +179 -0
  18. data/app/javascript/spree/core/helpers/debounce.js +9 -0
  19. data/app/javascript/spree/core/helpers/scroll_lock.js +25 -0
  20. data/app/jobs/spree/addresses/geocode_address_job.rb +31 -0
  21. data/app/jobs/spree/base_job.rb +1 -0
  22. data/app/jobs/spree/coupon_codes/bulk_generate_job.rb +17 -0
  23. data/app/jobs/spree/exports/generate_job.rb +12 -0
  24. data/app/jobs/spree/products/auto_match_taxons_job.rb +14 -0
  25. data/app/jobs/spree/products/touch_taxons_job.rb +12 -0
  26. data/app/jobs/spree/reports/generate_job.rb +12 -0
  27. data/app/jobs/spree/stock_locations/stock_items/create_job.rb +1 -1
  28. data/app/jobs/spree/themes/duplicate_components_job.rb +59 -0
  29. data/app/jobs/spree/themes/screenshot_job.rb +81 -0
  30. data/app/jobs/spree/variants/remove_from_incomplete_orders_job.rb +2 -0
  31. data/app/jobs/spree/variants/remove_line_item_job.rb +2 -0
  32. data/app/mailers/spree/base_mailer.rb +51 -0
  33. data/app/mailers/spree/export_mailer.rb +19 -0
  34. data/app/mailers/spree/report_mailer.rb +20 -0
  35. data/app/mailers/spree/test_mailer.rb +8 -0
  36. data/app/models/action_text/rich_text_decorator.rb +11 -0
  37. data/app/models/action_text/video_embed.rb +13 -0
  38. data/app/models/acts_as_taggable_on/tag_decorator.rb +10 -0
  39. data/app/models/concerns/spree/calculated_adjustments.rb +2 -0
  40. data/app/models/concerns/spree/display_on.rb +13 -0
  41. data/app/models/concerns/spree/has_one_link.rb +42 -0
  42. data/app/models/concerns/spree/has_page_links.rb +53 -0
  43. data/app/models/concerns/spree/metadata.rb +3 -7
  44. data/app/models/concerns/spree/multi_searchable.rb +21 -0
  45. data/app/models/concerns/spree/multi_store_resource.rb +9 -0
  46. data/app/models/concerns/spree/number_as_param.rb +4 -2
  47. data/app/models/concerns/spree/parameterizable_name.rb +21 -0
  48. data/app/models/concerns/spree/previewable.rb +17 -0
  49. data/app/models/concerns/spree/product_scopes.rb +7 -7
  50. data/app/models/concerns/spree/stores/setup.rb +52 -0
  51. data/app/models/concerns/spree/stores/socials.rb +68 -0
  52. data/app/models/concerns/spree/user_address.rb +4 -0
  53. data/app/models/concerns/spree/user_methods.rb +61 -11
  54. data/app/models/concerns/spree/user_reporting.rb +14 -6
  55. data/app/models/concerns/spree/user_roles.rb +1 -1
  56. data/app/models/spree/ability.rb +4 -2
  57. data/app/models/spree/address.rb +122 -28
  58. data/app/models/spree/adjustment.rb +4 -1
  59. data/app/models/spree/asset/support/active_storage.rb +1 -1
  60. data/app/models/spree/asset.rb +18 -6
  61. data/app/models/spree/base.rb +38 -7
  62. data/app/models/spree/base_analytics_event_handler.rb +49 -0
  63. data/app/models/spree/calculator.rb +1 -1
  64. data/app/models/spree/classification.rb +10 -1
  65. data/app/models/spree/country.rb +1 -1
  66. data/app/models/spree/coupon_code.rb +38 -0
  67. data/app/models/spree/credit_card.rb +4 -3
  68. data/app/models/spree/current.rb +9 -0
  69. data/app/models/spree/custom_domain.rb +53 -0
  70. data/app/models/spree/customer_return.rb +13 -1
  71. data/app/models/spree/data_feed.rb +1 -1
  72. data/app/models/spree/digital.rb +5 -6
  73. data/app/models/spree/digital_link.rb +11 -6
  74. data/app/models/spree/export.rb +172 -0
  75. data/app/models/spree/exports/orders.rb +23 -0
  76. data/app/models/spree/exports/products.rb +35 -0
  77. data/app/models/spree/gateway/bogus.rb +5 -0
  78. data/app/models/spree/gateway.rb +14 -4
  79. data/app/models/spree/gateway_customer.rb +13 -0
  80. data/app/models/spree/image/configuration/active_storage.rb +1 -1
  81. data/app/models/spree/inventory_unit.rb +1 -1
  82. data/app/models/spree/legacy_user.rb +3 -1
  83. data/app/models/spree/line_item.rb +37 -2
  84. data/app/models/spree/log_entry.rb +1 -1
  85. data/app/models/spree/option_type.rb +40 -6
  86. data/app/models/spree/option_type_prototype.rb +1 -1
  87. data/app/models/spree/option_value.rb +35 -5
  88. data/app/models/spree/option_value_variant.rb +2 -2
  89. data/app/models/spree/order/address_book.rb +34 -15
  90. data/app/models/spree/order/checkout.rb +12 -2
  91. data/app/models/spree/order/currency_updater.rb +1 -1
  92. data/app/models/spree/order/digital.rb +14 -3
  93. data/app/models/spree/order/emails.rb +1 -1
  94. data/app/models/spree/order/payments.rb +1 -13
  95. data/app/models/spree/order/store_credit.rb +17 -5
  96. data/app/models/spree/order/webhooks.rb +1 -1
  97. data/app/models/spree/order.rb +179 -49
  98. data/app/models/spree/order_promotion.rb +1 -1
  99. data/app/models/spree/order_updater.rb +9 -3
  100. data/app/models/spree/page.rb +184 -0
  101. data/app/models/spree/page_block.rb +69 -0
  102. data/app/models/spree/page_blocks/buttons.rb +29 -0
  103. data/app/models/spree/page_blocks/heading.rb +18 -0
  104. data/app/models/spree/page_blocks/image.rb +17 -0
  105. data/app/models/spree/page_blocks/link.rb +21 -0
  106. data/app/models/spree/page_blocks/mega_nav.rb +33 -0
  107. data/app/models/spree/page_blocks/mega_nav_with_subcategories.rb +32 -0
  108. data/app/models/spree/page_blocks/nav.rb +15 -0
  109. data/app/models/spree/page_blocks/newsletter_form.rb +18 -0
  110. data/app/models/spree/page_blocks/products/buy_buttons.rb +12 -0
  111. data/app/models/spree/page_blocks/products/price.rb +18 -0
  112. data/app/models/spree/page_blocks/products/quantity_selector.rb +12 -0
  113. data/app/models/spree/page_blocks/products/share.rb +8 -0
  114. data/app/models/spree/page_blocks/products/title.rb +15 -0
  115. data/app/models/spree/page_blocks/products/variant_picker.rb +9 -0
  116. data/app/models/spree/page_blocks/subheading.rb +17 -0
  117. data/app/models/spree/page_blocks/text.rb +16 -0
  118. data/app/models/spree/page_link.rb +59 -0
  119. data/app/models/spree/page_section.rb +215 -0
  120. data/app/models/spree/page_sections/announcement_bar.rb +30 -0
  121. data/app/models/spree/page_sections/collection_banner.rb +18 -0
  122. data/app/models/spree/page_sections/custom_code.rb +11 -0
  123. data/app/models/spree/page_sections/featured_posts.rb +43 -0
  124. data/app/models/spree/page_sections/featured_product.rb +46 -0
  125. data/app/models/spree/page_sections/featured_taxon.rb +88 -0
  126. data/app/models/spree/page_sections/featured_taxons.rb +45 -0
  127. data/app/models/spree/page_sections/footer.rb +94 -0
  128. data/app/models/spree/page_sections/header.rb +62 -0
  129. data/app/models/spree/page_sections/image_banner.rb +38 -0
  130. data/app/models/spree/page_sections/image_with_text.rb +48 -0
  131. data/app/models/spree/page_sections/main_password_footer.rb +18 -0
  132. data/app/models/spree/page_sections/main_password_header.rb +20 -0
  133. data/app/models/spree/page_sections/newsletter.rb +47 -0
  134. data/app/models/spree/page_sections/page_title.rb +19 -0
  135. data/app/models/spree/page_sections/post_details.rb +19 -0
  136. data/app/models/spree/page_sections/post_grid.rb +19 -0
  137. data/app/models/spree/page_sections/product_details.rb +16 -0
  138. data/app/models/spree/page_sections/product_grid.rb +13 -0
  139. data/app/models/spree/page_sections/related_products.rb +60 -0
  140. data/app/models/spree/page_sections/rich_text.rb +20 -0
  141. data/app/models/spree/page_sections/taxon_banner.rb +18 -0
  142. data/app/models/spree/page_sections/taxon_grid.rb +17 -0
  143. data/app/models/spree/page_sections/video.rb +99 -0
  144. data/app/models/spree/pages/account.rb +15 -0
  145. data/app/models/spree/pages/cart.rb +9 -0
  146. data/app/models/spree/pages/checkout.rb +9 -0
  147. data/app/models/spree/pages/custom.rb +34 -0
  148. data/app/models/spree/pages/homepage.rb +68 -0
  149. data/app/models/spree/pages/login.rb +15 -0
  150. data/app/models/spree/pages/password.rb +57 -0
  151. data/app/models/spree/pages/post.rb +27 -0
  152. data/app/models/spree/pages/post_list.rb +32 -0
  153. data/app/models/spree/pages/product_details.rb +29 -0
  154. data/app/models/spree/pages/search_results.rb +43 -0
  155. data/app/models/spree/pages/shop_all.rb +36 -0
  156. data/app/models/spree/pages/taxon.rb +29 -0
  157. data/app/models/spree/pages/taxon_list.rb +41 -0
  158. data/app/models/spree/pages/wishlist.rb +11 -0
  159. data/app/models/spree/payment/gateway_options.rb +13 -15
  160. data/app/models/spree/payment/processing.rb +1 -1
  161. data/app/models/spree/payment/webhooks.rb +1 -1
  162. data/app/models/spree/payment.rb +61 -12
  163. data/app/models/spree/payment_capture_event.rb +1 -1
  164. data/app/models/spree/payment_method/store_credit.rb +9 -1
  165. data/app/models/spree/payment_method.rb +26 -8
  166. data/app/models/spree/payment_source.rb +2 -2
  167. data/app/models/spree/post.rb +108 -0
  168. data/app/models/spree/post_category.rb +33 -0
  169. data/app/models/spree/preference.rb +1 -1
  170. data/app/models/spree/price.rb +10 -3
  171. data/app/models/spree/product/webhooks.rb +1 -1
  172. data/app/models/spree/product.rb +325 -54
  173. data/app/models/spree/product_option_type.rb +1 -1
  174. data/app/models/spree/product_promotion_rule.rb +1 -1
  175. data/app/models/spree/product_property.rb +4 -1
  176. data/app/models/spree/promotion/actions/create_line_items.rb +37 -2
  177. data/app/models/spree/promotion/rules/country.rb +22 -4
  178. data/app/models/spree/promotion/rules/currency.rb +21 -0
  179. data/app/models/spree/promotion/rules/item_total.rb +12 -3
  180. data/app/models/spree/promotion/rules/option_value.rb +5 -20
  181. data/app/models/spree/promotion/rules/product.rb +33 -1
  182. data/app/models/spree/promotion/rules/taxon.rb +31 -0
  183. data/app/models/spree/promotion/rules/user.rb +33 -4
  184. data/app/models/spree/promotion.rb +136 -15
  185. data/app/models/spree/promotion_action.rb +31 -1
  186. data/app/models/spree/promotion_action_line_item.rb +1 -1
  187. data/app/models/spree/promotion_category.rb +1 -1
  188. data/app/models/spree/promotion_handler/cart.rb +1 -1
  189. data/app/models/spree/promotion_handler/coupon.rb +46 -8
  190. data/app/models/spree/promotion_handler/free_shipping.rb +1 -1
  191. data/app/models/spree/promotion_handler/promotion_duplicator.rb +6 -5
  192. data/app/models/spree/promotion_rule.rb +23 -1
  193. data/app/models/spree/promotion_rule_taxon.rb +1 -1
  194. data/app/models/spree/promotion_rule_user.rb +1 -1
  195. data/app/models/spree/property.rb +11 -3
  196. data/app/models/spree/property_prototype.rb +1 -1
  197. data/app/models/spree/prototype.rb +1 -1
  198. data/app/models/spree/prototype_taxon.rb +1 -1
  199. data/app/models/spree/refund.rb +24 -4
  200. data/app/models/spree/refund_reason.rb +12 -2
  201. data/app/models/spree/reimbursement/credit.rb +1 -1
  202. data/app/models/spree/reimbursement/emails.rb +1 -1
  203. data/app/models/spree/reimbursement.rb +5 -3
  204. data/app/models/spree/reimbursement_type.rb +1 -1
  205. data/app/models/spree/report.rb +110 -0
  206. data/app/models/spree/report_line_item.rb +27 -0
  207. data/app/models/spree/report_line_items/products_performance.rb +76 -0
  208. data/app/models/spree/report_line_items/sales_total.rb +49 -0
  209. data/app/models/spree/reports/products_performance.rb +44 -0
  210. data/app/models/spree/reports/sales_total.rb +14 -0
  211. data/app/models/spree/return_authorization.rb +4 -1
  212. data/app/models/spree/return_authorization_reason.rb +1 -1
  213. data/app/models/spree/return_item.rb +2 -1
  214. data/app/models/spree/role.rb +5 -2
  215. data/app/models/spree/role_user.rb +2 -2
  216. data/app/models/spree/shipment/emails.rb +1 -1
  217. data/app/models/spree/shipment/webhooks.rb +1 -1
  218. data/app/models/spree/shipment.rb +14 -4
  219. data/app/models/spree/shipping_category.rb +1 -1
  220. data/app/models/spree/shipping_method.rb +48 -8
  221. data/app/models/spree/shipping_method_category.rb +1 -1
  222. data/app/models/spree/shipping_method_zone.rb +1 -1
  223. data/app/models/spree/shipping_rate.rb +21 -3
  224. data/app/models/spree/state.rb +1 -1
  225. data/app/models/spree/state_change.rb +1 -1
  226. data/app/models/spree/stock_item/webhooks.rb +1 -1
  227. data/app/models/spree/stock_item.rb +9 -6
  228. data/app/models/spree/stock_location.rb +35 -8
  229. data/app/models/spree/stock_movement/webhooks.rb +1 -1
  230. data/app/models/spree/stock_movement.rb +9 -3
  231. data/app/models/spree/stock_transfer.rb +41 -3
  232. data/app/models/spree/store.rb +345 -72
  233. data/app/models/spree/store_credit.rb +12 -4
  234. data/app/models/spree/store_credit_category.rb +1 -1
  235. data/app/models/spree/store_credit_event.rb +21 -1
  236. data/app/models/spree/store_credit_type.rb +1 -1
  237. data/app/models/spree/store_payment_method.rb +1 -1
  238. data/app/models/spree/store_product.rb +1 -1
  239. data/app/models/spree/store_promotion.rb +1 -1
  240. data/app/models/spree/tax_category.rb +15 -1
  241. data/app/models/spree/tax_rate.rb +1 -1
  242. data/app/models/spree/taxon.rb +210 -27
  243. data/app/models/spree/taxon_image/configuration/active_storage.rb +1 -1
  244. data/app/models/spree/taxon_rule.rb +25 -0
  245. data/app/models/spree/taxon_rules/available_on.rb +20 -0
  246. data/app/models/spree/taxon_rules/sale.rb +16 -0
  247. data/app/models/spree/taxon_rules/tag.rb +19 -0
  248. data/app/models/spree/taxonomy.rb +3 -2
  249. data/app/models/spree/theme.rb +200 -0
  250. data/app/models/spree/themes/default.rb +94 -0
  251. data/app/models/spree/variant/webhooks.rb +1 -1
  252. data/app/models/spree/variant.rb +211 -62
  253. data/app/models/spree/wished_item.rb +1 -1
  254. data/app/models/spree/wishlist.rb +1 -1
  255. data/app/models/spree/zone.rb +1 -1
  256. data/app/models/spree/zone_member.rb +1 -1
  257. data/app/presenters/spree/csv/order_line_item_presenter.rb +145 -0
  258. data/app/presenters/spree/csv/product_presenter.rb +63 -0
  259. data/app/presenters/spree/csv/product_variant_presenter.rb +130 -0
  260. data/app/services/spree/addresses/create.rb +31 -6
  261. data/app/services/spree/addresses/helper.rb +7 -4
  262. data/app/services/spree/addresses/update.rb +79 -12
  263. data/app/services/spree/cart/remove_out_of_stock_items.rb +56 -0
  264. data/app/services/spree/checkout/add_store_credit.rb +6 -1
  265. data/app/services/spree/checkout/advance.rb +44 -4
  266. data/app/services/spree/checkout/select_shipping_method.rb +2 -0
  267. data/app/services/spree/coupon_codes/bulk_generate.rb +37 -0
  268. data/app/services/spree/coupon_codes/coupon_codes_handler.rb +34 -0
  269. data/app/services/spree/orders/create_user_account.rb +70 -0
  270. data/app/services/spree/orders/update_contact_information.rb +19 -0
  271. data/app/services/spree/products/auto_match_taxons.rb +64 -0
  272. data/app/services/spree/products/duplicator.rb +121 -0
  273. data/app/services/spree/products/prepare_nested_attributes.rb +169 -0
  274. data/app/services/spree/seeds/admin_user.rb +22 -0
  275. data/app/services/spree/seeds/all.rb +1 -0
  276. data/app/services/spree/seeds/stores.rb +5 -10
  277. data/app/services/spree/seeds/zones.rb +2 -0
  278. data/app/services/spree/tags/bulk_add.rb +38 -0
  279. data/app/services/spree/tags/bulk_remove.rb +24 -0
  280. data/app/services/spree/taxons/add_products.rb +39 -0
  281. data/app/services/spree/taxons/regenerate_products.rb +53 -0
  282. data/app/services/spree/taxons/remove_products.rb +53 -0
  283. data/app/services/spree/taxons/touch_featured_sections.rb +21 -0
  284. data/app/services/spree/themes/duplicator.rb +40 -0
  285. data/app/services/spree/variants/remove_line_items.rb +1 -1
  286. data/app/sorters/spree/classifications/sort.rb +68 -0
  287. data/app/sorters/spree/products/sort.rb +2 -3
  288. data/app/views/action_text/video_embeds/_thumbnail.html.erb +1 -0
  289. data/app/views/action_text/video_embeds/_video_embed.html.erb +3 -0
  290. data/app/views/active_storage/blobs/_blob.html.erb +20 -0
  291. data/app/views/layouts/action_text/contents/_content.html.erb +3 -0
  292. data/app/views/layouts/spree/base_mailer.html.erb +46 -0
  293. data/app/views/spree/addresses/_form.html.erb +58 -0
  294. data/app/views/spree/addresses/_suggestions_box.erb +14 -0
  295. data/app/views/spree/export_mailer/export_done.html.erb +15 -0
  296. data/app/views/spree/report_mailer/report_done.html.erb +15 -0
  297. data/app/views/spree/shared/_base_mailer_footer.html.erb +12 -0
  298. data/app/views/spree/shared/_base_mailer_header.html.erb +6 -0
  299. data/app/views/spree/shared/_base_mailer_stylesheets.html.erb +456 -0
  300. data/app/views/spree/shared/_google_places_api_loader.html.erb +7 -0
  301. data/app/views/spree/shared/_mailer_line_item.html.erb +12 -0
  302. data/app/views/spree/shared/_mailer_logo.html.erb +41 -0
  303. data/app/views/spree/shared/_payment.html.erb +41 -0
  304. data/app/views/spree/test_mailer/test_email.html.erb +40 -0
  305. data/app/views/spree/test_mailer/test_email.text.erb +4 -0
  306. data/config/i18n-tasks.yml +178 -0
  307. data/config/importmap.rb +14 -0
  308. data/config/initializers/acts_as_taggable_on.rb +2 -0
  309. data/config/initializers/inflections.rb +2 -0
  310. data/config/initializers/mobility.rb +4 -0
  311. data/config/initializers/oembed.rb +1 -0
  312. data/config/locales/en.yml +823 -413
  313. data/config/routes.rb +6 -5
  314. data/db/migrate/20210914000000_spree_four_three.rb +0 -79
  315. data/db/migrate/20240913143518_change_default_value_of_spree_option_types_filterable.rb +5 -0
  316. data/db/migrate/20240914153106_add_display_on_to_spree_properties.rb +5 -0
  317. data/db/migrate/20240915144935_add_position_to_spree_properties.rb +6 -0
  318. data/db/migrate/20241004181911_create_spree_coupon_codes.rb +15 -0
  319. data/db/migrate/20241005093437_add_multi_code_to_spree_promotions.rb +14 -0
  320. data/db/migrate/20241014140140_translate_rich_texts.rb +17 -0
  321. data/db/migrate/20241030134309_create_spree_exports.rb +23 -0
  322. data/db/migrate/20241104083457_migrate_spree_promotion_rules_option_value_eligible_values.rb +16 -0
  323. data/db/migrate/20241123110646_add_estimated_transit_fields_to_spree_shipping_methods.rb +6 -0
  324. data/db/migrate/20241127193411_create_spree_taxon_rules.rb +13 -0
  325. data/db/migrate/20241127223627_add_rules_match_policy_and_sort_order_to_spree_taxons.rb +6 -0
  326. data/db/migrate/20241128103947_add_automatic_to_spree_taxons.rb +5 -0
  327. data/db/migrate/20241218183905_add_gateway_customer_profile_id_to_spree_payment_sources.rb +5 -0
  328. data/db/migrate/20250107220432_add_accept_marketing_and_signup_for_an_account_to_spree_orders.rb +6 -0
  329. data/db/migrate/20250110171203_add_quick_checkout_to_spree_addresses.rb +6 -0
  330. data/db/migrate/20250113180019_add_preferences_to_spree_stores.rb +5 -0
  331. data/db/migrate/20250114193857_add_metadata_to_spree_stores.rb +13 -0
  332. data/db/migrate/20250119165904_create_spree_custom_domains.rb +22 -0
  333. data/db/migrate/20250120094216_create_page_builder_models.rb +78 -0
  334. data/db/migrate/20250120152208_add_default_locale_to_action_text_rich_texts.rb +7 -0
  335. data/db/migrate/20250121160028_create_spree_posts_and_spree_post_categories.rb +33 -0
  336. data/db/migrate/20250122113708_add_first_and_last_name_to_spree_admin_class.rb +9 -0
  337. data/db/migrate/20250123135358_add_custom_code_fields_to_spree_store.rb +7 -0
  338. data/db/migrate/20250127083740_add_kind_to_spree_properties.rb +5 -0
  339. data/db/migrate/20250127112758_add_latitude_and_longitude_to_spree_addresses.rb +6 -0
  340. data/db/migrate/20250127151258_add_phone_to_spree_users.rb +5 -0
  341. data/db/migrate/20250204162453_create_spree_reports.rb +13 -0
  342. data/db/migrate/20250207084000_add_accepts_email_marketing_field_to_spree_users_table.rb +6 -0
  343. data/db/migrate/20250217171018_create_action_text_video_embeds.rb +11 -0
  344. data/db/migrate/20250304115943_add_performed_by_to_spree_reimbursements.rb +5 -0
  345. data/db/migrate/20250305121352_remove_page_builder_indices.rb +11 -0
  346. data/db/migrate/20250305121657_remove_spree_posts_indices.rb +7 -0
  347. data/db/migrate/20250311105934_create_spree_gateway_customers.rb +18 -0
  348. data/db/migrate/20250312202705_add_unique_index_on_promotion_rules_associations.rb +75 -0
  349. data/db/migrate/20250313104226_add_user_type_to_spree_role_users.rb +18 -0
  350. data/db/migrate/20250313175830_add_unique_index_on_promotion_action_line_items.rb +29 -0
  351. data/db/migrate/20250314144210_create_spree_taggings_and_spree_tags.rb +38 -0
  352. data/lib/generators/spree/authentication/custom/custom_generator.rb +49 -0
  353. data/lib/generators/spree/authentication/custom/templates/authentication_helpers.rb.tt +50 -0
  354. data/lib/generators/spree/authentication/devise/devise_generator.rb +57 -0
  355. data/lib/generators/spree/authentication/devise/templates/authentication_helpers.rb.tt +50 -0
  356. data/lib/generators/spree/dummy/dummy_generator.rb +1 -1
  357. data/lib/generators/spree/dummy/templates/rails/database.yml +1 -0
  358. data/lib/generators/spree/dummy/templates/rails/test.rb +1 -1
  359. data/lib/generators/spree/install/install_generator.rb +21 -36
  360. data/lib/generators/spree/install/templates/config/initializers/spree.rb +40 -6
  361. data/lib/normalize_string.rb +18 -0
  362. data/lib/spree/analytics.rb +11 -0
  363. data/lib/spree/core/components.rb +1 -1
  364. data/lib/spree/core/configuration.rb +14 -11
  365. data/lib/spree/core/controller_helpers/auth.rb +0 -26
  366. data/lib/spree/core/controller_helpers/order.rb +77 -12
  367. data/lib/spree/core/controller_helpers/search.rb +2 -0
  368. data/lib/spree/core/controller_helpers/store.rb +0 -5
  369. data/lib/spree/core/controller_helpers/strong_parameters.rb +4 -0
  370. data/lib/spree/core/controller_helpers/turbo.rb +19 -0
  371. data/lib/spree/core/dependencies.rb +3 -5
  372. data/lib/spree/core/engine.rb +158 -7
  373. data/lib/spree/core/preferences/configuration.rb +2 -44
  374. data/lib/spree/core/preferences/preferable.rb +9 -0
  375. data/lib/spree/core/preferences/preferable_class_methods.rb +11 -1
  376. data/lib/spree/core/preferences/runtime_configuration.rb +13 -2
  377. data/lib/spree/core/search/base.rb +2 -0
  378. data/lib/spree/core/version.rb +1 -1
  379. data/lib/spree/core.rb +61 -11
  380. data/lib/spree/i18n.rb +5 -8
  381. data/lib/spree/migrations.rb +1 -1
  382. data/lib/spree/permitted_attributes.rb +24 -15
  383. data/lib/spree/testing_support/authorization_helpers.rb +9 -6
  384. data/lib/spree/testing_support/capybara_config.rb +11 -0
  385. data/lib/spree/testing_support/common_rake.rb +20 -12
  386. data/lib/spree/testing_support/factories/calculator_factory.rb +16 -0
  387. data/lib/spree/testing_support/factories/country_factory.rb +8 -0
  388. data/lib/spree/testing_support/factories/coupon_code_factory.rb +7 -0
  389. data/lib/spree/testing_support/factories/custom_domain_factory.rb +7 -0
  390. data/lib/spree/testing_support/factories/export_factory.rb +32 -0
  391. data/lib/spree/testing_support/factories/gateway_customer_factory.rb +7 -0
  392. data/lib/spree/testing_support/factories/order_factory.rb +14 -3
  393. data/lib/spree/testing_support/factories/page_block_factory.rb +21 -0
  394. data/lib/spree/testing_support/factories/page_factory.rb +33 -0
  395. data/lib/spree/testing_support/factories/page_link_factory.rb +7 -0
  396. data/lib/spree/testing_support/factories/page_section_factory.rb +24 -0
  397. data/lib/spree/testing_support/factories/payment_factory.rb +2 -2
  398. data/lib/spree/testing_support/factories/post_category_factory.rb +7 -0
  399. data/lib/spree/testing_support/factories/post_factory.rb +10 -0
  400. data/lib/spree/testing_support/factories/product_factory.rb +3 -8
  401. data/lib/spree/testing_support/factories/product_property_factory.rb +1 -1
  402. data/lib/spree/testing_support/factories/promotion_action_factory.rb +5 -0
  403. data/lib/spree/testing_support/factories/promotion_factory.rb +7 -9
  404. data/lib/spree/testing_support/factories/promotion_rule_factory.rb +12 -0
  405. data/lib/spree/testing_support/factories/property_factory.rb +1 -1
  406. data/lib/spree/testing_support/factories/report_factory.rb +33 -0
  407. data/lib/spree/testing_support/factories/role_user_factory.rb +7 -0
  408. data/lib/spree/testing_support/factories/shipping_method_factory.rb +9 -0
  409. data/lib/spree/testing_support/factories/stock_transfer_factory.rb +5 -2
  410. data/lib/spree/testing_support/factories/store_factory.rb +6 -9
  411. data/lib/spree/testing_support/factories/taxon_factory.rb +13 -0
  412. data/lib/spree/testing_support/factories/taxon_rule_factory.rb +38 -0
  413. data/lib/spree/testing_support/factories/theme_factory.rb +14 -0
  414. data/lib/spree/testing_support/factories/user_factory.rb +13 -11
  415. data/lib/spree/testing_support/factories/variant_factory.rb +23 -5
  416. data/lib/spree/testing_support/jobs.rb +1 -7
  417. data/lib/spree/testing_support/metadata.rb +13 -1
  418. data/lib/spree/testing_support/order_walkthrough.rb +1 -7
  419. data/lib/spree/testing_support/preferences.rb +1 -4
  420. data/lib/spree/testing_support/store.rb +26 -0
  421. data/lib/spree_core.rb +1 -0
  422. data/vendor/javascript/@rails--request.js.js +4 -0
  423. data/vendor/javascript/@stimulus-components--auto-submit.js +4 -0
  424. data/vendor/javascript/stimulus-reveal-controller.js +4 -0
  425. data/vendor/javascript/tailwindcss-stimulus-components.js +4 -0
  426. metadata +340 -197
  427. data/Gemfile +0 -3
  428. data/app/finders/spree/cms_pages/find.rb +0 -41
  429. data/app/finders/spree/menus/find.rb +0 -11
  430. data/app/models/concerns/spree/display_link.rb +0 -30
  431. data/app/models/spree/cms/pages/feature_page.rb +0 -7
  432. data/app/models/spree/cms/pages/homepage.rb +0 -20
  433. data/app/models/spree/cms/pages/standard_page.rb +0 -4
  434. data/app/models/spree/cms/sections/featured_article.rb +0 -22
  435. data/app/models/spree/cms/sections/hero_image.rb +0 -38
  436. data/app/models/spree/cms/sections/image_gallery.rb +0 -97
  437. data/app/models/spree/cms/sections/product_carousel.rb +0 -14
  438. data/app/models/spree/cms/sections/rich_text_content.rb +0 -13
  439. data/app/models/spree/cms/sections/side_by_side_images.rb +0 -68
  440. data/app/models/spree/cms_page.rb +0 -70
  441. data/app/models/spree/cms_section.rb +0 -69
  442. data/app/models/spree/cms_section_image.rb +0 -9
  443. data/app/models/spree/cms_section_image_one.rb +0 -4
  444. data/app/models/spree/cms_section_image_three.rb +0 -4
  445. data/app/models/spree/cms_section_image_two.rb +0 -4
  446. data/app/models/spree/icon.rb +0 -7
  447. data/app/models/spree/linkable/homepage.rb +0 -3
  448. data/app/models/spree/linkable/uri.rb +0 -3
  449. data/app/models/spree/menu.rb +0 -66
  450. data/app/models/spree/menu_item.rb +0 -72
  451. data/brakeman.ignore +0 -328
  452. data/db/migrate/20211201202851_update_linkable_resource_types.rb +0 -10
  453. data/db/migrate/20220329113557_fix_cms_pages_unique_indexes.rb +0 -8
  454. data/lib/generators/spree/custom_authentication/custom_authentication_generator.rb +0 -23
  455. data/lib/generators/spree/custom_authentication/templates/authentication_helpers.rb.tt +0 -23
  456. data/lib/generators/spree/custom_user/custom_user_generator.rb +0 -46
  457. data/lib/generators/spree/custom_user/templates/current_user_helpers.rb.tt +0 -15
  458. data/lib/generators/spree/custom_user/templates/initializer.rb.tt +0 -1
  459. data/lib/generators/spree/custom_user/templates/migration.rb.tt +0 -7
  460. data/lib/generators/spree/dummy/templates/package.json +0 -12
  461. data/lib/spree/core/product_duplicator.rb +0 -85
  462. data/lib/spree/core/runtime_configuration.rb +0 -10
  463. data/lib/spree/testing_support/factories/cms_page_factory.rb +0 -20
  464. data/lib/spree/testing_support/factories/cms_section_factory.rb +0 -31
  465. data/lib/spree/testing_support/factories/icon_factory.rb +0 -9
  466. data/lib/spree/testing_support/factories/menu_factory.rb +0 -16
  467. data/lib/spree/testing_support/factories/menu_item_factory.rb +0 -10
  468. data/script/rails +0 -9
  469. data/spec/fixtures/favicon.ico +0 -0
  470. data/spec/fixtures/files/icon_256x256.gif +0 -0
  471. data/spec/fixtures/files/icon_256x256.png +0 -0
  472. data/spec/fixtures/files/icon_512x512.png +0 -0
  473. data/spec/fixtures/files/img_256x128.png +0 -0
  474. data/spec/fixtures/text-file.txt +0 -1
  475. data/spec/fixtures/thinking-cat.jpg +0 -0
  476. data/spree_core.gemspec +0 -62
@@ -0,0 +1,75 @@
1
+ class AddUniqueIndexOnPromotionRulesAssociations < ActiveRecord::Migration[7.2]
2
+ def change
3
+ if ActiveRecord::Base.connection.adapter_name == 'Mysql2'
4
+ # Remove duplicate product promotion rules
5
+ execute <<-SQL
6
+ DELETE FROM spree_product_promotion_rules
7
+ WHERE id NOT IN (
8
+ SELECT mid FROM (
9
+ SELECT MIN(id) AS mid
10
+ FROM spree_product_promotion_rules
11
+ GROUP BY product_id, promotion_rule_id
12
+ ) AS min_ids
13
+ );
14
+ SQL
15
+
16
+ # Remove duplicate taxon promotion rules
17
+ execute <<-SQL
18
+ DELETE FROM spree_promotion_rule_taxons
19
+ WHERE id NOT IN (
20
+ SELECT mid FROM (
21
+ SELECT MIN(id) AS mid
22
+ FROM spree_promotion_rule_taxons
23
+ GROUP BY taxon_id, promotion_rule_id
24
+ ) AS min_ids
25
+ );
26
+ SQL
27
+
28
+ # Remove duplicate user promotion rules
29
+ execute <<-SQL
30
+ DELETE FROM spree_promotion_rule_users
31
+ WHERE id NOT IN (
32
+ SELECT mid FROM (
33
+ SELECT MIN(id) AS mid
34
+ FROM spree_promotion_rule_users
35
+ GROUP BY user_id, promotion_rule_id
36
+ ) AS min_ids
37
+ );
38
+ SQL
39
+ else
40
+ # Remove duplicate product promotion rules
41
+ execute <<-SQL
42
+ DELETE FROM spree_product_promotion_rules
43
+ WHERE id NOT IN (
44
+ SELECT MIN(id)
45
+ FROM spree_product_promotion_rules
46
+ GROUP BY product_id, promotion_rule_id
47
+ );
48
+ SQL
49
+
50
+ # Remove duplicate taxon promotion rules
51
+ execute <<-SQL
52
+ DELETE FROM spree_promotion_rule_taxons
53
+ WHERE id NOT IN (
54
+ SELECT MIN(id)
55
+ FROM spree_promotion_rule_taxons
56
+ GROUP BY taxon_id, promotion_rule_id
57
+ );
58
+ SQL
59
+
60
+ # Remove duplicate user promotion rules
61
+ execute <<-SQL
62
+ DELETE FROM spree_promotion_rule_users
63
+ WHERE id NOT IN (
64
+ SELECT MIN(id)
65
+ FROM spree_promotion_rule_users
66
+ GROUP BY user_id, promotion_rule_id
67
+ );
68
+ SQL
69
+ end
70
+
71
+ add_index :spree_product_promotion_rules, [:product_id, :promotion_rule_id], unique: true
72
+ add_index :spree_promotion_rule_taxons, [:taxon_id, :promotion_rule_id], unique: true
73
+ add_index :spree_promotion_rule_users, [:user_id, :promotion_rule_id], unique: true
74
+ end
75
+ end
@@ -0,0 +1,18 @@
1
+ class AddUserTypeToSpreeRoleUsers < ActiveRecord::Migration[6.1]
2
+ def up
3
+ unless column_exists?(:spree_role_users, :user_type)
4
+ add_column :spree_role_users, :user_type, :string
5
+ add_index :spree_role_users, :user_type
6
+
7
+ user_class_name = Spree.admin_user_class.to_s
8
+ Spree::RoleUser.where(user_type: nil).update_all(user_type: user_class_name)
9
+
10
+ change_column_null :spree_role_users, :user_type, false
11
+ end
12
+ end
13
+
14
+ def down
15
+ remove_index :spree_role_users, :user_type, if_exists: true
16
+ remove_column :spree_role_users, :user_type, if_exists: true
17
+ end
18
+ end
@@ -0,0 +1,29 @@
1
+ class AddUniqueIndexOnPromotionActionLineItems < ActiveRecord::Migration[7.2]
2
+ def change
3
+ if ActiveRecord::Base.connection.adapter_name == 'Mysql2'
4
+ # Remove duplicate promotion action line items
5
+ execute <<-SQL
6
+ DELETE FROM spree_promotion_action_line_items
7
+ WHERE id NOT IN (
8
+ SELECT mid FROM (
9
+ SELECT MIN(id) AS mid
10
+ FROM spree_promotion_action_line_items
11
+ GROUP BY promotion_action_id, variant_id
12
+ ) AS min_ids
13
+ );
14
+ SQL
15
+ else
16
+ # Remove duplicate promotion action line items
17
+ execute <<-SQL
18
+ DELETE FROM spree_promotion_action_line_items
19
+ WHERE id NOT IN (
20
+ SELECT MIN(id)
21
+ FROM spree_promotion_action_line_items
22
+ GROUP BY promotion_action_id, variant_id
23
+ );
24
+ SQL
25
+ end
26
+
27
+ add_index :spree_promotion_action_line_items, [:promotion_action_id, :variant_id], unique: true
28
+ end
29
+ end
@@ -0,0 +1,38 @@
1
+ class CreateSpreeTaggingsAndSpreeTags < ActiveRecord::Migration[7.2]
2
+ def change
3
+ create_table :spree_taggings do |t|
4
+ t.bigint "tag_id"
5
+ t.string "taggable_type"
6
+ t.bigint "taggable_id"
7
+ t.string "tagger_type"
8
+ t.bigint "tagger_id"
9
+ t.string "context", limit: 128
10
+ t.datetime "created_at", precision: nil
11
+ t.string "tenant", limit: 128
12
+ t.index ["context"], name: "index_spree_taggings_on_context"
13
+ t.index ["tag_id", "taggable_id", "taggable_type", "context", "tagger_id", "tagger_type"], name: "spree_taggings_idx", unique: true
14
+ t.index ["tag_id"], name: "index_spree_taggings_on_tag_id"
15
+ t.index ["taggable_id", "taggable_type", "context"], name: "spree_taggings_taggable_context_idx"
16
+ t.index ["taggable_id", "taggable_type", "tagger_id", "context"], name: "spree_taggings_idy"
17
+ t.index ["taggable_id"], name: "index_spree_taggings_on_taggable_id"
18
+ t.index ["taggable_type", "taggable_id"], name: "index_spree_taggings_on_taggable_type_and_taggable_id"
19
+ t.index ["taggable_type"], name: "index_spree_taggings_on_taggable_type"
20
+ t.index ["tagger_id", "tagger_type"], name: "index_spree_taggings_on_tagger_id_and_tagger_type"
21
+ t.index ["tagger_id"], name: "index_spree_taggings_on_tagger_id"
22
+ t.index ["tagger_type", "tagger_id"], name: "index_spree_taggings_on_tagger_type_and_tagger_id"
23
+ t.index ["tenant"], name: "index_spree_taggings_on_tenant"
24
+ end
25
+
26
+ create_table :spree_tags do |t|
27
+ t.string "name"
28
+ t.datetime "created_at", null: false
29
+ t.datetime "updated_at", null: false
30
+ t.integer "taggings_count", default: 0
31
+ t.index ["name"], name: "index_spree_tags_on_name", unique: true
32
+ end
33
+
34
+ if ActiveRecord::Base.connection.adapter_name == 'PostgreSQL'
35
+ add_index :spree_tags, 'lower(name) varchar_pattern_ops', name: 'index_spree_tags_on_lower_name'
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,49 @@
1
+ require 'rails/generators'
2
+
3
+ module Spree
4
+ module Authentication
5
+ class CustomGenerator < Rails::Generators::Base
6
+ desc 'Set up a Spree installation with custom authentication'
7
+
8
+ def self.source_paths
9
+ paths = superclass.source_paths
10
+ paths << File.expand_path('templates', __dir__)
11
+ paths.flatten
12
+ end
13
+
14
+ def generate
15
+ template 'authentication_helpers.rb.tt', 'lib/spree/authentication_helpers.rb'
16
+
17
+ file_action = File.exist?('config/initializers/spree.rb') ? :append_file : :create_file
18
+ send(file_action, 'config/initializers/spree.rb') do
19
+ %Q{
20
+ Rails.application.config.to_prepare do
21
+ require_dependency 'spree/authentication_helpers'
22
+ end\n}
23
+ end
24
+
25
+ user_class_file = Rails.root.join('app', 'models', "#{Spree.user_class.name.underscore}.rb")
26
+
27
+ if File.exist?(user_class_file)
28
+ inject_into_file user_class_file, after: "class #{Spree.user_class.name} < ApplicationRecord\n" do
29
+ <<-RUBY
30
+ # Spree modules
31
+ include Spree::UserAddress
32
+ include Spree::UserMethods
33
+ include Spree::UserPaymentSource
34
+ RUBY
35
+ end
36
+ say "Successfully added Spree user modules into #{user_class_file}"
37
+ else
38
+ say "Could not locate user model file at #{user_class_file}. Please add these lines manually:", :red
39
+ say <<~RUBY
40
+ # Spree modules
41
+ include Spree::UserAddress
42
+ include Spree::UserMethods
43
+ include Spree::UserPaymentSource
44
+ RUBY
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,50 @@
1
+ module Spree
2
+ module AuthenticationHelpers
3
+ def self.included(receiver)
4
+ receiver.helper_method(
5
+ :spree_current_user,
6
+ :spree_login_path,
7
+ :spree_signup_path,
8
+ :spree_logout_path,
9
+ :spree_forgot_password_path,
10
+ :spree_edit_password_path,
11
+ :spree_admin_login_path,
12
+ :spree_admin_logout_path
13
+ )
14
+ end
15
+
16
+ def spree_current_user
17
+ current_user
18
+ end
19
+
20
+ def spree_login_path(opts = {})
21
+ main_app.login_path(opts)
22
+ end
23
+
24
+ def spree_signup_path(opts = {})
25
+ main_app.signup_path(opts = {})
26
+ end
27
+
28
+ def spree_logout_path(opts = {})
29
+ main_app.logout_path(opts = {})
30
+ end
31
+
32
+ def spree_forgot_password_path(opts = {})
33
+ main_app.forgot_password_path(opts)
34
+ end
35
+
36
+ def spree_edit_password_path(opts = {})
37
+ main_app.spree_edit_password_path(opts)
38
+ end
39
+
40
+ def spree_admin_login_path(opts = {})
41
+ spree_login_path(opts)
42
+ end
43
+
44
+ def spree_admin_logout_path(opts = {})
45
+ spree_logout_path(opts)
46
+ end
47
+ end
48
+ end
49
+
50
+ ApplicationController.include Spree::AuthenticationHelpers if defined?(ApplicationController)
@@ -0,0 +1,57 @@
1
+ require 'rails/generators'
2
+
3
+ module Spree
4
+ module Authentication
5
+ class DeviseGenerator < Rails::Generators::Base
6
+ desc 'Set up a Spree installation with Devise as authentication'
7
+
8
+ def self.source_paths
9
+ paths = superclass.source_paths
10
+ paths << File.expand_path('templates', __dir__)
11
+ paths.flatten
12
+ end
13
+
14
+ def generate
15
+ template 'authentication_helpers.rb.tt', 'lib/spree/authentication_helpers.rb'
16
+
17
+ file_action = File.exist?('config/initializers/spree.rb') ? :append_file : :create_file
18
+ send(file_action, 'config/initializers/spree.rb') do
19
+ %Q{
20
+ Rails.application.config.to_prepare do
21
+ require_dependency 'spree/authentication_helpers'
22
+ end\n}
23
+ end
24
+
25
+ user_class_file = Rails.root.join('app', 'models', "#{Spree.user_class.name.underscore}.rb")
26
+
27
+ if File.exist?(user_class_file)
28
+ inject_into_file user_class_file, after: "class #{Spree.user_class.name} < ApplicationRecord\n" do
29
+ <<-RUBY
30
+ # Spree modules
31
+ include Spree::UserAddress
32
+ include Spree::UserMethods
33
+ include Spree::UserPaymentSource
34
+ RUBY
35
+ end
36
+ say "Successfully added Spree user modules into #{user_class_file}"
37
+ else
38
+ say "Could not locate user model file at #{user_class_file}. Please add these lines manually:", :red
39
+ say <<~RUBY
40
+ # Spree modules
41
+ include Spree::UserAddress
42
+ include Spree::UserMethods
43
+ include Spree::UserPaymentSource
44
+ RUBY
45
+ end
46
+
47
+ append_file 'config/initializers/spree.rb' do
48
+ %Q{
49
+ if defined?(Devise) && Devise.respond_to?(:parent_controller)
50
+ Devise.parent_controller = "Spree::StoreController"
51
+ Devise.parent_mailer = "Spree::BaseMailer"
52
+ end\n}
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,50 @@
1
+ module Spree
2
+ module AuthenticationHelpers
3
+ def self.included(receiver)
4
+ receiver.helper_method(
5
+ :spree_current_user,
6
+ :spree_login_path,
7
+ :spree_signup_path,
8
+ :spree_logout_path,
9
+ :spree_forgot_password_path,
10
+ :spree_edit_password_path,
11
+ :spree_admin_login_path,
12
+ :spree_admin_logout_path
13
+ )
14
+ end
15
+
16
+ def spree_current_user
17
+ send("current_#{Spree.user_class.model_name.singular_route_key}")
18
+ end
19
+
20
+ def spree_login_path(opts = {})
21
+ new_session_path(Spree.user_class.model_name.singular_route_key, opts)
22
+ end
23
+
24
+ def spree_signup_path(opts = {})
25
+ new_registration_path(Spree.user_class.model_name.singular_route_key, opts)
26
+ end
27
+
28
+ def spree_logout_path(opts = {})
29
+ destroy_session_path(Spree.user_class.model_name.singular_route_key, opts)
30
+ end
31
+
32
+ def spree_forgot_password_path(opts = {})
33
+ new_password_path(Spree.user_class.model_name.singular_route_key, opts)
34
+ end
35
+
36
+ def spree_edit_password_path(opts = {})
37
+ edit_registration_path(Spree.user_class.model_name.singular_route_key, opts)
38
+ end
39
+
40
+ def spree_admin_login_path(opts = {})
41
+ spree_login_path(opts)
42
+ end
43
+
44
+ def spree_admin_logout_path(opts = {})
45
+ spree_logout_path(opts)
46
+ end
47
+ end
48
+ end
49
+
50
+ ApplicationController.include Spree::AuthenticationHelpers if defined?(ApplicationController)
@@ -4,7 +4,7 @@ require 'spree/core/version'
4
4
 
5
5
  module Spree
6
6
  class DummyGenerator < Rails::Generators::Base
7
- SPREE_GEMS = %w(spree_backend spree_frontend spree_api spree_emails).freeze
7
+ SPREE_GEMS = %w(spree_admin spree_storefront spree_api spree_emails).freeze
8
8
 
9
9
  desc 'Creates blank Rails application, installs Spree and all sample data'
10
10
 
@@ -57,6 +57,7 @@ postgres: &postgres
57
57
  host: <%= db_host %>
58
58
  <% end %>
59
59
  min_messages: warning
60
+ pool: <%= ENV["DB_POOL"] || 50 %>
60
61
 
61
62
  development:
62
63
  <<: *postgres
@@ -36,7 +36,7 @@ Dummy::Application.configure do
36
36
 
37
37
  config.active_job.queue_adapter = :test
38
38
 
39
- config.cache_store = :memory_store # we need to use memory store for Spree preferences
39
+ config.cache_store = :null_store
40
40
 
41
41
  routes.default_url_options = { host: 'localhost', port: 3000 }
42
42
  end
@@ -19,6 +19,7 @@ module Spree
19
19
  class_option :admin_password, type: :string
20
20
  class_option :lib_name, type: :string, default: 'spree'
21
21
  class_option :enforce_available_locales, type: :boolean, default: nil
22
+ class_option :authentication, type: :string, default: 'devise'
22
23
 
23
24
  def self.source_paths
24
25
  paths = superclass.source_paths
@@ -35,6 +36,7 @@ module Spree
35
36
  @install_storefront = options[:install_storefront]
36
37
  @install_admin = options[:install_admin]
37
38
  @copy_storefront = options[:copy_storefront]
39
+ @authentication = options[:authentication]
38
40
 
39
41
  unless @run_migrations
40
42
  @load_seed_data = false
@@ -64,25 +66,30 @@ module Spree
64
66
  ROBOTS
65
67
  end
66
68
 
67
- def create_overrides_directory
68
- empty_directory 'app/overrides'
69
+ # Currently we only support devise, in the future we will also add support for default Rails authentication
70
+ def install_authentication
71
+ if @authentication == 'devise'
72
+ generate 'spree:authentication:devise'
73
+ elsif @authentication == 'dummy'
74
+ # this is for dummy / test app
75
+ end
69
76
  end
70
77
 
71
78
  def install_storefront
72
79
  if @install_storefront && Spree::Core::Engine.frontend_available?
73
- generate 'spree:frontend:install'
80
+ generate 'spree:storefront:install'
74
81
  end
75
82
  end
76
83
 
77
84
  def install_admin
78
- if @install_admin && Spree::Core::Engine.backend_available?
79
- generate 'spree:backend:install'
85
+ if @install_admin && Spree::Core::Engine.admin_available?
86
+ generate 'spree:admin:install'
80
87
  end
81
88
  end
82
89
 
83
90
  def copy_storefront
84
91
  if @copy_storefront && Spree::Core::Engine.frontend_available?
85
- generate 'spree:frontend:copy_storefront'
92
+ generate 'spree:storefront:copy_storefront'
86
93
  end
87
94
  end
88
95
 
@@ -94,11 +101,6 @@ module Spree
94
101
  Dir.glob(File.join(File.dirname(__FILE__), "../app/**/*_decorator*.rb")) do |c|
95
102
  Rails.configuration.cache_classes ? require(c) : load(c)
96
103
  end
97
-
98
- # Load application's view overrides
99
- Dir.glob(File.join(File.dirname(__FILE__), "../app/overrides/*.rb")) do |c|
100
- Rails.configuration.cache_classes ? require(c) : load(c)
101
- end
102
104
  end
103
105
  APP
104
106
 
@@ -121,27 +123,18 @@ module Spree
121
123
  def install_migrations
122
124
  say_status :copying, 'migrations'
123
125
  silence_stream(STDOUT) do
124
- silence_warnings { rake 'railties:install:migrations' }
125
- end
126
- end
127
-
128
- def create_database
129
- say_status :creating, 'database'
130
- silence_stream(STDOUT) do
131
- silence_stream(STDERR) do
132
- silence_warnings { rake 'db:create' }
133
- end
126
+ silence_warnings { rake 'active_storage:install:migrations' }
127
+ silence_warnings { rake 'action_mailbox:install:migrations' }
128
+ silence_warnings { rake 'action_text:install:migrations' }
129
+ silence_warnings { rake 'spree:install:migrations' }
130
+ silence_warnings { rake 'spree_api:install:migrations' }
134
131
  end
135
132
  end
136
133
 
137
134
  def run_migrations
138
135
  if @run_migrations
139
136
  say_status :running, 'migrations'
140
- silence_stream(STDOUT) do
141
- silence_stream(STDERR) do
142
- silence_warnings { rake 'db:migrate' }
143
- end
144
- end
137
+ rake 'db:migrate'
145
138
  else
146
139
  say_status :skipping, "migrations (don't forget to run rake db:migrate)"
147
140
  end
@@ -157,11 +150,7 @@ module Spree
157
150
 
158
151
  cmd = -> { rake("db:seed #{rake_options.join(' ')}") }
159
152
  if options[:auto_accept] || (options[:admin_email] && options[:admin_password])
160
- silence_stream(STDOUT) do
161
- silence_stream(STDERR) do
162
- silence_warnings &cmd
163
- end
164
- end
153
+ silence_warnings &cmd
165
154
  else
166
155
  cmd.call
167
156
  end
@@ -175,11 +164,7 @@ module Spree
175
164
 
176
165
  if @load_sample_data
177
166
  say_status :loading, 'sample data'
178
- silence_stream(STDOUT) do
179
- silence_stream(STDERR) do
180
- silence_warnings { rake 'spree_sample:load' }
181
- end
182
- end
167
+ rake 'spree_sample:load'
183
168
  else
184
169
  say_status :skipping, 'sample data (you can always run rake spree_sample:load)'
185
170
  end
@@ -18,6 +18,12 @@ Spree.config do |config|
18
18
  # config.track_inventory_levels = false
19
19
  end
20
20
 
21
+ # Background job queue names
22
+ # Spree.queues.default = :default
23
+ # Spree.queues.variants = :default
24
+ # Spree.queues.stock_location_stock_items = :default
25
+ # Spree.queues.coupon_codes = :default
26
+
21
27
  # Use a CDN host for images, eg. Cloudfront
22
28
  # This is used in the frontend to generate absolute URLs to images
23
29
  # Default is nil and your application host will be used
@@ -29,12 +35,8 @@ end
29
35
  # Spree.public_storage_service_name = :amazon_private # private assets, such as invoices, etc
30
36
  # end
31
37
 
32
- # Use a different search engine for products
33
- # You can check the default search class at:
34
- # https://github.com/spree/spree/blob/main/core/lib/spree/core/search/base.rb
35
- # and use it as base class for your custom searcher
36
- # eg. MySearcher < Spree::Core::Search::Base
37
- # Spree.searcher_class = 'MySearcher'
38
+ # Enable theme preview screenshots in admin dashboard
39
+ # Spree.screenshot_api_token = <Your Screenshot API token obtained from https://screenshotapi.net/>
38
40
 
39
41
  # Configure Spree Dependencies
40
42
  #
@@ -51,6 +53,38 @@ end
51
53
 
52
54
  # Spree::Api::Dependencies.storefront_cart_serializer = 'MyRailsApp::CartSerializer'
53
55
 
56
+ # uncomment lines below to add your own custom business logic
57
+ # such as promotions, shipping methods, etc
58
+ Rails.application.config.after_initialize do
59
+ # Rails.application.config.spree.shipping_methods << Spree::ShippingMethods::SuperExpensiveNotVeryFastShipping
60
+ # Rails.application.config.spree.payment_methods << Spree::PaymentMethods::VerySafeAndReliablePaymentMethod
61
+
62
+ # Rails.application.config.spree.calculators.tax_rates << Spree::TaxRates::FinanceTeamForcedMeToCodeThis
63
+
64
+ # Rails.application.config.spree.stock_splitters << Spree::Stock::Splitters::SecretLogicSplitter
65
+
66
+ # Rails.application.config.spree.adjusters << Spree::Adjustable::Adjuster::TaxTheRich
67
+
68
+ # Custom promotions
69
+ # Rails.application.config.spree.calculators.promotion_actions_create_adjustments << Spree::Calculators::PromotionActions::CreateAdjustments::AddDiscountForFriends
70
+ # Rails.application.config.spree.calculators.promotion_actions_create_item_adjustments << Spree::Calculators::PromotionActions::CreateItemAdjustments::FinanceTeamForcedMeToCodeThis
71
+ # Rails.application.config.spree.promotions.rules << Spree::Promotions::Rules::OnlyForVIPCustomers
72
+ # Rails.application.config.spree.promotions.actions << Spree::Promotions::Actions::GiftWithPurchase
73
+
74
+ # Rails.application.config.spree.taxon_rules << Spree::TaxonRules::ProductsWithColor
75
+
76
+ # Rails.application.config.spree.exports << Spree::Exports::Payments
77
+ # Rails.application.config.spree.reports << Spree::Reports::MassivelyOvercomplexReportForCfo
78
+
79
+ # Themes and page builder
80
+ # Rails.application.config.spree.themes << Spree::Themes::NewShinyTheme
81
+ # Rails.application.config.spree.theme_layout_sections << Spree::PageSections::SuperImportantCeoBio
82
+ # Rails.application.config.spree.page_sections << Spree::PageSections::ContactFormToGetInTouch
83
+ # Rails.application.config.spree.page_blocks << Spree::PageBlocks::BigRedButtonToCallSales
84
+
85
+ # Rails.application.config.spree_storefront.head_partials << 'spree/shared/that_js_snippet_that_marketing_forced_me_to_include'
86
+ end
87
+
54
88
  Spree.user_class = <%= (options[:user_class].blank? ? 'Spree::LegacyUser' : options[:user_class]).inspect %>
55
89
  # Use a different class for admin users
56
90
  # Spree.admin_user_class = 'AdminUser'
@@ -0,0 +1,18 @@
1
+ require 'any_ascii'
2
+
3
+ module NormalizeString
4
+ def self.normalize(string)
5
+ return unless string.present?
6
+
7
+ AnyAscii.transliterate(string)
8
+ end
9
+
10
+ def self.remove_emoji_and_normalize(string, keep_emoji_when_empty: false)
11
+ return unless string.present?
12
+
13
+ result = AnyAscii.transliterate(string.gsub(/\p{So}/, ''))
14
+ return result if result.present? || !keep_emoji_when_empty
15
+
16
+ normalize(string)
17
+ end
18
+ end
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ module Analytics
3
+ def self.events
4
+ @@supported_events ||= Rails.application.config.spree.analytics_events
5
+ end
6
+
7
+ def self.event_handlers
8
+ @@event_handlers ||= Rails.application.config.spree.analytics_event_handlers
9
+ end
10
+ end
11
+ end
@@ -16,7 +16,7 @@ module Spree
16
16
  end
17
17
 
18
18
  def self.frontend_available?
19
- @@frontend_available ||= ::Rails::Engine.subclasses.map(&:instance).map { |e| e.class.to_s }.include?('Spree::Frontend::Engine')
19
+ @@frontend_available ||= ::Rails::Engine.subclasses.map(&:instance).map { |e| e.class.to_s }.include?('Spree::Storefront::Engine')
20
20
  end
21
21
 
22
22
  def self.emails_available?