#!/usr/bin/env python2 import os import sys import SocketServer from time import sleep from jinja2 import Environment, FileSystemLoader from SimpleHTTPServer import SimpleHTTPRequestHandler from multiprocessing import Process from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler from constants import CONTENT_DIRECTORY, OUTPUT_DIRECTORY, TEMPLATE_DIRECTORY, SERVE_PORT, SERVE_BIND_ADDRESS class DirectoryObserver(FileSystemEventHandler): def __init__(self, verdandi): self._verdandi = verdandi def on_any_event(self, event): print "File changed: %s" % event.src_path self._verdandi.generate_output() class Verdandi(object): output_directory = OUTPUT_DIRECTORY modules = [] def __init__(self): self.jinja_env = Environment(loader=FileSystemLoader(TEMPLATE_DIRECTORY)) def send_message(self, message): results = [] for module in self.modules: results += module.process_message(message) return results def pass_messages(self): messages = self.send_message(None) while len(messages) > 0: message = messages.pop() messages = messages + self.send_message(message) def collect_assets(self): for module in self.modules: module.collect_assets(self.output_directory) def render(self): if not os.path.exists(self.output_directory): os.mkdir(self.output_directory) for module in self.modules: module.render(self.output_directory, self.jinja_env) def run(self): self.generate_output() if len(sys.argv) > 1 and sys.argv[1] == 'serve': self.serve() def generate_output(self): self.pass_messages() self.collect_assets() self.render() def serve(self): def serve(): os.chdir(self.output_directory) httpd = SocketServer.TCPServer((SERVE_BIND_ADDRESS, SERVE_PORT), SimpleHTTPRequestHandler) print "Serving under %s:%d" % (SERVE_BIND_ADDRESS, SERVE_PORT) httpd.serve_forever() event_handler = DirectoryObserver(self) observer = Observer() observer.schedule(event_handler, CONTENT_DIRECTORY, recursive=True) observer.schedule(event_handler, TEMPLATE_DIRECTORY, recursive=True) observer.start() server_process = Process(target=serve) server_process.start() try: server_process.join() except KeyboardInterrupt: pass observer.stop() observer.join() print "Be vigilant!"