Skip to content

Commit 516c0a4

Browse files
committed
add option to validate fields
1 parent 1f19818 commit 516c0a4

File tree

2 files changed

+80
-27
lines changed

2 files changed

+80
-27
lines changed

graphql-api-generator/generator.py

Lines changed: 76 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,10 @@
1616

1717
def cmd(args):
1818
# load config
19+
config = {}
1920
if args.config:
2021
with open(args.config) as f:
2122
config = yaml.safe_load(f)
22-
else:
23-
config = {}
2423

2524
# get list of schema files
2625
files = []
@@ -50,33 +49,13 @@ def cmd(args):
5049

5150

5251
def run(schema: GraphQLSchema, config: dict):
52+
# validate
53+
if config.get('validate'):
54+
validate_names(schema, config.get('validate'))
55+
5356
# transform
5457
if config.get('transform'):
55-
transform = config.get('transform')
56-
# types and interfaces
57-
if transform.get('type_names'):
58-
if transform.get('type_names') in string_transforms:
59-
transform_types(schema, string_transforms[transform.get('type_names')])
60-
else:
61-
raise Exception('Unsupported type name transform: ' + transform.get('type_names'))
62-
63-
# fields
64-
if transform.get('field_names'):
65-
if transform.get('field_names') in string_transforms:
66-
transform_fields(schema, string_transforms[transform.get('field_names')])
67-
else:
68-
raise Exception('Unsupported field name transform: ' + transform.get('field_names'))
69-
70-
# enums
71-
if transform.get('enum_values'):
72-
if transform.get('enum_values') in string_transforms:
73-
transform_enums(schema, string_transforms[transform.get('enum_values')])
74-
else:
75-
raise Exception('Unsupported field name transform: ' + transform.get('field_names'))
76-
77-
# comments
78-
if transform.get('drop_comments'):
79-
drop_comments(schema)
58+
transform_names(schema, config.get('transform'))
8059

8160
# API generation
8261
if config.get('generation'):
@@ -148,6 +127,74 @@ def run(schema: GraphQLSchema, config: dict):
148127
return schema
149128

150129

130+
def validate_names(schema:GraphQLSchema, validate):
131+
# types and interfaces
132+
if validate.get('type_names'):
133+
# type names
134+
f = string_transforms.get(validate.get('type_names'))
135+
if f is None:
136+
raise Exception('Unrecognized option: ' + validate.get('type_names'))
137+
for type_name, _type in schema.type_map.items():
138+
if is_introspection_type(_type):
139+
continue
140+
if f(type_name) != type_name:
141+
raise Exception(f'Type "{type_name}" does not follow {validate.get("type_names")}')
142+
143+
# field names
144+
if validate.get('field_names'):
145+
f = string_transforms.get(validate.get('field_names'))
146+
if f is None:
147+
raise Exception('Unrecognized option: ' + validate.get('field_names'))
148+
for type_name, _type in schema.type_map.items():
149+
if is_introspection_type(_type) or is_enum_or_scalar(_type):
150+
continue
151+
for field_name in _type.fields.keys():
152+
if field_name.startswith('_'):
153+
continue
154+
if f(field_name) != field_name:
155+
raise Exception(f'Field "{field_name}" does not follow {validate.get("field_names")}')
156+
157+
# enum names
158+
if validate.get('enum_values'):
159+
f = string_transforms.get(validate.get('enum_values'))
160+
if f is None:
161+
raise Exception('Unrecognized option: ' + validate.get('enum_values'))
162+
for type_name, _type in schema.type_map.items():
163+
if is_introspection_type(_type) or not is_enum_type(_type):
164+
continue
165+
166+
for i in _type.values.keys():
167+
if f(i) != i:
168+
raise Exception(f'Enum "{i}" does not follow {validate.get("enum_values")}')
169+
170+
171+
def transform_names(schema: GraphQLSchema, transform):
172+
# types and interfaces
173+
if transform.get('type_names'):
174+
if transform.get('type_names') in string_transforms:
175+
transform_types(schema, string_transforms[transform.get('type_names')])
176+
else:
177+
raise Exception('Unsupported type name transform: ' + transform.get('type_names'))
178+
179+
# fields
180+
if transform.get('field_names'):
181+
if transform.get('field_names') in string_transforms:
182+
transform_fields(schema, string_transforms[transform.get('field_names')])
183+
else:
184+
raise Exception('Unsupported field name transform: ' + transform.get('field_names'))
185+
186+
# enums
187+
if transform.get('enum_values'):
188+
if transform.get('enum_values') in string_transforms:
189+
transform_enums(schema, string_transforms[transform.get('enum_values')])
190+
else:
191+
raise Exception('Unsupported field name transform: ' + transform.get('field_names'))
192+
193+
# comments
194+
if transform.get('drop_comments'):
195+
drop_comments(schema)
196+
197+
151198
def transform_types(schema, transform):
152199
type_names = set(schema.type_map.keys())
153200
for type_name in type_names:
@@ -165,6 +212,8 @@ def transform_fields(schema, transform):
165212
continue
166213
field_names = set(_type.fields.keys())
167214
for field_name in field_names:
215+
if field_name.startswith('_'):
216+
continue
168217
field = _type.fields[field_name]
169218
_type.fields.pop(field_name)
170219
_type.fields[transform(field_name)] = field

graphql-api-generator/resources/config.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
validate:
2+
type_names: PascalCase
3+
field_names: camelCase
4+
enum_values: PascalCase
15
transform:
26
type_names: PascalCase
37
field_names: camelCase

0 commit comments

Comments
 (0)