spree_variant_options 0.4.0 → 0.4.1

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.
@@ -2,7 +2,6 @@ rvm:
2
2
  - 1.8.7
3
3
  - 1.9.2
4
4
  - 1.9.3
5
- - rbx
6
5
  - ree
7
6
 
8
7
  before_script:
data/README.md CHANGED
@@ -26,7 +26,7 @@ If you don't already have an existing Spree site, [click here](https://gist.gith
26
26
  To install Spree Variant Options, just add the following to your Gemfile:
27
27
 
28
28
  ```ruby
29
- gem 'spree_variant_options', '0.3.1'
29
+ gem 'spree_variant_options', '0.4.1'
30
30
  ```
31
31
 
32
32
  Now, bundle up with:
@@ -97,6 +97,7 @@ Contributors
97
97
  ------------------------------------------------------------------------------
98
98
 
99
99
  * Spencer Steffen ([@citrus](https://github.com/citrus))
100
+ * Stéphane Bounmy ([@sbounmy](https://github.com/sbounmy))
100
101
  * Dan Morin ([@danmorin](https://github.com/danmorin))
101
102
  * Richard Brown ([@rbrown](https://github.com/rbrown))
102
103
  * [@baracek](https://github.com/baracek)
@@ -1,4 +1,4 @@
1
- "1.0.x" => { :version => "0.4.0" }
1
+ "1.0.x" => { :version => "0.4.1" }
2
2
  "0.70.x" => { :version => "0.3.0" }
3
3
  "0.60.x" => { :version => "0.2.0" }
4
4
  "0.50.x" => { :version => "0.1.1" }
@@ -0,0 +1,17 @@
1
+ Spree::OptionValue.class_eval do
2
+
3
+ default_scope order("#{quoted_table_name}.position")
4
+
5
+ has_attached_file :image,
6
+ :styles => { :small => '40x30#', :large => '140x110#' },
7
+ :default_style => :small,
8
+ :url => "/spree/option_values/:id/:style/:basename.:extension",
9
+ :path => ":rails_root/public/spree/option_values/:id/:style/:basename.:extension"
10
+
11
+ def has_image?
12
+ image_file_name && !image_file_name.empty?
13
+ end
14
+
15
+ scope :for_product, lambda { |product| select("DISTINCT #{table_name}.*").where("spree_option_values_variants.variant_id IN (?)", product.variant_ids).joins(:variants)
16
+ }
17
+ end
@@ -0,0 +1,31 @@
1
+ Spree::Product.class_eval do
2
+
3
+ def option_values
4
+ @_option_values ||= Spree::OptionValue.for_product(self).sort_by {|ov| ov.option_type.position }
5
+ end
6
+
7
+ def grouped_option_values
8
+ @_grouped_option_values ||= option_values.group_by(&:option_type)
9
+ end
10
+
11
+ def variants_for_option_value(value)
12
+ @_variant_option_values ||= variants.includes(:option_values).all
13
+ @_variant_option_values.select { |i| i.option_value_ids.include?(value.id) }
14
+ end
15
+
16
+ def variant_options_hash
17
+ return @_variant_options_hash if @_variant_options_hash
18
+ hash = {}
19
+ variants.includes(:option_values).each do |variant|
20
+ variant.option_values.each do |ov|
21
+ otid = ov.option_type_id.to_s
22
+ ovid = ov.id.to_s
23
+ hash[otid] ||= {}
24
+ hash[otid][ovid] ||= {}
25
+ hash[otid][ovid][variant.id.to_s] = variant.to_hash
26
+ end
27
+ end
28
+ @_variant_options_hash = hash
29
+ end
30
+
31
+ end
@@ -0,0 +1,15 @@
1
+ Spree::Variant.class_eval do
2
+
3
+ include ActionView::Helpers::NumberHelper
4
+
5
+ def to_hash
6
+ actual_price = self.price
7
+ #actual_price += Calculator::Vat.calculate_tax_on(self) if Spree::Config[:show_price_inc_vat]
8
+ {
9
+ :id => self.id,
10
+ :count => self.count_on_hand,
11
+ :price => number_to_currency(actual_price)
12
+ }
13
+ end
14
+
15
+ end
@@ -1,25 +1,17 @@
1
1
  <% if @product.has_variants? %>
2
2
  <div id="product-variants">
3
3
  <h2><%= t('variants') %></h2>
4
-
5
4
  <% index = 0 %>
6
5
  <% @product.grouped_option_values.each do |type, values| %>
7
6
  <div id="<%= dom_id(type) %>" class="variant-options index-<%= index %>">
8
7
  <h6 class="variant-option-type"><%= type.presentation %></h6>
9
8
  <ul class="variant-option-values">
10
- <% values.each do |value| %>
9
+ <% values.sort_by(&:position).each do |value| %>
11
10
  <% classes = ["option-value"] %>
12
- <% if index == 0 %>
13
- <% variants = @variants.select{|i| i.option_values.select{|j| j.option_type_id == type.id && j == value }.length == 1 } %>
14
- <% if variants.empty? %>
15
- <% classes << "unavailable" %>
16
- <% else %>
17
- <% classes << ( Spree::Config[:allow_backorders] || variants.sum(&:count_on_hand) > 0 ? "in-stock" : "out-of-stock" ) %>
18
- <% end %>
11
+ <% unless (variants = @product.variants_for_option_value(value)).empty? %>
12
+ <% classes << ( Spree::Config[:allow_backorders] || variants.sum(&:count_on_hand) > 0 ? "in-stock" : "out-of-stock" ) if index == 0 %>
13
+ <li><%= link_to value.has_image? ? image_tag(value.image.url, :alt => value.presentation) : content_tag(:span, value.presentation), "#", :title => value.presentation, :class => classes.join(" "), :rel => "#{type.id}-#{value.id}" %></li>
19
14
  <% end %>
20
- <li>
21
- <%= link_to value.has_image? ? image_tag(value.image.url, :alt => value.presentation) : content_tag(:span, value.presentation), "#", :title => value.presentation, :class => classes.join(" "), :rel => "#{type.id}-#{value.id}" %>
22
- </li>
23
15
  <% end %>
24
16
  <li class="clear-option"><%= link_to "X", "#clear", :class => "clear-button clear-index-#{index}" %></li>
25
17
  <li class="clear"></li>
@@ -30,10 +22,8 @@
30
22
  <%= hidden_field_tag "products[#{@product.id}]", "", :id => "variant_id", :class => "hidden" %>
31
23
  <script type="text/javascript">
32
24
  //<![CDATA[
33
- var variant_options = new VariantOptions(<%== @product.variant_options_hash.to_json %>, <%== !!Spree::Config[:allow_backorders] %>);
25
+ var variant_options = new VariantOptions(<%== @product.variant_options_hash.to_json %>, <%== !!Spree::Config[:allow_backorders] %>);
34
26
  //]]>
35
- </script>
36
-
27
+ </script>
37
28
  </div>
38
-
39
29
  <% end%>
@@ -47,7 +47,7 @@ Then /^I should see image "([^"]*)" within the first option value$/ do |source|
47
47
  ot = @product.option_types.first
48
48
  ov = ot.option_values.first
49
49
  within ".variant-options a[rel='#{ot.id}-#{ov.id}']" do
50
- assert_match "/system/images/#{ov.id}/small/#{source}", find("img").native.attribute("src")
50
+ assert_match "/spree/option_values/#{ov.id}/small/#{source}", find("img").native.attribute("src")
51
51
  end
52
52
  end
53
53
 
@@ -1,3 +1,3 @@
1
1
  module SpreeVariantOptions
2
- VERSION = "0.4.0"
2
+ VERSION = "0.4.1"
3
3
  end
@@ -7,51 +7,76 @@ class Spree::OptionValueTest < ActiveSupport::TestCase
7
7
  end
8
8
 
9
9
  should_have_attached_file :image
10
-
10
+
11
11
  context "a new option value" do
12
-
12
+
13
13
  setup do
14
14
  @option_value = Spree::OptionValue.new
15
15
  end
16
-
16
+
17
17
  should "not have an image" do
18
18
  assert !@option_value.has_image?
19
19
  end
20
-
20
+
21
21
  end
22
-
22
+
23
23
  context "an existing option value" do
24
-
24
+
25
25
  setup do
26
26
  @option_value = Factory.create(:option_value)
27
27
  end
28
-
28
+
29
29
  should "not have an image" do
30
30
  assert !@option_value.has_image?
31
31
  end
32
-
32
+
33
33
  context "with an image" do
34
-
34
+
35
35
  setup do
36
36
  @path = @images.shuffle.first
37
37
  file = File.open(@path)
38
38
  @option_value.update_attributes(:image => file)
39
39
  file.close
40
40
  end
41
-
41
+
42
42
  should "have an image" do
43
43
  assert @option_value.has_image?
44
44
  end
45
-
45
+
46
46
  should "have small large and original images" do
47
- dir = File.expand_path("../../../dummy/public/system/images/#{@option_value.id}", __FILE__)
47
+ dir = File.expand_path("../../../dummy/public/spree/option_values/#{@option_value.id}", __FILE__)
48
48
  %w(small large original).each do |size|
49
49
  assert File.exists?(File.join(dir, size, File.basename(@path)))
50
- end
50
+ end
51
51
  end
52
-
52
+
53
+ end
54
+
55
+ end
56
+
57
+ context "#for_product" do
58
+ setup do
59
+ @product = Factory.create(:product_with_variants)
60
+ end
61
+
62
+ should "return uniq option_values" do
63
+ unused = Factory(:option_value, :option_type => @product.option_types.first, :presentation => "Unused")
64
+ assert !Spree::OptionValue.for_product(@product).include?(unused)
65
+ end
66
+
67
+ should "retain option values sort order" do
68
+ @unordered, @prev_position = false, 0
69
+ Spree::OptionValue.for_product(@product).all.each do |ov|
70
+ @unordered = true if @prev_position > ov.position
71
+ @prev_position = ov.position
72
+ end
73
+
74
+ assert !@unordered
75
+ end
76
+
77
+ should "return empty array when no variants" do
78
+ product = Factory(:product)
79
+ assert_equal [], Spree::OptionValue.for_product(product)
53
80
  end
54
-
55
81
  end
56
-
57
82
  end
@@ -5,34 +5,34 @@ class Spree::ProductTest < ActiveSupport::TestCase
5
5
  setup do
6
6
  @methods = %w(option_values grouped_option_values variant_options_hash)
7
7
  end
8
-
8
+
9
9
  context "any product" do
10
-
10
+
11
11
  setup do
12
12
  @product = Factory.create(:product)
13
13
  end
14
-
14
+
15
15
  should "have proper methods" do
16
16
  @methods.each do |m|
17
17
  assert @product.respond_to?(m)
18
18
  end
19
19
  end
20
-
20
+
21
21
  end
22
-
23
-
22
+
23
+
24
24
  context "a product with variants" do
25
-
25
+
26
26
  setup do
27
27
  @product = Factory.create(:product_with_variants)
28
28
  end
29
-
29
+
30
30
  should "have variants and option types and values" do
31
31
  assert_equal 2, @product.option_types.count
32
32
  assert_equal 12, @product.option_values.count
33
33
  assert_equal 32, @product.variants.count
34
34
  end
35
-
35
+
36
36
  should "have values grouped by type" do
37
37
  expected = { "size" => 4, "color" => 8 }
38
38
  assert_equal 2, @product.grouped_option_values.count
@@ -40,7 +40,7 @@ class Spree::ProductTest < ActiveSupport::TestCase
40
40
  assert_equal expected[type.name], values.length
41
41
  end
42
42
  end
43
-
43
+
44
44
  end
45
-
45
+
46
46
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_variant_options
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
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-02-27 00:00:00.000000000Z
12
+ date: 2012-03-06 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: spree_core
16
- requirement: &70218045579800 !ruby/object:Gem::Requirement
16
+ requirement: &70249587535800 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 1.0.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70218045579800
24
+ version_requirements: *70249587535800
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: spree_sample
27
- requirement: &70218045579220 !ruby/object:Gem::Requirement
27
+ requirement: &70249587528380 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.0.0
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70218045579220
35
+ version_requirements: *70249587528380
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: dummier
38
- requirement: &70218045578360 !ruby/object:Gem::Requirement
38
+ requirement: &70249587527100 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 0.3.0
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70218045578360
46
+ version_requirements: *70249587527100
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: shoulda
49
- requirement: &70218045577460 !ruby/object:Gem::Requirement
49
+ requirement: &70249587525800 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 3.0.0.beta2
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70218045577460
57
+ version_requirements: *70249587525800
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: factory_girl
60
- requirement: &70218045576200 !ruby/object:Gem::Requirement
60
+ requirement: &70249587524740 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 2.3.2
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70218045576200
68
+ version_requirements: *70249587524740
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: cucumber-rails
71
- requirement: &70218045575120 !ruby/object:Gem::Requirement
71
+ requirement: &70249587523920 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 1.2.1
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70218045575120
79
+ version_requirements: *70249587523920
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: database_cleaner
82
- requirement: &70218045574360 !ruby/object:Gem::Requirement
82
+ requirement: &70249587522400 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: 0.6.7
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *70218045574360
90
+ version_requirements: *70249587522400
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: sqlite3
93
- requirement: &70218045573380 !ruby/object:Gem::Requirement
93
+ requirement: &70249587521480 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,7 +98,7 @@ dependencies:
98
98
  version: 1.3.4
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *70218045573380
101
+ version_requirements: *70249587521480
102
102
  description: Spree Variant Options is a simple spree extension that replaces the radio-button
103
103
  variant selection with groups of option types and values. Please see the documentation
104
104
  for more details.
@@ -120,8 +120,9 @@ files:
120
120
  - app/assets/javascripts/store/variant_options.js
121
121
  - app/assets/stylesheets/store/variant_options.css.erb
122
122
  - app/controllers/spree/admin/option_values_controller.rb
123
- - app/models/option_value_decorator.rb
124
- - app/models/product_decorator.rb
123
+ - app/models/spree/option_value_decorator.rb
124
+ - app/models/spree/product_decorator.rb
125
+ - app/models/spree/variant_decorator.rb
125
126
  - app/overrides/spree_variant_options.rb
126
127
  - app/views/spree/admin/option_types/_option_value_fields.html.erb
127
128
  - app/views/spree/admin/option_values/_table_header.html.erb
@@ -180,7 +181,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
180
181
  version: '0'
181
182
  segments:
182
183
  - 0
183
- hash: -34473155772268830
184
+ hash: 1078116666989698030
184
185
  required_rubygems_version: !ruby/object:Gem::Requirement
185
186
  none: false
186
187
  requirements:
@@ -189,7 +190,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
189
190
  version: '0'
190
191
  segments:
191
192
  - 0
192
- hash: -34473155772268830
193
+ hash: 1078116666989698030
193
194
  requirements: []
194
195
  rubyforge_project: spree_variant_options
195
196
  rubygems_version: 1.8.10
@@ -1,13 +0,0 @@
1
- Spree::OptionValue.class_eval do
2
-
3
- default_scope order(:position)
4
-
5
- has_attached_file :image,
6
- :styles => { :small => '40x30#', :large => '140x110#' },
7
- :default_style => :small
8
-
9
- def has_image?
10
- image_file_name && !image_file_name.empty?
11
- end
12
-
13
- end
@@ -1,27 +0,0 @@
1
- Spree::Product.class_eval do
2
-
3
- include ActionView::Helpers::NumberHelper
4
-
5
- def option_values
6
- option_types.map{|i| i.option_values }.flatten.uniq
7
- end
8
-
9
- def grouped_option_values
10
- option_values.group_by(&:option_type)
11
- end
12
-
13
- def variant_options_hash
14
- return @variant_options_hash if @variant_options_hash
15
- @variant_options_hash = Hash[grouped_option_values.map{ |type, values|
16
- [type.id.inspect, Hash[values.map{ |value|
17
- [value.id.inspect, Hash[variants.includes(:option_values).select{ |variant|
18
- variant.option_values.select{ |val|
19
- val.id == value.id && val.option_type_id == type.id
20
- }.length == 1 }.map{ |v| [ v.id, { :id => v.id, :count => v.count_on_hand, :price => number_to_currency(v.price) } ] }]
21
- ]
22
- }]]
23
- }]
24
- @variant_options_hash
25
- end
26
-
27
- end