money_extensions 1.3.0 → 1.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: b02ce974d0847bc55984f19c7b7052cac5178e8ca17ed4c17778b7cab20b918d
4
- data.tar.gz: 888c92464c6ba7510c855ac6ee8670c802d41f6e408f2e3cbf21ae793e1fdd7d
3
+ metadata.gz: 06650b1771418b5d1bdc6d6391949813b5068ac49a69c8ab05e8d2c25a00be01
4
+ data.tar.gz: 134f2a5024b53e835adf631ea62d39e7005c0f2823ed3339a651197165fef6a0
5
5
  SHA512:
6
- metadata.gz: fbef0196b7903684d86d191ea69dbc1f007949647f5135bbafcaea0ae6f9ee097fa46eee3892e4b9a799909345cabbb6f8b2fbe9681e994198d9e7220dd76991
7
- data.tar.gz: 52f7c134ad23cc2db1d1d040be03abfbf7607bf48731f838004609cf114045c4efdf09f708f3ae8864ff242a38b20e5e79f1a4cfd6f8d4d73cbcd3299784b845
6
+ metadata.gz: e67f7a24cf172adbf7b8c155e47385daddfc86bc15270df25555aa4b1edac30082ea8e79fc12d9f40f0f2f644cee002d817a144a3777a85acda3caf470b15bc4
7
+ data.tar.gz: c971b6a50588c06dc507737fdba9ff27bfd800f4d64438538f4f15e62fb6b3b25eb23d6db45a9b4be9effe2b6e27dbfa03ebe14de38eb063fb06796c55471503
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.4.0
4
+
5
+ - [PLAT-401] Optimise split_between when we are doing so with numbers
6
+
3
7
  ## 1.3.0
4
8
 
5
9
  - [PLAT-377] Improve bundler require time for the Gem
@@ -1,11 +1,23 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SplitBetween
4
+ extend ActiveSupport::Concern
5
+
4
6
  # Override division -- should not do it, but use split_between
5
7
  def /(*_params)
6
8
  raise "Division of money NOT allowed - use 'split_between' to avoid rounding errors"
7
9
  end
8
10
 
11
+ module ClassMethods
12
+ def split_evenly_between(cents, number)
13
+ Money::Allocation.generate(cents, number).map { |num| Money.from_cents(num) }
14
+ end
15
+ end
16
+
17
+ def split_evenly_between(number)
18
+ Money.split_evenly_between(cents, number)
19
+ end
20
+
9
21
  # Split the money between the specified number - and return an array of money
10
22
  # Remainder in splits are given to the highest value e.g.
11
23
  # $2.00 splits [40, 81, 40] into [49, 102, 49]
@@ -13,11 +25,7 @@ module SplitBetween
13
25
  def split_between(params)
14
26
  # if just a number is passed in, then money is split equally
15
27
  if params.is_a?(Integer)
16
- divisor = params
17
- raise ArgumentError, 'Can only split up over a positive number' if divisor < 1
18
-
19
- rounded_split = lossy_divide(divisor)
20
- results = Array.new(divisor, rounded_split) # Create with 'divisor' num elements
28
+ results = split_evenly_between(params)
21
29
 
22
30
  # if an array of monies is passed in, then split in proportions
23
31
  elsif params.is_a?(Array)
@@ -36,14 +44,17 @@ module SplitBetween
36
44
  results.map! do |ratio|
37
45
  ::Money.new((cents * (ratio.to_f / total)).round)
38
46
  end
47
+
48
+ # Distribute rounding to max absolute to avoid a $0 amount getting the rounding
49
+ remainder = self - results.total_money
50
+ if !remainder.zero?
51
+ biggest_value_index = results.index(results.max_by(&:abs))
52
+ results[biggest_value_index] += remainder
53
+ end
39
54
  else
40
55
  raise 'Either a Integer or array has to be passed in for splitting money'
41
56
  end
42
57
 
43
- # Distribute rounding to max absolute to avoid a $0 amount getting the rounding
44
- biggest_value_index = results.index(results.max_by(&:abs))
45
- results[biggest_value_index] += self - results.total_money
46
-
47
58
  results
48
59
  end
49
60
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MoneyExtensions
4
- VERSION = '1.3.0'
4
+ VERSION = '1.4.0'
5
5
  end
data/spec/money_spec.rb CHANGED
@@ -5,6 +5,26 @@ describe Money do
5
5
  expect { Money.new(50)/10 }.to raise_error(RuntimeError)
6
6
  end
7
7
 
8
+ it 'should split evenly between' do
9
+ money = Money.new(100)
10
+
11
+ expect(money.split_evenly_between(3)).to eq [34,33,33].map{ |i| Money.new(i) }
12
+ expect(money.split_evenly_between(3).sum(Money.zero)).to eq money
13
+
14
+ expect(money.split_evenly_between(6)).to eq [17,17,17,17,16,16].map{ |i| Money.new(i) }
15
+ expect(money.split_evenly_between(6).sum(Money.zero)).to eq money
16
+ end
17
+
18
+ it 'should split evenly between negative numbers' do
19
+ money = Money.new(-100)
20
+
21
+ expect(money.split_evenly_between(3)).to eq [-33,-33,-34].map{ |i| Money.new(i) }
22
+ expect(money.split_evenly_between(3).sum(Money.zero)).to eq money
23
+
24
+ expect(money.split_evenly_between(6)).to eq [-16,-16,-17,-17,-17,-17].map{ |i| Money.new(i) }
25
+ expect(money.split_evenly_between(6).sum(Money.zero)).to eq money
26
+ end
27
+
8
28
  it "should split money correctly" do
9
29
  money = Money.new(100)
10
30
 
@@ -21,7 +41,7 @@ describe Money do
21
41
  expect(money.split_between([1,2])).to eq [33,67].map{ |i| Money.new(i)}
22
42
 
23
43
  money_negative = Money.new(-100)
24
- expect(money_negative.split_between(3)).to eq [-34,-33,-33].map{ |i| Money.new(i)}
44
+ expect(money_negative.split_between(3)).to eq [-33,-33,-34].map{ |i| Money.new(i)}
25
45
  expect(money_negative.split_between([1,2,2,5])).to eq [-10,-20,-20,-50].map{ |i| Money.new(i)}
26
46
  expect(money_negative.split_between([1,2])).to eq [-33,-67].map{ |i| Money.new(i)}
27
47
 
@@ -1,3 +1,3 @@
1
1
  require 'coverage/kit'
2
2
 
3
- Coverage::Kit.setup(minimum_coverage: 86.5)
3
+ Coverage::Kit.setup(minimum_coverage: 87.0)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: money_extensions
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Noack
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-07-02 00:00:00.000000000 Z
12
+ date: 2022-07-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: money