class Graphql::Generators::TypeGeneratorBase

Attributes

graphql_type[RW]

Public Class Methods

normalize_type_expression(type_expression, mode:, null: true) click to toggle source

Take a type expression in any combination of GraphQL or Ruby styles and return it in a specified output style TODO: nullability / list with `mode: :graphql` doesn't work @param type_expresson [String] @param mode [Symbol] @param null [Boolean] @return [(String, Boolean)] The type expression, followed by `null:` value

# File lib/generators/graphql/type_generator.rb, line 41
def self.normalize_type_expression(type_expression, mode:, null: true)
  if type_expression.start_with?("!")
    normalize_type_expression(type_expression[1..-1], mode: mode, null: false)
  elsif type_expression.end_with?("!")
    normalize_type_expression(type_expression[0..-2], mode: mode, null: false)
  elsif type_expression.start_with?("[") && type_expression.end_with?("]")
    name, is_null = normalize_type_expression(type_expression[1..-2], mode: mode, null: null)
    ["[#{name}]", is_null]
  elsif type_expression.end_with?("Type")
    normalize_type_expression(type_expression[0..-5], mode: mode, null: null)
  elsif type_expression.start_with?("Types::")
    normalize_type_expression(type_expression[7..-1], mode: mode, null: null)
  elsif type_expression.start_with?("types.")
    normalize_type_expression(type_expression[6..-1], mode: mode, null: null)
  else
    case mode
    when :ruby
      case type_expression
      when "Int"
        ["Integer", null]
      when "Integer", "Float", "Boolean", "String", "ID"
        [type_expression, null]
      else
        ["Types::#{type_expression.camelize}Type", null]
      end
    when :graphql
      [type_expression.camelize, null]
    else
      raise "Unexpected normalize mode: #{mode}"
    end
  end
end

Public Instance Methods

create_type_file() click to toggle source
# File lib/generators/graphql/type_generator.rb, line 30
def create_type_file
  template "#{graphql_type}.erb", "#{options[:directory]}/types#{subdirectory}/#{type_file_name}.rb"
end

Private Instance Methods

normalized_fields() click to toggle source

@return [Array<NormalizedField>] User-provided fields, in `(name, Ruby type name)` pairs

# File lib/generators/graphql/type_generator.rb, line 92
def normalized_fields
  @normalized_fields ||= fields.map { |f|
    name, raw_type = f.split(":", 2)
    type_expr, null = self.class.normalize_type_expression(raw_type, mode: :ruby)
    NormalizedField.new(name, type_expr, null)
  }
end
ruby_class_name() click to toggle source
# File lib/generators/graphql/type_generator.rb, line 100
def ruby_class_name
  class_prefix = 
    if options[:namespaced_types]
      "#{graphql_type.pluralize.camelize}::"
    else
      ""
    end
  @ruby_class_name || class_prefix + type_ruby_name.sub(/^Types::/, "")
end
subdirectory() click to toggle source
# File lib/generators/graphql/type_generator.rb, line 110
def subdirectory
  if options[:namespaced_types]
    "/#{graphql_type.pluralize}"
  else
    ""
  end
end
type_file_name() click to toggle source

@return [String] The user-provided type name, as a file name (without extension)

# File lib/generators/graphql/type_generator.rb, line 87
def type_file_name
  @type_file_name ||= "#{type_graphql_name}Type".underscore
end
type_graphql_name() click to toggle source

@return [String] The user-provided type name, as a GraphQL name

# File lib/generators/graphql/type_generator.rb, line 82
def type_graphql_name
  @type_graphql_name ||= self.class.normalize_type_expression(name, mode: :graphql)[0]
end
type_ruby_name() click to toggle source

@return [String] The user-provided type name, normalized to Ruby code

# File lib/generators/graphql/type_generator.rb, line 77
def type_ruby_name
  @type_ruby_name ||= self.class.normalize_type_expression(name, mode: :ruby)[0]
end