eba 1.10.2 → 1.11.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 +32 -113
- data/lib/eba/data.rb +4 -0
- data/lib/eba/helper.rb +75 -0
- data/lib/eba/version.rb +5 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2026c412008409324969c24f09c9fa6b0eaf4f20
|
4
|
+
data.tar.gz: 0a431597ac2a25aff61ecf8ead7b3014671d22a5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 940c9aae47a31650a110bc12e938256e107a37d5664037395dd893cf5d6bce5e77ec889fd92cd5253b275c8ac7d4223ac9d36e540fad9eb6b5557fd29fa0c485
|
7
|
+
data.tar.gz: 5d4f61453fb3b7ec6efc3cba12f0967d99669adc05093d6007f4c9072f85f59751b056d71ceeed5e9eeffa3623563ef1128a6c6223f60fe2bb097b074d630d5b
|
data/lib/eba/bcb.rb
CHANGED
@@ -2,11 +2,10 @@ require "savon"
|
|
2
2
|
require "net/https"
|
3
3
|
require "nokogiri"
|
4
4
|
require "date"
|
5
|
-
require_relative "encoder"
|
6
|
-
require_relative "data"
|
7
5
|
|
8
|
-
|
6
|
+
require_relative "helper"
|
9
7
|
|
8
|
+
class BCB < Helper
|
10
9
|
################################################################################################
|
11
10
|
# #
|
12
11
|
# You MUST supply a valid certificate in order for the connection to work! #
|
@@ -27,6 +26,7 @@ class BCB < Encoder
|
|
27
26
|
|
28
27
|
def initialize(path_to_certificate)
|
29
28
|
@pub_key = path_to_certificate
|
29
|
+
|
30
30
|
connect_to_service()
|
31
31
|
end
|
32
32
|
|
@@ -44,87 +44,44 @@ class BCB < Encoder
|
|
44
44
|
return @service.operations
|
45
45
|
end
|
46
46
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
def purge_invalid_series(array_of_codes)
|
51
|
-
result = []
|
52
|
-
|
47
|
+
def hash_last_value_with_code(array_of_codes)
|
48
|
+
result = {}
|
49
|
+
|
53
50
|
array_of_codes.each do |code|
|
54
|
-
|
55
|
-
result << code
|
56
|
-
end
|
51
|
+
result[code] = get_last_value(code)
|
57
52
|
end
|
58
53
|
|
59
|
-
|
54
|
+
result
|
60
55
|
end
|
61
56
|
|
62
57
|
def hash_by_periodicity(array_of_codes)
|
63
|
-
|
58
|
+
last_values = hash_last_value_with_code(array_of_codes)
|
59
|
+
purged_array_of_codes = purge_invalid_series(array_of_codes, last_values)
|
64
60
|
result = {}
|
65
61
|
|
66
62
|
purged_array_of_codes.each do |code|
|
67
|
-
dado =
|
68
|
-
|
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
|
63
|
+
dado = last_values[code]
|
75
64
|
|
76
|
-
|
65
|
+
if not result.key? dado.periodicity then
|
66
|
+
result[dado.periodicity] = []
|
77
67
|
end
|
78
|
-
end
|
79
|
-
|
80
|
-
return result
|
81
|
-
end
|
82
68
|
|
83
|
-
|
84
|
-
if is_unseasoned == nil then
|
85
|
-
is_unseasoned = name.include? " - com ajuste sazonal"
|
86
|
-
|
87
|
-
if is_unseasoned then
|
88
|
-
name.slice! " - com ajuste sazonal"
|
89
|
-
end
|
69
|
+
result[dado.periodicity] << dado
|
90
70
|
end
|
91
71
|
|
92
|
-
|
93
|
-
encoded_periodicity = encode(periodicity)
|
94
|
-
encoded_unit = encode(unit)
|
95
|
-
encoded_day = day
|
96
|
-
encoded_month = month
|
97
|
-
encoded_year = year
|
98
|
-
encoded_value = encode(value)
|
99
|
-
|
100
|
-
return Data_bcb.new(encoded_name, code, encoded_periodicity,
|
101
|
-
encoded_unit, encoded_day, encoded_month,
|
102
|
-
encoded_year, encoded_value, is_unseasoned)
|
72
|
+
return result
|
103
73
|
end
|
104
74
|
|
75
|
+
|
105
76
|
def get_last_value(series_code)
|
106
77
|
begin
|
107
78
|
response = @service.call(:get_ultimo_valor_xml, message: {in0: "#{series_code}"})
|
108
|
-
|
109
79
|
rescue Exception => e
|
110
|
-
|
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 ||
|
116
|
-
e.message.to_s["Failed to open TCP connection"] != nil ||
|
117
|
-
e.message.to_s["Socket closed"] != nil then
|
118
|
-
puts "Will have to try last value again for #{series_code}, webservice dropped the ball.\nError: #{e.message}"
|
119
|
-
|
120
|
-
else
|
121
|
-
puts "Error requesting last value.\nMessage: #{e.message}\nTrace: #{e.backtrace}"
|
122
|
-
end
|
123
|
-
|
124
|
-
return nil
|
80
|
+
return Data_bcb.invalid_data()
|
125
81
|
end
|
126
82
|
|
127
|
-
response = response.to_hash[:get_ultimo_valor_xml_response][:get_ultimo_valor_xml_return].sub("&",
|
83
|
+
response = response.to_hash[:get_ultimo_valor_xml_response][:get_ultimo_valor_xml_return].sub("&",
|
84
|
+
"-_1532_-")
|
128
85
|
|
129
86
|
xmlResult = Nokogiri::XML(response)
|
130
87
|
|
@@ -139,13 +96,13 @@ class BCB < Encoder
|
|
139
96
|
# VALOR = VALUe
|
140
97
|
|
141
98
|
return build_bcb_data(xmlResult.search("NOME").text.sub("-_1532_-", "&"),
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
99
|
+
series_code,
|
100
|
+
xmlResult.search("PERIODICIDADE").text,
|
101
|
+
xmlResult.search("UNIDADE").text.sub("-_1532_-", "&"),
|
102
|
+
xmlResult.search("DIA").text,
|
103
|
+
xmlResult.search("MES").text,
|
104
|
+
xmlResult.search("ANO").text,
|
105
|
+
xmlResult.search("VALOR").text, false)
|
149
106
|
end
|
150
107
|
|
151
108
|
# Ensure that date is in the format dd/MM/YYY
|
@@ -177,7 +134,7 @@ class BCB < Encoder
|
|
177
134
|
|
178
135
|
result = send_message(message)
|
179
136
|
|
180
|
-
if result !=
|
137
|
+
if result != nil then
|
181
138
|
i = 0
|
182
139
|
|
183
140
|
result.css("SERIE").each do |serie|
|
@@ -191,55 +148,17 @@ class BCB < Encoder
|
|
191
148
|
return data_collection
|
192
149
|
end
|
193
150
|
|
194
|
-
def extract_an_item(serie, code, base_data, data_collection)
|
195
|
-
# recover identifying data from the getLastValue method,
|
196
|
-
# as the get_valores_series_xml desn't have identifying data
|
197
|
-
# as series name, periodicity, etc.
|
198
|
-
|
199
|
-
if serie.inspect["name=\"ID\" value=\"#{code}\""] != nil then
|
200
|
-
serie.css("ITEM").each do |item|
|
201
|
-
dia = "01"
|
202
|
-
mes = "1"
|
203
|
-
ano = "1"
|
204
|
-
data = item.css("DATA").text.split("/")
|
205
|
-
|
206
|
-
if base_data.periodicity == 'D' then
|
207
|
-
dia = data[0]
|
208
|
-
mes = data[1]
|
209
|
-
ano = data[2]
|
210
|
-
else
|
211
|
-
mes = data[0]
|
212
|
-
ano = data[1]
|
213
|
-
end
|
214
|
-
|
215
|
-
data_collection << build_bcb_data(base_data.name, code,
|
216
|
-
base_data.periodicity,
|
217
|
-
base_data.unit,
|
218
|
-
dia, mes, ano,
|
219
|
-
item.css("VALOR").text,
|
220
|
-
base_data.seasonally_adjusted)
|
221
|
-
end
|
222
|
-
end
|
223
|
-
end
|
224
|
-
|
225
151
|
def send_message(message)
|
152
|
+
result = nil
|
153
|
+
|
226
154
|
# try and catch, as some series can be discontinued or a code may be broken
|
227
155
|
begin
|
228
156
|
response = @service.call(:get_valores_series_xml, message: message)
|
229
157
|
result = Nokogiri::XML(response.to_hash[:get_valores_series_xml_response][:get_valores_series_xml_return])
|
230
158
|
rescue Exception => erro
|
231
|
-
|
232
|
-
if erro.to_s.include? "Value(s) not found" then
|
233
|
-
puts "Some of the codes might be invalid. Requested: #{message[:in0][:long]}."
|
234
|
-
return []
|
235
|
-
|
236
|
-
elsif erro.message.to_s["Socket closed"] != nil then
|
237
|
-
puts "\n\nSocket closed for message #{message[:in0][:long]}, try again."
|
238
|
-
|
239
|
-
else
|
240
|
-
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"
|
241
|
-
return []
|
242
|
-
end
|
159
|
+
result = nil
|
243
160
|
end
|
161
|
+
|
162
|
+
result
|
244
163
|
end
|
245
164
|
end
|
data/lib/eba/data.rb
CHANGED
data/lib/eba/helper.rb
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
require_relative "data"
|
2
|
+
require_relative "encoder"
|
3
|
+
|
4
|
+
class Helper < Encoder
|
5
|
+
def initialize()
|
6
|
+
end
|
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
|
11
|
+
|
12
|
+
if is_unseasoned then
|
13
|
+
name.slice!(" - com ajuste sazonal")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
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)
|
24
|
+
|
25
|
+
return Data_bcb.new(encoded_name, code, encoded_periodicity,
|
26
|
+
encoded_unit, encoded_day, encoded_month,
|
27
|
+
encoded_year, encoded_value, is_unseasoned)
|
28
|
+
end
|
29
|
+
|
30
|
+
# Removes all invalid series from an array.
|
31
|
+
#
|
32
|
+
# An invalid series has last value.
|
33
|
+
def purge_invalid_series(array_of_codes, hash_last_values)
|
34
|
+
result = []
|
35
|
+
|
36
|
+
array_of_codes.each do |code|
|
37
|
+
if hash_last_values[code] != nil then
|
38
|
+
result << code
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
return result
|
43
|
+
end
|
44
|
+
|
45
|
+
def extract_an_item(serie, code, base_data, data_collection)
|
46
|
+
# recover identifying data from the getLastValue method,
|
47
|
+
# as the get_valores_series_xml desn't have identifying data
|
48
|
+
# as series name, periodicity, etc.
|
49
|
+
|
50
|
+
if serie.inspect["name=\"ID\" value=\"#{code}\""] != nil then
|
51
|
+
serie.css("ITEM").each do |item|
|
52
|
+
dia = "01"
|
53
|
+
mes = "1"
|
54
|
+
ano = "1"
|
55
|
+
data = item.css("DATA").text.split("/")
|
56
|
+
|
57
|
+
if base_data.periodicity == 'D' then
|
58
|
+
dia = data[0]
|
59
|
+
mes = data[1]
|
60
|
+
ano = data[2]
|
61
|
+
else
|
62
|
+
mes = data[0]
|
63
|
+
ano = data[1]
|
64
|
+
end
|
65
|
+
|
66
|
+
data_collection << build_bcb_data(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)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
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.11.0"
|
9
9
|
|
10
10
|
#Version 1.0.1
|
11
11
|
#
|
@@ -79,4 +79,8 @@ module Eba
|
|
79
79
|
|
80
80
|
#Version 1.10.2
|
81
81
|
# Adds "Socket closed" error to last value expcetion handling.
|
82
|
+
|
83
|
+
#Versuib 1.11.0
|
84
|
+
# Refactors and simplifies interactions with target webservice. Methods no longer return nil,
|
85
|
+
# but an invalid Data_bcb object.
|
82
86
|
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.11.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-08-
|
11
|
+
date: 2018-08-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
@@ -116,6 +116,7 @@ files:
|
|
116
116
|
- lib/eba/bcb.rb
|
117
117
|
- lib/eba/data.rb
|
118
118
|
- lib/eba/encoder.rb
|
119
|
+
- lib/eba/helper.rb
|
119
120
|
- lib/eba/version.rb
|
120
121
|
homepage: https://github.com/rCamposCruz/eba
|
121
122
|
licenses:
|