@@ -18,6 +18,16 @@ def uppercase(string: str):
18
18
return string .upper ()
19
19
20
20
21
+ def is_meta_field (field ):
22
+ """
23
+ Returns true if a field should be recognized as a system defined meta data field.
24
+ :param field:
25
+ :return:
26
+ """
27
+ meta_fields = ['_creationDate' , '_lastUpdateDate' ]
28
+ return field in meta_fields
29
+
30
+
21
31
def capitalize (string : str ):
22
32
"""
23
33
Make the first letter of string upper case.
@@ -36,14 +46,27 @@ def decapitalize(string: str):
36
46
return string [0 ].lower () + string [1 :]
37
47
38
48
39
- def is_schema_defined_type (_type : GraphQLType ):
49
+ def is_db_schema_defined_type (_type : GraphQLType ):
40
50
"""
41
- Returns true if a type is a schema-defined GraphQL type.
51
+ Returns true if _type is a GraphQL type defined in the DB schema .
42
52
:param _type:
43
53
:return:
44
54
"""
45
55
if is_input_type (_type ) or _type .name .startswith ('_' ) or _type .name == 'Mutation' or _type .name == 'Query' :
46
56
return False
57
+
58
+ return True
59
+
60
+
61
+ def is_schema_defined_type (_type : GraphQLType ):
62
+ """
63
+ Returns true if _type is a schema-defined GraphQL type.
64
+ :param _type:
65
+ :return:
66
+ """
67
+ if is_input_type (_type ) or _type .name .startswith ('__' ) or _type .name == 'Mutation' or _type .name == 'Query' :
68
+ return False
69
+
47
70
return True
48
71
49
72
@@ -89,7 +112,7 @@ def add_id_to_types(schema: GraphQLSchema):
89
112
"""
90
113
make = ''
91
114
for _type in schema .type_map .values ():
92
- if not is_schema_defined_type (_type ):
115
+ if not is_db_schema_defined_type (_type ):
93
116
continue
94
117
if is_interface_type (_type ):
95
118
make += f'extend interface { _type .name } {{ id: ID! }} '
@@ -108,6 +131,7 @@ def add_creation_date_to_types(schema: GraphQLSchema):
108
131
for _type in schema .type_map .values ():
109
132
if not is_schema_defined_type (_type ):
110
133
continue
134
+
111
135
if is_interface_type (_type ):
112
136
make += f'extend interface { _type .name } {{ _creationDate: DateTime! }} '
113
137
else :
@@ -168,7 +192,7 @@ def add_reverse_edges(schema: GraphQLSchema):
168
192
"""
169
193
make = ''
170
194
for _type in schema .type_map .values ():
171
- if not is_schema_defined_type (_type ):
195
+ if not is_db_schema_defined_type (_type ):
172
196
continue
173
197
174
198
for field_name , field_type in _type .fields .items ():
@@ -200,15 +224,15 @@ def add_input_to_create(schema: GraphQLSchema):
200
224
# add create types (placeholders)
201
225
make = ''
202
226
for _type in schema .type_map .values ():
203
- if not is_schema_defined_type (_type ) or is_interface_type (_type ):
227
+ if not is_db_schema_defined_type (_type ) or is_interface_type (_type ):
204
228
continue
205
229
make += f'input _InputToCreate{ _type .name } '
206
230
schema = add_to_schema (schema , make )
207
231
208
232
# add fields to create types
209
233
make = ''
210
234
for _type in schema .type_map .values ():
211
- if not is_schema_defined_type (_type ) or is_interface_type (_type ):
235
+ if not is_db_schema_defined_type (_type ) or is_interface_type (_type ):
212
236
continue
213
237
make += f'\n extend input _InputToCreate{ _type .name } {{ '
214
238
for field_name , field in _type .fields .items ():
@@ -248,7 +272,7 @@ def add_key_input_types(schema: GraphQLSchema):
248
272
make_types = ''
249
273
extend_fields = ''
250
274
for _type in schema .type_map .values ():
251
- if not is_schema_defined_type (_type ) or is_interface_type (_type ):
275
+ if not is_db_schema_defined_type (_type ) or is_interface_type (_type ):
252
276
continue
253
277
keys = _get_keys_for_type (_type )
254
278
# TODO: Modify this when we need to handle multiple keys.
@@ -279,7 +303,7 @@ def add_key_queries(schema: GraphQLSchema):
279
303
# Create queries for object types
280
304
make = ''
281
305
for _type in schema .type_map .values ():
282
- if not is_schema_defined_type (_type ):
306
+ if not is_db_schema_defined_type (_type ):
283
307
continue
284
308
keys = _get_keys_for_type (_type )
285
309
# TODO: Handle multiple keys here, somehow.
@@ -329,7 +353,7 @@ def add_input_update(schema: GraphQLSchema):
329
353
# Create update inputs
330
354
make = ''
331
355
for _type in schema .type_map .values ():
332
- if not is_schema_defined_type (_type ) or is_interface_type (_type ):
356
+ if not is_db_schema_defined_type (_type ) or is_interface_type (_type ):
333
357
continue
334
358
update_name = f'_InputToUpdate{ _type .name } '
335
359
make += f'input { update_name } '
@@ -338,7 +362,7 @@ def add_input_update(schema: GraphQLSchema):
338
362
# Add fields to update type
339
363
make = ''
340
364
for _type in schema .type_map .values ():
341
- if not is_schema_defined_type (_type ) or is_interface_type (_type ):
365
+ if not is_db_schema_defined_type (_type ) or is_interface_type (_type ):
342
366
continue
343
367
for field_name , field in _type .fields .items ():
344
368
if field_name == 'id' or field_name [0 ] == '_' :
@@ -368,7 +392,7 @@ def add_get_queries(schema: GraphQLSchema):
368
392
# Create queries for object types
369
393
make = ''
370
394
for _type in schema .type_map .values ():
371
- if not is_schema_defined_type (_type ):
395
+ if not is_db_schema_defined_type (_type ):
372
396
continue
373
397
make += f'extend type Query {{ { decapitalize (_type .name )} (id:ID!): { _type .name } }} '
374
398
schema = add_to_schema (schema , make )
@@ -383,7 +407,7 @@ def add_list_of_types(schema: GraphQLSchema):
383
407
"""
384
408
make = ''
385
409
for _type in schema .type_map .values ():
386
- if not is_schema_defined_type (_type ):
410
+ if not is_db_schema_defined_type (_type ):
387
411
continue
388
412
389
413
make += f'type _ListOf{ _type .name } s {{ ' \
@@ -403,7 +427,7 @@ def add_list_queries(schema: GraphQLSchema):
403
427
"""
404
428
make = ''
405
429
for _type in schema .type_map .values ():
406
- if not is_schema_defined_type (_type ):
430
+ if not is_db_schema_defined_type (_type ):
407
431
continue
408
432
make += f'extend type Query {{ ' \
409
433
f' listOf{ _type .name } s(first:Int=10, after:ID="", filter:_FilterFor{ _type .name } ): _ListOf{ _type .name } s ' \
@@ -412,13 +436,15 @@ def add_list_queries(schema: GraphQLSchema):
412
436
return schema
413
437
414
438
415
- def add_scalar_filters (schema : GraphQLSchema ):
439
+ def add_scalar_filters (schema : GraphQLSchema , config : dict ):
416
440
"""
417
441
Add filter inputs for GrahpQL types (Hasura-style).
418
442
:param schema:
419
443
:return:
420
444
"""
421
445
make = ''
446
+ manually_handled_scalars = ['Int' , 'Float' , 'String' , 'Boolean' , 'ID' ]
447
+
422
448
# Numeric
423
449
scalars = ['Int' , 'Float' ]
424
450
for scalar in scalars :
@@ -471,9 +497,24 @@ def add_scalar_filters(schema: GraphQLSchema):
471
497
' _neq: Boolean ' \
472
498
'} '
473
499
500
+ # If DateTime is defined as a scalar then create filter (behaves like an integer)
501
+ date_time = schema .type_map .get ("DateTime" )
502
+ if is_scalar_type (date_time ):
503
+ manually_handled_scalars .append ('DateTime' )
504
+ make += 'input _DateTimeFilter {' \
505
+ ' _eq: DateTime ' \
506
+ ' _neq: DateTime ' \
507
+ ' _in: [DateTime] ' \
508
+ ' _nin: [DateTime] ' \
509
+ ' _gt: DateTime ' \
510
+ ' _egt: DateTime ' \
511
+ ' _lt: DateTime ' \
512
+ ' _elt: DateTime ' \
513
+ '} '
514
+
474
515
# Schema-defined scalars
475
516
for scalar_name , scalar in schema .type_map .items ():
476
- if not is_scalar_type (scalar ) or scalar_name in [ 'Int' , 'Float' , 'String' , 'Boolean' , 'ID' ] :
517
+ if not is_scalar_type (scalar ) or scalar_name in manually_handled_scalars :
477
518
continue
478
519
479
520
make += f'input _{ scalar_name } Filter {{' \
@@ -496,7 +537,7 @@ def add_type_filters(schema: GraphQLSchema):
496
537
"""
497
538
make = ''
498
539
for _type in schema .type_map .values ():
499
- if not is_schema_defined_type (_type ):
540
+ if not is_db_schema_defined_type (_type ):
500
541
continue
501
542
502
543
make += f'input _FilterFor{ _type .name } {{ ' \
@@ -505,7 +546,7 @@ def add_type_filters(schema: GraphQLSchema):
505
546
f' _not: _FilterFor{ _type .name } '
506
547
507
548
for field_name , field in _type .fields .items ():
508
- if field_name [0 ] == '_' :
549
+ if field_name [0 ] == '_' and not is_meta_field ( field_name ) :
509
550
continue
510
551
511
552
# remove outer required
@@ -532,7 +573,7 @@ def add_object_type_filters(schema: GraphQLSchema):
532
573
:return:
533
574
"""
534
575
for _type in schema .type_map .values ():
535
- if not is_schema_defined_type (_type ):
576
+ if not is_db_schema_defined_type (_type ):
536
577
continue
537
578
538
579
for field_name , field in _type .fields .items ():
@@ -560,16 +601,10 @@ def get_field_annotations(field: GraphQLField):
560
601
return " " .join (annotation_fields )
561
602
562
603
563
- def add_edge_objects (schema : GraphQLSchema , field_for_creation_date , field_for_last_update_date ):
604
+ def add_edge_objects (schema : GraphQLSchema ):
564
605
make = ''
565
- creation_date_string = ''
566
- last_update_date_string = ''
567
- if field_for_creation_date :
568
- creation_date_string = '_creationDate: Date!'
569
- if field_for_last_update_date :
570
- last_update_date_string = '_lastUpdateDate: Date'
571
606
for _type in schema .type_map .values ():
572
- if not is_schema_defined_type (_type ) or is_interface_type (_type ):
607
+ if not is_db_schema_defined_type (_type ) or is_interface_type (_type ):
573
608
continue
574
609
connected_types = schema .get_possible_types (_type ) if is_interface_type (_type ) else [_type ]
575
610
for field_name , field in _type .fields .items ():
@@ -579,7 +614,7 @@ def add_edge_objects(schema: GraphQLSchema, field_for_creation_date, field_for_l
579
614
for t in connected_types :
580
615
edge_from = f'{ capitalize (field_name )} EdgeFrom{ t .name } '
581
616
annotations = get_field_annotations (field )
582
- make += f'type _{ edge_from } {{id:ID! source: { t .name } ! target: { inner_field_type } ! { creation_date_string } { last_update_date_string } { annotations } }}\n '
617
+ make += f'type _{ edge_from } {{id:ID! source: { t .name } ! target: { inner_field_type } ! { annotations } }}\n '
583
618
584
619
schema = add_to_schema (schema , make )
585
620
return schema
@@ -588,7 +623,7 @@ def add_edge_objects(schema: GraphQLSchema, field_for_creation_date, field_for_l
588
623
def add_input_to_create_edge_objects (schema : GraphQLSchema ):
589
624
make = ''
590
625
for _type in schema .type_map .values ():
591
- if not is_schema_defined_type (_type ) or is_interface_type (_type ):
626
+ if not is_db_schema_defined_type (_type ) or is_interface_type (_type ):
592
627
continue
593
628
connected_types = schema .get_possible_types (_type ) if is_interface_type (_type ) else [_type ]
594
629
for field_name , field in _type .fields .items ():
@@ -614,7 +649,7 @@ def add_input_to_create_edge_objects(schema: GraphQLSchema):
614
649
def add_mutation_create_edge_objects (schema : GraphQLSchema ):
615
650
make = ''
616
651
for _type in schema .type_map .values ():
617
- if not is_schema_defined_type (_type ) or is_interface_type (_type ):
652
+ if not is_db_schema_defined_type (_type ) or is_interface_type (_type ):
618
653
continue
619
654
connected_types = schema .get_possible_types (_type ) if is_interface_type (_type ) else [_type ]
620
655
for field_name , field in _type .fields .items ():
@@ -634,7 +669,7 @@ def add_mutation_create_edge_objects(schema: GraphQLSchema):
634
669
def remove_field_arguments_for_types (schema : GraphQLSchema ):
635
670
keep_args = ['filter' ]
636
671
for _type in schema .type_map .values ():
637
- if not is_schema_defined_type (_type ):
672
+ if not is_db_schema_defined_type (_type ):
638
673
continue
639
674
for field_name , field in _type .fields .items ():
640
675
args = {}
@@ -674,7 +709,7 @@ def add_create_mutations(schema: GraphQLSchema):
674
709
"""
675
710
make = ''
676
711
for _type in schema .type_map .values ():
677
- if not is_schema_defined_type (_type ) or is_interface_type (_type ):
712
+ if not is_db_schema_defined_type (_type ) or is_interface_type (_type ):
678
713
continue
679
714
create = f'create{ _type .name } '
680
715
input_type = f'_InputToCreate{ _type .name } '
@@ -692,7 +727,7 @@ def add_update_mutations(schema: GraphQLSchema):
692
727
"""
693
728
make = ''
694
729
for _type in schema .type_map .values ():
695
- if not is_schema_defined_type (_type ) or is_interface_type (_type ):
730
+ if not is_db_schema_defined_type (_type ) or is_interface_type (_type ):
696
731
continue
697
732
update = f'update{ capitalize (_type .name )} '
698
733
input_type = f'_InputToUpdate{ _type .name } '
@@ -710,7 +745,7 @@ def add_delete_mutations(schema: GraphQLSchema):
710
745
"""
711
746
make = ''
712
747
for _type in schema .type_map .values ():
713
- if not is_schema_defined_type (_type ):
748
+ if not is_db_schema_defined_type (_type ):
714
749
continue
715
750
delete = f'delete{ _type .name } '
716
751
make += f'extend type Mutation {{ { delete } (id: ID!): { _type .name } }} '
0 commit comments