graphql 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/lib/graph_ql/{types/input_value.rb → argument.rb} +4 -1
  3. data/lib/graph_ql/{scalars/boolean_type.rb → boolean_type.rb} +0 -0
  4. data/lib/graph_ql/definition_helpers.rb +10 -0
  5. data/lib/graph_ql/definition_helpers/argument_definer.rb +5 -2
  6. data/lib/graph_ql/definition_helpers/definable.rb +1 -1
  7. data/lib/graph_ql/definition_helpers/field_definer.rb +4 -1
  8. data/lib/graph_ql/definition_helpers/non_null_with_bang.rb +3 -1
  9. data/lib/graph_ql/definition_helpers/string_named_hash.rb +7 -1
  10. data/lib/graph_ql/definition_helpers/type_definer.rb +13 -1
  11. data/lib/graph_ql/directive.rb +14 -6
  12. data/lib/graph_ql/{directives → directive}/include_directive.rb +1 -1
  13. data/lib/graph_ql/{directives → directive}/skip_directive.rb +1 -1
  14. data/lib/graph_ql/enum_type.rb +66 -0
  15. data/lib/graph_ql/field.rb +49 -13
  16. data/lib/graph_ql/{scalars/float_type.rb → float_type.rb} +0 -0
  17. data/lib/graph_ql/{scalars/id_type.rb → id_type.rb} +0 -0
  18. data/lib/graph_ql/input_object_type.rb +33 -0
  19. data/lib/graph_ql/{scalars/int_type.rb → int_type.rb} +0 -0
  20. data/lib/graph_ql/interface_type.rb +33 -0
  21. data/lib/graph_ql/introspection/field_type.rb +1 -0
  22. data/lib/graph_ql/introspection/fields_field.rb +1 -0
  23. data/lib/graph_ql/introspection/input_value_type.rb +1 -1
  24. data/lib/graph_ql/introspection/introspection_query.rb +77 -0
  25. data/lib/graph_ql/introspection/schema_field.rb +13 -0
  26. data/lib/graph_ql/introspection/type_by_name_field.rb +14 -0
  27. data/lib/graph_ql/introspection/type_kind_enum.rb +1 -1
  28. data/lib/graph_ql/{types/list_type.rb → list_type.rb} +3 -0
  29. data/lib/graph_ql/{parser/nodes.rb → nodes.rb} +8 -1
  30. data/lib/graph_ql/{types/non_null_type.rb → non_null_type.rb} +3 -0
  31. data/lib/graph_ql/object_type.rb +92 -0
  32. data/lib/graph_ql/parser.rb +107 -6
  33. data/lib/graph_ql/query.rb +8 -0
  34. data/lib/graph_ql/query/arguments.rb +13 -4
  35. data/lib/graph_ql/{directives → query}/directive_chain.rb +2 -2
  36. data/lib/graph_ql/query/field_resolution_strategy.rb +2 -2
  37. data/lib/graph_ql/query/operation_resolver.rb +3 -3
  38. data/lib/graph_ql/query/selection_resolver.rb +1 -1
  39. data/lib/graph_ql/scalar_type.rb +9 -0
  40. data/lib/graph_ql/schema.rb +26 -17
  41. data/lib/graph_ql/schema/type_reducer.rb +7 -0
  42. data/lib/graph_ql/static_validation/arguments_validator.rb +1 -0
  43. data/lib/graph_ql/static_validation/message.rb +4 -1
  44. data/lib/graph_ql/static_validation/rules/fields_are_defined_on_type.rb +1 -0
  45. data/lib/graph_ql/static_validation/rules/fields_have_appropriate_selections.rb +1 -0
  46. data/lib/graph_ql/static_validation/type_stack.rb +24 -4
  47. data/lib/graph_ql/static_validation/validator.rb +27 -0
  48. data/lib/graph_ql/{scalars/string_type.rb → string_type.rb} +0 -0
  49. data/lib/graph_ql/transform.rb +87 -0
  50. data/lib/graph_ql/type_kinds.rb +9 -0
  51. data/lib/graph_ql/{types/union.rb → union_type.rb} +8 -4
  52. data/lib/graph_ql/version.rb +1 -1
  53. data/lib/graph_ql/{parser/visitor.rb → visitor.rb} +29 -4
  54. data/lib/graphql.rb +28 -11
  55. data/readme.md +11 -1
  56. data/spec/graph_ql/{types/enum_spec.rb → enum_type_spec.rb} +1 -1
  57. data/spec/graph_ql/{fields/field_spec.rb → field_spec.rb} +0 -0
  58. data/spec/graph_ql/{scalars/id_type_spec.rb → id_type_spec.rb} +0 -0
  59. data/spec/graph_ql/{types/input_object_type_spec.rb → input_object_type_spec.rb} +0 -0
  60. data/spec/graph_ql/{types/interface_spec.rb → interface_type_spec.rb} +1 -1
  61. data/spec/graph_ql/introspection/introspection_query_spec.rb +10 -0
  62. data/spec/graph_ql/introspection/schema_type_spec.rb +0 -4
  63. data/spec/graph_ql/introspection/type_type_spec.rb +1 -5
  64. data/spec/graph_ql/{types/object_type_spec.rb → object_type_spec.rb} +0 -0
  65. data/spec/graph_ql/{parser/parser_spec.rb → parser_spec.rb} +0 -0
  66. data/spec/graph_ql/query/operation_resolver_spec.rb +1 -1
  67. data/spec/graph_ql/query_spec.rb +6 -2
  68. data/spec/graph_ql/schema/type_validator_spec.rb +1 -1
  69. data/spec/graph_ql/{parser/transform_spec.rb → transform_spec.rb} +0 -0
  70. data/spec/graph_ql/{types/union_spec.rb → union_type_spec.rb} +2 -2
  71. data/spec/graph_ql/{parser/visitor_spec.rb → visitor_spec.rb} +0 -0
  72. data/spec/support/{dummy_app.rb → dairy_app.rb} +8 -8
  73. data/spec/support/{dummy_data.rb → dairy_data.rb} +0 -0
  74. data/spec/support/star_wars_data.rb +71 -0
  75. data/spec/support/star_wars_schema.rb +87 -0
  76. metadata +59 -50
  77. data/lib/graph_ql/definition_helpers/forwardable.rb +0 -10
  78. data/lib/graph_ql/parser/parser.rb +0 -108
  79. data/lib/graph_ql/parser/transform.rb +0 -87
  80. data/lib/graph_ql/scalars/scalar_type.rb +0 -5
  81. data/lib/graph_ql/types/enum.rb +0 -32
  82. data/lib/graph_ql/types/input_object_type.rb +0 -14
  83. data/lib/graph_ql/types/interface.rb +0 -14
  84. data/lib/graph_ql/types/object_type.rb +0 -66
data/readme.md CHANGED
@@ -1,4 +1,4 @@
1
- # graphql
1
+ # graphql <img src="https://cloud.githubusercontent.com/assets/2231765/9094460/cb43861e-3b66-11e5-9fbf-71066ff3ab13.png" height=40 alt="graphql-ruby"/>
2
2
 
3
3
  [![Build Status](https://travis-ci.org/rmosolgo/graphql-ruby.svg?branch=master)](https://travis-ci.org/rmosolgo/graphql-ruby)
4
4
  [![Gem Version](https://badge.fury.io/rb/graphql.svg)](https://rubygems.org/gems/graphql)
@@ -6,6 +6,9 @@
6
6
  [![Test Coverage](https://codeclimate.com/github/rmosolgo/graphql-ruby/badges/coverage.svg)](https://codeclimate.com/github/rmosolgo/graphql-ruby)
7
7
  [![built with love](https://cloud.githubusercontent.com/assets/2231765/6766607/d07992c6-cfc9-11e4-813f-d9240714dd50.png)](http://rmosolgo.github.io/react-badges/)
8
8
 
9
+ - [Introduction](https://github.com/rmosolgo/graphql-ruby/blob/master/guides/introduction.md)
10
+ - [API Documentation](http://www.rubydoc.info/github/rmosolgo/graphql-ruby)
11
+
9
12
  ## Overview
10
13
 
11
14
  - __Install the gem__:
@@ -87,7 +90,10 @@
87
90
  - https://github.com/graphql/graphql-js/issues/19#issuecomment-118515077
88
91
  - Code clean-up
89
92
  - Unify unwrapping types (It's on `TypeKind` but it's still not right)
93
+ - Better definition API
90
94
  - Cook up some path other than "n+1s everywhere"
95
+ - See Sangria's `project` approach ([in progress](https://github.com/rmosolgo/graphql-ruby/pull/15))
96
+
91
97
 
92
98
  ## Goals
93
99
 
@@ -108,3 +114,7 @@
108
114
  - Other implementations: [graphql-links](https://github.com/emmenko/graphql-links)
109
115
  - `graphql-ruby` + Rails demo ([src](https://github.com/rmosolgo/graphql-ruby-demo) / [heroku](http://graphql-ruby-demo.herokuapp.com))
110
116
  - [GraphQL Slack](https://graphql-slack.herokuapp.com/)
117
+
118
+ ## P.S.
119
+
120
+ Thanks to @sgwilym for the great logo!
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe GraphQL::Enum do
3
+ describe GraphQL::EnumType do
4
4
  let(:enum) { DairyAnimalEnum }
5
5
 
6
6
  it 'coerces names to underlying values' do
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe GraphQL::Interface do
3
+ describe GraphQL::InterfaceType do
4
4
  let(:interface) { EdibleInterface }
5
5
  it 'has possible types' do
6
6
  assert_equal([CheeseType, MilkType], interface.possible_types)
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ describe "GraphQL::Introspection::INTROSPECTION_QUERY" do
4
+ let(:query_string) { GraphQL::Introspection::INTROSPECTION_QUERY }
5
+ let(:result) { GraphQL::Query.new(DummySchema, query_string).result }
6
+
7
+ it 'runs' do
8
+ assert(result["data"])
9
+ end
10
+ end
@@ -23,15 +23,11 @@ describe GraphQL::Introspection::SchemaType do
23
23
  {"name"=>"favoriteEdible"},
24
24
  {"name"=>"searchDairy"},
25
25
  {"name"=>"error"},
26
- {"name"=>"__typename"},
27
- {"name"=>"__type"},
28
- {"name"=>"__schema"},
29
26
  ]
30
27
  },
31
28
  "mutationType"=> {
32
29
  "fields"=>[
33
30
  {"name"=>"pushValue"},
34
- {"name"=>"__typename"}
35
31
  ]
36
32
  },
37
33
  }
@@ -16,7 +16,6 @@ describe GraphQL::Introspection::TypeType do
16
16
  {"name"=>"flavor", "isDeprecated" => false, "type" => { "name" => "Non-Null", "ofType" => { "name" => "String"}}},
17
17
  {"name"=>"source", "isDeprecated" => false, "type" => { "name" => "Non-Null", "ofType" => { "name" => "DairyAnimal"}}},
18
18
  {"name"=>"similarCheeses", "isDeprecated"=>false, "type"=>{"name"=>"Cheese", "ofType"=>nil}},
19
- {"name"=>"__typename", "isDeprecated"=>false, "type"=> { "name" => "Non-Null", "ofType" => { "name" => "String"}}},
20
19
  ]}
21
20
 
22
21
  let(:dairy_animals) {[
@@ -41,7 +40,6 @@ describe GraphQL::Introspection::TypeType do
41
40
  {"type"=>{"name"=>"DairyAnimal", "ofType"=>nil}},
42
41
  {"type"=>{"name"=>"Non-Null", "ofType"=>{"name"=>"Float"}}},
43
42
  {"type"=>{"name"=>"List", "ofType"=>{"name"=>"String"}}},
44
- {"type"=>{"name"=>"Non-Null", "ofType"=>{"name"=>"String"}}}
45
43
  ]
46
44
  },
47
45
  "dairyAnimal"=>{
@@ -60,7 +58,6 @@ describe GraphQL::Introspection::TypeType do
60
58
  "possibleTypes"=>[{"name"=>"Cheese"}, {"name"=>"Milk"}],
61
59
  "fields"=>[
62
60
  {"name"=>"source"},
63
- {"name"=>"__typename"},
64
61
  ]
65
62
  }
66
63
  }}
@@ -76,8 +73,7 @@ describe GraphQL::Introspection::TypeType do
76
73
  |}
77
74
  let(:deprecated_fields) { {"name"=>"fatContent", "isDeprecated"=>true, "type"=>{"name"=>"Non-Null", "ofType"=>{"name"=>"Float"}}} }
78
75
  it 'can expose deprecated fields' do
79
- typename = cheese_fields.pop
80
- new_cheese_fields = cheese_fields + [deprecated_fields, typename]
76
+ new_cheese_fields = cheese_fields + [deprecated_fields]
81
77
  expected = { "data" => {
82
78
  "cheeseType" => {
83
79
  "name"=> "Cheese",
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  describe GraphQL::Query::OperationResolver do
4
4
  let(:operation) { GraphQL.parse("query getCheese($cheeseId: Int!) { cheese(id: $cheeseId) { name }}", as: :operation_definition) }
5
5
  let(:params) { {"cheeseId" => 1}}
6
- let(:query) { q = Minitest::Mock.new; q.expect(:params, params); q}
6
+ let(:query) { OpenStruct.new(params: params, context: nil) }
7
7
  let(:resolver) { GraphQL::Query::OperationResolver.new(operation, query)}
8
8
 
9
9
  describe "variables" do
@@ -14,7 +14,11 @@ describe GraphQL::Query do
14
14
  }
15
15
  fromSource(source: COW) { id }
16
16
  fromSheep: fromSource(source: SHEEP) { id }
17
- firstSheep: searchDairy(product: {source: SHEEP}) { ... dairyFields, ... milkFields }
17
+ firstSheep: searchDairy(product: {source: SHEEP}) {
18
+ __typename,
19
+ ... dairyFields,
20
+ ... milkFields
21
+ }
18
22
  favoriteEdible { __typename, fatContent }
19
23
  }
20
24
  fragment cheeseFields on Cheese { flavor }
@@ -41,7 +45,7 @@ describe GraphQL::Query do
41
45
  },
42
46
  "fromSource" => [{ "id" => 1 }, {"id" => 2}],
43
47
  "fromSheep"=>[{"id"=>3}],
44
- "firstSheep" => { "flavor" => "Manchego" },
48
+ "firstSheep" => { "__typename" => "Cheese", "flavor" => "Manchego" },
45
49
  "favoriteEdible"=>{"__typename"=>"Milk", "fatContent"=>0.04},
46
50
  }}
47
51
  assert_equal(expected, result)
@@ -40,7 +40,7 @@ describe GraphQL::Schema::TypeValidator do
40
40
 
41
41
  describe "when a Union isnt valid" do
42
42
  let(:object) {
43
- GraphQL::Union.new("Something", "some union", [DairyProductInputType])
43
+ GraphQL::UnionType.new("Something", "some union", [DairyProductInputType])
44
44
  }
45
45
  let(:errors) { e = []; GraphQL::Schema::TypeValidator.new.validate(object, e); e;}
46
46
  it 'must be 2+ types, must be only object types' do
@@ -1,9 +1,9 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe GraphQL::Union do
3
+ describe GraphQL::UnionType do
4
4
  let(:type_1) { OpenStruct.new(kind: GraphQL::TypeKinds::OBJECT)}
5
5
  let(:type_2) { OpenStruct.new(kind: GraphQL::TypeKinds::OBJECT)}
6
- let(:union) { GraphQL::Union.new("MyUnion", "Some items", [type_1, type_2]) }
6
+ let(:union) { GraphQL::UnionType.new("MyUnion", "Some items", [type_1, type_2]) }
7
7
  it 'has a name' do
8
8
  assert_equal("MyUnion", union.name)
9
9
  end
@@ -1,6 +1,6 @@
1
- require_relative './dummy_data'
1
+ require_relative './dairy_data'
2
2
 
3
- EdibleInterface = GraphQL::Interface.new do |i, type, field|
3
+ EdibleInterface = GraphQL::InterfaceType.new do |i, type, field|
4
4
  i.name "Edible"
5
5
  i.description "Something you can eat, yum"
6
6
  i.fields({
@@ -11,7 +11,7 @@ EdibleInterface = GraphQL::Interface.new do |i, type, field|
11
11
  })
12
12
  end
13
13
 
14
- AnimalProductInterface = GraphQL::Interface.new do |i, type, field|
14
+ AnimalProductInterface = GraphQL::InterfaceType.new do |i, type, field|
15
15
  i.name "AnimalProduct"
16
16
  i.description "Comes from an animal, no joke"
17
17
  i.fields({
@@ -19,7 +19,7 @@ AnimalProductInterface = GraphQL::Interface.new do |i, type, field|
19
19
  })
20
20
  end
21
21
 
22
- DairyAnimalEnum = GraphQL::Enum.new do |e|
22
+ DairyAnimalEnum = GraphQL::EnumType.new do |e|
23
23
  e.name "DairyAnimal"
24
24
  e.description "An animal which can yield milk"
25
25
  e.value("COW", "Animal with black and white spots", value: 1)
@@ -62,7 +62,7 @@ MilkType = GraphQL::ObjectType.new do |t, type, field, arg|
62
62
  }
63
63
  end
64
64
 
65
- DairyProductUnion = GraphQL::Union.new(
65
+ DairyProductUnion = GraphQL::UnionType.new(
66
66
  "DairyProduct",
67
67
  "Kinds of food made from milk",
68
68
  [MilkType, CheeseType]
@@ -84,7 +84,7 @@ class FetchField
84
84
  def initialize(type:, data:, id_type: !GraphQL::INT_TYPE)
85
85
  @type = type
86
86
  @data = data
87
- @arguments = {"id" => GraphQL::InputValue.new(type: id_type, name: "id")}
87
+ @arguments = {"id" => GraphQL::Argument.new(type: id_type, name: "id")}
88
88
  @deprecation_reason = nil
89
89
  end
90
90
 
@@ -128,7 +128,7 @@ QueryType = GraphQL::ObjectType.new do |t, types, field, arg|
128
128
  f.arguments({product: arg.build({type: DairyProductInputType})})
129
129
  f.resolve -> (t, a, c) {
130
130
  products = CHEESES.values + MILKS.values
131
- source = a["product"]["source"]
131
+ source = a["product"][:source] # String or sym is ok
132
132
  if !source.nil?
133
133
  products = products.select { |p| p.source == source }
134
134
  end
@@ -154,7 +154,7 @@ MutationType = GraphQL::ObjectType.new do |t, type, field, arg|
154
154
  f.type(!type[!type.Int])
155
155
  f.arguments(value: arg.build(type: !type.Int))
156
156
  f.resolve -> (o, args, ctx) {
157
- GLOBAL_VALUES << args["value"]
157
+ GLOBAL_VALUES << args[:value]
158
158
  GLOBAL_VALUES
159
159
  }
160
160
  }
File without changes
@@ -0,0 +1,71 @@
1
+ luke = OpenStruct.new({
2
+ id: '1000',
3
+ name: 'Luke Skywalker',
4
+ friends: ['1002', '1003', '2000', '2001'],
5
+ appearsIn: [4, 5, 6],
6
+ homePlanet: 'Tatooine',
7
+ })
8
+
9
+ vader = OpenStruct.new({
10
+ id: '1001',
11
+ name: 'Darth Vader',
12
+ friends: ['1004'],
13
+ appearsIn: [4, 5, 6],
14
+ homePlanet: 'Tatooine',
15
+ })
16
+
17
+ han = OpenStruct.new({
18
+ id: '1002',
19
+ name: 'Han Solo',
20
+ friends: ['1000', '1003', '2001'],
21
+ appearsIn: [4, 5, 6],
22
+ })
23
+
24
+ leia = OpenStruct.new({
25
+ id: '1003',
26
+ name: 'Leia Organa',
27
+ friends: ['1000', '1002', '2000', '2001'],
28
+ appearsIn: [4, 5, 6],
29
+ homePlanet: 'Alderaan',
30
+ })
31
+
32
+ tarkin = OpenStruct.new({
33
+ id: '1004',
34
+ name: 'Wilhuff Tarkin',
35
+ friends: ['1001'],
36
+ appearsIn: [4],
37
+ })
38
+
39
+ HUMAN_DATA = {
40
+ "1000" => luke,
41
+ "1001" => vader,
42
+ "1002" => han,
43
+ "1003" => leia,
44
+ "1004" => tarkin,
45
+ }
46
+
47
+ threepio = OpenStruct.new({
48
+ id: '2000',
49
+ name: 'C-3PO',
50
+ friends: ['1000', '1002', '1003', '2001'],
51
+ appearsIn: [4, 5, 6],
52
+ primaryFunction: 'Protocol',
53
+ })
54
+
55
+ artoo = OpenStruct.new({
56
+ id: '2001',
57
+ name: 'R2-D2',
58
+ friends: ['1000', '1002', '1003'],
59
+ appearsIn: [4, 5, 6],
60
+ primaryFunction: 'Astromech',
61
+ })
62
+
63
+ DROID_DATA = {
64
+ "2000" => threepio,
65
+ "2001" => artoo,
66
+ }
67
+
68
+ # Get friends from IDs
69
+ GET_FRIENDS = -> (obj, args, ctx) do
70
+ obj.friends.map { |id| HUMAN_DATA[id] || DROID_DATA[id]}
71
+ end
@@ -0,0 +1,87 @@
1
+ # Based on the graphql-js example
2
+ # https://github.com/graphql/graphql-js/blob/master/src/__tests__/starWarsSchema.js
3
+ require_relative './star_wars_data'
4
+
5
+ EpisodeEnum = GraphQL::EnumType.new do |e|
6
+ e.name("Episode")
7
+ e.description("One of the films in the Star Wars Trilogy.")
8
+
9
+ e.value("NEWHOPE", "Released in 1977", value: 4)
10
+ e.value("EMPIRE", "Released in 1980", value: 5)
11
+ e.value("JEDI", "Released in 1983", value: 6)
12
+ end
13
+
14
+ CharacterInterface = GraphQL::InterfaceType.new do |i, types, field|
15
+ i.name("Character")
16
+ i.description("A character in the Star Wars Trilogy.")
17
+
18
+ i.fields({
19
+ id: field.build(type: !types.String, desc: "The id of the character."),
20
+ name: field.build(type: types.String, desc: "The name of the Character."),
21
+ friends: field.build(type: types[i], desc: "The friends of the character, or an empty list if they have none."),
22
+ appearsIn: field.build(type: types[EpisodeEnum], desc: "Which movies they appear in."),
23
+ })
24
+ end
25
+
26
+ HumanType = GraphQL::ObjectType.new do |t, types, field|
27
+ t.name("Human")
28
+ t.description("A humanoid creature in the Star Wars universe.")
29
+ t.fields({
30
+ id: field.build(type: !types.String, desc: "The id of the human."),
31
+ name: field.build(type: types.String, desc: "The name of the human."),
32
+ friends: GraphQL::Field.new { |f|
33
+ f.type(types[CharacterInterface])
34
+ f.description("The friends of the human, or an empty list if they have none.")
35
+ f.resolve(GET_FRIENDS)
36
+ },
37
+ appearsIn: field.build(type: types[EpisodeEnum], desc: "Which movies they appear in."),
38
+ homePlanet: field.build(type: types.String, desc: "The home planet of the human, or null if unknown."),
39
+ })
40
+ t.interfaces([CharacterInterface])
41
+ end
42
+
43
+ DroidType = GraphQL::ObjectType.new do |t, types, field|
44
+ t.name("Droid")
45
+ t.description("A mechanical creature in the Star Wars universe.")
46
+ t.fields({
47
+ id: field.build(type: !types.String, desc: "The id of the droid."),
48
+ name: field.build(type: types.String, desc: "The name of the droid."),
49
+ friends: GraphQL::Field.new { |f|
50
+ f.type(types[CharacterInterface])
51
+ f.description("The friends of the droid, or an empty list if they have none.")
52
+ f.resolve(GET_FRIENDS)
53
+ },
54
+ appearsIn: field.build(type: types[EpisodeEnum], desc: "Which movies they appear in."),
55
+ primaryFunction: field.build(type: types.String, desc: "The primary function of the droid."),
56
+ })
57
+ t.interfaces([CharacterInterface])
58
+ end
59
+
60
+ class FindRecordField < GraphQL::Field
61
+ def initialize(type, data)
62
+ @data = data
63
+ self.type = type
64
+ self.arguments = {
65
+ id: GraphQL::Argument.new(type: !GraphQL::STRING_TYPE, description: "The id of the #{type.name}.")
66
+ }
67
+ end
68
+
69
+ def resolve(obj, args, ctx)
70
+ @data[args["id"]]
71
+ end
72
+ end
73
+
74
+
75
+ StarWarsQueryType = GraphQL::ObjectType.new do |t, types, field, arg|
76
+ t.name("Query")
77
+ t.fields({
78
+ hero: GraphQL::Field.new { |f|
79
+ f.arguments({
80
+ episode: arg.build(type: EpisodeEnum, desc: "If omitted, returns the hero of the whole saga. If provided, returns the hero of that particular episode"),
81
+ })
82
+ f.resolve -> (obj, args, ctx) { args["episode"] == 5 ? luke : artoo }
83
+ },
84
+ human: FindRecordField.new(HumanType, HUMAN_DATA),
85
+ droid: FindRecordField.new(DroidType, DROID_DATA),
86
+ })
87
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphql
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Mosolgo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-06 00:00:00.000000000 Z
11
+ date: 2015-08-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parslet
@@ -150,7 +150,8 @@ dependencies:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
152
  version: '10.4'
153
- description: A GraphQL adapter for Ruby
153
+ description: "\n Full-fledged implementation of the GraphQL spec.\n Includes
154
+ query parsing, static validation, type definition, and query execution.\n "
154
155
  email:
155
156
  - rdmosolgo@gmail.com
156
157
  executables: []
@@ -158,18 +159,25 @@ extensions: []
158
159
  extra_rdoc_files: []
159
160
  files:
160
161
  - MIT-LICENSE
162
+ - lib/graph_ql/argument.rb
163
+ - lib/graph_ql/boolean_type.rb
164
+ - lib/graph_ql/definition_helpers.rb
161
165
  - lib/graph_ql/definition_helpers/argument_definer.rb
162
166
  - lib/graph_ql/definition_helpers/definable.rb
163
167
  - lib/graph_ql/definition_helpers/field_definer.rb
164
- - lib/graph_ql/definition_helpers/forwardable.rb
165
168
  - lib/graph_ql/definition_helpers/non_null_with_bang.rb
166
169
  - lib/graph_ql/definition_helpers/string_named_hash.rb
167
170
  - lib/graph_ql/definition_helpers/type_definer.rb
168
171
  - lib/graph_ql/directive.rb
169
- - lib/graph_ql/directives/directive_chain.rb
170
- - lib/graph_ql/directives/include_directive.rb
171
- - lib/graph_ql/directives/skip_directive.rb
172
+ - lib/graph_ql/directive/include_directive.rb
173
+ - lib/graph_ql/directive/skip_directive.rb
174
+ - lib/graph_ql/enum_type.rb
172
175
  - lib/graph_ql/field.rb
176
+ - lib/graph_ql/float_type.rb
177
+ - lib/graph_ql/id_type.rb
178
+ - lib/graph_ql/input_object_type.rb
179
+ - lib/graph_ql/int_type.rb
180
+ - lib/graph_ql/interface_type.rb
173
181
  - lib/graph_ql/introspection/arguments_field.rb
174
182
  - lib/graph_ql/introspection/directive_type.rb
175
183
  - lib/graph_ql/introspection/enum_value_type.rb
@@ -179,19 +187,23 @@ files:
179
187
  - lib/graph_ql/introspection/input_fields_field.rb
180
188
  - lib/graph_ql/introspection/input_value_type.rb
181
189
  - lib/graph_ql/introspection/interfaces_field.rb
190
+ - lib/graph_ql/introspection/introspection_query.rb
182
191
  - lib/graph_ql/introspection/of_type_field.rb
183
192
  - lib/graph_ql/introspection/possible_types_field.rb
193
+ - lib/graph_ql/introspection/schema_field.rb
184
194
  - lib/graph_ql/introspection/schema_type.rb
195
+ - lib/graph_ql/introspection/type_by_name_field.rb
185
196
  - lib/graph_ql/introspection/type_kind_enum.rb
186
197
  - lib/graph_ql/introspection/type_type.rb
187
198
  - lib/graph_ql/introspection/typename_field.rb
199
+ - lib/graph_ql/list_type.rb
200
+ - lib/graph_ql/nodes.rb
201
+ - lib/graph_ql/non_null_type.rb
202
+ - lib/graph_ql/object_type.rb
188
203
  - lib/graph_ql/parser.rb
189
- - lib/graph_ql/parser/nodes.rb
190
- - lib/graph_ql/parser/parser.rb
191
- - lib/graph_ql/parser/transform.rb
192
- - lib/graph_ql/parser/visitor.rb
193
204
  - lib/graph_ql/query.rb
194
205
  - lib/graph_ql/query/arguments.rb
206
+ - lib/graph_ql/query/directive_chain.rb
195
207
  - lib/graph_ql/query/field_resolution_strategy.rb
196
208
  - lib/graph_ql/query/fragment_spread_resolution_strategy.rb
197
209
  - lib/graph_ql/query/inline_fragment_resolution_strategy.rb
@@ -199,12 +211,7 @@ files:
199
211
  - lib/graph_ql/query/selection_resolver.rb
200
212
  - lib/graph_ql/query/type_resolver.rb
201
213
  - lib/graph_ql/repl.rb
202
- - lib/graph_ql/scalars/boolean_type.rb
203
- - lib/graph_ql/scalars/float_type.rb
204
- - lib/graph_ql/scalars/id_type.rb
205
- - lib/graph_ql/scalars/int_type.rb
206
- - lib/graph_ql/scalars/scalar_type.rb
207
- - lib/graph_ql/scalars/string_type.rb
214
+ - lib/graph_ql/scalar_type.rb
208
215
  - lib/graph_ql/schema.rb
209
216
  - lib/graph_ql/schema/each_item_validator.rb
210
217
  - lib/graph_ql/schema/field_validator.rb
@@ -235,29 +242,28 @@ files:
235
242
  - lib/graph_ql/static_validation/rules/variables_are_used_and_defined.rb
236
243
  - lib/graph_ql/static_validation/type_stack.rb
237
244
  - lib/graph_ql/static_validation/validator.rb
245
+ - lib/graph_ql/string_type.rb
246
+ - lib/graph_ql/transform.rb
238
247
  - lib/graph_ql/type_kinds.rb
239
- - lib/graph_ql/types/enum.rb
240
- - lib/graph_ql/types/input_object_type.rb
241
- - lib/graph_ql/types/input_value.rb
242
- - lib/graph_ql/types/interface.rb
243
- - lib/graph_ql/types/list_type.rb
244
- - lib/graph_ql/types/non_null_type.rb
245
- - lib/graph_ql/types/object_type.rb
246
- - lib/graph_ql/types/union.rb
248
+ - lib/graph_ql/union_type.rb
247
249
  - lib/graph_ql/version.rb
250
+ - lib/graph_ql/visitor.rb
248
251
  - lib/graphql.rb
249
252
  - readme.md
250
253
  - spec/graph_ql/directive_spec.rb
251
- - spec/graph_ql/fields/field_spec.rb
254
+ - spec/graph_ql/enum_type_spec.rb
255
+ - spec/graph_ql/field_spec.rb
256
+ - spec/graph_ql/id_type_spec.rb
257
+ - spec/graph_ql/input_object_type_spec.rb
258
+ - spec/graph_ql/interface_type_spec.rb
252
259
  - spec/graph_ql/introspection/directive_type_spec.rb
260
+ - spec/graph_ql/introspection/introspection_query_spec.rb
253
261
  - spec/graph_ql/introspection/schema_type_spec.rb
254
262
  - spec/graph_ql/introspection/type_type_spec.rb
255
- - spec/graph_ql/parser/parser_spec.rb
256
- - spec/graph_ql/parser/transform_spec.rb
257
- - spec/graph_ql/parser/visitor_spec.rb
263
+ - spec/graph_ql/object_type_spec.rb
264
+ - spec/graph_ql/parser_spec.rb
258
265
  - spec/graph_ql/query/operation_resolver_spec.rb
259
266
  - spec/graph_ql/query_spec.rb
260
- - spec/graph_ql/scalars/id_type_spec.rb
261
267
  - spec/graph_ql/schema/field_validator_spec.rb
262
268
  - spec/graph_ql/schema/type_reducer_spec.rb
263
269
  - spec/graph_ql/schema/type_validator_spec.rb
@@ -279,14 +285,14 @@ files:
279
285
  - spec/graph_ql/static_validation/rules/variables_are_used_and_defined_spec.rb
280
286
  - spec/graph_ql/static_validation/type_stack_spec.rb
281
287
  - spec/graph_ql/static_validation/validator_spec.rb
282
- - spec/graph_ql/types/enum_spec.rb
283
- - spec/graph_ql/types/input_object_type_spec.rb
284
- - spec/graph_ql/types/interface_spec.rb
285
- - spec/graph_ql/types/object_type_spec.rb
286
- - spec/graph_ql/types/union_spec.rb
288
+ - spec/graph_ql/transform_spec.rb
289
+ - spec/graph_ql/union_type_spec.rb
290
+ - spec/graph_ql/visitor_spec.rb
287
291
  - spec/spec_helper.rb
288
- - spec/support/dummy_app.rb
289
- - spec/support/dummy_data.rb
292
+ - spec/support/dairy_app.rb
293
+ - spec/support/dairy_data.rb
294
+ - spec/support/star_wars_data.rb
295
+ - spec/support/star_wars_schema.rb
290
296
  homepage: http://github.com/rmosolgo/graphql-ruby
291
297
  licenses:
292
298
  - MIT
@@ -310,19 +316,22 @@ rubyforge_project:
310
316
  rubygems_version: 2.4.5
311
317
  signing_key:
312
318
  specification_version: 4
313
- summary: GraphQL
319
+ summary: A GraphQL implementation for Ruby
314
320
  test_files:
315
321
  - spec/graph_ql/directive_spec.rb
316
- - spec/graph_ql/fields/field_spec.rb
322
+ - spec/graph_ql/enum_type_spec.rb
323
+ - spec/graph_ql/field_spec.rb
324
+ - spec/graph_ql/id_type_spec.rb
325
+ - spec/graph_ql/input_object_type_spec.rb
326
+ - spec/graph_ql/interface_type_spec.rb
317
327
  - spec/graph_ql/introspection/directive_type_spec.rb
328
+ - spec/graph_ql/introspection/introspection_query_spec.rb
318
329
  - spec/graph_ql/introspection/schema_type_spec.rb
319
330
  - spec/graph_ql/introspection/type_type_spec.rb
320
- - spec/graph_ql/parser/parser_spec.rb
321
- - spec/graph_ql/parser/transform_spec.rb
322
- - spec/graph_ql/parser/visitor_spec.rb
331
+ - spec/graph_ql/object_type_spec.rb
332
+ - spec/graph_ql/parser_spec.rb
323
333
  - spec/graph_ql/query/operation_resolver_spec.rb
324
334
  - spec/graph_ql/query_spec.rb
325
- - spec/graph_ql/scalars/id_type_spec.rb
326
335
  - spec/graph_ql/schema/field_validator_spec.rb
327
336
  - spec/graph_ql/schema/type_reducer_spec.rb
328
337
  - spec/graph_ql/schema/type_validator_spec.rb
@@ -344,11 +353,11 @@ test_files:
344
353
  - spec/graph_ql/static_validation/rules/variables_are_used_and_defined_spec.rb
345
354
  - spec/graph_ql/static_validation/type_stack_spec.rb
346
355
  - spec/graph_ql/static_validation/validator_spec.rb
347
- - spec/graph_ql/types/enum_spec.rb
348
- - spec/graph_ql/types/input_object_type_spec.rb
349
- - spec/graph_ql/types/interface_spec.rb
350
- - spec/graph_ql/types/object_type_spec.rb
351
- - spec/graph_ql/types/union_spec.rb
356
+ - spec/graph_ql/transform_spec.rb
357
+ - spec/graph_ql/union_type_spec.rb
358
+ - spec/graph_ql/visitor_spec.rb
352
359
  - spec/spec_helper.rb
353
- - spec/support/dummy_app.rb
354
- - spec/support/dummy_data.rb
360
+ - spec/support/dairy_app.rb
361
+ - spec/support/dairy_data.rb
362
+ - spec/support/star_wars_data.rb
363
+ - spec/support/star_wars_schema.rb