graphql 0.3.0 → 0.4.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.
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