graphql-client 0.0.22 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +118 -10
- data/lib/graphql/client.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5601d2f7aa039d200df20fa117df18f06a5473f1
|
4
|
+
data.tar.gz: 73b673e1a522ade77581115a22e2e3c5d5cfdd9e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: af9d1074b12a2d82b45d4f90472a7d7f97061eda325787e4a43c726bda1041254e3e4db9fd91f0a25b4677c03851c4bbf9d660cff3aa11ffa1964951deb9552e
|
7
|
+
data.tar.gz: 5720e2af73259abec92963c3746c787821f547813282cf4dcac9ba32ee224b395684048690edb203c80cbb6513c045f47733588b0db15271a4f6a096ce441eed
|
data/README.md
CHANGED
@@ -1,25 +1,29 @@
|
|
1
1
|
# graphql-client
|
2
2
|
|
3
|
-
|
3
|
+
GraphQL Client is a Ruby library for declaring, composing and executing GraphQL queries.
|
4
4
|
|
5
|
-
|
5
|
+
## Usage
|
6
6
|
|
7
|
-
|
8
|
-
* You can optionally define a method that executes your schema. Usually, this is going to be some kind of HTTP adapter.
|
7
|
+
### Configuration
|
9
8
|
|
10
|
-
|
9
|
+
Sample configuration for a GraphQL Client to query from the [SWAPI GraphQL Wrapper](https://github.com/graphql/swapi-graphql).
|
11
10
|
|
12
11
|
``` ruby
|
13
12
|
require "graphql/client"
|
13
|
+
require "graphql/client/http"
|
14
14
|
|
15
|
+
# Star Wars API example wrapper
|
15
16
|
module SWAPI
|
17
|
+
# Configure GraphQL endpoint using the basic HTTP network adapter.
|
16
18
|
HTTP = GraphQL::Client::HTTP.new("http://graphql-swapi.parseapp.com/")
|
17
19
|
|
18
|
-
# Fetch latest schema on
|
20
|
+
# Fetch latest schema on init, this will make a network request
|
19
21
|
Schema = GraphQL::Client.load_schema(HTTP)
|
22
|
+
|
20
23
|
# However, its smart to dump this to a JSON file and load from disk
|
21
24
|
#
|
22
|
-
#
|
25
|
+
# Run in from a script or rake task
|
26
|
+
# GraphQL::Client.dump_schema(SWAPI::HTTP, "path/to/schema.json")
|
23
27
|
#
|
24
28
|
# Schema = GraphQL::Client.load_schema("path/to/schema.json")
|
25
29
|
|
@@ -27,9 +31,111 @@ module SWAPI
|
|
27
31
|
end
|
28
32
|
```
|
29
33
|
|
30
|
-
|
34
|
+
### Defining Queries
|
35
|
+
|
36
|
+
If you haven't already, [familiarize yourself with the GraphQL query syntax](http://graphql.org/docs/queries/). Queries are declared with the same syntax inside of a `<<-'GRAPHQL'` heredoc. There isn't any special query builder Ruby DSL.
|
37
|
+
|
38
|
+
This client library encourages all GraphQL queries to be declared statically and assigned to a Ruby constant.
|
39
|
+
|
40
|
+
``` ruby
|
41
|
+
HeroNameQuery = SWAPI::Client.parse <<-'GRAPHQL'
|
42
|
+
query {
|
43
|
+
hero {
|
44
|
+
name
|
45
|
+
}
|
46
|
+
}
|
47
|
+
GRAPHQL
|
48
|
+
```
|
49
|
+
|
50
|
+
Fragments are declared similarly.
|
51
|
+
|
52
|
+
``` ruby
|
53
|
+
HumanFragment = SWAPI::Client.parse <<-'GRAPHQL'
|
54
|
+
fragment on Human {
|
55
|
+
name
|
56
|
+
homePlanet
|
57
|
+
}
|
58
|
+
GRAPHQL
|
59
|
+
```
|
60
|
+
|
61
|
+
To include a fragment in a query, reference the fragment by constant.
|
62
|
+
|
63
|
+
``` ruby
|
64
|
+
HeroNameQuery = SWAPI::Client.parse <<-'GRAPHQL'
|
65
|
+
{
|
66
|
+
luke: human(id: "1000") {
|
67
|
+
...HumanFragment
|
68
|
+
}
|
69
|
+
leia: human(id: "1003") {
|
70
|
+
...HumanFragment
|
71
|
+
}
|
72
|
+
}
|
73
|
+
GRAPHQL
|
74
|
+
```
|
75
|
+
|
76
|
+
This works for namespaced constants.
|
77
|
+
|
78
|
+
``` ruby
|
79
|
+
module Hero
|
80
|
+
Query = SWAPI::Client.parse <<-'GRAPHQL'
|
81
|
+
{
|
82
|
+
luke: human(id: "1000") {
|
83
|
+
...Human::Fragment
|
84
|
+
}
|
85
|
+
leia: human(id: "1003") {
|
86
|
+
...Human::Fragment
|
87
|
+
}
|
88
|
+
}
|
89
|
+
GRAPHQL
|
90
|
+
end
|
91
|
+
```
|
92
|
+
|
93
|
+
`::` is invalid in regular GraphQL syntax, but `#parse` makes an initial pass on the query string and resolves all the fragment spreads with [`constantize`](http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-constantize).
|
94
|
+
|
95
|
+
### Executing queries
|
96
|
+
|
97
|
+
Pass the reference of a parsed query definition to `GraphQL::Client#query`. Data is returned back in a wrapped `GraphQL::QueryResult` struct that provides Ruby-ish accessors.
|
98
|
+
|
99
|
+
``` ruby
|
100
|
+
result = SWAPI::Client.query(Hero::Query)
|
101
|
+
|
102
|
+
# The raw data is Hash of JSON values
|
103
|
+
# result["data"]["luke"]["homePlanet"]
|
104
|
+
|
105
|
+
# The wrapped result allows to you access data with Ruby methods
|
106
|
+
result.data.luke.home_planet
|
107
|
+
```
|
108
|
+
|
109
|
+
### Rails ERB integration
|
110
|
+
|
111
|
+
If you're using Ruby on Rails ERB templates, theres a ERB extension that allows static queries to be defined in the template itself.
|
112
|
+
|
113
|
+
In standard Ruby you can simply assign queries and fragments to constants and they'll be available throughout the app. However, the contents of an ERB template is compiled into a Ruby method, and methods can't assign constants. So a new ERB tag was extended to declare static sections that include a GraphQL query.
|
114
|
+
|
115
|
+
``` erb
|
116
|
+
<%# app/views/humans/human.html.erb %>
|
117
|
+
<%graphql
|
118
|
+
fragment HumanFragment on Human {
|
119
|
+
name
|
120
|
+
homePlanet
|
121
|
+
}
|
122
|
+
%>
|
123
|
+
|
124
|
+
<p><%= human.name %> lives on <%= human.home_planet %>.</p>
|
125
|
+
```
|
126
|
+
|
127
|
+
These `<%graphql` sections are simply ignored at runtime but make their definitions available through constants. The module namespacing is derived from the `.erb`'s path plus the definition name.
|
128
|
+
|
129
|
+
```
|
130
|
+
>> "views/humans/human".camelize
|
131
|
+
=> "Views::Humans::Human"
|
132
|
+
>> Views::Humans::Human::HumanFragment
|
133
|
+
=> #<GraphQL::Client::FragmentDefinition>
|
134
|
+
```
|
135
|
+
|
136
|
+
## Examples
|
31
137
|
|
32
|
-
|
138
|
+
[github/github-graphql-rails-example](https://github.com/github/github-graphql-rails-example) is an example application using this library to implement views on the GitHub GraphQL API.
|
33
139
|
|
34
140
|
## Installation
|
35
141
|
|
@@ -41,4 +147,6 @@ gem 'graphql-client'
|
|
41
147
|
|
42
148
|
## See Also
|
43
149
|
|
44
|
-
* [graphql-ruby](https://github.com/rmosolgo/graphql-ruby) gem which
|
150
|
+
* [graphql-ruby](https://github.com/rmosolgo/graphql-ruby) gem which implements 80% of what this library provides. ❤️ [@rmosolgo](https://github.com/rmosolgo)
|
151
|
+
* [Facebook's GraphQL homepage](http://graphql.org/)
|
152
|
+
* [Facebook's Relay homepage](https://facebook.github.io/relay/)
|
data/lib/graphql/client.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: graphql-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- GitHub
|
@@ -106,7 +106,7 @@ dependencies:
|
|
106
106
|
- - "~>"
|
107
107
|
- !ruby/object:Gem::Version
|
108
108
|
version: '0.42'
|
109
|
-
description:
|
109
|
+
description: A Ruby library for declaring, composing and executing GraphQL queries
|
110
110
|
email: engineering@github.com
|
111
111
|
executables: []
|
112
112
|
extensions: []
|