def main(argv=sys.argv): global logger arguments = docopt(__doc__) config = configure.configure(arguments) logger = logging.getLogger('roxy') try: if arguments['generate']: generate(arguments, config) if arguments['shell']: l = { 'session': model.get_session(), 'site': Site.get(slug=config['site']), 'Site': Site, 'Content': Content, 'Asset': Asset, 'Tag': Tag, 'Property': Property } code.interact(local=l) except Exception as e: import traceback import sys import pdb traceback.print_exc() pdb.post_mortem(sys.exc_info()[2])
def generate(arguments, config): session = model.get_session() # find site or create if doesn't exist site = Site.get(slug=config['site']) if not site: site = Site(slug=config['site'], name=config['name'], url=config['url']) session.add(site) # for all content encountered BeforeIngest.fire(site, config) content = ingest_content(site, config) assets = ingest_assets(site, config) AfterIngest.fire(site, config, content=content, assets=assets) session.add_all(content) session.add_all(assets) session.commit() # import module which generates site BeforeGenerate.fire(site, config) generator = importlib.import_module(config['generator']) AfterGenerate.fire(site, config, generator) # iterate over routes route_mappings = {} BeforeRoute.fire(site, config, route_mappings) # route_mappings.update({path: context for path, _, _, context in write_list if isinstance(context, Model)}) route_mappings.update({a.path: a for a in assets}) config['renderer'].filters['route'] = make_router(config, route_mappings) config['renderer'].filters['fetch'] = make_fetcher(config, route_mappings) config['renderer'].filters['render'] = make_renderer(config) AfterRoute.fire(site, config, route_mappings) # render the documents write_list = [] render_list = [] BeforeRender.fire(site, config, render_list) for path, template, fallback, context in render_list: values = {} if isinstance(context, Model): params = dict(site=site) params.update(values) keyname = context.__class__.__name__.lower() params[keyname] = context context = make_context(config, **params) else: values.update(context) context = make_context(config, site=site, **values) Render.fire(site, path, template, fallback, context) logger.info("rendering {} via {}".format(path, template)) s = render(config['renderer'], template, fallback, context) AfterRender.fire(site, values, path, template, fallback, content, s) write_list.append((path, s)) # process the write list BeforeWrite.fire(site, config, write_list) for path, s in write_list: if path.startswith('/'): path = path[1:] path = os.path.join(config['build_path'], path) logger.info("writing {}".format(path)) util.write(path, s) AfterWrite.fire(site, config, write_list)