Skip to content

Commit 4c5ff78

Browse files
committed
Trim _ids from argument name and append s when there is not one
1 parent 653e883 commit 4c5ff78

File tree

3 files changed

+65
-4
lines changed

3 files changed

+65
-4
lines changed

lib/graphql/schema/resolver.rb

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -324,9 +324,23 @@ def type_expr
324324
# @see {GraphQL::Schema::Argument#initialize} for the signature
325325
def argument(name, type, *rest, loads: nil, **kwargs, &block)
326326
if loads
327-
arg_keyword = kwargs[:as] ||= name.to_s.sub(/_id$/, "").to_sym
328-
own_arguments_loads_as_type[arg_keyword] = loads
327+
name_as_string = name.to_s
328+
329+
inferred_arg_name = case name_as_string
330+
when /_id$/
331+
name_as_string.sub(/_id$/, "").to_sym
332+
when /_ids$/
333+
name_as_string.sub(/_ids$/, "")
334+
.sub(/([^s])$/, "\\1s")
335+
.to_sym
336+
else
337+
name
338+
end
339+
340+
kwargs[:as] ||= inferred_arg_name
341+
own_arguments_loads_as_type[kwargs[:as]] = loads
329342
end
343+
330344
arg_defn = super(name, type, *rest, **kwargs, &block)
331345

332346
if loads && arg_defn.type.list?

spec/graphql/schema/relay_classic_mutation_spec.rb

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,32 @@
6565
GRAPHQL
6666
}
6767

68-
it "loads arguments as objects of the given type" do
68+
it "loads arguments as objects of the given type and strips `_ids` suffix off argument name and appends `s`" do
6969
res = Jazz::Schema.execute(query_str, variables: { ids: ["Ensemble/Robert Glasper Experiment", "Ensemble/Bela Fleck and the Flecktones"]})
7070
assert_equal ["Ensemble/Robert Glasper Experiment", "Ensemble/Bela Fleck and the Flecktones"], res["data"]["upvoteEnsembles"]["ensembles"].map { |e| e["id"] }
7171
end
7272

73+
it "uses the `as:` name when loading" do
74+
as_bands_query_str = query_str.sub("upvoteEnsembles", "upvoteEnsemblesAsBands")
75+
res = Jazz::Schema.execute(as_bands_query_str, variables: { ids: ["Ensemble/Robert Glasper Experiment", "Ensemble/Bela Fleck and the Flecktones"]})
76+
assert_equal ["Ensemble/Robert Glasper Experiment", "Ensemble/Bela Fleck and the Flecktones"], res["data"]["upvoteEnsemblesAsBands"]["ensembles"].map { |e| e["id"] }
77+
end
78+
79+
it "doesn't append `s` to argument names that already end in `s`" do
80+
query = <<-GRAPHQL
81+
mutation($ids: [ID!]!) {
82+
upvoteEnsemblesIds(input: {ensemblesIds: $ids}) {
83+
ensembles {
84+
id
85+
}
86+
}
87+
}
88+
GRAPHQL
89+
90+
res = Jazz::Schema.execute(query, variables: { ids: ["Ensemble/Robert Glasper Experiment", "Ensemble/Bela Fleck and the Flecktones"]})
91+
assert_equal ["Ensemble/Robert Glasper Experiment", "Ensemble/Bela Fleck and the Flecktones"], res["data"]["upvoteEnsemblesIds"]["ensembles"].map { |e| e["id"] }
92+
end
93+
7394
it "returns an error instead when the ID resolves to nil" do
7495
res = Jazz::Schema.execute(query_str, variables: {
7596
ids: ["Ensemble/Nonexistant Name"],

spec/support/jazz.rb

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -489,7 +489,31 @@ def resolve(ensemble:, new_name:)
489489
end
490490

491491
class UpvoteEnsembles < GraphQL::Schema::RelayClassicMutation
492-
argument :ensemble_ids, [ID], required: true, loads: Ensemble, as: :ensembles
492+
argument :ensemble_ids, [ID], required: true, loads: Ensemble
493+
494+
field :ensembles, [Ensemble], null: false
495+
496+
def resolve(ensembles:)
497+
{
498+
ensembles: ensembles
499+
}
500+
end
501+
end
502+
503+
class UpvoteEnsemblesAsBands < GraphQL::Schema::RelayClassicMutation
504+
argument :ensemble_ids, [ID], required: true, loads: Ensemble, as: :bands
505+
506+
field :ensembles, [Ensemble], null: false
507+
508+
def resolve(bands:)
509+
{
510+
ensembles: bands
511+
}
512+
end
513+
end
514+
515+
class UpvoteEnsemblesIds < GraphQL::Schema::RelayClassicMutation
516+
argument :ensembles_ids, [ID], required: true, loads: Ensemble
493517

494518
field :ensembles, [Ensemble], null: false
495519

@@ -517,6 +541,8 @@ class Mutation < BaseObject
517541
field :add_sitar, mutation: AddSitar
518542
field :rename_ensemble, mutation: RenameEnsemble
519543
field :upvote_ensembles, mutation: UpvoteEnsembles
544+
field :upvote_ensembles_as_bands, mutation: UpvoteEnsemblesAsBands
545+
field :upvote_ensembles_ids, mutation: UpvoteEnsemblesIds
520546
field :rename_ensemble_as_band, mutation: RenameEnsembleAsBand
521547

522548
def add_ensemble(input:)

0 commit comments

Comments
 (0)