"""Rules main entry point.""" import logging import signal import sys import time from typing import NoReturn from apscheduler.schedulers.background import BackgroundScheduler # Configure logging logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s" ) logger = logging.getLogger(__name__) # Global scheduler instance scheduler: BackgroundScheduler | None = None def rule_tick() -> None: """Example job that runs every minute. This is a placeholder for actual rule evaluation logic. """ logger.info("Rule tick") def shutdown_handler(signum: int, frame: object) -> NoReturn: """Handle shutdown signals gracefully. Args: signum: Signal number frame: Current stack frame """ logger.info(f"Received signal {signum}, shutting down...") if scheduler: scheduler.shutdown(wait=True) logger.info("Scheduler stopped") sys.exit(0) def main() -> None: """Run the rules application.""" global scheduler logger.info("Rules engine starting...") # Register signal handlers signal.signal(signal.SIGINT, shutdown_handler) signal.signal(signal.SIGTERM, shutdown_handler) # Initialize scheduler scheduler = BackgroundScheduler() # Add example job - runs every minute scheduler.add_job( rule_tick, 'interval', minutes=1, id='rule_tick', name='Rule Tick Job' ) # Start scheduler scheduler.start() logger.info("Scheduler started with rule_tick job (every 1 minute)") # Run initial tick immediately rule_tick() # Keep the application running try: while True: time.sleep(1) except KeyboardInterrupt: logger.info("KeyboardInterrupt received, shutting down...") scheduler.shutdown(wait=True) logger.info("Scheduler stopped") if __name__ == "__main__": main()