From ddbfedc97c5add661286d0f12c4ac98275dbeb82 Mon Sep 17 00:00:00 2001 From: Saku Ytti Date: Mon, 13 Feb 2017 00:08:48 +0200 Subject: add support for hierarchical keys in json requestd in issue #695 --- lib/oxidized/source/http.rb | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) (limited to 'lib/oxidized/source') diff --git a/lib/oxidized/source/http.rb b/lib/oxidized/source/http.rb index 4fd388b..48ee8a4 100644 --- a/lib/oxidized/source/http.rb +++ b/lib/oxidized/source/http.rb @@ -35,19 +35,21 @@ class HTTP < Source response = http.request(request) data = JSON.parse(response.body) - data.each do |line| - next if line.empty? + data.each do |node| + next if node.empty? # map node parameters keys = {} - @cfg.map.each do |key, position| - keys[key.to_sym] = node_var_interpolate line[position] + @cfg.map.each do |key, want_position| + want_positions = want_position.split('.') + keys[key.to_sym] = node_var_interpolate node.dig(*want_positions) end keys[:model] = map_model keys[:model] if keys.key? :model # map node specific vars vars = {} - @cfg.vars_map.each do |key, position| - vars[key.to_sym] = node_var_interpolate line[position] + @cfg.vars_map.each do |key, want_position| + want_positions = want_position.split('.') + vars[key.to_sym] = node_var_interpolate node.dig(*want_positions) end keys[:vars] = vars unless vars.empty? @@ -58,3 +60,18 @@ class HTTP < Source end end + +if RUBY_VERSION < '2.3' + class Hash + def dig(key, *rest) + value = self[key] + if value.nil? || rest.empty? + value + elsif value.respond_to?(:dig) + value.dig(*rest) + else + fail TypeError, "#{value.class} does not have #dig method" + end + end + end +end -- cgit v1.2.1 From 3d3a308faae69572ac17fd6c44ac726d0a958cf9 Mon Sep 17 00:00:00 2001 From: Saku Ytti Date: Mon, 13 Feb 2017 00:16:53 +0200 Subject: don't fail on poor json location specification --- lib/oxidized/source/http.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib/oxidized/source') diff --git a/lib/oxidized/source/http.rb b/lib/oxidized/source/http.rb index 48ee8a4..7186f98 100644 --- a/lib/oxidized/source/http.rb +++ b/lib/oxidized/source/http.rb @@ -69,8 +69,8 @@ if RUBY_VERSION < '2.3' value elsif value.respond_to?(:dig) value.dig(*rest) - else - fail TypeError, "#{value.class} does not have #dig method" + else # foo.bar.baz (bar exist but is not hash) + return nil end end end -- cgit v1.2.1