annotate piecrust/templating/jinja/loader.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 1bb704434ee2
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
851
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1 import os.path
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2 from jinja2 import FileSystemLoader
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
3
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
4
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
5 class PieCrustLoader(FileSystemLoader):
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6 def __init__(self, searchpath, encoding='utf-8'):
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7 super(PieCrustLoader, self).__init__(searchpath, encoding)
924
1bb704434ee2 formatting: Remove segment parts, you can use template tags instead.
Ludovic Chabant <ludovic@chabant.com>
parents: 851
diff changeset
8 self.segments_cache = {}
851
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10 def get_source(self, environment, template):
924
1bb704434ee2 formatting: Remove segment parts, you can use template tags instead.
Ludovic Chabant <ludovic@chabant.com>
parents: 851
diff changeset
11 if template.startswith('$seg='):
1bb704434ee2 formatting: Remove segment parts, you can use template tags instead.
Ludovic Chabant <ludovic@chabant.com>
parents: 851
diff changeset
12 filename, seg_content = self.segments_cache[template]
851
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14 mtime = os.path.getmtime(filename)
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
16 def uptodate():
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17 try:
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18 return os.path.getmtime(filename) == mtime
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
19 except OSError:
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20 return False
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21
924
1bb704434ee2 formatting: Remove segment parts, you can use template tags instead.
Ludovic Chabant <ludovic@chabant.com>
parents: 851
diff changeset
22 return seg_content, filename, uptodate
851
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23
2c7e57d80bba optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24 return super(PieCrustLoader, self).get_source(environment, template)