eba 1.9.8 → 1.10.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 +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
|