Skip to content

Commit b66a50b

Browse files
committed
Updated date to datetime and allow automatic creation of said scalar
1 parent c510148 commit b66a50b

File tree

5 files changed

+115
-4
lines changed

5 files changed

+115
-4
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ generation:
4141
# add id field to all schema types
4242
field_for_id: true
4343
# add creation date and last update date field(s) to all schema types
44+
generate_datetime: false
4445
field_for_creation_date: true
4546
field_for_last_update_date: true
4647
# add reverse edges for traversal

graphql-api-generator/generator.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ def cmd(args):
4949

5050

5151
def run(schema: GraphQLSchema, config: dict):
52+
# check if DateTime exists, or should be added
53+
if config.get('generation').get('generate_datetime') or config.get('generation').get('field_for_creation_date') or config.get('generation').get('field_for_last_update_date'):
54+
datetime_control(schema)
55+
5256
# validate
5357
if config.get('validate'):
5458
validate_names(schema, config.get('validate'))
@@ -140,6 +144,17 @@ def run(schema: GraphQLSchema, config: dict):
140144

141145

142146
def validate_names(schema: GraphQLSchema, validate):
147+
# scalars
148+
if validate.get('scalar_names'):
149+
# type names
150+
f = string_transforms.get(validate.get('scalar_names'))
151+
if f is None:
152+
raise Exception('Unrecognized option: ' + validate.get('type_names'))
153+
for type_name, _type in schema.type_map.items():
154+
if is_sclara_type(_type):
155+
if f(type_name) != type_name:
156+
raise Exception(f'Scalar "{type_name}" does not follow {validate.get("scalar_names")}')
157+
143158
# types and interfaces
144159
if validate.get('type_names'):
145160
# type names
@@ -181,6 +196,13 @@ def validate_names(schema: GraphQLSchema, validate):
181196

182197

183198
def transform_names(schema: GraphQLSchema, transform):
199+
# scalar
200+
if transform.get('scalar_names'):
201+
if transform.get('scalar_names') in string_transforms:
202+
transform_scalars(schema, string_transforms[transform.get('scalar_names')])
203+
else:
204+
raise Exception('Unsupported scalar name transform: ' + transform.get('scalar_names'))
205+
184206
# types and interfaces
185207
if transform.get('type_names'):
186208
if transform.get('type_names') in string_transforms:
@@ -207,6 +229,16 @@ def transform_names(schema: GraphQLSchema, transform):
207229
drop_comments(schema)
208230

209231

232+
def transform_scalars(schema, transform):
233+
type_names = set(schema.type_map.keys())
234+
for type_name in type_names:
235+
_type = schema.type_map[type_name]
236+
if is_scalar_type(_type):
237+
schema.type_map.pop(type_name)
238+
_type.name = transform(type_name)
239+
schema.type_map[_type.name] = _type
240+
241+
210242
def transform_types(schema, transform):
211243
type_names = set(schema.type_map.keys())
212244
for type_name in type_names:
@@ -256,6 +288,17 @@ def drop_comments(schema):
256288
field.description = None
257289

258290

291+
def datetime_control(schema):
292+
type_names = set(schema.type_map.keys())
293+
if 'DateTime' in type_names:
294+
if not is_scalar_type(schema.type_map['DateTime']):
295+
raise Exception('DateTime exists but is not scalar type: ' + schema.type_map['DateTime'])
296+
else:
297+
schema.type_map['DateTime'] = GraphQLScalarType('DateTime')
298+
if not is_scalar_type(schema.type_map['DateTime']):
299+
raise Exception('DateTime could not be added as scalar!')
300+
301+
259302
if __name__ == '__main__':
260303
parser = argparse.ArgumentParser()
261304
parser.add_argument('--input', type=str, required=True,

graphql-api-generator/resources/config.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ generation:
1313
# add id field to all schema types
1414
field_for_id: true
1515
# add creation date and last update date field(s) to all schema types
16+
generate_datetime: false
1617
field_for_creation_date: false
1718
field_for_last_update_date: false
1819
# add reverse edges for traversal

graphql-api-generator/test/all_tests.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,69 @@ def test_add_input_to_create_1(self):
5050
''')
5151
schema_out = generator.run(schema_in, config)
5252
assert compare.is_equals_schema(schema_out, expected)
53+
54+
def test_add_crationDate_1(self):
55+
schema_in = build_schema('''
56+
type Test
57+
''')
58+
config = {'generation': {'field_for_creation_date': True}}
59+
expected = build_schema('''
60+
scalar DateTime
61+
type Test {
62+
_creationDate: DateTime!
63+
}
64+
''')
65+
schema_out = run(schema_in, config)
66+
assert compare.is_equals_schema(schema_out, expected)
67+
68+
def test_add_lastUpdateDate_1(self):
69+
schema_in = build_schema('''
70+
type Test
71+
''')
72+
config = {'generation': {'field_for_last_update_date': True}}
73+
expected = build_schema('''
74+
scalar DateTime
75+
type Test {
76+
_lastUpdateDate: DateTime
77+
}
78+
''')
79+
schema_out = run(schema_in, config)
80+
assert compare.is_equals_schema(schema_out, expected)
81+
82+
def test_datetime_scalar_1(self):
83+
schema_in = build_schema('''
84+
type datetime_test
85+
''')
86+
config = {'generation': {'generate_datetime': True}}
87+
try:
88+
run(schema_in, config)
89+
assert True
90+
except:
91+
assert False
92+
93+
def test_datetime_scalar_2(self):
94+
schema_in = build_schema('''
95+
scalar DateTime
96+
type datetime_test { date: DateTime! }
97+
''')
98+
config = {'generation': {'generate_datetime': True}}
99+
try:
100+
run(schema_in, config)
101+
assert True
102+
except:
103+
assert False
104+
105+
def test_datetime_scalar_3(self):
106+
schema_in = build_schema('''
107+
type DateTime {
108+
date: String!
109+
time: String!
110+
}
111+
type datetime_test { date: DateTime! }
112+
''')
113+
config = {'generation': {'generate_datetime': True}}
114+
try:
115+
run(schema_in, config)
116+
assert False
117+
except:
118+
assert True

graphql-api-generator/utils/utils.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,9 @@ def add_creation_date_to_types(schema: GraphQLSchema):
109109
if not is_schema_defined_type(_type):
110110
continue
111111
if is_interface_type(_type):
112-
make += f'extend interface {_type.name} {{ _creationDate: Date! }} '
112+
make += f'extend interface {_type.name} {{ _creationDate: DateTime! }} '
113113
else:
114-
make += f'extend type {_type.name} {{ _creationDate: Date! }} '
114+
make += f'extend type {_type.name} {{ _creationDate: DateTime! }} '
115115
return add_to_schema(schema, make)
116116

117117

@@ -126,9 +126,9 @@ def add_last_update_date_to_types(schema: GraphQLSchema):
126126
if not is_schema_defined_type(_type):
127127
continue
128128
if is_interface_type(_type):
129-
make += f'extend interface {_type.name} {{ _lastUpdateDate: Date }} '
129+
make += f'extend interface {_type.name} {{ _lastUpdateDate: DateTime }} '
130130
else:
131-
make += f'extend type {_type.name} {{ _lastUpdateDate: Date }} '
131+
make += f'extend type {_type.name} {{ _lastUpdateDate: DateTime }} '
132132
return add_to_schema(schema, make)
133133

134134

0 commit comments

Comments
 (0)