Installation
Install from RubyGems by adding it to your Gemfile, then bundling.
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:
- the test schema
graphql-ruby-demofor an example schema on Rails
Execute queries
Execute GraphQL queries on a given schema, from a query string.
query = GraphQL::Query.new(Schema, query_string) result_hash = query.result # { # "data" => { # "post" => { # "id" => 1, # "title" => "GraphQL is nice" # } # } # }
See also:
- query_spec.rb for an example of query execution.
queries_controller.rbfor a Rails example- Try it on heroku
Use with Relay
If you're building a backend for Relay, you'll need:
- A JSON dump of the schema, which you can get by sending
GraphQL::Introspection::INTROSPECTION_QUERY - Relay-specific helpers for GraphQL like Connections, node fields, and global ids. Here's one example of those:
graphql-relay
To Do
- To match spec:
- Directives:
@skiphas precedence over@include- directives on fragments: http://facebook.github.io/graphql/#sec-Fragment-Directives
- Union
- only require one type https://github.com/facebook/graphql/commit/972fd5aae01195b018d305c82e43f714f9a41679
- Directives:
- Field merging
- if you were to request a field, then request it in a fragment, it would get looked up twice
- graphql/graphql-js#19 (comment)
- Code clean-up
- Accept native Ruby types in definitions, then convert them to GraphQL types
- Remove deprecated
params:keyword - Raise if you try to configure an attribute which doesn't suit the type
- Cook up some path other than "n+1s everywhere"
- See Sangria's
projectapproach (in progress) - Try debounced approach?
- See Sangria's
Goals
- Implement the GraphQL spec & support a Relay front end
- Provide idiomatic, plain-Ruby API with similarities to reference implementation where possible
- Support
graphql-rails
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 testor start up guard withbundle exec guard.
Other Resources
- GraphQL Spec
- Other implementations: graphql-links
graphql-ruby+ Rails demo (src / heroku)- GraphQL Slack
- Example Relay support in Ruby
P.S.
- Thanks to @sgwilym for the great logo!
- Definition API heavily inspired by @seanchas's implementation of GraphQL
