solidus_product_assembly 1.0.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.
Files changed (82) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +4 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +21 -0
  5. data/Gemfile +18 -0
  6. data/LICENSE.md +13 -0
  7. data/README.md +80 -0
  8. data/Rakefile +21 -0
  9. data/app/assets/images/spinner.gif +0 -0
  10. data/app/assets/javascripts/spree/backend/solidus_product_assembly.js +1 -0
  11. data/app/assets/javascripts/spree/frontend/solidus_product_assembly.js +1 -0
  12. data/app/assets/stylesheets/spree/backend/solidus_product_assembly.css +3 -0
  13. data/app/assets/stylesheets/spree/frontend/solidus_product_assembly.css +3 -0
  14. data/app/controllers/spree/admin/parts_controller.rb +49 -0
  15. data/app/controllers/spree/checkout_controller_decorator.rb +9 -0
  16. data/app/helpers/spree/admin/orders_helper_decorator.rb +9 -0
  17. data/app/models/spree/assemblies_part.rb +12 -0
  18. data/app/models/spree/inventory_unit_decorator.rb +13 -0
  19. data/app/models/spree/line_item_decorator.rb +44 -0
  20. data/app/models/spree/order_inventory_assembly.rb +39 -0
  21. data/app/models/spree/product_decorator.rb +56 -0
  22. data/app/models/spree/shipment_decorator.rb +50 -0
  23. data/app/models/spree/stock/availability_validator.rb +28 -0
  24. data/app/models/spree/stock/inventory_unit_builder_decorator.rb +30 -0
  25. data/app/models/spree/stock/inventory_validator_decorator.rb +12 -0
  26. data/app/models/spree/variant_decorator.rb +13 -0
  27. data/app/overrides/add_admin_product_form_fields.rb +5 -0
  28. data/app/overrides/add_admin_tabs.rb +5 -0
  29. data/app/overrides/add_line_item_description.rb +5 -0
  30. data/app/overrides/spree/admin/orders/_form/inject_product_assemblies.html.erb.deface +3 -0
  31. data/app/overrides/spree/admin/orders/_shipment/stock_contents.html.erb.deface +2 -0
  32. data/app/overrides/spree/checkout/_delivery/remove_unshippable_markup.html.erb.deface +1 -0
  33. data/app/overrides/spree/checkout/_delivery/render_line_item_manifest.html.erb.deface +3 -0
  34. data/app/overrides/spree/products/show/add_links_to_parts.html.erb.deface +21 -0
  35. data/app/overrides/spree/products/show/remove_add_to_cart_button_for_non_individual_sale_products.html.erb.deface +4 -0
  36. data/app/overrides/spree/shared/_order_details/part_description.html.erb.deface +8 -0
  37. data/app/views/spree/admin/orders/_assemblies.html.erb +56 -0
  38. data/app/views/spree/admin/orders/_stock_contents.html.erb +69 -0
  39. data/app/views/spree/admin/orders/_stock_item.html.erb +46 -0
  40. data/app/views/spree/admin/parts/_parts_table.html.erb +33 -0
  41. data/app/views/spree/admin/parts/available.html.erb +55 -0
  42. data/app/views/spree/admin/parts/available.js.erb +54 -0
  43. data/app/views/spree/admin/parts/index.html.erb +70 -0
  44. data/app/views/spree/admin/parts/update_parts_table.js.erb +2 -0
  45. data/app/views/spree/admin/products/_product_assembly_fields.html.erb +23 -0
  46. data/app/views/spree/admin/shared/_product_assembly_product_tabs.html.erb +3 -0
  47. data/app/views/spree/checkout/_line_item_manifest.html.erb +17 -0
  48. data/app/views/spree/orders/_cart_description.html.erb +8 -0
  49. data/bin/rails +7 -0
  50. data/config/locales/en.yml +14 -0
  51. data/config/locales/fr.yml +12 -0
  52. data/config/locales/ru.yml +12 -0
  53. data/config/locales/sv.yml +12 -0
  54. data/config/routes.rb +19 -0
  55. data/db/migrate/20091028152124_add_many_to_many_relation_to_products.rb +13 -0
  56. data/db/migrate/20091029165620_add_parts_fields_to_products.rb +27 -0
  57. data/db/migrate/20120316141830_namespace_product_assembly_for_spree_one.rb +9 -0
  58. data/db/migrate/20140620223938_add_id_to_spree_assemblies_parts.rb +9 -0
  59. data/lib/generators/solidus_product_assembly/install/install_generator.rb +24 -0
  60. data/lib/solidus_product_assembly.rb +3 -0
  61. data/lib/solidus_product_assembly/engine.rb +15 -0
  62. data/lib/solidus_product_assembly/version.rb +3 -0
  63. data/lib/tasks/spree2_upgrade.rake +29 -0
  64. data/solidus_product_assembly.gemspec +35 -0
  65. data/spec/features/admin/orders_spec.rb +29 -0
  66. data/spec/features/admin/parts_spec.rb +28 -0
  67. data/spec/features/checkout_spec.rb +92 -0
  68. data/spec/models/spree/assemblies_part_spec.rb +18 -0
  69. data/spec/models/spree/inventory_unit_spec.rb +32 -0
  70. data/spec/models/spree/line_item_spec.rb +72 -0
  71. data/spec/models/spree/order_contents_spec.rb +40 -0
  72. data/spec/models/spree/order_inventory_assembly_spec.rb +55 -0
  73. data/spec/models/spree/order_inventory_spec.rb +35 -0
  74. data/spec/models/spree/product_spec.rb +35 -0
  75. data/spec/models/spree/shipment_spec.rb +112 -0
  76. data/spec/models/spree/stock/availability_validator_spec.rb +71 -0
  77. data/spec/models/spree/stock/coordinator_spec.rb +52 -0
  78. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +36 -0
  79. data/spec/models/spree/variant_spec.rb +28 -0
  80. data/spec/spec_helper.rb +57 -0
  81. data/spec/support/shared_contexts/order_with_bundle.rb +13 -0
  82. metadata +272 -0
@@ -0,0 +1,71 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ module Stock
5
+ describe AvailabilityValidator, :type => :model do
6
+ context "line item has no parts" do
7
+ let!(:line_item) { create(:line_item, quantity: 5) }
8
+ let!(:product) { line_item.product }
9
+
10
+ subject { described_class.new }
11
+
12
+ it 'should be valid when supply is sufficient' do
13
+ Stock::Quantifier.any_instance.stub(can_supply?: true)
14
+ expect(line_item).not_to receive(:errors)
15
+ subject.validate(line_item)
16
+ end
17
+
18
+ it 'should be invalid when supply is insufficent' do
19
+ Stock::Quantifier.any_instance.stub(can_supply?: false)
20
+ expect(line_item.errors).to receive(:[]).exactly(1).times.with(:quantity).and_return([])
21
+ subject.validate(line_item)
22
+ end
23
+
24
+ it 'should consider existing inventory_units sufficient' do
25
+ Stock::Quantifier.stub(can_supply?: false)
26
+ line_item.inventory_units.stub(where: [double] * 5)
27
+ expect(line_item).not_to receive(:errors)
28
+ subject.validate(line_item)
29
+ end
30
+ end
31
+
32
+ context "line item has parts" do
33
+ let!(:order) { create(:order_with_line_items) }
34
+ let(:line_item) { order.line_items.first }
35
+ let(:product) { line_item.product }
36
+ let(:variant) { line_item.variant }
37
+ let(:parts) { (1..2).map { create(:variant) } }
38
+ before { product.parts << parts }
39
+
40
+ subject { described_class.new }
41
+
42
+ it 'should be valid when supply of all parts is sufficient' do
43
+ Stock::Quantifier.any_instance.stub(can_supply?: true)
44
+ expect(line_item).not_to receive(:errors)
45
+ subject.validate(line_item)
46
+ end
47
+
48
+ it 'should be invalid when supplies of all parts are insufficent' do
49
+ Stock::Quantifier.any_instance.stub(can_supply?: false)
50
+ expect(line_item.errors).to receive(:[]).exactly(line_item.parts.size).times.with(:quantity).and_return([])
51
+ subject.validate(line_item)
52
+ end
53
+
54
+ it 'should be invalid when supply of 1 part is insufficient' do
55
+ Stock::Quantifier.any_instance.stub(can_supply?: false)
56
+ inventory_units = [double(variant: line_item.parts.first)] * 5
57
+ line_item.parts.first.stub(inventory_units: inventory_units)
58
+ expect(line_item.inventory_units).to receive(:where).and_return(inventory_units, [])
59
+ expect(line_item.errors).to receive(:[]).exactly(1).times.with(:quantity).and_return([])
60
+ subject.validate(line_item)
61
+ end
62
+
63
+ it 'should be valid when supply of each part is sufficient' do
64
+ line_item.parts.each { |part| part.stub(inventory_units: [double(variant: part)] * 5) }
65
+ expect(line_item).not_to receive(:errors)
66
+ subject.validate(line_item)
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+
3
+ # Spree::Stock::Coordinator was refactored in Solidus to hide keep private
4
+ # information about packages, we have to be sneaky to reach inside
5
+ def inventory_units(coordinator)
6
+ coordinator.shipments.flat_map { |s| s.inventory_units }
7
+ end
8
+
9
+ module Spree
10
+ module Stock
11
+ describe Coordinator do
12
+ subject { Coordinator.new(order) }
13
+
14
+ context "order shares variant as individual and within bundle" do
15
+ include_context "product is ordered as individual and within a bundle"
16
+
17
+ before { StockItem.update_all 'count_on_hand = 10' }
18
+
19
+ context "bundle part requires more units than individual product" do
20
+ before { order.contents.add(bundle_variant, 5) }
21
+
22
+ let(:bundle_item_quantity) { order.find_line_item_by_variant(bundle_variant).quantity }
23
+
24
+ it "calculates items quantity properly" do
25
+ expected_units_on_package = order.line_items.to_a.sum(&:quantity) - bundle_item_quantity + (bundle.parts.count * bundle_item_quantity)
26
+
27
+ expect(inventory_units(subject).size).to eql expected_units_on_package
28
+ end
29
+ end
30
+ end
31
+
32
+ context "multiple stock locations" do
33
+ let!(:stock_locations) { (1..3).map { create(:stock_location) } }
34
+
35
+ let(:order) { create(:order_with_line_items) }
36
+ let(:parts) { (1..3).map { create(:variant) } }
37
+
38
+ let(:bundle_variant) { order.variants.first }
39
+ let(:bundle) { bundle_variant.product }
40
+
41
+ let(:bundle_item_quantity) { order.find_line_item_by_variant(bundle_variant).quantity }
42
+
43
+ before { bundle.parts << parts }
44
+
45
+ it "haha" do
46
+ expected_units_on_package = order.line_items.to_a.sum(&:quantity) - bundle_item_quantity + (bundle.parts.count * bundle_item_quantity)
47
+ expect(inventory_units(subject).size).to eql expected_units_on_package
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ module Stock
5
+ describe InventoryUnitBuilder, :type => :model do
6
+ subject { InventoryUnitBuilder.new(order) }
7
+
8
+ context "order shares variant as individual and within bundle" do
9
+ include_context "product is ordered as individual and within a bundle" do
10
+ let(:bundle_item_quantity) { order.find_line_item_by_variant(bundle_variant).quantity }
11
+
12
+ describe "#units" do
13
+ it "returns an inventory unit for each part of each quantity for the order's line items" do
14
+ units = subject.units
15
+ expect(units.count).to eq 4
16
+ expect(units[0].line_item.quantity).to eq order.line_items.first.quantity
17
+ expect(units[0].line_item.quantity).to eq bundle_item_quantity
18
+
19
+ line_item = order.line_items.first
20
+
21
+ expect(units.map(&:variant)).to match_array line_item.parts
22
+ end
23
+
24
+ it "builds the inventory units as pending" do
25
+ expect(subject.units.map(&:pending).uniq).to eq [true]
26
+ end
27
+
28
+ it "associates the inventory units to the order" do
29
+ expect(subject.units.map(&:order).uniq).to eq [order]
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ describe Variant do
5
+ context "filter assemblies" do
6
+ let(:mug) { create(:product) }
7
+ let(:tshirt) { create(:product) }
8
+ let(:variant) { create(:variant) }
9
+
10
+ context "variant has more than one assembly" do
11
+ before { variant.assemblies.push [mug, tshirt] }
12
+
13
+ it "returns both products" do
14
+ expect(variant.assemblies_for([mug, tshirt])).to include mug
15
+ expect(variant.assemblies_for([mug, tshirt])).to include tshirt
16
+ end
17
+
18
+ it { expect(variant).to be_a_part }
19
+ end
20
+
21
+ context "variant no assembly" do
22
+ it "returns both products" do
23
+ variant.assemblies_for([mug, tshirt]).should be_empty
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,57 @@
1
+ require 'simplecov'
2
+ SimpleCov.start 'rails'
3
+
4
+ ENV["RAILS_ENV"] = "test"
5
+
6
+ require File.expand_path("../dummy/config/environment.rb", __FILE__)
7
+
8
+ require 'rspec/rails'
9
+ require 'ffaker'
10
+ require 'database_cleaner'
11
+
12
+ require 'capybara/rspec'
13
+ require 'capybara/rails'
14
+ require 'capybara/poltergeist'
15
+ Capybara.javascript_driver = :poltergeist
16
+
17
+ Dir[File.join(File.dirname(__FILE__), "support/**/*.rb")].each {|f| require f }
18
+
19
+ require 'spree/testing_support/factories'
20
+ require 'spree/testing_support/url_helpers'
21
+ require 'spree/testing_support/authorization_helpers'
22
+ require 'spree/testing_support/capybara_ext'
23
+
24
+ # ActiveRecord::Base.logger = Logger.new(STDOUT)
25
+
26
+ RSpec.configure do |config|
27
+ config.mock_with :rspec
28
+ config.use_transactional_fixtures = false
29
+
30
+ config.before :suite do
31
+ Capybara.match = :prefer_exact
32
+ DatabaseCleaner.clean_with :truncation
33
+ end
34
+
35
+ config.before(:each) do
36
+ Rails.cache.clear
37
+
38
+ if RSpec.current_example.metadata[:js]
39
+ DatabaseCleaner.strategy = :truncation
40
+ else
41
+ DatabaseCleaner.strategy = :transaction
42
+ end
43
+
44
+ DatabaseCleaner.start
45
+ end
46
+
47
+ config.after(:each) do
48
+ # Ensure js requests finish processing before advancing to the next test
49
+ wait_for_ajax if RSpec.current_example.metadata[:js]
50
+
51
+ DatabaseCleaner.clean
52
+ end
53
+
54
+ config.include FactoryGirl::Syntax::Methods
55
+ config.include Spree::TestingSupport::UrlHelpers
56
+ config.example_status_persistence_file_path = "./spec/examples.txt"
57
+ end
@@ -0,0 +1,13 @@
1
+ shared_context "product is ordered as individual and within a bundle" do
2
+ let(:order) { create(:order_with_line_items) }
3
+ let(:parts) { (1..3).map { create(:variant) } }
4
+
5
+ let(:bundle_variant) { order.variants.first }
6
+ let(:bundle) { bundle_variant.product }
7
+
8
+ let(:common_product) { order.variants.last }
9
+
10
+ before do
11
+ bundle.parts << [parts, common_product]
12
+ end
13
+ end
metadata ADDED
@@ -0,0 +1,272 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: solidus_product_assembly
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Roman Smirnov
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-09-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: solidus_backend
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '3'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '1.0'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '3'
33
+ - !ruby/object:Gem::Dependency
34
+ name: rspec-rails
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '3.4'
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '3.4'
47
+ - !ruby/object:Gem::Dependency
48
+ name: sqlite3
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: ffaker
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: factory_girl
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '4.4'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '4.4'
89
+ - !ruby/object:Gem::Dependency
90
+ name: capybara
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '2.7'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '2.7'
103
+ - !ruby/object:Gem::Dependency
104
+ name: poltergeist
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '1.9'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '1.9'
117
+ - !ruby/object:Gem::Dependency
118
+ name: database_cleaner
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '1.3'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '1.3'
131
+ - !ruby/object:Gem::Dependency
132
+ name: simplecov
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ description: Adds oportunity to make bundle of products to your Spree store
146
+ email: roman@railsdog.com
147
+ executables: []
148
+ extensions: []
149
+ extra_rdoc_files: []
150
+ files:
151
+ - ".gitignore"
152
+ - ".rspec"
153
+ - ".travis.yml"
154
+ - Gemfile
155
+ - LICENSE.md
156
+ - README.md
157
+ - Rakefile
158
+ - app/assets/images/spinner.gif
159
+ - app/assets/javascripts/spree/backend/solidus_product_assembly.js
160
+ - app/assets/javascripts/spree/frontend/solidus_product_assembly.js
161
+ - app/assets/stylesheets/spree/backend/solidus_product_assembly.css
162
+ - app/assets/stylesheets/spree/frontend/solidus_product_assembly.css
163
+ - app/controllers/spree/admin/parts_controller.rb
164
+ - app/controllers/spree/checkout_controller_decorator.rb
165
+ - app/helpers/spree/admin/orders_helper_decorator.rb
166
+ - app/models/spree/assemblies_part.rb
167
+ - app/models/spree/inventory_unit_decorator.rb
168
+ - app/models/spree/line_item_decorator.rb
169
+ - app/models/spree/order_inventory_assembly.rb
170
+ - app/models/spree/product_decorator.rb
171
+ - app/models/spree/shipment_decorator.rb
172
+ - app/models/spree/stock/availability_validator.rb
173
+ - app/models/spree/stock/inventory_unit_builder_decorator.rb
174
+ - app/models/spree/stock/inventory_validator_decorator.rb
175
+ - app/models/spree/variant_decorator.rb
176
+ - app/overrides/add_admin_product_form_fields.rb
177
+ - app/overrides/add_admin_tabs.rb
178
+ - app/overrides/add_line_item_description.rb
179
+ - app/overrides/spree/admin/orders/_form/inject_product_assemblies.html.erb.deface
180
+ - app/overrides/spree/admin/orders/_shipment/stock_contents.html.erb.deface
181
+ - app/overrides/spree/checkout/_delivery/remove_unshippable_markup.html.erb.deface
182
+ - app/overrides/spree/checkout/_delivery/render_line_item_manifest.html.erb.deface
183
+ - app/overrides/spree/products/show/add_links_to_parts.html.erb.deface
184
+ - app/overrides/spree/products/show/remove_add_to_cart_button_for_non_individual_sale_products.html.erb.deface
185
+ - app/overrides/spree/shared/_order_details/part_description.html.erb.deface
186
+ - app/views/spree/admin/orders/_assemblies.html.erb
187
+ - app/views/spree/admin/orders/_stock_contents.html.erb
188
+ - app/views/spree/admin/orders/_stock_item.html.erb
189
+ - app/views/spree/admin/parts/_parts_table.html.erb
190
+ - app/views/spree/admin/parts/available.html.erb
191
+ - app/views/spree/admin/parts/available.js.erb
192
+ - app/views/spree/admin/parts/index.html.erb
193
+ - app/views/spree/admin/parts/update_parts_table.js.erb
194
+ - app/views/spree/admin/products/_product_assembly_fields.html.erb
195
+ - app/views/spree/admin/shared/_product_assembly_product_tabs.html.erb
196
+ - app/views/spree/checkout/_line_item_manifest.html.erb
197
+ - app/views/spree/orders/_cart_description.html.erb
198
+ - bin/rails
199
+ - config/locales/en.yml
200
+ - config/locales/fr.yml
201
+ - config/locales/ru.yml
202
+ - config/locales/sv.yml
203
+ - config/routes.rb
204
+ - db/migrate/20091028152124_add_many_to_many_relation_to_products.rb
205
+ - db/migrate/20091029165620_add_parts_fields_to_products.rb
206
+ - db/migrate/20120316141830_namespace_product_assembly_for_spree_one.rb
207
+ - db/migrate/20140620223938_add_id_to_spree_assemblies_parts.rb
208
+ - lib/generators/solidus_product_assembly/install/install_generator.rb
209
+ - lib/solidus_product_assembly.rb
210
+ - lib/solidus_product_assembly/engine.rb
211
+ - lib/solidus_product_assembly/version.rb
212
+ - lib/tasks/spree2_upgrade.rake
213
+ - solidus_product_assembly.gemspec
214
+ - spec/features/admin/orders_spec.rb
215
+ - spec/features/admin/parts_spec.rb
216
+ - spec/features/checkout_spec.rb
217
+ - spec/models/spree/assemblies_part_spec.rb
218
+ - spec/models/spree/inventory_unit_spec.rb
219
+ - spec/models/spree/line_item_spec.rb
220
+ - spec/models/spree/order_contents_spec.rb
221
+ - spec/models/spree/order_inventory_assembly_spec.rb
222
+ - spec/models/spree/order_inventory_spec.rb
223
+ - spec/models/spree/product_spec.rb
224
+ - spec/models/spree/shipment_spec.rb
225
+ - spec/models/spree/stock/availability_validator_spec.rb
226
+ - spec/models/spree/stock/coordinator_spec.rb
227
+ - spec/models/spree/stock/inventory_unit_builder_spec.rb
228
+ - spec/models/spree/variant_spec.rb
229
+ - spec/spec_helper.rb
230
+ - spec/support/shared_contexts/order_with_bundle.rb
231
+ homepage: https://solidus.io
232
+ licenses: []
233
+ metadata: {}
234
+ post_install_message:
235
+ rdoc_options: []
236
+ require_paths:
237
+ - lib
238
+ required_ruby_version: !ruby/object:Gem::Requirement
239
+ requirements:
240
+ - - ">="
241
+ - !ruby/object:Gem::Version
242
+ version: 1.9.3
243
+ required_rubygems_version: !ruby/object:Gem::Requirement
244
+ requirements:
245
+ - - ">="
246
+ - !ruby/object:Gem::Version
247
+ version: '0'
248
+ requirements:
249
+ - none
250
+ rubyforge_project:
251
+ rubygems_version: 2.5.1
252
+ signing_key:
253
+ specification_version: 4
254
+ summary: Adds oportunity to make bundle of products to your Spree store
255
+ test_files:
256
+ - spec/features/admin/orders_spec.rb
257
+ - spec/features/admin/parts_spec.rb
258
+ - spec/features/checkout_spec.rb
259
+ - spec/models/spree/assemblies_part_spec.rb
260
+ - spec/models/spree/inventory_unit_spec.rb
261
+ - spec/models/spree/line_item_spec.rb
262
+ - spec/models/spree/order_contents_spec.rb
263
+ - spec/models/spree/order_inventory_assembly_spec.rb
264
+ - spec/models/spree/order_inventory_spec.rb
265
+ - spec/models/spree/product_spec.rb
266
+ - spec/models/spree/shipment_spec.rb
267
+ - spec/models/spree/stock/availability_validator_spec.rb
268
+ - spec/models/spree/stock/coordinator_spec.rb
269
+ - spec/models/spree/stock/inventory_unit_builder_spec.rb
270
+ - spec/models/spree/variant_spec.rb
271
+ - spec/spec_helper.rb
272
+ - spec/support/shared_contexts/order_with_bundle.rb