Source code for optimus.interfaces.watch

# -*- coding: utf-8 -*-
from watchdog.observers import Observer

from optimus.watchers.templates import TemplatesWatchEventHandler
from optimus.watchers.assets import AssetsWatchEventHandler


[docs]def watcher_interface(settings, views, build_env): """ Initialize observer for views and possible assets according to settings and build environment. Commonly before using this function you will use ``builder_interface`` first since it will perform a first (required) build and init the builder environment as expected in ``build_env`` argument. Once this interface returns the observer object, you may use it like so: :: observer.start() try: while True: time.sleep(1) except KeyboardInterrupt: observer.stop() observer.join() Arguments: settings (optimus.conf.model.SettingsModel): Settings object which defines everything required for building. views (object): Module which defines page views to build, in fact the module object require only a ``PAGES`` attribute that is a list of Page view. build_env (dict): A dictionnary with initialized builder (``builder`` item), asset manager (``assets_env`` item) and the list of builded pages (``builded`` item). Returns: watchdog.observers.Observer: The initialized and configured observer for setted watchers. """ # Perform a first scanning of page templates build_env["builder"].scan_bulk(views.PAGES) # Init templates events watchers templates_event_handler = TemplatesWatchEventHandler( settings, build_env["builder"], **settings.WATCHER_TEMPLATES_PATTERNS ) # Init assets events watchers if build_env["assets_env"] is not None: assets_event_handler = AssetsWatchEventHandler( settings, build_env["assets_env"], build_env["builder"], **settings.WATCHER_ASSETS_PATTERNS, ) # Initialize observer to use observer = Observer() # Register views events watcher observer.schedule( templates_event_handler, settings.TEMPLATES_DIR, recursive=True, ) # Register assets events watcher # NOTE: This observe a single handler for every assets for simplicity. However the # drawback is it watch on the whole sources directory, but it has been # configured to care only about assets (css and js files) so it may not be # a performance leak except on very huge source directory. The only issue is # that it may trigger some event for css or js files which are in templates. if build_env["assets_env"] is not None: observer.schedule( assets_event_handler, settings.SOURCES_DIR, recursive=True, ) return observer