Coverage for postrfp / shared / init / sysconfig.py: 80%
46 statements
« prev ^ index » next coverage.py v7.12.0, created at 2025-12-03 01:35 +0000
« prev ^ index » next coverage.py v7.12.0, created at 2025-12-03 01:35 +0000
1import os
2import time
3import logging
4import logging.config
6from postrfp import conf
7from postrfp.conf.settings import AppSettings
8from postrfp.shared.constants import RunMode
11config_log = logging.getLogger(__name__)
14def configure_postrfp(env_file=None) -> "AppSettings":
15 from postrfp.jobs.executor import init_jobs_executor
16 from postrfp.jobs.events.listeners import init_event_listeners
17 from postrfp.model.audit import visible
19 if env_file:
20 # This is valid for Pydantic 2. MyPy error is presumably a bug
21 conf.CONF = AppSettings(_env_file=env_file) # type: ignore
22 else:
23 conf.CONF = AppSettings()
25 os.environ["TZ"] = "UTC"
26 time.tzset()
28 init_jobs_executor()
30 # Deploy process_event DAG if using Dagu executor
31 if conf.CONF.task_executor == "dagu":
32 deploy_process_event_dag_safely()
34 configure_logging()
35 init_event_listeners()
36 log_setup_details(env_file)
37 visible.check_all_events_assigned()
38 return conf.CONF
41def deploy_process_event_dag_safely() -> None:
42 """
43 Deploy the process_event DAG to Dagu, with error handling.
45 Failures are logged but don't prevent startup, since the DAG
46 might already exist or Dagu might not be available yet.
47 """
48 try:
49 from postrfp.jobs.dagu import deploy_process_event_dag
51 deploy_process_event_dag()
52 except Exception as e:
53 config_log.warning(
54 "Could not deploy process_event DAG (Dagu may not be ready): %s", e
55 )
58def log_setup_details(env_file):
59 config_log.info("\n postrfp configured: ")
60 if env_file is None:
61 config_log.info("-- No environment file provided, using default config")
62 else:
63 config_log.info("-- using settings env file: %s", env_file)
64 config_log.info("-- run_mode: %s", conf.CONF.run_mode)
65 config_log.info("-- db_url: %s", conf.CONF.conn_string())
66 config_log.info("-- task_executor: %s", conf.CONF.task_executor)
67 config_log.info("-- app_base_url: %s", conf.CONF.app_base_url)
68 if conf.CONF.task_executor == "dagu":
69 config_log.info("-- dagu_base_url: %s", conf.CONF.dagu_base_url)
70 config_log.info("-- mailer: %s" % conf.CONF.mailer)
71 config_log.info("-- email_to_override: %s" % conf.CONF.email_to_override)
72 if conf.CONF.postmark_api_key:
73 config_log.info("-- postmark-api-key set")
76def configure_logging(log_config_dict=None) -> None: # pragma: no cover
77 if log_config_dict is not None:
78 logging.config.dictConfig(log_config_dict)
79 return
80 from ...conf import logconf
82 # fmt: off
83 match conf.CONF.run_mode:
85 case RunMode.production:
86 email = "errors@supplierselect.com"
87 logconf.PRODUCTION["handlers"]["email"]["fromaddr"] = email
88 subject = "POSTRFP Error on %s" % conf.CONF.webapp_hostname
89 logconf.PRODUCTION["handlers"]["email"]["subject"] = subject
90 logging.config.dictConfig(logconf.PRODUCTION)
92 case RunMode.development:
93 logging.config.dictConfig(logconf.DEVELOPMENT)
95 case RunMode.test:
96 logging.config.dictConfig(logconf.TEST)
98 case _:
99 raise ValueError("Cannot configure logging without valid RunMode")