EGP_Rates 0.3.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: 67e2ffa9c086a7c6a6ae0a7c23603d48d0fd8126
4
- data.tar.gz: cef9ab2c432e9dda519a6bb7a910a547efe71aab
3
+ metadata.gz: e74254f42514b07497208b56180428b55ee1207c
4
+ data.tar.gz: 56de3e0b1021260b15d3046c563e339669ca672c
5
5
  SHA512:
6
- metadata.gz: 05722005a91509a13adea01a5ff0686633af1662f84042a7262cc6ebcd3f432fe4b2abfa75f1a2e8dc37e91c1dbb798ded05b3dcaba2ac6e1a14ed541bbb0c42
7
- data.tar.gz: a29e3075482b9d81fd76768dc4077909f38036c53f0a0c8f70152371bf5ad7dcb004b2299dac9307a8eceaf36348aff635ab25496142edd76aece62e06366bb0
6
+ metadata.gz: 62fb9d7476d250e3681ad735db2c0b11cb5b4a594d6c7c889717fa9f4b05670bf5af53cbbbf81ffae26309f3ceca6bc4eb7f03221ab8c87fac556f257ddf3858
7
+ data.tar.gz: fb3f12ce1ebdc53eb5700e71b51766ba08491c7e5b46a1549b2c85d9d9f38ec00dc6d5c696f6a45cbcde496d2f9ffcf03d4e4ddffb8fb13162e1d8cb26a8c383
@@ -48,24 +48,6 @@ module EGPRates
48
48
  table_rows.lazy.map(&:children).map { |cell| cell.map(&:text) }
49
49
  end
50
50
 
51
- # Convert currency string to ISO symbol
52
- # @param currency [String] "US Dollar"
53
- # @return [Symbol] :USD ISO currency name
54
- # rubocop:disable Metrics/CyclomaticComplexity
55
- def currency_symbol(currency)
56
- case currency
57
- when /US DOLLAR/ then :USD
58
- when /EURO/ then :EUR
59
- when /STERLING/ then :GBP
60
- when /SWISS/ then :CHF
61
- when /SAUDI/ then :SAR
62
- when /KUWAITI/ then :KWD
63
- when /DIRHAM/ then :AED
64
- else fail ResponseError, "Unknown currency #{currency}"
65
- end
66
- end
67
- # rubocop:enable Metrics/CyclomaticComplexity
68
-
69
51
  # Parse the #raw_exchange_rates returned in response
70
52
  # @param [Array] of the raw_data scraped
71
53
  # @return [Hash] of exchange rates for selling and buying
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+ module EGPRates
3
+ # Abu Dhabi Islamic Bank (ADIB)
4
+ class ADIB < EGPRates::Bank
5
+ def initialize
6
+ @sym = :ADIB
7
+ @uri = URI.parse('https://www.adib.eg/')
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
+ # ["\n", "USD", "\n", "17.0000", "\n", "17.5000", "\n"],
25
+ # ["\n", "GBP", "\n", "20.9049", "\n", "21.7630", "\n"],
26
+ # ...
27
+ # ]
28
+ def raw_exchange_rates
29
+ table_rows = Oga.parse_html(response.body).css('.CallUs tbody tr')
30
+ # ADIB porvide 5 currencies on the home page (and 4 rows of info)
31
+ fail ResponseError, 'Unknown HTML' unless table_rows&.size == 9
32
+ table_rows.lazy.drop(4).map(&:children).map { |cell| cell.map(&:text) }
33
+ end
34
+
35
+ # Parse the #raw_exchange_rates returned in response
36
+ # @param [Array] of the raw_data scraped
37
+ # @return [Hash] of exchange rates for selling and buying
38
+ # {
39
+ # { sell: { SYM: rate }, { SYM: rate }, ... },
40
+ # { buy: { SYM: rate }, { SYM: rate }, ... }
41
+ # }
42
+ def parse(raw_data)
43
+ raw_data.each_with_object(sell: {}, buy: {}) do |row, result|
44
+ sell_rate = row[5].to_f
45
+ buy_rate = row[3].to_f
46
+ currency = row[1].to_sym
47
+
48
+ result[:sell][currency] = sell_rate
49
+ result[:buy][currency] = buy_rate
50
+ end
51
+ end
52
+ end
53
+ end
@@ -30,8 +30,6 @@ module EGPRates
30
30
  # ]
31
31
  #
32
32
  def raw_exchange_rates
33
- response = Net::HTTP.get_response(@uri)
34
- fail ResponseError, response.code unless response.is_a? Net::HTTPSuccess
35
33
  table_rows = Oga.parse_html(response.body).css('.ORANGE_TEXT, .BLUE_TEXT')
36
34
  # AlAhliBankOfKuwait porvide 8 currencies on the home page
37
35
  fail ResponseError, 'Unknown HTML' unless table_rows&.size == 8
@@ -38,24 +38,6 @@ module EGPRates
38
38
  table_rows.lazy.drop(1).map(&:children).map { |cell| cell.map(&:text) }
39
39
  end
40
40
 
41
- # Convert currency string to ISO symbol
42
- # @param currency [String] "US Dollar"
43
- # @return [Symbol] :USD ISO currency name
44
- # rubocop:disable Metrics/CyclomaticComplexity
45
- def currency_symbol(currency)
46
- case currency
47
- when /USD/ then :USD
48
- when /EURO/ then :EUR
49
- when /GBP/ then :GBP
50
- when /CHF/ then :CHF
51
- when /JPY/ then :JPY
52
- when /SAR/ then :SAR
53
- when /BHD/ then :BHD
54
- else fail ResponseError, "Unknown currency #{currency}"
55
- end
56
- end
57
- # rubocop:enable Metrics/CyclomaticComplexity
58
-
59
41
  # Parse the #raw_exchange_rates returned in response
60
42
  # @param [Array] of the raw_data scraped
61
43
  # [
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+ module EGPRates
3
+ # Bank of Alexandria
4
+ class AlexBank < EGPRates::Bank
5
+ def initialize
6
+ @sym = :AlexBank
7
+ @uri = URI.parse('https://www.alexbank.com/En/Home/ExchangeRates')
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
+ # ["", "US Dollar", "", ..., "17.10000", "", "17.50000", ""]
24
+ # ["", "British Pound", "", ..., "21.12363", "", "21.60025", ""]
25
+ # ...
26
+ #
27
+ def raw_exchange_rates
28
+ # AlexBank provide 17 currencies (and 1 <th>)
29
+ table_rows = Oga.parse_html(response.body).css('.exchangerate-table tr')
30
+ fail ResponseError, 'Unknown HTML' unless table_rows&.size == 18
31
+ table_rows.lazy.drop(1).map(&:children).map do |cell|
32
+ cell.map(&:text).map(&:strip)
33
+ end
34
+ end
35
+
36
+ # Parse the #raw_exchange_rates returned in response
37
+ # @param [Array] of the raw_data scraped
38
+ # @return [Hash] of exchange rates for selling and buying
39
+ # {
40
+ # { sell: { SYM: rate }, { SYM: rate }, ... },
41
+ # { buy: { SYM: rate }, { SYM: rate }, ... }
42
+ # }
43
+ def parse(raw_data)
44
+ raw_data.each_with_object(sell: {}, buy: {}) do |row, result|
45
+ sell_rate = row[9].to_f
46
+ buy_rate = row[7].to_f
47
+ currency = currency_symbol(row[1])
48
+
49
+ result[:sell][currency] = sell_rate
50
+ result[:buy][currency] = buy_rate
51
+ end
52
+ end
53
+ end
54
+ end
@@ -23,6 +23,37 @@ module EGPRates
23
23
  response
24
24
  end
25
25
 
26
+ # Convert currency string to ISO symbol
27
+ # @param currency [String] "US Dollar"
28
+ # @return [Symbol] :USD ISO currency name
29
+ # rubocop:disable Metrics/CyclomaticComplexity
30
+ # rubocop:disable Metrics/MethodLength
31
+ def currency_symbol(currency)
32
+ case currency
33
+ when /UAE|EMIRATES|Dirham/i then :AED
34
+ when /Australian/i then :AUD
35
+ when /Bahrain|BHD/i then :BHD
36
+ when /Canadian/i then :CAD
37
+ when /Swiss|CHF/i then :CHF
38
+ when /Chinese/ then :CNY
39
+ when /Danish/i then :DKK
40
+ when /Euro|EUR/i then :EUR
41
+ when /British|Sterling|GBP/i then :GBP
42
+ when /Jordanian/i then :JOD
43
+ when /Japanese|JPY|YEN/i then :JPY
44
+ when /Kuwait/i then :KWD
45
+ when /Norwegian/i then :NOK
46
+ when /Omani/i then :OMR
47
+ when /Qatar/i then :QAR
48
+ when /SAR|Saudi/i then :SAR
49
+ when /Swidish|Swedish/i then :SEK
50
+ when /US Dollar|USD/i then :USD
51
+ else fail ResponseError, "Unknown currency #{currency}"
52
+ end
53
+ end
54
+ # rubocop:enable Metrics/CyclomaticComplexity
55
+ # rubocop:enable Metrics/MethodLength
56
+
26
57
  # Parse the #raw_exchange_rates returned in response
27
58
  # @param [Array] of the raw_data scraped
28
59
  # [
@@ -34,33 +34,5 @@ module EGPRates
34
34
  fail ResponseError, 'Unknown HTML' unless table_rows&.size == 19
35
35
  table_rows.lazy.drop(2).map(&:children).map { |cell| cell.map(&:text) }
36
36
  end
37
-
38
- # Convert currency string to ISO symbol
39
- # @param currency [String] "US Dollar"
40
- # @return [Symbol] :USD ISO currency name
41
- # rubocop:disable Metrics/CyclomaticComplexity
42
- def currency_symbol(currency)
43
- case currency
44
- when /EMIRATES/ then :AED
45
- when /AUSTRALIAN/ then :AUD
46
- when /BAHRAIN/ then :BHD
47
- when /CANADIAN/ then :CAD
48
- when /SWISS/ then :CHF
49
- when /DANISH/ then :DKK
50
- when /EURO/ then :EUR
51
- when /BRITISH/ then :GBP
52
- when /JORDANIAN/ then :JOD
53
- when /JAPANESE/ then :JPY
54
- when /KUWAITI/ then :KWD
55
- when /NORWEGIAN/ then :NOK
56
- when /OMANI/ then :OMR
57
- when /QATAR/ then :QAR
58
- when /SAUDI/ then :SAR
59
- when /SWEDISH/ then :SEK
60
- when /US DOLLAR/ then :USD
61
- else fail ResponseError, "Unknown currency #{currency}"
62
- end
63
- end
64
- # rubocop:enable Metrics/CyclomaticComplexity
65
37
  end
66
38
  end
@@ -48,7 +48,7 @@ module EGPRates
48
48
  when /AUSTRALIA/ then :AUD
49
49
  when /BAHRAIN/ then :BHD
50
50
  when /CANADA/ then :CAD
51
- when /SWEDISH/ then :CHF
51
+ when /SWISS/ then :CHF
52
52
  when /DENMARK/ then :DKK
53
53
  when /EURO/ then :EUR
54
54
  when /GB POUND/ then :GBP
@@ -59,7 +59,7 @@ module EGPRates
59
59
  when /OMAN/ then :OMR
60
60
  when /QATARI/ then :QAR
61
61
  when /SAUDI/ then :SAR
62
- when /SWISS/ then :SEK
62
+ when /SWEDISH/ then :SEK
63
63
  when /US DOLLAR/ then :USD
64
64
  else fail ResponseError, "Unknown currency #{currency}"
65
65
  end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+ module EGPRates
3
+ # Blom Bank Egypt
4
+ class Blom < EGPRates::Bank
5
+ def initialize
6
+ @sym = :Blom
7
+ @uri = URI.parse('http://www.blombankegypt.com/BlomEgypt/Exchange-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
+ # ["", "USD   02", "", "", "", ..., "17.0000", "", "17.7500", ""]
25
+ # ["", "EURO  30", "", "", "", ..., "17.9690", "", "18.8896", ""]
26
+ # ...
27
+ # ]
28
+ def raw_exchange_rates
29
+ table_rows = Oga.parse_html(response.body).css('.tableHolder').first
30
+ table_rows = table_rows&.css('tr')
31
+ # Blom porvide 14 currencies on the home page (and 2 <th>)
32
+ fail ResponseError, 'Unknown HTML' unless table_rows&.size == 16
33
+ table_rows.lazy.drop(2).map(&:children).map do |row|
34
+ row.map(&:text).map(&:strip)
35
+ end
36
+ end
37
+
38
+ # Parse the #raw_exchange_rates returned in response
39
+ # @param [Array] of the raw_data scraped
40
+ # @return [Hash] of exchange rates for selling and buying
41
+ # {
42
+ # { sell: { SYM: rate }, { SYM: rate }, ... },
43
+ # { buy: { SYM: rate }, { SYM: rate }, ... }
44
+ # }
45
+ def parse(raw_data)
46
+ raw_data.each_with_object(sell: {}, buy: {}) do |row, result|
47
+ sell_rate = row[11].to_f
48
+ buy_rate = row[9].to_f
49
+ currency = row[1][0..2].to_sym
50
+ currency = :JPY if currency == '100'.to_sym
51
+
52
+ result[:sell][currency] = sell_rate
53
+ result[:buy][currency] = buy_rate
54
+ end
55
+ end
56
+ end
57
+ end
data/lib/egp_rates/cae.rb CHANGED
@@ -26,8 +26,6 @@ module EGPRates
26
26
  # ...
27
27
  # ]
28
28
  def raw_exchange_rates
29
- response = Net::HTTP.get_response(@uri)
30
- fail ResponseError, response.code unless response.is_a? Net::HTTPSuccess
31
29
  table_rows = Oga.parse_html(response.body).css('#f_box option')
32
30
  # CAE porvide 17 currencies on the home page but with header
33
31
  # and an empty row in the end
data/lib/egp_rates/cbe.rb CHANGED
@@ -32,25 +32,5 @@ module EGPRates
32
32
  fail ResponseError, 'Unknown HTML' unless table_rows&.size == 9
33
33
  table_rows.lazy.map(&:children).map { |cell| cell.map(&:text) }
34
34
  end
35
-
36
- # Convert currency string to ISO symbol
37
- # @param currency [String] "US Dollar"
38
- # @return [Symbol] :USD ISO currency name
39
- # rubocop:disable Metrics/CyclomaticComplexity
40
- def currency_symbol(currency)
41
- case currency
42
- when /US Dollar/ then :USD
43
- when /Euro/ then :EUR
44
- when /Sterling/ then :GBP
45
- when /Swiss/ then :CHF
46
- when /Japanese/ then :JPY
47
- when /Saudi/ then :SAR
48
- when /Kuwait/ then :KWD
49
- when /UAE/ then :AED
50
- when /Chinese/ then :CNY
51
- else fail ResponseError, "Unknown currency #{currency}"
52
- end
53
- end
54
- # rubocop:enable Metrics/CyclomaticComplexity
55
35
  end
56
36
  end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+ module EGPRates
3
+ # Export Development Bank of Egypt (EDBE)
4
+ class EDBE < EGPRates::Bank
5
+ def initialize
6
+ @sym = :EDBE
7
+ @uri = URI.parse('http://www.edbebank.com/EN/BankingServices/TreasuryFiles/exchangerates.xml')
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 [Array<Oga::XML::Attribute>]
23
+ # [
24
+ # Attribute(name: "USDBbuy" value: "17.2500"),
25
+ # Attribute(name: "USDBsell" value: "17.7000"),
26
+ # Attribute(name: "USDTbuy" value: "17.2500"),
27
+ # Attribute(name: "USDTsell" value: "17.6000"),
28
+ # ...
29
+ # ]
30
+ def raw_exchange_rates
31
+ table_rows = Oga.parse_xml(response.body).xpath('Details/rates')
32
+ # EDBE porvide 5 as 20 XML attributes
33
+ fail ResponseError, 'Unknown HTML' unless table_rows&.size == 1
34
+ table_rows.flat_map(&:attributes).take(20)
35
+ end
36
+
37
+ # Parse the #raw_exchange_rates returned in response
38
+ # @param [Array] of the raw_data scraped
39
+ # @return [Hash] of exchange rates for selling and buying
40
+ # {
41
+ # { sell: { SYM: rate }, { SYM: rate }, ... },
42
+ # { buy: { SYM: rate }, { SYM: rate }, ... }
43
+ # }
44
+ def parse(raw_data)
45
+ raw_data.each_with_object(sell: {}, buy: {}) do |row, result|
46
+ next unless row.name[3] == 'B'
47
+ currency = row.name[0..2].to_sym
48
+ action = row.name[4..-1].to_sym
49
+ action_rate = row.value.to_f
50
+ action_rate = (action_rate * 100).round(4) if currency == :JPY
51
+
52
+ result[action][currency] = action_rate
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+ module EGPRates
3
+ # Egyptian Gulf Bank (EGB)
4
+ class EGB < EGPRates::Bank
5
+ def initialize
6
+ @sym = :EGB
7
+ @uri = URI.parse('https://eg-bank.com/ExchangeRates/ExchangeRates/')
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
+ # ["", "USD", "", "17.00", "", "17.75", ""],
25
+ # ["", "EUR", "", "17.9639", "", "18.8896", ""],
26
+ # ["", "GBP", "", "20.9049", "", "22.0739", ""],
27
+ # ...
28
+ # ]
29
+ def raw_exchange_rates
30
+ table_rows = Oga.parse_html(response.body).css('.row.row-wrapper')
31
+ # EGB porvide 17 currencies (and a header row)
32
+ fail ResponseError, 'Unknown HTML' unless table_rows&.size == 18
33
+ table_rows.lazy.drop(1).map(&:children).map do |cell|
34
+ cell.map(&:text).map(&:strip)
35
+ end
36
+ end
37
+
38
+ # Parse the #raw_exchange_rates returned in response
39
+ # @param [Array] of the raw_data scraped
40
+ # @return [Hash] of exchange rates for selling and buying
41
+ # {
42
+ # { sell: { SYM: rate }, { SYM: rate }, ... },
43
+ # { buy: { SYM: rate }, { SYM: rate }, ... }
44
+ # }
45
+ def parse(raw_data)
46
+ raw_data.each_with_object(sell: {}, buy: {}) do |row, result|
47
+ sell_rate = row[5].to_f
48
+ buy_rate = row[3].to_f
49
+ currency = row[1].to_sym
50
+
51
+ result[:sell][currency] = sell_rate
52
+ result[:buy][currency] = buy_rate
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+ module EGPRates
3
+ # Faisal Islamic Bank of Egypt
4
+ class FaisalBank < EGPRates::Bank
5
+ def initialize
6
+ @sym = :FaisalBank
7
+ @uri = URI.parse('http://www.faisalbank.com.eg/FIB/arabic/rate.html')
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
+ # ["", "USD", "", "17.2500", "", "17.7500", ...]
25
+ # ["", "SAR", "", "4.5745", "", "4.7849" ... ]
26
+ # ...
27
+ # ]
28
+ def raw_exchange_rates
29
+ table_rows = Oga.parse_html(response.body).css('.even')
30
+ # FaisalBank porvide 13 currencies
31
+ fail ResponseError, 'Unknown HTML' unless table_rows&.size == 13
32
+ table_rows.lazy.map(&:children).map do |cell|
33
+ cell.to_a.drop(2).map(&:text).map(&:strip)
34
+ end
35
+ end
36
+
37
+ # Parse the #raw_exchange_rates returned in response
38
+ # @param [Array] of the raw_data scraped
39
+ # @return [Hash] of exchange rates for selling and buying
40
+ # {
41
+ # { sell: { SYM: rate }, { SYM: rate }, ... },
42
+ # { buy: { SYM: rate }, { SYM: rate }, ... }
43
+ # }
44
+ def parse(raw_data)
45
+ raw_data.each_with_object(sell: {}, buy: {}) do |row, result|
46
+ sell_rate = row[5].to_f
47
+ buy_rate = row[3].to_f
48
+ currency = row[1].to_sym
49
+
50
+ result[:sell][currency] = sell_rate
51
+ result[:buy][currency] = buy_rate
52
+ end
53
+ end
54
+ end
55
+ end
@@ -29,8 +29,6 @@ module EGPRates
29
29
  # ...
30
30
  # ]
31
31
  def raw_exchange_rates
32
- response = Net::HTTP.get_response(@uri)
33
- fail ResponseError, response.code unless response.is_a? Net::HTTPSuccess
34
32
  table_rows = Oga.parse_html(response.body)
35
33
  .css('#MainContent_grdcurrency tr')
36
34
  # MIDB porvide 7 currencies on the home page but with header
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+ module EGPRates
3
+ # National Bank of Greece (NBG)
4
+ class NBG < EGPRates::Bank
5
+ def initialize
6
+ @sym = :NBG
7
+ @uri = URI.parse('http://www.nbg.com.eg/en/exchange-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
+ # ["", "US Dollar", "", "USD", "", "17.2000", "", "17.8000", ...]
25
+ # ["", "Euro", "", "EUR", "", "18.1030", "", "18.3039", ... ]
26
+ # ...
27
+ # ]
28
+ def raw_exchange_rates
29
+ table_rows = Oga.parse_html(response.body).css('.row_exchange')
30
+ # NBG porvide 9 currencies (and 2 header rows)
31
+ fail ResponseError, 'Unknown HTML' unless table_rows&.size == 11
32
+ table_rows.lazy.drop(2).map(&:children).map do |cell|
33
+ cell.map(&:text).map(&:strip)
34
+ end
35
+ end
36
+
37
+ # Parse the #raw_exchange_rates returned in response
38
+ # @param [Array] of the raw_data scraped
39
+ # @return [Hash] of exchange rates for selling and buying
40
+ # {
41
+ # { sell: { SYM: rate }, { SYM: rate }, ... },
42
+ # { buy: { SYM: rate }, { SYM: rate }, ... }
43
+ # }
44
+ def parse(raw_data)
45
+ raw_data.each_with_object(sell: {}, buy: {}) do |row, result|
46
+ sell_rate = row[7].to_f
47
+ buy_rate = row[5].to_f
48
+ currency = row[3].to_sym
49
+
50
+ result[:sell][currency] = sell_rate
51
+ result[:buy][currency] = buy_rate
52
+ end
53
+ end
54
+ end
55
+ end
@@ -30,8 +30,6 @@ module EGPRates
30
30
  # ]
31
31
  #
32
32
  def raw_exchange_rates
33
- response = Net::HTTP.get_response(@uri)
34
- fail ResponseError, response.code unless response.is_a? Net::HTTPSuccess
35
33
  table_rows = Oga.parse_html(response.body).css('.cont table tbody tr')
36
34
  # SAIB porvide 6 currencies on the home page but with header
37
35
  # and an empty row in the end
@@ -36,29 +36,6 @@ module EGPRates
36
36
  end
37
37
  # rubocop:enable Style/MultilineMethodCallIndentation
38
38
 
39
- # Convert currency string to ISO symbol
40
- # @param currency [String] "US Dollar"
41
- # @return [Symbol] :USD ISO currency name
42
- # rubocop:disable Metrics/CyclomaticComplexity
43
- def currency_symbol(currency)
44
- case currency
45
- when /UAE Dirham/ then :AED
46
- when /Australian/ then :AUD
47
- when /Canadian/ then :CAD
48
- when /Swiss/ then :CHF
49
- when /Danish/ then :DKK
50
- when /EUR/ then :EUR
51
- when /Sterling/ then :GBP
52
- when /YEN/ then :JPY
53
- when /Kuwaiti/ then :KWD
54
- when /Norwegian/ then :NOK
55
- when /Saudi/ then :SAR
56
- when /Swedish/ then :SEK
57
- when /US Dollar/ then :USD
58
- else fail ResponseError, "Unknown currency #{currency}"
59
- end
60
- end
61
-
62
39
  # Parse the #raw_exchange_rates returned in response
63
40
  # @param [Array] of the raw_data scraped
64
41
  # @return [Hash] of exchange rates for selling and buying
data/lib/egp_rates/ube.rb CHANGED
@@ -29,8 +29,6 @@ module EGPRates
29
29
  # ...
30
30
  # ]
31
31
  def raw_exchange_rates
32
- response = Net::HTTP.get_response(@uri)
33
- fail ResponseError, response.code unless response.is_a? Net::HTTPSuccess
34
32
  table_rows = Oga.parse_html(response.body).css('table tr')
35
33
  # UBE porvide 6 currencies on the home page but with header
36
34
  # and an empty row in the end