spot-rate 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +28 -2
- data/lib/spot_rate/{goog_currency_converter.rb → google_currency_converter.rb} +5 -5
- data/lib/spot_rate/version.rb +1 -1
- data/lib/spot_rate.rb +22 -8
- data/spec/spot_rate/google_currency_converter_spec.rb +23 -0
- data/spec/spot_rate_spec.rb +43 -25
- data/spot_rate.gemspec +1 -1
- metadata +6 -4
data/README.md
CHANGED
@@ -18,13 +18,39 @@ Or install it yourself as:
|
|
18
18
|
|
19
19
|
## Usage
|
20
20
|
|
21
|
+
A SpotRate instance will by default use the GoogleCurrencyConverter if no other
|
22
|
+
currency converters are registered:
|
23
|
+
|
21
24
|
```ruby
|
22
25
|
require 'spot-rate'
|
23
26
|
|
24
27
|
puts Time.now
|
25
28
|
puts SpotRate.new(:from_currency => 'USD', :to_currency => 'JPY').spot_rate
|
26
|
-
|
27
|
-
|
29
|
+
# => 2013-05-01 18:34:09 -0700
|
30
|
+
# => 98.2221786
|
31
|
+
```
|
32
|
+
|
33
|
+
If you'd like to register your own currency converter, use the
|
34
|
+
`.register_currency_converter` method:
|
35
|
+
|
36
|
+
```ruby
|
37
|
+
class MyRandomCurrencyConverter
|
38
|
+
def initialize from_currency, to_currency
|
39
|
+
@from_currency = from_currency
|
40
|
+
@to_currency = to_currency
|
41
|
+
end
|
42
|
+
|
43
|
+
def spot_rate
|
44
|
+
rand # yolo
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
SpotRate.register_currency_converter(:random_converter, MyRandomCurrencyConverter)
|
49
|
+
spot_rate = SpotRate.new(:from_currency => 'USD', :to_currency => 'JPY')
|
50
|
+
puts spot_rate.use(:random_converter).spot_rate
|
51
|
+
# => 0.5363022464905228
|
52
|
+
puts spot_rate.spot_rate # will go back to using the pre-packaged default Google converter
|
53
|
+
# => 98.2221786
|
28
54
|
```
|
29
55
|
|
30
56
|
## Contributing
|
@@ -1,14 +1,14 @@
|
|
1
1
|
require 'net/http'
|
2
2
|
|
3
3
|
class SpotRate
|
4
|
-
class
|
5
|
-
|
4
|
+
class GoogleCurrencyConverter
|
5
|
+
GOOGLE_CURRENCY_URI = 'http://www.google.com/ig/calculator?hl=en&q=1%s=?%s'
|
6
6
|
|
7
7
|
attr_accessor :from_currency, :to_currency
|
8
8
|
|
9
9
|
def initialize from_currency, to_currency
|
10
|
-
|
11
|
-
|
10
|
+
@from_currency = from_currency
|
11
|
+
@to_currency = to_currency
|
12
12
|
end
|
13
13
|
|
14
14
|
def spot_rate
|
@@ -19,7 +19,7 @@ class SpotRate
|
|
19
19
|
private
|
20
20
|
|
21
21
|
def ccy_api_uri
|
22
|
-
URI(
|
22
|
+
URI(GOOGLE_CURRENCY_URI % [from_currency, to_currency])
|
23
23
|
end
|
24
24
|
|
25
25
|
def validate_converter_response!
|
data/lib/spot_rate/version.rb
CHANGED
data/lib/spot_rate.rb
CHANGED
@@ -3,19 +3,33 @@ class SpotRate
|
|
3
3
|
|
4
4
|
attr_accessor :from_currency, :to_currency
|
5
5
|
|
6
|
+
def self.available_converters
|
7
|
+
@@available_converters ||= {}
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.register_currency_converter converter_key, converter_class
|
11
|
+
self.available_converters[converter_key] = converter_class
|
12
|
+
end
|
13
|
+
|
6
14
|
def initialize config = {}
|
7
|
-
|
8
|
-
|
15
|
+
@from_currency = config[:from_currency]
|
16
|
+
@to_currency = config[:to_currency]
|
9
17
|
end
|
10
18
|
|
11
|
-
def
|
12
|
-
|
19
|
+
def use requested_converter_key
|
20
|
+
self.class
|
21
|
+
.available_converters[requested_converter_key]
|
22
|
+
.new(@from_currency, @to_currency)
|
13
23
|
end
|
14
24
|
|
15
|
-
|
25
|
+
def spot_rate
|
26
|
+
default_currency_converter.spot_rate
|
27
|
+
end
|
16
28
|
|
17
|
-
def
|
18
|
-
|
19
|
-
GoogCurrencyConverter
|
29
|
+
def default_currency_converter
|
30
|
+
use(:default)
|
20
31
|
end
|
21
32
|
end
|
33
|
+
|
34
|
+
require './lib/spot_rate/google_currency_converter'
|
35
|
+
SpotRate.register_currency_converter :default, SpotRate::GoogleCurrencyConverter
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require './lib/spot_rate/google_currency_converter'
|
3
|
+
|
4
|
+
describe SpotRate::GoogleCurrencyConverter do
|
5
|
+
describe "#spot_rate" do
|
6
|
+
it "returns a number (no stubbing + requires internet connection)" do
|
7
|
+
converter = described_class.new 'USD', 'JPY'
|
8
|
+
expect(converter.spot_rate.class).to eq Float
|
9
|
+
end
|
10
|
+
|
11
|
+
it "returns the spot conversion rate from the from_currency to the to_currency" do
|
12
|
+
Net::HTTP.stub(:get).and_return('{lhs: "1 U.S. dollar",rhs: "98.222 Japanese yen",error: "",icc: true}')
|
13
|
+
converter = described_class.new 'USD', 'JPY'
|
14
|
+
expect(converter.spot_rate).to eq 98.222
|
15
|
+
end
|
16
|
+
|
17
|
+
it "handles errors when we get an error code back" do
|
18
|
+
Net::HTTP.stub(:get).and_return('{lhs: "does not matter",rhs: "does not matter",error: "4",icc: true}')
|
19
|
+
converter = described_class.new 'USD', 'BAD'
|
20
|
+
expect { converter.spot_rate }.to raise_error SpotRate::CurrencyNotFound
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/spec/spot_rate_spec.rb
CHANGED
@@ -1,27 +1,45 @@
|
|
1
|
-
require 'net/http'
|
2
1
|
require './lib/spot_rate'
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
#
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
#
|
25
|
-
|
26
|
-
|
27
|
-
|
3
|
+
class SomeCurrencyConverter
|
4
|
+
def initialize from, to
|
5
|
+
@from = from
|
6
|
+
@to = to
|
7
|
+
end
|
8
|
+
|
9
|
+
def spot_rate
|
10
|
+
"#{@from} #{@to}"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe SpotRate do
|
15
|
+
describe ".register_currency_converter" do
|
16
|
+
it "adds the converter to the list of available currency converters" do
|
17
|
+
expect(SpotRate.available_converters).to_not include SomeCurrencyConverter
|
18
|
+
SpotRate.register_currency_converter :some_currency_converter, SomeCurrencyConverter
|
19
|
+
expect(SpotRate.available_converters[:some_currency_converter]).to eq SomeCurrencyConverter
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "#default_currency_converter" do
|
24
|
+
it "is an instance of the Google Currency Converter" do
|
25
|
+
spot_rate = SpotRate.new
|
26
|
+
expect(spot_rate.default_currency_converter).to be_a SpotRate::GoogleCurrencyConverter
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#use" do
|
31
|
+
it "returns the spot rate as determined by the requested converter" do
|
32
|
+
SpotRate.register_currency_converter :some_currency_converter, SomeCurrencyConverter
|
33
|
+
spot_rate = SpotRate.new(from_currency: 'something', to_currency: 'another thing')
|
34
|
+
expect(spot_rate.use(:some_currency_converter).spot_rate).to eq "something another thing"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "#spot_rate" do
|
39
|
+
it "returns the spot rate as determined by the default converter" do
|
40
|
+
SpotRate.register_currency_converter :default, SomeCurrencyConverter
|
41
|
+
spot_rate = SpotRate.new(from_currency: 'something', to_currency: 'another thing')
|
42
|
+
expect(spot_rate.spot_rate).to eq "something another thing"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/spot_rate.gemspec
CHANGED
@@ -6,7 +6,7 @@ Gem::Specification.new do |gem|
|
|
6
6
|
gem.email = ["jeff.iacono@gmail.com"]
|
7
7
|
gem.description = %q{get current currency spot rates with ruby}
|
8
8
|
gem.summary = %q{current currency spot rates}
|
9
|
-
gem.homepage = ""
|
9
|
+
gem.homepage = "https://github.com/jeffreyiacono/spot-rate"
|
10
10
|
|
11
11
|
gem.files = `git ls-files`.split($\)
|
12
12
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spot-rate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -88,11 +88,12 @@ files:
|
|
88
88
|
- README.md
|
89
89
|
- Rakefile
|
90
90
|
- lib/spot_rate.rb
|
91
|
-
- lib/spot_rate/
|
91
|
+
- lib/spot_rate/google_currency_converter.rb
|
92
92
|
- lib/spot_rate/version.rb
|
93
|
+
- spec/spot_rate/google_currency_converter_spec.rb
|
93
94
|
- spec/spot_rate_spec.rb
|
94
95
|
- spot_rate.gemspec
|
95
|
-
homepage:
|
96
|
+
homepage: https://github.com/jeffreyiacono/spot-rate
|
96
97
|
licenses: []
|
97
98
|
post_install_message:
|
98
99
|
rdoc_options: []
|
@@ -112,9 +113,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
112
113
|
version: '0'
|
113
114
|
requirements: []
|
114
115
|
rubyforge_project:
|
115
|
-
rubygems_version: 1.8.
|
116
|
+
rubygems_version: 1.8.24
|
116
117
|
signing_key:
|
117
118
|
specification_version: 3
|
118
119
|
summary: current currency spot rates
|
119
120
|
test_files:
|
121
|
+
- spec/spot_rate/google_currency_converter_spec.rb
|
120
122
|
- spec/spot_rate_spec.rb
|