fxpotato 0.6.0 → 1.0.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
  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