from pathlib import Path from pyramid.config import Configurator from pyramid.path import AssetResolver from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler from flatfilecms.resources import Root, root_factory, roots class PagesEventHandler(FileSystemEventHandler): def __init__(self, root_path): super(PagesEventHandler, self).__init__() self.root_path = root_path self.abspath = AssetResolver().resolve(root_path).abspath() def find_dir(self, path): folder = roots.setdefault(self.root_path, Root(self.root_path)) path = path.relative_to(self.abspath) for name in path.parts[:-1]: folder = folder[name] return folder def on_created(self, event): super(PagesEventHandler, self).on_created(event) path = Path( event.dest_path if hasattr(event, 'dest_path') else event.src_path) folder = self.find_dir(path) if event.is_directory: folder.create_dir(path) else: folder.create_file(path) def on_deleted(self, event): super(PagesEventHandler, self).on_deleted(event) path = Path(event.src_path) folder = self.find_dir(path) name = path.stem if path.suffix not in ['.md', '.yaml', '.j2', '.jinja2'] \ and path.name != 'index.html': name = path.name del folder[name] def on_moved(self, event): super(PagesEventHandler, self).on_moved(event) self.on_deleted(event) self.on_created(event) def main(global_config, **settings): """ This function returns a Pyramid WSGI application. """ from pyramid.settings import asbool watchdog = asbool(settings.get('watchdog', 'false')) settings['watchdog'] = watchdog settings.setdefault('pages_path', 'pages') settings.setdefault('data_path', 'data') default_jinja2_filters = """markdown = flatfilecms.filters:markdown2html fileglob = flatfilecms.filters:fileglob merge_dict = flatfilecms.filters.merge_dict join_url = flatfilecms.filters.join_url""" settings['jinja2.filters'] = default_jinja2_filters + settings.get( 'jinja2.filters', '') config = Configurator(settings=settings, root_factory=root_factory) config.include('pyramid_jinja2') config.include('.routes') config.scan() if watchdog: observer = Observer() event_handler = PagesEventHandler(settings['pages_path']) observer.schedule(event_handler, event_handler.abspath, recursive=True) observer.start() return config.make_wsgi_app()