spree_core 1.1.2 → 1.1.3

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 (51) hide show
  1. data/app/assets/javascripts/admin/admin.js.erb +21 -20
  2. data/app/assets/stylesheets/store/screen.css.scss +4 -0
  3. data/app/controllers/spree/admin/payment_methods_controller.rb +1 -1
  4. data/app/controllers/spree/admin/products_controller.rb +1 -1
  5. data/app/controllers/spree/admin/shipping_methods_controller.rb +1 -1
  6. data/app/controllers/spree/admin/taxons_controller.rb +1 -1
  7. data/app/controllers/spree/content_controller.rb +1 -1
  8. data/app/controllers/spree/products_controller.rb +5 -4
  9. data/app/helpers/spree/admin/products_helper.rb +0 -9
  10. data/app/helpers/spree/products_helper.rb +14 -1
  11. data/app/helpers/spree/taxons_helper.rb +1 -0
  12. data/app/models/spree/address.rb +1 -1
  13. data/app/models/spree/app_configuration.rb +1 -0
  14. data/app/models/spree/creditcard.rb +1 -1
  15. data/app/models/spree/image.rb +1 -0
  16. data/app/models/spree/line_item.rb +1 -1
  17. data/app/models/spree/order.rb +2 -2
  18. data/app/models/spree/payment_method.rb +1 -1
  19. data/app/models/spree/product.rb +2 -1
  20. data/app/models/spree/product/scopes.rb +0 -11
  21. data/app/models/spree/shipment.rb +6 -7
  22. data/app/models/spree/tax_category.rb +1 -1
  23. data/app/models/spree/taxonomy.rb +1 -1
  24. data/app/models/spree/tracker.rb +2 -1
  25. data/app/models/spree/variant.rb +5 -0
  26. data/app/models/spree/zone.rb +5 -11
  27. data/app/models/spree/zone_member.rb +1 -1
  28. data/app/views/spree/admin/image_settings/edit.html.erb +7 -0
  29. data/app/views/spree/admin/images/index.html.erb +2 -0
  30. data/app/views/spree/admin/option_types/index.html.erb +2 -0
  31. data/app/views/spree/admin/orders/customer_details/edit.html.erb +1 -1
  32. data/app/views/spree/admin/shared/_head.html.erb +9 -6
  33. data/app/views/spree/admin/variants/index.html.erb +2 -0
  34. data/app/views/spree/checkout/_address.html.erb +6 -6
  35. data/app/views/spree/layouts/spree_application.html.erb +7 -7
  36. data/app/views/spree/orders/_line_item.html.erb +1 -1
  37. data/app/views/spree/shared/_google_analytics.html.erb +27 -27
  38. data/app/views/spree/taxons/show.html.erb +5 -5
  39. data/config/locales/en.yml +1 -0
  40. data/config/routes.rb +2 -7
  41. data/db/migrate/20090923100315_add_count_on_hand_to_variants_and_products.rb +2 -2
  42. data/db/migrate/20091015153048_add_openid_field_to_users.rb +1 -1
  43. data/db/migrate/20091021133257_charge_refactoring.rb +2 -2
  44. data/db/migrate/20100105132138_shipment_id_for_inventory_units.rb +1 -1
  45. data/db/migrate/20120712172620_add_counter_cache_to_zone_members.rb +14 -0
  46. data/lib/spree/core/controller_helpers.rb +0 -5
  47. data/lib/spree/core/mail_interceptor.rb +1 -1
  48. data/lib/spree/core/permalinks.rb +2 -2
  49. data/lib/spree/core/testing_support/factories/product_factory.rb +1 -3
  50. data/lib/spree/core/version.rb +1 -1
  51. metadata +32 -31
@@ -164,9 +164,9 @@ $.fn.product_autocomplete = function(){
164
164
  $.fn.objectPicker = function(url){
165
165
  $(this).tokenInput(url + "&authenticity_token=" + escape(AUTH_TOKEN), {
166
166
  searchDelay : 600,
167
- hintText : strings.type_to_search,
168
- noResultsText : strings.no_results,
169
- searchingText : strings.searching,
167
+ hintText : Spree.strings.type_to_search,
168
+ noResultsText : Spree.strings.no_results,
169
+ searchingText : Spree.strings.searching,
170
170
  prePopulateFromInput : true
171
171
  });
172
172
  };
@@ -174,26 +174,11 @@ $.fn.objectPicker = function(url){
174
174
  $.fn.productPicker = function(){
175
175
  $(this).objectPicker(Spree.routes.product_search_basic);
176
176
  }
177
+
177
178
  $.fn.userPicker = function(){
178
179
  $(this).objectPicker(Spree.routes.user_search);
179
180
  }
180
181
 
181
- $(".observe_field").on('change', function() {
182
- target = $(this).attr("data-update");
183
- ajax_indicator = $(this).attr("data-ajax-indicator") || '#busy_indicator';
184
- $(target).hide();
185
- $(ajax_indicator).show();
186
- $.ajax({ dataType: 'html',
187
- url: $(this).attr("data-base-url")+encodeURIComponent($(this).val()),
188
- type: 'get',
189
- success: function(data){
190
- $(target).html(data);
191
- $(ajax_indicator).hide();
192
- $(target).show();
193
- }
194
- });
195
- });
196
-
197
182
  handle_date_picker_fields = function(){
198
183
  $('.datepicker').datepicker({
199
184
  dateFormat: "<%= ::I18n.t(:format, :scope => 'spree.date_picker', :default => 'yy/mm/dd') %>",
@@ -209,6 +194,22 @@ handle_date_picker_fields = function(){
209
194
  }
210
195
 
211
196
  $(document).ready(function(){
197
+ $(".observe_field").on('change', function() {
198
+ target = $(this).attr("data-update");
199
+ ajax_indicator = $(this).attr("data-ajax-indicator") || '#busy_indicator';
200
+ $(target).hide();
201
+ $(ajax_indicator).show();
202
+ $.ajax({ dataType: 'html',
203
+ url: $(this).attr("data-base-url")+encodeURIComponent($(this).val()),
204
+ type: 'get',
205
+ success: function(data){
206
+ $(target).html(data);
207
+ $(ajax_indicator).hide();
208
+ $(target).show();
209
+ }
210
+ });
211
+ });
212
+
212
213
  $('.add_fields').click(function() {
213
214
  var target = $(this).data("target");
214
215
  var new_table_row = $(target + ' tr:visible:last').clone();
@@ -255,7 +256,7 @@ $(document).ready(function(){
255
256
 
256
257
  handle_date_picker_fields();
257
258
 
258
- $(".select_properties_from_prototype").on("click", function(){
259
+ $('body').on('click', '.select_properties_from_prototype', function(){
259
260
  $("#busy_indicator").show();
260
261
  var clicked_link = $(this);
261
262
  $.ajax({ dataType: 'script', url: clicked_link.attr("href"), type: 'get',
@@ -530,6 +530,10 @@ mark {background-color: $link_text_color; color: $layout_background_color; font-
530
530
  text-align: center;
531
531
  border: 1px solid lighten($body_text_color, 60);
532
532
  background-color: $product_background_color;
533
+
534
+ img {
535
+ min-height: 240px;
536
+ }
533
537
  }
534
538
  #product-thumbnails {
535
539
  li {
@@ -22,7 +22,7 @@ module Spree
22
22
  invoke_callbacks(:update, :before)
23
23
  payment_method_type = params[:payment_method].delete(:type)
24
24
  if @payment_method['type'].to_s != payment_method_type
25
- @payment_method.update_attribute(:type, payment_method_type)
25
+ @payment_method.update_column(:type, payment_method_type)
26
26
  @payment_method = PaymentMethod.find(params[:id])
27
27
  end
28
28
 
@@ -23,7 +23,7 @@ module Spree
23
23
  # instead of actually deleting the product.
24
24
  def destroy
25
25
  @product = Product.find_by_permalink!(params[:id])
26
- @product.update_attribute(:deleted_at, Time.now)
26
+ @product.update_column(:deleted_at, Time.now)
27
27
 
28
28
  @product.variants_including_master.update_all(:deleted_at => Time.now)
29
29
 
@@ -5,7 +5,7 @@ module Spree
5
5
  before_filter :set_shipping_category, :only => [:create, :update]
6
6
 
7
7
  def destroy
8
- @object.update_attribute(:deleted_at, Time.now)
8
+ @object.touch :deleted_at
9
9
 
10
10
  flash.notice = flash_message_for(@object, :successfully_removed)
11
11
 
@@ -58,7 +58,7 @@ module Spree
58
58
  @taxon.move_to_right_of(new_siblings[new_position]) # we move down
59
59
  end
60
60
  # Reset legacy position, if any extensions still rely on it
61
- new_parent.children.reload.each{|t| t.update_attribute(:position, t.position)}
61
+ new_parent.children.reload.each{|t| t.update_column(:position, t.position)}
62
62
 
63
63
  if parent_id
64
64
  @taxon.reload
@@ -16,7 +16,7 @@ module Spree
16
16
 
17
17
  def cvv
18
18
  respond_with do |format|
19
- format.html { render 'cvv', :layout => false }
19
+ format.html { render :layout => false }
20
20
  end
21
21
  end
22
22
  end
@@ -1,6 +1,5 @@
1
1
  module Spree
2
2
  class ProductsController < BaseController
3
- HTTP_REFERER_REGEXP = /^https?:\/\/[^\/]+\/t\/([a-z0-9\-\/]+)$/
4
3
  before_filter :load_product, :only => :show
5
4
  rescue_from ActiveRecord::RecordNotFound, :with => :render_404
6
5
  helper 'spree/taxons'
@@ -20,9 +19,11 @@ module Spree
20
19
  @product_properties = ProductProperty.includes(:property).where(:product_id => @product.id)
21
20
 
22
21
  referer = request.env['HTTP_REFERER']
23
-
24
- if referer && referer.match(HTTP_REFERER_REGEXP)
25
- @taxon = Taxon.find_by_permalink($1)
22
+ if referer
23
+ referer_path = URI.parse(request.env['HTTP_REFERER']).path
24
+ if referer_path && referer_path.match(/\/t\/(.*)/)
25
+ @taxon = Taxon.find_by_permalink($1)
26
+ end
26
27
  end
27
28
 
28
29
  respond_with(@product)
@@ -1,15 +1,6 @@
1
1
  module Spree
2
2
  module Admin
3
3
  module ProductsHelper
4
- def option_type_select(so)
5
- select(:new_variant,
6
- so.option_type.presentation,
7
- so.option_type.option_values.collect { |ov| [ ov.presentation, ov.id ] })
8
- end
9
-
10
- def pv_tag_id(product_value)
11
- "product-property-value-#{product_value.id}"
12
- end
13
4
  end
14
5
  end
15
6
  end
@@ -14,11 +14,24 @@ module Spree
14
14
 
15
15
  # converts line breaks in product description into <p> tags (for html display purposes)
16
16
  def product_description(product)
17
- raw(product.description.gsub(/(.*?)\n\n/m, '<p>\1</p>\n\n'))
17
+ raw(product.description.gsub(/(.*?)\r?\n\r?\n/m, '<p>\1</p>'))
18
18
  end
19
19
 
20
20
  def variant_images_hash(product)
21
21
  product.variant_images.inject({}) { |h, img| (h[img.viewable_id] ||= []) << img; h }
22
22
  end
23
+
24
+ def line_item_description(variant)
25
+ description = variant.product.description
26
+ if description.present?
27
+ truncate(strip_tags(description.gsub('&nbsp;', ' ')), :length => 100)
28
+ else
29
+ t(:product_has_no_description)
30
+ end
31
+ end
32
+
33
+ def get_taxonomies
34
+ @taxonomies ||= Spree::Taxonomy.includes(:root => :children)
35
+ end
23
36
  end
24
37
  end
@@ -9,6 +9,7 @@ module Spree
9
9
  taxon.descendants.each do |taxon|
10
10
  to_get = max - products.length
11
11
  products += taxon.active_products.limit(to_get)
12
+ products = products.uniq
12
13
  break if products.size >= max
13
14
  end
14
15
  end
@@ -44,7 +44,7 @@ module Spree
44
44
  end
45
45
 
46
46
  def zones
47
- Zone.match(self)
47
+ @zones ||= Zone.match(self)
48
48
  end
49
49
 
50
50
  def same_as?(other)
@@ -76,6 +76,7 @@ module Spree
76
76
  preference :s3_secret, :string
77
77
  preference :s3_headers, :string, :default => "{\"Cache-Control\":\"max-age=31557600\"}"
78
78
  preference :use_s3, :boolean, :default => false # Use S3 for images rather than the file system
79
+ preference :s3_protocol, :string
79
80
 
80
81
  # searcher_class allows spree extension writers to provide their own Search class
81
82
  def searcher_class
@@ -12,7 +12,7 @@ module Spree
12
12
  validates :verification_value, :presence => true, :unless => :has_payment_profile?, :on => :create
13
13
 
14
14
  attr_accessible :first_name, :last_name, :number, :verification_value, :year,
15
- :month, :gateway_customer_profile_id
15
+ :month, :gateway_customer_profile_id, :gateway_payment_profile_id
16
16
 
17
17
  scope :with_payment_profile, where('gateway_customer_profile_id IS NOT NULL')
18
18
 
@@ -21,6 +21,7 @@ module Spree
21
21
  Spree::Image.attachment_definitions[:attachment][:s3_credentials] = s3_creds
22
22
  Spree::Image.attachment_definitions[:attachment][:s3_headers] = ActiveSupport::JSON.decode(Spree::Config[:s3_headers])
23
23
  Spree::Image.attachment_definitions[:attachment][:bucket] = Spree::Config[:s3_bucket]
24
+ Spree::Image.attachment_definitions[:attachment][:s3_protocol] = Spree::Config[:s3_protocol] unless Spree::Config[:s3_protocol].blank?
24
25
  end
25
26
 
26
27
  Spree::Image.attachment_definitions[:attachment][:styles] = ActiveSupport::JSON.decode(Spree::Config[:attachment_styles])
@@ -15,7 +15,7 @@ module Spree
15
15
  validate :stock_availability
16
16
  validate :quantity_no_less_than_shipped
17
17
 
18
- attr_accessible :quantity
18
+ attr_accessible :quantity, :variant_id
19
19
 
20
20
  before_save :update_inventory
21
21
  before_destroy :ensure_not_shipped, :remove_inventory
@@ -383,10 +383,10 @@ module Spree
383
383
  # Finalizes an in progress order after checkout is complete.
384
384
  # Called after transition to complete state when payments will have been processed
385
385
  def finalize!
386
- update_attribute(:completed_at, Time.now)
386
+ touch :completed_at
387
387
  InventoryUnit.assign_opening_inventory(self)
388
388
  # lock any optional adjustments (coupon promotions, etc.)
389
- adjustments.optional.each { |adjustment| adjustment.update_attribute('locked', true) }
389
+ adjustments.optional.each { |adjustment| adjustment.update_column('locked', true) }
390
390
  deliver_order_confirmation_email
391
391
 
392
392
  self.state_changes.create({
@@ -35,7 +35,7 @@ module Spree
35
35
  end
36
36
 
37
37
  def destroy
38
- self.update_attribute(:deleted_at, Time.now.utc)
38
+ touch :deleted_at
39
39
  end
40
40
 
41
41
  def self.find_with_destroyed *args
@@ -60,7 +60,8 @@ module Spree
60
60
 
61
61
  def variant_images
62
62
  Image.joins("LEFT JOIN #{Variant.quoted_table_name} ON #{Variant.quoted_table_name}.id = #{Asset.quoted_table_name}.viewable_id").
63
- where("#{Variant.quoted_table_name}.product_id = #{self.id}").
63
+ where("(#{Asset.quoted_table_name}.viewable_type = ? AND #{Asset.quoted_table_name}.viewable_id = ?) OR
64
+ (#{Asset.quoted_table_name}.viewable_type = ? AND #{Asset.quoted_table_name}.viewable_id = ?)", Variant.name, self.master.id, Product.name, self.id).
64
65
  order("#{Asset.quoted_table_name}.position").
65
66
  extend(Spree::Core::RelationSerialization)
66
67
  end
@@ -34,17 +34,6 @@ module Spree
34
34
  joins(:variants_with_only_master).order("#{variant_table_name}.price DESC")
35
35
  end
36
36
 
37
- # Ryan Bates - http://railscasts.com/episodes/112
38
- # general merging of conditions, names following the searchlogic pattern
39
- add_search_scope :conditions do |*args|
40
- where(args)
41
- end
42
-
43
- # conditions_all is a more descriptively named enhancement of the above
44
- add_search_scope :conditions_all do |*args|
45
- where([args].flatten)
46
- end
47
-
48
37
  add_search_scope :price_between do |low, high|
49
38
  joins(:master).where(Variant.table_name => { :price => low..high })
50
39
  end
@@ -86,7 +86,7 @@ module Spree
86
86
  def update!(order)
87
87
  old_state = state
88
88
  new_state = determine_state(order)
89
- update_attribute_without_callbacks 'state', determine_state(order)
89
+ update_column 'state', new_state
90
90
  after_ship if new_state == 'shipped' and old_state != 'shipped'
91
91
  end
92
92
 
@@ -105,12 +105,6 @@ module Spree
105
105
  "#{I18n.t(:shipping)} (#{shipping_method.name})"
106
106
  end
107
107
 
108
- # def transition_order
109
- # update_attribute(:shipped_at, Time.now)
110
- # # transition order to shipped if all shipments have been shipped
111
- # order.ship! if order.shipments.all?(&:shipped?)
112
- # end
113
-
114
108
  def validate_shipping_method
115
109
  unless shipping_method.nil?
116
110
  errors.add :shipping_method, I18n.t(:is_not_available_to_shipment_address) unless shipping_method.zone.include?(address)
@@ -138,6 +132,11 @@ module Spree
138
132
 
139
133
  def after_ship
140
134
  inventory_units.each &:ship!
135
+ send_shipped_email
136
+ touch :shipped_at
137
+ end
138
+
139
+ def send_shipped_email
141
140
  ShipmentMailer.shipped_email(self).deliver
142
141
  end
143
142
 
@@ -14,7 +14,7 @@ module Spree
14
14
  #set existing default tax category to false if this one has been marked as default
15
15
 
16
16
  if is_default && tax_category = self.class.where(:is_default => true).first
17
- tax_category.update_attribute(:is_default, false) unless tax_category == self
17
+ tax_category.update_column(:is_default, false) unless tax_category == self
18
18
  end
19
19
  end
20
20
 
@@ -13,7 +13,7 @@ module Spree
13
13
  private
14
14
  def set_name
15
15
  if root
16
- root.update_attribute(:name, name)
16
+ root.update_column(:name, name)
17
17
  else
18
18
  self.root = Taxon.create!({ :taxonomy_id => id, :name => name }, :without_protection => true)
19
19
  end
@@ -3,7 +3,8 @@ module Spree
3
3
  attr_accessible :analytics_id, :environment, :active
4
4
 
5
5
  def self.current
6
- first(:conditions => { :active => true, :environment => Rails.env })
6
+ tracker = first(:conditions => { :active => true, :environment => Rails.env })
7
+ tracker.analytics_id.present? ? tracker : nil if tracker
7
8
  end
8
9
  end
9
10
  end
@@ -22,6 +22,7 @@ module Spree
22
22
  validates :count_on_hand, :numericality => true
23
23
 
24
24
  before_save :touch_product
25
+ after_save :recalculate_product_on_hand, :if => :is_master?
25
26
 
26
27
  # default variant scope only lists non-deleted variants
27
28
  scope :active, where(:deleted_at => nil)
@@ -166,6 +167,10 @@ module Spree
166
167
  def touch_product
167
168
  product.touch unless is_master?
168
169
  end
170
+
171
+ def recalculate_product_on_hand
172
+ product.update_column(:count_on_hand, product.on_hand)
173
+ end
169
174
  end
170
175
  end
171
176
 
@@ -14,13 +14,8 @@ module Spree
14
14
  attr_accessible :name, :description, :default_tax, :kind, :zone_members, :zone_members_attributes
15
15
 
16
16
  def kind
17
- member = members.last
18
-
19
- case member && member.zoneable_type
20
- when 'Spree::State' then 'state'
21
- else
22
- 'country'
23
- end
17
+ return nil if members.empty? || members.any? { |member| member.try(:zoneable_type).nil? }
18
+ members.last.zoneable_type.demodulize.downcase
24
19
  end
25
20
 
26
21
  def kind=(value)
@@ -46,7 +41,7 @@ module Spree
46
41
  # Returns the matching zone with the highest priority zone type (State, Country, Zone.)
47
42
  # Returns nil in the case of no matches.
48
43
  def self.match(address)
49
- return unless matches = self.order('created_at').select { |zone| zone.include? address }
44
+ return unless matches = self.includes(:zone_members).order('zone_members_count', 'created_at').select { |zone| zone.include? address }
50
45
 
51
46
  ['state', 'country'].each do |zone_kind|
52
47
  if match = matches.detect { |zone| zone_kind == zone.kind }
@@ -58,7 +53,7 @@ module Spree
58
53
 
59
54
  # convenience method for returning the countries contained within a zone
60
55
  def country_list
61
- members.map { |zone_member|
56
+ @countries ||= members.includes(:zoneable).map { |zone_member|
62
57
  case zone_member.zoneable_type
63
58
  when 'Spree::Country'
64
59
  zone_member.zoneable
@@ -111,9 +106,8 @@ module Spree
111
106
 
112
107
  def remove_previous_default
113
108
  return unless default_tax
114
-
115
109
  Zone.all.each do |zone|
116
- zone.update_attribute 'default_tax', false unless zone == self
110
+ zone.update_column 'default_tax', false unless zone == self
117
111
  end
118
112
  end
119
113
  end
@@ -1,6 +1,6 @@
1
1
  module Spree
2
2
  class ZoneMember < ActiveRecord::Base
3
- belongs_to :zone, :class_name => "Spree::Zone"
3
+ belongs_to :zone, :class_name => "Spree::Zone", :counter_cache => true
4
4
  belongs_to :zoneable, :polymorphic => true
5
5
 
6
6
  attr_accessible :zone, :zone_id, :zoneable, :zoneable_id, :zoneable_type
@@ -71,6 +71,13 @@
71
71
  </label>
72
72
  </p>
73
73
 
74
+ <p data-hook="s3_protocol">
75
+ <label>
76
+ <%= label_tag 'preferences[s3_protocol]', t(:s3_protocol) %>
77
+ <%= preference_field_tag 'preferences[s3_protocol]', Spree::Config[:s3_protocol], :type => :string %>
78
+ </label>
79
+ </p>
80
+
74
81
  <h2><%= t(:s3_headers) %></h2>
75
82
  <ul id="headers_list">
76
83
  <% @headers.each do |header_name, header_value| %>
@@ -12,6 +12,7 @@
12
12
  <th><%= t(:action) %></th>
13
13
  </tr>
14
14
 
15
+ <tbody>
15
16
  <% @product.images.each do |image| %>
16
17
  <tr id="<%= spree_dom_id image %>" data-hook="images_row">
17
18
  <td>
@@ -46,6 +47,7 @@
46
47
  </tr>
47
48
  <% end %>
48
49
  <% end %>
50
+ </tbody>
49
51
  </table>
50
52
 
51
53
  <div id="images" data-hook></div>
@@ -19,6 +19,7 @@
19
19
  <th><%= t(:presentation) %></th>
20
20
  <th></th>
21
21
  </tr>
22
+ <tbody>
22
23
  <% @option_types.each do |option_type| %>
23
24
  <tr class="spree_option_type" id="<%= spree_dom_id option_type %>" data-hook="option_row">
24
25
  <td><span class="handle"></span> <%= option_type.name %></td>
@@ -30,4 +31,5 @@
30
31
  </td>
31
32
  </tr>
32
33
  <% end %>
34
+ </tbody>
33
35
  </table>
@@ -2,7 +2,7 @@
2
2
  <%= csrf_meta_tags %>
3
3
 
4
4
  <% if @order.cart? %>
5
- <div id="add-line-item" data-hook>
5
+ <div id="customer-search" data-hook>
6
6
  <fieldset>
7
7
  <legend><%= t(:customer_search) %></legend>
8
8
  <%= label_tag :customer_search, t(:enter_at_least_five_letters) %>
@@ -7,16 +7,19 @@
7
7
  <%= javascript_include_tag 'admin/all' %>
8
8
 
9
9
  <%= javascript_tag do %>
10
- Spree.routes = <%== {
10
+ var Spree = {
11
+ routes: <%== {
11
12
  :product_search => spree.admin_products_path(:format => 'json'),
12
13
  :product_search_basic => spree.admin_products_path(:format => 'json', :json_format => 'basic', :limit => 10),
13
14
  :user_search => spree.admin_users_path(:format => 'json', :limit => 10)
14
- }.to_json %>;
15
+ }.to_json %>,
15
16
 
16
- strings = <%==
17
- [:no_results, :type_to_search, :searching].
18
- inject({}){|memo, item| {item => t(item) }}.to_json
19
- %>
17
+ strings: {
18
+ no_results: '<%== t(:no_results) %>',
19
+ type_to_search: '<%== t(:type_to_search) %>',
20
+ searching: '<%== t(:searching) %>'
21
+ }
22
+ }
20
23
  <% end %>
21
24
 
22
25
  <%= javascript_tag do -%>
@@ -13,6 +13,7 @@
13
13
  <th><%= t(:on_hand) %></th>
14
14
  <th><%= t(:action) %></th>
15
15
  </tr>
16
+ <tbody>
16
17
  <% @variants.each do |variant| %>
17
18
  <!-- you can skip variant with no options: that's just the default variant that all products have -->
18
19
  <% next if variant.option_values.empty? %>
@@ -34,6 +35,7 @@
34
35
  <% unless @product.has_variants? %>
35
36
  <tr><td colspan="9"><%= t(:none) %></td></tr>
36
37
  <% end %>
38
+ </tbody>
37
39
  </table>
38
40
 
39
41
  <% if @product.empty_option_values? %>
@@ -42,9 +42,6 @@
42
42
  <p class="field" id="bstate">
43
43
  <% have_states = !@order.bill_address.country.states.empty? %>
44
44
  <%= bill_form.label :state, t(:state) %><span class="required">*</span><br />
45
- <noscript>
46
- <%= bill_form.text_field :state_name, :class => 'required' %>
47
- </noscript>
48
45
  <% state_elements = [
49
46
  bill_form.collection_select(:state_id, @order.bill_address.country.states,
50
47
  :id, :name,
@@ -60,6 +57,9 @@
60
57
  document.write("<%== state_elements %>");
61
58
  <% end -%>
62
59
  </p>
60
+ <noscript>
61
+ <%= bill_form.text_field :state_name, :class => 'required' %>
62
+ </noscript>
63
63
  <% end %>
64
64
 
65
65
  <p class="field" id="bzipcode">
@@ -129,9 +129,6 @@
129
129
  <p class="field" id="sstate">
130
130
  <% have_states = !@order.ship_address.country.states.empty? %>
131
131
  <%= ship_form.label :state, t(:state) %><span class="required">*</span><br />
132
- <noscript>
133
- <%= ship_form.text_field :state_name, :class => 'required' %>
134
- </noscript>
135
132
  <% state_elements = [
136
133
  ship_form.collection_select(:state_id, @order.ship_address.country.states,
137
134
  :id, :name,
@@ -147,6 +144,9 @@
147
144
  document.write("<%== state_elements %>");
148
145
  <% end %>
149
146
  </p>
147
+ <noscript>
148
+ <%= ship_form.text_field :state_name, :class => 'required' %>
149
+ </noscript>
150
150
  <% end %>
151
151
 
152
152
  <p class="field" id="szipcode">
@@ -6,20 +6,20 @@
6
6
  <!--[if IE 9 ]> <html class="ie ie9" lang="en"> <![endif]-->
7
7
  <!--[if gt IE 9]><!--><html lang="en"><!--<![endif]-->
8
8
 
9
-
9
+
10
10
  <head data-hook="inside_head">
11
11
  <%= render :partial => 'spree/shared/head' %>
12
12
  </head>
13
13
 
14
14
  <body class="<%= body_class %>" id="<%= @body_id || 'default' %>" data-hook="body">
15
-
15
+
16
16
  <div class="container">
17
17
 
18
18
  <header id="header" class="row" data-hook>
19
-
19
+
20
20
  <figure id="logo" class="columns alpha six" data-hook>
21
21
  <%= logo %>
22
- </figure>
22
+ </figure>
23
23
 
24
24
  <nav id="top-nav-bar" class="columns omega ten">
25
25
  <ul id="nav-bar" class="inline" data-hook>
@@ -29,16 +29,16 @@
29
29
 
30
30
  <% if store_menu? %>
31
31
  <nav class="columns alpha omega sixteen">
32
- <ul id="main-nav-bar" class="inline" data-hook>
32
+ <ul id="main-nav-bar" class="inline" data-hook>
33
33
  <%= render :partial => 'spree/shared/store_menu' %>
34
34
  </ul>
35
35
  </nav>
36
36
  <% end %>
37
-
37
+
38
38
  </header>
39
39
 
40
40
  <div id="wrapper" class="row" data-hook>
41
-
41
+
42
42
  <% if content_for?(:sidebar) %>
43
43
  <aside id="sidebar" class="columns alpha four" data-hook>
44
44
  <%= yield :sidebar %>
@@ -14,7 +14,7 @@
14
14
  <%= variant.in_stock? ? t(:insufficient_stock, :on_hand => variant.on_hand) : t(:out_of_stock) %><br />
15
15
  </span>
16
16
  <% end %>
17
- <%= truncate(variant.product.description.gsub(/<(.*?)>/,""), :length => 100, :omission => "...") %>
17
+ <%= line_item_description(variant) %>
18
18
  </td>
19
19
  <td class="cart-item-price" data-hook="cart_item_price">
20
20
  <%= number_to_currency line_item.price %>
@@ -1,38 +1,38 @@
1
1
  <% if tracker = Spree::Tracker.current %>
2
2
 
3
- <%= javascript_tag do -%>
3
+ <%= javascript_tag do %>
4
4
  var _gaq = _gaq || [];
5
- _gaq.push(['_setAccount', '<%= tracker.analytics_id -%>']);
5
+ _gaq.push(['_setAccount', '<%= tracker.analytics_id %>']);
6
6
  _gaq.push(['_trackPageview']);
7
7
 
8
+ <% if flash[:commerce_tracking] %>
9
+ <%# report e-commerce transaction information when applicable %>
10
+ _gaq.push(['_addTrans',
11
+ "<%= @order.number %>", <%# Order Number %>
12
+ "", <%# Affiliation %>
13
+ "<%= @order.total %>", <%# Order total %>
14
+ "<%= @order.adjustments.tax.sum(:amount) %>", <%# Tax Amount %>
15
+ "<%= @order.adjustments.shipping.sum(:amount) %>",<%# Ship Amount %>
16
+ "", <%# City %>
17
+ "", <%# State %>
18
+ "" <%# Country %>
19
+ ]);
20
+ <% @order.line_items.each do |line_item| %>
21
+ _gaq.push(['_addItem',
22
+ "<%= @order.number %>", <%# order ID - required %>
23
+ "<%= line_item.variant.sku %>", <%# SKU/code - required %>
24
+ "<%= line_item.variant.product.name %>",<%# product name %>
25
+ "", <%# category or variation, Product Category %>
26
+ "<%= line_item.price %>", <%# unit price - required %>
27
+ "<%= line_item.quantity %>" <%# quantity - required %>
28
+ ]);
29
+ <% end %>
30
+ <% end %>
31
+
8
32
  (function() {
9
33
  var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
10
34
  ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
11
35
  var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
12
36
  })();
13
- <% end -%>
14
-
15
- <% if flash[:commerce_tracking] %>
16
-
17
- <%= javascript_tag do -%>
18
- // report e-commerce transaction information when applicable
19
- pageTracker._addTrans(
20
- "<%= @order.number %>", //Order Number
21
- "", //Affiliation
22
- "<%= @order.total %>", //Order total
23
- "<%= @order.adjustments.tax.sum(:amount).to_s %>", //Tax Amount
24
- "<%= @order.adjustments.shipping.sum(:amount).to_s %>", //Ship Amount
25
- "", //City
26
- "", //State
27
- "" //Country
28
- );
29
- <% @order.line_items.each do |line_item| %>
30
- pageTracker._addItem("<%= @order.number %>", "<%= line_item.variant.sku %>", "<%= line_item.variant.product.name %>",
31
- "" /*Product Category*/, "<%= line_item.price %>", "<%= line_item.quantity %>");
32
- <% end %>
33
- pageTracker._trackTrans();
34
- <% end -%>
35
-
36
37
  <% end %>
37
-
38
- <% end %>
38
+ <% end %>
@@ -7,11 +7,11 @@
7
7
  </div>
8
8
  <% end %>
9
9
 
10
- <% if @taxon.children.empty? || !params[:keywords].blank? %>
11
- <div data-hook="taxon_products">
12
- <%= render :partial => 'spree/shared/products', :locals => { :products => @products, :taxon => @taxon } %>
13
- </div>
14
- <% else %>
10
+ <div data-hook="taxon_products">
11
+ <%= render :partial => 'spree/shared/products', :locals => { :products => @products, :taxon => @taxon } %>
12
+ </div>
13
+
14
+ <% unless params[:keyword].present? %>
15
15
  <div data-hook="taxon_children">
16
16
  <%= render :partial => 'taxon', :collection => @taxon.children %>
17
17
  </div>
@@ -858,6 +858,7 @@ en:
858
858
  s3_bucket: "Bucket"
859
859
  s3_headers: "S3 Headers"
860
860
  s3_secret: "Secret Key"
861
+ s3_protocol: "S3 Protocol"
861
862
  s3_used_for_product_images: "S3 is being used for product images"
862
863
  s3_not_used_for_product_images: "S3 is not being used for product images"
863
864
  sales_tax: "Sales Tax"
data/config/routes.rb CHANGED
@@ -40,13 +40,8 @@ Spree::Core::Engine.routes.draw do
40
40
  end
41
41
  end
42
42
 
43
- # # route globbing for pretty nested taxon and product paths
43
+ # route globbing for pretty nested taxon and product paths
44
44
  match '/t/*id', :to => 'taxons#show', :as => :nested_taxons
45
- #
46
- # #moved old taxons route to after nested_taxons so nested_taxons will be default route
47
- # #this route maybe removed in the near future (no longer used by core)
48
- # map.resources :taxons
49
- #
50
45
 
51
46
  namespace :admin do
52
47
  resources :adjustments
@@ -195,6 +190,6 @@ Spree::Core::Engine.routes.draw do
195
190
 
196
191
  match '/admin', :to => 'admin/orders#index', :as => :admin
197
192
 
198
- match '/content/cvv', :to => 'content#cvv'
193
+ match '/content/cvv', :to => 'content#cvv', :as => :cvv
199
194
  match '/content/*path', :to => 'content#show', :via => :get, :as => :content
200
195
  end
@@ -16,7 +16,7 @@ class AddCountOnHandToVariantsAndProducts < ActiveRecord::Migration
16
16
 
17
17
  say_with_time 'Transfering inventory units with status on_hand to variants table...' do
18
18
  Spree::Variant.all.each do |v|
19
- v.update_attribute(:count_on_hand, v.inventory_units.with_state('on_hand').size)
19
+ v.update_column(:count_on_hand, v.inventory_units.with_state('on_hand').size)
20
20
  Spree::InventoryUnit.destroy_all(:variant_id => v.id, :state => 'on_hand')
21
21
  end
22
22
  end
@@ -26,7 +26,7 @@ class AddCountOnHandToVariantsAndProducts < ActiveRecord::Migration
26
26
  product_count_on_hand = p.has_variants? ?
27
27
  p.variants.inject(0) { |acc, v| acc + v.count_on_hand } :
28
28
  (p.master ? p.master.count_on_hand : 0)
29
- p.update_attribute(:count_on_hand, product_count_on_hand)
29
+ p.update_column(:count_on_hand, product_count_on_hand)
30
30
  end
31
31
  end
32
32
 
@@ -15,7 +15,7 @@ class AddOpenidFieldToUsers < ActiveRecord::Migration
15
15
  Spree::User.table_name = 'users'
16
16
 
17
17
  [:login, :crypted_password, :salt].each do |field|
18
- Spree::User.where(field => nil).each { |user| user.update_attribute(field, '') if user.send(field).nil? }
18
+ Spree::User.where(field => nil).each { |user| user.update_column(field, '') if user.send(field).nil? }
19
19
  change_column :users, field, :string, :default => '', :null => false
20
20
  end
21
21
 
@@ -12,7 +12,7 @@ class ChargeRefactoring < ActiveRecord::Migration
12
12
 
13
13
  add_column :orders, :completed_at, :timestamp
14
14
  Order.reset_column_information
15
- Order.all.each { |o| o.update_attribute(:completed_at, o.checkout && o.checkout.read_attribute(:completed_at)) }
15
+ Order.all.each { |o| o.update_column(:completed_at, o.checkout && o.checkout.read_attribute(:completed_at)) }
16
16
  remove_column :checkouts, :completed_at
17
17
 
18
18
  change_column :adjustments, :amount, :decimal, :null => true, :default => nil, :precision => 8, :scale => 2
@@ -27,7 +27,7 @@ class ChargeRefactoring < ActiveRecord::Migration
27
27
  def down
28
28
  add_column :checkouts, :completed_at, :timestamp
29
29
  Spree::Checkout.reset_column_information
30
- Spree::Checkout.all.each { |c| c.update_attribute(:completed_at, c.order && c.order.completed_at) }
30
+ Spree::Checkout.all.each { |c| c.update_column(:completed_at, c.order && c.order.completed_at) }
31
31
  remove_column :orders, :completed_at
32
32
 
33
33
  add_column :adjustments, :secondary_type, :string
@@ -12,7 +12,7 @@ class ShipmentIdForInventoryUnits < ActiveRecord::Migration
12
12
  next
13
13
  end
14
14
  shipment.order.inventory_units.each do |unit|
15
- unit.update_attribute('shipment_id', shipment.id)
15
+ unit.update_column('shipment_id', shipment.id)
16
16
  end
17
17
  end
18
18
 
@@ -0,0 +1,14 @@
1
+ class AddCounterCacheToZoneMembers < ActiveRecord::Migration
2
+ def up
3
+ add_column :spree_zones, :zone_members_count, :integer, :default => 0
4
+
5
+ Spree::Zone.reset_column_information
6
+ Spree::Zone.find(:all).each do |zone|
7
+ Spree::Zone.update_counters zone.id, :zone_members_count => zone.zone_members.length
8
+ end
9
+ end
10
+
11
+ def down
12
+ remove_column :spree_zones, :zone_members_count
13
+ end
14
+ end
@@ -5,7 +5,6 @@ module Spree
5
5
  receiver.send :layout, :get_layout
6
6
  receiver.send :before_filter, 'instantiate_controller_and_action_names'
7
7
  receiver.send :before_filter, 'set_user_language'
8
-
9
8
  receiver.send :helper_method, 'title'
10
9
  receiver.send :helper_method, 'title='
11
10
  receiver.send :helper_method, 'accurate_title'
@@ -78,10 +77,6 @@ module Spree
78
77
  @current_controller = controller_name
79
78
  end
80
79
 
81
- def get_taxonomies
82
- @taxonomies ||= Taxonomy.includes(:root => :children).joins(:root)
83
- end
84
-
85
80
  def associate_user
86
81
  return unless current_user and current_order
87
82
  current_order.associate_user!(current_user)
@@ -16,7 +16,7 @@ module Spree
16
16
  end
17
17
 
18
18
  if mail_method.preferred_mail_bcc.present?
19
- message.bcc = mail_method.preferred_mail_bcc
19
+ message.bcc ||= mail_method.preferred_mail_bcc
20
20
  end
21
21
  end
22
22
 
@@ -47,8 +47,8 @@ module Spree
47
47
  permalink_value = self.to_param
48
48
  field = self.class.permalink_field
49
49
  # Do other links exist with this permalink?
50
- other = self.class.all(:conditions => "#{field} LIKE '#{permalink_value}%'")
51
- unless other.empty?
50
+ other = self.class.where("#{field} LIKE ?", "#{permalink_value}%")
51
+ if other.any?
52
52
  # Find the existing permalink with the highest number, and increment that number.
53
53
  # (If none of the existing permalinks have a number, this will evaluate to 1.)
54
54
  number = other.map { |o| o.send(field)[/-(\d+)$/, 1].to_i }.max + 1
@@ -1,8 +1,6 @@
1
1
  FactoryGirl.define do
2
- sequence(:product_sequence) { |n| "Product ##{n} - #{rand(9999)}" }
3
-
4
2
  factory :simple_product, :class => Spree::Product do
5
- name { FactoryGirl.generate :product_sequence }
3
+ sequence(:name) { |n| "Product ##{n} - #{rand(9999)}" }
6
4
  description { Faker::Lorem.paragraphs(1 + Kernel.rand(5)).join("\n") }
7
5
  price 19.99
8
6
  cost_price 17.00
@@ -1,5 +1,5 @@
1
1
  module Spree
2
2
  def self.version
3
- "1.1.2"
3
+ "1.1.3"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
4
+ version: 1.1.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-05 00:00:00.000000000 Z
12
+ date: 2012-07-27 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: acts_as_list
16
- requirement: &70163167995040 !ruby/object:Gem::Requirement
16
+ requirement: &70251996737660 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - =
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.1.4
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70163167995040
24
+ version_requirements: *70251996737660
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: nested_set
27
- requirement: &70163167992340 !ruby/object:Gem::Requirement
27
+ requirement: &70251996735520 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - =
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.7.0
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70163167992340
35
+ version_requirements: *70251996735520
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: jquery-rails
38
- requirement: &70163167989400 !ruby/object:Gem::Requirement
38
+ requirement: &70251996380040 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 2.0.0
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70163167989400
46
+ version_requirements: *70251996380040
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: highline
49
- requirement: &70163168002860 !ruby/object:Gem::Requirement
49
+ requirement: &70251996377420 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - =
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 1.6.11
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70163168002860
57
+ version_requirements: *70251996377420
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: state_machine
60
- requirement: &70163167999340 !ruby/object:Gem::Requirement
60
+ requirement: &70251996375460 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - =
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 1.1.2
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *70163167999340
68
+ version_requirements: *70251996375460
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: ffaker
71
- requirement: &70163167996220 !ruby/object:Gem::Requirement
71
+ requirement: &70251996373560 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 1.12.0
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *70163167996220
79
+ version_requirements: *70251996373560
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: paperclip
82
- requirement: &70163168010080 !ruby/object:Gem::Requirement
82
+ requirement: &70251996372140 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ~>
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '2.7'
88
88
  type: :runtime
89
89
  prerelease: false
90
- version_requirements: *70163168010080
90
+ version_requirements: *70251996372140
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: aws-sdk
93
- requirement: &70163168007600 !ruby/object:Gem::Requirement
93
+ requirement: &70251996370680 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ~>
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: 1.3.4
99
99
  type: :runtime
100
100
  prerelease: false
101
- version_requirements: *70163168007600
101
+ version_requirements: *70251996370680
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: ransack
104
- requirement: &70163168005980 !ruby/object:Gem::Requirement
104
+ requirement: &70251996369560 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ~>
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: 0.6.0
110
110
  type: :runtime
111
111
  prerelease: false
112
- version_requirements: *70163168005980
112
+ version_requirements: *70251996369560
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: activemerchant
115
- requirement: &70163168019780 !ruby/object:Gem::Requirement
115
+ requirement: &70251996368240 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - =
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: 1.20.4
121
121
  type: :runtime
122
122
  prerelease: false
123
- version_requirements: *70163168019780
123
+ version_requirements: *70251996368240
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: rails
126
- requirement: &70163168017400 !ruby/object:Gem::Requirement
126
+ requirement: &70251996367220 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ~>
@@ -131,10 +131,10 @@ dependencies:
131
131
  version: 3.2.6
132
132
  type: :runtime
133
133
  prerelease: false
134
- version_requirements: *70163168017400
134
+ version_requirements: *70251996367220
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: kaminari
137
- requirement: &70163168015260 !ruby/object:Gem::Requirement
137
+ requirement: &70251996365100 !ruby/object:Gem::Requirement
138
138
  none: false
139
139
  requirements:
140
140
  - - ! '>='
@@ -142,10 +142,10 @@ dependencies:
142
142
  version: 0.13.0
143
143
  type: :runtime
144
144
  prerelease: false
145
- version_requirements: *70163168015260
145
+ version_requirements: *70251996365100
146
146
  - !ruby/object:Gem::Dependency
147
147
  name: deface
148
- requirement: &70163168013540 !ruby/object:Gem::Requirement
148
+ requirement: &70251996351260 !ruby/object:Gem::Requirement
149
149
  none: false
150
150
  requirements:
151
151
  - - ! '>='
@@ -153,10 +153,10 @@ dependencies:
153
153
  version: 0.9.0
154
154
  type: :runtime
155
155
  prerelease: false
156
- version_requirements: *70163168013540
156
+ version_requirements: *70251996351260
157
157
  - !ruby/object:Gem::Dependency
158
158
  name: stringex
159
- requirement: &70163168012340 !ruby/object:Gem::Requirement
159
+ requirement: &70251996338660 !ruby/object:Gem::Requirement
160
160
  none: false
161
161
  requirements:
162
162
  - - ~>
@@ -164,7 +164,7 @@ dependencies:
164
164
  version: 1.3.2
165
165
  type: :runtime
166
166
  prerelease: false
167
- version_requirements: *70163168012340
167
+ version_requirements: *70251996338660
168
168
  description: Required dependency for Spree
169
169
  email: sean@spreecommerce.com
170
170
  executables: []
@@ -872,6 +872,7 @@ files:
872
872
  - db/migrate/20120523061241_convert_sales_tax_to_default_tax.rb
873
873
  - db/migrate/20120604030249_add_deleted_at_to_spree_shipping_methods.rb
874
874
  - db/migrate/20120605211305_make_users_email_index_unique.rb
875
+ - db/migrate/20120712172620_add_counter_cache_to_zone_members.rb
875
876
  - db/sample/users.rb
876
877
  - db/seeds.rb
877
878
  - vendor/assets/images/datepicker/cal.gif
@@ -972,7 +973,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
972
973
  version: '0'
973
974
  segments:
974
975
  - 0
975
- hash: 3949392994446669213
976
+ hash: 173937272433649960
976
977
  requirements:
977
978
  - none
978
979
  rubyforge_project: spree_core