Mercurial > piecrust2
diff piecrust/rendering.py @ 854:08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
- Make a few APIs simpler.
- Content pipelines create their own jobs, so that generator sources can
keep aborting in `getContents`, but rely on their pipeline to generate
pages for baking.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sun, 04 Jun 2017 23:34:28 -0700 |
parents | f070a4fc033c |
children | 58e28ba02fb7 |
line wrap: on
line diff
--- a/piecrust/rendering.py Sun May 21 00:06:59 2017 -0700 +++ b/piecrust/rendering.py Sun Jun 04 23:34:28 2017 -0700 @@ -5,7 +5,6 @@ from piecrust.data.builder import ( DataBuildingContext, build_page_data, add_layout_data) from piecrust.fastpickle import _pickle_object, _unpickle_object -from piecrust.sources.base import ContentSource from piecrust.templating.base import TemplateNotFoundError, TemplatingError @@ -115,9 +114,8 @@ def addUsedSource(self, source): self._raiseIfNoCurrentPass() - if isinstance(source, ContentSource): - pass_info = self.current_pass_info - pass_info.used_source_names.add(source.name) + pass_info = self.current_pass_info + pass_info.used_source_names.add(source.name) def _raiseIfNoCurrentPass(self): if self._current_pass == PASS_NONE: @@ -159,6 +157,7 @@ def render_page(ctx): env = ctx.app.env + stats = env.stats stack = env.render_ctx_stack stack.pushCtx(ctx) @@ -168,7 +167,7 @@ try: # Build the data for both segment and layout rendering. - with env.timerScope("BuildRenderData"): + with stats.timerScope("BuildRenderData"): page_data = _build_render_data(ctx) # Render content segments. @@ -177,7 +176,7 @@ save_to_fs = True if env.fs_cache_only_for_main_page and not stack.is_main_ctx: save_to_fs = False - with env.timerScope("PageRenderSegments"): + with stats.timerScope("PageRenderSegments"): if repo is not None and not ctx.force_render: render_result = repo.get( page_uri, @@ -197,10 +196,10 @@ 'default_layout', 'default') null_names = ['', 'none', 'nil'] if layout_name not in null_names: - with ctx.app.env.timerScope("BuildRenderData"): + with stats.timerScope("BuildRenderData"): add_layout_data(page_data, render_result['segments']) - with ctx.app.env.timerScope("PageRenderLayout"): + with stats.timerScope("PageRenderLayout"): layout_result = _do_render_layout( layout_name, page, page_data) else: @@ -222,8 +221,8 @@ if ctx.app.debug: raise logger.exception(ex) - page_rel_path = os.path.relpath(ctx.page.path, ctx.app.root_dir) - raise Exception("Error rendering page: %s" % page_rel_path) from ex + raise Exception("Error rendering page: %s" % + ctx.page.content_spec) from ex finally: ctx.setCurrentPass(PASS_NONE) @@ -232,6 +231,7 @@ def render_page_segments(ctx): env = ctx.app.env + stats = env.stats stack = env.render_ctx_stack stack.pushCtx(ctx) @@ -241,11 +241,13 @@ try: ctx.setCurrentPass(PASS_FORMATTING) - repo = ctx.app.env.rendered_segments_repository + repo = env.rendered_segments_repository + save_to_fs = True - if ctx.app.env.fs_cache_only_for_main_page and not stack.is_main_ctx: + if env.fs_cache_only_for_main_page and not stack.is_main_ctx: save_to_fs = False - with ctx.app.env.timerScope("PageRenderSegments"): + + with stats.timerScope("PageRenderSegments"): if repo is not None and not ctx.force_render: render_result = repo.get( page_uri, @@ -267,7 +269,7 @@ def _build_render_data(ctx): - with ctx.app.env.timerScope("PageDataBuild"): + with ctx.app.env.stats.timerScope("PageDataBuild"): data_ctx = DataBuildingContext(ctx.page, ctx.sub_num) data_ctx.pagination_source = ctx.pagination_source data_ctx.pagination_filter = ctx.pagination_filter @@ -297,10 +299,10 @@ for seg_part in seg.parts: part_format = seg_part.fmt or format_name try: - with app.env.timerScope( + with app.env.stats.timerScope( engine.__class__.__name__ + '_segment'): part_text = engine.renderSegmentPart( - page.path, seg_part, page_data) + page.content_spec, seg_part, page_data) except TemplatingError as err: err.lineno += seg_part.line raise err @@ -324,17 +326,15 @@ def _do_render_layout(layout_name, page, layout_data): - cpi = page.app.env.exec_info_stack.current_page_info - assert cpi is not None - assert cpi.page == page + cur_ctx = page.app.env.render_ctx_stack.current_ctx + assert cur_ctx is not None + assert cur_ctx.page == page names = layout_name.split(',') - default_exts = page.app.env.default_layout_extensions full_names = [] for name in names: if '.' not in name: - for ext in default_exts: - full_names.append(name + ext) + full_names.append(name + '.html') else: full_names.append(name) @@ -343,7 +343,8 @@ engine = get_template_engine(page.app, engine_name) try: - with page.app.env.timerScope(engine.__class__.__name__ + '_layout'): + with page.app.env.stats.timerScope( + engine.__class__.__name__ + '_layout'): output = engine.renderFile(full_names, layout_data) except TemplateNotFoundError as ex: logger.exception(ex) @@ -351,7 +352,7 @@ msg += "Looked for: %s" % ', '.join(full_names) raise Exception(msg) from ex - pass_info = cpi.render_ctx.render_passes[PASS_RENDERING] + pass_info = cur_ctx.render_passes[PASS_RENDERING] res = {'content': output, 'pass_info': _pickle_object(pass_info)} return res @@ -376,7 +377,7 @@ if not fmt.enabled: continue if fmt.FORMAT_NAMES is None or format_name in fmt.FORMAT_NAMES: - with app.env.timerScope(fmt.__class__.__name__): + with app.env.stats.timerScope(fmt.__class__.__name__): txt = fmt.render(format_name, txt) format_count += 1 if fmt.OUTPUT_FORMAT is not None: