eba 2.0.2 → 2.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: c56777e9040d1597b33becb8043eb514fa610ebc
4
- data.tar.gz: 382aa6bf66a61e127f215535594b9b59f5433f0d
3
+ metadata.gz: 0f04a70c1137e9cac4b3d1d0ed11cc96a1b6b38b
4
+ data.tar.gz: f1a9fea0d47d4b88ed2052684b46f480f50b3a7a
5
5
  SHA512:
6
- metadata.gz: 4dc1de3cb1aa0d03cc2990dda14c2dcb5c01667b8e2fce69698e008252c9cfecbea67a70f421378ed776ccc6b7f9eafc8444000be8022b9bb9a7e55c1ce88c14
7
- data.tar.gz: efde2e490fde9f0c2fe212e4853f8e2a2d37d92b9712eddf749bce4d5277990c18e7a5d3ff2c9071b753137624bbb38f29f00e55a11cffebf9316999278f05f2
6
+ metadata.gz: 94a9d22b5394f400e9279f670fa75e42abb52070465e92a48d788befc53bee0e95fa67b5c1547359448a26efc8c0dbece52584625b708b4cd679198afb38321f
7
+ data.tar.gz: f6468f3cd7cfd3d2a73a4e0bdae468465097d23cf5a93f6ef85bb4b15e8bf10d43110bc3b90cbf2c95de5d93066d99318661fc9e8991707231e76adb53417c38
@@ -69,13 +69,25 @@ class BCB < Helper
69
69
  def get_last_value(series_code)
70
70
  begin
71
71
  response = @service.call(:get_ultimo_valor_xml, message: {in0: "#{series_code}"})
72
+ rescue HTTP::ConnectionError => e
73
+ puts "BCB Warning: hangup from source trying to get last value. Waiting and trying again."
74
+ sleep(1)
75
+
76
+ return get_last_value(series_code)
77
+
78
+ rescue OpenSSL::SSL::SSLError => e
79
+ puts "BCB Warning: hangup from source trying to get last value. Waiting and trying again."
80
+ sleep(1)
81
+
82
+ return get_last_value(series_code)
83
+
72
84
  rescue Exception => e
85
+ puts "BCB ERROR: #{e.message}\n#{e.backtrace}\n#{e.class}"
73
86
  return Data_bcb.invalid_data()
74
87
  end
75
88
 
76
89
  response = response.to_hash[:get_ultimo_valor_xml_response][:get_ultimo_valor_xml_return].sub("&",
77
90
  "-_1532_-")
78
-
79
91
  xmlResult = Nokogiri::XML(response)
80
92
 
81
93
  # As it's a brazillian database it's column identifications are in portuguese,
@@ -87,15 +99,7 @@ class BCB < Helper
87
99
  # MES = MONTH
88
100
  # ANO = YEAR
89
101
  # VALOR = VALUe
90
-
91
- return build_bcb_data(xmlResult.search("NOME").text.sub("-_1532_-", "&"),
92
- series_code,
93
- xmlResult.search("PERIODICIDADE").text,
94
- xmlResult.search("UNIDADE").text.sub("-_1532_-", "&"),
95
- xmlResult.search("DIA").text,
96
- xmlResult.search("MES").text,
97
- xmlResult.search("ANO").text,
98
- xmlResult.search("VALOR").text, false)
102
+ build_bcb_data(xmlResult)
99
103
  end
100
104
 
101
105
  # Ensure that date is in the format dd/MM/YYY
@@ -123,35 +127,38 @@ class BCB < Helper
123
127
  code_x_data[data.pk] = data
124
128
  end
125
129
 
126
- # Build the message from the start of the historical series
127
- message = {in0: {long: code_x_data.keys},
128
- in1: min_date,
129
- in2: max_date}
130
-
131
- result = send_message(message)
132
-
133
- if result != nil then
134
- i = 0
135
-
136
- result.css("SERIE").each do |serie|
137
- extract_an_item(serie, code_x_data, data_collection)
138
- i = i + 1
139
- end
130
+ scry_for_interval(min_date, max_date, code_x_data).each do |data|
131
+ data_collection << data
140
132
  end
141
133
  end
142
134
  end
143
135
 
144
- if data_collection.size == 0 && array_of_codes.size > 0 && @attempts < 5 then
145
- @attempts = @attempts + 1
136
+ data_collection
137
+ end
138
+
139
+ def scry_for_interval(min_date, max_date, code_x_data)
140
+ dc = []
141
+
142
+ # Build the message from the start of the historical series
143
+ message = {in0: {long: code_x_data.keys},
144
+ in1: min_date,
145
+ in2: max_date}
146
+
147
+ result = send_message(message)
146
148
 
147
- puts "BCB WARNING: No data returned for #{array_of_codes}. Trying again #{@attempts}/5"
148
- sleep(1 * @attempts)
149
+ if result != nil then
150
+ result.css("SERIE").each do |serie|
151
+ extract_an_item(serie, code_x_data, dc)
152
+ end
149
153
 
150
- data_collection = get_all_data_for_array(array_of_codes, min_date, max_date)
151
- @attemps = 0
154
+ if dc.size == 0 && code_x_data.keys.size > 0 then
155
+ result.css("SERIE").each do |serie|
156
+ extract_an_item(serie, code_x_data, dc)
157
+ end
158
+ end
152
159
  end
153
160
 
154
- data_collection
161
+ dc
155
162
  end
156
163
 
157
164
  def send_message(message)
@@ -161,6 +168,18 @@ class BCB < Helper
161
168
  begin
162
169
  response = @service.call(:get_valores_series_xml, message: message)
163
170
  result = Nokogiri::XML(response.to_hash[:get_valores_series_xml_response][:get_valores_series_xml_return])
171
+ rescue HTTP::ConnectionError => e
172
+ puts "BCB Warning: hangup from source trying to get all data. Waiting and trying again."
173
+ sleep(1)
174
+
175
+ result = send_message(message)
176
+
177
+ rescue OpenSSL::SSL::SSLError => e
178
+ puts "BCB Warning: hangup from source trying to get last value. Waiting and trying again."
179
+ sleep(1)
180
+
181
+ result = sent_message(message)
182
+
164
183
  rescue Exception => erro
165
184
  result = nil
166
185
  end
@@ -2,6 +2,8 @@
2
2
  # making it easier to group lots of data in a coese way, without lost of
3
3
  # information.
4
4
  class Data_bcb
5
+ attr_accessor :seasonally_adjusted, :name, :unit, :value, :periodicity
6
+
5
7
  @name = ""
6
8
  @periodicity = ""
7
9
  @unit = ""
@@ -12,17 +14,36 @@ class Data_bcb
12
14
 
13
15
  # Initialization is expected to express the state of a single row of
14
16
  # data inside the BCB's Database.
15
- def initialize(series_name, series_code, series_periodicity, series_unit,
16
- series_day, series_month, series_year, series_value, seasonally_adjusted)
17
-
18
- @name = series_name
19
- @pk = series_code
20
- @periodicity = series_periodicity.to_s
21
- @unit = series_unit
22
- @date = standardizes_date(series_day, series_month, series_year)
23
- @value = series_value.to_f
24
- @seasonally_adjusted = seasonally_adjusted
25
- end
17
+ def initialize(xmlResult)
18
+ if xmlResult.class.to_s.eql? 'Array' then
19
+ series_name, series_code, series_periodicity, series_unit,
20
+ series_day, series_month, series_year, series_value, seasonally_adjusted = xmlResult
21
+
22
+ @name = series_name
23
+ @pk = series_code
24
+ @periodicity = series_periodicity.to_s
25
+ @unit = series_unit
26
+ @date = standardizes_date(series_day, series_month, series_year)
27
+ @value = series_value.to_f
28
+ @seasonally_adjusted = seasonally_adjusted
29
+
30
+ else
31
+ begin
32
+ @name = xmlResult.search("NOME").text.sub("-_1532_-", "&")
33
+ @pk = xmlResult.search("CODIGO").text.to_i
34
+ @periodicity = xmlResult.search("PERIODICIDADE").text
35
+ @unit = xmlResult.search("UNIDADE").text.sub("-_1532_-", "&")
36
+ @date = standardizes_date(xmlResult.search("DIA").text,
37
+ xmlResult.search("MES").text,
38
+ xmlResult.search("ANO").text)
39
+ @value = xmlResult.search("VALOR").text
40
+ @seasonally_adjusted = false
41
+ rescue => e
42
+ puts e.message
43
+ puts e.backtrace
44
+ end
45
+ end
46
+ end
26
47
 
27
48
  # Return an "identification key" with data which should
28
49
  # be unique to a series (grouped).
@@ -31,7 +52,7 @@ class Data_bcb
31
52
  end
32
53
 
33
54
  def self.invalid_data()
34
- Data_bcb.new(nil, nil, nil, nil, 1, 1, 1900, 0, false)
55
+ Data_bcb.new([nil, nil, nil, nil, 1, 1, 1900, 0, false])
35
56
  end
36
57
 
37
58
  def is_valid?
@@ -77,7 +98,6 @@ class Data_bcb
77
98
 
78
99
  return true
79
100
  end
80
-
81
101
 
82
102
  # Note that there are no set methods in this class,
83
103
  # I built it in such a way that you are only intended
@@ -107,10 +127,6 @@ class Data_bcb
107
127
  return @value
108
128
  end
109
129
 
110
- def seasonally_adjusted
111
- return @seasonally_adjusted
112
- end
113
-
114
130
  # The Webservice will always supply the date in three separate fields,
115
131
  # this methods aim to convert it to a standard dd.mm.YYYY string.
116
132
  def standardizes_date(day, month, year)
@@ -5,26 +5,23 @@ class Helper < Encoder
5
5
  def initialize()
6
6
  end
7
7
 
8
- def build_bcb_data(name, code, periodicity, unit, day, month, year, value, is_unseasoned)
9
- if name[" - com ajuste sazonal"] != nil then
10
- is_unseasoned = true
8
+ def build_bcb_data(xml_result)
9
+ d = Data_bcb.new(xml_result)
11
10
 
12
- if is_unseasoned then
13
- name.slice!(" - com ajuste sazonal")
11
+ if d.name[" - com ajuste sazonal"] != nil then
12
+ d.seasonally_adjusted = true
13
+
14
+ if d.seasonally_adjusted then
15
+ d.name.slice!(" - com ajuste sazonal")
14
16
  end
15
17
  end
16
18
 
17
- encoded_name = encode(name)
18
- encoded_periodicity = encode(periodicity)
19
- encoded_unit = encode(unit)
20
- encoded_day = day
21
- encoded_month = month
22
- encoded_year = year
23
- encoded_value = encode(value)
19
+ d.name = encode(d.name)
20
+ d.periodicity = encode(d.periodicity)
21
+ d.unit = encode(d.unit)
22
+ d.value = encode(d.value)
24
23
 
25
- return Data_bcb.new(encoded_name, code, encoded_periodicity,
26
- encoded_unit, encoded_day, encoded_month,
27
- encoded_year, encoded_value, is_unseasoned)
24
+ return d
28
25
  end
29
26
 
30
27
  # Removes all invalid series from an array.
@@ -66,12 +63,12 @@ class Helper < Encoder
66
63
  ano = data[1]
67
64
  end
68
65
 
69
- collection << build_bcb_data(base_data.name, code,
70
- base_data.periodicity,
71
- base_data.unit,
72
- dia, mes, ano,
73
- item.css("VALOR").text,
74
- base_data.seasonally_adjusted)
66
+ collection << Data_bcb.new([base_data.name, code,
67
+ base_data.periodicity,
68
+ base_data.unit,
69
+ dia, mes, ano,
70
+ item.css("VALOR").text,
71
+ base_data.seasonally_adjusted])
75
72
  end
76
73
  else
77
74
  puts "ERROR BCB: Failure do locate #{code} in the data collection #{code_x_data_hash.keys}"
@@ -5,7 +5,7 @@ module Eba
5
5
  # ff - commits on feature
6
6
  # hh - commits on hotfix
7
7
 
8
- VERSION = "2.0.2"
8
+ VERSION = "2.1.0"
9
9
 
10
10
  #Version 1.0.1
11
11
  #
@@ -92,4 +92,7 @@ module Eba
92
92
 
93
93
  #Version 2.0.2
94
94
  # Improves reliability for getting data and identifying it.
95
+
96
+ #Version 2.1.0
97
+ # Implements handling of disconnects caused by the BCB webservice, getting data again and logging the event.
95
98
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eba
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.2
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rafael Campos Cruz
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-10-30 00:00:00.000000000 Z
11
+ date: 2019-11-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement