spree_core 5.3.4 → 5.4.0.beta2

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 (331) hide show
  1. checksums.yaml +4 -4
  2. data/app/finders/spree/orders/find_complete.rb +33 -2
  3. data/app/finders/spree/products/find.rb +1 -28
  4. data/app/finders/spree/stores/find_default.rb +17 -0
  5. data/app/finders/spree/variants/visible_finder.rb +1 -0
  6. data/app/helpers/spree/addresses_helper.rb +1 -2
  7. data/app/helpers/spree/base_helper.rb +6 -58
  8. data/app/mailers/spree/base_mailer.rb +4 -3
  9. data/app/models/concerns/spree/adjustment_source.rb +0 -8
  10. data/app/models/concerns/spree/admin_user_methods.rb +32 -2
  11. data/app/models/concerns/spree/image_methods.rb +4 -0
  12. data/app/models/concerns/spree/metadata.rb +10 -0
  13. data/app/models/concerns/spree/number_as_param.rb +5 -3
  14. data/app/models/concerns/spree/prefixed_id.rb +82 -0
  15. data/app/models/concerns/spree/product_scopes.rb +35 -65
  16. data/app/models/concerns/spree/publishable.rb +47 -47
  17. data/app/models/concerns/spree/{multi_store_resource.rb → store_scoped_resource.rb} +1 -10
  18. data/app/models/concerns/spree/stores/markets.rb +124 -0
  19. data/app/models/concerns/spree/user_methods.rb +7 -7
  20. data/app/models/concerns/spree/user_payment_source.rb +2 -0
  21. data/app/models/concerns/spree/user_roles.rb +1 -0
  22. data/app/models/concerns/spree/vat_price_calculation.rb +2 -2
  23. data/app/models/spree/ability.rb +18 -5
  24. data/app/models/spree/address.rb +33 -2
  25. data/app/models/spree/adjustable/promotion_accumulator.rb +1 -1
  26. data/app/models/spree/adjustment.rb +3 -20
  27. data/app/models/spree/api_key.rb +102 -0
  28. data/app/models/spree/asset.rb +2 -0
  29. data/app/models/spree/authentication/strategies/base_strategy.rb +55 -0
  30. data/app/models/spree/authentication/strategies/email_password_strategy.rb +47 -0
  31. data/app/models/spree/base.rb +1 -0
  32. data/app/models/spree/calculator.rb +2 -0
  33. data/app/models/spree/country.rb +60 -0
  34. data/app/models/spree/coupon_code.rb +2 -0
  35. data/app/models/spree/credit_card.rb +2 -27
  36. data/app/models/spree/current.rb +45 -4
  37. data/app/models/spree/customer_group.rb +2 -0
  38. data/app/models/spree/customer_return.rb +2 -0
  39. data/app/models/spree/digital.rb +2 -0
  40. data/app/models/spree/digital_link.rb +2 -0
  41. data/app/models/spree/export.rb +3 -2
  42. data/app/models/spree/exports/products.rb +0 -6
  43. data/app/models/spree/fulfilment_changer.rb +8 -2
  44. data/app/models/spree/gateway/bogus.rb +69 -9
  45. data/app/models/spree/gateway.rb +0 -3
  46. data/app/models/spree/gateway_customer.rb +2 -0
  47. data/app/models/spree/gift_card.rb +2 -0
  48. data/app/models/spree/gift_card_batch.rb +6 -0
  49. data/app/models/spree/image/configuration/active_storage.rb +0 -2
  50. data/app/models/spree/image.rb +25 -31
  51. data/app/models/spree/import.rb +5 -3
  52. data/app/models/spree/import_mapping.rb +2 -0
  53. data/app/models/spree/import_row.rb +2 -0
  54. data/app/models/spree/import_schemas/customers.rb +21 -0
  55. data/app/models/spree/imports/customers.rb +9 -0
  56. data/app/models/spree/integration.rb +2 -0
  57. data/app/models/spree/inventory_unit.rb +2 -0
  58. data/app/models/spree/invitation.rb +6 -6
  59. data/app/models/spree/legacy_admin_user.rb +31 -0
  60. data/app/models/spree/legacy_user.rb +19 -1
  61. data/app/models/spree/line_item.rb +15 -4
  62. data/app/models/spree/log_entry.rb +10 -5
  63. data/app/models/spree/market.rb +83 -0
  64. data/app/models/spree/market_country.rb +25 -0
  65. data/app/models/spree/metafield.rb +2 -0
  66. data/app/models/spree/metafield_definition.rb +2 -0
  67. data/app/models/spree/newsletter_subscriber.rb +2 -0
  68. data/app/models/spree/option_type.rb +2 -0
  69. data/app/models/spree/option_value.rb +2 -0
  70. data/app/models/spree/order/address_book.rb +2 -1
  71. data/app/models/spree/order/checkout.rb +0 -18
  72. data/app/models/spree/order.rb +93 -56
  73. data/app/models/spree/payment/gateway_options.rb +2 -2
  74. data/app/models/spree/payment/processing.rb +5 -5
  75. data/app/models/spree/payment.rb +7 -2
  76. data/app/models/spree/payment_capture_event.rb +2 -0
  77. data/app/models/spree/payment_connection_error.rb +3 -0
  78. data/app/models/spree/payment_method/check.rb +1 -1
  79. data/app/models/spree/payment_method/store_credit.rb +5 -5
  80. data/app/models/spree/payment_method.rb +59 -1
  81. data/app/models/spree/payment_response.rb +70 -0
  82. data/app/models/spree/payment_session.rb +109 -0
  83. data/app/models/spree/payment_sessions/bogus.rb +4 -0
  84. data/app/models/spree/payment_setup_session.rb +79 -0
  85. data/app/models/spree/payment_source.rb +2 -0
  86. data/app/models/spree/permission_sets/default_customer.rb +19 -5
  87. data/app/models/spree/permission_sets/product_display.rb +0 -2
  88. data/app/models/spree/permission_sets/product_management.rb +0 -2
  89. data/app/models/spree/policy.rb +2 -0
  90. data/app/models/spree/price.rb +26 -2
  91. data/app/models/spree/price_list.rb +2 -0
  92. data/app/models/spree/price_rule.rb +2 -0
  93. data/app/models/spree/price_rules/market_rule.rb +19 -0
  94. data/app/models/spree/product.rb +45 -101
  95. data/app/models/spree/promotion/rules/country.rb +1 -1
  96. data/app/models/spree/promotion.rb +5 -15
  97. data/app/models/spree/promotion_action.rb +2 -0
  98. data/app/models/spree/promotion_category.rb +2 -0
  99. data/app/models/spree/promotion_handler/coupon.rb +3 -3
  100. data/app/models/spree/promotion_rule.rb +2 -0
  101. data/app/models/spree/prototype.rb +2 -3
  102. data/app/models/spree/refund.rb +8 -2
  103. data/app/models/spree/refund_reason.rb +2 -0
  104. data/app/models/spree/reimbursement/credit.rb +2 -0
  105. data/app/models/spree/reimbursement.rb +2 -0
  106. data/app/models/spree/reimbursement_type.rb +2 -0
  107. data/app/models/spree/report.rb +3 -1
  108. data/app/models/spree/return_authorization.rb +2 -0
  109. data/app/models/spree/return_authorization_reason.rb +2 -0
  110. data/app/models/spree/return_item.rb +2 -0
  111. data/app/models/spree/role.rb +2 -0
  112. data/app/models/spree/shipment/emails.rb +1 -0
  113. data/app/models/spree/shipment.rb +11 -1
  114. data/app/models/spree/shipping_category.rb +5 -3
  115. data/app/models/spree/shipping_method.rb +2 -0
  116. data/app/models/spree/shipping_method_category.rb +2 -0
  117. data/app/models/spree/shipping_rate.rb +2 -0
  118. data/app/models/spree/state_change.rb +2 -0
  119. data/app/models/spree/stock_item.rb +2 -0
  120. data/app/models/spree/stock_location.rb +2 -0
  121. data/app/models/spree/stock_movement.rb +2 -0
  122. data/app/models/spree/stock_transfer.rb +2 -1
  123. data/app/models/spree/store.rb +111 -219
  124. data/app/models/spree/store_credit.rb +6 -0
  125. data/app/models/spree/store_credit_category.rb +2 -0
  126. data/app/models/spree/store_credit_event.rb +2 -0
  127. data/app/models/spree/store_credit_type.rb +2 -0
  128. data/app/models/spree/store_product.rb +2 -0
  129. data/app/models/spree/tax_category.rb +3 -11
  130. data/app/models/spree/tax_rate.rb +2 -0
  131. data/app/models/spree/taxon.rb +2 -15
  132. data/app/models/spree/taxon_rule.rb +2 -0
  133. data/app/models/spree/taxonomy.rb +2 -0
  134. data/app/models/spree/user_identity.rb +81 -0
  135. data/app/models/spree/variant.rb +15 -43
  136. data/app/models/spree/webhook_delivery.rb +2 -0
  137. data/app/models/spree/webhook_endpoint.rb +2 -0
  138. data/app/models/spree/wished_item.rb +15 -0
  139. data/app/models/spree/wishlist.rb +2 -8
  140. data/app/models/spree/zone.rb +3 -10
  141. data/app/presenters/spree/filters/price_presenter.rb +1 -0
  142. data/app/presenters/spree/filters/price_range_presenter.rb +1 -0
  143. data/app/presenters/spree/filters/quantified_price_range_presenter.rb +1 -0
  144. data/app/presenters/spree/product_summary_presenter.rb +1 -0
  145. data/app/services/spree/addresses/helper.rb +22 -3
  146. data/app/services/spree/cart/add_item.rb +8 -4
  147. data/app/services/spree/cart/associate.rb +19 -6
  148. data/app/services/spree/cart/create.rb +13 -2
  149. data/app/services/spree/checkout/select_shipping_method.rb +13 -1
  150. data/app/services/spree/classifications/reposition.rb +5 -0
  151. data/app/services/spree/imports/row_processors/customer.rb +70 -0
  152. data/app/services/spree/orders/approve.rb +5 -3
  153. data/app/services/spree/orders/cancel.rb +9 -4
  154. data/app/services/spree/products/duplicator.rb +0 -12
  155. data/app/services/spree/products/prepare_nested_attributes.rb +1 -13
  156. data/app/services/spree/sample_data/import_runner.rb +54 -0
  157. data/app/services/spree/sample_data/loader.rb +78 -0
  158. data/app/services/spree/seeds/admin_user.rb +2 -3
  159. data/app/services/spree/seeds/all.rb +1 -0
  160. data/app/services/spree/seeds/api_keys.rb +16 -0
  161. data/app/services/spree/seeds/stores.rb +2 -4
  162. data/app/sorters/spree/orders/sort.rb +4 -0
  163. data/app/subscribers/spree/product_metrics_subscriber.rb +4 -4
  164. data/config/brakeman.ignore +120 -0
  165. data/config/locales/en.yml +23 -21
  166. data/db/migrate/20210914000000_spree_four_three.rb +0 -38
  167. data/db/migrate/20210915064329_add_metadata_to_spree_multiple_tables.rb +0 -1
  168. data/db/migrate/20250923141900_create_spree_user_identities.rb +17 -0
  169. data/db/migrate/20260123000000_create_spree_api_keys.rb +19 -0
  170. data/db/migrate/20260131000000_add_thumbnail_id_to_spree_variants_and_products.rb +9 -0
  171. data/db/migrate/20260213000000_create_spree_payment_sessions.rb +27 -0
  172. data/db/migrate/20260218000000_create_spree_payment_setup_sessions.rb +24 -0
  173. data/db/migrate/20260220000000_create_spree_markets.rb +29 -0
  174. data/db/migrate/20260226000000_add_locale_to_spree_orders.rb +5 -0
  175. data/db/migrate/20260226100000_add_token_digest_to_spree_api_keys.rb +21 -0
  176. data/db/sample_data/customers.csv +21 -0
  177. data/db/sample_data/metafield_definitions.rb +7 -0
  178. data/db/sample_data/orders.rb +131 -0
  179. data/db/sample_data/payment_methods.rb +17 -0
  180. data/db/sample_data/products.csv +1083 -0
  181. data/db/sample_data/promotions.rb +8 -0
  182. data/db/sample_data/shipping_methods.rb +39 -0
  183. data/lib/generators/spree/authentication/devise/devise_generator.rb +2 -2
  184. data/lib/generators/spree/authentication/dummy/dummy_generator.rb +54 -0
  185. data/lib/generators/spree/authentication/dummy/templates/authentication_helpers.rb.tt +52 -0
  186. data/lib/generators/spree/authentication/dummy/templates/create_spree_admin_users.rb.tt +33 -0
  187. data/lib/generators/spree/cursor_rules/templates/spree_rules.mdc +1 -3
  188. data/lib/generators/spree/dummy/dummy_generator.rb +1 -1
  189. data/lib/spree/core/configuration.rb +1 -3
  190. data/lib/spree/core/controller_helpers/common.rb +6 -0
  191. data/lib/spree/core/controller_helpers/currency.rb +5 -0
  192. data/lib/spree/core/controller_helpers/order.rb +5 -1
  193. data/lib/spree/core/controller_helpers/store.rb +1 -1
  194. data/lib/spree/core/controller_helpers/strong_parameters.rb +1 -2
  195. data/lib/spree/core/dependencies.rb +3 -11
  196. data/lib/spree/core/engine.rb +17 -17
  197. data/lib/spree/core/pricing/context.rb +6 -3
  198. data/lib/spree/core/pricing/resolver.rb +1 -9
  199. data/lib/spree/core/version.rb +1 -1
  200. data/lib/spree/core.rb +14 -29
  201. data/lib/spree/database_type_utilities.rb +7 -0
  202. data/lib/spree/events.rb +17 -10
  203. data/lib/spree/money.rb +2 -9
  204. data/lib/spree/permitted_attributes.rb +20 -20
  205. data/lib/spree/testing_support/capybara_config.rb +2 -2
  206. data/lib/spree/testing_support/common_rake.rb +15 -4
  207. data/lib/spree/testing_support/factories/api_key_factory.rb +19 -0
  208. data/lib/spree/testing_support/factories/custom_domain_factory.rb +7 -5
  209. data/lib/spree/testing_support/factories/import_factory.rb +12 -0
  210. data/lib/spree/testing_support/factories/market_factory.rb +35 -0
  211. data/lib/spree/testing_support/factories/order_factory.rb +4 -1
  212. data/lib/spree/testing_support/factories/payment_method_factory.rb +3 -6
  213. data/lib/spree/testing_support/factories/payment_session_factory.rb +47 -0
  214. data/lib/spree/testing_support/factories/payment_setup_session_factory.rb +31 -0
  215. data/lib/spree/testing_support/factories/price_rule_factory.rb +10 -0
  216. data/lib/spree/testing_support/factories/product_factory.rb +0 -7
  217. data/lib/spree/testing_support/factories/prototype_factory.rb +0 -2
  218. data/lib/spree/testing_support/factories/user_identity_factory.rb +15 -0
  219. data/lib/spree/testing_support/store.rb +3 -2
  220. data/lib/spree/webhooks.rb +7 -7
  221. data/lib/tasks/core.rake +0 -265
  222. data/lib/tasks/images.rake +20 -0
  223. data/lib/tasks/markets.rake +40 -0
  224. data/lib/tasks/sample_data.rake +15 -0
  225. data/spec/fixtures/files/customers_import.csv +4 -0
  226. metadata +101 -154
  227. data/LICENSE.md +0 -57
  228. data/app/finders/spree/posts/find.rb +0 -137
  229. data/app/finders/spree/product_properties/find_available.rb +0 -20
  230. data/app/finders/spree/stores/find_current.rb +0 -28
  231. data/app/helpers/spree/mail_helper.rb +0 -27
  232. data/app/mailers/spree/test_mailer.rb +0 -8
  233. data/app/models/action_text/video_embed.rb +0 -13
  234. data/app/models/concerns/spree/has_one_link.rb +0 -42
  235. data/app/models/concerns/spree/linkable.rb +0 -9
  236. data/app/models/concerns/spree/previewable.rb +0 -17
  237. data/app/models/spree/custom_domain.rb +0 -59
  238. data/app/models/spree/data_feed/google.rb +0 -15
  239. data/app/models/spree/data_feed.rb +0 -40
  240. data/app/models/spree/gateway/bogus_simple.rb +0 -24
  241. data/app/models/spree/post.rb +0 -106
  242. data/app/models/spree/post_category.rb +0 -44
  243. data/app/models/spree/product_property.rb +0 -51
  244. data/app/models/spree/property.rb +0 -86
  245. data/app/models/spree/property_prototype.rb +0 -9
  246. data/app/models/spree/store_favicon_image.rb +0 -20
  247. data/app/models/spree/store_logo.rb +0 -4
  248. data/app/models/spree/store_mailer_logo.rb +0 -7
  249. data/app/models/spree/taxon_image/configuration/active_storage.rb +0 -26
  250. data/app/models/spree/taxon_image.rb +0 -20
  251. data/app/presenters/spree/filters/properties_presenter.rb +0 -23
  252. data/app/presenters/spree/filters/property_presenter.rb +0 -42
  253. data/app/serializers/spree/events/asset_serializer.rb +0 -22
  254. data/app/serializers/spree/events/base_serializer.rb +0 -61
  255. data/app/serializers/spree/events/customer_return_serializer.rb +0 -20
  256. data/app/serializers/spree/events/digital_link_serializer.rb +0 -20
  257. data/app/serializers/spree/events/digital_serializer.rb +0 -18
  258. data/app/serializers/spree/events/export_serializer.rb +0 -22
  259. data/app/serializers/spree/events/gift_card_batch_serializer.rb +0 -24
  260. data/app/serializers/spree/events/gift_card_serializer.rb +0 -29
  261. data/app/serializers/spree/events/image_serializer.rb +0 -9
  262. data/app/serializers/spree/events/import_row_serializer.rb +0 -23
  263. data/app/serializers/spree/events/import_serializer.rb +0 -24
  264. data/app/serializers/spree/events/invitation_serializer.rb +0 -28
  265. data/app/serializers/spree/events/line_item_serializer.rb +0 -31
  266. data/app/serializers/spree/events/newsletter_subscriber_serializer.rb +0 -21
  267. data/app/serializers/spree/events/order_serializer.rb +0 -39
  268. data/app/serializers/spree/events/payment_serializer.rb +0 -24
  269. data/app/serializers/spree/events/post_category_serializer.rb +0 -20
  270. data/app/serializers/spree/events/post_serializer.rb +0 -26
  271. data/app/serializers/spree/events/price_serializer.rb +0 -22
  272. data/app/serializers/spree/events/product_serializer.rb +0 -24
  273. data/app/serializers/spree/events/promotion_serializer.rb +0 -32
  274. data/app/serializers/spree/events/refund_serializer.rb +0 -23
  275. data/app/serializers/spree/events/reimbursement_serializer.rb +0 -22
  276. data/app/serializers/spree/events/report_serializer.rb +0 -23
  277. data/app/serializers/spree/events/return_authorization_serializer.rb +0 -22
  278. data/app/serializers/spree/events/return_item_serializer.rb +0 -27
  279. data/app/serializers/spree/events/shipment_serializer.rb +0 -24
  280. data/app/serializers/spree/events/stock_item_serializer.rb +0 -22
  281. data/app/serializers/spree/events/stock_movement_serializer.rb +0 -22
  282. data/app/serializers/spree/events/stock_transfer_serializer.rb +0 -22
  283. data/app/serializers/spree/events/store_credit_serializer.rb +0 -30
  284. data/app/serializers/spree/events/user_serializer.rb +0 -18
  285. data/app/serializers/spree/events/variant_serializer.rb +0 -34
  286. data/app/serializers/spree/events/wished_item_serializer.rb +0 -20
  287. data/app/serializers/spree/events/wishlist_serializer.rb +0 -22
  288. data/app/services/spree/data_feeds/google/optional_attributes.rb +0 -23
  289. data/app/services/spree/data_feeds/google/optional_sub_attributes.rb +0 -21
  290. data/app/services/spree/data_feeds/google/products_list.rb +0 -14
  291. data/app/services/spree/data_feeds/google/required_attributes.rb +0 -68
  292. data/app/services/spree/data_feeds/google/rss.rb +0 -109
  293. data/app/sorters/spree/posts/sort.rb +0 -40
  294. data/app/views/action_text/video_embeds/_thumbnail.html.erb +0 -1
  295. data/app/views/action_text/video_embeds/_video_embed.html.erb +0 -3
  296. data/app/views/layouts/action_text/contents/_content.html.erb +0 -3
  297. data/app/views/spree/test_mailer/test_email.html.erb +0 -40
  298. data/app/views/spree/test_mailer/test_email.text.erb +0 -4
  299. data/config/initializers/oembed.rb +0 -1
  300. data/db/migrate/20221229132350_create_spree_data_feed_settings.rb +0 -14
  301. data/db/migrate/20230109084253_create_product_property_translations.rb +0 -24
  302. data/db/migrate/20230109105943_create_property_translations.rb +0 -24
  303. data/db/migrate/20230415155958_rename_data_feed_settings_table.rb +0 -5
  304. data/db/migrate/20230415160828_rename_data_feed_table_columns.rb +0 -7
  305. data/db/migrate/20230415161226_add_indexes_to_data_feeds_table.rb +0 -5
  306. data/db/migrate/20230512094803_rename_data_feeds_column_provider_to_type.rb +0 -5
  307. data/db/migrate/20240914153106_add_display_on_to_spree_properties.rb +0 -5
  308. data/db/migrate/20240915144935_add_position_to_spree_properties.rb +0 -6
  309. data/db/migrate/20250121160028_create_spree_posts_and_spree_post_categories.rb +0 -33
  310. data/db/migrate/20250127083740_add_kind_to_spree_properties.rb +0 -5
  311. data/db/migrate/20250217171018_create_action_text_video_embeds.rb +0 -11
  312. data/db/migrate/20250305121657_remove_spree_posts_indices.rb +0 -7
  313. data/db/migrate/20250730154601_add_unique_index_on_spree_properties_name.rb +0 -24
  314. data/lib/spree/core/controller_helpers/search.rb +0 -17
  315. data/lib/spree/core/product_filters.rb +0 -204
  316. data/lib/spree/core/query_filters/comparable.rb +0 -46
  317. data/lib/spree/core/query_filters/date.rb +0 -8
  318. data/lib/spree/core/query_filters/number.rb +0 -8
  319. data/lib/spree/core/query_filters/text.rb +0 -32
  320. data/lib/spree/core/query_filters.rb +0 -11
  321. data/lib/spree/core/search/base.rb +0 -144
  322. data/lib/spree/testing_support/factories/favicon_image_factory.rb +0 -9
  323. data/lib/spree/testing_support/factories/google_data_feed_factory.rb +0 -7
  324. data/lib/spree/testing_support/factories/post_category_factory.rb +0 -7
  325. data/lib/spree/testing_support/factories/post_factory.rb +0 -22
  326. data/lib/spree/testing_support/factories/product_property_factory.rb +0 -7
  327. data/lib/spree/testing_support/factories/property_factory.rb +0 -28
  328. data/lib/spree/testing_support/factories/taxon_image_factory.rb +0 -9
  329. data/lib/spree/testing_support/flash.rb +0 -25
  330. data/lib/spree/testing_support/flatpickr_capybara.rb +0 -124
  331. data/lib/tasks/exchanges.rake +0 -66
@@ -0,0 +1,8 @@
1
+ promotion = Spree::Promotion.where(
2
+ name: 'Free Shipping',
3
+ code: 'FREESHIP'
4
+ ).first_or_create! do |promo|
5
+ promo.stores = Spree::Store.all
6
+ end
7
+
8
+ Spree::Promotion::Actions::FreeShipping.where(promotion: promotion).first_or_create!
@@ -0,0 +1,39 @@
1
+ begin
2
+ north_america = Spree::Zone.find_by!(name: 'North America')
3
+ rescue ActiveRecord::RecordNotFound
4
+ puts "Couldn't find 'North America' zone. Did you run `rake db:seed` first?"
5
+ exit
6
+ end
7
+
8
+ europe_vat = Spree::Zone.find_by!(name: 'EU_VAT')
9
+ shipping_category = Spree::ShippingCategory.find_or_create_by!(name: 'Default')
10
+
11
+ shipping_methods = [
12
+ { name: 'UPS Ground (USD)', zones: [north_america], display_on: 'both', shipping_categories: [shipping_category] },
13
+ { name: 'UPS Two Day (USD)', zones: [north_america], display_on: 'both', shipping_categories: [shipping_category] },
14
+ { name: 'UPS One Day (USD)', zones: [north_america], display_on: 'both', shipping_categories: [shipping_category] },
15
+ { name: 'UPS Ground (EU)', zones: [europe_vat], display_on: 'both', shipping_categories: [shipping_category] },
16
+ { name: 'UPS Ground (EUR)', zones: [europe_vat], display_on: 'both', shipping_categories: [shipping_category] }
17
+ ]
18
+
19
+ shipping_methods.each do |attributes|
20
+ Spree::ShippingMethod.where(name: attributes[:name]).first_or_create! do |shipping_method|
21
+ shipping_method.calculator = Spree::Calculator::Shipping::FlatRate.create!
22
+ shipping_method.zones = attributes[:zones]
23
+ shipping_method.display_on = attributes[:display_on]
24
+ shipping_method.shipping_categories = attributes[:shipping_categories]
25
+ end
26
+ end
27
+
28
+ {
29
+ 'UPS Ground (USD)' => [5, 'USD'],
30
+ 'UPS Ground (EU)' => [5, 'USD'],
31
+ 'UPS One Day (USD)' => [15, 'USD'],
32
+ 'UPS Two Day (USD)' => [10, 'USD'],
33
+ 'UPS Ground (EUR)' => [8, 'EUR']
34
+ }.each do |shipping_method_name, (price, currency)|
35
+ shipping_method = Spree::ShippingMethod.find_by!(name: shipping_method_name)
36
+ shipping_method.calculator.preferences = { amount: price, currency: currency }
37
+ shipping_method.calculator.save!
38
+ shipping_method.save!
39
+ end
@@ -55,7 +55,7 @@ module Spree
55
55
  inject_into_file admin_user_class_file, after: "class #{Spree.admin_user_class.name} < ApplicationRecord\n" do
56
56
  <<-RUBY
57
57
  # Spree modules
58
- include Spree::UserMethods
58
+ include Spree::AdminUserMethods
59
59
  RUBY
60
60
  end
61
61
  gsub_file admin_user_class_file, "< ApplicationRecord", "< Spree.base_class"
@@ -65,7 +65,7 @@ module Spree
65
65
  say "Could not locate admin user model file at #{admin_user_class_file}. Please add these lines manually:", :red
66
66
  say <<~RUBY
67
67
  # Spree modules
68
- include Spree::UserMethods
68
+ include Spree::AdminUserMethods
69
69
  RUBY
70
70
 
71
71
  say "Please replace < ApplicationRecord with < Spree.base_class in #{admin_user_class_file}"
@@ -0,0 +1,54 @@
1
+ require 'rails/generators'
2
+
3
+ module Spree
4
+ module Authentication
5
+ class DummyGenerator < Rails::Generators::Base
6
+ desc 'Set up a Spree installation with dummy authentication for testing. Creates a separate spree_admin_users table.'
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 create_authentication_helpers
15
+ template 'authentication_helpers.rb.tt', 'lib/spree/authentication_helpers.rb'
16
+ end
17
+
18
+ def configure_authentication_helpers
19
+ file_action = File.exist?('config/initializers/spree.rb') ? :append_file : :create_file
20
+ send(file_action, 'config/initializers/spree.rb') do
21
+ <<~RUBY
22
+
23
+ Rails.application.config.to_prepare do
24
+ require_dependency 'spree/authentication_helpers'
25
+ end
26
+ RUBY
27
+ end
28
+ end
29
+
30
+ def create_admin_users_migration
31
+ # Use a fixed early timestamp (20210913) to ensure this migration runs BEFORE
32
+ # any Spree core migrations that reference spree_admin_users table.
33
+ # The earliest such migration is 20250122113708_add_first_and_last_name_to_spree_admin_class.rb
34
+ # We use a timestamp before the main Spree migration (20210914000000_spree_four_three.rb)
35
+ migration_file = File.join('db', 'migrate', '20210913000000_create_spree_admin_users.rb')
36
+
37
+ # Skip if migration already exists
38
+ return if File.exist?(migration_file) || migration_exists?('create_spree_admin_users')
39
+
40
+ template 'create_spree_admin_users.rb.tt', migration_file
41
+ end
42
+
43
+ private
44
+
45
+ def migration_exists?(name)
46
+ Dir.glob(File.join('db', 'migrate', "*_#{name}.rb")).any?
47
+ end
48
+
49
+ def migration_version
50
+ "[#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}]"
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,52 @@
1
+ # Dummy authentication helpers for testing purposes.
2
+ # These provide stub implementations that don't require actual routes.
3
+ module Spree
4
+ module AuthenticationHelpers
5
+ def self.included(receiver)
6
+ receiver.helper_method(
7
+ :spree_current_user,
8
+ :spree_login_path,
9
+ :spree_signup_path,
10
+ :spree_logout_path,
11
+ :spree_forgot_password_path,
12
+ :spree_edit_password_path,
13
+ :spree_admin_login_path,
14
+ :spree_admin_logout_path
15
+ )
16
+ end
17
+
18
+ def spree_current_user
19
+ @spree_current_user
20
+ end
21
+
22
+ def spree_login_path(_opts = {})
23
+ '/login'
24
+ end
25
+
26
+ def spree_signup_path(_opts = {})
27
+ '/signup'
28
+ end
29
+
30
+ def spree_logout_path(_opts = {})
31
+ '/logout'
32
+ end
33
+
34
+ def spree_forgot_password_path(_opts = {})
35
+ '/forgot_password'
36
+ end
37
+
38
+ def spree_edit_password_path(_opts = {})
39
+ '/edit_password'
40
+ end
41
+
42
+ def spree_admin_login_path(_opts = {})
43
+ '/admin/login'
44
+ end
45
+
46
+ def spree_admin_logout_path(_opts = {})
47
+ '/admin/logout'
48
+ end
49
+ end
50
+ end
51
+
52
+ ApplicationController.include Spree::AuthenticationHelpers if defined?(ApplicationController)
@@ -0,0 +1,33 @@
1
+ class CreateSpreeAdminUsers < ActiveRecord::Migration<%= migration_version %>
2
+ def change
3
+ create_table :spree_admin_users do |t|
4
+ t.string :encrypted_password, limit: 128
5
+ t.string :password_salt, limit: 128
6
+ t.string :email
7
+ t.string :remember_token
8
+ t.string :persistence_token
9
+ t.string :reset_password_token
10
+ t.string :perishable_token
11
+ t.integer :sign_in_count, default: 0, null: false
12
+ t.integer :failed_attempts, default: 0, null: false
13
+ t.datetime :last_request_at
14
+ t.datetime :current_sign_in_at
15
+ t.datetime :last_sign_in_at
16
+ t.string :current_sign_in_ip
17
+ t.string :last_sign_in_ip
18
+ t.string :login
19
+ t.string :authentication_token
20
+ t.string :unlock_token
21
+ t.datetime :locked_at
22
+ t.datetime :remember_created_at
23
+ t.datetime :reset_password_sent_at
24
+ t.string :first_name
25
+ t.string :last_name
26
+ t.string :selected_locale
27
+
28
+ t.timestamps
29
+ end
30
+
31
+ add_index :spree_admin_users, :email, unique: true
32
+ end
33
+ end
@@ -77,9 +77,7 @@ class Spree::Product < Spree.base_class
77
77
  include Spree::Metafields
78
78
 
79
79
  has_many :variants, class_name: 'Spree::Variant', dependent: :destroy
80
- has_many :product_properties, class_name: 'Spree::ProductProperty', dependent: :destroy
81
- has_many :properties, through: :product_properties, source: :property
82
-
80
+
83
81
  scope :available, -> { where(available_on: ..Time.current) }
84
82
 
85
83
  validates :name, presence: true
@@ -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_admin spree_storefront spree_api spree_emails).freeze
7
+ SPREE_GEMS = %w(spree_admin spree_api spree_emails).freeze
8
8
 
9
9
  desc 'Creates blank Rails application, installs Spree and all sample data'
10
10
 
@@ -15,7 +15,6 @@
15
15
  # a.get :color
16
16
  # a.preferred_color
17
17
  #
18
- require 'spree/core/search/base'
19
18
  require 'spree/core/preferences/configuration' # for compatibility reasons
20
19
  require 'spree/core/preferences/runtime_configuration'
21
20
  require 'spree/core/preferences/preferable'
@@ -40,6 +39,7 @@ module Spree
40
39
  preference :company, :boolean, default: false, deprecated: 'Use the company_field_enabled preference in the Spree::Store model' # Request company field for billing and shipping addr
41
40
  preference :currency, :string, default: 'USD', deprecated: true
42
41
  preference :credit_to_new_allocation, :boolean, default: false
42
+ preference :disable_migration_check, :boolean, default: false # when turned on disables the startup warning about missing engine migrations
43
43
  preference :disable_sku_validation, :boolean, default: false # when turned off disables the built-in SKU uniqueness validation
44
44
  preference :disable_store_presence_validation, :boolean, default: false # when turned off disables Store presence validation for Products and Payment Methods
45
45
  preference :events_log_enabled, :boolean, default: true # Log all Spree events to Rails logger
@@ -82,7 +82,6 @@ module Spree
82
82
  preference :mailer_logo, :string, deprecated: true
83
83
  preference :max_level_in_taxons_menu, :integer, deprecated: true
84
84
  preference :non_expiring_credit_types, :array, default: []
85
- preference :product_properties_enabled, :boolean, default: false # enable legacy product properties
86
85
  preference :products_per_page, :integer, default: 12
87
86
  preference :require_master_price, :boolean, default: false
88
87
  preference :restock_inventory, :boolean, default: true # Determines if a return item is restocked automatically once it has been received
@@ -111,7 +110,6 @@ module Spree
111
110
  preference :gift_card_batch_web_limit, :integer, default: 500 # number of gift card codes to be generated in the web process, more than this will be generated in a background job
112
111
  preference :gift_card_batch_limit, :integer, default: 50_000
113
112
 
114
- attr_writer :searcher_class
115
113
  end
116
114
  end
117
115
  end
@@ -1,7 +1,13 @@
1
1
  module Spree
2
2
  module Core
3
3
  module ControllerHelpers
4
+ # @deprecated This module is deprecated and will be removed in Spree 5.5.
4
5
  module Common
6
+ def self.included(base)
7
+ Spree::Deprecation.warn(
8
+ 'Spree::Core::ControllerHelpers::Common is deprecated and will be removed in Spree 5.5.'
9
+ )
10
+ end
5
11
  end
6
12
  end
7
13
  end
@@ -39,8 +39,13 @@ module Spree
39
39
  end
40
40
 
41
41
  # Returns the list of supported currencies for all stores.
42
+ # @deprecated This method will be removed in Spree 5.5.
42
43
  # @return [Array<String>] the list of supported currencies, eg. `["USD", "EUR"]`
43
44
  def supported_currencies_for_all_stores
45
+ Spree::Deprecation.warn(
46
+ 'supported_currencies_for_all_stores is deprecated and will be removed in Spree 5.5.'
47
+ )
48
+
44
49
  @supported_currencies_for_all_stores ||= begin
45
50
  (
46
51
  Spree::Store.pluck(:supported_currencies).map { |c| c&.split(',') }.flatten + Spree::Store.pluck(:default_currency)
@@ -15,8 +15,12 @@ module Spree
15
15
  @order_token ||= cookies.signed[:token] || params[:order_token]
16
16
  end
17
17
 
18
- # Used in the link_to_cart helper.
18
+ # @deprecated Use `current_order` instead. This method will be removed in Spree 5.5.
19
19
  def simple_current_order
20
+ Spree::Deprecation.warn(
21
+ 'simple_current_order is deprecated and will be removed in Spree 5.5. Use current_order instead.'
22
+ )
23
+
20
24
  return @simple_current_order if @simple_current_order
21
25
 
22
26
  @simple_current_order = find_order_by_token_or_user
@@ -61,7 +61,7 @@ module Spree
61
61
 
62
62
  def current_tax_zone
63
63
  @current_tax_zone ||= begin
64
- zone = @current_order&.tax_zone || Spree::Zone.default_tax || current_store.checkout_zone
64
+ zone = @current_order&.tax_zone || Spree::Zone.default_tax
65
65
  Spree::Current.zone = zone
66
66
  zone
67
67
  end
@@ -34,8 +34,7 @@ module Spree
34
34
  def permitted_product_attributes
35
35
  permitted_attributes.product_attributes + [
36
36
  variants_attributes: permitted_variant_attributes + ['id', :_destroy],
37
- master_attributes: permitted_variant_attributes + ['id'],
38
- product_properties_attributes: permitted_product_properties_attributes + ['id', :_destroy]
37
+ master_attributes: permitted_variant_attributes + ['id']
39
38
  ]
40
39
  end
41
40
 
@@ -56,9 +56,8 @@ module Spree
56
56
  # sorter
57
57
  collection_sorter: 'Spree::BaseSorter',
58
58
  order_sorter: 'Spree::BaseSorter',
59
+ posts_sorter: nil,
59
60
  products_sorter: 'Spree::Products::Sort',
60
- posts_sorter: 'Spree::Posts::Sort',
61
-
62
61
  # paginator
63
62
  collection_paginator: 'Spree::Shared::Paginate',
64
63
 
@@ -87,24 +86,17 @@ module Spree
87
86
 
88
87
  payment_create_service: 'Spree::Payments::Create',
89
88
 
90
- # data feeds
91
- data_feeds_google_rss_service: 'Spree::DataFeeds::Google::Rss',
92
- data_feeds_google_optional_attributes_service: 'Spree::DataFeeds::Google::OptionalAttributes',
93
- data_feeds_google_required_attributes_service: 'Spree::DataFeeds::Google::RequiredAttributes',
94
- data_feeds_google_optional_sub_attributes_service: 'Spree::DataFeeds::Google::OptionalSubAttributes',
95
- data_feeds_google_products_list: 'Spree::DataFeeds::Google::ProductsList',
96
-
97
89
  # finders
98
90
  address_finder: 'Spree::Addresses::Find',
99
91
  country_finder: 'Spree::Countries::Find',
100
92
  cms_page_finder: nil, # LEGACY
101
93
  menu_finder: nil, # LEGACY
102
94
  current_order_finder: 'Spree::Orders::FindCurrent',
103
- current_store_finder: 'Spree::Stores::FindCurrent',
95
+ current_store_finder: 'Spree::Stores::FindDefault',
104
96
  completed_order_finder: 'Spree::Orders::FindComplete',
105
97
  credit_card_finder: 'Spree::CreditCards::Find',
98
+ posts_finder: nil,
106
99
  products_finder: 'Spree::Products::Find',
107
- posts_finder: 'Spree::Posts::Find',
108
100
  taxon_finder: 'Spree::Taxons::Find',
109
101
  line_item_by_variant_finder: 'Spree::LineItems::FindByVariant',
110
102
  variant_finder: 'Spree::Variants::Find'
@@ -14,7 +14,6 @@ module Spree
14
14
  :promotions,
15
15
  :pricing,
16
16
  :line_item_comparison_hooks,
17
- :data_feed_types,
18
17
  :export_types,
19
18
  :import_types,
20
19
  :taxon_rules,
@@ -29,7 +28,9 @@ module Spree
29
28
  :analytics_events,
30
29
  :analytics_event_handlers,
31
30
  :integrations,
32
- :subscribers)
31
+ :subscribers,
32
+ :store_authentication_strategies,
33
+ :admin_authentication_strategies)
33
34
  SpreeCalculators = Struct.new(:shipping_methods, :tax_rates, :promotion_actions_create_adjustments, :promotion_actions_create_item_adjustments)
34
35
  PromoEnvironment = Struct.new(:rules, :actions)
35
36
  PricingEnvironment = Struct.new(:rules)
@@ -41,10 +42,6 @@ module Spree
41
42
  # Add app/subscribers to autoload paths
42
43
  config.paths.add 'app/subscribers', eager_load: true
43
44
 
44
- rake_tasks do
45
- load File.join(root, 'lib', 'tasks', 'exchanges.rake')
46
- end
47
-
48
45
  initializer 'spree.environment', before: :load_config_initializers do |app|
49
46
  app.config.spree = Environment.new(SpreeCalculators.new, SpreeValidators.new, Spree::Core::Configuration.new, Spree::Core::Dependencies.new)
50
47
 
@@ -125,7 +122,6 @@ module Spree
125
122
 
126
123
  Rails.application.config.spree.payment_methods = [
127
124
  Spree::Gateway::Bogus,
128
- Spree::Gateway::BogusSimple,
129
125
  Spree::Gateway::CustomPaymentSourceMethod,
130
126
  Spree::PaymentMethod::Check,
131
127
  Spree::PaymentMethod::StoreCredit
@@ -166,6 +162,7 @@ module Spree
166
162
 
167
163
  Rails.application.config.spree.pricing.rules.concat [
168
164
  Spree::PriceRules::ZoneRule,
165
+ Spree::PriceRules::MarketRule,
169
166
  Spree::PriceRules::UserRule,
170
167
  Spree::PriceRules::CustomerGroupRule,
171
168
  Spree::PriceRules::VolumeRule
@@ -178,10 +175,6 @@ module Spree
178
175
  Promotion::Actions::FreeShipping
179
176
  ]
180
177
 
181
- Rails.application.config.spree.data_feed_types = [
182
- Spree::DataFeed::Google
183
- ]
184
-
185
178
  Rails.application.config.spree.export_types = [
186
179
  Spree::Exports::Products,
187
180
  Spree::Exports::Orders,
@@ -192,6 +185,7 @@ module Spree
192
185
 
193
186
  Rails.application.config.spree.import_types = [
194
187
  Spree::Imports::Products,
188
+ Spree::Imports::Customers,
195
189
  ]
196
190
 
197
191
  Rails.application.config.spree.taxon_rules = [
@@ -208,7 +202,6 @@ module Spree
208
202
  Rails.application.config.spree.translatable_resources = [
209
203
  Spree::OptionType,
210
204
  Spree::Product,
211
- Spree::Property,
212
205
  Spree::Taxon,
213
206
  Spree::Taxonomy,
214
207
  Spree::Store,
@@ -228,7 +221,6 @@ module Spree
228
221
  Spree::Address,
229
222
  Spree::Asset,
230
223
  Spree::CreditCard,
231
- Spree::CustomDomain,
232
224
  Spree::CustomerReturn,
233
225
  Spree::GiftCard,
234
226
  Spree::Image,
@@ -240,8 +232,6 @@ module Spree
240
232
  Spree::Payment,
241
233
  Spree::PaymentMethod,
242
234
  Spree::PaymentSource,
243
- Spree::Post,
244
- Spree::PostCategory,
245
235
  Spree::Product,
246
236
  Spree::Promotion,
247
237
  Spree::Refund,
@@ -304,6 +294,14 @@ module Spree
304
294
  Spree::InvitationEmailSubscriber,
305
295
  Spree::ProductMetricsSubscriber
306
296
  ]
297
+
298
+ # Pre-load authentication strategy classes to avoid reflection at request time
299
+ Rails.application.config.spree.store_authentication_strategies = {
300
+ email: Spree::Authentication::Strategies::EmailPasswordStrategy
301
+ }
302
+ Rails.application.config.spree.admin_authentication_strategies = {
303
+ email: Spree::Authentication::Strategies::EmailPasswordStrategy
304
+ }
307
305
  end
308
306
 
309
307
  initializer 'spree.promo.register.promotions.actions' do |app|
@@ -322,8 +320,10 @@ module Spree
322
320
  ]
323
321
  end
324
322
 
325
- initializer 'spree.core.checking_migrations' do
326
- Migrations.new(config, engine_name).check unless Rails.env.test?
323
+ initializer 'spree.core.checking_migrations' do |app|
324
+ app.config.after_initialize do
325
+ Migrations.new(config, engine_name).check unless Rails.env.test? || Spree::Config.disable_migration_check
326
+ end
327
327
  end
328
328
 
329
329
  initializer 'spree.core.assets' do |app|
@@ -1,22 +1,24 @@
1
1
  module Spree
2
2
  module Pricing
3
3
  class Context
4
- attr_reader :variant, :currency, :store, :zone, :user, :quantity, :date, :order
4
+ attr_reader :variant, :currency, :store, :zone, :market, :user, :quantity, :date, :order
5
5
 
6
6
  # Initializes the context
7
7
  # @param variant [Spree::Variant]
8
8
  # @param currency [String]
9
9
  # @param store [Spree::Store]
10
10
  # @param zone [Spree::Zone]
11
+ # @param market [Spree::Market]
11
12
  # @param user [Spree::User]
12
13
  # @param quantity [Integer]
13
14
  # @param date [Time]
14
15
  # @param order [Spree::Order]
15
- def initialize(variant: nil, currency:, store: nil, zone: nil, user: nil, quantity: nil, date: nil, order: nil)
16
+ def initialize(variant: nil, currency:, store: nil, zone: nil, market: nil, user: nil, quantity: nil, date: nil, order: nil)
16
17
  @variant = variant
17
18
  @currency = currency
18
19
  @store = store || Spree::Current.store
19
20
  @zone = zone || Spree::Current.zone
21
+ @market = market || Spree::Current.market
20
22
  @user = user
21
23
  @quantity = quantity
22
24
  @date = date || Time.current
@@ -36,7 +38,7 @@ module Spree
36
38
  variant: variant,
37
39
  currency: order.currency,
38
40
  store: order.store,
39
- zone: order.tax_zone || order.store.checkout_zone,
41
+ zone: order.tax_zone || Spree::Zone.default_tax,
40
42
  user: order.user,
41
43
  quantity: quantity || order.line_items.find_by(variant: variant)&.quantity,
42
44
  order: order
@@ -53,6 +55,7 @@ module Spree
53
55
  currency,
54
56
  store&.id,
55
57
  zone&.id,
58
+ market&.id,
56
59
  user&.id,
57
60
  quantity,
58
61
  date&.to_i
@@ -12,9 +12,7 @@ module Spree
12
12
  # Returns the best price for the variant
13
13
  # @return [Spree::Price]
14
14
  def resolve
15
- Rails.cache.fetch(cache_key, expires_in: 15.minutes) do
16
- find_best_price
17
- end
15
+ find_best_price
18
16
  end
19
17
 
20
18
  private
@@ -118,12 +116,6 @@ module Spree
118
116
  price_list_id: nil
119
117
  )
120
118
  end
121
-
122
- # Returns the cache key for the resolver
123
- # @return [String]
124
- def cache_key
125
- "#{context.cache_key}/resolved_price"
126
- end
127
119
  end
128
120
  end
129
121
  end
@@ -1,5 +1,5 @@
1
1
  module Spree
2
- VERSION = '5.3.4'.freeze
2
+ VERSION = '5.4.0.beta2'.freeze
3
3
 
4
4
  def self.version
5
5
  VERSION