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 commit_session(*args, **kwargs): get_session().commit()
def setter(path, size=size): setattr(asset, size, path) session = get_session() session.add(asset)
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)
def _parse_metadata(document, config): # The keywords are case-insensitive and may consist of letters, numbers, # underscores and dashes and must end with a colon. The values consist of # anything following the colon on the line and may even be blank. # # If a line is indented by 4 or more spaces, that line is assumed to be an # additional line of the value for the previous keyword. A keyword may have # as many lines as desired. session = model.get_session() meta = {} current_key = None metadata, _ = _parse_content_header(document) for line in metadata.split('\n'): line = line.strip() # first blank line indicates end of metadata if len(line.strip()) == 0: break # two cases # 1) line has a colon in it, split key from value # 2) line doesn't, which indicates it continues previous k/v pair parts = line.split(':', 1) if len(parts) > 1: current_key = parts[0].strip().lower() # if value is empty string, assume beginning of a list value = parts[1].strip() if len(value) == 0: meta[current_key] = [] else: meta[current_key] = value if len(parts) == 1: if not isinstance(meta[current_key], list): meta[current_key] = [meta[current_key]] value = parts[0].strip() meta[current_key].append(value) for k, v in meta.items(): if k.endswith('_time') or k == 'time': v = dateutil.parse.parse(v) try: v = v.astimezone(tzinfo=config['timezone']) except ValueError: v = v.replace(tzinfo=config['timezone']) meta[k] = v elif k.endswith('_date') or k == 'date': v = datetime.strptime(v, '%Y-%m-%d').replace(tzinfo=config['timezone']) meta[k] = v elif k == 'tags': if not isinstance(v, list): v = map(lambda s: s.strip(), v.split(u',')) tags = [] for t in v: tag = Tag.get(slug=t) if not tag: tag = Tag(name=t) session.add(tag) tags.append(tag) meta[k] = tags if 'time' in meta: meta[u'publish_time'] = meta['time'] del meta['time'] elif 'date' in meta: meta[u'publish_time'] = meta['date'] del meta['date'] return meta