1313from jsonschema .exceptions import ValidationError
1414from jsonschema .validators import validate
1515from sqlalchemy import MetaData , Table
16+ from sqlalchemy .exc import InternalError , OperationalError
1617from typer import Argument , Exit , Option , Typer
1718
1819from datafaker .create import create_db_data , create_db_tables , create_db_vocab
3435 make_vocabulary_tables ,
3536)
3637from datafaker .remove import remove_db_data , remove_db_tables , remove_db_vocab
37- from datafaker .settings import Settings , get_settings
38+ from datafaker .settings import (
39+ Settings ,
40+ SettingsError ,
41+ get_destination_dsn ,
42+ get_destination_schema ,
43+ get_source_dsn ,
44+ get_source_schema ,
45+ )
3846from datafaker .utils import (
3947 CONFIG_SCHEMA_PATH ,
4048 conf_logger ,
5967app = Typer (no_args_is_help = True )
6068
6169
70+ def datafaker () -> None :
71+ """Run the app and catch internal exceptions."""
72+ try :
73+ app ()
74+ except OperationalError as exc :
75+ logger .error (str (exc ))
76+ # Outside of app() typer.Exit(1) doesn't work
77+ sys .exit (1 )
78+ except SettingsError as exc :
79+ logger .error (str (exc ))
80+ sys .exit (1 )
81+
82+
6283def _check_file_non_existence (file_path : Path ) -> None :
6384 """Check that a given file does not exist. Exit with an error message if it does."""
6485 if file_path .exists ():
@@ -294,9 +315,6 @@ def make_vocab(
294315 Example:
295316 $ datafaker make-vocab --config-file config.yml
296317 """
297- settings = get_settings ()
298- _require_src_db_dsn (settings )
299-
300318 generator_config = read_config_file (config_file ) if config_file is not None else {}
301319 orm_metadata = load_metadata (orm_file , generator_config )
302320 make_vocabulary_tables (
@@ -331,11 +349,12 @@ def make_stats(
331349
332350 config = read_config_file (config_file ) if config_file is not None else {}
333351
334- settings = get_settings ()
335- src_dsn : str = _require_src_db_dsn (settings )
336-
337352 src_stats = asyncio .get_event_loop ().run_until_complete (
338- make_src_stats (src_dsn , config , settings .src_schema )
353+ make_src_stats (
354+ get_source_dsn (),
355+ config ,
356+ get_source_schema (),
357+ )
339358 )
340359 stats_file_path .write_text (yaml .dump (src_stats ), encoding = "utf-8" )
341360 logger .debug ("%s created." , stats_file )
@@ -369,10 +388,11 @@ def make_tables(
369388 if not force :
370389 _check_file_non_existence (orm_file_path )
371390
372- settings = get_settings ()
373- src_dsn : str = _require_src_db_dsn (settings )
374-
375- content = make_tables_file (src_dsn , settings .src_schema , parquet_dir )
391+ content = make_tables_file (
392+ get_source_dsn (),
393+ get_source_schema (),
394+ parquet_dir ,
395+ )
376396 orm_file_path .write_text (content , encoding = "utf-8" )
377397 logger .debug ("%s created." , orm_file )
378398
@@ -386,8 +406,6 @@ def configure_tables(
386406) -> None :
387407 """Interactively set tables to ignored, vocabulary or primary private."""
388408 logger .debug ("Configuring tables in %s." , config_file )
389- settings = get_settings ()
390- src_dsn : str = _require_src_db_dsn (settings )
391409 config_file_path = Path (config_file )
392410 config = {}
393411 if config_file_path .exists ():
@@ -397,7 +415,10 @@ def configure_tables(
397415 # we don't pass config here so that no tables are ignored
398416 metadata = load_metadata (orm_file )
399417 config_updated = update_config_tables (
400- src_dsn , settings .src_schema , metadata , config
418+ get_source_dsn (),
419+ get_source_schema (),
420+ metadata ,
421+ config ,
401422 )
402423 if config_updated is None :
403424 logger .debug ("Cancelled" )
@@ -416,8 +437,6 @@ def configure_missing(
416437) -> None :
417438 """Interactively set the missingness of the generated data."""
418439 logger .debug ("Configuring missingness in %s." , config_file )
419- settings = get_settings ()
420- src_dsn : str = _require_src_db_dsn (settings )
421440 config_file_path = Path (config_file )
422441 config : dict [str , Any ] = {}
423442 if config_file_path .exists ():
@@ -427,7 +446,12 @@ def configure_missing(
427446 if isinstance (config_any , dict ):
428447 config = config_any
429448 metadata = load_metadata (orm_file , config )
430- config_updated = update_missingness (src_dsn , settings .src_schema , metadata , config )
449+ config_updated = update_missingness (
450+ get_source_dsn (),
451+ get_source_schema (),
452+ metadata ,
453+ config ,
454+ )
431455 if config_updated is None :
432456 logger .debug ("Cancelled" )
433457 return
@@ -452,8 +476,6 @@ def configure_generators(
452476) -> None :
453477 """Interactively set generators for column data."""
454478 logger .debug ("Configuring generators in %s." , config_file )
455- settings = get_settings ()
456- src_dsn : str = _require_src_db_dsn (settings )
457479 config_file_path = Path (config_file )
458480 config = {}
459481 if config_file_path .exists ():
@@ -462,7 +484,11 @@ def configure_generators(
462484 )
463485 metadata = load_metadata (orm_file )
464486 config_updated = update_config_generators (
465- src_dsn , settings .src_schema , metadata , config , spec_path = spec
487+ get_source_dsn (),
488+ get_source_schema (),
489+ metadata ,
490+ config ,
491+ spec_path = spec ,
466492 )
467493 if config_updated is None :
468494 logger .debug ("Cancelled" )
@@ -576,10 +602,8 @@ def dump_data(
576602 " specified, or specify an existing directory"
577603 )
578604 sys .exit (1 )
579- settings = get_settings ()
580- dst_dsn : str = settings .dst_dsn or ""
581- assert dst_dsn != "" , "Missing DST_DSN setting."
582- schema_name = settings .dst_schema
605+ dst_dsn = get_destination_dsn ()
606+ schema_name = get_destination_schema ()
583607 config = read_config_file (config_file ) if config_file is not None else {}
584608 metadata = load_metadata_for_output (orm_file , config )
585609 mtables = convert_table_names_to_tables (table , metadata )
@@ -677,7 +701,12 @@ def remove_tables(
677701 else :
678702 config = read_config_file (config_file )
679703 metadata = load_metadata_for_output (orm_file , config )
680- remove_db_tables (metadata )
704+ try :
705+ remove_db_tables (metadata )
706+ except InternalError as exc :
707+ logger .error ("Failed to drop tables: %s" , exc )
708+ logger .error ("Please try again using the --all option." )
709+ sys .exit (1 )
681710 logger .debug ("Tables dropped." )
682711 else :
683712 logger .info ("Would remove tables if called with --yes." )
@@ -727,4 +756,4 @@ def version() -> None:
727756
728757
729758if __name__ == "__main__" :
730- app ()
759+ datafaker ()
0 commit comments