fxpotato 0.6.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fc257637544d6f9b0d7f487ebbd242e98dacfc3e
4
- data.tar.gz: dfd4392a024947d1e597d8d5e751f0ab388e457f
3
+ metadata.gz: f1fd9bbd3b50755b6dda523b4588e9bb97ad6814
4
+ data.tar.gz: d3ffe9890aeeb6f849208538e5c093e5ff8cd83e
5
5
  SHA512:
6
- metadata.gz: 021fe499b989bcd4a9cd6dc7cf3cbf69eee6078769b99c9292ccdea652de4eda59f988c23eb6a8d281535cc5ec0580130d6c11c53067d802d6e265236ed4ab66
7
- data.tar.gz: 2547544a57f5ba2d207ffd5da2bfb367d7e2b7b71a89b99ad88e418181e9d7df9038ce90cfcf00dd97c242d6cbfa629a08a87c82f1ef50360f1faefe34e8842e
6
+ metadata.gz: c371b803b61128c1a9be2aba59153ed2037bab1fa622a6b64d6bf2447c30e9d3924011b2141d73628be0b611c12e64516e3ad5d98686915a17a85184ab210f3e
7
+ data.tar.gz: 5c0c5f4a2368724b1d8c7157c5a4355da88378b4ae063f7c4f7e2b66d9826375034ce7ec11ef936992d48ab5905f02b5058307f9a817fce8ad3fcbce9d456907
data/lib/fxpotato/cli.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'thor'
2
2
  require 'fxpotato'
3
3
  require 'date'
4
+ require 'fxpotato/cli_formatter'
4
5
 
5
6
  module FxPotato
6
7
  class CLI < Thor
@@ -9,7 +10,8 @@ module FxPotato
9
10
  def getrate(base, target)
10
11
  date = options[:date] || Date.today
11
12
  begin
12
- puts "Exchange rate from #{base} to #{target} on #{date}: #{FxPotato.at(date, base, target)}"
13
+ fxrate = FxPotato.at(date, base, target)
14
+ puts CLIFormatter.result(fxrate)
13
15
  rescue RuntimeError => message
14
16
  puts message
15
17
  end
@@ -0,0 +1,24 @@
1
+ module FxPotato
2
+ class CLIFormatter
3
+ def self.result(fxrate)
4
+ fxrate && fxrate['rate'] ? pass_message(fxrate) : fail_message(fxrate)
5
+ end
6
+
7
+ private
8
+ def self.pass_message(fxrate)
9
+ "Exchange rate from #{key_and_rate(fxrate['base'])} to #{key_and_rate(fxrate['target'])} on #{fxrate['date']}: #{fxrate['rate']}"
10
+ end
11
+
12
+ def self.fail_message(fxrate)
13
+ "Unable to calculate that exchange rate, here's why:\n#{inspect_rate_block(fxrate['base'], fxrate['date'])}\n#{inspect_rate_block(fxrate['target'], fxrate['date'])}"
14
+ end
15
+
16
+ def self.key_and_rate(rate_block)
17
+ "#{rate_block['key']}(#{rate_block['rate']})"
18
+ end
19
+
20
+ def self.inspect_rate_block(rate_block, date)
21
+ rate_block['rate'] ? "" : "\tUnable to find rate for #{rate_block['key']} on #{date}"
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,23 @@
1
+ module FxPotato
2
+ class FxRate
3
+ attr_reader :base_key, :base_rate, :target_key, :target_rate, :date, :rate
4
+ def initialize(base_key, base_rate, target_key, target_rate, date, rate)
5
+ @base_key, @base_rate, @target_key, @target_rate, @date, @rate = base_key, base_rate, target_key, target_rate, date, rate
6
+ end
7
+
8
+ def serialize
9
+ {
10
+ 'date' => @date,
11
+ 'base' => {
12
+ 'key' => @base_key,
13
+ 'rate' => @base_rate
14
+ },
15
+ 'target' => {
16
+ 'key' => @target_key,
17
+ 'rate' => @target_rate
18
+ },
19
+ 'rate' => @rate
20
+ }
21
+ end
22
+ end
23
+ end
@@ -1,7 +1,12 @@
1
1
  module FxPotato
2
2
  class RateCalculator
3
3
  def self.calculate(base, target)
4
+ return nil unless base && numeric?(base) && target && numeric?(target)
4
5
  target / base
5
6
  end
7
+
8
+ def self.numeric?(thing)
9
+ Float(thing) != nil rescue false
10
+ end
6
11
  end
7
12
  end
@@ -1,3 +1,3 @@
1
1
  module FxPotato
2
- VERSION = '0.6.0'
2
+ VERSION = '1.0.0'
3
3
  end
data/lib/fxpotato.rb CHANGED
@@ -4,21 +4,22 @@ require 'fxpotato/xml_repo'
4
4
  require 'fxpotato/rate_store'
5
5
  require 'fxpotato/rate_fetcher'
6
6
  require 'fxpotato/rate_calculator'
7
+ require 'fxpotato/fxrate'
7
8
  require "fxpotato/railtie" if defined?(Rails)
8
9
 
9
10
  module FxPotato
10
- def self.at(date, from_currency, to_currency)
11
- raise "Must specify date" if date.nil?
12
- raise "Must specify from_currency" if from_currency.nil?
13
- raise "Must specify to_currency" if to_currency.nil?
11
+ def self.at(date, base_key, target_key)
12
+ base_rate = RateStore.get(self.repo, date, base_key)
13
+ target_rate = RateStore.get(self.repo, date, target_key)
14
14
 
15
- from = RateStore.get(self.repo, date, from_currency)
16
- raise "Unable to find #{from_currency} on #{date}" if from.nil?
17
-
18
- to = RateStore.get(self.repo, date, to_currency)
19
- raise "Unable to find #{to_currency} on #{date}" if to.nil?
20
-
21
- RateCalculator.calculate(from, to)
15
+ FxRate.new(
16
+ base_key,
17
+ base_rate,
18
+ target_key,
19
+ target_rate,
20
+ date,
21
+ RateCalculator.calculate(base_rate, target_rate)
22
+ ).serialize
22
23
  end
23
24
 
24
25
  def self.fetch_new_rates
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fxpotato
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Liam Stupid Name Humphreys
@@ -160,6 +160,8 @@ files:
160
160
  - fxpotato.gemspec
161
161
  - lib/fxpotato.rb
162
162
  - lib/fxpotato/cli.rb
163
+ - lib/fxpotato/cli_formatter.rb
164
+ - lib/fxpotato/fxrate.rb
163
165
  - lib/fxpotato/paths.rb
164
166
  - lib/fxpotato/railtie.rb
165
167
  - lib/fxpotato/rate_calculator.rb