currency_converter 1.0.2 → 1.1.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,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NTUxNzgxMzNiMDcwNDZlZGRhNThmNTkxZDkxODRjZWEyNzVjNzkxNA==
4
+ NmY1MDE3MzYzYTYzMGMyYWY0ZjlkNjkyNmIxODUyZWNmNDIyMjgwZA==
5
5
  data.tar.gz: !binary |-
6
- YTcyZDdmMjFjNmU5ODlmZWNhNTczYTczYmFiMWFhZDJiYTk4NmUyYw==
6
+ ZDcwMWFjYmEwYjc2YWZiMDI3NTQ3NjM3MTRiZWY3NGVmMTBiYTM1Yg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MTg0MTg1YWI5YjUxNDM3YmZiMzlmMTQ0NTk0YTU1NmVhYWM1NzBkMzAxY2Fj
10
- YTljNjg5YzVhMTQzNWUzOGJhMWFmNjQzMmVlOGY0MmQ1YzExM2NhODJhYTA2
11
- ZjA0NzNlNTMzZmM3ZjFlNzliZTdiMDc2MzBmMTdhZWIzODIxMTE=
9
+ NzYwMDQ3MDVlODU1MmYxZjVkMjRkZWI2YjYxYmI1NjEzN2NmYThkYjlkNDVk
10
+ MWE3OWY1MGJmYmQ3MzgzNjE1ZjBlYTgxNjY1YWNlZjllMTMwNTk1MjBkNWMw
11
+ YmE0Y2MxMmVkNjA4YWQ0NDY5ZTJhYjlhZjFjNjdlMWU5YWIxYmY=
12
12
  data.tar.gz: !binary |-
13
- Mzk0YWExMWRlYzc2ZTA5YjQxMTIwMDU0ZTdkNTUwNTkxNjFmNDUyM2RlZjdk
14
- N2Q3Yzg3OTM3YWYzYmZmZGE2MzFlMzlmZDI0MWU3NjdkMDgwMGUzZjM3YjI5
15
- YWZjM2JhNTZiNTdhYmQ2NjliYTE0M2RmMDg3ZmY2NzdjNDI2NmM=
13
+ MmQwZDk3NzRhODExOTE0ZDIxNTM2MGJlMzA1NzVjYThlYTM4NGI0YjJjOTE0
14
+ YjI5OGZkYjc1NWUxNzI0MWNlNWQwOTQyMjY5MGQ3ZWE4YTYzYzFiZTAzYjRm
15
+ NzI3YzU2MGRiNjU1MjAxMzVjYWE3NDk2NDg2ODM4NWNkNzgwZWU=
@@ -0,0 +1,16 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
5
+ - 2.1.0
6
+ - 2.1.1
7
+ - 2.2
8
+
9
+ before_install:
10
+ - gem install bundler
11
+
12
+ install:
13
+ - travis_retry bundle install
14
+
15
+ script:
16
+ - bundle exec rake spec
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # CurrencyConverter
2
2
 
3
- Simple Ruby API to get exchange rates from currencies using themoneyconverter.com website. You can convert currencies directly through this library.
3
+ Simple Ruby API to get exchange rates from currencies using Google finance currency converter and Yahoo finance currency converter. You can convert currencies directly through this library.
4
4
 
5
5
  ## Installation
6
6
 
@@ -18,20 +18,22 @@ Or install it yourself as:
18
18
 
19
19
  ## Usage
20
20
 
21
- To convert between two currencies:
21
+ To convert between two currencies using Google finance currency converter:
22
22
 
23
- CurrencyConverter.exchange("EUR", "USD", 100)
23
+ currency_converter = CurrencyConverter::Google.new
24
+ currency_converter.exchange("EUR", "USD", 100)
24
25
  => 132.89
25
26
 
26
- CurrencyConverter.exchange("USD", "EUR", 100)
27
+ currency_converter.exchange("USD", "EUR", 100)
27
28
  => 75.15
28
29
 
29
- To get the most recent exchange rate between two currencies:
30
+ To convert between two currencies using Yahoo finance currency converter:
30
31
 
31
- CurrencyConverter.exchange("EUR", "USD", 1)
32
+ currency_converter = CurrencyConverter::Yahoo.new
33
+ currency_converter.exchange("EUR", "USD", 1)
32
34
  => 1.33
33
35
 
34
- CurrencyConverter.exchange("USD", "EUR", 1)
36
+ currency_converter.exchange("USD", "EUR", 1)
35
37
  => 0.75
36
38
 
37
39
  ## Contributing
@@ -1,67 +1,3 @@
1
- require 'currency_converter/exceptions'
2
- require 'currency_converter/currencies'
3
1
  require 'currency_converter/version'
4
- require 'net/http'
5
- require 'nokogiri'
6
-
7
- module CurrencyConverter
8
- class << self
9
- # Returns the Symbol of 'from' currency
10
- attr_reader :from_currency
11
-
12
- # Returns the Symbol of 'to' currency
13
- attr_reader :to_currency
14
-
15
- # Receive the amount of you desire currency.
16
- #
17
- # @param [String, String, Numeric] other currency to exchange to.
18
- #
19
- # @return [amount]
20
- #
21
- # @example
22
- # CurrencyConverter.exchange("USD", "EUR", 100)
23
- # CurrencyConverter.exchange("USD", "INR", 100)
24
- def exchange(from, to, fixnum)
25
- @from_currency = from.upcase.to_sym
26
- @to_currency = to.upcase.to_sym
27
-
28
- validate_currency
29
-
30
- ex_rate = exchange_rate
31
-
32
- validate_rate(ex_rate)
33
-
34
- ex_rate.to_f * fixnum
35
- end
36
-
37
- private
38
-
39
- # Returns the Float value of rate or nil
40
- def exchange_rate
41
- http = Net::HTTP.new('themoneyconverter.com', 80)
42
- url = "/CurrencyConverter.aspx?from=#{from_currency.to_s.upcase}&to=#{to_currency.to_s.upcase}"
43
- response = http.get(url)
44
-
45
- doc = Nokogiri::HTML(response.body)
46
- result = doc.css('div.cc-rate textarea').first.text
47
-
48
- regexp = Regexp.new('(\\d+(?:\\.\\d+)?)')
49
- regexp.match result
50
-
51
- return $1
52
- rescue Timeout::Error
53
- raise StandardError, "Please check your internet connection"
54
- end
55
-
56
- # Raise errors for invalid currencies.
57
- def validate_currency
58
- raise UnknownCurrency.new(from_currency) unless CurrencyConverter::CURRENCIES.has_key?(from_currency)
59
- raise UnknownCurrency.new(to_currency) unless CurrencyConverter::CURRENCIES.has_key?(to_currency)
60
- end
61
-
62
- # Raise errors for missing data.
63
- def validate_rate(rate)
64
- raise MissingExchangeRate.new(from_currency, to_currency) if rate.to_f.zero?
65
- end
66
- end
67
- end
2
+ require 'currency_converter/google'
3
+ require 'currency_converter/yahoo'
@@ -0,0 +1,67 @@
1
+ require 'currency_converter/exceptions'
2
+ require 'currency_converter/currencies'
3
+ require 'net/http'
4
+ require 'nokogiri'
5
+
6
+ module CurrencyConverter
7
+ class Google
8
+ # Returns the Symbol of 'from' currency
9
+ attr_reader :from_currency
10
+
11
+ # Returns the Symbol of 'to' currency
12
+ attr_reader :to_currency
13
+
14
+ # Receive the amount of you desire currency.
15
+ #
16
+ # @param [String, String, Numeric] other currency to exchange to.
17
+ #
18
+ # @return [amount]
19
+ #
20
+ # @example
21
+ # currency_converter = CurrencyConverter::Google.new
22
+ # currency_converter.exchange("USD", "EUR", 100)
23
+ # currency_converter.exchange("USD", "INR", 100)
24
+ def exchange(from, to, fixnum)
25
+ @from_currency = from.upcase.to_sym
26
+ @to_currency = to.upcase.to_sym
27
+
28
+ validate_currency
29
+
30
+ ex_rate = exchange_rate
31
+
32
+ validate_rate(ex_rate)
33
+
34
+ ex_rate.to_f * fixnum
35
+ end
36
+
37
+ private
38
+
39
+ # Returns the Float value of rate or nil
40
+ def exchange_rate
41
+ http = Net::HTTP.new('themoneyconverter.com', 80)
42
+ url = "/CurrencyConverter.aspx?from=#{from_currency.to_s.upcase}&to=#{to_currency.to_s.upcase}"
43
+ response = http.get(url)
44
+
45
+ doc = Nokogiri::HTML(response.body)
46
+ result = doc.css('div.cc-rate textarea').first.text
47
+
48
+ regexp = Regexp.new('(\\d+(?:\\.\\d+)?)')
49
+ regexp.match result
50
+
51
+ return $1
52
+ rescue Timeout::Error
53
+ raise StandardError, "Please check your internet connection"
54
+ end
55
+
56
+ # Raise errors for invalid currencies.
57
+ def validate_currency
58
+ raise CurrencyConverter::UnknownCurrency.new(from_currency) unless CurrencyConverter::CURRENCIES.has_key?(from_currency)
59
+ raise CurrencyConverter::UnknownCurrency.new(to_currency) unless CurrencyConverter::CURRENCIES.has_key?(to_currency)
60
+ end
61
+
62
+ # Raise errors for missing data.
63
+ def validate_rate(rate)
64
+ raise CurrencyConverter::MissingExchangeRate.new(from_currency, to_currency) if rate.to_f.zero?
65
+ end
66
+ end
67
+ end
@@ -1,3 +1,3 @@
1
1
  module CurrencyConverter
2
- VERSION = "1.0.2"
3
- end
2
+ VERSION = "1.1.0"
3
+ end
@@ -0,0 +1,82 @@
1
+ require 'currency_converter/exceptions'
2
+ require 'currency_converter/currencies'
3
+ require 'net/http'
4
+ require 'nokogiri'
5
+
6
+ module CurrencyConverter
7
+ class Yahoo
8
+ # Returns the Symbol of 'base' currency
9
+ attr_reader :from_currency
10
+
11
+ # Returns the Symbol of 'quot' currency
12
+ attr_reader :to_currency
13
+
14
+ # Returns the array of currencies rates
15
+ attr_reader :rates
16
+
17
+ def initialize
18
+ response = fetch_data
19
+
20
+ parse_rates(response.body)
21
+ end
22
+
23
+ # Receive the amount of you desire currency.
24
+ #
25
+ # @param [String, String, Numeric] other currency to exchange to.
26
+ #
27
+ # @return [amount]
28
+ #
29
+ # @example
30
+ # currency_converter = CurrencyConverter::Yahoo.new
31
+ # currency_converter.exchange("USD", "EUR", 100)
32
+ # currency_converter.exchange("USD", "INR", 100)
33
+ def exchange(base, quot, amount)
34
+ @from_currency = base.upcase.to_sym
35
+ @to_currency = quot.upcase.to_sym
36
+
37
+ validate_currency
38
+
39
+ base_rate = rates[@from_currency].to_f
40
+ quot_rate = rates[@to_currency].to_f
41
+
42
+ rate = base_rate.zero? ? 0 : (quot_rate / base_rate)
43
+ validate_rate(rate)
44
+
45
+ amount * rate
46
+ end
47
+
48
+ private
49
+
50
+ def fetch_data
51
+ api = "http://finance.yahoo.com/webservice/v1/symbols/allcurrencies/quote;currency=true?view=basic"
52
+
53
+ uri = URI.parse(api)
54
+ http = Net::HTTP.new(uri.host, uri.port)
55
+ http.read_timeout = http.open_timeout = 20
56
+ http.start { http.request(Net::HTTP::Get.new(uri.to_s)) }
57
+ end
58
+
59
+ def parse_rates(html)
60
+ @rates = { :USD => 1.0 }
61
+
62
+ result = Nokogiri::HTML(html)
63
+ result.css('resource').each do |resource|
64
+ symbol = resource.xpath(".//field[@name='symbol']").text[0,3]
65
+ price = resource.xpath(".//field[@name='price']").text
66
+
67
+ @rates[symbol.upcase.to_sym] = price.to_f unless symbol.nil? && price.nil?
68
+ end
69
+ end
70
+
71
+ # Raise errors for invalid currencies.
72
+ def validate_currency
73
+ raise UnknownCurrency.new(from_currency) unless CURRENCIES.has_key?(from_currency)
74
+ raise UnknownCurrency.new(to_currency) unless CURRENCIES.has_key?(to_currency)
75
+ end
76
+
77
+ # Raise errors for missing data.
78
+ def validate_rate(rate)
79
+ raise MissingExchangeRate.new(from_currency, to_currency) if rate.zero?
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,24 @@
1
+ require "spec_helper"
2
+
3
+ describe CurrencyConverter::Google do
4
+ let(:currency_converter) { CurrencyConverter::Google.new }
5
+
6
+ describe "#exchange" do
7
+ it "returns the correct rate" do
8
+ expect(currency_converter.exchange("USD", "USD", 1)).to eq 1
9
+ end
10
+ end
11
+
12
+ describe "#validate_currency" do
13
+ describe CurrencyConverter::UnknownCurrency do
14
+ it 'raise an error on an unsupported currency code' do
15
+ expect { currency_converter.exchange("EUR", "UNKNOWN", 100) }.to raise_error(CurrencyConverter::UnknownCurrency)
16
+ expect { currency_converter.exchange("UNKNOWN", "EUR", 100) }.to raise_error(CurrencyConverter::UnknownCurrency)
17
+ end
18
+
19
+ it 'doesn\'t raise an error for supported currency codes' do
20
+ expect { currency_converter.exchange("EUR", "USD", 100) }.not_to raise_error
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,24 @@
1
+ require "spec_helper"
2
+
3
+ describe CurrencyConverter::Yahoo do
4
+ let(:currency_converter) { CurrencyConverter::Yahoo.new }
5
+
6
+ describe "#exchange" do
7
+ it "returns the correct rate" do
8
+ expect(currency_converter.exchange("USD", "USD", 1)).to eq 1
9
+ end
10
+ end
11
+
12
+ describe "#validate_currency" do
13
+ describe CurrencyConverter::UnknownCurrency do
14
+ it 'raise an error on an unsupported currency code' do
15
+ expect { currency_converter.exchange("EUR", "UNKNOWN", 100) }.to raise_error(CurrencyConverter::UnknownCurrency)
16
+ expect { currency_converter.exchange("UNKNOWN", "EUR", 100) }.to raise_error(CurrencyConverter::UnknownCurrency)
17
+ end
18
+
19
+ it 'doesn\'t raise an error for supported currency codes' do
20
+ expect { currency_converter.exchange("EUR", "USD", 100) }.not_to raise_error
21
+ end
22
+ end
23
+ end
24
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: currency_converter
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Diganta Mandal
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-18 00:00:00.000000000 Z
11
+ date: 2016-08-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -105,6 +105,7 @@ extra_rdoc_files: []
105
105
  files:
106
106
  - .gitignore
107
107
  - .rspec
108
+ - .travis.yml
108
109
  - Gemfile
109
110
  - LICENSE.txt
110
111
  - README.md
@@ -113,8 +114,11 @@ files:
113
114
  - lib/currency_converter.rb
114
115
  - lib/currency_converter/currencies.rb
115
116
  - lib/currency_converter/exceptions.rb
117
+ - lib/currency_converter/google.rb
116
118
  - lib/currency_converter/version.rb
117
- - spec/currency_converter_spec.rb
119
+ - lib/currency_converter/yahoo.rb
120
+ - spec/currency_converter/google_spec.rb
121
+ - spec/currency_converter/yahoo_spec.rb
118
122
  - spec/spec_helper.rb
119
123
  homepage: https://github.com/dark-prince/currency_converter
120
124
  licenses:
@@ -143,6 +147,7 @@ summary: Google provides a web site to converts currencies using exchange rates
143
147
  they have not provided any API for ruby. This is a small library that converts currencies
144
148
  exchange rate. You can convert currencies directly through this library.
145
149
  test_files:
146
- - spec/currency_converter_spec.rb
150
+ - spec/currency_converter/google_spec.rb
151
+ - spec/currency_converter/yahoo_spec.rb
147
152
  - spec/spec_helper.rb
148
153
  has_rdoc:
@@ -1,23 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe CurrencyConverter do
4
- describe ".exchange" do
5
- it "returns the correct rate" do
6
- expect(CurrencyConverter.exchange("USD", "USD", 1)).to eq 1
7
- end
8
- end
9
-
10
- describe "#validate_currency" do
11
- describe CurrencyConverter::UnknownCurrency do
12
- it 'raise an error on an unsupported currency code' do
13
- expect { CurrencyConverter.exchange("EUR", "UNKNOWN", 100) }.to raise_error(CurrencyConverter::UnknownCurrency)
14
- expect { CurrencyConverter.exchange("UNKNOWN", "EUR", 100) }.to raise_error(CurrencyConverter::UnknownCurrency)
15
- end
16
-
17
- it 'doesn\'t raise an error for supported currency codes' do
18
- expect { CurrencyConverter.exchange("EUR", "USD", 100) }.not_to raise_error
19
- #expect { CurrencyConverter.exchange("EUR", "USD", 100) }.not_to raise_error(CurrencyConverter::UnknownCurrency)
20
- end
21
- end
22
- end
23
- end