order_optimizer 0.3.0 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f7582fc4c48f45ba73759ff312cc21a0bfe7731a5b109eafcb313c2c0930d435
4
- data.tar.gz: b10e675e41325916aede4dae3cbbc2f3dddc075bd0f0164daa5f61948c813c9c
3
+ metadata.gz: f25c274ce34a9b081d2ed3430a0b4af3b54e88d026dd1b077feb71ff2b23acb9
4
+ data.tar.gz: 25156d5709294badef7138c805752c5e57900383a9b8a45ad77a5f9b717a1f04
5
5
  SHA512:
6
- metadata.gz: 3b92cd98cbb49a93f5dd152673fca3e44d8ff531a6eae3fd87e1bd44c0bfeaebc02e580c69694da21069450dfae897a0ed641e2fe217b18a93a3d1ead28c4efd
7
- data.tar.gz: 1bb4af7ddd21d6bb5ddf22b18ed0b0e099609de555c3350837a84478b516a1f43adf2c0a58e818ca17abd443ce254dc862596661d77f8b5d46937d8f9f5b1a05
6
+ metadata.gz: 3f82d09e3a00941e261767fca66212461942c504867426f4e361f74292f03e2caf3770870fdad799e17d4c9d868ebb267382e8616e3a67727c1c68d25cdc544b
7
+ data.tar.gz: eaea4177612c87687a646a39d4ddf2233109c40cc0ad202e6755f6fd1832b9ac19a89d900d39a81a9079982230ed0bcf4568efc3a342e655e62c2ea9e77589e0
@@ -1,5 +1,10 @@
1
1
  # OrderOptimizer Gem Changelog
2
2
 
3
+ ## 0.4.0 (2020-12-11)
4
+
5
+ - Add `possible_orders` method to find all possible orders
6
+ - Fix issues with zero remainders on calculations
7
+
3
8
  ## 0.3.0 (2020-11-23)
4
9
 
5
10
  - Add `cheapest_exact_order` method to optimize an order with an exact amount
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- order_optimizer (0.3.0)
4
+ order_optimizer (0.4.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -100,6 +100,21 @@ order_optimizer.cheapest_order(required_qty: 29).skus
100
100
  #=> { '20-pack' => 1, '10-discount' => 10 }
101
101
  ```
102
102
 
103
+ If you're just interested in all possible order combinations:
104
+
105
+ ```ruby
106
+ # Initialize the optimize with a catalog
107
+ order_optimizer = OrderOptimizer.new(
108
+ '1-pack' => { quantity: 1, price_per_unit: 9 },
109
+ '10-pack' => { quantity: 10, price_per_unit: 5 },
110
+ )
111
+
112
+ order_optimizer.possible_orders(required_qty: 11).size
113
+ #=> 3
114
+ order_optimizer.possible_orders(required_qty: 10).map(&:skus)
115
+ #=> [{"10-pack"=>1, "1-pack"=>1}, {"1-pack"=>11}, {"10-pack"=>2}]
116
+ ```
117
+
103
118
  ## Development
104
119
 
105
120
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -10,18 +10,22 @@ class OrderOptimizer
10
10
  end
11
11
 
12
12
  def cheapest_order(required_qty:)
13
- possible_orders(skus: @catalog.skus, required_qty: required_qty).min_by(&:total) ||
13
+ find_possible_orders(skus: @catalog.skus, required_qty: required_qty).min_by(&:total) ||
14
14
  OrderOptimizer::Order.new(required_qty: required_qty)
15
15
  end
16
16
 
17
17
  def cheapest_exact_order(required_qty:)
18
- possible_orders(skus: @catalog.skus, required_qty: required_qty).select(&:exact?).min_by(&:total) ||
18
+ find_possible_orders(skus: @catalog.skus, required_qty: required_qty).select(&:exact?).min_by(&:total) ||
19
19
  OrderOptimizer::Order.new(required_qty: required_qty)
20
20
  end
21
21
 
22
+ def possible_orders(required_qty:)
23
+ find_possible_orders(skus: @catalog.skus, required_qty: required_qty).sort_by(&:total)
24
+ end
25
+
22
26
  private
23
27
 
24
- def possible_orders(required_qty:, skus:)
28
+ def find_possible_orders(required_qty:, skus:)
25
29
  return [] if required_qty < 1 || skus.empty?
26
30
 
27
31
  orders = []
@@ -31,7 +35,7 @@ class OrderOptimizer
31
35
  count, remainder = count_and_remainder_for_sku(order.missing_qty, sku)
32
36
 
33
37
  orders << order.dup.add(sku, count: count) unless count.zero?
34
- orders << order.dup.add(sku, count: count + 1) if remainder
38
+ orders << order.dup.add(sku, count: count + 1) unless remainder.zero?
35
39
  end
36
40
 
37
41
  count, remainder = count_and_remainder_for_sku(required_qty, sku)
@@ -40,7 +44,7 @@ class OrderOptimizer
40
44
  orders << OrderOptimizer::Order.new(required_qty: required_qty).add(sku, count: count)
41
45
  end
42
46
 
43
- if remainder
47
+ unless remainder.zero?
44
48
  orders << OrderOptimizer::Order.new(required_qty: required_qty).add(sku, count: count + 1)
45
49
  end
46
50
  end
@@ -1,3 +1,3 @@
1
1
  class OrderOptimizer
2
- VERSION = "0.3.0"
2
+ VERSION = "0.4.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: order_optimizer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - crispymtn
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2020-11-23 00:00:00.000000000 Z
13
+ date: 2020-12-11 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler