graphql 1.10.1 → 1.13.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.
Potentially problematic release.
This version of graphql might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/lib/generators/graphql/core.rb +18 -2
- data/lib/generators/graphql/install_generator.rb +36 -6
- data/lib/generators/graphql/loader_generator.rb +1 -0
- data/lib/generators/graphql/mutation_generator.rb +2 -1
- data/lib/generators/graphql/object_generator.rb +54 -9
- data/lib/generators/graphql/relay.rb +63 -0
- data/lib/generators/graphql/relay_generator.rb +21 -0
- data/lib/generators/graphql/templates/base_argument.erb +2 -0
- data/lib/generators/graphql/templates/base_connection.erb +8 -0
- data/lib/generators/graphql/templates/base_edge.erb +8 -0
- data/lib/generators/graphql/templates/base_enum.erb +2 -0
- data/lib/generators/graphql/templates/base_field.erb +2 -0
- data/lib/generators/graphql/templates/base_input_object.erb +2 -0
- data/lib/generators/graphql/templates/base_interface.erb +2 -0
- data/lib/generators/graphql/templates/base_mutation.erb +2 -0
- data/lib/generators/graphql/templates/base_object.erb +2 -0
- data/lib/generators/graphql/templates/base_scalar.erb +2 -0
- data/lib/generators/graphql/templates/base_union.erb +2 -0
- data/lib/generators/graphql/templates/enum.erb +2 -0
- data/lib/generators/graphql/templates/graphql_controller.erb +16 -12
- data/lib/generators/graphql/templates/interface.erb +2 -0
- data/lib/generators/graphql/templates/loader.erb +2 -0
- data/lib/generators/graphql/templates/mutation.erb +2 -0
- data/lib/generators/graphql/templates/mutation_type.erb +2 -0
- data/lib/generators/graphql/templates/node_type.erb +9 -0
- data/lib/generators/graphql/templates/object.erb +3 -1
- data/lib/generators/graphql/templates/query_type.erb +3 -3
- data/lib/generators/graphql/templates/scalar.erb +2 -0
- data/lib/generators/graphql/templates/schema.erb +21 -33
- data/lib/generators/graphql/templates/union.erb +3 -1
- data/lib/generators/graphql/type_generator.rb +1 -1
- data/lib/graphql/analysis/analyze_query.rb +7 -0
- data/lib/graphql/analysis/ast/field_usage.rb +24 -1
- data/lib/graphql/analysis/ast/query_complexity.rb +126 -109
- data/lib/graphql/analysis/ast/visitor.rb +13 -5
- data/lib/graphql/analysis/ast.rb +11 -2
- data/lib/graphql/argument.rb +3 -3
- data/lib/graphql/backtrace/inspect_result.rb +0 -1
- data/lib/graphql/backtrace/legacy_tracer.rb +56 -0
- data/lib/graphql/backtrace/table.rb +34 -3
- data/lib/graphql/backtrace/traced_error.rb +0 -1
- data/lib/graphql/backtrace/tracer.rb +40 -9
- data/lib/graphql/backtrace.rb +28 -19
- data/lib/graphql/backwards_compatibility.rb +2 -1
- data/lib/graphql/base_type.rb +1 -1
- data/lib/graphql/compatibility/execution_specification/specification_schema.rb +2 -2
- data/lib/graphql/compatibility/execution_specification.rb +1 -0
- data/lib/graphql/compatibility/lazy_execution_specification.rb +2 -0
- data/lib/graphql/compatibility/query_parser_specification.rb +2 -0
- data/lib/graphql/compatibility/schema_parser_specification.rb +2 -0
- data/lib/graphql/dataloader/null_dataloader.rb +22 -0
- data/lib/graphql/dataloader/request.rb +19 -0
- data/lib/graphql/dataloader/request_all.rb +19 -0
- data/lib/graphql/dataloader/source.rb +155 -0
- data/lib/graphql/dataloader.rb +308 -0
- data/lib/graphql/define/assign_global_id_field.rb +2 -2
- data/lib/graphql/define/defined_object_proxy.rb +1 -1
- data/lib/graphql/define/instance_definable.rb +34 -4
- data/lib/graphql/define/type_definer.rb +5 -5
- data/lib/graphql/deprecated_dsl.rb +18 -5
- data/lib/graphql/deprecation.rb +9 -0
- data/lib/graphql/directive.rb +4 -4
- data/lib/graphql/enum_type.rb +7 -1
- data/lib/graphql/execution/errors.rb +110 -7
- data/lib/graphql/execution/execute.rb +8 -1
- data/lib/graphql/execution/instrumentation.rb +1 -1
- data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
- data/lib/graphql/execution/interpreter/arguments.rb +88 -0
- data/lib/graphql/execution/interpreter/arguments_cache.rb +103 -0
- data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
- data/lib/graphql/execution/interpreter/resolve.rb +37 -25
- data/lib/graphql/execution/interpreter/runtime.rb +685 -421
- data/lib/graphql/execution/interpreter.rb +42 -13
- data/lib/graphql/execution/lazy.rb +5 -1
- data/lib/graphql/execution/lookahead.rb +25 -110
- data/lib/graphql/execution/multiplex.rb +37 -25
- data/lib/graphql/field.rb +5 -1
- data/lib/graphql/function.rb +4 -0
- data/lib/graphql/input_object_type.rb +6 -0
- data/lib/graphql/integer_decoding_error.rb +17 -0
- data/lib/graphql/integer_encoding_error.rb +18 -2
- data/lib/graphql/interface_type.rb +7 -0
- data/lib/graphql/internal_representation/document.rb +2 -2
- data/lib/graphql/internal_representation/rewrite.rb +1 -1
- data/lib/graphql/internal_representation/scope.rb +2 -2
- data/lib/graphql/internal_representation/visit.rb +2 -2
- data/lib/graphql/introspection/directive_type.rb +8 -4
- data/lib/graphql/introspection/entry_points.rb +2 -2
- data/lib/graphql/introspection/enum_value_type.rb +2 -2
- data/lib/graphql/introspection/field_type.rb +9 -5
- data/lib/graphql/introspection/input_value_type.rb +15 -3
- data/lib/graphql/introspection/introspection_query.rb +6 -92
- data/lib/graphql/introspection/schema_type.rb +4 -4
- data/lib/graphql/introspection/type_type.rb +16 -12
- data/lib/graphql/introspection.rb +96 -0
- data/lib/graphql/invalid_null_error.rb +18 -0
- data/lib/graphql/language/block_string.rb +20 -5
- data/lib/graphql/language/cache.rb +37 -0
- data/lib/graphql/language/document_from_schema_definition.rb +73 -25
- data/lib/graphql/language/lexer.rb +4 -3
- data/lib/graphql/language/lexer.rl +3 -3
- data/lib/graphql/language/nodes.rb +51 -89
- data/lib/graphql/language/parser.rb +552 -530
- data/lib/graphql/language/parser.y +114 -99
- data/lib/graphql/language/printer.rb +7 -2
- data/lib/graphql/language/sanitized_printer.rb +222 -0
- data/lib/graphql/language/token.rb +0 -4
- data/lib/graphql/language/visitor.rb +2 -2
- data/lib/graphql/language.rb +2 -0
- data/lib/graphql/name_validator.rb +2 -7
- data/lib/graphql/object_type.rb +44 -35
- data/lib/graphql/pagination/active_record_relation_connection.rb +14 -1
- data/lib/graphql/pagination/array_connection.rb +2 -2
- data/lib/graphql/pagination/connection.rb +75 -20
- data/lib/graphql/pagination/connections.rb +83 -31
- data/lib/graphql/pagination/relation_connection.rb +34 -14
- data/lib/graphql/parse_error.rb +0 -1
- data/lib/graphql/query/arguments.rb +4 -3
- data/lib/graphql/query/arguments_cache.rb +1 -2
- data/lib/graphql/query/context.rb +42 -7
- data/lib/graphql/query/executor.rb +0 -1
- data/lib/graphql/query/fingerprint.rb +26 -0
- data/lib/graphql/query/input_validation_result.rb +23 -6
- data/lib/graphql/query/literal_input.rb +1 -1
- data/lib/graphql/query/null_context.rb +24 -8
- data/lib/graphql/query/serial_execution/field_resolution.rb +1 -1
- data/lib/graphql/query/serial_execution.rb +1 -0
- data/lib/graphql/query/validation_pipeline.rb +5 -2
- data/lib/graphql/query/variable_validation_error.rb +1 -1
- data/lib/graphql/query/variables.rb +14 -4
- data/lib/graphql/query.rb +68 -13
- data/lib/graphql/railtie.rb +9 -1
- data/lib/graphql/rake_task.rb +12 -9
- data/lib/graphql/relay/array_connection.rb +10 -12
- data/lib/graphql/relay/base_connection.rb +26 -13
- data/lib/graphql/relay/connection_instrumentation.rb +4 -4
- data/lib/graphql/relay/connection_type.rb +1 -1
- data/lib/graphql/relay/edges_instrumentation.rb +0 -1
- data/lib/graphql/relay/mutation.rb +1 -0
- data/lib/graphql/relay/node.rb +3 -0
- data/lib/graphql/relay/range_add.rb +23 -9
- data/lib/graphql/relay/relation_connection.rb +8 -10
- data/lib/graphql/relay/type_extensions.rb +2 -0
- data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
- data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
- data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
- data/lib/graphql/rubocop.rb +4 -0
- data/lib/graphql/scalar_type.rb +16 -1
- data/lib/graphql/schema/addition.rb +247 -0
- data/lib/graphql/schema/argument.rb +210 -12
- data/lib/graphql/schema/base_64_encoder.rb +2 -0
- data/lib/graphql/schema/build_from_definition/resolve_map.rb +3 -1
- data/lib/graphql/schema/build_from_definition.rb +213 -86
- data/lib/graphql/schema/default_type_error.rb +2 -0
- data/lib/graphql/schema/directive/deprecated.rb +1 -1
- data/lib/graphql/schema/directive/feature.rb +1 -1
- data/lib/graphql/schema/directive/flagged.rb +57 -0
- data/lib/graphql/schema/directive/include.rb +1 -1
- data/lib/graphql/schema/directive/skip.rb +1 -1
- data/lib/graphql/schema/directive/transform.rb +14 -2
- data/lib/graphql/schema/directive.rb +78 -2
- data/lib/graphql/schema/enum.rb +80 -9
- data/lib/graphql/schema/enum_value.rb +17 -6
- data/lib/graphql/schema/field/connection_extension.rb +46 -30
- data/lib/graphql/schema/field/scope_extension.rb +1 -1
- data/lib/graphql/schema/field.rb +285 -133
- data/lib/graphql/schema/find_inherited_value.rb +4 -1
- data/lib/graphql/schema/finder.rb +5 -5
- data/lib/graphql/schema/input_object.rb +97 -89
- data/lib/graphql/schema/interface.rb +24 -19
- data/lib/graphql/schema/late_bound_type.rb +2 -2
- data/lib/graphql/schema/list.rb +7 -1
- data/lib/graphql/schema/loader.rb +137 -103
- data/lib/graphql/schema/member/accepts_definition.rb +8 -1
- data/lib/graphql/schema/member/base_dsl_methods.rb +15 -19
- data/lib/graphql/schema/member/build_type.rb +14 -7
- data/lib/graphql/schema/member/has_arguments.rb +205 -12
- data/lib/graphql/schema/member/has_ast_node.rb +4 -1
- data/lib/graphql/schema/member/has_deprecation_reason.rb +25 -0
- data/lib/graphql/schema/member/has_directives.rb +98 -0
- data/lib/graphql/schema/member/has_fields.rb +95 -30
- data/lib/graphql/schema/member/has_interfaces.rb +90 -0
- data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
- data/lib/graphql/schema/member/has_validators.rb +31 -0
- data/lib/graphql/schema/member/instrumentation.rb +0 -1
- data/lib/graphql/schema/member/type_system_helpers.rb +3 -3
- data/lib/graphql/schema/member.rb +6 -0
- data/lib/graphql/schema/middleware_chain.rb +1 -1
- data/lib/graphql/schema/mutation.rb +4 -0
- data/lib/graphql/schema/non_null.rb +5 -0
- data/lib/graphql/schema/object.rb +47 -46
- data/lib/graphql/schema/possible_types.rb +9 -4
- data/lib/graphql/schema/printer.rb +16 -34
- data/lib/graphql/schema/relay_classic_mutation.rb +32 -4
- data/lib/graphql/schema/resolver/has_payload_type.rb +34 -4
- data/lib/graphql/schema/resolver.rb +123 -63
- data/lib/graphql/schema/scalar.rb +11 -1
- data/lib/graphql/schema/subscription.rb +57 -21
- data/lib/graphql/schema/timeout.rb +29 -15
- data/lib/graphql/schema/timeout_middleware.rb +3 -1
- data/lib/graphql/schema/type_expression.rb +1 -1
- data/lib/graphql/schema/type_membership.rb +18 -4
- data/lib/graphql/schema/union.rb +41 -1
- data/lib/graphql/schema/unique_within_type.rb +1 -2
- data/lib/graphql/schema/validation.rb +12 -2
- data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
- data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
- data/lib/graphql/schema/validator/exclusion_validator.rb +33 -0
- data/lib/graphql/schema/validator/format_validator.rb +48 -0
- data/lib/graphql/schema/validator/inclusion_validator.rb +35 -0
- data/lib/graphql/schema/validator/length_validator.rb +59 -0
- data/lib/graphql/schema/validator/numericality_validator.rb +82 -0
- data/lib/graphql/schema/validator/required_validator.rb +68 -0
- data/lib/graphql/schema/validator.rb +174 -0
- data/lib/graphql/schema/warden.rb +153 -28
- data/lib/graphql/schema.rb +364 -330
- data/lib/graphql/static_validation/all_rules.rb +1 -0
- data/lib/graphql/static_validation/base_visitor.rb +8 -5
- data/lib/graphql/static_validation/definition_dependencies.rb +0 -1
- data/lib/graphql/static_validation/error.rb +3 -1
- data/lib/graphql/static_validation/literal_validator.rb +51 -26
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +44 -87
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +22 -6
- data/lib/graphql/static_validation/rules/arguments_are_defined.rb +28 -22
- data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +4 -2
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +1 -1
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +79 -43
- data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
- data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
- data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
- data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
- data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +1 -1
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +6 -7
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +9 -10
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +8 -8
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +4 -2
- data/lib/graphql/static_validation/validation_context.rb +9 -3
- data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
- data/lib/graphql/static_validation/validator.rb +42 -8
- data/lib/graphql/static_validation.rb +1 -0
- data/lib/graphql/string_encoding_error.rb +13 -3
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +118 -19
- data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
- data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +21 -0
- data/lib/graphql/subscriptions/event.rb +81 -30
- data/lib/graphql/subscriptions/instrumentation.rb +0 -1
- data/lib/graphql/subscriptions/serialize.rb +33 -6
- data/lib/graphql/subscriptions/subscription_root.rb +15 -4
- data/lib/graphql/subscriptions.rb +88 -45
- data/lib/graphql/tracing/active_support_notifications_tracing.rb +2 -1
- data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
- data/lib/graphql/tracing/appsignal_tracing.rb +15 -0
- data/lib/graphql/tracing/new_relic_tracing.rb +1 -12
- data/lib/graphql/tracing/platform_tracing.rb +43 -17
- data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +4 -1
- data/lib/graphql/tracing/scout_tracing.rb +11 -0
- data/lib/graphql/tracing/skylight_tracing.rb +1 -1
- data/lib/graphql/tracing/statsd_tracing.rb +42 -0
- data/lib/graphql/tracing.rb +9 -33
- data/lib/graphql/types/big_int.rb +5 -1
- data/lib/graphql/types/int.rb +10 -3
- data/lib/graphql/types/iso_8601_date.rb +3 -3
- data/lib/graphql/types/iso_8601_date_time.rb +25 -10
- data/lib/graphql/types/relay/base_connection.rb +6 -90
- data/lib/graphql/types/relay/base_edge.rb +2 -34
- data/lib/graphql/types/relay/connection_behaviors.rb +156 -0
- data/lib/graphql/types/relay/default_relay.rb +27 -0
- data/lib/graphql/types/relay/edge_behaviors.rb +53 -0
- data/lib/graphql/types/relay/has_node_field.rb +41 -0
- data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
- data/lib/graphql/types/relay/node.rb +2 -4
- data/lib/graphql/types/relay/node_behaviors.rb +15 -0
- data/lib/graphql/types/relay/node_field.rb +2 -20
- data/lib/graphql/types/relay/nodes_field.rb +2 -20
- data/lib/graphql/types/relay/page_info.rb +2 -14
- data/lib/graphql/types/relay/page_info_behaviors.rb +25 -0
- data/lib/graphql/types/relay.rb +11 -3
- data/lib/graphql/types/string.rb +8 -2
- data/lib/graphql/unauthorized_error.rb +2 -2
- data/lib/graphql/union_type.rb +2 -0
- data/lib/graphql/upgrader/member.rb +1 -0
- data/lib/graphql/upgrader/schema.rb +1 -0
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +65 -31
- data/readme.md +3 -6
- metadata +77 -112
- data/lib/graphql/execution/interpreter/hash_response.rb +0 -46
- data/lib/graphql/literal_validation_error.rb +0 -6
- data/lib/graphql/types/relay/base_field.rb +0 -22
- data/lib/graphql/types/relay/base_interface.rb +0 -29
- data/lib/graphql/types/relay/base_object.rb +0 -26
@@ -2,10 +2,10 @@ class GraphQL::Language::Parser
|
|
2
2
|
rule
|
3
3
|
target: document
|
4
4
|
|
5
|
-
document: definitions_list {
|
5
|
+
document: definitions_list { result = make_node(:Document, definitions: val[0])}
|
6
6
|
|
7
7
|
definitions_list:
|
8
|
-
definition {
|
8
|
+
definition { result = [val[0]]}
|
9
9
|
| definitions_list definition { val[0] << val[1] }
|
10
10
|
|
11
11
|
definition:
|
@@ -19,7 +19,7 @@ rule
|
|
19
19
|
|
20
20
|
operation_definition:
|
21
21
|
operation_type operation_name_opt variable_definitions_opt directives_list_opt selection_set {
|
22
|
-
|
22
|
+
result = make_node(
|
23
23
|
:OperationDefinition, {
|
24
24
|
operation_type: val[0],
|
25
25
|
name: val[1],
|
@@ -31,7 +31,7 @@ rule
|
|
31
31
|
)
|
32
32
|
}
|
33
33
|
| LCURLY selection_list RCURLY {
|
34
|
-
|
34
|
+
result = make_node(
|
35
35
|
:OperationDefinition, {
|
36
36
|
operation_type: "query",
|
37
37
|
selections: val[1],
|
@@ -40,7 +40,7 @@ rule
|
|
40
40
|
)
|
41
41
|
}
|
42
42
|
| LCURLY RCURLY {
|
43
|
-
|
43
|
+
result = make_node(
|
44
44
|
:OperationDefinition, {
|
45
45
|
operation_type: "query",
|
46
46
|
selections: [],
|
@@ -55,20 +55,20 @@ rule
|
|
55
55
|
| SUBSCRIPTION
|
56
56
|
|
57
57
|
operation_name_opt:
|
58
|
-
/* none */ {
|
58
|
+
/* none */ { result = nil }
|
59
59
|
| name
|
60
60
|
|
61
61
|
variable_definitions_opt:
|
62
|
-
/* none */ {
|
63
|
-
| LPAREN variable_definitions_list RPAREN {
|
62
|
+
/* none */ { result = EMPTY_ARRAY }
|
63
|
+
| LPAREN variable_definitions_list RPAREN { result = val[1] }
|
64
64
|
|
65
65
|
variable_definitions_list:
|
66
|
-
variable_definition {
|
66
|
+
variable_definition { result = [val[0]] }
|
67
67
|
| variable_definitions_list variable_definition { val[0] << val[1] }
|
68
68
|
|
69
69
|
variable_definition:
|
70
70
|
VAR_SIGN name COLON type default_value_opt {
|
71
|
-
|
71
|
+
result = make_node(:VariableDefinition, {
|
72
72
|
name: val[1],
|
73
73
|
type: val[3],
|
74
74
|
default_value: val[4],
|
@@ -77,26 +77,26 @@ rule
|
|
77
77
|
}
|
78
78
|
|
79
79
|
type:
|
80
|
-
nullable_type {
|
81
|
-
| nullable_type BANG {
|
80
|
+
nullable_type { result = val[0] }
|
81
|
+
| nullable_type BANG { result = make_node(:NonNullType, of_type: val[0]) }
|
82
82
|
|
83
83
|
nullable_type:
|
84
|
-
name {
|
85
|
-
| LBRACKET type RBRACKET {
|
84
|
+
name { result = make_node(:TypeName, name: val[0])}
|
85
|
+
| LBRACKET type RBRACKET { result = make_node(:ListType, of_type: val[1]) }
|
86
86
|
|
87
87
|
default_value_opt:
|
88
|
-
/* none */ {
|
89
|
-
| EQUALS literal_value {
|
88
|
+
/* none */ { result = nil }
|
89
|
+
| EQUALS literal_value { result = val[1] }
|
90
90
|
|
91
91
|
selection_set:
|
92
|
-
LCURLY selection_list RCURLY {
|
92
|
+
LCURLY selection_list RCURLY { result = val[1] }
|
93
93
|
|
94
94
|
selection_set_opt:
|
95
|
-
/* none */ {
|
96
|
-
| selection_set {
|
95
|
+
/* none */ { result = EMPTY_ARRAY }
|
96
|
+
| selection_set { result = val[0] }
|
97
97
|
|
98
98
|
selection_list:
|
99
|
-
selection {
|
99
|
+
selection { result = [result] }
|
100
100
|
| selection_list selection { val[0] << val[1] }
|
101
101
|
|
102
102
|
selection:
|
@@ -106,7 +106,7 @@ rule
|
|
106
106
|
|
107
107
|
field:
|
108
108
|
name arguments_opt directives_list_opt selection_set_opt {
|
109
|
-
|
109
|
+
result = make_node(
|
110
110
|
:Field, {
|
111
111
|
name: val[0],
|
112
112
|
arguments: val[1],
|
@@ -117,7 +117,7 @@ rule
|
|
117
117
|
)
|
118
118
|
}
|
119
119
|
| name COLON name arguments_opt directives_list_opt selection_set_opt {
|
120
|
-
|
120
|
+
result = make_node(
|
121
121
|
:Field, {
|
122
122
|
alias: val[0],
|
123
123
|
name: val[2],
|
@@ -160,29 +160,29 @@ rule
|
|
160
160
|
| schema_keyword
|
161
161
|
|
162
162
|
enum_value_definition:
|
163
|
-
description_opt enum_name directives_list_opt {
|
163
|
+
description_opt enum_name directives_list_opt { result = make_node(:EnumValueDefinition, name: val[1], directives: val[2], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1]) }
|
164
164
|
|
165
165
|
enum_value_definitions:
|
166
|
-
enum_value_definition {
|
167
|
-
| enum_value_definitions enum_value_definition {
|
166
|
+
enum_value_definition { result = [val[0]] }
|
167
|
+
| enum_value_definitions enum_value_definition { result = val[0] << val[1] }
|
168
168
|
|
169
169
|
arguments_opt:
|
170
|
-
/* none */ {
|
171
|
-
| LPAREN arguments_list RPAREN {
|
170
|
+
/* none */ { result = EMPTY_ARRAY }
|
171
|
+
| LPAREN arguments_list RPAREN { result = val[1] }
|
172
172
|
|
173
173
|
arguments_list:
|
174
|
-
argument {
|
174
|
+
argument { result = [val[0]] }
|
175
175
|
| arguments_list argument { val[0] << val[1] }
|
176
176
|
|
177
177
|
argument:
|
178
|
-
name COLON input_value {
|
178
|
+
name COLON input_value { result = make_node(:Argument, name: val[0], value: val[2], position_source: val[0])}
|
179
179
|
|
180
180
|
literal_value:
|
181
|
-
FLOAT {
|
182
|
-
| INT {
|
183
|
-
| STRING {
|
184
|
-
| TRUE {
|
185
|
-
| FALSE {
|
181
|
+
FLOAT { result = val[0].to_f }
|
182
|
+
| INT { result = val[0].to_i }
|
183
|
+
| STRING { result = val[0].to_s }
|
184
|
+
| TRUE { result = true }
|
185
|
+
| FALSE { result = false }
|
186
186
|
| null_value
|
187
187
|
| enum_value
|
188
188
|
| list_value
|
@@ -193,58 +193,58 @@ rule
|
|
193
193
|
| variable
|
194
194
|
| object_value
|
195
195
|
|
196
|
-
null_value: NULL {
|
197
|
-
variable: VAR_SIGN name {
|
196
|
+
null_value: NULL { result = make_node(:NullValue, name: val[0], position_source: val[0]) }
|
197
|
+
variable: VAR_SIGN name { result = make_node(:VariableIdentifier, name: val[1], position_source: val[0]) }
|
198
198
|
|
199
199
|
list_value:
|
200
|
-
LBRACKET RBRACKET {
|
201
|
-
| LBRACKET list_value_list RBRACKET {
|
200
|
+
LBRACKET RBRACKET { result = EMPTY_ARRAY }
|
201
|
+
| LBRACKET list_value_list RBRACKET { result = val[1] }
|
202
202
|
|
203
203
|
list_value_list:
|
204
|
-
input_value {
|
204
|
+
input_value { result = [val[0]] }
|
205
205
|
| list_value_list input_value { val[0] << val[1] }
|
206
206
|
|
207
207
|
object_value:
|
208
|
-
LCURLY RCURLY {
|
209
|
-
| LCURLY object_value_list RCURLY {
|
208
|
+
LCURLY RCURLY { result = make_node(:InputObject, arguments: [], position_source: val[0])}
|
209
|
+
| LCURLY object_value_list RCURLY { result = make_node(:InputObject, arguments: val[1], position_source: val[0])}
|
210
210
|
|
211
211
|
object_value_list:
|
212
|
-
object_value_field {
|
212
|
+
object_value_field { result = [val[0]] }
|
213
213
|
| object_value_list object_value_field { val[0] << val[1] }
|
214
214
|
|
215
215
|
object_value_field:
|
216
|
-
name COLON input_value {
|
216
|
+
name COLON input_value { result = make_node(:Argument, name: val[0], value: val[2], position_source: val[0])}
|
217
217
|
|
218
218
|
/* like the previous, but with literals only: */
|
219
219
|
object_literal_value:
|
220
|
-
LCURLY RCURLY {
|
221
|
-
| LCURLY object_literal_value_list RCURLY {
|
220
|
+
LCURLY RCURLY { result = make_node(:InputObject, arguments: [], position_source: val[0])}
|
221
|
+
| LCURLY object_literal_value_list RCURLY { result = make_node(:InputObject, arguments: val[1], position_source: val[0])}
|
222
222
|
|
223
223
|
object_literal_value_list:
|
224
|
-
object_literal_value_field {
|
224
|
+
object_literal_value_field { result = [val[0]] }
|
225
225
|
| object_literal_value_list object_literal_value_field { val[0] << val[1] }
|
226
226
|
|
227
227
|
object_literal_value_field:
|
228
|
-
name COLON literal_value {
|
228
|
+
name COLON literal_value { result = make_node(:Argument, name: val[0], value: val[2], position_source: val[0])}
|
229
229
|
|
230
|
-
enum_value: enum_name {
|
230
|
+
enum_value: enum_name { result = make_node(:Enum, name: val[0], position_source: val[0]) }
|
231
231
|
|
232
232
|
directives_list_opt:
|
233
|
-
/* none */ {
|
233
|
+
/* none */ { result = EMPTY_ARRAY }
|
234
234
|
| directives_list
|
235
235
|
|
236
236
|
directives_list:
|
237
|
-
directive {
|
237
|
+
directive { result = [val[0]] }
|
238
238
|
| directives_list directive { val[0] << val[1] }
|
239
239
|
|
240
|
-
directive: DIR_SIGN name arguments_opt {
|
240
|
+
directive: DIR_SIGN name arguments_opt { result = make_node(:Directive, name: val[1], arguments: val[2], position_source: val[0]) }
|
241
241
|
|
242
242
|
fragment_spread:
|
243
|
-
ELLIPSIS name_without_on directives_list_opt {
|
243
|
+
ELLIPSIS name_without_on directives_list_opt { result = make_node(:FragmentSpread, name: val[1], directives: val[2], position_source: val[0]) }
|
244
244
|
|
245
245
|
inline_fragment:
|
246
246
|
ELLIPSIS ON type directives_list_opt selection_set {
|
247
|
-
|
247
|
+
result = make_node(:InlineFragment, {
|
248
248
|
type: val[2],
|
249
249
|
directives: val[3],
|
250
250
|
selections: val[4],
|
@@ -252,7 +252,7 @@ rule
|
|
252
252
|
})
|
253
253
|
}
|
254
254
|
| ELLIPSIS directives_list_opt selection_set {
|
255
|
-
|
255
|
+
result = make_node(:InlineFragment, {
|
256
256
|
type: nil,
|
257
257
|
directives: val[1],
|
258
258
|
selections: val[2],
|
@@ -262,7 +262,7 @@ rule
|
|
262
262
|
|
263
263
|
fragment_definition:
|
264
264
|
FRAGMENT fragment_name_opt ON type directives_list_opt selection_set {
|
265
|
-
|
265
|
+
result = make_node(:FragmentDefinition, {
|
266
266
|
name: val[1],
|
267
267
|
type: val[3],
|
268
268
|
directives: val[4],
|
@@ -273,7 +273,7 @@ rule
|
|
273
273
|
}
|
274
274
|
|
275
275
|
fragment_name_opt:
|
276
|
-
/* none */ {
|
276
|
+
/* none */ { result = nil }
|
277
277
|
| name_without_on
|
278
278
|
|
279
279
|
type_system_definition:
|
@@ -282,14 +282,14 @@ rule
|
|
282
282
|
| directive_definition
|
283
283
|
|
284
284
|
schema_definition:
|
285
|
-
SCHEMA directives_list_opt LCURLY operation_type_definition_list RCURLY {
|
285
|
+
SCHEMA directives_list_opt LCURLY operation_type_definition_list RCURLY { result = make_node(:SchemaDefinition, position_source: val[0], definition_line: val[0].line, directives: val[1], **val[3]) }
|
286
286
|
|
287
287
|
operation_type_definition_list:
|
288
288
|
operation_type_definition
|
289
|
-
| operation_type_definition_list operation_type_definition {
|
289
|
+
| operation_type_definition_list operation_type_definition { result = val[0].merge(val[1]) }
|
290
290
|
|
291
291
|
operation_type_definition:
|
292
|
-
operation_type COLON name {
|
292
|
+
operation_type COLON name { result = { val[0].to_s.to_sym => val[2] } }
|
293
293
|
|
294
294
|
type_definition:
|
295
295
|
scalar_type_definition
|
@@ -304,8 +304,8 @@ rule
|
|
304
304
|
| type_extension
|
305
305
|
|
306
306
|
schema_extension:
|
307
|
-
EXTEND SCHEMA directives_list_opt LCURLY operation_type_definition_list RCURLY {
|
308
|
-
| EXTEND SCHEMA directives_list {
|
307
|
+
EXTEND SCHEMA directives_list_opt LCURLY operation_type_definition_list RCURLY { result = make_node(:SchemaExtension, position_source: val[0], directives: val[2], **val[4]) }
|
308
|
+
| EXTEND SCHEMA directives_list { result = make_node(:SchemaExtension, position_source: val[0], directives: val[2]) }
|
309
309
|
|
310
310
|
type_extension:
|
311
311
|
scalar_type_extension
|
@@ -315,30 +315,31 @@ rule
|
|
315
315
|
| enum_type_extension
|
316
316
|
| input_object_type_extension
|
317
317
|
|
318
|
-
scalar_type_extension: EXTEND SCALAR name directives_list {
|
318
|
+
scalar_type_extension: EXTEND SCALAR name directives_list { result = make_node(:ScalarTypeExtension, name: val[2], directives: val[3], position_source: val[0]) }
|
319
319
|
|
320
320
|
object_type_extension:
|
321
321
|
/* TODO - This first one shouldn't be necessary but parser is getting confused */
|
322
|
-
EXTEND TYPE name implements LCURLY field_definition_list RCURLY {
|
323
|
-
| EXTEND TYPE name implements_opt directives_list_opt LCURLY field_definition_list RCURLY {
|
324
|
-
| EXTEND TYPE name implements_opt directives_list {
|
325
|
-
| EXTEND TYPE name implements {
|
322
|
+
EXTEND TYPE name implements LCURLY field_definition_list RCURLY { result = make_node(:ObjectTypeExtension, name: val[2], interfaces: val[3], directives: [], fields: val[5], position_source: val[0]) }
|
323
|
+
| EXTEND TYPE name implements_opt directives_list_opt LCURLY field_definition_list RCURLY { result = make_node(:ObjectTypeExtension, name: val[2], interfaces: val[3], directives: val[4], fields: val[6], position_source: val[0]) }
|
324
|
+
| EXTEND TYPE name implements_opt directives_list { result = make_node(:ObjectTypeExtension, name: val[2], interfaces: val[3], directives: val[4], fields: [], position_source: val[0]) }
|
325
|
+
| EXTEND TYPE name implements { result = make_node(:ObjectTypeExtension, name: val[2], interfaces: val[3], directives: [], fields: [], position_source: val[0]) }
|
326
326
|
|
327
327
|
interface_type_extension:
|
328
|
-
EXTEND INTERFACE name directives_list_opt LCURLY field_definition_list RCURLY {
|
329
|
-
| EXTEND INTERFACE name directives_list {
|
328
|
+
EXTEND INTERFACE name implements_opt directives_list_opt LCURLY field_definition_list RCURLY { result = make_node(:InterfaceTypeExtension, name: val[2], interfaces: val[3], directives: val[4], fields: val[6], position_source: val[0]) }
|
329
|
+
| EXTEND INTERFACE name implements_opt directives_list { result = make_node(:InterfaceTypeExtension, name: val[2], interfaces: val[3], directives: val[4], fields: [], position_source: val[0]) }
|
330
|
+
| EXTEND INTERFACE name implements { result = make_node(:InterfaceTypeExtension, name: val[2], interfaces: val[3], directives: [], fields: [], position_source: val[0]) }
|
330
331
|
|
331
332
|
union_type_extension:
|
332
|
-
EXTEND UNION name directives_list_opt EQUALS union_members {
|
333
|
-
| EXTEND UNION name directives_list {
|
333
|
+
EXTEND UNION name directives_list_opt EQUALS union_members { result = make_node(:UnionTypeExtension, name: val[2], directives: val[3], types: val[5], position_source: val[0]) }
|
334
|
+
| EXTEND UNION name directives_list { result = make_node(:UnionTypeExtension, name: val[2], directives: val[3], types: [], position_source: val[0]) }
|
334
335
|
|
335
336
|
enum_type_extension:
|
336
|
-
EXTEND ENUM name directives_list_opt LCURLY enum_value_definitions RCURLY {
|
337
|
-
| EXTEND ENUM name directives_list {
|
337
|
+
EXTEND ENUM name directives_list_opt LCURLY enum_value_definitions RCURLY { result = make_node(:EnumTypeExtension, name: val[2], directives: val[3], values: val[5], position_source: val[0]) }
|
338
|
+
| EXTEND ENUM name directives_list { result = make_node(:EnumTypeExtension, name: val[2], directives: val[3], values: [], position_source: val[0]) }
|
338
339
|
|
339
340
|
input_object_type_extension:
|
340
|
-
EXTEND INPUT name directives_list_opt LCURLY input_value_definition_list RCURLY {
|
341
|
-
| EXTEND INPUT name directives_list {
|
341
|
+
EXTEND INPUT name directives_list_opt LCURLY input_value_definition_list RCURLY { result = make_node(:InputObjectTypeExtension, name: val[2], directives: val[3], fields: val[5], position_source: val[0]) }
|
342
|
+
| EXTEND INPUT name directives_list { result = make_node(:InputObjectTypeExtension, name: val[2], directives: val[3], fields: [], position_source: val[0]) }
|
342
343
|
|
343
344
|
description: STRING
|
344
345
|
|
@@ -348,85 +349,85 @@ rule
|
|
348
349
|
|
349
350
|
scalar_type_definition:
|
350
351
|
description_opt SCALAR name directives_list_opt {
|
351
|
-
|
352
|
+
result = make_node(:ScalarTypeDefinition, name: val[2], directives: val[3], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
|
352
353
|
}
|
353
354
|
|
354
355
|
object_type_definition:
|
355
356
|
description_opt TYPE name implements_opt directives_list_opt LCURLY field_definition_list RCURLY {
|
356
|
-
|
357
|
+
result = make_node(:ObjectTypeDefinition, name: val[2], interfaces: val[3], directives: val[4], fields: val[6], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
|
357
358
|
}
|
358
359
|
|
359
360
|
implements_opt:
|
360
|
-
/* none */ {
|
361
|
+
/* none */ { result = EMPTY_ARRAY }
|
361
362
|
| implements
|
362
363
|
|
363
364
|
implements:
|
364
|
-
IMPLEMENTS AMP interfaces_list {
|
365
|
-
| IMPLEMENTS interfaces_list {
|
366
|
-
| IMPLEMENTS legacy_interfaces_list {
|
365
|
+
IMPLEMENTS AMP interfaces_list { result = val[2] }
|
366
|
+
| IMPLEMENTS interfaces_list { result = val[1] }
|
367
|
+
| IMPLEMENTS legacy_interfaces_list { result = val[1] }
|
367
368
|
|
368
369
|
interfaces_list:
|
369
|
-
name {
|
370
|
+
name { result = [make_node(:TypeName, name: val[0], position_source: val[0])] }
|
370
371
|
| interfaces_list AMP name { val[0] << make_node(:TypeName, name: val[2], position_source: val[2]) }
|
371
372
|
|
372
373
|
legacy_interfaces_list:
|
373
|
-
name {
|
374
|
+
name { result = [make_node(:TypeName, name: val[0], position_source: val[0])] }
|
374
375
|
| legacy_interfaces_list name { val[0] << make_node(:TypeName, name: val[1], position_source: val[1]) }
|
375
376
|
|
376
377
|
input_value_definition:
|
377
378
|
description_opt name COLON type default_value_opt directives_list_opt {
|
378
|
-
|
379
|
+
result = make_node(:InputValueDefinition, name: val[1], type: val[3], default_value: val[4], directives: val[5], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
|
379
380
|
}
|
380
381
|
|
381
382
|
input_value_definition_list:
|
382
|
-
input_value_definition {
|
383
|
+
input_value_definition { result = [val[0]] }
|
383
384
|
| input_value_definition_list input_value_definition { val[0] << val[1] }
|
384
385
|
|
385
386
|
arguments_definitions_opt:
|
386
|
-
/* none */ {
|
387
|
-
| LPAREN input_value_definition_list RPAREN {
|
387
|
+
/* none */ { result = EMPTY_ARRAY }
|
388
|
+
| LPAREN input_value_definition_list RPAREN { result = val[1] }
|
388
389
|
|
389
390
|
field_definition:
|
390
391
|
description_opt name arguments_definitions_opt COLON type directives_list_opt {
|
391
|
-
|
392
|
+
result = make_node(:FieldDefinition, name: val[1], arguments: val[2], type: val[4], directives: val[5], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
|
392
393
|
}
|
393
394
|
|
394
395
|
field_definition_list:
|
395
|
-
/* none */ {
|
396
|
-
| field_definition {
|
396
|
+
/* none */ { result = EMPTY_ARRAY }
|
397
|
+
| field_definition { result = [val[0]] }
|
397
398
|
| field_definition_list field_definition { val[0] << val[1] }
|
398
399
|
|
399
400
|
interface_type_definition:
|
400
|
-
description_opt INTERFACE name directives_list_opt LCURLY field_definition_list RCURLY {
|
401
|
-
|
401
|
+
description_opt INTERFACE name implements_opt directives_list_opt LCURLY field_definition_list RCURLY {
|
402
|
+
result = make_node(:InterfaceTypeDefinition, name: val[2], interfaces: val[3], directives: val[4], fields: val[6], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
|
402
403
|
}
|
403
404
|
|
404
405
|
union_members:
|
405
|
-
name {
|
406
|
+
name { result = [make_node(:TypeName, name: val[0], position_source: val[0])]}
|
406
407
|
| union_members PIPE name { val[0] << make_node(:TypeName, name: val[2], position_source: val[2]) }
|
407
408
|
|
408
409
|
union_type_definition:
|
409
410
|
description_opt UNION name directives_list_opt EQUALS union_members {
|
410
|
-
|
411
|
+
result = make_node(:UnionTypeDefinition, name: val[2], directives: val[3], types: val[5], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
|
411
412
|
}
|
412
413
|
|
413
414
|
enum_type_definition:
|
414
415
|
description_opt ENUM name directives_list_opt LCURLY enum_value_definitions RCURLY {
|
415
|
-
|
416
|
+
result = make_node(:EnumTypeDefinition, name: val[2], directives: val[3], values: val[5], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
|
416
417
|
}
|
417
418
|
|
418
419
|
input_object_type_definition:
|
419
420
|
description_opt INPUT name directives_list_opt LCURLY input_value_definition_list RCURLY {
|
420
|
-
|
421
|
+
result = make_node(:InputObjectTypeDefinition, name: val[2], directives: val[3], fields: val[5], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
|
421
422
|
}
|
422
423
|
|
423
424
|
directive_definition:
|
424
425
|
description_opt DIRECTIVE DIR_SIGN name arguments_definitions_opt ON directive_locations {
|
425
|
-
|
426
|
+
result = make_node(:DirectiveDefinition, name: val[3], arguments: val[4], locations: val[6], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
|
426
427
|
}
|
427
428
|
|
428
429
|
directive_locations:
|
429
|
-
name {
|
430
|
+
name { result = [make_node(:DirectiveLocation, name: val[0].to_s, position_source: val[0])] }
|
430
431
|
| directive_locations PIPE name { val[0] << make_node(:DirectiveLocation, name: val[2].to_s, position_source: val[2]) }
|
431
432
|
end
|
432
433
|
|
@@ -462,8 +463,22 @@ def parse_document
|
|
462
463
|
end
|
463
464
|
end
|
464
465
|
|
465
|
-
|
466
|
-
|
466
|
+
class << self
|
467
|
+
attr_accessor :cache
|
468
|
+
|
469
|
+
def parse(query_string, filename: nil, tracer: GraphQL::Tracing::NullTracer)
|
470
|
+
new(query_string, filename: filename, tracer: tracer).parse_document
|
471
|
+
end
|
472
|
+
|
473
|
+
def parse_file(filename, tracer: GraphQL::Tracing::NullTracer)
|
474
|
+
if cache
|
475
|
+
cache.fetch(filename) do
|
476
|
+
parse(File.read(filename), filename: filename, tracer: tracer)
|
477
|
+
end
|
478
|
+
else
|
479
|
+
parse(File.read(filename), filename: filename, tracer: tracer)
|
480
|
+
end
|
481
|
+
end
|
467
482
|
end
|
468
483
|
|
469
484
|
private
|
@@ -93,7 +93,7 @@ module GraphQL
|
|
93
93
|
end
|
94
94
|
|
95
95
|
def print_input_object(input_object)
|
96
|
-
"{#{input_object.arguments.map { |a|
|
96
|
+
"{#{input_object.arguments.map { |a| print_argument(a) }.join(", ")}}"
|
97
97
|
end
|
98
98
|
|
99
99
|
def print_list_type(list_type)
|
@@ -164,11 +164,15 @@ module GraphQL
|
|
164
164
|
def print_object_type_definition(object_type)
|
165
165
|
out = print_description(object_type)
|
166
166
|
out << "type #{object_type.name}"
|
167
|
-
out <<
|
167
|
+
out << print_implements(object_type) unless object_type.interfaces.empty?
|
168
168
|
out << print_directives(object_type.directives)
|
169
169
|
out << print_field_definitions(object_type.fields)
|
170
170
|
end
|
171
171
|
|
172
|
+
def print_implements(type)
|
173
|
+
" implements #{type.interfaces.map(&:name).join(" & ")}"
|
174
|
+
end
|
175
|
+
|
172
176
|
def print_input_value_definition(input_value)
|
173
177
|
out = "#{input_value.name}: #{print_node(input_value.type)}".dup
|
174
178
|
out << " = #{print_node(input_value.default_value)}" unless input_value.default_value.nil?
|
@@ -200,6 +204,7 @@ module GraphQL
|
|
200
204
|
def print_interface_type_definition(interface_type)
|
201
205
|
out = print_description(interface_type)
|
202
206
|
out << "interface #{interface_type.name}"
|
207
|
+
out << print_implements(interface_type) if interface_type.interfaces.any?
|
203
208
|
out << print_directives(interface_type.directives)
|
204
209
|
out << print_field_definitions(interface_type.fields)
|
205
210
|
end
|