EGP_Rates 1.0.7 → 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,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dc0c2f82418e56933c9405f6873e9f9b1f0b6775
4
- data.tar.gz: 661e559e8c5adab660ea355035b6e94ae6751129
3
+ metadata.gz: 5e976dae1eab58fd31f597eea3578ccc57e7d3f8
4
+ data.tar.gz: a6dc1a5e24a3f346c2b76c94a9ccbcc7579e09a4
5
5
  SHA512:
6
- metadata.gz: 2c4a101d49cad29d9f165098e85dfc6b5962d6c2ac5bae078084667bce71b9ca5bcc42ea514b01b48fbf3ce4da7568dae0f5a35cbe6ea09d59679681b6fbdb2c
7
- data.tar.gz: f3198bd2ba87e4da26ea558013ea5994a984f29275016fd9f2b9e0c78485dc14898a458ac461d5084e2409fc68546d7d121a59ba57795a7e5c60d30fdd146932
6
+ metadata.gz: 5e923542f46a4232deb29b55c8c8945453cb2682851e70cbfb9162964f5cfc1d168996f597f71d63a2bf27b8c19c0eb81ddbf178fbde38a56d93a318358f1106
7
+ data.tar.gz: 102830270b29082b200f8a5f909351ac82fa392387691768d685215809af46e58640f34012cda9578b5bdc450d52d4ff67585e994a0500802ccf2957b8b29991
@@ -33,21 +33,21 @@ module EGPRates
33
33
  when /UAE|EMIRATES|Dirham|AED/i then :AED
34
34
  when /Australian/i then :AUD
35
35
  when /Bahrain|BHD/i then :BHD
36
- when /Canadian/i then :CAD
36
+ when /Canadian|CANAD\. Dollar/i then :CAD
37
37
  when /Swiss|CHF/i then :CHF
38
38
  when /Chinese/ then :CNY
39
39
  when /Danish/i then :DKK
40
40
  when /Euro|EUR/i then :EUR
41
- when /British|Sterling|GBP/i then :GBP
41
+ when /British|Sterl.|GBP/i then :GBP
42
42
  when /Jordanian/i then :JOD
43
43
  when /Japanese|JPY|YEN/i then :JPY
44
44
  when /Kuwait/i then :KWD
45
- when /Norwegian/i then :NOK
45
+ when /Norwegian|NORWEG\./i then :NOK
46
46
  when /Omani/i then :OMR
47
47
  when /Qatar/i then :QAR
48
48
  when /SAR|Saudi/i then :SAR
49
49
  when /Swidish|Swedish/i then :SEK
50
- when /US Dollar|USD/i then :USD
50
+ when /U(\.)?S(\.)? Dollar|USD/i then :USD
51
51
  else fail ResponseError, "Unknown currency #{currency}"
52
52
  end
53
53
  end
@@ -4,7 +4,7 @@ module EGPRates
4
4
  class FaisalBank < EGPRates::Bank
5
5
  def initialize
6
6
  @sym = :FaisalBank
7
- @uri = URI.parse('http://www.faisalbank.com.eg/FIB/arabic/rate.html')
7
+ @uri = URI.parse('https://online.faisalbank.com.eg/IB/.FIBUserServices/currencyXRate.do?op=getCurrencyExchangeRates&LangID=2')
8
8
  end
9
9
 
10
10
  # @return [Hash] of exchange rates for selling and buying
@@ -26,30 +26,10 @@ module EGPRates
26
26
  # ...
27
27
  # ]
28
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
29
+ table_rows = Oga.parse_html(response.body).css('.Action-Table td')
30
+ # each currency of the 13 provided in 5 table data
31
+ fail ResponseError, 'Unknown HTML' unless table_rows&.size == 13 * 5
32
+ table_rows.map(&:text).map(&:strip).each_slice(5)
53
33
  end
54
34
  end
55
35
  end
data/lib/egp_rates.rb CHANGED
@@ -15,7 +15,6 @@ require 'egp_rates/banque_du_caire'
15
15
  require 'egp_rates/suez_canal_bank'
16
16
  require 'egp_rates/al_baraka_bank'
17
17
  require 'egp_rates/al_ahli_bank_of_kuwait'
18
- require 'egp_rates/saib'
19
18
  require 'egp_rates/midb'
20
19
  require 'egp_rates/ube'
21
20
  require 'egp_rates/cae'
Binary file
@@ -36,11 +36,11 @@ describe EGPRates::FaisalBank do
36
36
  EGPRates::ResponseError, 'Unknown HTML'
37
37
  end
38
38
 
39
- it 'returns <#Enumerator::Lazy> of 9 rows',
39
+ it 'returns <#Enumerator::Lazy> of 13 rows',
40
40
  vcr: { cassette_name: :FaisalBank } do
41
- lazy_enumerator = bank.send(:raw_exchange_rates)
42
- expect(lazy_enumerator).to be_a Enumerator::Lazy
43
- expect(lazy_enumerator.size).to eq 13
41
+ enumerator = bank.send(:raw_exchange_rates)
42
+ expect(enumerator).to be_an Enumerator
43
+ expect(enumerator.size).to eq 13
44
44
  end
45
45
  end
46
46
 
@@ -49,37 +49,37 @@ describe EGPRates::FaisalBank do
49
49
 
50
50
  it 'returns sell: hash of selling prices' do
51
51
  expect(bank.send(:parse, raw_data)[:sell]).to match(
52
- AED: 4.9006,
53
- CAD: 13.5788,
54
- CHF: 17.8625,
55
- DKK: 2.5844,
56
- EUR: 19.224,
57
- GBP: 22.932,
58
- JPY: 0.1588,
59
- KWD: 59.0551,
60
- NOK: 2.1428,
61
- QAR: 4.9426,
62
- SAR: 4.825,
63
- SEK: 1.9604,
64
- USD: 18.0
52
+ AED: 4.2884,
53
+ CAD: 12.0616,
54
+ CHF: 15.7092,
55
+ DKK: 2.2495,
56
+ EUR: 16.7218,
57
+ GBP: 19.7899,
58
+ JPY: 0.140688,
59
+ KWD: 51.6902,
60
+ NOK: 1.8928,
61
+ QAR: 4.3251,
62
+ SAR: 4.2216,
63
+ SEK: 1.757,
64
+ USD: 15.75
65
65
  )
66
66
  end
67
67
 
68
68
  it 'returns buy: hash of buying prices' do
69
69
  expect(bank.send(:parse, raw_data)[:buy]).to match(
70
- AED: 4.7646,
71
- CAD: 13.1421,
72
- CHF: 17.2942,
73
- DKK: 2.4995,
74
- EUR: 18.5955,
75
- GBP: 22.0833,
76
- JPY: 0.15324,
77
- KWD: 57.377,
78
- NOK: 2.0682,
79
- QAR: 4.806,
80
- SAR: 4.6407,
81
- SEK: 1.8972,
82
- USD: 17.5
70
+ AED: 4.2611,
71
+ CAD: 11.932,
72
+ CHF: 15.5273,
73
+ DKK: 2.2224,
74
+ EUR: 16.5233,
75
+ GBP: 19.4796,
76
+ JPY: 0.139148,
77
+ KWD: 51.2409,
78
+ NOK: 1.8679,
79
+ QAR: 4.2983,
80
+ SAR: 4.151,
81
+ SEK: 1.7316,
82
+ USD: 15.65
83
83
  )
84
84
  end
85
85
  end
@@ -6,10 +6,10 @@ describe EGPRates do
6
6
  let(:bank) { double(EGPRates::Bank) }
7
7
 
8
8
  it 'calls #exchange_rates on all Bank Classes' do
9
- expect(described_class).to receive(:const_get).exactly(20).times
9
+ expect(described_class).to receive(:const_get).exactly(19).times
10
10
  .and_return bank
11
- expect(bank).to receive(:new).exactly(20).times.and_return bank
12
- expect(bank).to receive(:exchange_rates).exactly(20).times
11
+ expect(bank).to receive(:new).exactly(19).times.and_return bank
12
+ expect(bank).to receive(:exchange_rates).exactly(19).times
13
13
 
14
14
  described_class.exchange_rates
15
15
  end
data/spec/spec_helper.rb CHANGED
@@ -6,6 +6,7 @@ require 'vcr'
6
6
  require 'simplecov'
7
7
  SimpleCov.start do
8
8
  add_filter '/spec/'
9
+ add_filter '/.bundle/'
9
10
  end
10
11
 
11
12
  require 'egp_rates'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: EGP_Rates
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.7
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ahmed Abdel-Razzak
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-01-31 00:00:00.000000000 Z
11
+ date: 2017-02-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -190,7 +190,6 @@ files:
190
190
  - lib/egp_rates/midb.rb
191
191
  - lib/egp_rates/nbe.rb
192
192
  - lib/egp_rates/nbg.rb
193
- - lib/egp_rates/saib.rb
194
193
  - lib/egp_rates/suez_canal_bank.rb
195
194
  - lib/egp_rates/ube.rb
196
195
  - spec/cassettes/AAIB.gz
@@ -231,7 +230,6 @@ files:
231
230
  - spec/egp_rates/midb_spec.rb
232
231
  - spec/egp_rates/nbe_spec.rb
233
232
  - spec/egp_rates/nbg_spec.rb
234
- - spec/egp_rates/saib_spec.rb
235
233
  - spec/egp_rates/suez_canal_bank_spec.rb
236
234
  - spec/egp_rates/ube_spec.rb
237
235
  - spec/egp_rates_spec.rb
@@ -1,60 +0,0 @@
1
- # frozen_string_literal: true
2
- module EGPRates
3
- # Société Arabe Internationale de Banque (SAIB)
4
- class SAIB < EGPRates::Bank
5
- def initialize
6
- @sym = :SAIB
7
- @uri = URI.parse('http://www.saib.com.eg/foreign-currencies/')
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
- # "\n", "USD", "\n", "1605.00", "\n", "1675.00", "\n"
26
- # ], [
27
- # \n", "\xC2\xA0EUR", "\n", "1698", "\n", "1773", "\n
28
- # ]
29
- # ...
30
- # ]
31
- #
32
- def raw_exchange_rates
33
- table_rows = Oga.parse_html(response.body).css('.cont table tbody tr')
34
- # SAIB porvide 6 currencies on the home page but with header
35
- # and an empty row in the end
36
- fail ResponseError, 'Unknown HTML' unless table_rows&.size == 8
37
- table_rows.lazy.drop(1).take(6).map(&:children).map do |cell|
38
- cell.map(&:text)
39
- end
40
- end
41
-
42
- # Parse the #raw_exchange_rates returned in response
43
- # @param [Array] of the raw_data scraped
44
- # @return [Hash] of exchange rates for selling and buying
45
- # {
46
- # { sell: { SYM: rate }, { SYM: rate }, ... },
47
- # { buy: { SYM: rate }, { SYM: rate }, ... }
48
- # }
49
- def parse(raw_data)
50
- raw_data.each_with_object(sell: {}, buy: {}) do |row, result|
51
- sell_rate = (row[5].to_f / 100).round(4)
52
- buy_rate = (row[3].to_f / 100).round(4)
53
- currency = row[1].gsub(/\xC2\xA0/n, '').to_sym
54
-
55
- result[:sell][currency] = sell_rate
56
- result[:buy][currency] = buy_rate
57
- end
58
- end
59
- end
60
- end
@@ -1,77 +0,0 @@
1
- # frozen_string_literal: true
2
- describe EGPRates::SAIB do
3
- subject(:bank) { described_class.new }
4
-
5
- it 'Live Testing', :live do
6
- expect(bank.exchange_rates).to include(:buy, :sell)
7
- expect(bank.exchange_rates[:buy].size).to eq 6
8
- expect(bank.exchange_rates[:sell].size).to eq 6
9
- expect(bank.exchange_rates[:buy].keys).to include(
10
- :CHF, :EUR, :GBP, :KWD, :SAR, :USD
11
- )
12
- expect(bank.exchange_rates[:sell].keys).to include(
13
- :CHF, :EUR, :GBP, :KWD, :SAR, :USD
14
- )
15
- end
16
-
17
- describe '.new' do
18
- it 'initialize instance variables' do
19
- expect(bank.sym).to eq :SAIB
20
- expect(bank.instance_variable_get(:@uri)).to be_a URI
21
- end
22
- end
23
-
24
- describe '#exchange_rates' do
25
- it 'calls #parse with #raw_exchange_rates' do
26
- expect(bank).to receive(:raw_exchange_rates)
27
- expect(bank).to receive(:parse)
28
- bank.exchange_rates
29
- end
30
- end
31
-
32
- describe '#raw_exchange_rates' do
33
- it 'raises ResponseError unless Net::HTTPSuccess', :no_vcr do
34
- stub_request(:get, /.*saib.*/).to_return(body: '', status: 500)
35
- expect { bank.send(:raw_exchange_rates) }.to raise_error\
36
- EGPRates::ResponseError, '500'
37
- end
38
-
39
- it 'raises ResponseError if HTML structure changed', :no_vcr do
40
- stub_request(:get, /.*saib.*/).to_return(body: '', status: 200)
41
- expect { bank.send(:raw_exchange_rates) }.to raise_error\
42
- EGPRates::ResponseError, 'Unknown HTML'
43
- end
44
-
45
- it 'returns <#Enumerator::Lazy> of 6 rows', vcr: { cassette_name: :SAIB } do
46
- lazy_enumerator = bank.send(:raw_exchange_rates)
47
- expect(lazy_enumerator).to be_a Enumerator::Lazy
48
- expect(lazy_enumerator.size).to eq 6
49
- end
50
- end
51
-
52
- describe '#parse', vcr: { cassette_name: :SAIB } do
53
- let(:raw_data) { bank.send(:raw_exchange_rates) }
54
-
55
- it 'returns sell: hash of selling prices' do
56
- expect(bank.send(:parse, raw_data)[:sell]).to match(
57
- CHF: 17.98,
58
- EUR: 19.4,
59
- GBP: 22.95,
60
- KWD: 59.5,
61
- SAR: 4.83,
62
- USD: 18.15
63
- )
64
- end
65
-
66
- it 'returns buy: hash of buying prices' do
67
- expect(bank.send(:parse, raw_data)[:buy]).to match(
68
- CHF: 17.53,
69
- EUR: 18.91,
70
- GBP: 22.31,
71
- KWD: 58.22,
72
- SAR: 4.73,
73
- USD: 17.75
74
- )
75
- end
76
- end
77
- end