"""Tornado application entry point and route configuration.""" import os import click import tornado.ioloop import tornado.web from db import get_engine, get_session_factory, init_db from handlers.main import MainHandler from handlers.game import GameHandler from handlers.howtoplay import HowToPlayHandler from handlers.about import AboutHandler from handlers.api import ( CategoriesHandler, NewGameHandler, GameStateHandler, GuessHandler, ) BASE_DIR = os.path.dirname(os.path.abspath(__file__)) def make_app(session_factory=None): """Create and configure the Tornado application. Args: session_factory: SQLAlchemy session factory. If None, API endpoints that require a database will not work. Returns: A configured ``tornado.web.Application`` instance. """ return tornado.web.Application( [ (r"/", MainHandler), (r"/game", GameHandler), (r"/howtoplay", HowToPlayHandler), (r"/about", AboutHandler), (r"/api/categories", CategoriesHandler), (r"/api/game/new", NewGameHandler), (r"/api/game/([^/]+)", GameStateHandler), (r"/api/game/([^/]+)/guess", GuessHandler), ], template_path=os.path.join(BASE_DIR, "templates"), static_path=os.path.join(BASE_DIR, "static"), session_factory=session_factory, debug=True, ) @click.command() @click.option("--port", default=8888, type=int, help="Port to listen on.") def main(port): """Start the web server.""" engine = get_engine() init_db(engine) session_factory = get_session_factory(engine) app = make_app(session_factory=session_factory) app.listen(port) print(f"Server started at http://localhost:{port}") tornado.ioloop.IOLoop.current().start() if __name__ == "__main__": main()