graphql 1.9.17 → 2.0.21
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 +21 -10
- data/lib/generators/graphql/enum_generator.rb +4 -10
- data/lib/generators/graphql/field_extractor.rb +31 -0
- data/lib/generators/graphql/input_generator.rb +50 -0
- data/lib/generators/graphql/install/mutation_root_generator.rb +34 -0
- data/lib/generators/graphql/{templates → install/templates}/base_mutation.erb +2 -0
- data/lib/generators/graphql/{templates → install/templates}/mutation_type.erb +2 -0
- data/lib/generators/graphql/install_generator.rb +45 -8
- data/lib/generators/graphql/interface_generator.rb +7 -7
- data/lib/generators/graphql/loader_generator.rb +1 -0
- data/lib/generators/graphql/mutation_create_generator.rb +22 -0
- data/lib/generators/graphql/mutation_delete_generator.rb +22 -0
- data/lib/generators/graphql/mutation_generator.rb +6 -30
- data/lib/generators/graphql/mutation_update_generator.rb +22 -0
- data/lib/generators/graphql/object_generator.rb +28 -12
- data/lib/generators/graphql/orm_mutations_base.rb +40 -0
- data/lib/generators/graphql/relay.rb +49 -0
- data/lib/generators/graphql/relay_generator.rb +21 -0
- data/lib/generators/graphql/scalar_generator.rb +4 -2
- 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_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 +7 -1
- data/lib/generators/graphql/templates/graphql_controller.erb +16 -12
- data/lib/generators/graphql/templates/input.erb +9 -0
- data/lib/generators/graphql/templates/interface.erb +6 -2
- data/lib/generators/graphql/templates/loader.erb +2 -0
- data/lib/generators/graphql/templates/mutation.erb +3 -1
- data/lib/generators/graphql/templates/mutation_create.erb +20 -0
- data/lib/generators/graphql/templates/mutation_delete.erb +20 -0
- data/lib/generators/graphql/templates/mutation_update.erb +21 -0
- data/lib/generators/graphql/templates/node_type.erb +9 -0
- data/lib/generators/graphql/templates/object.erb +7 -3
- data/lib/generators/graphql/templates/query_type.erb +3 -3
- data/lib/generators/graphql/templates/scalar.erb +5 -1
- data/lib/generators/graphql/templates/schema.erb +25 -27
- data/lib/generators/graphql/templates/union.erb +6 -2
- data/lib/generators/graphql/type_generator.rb +47 -10
- data/lib/generators/graphql/union_generator.rb +5 -5
- data/lib/graphql/analysis/ast/field_usage.rb +31 -2
- data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -1
- data/lib/graphql/analysis/ast/query_complexity.rb +175 -68
- data/lib/graphql/analysis/ast/query_depth.rb +0 -1
- data/lib/graphql/analysis/ast/visitor.rb +54 -38
- data/lib/graphql/analysis/ast.rb +16 -16
- data/lib/graphql/analysis.rb +0 -7
- data/lib/graphql/backtrace/inspect_result.rb +0 -1
- data/lib/graphql/backtrace/table.rb +37 -16
- data/lib/graphql/backtrace/trace.rb +96 -0
- data/lib/graphql/backtrace/traced_error.rb +0 -1
- data/lib/graphql/backtrace/tracer.rb +39 -9
- data/lib/graphql/backtrace.rb +26 -18
- data/lib/graphql/dataloader/null_dataloader.rb +24 -0
- data/lib/graphql/dataloader/request.rb +19 -0
- data/lib/graphql/dataloader/request_all.rb +19 -0
- data/lib/graphql/dataloader/source.rb +164 -0
- data/lib/graphql/dataloader.rb +311 -0
- data/lib/graphql/date_encoding_error.rb +16 -0
- data/lib/graphql/deprecation.rb +9 -0
- data/lib/graphql/dig.rb +1 -1
- data/lib/graphql/execution/directive_checks.rb +2 -2
- data/lib/graphql/execution/errors.rb +77 -45
- 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 +104 -0
- data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
- data/lib/graphql/execution/interpreter/resolve.rb +62 -24
- data/lib/graphql/execution/interpreter/runtime.rb +830 -417
- data/lib/graphql/execution/interpreter.rb +206 -74
- data/lib/graphql/execution/lazy/lazy_method_map.rb +4 -0
- data/lib/graphql/execution/lazy.rb +11 -21
- data/lib/graphql/execution/lookahead.rb +65 -136
- data/lib/graphql/execution/multiplex.rb +6 -152
- data/lib/graphql/execution.rb +11 -4
- data/lib/graphql/filter.rb +8 -3
- data/lib/graphql/integer_decoding_error.rb +17 -0
- data/lib/graphql/integer_encoding_error.rb +18 -2
- data/lib/graphql/introspection/base_object.rb +2 -5
- data/lib/graphql/introspection/directive_location_enum.rb +2 -2
- data/lib/graphql/introspection/directive_type.rb +12 -6
- data/lib/graphql/introspection/dynamic_fields.rb +3 -8
- data/lib/graphql/introspection/entry_points.rb +5 -18
- 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 +41 -11
- data/lib/graphql/introspection/introspection_query.rb +6 -92
- data/lib/graphql/introspection/schema_type.rb +12 -12
- data/lib/graphql/introspection/type_type.rb +34 -17
- data/lib/graphql/introspection.rb +100 -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/definition_slice.rb +21 -10
- data/lib/graphql/language/document_from_schema_definition.rb +136 -78
- data/lib/graphql/language/lexer.rb +216 -1462
- data/lib/graphql/language/nodes.rb +129 -132
- data/lib/graphql/language/parser.rb +994 -932
- data/lib/graphql/language/parser.y +152 -120
- data/lib/graphql/language/printer.rb +48 -23
- data/lib/graphql/language/sanitized_printer.rb +222 -0
- data/lib/graphql/language/token.rb +0 -4
- data/lib/graphql/language/visitor.rb +192 -84
- data/lib/graphql/language.rb +3 -1
- data/lib/graphql/name_validator.rb +2 -7
- data/lib/graphql/pagination/active_record_relation_connection.rb +77 -0
- data/lib/graphql/pagination/array_connection.rb +79 -0
- data/lib/graphql/pagination/connection.rb +253 -0
- data/lib/graphql/pagination/connections.rb +135 -0
- data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
- data/lib/graphql/pagination/relation_connection.rb +228 -0
- data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
- data/lib/graphql/pagination.rb +6 -0
- data/lib/graphql/parse_error.rb +0 -1
- data/lib/graphql/query/context.rb +205 -203
- data/lib/graphql/query/fingerprint.rb +26 -0
- data/lib/graphql/query/input_validation_result.rb +33 -7
- data/lib/graphql/query/null_context.rb +22 -9
- data/lib/graphql/query/validation_pipeline.rb +16 -38
- data/lib/graphql/query/variable_validation_error.rb +3 -3
- data/lib/graphql/query/variables.rb +39 -12
- data/lib/graphql/query.rb +95 -43
- data/lib/graphql/railtie.rb +6 -102
- data/lib/graphql/rake_task/validate.rb +4 -1
- data/lib/graphql/rake_task.rb +41 -10
- data/lib/graphql/relay/range_add.rb +17 -10
- data/lib/graphql/relay.rb +0 -15
- 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/schema/addition.rb +245 -0
- data/lib/graphql/schema/argument.rb +285 -36
- data/lib/graphql/schema/base_64_encoder.rb +2 -0
- data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +1 -1
- data/lib/graphql/schema/build_from_definition/resolve_map.rb +13 -5
- data/lib/graphql/schema/build_from_definition.rb +348 -205
- data/lib/graphql/schema/built_in_types.rb +5 -5
- data/lib/graphql/schema/directive/deprecated.rb +18 -0
- 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 +2 -2
- data/lib/graphql/schema/directive/one_of.rb +12 -0
- data/lib/graphql/schema/directive/skip.rb +2 -2
- data/lib/graphql/schema/directive/transform.rb +14 -2
- data/lib/graphql/schema/directive.rb +134 -15
- data/lib/graphql/schema/enum.rb +137 -39
- data/lib/graphql/schema/enum_value.rb +17 -23
- data/lib/graphql/schema/field/connection_extension.rb +50 -20
- data/lib/graphql/schema/field/scope_extension.rb +1 -1
- data/lib/graphql/schema/field.rb +504 -331
- data/lib/graphql/schema/field_extension.rb +86 -2
- data/lib/graphql/schema/find_inherited_value.rb +12 -1
- data/lib/graphql/schema/finder.rb +16 -14
- data/lib/graphql/schema/input_object.rb +182 -60
- data/lib/graphql/schema/interface.rb +24 -49
- data/lib/graphql/schema/introspection_system.rb +103 -37
- data/lib/graphql/schema/late_bound_type.rb +9 -2
- data/lib/graphql/schema/list.rb +61 -3
- data/lib/graphql/schema/loader.rb +144 -96
- data/lib/graphql/schema/member/base_dsl_methods.rb +41 -37
- data/lib/graphql/schema/member/build_type.rb +24 -15
- data/lib/graphql/schema/member/has_arguments.rb +310 -26
- data/lib/graphql/schema/member/has_ast_node.rb +32 -0
- data/lib/graphql/schema/member/has_deprecation_reason.rb +24 -0
- data/lib/graphql/schema/member/has_directives.rb +118 -0
- data/lib/graphql/schema/member/has_fields.rb +166 -44
- data/lib/graphql/schema/member/has_interfaces.rb +129 -0
- data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
- data/lib/graphql/schema/member/has_validators.rb +57 -0
- data/lib/graphql/schema/member/relay_shortcuts.rb +47 -2
- data/lib/graphql/schema/member/type_system_helpers.rb +20 -3
- data/lib/graphql/schema/member/validates_input.rb +33 -0
- data/lib/graphql/schema/member.rb +11 -6
- data/lib/graphql/schema/mutation.rb +4 -9
- data/lib/graphql/schema/non_null.rb +34 -4
- data/lib/graphql/schema/object.rb +36 -60
- data/lib/graphql/schema/printer.rb +16 -35
- data/lib/graphql/schema/relay_classic_mutation.rb +91 -44
- data/lib/graphql/schema/resolver/has_payload_type.rb +51 -11
- data/lib/graphql/schema/resolver.rb +147 -94
- data/lib/graphql/schema/scalar.rb +40 -15
- data/lib/graphql/schema/subscription.rb +60 -31
- data/lib/graphql/schema/timeout.rb +45 -35
- data/lib/graphql/schema/type_expression.rb +21 -13
- data/lib/graphql/schema/type_membership.rb +23 -6
- data/lib/graphql/schema/union.rb +49 -15
- data/lib/graphql/schema/unique_within_type.rb +1 -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 +82 -0
- data/lib/graphql/schema/validator.rb +171 -0
- data/lib/graphql/schema/warden.rb +213 -35
- data/lib/graphql/schema/wrapper.rb +0 -5
- data/lib/graphql/schema.rb +857 -884
- data/lib/graphql/static_validation/all_rules.rb +3 -0
- data/lib/graphql/static_validation/base_visitor.rb +21 -31
- data/lib/graphql/static_validation/definition_dependencies.rb +7 -2
- data/lib/graphql/static_validation/error.rb +3 -1
- data/lib/graphql/static_validation/literal_validator.rb +69 -26
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +45 -83
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +22 -6
- data/lib/graphql/static_validation/rules/arguments_are_defined.rb +35 -26
- data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +4 -2
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +12 -6
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +14 -14
- data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +4 -4
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +15 -7
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +96 -53
- data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
- data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
- 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/one_of_input_objects_are_valid.rb +66 -0
- data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +29 -0
- data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
- data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
- data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +4 -2
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +9 -10
- data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +13 -7
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +12 -13
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +19 -14
- data/lib/graphql/static_validation/rules/variables_are_input_types.rb +1 -1
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +5 -3
- data/lib/graphql/static_validation/type_stack.rb +2 -2
- data/lib/graphql/static_validation/validation_context.rb +13 -3
- data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
- data/lib/graphql/static_validation/validator.rb +32 -20
- data/lib/graphql/static_validation.rb +1 -2
- data/lib/graphql/string_encoding_error.rb +13 -3
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +129 -22
- data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
- data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +58 -0
- data/lib/graphql/subscriptions/event.rb +84 -35
- data/lib/graphql/subscriptions/instrumentation.rb +0 -47
- data/lib/graphql/subscriptions/serialize.rb +53 -6
- data/lib/graphql/subscriptions.rb +137 -57
- data/lib/graphql/tracing/active_support_notifications_trace.rb +16 -0
- data/lib/graphql/tracing/active_support_notifications_tracing.rb +8 -17
- data/lib/graphql/tracing/appoptics_trace.rb +231 -0
- data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
- data/lib/graphql/tracing/appsignal_trace.rb +77 -0
- data/lib/graphql/tracing/appsignal_tracing.rb +23 -0
- data/lib/graphql/tracing/data_dog_trace.rb +148 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +34 -2
- data/lib/graphql/tracing/legacy_trace.rb +65 -0
- data/lib/graphql/tracing/new_relic_trace.rb +75 -0
- data/lib/graphql/tracing/new_relic_tracing.rb +9 -12
- data/lib/graphql/tracing/notifications_trace.rb +42 -0
- data/lib/graphql/tracing/notifications_tracing.rb +59 -0
- data/lib/graphql/tracing/platform_trace.rb +109 -0
- data/lib/graphql/tracing/platform_tracing.rb +76 -35
- data/lib/graphql/tracing/prometheus_trace.rb +89 -0
- data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +5 -2
- data/lib/graphql/tracing/prometheus_tracing.rb +11 -3
- data/lib/graphql/tracing/scout_trace.rb +72 -0
- data/lib/graphql/tracing/scout_tracing.rb +19 -0
- data/lib/graphql/tracing/statsd_trace.rb +56 -0
- data/lib/graphql/tracing/statsd_tracing.rb +42 -0
- data/lib/graphql/tracing/trace.rb +75 -0
- data/lib/graphql/tracing.rb +23 -67
- data/lib/graphql/type_kinds.rb +6 -3
- 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 +20 -9
- data/lib/graphql/types/iso_8601_date_time.rb +36 -10
- data/lib/graphql/types/relay/base_connection.rb +18 -90
- data/lib/graphql/types/relay/base_edge.rb +2 -34
- data/lib/graphql/types/relay/connection_behaviors.rb +176 -0
- data/lib/graphql/types/relay/edge_behaviors.rb +75 -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 +25 -0
- data/lib/graphql/types/relay/page_info.rb +2 -14
- data/lib/graphql/types/relay/page_info_behaviors.rb +30 -0
- data/lib/graphql/types/relay.rb +10 -5
- data/lib/graphql/types/string.rb +8 -2
- data/lib/graphql/unauthorized_error.rb +2 -2
- data/lib/graphql/unresolved_type_error.rb +2 -2
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +63 -65
- data/readme.md +3 -6
- metadata +127 -236
- data/lib/graphql/analysis/analyze_query.rb +0 -91
- data/lib/graphql/analysis/field_usage.rb +0 -45
- data/lib/graphql/analysis/max_query_complexity.rb +0 -26
- data/lib/graphql/analysis/max_query_depth.rb +0 -26
- data/lib/graphql/analysis/query_complexity.rb +0 -88
- data/lib/graphql/analysis/query_depth.rb +0 -43
- data/lib/graphql/analysis/reducer_state.rb +0 -48
- data/lib/graphql/argument.rb +0 -159
- data/lib/graphql/authorization.rb +0 -82
- data/lib/graphql/backwards_compatibility.rb +0 -60
- data/lib/graphql/base_type.rb +0 -226
- data/lib/graphql/boolean_type.rb +0 -2
- data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
- data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
- data/lib/graphql/compatibility/execution_specification.rb +0 -435
- data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
- data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -213
- data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -91
- data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
- data/lib/graphql/compatibility/query_parser_specification.rb +0 -264
- data/lib/graphql/compatibility/schema_parser_specification.rb +0 -680
- data/lib/graphql/compatibility.rb +0 -5
- data/lib/graphql/define/assign_argument.rb +0 -12
- data/lib/graphql/define/assign_connection.rb +0 -13
- data/lib/graphql/define/assign_enum_value.rb +0 -18
- data/lib/graphql/define/assign_global_id_field.rb +0 -11
- data/lib/graphql/define/assign_mutation_function.rb +0 -34
- data/lib/graphql/define/assign_object_field.rb +0 -42
- data/lib/graphql/define/defined_object_proxy.rb +0 -50
- data/lib/graphql/define/instance_definable.rb +0 -300
- data/lib/graphql/define/no_definition_error.rb +0 -7
- data/lib/graphql/define/non_null_with_bang.rb +0 -16
- data/lib/graphql/define/type_definer.rb +0 -31
- data/lib/graphql/define.rb +0 -31
- data/lib/graphql/deprecated_dsl.rb +0 -42
- data/lib/graphql/directive/deprecated_directive.rb +0 -13
- data/lib/graphql/directive/include_directive.rb +0 -2
- data/lib/graphql/directive/skip_directive.rb +0 -2
- data/lib/graphql/directive.rb +0 -104
- data/lib/graphql/enum_type.rb +0 -193
- data/lib/graphql/execution/execute.rb +0 -326
- data/lib/graphql/execution/flatten.rb +0 -40
- data/lib/graphql/execution/instrumentation.rb +0 -92
- data/lib/graphql/execution/interpreter/hash_response.rb +0 -46
- data/lib/graphql/execution/lazy/resolve.rb +0 -91
- data/lib/graphql/execution/typecast.rb +0 -50
- data/lib/graphql/field/resolve.rb +0 -59
- data/lib/graphql/field.rb +0 -330
- data/lib/graphql/float_type.rb +0 -2
- data/lib/graphql/function.rb +0 -153
- data/lib/graphql/id_type.rb +0 -2
- data/lib/graphql/input_object_type.rb +0 -154
- data/lib/graphql/int_type.rb +0 -2
- data/lib/graphql/interface_type.rb +0 -86
- data/lib/graphql/internal_representation/document.rb +0 -27
- data/lib/graphql/internal_representation/node.rb +0 -206
- data/lib/graphql/internal_representation/print.rb +0 -51
- data/lib/graphql/internal_representation/rewrite.rb +0 -184
- data/lib/graphql/internal_representation/scope.rb +0 -88
- data/lib/graphql/internal_representation/visit.rb +0 -36
- data/lib/graphql/internal_representation.rb +0 -7
- data/lib/graphql/language/lexer.rl +0 -258
- data/lib/graphql/list_type.rb +0 -80
- data/lib/graphql/literal_validation_error.rb +0 -6
- data/lib/graphql/non_null_type.rb +0 -81
- data/lib/graphql/object_type.rb +0 -141
- data/lib/graphql/query/arguments.rb +0 -187
- data/lib/graphql/query/arguments_cache.rb +0 -25
- data/lib/graphql/query/executor.rb +0 -53
- data/lib/graphql/query/literal_input.rb +0 -116
- data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
- data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
- data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
- data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
- data/lib/graphql/query/serial_execution.rb +0 -39
- data/lib/graphql/relay/array_connection.rb +0 -85
- data/lib/graphql/relay/base_connection.rb +0 -172
- data/lib/graphql/relay/connection_instrumentation.rb +0 -54
- data/lib/graphql/relay/connection_resolve.rb +0 -43
- data/lib/graphql/relay/connection_type.rb +0 -40
- data/lib/graphql/relay/edge.rb +0 -27
- data/lib/graphql/relay/edge_type.rb +0 -18
- data/lib/graphql/relay/edges_instrumentation.rb +0 -40
- data/lib/graphql/relay/global_id_resolve.rb +0 -18
- data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
- data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
- data/lib/graphql/relay/mutation/resolve.rb +0 -56
- data/lib/graphql/relay/mutation/result.rb +0 -38
- data/lib/graphql/relay/mutation.rb +0 -190
- data/lib/graphql/relay/node.rb +0 -36
- data/lib/graphql/relay/page_info.rb +0 -7
- data/lib/graphql/relay/relation_connection.rb +0 -190
- data/lib/graphql/relay/type_extensions.rb +0 -30
- data/lib/graphql/scalar_type.rb +0 -133
- data/lib/graphql/schema/catchall_middleware.rb +0 -35
- data/lib/graphql/schema/default_parse_error.rb +0 -10
- data/lib/graphql/schema/default_type_error.rb +0 -15
- data/lib/graphql/schema/member/accepts_definition.rb +0 -152
- data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -26
- data/lib/graphql/schema/member/instrumentation.rb +0 -132
- data/lib/graphql/schema/middleware_chain.rb +0 -82
- data/lib/graphql/schema/possible_types.rb +0 -39
- data/lib/graphql/schema/rescue_middleware.rb +0 -60
- data/lib/graphql/schema/timeout_middleware.rb +0 -86
- data/lib/graphql/schema/traversal.rb +0 -228
- data/lib/graphql/schema/validation.rb +0 -303
- data/lib/graphql/static_validation/default_visitor.rb +0 -15
- data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
- data/lib/graphql/string_type.rb +0 -2
- data/lib/graphql/subscriptions/subscription_root.rb +0 -66
- data/lib/graphql/tracing/skylight_tracing.rb +0 -62
- 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
- data/lib/graphql/types/relay/node_field.rb +0 -43
- data/lib/graphql/types/relay/nodes_field.rb +0 -45
- data/lib/graphql/union_type.rb +0 -128
- data/lib/graphql/upgrader/member.rb +0 -936
- data/lib/graphql/upgrader/schema.rb +0 -37
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GraphQL
|
4
|
+
module Tracing
|
5
|
+
class StatsdTracing < PlatformTracing
|
6
|
+
self.platform_keys = {
|
7
|
+
'lex' => "graphql.lex",
|
8
|
+
'parse' => "graphql.parse",
|
9
|
+
'validate' => "graphql.validate",
|
10
|
+
'analyze_query' => "graphql.analyze_query",
|
11
|
+
'analyze_multiplex' => "graphql.analyze_multiplex",
|
12
|
+
'execute_multiplex' => "graphql.execute_multiplex",
|
13
|
+
'execute_query' => "graphql.execute_query",
|
14
|
+
'execute_query_lazy' => "graphql.execute_query_lazy",
|
15
|
+
}
|
16
|
+
|
17
|
+
# @param statsd [Object] A statsd client
|
18
|
+
def initialize(statsd:, **rest)
|
19
|
+
@statsd = statsd
|
20
|
+
super(**rest)
|
21
|
+
end
|
22
|
+
|
23
|
+
def platform_trace(platform_key, key, data)
|
24
|
+
@statsd.time(platform_key) do
|
25
|
+
yield
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def platform_field_key(type, field)
|
30
|
+
"graphql.#{type.graphql_name}.#{field.graphql_name}"
|
31
|
+
end
|
32
|
+
|
33
|
+
def platform_authorized_key(type)
|
34
|
+
"graphql.authorized.#{type.graphql_name}"
|
35
|
+
end
|
36
|
+
|
37
|
+
def platform_resolve_type_key(type)
|
38
|
+
"graphql.resolve_type.#{type.graphql_name}"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module GraphQL
|
3
|
+
module Tracing
|
4
|
+
# This is the base class for a `trace` instance whose methods are called during query execution.
|
5
|
+
# "Trace modes" are subclasses of this with custom tracing modules mixed in.
|
6
|
+
#
|
7
|
+
# A trace module may implement any of the methods on `Trace`, being sure to call `super`
|
8
|
+
# to continue any tracing hooks and call the actual runtime behavior. See {GraphQL::Backtrace::Trace} for example.
|
9
|
+
#
|
10
|
+
class Trace
|
11
|
+
# @param multiplex [GraphQL::Execution::Multiplex, nil]
|
12
|
+
# @param query [GraphQL::Query, nil]
|
13
|
+
def initialize(multiplex: nil, query: nil, **_options)
|
14
|
+
@multiplex = multiplex
|
15
|
+
@query = query
|
16
|
+
end
|
17
|
+
|
18
|
+
def lex(query_string:)
|
19
|
+
yield
|
20
|
+
end
|
21
|
+
|
22
|
+
def parse(query_string:)
|
23
|
+
yield
|
24
|
+
end
|
25
|
+
|
26
|
+
def validate(query:, validate:)
|
27
|
+
yield
|
28
|
+
end
|
29
|
+
|
30
|
+
def analyze_multiplex(multiplex:)
|
31
|
+
yield
|
32
|
+
end
|
33
|
+
|
34
|
+
def analyze_query(query:)
|
35
|
+
yield
|
36
|
+
end
|
37
|
+
|
38
|
+
def execute_multiplex(multiplex:)
|
39
|
+
yield
|
40
|
+
end
|
41
|
+
|
42
|
+
def execute_query(query:)
|
43
|
+
yield
|
44
|
+
end
|
45
|
+
|
46
|
+
def execute_query_lazy(query:, multiplex:)
|
47
|
+
yield
|
48
|
+
end
|
49
|
+
|
50
|
+
def execute_field(field:, query:, ast_node:, arguments:, object:)
|
51
|
+
yield
|
52
|
+
end
|
53
|
+
|
54
|
+
def execute_field_lazy(field:, query:, ast_node:, arguments:, object:)
|
55
|
+
yield
|
56
|
+
end
|
57
|
+
|
58
|
+
def authorized(query:, type:, object:)
|
59
|
+
yield
|
60
|
+
end
|
61
|
+
|
62
|
+
def authorized_lazy(query:, type:, object:)
|
63
|
+
yield
|
64
|
+
end
|
65
|
+
|
66
|
+
def resolve_type(query:, type:, object:)
|
67
|
+
yield
|
68
|
+
end
|
69
|
+
|
70
|
+
def resolve_type_lazy(query:, type:, object:)
|
71
|
+
yield
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
data/lib/graphql/tracing.rb
CHANGED
@@ -1,56 +1,36 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
require "graphql/tracing/trace"
|
3
|
+
require "graphql/tracing/legacy_trace"
|
4
|
+
|
5
|
+
# Legacy tracing:
|
2
6
|
require "graphql/tracing/active_support_notifications_tracing"
|
3
7
|
require "graphql/tracing/platform_tracing"
|
8
|
+
require "graphql/tracing/appoptics_tracing"
|
4
9
|
require "graphql/tracing/appsignal_tracing"
|
5
10
|
require "graphql/tracing/data_dog_tracing"
|
6
11
|
require "graphql/tracing/new_relic_tracing"
|
7
12
|
require "graphql/tracing/scout_tracing"
|
8
|
-
require "graphql/tracing/
|
13
|
+
require "graphql/tracing/statsd_tracing"
|
9
14
|
require "graphql/tracing/prometheus_tracing"
|
10
15
|
|
16
|
+
# New Tracing:
|
17
|
+
require "graphql/tracing/platform_trace"
|
18
|
+
require "graphql/tracing/appoptics_trace"
|
19
|
+
require "graphql/tracing/appsignal_trace"
|
20
|
+
require "graphql/tracing/data_dog_trace"
|
21
|
+
require "graphql/tracing/new_relic_trace"
|
22
|
+
require "graphql/tracing/notifications_trace"
|
23
|
+
require "graphql/tracing/scout_trace"
|
24
|
+
require "graphql/tracing/statsd_trace"
|
25
|
+
require "graphql/tracing/prometheus_trace"
|
11
26
|
if defined?(PrometheusExporter::Server)
|
12
27
|
require "graphql/tracing/prometheus_tracing/graphql_collector"
|
13
28
|
end
|
14
29
|
|
15
30
|
module GraphQL
|
16
|
-
# Library entry point for performance metric reporting.
|
17
|
-
#
|
18
|
-
# __Warning:__ Installing/uninstalling tracers is not thread-safe. Do it during application boot only.
|
19
|
-
#
|
20
|
-
# @example Sending custom events
|
21
|
-
# GraphQL::Tracing.trace("my_custom_event", { ... }) do
|
22
|
-
# # do stuff ...
|
23
|
-
# end
|
24
|
-
#
|
25
|
-
# @example Adding a tracer to a schema
|
26
|
-
# MySchema = GraphQL::Schema.define do
|
27
|
-
# tracer MyTracer # <= responds to .trace(key, data, &block)
|
28
|
-
# end
|
29
|
-
#
|
30
|
-
# @example Adding a tracer to a single query
|
31
|
-
# MySchema.execute(query_str, context: { backtrace: true })
|
32
|
-
#
|
33
|
-
# Events:
|
34
|
-
#
|
35
|
-
# Key | Metadata
|
36
|
-
# ----|---------
|
37
|
-
# lex | `{ query_string: String }`
|
38
|
-
# parse | `{ query_string: String }`
|
39
|
-
# validate | `{ query: GraphQL::Query, validate: Boolean }`
|
40
|
-
# analyze_multiplex | `{ multiplex: GraphQL::Execution::Multiplex }`
|
41
|
-
# analyze_query | `{ query: GraphQL::Query }`
|
42
|
-
# execute_multiplex | `{ multiplex: GraphQL::Execution::Multiplex }`
|
43
|
-
# execute_query | `{ query: GraphQL::Query }`
|
44
|
-
# execute_query_lazy | `{ query: GraphQL::Query?, multiplex: GraphQL::Execution::Multiplex? }`
|
45
|
-
# execute_field | `{ context: GraphQL::Query::Context::FieldResolutionContext?, owner: Class?, field: GraphQL::Schema::Field?, query: GraphQL::Query?, path: Array<String, Integer>?}`
|
46
|
-
# execute_field_lazy | `{ context: GraphQL::Query::Context::FieldResolutionContext?, owner: Class?, field: GraphQL::Schema::Field?, query: GraphqL::Query?, path: Array<String, Integer>?}`
|
47
|
-
#
|
48
|
-
# Note that `execute_field` and `execute_field_lazy` receive different data in different settings:
|
49
|
-
#
|
50
|
-
# - When using {GraphQL::Execution::Interpreter}, they receive `{field:, path:, query:}`
|
51
|
-
# - Otherwise, they receive `{context: ...}`
|
52
|
-
#
|
53
31
|
module Tracing
|
32
|
+
NullTrace = Trace.new
|
33
|
+
|
54
34
|
# Objects may include traceable to gain a `.trace(...)` method.
|
55
35
|
# The object must have a `@tracers` ivar of type `Array<<#trace(k, d, &b)>>`.
|
56
36
|
# @api private
|
@@ -58,8 +38,9 @@ module GraphQL
|
|
58
38
|
# @param key [String] The name of the event in GraphQL internals
|
59
39
|
# @param metadata [Hash] Event-related metadata (can be anything)
|
60
40
|
# @return [Object] Must return the value of the block
|
61
|
-
def trace(key, metadata)
|
62
|
-
|
41
|
+
def trace(key, metadata, &block)
|
42
|
+
return yield if @tracers.empty?
|
43
|
+
call_tracers(0, key, metadata, &block)
|
63
44
|
end
|
64
45
|
|
65
46
|
private
|
@@ -71,39 +52,14 @@ module GraphQL
|
|
71
52
|
# @param key [String] The current event name
|
72
53
|
# @param metadata [Object] The current event object
|
73
54
|
# @return Whatever the block returns
|
74
|
-
def call_tracers(idx, key, metadata)
|
55
|
+
def call_tracers(idx, key, metadata, &block)
|
75
56
|
if idx == @tracers.length
|
76
57
|
yield
|
77
58
|
else
|
78
|
-
@tracers[idx].trace(key, metadata) { call_tracers(idx + 1, key, metadata)
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
class << self
|
84
|
-
# Install a tracer to receive events.
|
85
|
-
# @param tracer [<#trace(key, metadata)>]
|
86
|
-
# @return [void]
|
87
|
-
# @deprecated See {Schema#tracer} or use `context: { tracers: [...] }`
|
88
|
-
def install(tracer)
|
89
|
-
warn("GraphQL::Tracing.install is deprecated, add it to the schema with `tracer(my_tracer)` instead.")
|
90
|
-
if !tracers.include?(tracer)
|
91
|
-
@tracers << tracer
|
59
|
+
@tracers[idx].trace(key, metadata) { call_tracers(idx + 1, key, metadata, &block) }
|
92
60
|
end
|
93
61
|
end
|
94
|
-
|
95
|
-
# @deprecated See {Schema#tracer} or use `context: { tracers: [...] }`
|
96
|
-
def uninstall(tracer)
|
97
|
-
@tracers.delete(tracer)
|
98
|
-
end
|
99
|
-
|
100
|
-
# @deprecated See {Schema#tracer} or use `context: { tracers: [...] }`
|
101
|
-
def tracers
|
102
|
-
@tracers ||= []
|
103
|
-
end
|
104
62
|
end
|
105
|
-
# Initialize the array
|
106
|
-
tracers
|
107
63
|
|
108
64
|
module NullTracer
|
109
65
|
module_function
|
data/lib/graphql/type_kinds.rb
CHANGED
@@ -5,12 +5,13 @@ module GraphQL
|
|
5
5
|
# These objects are singletons, eg `GraphQL::TypeKinds::UNION`, `GraphQL::TypeKinds::SCALAR`.
|
6
6
|
class TypeKind
|
7
7
|
attr_reader :name, :description
|
8
|
-
def initialize(name, abstract: false, fields: false, wraps: false, input: false, description: nil)
|
8
|
+
def initialize(name, abstract: false, leaf: false, fields: false, wraps: false, input: false, description: nil)
|
9
9
|
@name = name
|
10
10
|
@abstract = abstract
|
11
11
|
@fields = fields
|
12
12
|
@wraps = wraps
|
13
13
|
@input = input
|
14
|
+
@leaf = leaf
|
14
15
|
@composite = fields? || abstract?
|
15
16
|
@description = description
|
16
17
|
end
|
@@ -27,6 +28,8 @@ module GraphQL
|
|
27
28
|
# Is this TypeKind a valid query input?
|
28
29
|
def input?; @input; end
|
29
30
|
def to_s; @name; end
|
31
|
+
# Is this TypeKind a primitive value?
|
32
|
+
def leaf?; @leaf; end
|
30
33
|
# Is this TypeKind composed of many values?
|
31
34
|
def composite?; @composite; end
|
32
35
|
|
@@ -64,11 +67,11 @@ module GraphQL
|
|
64
67
|
end
|
65
68
|
|
66
69
|
TYPE_KINDS = [
|
67
|
-
SCALAR = TypeKind.new("SCALAR", input: true, description: 'Indicates this type is a scalar.'),
|
70
|
+
SCALAR = TypeKind.new("SCALAR", input: true, leaf: true, description: 'Indicates this type is a scalar.'),
|
68
71
|
OBJECT = TypeKind.new("OBJECT", fields: true, description: 'Indicates this type is an object. `fields` and `interfaces` are valid fields.'),
|
69
72
|
INTERFACE = TypeKind.new("INTERFACE", abstract: true, fields: true, description: 'Indicates this type is an interface. `fields` and `possibleTypes` are valid fields.'),
|
70
73
|
UNION = TypeKind.new("UNION", abstract: true, description: 'Indicates this type is a union. `possibleTypes` is a valid field.'),
|
71
|
-
ENUM = TypeKind.new("ENUM", input: true, description: 'Indicates this type is an enum. `enumValues` is a valid field.'),
|
74
|
+
ENUM = TypeKind.new("ENUM", input: true, leaf: true, description: 'Indicates this type is an enum. `enumValues` is a valid field.'),
|
72
75
|
INPUT_OBJECT = TypeKind.new("INPUT_OBJECT", input: true, description: 'Indicates this type is an input object. `inputFields` is a valid field.'),
|
73
76
|
LIST = TypeKind.new("LIST", wraps: true, description: 'Indicates this type is a list. `ofType` is a valid field.'),
|
74
77
|
NON_NULL = TypeKind.new("NON_NULL", wraps: true, description: 'Indicates this type is a non-null. `ofType` is a valid field.'),
|
@@ -6,7 +6,7 @@ module GraphQL
|
|
6
6
|
description "Represents non-fractional signed whole numeric values. Since the value may exceed the size of a 32-bit integer, it's encoded as a string."
|
7
7
|
|
8
8
|
def self.coerce_input(value, _ctx)
|
9
|
-
|
9
|
+
value && parse_int(value)
|
10
10
|
rescue ArgumentError
|
11
11
|
nil
|
12
12
|
end
|
@@ -14,6 +14,10 @@ module GraphQL
|
|
14
14
|
def self.coerce_result(value, _ctx)
|
15
15
|
value.to_i.to_s
|
16
16
|
end
|
17
|
+
|
18
|
+
def self.parse_int(value)
|
19
|
+
value.is_a?(Numeric) ? value : Integer(value, 10)
|
20
|
+
end
|
17
21
|
end
|
18
22
|
end
|
19
23
|
end
|
data/lib/graphql/types/int.rb
CHANGED
@@ -9,8 +9,15 @@ module GraphQL
|
|
9
9
|
MIN = -(2**31)
|
10
10
|
MAX = (2**31) - 1
|
11
11
|
|
12
|
-
def self.coerce_input(value,
|
13
|
-
value.is_a?(
|
12
|
+
def self.coerce_input(value, ctx)
|
13
|
+
return if !value.is_a?(Integer)
|
14
|
+
|
15
|
+
if value >= MIN && value <= MAX
|
16
|
+
value
|
17
|
+
else
|
18
|
+
err = GraphQL::IntegerDecodingError.new(value)
|
19
|
+
ctx.schema.type_error(err, ctx)
|
20
|
+
end
|
14
21
|
end
|
15
22
|
|
16
23
|
def self.coerce_result(value, ctx)
|
@@ -18,7 +25,7 @@ module GraphQL
|
|
18
25
|
if value >= MIN && value <= MAX
|
19
26
|
value
|
20
27
|
else
|
21
|
-
err = GraphQL::IntegerEncodingError.new(value)
|
28
|
+
err = GraphQL::IntegerEncodingError.new(value, context: ctx)
|
22
29
|
ctx.schema.type_error(err, ctx)
|
23
30
|
end
|
24
31
|
end
|
@@ -14,20 +14,31 @@ module GraphQL
|
|
14
14
|
# own Date type.
|
15
15
|
class ISO8601Date < GraphQL::Schema::Scalar
|
16
16
|
description "An ISO 8601-encoded date"
|
17
|
+
specified_by_url "https://tools.ietf.org/html/rfc3339"
|
17
18
|
|
18
|
-
# @param value [Date]
|
19
|
+
# @param value [Date,Time,DateTime,String]
|
19
20
|
# @return [String]
|
20
21
|
def self.coerce_result(value, _ctx)
|
21
|
-
value.iso8601
|
22
|
+
Date.parse(value.to_s).iso8601
|
22
23
|
end
|
23
24
|
|
24
|
-
# @param str_value [String]
|
25
|
-
# @return [Date]
|
26
|
-
def self.coerce_input(
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
25
|
+
# @param str_value [String, Date, DateTime, Time]
|
26
|
+
# @return [Date, nil]
|
27
|
+
def self.coerce_input(value, ctx)
|
28
|
+
if value.is_a?(::Date)
|
29
|
+
value
|
30
|
+
elsif value.is_a?(::DateTime)
|
31
|
+
value.to_date
|
32
|
+
elsif value.is_a?(::Time)
|
33
|
+
value.to_date
|
34
|
+
elsif value.nil?
|
35
|
+
nil
|
36
|
+
else
|
37
|
+
Date.iso8601(value)
|
38
|
+
end
|
39
|
+
rescue ArgumentError, TypeError
|
40
|
+
err = GraphQL::DateEncodingError.new(value)
|
41
|
+
ctx.schema.type_error(err, ctx)
|
31
42
|
end
|
32
43
|
end
|
33
44
|
end
|
@@ -1,7 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'time'
|
4
|
+
|
2
5
|
module GraphQL
|
3
6
|
module Types
|
4
|
-
# This scalar takes `
|
7
|
+
# This scalar takes `Time`s and transmits them as strings,
|
5
8
|
# using ISO 8601 format.
|
6
9
|
#
|
7
10
|
# Use it for fields or arguments as follows:
|
@@ -14,6 +17,7 @@ module GraphQL
|
|
14
17
|
# own DateTime type.
|
15
18
|
class ISO8601DateTime < GraphQL::Schema::Scalar
|
16
19
|
description "An ISO 8601-encoded datetime"
|
20
|
+
specified_by_url "https://tools.ietf.org/html/rfc3339"
|
17
21
|
|
18
22
|
# It's not compatible with Rails' default,
|
19
23
|
# i.e. ActiveSupport::JSON::Encoder.time_precision (3 by default)
|
@@ -29,21 +33,43 @@ module GraphQL
|
|
29
33
|
@time_precision = value
|
30
34
|
end
|
31
35
|
|
32
|
-
# @param value [DateTime]
|
36
|
+
# @param value [Time,Date,DateTime,String]
|
33
37
|
# @return [String]
|
34
38
|
def self.coerce_result(value, _ctx)
|
35
|
-
value
|
36
|
-
|
37
|
-
|
39
|
+
case value
|
40
|
+
when Date
|
41
|
+
return value.to_time.iso8601(time_precision)
|
42
|
+
when ::String
|
43
|
+
return Time.parse(value).iso8601(time_precision)
|
44
|
+
else
|
45
|
+
# Time, DateTime or compatible is given:
|
46
|
+
return value.iso8601(time_precision)
|
47
|
+
end
|
48
|
+
rescue StandardError => error
|
49
|
+
raise GraphQL::Error, "An incompatible object (#{value.class}) was given to #{self}. Make sure that only Times, Dates, DateTimes, and well-formatted Strings are used with this type. (#{error.message})"
|
38
50
|
end
|
39
51
|
|
40
52
|
# @param str_value [String]
|
41
|
-
# @return [
|
53
|
+
# @return [Time]
|
42
54
|
def self.coerce_input(str_value, _ctx)
|
43
|
-
|
44
|
-
rescue ArgumentError
|
45
|
-
|
46
|
-
|
55
|
+
Time.iso8601(str_value)
|
56
|
+
rescue ArgumentError, TypeError
|
57
|
+
begin
|
58
|
+
dt = Date.iso8601(str_value).to_time
|
59
|
+
# For compatibility, continue accepting dates given without times
|
60
|
+
# But without this, it would zero out given any time part of `str_value` (hours and/or minutes)
|
61
|
+
if dt.iso8601.start_with?(str_value)
|
62
|
+
dt
|
63
|
+
elsif str_value.length == 8 && str_value.match?(/\A\d{8}\Z/)
|
64
|
+
# Allow dates that are missing the "-". eg. "20220404"
|
65
|
+
dt
|
66
|
+
else
|
67
|
+
nil
|
68
|
+
end
|
69
|
+
rescue ArgumentError, TypeError
|
70
|
+
# Invalid input
|
71
|
+
nil
|
72
|
+
end
|
47
73
|
end
|
48
74
|
end
|
49
75
|
end
|
@@ -10,6 +10,8 @@ module GraphQL
|
|
10
10
|
# so you can extend your own `BaseObject` instead of `GraphQL::Schema::Object`.
|
11
11
|
#
|
12
12
|
# @example Implementation a connection and edge
|
13
|
+
# class BaseObject < GraphQL::Schema::Object; end
|
14
|
+
#
|
13
15
|
# # Given some object in your app ...
|
14
16
|
# class Types::Post < BaseObject
|
15
17
|
# end
|
@@ -20,101 +22,27 @@ module GraphQL
|
|
20
22
|
#
|
21
23
|
# # Then extend them for the object in your app
|
22
24
|
# class Types::PostEdge < Types::BaseEdge
|
23
|
-
# node_type
|
25
|
+
# node_type Types::Post
|
24
26
|
# end
|
27
|
+
#
|
25
28
|
# class Types::PostConnection < Types::BaseConnection
|
26
|
-
# edge_type
|
29
|
+
# edge_type Types::PostEdge,
|
30
|
+
# edges_nullable: true,
|
31
|
+
# edge_nullable: true,
|
32
|
+
# node_nullable: true,
|
33
|
+
# nodes_field: true
|
34
|
+
#
|
35
|
+
# # Alternatively, you can call the class methods followed by your edge type
|
36
|
+
# # edges_nullable true
|
37
|
+
# # edge_nullable true
|
38
|
+
# # node_nullable true
|
39
|
+
# # has_nodes_field true
|
40
|
+
# # edge_type Types::PostEdge
|
27
41
|
# end
|
28
42
|
#
|
29
43
|
# @see Relay::BaseEdge for edge types
|
30
|
-
class BaseConnection <
|
31
|
-
|
32
|
-
def_delegators :@object, :cursor_from_node, :parent
|
33
|
-
|
34
|
-
class << self
|
35
|
-
# @return [Class]
|
36
|
-
attr_reader :node_type
|
37
|
-
|
38
|
-
# @return [Class]
|
39
|
-
attr_reader :edge_class
|
40
|
-
|
41
|
-
# Configure this connection to return `edges` and `nodes` based on `edge_type_class`.
|
42
|
-
#
|
43
|
-
# This method will use the inputs to create:
|
44
|
-
# - `edges` field
|
45
|
-
# - `nodes` field
|
46
|
-
# - description
|
47
|
-
#
|
48
|
-
# It's called when you subclass this base connection, trying to use the
|
49
|
-
# class name to set defaults. You can call it again in the class definition
|
50
|
-
# to override the default (or provide a value, if the default lookup failed).
|
51
|
-
def edge_type(edge_type_class, edge_class: GraphQL::Relay::Edge, node_type: edge_type_class.node_type, nodes_field: true)
|
52
|
-
# Set this connection's graphql name
|
53
|
-
node_type_name = node_type.graphql_name
|
54
|
-
|
55
|
-
@node_type = node_type
|
56
|
-
@edge_type = edge_type_class
|
57
|
-
@edge_class = edge_class
|
58
|
-
|
59
|
-
field :edges, [edge_type_class, null: true],
|
60
|
-
null: true,
|
61
|
-
description: "A list of edges.",
|
62
|
-
edge_class: edge_class
|
63
|
-
|
64
|
-
define_nodes_field if nodes_field
|
65
|
-
|
66
|
-
description("The connection type for #{node_type_name}.")
|
67
|
-
end
|
68
|
-
|
69
|
-
# Filter this list according to the way its node type would scope them
|
70
|
-
def scope_items(items, context)
|
71
|
-
node_type.scope_items(items, context)
|
72
|
-
end
|
73
|
-
|
74
|
-
# Add the shortcut `nodes` field to this connection and its subclasses
|
75
|
-
def nodes_field
|
76
|
-
define_nodes_field
|
77
|
-
end
|
78
|
-
|
79
|
-
def authorized?(obj, ctx)
|
80
|
-
true # Let nodes be filtered out
|
81
|
-
end
|
82
|
-
|
83
|
-
def accessible?(ctx)
|
84
|
-
node_type.accessible?(ctx)
|
85
|
-
end
|
86
|
-
|
87
|
-
def visible?(ctx)
|
88
|
-
node_type.visible?(ctx)
|
89
|
-
end
|
90
|
-
|
91
|
-
private
|
92
|
-
|
93
|
-
def define_nodes_field
|
94
|
-
field :nodes, [@node_type, null: true],
|
95
|
-
null: true,
|
96
|
-
description: "A list of nodes."
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
field :page_info, GraphQL::Types::Relay::PageInfo, null: false, description: "Information to aid in pagination."
|
101
|
-
|
102
|
-
# By default this calls through to the ConnectionWrapper's edge nodes method,
|
103
|
-
# but sometimes you need to override it to support the `nodes` field
|
104
|
-
def nodes
|
105
|
-
@object.edge_nodes
|
106
|
-
end
|
107
|
-
|
108
|
-
def edges
|
109
|
-
if context.interpreter?
|
110
|
-
context.schema.after_lazy(object.edge_nodes) do |nodes|
|
111
|
-
nodes.map { |n| self.class.edge_class.new(n, object) }
|
112
|
-
end
|
113
|
-
else
|
114
|
-
# This is done by edges_instrumentation
|
115
|
-
@object.edge_nodes
|
116
|
-
end
|
117
|
-
end
|
44
|
+
class BaseConnection < Schema::Object
|
45
|
+
include ConnectionBehaviors
|
118
46
|
end
|
119
47
|
end
|
120
48
|
end
|
@@ -21,40 +21,8 @@ module GraphQL
|
|
21
21
|
# end
|
22
22
|
#
|
23
23
|
# @see {Relay::BaseConnection} for connection types
|
24
|
-
class BaseEdge <
|
25
|
-
|
26
|
-
|
27
|
-
class << self
|
28
|
-
# Get or set the Object type that this edge wraps.
|
29
|
-
#
|
30
|
-
# @param node_type [Class] A `Schema::Object` subclass
|
31
|
-
# @param null [Boolean]
|
32
|
-
def node_type(node_type = nil, null: true)
|
33
|
-
if node_type
|
34
|
-
@node_type = node_type
|
35
|
-
# Add a default `node` field
|
36
|
-
field :node, node_type, null: null, description: "The item at the end of the edge."
|
37
|
-
end
|
38
|
-
@node_type
|
39
|
-
end
|
40
|
-
|
41
|
-
def authorized?(obj, ctx)
|
42
|
-
true
|
43
|
-
end
|
44
|
-
|
45
|
-
def accessible?(ctx)
|
46
|
-
node_type.accessible?(ctx)
|
47
|
-
end
|
48
|
-
|
49
|
-
def visible?(ctx)
|
50
|
-
node_type.visible?(ctx)
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
|
55
|
-
field :cursor, String,
|
56
|
-
null: false,
|
57
|
-
description: "A cursor for use in pagination."
|
24
|
+
class BaseEdge < GraphQL::Schema::Object
|
25
|
+
include Types::Relay::EdgeBehaviors
|
58
26
|
end
|
59
27
|
end
|
60
28
|
end
|