monetize 1.1.0 → 1.2.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 +4 -4
- data/CHANGELOG.md +1 -0
- data/CONTRIBUTING.md +8 -5
- data/README.md +19 -10
- data/Rakefile +5 -0
- data/lib/collection.rb +58 -0
- data/lib/monetize.rb +8 -1
- data/lib/monetize/core_extensions.rb +2 -0
- data/lib/monetize/core_extensions/hash.rb +7 -0
- data/lib/monetize/core_extensions/nil_class.rb +5 -0
- data/lib/monetize/version.rb +1 -1
- data/spec/core_extensions_spec.rb +47 -1
- data/spec/monetize_spec.rb +37 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0da3f5e2bea465f09b1722aeedb65d9d0ff40b65
|
4
|
+
data.tar.gz: 1dc558e00ac98b0dce9900ff9f4b1d4a1fc25366
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d56c2152a81bea83158da6cc4021b3668ef60a2396058dfdb11f5bce250467d54ee8c8fe193ccc0e114b96c88fa761879f7285072b9255b3b5b45db08b4c1022
|
7
|
+
data.tar.gz: 9553d4f65cfad911f9abf46b8d94b4be771981cbdcefd6098b71e06da4b3b143b75cefc52b8ed48e85e5275eab9094b87e5e4b26d86ae3d44349c7b8c8900361
|
data/CHANGELOG.md
CHANGED
data/CONTRIBUTING.md
CHANGED
@@ -5,13 +5,16 @@
|
|
5
5
|
1. Fork [the repo](https://github.com/RubyMoney/monetize)
|
6
6
|
2. Grab dependencies: `bundle install`
|
7
7
|
3. Make sure everything is working: `bundle exec rspec spec`
|
8
|
-
4.
|
9
|
-
5.
|
10
|
-
|
11
|
-
|
8
|
+
4. Create your feature branch (`git checkout -b my-new-feature`)
|
9
|
+
5. Make your changes
|
10
|
+
6. Test your changes
|
11
|
+
7. Commit your changes (`git commit -am 'Add some feature'`)
|
12
|
+
8. Push to the branch (`git push origin my-new-feature`)
|
13
|
+
9. Create a Pull Request
|
14
|
+
10. Celebrate!!!!!
|
12
15
|
|
13
16
|
## Notes
|
14
17
|
|
15
|
-
When contributing, please make sure to update the CHANGELOG when you submit
|
18
|
+
When contributing, please make sure to update the [CHANGELOG.md](CHANGELOG.md) when you submit
|
16
19
|
your pull request. Upon merging of your first pull request, you will be
|
17
20
|
given commit access to the repository.
|
data/README.md
CHANGED
@@ -26,25 +26,34 @@ Or install it yourself as:
|
|
26
26
|
## Usage
|
27
27
|
|
28
28
|
```ruby
|
29
|
-
Monetize.parse("
|
30
|
-
Monetize.parse("
|
31
|
-
Monetize.parse("
|
29
|
+
Monetize.parse("USD 100") == Money.new(100_00, "USD")
|
30
|
+
Monetize.parse("EUR 100") == Money.new(100_00, "EUR")
|
31
|
+
Monetize.parse("GBP 100") == Money.new(100_00, "GBP")
|
32
32
|
|
33
33
|
"100".to_money == Money.new(100_00, "USD")
|
34
34
|
```
|
35
35
|
|
36
|
-
Optionally, enable the ability to assume the currency from a passed symbol.
|
36
|
+
Optionally, enable the ability to assume the currency from a passed symbol. Otherwise, currency symbols will be ignored, and USD used as the default currency:
|
37
37
|
|
38
38
|
```ruby
|
39
|
+
Monetize.parse("£100") == Money.new(100_00, "USD")
|
40
|
+
|
39
41
|
Monetize.assume_from_symbol = true
|
40
42
|
|
41
|
-
"
|
43
|
+
Monetize.parse("£100") == Money.new(100_00, "GBP")
|
44
|
+
"€100".to_money == Money.new(100_00, "EUR")
|
45
|
+
```
|
46
|
+
|
47
|
+
Monetize can also parse a list of values, returning an array-like object ([Monetize::Collection](lib/collection.rb)):
|
48
|
+
|
49
|
+
```ruby
|
50
|
+
Monetize.parse_collection("€80/$100") == [Money.new(80_00, "EUR"), Money.new(100_00, "USD")]
|
51
|
+
Monetize.parse_collection("€80, $100") == [Money.new(80_00, "EUR"), Money.new(100_00, "USD")]
|
52
|
+
|
53
|
+
# The #range? method detects the presence of a hyphen
|
54
|
+
Monetize.parse_collection("€80-$100").range? == true
|
42
55
|
```
|
43
56
|
|
44
57
|
## Contributing
|
45
58
|
|
46
|
-
|
47
|
-
2. Create your feature branch (`git checkout -b my-new-feature`)
|
48
|
-
3. Commit your changes (`git commit -am 'Add some feature'`)
|
49
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
50
|
-
5. Create new Pull Request
|
59
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for details.
|
data/Rakefile
CHANGED
data/lib/collection.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'monetize'
|
4
|
+
|
5
|
+
module Monetize
|
6
|
+
class Collection
|
7
|
+
extend Forwardable
|
8
|
+
include Enumerable
|
9
|
+
def_delegators :@list, :[], :each, :last
|
10
|
+
|
11
|
+
attr_reader :input, :currency, :options
|
12
|
+
|
13
|
+
def self.parse(input, currency = Money.default_currency, options = {})
|
14
|
+
new(input, currency, options).parse
|
15
|
+
end
|
16
|
+
|
17
|
+
def initialize(input, currency = Money.default_currency, options = {})
|
18
|
+
if input.respond_to? :strip
|
19
|
+
@input = input.clone.strip
|
20
|
+
else
|
21
|
+
raise ArgumentError 'Input must be a string'
|
22
|
+
end
|
23
|
+
|
24
|
+
@currency = currency
|
25
|
+
@options = options
|
26
|
+
@list = []
|
27
|
+
end
|
28
|
+
|
29
|
+
def parse
|
30
|
+
if range?
|
31
|
+
@list = split_range.map { |fragment| Monetize.parse(fragment, currency, options) }
|
32
|
+
else
|
33
|
+
@list = split_list.map { |fragment| Monetize.parse(fragment, currency, options) }
|
34
|
+
end
|
35
|
+
|
36
|
+
self
|
37
|
+
end
|
38
|
+
|
39
|
+
def range?
|
40
|
+
RANGE_SPLIT =~ input
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
LIST_SPLIT = %r{[/,]}
|
46
|
+
RANGE_SPLIT = /-/
|
47
|
+
|
48
|
+
def split_list
|
49
|
+
Array @input.split(LIST_SPLIT)
|
50
|
+
.map(&:strip)
|
51
|
+
end
|
52
|
+
|
53
|
+
def split_range
|
54
|
+
Array @input.split(RANGE_SPLIT)
|
55
|
+
.map(&:strip)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/lib/monetize.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
require "money"
|
4
4
|
require "monetize/core_extensions"
|
5
5
|
require "monetize/version"
|
6
|
+
require "collection"
|
6
7
|
|
7
8
|
module Monetize
|
8
9
|
|
@@ -11,7 +12,9 @@ module Monetize
|
|
11
12
|
"€" => "EUR",
|
12
13
|
"£" => "GBP",
|
13
14
|
"R$" => "BRL",
|
14
|
-
"R" => "ZAR"
|
15
|
+
"R" => "ZAR",
|
16
|
+
"¥" => "JPY",
|
17
|
+
"C$" => "CAD"
|
15
18
|
}
|
16
19
|
|
17
20
|
# Class methods
|
@@ -37,6 +40,10 @@ module Monetize
|
|
37
40
|
Money.new(fractional, currency)
|
38
41
|
end
|
39
42
|
|
43
|
+
def self.parse_collection(input, currency = Money.default_currency, options = {})
|
44
|
+
Collection.parse(input, currency, options)
|
45
|
+
end
|
46
|
+
|
40
47
|
def self.from_string(value, currency = Money.default_currency)
|
41
48
|
value = BigDecimal.new(value.to_s)
|
42
49
|
from_bigdecimal(value, currency)
|
data/lib/monetize/version.rb
CHANGED
@@ -5,6 +5,21 @@ require "monetize"
|
|
5
5
|
require "monetize/core_extensions"
|
6
6
|
|
7
7
|
describe Monetize, "core extensions" do
|
8
|
+
describe NilClass do
|
9
|
+
describe "#to_money" do
|
10
|
+
it "work as documented" do
|
11
|
+
money = nil.to_money
|
12
|
+
expect(money.cents).to eq 0
|
13
|
+
expect(money.currency).to eq Money.default_currency
|
14
|
+
end
|
15
|
+
|
16
|
+
it "accepts optional currency" do
|
17
|
+
expect(nil.to_money('USD')).to eq Money.new(nil, 'USD')
|
18
|
+
expect(nil.to_money('EUR')).to eq Money.new(nil, 'EUR')
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
8
23
|
describe Numeric do
|
9
24
|
describe "#to_money" do
|
10
25
|
it "work as documented" do
|
@@ -142,6 +157,38 @@ describe Monetize, "core extensions" do
|
|
142
157
|
end
|
143
158
|
end
|
144
159
|
|
160
|
+
describe Hash do
|
161
|
+
describe "#to_money" do
|
162
|
+
|
163
|
+
context "when currency is present in hash" do
|
164
|
+
subject(:hash){ { cents: 5, currency: "EUR" } }
|
165
|
+
|
166
|
+
it "converts Hash to Money using key from hash" do
|
167
|
+
expect(hash.to_money).to eq(Money.new(5, "EUR"))
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
context "when currency is passed as argument" do
|
172
|
+
subject(:hash){ { cents: 10 } }
|
173
|
+
|
174
|
+
it "converts Hash to Money using passed currency argument" do
|
175
|
+
expect(hash.to_money("JPY")).to eq(Money.new(10, "JPY"))
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
context "when no currency is passed" do
|
180
|
+
subject(:hash){ { cents: 123 } }
|
181
|
+
|
182
|
+
before { allow(Money).to receive(:default_currency).and_return("USD") }
|
183
|
+
|
184
|
+
it "converts Hash to Money using default value" do
|
185
|
+
expect(hash.to_money("USD")).to eq(Money.new(123, "USD"))
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
145
192
|
describe Symbol do
|
146
193
|
describe "#to_currency" do
|
147
194
|
it "converts Symbol to Currency" do
|
@@ -159,5 +206,4 @@ describe Monetize, "core extensions" do
|
|
159
206
|
end
|
160
207
|
end
|
161
208
|
end
|
162
|
-
|
163
209
|
end
|
data/spec/monetize_spec.rb
CHANGED
@@ -50,6 +50,14 @@ describe Monetize do
|
|
50
50
|
expect(Monetize.parse("R$R9.99")).to eq Money.new(999, 'BRL')
|
51
51
|
end
|
52
52
|
|
53
|
+
it "parses formatted inputs with Japanese Yen passed as a symbol" do
|
54
|
+
expect(Monetize.parse("¥999")).to eq Money.new(999, 'JPY')
|
55
|
+
end
|
56
|
+
|
57
|
+
it "parses formatted inputs with Canadian Dollar passed as a symbol" do
|
58
|
+
expect(Monetize.parse("C$9.99")).to eq Money.new(999, 'CAD')
|
59
|
+
end
|
60
|
+
|
53
61
|
it 'should assume default currency if not a recognised symbol' do
|
54
62
|
expect(Monetize.parse("L9.99")).to eq Money.new(999, 'USD')
|
55
63
|
end
|
@@ -62,12 +70,17 @@ describe Monetize do
|
|
62
70
|
expect(Monetize.parse("-€9.99")).to eq Money.new(-999, 'EUR')
|
63
71
|
expect(Monetize.parse("-£9.99")).to eq Money.new(-999, 'GBP')
|
64
72
|
expect(Monetize.parse("-R$R9.99")).to eq Money.new(-999, 'BRL')
|
73
|
+
expect(Monetize.parse("-¥999")).to eq Money.new(-999, 'JPY')
|
74
|
+
expect(Monetize.parse("-C$9.99")).to eq Money.new(-999, 'CAD')
|
65
75
|
end
|
66
76
|
|
67
77
|
it 'parses formatted inputs with plus and GBP passed as symbol' do
|
68
78
|
expect(Monetize.parse("+€9.99")).to eq Money.new(999, 'EUR')
|
69
79
|
expect(Monetize.parse("+£9.99")).to eq Money.new(999, 'GBP')
|
70
80
|
expect(Monetize.parse("+R$R9.99")).to eq Money.new(999, 'BRL')
|
81
|
+
expect(Monetize.parse("+¥999")).to eq Money.new(999, 'JPY')
|
82
|
+
expect(Monetize.parse("+C$9.99")).to eq Money.new(999, 'CAD')
|
83
|
+
|
71
84
|
end
|
72
85
|
|
73
86
|
it 'parses formatted inputs with currency symbol and postfix minus sign' do
|
@@ -208,6 +221,30 @@ describe Monetize do
|
|
208
221
|
end
|
209
222
|
end
|
210
223
|
|
224
|
+
describe ".parse_collection" do
|
225
|
+
it "parses into a Money::Collection" do
|
226
|
+
expect(Monetize.parse_collection("$7")).to be_a Monetize::Collection
|
227
|
+
end
|
228
|
+
|
229
|
+
it "parses comma separated values" do
|
230
|
+
collection = Monetize.parse_collection("$5, $7")
|
231
|
+
expect(collection.first).to eq Monetize.parse("$5")
|
232
|
+
expect(collection.last).to eq Monetize.parse("$7")
|
233
|
+
end
|
234
|
+
|
235
|
+
it "parses slash separated values" do
|
236
|
+
collection = Monetize.parse_collection("£4.50/€6")
|
237
|
+
expect(collection.first).to eq Monetize.parse("£4.50")
|
238
|
+
expect(collection.last).to eq Monetize.parse("€6")
|
239
|
+
end
|
240
|
+
|
241
|
+
it "parses hyphens as ranges" do
|
242
|
+
collection = Monetize.parse_collection("$4 - $10")
|
243
|
+
expect(collection.first).to eq Monetize.parse("$4")
|
244
|
+
expect(collection.last).to eq Monetize.parse("$10")
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
211
248
|
describe ".from_string" do
|
212
249
|
it "converts given amount to cents" do
|
213
250
|
expect(Monetize.from_string("1")).to eq Money.new(1_00)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: monetize
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shane Emmons
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-04-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: money
|
@@ -82,8 +82,11 @@ files:
|
|
82
82
|
- LICENSE.txt
|
83
83
|
- README.md
|
84
84
|
- Rakefile
|
85
|
+
- lib/collection.rb
|
85
86
|
- lib/monetize.rb
|
86
87
|
- lib/monetize/core_extensions.rb
|
88
|
+
- lib/monetize/core_extensions/hash.rb
|
89
|
+
- lib/monetize/core_extensions/nil_class.rb
|
87
90
|
- lib/monetize/core_extensions/numeric.rb
|
88
91
|
- lib/monetize/core_extensions/string.rb
|
89
92
|
- lib/monetize/core_extensions/symbol.rb
|