class GraphQL::RailsLogger::Subscriber

Public Instance Methods

start_processing(event) click to toggle source
# File lib/graphql/rails_logger/subscriber.rb, line 21
def start_processing(event)
  return unless logger.info?

  payload = event.payload
  params  = payload[:params].except(*INTERNAL_PARAMS)
  format  = payload[:format]
  format  = format.to_s.upcase if format.is_a?(Symbol)

  config = GraphQL::RailsLogger.configuration

  info "Processing by #{payload[:controller]}##{payload[:action]} as #{format}"

  if config.white_list.fetch(payload[:controller], []).include?(payload[:action])
    formatter = Rouge::Formatters::Terminal256.new(config.theme)
    query_lexer = Rouge::Lexers::GraphQL.new
    variables_lexer = Rouge::Lexers::Ruby.new

    (params['_json'] || [params.slice('query', 'variables', 'extensions')]).each do |data|

      next if config.skip_introspection_query && data['query'].index(/query IntrospectionQuery/)

      # Cleanup and indent params for logging
      query = indent(data.fetch('query', ''))
      variables = indent(pretty(data.fetch('variables', '')))
      extensions = indent(pretty(data.fetch('extensions', '')))

      info "\nVariables:\n#{formatter.format(variables_lexer.lex(variables))}" if variables.present?
      info "\nQuery:\n#{formatter.format(query_lexer.lex(query))}" if query.present?
      info "\nExtensions:\n#{formatter.format(variables_lexer.lex(extensions))}" if extensions.present?
    end
  else
    info "\nParameters:\n#{params.inspect}" unless params.empty?
  end
end

Private Instance Methods

indent(data) click to toggle source
# File lib/graphql/rails_logger/subscriber.rb, line 58
def indent(data)
  data.lines.map { |line| "  #{line}" }.join.chomp
end
pretty(data) click to toggle source
# File lib/graphql/rails_logger/subscriber.rb, line 62
def pretty(data)
  return '' if data.blank?

  data = JSON.parse(data) if data.is_a?(String)
  PP.pp(data, '')
end