graphql 1.7.6 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/generators/graphql/function_generator.rb +1 -1
- data/lib/generators/graphql/install_generator.rb +14 -8
- data/lib/generators/graphql/loader_generator.rb +1 -1
- data/lib/generators/graphql/mutation_generator.rb +6 -1
- data/lib/generators/graphql/templates/function.erb +2 -2
- data/lib/generators/graphql/templates/loader.erb +2 -2
- data/lib/generators/graphql/templates/schema.erb +1 -1
- data/lib/graphql/argument.rb +25 -19
- data/lib/graphql/backtrace/tracer.rb +16 -22
- data/lib/graphql/backtrace.rb +1 -1
- data/lib/graphql/backwards_compatibility.rb +2 -3
- data/lib/graphql/base_type.rb +31 -31
- data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +14 -0
- data/lib/graphql/compatibility/query_parser_specification.rb +117 -0
- data/lib/graphql/define/assign_object_field.rb +5 -12
- data/lib/graphql/deprecated_dsl.rb +42 -0
- data/lib/graphql/directive.rb +1 -0
- data/lib/graphql/enum_type.rb +3 -1
- data/lib/graphql/execution/execute.rb +21 -13
- data/lib/graphql/execution/instrumentation.rb +82 -0
- data/lib/graphql/execution/lazy/lazy_method_map.rb +1 -1
- data/lib/graphql/execution/lazy/resolve.rb +1 -3
- data/lib/graphql/execution/multiplex.rb +12 -29
- data/lib/graphql/execution.rb +1 -0
- data/lib/graphql/field.rb +21 -4
- data/lib/graphql/function.rb +14 -0
- data/lib/graphql/input_object_type.rb +3 -1
- data/lib/graphql/interface_type.rb +5 -3
- data/lib/graphql/internal_representation/node.rb +26 -14
- data/lib/graphql/internal_representation/visit.rb +3 -6
- data/lib/graphql/introspection/base_object.rb +16 -0
- data/lib/graphql/introspection/directive_location_enum.rb +11 -7
- data/lib/graphql/introspection/directive_type.rb +23 -16
- data/lib/graphql/introspection/dynamic_fields.rb +11 -0
- data/lib/graphql/introspection/entry_points.rb +29 -0
- data/lib/graphql/introspection/enum_value_type.rb +16 -11
- data/lib/graphql/introspection/field_type.rb +21 -12
- data/lib/graphql/introspection/input_value_type.rb +26 -23
- data/lib/graphql/introspection/schema_field.rb +7 -2
- data/lib/graphql/introspection/schema_type.rb +36 -22
- data/lib/graphql/introspection/type_by_name_field.rb +10 -2
- data/lib/graphql/introspection/type_kind_enum.rb +10 -6
- data/lib/graphql/introspection/type_type.rb +85 -23
- data/lib/graphql/introspection/typename_field.rb +1 -0
- data/lib/graphql/introspection.rb +3 -10
- data/lib/graphql/language/block_string.rb +47 -0
- data/lib/graphql/language/document_from_schema_definition.rb +280 -0
- data/lib/graphql/language/generation.rb +3 -182
- data/lib/graphql/language/lexer.rb +144 -69
- data/lib/graphql/language/lexer.rl +15 -4
- data/lib/graphql/language/nodes.rb +141 -78
- data/lib/graphql/language/parser.rb +677 -630
- data/lib/graphql/language/parser.y +18 -12
- data/lib/graphql/language/printer.rb +361 -0
- data/lib/graphql/language/token.rb +10 -3
- data/lib/graphql/language.rb +3 -0
- data/lib/graphql/non_null_type.rb +1 -1
- data/lib/graphql/object_type.rb +1 -6
- data/lib/graphql/query/arguments.rb +63 -32
- data/lib/graphql/query/context.rb +32 -2
- data/lib/graphql/query/literal_input.rb +4 -1
- data/lib/graphql/query/null_context.rb +1 -1
- data/lib/graphql/query/result.rb +1 -1
- data/lib/graphql/query/variables.rb +21 -3
- data/lib/graphql/query.rb +19 -6
- data/lib/graphql/railtie.rb +109 -0
- data/lib/graphql/relay/connection_resolve.rb +3 -0
- data/lib/graphql/relay/connection_type.rb +5 -3
- data/lib/graphql/relay/edge_type.rb +2 -1
- data/lib/graphql/relay/global_id_resolve.rb +5 -1
- data/lib/graphql/relay/mongo_relation_connection.rb +40 -0
- data/lib/graphql/relay/mutation/instrumentation.rb +1 -1
- data/lib/graphql/relay/mutation/resolve.rb +5 -1
- data/lib/graphql/relay/relation_connection.rb +14 -19
- data/lib/graphql/relay/type_extensions.rb +30 -0
- data/lib/graphql/relay.rb +2 -0
- data/lib/graphql/scalar_type.rb +14 -2
- data/lib/graphql/schema/argument.rb +92 -0
- data/lib/graphql/schema/build_from_definition.rb +64 -18
- data/lib/graphql/schema/enum.rb +85 -0
- data/lib/graphql/schema/enum_value.rb +74 -0
- data/lib/graphql/schema/field.rb +372 -0
- data/lib/graphql/schema/finder.rb +153 -0
- data/lib/graphql/schema/input_object.rb +87 -0
- data/lib/graphql/schema/interface.rb +105 -0
- data/lib/graphql/schema/introspection_system.rb +93 -0
- data/lib/graphql/schema/late_bound_type.rb +32 -0
- data/lib/graphql/schema/list.rb +32 -0
- data/lib/graphql/schema/loader.rb +2 -2
- data/lib/graphql/schema/member/accepts_definition.rb +152 -0
- data/lib/graphql/schema/member/base_dsl_methods.rb +100 -0
- data/lib/graphql/schema/member/build_type.rb +137 -0
- data/lib/graphql/schema/member/cached_graphql_definition.rb +26 -0
- data/lib/graphql/schema/member/graphql_type_names.rb +21 -0
- data/lib/graphql/schema/member/has_arguments.rb +50 -0
- data/lib/graphql/schema/member/has_fields.rb +130 -0
- data/lib/graphql/schema/member/instrumentation.rb +115 -0
- data/lib/graphql/schema/member/type_system_helpers.rb +34 -0
- data/lib/graphql/schema/member.rb +28 -0
- data/lib/graphql/schema/middleware_chain.rb +5 -1
- data/lib/graphql/schema/mutation.rb +138 -0
- data/lib/graphql/schema/non_null.rb +38 -0
- data/lib/graphql/schema/object.rb +81 -0
- data/lib/graphql/schema/printer.rb +33 -266
- data/lib/graphql/schema/relay_classic_mutation.rb +87 -0
- data/lib/graphql/schema/rescue_middleware.rb +8 -7
- data/lib/graphql/schema/resolver.rb +122 -0
- data/lib/graphql/schema/scalar.rb +35 -0
- data/lib/graphql/schema/traversal.rb +102 -22
- data/lib/graphql/schema/union.rb +36 -0
- data/lib/graphql/schema/validation.rb +3 -2
- data/lib/graphql/schema.rb +381 -12
- data/lib/graphql/static_validation/definition_dependencies.rb +1 -1
- data/lib/graphql/static_validation/literal_validator.rb +16 -4
- data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +6 -6
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +5 -1
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +15 -8
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +11 -1
- data/lib/graphql/static_validation/validation_context.rb +1 -1
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +7 -5
- data/lib/graphql/subscriptions/instrumentation.rb +5 -1
- data/lib/graphql/subscriptions/serialize.rb +2 -0
- data/lib/graphql/subscriptions.rb +90 -16
- data/lib/graphql/tracing/data_dog_tracing.rb +49 -0
- data/lib/graphql/tracing/new_relic_tracing.rb +26 -0
- data/lib/graphql/tracing/platform_tracing.rb +20 -7
- data/lib/graphql/tracing/scout_tracing.rb +2 -2
- data/lib/graphql/tracing.rb +1 -0
- data/lib/graphql/unresolved_type_error.rb +3 -2
- data/lib/graphql/upgrader/member.rb +894 -0
- data/lib/graphql/upgrader/schema.rb +37 -0
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +5 -25
- data/readme.md +2 -2
- data/spec/dummy/app/channels/graphql_channel.rb +23 -2
- data/spec/dummy/log/development.log +239 -0
- data/spec/dummy/log/test.log +410 -0
- data/spec/dummy/test/system/action_cable_subscription_test.rb +4 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-x/-xYZjAnuuzgR79fcznLTQtSdh6AARxu8FcQ_J6p7L3U.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/13/13HiV12xyoQvT-1L39ZzLwMZxjyaGMiENmfw7f-QTIc.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3W/3Wtf5pCWdqq0AB-iB0Y9uUNrTkruRxIEf1XFn_BETU0.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/5i/5iguGafb4hOn8262Kn8Q37ogNN9MxxQKGKNzHAzUcvI.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8m/8mj2T6yy847Mc2Z7k3Xzh8O91hhVJt3NrPe8ASNDlIA.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/DT/DTQyMpr4ABZYQetsdRJ5A7S4jf1r3ie4FGOR7GZBNSs.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Dq/DqJ5_yJPrP5iLlOQyTQsjAVI5FE5LCVDkED0f7GgsSo.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/F8/F8MUNRzORGFgr329fNM0xLaoWCXdv3BIalT7dsvLfjs.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/KB/KB07ZaKNC5uXJ7TjLi-WqnY6g7dq8wWp_8N3HNjBNxg.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Rw/RwDuCV-XpnCtjNkvhpJfBuxXMk0b5AD3L9eR6M-wcy0.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/UL/ULdjhhb0bRuqmaG7XSZlFYzGYCXTDnqZuJBTWRlzqgw.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Up/UpPNgh0yYoUsyMDh5zWqe_U6qJIyTC6-dxMMAs1vvlM.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Wg/Wguh-szFGTI1gaL6npYwPekMXflugRei7F_mOyRucXg.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/X-/X-khLYMA9mqFRPg3zAi86mREDxpKl4bdKYp3uF6WHos.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/bi/BIkdhfxsezxM4q-HZ4oCNTq97WEJTigcq0tpX2cDvbY.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ff/FfxmA4CMHQZT7exx0G7NS1Wpcnny0vzp-Jhc2H36bp8.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/gE/gEiiG4GZNy_djEjK2pHm_NgA-gyhLZhdQvo0Yt96GqE.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/gn/gnA9ZSqpjccNL2m8pe_jBvY6SinXlCzXDWyop83Od8s.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/lO/lOAan3cMwCE_Hli6gsDML88xFNfn0nxPmvrSkW7eEOw.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/m1/M1pv8MJEPLXGLvS8QxVh3DSO9cI4mRt5FHFWdrvUj6o.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/m7/m77qH7ZqH0_0SmwJbiKGDd-aLau1Dav847DC6ge46zY.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/sj/sjRjnjRB37lH2vrgtkdJ8Cz84__IJ978IuKTM7HcztI.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/um/um1JrirR4hJhK-1rE-HywlyCi5ibgxHVrReiujZBWJM.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/v4/v4fwVytD7ITcE0_GDbslZEYud8a5Okm85fV1o7SDl6g.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/v_/v_0PAQt0iipQjFP5zjgkkk9Stnpf4VzvnMv67d1Keuw.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wd/wdT9U4MKxe1PyqNjVuCKMpCl3dxGCIRJIlwUTfh2DQU.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xI/xIaxut_fEIhKBDqljTNwYaADK9kj3gG0ESrfHs-5_og.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/y0/y0SJOqIx2fn1SKqOkAihsQow0trRJrSIyAswufVuoA8.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zg/zgpzeaX-KZErHyGJ1aBH3ZusweNXMneVZule88XsIJI.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zy/zYFltDy-8VC-uKq2BVEiJJyYXNFvVzAKuMlR3ZIYZsk.cache +0 -0
- data/spec/dummy/tmp/screenshots/failures_test_it_handles_subscriptions.png +0 -0
- data/spec/fixtures/upgrader/account.original.rb +19 -0
- data/spec/fixtures/upgrader/account.transformed.rb +20 -0
- data/spec/fixtures/upgrader/blame_range.original.rb +43 -0
- data/spec/fixtures/upgrader/blame_range.transformed.rb +30 -0
- data/spec/fixtures/upgrader/date_time.original.rb +24 -0
- data/spec/fixtures/upgrader/date_time.transformed.rb +23 -0
- data/spec/fixtures/upgrader/delete_project.original.rb +28 -0
- data/spec/fixtures/upgrader/delete_project.transformed.rb +27 -0
- data/spec/fixtures/upgrader/gist_order_field.original.rb +14 -0
- data/spec/fixtures/upgrader/gist_order_field.transformed.rb +13 -0
- data/spec/fixtures/upgrader/increment_count.original.rb +59 -0
- data/spec/fixtures/upgrader/increment_count.transformed.rb +50 -0
- data/spec/fixtures/upgrader/photo.original.rb +10 -0
- data/spec/fixtures/upgrader/photo.transformed.rb +12 -0
- data/spec/fixtures/upgrader/release_order.original.rb +15 -0
- data/spec/fixtures/upgrader/release_order.transformed.rb +14 -0
- data/spec/fixtures/upgrader/starrable.original.rb +49 -0
- data/spec/fixtures/upgrader/starrable.transformed.rb +46 -0
- data/spec/fixtures/upgrader/subscribable.original.rb +55 -0
- data/spec/fixtures/upgrader/subscribable.transformed.rb +51 -0
- data/spec/fixtures/upgrader/type_x.original.rb +65 -0
- data/spec/fixtures/upgrader/type_x.transformed.rb +56 -0
- data/spec/generators/graphql/function_generator_spec.rb +26 -0
- data/spec/generators/graphql/install_generator_spec.rb +1 -1
- data/spec/generators/graphql/loader_generator_spec.rb +24 -0
- data/spec/graphql/analysis/max_query_complexity_spec.rb +3 -3
- data/spec/graphql/analysis/max_query_depth_spec.rb +3 -3
- data/spec/graphql/argument_spec.rb +21 -0
- data/spec/graphql/backtrace_spec.rb +10 -0
- data/spec/graphql/base_type_spec.rb +42 -0
- data/spec/graphql/boolean_type_spec.rb +3 -3
- data/spec/graphql/directive_spec.rb +3 -1
- data/spec/graphql/enum_type_spec.rb +18 -5
- data/spec/graphql/execution/execute_spec.rb +4 -4
- data/spec/graphql/execution/instrumentation_spec.rb +165 -0
- data/spec/graphql/execution/multiplex_spec.rb +2 -2
- data/spec/graphql/execution_error_spec.rb +18 -0
- data/spec/graphql/float_type_spec.rb +2 -2
- data/spec/graphql/id_type_spec.rb +1 -1
- data/spec/graphql/input_object_type_spec.rb +15 -2
- data/spec/graphql/int_type_spec.rb +2 -2
- data/spec/graphql/interface_type_spec.rb +12 -0
- data/spec/graphql/internal_representation/rewrite_spec.rb +2 -2
- data/spec/graphql/introspection/schema_type_spec.rb +2 -0
- data/spec/graphql/language/block_string_spec.rb +70 -0
- data/spec/graphql/language/document_from_schema_definition_spec.rb +770 -0
- data/spec/graphql/language/generation_spec.rb +21 -186
- data/spec/graphql/language/lexer_spec.rb +21 -1
- data/spec/graphql/language/nodes_spec.rb +21 -12
- data/spec/graphql/language/parser_spec.rb +1 -1
- data/spec/graphql/language/printer_spec.rb +203 -0
- data/spec/graphql/object_type_spec.rb +22 -0
- data/spec/graphql/query/arguments_spec.rb +25 -15
- data/spec/graphql/query/context_spec.rb +18 -0
- data/spec/graphql/query/executor_spec.rb +2 -1
- data/spec/graphql/query/serial_execution/value_resolution_spec.rb +2 -8
- data/spec/graphql/query/variables_spec.rb +42 -1
- data/spec/graphql/query_spec.rb +31 -5
- data/spec/graphql/rake_task_spec.rb +3 -1
- data/spec/graphql/relay/base_connection_spec.rb +1 -1
- data/spec/graphql/relay/connection_instrumentation_spec.rb +2 -2
- data/spec/graphql/relay/connection_resolve_spec.rb +1 -1
- data/spec/graphql/relay/connection_type_spec.rb +1 -1
- data/spec/graphql/relay/mongo_relation_connection_spec.rb +474 -0
- data/spec/graphql/relay/mutation_spec.rb +9 -7
- data/spec/graphql/relay/range_add_spec.rb +5 -1
- data/spec/graphql/relay/relation_connection_spec.rb +65 -1
- data/spec/graphql/schema/argument_spec.rb +87 -0
- data/spec/graphql/schema/build_from_definition_spec.rb +89 -5
- data/spec/graphql/schema/enum_spec.rb +74 -0
- data/spec/graphql/schema/field_spec.rb +225 -0
- data/spec/graphql/schema/finder_spec.rb +135 -0
- data/spec/graphql/schema/input_object_spec.rb +111 -0
- data/spec/graphql/schema/instrumentation_spec.rb +40 -0
- data/spec/graphql/schema/interface_spec.rb +185 -0
- data/spec/graphql/schema/introspection_system_spec.rb +39 -0
- data/spec/graphql/schema/member/accepts_definition_spec.rb +111 -0
- data/spec/graphql/schema/member/build_type_spec.rb +17 -0
- data/spec/graphql/schema/member/has_fields_spec.rb +129 -0
- data/spec/graphql/schema/member/type_system_helpers_spec.rb +63 -0
- data/spec/graphql/schema/mutation_spec.rb +148 -0
- data/spec/graphql/schema/object_spec.rb +175 -0
- data/spec/graphql/schema/printer_spec.rb +111 -15
- data/spec/graphql/schema/relay_classic_mutation_spec.rb +38 -0
- data/spec/graphql/schema/rescue_middleware_spec.rb +11 -0
- data/spec/graphql/schema/resolver_spec.rb +131 -0
- data/spec/graphql/schema/scalar_spec.rb +95 -0
- data/spec/graphql/schema/traversal_spec.rb +31 -0
- data/spec/graphql/schema/union_spec.rb +65 -0
- data/spec/graphql/schema/validation_spec.rb +1 -1
- data/spec/graphql/schema/warden_spec.rb +11 -11
- data/spec/graphql/schema_spec.rb +55 -12
- data/spec/graphql/static_validation/rules/fields_have_appropriate_selections_spec.rb +10 -2
- data/spec/graphql/static_validation/rules/fields_will_merge_spec.rb +2 -2
- data/spec/graphql/string_type_spec.rb +3 -3
- data/spec/graphql/subscriptions_spec.rb +273 -184
- data/spec/graphql/tracing/active_support_notifications_tracing_spec.rb +1 -1
- data/spec/graphql/tracing/new_relic_tracing_spec.rb +47 -0
- data/spec/graphql/tracing/platform_tracing_spec.rb +60 -1
- data/spec/graphql/union_type_spec.rb +1 -1
- data/spec/graphql/upgrader/member_spec.rb +516 -0
- data/spec/graphql/upgrader/schema_spec.rb +82 -0
- data/spec/spec_helper.rb +8 -0
- data/spec/support/dummy/schema.rb +53 -24
- data/spec/support/jazz.rb +544 -0
- data/spec/support/lazy_helpers.rb +21 -23
- data/spec/support/new_relic.rb +24 -0
- data/spec/support/star_trek/data.rb +109 -0
- data/spec/support/star_trek/schema.rb +388 -0
- data/spec/support/star_wars/data.rb +6 -7
- data/spec/support/star_wars/schema.rb +127 -171
- metadata +233 -11
- data/lib/graphql/introspection/arguments_field.rb +0 -7
- data/lib/graphql/introspection/enum_values_field.rb +0 -18
- data/lib/graphql/introspection/fields_field.rb +0 -13
- data/lib/graphql/introspection/input_fields_field.rb +0 -12
- data/lib/graphql/introspection/interfaces_field.rb +0 -11
- data/lib/graphql/introspection/of_type_field.rb +0 -6
- data/lib/graphql/introspection/possible_types_field.rb +0 -11
@@ -82,8 +82,7 @@ rule
|
|
82
82
|
| EQUALS literal_value { return val[1] }
|
83
83
|
|
84
84
|
selection_set:
|
85
|
-
LCURLY RCURLY
|
86
|
-
| LCURLY selection_list RCURLY { return val[1] }
|
85
|
+
LCURLY selection_list RCURLY { return val[1] }
|
87
86
|
|
88
87
|
selection_set_opt:
|
89
88
|
/* none */ { return [] }
|
@@ -153,12 +152,8 @@ rule
|
|
153
152
|
| operation_type
|
154
153
|
| schema_keyword
|
155
154
|
|
156
|
-
name_list:
|
157
|
-
name { return [make_node(:TypeName, name: val[0])] }
|
158
|
-
| name_list name { val[0] << make_node(:TypeName, name: val[1]) }
|
159
|
-
|
160
155
|
enum_value_definition:
|
161
|
-
enum_name directives_list_opt { return make_node(:EnumValueDefinition, name: val[0], directives: val[1], description: get_description(val[0])) }
|
156
|
+
enum_name directives_list_opt { return make_node(:EnumValueDefinition, name: val[0], directives: val[1], description: get_description(val[0]), position_source: val[0]) }
|
162
157
|
|
163
158
|
enum_value_definitions:
|
164
159
|
enum_value_definition { return [val[0]] }
|
@@ -281,7 +276,7 @@ rule
|
|
281
276
|
| directive_definition
|
282
277
|
|
283
278
|
schema_definition:
|
284
|
-
SCHEMA LCURLY operation_type_definition_list RCURLY { return make_node(:SchemaDefinition, position_source: val[0], **val[
|
279
|
+
SCHEMA directives_list_opt LCURLY operation_type_definition_list RCURLY { return make_node(:SchemaDefinition, position_source: val[0], directives: val[1], **val[3]) }
|
285
280
|
|
286
281
|
operation_type_definition_list:
|
287
282
|
operation_type_definition
|
@@ -307,11 +302,21 @@ rule
|
|
307
302
|
|
308
303
|
implements_opt:
|
309
304
|
/* none */ { return [] }
|
310
|
-
| IMPLEMENTS
|
305
|
+
| IMPLEMENTS AMP interfaces_list { return val[2] }
|
306
|
+
| IMPLEMENTS interfaces_list { return val[1] }
|
307
|
+
| IMPLEMENTS legacy_interfaces_list { return val[1] }
|
308
|
+
|
309
|
+
interfaces_list:
|
310
|
+
name { return [make_node(:TypeName, name: val[0], position_source: val[0])] }
|
311
|
+
| interfaces_list AMP name { val[0] << make_node(:TypeName, name: val[2], position_source: val[2]) }
|
312
|
+
|
313
|
+
legacy_interfaces_list:
|
314
|
+
name { return [make_node(:TypeName, name: val[0], position_source: val[0])] }
|
315
|
+
| legacy_interfaces_list name { val[0] << make_node(:TypeName, name: val[1], position_source: val[1]) }
|
311
316
|
|
312
317
|
input_value_definition:
|
313
318
|
name COLON type default_value_opt directives_list_opt {
|
314
|
-
return make_node(:InputValueDefinition, name: val[0], type: val[2], default_value: val[3], directives: val[4], description: get_description(val[0]))
|
319
|
+
return make_node(:InputValueDefinition, name: val[0], type: val[2], default_value: val[3], directives: val[4], description: get_description(val[0]), position_source: val[0])
|
315
320
|
}
|
316
321
|
|
317
322
|
input_value_definition_list:
|
@@ -324,11 +329,12 @@ rule
|
|
324
329
|
|
325
330
|
field_definition:
|
326
331
|
name arguments_definitions_opt COLON type directives_list_opt {
|
327
|
-
return make_node(:FieldDefinition, name: val[0], arguments: val[1], type: val[3], directives: val[4], description: get_description(val[0]))
|
332
|
+
return make_node(:FieldDefinition, name: val[0], arguments: val[1], type: val[3], directives: val[4], description: get_description(val[0]), position_source: val[0])
|
328
333
|
}
|
329
334
|
|
330
335
|
field_definition_list:
|
331
|
-
|
336
|
+
/* none */ { return [] }
|
337
|
+
| field_definition { return [val[0]] }
|
332
338
|
| field_definition_list field_definition { val[0] << val[1] }
|
333
339
|
|
334
340
|
interface_type_definition:
|
@@ -0,0 +1,361 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module GraphQL
|
3
|
+
module Language
|
4
|
+
class Printer
|
5
|
+
# Turn an arbitrary AST node back into a string.
|
6
|
+
#
|
7
|
+
# @example Turning a document into a query string
|
8
|
+
# document = GraphQL.parse(query_string)
|
9
|
+
# GraphQL::Language::Printer.new.print(document)
|
10
|
+
# # => "{ ... }"
|
11
|
+
#
|
12
|
+
#
|
13
|
+
# @example Building a custom printer
|
14
|
+
#
|
15
|
+
# class MyPrinter < GraphQL::Language::Printer
|
16
|
+
# def print_argument(arg)
|
17
|
+
# "#{arg.name}: <HIDDEN>"
|
18
|
+
# end
|
19
|
+
# end
|
20
|
+
#
|
21
|
+
# MyPrinter.new.print(document)
|
22
|
+
# # => "mutation { pay(creditCard: <HIDDEN>) { success } }"
|
23
|
+
#
|
24
|
+
#
|
25
|
+
# @param indent [String] Whitespace to add to the printed node
|
26
|
+
# @return [String] Valid GraphQL for `node`
|
27
|
+
def print(node, indent: "")
|
28
|
+
print_node(node, indent: indent)
|
29
|
+
end
|
30
|
+
|
31
|
+
protected
|
32
|
+
|
33
|
+
def print_document(document)
|
34
|
+
document.definitions.map { |d| print_node(d) }.join("\n\n")
|
35
|
+
end
|
36
|
+
|
37
|
+
def print_argument(argument)
|
38
|
+
"#{argument.name}: #{print_node(argument.value)}".dup
|
39
|
+
end
|
40
|
+
|
41
|
+
def print_directive(directive)
|
42
|
+
out = "@#{directive.name}".dup
|
43
|
+
|
44
|
+
if directive.arguments.any?
|
45
|
+
out << "(#{directive.arguments.map { |a| print_argument(a) }.join(", ")})"
|
46
|
+
end
|
47
|
+
|
48
|
+
out
|
49
|
+
end
|
50
|
+
|
51
|
+
def print_enum(enum)
|
52
|
+
"#{enum.name}".dup
|
53
|
+
end
|
54
|
+
|
55
|
+
def print_null_value
|
56
|
+
"null".dup
|
57
|
+
end
|
58
|
+
|
59
|
+
def print_field(field, indent: "")
|
60
|
+
out = "#{indent}".dup
|
61
|
+
out << "#{field.alias}: " if field.alias
|
62
|
+
out << "#{field.name}"
|
63
|
+
out << "(#{field.arguments.map { |a| print_argument(a) }.join(", ")})" if field.arguments.any?
|
64
|
+
out << print_directives(field.directives)
|
65
|
+
out << print_selections(field.selections, indent: indent)
|
66
|
+
out
|
67
|
+
end
|
68
|
+
|
69
|
+
def print_fragment_definition(fragment_def, indent: "")
|
70
|
+
out = "#{indent}fragment #{fragment_def.name}".dup
|
71
|
+
if fragment_def.type
|
72
|
+
out << " on #{print_node(fragment_def.type)}"
|
73
|
+
end
|
74
|
+
out << print_directives(fragment_def.directives)
|
75
|
+
out << print_selections(fragment_def.selections, indent: indent)
|
76
|
+
out
|
77
|
+
end
|
78
|
+
|
79
|
+
def print_fragment_spread(fragment_spread, indent: "")
|
80
|
+
out = "#{indent}...#{fragment_spread.name}".dup
|
81
|
+
out << print_directives(fragment_spread.directives)
|
82
|
+
out
|
83
|
+
end
|
84
|
+
|
85
|
+
def print_inline_fragment(inline_fragment, indent: "")
|
86
|
+
out = "#{indent}...".dup
|
87
|
+
if inline_fragment.type
|
88
|
+
out << " on #{print_node(inline_fragment.type)}"
|
89
|
+
end
|
90
|
+
out << print_directives(inline_fragment.directives)
|
91
|
+
out << print_selections(inline_fragment.selections, indent: indent)
|
92
|
+
out
|
93
|
+
end
|
94
|
+
|
95
|
+
def print_input_object(input_object)
|
96
|
+
"{#{input_object.arguments.map { |a| "#{a.name}: #{print(a.value)}" }.join(", ")}}"
|
97
|
+
end
|
98
|
+
|
99
|
+
def print_list_type(list_type)
|
100
|
+
"[#{print_node(list_type.of_type)}]".dup
|
101
|
+
end
|
102
|
+
|
103
|
+
def print_non_null_type(non_null_type)
|
104
|
+
"#{print_node(non_null_type.of_type)}!".dup
|
105
|
+
end
|
106
|
+
|
107
|
+
def print_operation_definition(operation_definition, indent: "")
|
108
|
+
out = "#{indent}#{operation_definition.operation_type}".dup
|
109
|
+
out << " #{operation_definition.name}" if operation_definition.name
|
110
|
+
|
111
|
+
if operation_definition.variables.any?
|
112
|
+
out << "(#{operation_definition.variables.map { |v| print_variable_definition(v) }.join(", ")})"
|
113
|
+
end
|
114
|
+
|
115
|
+
out << print_directives(operation_definition.directives)
|
116
|
+
out << print_selections(operation_definition.selections, indent: indent)
|
117
|
+
out
|
118
|
+
end
|
119
|
+
|
120
|
+
def print_type_name(type_name)
|
121
|
+
"#{type_name.name}".dup
|
122
|
+
end
|
123
|
+
|
124
|
+
def print_variable_definition(variable_definition)
|
125
|
+
out = "$#{variable_definition.name}: #{print_node(variable_definition.type)}".dup
|
126
|
+
out << " = #{print_node(variable_definition.default_value)}" unless variable_definition.default_value.nil?
|
127
|
+
out
|
128
|
+
end
|
129
|
+
|
130
|
+
def print_variable_identifier(variable_identifier)
|
131
|
+
"$#{variable_identifier.name}".dup
|
132
|
+
end
|
133
|
+
|
134
|
+
def print_schema_definition(schema)
|
135
|
+
if (schema.query.nil? || schema.query == 'Query') &&
|
136
|
+
(schema.mutation.nil? || schema.mutation == 'Mutation') &&
|
137
|
+
(schema.subscription.nil? || schema.subscription == 'Subscription') &&
|
138
|
+
(schema.directives.none?)
|
139
|
+
return
|
140
|
+
end
|
141
|
+
|
142
|
+
out = "schema".dup
|
143
|
+
if schema.directives.any?
|
144
|
+
schema.directives.each do |dir|
|
145
|
+
out << "\n "
|
146
|
+
out << print_node(dir)
|
147
|
+
end
|
148
|
+
out << "\n{"
|
149
|
+
else
|
150
|
+
out << " {\n"
|
151
|
+
end
|
152
|
+
out << " query: #{schema.query}\n" if schema.query
|
153
|
+
out << " mutation: #{schema.mutation}\n" if schema.mutation
|
154
|
+
out << " subscription: #{schema.subscription}\n" if schema.subscription
|
155
|
+
out << "}"
|
156
|
+
end
|
157
|
+
|
158
|
+
def print_scalar_type_definition(scalar_type)
|
159
|
+
out = print_description(scalar_type)
|
160
|
+
out << "scalar #{scalar_type.name}"
|
161
|
+
out << print_directives(scalar_type.directives)
|
162
|
+
end
|
163
|
+
|
164
|
+
def print_object_type_definition(object_type)
|
165
|
+
out = print_description(object_type)
|
166
|
+
out << "type #{object_type.name}"
|
167
|
+
out << " implements " << object_type.interfaces.map(&:name).join(" & ") unless object_type.interfaces.empty?
|
168
|
+
out << print_directives(object_type.directives)
|
169
|
+
out << print_field_definitions(object_type.fields)
|
170
|
+
end
|
171
|
+
|
172
|
+
def print_input_value_definition(input_value)
|
173
|
+
out = "#{input_value.name}: #{print_node(input_value.type)}".dup
|
174
|
+
out << " = #{print_node(input_value.default_value)}" unless input_value.default_value.nil?
|
175
|
+
out << print_directives(input_value.directives)
|
176
|
+
end
|
177
|
+
|
178
|
+
def print_arguments(arguments, indent: "")
|
179
|
+
if arguments.all?{ |arg| !arg.description }
|
180
|
+
return "(#{arguments.map{ |arg| print_input_value_definition(arg) }.join(", ")})"
|
181
|
+
end
|
182
|
+
|
183
|
+
out = "(\n".dup
|
184
|
+
out << arguments.map.with_index{ |arg, i|
|
185
|
+
"#{print_description(arg, indent: " " + indent, first_in_block: i == 0)} #{indent}"\
|
186
|
+
"#{print_input_value_definition(arg)}"
|
187
|
+
}.join("\n")
|
188
|
+
out << "\n#{indent})"
|
189
|
+
end
|
190
|
+
|
191
|
+
def print_field_definition(field)
|
192
|
+
out = field.name.dup
|
193
|
+
unless field.arguments.empty?
|
194
|
+
out << print_arguments(field.arguments, indent: " ")
|
195
|
+
end
|
196
|
+
out << ": #{print_node(field.type)}"
|
197
|
+
out << print_directives(field.directives)
|
198
|
+
end
|
199
|
+
|
200
|
+
def print_interface_type_definition(interface_type)
|
201
|
+
out = print_description(interface_type)
|
202
|
+
out << "interface #{interface_type.name}"
|
203
|
+
out << print_directives(interface_type.directives)
|
204
|
+
out << print_field_definitions(interface_type.fields)
|
205
|
+
end
|
206
|
+
|
207
|
+
def print_union_type_definition(union_type)
|
208
|
+
out = print_description(union_type)
|
209
|
+
out << "union #{union_type.name}"
|
210
|
+
out << print_directives(union_type.directives)
|
211
|
+
out << " = " + union_type.types.map(&:name).join(" | ")
|
212
|
+
end
|
213
|
+
|
214
|
+
def print_enum_type_definition(enum_type)
|
215
|
+
out = print_description(enum_type)
|
216
|
+
out << "enum #{enum_type.name}#{print_directives(enum_type.directives)} {\n"
|
217
|
+
enum_type.values.each.with_index do |value, i|
|
218
|
+
out << print_description(value, indent: ' ', first_in_block: i == 0)
|
219
|
+
out << print_enum_value_definition(value)
|
220
|
+
end
|
221
|
+
out << "}"
|
222
|
+
end
|
223
|
+
|
224
|
+
def print_enum_value_definition(enum_value)
|
225
|
+
out = " #{enum_value.name}".dup
|
226
|
+
out << print_directives(enum_value.directives)
|
227
|
+
out << "\n"
|
228
|
+
end
|
229
|
+
|
230
|
+
def print_input_object_type_definition(input_object_type)
|
231
|
+
out = print_description(input_object_type)
|
232
|
+
out << "input #{input_object_type.name}"
|
233
|
+
out << print_directives(input_object_type.directives)
|
234
|
+
out << " {\n"
|
235
|
+
input_object_type.fields.each.with_index do |field, i|
|
236
|
+
out << print_description(field, indent: ' ', first_in_block: i == 0)
|
237
|
+
out << " #{print_input_value_definition(field)}\n"
|
238
|
+
end
|
239
|
+
out << "}"
|
240
|
+
end
|
241
|
+
|
242
|
+
def print_directive_definition(directive)
|
243
|
+
out = print_description(directive)
|
244
|
+
out << "directive @#{directive.name}"
|
245
|
+
|
246
|
+
if directive.arguments.any?
|
247
|
+
out << print_arguments(directive.arguments)
|
248
|
+
end
|
249
|
+
|
250
|
+
out << " on #{directive.locations.join(' | ')}"
|
251
|
+
end
|
252
|
+
|
253
|
+
def print_description(node, indent: "", first_in_block: true)
|
254
|
+
return ''.dup unless node.description
|
255
|
+
|
256
|
+
description = indent != '' && !first_in_block ? "\n".dup : "".dup
|
257
|
+
description << GraphQL::Language::Comments.commentize(node.description, indent: indent)
|
258
|
+
end
|
259
|
+
|
260
|
+
def print_field_definitions(fields)
|
261
|
+
out = " {\n".dup
|
262
|
+
fields.each.with_index do |field, i|
|
263
|
+
out << print_description(field, indent: ' ', first_in_block: i == 0)
|
264
|
+
out << " #{print_field_definition(field)}\n"
|
265
|
+
end
|
266
|
+
out << "}"
|
267
|
+
end
|
268
|
+
|
269
|
+
def print_directives(directives)
|
270
|
+
if directives.any?
|
271
|
+
directives.map { |d| " #{print_directive(d)}" }.join
|
272
|
+
else
|
273
|
+
""
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
def print_selections(selections, indent: "")
|
278
|
+
if selections.any?
|
279
|
+
out = " {\n".dup
|
280
|
+
selections.each do |selection|
|
281
|
+
out << print_node(selection, indent: indent + " ") << "\n"
|
282
|
+
end
|
283
|
+
out << "#{indent}}"
|
284
|
+
else
|
285
|
+
""
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
def print_node(node, indent: "")
|
290
|
+
case node
|
291
|
+
when Nodes::Document
|
292
|
+
print_document(node)
|
293
|
+
when Nodes::Argument
|
294
|
+
print_argument(node)
|
295
|
+
when Nodes::Directive
|
296
|
+
print_directive(node)
|
297
|
+
when Nodes::Enum
|
298
|
+
print_enum(node)
|
299
|
+
when Nodes::NullValue
|
300
|
+
print_null_value
|
301
|
+
when Nodes::Field
|
302
|
+
print_field(node, indent: indent)
|
303
|
+
when Nodes::FragmentDefinition
|
304
|
+
print_fragment_definition(node, indent: indent)
|
305
|
+
when Nodes::FragmentSpread
|
306
|
+
print_fragment_spread(node, indent: indent)
|
307
|
+
when Nodes::InlineFragment
|
308
|
+
print_inline_fragment(node, indent: indent)
|
309
|
+
when Nodes::InputObject
|
310
|
+
print_input_object(node)
|
311
|
+
when Nodes::ListType
|
312
|
+
print_list_type(node)
|
313
|
+
when Nodes::NonNullType
|
314
|
+
print_non_null_type(node)
|
315
|
+
when Nodes::OperationDefinition
|
316
|
+
print_operation_definition(node, indent: indent)
|
317
|
+
when Nodes::TypeName
|
318
|
+
print_type_name(node)
|
319
|
+
when Nodes::VariableDefinition
|
320
|
+
print_variable_definition(node)
|
321
|
+
when Nodes::VariableIdentifier
|
322
|
+
print_variable_identifier(node)
|
323
|
+
when Nodes::SchemaDefinition
|
324
|
+
print_schema_definition(node)
|
325
|
+
when Nodes::ScalarTypeDefinition
|
326
|
+
print_scalar_type_definition(node)
|
327
|
+
when Nodes::ObjectTypeDefinition
|
328
|
+
print_object_type_definition(node)
|
329
|
+
when Nodes::InputValueDefinition
|
330
|
+
print_input_value_definition(node)
|
331
|
+
when Nodes::FieldDefinition
|
332
|
+
print_field_definition(node)
|
333
|
+
when Nodes::InterfaceTypeDefinition
|
334
|
+
print_interface_type_definition(node)
|
335
|
+
when Nodes::UnionTypeDefinition
|
336
|
+
print_union_type_definition(node)
|
337
|
+
when Nodes::EnumTypeDefinition
|
338
|
+
print_enum_type_definition(node)
|
339
|
+
when Nodes::EnumValueDefinition
|
340
|
+
print_enum_value_definition(node)
|
341
|
+
when Nodes::InputObjectTypeDefinition
|
342
|
+
print_input_object_type_definition(node)
|
343
|
+
when Nodes::DirectiveDefinition
|
344
|
+
print_directive_definition(node)
|
345
|
+
when FalseClass, Float, Integer, NilClass, String, TrueClass, Symbol
|
346
|
+
GraphQL::Language.serialize(node)
|
347
|
+
when Array
|
348
|
+
"[#{node.map { |v| print_node(v) }.join(", ")}]".dup
|
349
|
+
when Hash
|
350
|
+
"{#{node.map { |k, v| "#{k}: #{print_node(v)}" }.join(", ")}}".dup
|
351
|
+
else
|
352
|
+
GraphQL::Language.serialize(node.to_s)
|
353
|
+
end
|
354
|
+
end
|
355
|
+
|
356
|
+
private
|
357
|
+
|
358
|
+
attr_reader :node
|
359
|
+
end
|
360
|
+
end
|
361
|
+
end
|
@@ -5,23 +5,30 @@ module GraphQL
|
|
5
5
|
# Contains type, value and position data.
|
6
6
|
class Token
|
7
7
|
# @return [Symbol] The kind of token this is
|
8
|
-
attr_reader :name
|
8
|
+
attr_reader :name
|
9
|
+
# @return [String] The text of this token
|
10
|
+
attr_reader :value
|
11
|
+
attr_reader :prev_token, :line, :col
|
9
12
|
|
10
13
|
def initialize(value:, name:, line:, col:, prev_token:)
|
11
14
|
@name = name
|
12
|
-
@value = value
|
15
|
+
@value = value.freeze
|
13
16
|
@line = line
|
14
17
|
@col = col
|
15
18
|
@prev_token = prev_token
|
16
19
|
end
|
17
20
|
|
18
|
-
|
21
|
+
alias to_s value
|
19
22
|
def to_i; @value.to_i; end
|
20
23
|
def to_f; @value.to_f; end
|
21
24
|
|
22
25
|
def line_and_column
|
23
26
|
[@line, @col]
|
24
27
|
end
|
28
|
+
|
29
|
+
def inspect
|
30
|
+
"(#{@name} #{@value.inspect} [#{@line}:#{@col}])"
|
31
|
+
end
|
25
32
|
end
|
26
33
|
end
|
27
34
|
end
|
data/lib/graphql/language.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
require "graphql/language/block_string"
|
3
|
+
require "graphql/language/printer"
|
2
4
|
require "graphql/language/definition_slice"
|
5
|
+
require "graphql/language/document_from_schema_definition"
|
3
6
|
require "graphql/language/generation"
|
4
7
|
require "graphql/language/lexer"
|
5
8
|
require "graphql/language/nodes"
|
data/lib/graphql/object_type.rb
CHANGED
@@ -32,7 +32,7 @@ module GraphQL
|
|
32
32
|
# @return [Hash<String => GraphQL::Field>] Map String fieldnames to their {GraphQL::Field} implementations
|
33
33
|
|
34
34
|
# @!attribute mutation
|
35
|
-
# @return [GraphQL::Relay::Mutation, nil] The mutation this
|
35
|
+
# @return [GraphQL::Relay::Mutation, nil] The mutation this object type was derived from, if it is an auto-generated payload type.
|
36
36
|
|
37
37
|
def initialize
|
38
38
|
super
|
@@ -102,11 +102,6 @@ module GraphQL
|
|
102
102
|
dirty_ifaces.concat(interfaces)
|
103
103
|
end
|
104
104
|
|
105
|
-
def name=(name)
|
106
|
-
GraphQL::NameValidator.validate!(name)
|
107
|
-
@name = name
|
108
|
-
end
|
109
|
-
|
110
105
|
protected
|
111
106
|
|
112
107
|
attr_reader :dirty_interfaces, :dirty_inherited_interfaces
|
@@ -5,44 +5,44 @@ module GraphQL
|
|
5
5
|
#
|
6
6
|
# {Arguments} recursively wraps the input in {Arguments} instances.
|
7
7
|
class Arguments
|
8
|
-
extend
|
8
|
+
extend Forwardable
|
9
9
|
|
10
10
|
def self.construct_arguments_class(argument_owner)
|
11
11
|
argument_definitions = argument_owner.arguments
|
12
12
|
argument_owner.arguments_class = Class.new(self) do
|
13
13
|
self.argument_definitions = argument_definitions
|
14
14
|
|
15
|
-
def initialize(values)
|
16
|
-
super(values, argument_definitions: self.class.argument_definitions)
|
17
|
-
end
|
18
|
-
|
19
15
|
argument_definitions.each do |_arg_name, arg_definition|
|
20
16
|
expose_as = arg_definition.expose_as.to_s
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
17
|
+
expose_as_underscored = GraphQL::Schema::Member::BuildType.underscore(expose_as)
|
18
|
+
method_names = [expose_as, expose_as_underscored].uniq
|
19
|
+
method_names.each do |method_name|
|
20
|
+
# Don't define a helper method if it would override something.
|
21
|
+
if instance_methods.include?(method_name)
|
22
|
+
warn(
|
23
|
+
"Unable to define a helper for argument with name '#{method_name}' "\
|
24
|
+
"as this is a reserved name. If you're using an argument such as "\
|
25
|
+
"`argument #{method_name}`, consider renaming this argument.`"
|
26
|
+
)
|
27
|
+
else
|
28
|
+
define_method(method_name) do
|
29
|
+
# Always use `expose_as` here, since #[] doesn't accept underscored names
|
30
|
+
self[expose_as]
|
31
|
+
end
|
32
|
+
end
|
34
33
|
end
|
35
34
|
end
|
36
35
|
end
|
37
36
|
end
|
38
37
|
|
39
|
-
def initialize(values,
|
38
|
+
def initialize(values, context:, defaults_used:)
|
40
39
|
@argument_values = values.inject({}) do |memo, (inner_key, inner_value)|
|
41
|
-
|
42
|
-
|
43
|
-
|
40
|
+
arg_name = inner_key.to_s
|
41
|
+
arg_defn = self.class.argument_definitions[arg_name]
|
42
|
+
arg_default_used = defaults_used.include?(arg_name)
|
43
|
+
arg_value = wrap_value(inner_value, arg_defn.type, context)
|
44
44
|
string_key = arg_defn.expose_as
|
45
|
-
memo[string_key] = ArgumentValue.new(string_key, arg_value, arg_defn)
|
45
|
+
memo[string_key] = ArgumentValue.new(string_key, arg_value, arg_defn, arg_default_used)
|
46
46
|
memo
|
47
47
|
end
|
48
48
|
end
|
@@ -61,6 +61,13 @@ module GraphQL
|
|
61
61
|
@argument_values.key?(key_s)
|
62
62
|
end
|
63
63
|
|
64
|
+
# @param key [String, Symbol] name of value to access
|
65
|
+
# @return [Boolean] true if the argument default was passed as the argument value to the resolver
|
66
|
+
def default_used?(key)
|
67
|
+
key_s = key.is_a?(String) ? key : key.to_s
|
68
|
+
@argument_values.fetch(key_s, NULL_ARGUMENT_VALUE).default_used?
|
69
|
+
end
|
70
|
+
|
64
71
|
# Get the hash of all values, with stringified keys
|
65
72
|
# @return [Hash] the stringified hash
|
66
73
|
def to_h
|
@@ -74,7 +81,7 @@ module GraphQL
|
|
74
81
|
end
|
75
82
|
end
|
76
83
|
|
77
|
-
def_delegators :to_h, :keys, :values, :each
|
84
|
+
def_delegators :to_h, :keys, :values, :each, :any?
|
78
85
|
|
79
86
|
# Access each key, value and type for the arguments in this set.
|
80
87
|
# @yield [argument_value] The {ArgumentValue} for each argument
|
@@ -85,37 +92,61 @@ module GraphQL
|
|
85
92
|
end
|
86
93
|
end
|
87
94
|
|
88
|
-
NO_ARGS = self.new({}, argument_definitions: [])
|
89
|
-
|
90
95
|
class << self
|
91
96
|
attr_accessor :argument_definitions
|
92
97
|
end
|
93
98
|
|
99
|
+
NoArguments = Class.new(self) do
|
100
|
+
self.argument_definitions = []
|
101
|
+
end
|
102
|
+
|
103
|
+
NO_ARGS = NoArguments.new({}, context: nil, defaults_used: Set.new)
|
104
|
+
|
105
|
+
# Convert this instance into valid Ruby keyword arguments
|
106
|
+
# @return [{Symbol=>Object}]
|
107
|
+
def to_kwargs
|
108
|
+
ruby_kwargs = {}
|
109
|
+
|
110
|
+
keys.each do |key|
|
111
|
+
ruby_kwargs[Schema::Member::BuildType.underscore(key).to_sym] = self[key]
|
112
|
+
end
|
113
|
+
|
114
|
+
ruby_kwargs
|
115
|
+
end
|
116
|
+
|
94
117
|
private
|
95
118
|
|
96
119
|
class ArgumentValue
|
97
120
|
attr_reader :key, :value, :definition
|
98
|
-
|
121
|
+
attr_writer :default_used
|
122
|
+
|
123
|
+
def initialize(key, value, definition, default_used)
|
99
124
|
@key = key
|
100
125
|
@value = value
|
101
126
|
@definition = definition
|
127
|
+
@default_used = default_used
|
128
|
+
end
|
129
|
+
|
130
|
+
# @return [Boolean] true if the argument default was passed as the argument value to the resolver
|
131
|
+
def default_used?
|
132
|
+
@default_used
|
102
133
|
end
|
103
134
|
end
|
104
135
|
|
105
|
-
NULL_ARGUMENT_VALUE = ArgumentValue.new(nil, nil, nil)
|
136
|
+
NULL_ARGUMENT_VALUE = ArgumentValue.new(nil, nil, nil, nil)
|
106
137
|
|
107
|
-
def wrap_value(value, arg_defn_type)
|
138
|
+
def wrap_value(value, arg_defn_type, context)
|
108
139
|
if value.nil?
|
109
140
|
nil
|
110
141
|
else
|
111
142
|
case arg_defn_type
|
112
143
|
when GraphQL::ListType
|
113
|
-
value.map { |item| wrap_value(item, arg_defn_type.of_type) }
|
144
|
+
value.map { |item| wrap_value(item, arg_defn_type.of_type, context) }
|
114
145
|
when GraphQL::NonNullType
|
115
|
-
wrap_value(value, arg_defn_type.of_type)
|
146
|
+
wrap_value(value, arg_defn_type.of_type, context)
|
116
147
|
when GraphQL::InputObjectType
|
117
148
|
if value.is_a?(Hash)
|
118
|
-
arg_defn_type.arguments_class.new(value)
|
149
|
+
arg_defn_type.arguments_class.new(value, context: context, defaults_used: Set.new)
|
119
150
|
else
|
120
151
|
value
|
121
152
|
end
|