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
@@ -2,11 +2,12 @@ module Spree::Preferences
2
2
  module PreferableClassMethods
3
3
  def preference(name, type, *args)
4
4
  options = args.extract_options!
5
- options.assert_valid_keys(:default, :deprecated, :nullable)
5
+ options.assert_valid_keys(:default, :deprecated, :nullable, :parse_on_set)
6
6
  default = options[:default]
7
7
  default = -> { options[:default] } unless default.is_a?(Proc)
8
8
  deprecated = options[:deprecated]
9
9
  nullable = options[:nullable]
10
+ parse_on_set = options[:parse_on_set]
10
11
 
11
12
  # cache_key will be nil for new objects, then if we check if there
12
13
  # is a pending preference before going to default
@@ -17,6 +18,7 @@ module Spree::Preferences
17
18
  end
18
19
 
19
20
  define_method preference_setter_method(name) do |value|
21
+ value = parse_on_set.call(value) if parse_on_set.is_a?(Proc)
20
22
  value = convert_preference_value(value, type, nullable: nullable)
21
23
  preferences[name] = value
22
24
 
@@ -37,6 +39,10 @@ module Spree::Preferences
37
39
  define_method preference_deprecated_getter_method(name) do
38
40
  deprecated
39
41
  end
42
+
43
+ define_method prefers_query_method(name) do
44
+ preferences.fetch(name).to_b
45
+ end
40
46
  end
41
47
 
42
48
  def preference_getter_method(name)
@@ -58,5 +64,9 @@ module Spree::Preferences
58
64
  def preference_type_getter_method(name)
59
65
  "preferred_#{name}_type".to_sym
60
66
  end
67
+
68
+ def prefers_query_method(name)
69
+ "prefers_#{name}?".to_sym
70
+ end
61
71
  end
62
72
  end
@@ -7,6 +7,12 @@ module Spree
7
7
  end
8
8
  end
9
9
 
10
+ def reset
11
+ self.class.defaults.each do |key, value|
12
+ self[key] = value
13
+ end
14
+ end
15
+
10
16
  def configure
11
17
  yield(self) if block_given?
12
18
  end
@@ -17,8 +23,13 @@ module Spree
17
23
 
18
24
  alias [] get
19
25
 
20
- def set(preference, value)
21
- send("#{preference}=", value)
26
+ def set(*args)
27
+ options = args.extract_options!
28
+ options.each do |name, value|
29
+ send("#{name}=", value)
30
+ end
31
+
32
+ send("#{args[0]}=", args[1]) if args.size == 2
22
33
  end
23
34
 
24
35
  alias []= set
@@ -5,6 +5,8 @@ module Spree
5
5
  attr_accessor :properties, :current_user, :current_currency, :current_store, :taxon
6
6
 
7
7
  def initialize(params)
8
+ Spree::Deprecation.warn("Spree::Core::Search::Base is deprecated and will be removed in Spree 6. Please use `Spree::Products::Find` finder instead.")
9
+
8
10
  @properties = {}
9
11
  @current_store = params[:current_store] || Spree::Store.default
10
12
  @current_currency = @current_store.default_currency
@@ -1,5 +1,5 @@
1
1
  module Spree
2
- VERSION = '4.10.1'.freeze
2
+ VERSION = '5.0.0.rc1'.freeze
3
3
 
4
4
  def self.version
5
5
  VERSION
data/lib/spree/core.rb CHANGED
@@ -1,33 +1,55 @@
1
+ require 'ostruct'
1
2
  require 'action_controller/railtie'
2
3
  require 'action_view/railtie'
3
4
  require 'active_job/railtie'
4
5
  require 'active_model/railtie'
5
6
  require 'active_record/railtie'
6
7
  require 'active_storage/engine'
8
+ require 'action_text/engine'
9
+
10
+ require 'mail'
11
+ require 'action_mailer/railtie'
12
+ require 'sprockets/railtie'
7
13
 
8
14
  require 'active_merchant'
9
15
  require 'acts_as_list'
16
+ require 'acts-as-taggable-on'
10
17
  require 'auto_strip_attributes'
11
18
  require 'awesome_nested_set'
12
19
  require 'cancan'
20
+ require 'countries/global'
13
21
  require 'friendly_id'
14
22
  require 'kaminari'
15
23
  require 'monetize'
16
24
  require 'mobility'
25
+ require 'name_of_person'
17
26
  require 'paranoia'
18
27
  require 'ransack'
19
28
  require 'state_machines-activerecord'
20
29
  require 'active_storage_validations'
21
- require 'activerecord-typedstore'
22
30
  require 'request_store'
31
+ require 'wannabe_bool'
32
+ require 'geocoder'
33
+ require 'oembed'
23
34
 
24
35
  # This is required because ActiveModel::Validations#invalid? conflicts with the
25
36
  # invalid state of a Payment. In the future this should be removed.
26
37
  StateMachines::Machine.ignore_method_conflicts = true
27
38
 
28
39
  module Spree
29
- mattr_accessor :user_class, :admin_user_class, :private_storage_service_name,
30
- :public_storage_service_name, :cdn_host, :searcher_class
40
+ mattr_accessor :base_class, :user_class, :admin_user_class,
41
+ :private_storage_service_name, :public_storage_service_name,
42
+ :cdn_host, :root_domain, :searcher_class, :queues,
43
+ :google_places_api_key, :screenshot_api_token
44
+
45
+ def self.base_class(constantize: true)
46
+ @@base_class ||= 'Spree::Base'
47
+ if @@base_class.is_a?(Class)
48
+ raise 'Spree.base_class MUST be a String or Symbol object, not a Class object.'
49
+ elsif @@base_class.is_a?(String) || @@base_class.is_a?(Symbol)
50
+ constantize ? @@base_class.to_s.constantize : @@base_class.to_s
51
+ end
52
+ end
31
53
 
32
54
  def self.user_class(constantize: true)
33
55
  if @@user_class.is_a?(Class)
@@ -51,9 +73,9 @@ module Spree
51
73
  if @@private_storage_service_name
52
74
  if @@private_storage_service_name.is_a?(String) || @@private_storage_service_name.is_a?(Symbol)
53
75
  @@private_storage_service_name.to_sym
54
- else
55
- raise 'Spree.private_storage_service_name MUST be a String or Symbol object.'
56
76
  end
77
+ else
78
+ Rails.application.config.active_storage.service
57
79
  end
58
80
  end
59
81
 
@@ -61,12 +83,31 @@ module Spree
61
83
  if @@public_storage_service_name
62
84
  if @@public_storage_service_name.is_a?(String) || @@public_storage_service_name.is_a?(Symbol)
63
85
  @@public_storage_service_name.to_sym
64
- else
65
- raise 'Spree.public_storage_service_name MUST be a String or Symbol object.'
66
86
  end
87
+ else
88
+ Rails.application.config.active_storage.service
67
89
  end
68
90
  end
69
91
 
92
+ def self.root_domain
93
+ @@root_domain ||= Rails.application.routes.default_url_options[:host] || 'lvh.me'
94
+ end
95
+
96
+ def self.queues
97
+ @@queues ||= OpenStruct.new(
98
+ default: :default,
99
+ exports: :default,
100
+ reports: :default,
101
+ variants: :default,
102
+ taxons: :default,
103
+ stock_location_stock_items: :default,
104
+ coupon_codes: :default,
105
+ webhooks: :default,
106
+ themes: :default,
107
+ addresses: :addresses
108
+ )
109
+ end
110
+
70
111
  def self.searcher_class(constantize: true)
71
112
  @@searcher_class ||= 'Spree::Core::Search::Base'
72
113
 
@@ -77,12 +118,20 @@ module Spree
77
118
  end
78
119
  end
79
120
 
121
+ def self.google_places_api_key
122
+ @@google_places_api_key
123
+ end
124
+
125
+ def self.screenshot_api_token
126
+ @@screenshot_api_token
127
+ end
128
+
80
129
  def self.always_use_translations?
81
- Spree::RuntimeConfig.always_use_translations
130
+ Spree::Config.always_use_translations
82
131
  end
83
132
 
84
133
  def self.use_translations?
85
- Spree::RuntimeConfig.always_use_translations || I18n.default_locale != I18n.locale
134
+ Spree::Config.always_use_translations || I18n.default_locale != I18n.locale
86
135
  end
87
136
 
88
137
  # Used to configure Spree.
@@ -137,10 +186,10 @@ require 'spree/money'
137
186
  require 'spree/permitted_attributes'
138
187
  require 'spree/service_module'
139
188
  require 'spree/database_type_utilities'
189
+ require 'spree/analytics'
140
190
 
141
191
  require 'spree/core/importer'
142
192
  require 'spree/core/query_filters'
143
- require 'spree/core/product_duplicator'
144
193
  require 'spree/core/controller_helpers/auth'
145
194
  require 'spree/core/controller_helpers/common'
146
195
  require 'spree/core/controller_helpers/order'
@@ -149,9 +198,10 @@ require 'spree/core/controller_helpers/store'
149
198
  require 'spree/core/controller_helpers/strong_parameters'
150
199
  require 'spree/core/controller_helpers/locale'
151
200
  require 'spree/core/controller_helpers/currency'
201
+ require 'spree/core/controller_helpers/turbo'
152
202
 
153
203
  require 'spree/core/preferences/store'
154
204
  require 'spree/core/preferences/scoped_store'
155
205
  require 'spree/core/preferences/runtime_configuration'
156
206
 
157
- require "spree/core/webhooks"
207
+ require 'spree/core/webhooks'
data/lib/spree/i18n.rb CHANGED
@@ -17,15 +17,12 @@ module Spree
17
17
  end
18
18
 
19
19
  def available_locales
20
- locales_from_i18n = I18n.available_locales
21
- locales =
22
- if defined?(SpreeI18n)
23
- (SpreeI18n::Locale.all << :en).map(&:to_sym)
24
- else
25
- [Rails.application.config.i18n.default_locale, I18n.locale, :en]
26
- end
20
+ locales = defined?(SpreeI18n) ? SpreeI18n::Locale.all.map(&:to_sym) : []
21
+ locales << :en
22
+ locales << I18n.locale
23
+ locales << Rails.application.config.i18n.default_locale
27
24
 
28
- (locales + locales_from_i18n).uniq.compact
25
+ locales.uniq.compact
29
26
  end
30
27
 
31
28
  alias t translate
@@ -36,7 +36,7 @@ module Spree
36
36
  missing_migrations.each do |migration|
37
37
  puts "[#{engine_name.capitalize} WARNING] #{migration} from #{engine_name} is missing."
38
38
  end
39
- puts "[#{engine_name.capitalize} WARNING] Run `bundle exec rake railties:install:migrations` to get them.\n\n"
39
+ puts "[#{engine_name.capitalize} WARNING] Run `bundle exec rake spree:install:migrations` to get them.\n\n"
40
40
  true
41
41
  end
42
42
  end
@@ -42,14 +42,14 @@ module Spree
42
42
  :id, :firstname, :lastname, :first_name, :last_name,
43
43
  :address1, :address2, :city, :country_iso, :country_id, :state_id,
44
44
  :zipcode, :phone, :state_name, :alternative_phone, :company,
45
- :user_id, :deleted_at, :label,
45
+ :user_id, :deleted_at, :label, :quick_checkout,
46
46
  { country: [:iso, :name, :iso3, :iso_name],
47
47
  state: [:name, :abbr] }
48
48
  ]
49
49
 
50
50
  @@checkout_attributes = [
51
- :coupon_code, :email, :shipping_method_id, :special_instructions, :use_billing,
52
- :user_id, :bill_address_id, :ship_address_id
51
+ :coupon_code, :email, :shipping_method_id, :special_instructions, :use_billing, :use_shipping,
52
+ :user_id, :bill_address_id, :ship_address_id, :accept_marketing, :signup_for_an_account
53
53
  ]
54
54
 
55
55
  @@classification_attributes = [
@@ -94,10 +94,14 @@ module Spree
94
94
  :option_values_hash, :weight, :height, :width, :depth,
95
95
  :shipping_category_id, :tax_category_id,
96
96
  :cost_currency, :cost_price, :compare_at_price,
97
- { option_type_ids: [], taxon_ids: [] }
97
+ {
98
+ tag_list: [],
99
+ option_type_ids: [],
100
+ taxon_ids: []
101
+ }
98
102
  ]
99
103
 
100
- @@property_attributes = [:name, :presentation]
104
+ @@property_attributes = [:name, :presentation, :position]
101
105
 
102
106
  @@return_authorization_attributes = [:amount, :memo, :stock_location_id, :inventory_units_attributes,
103
107
  :return_authorization_reason_id]
@@ -109,7 +113,7 @@ module Spree
109
113
 
110
114
  # month / year may be provided by some sources, or others may elect to use one field
111
115
  @@source_attributes = [
112
- :number, :month, :year, :expiry, :verification_value,
116
+ :id, :number, :month, :year, :expiry, :verification_value,
113
117
  :first_name, :last_name, :cc_type, :gateway_customer_profile_id,
114
118
  :gateway_payment_profile_id, :last_digits, :name, :encrypted_data
115
119
  ]
@@ -128,13 +132,18 @@ module Spree
128
132
 
129
133
  @@store_attributes = [:name, :url, :seo_title, :code, :meta_keywords,
130
134
  :meta_description, :default_currency, :mail_from_address,
131
- :customer_support_email, :facebook, :twitter, :instagram,
132
- :description, :address, :contact_phone, :supported_locales,
133
- :default_locale, :default_country_id, :supported_currencies,
135
+ :customer_support_email, :description, :address, :contact_phone,
136
+ :supported_locales, :default_locale, :default_country_id, :supported_currencies,
134
137
  :new_order_notifications_email, :checkout_zone_id, :seo_robots,
135
- :digital_asset_authorized_clicks, :digital_asset_authorized_days,
136
- :limit_digital_download_count, :limit_digital_download_days, :digital_asset_link_expire_time,
137
- { mailer_logo_attributes: {}, favicon_image_attributes: {}, logo_attributes: {} }]
138
+ :preferred_timezone, :preferred_weight_unit, :preferred_unit_system,
139
+ :preferred_digital_asset_authorized_clicks, :preferred_digital_asset_authorized_days,
140
+ :preferred_limit_digital_download_count, :preferred_limit_digital_download_days,
141
+ :preferred_digital_asset_link_expire_time,
142
+ :logo, :mailer_logo, :social_logo, :favicon_image,
143
+ :import_products_from_store_id, :import_payment_methods_from_store_id,
144
+ :checkout_message, :preferred_guest_checkout,
145
+ :customer_terms_of_service, :customer_privacy_policy,
146
+ :customer_returns_policy, :customer_shipping_policy, :default_country_iso]
138
147
 
139
148
  @@store_credit_attributes = %i[amount currency category_id memo]
140
149
 
@@ -145,16 +154,16 @@ module Spree
145
154
  :taxonomy_id, :meta_description, :meta_keywords, :meta_title, :child_index
146
155
  ]
147
156
 
148
- # TODO: Should probably use something like Spree.user_class.attributes
149
157
  @@user_attributes = [:email, :bill_address_id, :ship_address_id, :password, :first_name, :last_name,
150
- :password_confirmation, { public_metadata: {}, private_metadata: {} }, :selected_locale]
158
+ :password_confirmation, :selected_locale, :avatar, :accepts_email_marketing, :phone,
159
+ { public_metadata: {}, private_metadata: {}, tag_list: [] }]
151
160
 
152
161
  @@variant_attributes = [
153
162
  :name, :presentation, :cost_price, :discontinue_on, :lock_version,
154
163
  :position, :track_inventory,
155
164
  :product_id, :product, :option_values_attributes, :price, :compare_at_price,
156
165
  :weight, :height, :width, :depth, :sku, :barcode, :cost_currency,
157
- :weight_unit, :dimensions_unit,
166
+ :weight_unit, :dimensions_unit,
158
167
  { options: [:name, :value], option_value_ids: [] }
159
168
  ]
160
169
 
@@ -16,8 +16,15 @@ module Spree
16
16
 
17
17
  def stub_authorization!(&block)
18
18
  ability_class = build_ability(&block)
19
+
20
+ let(:user) { Spree.admin_user_class.new(email: FFaker::Internet.email) }
21
+
19
22
  before do
20
23
  allow(controller).to receive(:current_ability).and_return(ability_class.new(nil))
24
+
25
+ if defined?(Spree::Admin::BaseController)
26
+ allow_any_instance_of(Spree::Admin::BaseController).to receive(:try_spree_current_user).and_return(user)
27
+ end
21
28
  end
22
29
  end
23
30
  end
@@ -37,16 +44,12 @@ module Spree
37
44
  ability_class.register_ability(ability)
38
45
  end
39
46
 
40
- let(:user) { Spree.admin_user_class.new }
41
- let(:admin_app) { Spree::OauthApplication.create!(name: 'Admin Panel', scopes: 'admin') }
42
- let(:admin_token) { Spree::OauthAccessToken.create!(application: admin_app, scopes: 'admin').token }
47
+ let(:user) { Spree.admin_user_class.new(email: FFaker::Internet.email) }
43
48
 
44
49
  before do
45
50
  allow(Spree.admin_user_class).to receive(:find_by).and_return(user)
46
- if defined?(Spree::Admin)
51
+ if defined?(Spree::Admin::BaseController)
47
52
  allow_any_instance_of(Spree::Admin::BaseController).to receive(:try_spree_current_user).and_return(user)
48
- allow_any_instance_of(Spree::Admin::BaseController).to receive(:admin_oauth_application).and_return(admin_app)
49
- allow_any_instance_of(Spree::Admin::BaseController).to receive(:admin_oauth_token).and_return(admin_token)
50
53
  end
51
54
  end
52
55
  end
@@ -23,5 +23,16 @@ Capybara.register_driver :selenium_chrome_headless do |app|
23
23
  options.add_argument '--window-size=1400,900'
24
24
  options.add_argument '--disable-search-engine-choice-screen'
25
25
 
26
+ # Disable timers being throttled in background pages/tabs. Useful for parallel test runs.
27
+ options.add_argument '--disable-background-timer-throttling'
28
+
29
+ # Normally, Chrome will treat a 'foreground' tab instead as backgrounded if the surrounding window is occluded (aka
30
+ # visually covered) by another window. This flag disables that. Useful for parallel test runs.
31
+ options.add_argument '--disable-backgrounding-occluded-windows'
32
+
33
+ # This disables non-foreground tabs from getting a lower process priority. Useful for parallel test runs.
34
+ options.add_argument '--disable-renderer-backgrounding'
35
+
36
+
26
37
  Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
27
38
  end
@@ -8,16 +8,26 @@ require 'generators/spree/dummy_model/dummy_model_generator'
8
8
  desc 'Generates a dummy app for testing'
9
9
  namespace :common do
10
10
  task :test_app, :user_class do |_t, args|
11
- args.with_defaults(user_class: 'Spree::LegacyUser', install_storefront: 'false', install_admin: 'false')
11
+ args.with_defaults(
12
+ user_class: 'Spree::LegacyUser',
13
+ install_storefront: 'false',
14
+ install_admin: 'false',
15
+ authentication: 'dummy'
16
+ )
12
17
  require ENV['LIB_NAME'].to_s
13
18
 
14
19
  ENV['RAILS_ENV'] = 'test'
15
20
  Rails.env = 'test'
16
21
 
17
- Spree::DummyGenerator.start ["--lib_name=#{ENV['LIB_NAME']}"]
22
+ skip_javascript = ['spree/api', 'spree/core', 'spree/sample', 'spree/emails'].include?(ENV['LIB_NAME'])
23
+
24
+ Spree::DummyGenerator.start [
25
+ "--lib_name=#{ENV['LIB_NAME']}",
26
+ "--skip_javascript=#{skip_javascript}"
27
+ ]
18
28
 
19
29
  # install frontend libraries
20
- unless ['spree/api', 'spree/core', 'spree/sample', 'spree/emails'].include?(ENV['LIB_NAME'])
30
+ unless skip_javascript
21
31
  system('bin/rails importmap:install')
22
32
  system('bin/rails turbo:install')
23
33
  system('bin/rails stimulus:install')
@@ -32,14 +42,15 @@ namespace :common do
32
42
  '--copy_storefront=false',
33
43
  "--install_storefront=#{args[:install_storefront]}",
34
44
  "--install_admin=#{args[:install_admin]}",
35
- "--user_class=#{args[:user_class]}"
45
+ "--user_class=#{args[:user_class]}",
46
+ "--authentication=#{args[:authentication]}"
36
47
  ]
37
48
 
38
49
  puts 'Setting up dummy database...'
39
- system('bin/rails db:environment:set RAILS_ENV=test')
40
- system('bundle exec rake db:drop db:create')
50
+ system('bin/rails db:environment:set RAILS_ENV=test > /dev/null 2>&1')
51
+ system('bundle exec rake db:drop db:create > /dev/null 2>&1')
41
52
  Spree::DummyModelGenerator.start
42
- system('bundle exec rake db:migrate')
53
+ system('bundle exec rake db:migrate > /dev/null 2>&1')
43
54
 
44
55
  begin
45
56
  require "generators/#{ENV['LIB_NAME']}/install/install_generator"
@@ -49,14 +60,11 @@ namespace :common do
49
60
  puts 'Skipping installation no generator to run...'
50
61
  end
51
62
 
52
- unless ['spree/api', 'spree/core', 'spree/sample'].include?(ENV['LIB_NAME'])
53
- puts 'Precompiling assets...'
54
- system('bundle exec rake assets:precompile')
55
- end
63
+ system('bundle exec rake assets:precompile > /dev/null 2>&1') if !skip_javascript || ENV['LIB_NAME'] == 'spree/emails'
56
64
  end
57
65
 
58
66
  task :seed do |_t|
59
67
  puts 'Seeding ...'
60
- system('bundle exec rake db:seed RAILS_ENV=test')
68
+ system('bundle exec rake db:seed RAILS_ENV=test > /dev/null 2>&1')
61
69
  end
62
70
  end
@@ -17,4 +17,20 @@ FactoryBot.define do
17
17
  factory :shipping_no_amount_calculator, class: Spree::Calculator::Shipping::FlatRate do
18
18
  after(:create) { |c| c.set_preference(:amount, 0) }
19
19
  end
20
+
21
+ factory :flat_rate_calculator, class: Spree::Calculator::FlatRate do
22
+ preferred_amount { 10 }
23
+ end
24
+
25
+ factory :flat_percent_item_total_calculator, class: Spree::Calculator::FlatPercentItemTotal do
26
+ preferred_flat_percent { 10 }
27
+ end
28
+
29
+ factory :non_free_shipping_calculator, class: Spree::Calculator::Shipping::FlatRate do
30
+ after(:create) { |c| c.set_preference(:amount, 20.0) }
31
+ end
32
+
33
+ factory :digital_shipping_calculator, class: Spree::Calculator::Shipping::DigitalDelivery do
34
+ after(:create) { |c| c.set_preference(:amount, 0) }
35
+ end
20
36
  end
@@ -5,5 +5,13 @@ FactoryBot.define do
5
5
  sequence(:iso) { |n| "I#{n}" }
6
6
  sequence(:iso3) { |n| "IS#{n}" }
7
7
  numcode { 840 }
8
+
9
+ factory :country_us, class: Spree::Country, parent: :country do
10
+ iso { 'US' }
11
+ iso3 { 'USA' }
12
+ name { 'United States of America' }
13
+ iso_name { 'UNITED STATES' }
14
+ states_required { true }
15
+ end
8
16
  end
9
17
  end
@@ -0,0 +1,7 @@
1
+ FactoryBot.define do
2
+ factory :coupon_code, class: Spree::CouponCode do
3
+ sequence(:code) { |n| "PROMO#{n}" }
4
+ state { :unused }
5
+ promotion
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ FactoryBot.define do
2
+ factory :custom_domain, class: Spree::CustomDomain do
3
+ url { FFaker::Internet.domain_name }
4
+ store { create(:store) }
5
+ default { true }
6
+ end
7
+ end
@@ -0,0 +1,32 @@
1
+ # == Schema Information
2
+ #
3
+ # Table name: spree_exports
4
+ #
5
+ # id :uuid not null, primary key
6
+ # format :integer not null
7
+ # number :string(32) not null
8
+ # search_params :jsonb
9
+ # type :string not null
10
+ # created_at :datetime not null
11
+ # updated_at :datetime not null
12
+ # project_id :uuid not null
13
+ # store_id :uuid not null
14
+ # user_id :uuid
15
+ # vendor_id :uuid
16
+ #
17
+ FactoryBot.define do
18
+ factory :export, class: 'Spree::Export' do
19
+ store { create(:store) }
20
+ user { create(:admin_user) }
21
+ type { 'Spree::Export::Products' }
22
+ format { 'csv' }
23
+
24
+ factory :product_export, class: 'Spree::Exports::Products', parent: :export do
25
+ type { 'Spree::Exports::Products' }
26
+ end
27
+
28
+ factory :order_export, class: 'Spree::Exports::Orders', parent: :export do
29
+ type { 'Spree::Exports::Orders' }
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,7 @@
1
+ FactoryBot.define do
2
+ factory :gateway_customer, class: Spree::GatewayCustomer do
3
+ sequence(:profile_id) { |n| "cus_#{n}" }
4
+ user { |p| p.association(:user) }
5
+ payment_method { |p| p.association(:payment_method) }
6
+ end
7
+ end
@@ -47,14 +47,20 @@ FactoryBot.define do
47
47
  without_line_items { false }
48
48
  shipment_cost { 100 }
49
49
  shipping_method_filter { Spree::ShippingMethod::DISPLAY_ON_FRONT_END }
50
+ variants { [] }
50
51
  end
51
52
 
52
53
  after(:create) do |order, evaluator|
53
- unless evaluator.without_line_items
54
+ if evaluator.variants.empty? && !evaluator.without_line_items
54
55
  create_list(:line_item, evaluator.line_items_count, order: order, price: evaluator.line_items_price)
55
56
  order.line_items.reload
56
57
  end
57
58
 
59
+ if evaluator.variants.any?
60
+ evaluator.variants.each { |variant| create(:line_item, order: order, product: variant.product, variant: variant, price: evaluator.line_items_price) }
61
+ order.line_items.reload
62
+ end
63
+
58
64
  stock_location = order.line_items&.first&.variant&.stock_items&.first&.stock_location || create(:stock_location)
59
65
  create(:shipment, order: order, cost: evaluator.shipment_cost, stock_location: stock_location)
60
66
  order.shipments.reload
@@ -89,8 +95,13 @@ FactoryBot.define do
89
95
  payment_state { 'paid' }
90
96
  shipment_state { 'ready' }
91
97
 
92
- after(:create) do |order|
93
- create(:payment, amount: order.total, order: order, state: 'completed')
98
+ transient do
99
+ with_payment { true }
100
+ end
101
+
102
+ after(:create) do |order, evaluator|
103
+ create(:payment, amount: order.total, order: order, state: 'completed') if evaluator.with_payment
104
+
94
105
  order.shipments.each do |shipment|
95
106
  shipment.inventory_units.update_all state: 'on_hand'
96
107
  shipment.update_column('state', 'ready')
@@ -0,0 +1,21 @@
1
+ FactoryBot.define do
2
+ factory :page_block, class: Spree::PageBlock do
3
+ section { create(:page_section) }
4
+
5
+ trait :buttons do
6
+ type { 'Spree::PageBlocks::Buttons' }
7
+ end
8
+
9
+ trait :nav do
10
+ section { create(:header_page_section) }
11
+
12
+ type { 'Spree::PageBlocks::Nav' }
13
+ end
14
+
15
+ trait :heading do
16
+ type { 'Spree::PageBlocks::Heading' }
17
+ end
18
+
19
+ factory :heading_block, traits: [:heading], class: Spree::PageBlocks::Heading
20
+ end
21
+ end