Resolver#initialize argument cache misses arguments added by field extensions
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
- #5573 di @rmosolgo — chiusa senza merge
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 48/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Ferma
- Stack tecnologico
- ruby
- Ambito
- api, backend-api-design
Direzione di ricerca
Start with lib/graphql/schema/resolver.rb at the caching shown in the issue, then reproduce the FieldExtension example and inspect the resolver's argument lookup. Done means extension-added arguments appear in context.types.arguments(self.class) and context.types.argument(self.class, name), while existing resolution behavior remains intact.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Describe the bug
When a FieldExtension adds arguments to a mutation field via apply, those arguments are not included in the @arguments_by_keyword cache built in Resolver#initialize. This means context.types.argument(mutation_class, name) returns nil for extension-added arguments, even though they are valid schema arguments on the field.
The root cause is this caching in Resolver#initialize:
@arguments_by_keyword = {}
context.types.arguments(self.class).each do |arg|
@arguments_by_keyword[arg.keyword] = arg
end
context.types.arguments(self.class) only returns arguments defined directly on the resolver class — not arguments added to the field by extensions.
Versions
graphql version: 2.5.15
rails (or other framework): Rails (version not specific to the bug)
other applicable versions: N/A
GraphQL schema
class ExtraInput < GraphQL::Schema::InputObject
argument :value, String, required: false
end
class MyExtension < GraphQL::Schema::FieldExtension
def apply
field.argument(:extra, ExtraInput, required: false)
end
end
class MyMutation < GraphQL::Schema::Mutation
argument :input, String, required: false
extension(MyExtension)
field :result, String
def resolve(input: nil, extra: nil)
# extra is received correctly at resolve time,
# but is not in @arguments_by_keyword
{ result: "ok" }
end
end
class MutationRoot < GraphQL::Schema::Object
field :my_mutation, mutation: MyMutation
end
class MySchema < GraphQL::Schema
mutation MutationRoot
end
GraphQL query
mutation {
myMutation(input: "test", extra: { value: "hello" }) {
result
}
}
Steps to reproduce
- Define a
FieldExtensionthat adds an argument viafield.argument(...)inapply - Attach the extension to a mutation with
extension(MyExtension) - In any code that runs during resolution, call
context.types.argument(MyMutation, "extra")— it returnsnil - Alternatively, inspect
@arguments_by_keywordinside the resolver —:extrais missing
Expected behavior
context.types.arguments(self.class) (and by extension context.types.argument(self.class, name)) should include arguments added by field extensions, since those arguments are part of the field's actual schema signature and are accepted at query time.
Actual behavior
Extension-added arguments are missing from @arguments_by_keyword and from context.types.argument lookups against the resolver class. The arguments work correctly at resolve time (they're passed as keyword args), but any introspection or validation code that uses the types API to look up arguments on the mutation class can't find them.
Additional context
A workaround is to look up arguments via the schema field instead of the resolver class:
mutation_root = context.schema.mutation
mutation_field = context.types.field(mutation_root, "myMutation")
context.types.argument(mutation_field, "extra") # => returns the argument
This correctly finds extension-added arguments, but requires traversing the schema manually rather than using the resolver class directly.
- Lingua principale
- Ruby
- Stelle
- 5.4k
- Fork
- 1.4k
- Merge medio
- 1g 8h
- PR unite (30g)
- 74
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di rmosolgo/graphql-ruby
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
rmosolgo/graphql-ruby#5843 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 55/100
rmosolgo/graphql-ruby#5763 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 45/100
rmosolgo/graphql-ruby#5761 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 52/100
rmosolgo/graphql-ruby#5707 · 10 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 30/100
rmosolgo/graphql-ruby#5655 · 4 commenti ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di rmosolgo/graphql-ruby
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
TheOdinProject/curriculum#31512 ·
I maintainer di solito rispondono entro 1 giorno
-
area/web interface
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
ruby-grape/grape-swagger#1014 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
rubys/roundhouse#1757 ·
-
Difficoltà 2/5 Mezza giornata Idoneità per principianti 72/100
shakacode/react-on-rails-demo-flagship#102 ·
I maintainer di solito rispondono entro 1 giorno