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