11from collections import OrderedDict
2-
32from graphql .core .type import GraphQLField , GraphQLInputObjectField
4-
53from ..types .argument import Argument
64from ..utils .gen_id import gen_id
75from ..utils .thunk import TypeThunk
86from ..utils .to_camel_case import to_camel_case
7+ from ..utils .wrap_resolver_translating_arguments import wrap_resolver_translating_arguments
98
109
1110class Field (object ):
@@ -20,13 +19,19 @@ def __init__(self, type, description=None, args=None, name=None, resolver=None,
2019 self ._counter = _counter or gen_id ()
2120
2221 def to_field (self , registry , resolver ):
23- return GraphQLField (registry [self .type ](), args = self .get_arguments (registry ), resolver = resolver )
22+ args , arguments_to_original_case = self .get_arguments (registry )
23+
24+ if arguments_to_original_case :
25+ resolver = wrap_resolver_translating_arguments (resolver , arguments_to_original_case )
26+
27+ return GraphQLField (registry [self .type ](), args = args , resolver = resolver )
2428
2529 def get_arguments (self , registry ):
2630 if not self .args :
27- return None
31+ return None , None
2832
2933 arguments = []
34+ arguments_to_original_case = {}
3035
3136 for k , argument in self .args .items ():
3237 if isinstance (argument , TypeThunk ):
@@ -35,16 +40,29 @@ def get_arguments(self, registry):
3540 elif not isinstance (argument , Argument ):
3641 raise ValueError ('Unknown argument value type %r' % argument )
3742
43+ camel_cased_name = to_camel_case (k )
44+ if camel_cased_name in arguments_to_original_case :
45+ raise ValueError (
46+ 'Argument %s already exists as %s' %
47+ (k , arguments_to_original_case [camel_cased_name ])
48+ )
49+
50+ arguments_to_original_case [camel_cased_name ] = k
3851 arguments .append ((
39- to_camel_case ( k ) , argument
52+ camel_cased_name , argument
4053 ))
4154
4255 if not isinstance (self .args , OrderedDict ):
4356 arguments .sort (
4457 key = lambda i : i [1 ]._counter
4558 )
4659
47- return OrderedDict ([(k , v .to_argument (registry )) for k , v in arguments ])
60+ # Remove things that wouldn't perform any meaningful translation.
61+ for k , v in list (arguments_to_original_case .items ()):
62+ if k == v :
63+ del arguments_to_original_case [k ]
64+
65+ return OrderedDict ([(k , v .to_argument (registry )) for k , v in arguments ]), arguments_to_original_case
4866
4967
5068class InputField (object ):
0 commit comments