solidus_legacy_stock_system 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.
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: []