class GQLi::Client

GraphQL HTTP Client

Attributes

headers[R]
options[R]
params[R]
schema[R]
url[R]
validate_query[R]

Public Class Methods

new(url, params: {}, headers: {}, validate_query: true, options: {}) click to toggle source
# File lib/gqli/client.rb, line 14
def initialize(url, params: {}, headers: {}, validate_query: true, options: {})
  @url = url
  @params = params
  @headers = headers
  @validate_query = validate_query
  @options = options
  @options[:read_timeout] ||= 60
  @options[:write_timeout] ||= 60
  @options[:connect_timeout] ||= 60

  @schema = Introspection.new(self) if validate_query
end

Public Instance Methods

execute(query) click to toggle source

Executes a query If validations are enabled, will perform validation check before request.

# File lib/gqli/client.rb, line 29
def execute(query)
  if validate_query
    validation = schema.validate(query)
    fail validation_error_message(validation) unless validation.valid?
  end

  execute!(query)
end
execute!(query) click to toggle source

Executres a query Ignores validations

# File lib/gqli/client.rb, line 40
def execute!(query)
  http_response = request.post(@url, params: @params, json: { query: query.to_gql })

  fail "Error: #{http_response.reason}\nBody: #{http_response.body}" if http_response.status >= 300

  parsed_response = JSON.parse(http_response.to_s)
  data = parsed_response['data']
  errors = parsed_response['errors']

  Response.new(data, errors, query)
end
request() click to toggle source
# File lib/gqli/client.rb, line 59
def request
  HTTP.headers(request_headers).timeout(timeout_options)
end
valid?(query) click to toggle source

Validates a query against the schema

# File lib/gqli/client.rb, line 53
def valid?(query)
  return true unless validate_query

  schema.valid?(query)
end

Protected Instance Methods

request_headers() click to toggle source
# File lib/gqli/client.rb, line 74
def request_headers
  {
    accept: 'application/json',
    user_agent: "gqli.rb/#{VERSION}; http.rb/#{HTTP::VERSION}"
  }.merge(@headers)
end
timeout_options() click to toggle source
# File lib/gqli/client.rb, line 81
def timeout_options
  {
    write: options[:write_timeout],
    connect: options[:connect_timeout],
    read: options[:read_timeout]
  }
end
validation_error_message(validation) click to toggle source
# File lib/gqli/client.rb, line 65
    def validation_error_message(validation)
      <<~ERROR
        Validation Error: query is invalid - HTTP Request not sent.

        Errors:
          - #{validation.errors.join("\n  - ")}
      ERROR
    end