Skip to content

Commit 351836f

Browse files
committed
refactor: single entry for settings checker. import extension check settings as dict.
1 parent 3f386ab commit 351836f

2 files changed

Lines changed: 31 additions & 8 deletions

File tree

activitysim/abm/models/settings_checker.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -610,7 +610,12 @@ def try_load_and_check_spec_coefs(
610610
return errors
611611

612612

613-
def check_model_settings(state: State, checker_settings=CHECKER_SETTINGS) -> None:
613+
def check_model_settings(
614+
state: State,
615+
checker_settings: dict = CHECKER_SETTINGS,
616+
extension_settings: dict = {},
617+
log_file: str ="settings_checker.log"
618+
) -> None:
614619

615620
# Collect all errors
616621
all_errors = []
@@ -619,14 +624,18 @@ def check_model_settings(state: State, checker_settings=CHECKER_SETTINGS) -> Non
619624
formatter = logging.Formatter(
620625
"%(asctime)s - %(levelname)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S"
621626
)
622-
out_log_file = state.get_log_file_path("settings_checker.log")
627+
out_log_file = state.get_log_file_path(log_file)
623628
if os.path.exists(out_log_file):
624629
os.remove(out_log_file)
625630
module_handler = logging.FileHandler(out_log_file)
626631
module_handler.setFormatter(formatter)
627632
file_logger.addHandler(module_handler)
628633
file_logger.propagate = False
629634

635+
# add extension settings to checker settings
636+
if extension_settings is not None:
637+
checker_settings.update(extension_settings)
638+
630639
# extract all model components
631640
all_models = state.settings.models
632641

@@ -718,8 +727,8 @@ def check_model_settings(state: State, checker_settings=CHECKER_SETTINGS) -> Non
718727
logger.error(f"\t{str(e)}")
719728
file_logger.error(f"\t{str(e)}")
720729
raise RuntimeError(
721-
"Encountered error in settings checker. See settings_checker.log for details."
730+
f"Encountered one or more errors in settings checker. See f{log_file} for details."
722731
)
723-
msg = "Setting Checker Complete. No runtime errors were raised. Check settings_checker.log for warnings. These may prevent model from successfully running."
732+
msg = f"Setting Checker Complete. No runtime errors were raised. Check f{log_file} for warnings. These *may* prevent model from successfully running."
724733
logger.info(msg)
725734
file_logger.info(msg)

activitysim/cli/run.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ def inject_arg(name, value):
174174
logger.exception(f"Error {err}")
175175
raise
176176
finally:
177-
del sys.path[0]
177+
del sys.path[0]
178178
inject_arg("imported_extensions", args.ext)
179179
else:
180180
inject_arg("imported_extensions", ())
@@ -285,7 +285,7 @@ def run(args):
285285
# Memory sidecar is only useful for single process runs
286286
# multiprocess runs log memory usage without blocking in the controlling process.
287287
mem_prof_log = state.get_log_file_path("memory_profile.csv")
288-
from ..core.memory_sidecar import MemorySidecar
288+
from activitysim.core.memory_sidecar import MemorySidecar
289289

290290
memory_sidecar_process = MemorySidecar(mem_prof_log)
291291
else:
@@ -372,9 +372,23 @@ def run(args):
372372

373373
t0 = tracing.print_elapsed_time()
374374

375-
logger.info("Checking Settings Files")
375+
376376
if state.settings.check_model_settings == True:
377-
check_model_settings(state)
377+
logger.info("Settings checker will check core settings files. See settings_checker.log for details.")
378+
# get any additional settings definitions from extensions
379+
extension_checker_settings = {}
380+
extension_names = state.get_injectable("imported_extensions")
381+
if extension_names:
382+
for ext in extension_names:
383+
try:
384+
settings_checker_ext = importlib.import_module(ext + ".settings_checker")
385+
extension_checker_settings.update(settings_checker_ext.EXTENSION_CHECKER_SETTINGS)
386+
# settings_checker_ext.check_extension_model_settings(state, log_file="settings_checker_extensions.log")
387+
except ImportError:
388+
logger.warning(
389+
f"Extension {ext} does not have a settings_checker module or it cannot be imported."
390+
)
391+
check_model_settings(state, extension_settings=extension_checker_settings)
378392

379393
try:
380394
if state.settings.multiprocess:

0 commit comments

Comments
 (0)