/graphql-ruby

Ruby implementation of Facebook's GraphQL

Primary LanguageRubyMIT LicenseMIT

graphql graphql-ruby

Build Status Gem Version Code Climate Test Coverage built with love

A Ruby implementation of GraphQL.

Installation

Install from RubyGems by adding it to your Gemfile, then bundling.

# Gemfile
gem 'graphql'
$ bundle install

Overview

Declare types & build a schema

# Declare a type...
PostType = GraphQL::ObjectType.define do
  name "Post"
  description "A blog post"

  field :id, !types.ID
  field :title, !types.String
  field :body, !types.String
  field :comments, types[!CommentType]
end

# ...and a query root
QueryType = GraphQL::ObjectType.define do
  name "Query"
  description "The query root of this schema"

  field :post do
    type PostType
    argument :id, !types.ID
    resolve -> (obj, args, ctx) { Post.find(args["id"]) }
  end
end

# Then create your schema
Schema = GraphQL::Schema.new(query: QueryType)

See also:

Execute queries

Execute GraphQL queries on a given schema, from a query string.

result_hash = Schema.execute(query_string)
# {
#   "data" => {
#     "post" => {
#        "id" => 1,
#        "title" => "GraphQL is nice"
#     }
#   }
# }

See also:

Use with Relay

If you're building a backend for Relay, you'll need:

Getting Started Tutorials

Series: Building a blog in GraphQL and Relay on Rails

  1. Introduction: https://medium.com/@gauravtiwari/graphql-and-relay-on-rails-getting-started-955a49d251de
  2. Part1: https://medium.com/@gauravtiwari/graphql-and-relay-on-rails-creating-types-and-schema-b3f9b232ccfc
  3. Part2: https://medium.com/@gauravtiwari/graphql-and-relay-on-rails-first-relay-powered-react-component-cb3f9ee95eca

Tutorials

  1. https://medium.com/@khor/relay-facebook-on-rails-8b4af2057152
  2. https://blog.jacobwgillespie.com/from-rest-to-graphql-b4e95e94c26b#.4cjtklrwt
  3. http://mgiroux.me/2015/getting-started-with-rails-graphql-relay/
  4. http://mgiroux.me/2015/uploading-files-using-relay-with-rails/

To Do

  • Code clean-up
    • Raise if you try to configure an attribute which doesn't suit the type (ie, if you try to define resolve on an ObjectType, it should somehow raise)
    • Clean up file structure in lib/query (don't need serial_execution namespace anymore)
  • Accept strings for circular type references
  • Interface's possible types should be a property of the schema, not the interface
  • Statically validate type of variables (see early return in LiteralValidator)
  • Big ideas:
    • Use graphql-parser (Ruby bindings for libgraphqlparser) instead of Parslet (underway-ish)
    • Revamp the fixture Schema to be more useful (better names, more extensible)
    • Subscriptions
      • This is a good chance to make an Operation abstraction of which query, mutation and subscription are members
      • For a subscription, graphql would send an outbound message to the system (allow the host application to manage its own subscriptions via Pusher, ActionCable, whatever)

Goals

  • Implement the GraphQL spec & support a Relay front end
  • Provide idiomatic, plain-Ruby API with similarities to reference implementation where possible
  • Support Ruby on Rails and Relay

Getting Involved

  • Say hi & ask questions in the #ruby channel on Slack or on Twitter!
  • Report bugs by posting a description, full stack trace, and all relevant code in a GitHub issue.
  • Features & patches are welcome! Consider discussing it in an issue or in the #ruby channel on Slack to make sure we're on the same page.
  • Run the tests with rake test or start up guard with bundle exec guard.

Related Projects

P.S.