spree_core 1.1.0.rc2 → 1.1.0

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.
@@ -1,3 +1,4 @@
1
+ <%# encoding: utf-8 %>
1
2
  //= require_self
2
3
 
3
4
  /**
@@ -206,7 +207,12 @@ $(".observe_field").live('change', function() {
206
207
 
207
208
  handle_date_picker_fields = function(){
208
209
  $('.datepicker').datepicker({
209
- dateFormat: 'yy/mm/dd',
210
+ dateFormat: "<%= ::I18n.t(:format, :scope => 'spree.date_picker', :default => 'yy/mm/dd') %>",
211
+ dayNames: ["<%= ::I18n.t(:day_names, :scope => :date).join('","') %>"],
212
+ dayNamesMin: ["<%= ::I18n.t(:abbr_day_names, :scope => :date).join('","') %>"],
213
+ monthNames: ["<%= ::I18n.t(:month_names, :scope => :date).join('","') %>"],
214
+ prevText: '<%= ::I18n.t(:previous) %>',
215
+ nextText: '<%= ::I18n.t(:next) %>',
210
216
  showOn: "button",
211
217
  buttonImage: "<%= asset_path 'datepicker/cal.gif' %>",
212
218
  buttonImageOnly: true
@@ -1,3 +1,5 @@
1
+ //= require jquery
2
+ //= require jquery_ujs
1
3
  //= require jquery-ui
2
4
  //= require jquery.cookie
3
5
  //= require jquery.tokeninput
@@ -52,6 +52,9 @@ module Spree
52
52
 
53
53
  def fire
54
54
  return unless event = params[:e] and @payment.payment_source
55
+
56
+ # Because we have a transition method also called void, we do this to avoid conflicts.
57
+ event = "void_transaction" if event == "void"
55
58
  if @payment.send("#{event}!")
56
59
  flash.notice = t(:payment_updated)
57
60
  else
@@ -41,7 +41,7 @@ module Spree
41
41
 
42
42
  params[:products].each do |product_id,variant_id|
43
43
  quantity = params[:quantity].to_i if !params[:quantity].is_a?(Hash)
44
- quantity = params[:quantity][variant_id.to_i].to_i if params[:quantity].is_a?(Hash)
44
+ quantity = params[:quantity][variant_id].to_i if params[:quantity].is_a?(Hash)
45
45
  @order.add_variant(Variant.find(variant_id), quantity) if quantity > 0
46
46
  end if params[:products]
47
47
 
@@ -106,7 +106,7 @@ module Spree
106
106
 
107
107
  def flash_messages
108
108
  flash.each do |msg_type, text|
109
- concat(content_tag :div, text, :class => "flash #{msg_type}")
109
+ concat(content_tag :div, text, :class => "flash #{msg_type}") unless msg_type == :commerce_tracking
110
110
  end
111
111
  nil
112
112
  end
@@ -142,7 +142,7 @@ module Spree
142
142
  def available_countries
143
143
  countries = Zone.find_by_name(Spree::Config[:checkout_zone]).try(:country_list) || Country.all
144
144
  countries.collect do |c|
145
- c.name = I18n.t(c.name, :scope => 'countries', :default => c.name)
145
+ c.name = I18n.t(c.iso, :scope => 'countries', :default => c.name)
146
146
  c
147
147
  end.sort{ |a,b| a.name <=> b.name }
148
148
  end
@@ -4,7 +4,7 @@ module Spree
4
4
  preference :additional_item, :decimal, :default => 0.0
5
5
  preference :max_items, :integer, :default => 0
6
6
 
7
- attr_accessible :preferred_first_item, :preferred_additional_tiem, :preferred_max_items
7
+ attr_accessible :preferred_first_item, :preferred_additional_item, :preferred_max_items
8
8
 
9
9
  def self.description
10
10
  I18n.t(:flexible_rate)
@@ -71,7 +71,7 @@ module Spree
71
71
 
72
72
  # Indicates whether its possible to capture the payment
73
73
  def can_capture?(payment)
74
- payment.state == 'pending'
74
+ payment.state == 'pending' || payment.state == 'checkout'
75
75
  end
76
76
 
77
77
  # Indicates whether its possible to void the payment.
@@ -9,6 +9,8 @@ module Spree
9
9
 
10
10
  attr_accessible :preferred_server, :preferred_test_mode
11
11
 
12
+ attr_accessible :preferred_server, :preferred_test_mode
13
+
12
14
  def payment_source_class
13
15
  Creditcard
14
16
  end
@@ -67,6 +67,10 @@ module Spree
67
67
  true
68
68
  end
69
69
 
70
+ def actions
71
+ %w(capture void credit)
72
+ end
73
+
70
74
  private
71
75
  def generate_profile_id(success)
72
76
  record = true
@@ -3,7 +3,7 @@ module Spree
3
3
  validates_attachment_presence :attachment
4
4
  validate :no_attachment_errors
5
5
 
6
- attr_accessible :attachment, :alt, :viewable_id
6
+ attr_accessible :alt, :attachment, :position, :viewable_id
7
7
 
8
8
  has_attached_file :attachment,
9
9
  :styles => { :mini => '48x48>', :small => '100x100>', :product => '240x240>', :large => '600x600>' },
@@ -14,8 +14,6 @@ module Spree
14
14
  # we need to look at the write-queue for images which have not been saved yet
15
15
  after_post_process :find_dimensions
16
16
 
17
- attr_accessible :attachment, :position
18
-
19
17
  # Load user defined paperclip settings
20
18
  if Spree::Config[:use_s3]
21
19
  s3_creds = { :access_key_id => Spree::Config[:s3_access_key], :secret_access_key => Spree::Config[:s3_secret], :bucket => Spree::Config[:s3_bucket] }
@@ -36,14 +36,14 @@ module Spree
36
36
  end
37
37
  # With card payments this represents authorizing the payment
38
38
  event :pend do
39
- transition :from => 'processing', :to => 'pending'
39
+ transition :from => ['checkout', 'processing'], :to => 'pending'
40
40
  end
41
41
  # With card payments this represents completing a purchase or capture transaction
42
42
  event :complete do
43
- transition :from => ['processing', 'pending'], :to => 'completed'
43
+ transition :from => ['processing', 'pending', 'checkout'], :to => 'completed'
44
44
  end
45
45
  event :void do
46
- transition :from => ['pending', 'completed'], :to => 'void'
46
+ transition :from => ['pending', 'completed', 'checkout'], :to => 'void'
47
47
  end
48
48
  end
49
49
 
@@ -28,7 +28,6 @@ module Spree
28
28
  end
29
29
 
30
30
  def capture!
31
- return unless pending?
32
31
  protect_from_connection_error do
33
32
  check_environment
34
33
 
@@ -117,7 +116,7 @@ module Spree
117
116
  if response.success?
118
117
  self.response_code = response.authorization
119
118
  self.avs_response = response.avs_result['code']
120
- self.send(success_state)
119
+ self.send("#{success_state}!")
121
120
  else
122
121
  self.send("#{failure_state}!")
123
122
  gateway_error(response)
@@ -59,7 +59,7 @@ module Spree
59
59
  accepts_nested_attributes_for :variants, :allow_destroy => true
60
60
 
61
61
  def variant_images
62
- Image.find_by_sql("SELECT #{Asset.quoted_table_name}.* FROM #{Asset.quoted_table_name} LEFT JOIN #{Variant.quoted_table_name} ON (#{Variant.quoted_table_name}.id = #{Asset.quoted_table_name}.viewable_id) WHERE (#{Variant.quoted_table_name}.product_id = #{self.id})")
62
+ Image.find_by_sql("SELECT #{Asset.quoted_table_name}.* FROM #{Asset.quoted_table_name} LEFT JOIN #{Variant.quoted_table_name} ON (#{Variant.quoted_table_name}.id = #{Asset.quoted_table_name}.viewable_id) WHERE (#{Variant.quoted_table_name}.product_id = #{self.id}) ORDER BY #{Asset.quoted_table_name}.position")
63
63
  end
64
64
 
65
65
  alias_method :images, :variant_images
@@ -159,7 +159,7 @@ module Spree
159
159
 
160
160
  # don't dup the actual variants, just the characterising types
161
161
  p.option_types = option_types if has_variants?
162
-
162
+
163
163
  # allow site to do some customization
164
164
  p.send(:duplicate_extra, self) if p.respond_to?(:duplicate_extra)
165
165
  p.save!
@@ -199,6 +199,22 @@ module Spree
199
199
  end
200
200
  end
201
201
 
202
+ def property(property_name)
203
+ return nil unless prop = properties.find_by_name(property_name)
204
+ product_properties.find_by_property_id(prop.id).try(:value)
205
+ end
206
+
207
+ def set_property(property_name, property_value)
208
+ prop = Spree::Property.find_or_initialize_by_name(property_name) do |p|
209
+ p.presentation = property_name
210
+ p.save!
211
+ end
212
+
213
+ prod_prop = Spree::ProductProperty.find_or_initialize_by_product_id_and_property_id(self.id, prop.id)
214
+ prod_prop.value = property_value
215
+ prod_prop.save!
216
+ end
217
+
202
218
  private
203
219
 
204
220
  # Builds variants from a hash of option types & values
@@ -3,5 +3,7 @@ module Spree
3
3
  validates :name, :presence => true
4
4
  has_many :products
5
5
  has_many :shipping_methods
6
+
7
+ attr_accessible :name
6
8
  end
7
9
  end
@@ -7,6 +7,8 @@ module Spree
7
7
 
8
8
  validates :country, :name, :presence => true
9
9
 
10
+ attr_accessible :name, :abbr
11
+
10
12
  def self.find_all_by_name_or_abbr(name_or_abbr)
11
13
  where('name = ? OR abbr = ?', name_or_abbr, name_or_abbr)
12
14
  end
@@ -6,7 +6,7 @@ module Spree
6
6
  has_and_belongs_to_many :products, :join_table => 'spree_products_taxons'
7
7
  before_create :set_permalink
8
8
 
9
- attr_accessible :name, :parent_id, :position, :description, :permalink
9
+ attr_accessible :name, :parent_id, :position, :icon, :description, :permalink
10
10
 
11
11
  validates :name, :presence => true
12
12
  has_attached_file :icon,
@@ -23,7 +23,7 @@
23
23
  <% @collection.each do |product| %>
24
24
  <tr <%= "style='color: red;'" if product.deleted? %> id="<%= spree_dom_id product %>" data-hook="admin_products_index_rows">
25
25
  <td><%= product.sku rescue '' %></td>
26
- <td><%= product.name rescue '' %></td>
26
+ <td><%= link_to product.try(:name), edit_admin_product_path(product) %></td>
27
27
  <td><%= number_to_currency product.price rescue '' %></td>
28
28
  <td class="actions" data-hook="admin_products_index_row_actions">
29
29
  <%= link_to_edit product, :class => 'edit' unless product.deleted? %>
@@ -1,3 +1,5 @@
1
+ <%= render :partial => 'spree/admin/shared/configuration_menu' %>
2
+
1
3
  <div class="toolbar" data-hook="toolbar">
2
4
  <ul class="actions">
3
5
  <li>
@@ -1,3 +1,13 @@
1
+ <div id="new_state" data-hook></div>
2
+ <div class="toolbar" data-hook="toolbar">
3
+ <ul class="actions">
4
+ <li id="new_state_link">
5
+ <%= button_link_to t(:new_state), new_admin_country_state_url(@country), {:remote => true, :icon => 'add', :id => 'new_state_link'} %>
6
+ </li>
7
+ </ul>
8
+ <br class="clear" />
9
+ </div>
10
+
1
11
  <table class="index" id='listing_states' data-hook>
2
12
  <thead>
3
13
  <tr data-hook="states_header">
@@ -7,10 +17,7 @@
7
17
  </tr>
8
18
  </thead>
9
19
  <tbody>
10
- <% @states.each do |state|
11
- @edit_url = admin_country_state_path(@country, state)
12
- @delete_url = admin_country_state_path(@country, state)
13
- %>
20
+ <% @states.each do |state| %>
14
21
  <tr id="<%= spree_dom_id state %>" data-hook="states_row">
15
22
  <td><%= state.name %></td>
16
23
  <td><%= state.abbr %></td>
@@ -26,7 +33,3 @@
26
33
  <% end %>
27
34
  </tbody>
28
35
  </table>
29
- <div id="new_state" data-hook></div>
30
- <p data-hook="buttons">
31
- <%= button_link_to t(:new_state), new_admin_country_state_url(@country), {:remote => true, :icon => 'add', :id => 'new_state_link'} %>
32
- </p>
@@ -2,6 +2,7 @@
2
2
 
3
3
  <%= render :partial => 'spree/shared/error_messages', :locals => { :target => @state } %>
4
4
 
5
+ <h3><%= t(:new_state) %></h3>
5
6
  <%= form_for [:admin, @country, @state] do |f| %>
6
7
  <%= render :partial => 'form', :locals => { :f => f } %>
7
8
  <%= render :partial => 'spree/admin/shared/new_resource_links' %>
@@ -10,6 +10,7 @@
10
10
 
11
11
  <% if products.any? %>
12
12
  <ul id="products" class="inline product-listing" data-hook>
13
+ <% reset_cycle('default') %>
13
14
  <% products.each do |product| %>
14
15
  <% if Spree::Config[:show_zero_stock_products] || product.has_stock? %>
15
16
  <li id="product_<%= product.id %>" class="columns three <%= cycle("alpha", "secondary", "", "omega secondary") %>" data-hook="products_list_item" itemscope itemtype="http://schema.org/Product">
@@ -16,6 +16,7 @@ en:
16
16
  new: New
17
17
  update: Update
18
18
  active: "Active"
19
+ activate: "Activate"
19
20
  activerecord:
20
21
  attributes:
21
22
  spree/address:
@@ -942,6 +943,8 @@ en:
942
943
  special_instructions: "Special Instructions"
943
944
  spree:
944
945
  date: Date
946
+ date_picker:
947
+ format: 'yy/mm/dd'
945
948
  time: Time
946
949
  spree_gateway_error_flash_for_checkout: "There was a problem with your payment information. Please check your information and try again."
947
950
  spree_inventory_error_flash_for_insufficient_quantity: "An item in your cart has become unavailable."
@@ -4,8 +4,6 @@
4
4
  // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
5
5
  // the compiled file.
6
6
  //
7
- //= require jquery
8
- //= require jquery_ujs
9
7
  <% if options[:lib_name] == 'spree' %>
10
8
  //= require admin/spree_core
11
9
  //= require admin/spree_auth
@@ -1,5 +1,5 @@
1
1
  module Spree
2
2
  def self.version
3
- "1.1.0.rc2"
3
+ "1.1.0"
4
4
  end
5
5
  end
@@ -129,21 +129,19 @@ module Spree
129
129
  # The brand-finding code can be simplified if a few more named scopes were added to
130
130
  # the product properties model.
131
131
  if Spree::Property.table_exists? && @@brand_property
132
- Spree::Product.scope :selective_brand_any, lambda {|opts| Spree::Product.brand_any(opts) }
132
+ Spree::Product.scope :selective_brand_any, lambda {|*opts| Spree::Product.brand_any(*opts) }
133
133
 
134
134
  def ProductFilters.selective_brand_filter(taxon = nil)
135
135
  if taxon.nil?
136
136
  taxon = Spree::Taxonomy.first.root
137
137
  end
138
- all_brands = Spree::ProductProperty.where(:property_id => @@brand_property).map(&:value).uniq
139
138
  scope = Spree::ProductProperty.scoped(:conditions => ["property_id = ?", @@brand_property]).
140
139
  scoped(:joins => {:product => :taxons},
141
140
  :conditions => ["#{Spree::Taxon.table_name}.id in (?)", [taxon] + taxon.descendants])
142
- brands = scope.map {|p| p.value}
141
+ brands = scope.map {|p| p.value}.uniq
143
142
 
144
143
  { :name => "Applicable Brands",
145
144
  :scope => :selective_brand_any,
146
- :conds => Hash[*all_brands.map {|m| [m, "p_colour.value like '%#{m}%'"]}.flatten],
147
145
  :labels => brands.sort.map {|k| [k,k]}
148
146
  }
149
147
  end
metadata CHANGED
@@ -1,19 +1,19 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0.rc2
5
- prerelease: 6
4
+ version: 1.1.0
5
+ prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Sean Schofield
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-20 00:00:00.000000000 Z
12
+ date: 2012-04-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: acts_as_list
16
- requirement: &70210733556780 !ruby/object:Gem::Requirement
16
+ requirement: &70132425348640 !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: *70210733556780
24
+ version_requirements: *70132425348640
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: nested_set
27
- requirement: &70210733555720 !ruby/object:Gem::Requirement
27
+ requirement: &70132425347980 !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: *70210733555720
35
+ version_requirements: *70132425347980
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: jquery-rails
38
- requirement: &70210733554680 !ruby/object:Gem::Requirement
38
+ requirement: &70132425347340 !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: *70210733554680
46
+ version_requirements: *70132425347340
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: highline
49
- requirement: &70210733553740 !ruby/object:Gem::Requirement
49
+ requirement: &70132425346420 !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: *70210733553740
57
+ version_requirements: *70132425346420
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: state_machine
60
- requirement: &70210733569000 !ruby/object:Gem::Requirement
60
+ requirement: &70132425345560 !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: *70210733569000
68
+ version_requirements: *70132425345560
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: ffaker
71
- requirement: &70210733568120 !ruby/object:Gem::Requirement
71
+ requirement: &70132425360140 !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: *70210733568120
79
+ version_requirements: *70132425360140
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: paperclip
82
- requirement: &70210733567180 !ruby/object:Gem::Requirement
82
+ requirement: &70132425357460 !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: *70210733567180
90
+ version_requirements: *70132425357460
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: aws-sdk
93
- requirement: &70210733565980 !ruby/object:Gem::Requirement
93
+ requirement: &70132425354260 !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: *70210733565980
101
+ version_requirements: *70132425354260
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: ransack
104
- requirement: &70210733564060 !ruby/object:Gem::Requirement
104
+ requirement: &70132425384220 !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: *70210733564060
112
+ version_requirements: *70132425384220
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: activemerchant
115
- requirement: &70210733562620 !ruby/object:Gem::Requirement
115
+ requirement: &70132425382540 !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: *70210733562620
123
+ version_requirements: *70132425382540
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: rails
126
- requirement: &70210733576920 !ruby/object:Gem::Requirement
126
+ requirement: &70132425381100 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ! '>='
@@ -134,10 +134,10 @@ dependencies:
134
134
  version: 3.2.3
135
135
  type: :runtime
136
136
  prerelease: false
137
- version_requirements: *70210733576920
137
+ version_requirements: *70132425381100
138
138
  - !ruby/object:Gem::Dependency
139
139
  name: kaminari
140
- requirement: &70210733575300 !ruby/object:Gem::Requirement
140
+ requirement: &70132425392620 !ruby/object:Gem::Requirement
141
141
  none: false
142
142
  requirements:
143
143
  - - ! '>='
@@ -145,10 +145,10 @@ dependencies:
145
145
  version: 0.13.0
146
146
  type: :runtime
147
147
  prerelease: false
148
- version_requirements: *70210733575300
148
+ version_requirements: *70132425392620
149
149
  - !ruby/object:Gem::Dependency
150
150
  name: deface
151
- requirement: &70210733573900 !ruby/object:Gem::Requirement
151
+ requirement: &70132425387500 !ruby/object:Gem::Requirement
152
152
  none: false
153
153
  requirements:
154
154
  - - ! '>='
@@ -156,10 +156,10 @@ dependencies:
156
156
  version: 0.8.0
157
157
  type: :runtime
158
158
  prerelease: false
159
- version_requirements: *70210733573900
159
+ version_requirements: *70132425387500
160
160
  - !ruby/object:Gem::Dependency
161
161
  name: stringex
162
- requirement: &70210733572420 !ruby/object:Gem::Requirement
162
+ requirement: &70132425385100 !ruby/object:Gem::Requirement
163
163
  none: false
164
164
  requirements:
165
165
  - - ~>
@@ -167,7 +167,7 @@ dependencies:
167
167
  version: 1.3.2
168
168
  type: :runtime
169
169
  prerelease: false
170
- version_requirements: *70210733572420
170
+ version_requirements: *70132425385100
171
171
  description: Required dependency for Spree
172
172
  email: sean@spreecommerce.com
173
173
  executables: []
@@ -963,9 +963,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
963
963
  required_rubygems_version: !ruby/object:Gem::Requirement
964
964
  none: false
965
965
  requirements:
966
- - - ! '>'
966
+ - - ! '>='
967
967
  - !ruby/object:Gem::Version
968
- version: 1.3.1
968
+ version: '0'
969
+ segments:
970
+ - 0
971
+ hash: -2250496839152331982
969
972
  requirements:
970
973
  - none
971
974
  rubyforge_project: spree_core