class Appsignal::Utils::SampleDataSanitizer

def inspected(value)

def inspected(value)
  "#<#{value.class}>"
end

def sanitize(value, filter_keys = [])

def sanitize(value, filter_keys = [])
  sanitize_value(value, filter_keys, [])
end

def sanitize_array(source, filter_keys, seen)

def sanitize_array(source, filter_keys, seen)
  seen = seen.clone << source.object_id
  [].tap do |array|
    source.each_with_index do |item, index|
      array[index] =
        if seen.include?(item.object_id)
          RECURSIVE
        else
          sanitize_value(item, filter_keys, seen)
        end
    end
  end
end

def sanitize_hash(source, filter_keys, seen)

def sanitize_hash(source, filter_keys, seen)
  seen = seen.clone << source.object_id
  {}.tap do |hash|
    source.each_pair do |key, value|
      hash[key] =
        if seen.include?(value.object_id)
          RECURSIVE
        elsif filter_keys.include?(key.to_s)
          FILTERED
        else
          sanitize_value(value, filter_keys, seen)
        end
    end
  end
end

def sanitize_value(value, filter_keys, seen)

def sanitize_value(value, filter_keys, seen)
  case value
  when Hash
    sanitize_hash(value, filter_keys, seen)
  when Array
    sanitize_array(value, filter_keys, seen)
  when TrueClass, FalseClass, NilClass, Integer, String, Symbol, Float
    unmodified(value)
  when Time
    "#<Time: #{value.iso8601}>"
  when Date
    "#<Date: #{value.iso8601}>"
  else
    if defined?(::Rack::Multipart::UploadedFile) &&
        value.is_a?(::Rack::Multipart::UploadedFile)
      "#<Rack::Multipart::UploadedFile " \
        "original_filename: #{value.original_filename.inspect}, " \
        "content_type: #{value.content_type.inspect}" \
        ">"
    elsif defined?(::ActionDispatch::Http::UploadedFile) &&
        value.is_a?(::ActionDispatch::Http::UploadedFile)
      "#<ActionDispatch::Http::UploadedFile " \
        "original_filename: #{value.original_filename.inspect}, " \
        "content_type: #{value.content_type.inspect}" \
        ">"
    else
      inspected(value)
    end
  end
end

def unmodified(value)

def unmodified(value)
  value
end