class GraphQL::Upgrader::Transform

Public Instance Methods

apply(input_text) click to toggle source

@param input_text [String] Untransformed GraphQL-Ruby code @return [String] The input text, with a transformation applied if necessary

# File lib/graphql/upgrader/member.rb, line 15
def apply(input_text)
  raise NotImplementedError, "Return transformed text here"
end
apply_processor(input_text, processor) click to toggle source
# File lib/graphql/upgrader/member.rb, line 74
def apply_processor(input_text, processor)
  ruby_ast = Parser::CurrentRuby.parse(input_text)
  processor.process(ruby_ast)
  processor
rescue Parser::SyntaxError
  puts "Error text:"
  puts input_text
  raise
end
normalize_type_expression(type_expr, preserve_bang: false) click to toggle source

Recursively transform a `.define`-DSL-based type expression into a class-ready expression, for example:

  • `types` -> `[X, null: true]`

  • `types` -> `[X]`

  • `Int` -> `Integer`

  • `X!` -> `X`

Notice that `!` is removed sometimes, because it doesn't exist in the class API.

@param type_expr [String] A `.define`-ready expression of a return type or input type @return [String] A class-ready expression of the same type`

# File lib/graphql/upgrader/member.rb, line 30
def normalize_type_expression(type_expr, preserve_bang: false)
  case type_expr
  when /\A!/
    # Handle the bang, normalize the inside
    "#{preserve_bang ? "!" : ""}#{normalize_type_expression(type_expr[1..-1], preserve_bang: preserve_bang)}"
  when /\Atypes\[.*\]\Z/
    # Unwrap the brackets, normalize, then re-wrap
    inner_type = type_expr[6..-2]
    if inner_type.start_with?("!")
      nullable = false
      inner_type = inner_type[1..-1]
    elsif inner_type.end_with?(".to_non_null_type")
      nullable = false
      inner_type = inner_type[0...-17]
    else
      nullable = true
    end

    "[#{normalize_type_expression(inner_type, preserve_bang: preserve_bang)}#{nullable ? ", null: true" : ""}]"
  when /\Atypes\./
    # Remove the prefix
    normalize_type_expression(type_expr[6..-1], preserve_bang: preserve_bang)
  when /\A->/
    # Remove the proc wrapper, don't re-apply it
    # because stabby is not supported in class-based definition
    # (and shouldn't ever be necessary)
    unwrapped = type_expr
      .sub(/\A->\s?\{\s*/, "")
      .sub(/\s*\}/, "")
    normalize_type_expression(unwrapped, preserve_bang: preserve_bang)
  when "Int"
    "Integer"
  else
    type_expr
  end
end
reindent_lines(input_text, from_indent:, to_indent:) click to toggle source
# File lib/graphql/upgrader/member.rb, line 84
def reindent_lines(input_text, from_indent:, to_indent:)
  prev_indent = " " * from_indent
  next_indent = " " * to_indent
  # For each line, remove the previous indent, then add the new indent
  lines = input_text.split("\n").map do |line|
    line = line.sub(prev_indent, "")
    "#{next_indent}#{line}".rstrip
  end
  lines.join("\n")
end
trim_lines(input_text) click to toggle source

Remove trailing whitespace

# File lib/graphql/upgrader/member.rb, line 96
def trim_lines(input_text)
  input_text.gsub(/ +$/, "")
end
underscorize(str) click to toggle source
# File lib/graphql/upgrader/member.rb, line 67
def underscorize(str)
  str
    .gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2') # URLDecoder -> URL_Decoder
    .gsub(/([a-z\d])([A-Z])/,'\1_\2')     # someThing -> some_Thing
    .downcase
end