solidus_legacy_stock_system 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 606ec48b0fa6131ea4c5d0f5623695c716a15197
4
+ data.tar.gz: caf64dc6cfe49b5b6ba8583368f39af45521b5b0
5
+ SHA512:
6
+ metadata.gz: 2751accd31a54debb60a96d3e17d1f2e0e04a7073ba35dcc1f32ab745eaa9b67459a0b1452b9a367d10dd665fdddff86d5baa29ae4aba4b741afbbec273ad65e
7
+ data.tar.gz: 2841223ae36abfa3424233b9e2b021b1a7ff62f01eaae5d0da7825181c33301170c0143633823816f18fb15e62844c8fa650f1757d67bfa88a7fb892074ca68c
data/LICENSE ADDED
@@ -0,0 +1,26 @@
1
+ Copyright (c) 2017 Stembolt
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without modification,
5
+ are permitted provided that the following conditions are met:
6
+
7
+ * Redistributions of source code must retain the above copyright notice,
8
+ this list of conditions and the following disclaimer.
9
+ * Redistributions in binary form must reproduce the above copyright notice,
10
+ this list of conditions and the following disclaimer in the documentation
11
+ and/or other materials provided with the distribution.
12
+ * Neither the name Spree nor the names of its contributors may be used to
13
+ endorse or promote products derived from this software without specific
14
+ prior written permission.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.md ADDED
@@ -0,0 +1,50 @@
1
+ SolidusLegacyStockSystem
2
+ ========================
3
+
4
+ This is the old stock system. This was removed from Solidus in [this pull
5
+ request](https://github.com/solidusio/solidus/pull/2199).
6
+
7
+ What is in the box?
8
+ ------------------
9
+
10
+ This extension provides the `Adjuster`, `Coordinator`, `Packer`, and
11
+ `Prioritizer` classes that were removed in version 2.4 of Solidus. Relevant
12
+ specs are also included for development and testing continued compatibility with
13
+ core.
14
+
15
+ Installation
16
+ ------------
17
+
18
+ There are no migrations to go along with this extension. Following the steps
19
+ below is all that is required to use the legacy system.
20
+
21
+ Add solidus_legacy_stock_system to your Gemfile:
22
+
23
+ ```ruby
24
+ gem 'solidus_legacy_stock_system'
25
+ ```
26
+
27
+ Bundle your dependencies:
28
+
29
+ ```shell
30
+ bundle
31
+ ```
32
+
33
+ Testing
34
+ -------
35
+
36
+ First bundle your dependencies, then run `rake`. `rake` will default to building the dummy app if it does not exist, then it will run specs, and [Rubocop](https://github.com/bbatsov/rubocop) static code analysis. The dummy app can be regenerated by using `rake test_app`.
37
+
38
+ ```shell
39
+ bundle
40
+ bundle exec rake
41
+ ```
42
+
43
+ When testing your applications integration with this extension you may use it's factories.
44
+ Simply add this require statement to your spec_helper:
45
+
46
+ ```ruby
47
+ require 'solidus_legacy_stock_system/factories'
48
+ ```
49
+
50
+ Copyright (c) 2017 Stembolt, released under the New BSD License
data/Rakefile ADDED
@@ -0,0 +1,30 @@
1
+ require 'bundler'
2
+
3
+ Bundler::GemHelper.install_tasks
4
+
5
+ begin
6
+ require 'spree/testing_support/extension_rake'
7
+ require 'rubocop/rake_task'
8
+ require 'rspec/core/rake_task'
9
+
10
+ RSpec::Core::RakeTask.new(:spec)
11
+
12
+ RuboCop::RakeTask.new
13
+
14
+ task default: %i(first_run spec)
15
+ rescue LoadError
16
+ # no rspec available
17
+ end
18
+
19
+ task :first_run do
20
+ if Dir['spec/dummy'].empty?
21
+ Rake::Task[:test_app].invoke
22
+ Dir.chdir('../../')
23
+ end
24
+ end
25
+
26
+ desc 'Generates a dummy app for testing'
27
+ task :test_app do
28
+ ENV['LIB_NAME'] = 'solidus_legacy_stock_system'
29
+ Rake::Task['extension:test_app'].invoke
30
+ end
@@ -0,0 +1,28 @@
1
+ module Spree
2
+ module Stock
3
+ # Used by Prioritizer to adjust item quantities.
4
+ #
5
+ # See spec/models/spree/stock/prioritizer_spec.rb for use cases.
6
+ class Adjuster
7
+ attr_accessor :inventory_unit, :status, :fulfilled
8
+
9
+ def initialize(inventory_unit, status)
10
+ @inventory_unit = inventory_unit
11
+ @status = status
12
+ @fulfilled = false
13
+ end
14
+
15
+ def adjust(package)
16
+ if fulfilled?
17
+ package.remove(inventory_unit)
18
+ else
19
+ self.fulfilled = true
20
+ end
21
+ end
22
+
23
+ def fulfilled?
24
+ fulfilled
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,150 @@
1
+ module Spree
2
+ module Stock
3
+ class Coordinator
4
+ attr_reader :order, :inventory_units
5
+
6
+ def initialize(order, inventory_units = nil)
7
+ @order = order
8
+ @inventory_units = inventory_units || InventoryUnitBuilder.new(order).units
9
+ @preallocated_inventory_units = []
10
+ end
11
+
12
+ def shipments
13
+ packages.map(&:shipment)
14
+ end
15
+
16
+ private
17
+
18
+ def packages
19
+ packages = build_location_configured_packages
20
+ packages = build_packages(packages)
21
+ packages = prioritize_packages(packages)
22
+ packages.each do |package|
23
+ package.shipment = package.to_shipment
24
+ end
25
+ packages = estimate_packages(packages)
26
+ validate_packages(packages)
27
+ packages
28
+ end
29
+
30
+ # Build packages for the inventory units that have preferred stock locations first
31
+ #
32
+ # Certain variants have been selected to be fulfilled from a particular stock
33
+ # location during the process of the order being created. The rest of the
34
+ # service objects the coordinator uses do a lot of automated logic to
35
+ # determine which stock location is best for the inventory unit to be
36
+ # fulfilled from, but for these special snowflakes we KNOW which stock
37
+ # location they should be fulfilled from. So rather than sending these units
38
+ # through the rest of the packing / prioritization, lets just put them
39
+ # in packages we know they should be in and deal with other automatically-
40
+ # handled inventory units otherwise.
41
+ def build_location_configured_packages(packages = [])
42
+ order.order_stock_locations.where(shipment_fulfilled: false).group_by(&:stock_location).each do |stock_location, stock_location_configurations|
43
+ units = stock_location_configurations.flat_map do |stock_location_configuration|
44
+ unallocated_inventory_units.select { |iu| iu.variant == stock_location_configuration.variant }.take(stock_location_configuration.quantity)
45
+ end
46
+ packer = build_packer(stock_location, units)
47
+ packages += packer.packages
48
+ @preallocated_inventory_units += units
49
+ end
50
+ packages
51
+ end
52
+
53
+ # Build packages as per stock location
54
+ #
55
+ # It needs to check whether each stock location holds at least one stock
56
+ # item for the order. In case none is found it wouldn't make any sense
57
+ # to build a package because it would be empty. Plus we avoid errors down
58
+ # the stack because it would assume the stock location has stock items
59
+ # for the given order
60
+ #
61
+ # Returns an array of Package instances
62
+ def build_packages(packages = [])
63
+ stock_location_variant_ids.each do |stock_location, variant_ids|
64
+ units_for_location = unallocated_inventory_units.select { |unit| variant_ids.include?(unit.variant_id) }
65
+ packer = build_packer(stock_location, units_for_location)
66
+ packages += packer.packages
67
+ end
68
+ packages
69
+ end
70
+
71
+ # This finds the variants we're looking for in each active stock location.
72
+ # It returns a hash like:
73
+ # {
74
+ # <stock location> => <set of variant ids>,
75
+ # <stock location> => <set of variant ids>,
76
+ # ...,
77
+ # }
78
+ # This is done in an awkward way for performance reasons. It uses two
79
+ # queries that are kept as performant as possible, and only loads the
80
+ # minimum required ActiveRecord objects.
81
+ def stock_location_variant_ids
82
+ # associate the variant ids we're interested in with stock location ids
83
+ location_variant_ids = Spree::StockItem.
84
+ where(variant_id: unallocated_variant_ids).
85
+ joins(:stock_location).
86
+ merge(Spree::StockLocation.active).
87
+ pluck(:stock_location_id, :variant_id)
88
+
89
+ # load activerecord objects for the stock location ids and turn them
90
+ # into a lookup hash like:
91
+ # {
92
+ # <stock location id> => <stock location>,
93
+ # ...,
94
+ # }
95
+ location_lookup = Spree::StockLocation.
96
+ where(id: location_variant_ids.map(&:first).uniq).
97
+ map { |l| [l.id, l] }.
98
+ to_h
99
+
100
+ # build the final lookup hash of
101
+ # {<stock location> => <set of variant ids>, ...}
102
+ # using the previous results
103
+ location_variant_ids.each_with_object({}) do |(location_id, variant_id), hash|
104
+ location = location_lookup[location_id]
105
+ hash[location] ||= Set.new
106
+ hash[location] << variant_id
107
+ end
108
+ end
109
+
110
+ def unallocated_inventory_units
111
+ inventory_units - @preallocated_inventory_units
112
+ end
113
+
114
+ def unallocated_variant_ids
115
+ unallocated_inventory_units.map(&:variant_id).uniq
116
+ end
117
+
118
+ def prioritize_packages(packages)
119
+ prioritizer = Prioritizer.new(inventory_units, packages)
120
+ prioritizer.prioritized_packages
121
+ end
122
+
123
+ def estimate_packages(packages)
124
+ estimator = Spree::Config.stock.estimator_class.new
125
+ packages.each do |package|
126
+ package.shipment.shipping_rates = estimator.shipping_rates(package)
127
+ end
128
+ packages
129
+ end
130
+
131
+ def validate_packages(packages)
132
+ desired_quantity = inventory_units.size
133
+ packaged_quantity = packages.sum(&:quantity)
134
+ if packaged_quantity != desired_quantity
135
+ raise Spree::Order::InsufficientStock,
136
+ "Was only able to package #{packaged_quantity} inventory units of #{desired_quantity} requested"
137
+ end
138
+ end
139
+
140
+ def build_packer(stock_location, inventory_units)
141
+ Packer.new(stock_location, inventory_units, splitters(stock_location))
142
+ end
143
+
144
+ def splitters(_stock_location)
145
+ # extension point to return custom splitters for a location
146
+ Rails.application.config.spree.stock_splitters
147
+ end
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,51 @@
1
+ module Spree
2
+ module Stock
3
+ class Packer
4
+ attr_reader :stock_location, :inventory_units, :splitters
5
+
6
+ def initialize(stock_location, inventory_units, splitters = [Splitter::Base])
7
+ @stock_location = stock_location
8
+ @inventory_units = inventory_units
9
+ @splitters = splitters
10
+ end
11
+
12
+ def packages
13
+ Spree::Stock::SplitterChain.new(stock_location, splitters).split([default_package])
14
+ end
15
+
16
+ def default_package
17
+ package = Package.new(stock_location)
18
+ inventory_units.group_by(&:variant).each do |variant, variant_inventory_units|
19
+ units = variant_inventory_units.clone
20
+ if variant.should_track_inventory?
21
+ stock_item = stock_item_for(variant.id)
22
+ next unless stock_item
23
+
24
+ on_hand, backordered = stock_item.fill_status(units.count)
25
+ package.add_multiple units.slice!(0, on_hand), :on_hand if on_hand > 0
26
+ package.add_multiple units.slice!(0, backordered), :backordered if backordered > 0
27
+ else
28
+ package.add_multiple units
29
+ end
30
+ end
31
+ package
32
+ end
33
+
34
+ private
35
+
36
+ def stock_item_for(variant_id)
37
+ stock_item_lookup[variant_id]
38
+ end
39
+
40
+ # Returns a lookup table in the form of:
41
+ # {<variant_id> => <stock_item>, ...}
42
+ def stock_item_lookup
43
+ @stock_item_lookup ||= Spree::StockItem.
44
+ where(variant_id: inventory_units.map(&:variant_id).uniq).
45
+ where(stock_location_id: stock_location.id).
46
+ map { |stock_item| [stock_item.variant_id, stock_item] }.
47
+ to_h # there is only one stock item per variant in a stock location
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,48 @@
1
+ module Spree
2
+ module Stock
3
+ class Prioritizer
4
+ attr_reader :packages, :inventory_units
5
+
6
+ def initialize(inventory_units, packages, adjuster_class = Adjuster)
7
+ @inventory_units = inventory_units
8
+ @packages = packages
9
+ @adjuster_class = adjuster_class
10
+ end
11
+
12
+ def prioritized_packages
13
+ sort_packages
14
+ adjust_packages
15
+ prune_packages
16
+ packages
17
+ end
18
+
19
+ private
20
+
21
+ def adjust_packages
22
+ inventory_units.each do |inventory_unit|
23
+ adjuster = @adjuster_class.new(inventory_unit, :on_hand)
24
+
25
+ visit_packages(adjuster)
26
+
27
+ adjuster.status = :backordered
28
+ visit_packages(adjuster)
29
+ end
30
+ end
31
+
32
+ def visit_packages(adjuster)
33
+ packages.each do |package|
34
+ item = package.find_item adjuster.inventory_unit, adjuster.status
35
+ adjuster.adjust(package) if item
36
+ end
37
+ end
38
+
39
+ def sort_packages
40
+ # order packages by preferred stock_locations
41
+ end
42
+
43
+ def prune_packages
44
+ packages.reject!(&:empty?)
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,5 @@
1
+ # Sample localization file for English. Add more files in this directory for other locales.
2
+ # See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
3
+
4
+ en:
5
+ hello: Hello world
data/config/routes.rb ADDED
@@ -0,0 +1,3 @@
1
+ Spree::Core::Engine.routes.draw do
2
+ # Add your extension routes here
3
+ end
@@ -0,0 +1,20 @@
1
+ module SolidusLegacyStockSystem
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+ class_option :auto_run_migrations, type: :boolean, default: false
5
+
6
+ def add_migrations
7
+ run 'bundle exec rake railties:install:migrations FROM=solidus_legacy_stock_system'
8
+ end
9
+
10
+ def run_migrations
11
+ run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask('Would you like to run the migrations now? [Y/n]'))
12
+ if run_migrations
13
+ run 'bundle exec rake db:migrate'
14
+ else
15
+ puts 'Skipping rake db:migrate, don\'t forget to run it!'
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,2 @@
1
+ require 'solidus_core'
2
+ require 'solidus_legacy_stock_system/engine'
@@ -0,0 +1,16 @@
1
+ module SolidusLegacyStockSystem
2
+ class Engine < Rails::Engine
3
+ require 'spree/core'
4
+ isolate_namespace Spree
5
+ engine_name 'solidus_legacy_stock_system'
6
+
7
+ initializer 'spree.stock.coordinator_class' do |app|
8
+ app.config.spree.preferences.stock.coordinator_class = 'Spree::Stock::Coordinator'
9
+ end
10
+
11
+ # use rspec for tests
12
+ config.generators do |g|
13
+ g.test_framework :rspec
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,6 @@
1
+ FactoryBot.define do
2
+ # Define your Spree extensions Factories within this file to enable applications, and other extensions to use and override them.
3
+ #
4
+ # Example adding this to your spec_helper will load these Factories for use:
5
+ # require 'solidus_legacy_stock_system/factories'
6
+ end
@@ -0,0 +1,3 @@
1
+ module SolidusLegacyStockSystem
2
+ VERSION = '1.0.0'
3
+ end
@@ -0,0 +1,13 @@
1
+ require 'spree/testing_support/factories/stock_location_factory'
2
+
3
+ FactoryBot.define do
4
+ # must use build()
5
+ factory :stock_packer, class: Spree::Stock::Packer do
6
+ transient do
7
+ stock_location { build(:stock_location) }
8
+ contents []
9
+ end
10
+
11
+ initialize_with { new(stock_location, contents) }
12
+ end
13
+ end
metadata ADDED
@@ -0,0 +1,246 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: solidus_legacy_stock_system
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Stembolt
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-11-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: solidus_core
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 2.4.x
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: 3.x
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 2.4.x
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: 3.x
33
+ - !ruby/object:Gem::Dependency
34
+ name: database_cleaner
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: factory_bot
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: pry
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: rspec-activemodel-mocks
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ - !ruby/object:Gem::Dependency
104
+ name: rspec-rails
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ - !ruby/object:Gem::Dependency
118
+ name: rubocop
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ - !ruby/object:Gem::Dependency
132
+ name: rubocop-rspec
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - '='
136
+ - !ruby/object:Gem::Version
137
+ version: 1.4.0
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - '='
143
+ - !ruby/object:Gem::Version
144
+ version: 1.4.0
145
+ - !ruby/object:Gem::Dependency
146
+ name: simplecov
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ - !ruby/object:Gem::Dependency
160
+ name: sqlite3
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
173
+ - !ruby/object:Gem::Dependency
174
+ name: pg
175
+ requirement: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - ">="
178
+ - !ruby/object:Gem::Version
179
+ version: '0'
180
+ type: :development
181
+ prerelease: false
182
+ version_requirements: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - ">="
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
187
+ - !ruby/object:Gem::Dependency
188
+ name: mysql2
189
+ requirement: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - ">="
192
+ - !ruby/object:Gem::Version
193
+ version: '0'
194
+ type: :development
195
+ prerelease: false
196
+ version_requirements: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - ">="
199
+ - !ruby/object:Gem::Version
200
+ version: '0'
201
+ description: Legacy stock system for Solidus
202
+ email: contact@solidus.io
203
+ executables: []
204
+ extensions: []
205
+ extra_rdoc_files: []
206
+ files:
207
+ - LICENSE
208
+ - README.md
209
+ - Rakefile
210
+ - app/models/spree/stock/adjuster.rb
211
+ - app/models/spree/stock/coordinator.rb
212
+ - app/models/spree/stock/packer.rb
213
+ - app/models/spree/stock/prioritizer.rb
214
+ - config/locales/en.yml
215
+ - config/routes.rb
216
+ - lib/generators/solidus_legacy_stock_system/install/install_generator.rb
217
+ - lib/solidus_legacy_stock_system.rb
218
+ - lib/solidus_legacy_stock_system/engine.rb
219
+ - lib/solidus_legacy_stock_system/factories.rb
220
+ - lib/solidus_legacy_stock_system/version.rb
221
+ - lib/spree/testing_support/factories/stock_packer_factory.rb
222
+ homepage: https://solidus.io
223
+ licenses:
224
+ - BSD-3-Clause
225
+ metadata: {}
226
+ post_install_message:
227
+ rdoc_options: []
228
+ require_paths:
229
+ - lib
230
+ required_ruby_version: !ruby/object:Gem::Requirement
231
+ requirements:
232
+ - - ">="
233
+ - !ruby/object:Gem::Version
234
+ version: '0'
235
+ required_rubygems_version: !ruby/object:Gem::Requirement
236
+ requirements:
237
+ - - ">="
238
+ - !ruby/object:Gem::Version
239
+ version: '0'
240
+ requirements: []
241
+ rubyforge_project:
242
+ rubygems_version: 2.6.13
243
+ signing_key:
244
+ specification_version: 4
245
+ summary: Legacy stock system for Solidus
246
+ test_files: []