view piecrust/sources/generator.py @ 1188:a7c43131d871

bake: Fix file write flushing problem with Python 3.8+ Writing the cache files fails in Python 3.8 because it looks like flushing behaviour has changed. We need to explicitly flush. And even then, in very rare occurrences, it looks like it can still run into racing conditions, so we do a very hacky and ugly "retry" loop when fetching cached data :(
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 15 Jun 2021 22:36:23 -0700
parents d1095774bfcf
children
line wrap: on
line source

import io
import time
from werkzeug.utils import cached_property
from piecrust.configuration import ConfigurationError
from piecrust.sources.base import ContentSource, GeneratedContentException


class GeneratorSourceBase(ContentSource):
    def __init__(self, app, name, config):
        super().__init__(app, name, config)

        source_name = config.get('source')
        if source_name is None:
            raise ConfigurationError(
                "Taxonomy source '%s' requires an inner source." % name)
        self._inner_source_name = source_name

        self._raw_item = ''
        self._raw_item_time = time.time()

    @cached_property
    def inner_source(self):
        return self.app.getSource(self._inner_source_name)

    def getContents(self, group):
        # Our content is procedurally generated from other content sources,
        # so we really don't support listing anything here -- it would be
        # typically quite costly.
        raise GeneratedContentException()

    def openItem(self, item, mode='r', **kwargs):
        return io.StringIO(self._raw_item)

    def getItemMtime(self, item):
        return self._raw_item_time