Пример #1
0
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])
Пример #2
0
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)