Class: GraphQL::Upgrader::Transform

Inherits:
Object
  • Object
show all
Defined in:
lib/graphql/upgrader/member.rb

Instance Method Summary collapse

Instance Method Details

#apply(input_text) ⇒ String

Returns The input text, with a transformation applied if necessary.

Parameters:

  • input_text (String)

    Untransformed GraphQL-Ruby code

Returns:

  • (String)

    The input text, with a transformation applied if necessary

Raises:


15
16
17
# File 'lib/graphql/upgrader/member.rb', line 15

def apply(input_text)
  raise GraphQL::RequiredImplementationMissingError, "Return transformed text here"
end

#apply_processor(input_text, processor) ⇒ Object


74
75
76
77
78
79
80
81
82
# 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) ⇒ String

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

  • types[X] -> [X, null: true]
  • types[X.to_non_null_type] -> [X]
  • Int -> Integer
  • X! -> X

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

Parameters:

  • type_expr (String)

    A .define-ready expression of a return type or input type

Returns:

  • (String)

    A class-ready expression of the same type`


30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# 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:) ⇒ Object


84
85
86
87
88
89
90
91
92
93
# 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) ⇒ Object

Remove trailing whitespace


96
97
98
# File 'lib/graphql/upgrader/member.rb', line 96

def trim_lines(input_text)
  input_text.gsub(/ +$/, "")
end

#underscorize(str) ⇒ Object


67
68
69
70
71
72
# 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