eba 1.9.8 → 1.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/eba/bcb.rb +85 -53
- data/lib/eba/version.rb +5 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6c8f8bfc9230658756c334083f0d367a98bfd6ea
|
4
|
+
data.tar.gz: 440a724553efb904de4814e2e6f10fea1774bc14
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b4efdde2ef97014e1b721f6b7289169698fa95136e4c842b47a1b0af4041314f410c92ca7ecec9a4313945ac2e3b71844c52fd81f7d70e6c36a320838913638e
|
7
|
+
data.tar.gz: 0ecf43867304d3234f38cf99db52ce327b7106314fa49702eb6f6e18d62063ff72901c2a4817ba364bbbdd015669935b395de6968191b20dde374f9ccb486d54
|
data/lib/eba/bcb.rb
CHANGED
@@ -65,12 +65,16 @@ class BCB < Encoder
|
|
65
65
|
|
66
66
|
purged_array_of_codes.each do |code|
|
67
67
|
dado = get_last_value(code)
|
68
|
-
|
69
|
-
if not result.key? dado.periodicity then
|
70
|
-
result[dado.periodicity] = []
|
71
|
-
end
|
72
68
|
|
73
|
-
|
69
|
+
if dado == nil then
|
70
|
+
puts "No valid last value for #{code}."
|
71
|
+
else
|
72
|
+
if not result.key? dado.periodicity then
|
73
|
+
result[dado.periodicity] = []
|
74
|
+
end
|
75
|
+
|
76
|
+
result[dado.periodicity] << dado
|
77
|
+
end
|
74
78
|
end
|
75
79
|
|
76
80
|
return result
|
@@ -101,8 +105,21 @@ class BCB < Encoder
|
|
101
105
|
def get_last_value(series_code)
|
102
106
|
begin
|
103
107
|
response = @service.call(:get_ultimo_valor_xml, message: {in0: "#{series_code}"})
|
108
|
+
|
104
109
|
rescue => e
|
105
|
-
|
110
|
+
if e.message.to_s["No such operation 'getUltimoValorXML'"] != nil ||
|
111
|
+
e.message.to_s["Server.userException"] != nil then
|
112
|
+
#This error is expetected, it only means that the code is invalid.
|
113
|
+
|
114
|
+
elsif e.message.to_s["nil:NilClass"] != nil ||
|
115
|
+
e.message.to_s["Connection reset by peer"] != nil then
|
116
|
+
sleep(1)
|
117
|
+
get_last_value(series_code)
|
118
|
+
|
119
|
+
else
|
120
|
+
puts "Error requesting last value.\nMessage: #{e.message}\nTrace: #{e.backtrace}"
|
121
|
+
end
|
122
|
+
|
106
123
|
return nil
|
107
124
|
end
|
108
125
|
|
@@ -133,7 +150,7 @@ class BCB < Encoder
|
|
133
150
|
# Ensure that date is in the format dd/MM/YYY
|
134
151
|
def get_all_data_for_array(array_of_codes, min_date, max_date = Time.now.strftime('%d/%m/%Y').to_s)
|
135
152
|
result = nil
|
136
|
-
data_collection = Array.new()
|
153
|
+
data_collection = Array.new()
|
137
154
|
|
138
155
|
# This request has a limit of series he can get at a time, thus
|
139
156
|
# it's way simpler to break a composite requests in various smaller
|
@@ -157,58 +174,73 @@ class BCB < Encoder
|
|
157
174
|
in1: min_date,
|
158
175
|
in2: max_date}
|
159
176
|
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
rescue Exception => erro
|
165
|
-
#The interval is empty, therefore an empty array should be returned.
|
166
|
-
if erro.to_s.include? "Value(s) not found" then
|
167
|
-
return []
|
168
|
-
else
|
169
|
-
puts "\n\nError requesting! #{erro}\nTrace: #{erro.backtrace}\n\n"
|
170
|
-
end
|
171
|
-
end
|
177
|
+
result = send_message(message)
|
178
|
+
|
179
|
+
if result != [] then
|
180
|
+
i = 0
|
172
181
|
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
# recover identifying data from the getLastValue method,
|
177
|
-
# as the get_valores_series_xml desn't have identifying data
|
178
|
-
# as series name, periodicity, etc.
|
179
|
-
base_data = data_array[i]
|
180
|
-
comp = 'name="ID" value="' + codes[i].to_s + '"'
|
181
|
-
|
182
|
-
if serie.inspect.include? comp
|
183
|
-
serie.css("ITEM").each do |item|
|
184
|
-
dia = "01"
|
185
|
-
mes = "1"
|
186
|
-
ano = "1"
|
187
|
-
data = item.css("DATA").text.split("/")
|
188
|
-
|
189
|
-
if base_data.periodicity == 'D' then
|
190
|
-
dia = data[0]
|
191
|
-
mes = data[1]
|
192
|
-
ano = data[2]
|
193
|
-
else
|
194
|
-
mes = data[0]
|
195
|
-
ano = data[1]
|
196
|
-
end
|
197
|
-
|
198
|
-
data_collection << build_bcb_data(base_data.name, codes[i],
|
199
|
-
base_data.periodicity,
|
200
|
-
base_data.unit,
|
201
|
-
dia, mes, ano,
|
202
|
-
item.css("VALOR").text,
|
203
|
-
base_data.seasonally_adjusted)
|
204
|
-
end
|
182
|
+
result.css("SERIE").each do |serie|
|
183
|
+
extract_an_item(serie, codes[i], data_array[i], data_collection)
|
184
|
+
i = i + 1
|
205
185
|
end
|
206
|
-
|
207
|
-
i = i + 1
|
208
186
|
end
|
209
187
|
end
|
210
188
|
end
|
211
189
|
|
212
190
|
return data_collection
|
213
191
|
end
|
192
|
+
|
193
|
+
def extract_an_item(serie, code, base_data, data_collection)
|
194
|
+
# recover identifying data from the getLastValue method,
|
195
|
+
# as the get_valores_series_xml desn't have identifying data
|
196
|
+
# as series name, periodicity, etc.
|
197
|
+
|
198
|
+
if serie.inspect["name=\"ID\" value=\"#{code}\""] != nil then
|
199
|
+
serie.css("ITEM").each do |item|
|
200
|
+
dia = "01"
|
201
|
+
mes = "1"
|
202
|
+
ano = "1"
|
203
|
+
data = item.css("DATA").text.split("/")
|
204
|
+
|
205
|
+
if base_data.periodicity == 'D' then
|
206
|
+
dia = data[0]
|
207
|
+
mes = data[1]
|
208
|
+
ano = data[2]
|
209
|
+
else
|
210
|
+
mes = data[0]
|
211
|
+
ano = data[1]
|
212
|
+
end
|
213
|
+
|
214
|
+
data_collection << build_bcb_data(base_data.name, code,
|
215
|
+
base_data.periodicity,
|
216
|
+
base_data.unit,
|
217
|
+
dia, mes, ano,
|
218
|
+
item.css("VALOR").text,
|
219
|
+
base_data.seasonally_adjusted)
|
220
|
+
end
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
def send_message(message)
|
225
|
+
# try and catch, as some series can be discontinued or a code may be broken
|
226
|
+
begin
|
227
|
+
response = @service.call(:get_valores_series_xml, message: message)
|
228
|
+
result = Nokogiri::XML(response.to_hash[:get_valores_series_xml_response][:get_valores_series_xml_return])
|
229
|
+
rescue Exception => erro
|
230
|
+
#The interval is empty, therefore an empty array should be returned.
|
231
|
+
if erro.to_s.include? "Value(s) not found" then
|
232
|
+
puts "Some of the codes might be invalid. Requested: #{message[:in0][:long]}."
|
233
|
+
return []
|
234
|
+
|
235
|
+
elsif erro.message.to_s["Socket closed"] != nil then
|
236
|
+
sleep(1)
|
237
|
+
puts "\n\nSocket closed for message #{message[:in0][:long]}, trying again."
|
238
|
+
send_message(message)
|
239
|
+
|
240
|
+
else
|
241
|
+
puts "\n\nError requesting all data for the range [#{min_date}, #{max_date}] for codes #{message[:in0][:long]}! #{erro}\nTrace: #{erro.backtrace}\nMessage: #{erro.message}\n"
|
242
|
+
return []
|
243
|
+
end
|
244
|
+
end
|
245
|
+
end
|
214
246
|
end
|
data/lib/eba/version.rb
CHANGED
@@ -5,7 +5,7 @@ module Eba
|
|
5
5
|
# ff - commits on feature
|
6
6
|
# hh - commits on hotfix
|
7
7
|
|
8
|
-
VERSION = "1.
|
8
|
+
VERSION = "1.10.0"
|
9
9
|
|
10
10
|
#Version 1.0.1
|
11
11
|
#
|
@@ -69,4 +69,8 @@ module Eba
|
|
69
69
|
|
70
70
|
#Version 1.9.8
|
71
71
|
# Improves logging by adding trace.
|
72
|
+
|
73
|
+
#Version 1.10.0
|
74
|
+
# Agressively handles connection errors with BCB webservice, due to detecting a huge
|
75
|
+
# ammount of hangups and such and such erros whilst using the gem.
|
72
76
|
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: 1.
|
4
|
+
version: 1.10.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: 2018-
|
11
|
+
date: 2018-08-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|