EGP_Rates 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/egp_rates/aaib.rb +88 -0
- data/lib/egp_rates/cbe.rb +0 -2
- data/lib/egp_rates/cib.rb +76 -0
- data/lib/egp_rates.rb +3 -0
- data/spec/cassettes/AAIB.yml +1509 -0
- data/spec/cassettes/CIB.yml +58 -0
- data/spec/egp_rates/aaib_spec.rb +88 -0
- data/spec/egp_rates/cbe_spec.rb +2 -0
- data/spec/egp_rates/cib_spec.rb +92 -0
- data/spec/egp_rates/nbe_spec.rb +2 -0
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 179ed0bbc6e04914fdf9fec1e526270aaefe14ff
|
4
|
+
data.tar.gz: 43296feb1231e90af389eb3372f07135211ef3e6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 88e624e998f66d0c356e9ce7142a6dc9b45c31d4376e2ccfd0c1a443e77e2d85abfa94f70aed37c7f2eb5be25e1c13028a019c1d1b0b2f9860cd54e1785cf9a8
|
7
|
+
data.tar.gz: a8dac0a7afb3b9f422edbca668a7d7d8e7c744ce70081fca02fbdb06a4d5a72922b45f74e89bd614586a7f08f0738440cbc05ea9c300ee592fe79ce7c74bcfe4
|
@@ -0,0 +1,88 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module EGPRates
|
3
|
+
# Arab African International Bank
|
4
|
+
class AAIB < EGPRates::Bank
|
5
|
+
def initialize
|
6
|
+
@sym = :AAIB
|
7
|
+
@uri = URI.parse('http://aaib.com/services/rates')
|
8
|
+
end
|
9
|
+
|
10
|
+
# @return [Hash] of exchange rates for selling and buying
|
11
|
+
# {
|
12
|
+
# { sell: { SYM: rate }, { SYM: rate }, ... },
|
13
|
+
# { buy: { SYM: rate }, { SYM: rate }, ... }
|
14
|
+
# }
|
15
|
+
def exchange_rates
|
16
|
+
@exchange_rates ||= parse(raw_exchange_rates)
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
# Send the request to the URL and retrun raw data of the response
|
22
|
+
# @return [Enumerator::Lazy] with the table row in HTML that evaluates to
|
23
|
+
# [
|
24
|
+
# [
|
25
|
+
# "\r\n ",
|
26
|
+
# "US DOLLAR"
|
27
|
+
# "\r\n "
|
28
|
+
# "15.9"
|
29
|
+
# "\r\n "
|
30
|
+
# "16.05"
|
31
|
+
# "\r\n"
|
32
|
+
# ], [
|
33
|
+
# "\r\n "
|
34
|
+
# "EURO CURRENCY"
|
35
|
+
# "\r\n "
|
36
|
+
# "17.2213"
|
37
|
+
# "\r\n "
|
38
|
+
# "17.5314"
|
39
|
+
# "\r\n "
|
40
|
+
# ], [
|
41
|
+
# ...
|
42
|
+
# ]
|
43
|
+
def raw_exchange_rates
|
44
|
+
response = Net::HTTP.get_response(@uri)
|
45
|
+
fail ResponseError, response.code unless response.is_a? Net::HTTPSuccess
|
46
|
+
response = response.body&.gsub("\u0000", '')
|
47
|
+
# AAIB provide 7 currencies only
|
48
|
+
table_rows = Oga.parse_html(response).css('#rates-table tr')
|
49
|
+
fail ResponseError, 'Unknown HTML' unless table_rows&.size == 7
|
50
|
+
table_rows.lazy.map(&:children).map { |cell| cell.map(&:text) }
|
51
|
+
end
|
52
|
+
|
53
|
+
# Convert currency string to ISO symbol
|
54
|
+
# @param currency [String] "US Dollar"
|
55
|
+
# @return [Symbol] :USD ISO currency name
|
56
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
57
|
+
def currency_symbol(currency)
|
58
|
+
case currency
|
59
|
+
when /US/ then :USD
|
60
|
+
when /EURO/ then :EUR
|
61
|
+
when /STERLING/ then :GBP
|
62
|
+
when /SWISS/ then :CHF
|
63
|
+
when /SAUDI/ then :SAR
|
64
|
+
when /KUWAIT/ then :KWD
|
65
|
+
when /DIRHAM/ then :AED
|
66
|
+
else fail ResponseError, "Unknown currency #{currency}"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
70
|
+
|
71
|
+
# Parse the #raw_exchange_rates returned in response
|
72
|
+
# @return [Hash] of exchange rates for selling and buying
|
73
|
+
# {
|
74
|
+
# { sell: { SYM: rate }, { SYM: rate }, ... },
|
75
|
+
# { buy: { SYM: rate }, { SYM: rate }, ... }
|
76
|
+
# }
|
77
|
+
def parse(raw_data)
|
78
|
+
raw_data.each_with_object(sell: {}, buy: {}) do |row, result|
|
79
|
+
sell_rate = row[5].to_f
|
80
|
+
buy_rate = row[3].to_f
|
81
|
+
currency = currency_symbol(row[1])
|
82
|
+
|
83
|
+
result[:sell][currency] = sell_rate
|
84
|
+
result[:buy][currency] = buy_rate
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
data/lib/egp_rates/cbe.rb
CHANGED
@@ -39,7 +39,6 @@ module EGPRates
|
|
39
39
|
# @param currency [String] "US Dollar"
|
40
40
|
# @return [Symbol] :USD ISO currency name
|
41
41
|
# rubocop:disable Metrics/CyclomaticComplexity
|
42
|
-
# rubocop:disable Metrics/MethodLength
|
43
42
|
def currency_symbol(currency)
|
44
43
|
case currency
|
45
44
|
when /US/ then :USD
|
@@ -55,7 +54,6 @@ module EGPRates
|
|
55
54
|
end
|
56
55
|
end
|
57
56
|
# rubocop:enable Metrics/CyclomaticComplexity
|
58
|
-
# rubocop:enable Metrics/MethodLength
|
59
57
|
|
60
58
|
# Parse the #raw_exchange_rates returned in response
|
61
59
|
# @return [Hash] of exchange rates for selling and buying
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module EGPRates
|
3
|
+
# National Bank of Egypt
|
4
|
+
class CIB < EGPRates::Bank
|
5
|
+
def initialize
|
6
|
+
@sym = :CIB
|
7
|
+
@uri = URI.parse('http://www.cibeg.com/_layouts/15/LINKDev.CIB.CurrenciesFunds/FundsCurrencies.aspx/GetCurrencies')
|
8
|
+
end
|
9
|
+
|
10
|
+
# @return [Hash] of exchange rates for selling and buying
|
11
|
+
# {
|
12
|
+
# { sell: { SYM: rate }, { SYM: rate }, ... },
|
13
|
+
# { buy: { SYM: rate }, { SYM: rate }, ... }
|
14
|
+
# }
|
15
|
+
def exchange_rates
|
16
|
+
@exchange_rates ||= parse(raw_exchange_rates)
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
# Send the request to URL and return the JSON response
|
22
|
+
# @return [Hash] JSON response of the exchange rates
|
23
|
+
# {
|
24
|
+
# "d"=> [
|
25
|
+
# {
|
26
|
+
# "__type"=>"LINKDev.CIB.CurrenciesFunds.CIBFund.CurrencyObject",
|
27
|
+
# "CurrencyID"=>"USD",
|
28
|
+
# "BuyRate"=>15.9,
|
29
|
+
# "SellRate"=>16.05
|
30
|
+
# }, {
|
31
|
+
# "__type"=>"LINKDev.CIB.CurrenciesFunds.CIBFund.CurrencyObject",
|
32
|
+
# "CurrencyID"=>"EUR",
|
33
|
+
# "BuyRate"=>17.1904,
|
34
|
+
# "SellRate"=>17.5234
|
35
|
+
# }, {
|
36
|
+
# ...
|
37
|
+
# }
|
38
|
+
# ]
|
39
|
+
# }
|
40
|
+
def raw_exchange_rates
|
41
|
+
req = Net::HTTP::Post.new(@uri, 'Content-Type' => 'application/json')
|
42
|
+
req.body = { lang: :en }.to_json
|
43
|
+
response = Net::HTTP.start(@uri.hostname, @uri.port) do |http|
|
44
|
+
http.request(req)
|
45
|
+
end
|
46
|
+
fail ResponseError, response.code unless response.is_a? Net::HTTPSuccess
|
47
|
+
response = JSON.parse(response.body)
|
48
|
+
|
49
|
+
# CIB provide 6 currencies only
|
50
|
+
unless response['d'] && response['d'].size >= 6
|
51
|
+
fail ResponseError, "Unknown JSON #{response}"
|
52
|
+
end
|
53
|
+
|
54
|
+
response
|
55
|
+
rescue JSON::ParserError
|
56
|
+
raise ResponseError, "Unknown JSON: #{response.body}"
|
57
|
+
end
|
58
|
+
|
59
|
+
# Parse the #raw_exchange_rates returned in response
|
60
|
+
# @return [Hash] of exchange rates for selling and buying
|
61
|
+
# {
|
62
|
+
# { sell: { SYM: rate }, { SYM: rate }, ... },
|
63
|
+
# { buy: { SYM: rate }, { SYM: rate }, ... }
|
64
|
+
# }
|
65
|
+
def parse(raw_data)
|
66
|
+
raw_data['d'].each_with_object(sell: {}, buy: {}) do |obj, result|
|
67
|
+
sell_rate = obj['SellRate']
|
68
|
+
buy_rate = obj['BuyRate']
|
69
|
+
currency = obj['CurrencyID'].to_sym
|
70
|
+
|
71
|
+
result[:sell][currency] = sell_rate
|
72
|
+
result[:buy][currency] = buy_rate
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
data/lib/egp_rates.rb
CHANGED