spree_core 3.3.6 → 3.4.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 (230) hide show
  1. checksums.yaml +4 -4
  2. data/app/helpers/spree/base_helper.rb +17 -18
  3. data/app/helpers/spree/products_helper.rb +5 -5
  4. data/app/models/concerns/spree/calculated_adjustments.rb +4 -3
  5. data/app/models/concerns/spree/default_price.rb +4 -5
  6. data/app/models/concerns/spree/display_money.rb +1 -1
  7. data/app/models/concerns/spree/named_type.rb +1 -1
  8. data/app/models/concerns/spree/ransackable_attributes.rb +5 -6
  9. data/app/models/concerns/spree/user_address.rb +6 -6
  10. data/app/models/concerns/spree/user_methods.rb +3 -3
  11. data/app/models/concerns/spree/user_payment_source.rb +4 -2
  12. data/app/models/concerns/spree/user_reporting.rb +1 -1
  13. data/app/models/spree/ability.rb +3 -3
  14. data/app/models/spree/address.rb +13 -9
  15. data/app/models/spree/adjustable/adjuster/promotion.rb +1 -1
  16. data/app/models/spree/adjustable/adjustments_updater.rb +2 -2
  17. data/app/models/spree/adjustable/promotion_accumulator.rb +6 -4
  18. data/app/models/spree/adjustment.rb +2 -3
  19. data/app/models/spree/app_configuration.rb +5 -6
  20. data/app/models/spree/base.rb +1 -1
  21. data/app/models/spree/calculator/default_tax.rb +4 -5
  22. data/app/models/spree/calculator/flat_percent_item_total.rb +1 -1
  23. data/app/models/spree/calculator/flat_rate.rb +3 -3
  24. data/app/models/spree/calculator/flexi_rate.rb +5 -5
  25. data/app/models/spree/calculator/price_sack.rb +9 -9
  26. data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +1 -1
  27. data/app/models/spree/calculator/shipping/flat_rate.rb +3 -3
  28. data/app/models/spree/calculator/shipping/flexi_rate.rb +7 -7
  29. data/app/models/spree/calculator/shipping/per_item.rb +2 -2
  30. data/app/models/spree/calculator/shipping/price_sack.rb +4 -4
  31. data/app/models/spree/calculator/tiered_flat_rate.rb +3 -2
  32. data/app/models/spree/calculator/tiered_percent.rb +4 -3
  33. data/app/models/spree/calculator.rb +4 -4
  34. data/app/models/spree/classification.rb +2 -2
  35. data/app/models/spree/credit_card.rb +1 -1
  36. data/app/models/spree/exchange.rb +4 -5
  37. data/app/models/spree/gateway/bogus.rb +20 -20
  38. data/app/models/spree/gateway/bogus_simple.rb +2 -4
  39. data/app/models/spree/gateway.rb +4 -4
  40. data/app/models/spree/image.rb +3 -3
  41. data/app/models/spree/inventory_unit.rb +30 -30
  42. data/app/models/spree/line_item.rb +7 -9
  43. data/app/models/spree/option_type.rb +1 -1
  44. data/app/models/spree/order/checkout.rb +5 -5
  45. data/app/models/spree/order/currency_updater.rb +1 -4
  46. data/app/models/spree/order/payments.rb +4 -4
  47. data/app/models/spree/order/store_credit.rb +2 -2
  48. data/app/models/spree/order.rb +11 -29
  49. data/app/models/spree/order_contents.rb +6 -5
  50. data/app/models/spree/order_inventory.rb +3 -4
  51. data/app/models/spree/order_updater.rb +13 -14
  52. data/app/models/spree/payment/processing.rb +25 -26
  53. data/app/models/spree/payment.rb +72 -79
  54. data/app/models/spree/payment_capture_event.rb +1 -1
  55. data/app/models/spree/payment_method/check.rb +1 -1
  56. data/app/models/spree/payment_method/store_credit.rb +5 -5
  57. data/app/models/spree/payment_method.rb +7 -7
  58. data/app/models/spree/preferences/configuration.rb +6 -9
  59. data/app/models/spree/preferences/preferable.rb +11 -11
  60. data/app/models/spree/preferences/preferable_class_methods.rb +2 -3
  61. data/app/models/spree/preferences/scoped_store.rb +6 -5
  62. data/app/models/spree/preferences/store.rb +9 -14
  63. data/app/models/spree/price.rb +1 -1
  64. data/app/models/spree/product/scopes.rb +49 -49
  65. data/app/models/spree/product.rb +16 -16
  66. data/app/models/spree/promotion/actions/create_item_adjustments.rb +2 -1
  67. data/app/models/spree/promotion/actions/free_shipping.rb +1 -1
  68. data/app/models/spree/promotion/rules/first_order.rb +7 -6
  69. data/app/models/spree/promotion/rules/item_total.rb +3 -5
  70. data/app/models/spree/promotion/rules/one_use_per_user.rb +1 -2
  71. data/app/models/spree/promotion/rules/option_value.rb +14 -6
  72. data/app/models/spree/promotion/rules/product.rb +4 -4
  73. data/app/models/spree/promotion/rules/taxon.rb +6 -6
  74. data/app/models/spree/promotion/rules/user.rb +3 -3
  75. data/app/models/spree/promotion/rules/user_logged_in.rb +1 -1
  76. data/app/models/spree/promotion.rb +15 -16
  77. data/app/models/spree/promotion_action.rb +1 -1
  78. data/app/models/spree/promotion_handler/cart.rb +3 -2
  79. data/app/models/spree/promotion_handler/free_shipping.rb +1 -3
  80. data/app/models/spree/promotion_handler/page.rb +3 -3
  81. data/app/models/spree/promotion_rule.rb +5 -4
  82. data/app/models/spree/refund.rb +8 -8
  83. data/app/models/spree/reimbursement/credit.rb +1 -1
  84. data/app/models/spree/reimbursement/reimbursement_type_engine.rb +1 -3
  85. data/app/models/spree/reimbursement.rb +4 -8
  86. data/app/models/spree/reimbursement_performer.rb +0 -5
  87. data/app/models/spree/reimbursement_tax_calculator.rb +5 -12
  88. data/app/models/spree/reimbursement_type.rb +2 -2
  89. data/app/models/spree/return_authorization.rb +22 -26
  90. data/app/models/spree/return_item/eligibility_validator/default.rb +3 -3
  91. data/app/models/spree/return_item/eligibility_validator/inventory_shipped.rb +2 -2
  92. data/app/models/spree/return_item/eligibility_validator/no_reimbursements.rb +2 -2
  93. data/app/models/spree/return_item/eligibility_validator/order_completed.rb +2 -2
  94. data/app/models/spree/return_item/eligibility_validator/rma_required.rb +2 -3
  95. data/app/models/spree/return_item/eligibility_validator/time_since_purchase.rb +2 -2
  96. data/app/models/spree/return_item.rb +15 -19
  97. data/app/models/spree/returns_calculator.rb +1 -2
  98. data/app/models/spree/shipment.rb +14 -35
  99. data/app/models/spree/shipment_handler.rb +10 -12
  100. data/app/models/spree/shipping_calculator.rb +5 -6
  101. data/app/models/spree/shipping_method.rb +3 -3
  102. data/app/models/spree/shipping_rate.rb +2 -2
  103. data/app/models/spree/state.rb +2 -2
  104. data/app/models/spree/stock/availability_validator.rb +1 -1
  105. data/app/models/spree/stock/content_item.rb +2 -3
  106. data/app/models/spree/stock/coordinator.rb +3 -2
  107. data/app/models/spree/stock/differentiator.rb +3 -2
  108. data/app/models/spree/stock/estimator.rb +7 -5
  109. data/app/models/spree/stock/package.rb +5 -5
  110. data/app/models/spree/stock/packer.rb +1 -1
  111. data/app/models/spree/stock/prioritizer.rb +5 -7
  112. data/app/models/spree/stock/quantifier.rb +0 -1
  113. data/app/models/spree/stock/splitter/backordered.rb +2 -4
  114. data/app/models/spree/stock/splitter/base.rb +3 -2
  115. data/app/models/spree/stock/splitter/shipping_category.rb +2 -1
  116. data/app/models/spree/stock_item.rb +1 -1
  117. data/app/models/spree/stock_location.rb +12 -11
  118. data/app/models/spree/stock_movement.rb +1 -3
  119. data/app/models/spree/stock_transfer.rb +1 -1
  120. data/app/models/spree/store.rb +4 -4
  121. data/app/models/spree/store_credit.rb +3 -3
  122. data/app/models/spree/tax_category.rb +1 -1
  123. data/app/models/spree/tax_rate.rb +10 -10
  124. data/app/models/spree/taxon.rb +13 -13
  125. data/app/models/spree/taxonomy.rb +9 -8
  126. data/app/models/spree/validations/db_maximum_length_validator.rb +2 -3
  127. data/app/models/spree/variant.rb +30 -41
  128. data/app/models/spree/zone.rb +10 -10
  129. data/app/validators/db_maximum_length_validator.rb +5 -5
  130. data/config/initializers/acts_as_taggable_on.rb +3 -3
  131. data/config/initializers/assets.rb +1 -1
  132. data/config/initializers/friendly_id.rb +1 -1
  133. data/config/initializers/premailer_assets.rb +1 -1
  134. data/config/locales/en.yml +8 -2
  135. data/db/default/spree/states.rb +1 -0
  136. data/lib/generators/spree/custom_user/custom_user_generator.rb +12 -15
  137. data/lib/generators/spree/install/install_generator.rb +45 -32
  138. data/lib/spree/core/components.rb +3 -3
  139. data/lib/spree/core/controller_helpers/auth.rb +5 -10
  140. data/lib/spree/core/controller_helpers/common.rb +2 -3
  141. data/lib/spree/core/controller_helpers/order.rb +3 -7
  142. data/lib/spree/core/controller_helpers/respond_with.rb +4 -4
  143. data/lib/spree/core/engine.rb +3 -3
  144. data/lib/spree/core/environment/calculators.rb +0 -1
  145. data/lib/spree/core/environment_extension.rb +8 -8
  146. data/lib/spree/core/importer/order.rb +64 -67
  147. data/lib/spree/core/importer/product.rb +10 -9
  148. data/lib/spree/core/product_filters.rb +17 -18
  149. data/lib/spree/core/routes.rb +2 -6
  150. data/lib/spree/core/search/base.rb +62 -59
  151. data/lib/spree/core/version.rb +1 -1
  152. data/lib/spree/core.rb +4 -6
  153. data/lib/spree/i18n.rb +3 -5
  154. data/lib/spree/localized_number.rb +0 -2
  155. data/lib/spree/migrations.rb +8 -7
  156. data/lib/spree/money.rb +3 -7
  157. data/lib/spree/permitted_attributes.rb +2 -2
  158. data/lib/spree/responder.rb +4 -5
  159. data/lib/spree/testing_support/authorization_helpers.rb +3 -3
  160. data/lib/spree/testing_support/caching.rb +5 -5
  161. data/lib/spree/testing_support/capybara_ext.rb +16 -18
  162. data/lib/spree/testing_support/common_rake.rb +8 -9
  163. data/lib/spree/testing_support/controller_requests.rb +6 -6
  164. data/lib/spree/testing_support/extension_rake.rb +2 -3
  165. data/lib/spree/testing_support/factories/address_factory.rb +1 -1
  166. data/lib/spree/testing_support/factories/adjustment_factory.rb +1 -1
  167. data/lib/spree/testing_support/factories/calculator_factory.rb +1 -1
  168. data/lib/spree/testing_support/factories/country_factory.rb +1 -1
  169. data/lib/spree/testing_support/factories/credit_card_factory.rb +1 -1
  170. data/lib/spree/testing_support/factories/customer_return_factory.rb +1 -3
  171. data/lib/spree/testing_support/factories/image_factory.rb +2 -2
  172. data/lib/spree/testing_support/factories/inventory_unit_factory.rb +1 -1
  173. data/lib/spree/testing_support/factories/line_item_factory.rb +2 -2
  174. data/lib/spree/testing_support/factories/options_factory.rb +1 -1
  175. data/lib/spree/testing_support/factories/order_factory.rb +1 -1
  176. data/lib/spree/testing_support/factories/payment_factory.rb +1 -1
  177. data/lib/spree/testing_support/factories/payment_method_factory.rb +4 -4
  178. data/lib/spree/testing_support/factories/price_factory.rb +1 -1
  179. data/lib/spree/testing_support/factories/product_factory.rb +1 -1
  180. data/lib/spree/testing_support/factories/product_option_type_factory.rb +1 -1
  181. data/lib/spree/testing_support/factories/product_property_factory.rb +1 -1
  182. data/lib/spree/testing_support/factories/promotion_category_factory.rb +1 -2
  183. data/lib/spree/testing_support/factories/promotion_factory.rb +1 -2
  184. data/lib/spree/testing_support/factories/promotion_rule_factory.rb +1 -1
  185. data/lib/spree/testing_support/factories/property_factory.rb +1 -1
  186. data/lib/spree/testing_support/factories/prototype_factory.rb +1 -1
  187. data/lib/spree/testing_support/factories/refund_factory.rb +1 -1
  188. data/lib/spree/testing_support/factories/reimbursement_factory.rb +2 -2
  189. data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +1 -1
  190. data/lib/spree/testing_support/factories/return_authorization_factory.rb +1 -1
  191. data/lib/spree/testing_support/factories/return_item_factory.rb +1 -1
  192. data/lib/spree/testing_support/factories/role_factory.rb +1 -1
  193. data/lib/spree/testing_support/factories/shipment_factory.rb +2 -2
  194. data/lib/spree/testing_support/factories/shipping_category_factory.rb +1 -1
  195. data/lib/spree/testing_support/factories/shipping_method_factory.rb +3 -3
  196. data/lib/spree/testing_support/factories/state_factory.rb +1 -1
  197. data/lib/spree/testing_support/factories/stock_factory.rb +1 -1
  198. data/lib/spree/testing_support/factories/stock_item_factory.rb +1 -1
  199. data/lib/spree/testing_support/factories/stock_location_factory.rb +2 -2
  200. data/lib/spree/testing_support/factories/stock_movement_factory.rb +1 -1
  201. data/lib/spree/testing_support/factories/store_credit_category_factory.rb +2 -2
  202. data/lib/spree/testing_support/factories/store_credit_event_factory.rb +1 -1
  203. data/lib/spree/testing_support/factories/store_credit_factory.rb +1 -1
  204. data/lib/spree/testing_support/factories/store_credit_type_factory.rb +1 -1
  205. data/lib/spree/testing_support/factories/store_factory.rb +1 -1
  206. data/lib/spree/testing_support/factories/tag_factory.rb +1 -1
  207. data/lib/spree/testing_support/factories/tax_category_factory.rb +2 -2
  208. data/lib/spree/testing_support/factories/tax_rate_factory.rb +1 -1
  209. data/lib/spree/testing_support/factories/taxon_factory.rb +1 -1
  210. data/lib/spree/testing_support/factories/taxonomy_factory.rb +1 -1
  211. data/lib/spree/testing_support/factories/tracker_factory.rb +1 -1
  212. data/lib/spree/testing_support/factories/user_factory.rb +1 -1
  213. data/lib/spree/testing_support/factories/variant_factory.rb +1 -2
  214. data/lib/spree/testing_support/factories/zone_factory.rb +1 -1
  215. data/lib/spree/testing_support/factories/zone_member_factory.rb +1 -1
  216. data/lib/spree/testing_support/factories.rb +3 -3
  217. data/lib/spree/testing_support/flash.rb +1 -3
  218. data/lib/spree/testing_support/i18n.rb +5 -6
  219. data/lib/spree/testing_support/kernel.rb +1 -2
  220. data/lib/spree/testing_support/order_walkthrough.rb +12 -15
  221. data/lib/spree/testing_support/preferences.rb +0 -1
  222. data/lib/tasks/core.rake +47 -56
  223. data/lib/tasks/email.rake +2 -2
  224. data/lib/tasks/exchanges.rake +5 -5
  225. data/spree_core.gemspec +1 -1
  226. metadata +5 -9
  227. data/app/models/spree/calculator/percent_per_item.rb +0 -51
  228. data/config/initializers/premailer_rails.rb +0 -3
  229. data/lib/spree/core/delegate_belongs_to.rb +0 -99
  230. data/lib/spree/testing_support/microdata.rb +0 -192
@@ -2,54 +2,52 @@ module Spree
2
2
  module Core
3
3
  module Importer
4
4
  class Order
5
-
6
5
  def self.import(user, params)
7
- begin
8
- ensure_country_id_from_params params[:ship_address_attributes]
9
- ensure_state_id_from_params params[:ship_address_attributes]
10
- ensure_country_id_from_params params[:bill_address_attributes]
11
- ensure_state_id_from_params params[:bill_address_attributes]
12
6
 
13
- create_params = params.slice :currency
14
- order = Spree::Order.create! create_params
15
- order.associate_user!(user)
7
+ ensure_country_id_from_params params[:ship_address_attributes]
8
+ ensure_state_id_from_params params[:ship_address_attributes]
9
+ ensure_country_id_from_params params[:bill_address_attributes]
10
+ ensure_state_id_from_params params[:bill_address_attributes]
16
11
 
17
- shipments_attrs = params.delete(:shipments_attributes)
12
+ create_params = params.slice :currency
13
+ order = Spree::Order.create! create_params
14
+ order.associate_user!(user)
18
15
 
19
- create_line_items_from_params(params.delete(:line_items_attributes),order)
20
- create_shipments_from_params(shipments_attrs, order)
21
- create_adjustments_from_params(params.delete(:adjustments_attributes), order)
22
- create_payments_from_params(params.delete(:payments_attributes), order)
16
+ shipments_attrs = params.delete(:shipments_attributes)
23
17
 
24
- if completed_at = params.delete(:completed_at)
25
- order.completed_at = completed_at
26
- order.state = 'complete'
27
- end
18
+ create_line_items_from_params(params.delete(:line_items_attributes), order)
19
+ create_shipments_from_params(shipments_attrs, order)
20
+ create_adjustments_from_params(params.delete(:adjustments_attributes), order)
21
+ create_payments_from_params(params.delete(:payments_attributes), order)
28
22
 
29
- params.delete(:user_id) unless user.try(:has_spree_role?, "admin") && params.key?(:user_id)
23
+ if completed_at = params.delete(:completed_at)
24
+ order.completed_at = completed_at
25
+ order.state = 'complete'
26
+ end
30
27
 
31
- order.update_attributes!(params)
28
+ params.delete(:user_id) unless user.try(:has_spree_role?, 'admin') && params.key?(:user_id)
32
29
 
33
- order.create_proposed_shipments unless shipments_attrs.present?
30
+ order.update_attributes!(params)
34
31
 
35
- # Really ensure that the order totals & states are correct
36
- order.updater.update
37
- if shipments_attrs.present?
38
- order.shipments.each_with_index do |shipment, index|
39
- shipment.update_columns(cost: shipments_attrs[index][:cost].to_f) if shipments_attrs[index][:cost].present?
40
- end
32
+ order.create_proposed_shipments unless shipments_attrs.present?
33
+
34
+ # Really ensure that the order totals & states are correct
35
+ order.updater.update
36
+ if shipments_attrs.present?
37
+ order.shipments.each_with_index do |shipment, index|
38
+ shipment.update_columns(cost: shipments_attrs[index][:cost].to_f) if shipments_attrs[index][:cost].present?
41
39
  end
42
- order.reload
43
- rescue Exception => e
44
- order.destroy if order && order.persisted?
45
- raise e.message
46
40
  end
41
+ order.reload
42
+ rescue Exception => e
43
+ order.destroy if order && order.persisted?
44
+ raise e.message
45
+
47
46
  end
48
47
 
49
48
  def self.create_shipments_from_params(shipments_hash, order)
50
49
  return [] unless shipments_hash
51
50
 
52
-
53
51
  shipments_hash.each do |s|
54
52
  begin
55
53
  shipment = order.shipments.build
@@ -90,7 +88,7 @@ module Spree
90
88
  end
91
89
 
92
90
  def self.create_inventory_units_from_order_and_params(order, inventory_unit_params)
93
- inventory_unit_params.reduce([]) do |inventory_units, inventory_unit_param|
91
+ inventory_unit_params.each_with_object([]) do |inventory_unit_param, inventory_units|
94
92
  ensure_variant_id_from_params(inventory_unit_param)
95
93
  existing = inventory_units.detect { |unit| unit.variant_id == inventory_unit_param[:variant_id] }
96
94
  if existing
@@ -99,15 +97,15 @@ module Spree
99
97
  line_item = order.line_items.detect { |ln| ln.variant_id = inventory_unit_param[:variant_id] }
100
98
  inventory_units << InventoryUnit.new(line_item: line_item, order_id: order.id, variant: line_item.variant, quantity: 1)
101
99
  end
102
- inventory_units
100
+
103
101
  end
104
102
  end
105
103
 
106
104
  def self.create_line_items_from_params(line_items, order)
107
105
  return {} unless line_items
108
106
  iterator = case line_items
109
- when Hash
110
- ActiveSupport::Deprecation.warn(<<-EOS, caller)
107
+ when Hash
108
+ ActiveSupport::Deprecation.warn(<<-EOS, caller)
111
109
  Passing a hash is now deprecated and will be removed in Spree 4.0.
112
110
  It is recommended that you pass it as an array instead.
113
111
 
@@ -133,9 +131,9 @@ module Spree
133
131
  }
134
132
  }
135
133
  EOS
136
- :each_value
137
- when Array
138
- :each
134
+ :each_value
135
+ when Array
136
+ :each
139
137
  end
140
138
 
141
139
  line_items.send(iterator) do |line_item|
@@ -197,39 +195,39 @@ module Spree
197
195
  end
198
196
 
199
197
  def self.create_source_payment_from_params(source_hash, payment)
200
- begin
201
- Spree::CreditCard.create(
202
- month: source_hash[:month],
203
- year: source_hash[:year],
204
- cc_type: source_hash[:cc_type],
205
- last_digits: source_hash[:last_digits],
206
- name: source_hash[:name],
207
- payment_method: payment.payment_method,
208
- gateway_customer_profile_id: source_hash[:gateway_customer_profile_id],
209
- gateway_payment_profile_id: source_hash[:gateway_payment_profile_id],
210
- imported: true
211
- )
212
- rescue Exception => e
213
- raise "Order import source payments: #{e.message} #{source_hash}"
214
- end
198
+
199
+ Spree::CreditCard.create(
200
+ month: source_hash[:month],
201
+ year: source_hash[:year],
202
+ cc_type: source_hash[:cc_type],
203
+ last_digits: source_hash[:last_digits],
204
+ name: source_hash[:name],
205
+ payment_method: payment.payment_method,
206
+ gateway_customer_profile_id: source_hash[:gateway_customer_profile_id],
207
+ gateway_payment_profile_id: source_hash[:gateway_payment_profile_id],
208
+ imported: true
209
+ )
210
+ rescue Exception => e
211
+ raise "Order import source payments: #{e.message} #{source_hash}"
212
+
215
213
  end
216
214
 
217
215
  def self.ensure_variant_id_from_params(hash)
218
- begin
219
- sku = hash.delete(:sku)
220
- unless hash[:variant_id].present?
221
- hash[:variant_id] = Spree::Variant.active.find_by!(sku: sku).id
222
- end
223
- hash
224
- rescue ActiveRecord::RecordNotFound => e
225
- raise "Ensure order import variant: Variant w/SKU #{sku} not found."
226
- rescue Exception => e
227
- raise "Ensure order import variant: #{e.message} #{hash}"
216
+
217
+ sku = hash.delete(:sku)
218
+ unless hash[:variant_id].present?
219
+ hash[:variant_id] = Spree::Variant.active.find_by!(sku: sku).id
228
220
  end
221
+ hash
222
+ rescue ActiveRecord::RecordNotFound => e
223
+ raise "Ensure order import variant: Variant w/SKU #{sku} not found."
224
+ rescue Exception => e
225
+ raise "Ensure order import variant: #{e.message} #{hash}"
226
+
229
227
  end
230
228
 
231
229
  def self.ensure_country_id_from_params(address)
232
- return if address.nil? or address[:country_id].present? or address[:country].nil?
230
+ return if address.nil? || address[:country_id].present? || address[:country].nil?
233
231
 
234
232
  begin
235
233
  search = {}
@@ -245,14 +243,13 @@ module Spree
245
243
 
246
244
  address.delete(:country)
247
245
  address[:country_id] = Spree::Country.where(search).first!.id
248
-
249
246
  rescue Exception => e
250
247
  raise "Ensure order import address country: #{e.message} #{search}"
251
248
  end
252
249
  end
253
250
 
254
251
  def self.ensure_state_id_from_params(address)
255
- return if address.nil? or address[:state_id].present? or address[:state].nil?
252
+ return if address.nil? || address[:state_id].present? || address[:state].nil?
256
253
 
257
254
  begin
258
255
  search = {}
@@ -44,18 +44,19 @@ module Spree
44
44
  end
45
45
 
46
46
  private
47
- def set_up_options
48
- options_attrs.each do |name|
49
- option_type = Spree::OptionType.where(name: name).first_or_initialize do |option_type|
50
- option_type.presentation = name
51
- option_type.save!
52
- end
53
47
 
54
- unless product.option_types.include?(option_type)
55
- product.option_types << option_type
56
- end
48
+ def set_up_options
49
+ options_attrs.each do |name|
50
+ option_type = Spree::OptionType.where(name: name).first_or_initialize do |option_type|
51
+ option_type.presentation = name
52
+ option_type.save!
53
+ end
54
+
55
+ unless product.option_types.include?(option_type)
56
+ product.option_types << option_type
57
57
  end
58
58
  end
59
+ end
59
60
  end
60
61
  end
61
62
  end
@@ -53,7 +53,7 @@ module Spree
53
53
  # below scope would be something like ["$10 - $15", "$15 - $18", "$18 - $20"]
54
54
  #
55
55
  Spree::Product.add_search_scope :price_range_any do |*opts|
56
- conds = opts.map {|o| Spree::Core::ProductFilters.price_filter[:conds][o]}.reject { |c| c.nil? }
56
+ conds = opts.map { |o| Spree::Core::ProductFilters.price_filter[:conds][o] }.reject(&:nil?)
57
57
  scope = conds.shift
58
58
  conds.each do |new_scope|
59
59
  scope = scope.or(new_scope)
@@ -61,26 +61,25 @@ module Spree
61
61
  Spree::Product.joins(master: :default_price).where(scope)
62
62
  end
63
63
 
64
- def ProductFilters.format_price(amount)
64
+ def self.format_price(amount)
65
65
  Spree::Money.new(amount)
66
66
  end
67
67
 
68
- def ProductFilters.price_filter
68
+ def self.price_filter
69
69
  v = Spree::Price.arel_table
70
- conds = [ [ Spree.t(:under_price, price: format_price(10)) , v[:amount].lteq(10)],
71
- [ "#{format_price(10)} - #{format_price(15)}" , v[:amount].in(10..15)],
72
- [ "#{format_price(15)} - #{format_price(18)}" , v[:amount].in(15..18)],
73
- [ "#{format_price(18)} - #{format_price(20)}" , v[:amount].in(18..20)],
74
- [ Spree.t(:or_over_price, price: format_price(20)) , v[:amount].gteq(20)]]
70
+ conds = [[Spree.t(:under_price, price: format_price(10)), v[:amount].lteq(10)],
71
+ ["#{format_price(10)} - #{format_price(15)}", v[:amount].in(10..15)],
72
+ ["#{format_price(15)} - #{format_price(18)}", v[:amount].in(15..18)],
73
+ ["#{format_price(18)} - #{format_price(20)}", v[:amount].in(18..20)],
74
+ [Spree.t(:or_over_price, price: format_price(20)), v[:amount].gteq(20)]]
75
75
  {
76
76
  name: Spree.t(:price_range),
77
77
  scope: :price_range_any,
78
78
  conds: Hash[*conds.flatten],
79
- labels: conds.map { |k,v| [k, k] }
79
+ labels: conds.map { |k, _v| [k, k] }
80
80
  }
81
81
  end
82
82
 
83
-
84
83
  # Example: filtering by possible brands
85
84
  #
86
85
  # First, we define the scope. Two interesting points here: (a) we run our conditions
@@ -94,7 +93,7 @@ module Spree
94
93
  # being blank: note that this relies on with_property doing a left outer join
95
94
  # rather than an inner join.
96
95
  Spree::Product.add_search_scope :brand_any do |*opts|
97
- conds = opts.map {|o| ProductFilters.brand_filter[:conds][o]}.reject { |c| c.nil? }
96
+ conds = opts.map { |o| ProductFilters.brand_filter[:conds][o] }.reject(&:nil?)
98
97
  scope = conds.shift
99
98
  conds.each do |new_scope|
100
99
  scope = scope.or(new_scope)
@@ -102,7 +101,7 @@ module Spree
102
101
  Spree::Product.with_property('brand').where(scope)
103
102
  end
104
103
 
105
- def ProductFilters.brand_filter
104
+ def self.brand_filter
106
105
  brand_property = Spree::Property.find_by(name: 'brand')
107
106
  brands = brand_property ? Spree::ProductProperty.where(property_id: brand_property.id).pluck(:value).uniq.map(&:to_s) : []
108
107
  pp = Spree::ProductProperty.arel_table
@@ -111,7 +110,7 @@ module Spree
111
110
  name: I18n.t('spree.taxonomy_brands_name'),
112
111
  scope: :brand_any,
113
112
  conds: conds,
114
- labels: (brands.sort).map { |k| [k, k] }
113
+ labels: brands.sort.map { |k| [k, k] }
115
114
  }
116
115
  end
117
116
 
@@ -138,12 +137,12 @@ module Spree
138
137
  Spree::Product.brand_any(*opts)
139
138
  end
140
139
 
141
- def ProductFilters.selective_brand_filter(taxon = nil)
140
+ def self.selective_brand_filter(taxon = nil)
142
141
  taxon ||= Spree::Taxonomy.first.root
143
142
  brand_property = Spree::Property.find_by(name: 'brand')
144
143
  scope = Spree::ProductProperty.where(property: brand_property).
145
- joins(product: :taxons).
146
- where("#{Spree::Taxon.table_name}.id" => [taxon] + taxon.descendants)
144
+ joins(product: :taxons).
145
+ where("#{Spree::Taxon.table_name}.id" => [taxon] + taxon.descendants)
147
146
  brands = scope.pluck(:value).uniq
148
147
  {
149
148
  name: 'Applicable Brands',
@@ -164,7 +163,7 @@ module Spree
164
163
  #
165
164
  # This scope selects products in any of the active taxons or their children.
166
165
  #
167
- def ProductFilters.taxons_below(taxon)
166
+ def self.taxons_below(taxon)
168
167
  return Spree::Core::ProductFilters.all_taxons if taxon.nil?
169
168
  {
170
169
  name: 'Taxons under ' + taxon.name,
@@ -180,7 +179,7 @@ module Spree
180
179
  # it uses one of the auto-generated scopes from Ransack.
181
180
  #
182
181
  # idea: expand the format to allow nesting of labels?
183
- def ProductFilters.all_taxons
182
+ def self.all_taxons
184
183
  taxons = Spree::Taxonomy.all.map { |t| [t.root] + t.root.descendants }.flatten
185
184
  {
186
185
  name: 'All taxons',
@@ -14,17 +14,13 @@ module Spree
14
14
  # This is mainly why this whole file exists in the first place.
15
15
  #
16
16
  # Thus we need to make sure that the routes aren't drawn twice.
17
- unless @spree_routes.include?(block)
18
- @spree_routes << block
19
- end
17
+ @spree_routes << block unless @spree_routes.include?(block)
20
18
  end
21
19
 
22
20
  def self.append_routes(&block)
23
21
  @append_routes ||= []
24
22
  # See comment in add_routes.
25
- unless @append_routes.include?(block)
26
- @append_routes << block
27
- end
23
+ @append_routes << block unless @append_routes.include?(block)
28
24
  end
29
25
 
30
26
  def self.draw_routes(&block)
@@ -17,14 +17,14 @@ module Spree
17
17
  curr_page = page || 1
18
18
 
19
19
  unless Spree::Config.show_products_without_price
20
- @products = @products.where("spree_prices.amount IS NOT NULL").
21
- where("spree_prices.currency" => current_currency)
20
+ @products = @products.where('spree_prices.amount IS NOT NULL').
21
+ where('spree_prices.currency' => current_currency)
22
22
  end
23
23
  @products = @products.page(curr_page).per(per_page)
24
24
  end
25
25
 
26
26
  def method_missing(name)
27
- if @properties.has_key? name
27
+ if @properties.key? name
28
28
  @properties[name]
29
29
  else
30
30
  super
@@ -32,71 +32,74 @@ module Spree
32
32
  end
33
33
 
34
34
  protected
35
- def get_base_scope
36
- base_scope = Spree::Product.spree_base_scopes.active
37
- base_scope = base_scope.in_taxon(taxon) unless taxon.blank?
38
- base_scope = get_products_conditions_for(base_scope, keywords)
39
- base_scope = add_search_scopes(base_scope)
40
- base_scope = add_eagerload_scopes(base_scope)
41
- base_scope
42
- end
43
35
 
44
- def add_eagerload_scopes scope
45
- # TL;DR Switch from `preload` to `includes` as soon as Rails starts honoring
46
- # `order` clauses on `has_many` associations when a `where` constraint
47
- # affecting a joined table is present (see
48
- # https://github.com/rails/rails/issues/6769).
49
- #
50
- # Ideally this would use `includes` instead of `preload` calls, leaving it
51
- # up to Rails whether associated objects should be fetched in one big join
52
- # or multiple independent queries. However as of Rails 4.1.8 any `order`
53
- # defined on `has_many` associations are ignored when Rails builds a join
54
- # query.
55
- #
56
- # Would we use `includes` in this particular case, Rails would do
57
- # separate queries most of the time but opt for a join as soon as any
58
- # `where` constraints affecting joined tables are added to the search;
59
- # which is the case as soon as a taxon is added to the base scope.
60
- scope = scope.preload(:tax_category)
61
- scope = scope.preload(master: :prices)
62
- scope = scope.preload(master: :images) if include_images
63
- scope
64
- end
36
+ def get_base_scope
37
+ base_scope = Spree::Product.spree_base_scopes.active
38
+ base_scope = base_scope.in_taxon(taxon) unless taxon.blank?
39
+ base_scope = get_products_conditions_for(base_scope, keywords)
40
+ base_scope = add_search_scopes(base_scope)
41
+ base_scope = add_eagerload_scopes(base_scope)
42
+ base_scope
43
+ end
65
44
 
66
- def add_search_scopes(base_scope)
45
+ def add_eagerload_scopes(scope)
46
+ # TL;DR Switch from `preload` to `includes` as soon as Rails starts honoring
47
+ # `order` clauses on `has_many` associations when a `where` constraint
48
+ # affecting a joined table is present (see
49
+ # https://github.com/rails/rails/issues/6769).
50
+ #
51
+ # Ideally this would use `includes` instead of `preload` calls, leaving it
52
+ # up to Rails whether associated objects should be fetched in one big join
53
+ # or multiple independent queries. However as of Rails 4.1.8 any `order`
54
+ # defined on `has_many` associations are ignored when Rails builds a join
55
+ # query.
56
+ #
57
+ # Would we use `includes` in this particular case, Rails would do
58
+ # separate queries most of the time but opt for a join as soon as any
59
+ # `where` constraints affecting joined tables are added to the search;
60
+ # which is the case as soon as a taxon is added to the base scope.
61
+ scope = scope.preload(:tax_category)
62
+ scope = scope.preload(master: :prices)
63
+ scope = scope.preload(master: :images) if include_images
64
+ scope
65
+ end
66
+
67
+ def add_search_scopes(base_scope)
68
+ if search.is_a?(ActionController::Parameters)
67
69
  search.each do |name, scope_attribute|
68
70
  scope_name = name.to_sym
69
- if base_scope.respond_to?(:search_scopes) && base_scope.search_scopes.include?(scope_name.to_sym)
70
- base_scope = base_scope.send(scope_name, *scope_attribute)
71
- else
72
- base_scope = base_scope.merge(Spree::Product.ransack({scope_name => scope_attribute}).result)
73
- end
74
- end if search.is_a?(ActionController::Parameters)
75
- base_scope
71
+ base_scope = if base_scope.respond_to?(:search_scopes) && base_scope.search_scopes.include?(scope_name.to_sym)
72
+ base_scope.send(scope_name, *scope_attribute)
73
+ else
74
+ base_scope.merge(Spree::Product.ransack(scope_name => scope_attribute).result)
75
+ end
76
+ end
76
77
  end
78
+ base_scope
79
+ end
77
80
 
78
- # method should return new scope based on base_scope
79
- def get_products_conditions_for(base_scope, query)
80
- unless query.blank?
81
- base_scope = base_scope.like_any([:name, :description], query.split)
82
- end
83
- base_scope
81
+ # method should return new scope based on base_scope
82
+ def get_products_conditions_for(base_scope, query)
83
+ unless query.blank?
84
+ base_scope = base_scope.like_any([:name, :description], query.split)
84
85
  end
86
+ base_scope
87
+ end
85
88
 
86
- def prepare(params)
87
- @properties[:taxon] = params[:taxon].blank? ? nil : Spree::Taxon.find(params[:taxon])
88
- @properties[:keywords] = params[:keywords]
89
- @properties[:search] = params[:search]
90
- @properties[:include_images] = params[:include_images]
89
+ def prepare(params)
90
+ @properties[:taxon] = params[:taxon].blank? ? nil : Spree::Taxon.find(params[:taxon])
91
+ @properties[:keywords] = params[:keywords]
92
+ @properties[:search] = params[:search]
93
+ @properties[:include_images] = params[:include_images]
91
94
 
92
- per_page = params[:per_page].to_i
93
- @properties[:per_page] = per_page > 0 ? per_page : Spree::Config[:products_per_page]
94
- if params[:page].respond_to?(:to_i)
95
- @properties[:page] = (params[:page].to_i <= 0) ? 1 : params[:page].to_i
96
- else
97
- @properties[:page] = 1
98
- end
99
- end
95
+ per_page = params[:per_page].to_i
96
+ @properties[:per_page] = per_page > 0 ? per_page : Spree::Config[:products_per_page]
97
+ @properties[:page] = if params[:page].respond_to?(:to_i)
98
+ params[:page].to_i <= 0 ? 1 : params[:page].to_i
99
+ else
100
+ 1
101
+ end
102
+ end
100
103
  end
101
104
  end
102
105
  end
@@ -1,5 +1,5 @@
1
1
  module Spree
2
2
  def self.version
3
- "3.3.6"
3
+ '3.4.0.rc1'
4
4
  end
5
5
  end
data/lib/spree/core.rb CHANGED
@@ -19,12 +19,11 @@ require 'state_machines-activerecord'
19
19
  StateMachines::Machine.ignore_method_conflicts = true
20
20
 
21
21
  module Spree
22
-
23
22
  mattr_accessor :user_class
24
23
 
25
24
  def self.user_class
26
25
  if @@user_class.is_a?(Class)
27
- raise "Spree.user_class MUST be a String or Symbol object, not a Class object."
26
+ raise 'Spree.user_class MUST be a String or Symbol object, not a Class object.'
28
27
  elsif @@user_class.is_a?(String) || @@user_class.is_a?(Symbol)
29
28
  @@user_class.to_s.constantize
30
29
  end
@@ -55,13 +54,13 @@ module Spree
55
54
  #
56
55
  # This method is defined within the core gem on purpose.
57
56
  # Some people may only wish to use the Core part of Spree.
58
- def self.config(&block)
57
+ def self.config
59
58
  yield(Spree::Config)
60
59
  end
61
60
 
62
61
  module Core
63
- autoload :ProductFilters, "spree/core/product_filters"
64
- autoload :TokenGenerator, "spree/core/token_generator"
62
+ autoload :ProductFilters, 'spree/core/product_filters'
63
+ autoload :TokenGenerator, 'spree/core/token_generator'
65
64
 
66
65
  class GatewayError < RuntimeError; end
67
66
  class DestroyWithOrdersError < StandardError; end
@@ -83,7 +82,6 @@ require 'spree/localized_number'
83
82
  require 'spree/money'
84
83
  require 'spree/permitted_attributes'
85
84
 
86
- require 'spree/core/delegate_belongs_to'
87
85
  require 'spree/core/importer'
88
86
  require 'spree/core/product_duplicator'
89
87
  require 'spree/core/controller_helpers/auth'
data/lib/spree/i18n.rb CHANGED
@@ -18,7 +18,7 @@ module Spree
18
18
  super(*args)
19
19
  end
20
20
 
21
- alias_method :t, :translate
21
+ alias t translate
22
22
 
23
23
  def context
24
24
  Spree::ViewContext.context
@@ -26,11 +26,9 @@ module Spree
26
26
 
27
27
  def virtual_path
28
28
  if context
29
- path = context.instance_variable_get("@virtual_path")
29
+ path = context.instance_variable_get('@virtual_path')
30
30
 
31
- if path
32
- path.gsub(/spree/, '')
33
- end
31
+ path.gsub(/spree/, '') if path
34
32
  end
35
33
  end
36
34
  end
@@ -1,6 +1,5 @@
1
1
  module Spree
2
2
  class LocalizedNumber
3
-
4
3
  # Strips all non-price-like characters from the number, taking into account locale settings.
5
4
  def self.parse(number)
6
5
  return number unless number.is_a?(String)
@@ -20,6 +19,5 @@ module Spree
20
19
 
21
20
  number.to_d
22
21
  end
23
-
24
22
  end
25
23
  end
@@ -4,7 +4,8 @@ module Spree
4
4
 
5
5
  # Takes the engine config block and engine name
6
6
  def initialize(config, engine_name)
7
- @config, @engine_name = config, engine_name
7
+ @config = config
8
+ @engine_name = engine_name
8
9
  end
9
10
 
10
11
  # Puts warning when any engine migration is not present on the Rails app
@@ -23,7 +24,7 @@ module Spree
23
24
  def check
24
25
  if File.directory?(app_dir)
25
26
  engine_in_app = app_migrations.map do |file_name|
26
- name, engine = file_name.split(".", 2)
27
+ name, engine = file_name.split('.', 2)
27
28
  next unless match_engine?(engine)
28
29
  name
29
30
  end.compact
@@ -44,15 +45,15 @@ module Spree
44
45
 
45
46
  def engine_migrations
46
47
  Dir.entries(engine_dir).map do |file_name|
47
- name = file_name.split("_", 2).last.split(".", 2).first
48
+ name = file_name.split('_', 2).last.split('.', 2).first
48
49
  name.empty? ? next : name
49
50
  end.compact! || []
50
51
  end
51
52
 
52
53
  def app_migrations
53
54
  Dir.entries(app_dir).map do |file_name|
54
- next if [".", ".."].include? file_name
55
- name = file_name.split("_", 2).last
55
+ next if ['.', '..'].include? file_name
56
+ name = file_name.split('_', 2).last
56
57
  name.empty? ? next : name
57
58
  end.compact! || []
58
59
  end
@@ -66,9 +67,9 @@ module Spree
66
67
  end
67
68
 
68
69
  def match_engine?(engine)
69
- if engine_name == "spree"
70
+ if engine_name == 'spree'
70
71
  # Avoid stores upgrading from 1.3 getting wrong warnings
71
- ["spree.rb", "spree_promo.rb"].include? engine
72
+ ['spree.rb', 'spree_promo.rb'].include? engine
72
73
  else
73
74
  engine == "#{engine_name}.rb"
74
75
  end