graphql 0.0.4 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (126) hide show
  1. checksums.yaml +4 -4
  2. data/lib/graph_ql/directive.rb +36 -0
  3. data/lib/graph_ql/directives/directive_chain.rb +33 -0
  4. data/lib/graph_ql/directives/include_directive.rb +15 -0
  5. data/lib/graph_ql/directives/skip_directive.rb +15 -0
  6. data/lib/graph_ql/enum.rb +34 -0
  7. data/lib/graph_ql/fields/abstract_field.rb +37 -0
  8. data/lib/graph_ql/fields/access_field.rb +24 -0
  9. data/lib/graph_ql/fields/field.rb +34 -0
  10. data/lib/graph_ql/interface.rb +14 -0
  11. data/lib/graph_ql/introspection/arguments_field.rb +5 -0
  12. data/lib/graph_ql/introspection/directive_type.rb +12 -0
  13. data/lib/graph_ql/introspection/enum_value_type.rb +10 -0
  14. data/lib/graph_ql/introspection/enum_values_field.rb +15 -0
  15. data/lib/graph_ql/introspection/field_type.rb +11 -0
  16. data/lib/graph_ql/introspection/fields_field.rb +14 -0
  17. data/lib/graph_ql/introspection/input_fields_field.rb +12 -0
  18. data/lib/graph_ql/introspection/input_value_type.rb +10 -0
  19. data/lib/graph_ql/introspection/of_type_field.rb +12 -0
  20. data/lib/graph_ql/introspection/possible_types_field.rb +12 -0
  21. data/lib/graph_ql/introspection/schema_type.rb +32 -0
  22. data/lib/graph_ql/introspection/type_kind_enum.rb +7 -0
  23. data/lib/graph_ql/introspection/type_type.rb +22 -0
  24. data/lib/graph_ql/parser/nodes.rb +72 -0
  25. data/lib/graph_ql/parser/parser.rb +108 -0
  26. data/lib/graph_ql/parser/transform.rb +86 -0
  27. data/lib/graph_ql/parser/visitor.rb +47 -0
  28. data/lib/graph_ql/query.rb +50 -0
  29. data/lib/graph_ql/query/arguments.rb +25 -0
  30. data/lib/graph_ql/query/field_resolution_strategy.rb +83 -0
  31. data/lib/graph_ql/query/fragment_spread_resolution_strategy.rb +16 -0
  32. data/lib/graph_ql/query/inline_fragment_resolution_strategy.rb +14 -0
  33. data/lib/graph_ql/query/operation_resolver.rb +28 -0
  34. data/lib/graph_ql/query/selection_resolver.rb +20 -0
  35. data/lib/graph_ql/query/type_resolver.rb +19 -0
  36. data/lib/graph_ql/repl.rb +27 -0
  37. data/lib/graph_ql/schema.rb +30 -0
  38. data/lib/graph_ql/schema/type_reducer.rb +44 -0
  39. data/lib/graph_ql/type_kinds.rb +15 -0
  40. data/lib/graph_ql/types/abstract_type.rb +14 -0
  41. data/lib/graph_ql/types/boolean_type.rb +6 -0
  42. data/lib/graph_ql/types/float_type.rb +6 -0
  43. data/lib/graph_ql/types/input_object_type.rb +17 -0
  44. data/lib/graph_ql/types/input_value.rb +10 -0
  45. data/lib/graph_ql/types/int_type.rb +6 -0
  46. data/lib/graph_ql/types/list_type.rb +10 -0
  47. data/lib/graph_ql/types/non_null_type.rb +18 -0
  48. data/lib/graph_ql/types/non_null_with_bang.rb +5 -0
  49. data/lib/graph_ql/types/object_type.rb +62 -0
  50. data/lib/graph_ql/types/scalar_type.rb +5 -0
  51. data/lib/graph_ql/types/string_type.rb +6 -0
  52. data/lib/graph_ql/types/type_definer.rb +16 -0
  53. data/lib/graph_ql/union.rb +35 -0
  54. data/lib/graph_ql/validations/fields_are_defined_on_type.rb +44 -0
  55. data/lib/graph_ql/validations/fields_will_merge.rb +80 -0
  56. data/lib/graph_ql/validations/fragments_are_used.rb +24 -0
  57. data/lib/graph_ql/validator.rb +29 -0
  58. data/lib/graph_ql/version.rb +3 -0
  59. data/lib/graphql.rb +92 -99
  60. data/readme.md +17 -177
  61. data/spec/graph_ql/directive_spec.rb +81 -0
  62. data/spec/graph_ql/enum_spec.rb +5 -0
  63. data/spec/graph_ql/fields/field_spec.rb +10 -0
  64. data/spec/graph_ql/interface_spec.rb +13 -0
  65. data/spec/graph_ql/introspection/directive_type_spec.rb +40 -0
  66. data/spec/graph_ql/introspection/schema_type_spec.rb +39 -0
  67. data/spec/graph_ql/introspection/type_type_spec.rb +104 -0
  68. data/spec/graph_ql/parser/parser_spec.rb +120 -0
  69. data/spec/graph_ql/parser/transform_spec.rb +109 -0
  70. data/spec/graph_ql/parser/visitor_spec.rb +31 -0
  71. data/spec/graph_ql/query/operation_resolver_spec.rb +14 -0
  72. data/spec/graph_ql/query_spec.rb +82 -0
  73. data/spec/graph_ql/schema/type_reducer_spec.rb +24 -0
  74. data/spec/graph_ql/types/input_object_type_spec.rb +12 -0
  75. data/spec/graph_ql/types/object_type_spec.rb +35 -0
  76. data/spec/graph_ql/union_spec.rb +27 -0
  77. data/spec/graph_ql/validations/fields_are_defined_on_type_spec.rb +28 -0
  78. data/spec/graph_ql/validations/fields_will_merge_spec.rb +40 -0
  79. data/spec/graph_ql/validations/fragments_are_used_spec.rb +28 -0
  80. data/spec/graph_ql/validator_spec.rb +24 -0
  81. data/spec/spec_helper.rb +2 -2
  82. data/spec/support/dummy_app.rb +123 -63
  83. data/spec/support/dummy_data.rb +11 -0
  84. metadata +107 -59
  85. data/lib/graphql/call.rb +0 -8
  86. data/lib/graphql/connection.rb +0 -65
  87. data/lib/graphql/field.rb +0 -12
  88. data/lib/graphql/field_definer.rb +0 -25
  89. data/lib/graphql/introspection/call_type.rb +0 -13
  90. data/lib/graphql/introspection/connection.rb +0 -9
  91. data/lib/graphql/introspection/field_type.rb +0 -10
  92. data/lib/graphql/introspection/root_call_argument_node.rb +0 -5
  93. data/lib/graphql/introspection/root_call_type.rb +0 -20
  94. data/lib/graphql/introspection/schema_call.rb +0 -8
  95. data/lib/graphql/introspection/schema_type.rb +0 -17
  96. data/lib/graphql/introspection/type_call.rb +0 -8
  97. data/lib/graphql/introspection/type_type.rb +0 -18
  98. data/lib/graphql/node.rb +0 -244
  99. data/lib/graphql/parser/parser.rb +0 -39
  100. data/lib/graphql/parser/transform.rb +0 -22
  101. data/lib/graphql/query.rb +0 -109
  102. data/lib/graphql/root_call.rb +0 -202
  103. data/lib/graphql/root_call_argument.rb +0 -11
  104. data/lib/graphql/root_call_argument_definer.rb +0 -17
  105. data/lib/graphql/schema/all.rb +0 -46
  106. data/lib/graphql/schema/schema.rb +0 -87
  107. data/lib/graphql/schema/schema_validation.rb +0 -32
  108. data/lib/graphql/syntax/call.rb +0 -8
  109. data/lib/graphql/syntax/field.rb +0 -9
  110. data/lib/graphql/syntax/fragment.rb +0 -7
  111. data/lib/graphql/syntax/node.rb +0 -8
  112. data/lib/graphql/syntax/query.rb +0 -8
  113. data/lib/graphql/syntax/variable.rb +0 -7
  114. data/lib/graphql/types/boolean_type.rb +0 -3
  115. data/lib/graphql/types/number_type.rb +0 -3
  116. data/lib/graphql/types/object_type.rb +0 -6
  117. data/lib/graphql/types/string_type.rb +0 -3
  118. data/lib/graphql/version.rb +0 -3
  119. data/spec/graphql/node_spec.rb +0 -69
  120. data/spec/graphql/parser/parser_spec.rb +0 -168
  121. data/spec/graphql/parser/transform_spec.rb +0 -157
  122. data/spec/graphql/query_spec.rb +0 -274
  123. data/spec/graphql/root_call_spec.rb +0 -69
  124. data/spec/graphql/schema/schema_spec.rb +0 -93
  125. data/spec/graphql/schema/schema_validation_spec.rb +0 -48
  126. data/spec/support/nodes.rb +0 -175
@@ -1,93 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe GraphQL::Schema::Schema do
4
- let(:schema) { GraphQL::SCHEMA }
5
- describe 'global instance' do
6
- it 'exists as GraphQL::SCHEMA' do
7
- assert GraphQL::SCHEMA.is_a?(GraphQL::Schema::Schema)
8
- end
9
- end
10
-
11
- describe '#get_call' do
12
- it 'finds calls from their class name' do
13
- assert_equal Nodes::ContextCall, schema.get_call("context")
14
- end
15
-
16
- it 'finds calls from declared names' do
17
- assert_equal Nodes::LikePostCall, schema.get_call("upvote_post")
18
- end
19
- end
20
-
21
- describe '#get_type' do
22
- it 'finds nodes from their class name' do
23
- assert_equal Nodes::PostNode, schema.get_type("post")
24
- end
25
-
26
- it 'finds nodes from declared names' do
27
- assert_equal Nodes::ThumbUpNode, schema.get_type("upvote")
28
- end
29
- end
30
-
31
- describe 'querying schema' do
32
- let(:query_string) { }
33
- let(:query) { GraphQL::Query.new(query_string) }
34
- let(:result) { GraphQL::SCHEMA.all }
35
-
36
- describe 'querying calls' do
37
- let(:upvote_post_call) { result["schema"]["calls"]["edges"].find {|e| e["node"]["name"] == "upvote_post"} }
38
-
39
- it 'returns all calls' do
40
- assert_equal 7, result["schema"]["calls"]["count"]
41
- end
42
-
43
- it 'doesnt show abstract call classes' do
44
- call_names = result["schema"]["calls"]["edges"].map {|e| e["node"]["name"] }
45
- assert(!call_names.include?("find"))
46
- end
47
-
48
- it 'shows return types' do
49
- assert_equal ["post", "upvote"], upvote_post_call["node"]["returns"]
50
- end
51
-
52
- it 'shows argument types' do
53
- expected_arguments = [{"node"=>{"name"=>"post_data", "type"=>"object"}}, {"node"=>{"name"=>"person_id", "type"=>"number"}}]
54
- assert_equal expected_arguments, upvote_post_call["node"]["arguments"]["edges"]
55
- end
56
- end
57
-
58
- describe 'querying types' do
59
- let(:post_type) { result["schema"]["types"]["edges"].find { |e| e["node"]["name"] == "post" }["node"]}
60
- let(:content_field) { post_type["fields"]["edges"].find { |e| e["node"]["name"] == "content" }["node"]}
61
- let(:select_call) { content_field["calls"]["edges"].find { |e| e["node"]["name"] == "select"}["node"]}
62
- let(:type_names) { result["schema"]["types"]["edges"].map {|t| t["node"]["name"] }}
63
-
64
- it 'returns all types' do
65
- types_count = 19
66
- assert_equal types_count, result["schema"]["types"]["count"]
67
- assert_equal types_count, type_names.length
68
- end
69
-
70
- it 'doesnt return types that dont expose anything' do
71
- type_names = result["schema"]["types"]["edges"].map {|e| e["node"]["name"] }
72
- assert(!type_names.include?("application"))
73
- end
74
-
75
- it 'show type name & fields' do
76
- assert_equal "post", post_type["name"]
77
- assert_equal 8, post_type["fields"]["count"]
78
- end
79
-
80
- it 'has custom types' do
81
- assert type_names.include?("letter_selection")
82
- assert_equal "letter_selection", content_field["type"]
83
- end
84
-
85
- it 'shows field type & calls' do
86
- assert_equal "letter_selection", content_field["type"]
87
- assert_equal 3, content_field["calls"]["count"]
88
- assert_equal "select", select_call["name"]
89
- assert_equal "from_chars (req), for_chars (req)", select_call["arguments"]
90
- end
91
- end
92
- end
93
- end
@@ -1,48 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe GraphQL::Schema::SchemaValidation do
4
- let(:schema) { GraphQL::SCHEMA }
5
-
6
- it 'runs' do
7
- schema.validate
8
- end
9
-
10
- describe "when the exposes_class doesnt exist" do
11
- before do
12
- Nodes::PostNode.exposes("BogusPost")
13
- end
14
- after do
15
- Nodes::PostNode.exposes("Post")
16
- end
17
-
18
- it 'raises an error' do
19
- assert_raises(GraphQL::ExposesClassMissingError) { schema.validate }
20
- end
21
- end
22
-
23
- describe "when there's a bad field type" do
24
- before do
25
- Nodes::PostNode.field.bogus_kind(:bogus_title)
26
- end
27
- after do
28
- Nodes::PostNode.remove_field(:bogus_title)
29
- end
30
-
31
- it 'raises an error' do
32
- assert_raises(GraphQL::NodeNotDefinedError) { schema.validate }
33
- end
34
- end
35
-
36
- describe "when a field cant find a corresponding method" do
37
- before do
38
- Nodes::PostNode.field.string(:bogus_title)
39
- end
40
- after do
41
- Nodes::PostNode.remove_field(:bogus_title)
42
- end
43
-
44
- it 'raises an error' do
45
- assert_raises(GraphQL::FieldNotDefinedError) { schema.validate }
46
- end
47
- end
48
- end
@@ -1,175 +0,0 @@
1
- require 'graphql'
2
- require 'support/dummy_app.rb'
3
-
4
- module Nodes
5
- class ApplicationNode < GraphQL::Node
6
- field.number(:id)
7
- cursor :id
8
-
9
- class << self
10
- attr_accessor :model_class
11
- def node_for(m_class)
12
- @model_class = m_class
13
- end
14
- end
15
- end
16
-
17
-
18
- class ApplicationConnection < GraphQL::Connection
19
- type :connection
20
- call :first, -> (prev_items, first) { prev_items.first(first.to_i) }
21
- call :after, -> (prev_items, after) { prev_items.select {|i| i.id > after.to_i } }
22
-
23
- field.number(:count)
24
- field.boolean(:any)
25
-
26
- def count
27
- target.count
28
- end
29
-
30
- def any
31
- target.any?
32
- end
33
- end
34
-
35
- class CommentsConnection < ApplicationConnection
36
- type :comments
37
- field.number :viewer_name_length
38
- field.number :average_rating
39
-
40
- # just to test context:
41
- def viewer_name_length
42
- context.person_name.length
43
- end
44
-
45
- def average_rating
46
- total_rating = target.map(&:rating).inject(&:+).to_f
47
- total_rating / target.size
48
- end
49
- end
50
-
51
- class DateType < GraphQL::Node
52
- exposes "Date"
53
- type :date
54
- call :minus_days, -> (prev_value, minus_days) { prev_value - minus_days.to_i }
55
- field.number(:year)
56
- field.number(:month)
57
- end
58
-
59
- class PostNode < ApplicationNode
60
- node_for Post
61
- exposes "Post"
62
- desc "A blog post entry"
63
-
64
- field.string(:title)
65
- field.letter_selection(:content)
66
- field.number(:length)
67
- field.comments(:comments)
68
- field.date(:published_at)
69
- field.connection(:likes)
70
-
71
- def length
72
- target.content.length
73
- end
74
- end
75
-
76
- class CommentNode < ApplicationNode
77
- node_for Comment
78
- exposes "Comment"
79
- field.string(:content)
80
- field.letter_selection(:letters)
81
- field.post(:post)
82
-
83
- def letters; content; end
84
- end
85
-
86
- # wraps a Like, for testing explicit name
87
- class ThumbUpNode < ApplicationNode
88
- node_for(Like)
89
- exposes "Like"
90
- type "upvote"
91
- field.number :post_id
92
- def id
93
- target.id.to_s + target.id.to_s
94
- end
95
- end
96
-
97
- class ContextNode < GraphQL::Node
98
- exposes "Context"
99
- field.string(:person_name)
100
- field.boolean(:present)
101
-
102
- def cursor
103
- "context"
104
- end
105
-
106
- def present
107
- true
108
- end
109
- end
110
-
111
- class LetterSelectionType < GraphQL::Node
112
- type :letter_selection
113
- call :from, -> (prev_value, chars) { prev_value[(chars.to_i)..-1] }
114
- call :for, -> (prev_value, chars) { prev_value[0, (chars.to_i)] }
115
- call :select, -> (prev_value, from_chars, for_chars) { prev_value[from_chars.to_i, for_chars.to_i] }
116
- def as_result
117
- apply_calls(target)
118
- end
119
- end
120
-
121
- class FindCall < GraphQL::RootCall
122
- abstract!
123
- argument.number("ids", any_number: true)
124
- def execute!(*ids)
125
- model_class = model_type
126
- items = ids.map { |id| model_class.find(id.to_i) }
127
- end
128
- end
129
-
130
- class PostCall < FindCall
131
- returns :post
132
- def model_type
133
- Post
134
- end
135
- end
136
-
137
- class CommentCall < FindCall
138
- returns :comment
139
- def model_type
140
- Comment
141
- end
142
- end
143
-
144
- class ThumbUpCall < FindCall
145
- returns :thumb_up
146
- def model_type
147
- Like
148
- end
149
- end
150
-
151
- class ContextCall < GraphQL::RootCall
152
- returns :context
153
- def execute!
154
- context
155
- end
156
- end
157
-
158
- class LikePostCall < GraphQL::RootCall
159
- indentifier "upvote_post"
160
- returns :post, :upvote
161
-
162
- argument.object("post_data")
163
- argument.number("person_id")
164
-
165
-
166
- def execute!(post_data, person_id)
167
- post_id = post_data["id"]
168
- like = Like.create(post_id: post_id)
169
- {
170
- post: Post.find(post_id),
171
- upvote: like
172
- }
173
- end
174
- end
175
- end