spree_core 5.4.4 → 5.5.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 (233) hide show
  1. checksums.yaml +4 -4
  2. data/app/helpers/spree/base_helper.rb +0 -82
  3. data/app/helpers/spree/currency_helper.rb +0 -12
  4. data/app/helpers/spree/products_helper.rb +0 -8
  5. data/app/jobs/spree/base_job.rb +18 -0
  6. data/app/jobs/spree/events/subscriber_job.rb +2 -1
  7. data/app/jobs/spree/exports/generate_job.rb +11 -0
  8. data/app/jobs/spree/images/save_from_url_job.rb +23 -8
  9. data/app/jobs/spree/imports/assign_tags_job.rb +11 -0
  10. data/app/jobs/spree/imports/base_job.rb +15 -0
  11. data/app/jobs/spree/imports/create_categories_job.rb +37 -0
  12. data/app/jobs/spree/imports/create_rows_job.rb +1 -3
  13. data/app/jobs/spree/imports/process_group_job.rb +8 -6
  14. data/app/jobs/spree/imports/process_rows_job.rb +1 -3
  15. data/app/jobs/spree/media/migrate_product_assets_job.rb +83 -0
  16. data/app/jobs/spree/products/refresh_metrics_job.rb +15 -4
  17. data/app/jobs/spree/reports/generate_job.rb +11 -0
  18. data/app/jobs/spree/search_provider/index_job.rb +5 -1
  19. data/app/jobs/spree/search_provider/remove_job.rb +4 -0
  20. data/app/jobs/spree/stock_reservations/expire_job.rb +11 -0
  21. data/app/models/concerns/spree/calculated_adjustments.rb +34 -1
  22. data/app/models/concerns/spree/display_on.rb +31 -0
  23. data/app/models/concerns/spree/metafields.rb +167 -5
  24. data/app/models/concerns/spree/preference_schema.rb +191 -0
  25. data/app/models/concerns/spree/prefixed_id.rb +94 -11
  26. data/app/models/concerns/spree/product_scopes.rb +36 -17
  27. data/app/models/concerns/spree/ransackable_attributes.rb +5 -1
  28. data/app/models/concerns/spree/search_indexable.rb +8 -7
  29. data/app/models/concerns/spree/searchable.rb +11 -2
  30. data/app/models/concerns/spree/stores/channels.rb +20 -0
  31. data/app/models/concerns/spree/stores/markets.rb +21 -5
  32. data/app/models/concerns/spree/typed_associations.rb +120 -0
  33. data/app/models/concerns/spree/user_methods.rb +71 -12
  34. data/app/models/spree/ability.rb +4 -117
  35. data/app/models/spree/api_key.rb +53 -0
  36. data/app/models/spree/asset.rb +28 -5
  37. data/app/models/spree/authentication/strategy_registry.rb +72 -0
  38. data/app/models/spree/base.rb +18 -1
  39. data/app/models/spree/channel.rb +159 -0
  40. data/app/models/spree/country.rb +2 -0
  41. data/app/models/spree/current.rb +5 -1
  42. data/app/models/spree/custom_field.rb +9 -0
  43. data/app/models/spree/custom_field_definition.rb +7 -0
  44. data/app/models/spree/customer_group.rb +8 -2
  45. data/app/models/spree/export.rb +30 -3
  46. data/app/models/spree/gateway.rb +25 -0
  47. data/app/models/spree/gift_card.rb +1 -1
  48. data/app/models/spree/gift_card_batch.rb +4 -1
  49. data/app/models/spree/import.rb +5 -0
  50. data/app/models/spree/import_row.rb +12 -0
  51. data/app/models/spree/line_item.rb +6 -1
  52. data/app/models/spree/market.rb +32 -1
  53. data/app/models/spree/metafield.rb +38 -0
  54. data/app/models/spree/metafield_definition.rb +29 -6
  55. data/app/models/spree/metafields/json.rb +10 -0
  56. data/app/models/spree/newsletter_subscriber.rb +19 -3
  57. data/app/models/spree/option_type.rb +48 -7
  58. data/app/models/spree/order/checkout.rb +3 -3
  59. data/app/models/spree/order.rb +102 -6
  60. data/app/models/spree/order_approval.rb +19 -0
  61. data/app/models/spree/order_cancellation.rb +19 -0
  62. data/app/models/spree/order_routing/has_strategy_preference.rb +28 -0
  63. data/app/models/spree/order_routing/rules/default_location.rb +16 -0
  64. data/app/models/spree/order_routing/rules/minimize_splits.rb +45 -0
  65. data/app/models/spree/order_routing/rules/preferred_location.rb +22 -0
  66. data/app/models/spree/order_routing/strategy/base.rb +47 -0
  67. data/app/models/spree/order_routing/strategy/legacy.rb +33 -0
  68. data/app/models/spree/order_routing/strategy/reducer.rb +68 -0
  69. data/app/models/spree/order_routing/strategy/rules.rb +81 -0
  70. data/app/models/spree/order_routing_rule.rb +75 -0
  71. data/app/models/spree/permission_sets/configuration_management.rb +16 -0
  72. data/app/models/spree/permission_sets/product_display.rb +2 -0
  73. data/app/models/spree/permission_sets/product_management.rb +2 -0
  74. data/app/models/spree/price.rb +14 -1
  75. data/app/models/spree/price_list.rb +129 -17
  76. data/app/models/spree/price_rule.rb +11 -1
  77. data/app/models/spree/price_rules/customer_group_rule.rb +15 -1
  78. data/app/models/spree/price_rules/market_rule.rb +16 -1
  79. data/app/models/spree/price_rules/user_rule.rb +21 -2
  80. data/app/models/spree/product/channels.rb +149 -0
  81. data/app/models/spree/product/legacy_multi_store_support.rb +40 -0
  82. data/app/models/spree/product/slugs.rb +1 -1
  83. data/app/models/spree/product.rb +172 -31
  84. data/app/models/spree/product_publication.rb +43 -0
  85. data/app/models/spree/promotion/actions/create_adjustment.rb +4 -0
  86. data/app/models/spree/promotion/actions/create_item_adjustments.rb +4 -0
  87. data/app/models/spree/promotion/actions/create_line_items.rb +32 -14
  88. data/app/models/spree/promotion/rules/country.rb +40 -18
  89. data/app/models/spree/promotion/rules/customer_group.rb +10 -1
  90. data/app/models/spree/promotion/rules/product.rb +4 -0
  91. data/app/models/spree/promotion/rules/taxon.rb +24 -1
  92. data/app/models/spree/promotion/rules/user.rb +21 -0
  93. data/app/models/spree/promotion/rules/user_logged_in.rb +6 -0
  94. data/app/models/spree/promotion.rb +22 -1
  95. data/app/models/spree/promotion_action.rb +17 -11
  96. data/app/models/spree/promotion_rule.rb +17 -18
  97. data/app/models/spree/search_provider/meilisearch.rb +12 -2
  98. data/app/models/spree/stock/availability_validator.rb +1 -1
  99. data/app/models/spree/stock/quantifier.rb +89 -9
  100. data/app/models/spree/stock_item.rb +36 -0
  101. data/app/models/spree/stock_location.rb +52 -0
  102. data/app/models/spree/stock_reservation.rb +38 -0
  103. data/app/models/spree/stock_reservations/insufficient_stock_error.rb +12 -0
  104. data/app/models/spree/store.rb +18 -72
  105. data/app/models/spree/store_credit.rb +0 -8
  106. data/app/models/spree/store_product.rb +11 -23
  107. data/app/models/spree/taxon.rb +0 -5
  108. data/app/models/spree/user_identity.rb +1 -2
  109. data/app/models/spree/variant.rb +132 -18
  110. data/app/models/spree/variant_media.rb +46 -0
  111. data/app/models/spree/webhook_delivery.rb +1 -23
  112. data/app/models/spree/webhook_endpoint.rb +24 -0
  113. data/app/models/spree/wished_item.rb +0 -13
  114. data/app/presenters/spree/csv/product_variant_presenter.rb +23 -3
  115. data/app/presenters/spree/data_feeds/google_presenter.rb +1 -28
  116. data/app/presenters/spree/search_provider/product_presenter.rb +11 -4
  117. data/app/presenters/spree/variant_presenter.rb +4 -3
  118. data/app/services/spree/addresses/update.rb +6 -8
  119. data/app/services/spree/cart/add_item.rb +10 -0
  120. data/app/services/spree/cart/empty.rb +2 -0
  121. data/app/services/spree/cart/remove_line_item.rb +10 -0
  122. data/app/services/spree/cart/remove_out_of_stock_items.rb +1 -1
  123. data/app/services/spree/cart/set_quantity.rb +10 -0
  124. data/app/services/spree/carts/complete.rb +1 -0
  125. data/app/services/spree/carts/create.rb +1 -0
  126. data/app/services/spree/carts/update.rb +18 -2
  127. data/app/services/spree/carts/upsert_items.rb +6 -6
  128. data/app/services/spree/imports/row_processors/customer.rb +4 -1
  129. data/app/services/spree/imports/row_processors/product_variant.rb +95 -57
  130. data/app/services/spree/newsletter/link_user.rb +53 -0
  131. data/app/services/spree/newsletter/subscribe.rb +31 -9
  132. data/app/services/spree/orders/approve.rb +27 -6
  133. data/app/services/spree/orders/build_shipments.rb +29 -0
  134. data/app/services/spree/orders/cancel.rb +34 -3
  135. data/app/services/spree/orders/complete.rb +53 -0
  136. data/app/services/spree/orders/create.rb +156 -0
  137. data/app/services/spree/orders/update.rb +51 -0
  138. data/app/services/spree/orders/upsert_items.rb +70 -0
  139. data/app/services/spree/prices/bulk_upsert.rb +201 -0
  140. data/app/services/spree/products/duplicator.rb +1 -1
  141. data/app/services/spree/products/prepare_nested_attributes.rb +2 -30
  142. data/app/services/spree/sample_data/loader.rb +30 -0
  143. data/app/services/spree/stock_reservations/extend.rb +19 -0
  144. data/app/services/spree/stock_reservations/release.rb +12 -0
  145. data/app/services/spree/stock_reservations/reserve.rb +103 -0
  146. data/app/services/spree/taxons/remove_products.rb +7 -1
  147. data/app/subscribers/spree/product_metrics_subscriber.rb +3 -7
  148. data/app/views/spree/invitation_mailer/invitation_email.html.erb +4 -0
  149. data/config/locales/en.yml +27 -10
  150. data/config/routes.rb +9 -0
  151. data/db/migrate/20260429000001_create_spree_order_cancellations.rb +25 -0
  152. data/db/migrate/20260429000002_create_spree_order_approvals.rb +22 -0
  153. data/db/migrate/20260429000003_add_status_to_spree_orders.rb +6 -0
  154. data/db/migrate/20260429000004_add_scopes_to_spree_api_keys.rb +11 -0
  155. data/db/migrate/20260501000001_create_spree_stock_reservations.rb +19 -0
  156. data/db/migrate/20260507162651_create_spree_variant_media.rb +23 -0
  157. data/db/migrate/20260508175303_add_pickup_to_spree_stock_locations.rb +12 -0
  158. data/db/migrate/20260508204040_create_spree_channels.rb +18 -0
  159. data/db/migrate/20260508204041_create_spree_order_routing_rules.rb +18 -0
  160. data/db/migrate/20260508204042_add_preferred_stock_location_to_spree_orders.rb +5 -0
  161. data/db/migrate/20260508204043_add_channel_id_to_spree_orders.rb +10 -0
  162. data/db/migrate/20260511000001_backfill_status_on_spree_orders.rb +57 -0
  163. data/db/migrate/20260515000001_add_store_id_to_spree_newsletter_subscribers.rb +25 -0
  164. data/db/migrate/20260529000001_add_unique_index_to_spree_price_rules.rb +41 -0
  165. data/db/migrate/20260529000002_add_unique_index_to_spree_promotion_rules.rb +37 -0
  166. data/db/migrate/20260601000001_create_spree_product_publications.rb +14 -0
  167. data/db/migrate/20260601000002_add_store_id_to_spree_products.rb +16 -0
  168. data/db/migrate/20260602000001_add_default_to_spree_channels.rb +14 -0
  169. data/db/sample_data/channels.rb +12 -0
  170. data/db/sample_data/orders.rb +1 -1
  171. data/db/sample_data/products.csv +212 -212
  172. data/lib/generators/spree/api_resource/api_resource_generator.rb +353 -0
  173. data/lib/generators/spree/api_resource/templates/admin_controller.rb.tt +23 -0
  174. data/lib/generators/spree/api_resource/templates/admin_controller_spec.rb.tt +59 -0
  175. data/lib/generators/spree/api_resource/templates/admin_serializer.rb.tt +11 -0
  176. data/lib/generators/spree/api_resource/templates/factory.rb.tt +26 -0
  177. data/lib/generators/spree/api_resource/templates/store_aliased_serializer.rb.tt +12 -0
  178. data/lib/generators/spree/api_resource/templates/store_controller.rb.tt +31 -0
  179. data/lib/generators/spree/api_resource/templates/store_controller_spec.rb.tt +61 -0
  180. data/lib/generators/spree/api_resource/templates/store_serializer.rb.tt +14 -0
  181. data/lib/generators/spree/controller_decorator/controller_decorator_generator.rb +66 -0
  182. data/lib/generators/spree/controller_decorator/templates/controller_decorator.rb.tt +25 -0
  183. data/lib/generators/spree/model/model_generator.rb +73 -7
  184. data/lib/generators/spree/model/templates/create_table_migration.rb.tt +40 -0
  185. data/lib/generators/spree/model/templates/model.rb.tt +28 -2
  186. data/lib/spree/core/configuration.rb +7 -0
  187. data/lib/spree/core/controller_helpers/auth.rb +0 -12
  188. data/lib/spree/core/controller_helpers/currency.rb +0 -17
  189. data/lib/spree/core/controller_helpers/order.rb +0 -19
  190. data/lib/spree/core/dependencies.rb +5 -2
  191. data/lib/spree/core/engine.rb +54 -7
  192. data/lib/spree/core/permission_configuration.rb +15 -0
  193. data/lib/spree/core/preferences/masking.rb +47 -0
  194. data/lib/spree/core/preferences/preferable_class_methods.rb +7 -1
  195. data/lib/spree/core/version.rb +1 -1
  196. data/lib/spree/core.rb +56 -5
  197. data/lib/spree/permitted_attributes.rb +9 -7
  198. data/lib/spree/testing_support/factories/address_factory.rb +16 -9
  199. data/lib/spree/testing_support/factories/api_key_factory.rb +1 -0
  200. data/lib/spree/testing_support/factories/channel_factory.rb +8 -0
  201. data/lib/spree/testing_support/factories/line_item_factory.rb +2 -8
  202. data/lib/spree/testing_support/factories/newsletter_subscriber_factory.rb +2 -0
  203. data/lib/spree/testing_support/factories/product_factory.rb +16 -7
  204. data/lib/spree/testing_support/factories/product_publication_factory.rb +6 -0
  205. data/lib/spree/testing_support/factories/refresh_token_factory.rb +15 -0
  206. data/lib/spree/testing_support/factories/stock_location_factory.rb +2 -2
  207. data/lib/spree/testing_support/factories/stock_reservation_factory.rb +31 -0
  208. data/lib/spree/testing_support/factories/variant_factory.rb +3 -3
  209. data/lib/spree/testing_support/order_walkthrough.rb +1 -1
  210. data/lib/spree/testing_support/store.rb +10 -0
  211. data/lib/spree/upgrades/5_4_to_5_5/manifest.yml +53 -0
  212. data/lib/tasks/channels.rake +94 -0
  213. data/lib/tasks/core.rake +1 -0
  214. data/lib/tasks/media.rake +27 -0
  215. data/lib/tasks/products.rake +4 -6
  216. data/lib/tasks/publications.rake +60 -0
  217. data/lib/tasks/upgrade.rake +211 -0
  218. metadata +83 -19
  219. data/app/finders/spree/variants/visible_finder.rb +0 -23
  220. data/app/models/concerns/spree/webhook_payload_redaction.rb +0 -88
  221. data/app/paginators/spree/shared/paginate.rb +0 -30
  222. data/app/presenters/spree/filters/price_presenter.rb +0 -23
  223. data/app/presenters/spree/filters/price_range_presenter.rb +0 -30
  224. data/app/presenters/spree/filters/quantified_price_range_presenter.rb +0 -45
  225. data/app/presenters/spree/product_summary_presenter.rb +0 -27
  226. data/app/presenters/spree/variants/options_presenter.rb +0 -82
  227. data/app/services/spree/classifications/reposition.rb +0 -23
  228. data/app/sorters/spree/orders/sort.rb +0 -10
  229. data/lib/spree/core/controller_helpers/common.rb +0 -14
  230. data/lib/spree/core/token_generator.rb +0 -23
  231. data/lib/spree/database_type_utilities.rb +0 -22
  232. data/lib/spree/testing_support/bar_ability.rb +0 -14
  233. data/lib/spree/testing_support/factories/store_product_factory.rb +0 -6
@@ -1,88 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Spree
4
- # Keeps single-use credentials out of the persisted webhook delivery log.
5
- #
6
- # Some events must carry a live credential to their subscriber — a storefront
7
- # that owns its transactional emails needs the real password reset token to
8
- # build the email. Delivering it over TLS to a merchant-configured endpoint is
9
- # intended; keeping a readable copy in `spree_webhook_deliveries.payload` is
10
- # not, because that column is queryable and is served back through the Admin
11
- # API delivery log.
12
- #
13
- # Sensitive values are therefore replaced with {REDACTION_PLACEHOLDER} before
14
- # the record is written, and re-attached in memory at send time so the
15
- # outgoing request body is unchanged.
16
- module WebhookPayloadRedaction
17
- extend ActiveSupport::Concern
18
-
19
- # Payload keys under `data` whose values are live credentials.
20
- SENSITIVE_PAYLOAD_KEYS = %w[reset_token unsubscribe_token].freeze
21
-
22
- REDACTION_PLACEHOLDER = '[REDACTED]'
23
-
24
- # Splits a payload into the version safe to persist and the secrets held
25
- # back from it.
26
- #
27
- # @param payload [Hash] the full event payload
28
- # @return [Array(Hash, Hash)] redacted payload, and the extracted secrets
29
- # keyed as they appeared under `data`
30
- def self.split(payload)
31
- secrets = {}
32
-
33
- redacted = transform_data_hashes(payload) do |data|
34
- data.to_h do |key, value|
35
- if SENSITIVE_PAYLOAD_KEYS.include?(key.to_s) && value.present?
36
- secrets[secret_key_for(key)] = value
37
- [key, REDACTION_PLACEHOLDER]
38
- else
39
- [key, value]
40
- end
41
- end
42
- end
43
-
44
- secrets.empty? ? [payload, {}] : [redacted, secrets]
45
- end
46
-
47
- # Re-attaches previously extracted secrets to a redacted payload.
48
- #
49
- # @param payload [Hash] the redacted payload
50
- # @param secrets [Hash] secrets returned by {split}
51
- # @return [Hash] the payload as it should go over the wire
52
- def self.merge(payload, secrets)
53
- return payload if secrets.blank?
54
-
55
- transform_data_hashes(payload) do |data|
56
- data.to_h do |key, value|
57
- secret = secrets[secret_key_for(key)]
58
- [key, secret.presence || value]
59
- end
60
- end
61
- end
62
-
63
- # Applies +block+ to every `data` hash on the payload.
64
- #
65
- # Both key forms are visited rather than only the first match: a payload
66
- # carrying `:data` *and* `'data'` would otherwise leave one of them
67
- # unredacted.
68
- def self.transform_data_hashes(payload)
69
- return payload unless payload.is_a?(Hash)
70
-
71
- [:data, 'data'].reduce(payload) do |result, data_key|
72
- data = result[data_key]
73
- next result unless data.is_a?(Hash)
74
-
75
- result.merge(data_key => yield(data))
76
- end
77
- end
78
- private_class_method :transform_data_hashes
79
-
80
- # Secrets are keyed by name alone. They cross an ActiveJob serialization
81
- # boundary, which coerces symbol keys to strings, so the key form at split
82
- # time cannot be relied on to still match at merge time.
83
- def self.secret_key_for(key)
84
- key.to_s
85
- end
86
- private_class_method :secret_key_for
87
- end
88
- end
@@ -1,30 +0,0 @@
1
- module Spree
2
- module Shared
3
- class Paginate
4
- def initialize(collection, params)
5
- Spree::Deprecation.warn('Spree::Shared::Paginate is deprecated and will be removed in Spree 5.5. Please use Kaminari instead.')
6
-
7
- raise 'Kaminari is not installed. Please add it to your Gemfile.' unless defined?(Kaminari)
8
-
9
- @collection = collection
10
- @page = params[:page]
11
-
12
- per_page_limit = Spree::Api::Config[:api_v2_per_page_limit]
13
-
14
- @per_page = if params[:per_page].to_i.between?(1, per_page_limit)
15
- params[:per_page]
16
- else
17
- Kaminari.config.default_per_page
18
- end
19
- end
20
-
21
- def call
22
- collection.page(page).per(per_page)
23
- end
24
-
25
- private
26
-
27
- attr_reader :collection, :page, :per_page
28
- end
29
- end
30
- end
@@ -1,23 +0,0 @@
1
- module Spree
2
- module Filters
3
- class PricePresenter
4
- def initialize(amount:, currency:)
5
- Spree::Deprecation.warn('Spree::Filters::PricePresenter is deprecated and will be removed in Spree 5.5.')
6
- @amount = amount.to_i
7
- @currency = currency
8
- end
9
-
10
- def to_i
11
- amount
12
- end
13
-
14
- def to_s
15
- Spree::Money.new(amount, currency: currency, no_cents_if_whole: true).to_s
16
- end
17
-
18
- private
19
-
20
- attr_reader :amount, :currency
21
- end
22
- end
23
- end
@@ -1,30 +0,0 @@
1
- module Spree
2
- module Filters
3
- class PriceRangePresenter
4
- def self.from_param(param, currency:)
5
- prices = param.split('-')
6
-
7
- new(
8
- min_price: PricePresenter.new(amount: prices.first, currency: currency),
9
- max_price: PricePresenter.new(amount: prices.last, currency: currency)
10
- )
11
- end
12
-
13
- def initialize(min_price:, max_price:)
14
- Spree::Deprecation.warn('Spree::Filters::PriceRangePresenter is deprecated and will be removed in Spree 5.5.')
15
- @min_price = min_price
16
- @max_price = max_price
17
- end
18
-
19
- attr_reader :min_price, :max_price
20
-
21
- def to_param
22
- "#{min_price.to_i}-#{max_price.to_i}"
23
- end
24
-
25
- def to_s
26
- "#{min_price} - #{max_price}"
27
- end
28
- end
29
- end
30
- end
@@ -1,45 +0,0 @@
1
- module Spree
2
- module Filters
3
- class QuantifiedPriceRangePresenter
4
- ALLOWED_QUANTIFIERS = [
5
- :less_than,
6
- :more_than
7
- ].freeze
8
-
9
- def initialize(price:, quantifier:)
10
- Spree::Deprecation.warn('Spree::Filters::QuantifiedPriceRangePresenter is deprecated and will be removed in Spree 5.5.')
11
- if ALLOWED_QUANTIFIERS.exclude?(quantifier.to_sym)
12
- raise ArgumentError, "quantifier must be one of: #{ALLOWED_QUANTIFIERS.join(', ')}"
13
- end
14
-
15
- @price = price
16
- @quantifier = quantifier.to_sym
17
- end
18
-
19
- def to_param
20
- case quantifier
21
- when :less_than
22
- less_than_param
23
- when :more_than
24
- more_than_param
25
- end
26
- end
27
-
28
- def to_s
29
- "#{I18n.t("activerecord.attributes.spree/product.#{quantifier}")} #{price}"
30
- end
31
-
32
- private
33
-
34
- attr_reader :price, :quantifier
35
-
36
- def less_than_param
37
- "0-#{price.to_i}"
38
- end
39
-
40
- def more_than_param
41
- "#{price.to_i}-Infinity"
42
- end
43
- end
44
- end
45
- end
@@ -1,27 +0,0 @@
1
- module Spree
2
- class ProductSummaryPresenter
3
- include Rails.application.routes.url_helpers
4
-
5
- def initialize(product)
6
- Spree::Deprecation.warn('Spree::ProductSummaryPresenter is deprecated and will be removed in Spree 5.5.')
7
- @product = product
8
- end
9
-
10
- def call
11
- {
12
- name: @product.name,
13
- images: images
14
- }
15
- end
16
-
17
- private
18
-
19
- def images
20
- @product.images.map do |image|
21
- {
22
- url_product: rails_representation_url(image.url(:product), only_path: true)
23
- }
24
- end
25
- end
26
- end
27
- end
@@ -1,82 +0,0 @@
1
- module Spree
2
- module Variants
3
- class OptionsPresenter
4
- WORDS_CONNECTOR = ', '.freeze
5
-
6
- attr_reader :variant
7
-
8
- delegate :option_values, to: :variant
9
-
10
- def initialize(variant)
11
- Spree::Deprecation.warn('Spree::Variants::OptionsPresenter is deprecated and will be removed in Spree 5.5. Please use Spree::Variant#options_text instead.')
12
- @variant = variant
13
- end
14
-
15
- def to_sentence
16
- options = option_values
17
- options = sort_options(options)
18
- options = present_options(options)
19
-
20
- join_options(options)
21
- end
22
-
23
- def to_hash
24
- options = option_values
25
- options = sort_options(options)
26
- options = present_options_as_hash(options)
27
-
28
- join_hash_options(options)
29
- end
30
-
31
- private
32
-
33
- def sort_options(options)
34
- if options.first&.association(:option_type)&.loaded?
35
- options.sort_by { |o| o.option_type.position }
36
- else
37
- options.includes(:option_type).sort_by { |o| o.option_type.position }
38
- end
39
- end
40
-
41
- def present_options(options)
42
- options.map do |ov|
43
- method = "present_#{ov.option_type.name}_option"
44
-
45
- respond_to?(method, true) ? send(method, ov) : present_option(ov)
46
- end
47
- end
48
-
49
- def present_color_option(option)
50
- "#{option.option_type.presentation}: #{option.presentation}"
51
- end
52
-
53
- def present_option(option)
54
- "#{option.option_type.presentation}: #{option.presentation}"
55
- end
56
-
57
- def join_options(options)
58
- options.to_sentence(words_connector: WORDS_CONNECTOR, two_words_connector: WORDS_CONNECTOR)
59
- end
60
-
61
- def present_options_as_hash(options)
62
- options.map do |ov|
63
- method = "present_#{ov.option_type.name}_option_as_hash"
64
-
65
- respond_to?(method, true) ? send(method, ov) : present_option_as_hash(ov)
66
- end
67
- end
68
-
69
- def present_option_as_hash(option)
70
- {}.tap do |hash|
71
- hash.store(option.option_type.presentation.downcase, option.presentation)
72
- end
73
- end
74
-
75
- def join_hash_options(options)
76
- return {} if options.empty?
77
-
78
- options.inject(:merge).symbolize_keys
79
- end
80
- end
81
- end
82
- end
@@ -1,23 +0,0 @@
1
- module Spree
2
- module Classifications
3
- # @deprecated This service is deprecated and will be removed in Spree 5.5.
4
- class Reposition
5
- prepend Spree::ServiceModule::Base
6
-
7
- def call(classification:, position:)
8
- Spree::Deprecation.warn(
9
- "#{self.class.name} is deprecated and will be removed in Spree 5.5.",
10
- caller_locations(2)
11
- )
12
- if position.is_a?(String) && !position.match(/^\d+$/)
13
- return failure(nil, I18n.t('errors.messages.not_a_number'))
14
- end
15
-
16
- # Because position we get back is 0-indexed.
17
- # acts_as_list is 1-indexed.
18
- classification.insert_at(position.to_i + 1)
19
- success(classification)
20
- end
21
- end
22
- end
23
- end
@@ -1,10 +0,0 @@
1
- module Spree
2
- module Orders
3
- class Sort < ::Spree::BaseSorter
4
- def initialize(*args)
5
- Spree::Deprecation.warn('Spree::Orders::Sort is deprecated and will be removed in Spree 5.5.')
6
- super
7
- end
8
- end
9
- end
10
- end
@@ -1,14 +0,0 @@
1
- module Spree
2
- module Core
3
- module ControllerHelpers
4
- # @deprecated This module is deprecated and will be removed in Spree 5.5.
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
11
- end
12
- end
13
- end
14
- end
@@ -1,23 +0,0 @@
1
- module Spree
2
- module Core
3
- module TokenGenerator
4
- def generate_token(model_class = Spree::Order)
5
- Spree::Deprecation.warn('generate_token is deprecated and will be removed in Spree 5.5. Please use Rails secure token generator: https://api.rubyonrails.org/classes/ActiveRecord/SecureToken/ClassMethods.html')
6
- loop do
7
- token = "#{random_token}#{unique_ending}"
8
- break token unless model_class.exists?(token: token)
9
- end
10
- end
11
-
12
- private
13
-
14
- def random_token
15
- SecureRandom.urlsafe_base64(nil, false)
16
- end
17
-
18
- def unique_ending
19
- (Time.now.to_f * 1000).to_i
20
- end
21
- end
22
- end
23
- end
@@ -1,22 +0,0 @@
1
- module Spree
2
- # @deprecated Use the integer constant directly instead, eg. `2_147_483_647` for 4-byte signed integer max.
3
- # This module will be removed in Spree 5.5.
4
- module DatabaseTypeUtilities
5
- # Maximum value for a 4-byte signed integer (default database integer type)
6
- INTEGER_MAX = (2**31) - 1
7
-
8
- def self.maximum_value_for(data_type)
9
- Spree::Deprecation.warn(
10
- 'Spree::DatabaseTypeUtilities.maximum_value_for is deprecated and will be removed in Spree 5.5. ' \
11
- 'Use the integer constant directly instead, eg. 2_147_483_647 for 4-byte signed integer max.'
12
- )
13
-
14
- case data_type
15
- when :integer
16
- INTEGER_MAX
17
- else
18
- raise ArgumentError, 'Currently only :integer argument is acceptable'
19
- end
20
- end
21
- end
22
- end
@@ -1,14 +0,0 @@
1
- # Fake ability for testing administration
2
- class BarAbility
3
- include CanCan::Ability
4
-
5
- def initialize(user)
6
- user ||= Spree::User.new
7
- if user.has_spree_role? 'bar'
8
- # allow dispatch to :admin, :index, and :show on Spree::Order
9
- can [:admin, :index, :show], Spree::Order
10
- # allow dispatch to :index, :show, :create and :update shipments on the admin
11
- can [:admin, :manage], Spree::Shipment
12
- end
13
- end
14
- end
@@ -1,6 +0,0 @@
1
- FactoryBot.define do
2
- factory :store_product, class: Spree::StoreProduct do
3
- store
4
- product
5
- end
6
- end