Module: GraphQL::Language

Included in:
StaticValidation::DirectivesAreInValidLocations
Defined in:
lib/graphql/language.rb,
lib/graphql/language/cache.rb,
lib/graphql/language/lexer.rb,
lib/graphql/language/nodes.rb,
lib/graphql/language/parser.rb,
lib/graphql/language/comment.rb,
lib/graphql/language/printer.rb,
lib/graphql/language/visitor.rb,
lib/graphql/language/generation.rb,
lib/graphql/language/block_string.rb,
lib/graphql/language/static_visitor.rb,
lib/graphql/language/definition_slice.rb,
lib/graphql/language/sanitized_printer.rb,
lib/graphql/language/document_from_schema_definition.rb
more...

Defined Under Namespace

Modules: BlockString, Comment, DefinitionSlice, Generation, Nodes Classes: Cache, DocumentFromSchemaDefinition, Lexer, Parser, Printer, SanitizedPrinter, StaticVisitor, Visitor

Constant Summary collapse

INVALID_NUMBER_FOLLOWED_BY_NAME_REGEXP =
%r{
(
  ((?<num>#{Lexer::INT_REGEXP}(#{Lexer::FLOAT_EXP_REGEXP})?)(?<name>#{Lexer::IDENTIFIER_REGEXP})#{Lexer::IGNORE_REGEXP}:)
  |
  ((?<num>#{Lexer::INT_REGEXP}#{Lexer::FLOAT_DECIMAL_REGEXP}#{Lexer::FLOAT_EXP_REGEXP})(?<name>#{Lexer::IDENTIFIER_REGEXP})#{Lexer::IGNORE_REGEXP}:)
  |
  ((?<num>#{Lexer::INT_REGEXP}#{Lexer::FLOAT_DECIMAL_REGEXP})(?<name>#{Lexer::IDENTIFIER_REGEXP})#{Lexer::IGNORE_REGEXP}:)
)}x

Class Method Summary collapse

Class Method Details

.add_space_between_numbers_and_names(query_str) ⇒ Object

[View source]

89
90
91
92
93
94
95
# File 'lib/graphql/language.rb', line 89

def self.add_space_between_numbers_and_names(query_str)
  if query_str.match?(INVALID_NUMBER_FOLLOWED_BY_NAME_REGEXP)
    query_str.gsub(INVALID_NUMBER_FOLLOWED_BY_NAME_REGEXP, "\\k<num> \\k<name>:")
  else
    query_str
  end
end

.escape_single_quoted_newlines(query_str) ⇒ String

Returns a new string if any single-quoted newlines were escaped. Otherwise, returns query_str unchanged.

Returns:

  • (String)
[View source]

47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/graphql/language.rb', line 47

def self.escape_single_quoted_newlines(query_str)
  scanner = StringScanner.new(query_str)
  inside_single_quoted_string = false
  new_query_str = nil
  while !scanner.eos?
    if scanner.skip(/(?:\\"|[^"\n\r]|""")+/m)
      new_query_str && (new_query_str << scanner.matched)
    elsif scanner.skip('"')
      new_query_str && (new_query_str << '"')
      inside_single_quoted_string = !inside_single_quoted_string
    elsif scanner.skip("\n")
      if inside_single_quoted_string
        new_query_str ||= query_str[0, scanner.pos - 1]
        new_query_str << '\\n'
      else
        new_query_str && (new_query_str << "\n")
      end
    elsif scanner.skip("\r")
      if inside_single_quoted_string
        new_query_str ||= query_str[0, scanner.pos - 1]
        new_query_str << '\\r'
      else
        new_query_str && (new_query_str << "\r")
      end
    elsif scanner.eos?
      break
    else
      raise ArgumentError, "Unmatchable string scanner segment: #{scanner.rest.inspect}"
    end
  end
  new_query_str || query_str
end

.serialize(value) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

[View source]

20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/graphql/language.rb', line 20

def self.serialize(value)
  if value.is_a?(Hash)
    serialized_hash = value.map do |k, v|
      "#{k}:#{serialize v}"
    end.join(",")

    "{#{serialized_hash}}"
  elsif value.is_a?(Array)
    serialized_array = value.map do |v|
      serialize v
    end.join(",")

    "[#{serialized_array}]"
  else
    JSON.generate(value, quirks_mode: true)
  end
rescue JSON::GeneratorError
  if Float::INFINITY == value
    "Infinity"
  else
    raise
  end
end