1919
2020import argparse
2121import sys
22+ import warnings
2223
23- from . import generator , models
24+ import gel
25+
26+ from gel .codegen import generator , models
27+ from gel .compatibility .introspection import get_schema_json , GelORMWarning
28+ from gel .compatibility .clihelper import _get_conn_args
29+ from gel .orm .sqla import ModelGenerator as SQLAModGen
30+ from gel .orm .sqlmodel import ModelGenerator as SQLModGen
31+ from gel .orm .django .generator import ModelGenerator as DjangoModGen
2432
2533
2634class ColoredArgumentParser (argparse .ArgumentParser ):
@@ -34,7 +42,15 @@ def error(self, message):
3442
3543
3644parser = ColoredArgumentParser (
37- description = "Generate Python code for .edgeql files."
45+ description = "Generate Python code for various Gel interfaces."
46+ )
47+ parser .add_argument (
48+ "mode" ,
49+ choices = ['edgeql' , 'pydantic' , 'sqlalchemy' , 'sqlmodel' , 'django' ],
50+ help = "Pick which mode to generate code for: "
51+ "`edgeql` makes Python code for .edgeql files; "
52+ "`pydantic` makes Pydantic models based on the database schema; "
53+ "`sqlalchemy`, `sqlmodel`, `django` makes Python ORM code for a database" ,
3854)
3955parser .add_argument ("--dsn" )
4056parser .add_argument ("--credentials-file" , metavar = "PATH" )
@@ -69,11 +85,13 @@ def error(self, message):
6985 help = "Choose one or more targets to generate code (default is async)."
7086)
7187parser .add_argument (
72- "--models" ,
73- action = "store_true" ,
74- default = False ,
75- help = "Using the schema generate Pydantic models that can be used for "
76- "bulk inserts." ,
88+ "--out" ,
89+ help = "The output directory for the generated files." ,
90+ )
91+ parser .add_argument (
92+ "--mod" ,
93+ help = "The fullname of the Python module corresponding to the output "
94+ "directory." ,
7795)
7896if sys .version_info [:2 ] >= (3 , 9 ):
7997 parser .add_argument (
@@ -101,10 +119,68 @@ def error(self, message):
101119
102120def main ():
103121 args = parser .parse_args ()
104- if args .models :
105- models .Generator (args ).run ()
106- return
107122
108- if not hasattr (args , "skip_pydantic_validation" ):
109- args .skip_pydantic_validation = True
110- generator .Generator (args ).run ()
123+ match args .mode :
124+ case 'edgeql' :
125+ if not hasattr (args , "skip_pydantic_validation" ):
126+ args .skip_pydantic_validation = True
127+ generator .Generator (args ).run ()
128+
129+ case 'pydantic' :
130+ if args .mod is None :
131+ parser .error ('pydantic requires to specify --mod' )
132+ if args .out is None :
133+ parser .error ('pydantic requires to specify --out' )
134+
135+ models .Generator (args ).run ()
136+
137+ case 'sqlalchemy' :
138+ if args .mod is None :
139+ parser .error ('sqlalchemy requires to specify --mod' )
140+ if args .out is None :
141+ parser .error ('sqlalchemy requires to specify --out' )
142+
143+ with warnings .catch_warnings (record = True ) as wlist :
144+ warnings .simplefilter ("always" , GelORMWarning )
145+ spec = get_schema_json (
146+ gel .create_client (** generator ._get_conn_args (args )))
147+ gen = SQLAModGen (
148+ outdir = args .out ,
149+ basemodule = args .mod ,
150+ )
151+ gen .render_models (spec )
152+
153+ for w in wlist :
154+ print (w .message )
155+
156+ case 'sqlmodel' :
157+ if args .mod is None :
158+ parser .error ('sqlmodel requires to specify --mod' )
159+ if args .out is None :
160+ parser .error ('sqlmodel requires to specify --out' )
161+
162+ with warnings .catch_warnings (record = True ) as wlist :
163+ warnings .simplefilter ("always" , GelORMWarning )
164+ spec = get_schema_json (
165+ gel .create_client (** _get_conn_args (args )))
166+ gen = SQLModGen (
167+ outdir = args .out ,
168+ basemodule = args .mod ,
169+ )
170+ gen .render_models (spec )
171+
172+ for w in wlist :
173+ print (w .message )
174+
175+ case 'django' :
176+ with warnings .catch_warnings (record = True ) as wlist :
177+ warnings .simplefilter ("always" , GelORMWarning )
178+ spec = get_schema_json (
179+ gel .create_client (** _get_conn_args (args )))
180+ gen = DjangoModGen (
181+ out = args .out ,
182+ )
183+ gen .render_models (spec )
184+
185+ for w in wlist :
186+ print (w .message )
0 commit comments