class DatasetExplorer::ItemCollector
Attributes
keys[R]
Public Class Methods
new()
click to toggle source
# File lib/dataset_explorer/item_collector.rb, line 5 def initialize @keys = [] @evaluators = {} end
Public Instance Methods
add(item)
click to toggle source
# File lib/dataset_explorer/item_collector.rb, line 20 def add(item) unless item.is_a?(Array) return add_item(item) end item.each do |i| add_item(i, '[]') end end
explain()
click to toggle source
# File lib/dataset_explorer/item_collector.rb, line 10 def explain {}.tap do |explanation| @evaluators.each do |field, evaluator| explanation[field] = evaluator.describe end end end
Private Instance Methods
add_item(item, prefix = nil)
click to toggle source
# File lib/dataset_explorer/item_collector.rb, line 32 def add_item(item, prefix = nil) new_values = item.keys.map do |key| map_keys(item[key], key, prefix) end.flatten.map(&:to_s).uniq @keys << new_values @keys = @keys.flatten.uniq end
behaves_like_array?(value)
click to toggle source
# File lib/dataset_explorer/item_collector.rb, line 87 def behaves_like_array?(value) value.respond_to?(:each) end
behaves_like_hash?(value)
click to toggle source
# File lib/dataset_explorer/item_collector.rb, line 83 def behaves_like_hash?(value) value.respond_to?(:keys) end
evaluator_for(field)
click to toggle source
# File lib/dataset_explorer/item_collector.rb, line 91 def evaluator_for(field) @evaluators[field.to_s] ||= ValueEvaluator.new(field) end
map_keys(value, key = nil, prefix = nil)
click to toggle source
rubocop:disable Metrics/MethodLength rubocop:disable Metrics/AbcSize
# File lib/dataset_explorer/item_collector.rb, line 43 def map_keys(value, key = nil, prefix = nil) prefix = [prefix, key].compact.join('.') unless mappable?(value) evaluator_for(prefix).evaluate(value) return prefix end if behaves_like_hash?(value) return value.keys.map do |sub_key| map_keys(value[sub_key], sub_key, prefix) end end if value.respond_to?(:each) prefix = "#{prefix}.[]" return [].tap do |keys| value.each do |item_value| keys << map_keys(item_value, nil, prefix) end end end raise Error, 'Unforseen scenario' end
mappable?(value)
click to toggle source
rubocop:enable Metrics/MethodLength rubocop:enable Metrics/AbcSize
# File lib/dataset_explorer/item_collector.rb, line 71 def mappable?(value) if behaves_like_hash?(value) return true end if behaves_like_array?(value) return true end false end