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 +7 -0
- data/LICENSE +26 -0
- data/README.md +50 -0
- data/Rakefile +30 -0
- data/app/models/spree/stock/adjuster.rb +28 -0
- data/app/models/spree/stock/coordinator.rb +150 -0
- data/app/models/spree/stock/packer.rb +51 -0
- data/app/models/spree/stock/prioritizer.rb +48 -0
- data/config/locales/en.yml +5 -0
- data/config/routes.rb +3 -0
- data/lib/generators/solidus_legacy_stock_system/install/install_generator.rb +20 -0
- data/lib/solidus_legacy_stock_system.rb +2 -0
- data/lib/solidus_legacy_stock_system/engine.rb +16 -0
- data/lib/solidus_legacy_stock_system/factories.rb +6 -0
- data/lib/solidus_legacy_stock_system/version.rb +3 -0
- data/lib/spree/testing_support/factories/stock_packer_factory.rb +13 -0
- metadata +246 -0
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
|
data/config/routes.rb
ADDED
@@ -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,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,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: []
|