graphql 1.12.12 → 2.4.8
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 +3 -8
- 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 +60 -4
- data/lib/generators/graphql/interface_generator.rb +7 -7
- 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 +5 -30
- data/lib/generators/graphql/mutation_update_generator.rb +22 -0
- data/lib/generators/graphql/object_generator.rb +10 -38
- data/lib/generators/graphql/orm_mutations_base.rb +40 -0
- data/lib/generators/graphql/relay.rb +23 -12
- 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 +2 -0
- data/lib/generators/graphql/templates/base_edge.erb +2 -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_resolver.erb +8 -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 +5 -1
- data/lib/generators/graphql/templates/graphql_controller.erb +2 -0
- data/lib/generators/graphql/templates/input.erb +9 -0
- data/lib/generators/graphql/templates/interface.erb +4 -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 +2 -0
- data/lib/generators/graphql/templates/object.erb +4 -2
- data/lib/generators/graphql/templates/query_type.erb +2 -0
- data/lib/generators/graphql/templates/scalar.erb +3 -1
- data/lib/generators/graphql/templates/schema.erb +22 -2
- data/lib/generators/graphql/templates/union.erb +4 -2
- data/lib/generators/graphql/type_generator.rb +46 -10
- data/lib/generators/graphql/union_generator.rb +5 -5
- data/lib/graphql/analysis/analyzer.rb +89 -0
- data/lib/graphql/analysis/field_usage.rb +65 -28
- data/lib/graphql/analysis/max_query_complexity.rb +11 -17
- data/lib/graphql/analysis/max_query_depth.rb +13 -19
- data/lib/graphql/analysis/query_complexity.rb +156 -61
- data/lib/graphql/analysis/query_depth.rb +38 -23
- data/lib/graphql/analysis/visitor.rb +283 -0
- data/lib/graphql/analysis.rb +90 -6
- data/lib/graphql/autoload.rb +38 -0
- data/lib/graphql/backtrace/inspect_result.rb +0 -12
- data/lib/graphql/backtrace/table.rb +4 -22
- data/lib/graphql/backtrace/trace.rb +93 -0
- data/lib/graphql/backtrace/tracer.rb +8 -6
- data/lib/graphql/backtrace.rb +3 -8
- data/lib/graphql/coercion_error.rb +1 -9
- data/lib/graphql/current.rb +52 -0
- data/lib/graphql/dataloader/async_dataloader.rb +89 -0
- data/lib/graphql/dataloader/null_dataloader.rb +4 -2
- data/lib/graphql/dataloader/request.rb +5 -0
- data/lib/graphql/dataloader/source.rb +125 -33
- data/lib/graphql/dataloader.rb +193 -143
- data/lib/graphql/date_encoding_error.rb +16 -0
- data/lib/graphql/dig.rb +1 -1
- data/lib/graphql/duration_encoding_error.rb +16 -0
- data/lib/graphql/execution/errors.rb +12 -81
- data/lib/graphql/execution/interpreter/argument_value.rb +5 -1
- data/lib/graphql/execution/interpreter/arguments.rb +2 -2
- data/lib/graphql/execution/interpreter/arguments_cache.rb +33 -36
- data/lib/graphql/execution/interpreter/resolve.rb +38 -4
- data/lib/graphql/execution/interpreter/runtime/graphql_result.rb +175 -0
- data/lib/graphql/execution/interpreter/runtime.rb +447 -403
- data/lib/graphql/execution/interpreter.rb +126 -80
- data/lib/graphql/execution/lazy.rb +11 -21
- data/lib/graphql/execution/lookahead.rb +133 -55
- data/lib/graphql/execution/multiplex.rb +4 -172
- data/lib/graphql/execution.rb +11 -4
- data/lib/graphql/integer_encoding_error.rb +18 -2
- data/lib/graphql/introspection/directive_location_enum.rb +2 -2
- data/lib/graphql/introspection/directive_type.rb +6 -4
- data/lib/graphql/introspection/dynamic_fields.rb +3 -8
- data/lib/graphql/introspection/entry_points.rb +11 -18
- data/lib/graphql/introspection/enum_value_type.rb +2 -2
- data/lib/graphql/introspection/field_type.rb +4 -4
- data/lib/graphql/introspection/input_value_type.rb +10 -4
- data/lib/graphql/introspection/schema_type.rb +17 -15
- data/lib/graphql/introspection/type_type.rb +29 -16
- data/lib/graphql/introspection.rb +6 -2
- data/lib/graphql/invalid_null_error.rb +1 -1
- data/lib/graphql/language/block_string.rb +37 -25
- data/lib/graphql/language/cache.rb +13 -0
- data/lib/graphql/language/comment.rb +18 -0
- data/lib/graphql/language/definition_slice.rb +1 -1
- data/lib/graphql/language/document_from_schema_definition.rb +122 -81
- data/lib/graphql/language/lexer.rb +364 -1467
- data/lib/graphql/language/nodes.rb +197 -106
- data/lib/graphql/language/parser.rb +799 -1920
- data/lib/graphql/language/printer.rb +372 -160
- data/lib/graphql/language/sanitized_printer.rb +25 -27
- data/lib/graphql/language/static_visitor.rb +167 -0
- data/lib/graphql/language/visitor.rb +188 -141
- data/lib/graphql/language.rb +62 -1
- data/lib/graphql/load_application_object_failed_error.rb +5 -1
- data/lib/graphql/name_validator.rb +0 -4
- data/lib/graphql/pagination/active_record_relation_connection.rb +37 -8
- data/lib/graphql/pagination/array_connection.rb +8 -6
- data/lib/graphql/pagination/connection.rb +61 -7
- data/lib/graphql/pagination/connections.rb +22 -23
- data/lib/graphql/pagination/mongoid_relation_connection.rb +1 -2
- data/lib/graphql/pagination/relation_connection.rb +60 -28
- data/lib/graphql/query/context/scoped_context.rb +101 -0
- data/lib/graphql/query/context.rb +146 -222
- data/lib/graphql/query/input_validation_result.rb +10 -1
- data/lib/graphql/query/null_context.rb +15 -32
- data/lib/graphql/query/validation_pipeline.rb +15 -39
- data/lib/graphql/query/variable_validation_error.rb +3 -3
- data/lib/graphql/query/variables.rb +35 -17
- data/lib/graphql/query.rb +149 -82
- data/lib/graphql/railtie.rb +15 -109
- data/lib/graphql/rake_task/validate.rb +1 -1
- data/lib/graphql/rake_task.rb +30 -11
- data/lib/graphql/relay/range_add.rb +9 -16
- 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/graphql/field_type_in_block.rb +144 -0
- data/lib/graphql/rubocop/graphql/root_types_in_block.rb +38 -0
- data/lib/graphql/rubocop.rb +6 -0
- data/lib/graphql/schema/addition.rb +98 -54
- data/lib/graphql/schema/always_visible.rb +14 -0
- data/lib/graphql/schema/argument.rb +179 -82
- data/lib/graphql/schema/base_64_encoder.rb +3 -5
- data/lib/graphql/schema/build_from_definition.rb +77 -39
- data/lib/graphql/schema/directive/feature.rb +1 -1
- data/lib/graphql/schema/directive/flagged.rb +4 -4
- data/lib/graphql/schema/directive/include.rb +1 -1
- data/lib/graphql/schema/directive/one_of.rb +24 -0
- data/lib/graphql/schema/directive/skip.rb +1 -1
- data/lib/graphql/schema/directive/specified_by.rb +14 -0
- data/lib/graphql/schema/directive/transform.rb +2 -2
- data/lib/graphql/schema/directive.rb +36 -22
- data/lib/graphql/schema/enum.rb +158 -63
- data/lib/graphql/schema/enum_value.rb +12 -21
- data/lib/graphql/schema/field/connection_extension.rb +7 -17
- data/lib/graphql/schema/field/scope_extension.rb +8 -1
- data/lib/graphql/schema/field.rb +521 -359
- data/lib/graphql/schema/field_extension.rb +86 -2
- data/lib/graphql/schema/find_inherited_value.rb +3 -7
- data/lib/graphql/schema/finder.rb +5 -5
- data/lib/graphql/schema/has_single_input_argument.rb +160 -0
- data/lib/graphql/schema/input_object.rb +148 -99
- data/lib/graphql/schema/interface.rb +41 -64
- data/lib/graphql/schema/introspection_system.rb +12 -26
- data/lib/graphql/schema/late_bound_type.rb +12 -2
- data/lib/graphql/schema/list.rb +18 -7
- data/lib/graphql/schema/loader.rb +6 -5
- data/lib/graphql/schema/member/base_dsl_methods.rb +32 -18
- data/lib/graphql/schema/member/build_type.rb +16 -13
- data/lib/graphql/schema/member/has_arguments.rb +270 -86
- data/lib/graphql/schema/member/has_ast_node.rb +12 -0
- data/lib/graphql/schema/member/has_deprecation_reason.rb +3 -4
- data/lib/graphql/schema/member/has_directives.rb +81 -61
- data/lib/graphql/schema/member/has_fields.rb +169 -31
- data/lib/graphql/schema/member/has_interfaces.rb +143 -0
- data/lib/graphql/schema/member/has_unresolved_type_error.rb +5 -1
- data/lib/graphql/schema/member/has_validators.rb +32 -6
- data/lib/graphql/schema/member/relay_shortcuts.rb +47 -2
- data/lib/graphql/schema/member/scoped.rb +19 -0
- data/lib/graphql/schema/member/type_system_helpers.rb +16 -0
- data/lib/graphql/schema/member/validates_input.rb +6 -6
- data/lib/graphql/schema/member.rb +1 -6
- data/lib/graphql/schema/mutation.rb +7 -9
- data/lib/graphql/schema/non_null.rb +7 -7
- data/lib/graphql/schema/object.rb +38 -119
- data/lib/graphql/schema/printer.rb +24 -25
- data/lib/graphql/schema/relay_classic_mutation.rb +13 -91
- data/lib/graphql/schema/resolver/has_payload_type.rb +46 -11
- data/lib/graphql/schema/resolver.rb +118 -115
- data/lib/graphql/schema/scalar.rb +20 -21
- data/lib/graphql/schema/subscription.rb +95 -21
- data/lib/graphql/schema/timeout.rb +25 -29
- data/lib/graphql/schema/type_expression.rb +2 -2
- data/lib/graphql/schema/type_membership.rb +21 -4
- data/lib/graphql/schema/union.rb +16 -16
- data/lib/graphql/schema/unique_within_type.rb +1 -1
- data/lib/graphql/schema/validator/all_validator.rb +62 -0
- 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 +3 -1
- data/lib/graphql/schema/validator/format_validator.rb +4 -5
- data/lib/graphql/schema/validator/inclusion_validator.rb +3 -1
- data/lib/graphql/schema/validator/length_validator.rb +5 -3
- data/lib/graphql/schema/validator/numericality_validator.rb +13 -2
- data/lib/graphql/schema/validator/required_validator.rb +56 -18
- data/lib/graphql/schema/validator.rb +38 -28
- data/lib/graphql/schema/visibility/migration.rb +188 -0
- data/lib/graphql/schema/visibility/profile.rb +359 -0
- data/lib/graphql/schema/visibility/visit.rb +190 -0
- data/lib/graphql/schema/visibility.rb +294 -0
- data/lib/graphql/schema/warden.rb +423 -134
- data/lib/graphql/schema/wrapper.rb +0 -5
- data/lib/graphql/schema.rb +1015 -1057
- data/lib/graphql/static_validation/all_rules.rb +3 -1
- data/lib/graphql/static_validation/base_visitor.rb +15 -28
- 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 +24 -7
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +1 -1
- data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +1 -1
- data/lib/graphql/static_validation/rules/arguments_are_defined.rb +4 -3
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +13 -7
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +15 -13
- data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +12 -2
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +13 -5
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +62 -35
- 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/fragment_types_exist.rb +12 -2
- data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
- data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +1 -1
- data/lib/graphql/static_validation/rules/mutation_root_exists.rb +1 -1
- data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +1 -1
- 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 +7 -5
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +5 -5
- data/lib/graphql/static_validation/rules/subscription_root_exists.rb +1 -1
- data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +14 -8
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +18 -27
- data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +1 -1
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +14 -8
- data/lib/graphql/static_validation/rules/variables_are_input_types.rb +11 -2
- data/lib/graphql/static_validation/validation_context.rb +32 -6
- data/lib/graphql/static_validation/validator.rb +11 -27
- data/lib/graphql/static_validation.rb +0 -3
- data/lib/graphql/string_encoding_error.rb +13 -3
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +49 -11
- data/lib/graphql/subscriptions/broadcast_analyzer.rb +11 -5
- data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +40 -1
- data/lib/graphql/subscriptions/event.rb +87 -38
- data/lib/graphql/subscriptions/serialize.rb +27 -3
- data/lib/graphql/subscriptions.rb +63 -49
- data/lib/graphql/testing/helpers.rb +155 -0
- data/lib/graphql/testing.rb +2 -0
- data/lib/graphql/tracing/active_support_notifications_trace.rb +16 -0
- data/lib/graphql/tracing/active_support_notifications_tracing.rb +6 -20
- data/lib/graphql/tracing/appoptics_trace.rb +253 -0
- data/lib/graphql/tracing/appoptics_tracing.rb +4 -2
- data/lib/graphql/tracing/appsignal_trace.rb +79 -0
- data/lib/graphql/tracing/appsignal_tracing.rb +17 -0
- data/lib/graphql/tracing/call_legacy_tracers.rb +66 -0
- data/lib/graphql/tracing/data_dog_trace.rb +185 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +27 -15
- data/lib/graphql/{execution/instrumentation.rb → tracing/legacy_hooks_trace.rb} +11 -28
- data/lib/graphql/tracing/legacy_trace.rb +12 -0
- data/lib/graphql/tracing/new_relic_trace.rb +77 -0
- data/lib/graphql/tracing/new_relic_tracing.rb +2 -0
- data/lib/graphql/tracing/notifications_trace.rb +45 -0
- data/lib/graphql/tracing/notifications_tracing.rb +61 -0
- data/lib/graphql/tracing/null_trace.rb +9 -0
- data/lib/graphql/tracing/platform_trace.rb +118 -0
- data/lib/graphql/tracing/platform_tracing.rb +46 -49
- data/lib/graphql/tracing/{prometheus_tracing → prometheus_trace}/graphql_collector.rb +6 -2
- data/lib/graphql/tracing/prometheus_trace.rb +94 -0
- data/lib/graphql/tracing/prometheus_tracing.rb +5 -3
- data/lib/graphql/tracing/scout_trace.rb +74 -0
- data/lib/graphql/tracing/scout_tracing.rb +2 -0
- data/lib/graphql/tracing/sentry_trace.rb +114 -0
- data/lib/graphql/tracing/statsd_trace.rb +58 -0
- data/lib/graphql/tracing/statsd_tracing.rb +2 -0
- data/lib/graphql/tracing/trace.rb +79 -0
- data/lib/graphql/tracing.rb +29 -52
- data/lib/graphql/type_kinds.rb +7 -4
- data/lib/graphql/types/big_int.rb +5 -1
- data/lib/graphql/types/int.rb +1 -1
- data/lib/graphql/types/iso_8601_date.rb +17 -6
- data/lib/graphql/types/iso_8601_date_time.rb +12 -1
- data/lib/graphql/types/iso_8601_duration.rb +77 -0
- data/lib/graphql/types/relay/base_connection.rb +16 -6
- data/lib/graphql/types/relay/connection_behaviors.rb +92 -32
- data/lib/graphql/types/relay/edge_behaviors.rb +46 -7
- data/lib/graphql/types/relay/has_node_field.rb +2 -2
- data/lib/graphql/types/relay/has_nodes_field.rb +2 -2
- data/lib/graphql/types/relay/node_behaviors.rb +12 -2
- data/lib/graphql/types/relay/page_info_behaviors.rb +11 -2
- data/lib/graphql/types/relay.rb +0 -3
- data/lib/graphql/types/string.rb +2 -2
- data/lib/graphql/types.rb +18 -10
- data/lib/graphql/unauthorized_enum_value_error.rb +13 -0
- data/lib/graphql/unauthorized_error.rb +1 -1
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +82 -137
- data/readme.md +13 -6
- metadata +127 -186
- data/lib/graphql/analysis/analyze_query.rb +0 -98
- data/lib/graphql/analysis/ast/analyzer.rb +0 -84
- data/lib/graphql/analysis/ast/field_usage.rb +0 -28
- data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -23
- data/lib/graphql/analysis/ast/max_query_depth.rb +0 -22
- data/lib/graphql/analysis/ast/query_complexity.rb +0 -234
- data/lib/graphql/analysis/ast/query_depth.rb +0 -56
- data/lib/graphql/analysis/ast/visitor.rb +0 -268
- data/lib/graphql/analysis/ast.rb +0 -91
- data/lib/graphql/analysis/reducer_state.rb +0 -48
- data/lib/graphql/argument.rb +0 -131
- data/lib/graphql/authorization.rb +0 -82
- data/lib/graphql/backtrace/legacy_tracer.rb +0 -56
- data/lib/graphql/backwards_compatibility.rb +0 -61
- data/lib/graphql/base_type.rb +0 -230
- 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 -436
- data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
- data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -215
- data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -87
- data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
- data/lib/graphql/compatibility/query_parser_specification.rb +0 -266
- data/lib/graphql/compatibility/schema_parser_specification.rb +0 -682
- 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 -53
- data/lib/graphql/define/instance_definable.rb +0 -240
- 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 -47
- data/lib/graphql/deprecation.rb +0 -13
- data/lib/graphql/directive/deprecated_directive.rb +0 -2
- data/lib/graphql/directive/include_directive.rb +0 -2
- data/lib/graphql/directive/skip_directive.rb +0 -2
- data/lib/graphql/directive.rb +0 -111
- data/lib/graphql/enum_type.rb +0 -129
- data/lib/graphql/execution/execute.rb +0 -333
- data/lib/graphql/execution/flatten.rb +0 -40
- 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 -226
- data/lib/graphql/filter.rb +0 -53
- data/lib/graphql/float_type.rb +0 -2
- data/lib/graphql/function.rb +0 -128
- data/lib/graphql/id_type.rb +0 -2
- data/lib/graphql/input_object_type.rb +0 -138
- data/lib/graphql/int_type.rb +0 -2
- data/lib/graphql/interface_type.rb +0 -72
- 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 -262
- data/lib/graphql/language/parser.y +0 -543
- data/lib/graphql/language/token.rb +0 -38
- data/lib/graphql/list_type.rb +0 -80
- data/lib/graphql/non_null_type.rb +0 -71
- data/lib/graphql/object_type.rb +0 -130
- data/lib/graphql/query/arguments.rb +0 -189
- data/lib/graphql/query/arguments_cache.rb +0 -24
- data/lib/graphql/query/executor.rb +0 -52
- data/lib/graphql/query/literal_input.rb +0 -136
- 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 -40
- data/lib/graphql/relay/array_connection.rb +0 -83
- data/lib/graphql/relay/base_connection.rb +0 -189
- 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 -41
- data/lib/graphql/relay/edge.rb +0 -27
- data/lib/graphql/relay/edge_type.rb +0 -19
- 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 -106
- data/lib/graphql/relay/node.rb +0 -39
- data/lib/graphql/relay/page_info.rb +0 -7
- data/lib/graphql/relay/relation_connection.rb +0 -188
- data/lib/graphql/relay/type_extensions.rb +0 -32
- data/lib/graphql/scalar_type.rb +0 -91
- data/lib/graphql/schema/base_64_bp.rb +0 -26
- 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 -17
- data/lib/graphql/schema/invalid_type_error.rb +0 -7
- data/lib/graphql/schema/member/accepts_definition.rb +0 -152
- data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -31
- data/lib/graphql/schema/member/instrumentation.rb +0 -131
- data/lib/graphql/schema/middleware_chain.rb +0 -82
- data/lib/graphql/schema/possible_types.rb +0 -44
- data/lib/graphql/schema/rescue_middleware.rb +0 -60
- data/lib/graphql/schema/timeout_middleware.rb +0 -88
- data/lib/graphql/schema/traversal.rb +0 -228
- data/lib/graphql/schema/validation.rb +0 -313
- data/lib/graphql/static_validation/default_visitor.rb +0 -15
- data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
- data/lib/graphql/static_validation/type_stack.rb +0 -216
- data/lib/graphql/string_type.rb +0 -2
- data/lib/graphql/subscriptions/instrumentation.rb +0 -79
- data/lib/graphql/subscriptions/subscription_root.rb +0 -76
- data/lib/graphql/tracing/skylight_tracing.rb +0 -70
- data/lib/graphql/types/relay/default_relay.rb +0 -27
- data/lib/graphql/types/relay/node_field.rb +0 -25
- data/lib/graphql/types/relay/nodes_field.rb +0 -27
- data/lib/graphql/union_type.rb +0 -115
- data/lib/graphql/upgrader/member.rb +0 -937
- data/lib/graphql/upgrader/schema.rb +0 -38
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 386222d0dc13d35729460ee8f3cd9fa30f90db9cb7dc2b2392489c9e0bc8939b
|
4
|
+
data.tar.gz: 5229e7ee84d4c4e0a0c8afd10ef2b0185b0eedfc611a8db38047171d9c04a6e2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4cb91383b995e8714915d2c99d8c2d4fa15eaad91f0069766d7e8d379cae15c2aae6eb7a3961e440d62a961837a044aed604802960f199e8670ecf973c991fb2
|
7
|
+
data.tar.gz: 8cd21fd942892100a0647bf9897e6e7d8651d184aee76a2988633fa3e9dc505163f330bb1f0ca3f4819cbb3248cd88e9ac252f516449ae169c1a3f47a982e11c
|
@@ -19,17 +19,12 @@ module Graphql
|
|
19
19
|
sentinel = /< GraphQL::Schema\s*\n/m
|
20
20
|
|
21
21
|
in_root do
|
22
|
-
|
22
|
+
if File.exist?(schema_file_path)
|
23
|
+
inject_into_file schema_file_path, " #{type}(Types::#{name})\n", after: sentinel, verbose: false, force: false
|
24
|
+
end
|
23
25
|
end
|
24
26
|
end
|
25
27
|
|
26
|
-
def create_mutation_root_type
|
27
|
-
create_dir("#{options[:directory]}/mutations")
|
28
|
-
template("base_mutation.erb", "#{options[:directory]}/mutations/base_mutation.rb", { skip: true })
|
29
|
-
template("mutation_type.erb", "#{options[:directory]}/types/mutation_type.rb", { skip: true })
|
30
|
-
insert_root_type('mutation', 'MutationType')
|
31
|
-
end
|
32
|
-
|
33
28
|
def schema_file_path
|
34
29
|
"#{options[:directory]}/#{schema_name.underscore}.rb"
|
35
30
|
end
|
@@ -13,20 +13,14 @@ module Graphql
|
|
13
13
|
desc "Create a GraphQL::EnumType with the given name and values"
|
14
14
|
source_root File.expand_path('../templates', __FILE__)
|
15
15
|
|
16
|
-
|
17
|
-
type: :array,
|
18
|
-
default: [],
|
19
|
-
banner: "value{:ruby_value} value{:ruby_value} ...",
|
20
|
-
desc: "Values for this enum (if present, ruby_value will be inserted verbatim)"
|
16
|
+
private
|
21
17
|
|
22
|
-
def
|
23
|
-
|
18
|
+
def graphql_type
|
19
|
+
"enum"
|
24
20
|
end
|
25
21
|
|
26
|
-
private
|
27
|
-
|
28
22
|
def prepared_values
|
29
|
-
|
23
|
+
custom_fields.map { |v| v.split(":", 2) }
|
30
24
|
end
|
31
25
|
end
|
32
26
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'rails/generators/base'
|
3
|
+
|
4
|
+
module Graphql
|
5
|
+
module Generators
|
6
|
+
module FieldExtractor
|
7
|
+
def fields
|
8
|
+
columns = []
|
9
|
+
columns += (klass&.columns&.map { |c| generate_column_string(c) } || [])
|
10
|
+
columns + custom_fields
|
11
|
+
end
|
12
|
+
|
13
|
+
def generate_column_string(column)
|
14
|
+
name = column.name
|
15
|
+
required = column.null ? "" : "!"
|
16
|
+
type = column_type_string(column)
|
17
|
+
"#{name}:#{required}#{type}"
|
18
|
+
end
|
19
|
+
|
20
|
+
def column_type_string(column)
|
21
|
+
column.name == "id" ? "ID" : column.type.to_s.camelize
|
22
|
+
end
|
23
|
+
|
24
|
+
def klass
|
25
|
+
@klass ||= Module.const_get(name.camelize)
|
26
|
+
rescue NameError
|
27
|
+
@klass = nil
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'generators/graphql/type_generator'
|
3
|
+
require 'generators/graphql/field_extractor'
|
4
|
+
|
5
|
+
module Graphql
|
6
|
+
module Generators
|
7
|
+
# Generate an input type by name,
|
8
|
+
# with the specified fields.
|
9
|
+
#
|
10
|
+
# ```
|
11
|
+
# rails g graphql:object PostType name:string!
|
12
|
+
# ```
|
13
|
+
class InputGenerator < TypeGeneratorBase
|
14
|
+
desc "Create a GraphQL::InputObjectType with the given name and fields"
|
15
|
+
source_root File.expand_path('../templates', __FILE__)
|
16
|
+
include FieldExtractor
|
17
|
+
|
18
|
+
def self.normalize_type_expression(type_expression, mode:, null: true)
|
19
|
+
case type_expression.camelize
|
20
|
+
when "Text", "Citext"
|
21
|
+
["String", null]
|
22
|
+
when "Decimal"
|
23
|
+
["Float", null]
|
24
|
+
when "DateTime", "Datetime"
|
25
|
+
["GraphQL::Types::ISO8601DateTime", null]
|
26
|
+
when "Date"
|
27
|
+
["GraphQL::Types::ISO8601Date", null]
|
28
|
+
when "Json", "Jsonb", "Hstore"
|
29
|
+
["GraphQL::Types::JSON", null]
|
30
|
+
else
|
31
|
+
super
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def graphql_type
|
38
|
+
"input"
|
39
|
+
end
|
40
|
+
|
41
|
+
def type_ruby_name
|
42
|
+
super.gsub(/Type\z/, "InputType")
|
43
|
+
end
|
44
|
+
|
45
|
+
def type_file_name
|
46
|
+
super.gsub(/_type\z/, "_input_type")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rails/generators/base"
|
4
|
+
require_relative "../core"
|
5
|
+
|
6
|
+
module Graphql
|
7
|
+
module Generators
|
8
|
+
module Install
|
9
|
+
class MutationRootGenerator < Rails::Generators::Base
|
10
|
+
include Core
|
11
|
+
|
12
|
+
desc "Create mutation base type, mutation root type, and adds the latter to the schema"
|
13
|
+
source_root File.expand_path('../templates', __FILE__)
|
14
|
+
|
15
|
+
class_option :schema,
|
16
|
+
type: :string,
|
17
|
+
default: nil,
|
18
|
+
desc: "Name for the schema constant (default: {app_name}Schema)"
|
19
|
+
|
20
|
+
class_option :skip_keeps,
|
21
|
+
type: :boolean,
|
22
|
+
default: false,
|
23
|
+
desc: "Skip .keep files for source control"
|
24
|
+
|
25
|
+
def generate
|
26
|
+
create_dir("#{options[:directory]}/mutations")
|
27
|
+
template("base_mutation.erb", "#{options[:directory]}/mutations/base_mutation.rb", { skip: true })
|
28
|
+
template("mutation_type.erb", "#{options[:directory]}/types/mutation_type.rb", { skip: true })
|
29
|
+
insert_root_type('mutation', 'MutationType')
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -45,9 +45,16 @@ module Graphql
|
|
45
45
|
# post "/graphql", to: "graphql#execute"
|
46
46
|
# ```
|
47
47
|
#
|
48
|
+
# Add ActiveRecord::QueryLogs metadata:
|
49
|
+
# ```ruby
|
50
|
+
# current_graphql_operation: -> { GraphQL::Current.operation_name },
|
51
|
+
# current_graphql_field: -> { GraphQL::Current.field&.path },
|
52
|
+
# current_dataloader_source: -> { GraphQL::Current.dataloader_source_class },
|
53
|
+
# ```
|
54
|
+
#
|
48
55
|
# Accept a `--batch` option which adds `GraphQL::Batch` setup.
|
49
56
|
#
|
50
|
-
# Use `--
|
57
|
+
# Use `--skip-graphiql` to skip `graphiql-rails` installation.
|
51
58
|
#
|
52
59
|
# TODO: also add base classes
|
53
60
|
class InstallGenerator < Rails::Generators::Base
|
@@ -92,6 +99,11 @@ module Graphql
|
|
92
99
|
default: false,
|
93
100
|
desc: "Use GraphQL Playground over Graphiql as IDE"
|
94
101
|
|
102
|
+
class_option :skip_query_logs,
|
103
|
+
type: :boolean,
|
104
|
+
default: false,
|
105
|
+
desc: "Skip ActiveRecord::QueryLogs hooks in config/application.rb"
|
106
|
+
|
95
107
|
# These two options are taken from Rails' own generators'
|
96
108
|
class_option :api,
|
97
109
|
type: :boolean,
|
@@ -105,11 +117,14 @@ module Graphql
|
|
105
117
|
template("#{base_type}.erb", "#{options[:directory]}/types/#{base_type}.rb")
|
106
118
|
end
|
107
119
|
|
120
|
+
# All resolvers are defined as living in their own module, including this class.
|
121
|
+
template("base_resolver.erb", "#{options[:directory]}/resolvers/base_resolver.rb")
|
122
|
+
|
108
123
|
# Note: You can't have a schema without the query type, otherwise introspection breaks
|
109
124
|
template("query_type.erb", "#{options[:directory]}/types/query_type.rb")
|
110
125
|
insert_root_type('query', 'QueryType')
|
111
126
|
|
112
|
-
|
127
|
+
invoke "graphql:install:mutation_root" unless options.skip_mutation_root_type?
|
113
128
|
|
114
129
|
template("graphql_controller.erb", "app/controllers/graphql_controller.rb")
|
115
130
|
route('post "/graphql", to: "graphql#execute"')
|
@@ -122,8 +137,15 @@ module Graphql
|
|
122
137
|
if options.api?
|
123
138
|
say("Skipped graphiql, as this rails project is API only")
|
124
139
|
say(" You may wish to use GraphiQL.app for development: https://github.com/skevy/graphiql-app")
|
125
|
-
elsif !options[:skip_graphiql]
|
126
|
-
gem(
|
140
|
+
elsif !options[:skip_graphiql]
|
141
|
+
# `gem(...)` uses `gsub_file(...)` under the hood, which is a no-op for `rails destroy...` (when `behavior == :revoke`).
|
142
|
+
# So handle that case by calling `gsub_file` with `force: true`.
|
143
|
+
if behavior == :invoke && !File.read(Rails.root.join("Gemfile")).include?("graphiql-rails")
|
144
|
+
gem("graphiql-rails", group: :development)
|
145
|
+
elsif behavior == :revoke
|
146
|
+
gemfile_pattern = /\n\s*gem ('|")graphiql-rails('|"), :?group(:| =>) :development/
|
147
|
+
gsub_file Rails.root.join("Gemfile"), gemfile_pattern, "", { force: true }
|
148
|
+
end
|
127
149
|
|
128
150
|
# This is a little cheat just to get cleaner shell output:
|
129
151
|
log :route, 'graphiql-rails'
|
@@ -170,6 +192,40 @@ RUBY
|
|
170
192
|
install_relay
|
171
193
|
end
|
172
194
|
|
195
|
+
if !options[:skip_query_logs]
|
196
|
+
config_file = "config/application.rb"
|
197
|
+
current_app_rb = File.read(Rails.root.join(config_file))
|
198
|
+
existing_log_tags_pattern = /config.active_record.query_log_tags = \[\n?(\s*:[a-z_]+,?\s*\n?|\s*#[^\]]*\n)*/m
|
199
|
+
existing_log_tags = existing_log_tags_pattern.match(current_app_rb)
|
200
|
+
if existing_log_tags && behavior == :invoke
|
201
|
+
code = <<-RUBY
|
202
|
+
# GraphQL-Ruby query log tags:
|
203
|
+
current_graphql_operation: -> { GraphQL::Current.operation_name },
|
204
|
+
current_graphql_field: -> { GraphQL::Current.field&.path },
|
205
|
+
current_dataloader_source: -> { GraphQL::Current.dataloader_source_class },
|
206
|
+
RUBY
|
207
|
+
if !existing_log_tags.to_s.end_with?(",")
|
208
|
+
code = ",\n#{code} "
|
209
|
+
end
|
210
|
+
# Try to insert this code _after_ any plain symbol entries in the array of query log tags:
|
211
|
+
after_code = existing_log_tags_pattern
|
212
|
+
else
|
213
|
+
code = <<-RUBY
|
214
|
+
config.active_record.query_log_tags_enabled = true
|
215
|
+
config.active_record.query_log_tags = [
|
216
|
+
# Rails query log tags:
|
217
|
+
:application, :controller, :action, :job,
|
218
|
+
# GraphQL-Ruby query log tags:
|
219
|
+
current_graphql_operation: -> { GraphQL::Current.operation_name },
|
220
|
+
current_graphql_field: -> { GraphQL::Current.field&.path },
|
221
|
+
current_dataloader_source: -> { GraphQL::Current.dataloader_source_class },
|
222
|
+
]
|
223
|
+
RUBY
|
224
|
+
after_code = "class Application < Rails::Application\n"
|
225
|
+
end
|
226
|
+
insert_into_file(config_file, code, after: after_code)
|
227
|
+
end
|
228
|
+
|
173
229
|
if gemfile_modified?
|
174
230
|
say "Gemfile has been modified, make sure you `bundle install`"
|
175
231
|
end
|
@@ -13,14 +13,14 @@ module Graphql
|
|
13
13
|
desc "Create a GraphQL::InterfaceType with the given name and fields"
|
14
14
|
source_root File.expand_path('../templates', __FILE__)
|
15
15
|
|
16
|
-
|
17
|
-
type: :array,
|
18
|
-
default: [],
|
19
|
-
banner: "name:type name:type ...",
|
20
|
-
desc: "Fields for this interface (type may be expressed as Ruby or GraphQL)"
|
16
|
+
private
|
21
17
|
|
22
|
-
def
|
23
|
-
|
18
|
+
def graphql_type
|
19
|
+
"interface"
|
20
|
+
end
|
21
|
+
|
22
|
+
def fields
|
23
|
+
custom_fields
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require_relative 'orm_mutations_base'
|
3
|
+
|
4
|
+
module Graphql
|
5
|
+
module Generators
|
6
|
+
# TODO: What other options should be supported?
|
7
|
+
#
|
8
|
+
# @example Generate a `GraphQL::Schema::RelayClassicMutation` by name
|
9
|
+
# rails g graphql:mutation CreatePostMutation
|
10
|
+
class MutationCreateGenerator < OrmMutationsBase
|
11
|
+
|
12
|
+
desc "Scaffold a Relay Classic ORM create mutation for the given model class"
|
13
|
+
source_root File.expand_path('../templates', __FILE__)
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def operation_type
|
18
|
+
"create"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require_relative 'orm_mutations_base'
|
3
|
+
|
4
|
+
module Graphql
|
5
|
+
module Generators
|
6
|
+
# TODO: What other options should be supported?
|
7
|
+
#
|
8
|
+
# @example Generate a `GraphQL::Schema::RelayClassicMutation` by name
|
9
|
+
# rails g graphql:mutation DeletePostMutation
|
10
|
+
class MutationDeleteGenerator < OrmMutationsBase
|
11
|
+
|
12
|
+
desc "Scaffold a Relay Classic ORM delete mutation for the given model class"
|
13
|
+
source_root File.expand_path('../templates', __FILE__)
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def operation_type
|
18
|
+
"delete"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -9,47 +9,22 @@ module Graphql
|
|
9
9
|
#
|
10
10
|
# @example Generate a `GraphQL::Schema::RelayClassicMutation` by name
|
11
11
|
# rails g graphql:mutation CreatePostMutation
|
12
|
-
class MutationGenerator < Rails::Generators::
|
12
|
+
class MutationGenerator < Rails::Generators::NamedBase
|
13
13
|
include Core
|
14
14
|
|
15
15
|
desc "Create a Relay Classic mutation by name"
|
16
16
|
source_root File.expand_path('../templates', __FILE__)
|
17
17
|
|
18
|
-
argument :name, type: :string
|
19
|
-
|
20
|
-
def initialize(args, *options) #:nodoc:
|
21
|
-
# Unfreeze name in case it's given as a frozen string
|
22
|
-
args[0] = args[0].dup if args[0].is_a?(String) && args[0].frozen?
|
23
|
-
super
|
24
|
-
|
25
|
-
assign_names!(name)
|
26
|
-
end
|
27
|
-
|
28
|
-
attr_reader :file_name, :mutation_name, :field_name
|
29
|
-
|
30
18
|
def create_mutation_file
|
31
|
-
|
32
|
-
create_mutation_root_type
|
33
|
-
else
|
34
|
-
log :gsub, "#{options[:directory]}/types/mutation_type.rb"
|
35
|
-
end
|
36
|
-
|
37
|
-
template "mutation.erb", "#{options[:directory]}/mutations/#{file_name}.rb"
|
19
|
+
template "mutation.erb", File.join(options[:directory], "/mutations/", class_path, "#{file_name}.rb")
|
38
20
|
|
39
21
|
sentinel = /class .*MutationType\s*<\s*[^\s]+?\n/m
|
40
22
|
in_root do
|
41
|
-
|
42
|
-
|
23
|
+
path = "#{options[:directory]}/types/mutation_type.rb"
|
24
|
+
invoke "graphql:install:mutation_root" unless File.exist?(path)
|
25
|
+
inject_into_file "#{options[:directory]}/types/mutation_type.rb", " field :#{file_name}, mutation: Mutations::#{class_name}\n", after: sentinel, verbose: false, force: false
|
43
26
|
end
|
44
27
|
end
|
45
|
-
|
46
|
-
private
|
47
|
-
|
48
|
-
def assign_names!(name)
|
49
|
-
@field_name = name.camelize.underscore
|
50
|
-
@mutation_name = name.camelize(:upper)
|
51
|
-
@file_name = name.camelize.underscore
|
52
|
-
end
|
53
28
|
end
|
54
29
|
end
|
55
30
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require_relative 'orm_mutations_base'
|
3
|
+
|
4
|
+
module Graphql
|
5
|
+
module Generators
|
6
|
+
# TODO: What other options should be supported?
|
7
|
+
#
|
8
|
+
# @example Generate a `GraphQL::Schema::RelayClassicMutation` by name
|
9
|
+
# rails g graphql:mutation UpdatePostMutation
|
10
|
+
class MutationUpdateGenerator < OrmMutationsBase
|
11
|
+
|
12
|
+
desc "Scaffold a Relay Classic ORM update mutation for the given model class"
|
13
|
+
source_root File.expand_path('../templates', __FILE__)
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def operation_type
|
18
|
+
"update"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require 'generators/graphql/type_generator'
|
3
|
+
require 'generators/graphql/field_extractor'
|
3
4
|
|
4
5
|
module Graphql
|
5
6
|
module Generators
|
@@ -12,33 +13,19 @@ module Graphql
|
|
12
13
|
#
|
13
14
|
# Add the Node interface with `--node`.
|
14
15
|
class ObjectGenerator < TypeGeneratorBase
|
15
|
-
desc "Create a GraphQL::ObjectType with the given name and fields"
|
16
|
+
desc "Create a GraphQL::ObjectType with the given name and fields." \
|
17
|
+
"If the given type name matches an existing ActiveRecord model, the generated type will automatically include fields for the models database columns."
|
16
18
|
source_root File.expand_path('../templates', __FILE__)
|
17
|
-
|
18
|
-
argument :custom_fields,
|
19
|
-
type: :array,
|
20
|
-
default: [],
|
21
|
-
banner: "name:type name:type ...",
|
22
|
-
desc: "Fields for this object (type may be expressed as Ruby or GraphQL)"
|
19
|
+
include FieldExtractor
|
23
20
|
|
24
21
|
class_option :node,
|
25
22
|
type: :boolean,
|
26
23
|
default: false,
|
27
24
|
desc: "Include the Relay Node interface"
|
28
25
|
|
29
|
-
def create_type_file
|
30
|
-
template "object.erb", "#{options[:directory]}/types/#{type_file_name}.rb"
|
31
|
-
end
|
32
|
-
|
33
|
-
def fields
|
34
|
-
columns = []
|
35
|
-
columns += klass.columns.map { |c| generate_column_string(c) } if class_exists?
|
36
|
-
columns + custom_fields
|
37
|
-
end
|
38
|
-
|
39
26
|
def self.normalize_type_expression(type_expression, mode:, null: true)
|
40
|
-
case type_expression
|
41
|
-
when "Text"
|
27
|
+
case type_expression.camelize
|
28
|
+
when "Text", "Citext"
|
42
29
|
["String", null]
|
43
30
|
when "Decimal"
|
44
31
|
["Float", null]
|
@@ -46,6 +33,8 @@ module Graphql
|
|
46
33
|
["GraphQL::Types::ISO8601DateTime", null]
|
47
34
|
when "Date"
|
48
35
|
["GraphQL::Types::ISO8601Date", null]
|
36
|
+
when "Json", "Jsonb", "Hstore"
|
37
|
+
["GraphQL::Types::JSON", null]
|
49
38
|
else
|
50
39
|
super
|
51
40
|
end
|
@@ -53,25 +42,8 @@ module Graphql
|
|
53
42
|
|
54
43
|
private
|
55
44
|
|
56
|
-
def
|
57
|
-
|
58
|
-
required = column.null ? "" : "!"
|
59
|
-
type = column_type_string(column)
|
60
|
-
"#{name}:#{required}#{type}"
|
61
|
-
end
|
62
|
-
|
63
|
-
def column_type_string(column)
|
64
|
-
column.name == "id" ? "ID" : column.type.to_s.camelize
|
65
|
-
end
|
66
|
-
|
67
|
-
def class_exists?
|
68
|
-
klass.is_a?(Class) && klass.ancestors.include?(ActiveRecord::Base)
|
69
|
-
rescue NameError
|
70
|
-
return false
|
71
|
-
end
|
72
|
-
|
73
|
-
def klass
|
74
|
-
@klass ||= Module.const_get(type_name.camelize)
|
45
|
+
def graphql_type
|
46
|
+
"object"
|
75
47
|
end
|
76
48
|
end
|
77
49
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'rails/generators'
|
3
|
+
require 'rails/generators/named_base'
|
4
|
+
require_relative 'core'
|
5
|
+
|
6
|
+
module Graphql
|
7
|
+
module Generators
|
8
|
+
# TODO: What other options should be supported?
|
9
|
+
#
|
10
|
+
# @example Generate a `GraphQL::Schema::RelayClassicMutation` by name
|
11
|
+
# rails g graphql:mutation CreatePostMutation
|
12
|
+
class OrmMutationsBase < Rails::Generators::NamedBase
|
13
|
+
include Core
|
14
|
+
include Rails::Generators::ResourceHelpers
|
15
|
+
|
16
|
+
desc "Create a Relay Classic mutation by name"
|
17
|
+
|
18
|
+
class_option :orm, banner: "NAME", type: :string, required: true,
|
19
|
+
desc: "ORM to generate the controller for"
|
20
|
+
|
21
|
+
class_option :namespaced_types,
|
22
|
+
type: :boolean,
|
23
|
+
required: false,
|
24
|
+
default: false,
|
25
|
+
banner: "Namespaced",
|
26
|
+
desc: "If the generated types will be namespaced"
|
27
|
+
|
28
|
+
def create_mutation_file
|
29
|
+
template "mutation_#{operation_type}.erb", File.join(options[:directory], "/mutations/", class_path, "#{file_name}_#{operation_type}.rb")
|
30
|
+
|
31
|
+
sentinel = /class .*MutationType\s*<\s*[^\s]+?\n/m
|
32
|
+
in_root do
|
33
|
+
path = "#{options[:directory]}/types/mutation_type.rb"
|
34
|
+
invoke "graphql:install:mutation_root" unless File.exist?(path)
|
35
|
+
inject_into_file "#{options[:directory]}/types/mutation_type.rb", " field :#{file_name}_#{operation_type}, mutation: Mutations::#{class_name}#{operation_type.classify}\n", after: sentinel, verbose: false, force: false
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -6,7 +6,24 @@ module Graphql
|
|
6
6
|
# Add Node, `node(id:)`, and `nodes(ids:)`
|
7
7
|
template("node_type.erb", "#{options[:directory]}/types/node_type.rb")
|
8
8
|
in_root do
|
9
|
-
fields =
|
9
|
+
fields = <<-RUBY
|
10
|
+
field :node, Types::NodeType, null: true, description: "Fetches an object given its ID." do
|
11
|
+
argument :id, ID, required: true, description: "ID of the object."
|
12
|
+
end
|
13
|
+
|
14
|
+
def node(id:)
|
15
|
+
context.schema.object_from_id(id, context)
|
16
|
+
end
|
17
|
+
|
18
|
+
field :nodes, [Types::NodeType, null: true], null: true, description: "Fetches a list of objects given a list of IDs." do
|
19
|
+
argument :ids, [ID], required: true, description: "IDs of the objects."
|
20
|
+
end
|
21
|
+
|
22
|
+
def nodes(ids:)
|
23
|
+
ids.map { |id| context.schema.object_from_id(id, context) }
|
24
|
+
end
|
25
|
+
|
26
|
+
RUBY
|
10
27
|
inject_into_file "#{options[:directory]}/types/query_type.rb", fields, after: /class .*QueryType\s*<\s*[^\s]+?\n/m, force: false
|
11
28
|
end
|
12
29
|
|
@@ -32,20 +49,14 @@ module Graphql
|
|
32
49
|
|
33
50
|
# Return a string UUID for `object`
|
34
51
|
def self.id_from_object(object, type_definition, query_ctx)
|
35
|
-
#
|
36
|
-
|
37
|
-
# - encodes it with base64:
|
38
|
-
# GraphQL::Schema::UniqueWithinType.encode(type_definition.name, object.id)
|
52
|
+
# For example, use Rails' GlobalID library (https://github.com/rails/globalid):
|
53
|
+
object.to_gid_param
|
39
54
|
end
|
40
55
|
|
41
56
|
# Given a string UUID, find the object
|
42
|
-
def self.object_from_id(
|
43
|
-
# For example,
|
44
|
-
|
45
|
-
#
|
46
|
-
# Then, based on `type_name` and `id`
|
47
|
-
# find an object in your application
|
48
|
-
# ...
|
57
|
+
def self.object_from_id(global_id, query_ctx)
|
58
|
+
# For example, use Rails' GlobalID library (https://github.com/rails/globalid):
|
59
|
+
GlobalID.find(global_id)
|
49
60
|
end
|
50
61
|
RUBY
|
51
62
|
inject_into_file schema_file_path, schema_code, before: /^end\n/m, force: false
|
@@ -12,8 +12,10 @@ module Graphql
|
|
12
12
|
desc "Create a GraphQL::ScalarType with the given name"
|
13
13
|
source_root File.expand_path('../templates', __FILE__)
|
14
14
|
|
15
|
-
|
16
|
-
|
15
|
+
private
|
16
|
+
|
17
|
+
def graphql_type
|
18
|
+
"scalar"
|
17
19
|
end
|
18
20
|
end
|
19
21
|
end
|