annotate piecrust/data/debug.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 05fba0b8e21c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1 import re
14
395eb38f2dfb Properly escape HTML characters in the debug info, add more options.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
2 import io
395eb38f2dfb Properly escape HTML characters in the debug info, add more options.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
3 import html
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
4 import logging
14
395eb38f2dfb Properly escape HTML characters in the debug info, add more options.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
5 import collections
440
32c7c2d219d2 performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents: 407
diff changeset
6 import collections.abc
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7 from piecrust import APP_VERSION, PIECRUST_URL
96
0445a2232de7 Improvements and fixes to incremental baking.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
8 from piecrust.page import FLAG_RAW_CACHE_VALID
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11 logger = logging.getLogger(__name__)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14 css_id_re = re.compile(r'[^\w\d\-]+')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
16
556
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
17 CSS_DATA = 'piecrust-debug-info-data'
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
18 CSS_DATABLOCK = 'piecrust-debug-info-datablock'
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
19 CSS_VALUE = 'piecrust-debug-info-datavalue'
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
20 CSS_DOC = 'piecrust-debug-info-doc'
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
21 CSS_BIGHEADER = 'piecrust-debug-info-header1'
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
22 CSS_HEADER = 'piecrust-debug-info-header2'
219
d7a548ebcd58 serve: Add server sent events for showing pipeline errors in the debug window.
Ludovic Chabant <ludovic@chabant.com>
parents: 96
diff changeset
23
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25 # 'Baked with PieCrust' text
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26 BRANDING_TEXT = 'Baked with <em><a href="%s">PieCrust</a> %s</em>.' % (
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
27 PIECRUST_URL, APP_VERSION)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
28
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
29
556
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
30 def build_debug_info(page):
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
31 """ Generates HTML debug info for the given page's data.
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
32 """
5
474c9882decf Upgrade to Python 3.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
33 output = io.StringIO()
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
34 try:
556
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
35 _do_build_debug_info(page, output)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
36 return output.getvalue()
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
37 finally:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
38 output.close()
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
39
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
40
556
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
41 def _do_build_debug_info(page, output):
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
42 app = page.app
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
43
556
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
44 print('<div id="piecrust-debug-window" class="piecrust-debug-window">',
219
d7a548ebcd58 serve: Add server sent events for showing pipeline errors in the debug window.
Ludovic Chabant <ludovic@chabant.com>
parents: 96
diff changeset
45 file=output)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
46
556
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
47 print('<div><strong>PieCrust %s</strong> &mdash; ' % APP_VERSION,
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
48 file=output)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
49
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
50 # If we have some execution info in the environment,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
51 # add more information.
96
0445a2232de7 Improvements and fixes to incremental baking.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
52 if page.flags & FLAG_RAW_CACHE_VALID:
0445a2232de7 Improvements and fixes to incremental baking.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
53 output.write('baked this morning')
0445a2232de7 Improvements and fixes to incremental baking.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
54 else:
0445a2232de7 Improvements and fixes to incremental baking.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
55 output.write('baked just now')
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
56
96
0445a2232de7 Improvements and fixes to incremental baking.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
57 if app.cache.enabled:
0445a2232de7 Improvements and fixes to incremental baking.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
58 if app.env.was_cache_cleaned:
0445a2232de7 Improvements and fixes to incremental baking.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
59 output.write(', from a brand new cache')
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
60 else:
96
0445a2232de7 Improvements and fixes to incremental baking.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
61 output.write(', from a valid cache')
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
62 else:
96
0445a2232de7 Improvements and fixes to incremental baking.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
63 output.write(', with no cache')
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
64
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
65 output.write(', ')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
66 if app.env.start_time != 0:
556
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
67 output.write('in __PIECRUST_TIMING_INFORMATION__. ')
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
68 else:
556
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
69 output.write('no timing information available. ')
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
70
556
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
71 print('<a class="piecrust-debug-expander" hred="#">[+]</a>',
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
72 file=output)
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
73
5
474c9882decf Upgrade to Python 3.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
74 print('</div>', file=output)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
75
556
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
76 print('<div class="piecrust-debug-info piecrust-debug-info-unloaded">',
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
77 file=output)
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
78 print('</div>', file=output)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
79
5
474c9882decf Upgrade to Python 3.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
80 print('</div>', file=output)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
81
1110
05fba0b8e21c data: Use the root URL for the debugger assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 914
diff changeset
82 root_url = page.app.config.get('site/root')
05fba0b8e21c data: Use the root URL for the debugger assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 914
diff changeset
83 print(
05fba0b8e21c data: Use the root URL for the debugger assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 914
diff changeset
84 '<script src="%s__piecrust_static/piecrust-debug-info.js"></script>' %
05fba0b8e21c data: Use the root URL for the debugger assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 914
diff changeset
85 root_url,
05fba0b8e21c data: Use the root URL for the debugger assets.
Ludovic Chabant <ludovic@chabant.com>
parents: 914
diff changeset
86 file=output)
556
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
87
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
88
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
89 def build_var_debug_info(data, var_path=None):
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
90 output = io.StringIO()
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
91 try:
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
92 _do_build_var_debug_info(data, output, var_path)
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
93 return output.getvalue()
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
94 finally:
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
95 output.close()
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
96
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
97
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
98 def _do_build_var_debug_info(data, output, var_path=None):
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
99 if False:
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
100 print('<html>', file=output)
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
101 print('<head>', file=output)
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
102 print('<meta charset="utf-8" />', file=output)
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
103 print('<link rel="stylesheet" type="text/css" '
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
104 'href="/__piecrust_static/piecrust-debug-info.css" />',
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
105 file=output)
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
106 print('</head>', file=output)
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
107 print('<body class="piecrust-debug-page">', file=output)
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
108
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
109 #print('<div class="piecrust-debug-info">', file=output)
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
110 #print(('<p style="cursor: pointer;" onclick="var l = '
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
111 # 'document.getElementById(\'piecrust-debug-details\'); '
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
112 # 'if (l.style.display == \'none\') l.style.display = '
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
113 # '\'block\'; else l.style.display = \'none\';">'),
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
114 # file=output)
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
115 #print(('<span class="%s">Template engine data</span> '
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
116 # '&mdash; click to toggle</a>.</p>' % CSS_BIGHEADER), file=output)
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
117
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
118 #print('<div id="piecrust-debug-details" style="display: none;">',
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
119 # file=output)
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
120 #print(('<p class="%s">The following key/value pairs are '
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
121 # 'available in the layout\'s markup, and most are '
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
122 # 'available in the page\'s markup.</p>' % CSS_DOC), file=output)
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
123
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
124 filtered_data = dict(data)
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
125 for k in list(filtered_data.keys()):
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
126 if k.startswith('__'):
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
127 del filtered_data[k]
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
128
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
129 renderer = DebugDataRenderer(output)
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
130 renderer.external_docs['data-site'] = (
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
131 "This section comes from the site configuration file.")
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
132 renderer.external_docs['data-page'] = (
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
133 "This section comes from the page's configuration header.")
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
134 renderer.renderData(filtered_data)
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
135
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
136 print('</div>', file=output)
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
137 #print('</div>', file=output)
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
138
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
139 if False:
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
140 print('</body>', file=output)
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
141 print('</html>', file=output)
219
d7a548ebcd58 serve: Add server sent events for showing pipeline errors in the debug window.
Ludovic Chabant <ludovic@chabant.com>
parents: 96
diff changeset
142
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
143
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
144 class DebugDataRenderer(object):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
145 MAX_VALUE_LENGTH = 150
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
146
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
147 def __init__(self, output):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
148 self.indent = 0
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
149 self.output = output
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
150 self.external_docs = {}
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
151
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
152 def renderData(self, data):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
153 if not isinstance(data, dict):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
154 raise Exception("Expected top level data to be a dict.")
556
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
155 self._writeLine('<div class="%s">' % CSS_DATA)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
156 self._renderDict(data, 'data')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
157 self._writeLine('</div>')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
158
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
159 def _renderValue(self, data, path):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
160 if data is None:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
161 self._write('&lt;null&gt;')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
162 return
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
163
440
32c7c2d219d2 performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents: 407
diff changeset
164 if isinstance(data, (dict, collections.abc.Mapping)):
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
165 self._renderCollapsableValueStart(path)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
166 with IndentScope(self):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
167 self._renderDict(data, path)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
168 self._renderCollapsableValueEnd()
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
169 return
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
170
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
171 if isinstance(data, list):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
172 self._renderCollapsableValueStart(path)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
173 with IndentScope(self):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
174 self._renderList(data, path)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
175 self._renderCollapsableValueEnd()
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
176 return
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
177
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
178 data_type = type(data)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
179 if data_type is bool:
556
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
180 self._write('<span class="%s">%s</span>' % (CSS_VALUE,
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
181 'true' if bool(data) else 'false'))
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
182 return
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
183
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
184 if data_type is int:
556
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
185 self._write('<span class="%s">%d</span>' % (CSS_VALUE, data))
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
186 return
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
187
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
188 if data_type is float:
556
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
189 self._write('<span class="%s">%4.2f</span>' % (CSS_VALUE, data))
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
190 return
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
191
7
343d08ef5668 More PieCrust 3 fixes, and a couple of miscellaneous bug fixes.
Ludovic Chabant <ludovic@chabant.com>
parents: 5
diff changeset
192 if data_type is str:
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
193 if len(data) > DebugDataRenderer.MAX_VALUE_LENGTH:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
194 data = data[:DebugDataRenderer.MAX_VALUE_LENGTH - 5]
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
195 data += '[...]'
14
395eb38f2dfb Properly escape HTML characters in the debug info, add more options.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
196 data = html.escape(data)
556
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
197 self._write('<span class="%s">%s</span>' % (CSS_VALUE, data))
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
198 return
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
199
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
200 self._renderCollapsableValueStart(path)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
201 with IndentScope(self):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
202 self._renderObject(data, path)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
203 self._renderCollapsableValueEnd()
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
204
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
205 def _renderList(self, data, path):
556
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
206 self._writeLine('<div class="%s">' % CSS_DATABLOCK)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
207 self._renderDoc(data, path)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
208 self._renderAttributes(data, path)
556
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
209 rendered_count = self._renderIterable(
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
210 data, path, lambda d: enumerate(d))
407
bd56d9acd6ef debug: Add support for more attributes for the debug info.
Ludovic Chabant <ludovic@chabant.com>
parents: 219
diff changeset
211 if (rendered_count == 0 and
bd56d9acd6ef debug: Add support for more attributes for the debug info.
Ludovic Chabant <ludovic@chabant.com>
parents: 219
diff changeset
212 not hasattr(data.__class__, 'debug_render_not_empty')):
556
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
213 self._writeLine('<p class="%s">(empty array)</p>' % (CSS_DOC))
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
214 self._writeLine('</div>')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
215
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
216 def _renderDict(self, data, path):
556
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
217 self._writeLine('<div class="%s">' % CSS_DATABLOCK)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
218 self._renderDoc(data, path)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
219 self._renderAttributes(data, path)
556
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
220 rendered_count = self._renderIterable(
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
221 data, path,
5
474c9882decf Upgrade to Python 3.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
222 lambda d: sorted(iter(d.items()), key=lambda i: i[0]))
407
bd56d9acd6ef debug: Add support for more attributes for the debug info.
Ludovic Chabant <ludovic@chabant.com>
parents: 219
diff changeset
223 if (rendered_count == 0 and
bd56d9acd6ef debug: Add support for more attributes for the debug info.
Ludovic Chabant <ludovic@chabant.com>
parents: 219
diff changeset
224 not hasattr(data.__class__, 'debug_render_not_empty')):
914
d91e013b586a serve: Fix crash when displaying empty dictionaries in the debug info.
Ludovic Chabant <ludovic@chabant.com>
parents: 591
diff changeset
225 self._writeLine('<p class="%s">(empty dictionary)</p>' %
556
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
226 CSS_DOC)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
227 self._writeLine('</div>')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
228
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
229 def _renderObject(self, data, path):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
230 if hasattr(data.__class__, 'debug_render_func'):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
231 # This object wants to be rendered as a simple string...
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
232 render_func_name = data.__class__.debug_render_func
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
233 render_func = getattr(data, render_func_name)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
234 value = render_func()
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
235 self._renderValue(value, path)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
236 return
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
237
556
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
238 self._writeLine('<div class="%s">' % CSS_DATABLOCK)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
239 self._renderDoc(data, path)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
240 rendered_attrs = self._renderAttributes(data, path)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
241
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
242 if (hasattr(data, '__iter__') and
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
243 hasattr(data.__class__, 'debug_render_items') and
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
244 data.__class__.debug_render_items):
556
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
245 rendered_count = self._renderIterable(
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
246 data, path, lambda d: enumerate(d))
407
bd56d9acd6ef debug: Add support for more attributes for the debug info.
Ludovic Chabant <ludovic@chabant.com>
parents: 219
diff changeset
247 if (rendered_count == 0 and
bd56d9acd6ef debug: Add support for more attributes for the debug info.
Ludovic Chabant <ludovic@chabant.com>
parents: 219
diff changeset
248 not hasattr(data.__class__, 'debug_render_not_empty')):
556
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
249 self._writeLine('<p class="%s">(empty)</p>' % CSS_DOC)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
250
407
bd56d9acd6ef debug: Add support for more attributes for the debug info.
Ludovic Chabant <ludovic@chabant.com>
parents: 219
diff changeset
251 elif (rendered_attrs == 0 and
bd56d9acd6ef debug: Add support for more attributes for the debug info.
Ludovic Chabant <ludovic@chabant.com>
parents: 219
diff changeset
252 not hasattr(data.__class__, 'debug_render_not_empty')):
556
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
253 self._writeLine('<p class="%s">(empty)</p>' % CSS_DOC)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
254
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
255 self._writeLine('</div>')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
256
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
257 def _renderIterable(self, data, path, iter_func):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
258 rendered_count = 0
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
259 with IndentScope(self):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
260 for i, item in iter_func(data):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
261 self._writeStart('<div>%s' % i)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
262 if item is not None:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
263 self._write(' : ')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
264 self._renderValue(item, self._makePath(path, i))
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
265 self._writeEnd('</div>')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
266 rendered_count += 1
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
267 return rendered_count
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
268
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
269 def _renderDoc(self, data, path):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
270 if hasattr(data.__class__, 'debug_render_doc'):
556
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
271 self._writeLine('<span class="%s">&ndash; %s</span>' %
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
272 (CSS_DOC, data.__class__.debug_render_doc))
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
273
407
bd56d9acd6ef debug: Add support for more attributes for the debug info.
Ludovic Chabant <ludovic@chabant.com>
parents: 219
diff changeset
274 if hasattr(data.__class__, 'debug_render_doc_dynamic'):
bd56d9acd6ef debug: Add support for more attributes for the debug info.
Ludovic Chabant <ludovic@chabant.com>
parents: 219
diff changeset
275 drdd = data.__class__.debug_render_doc_dynamic
bd56d9acd6ef debug: Add support for more attributes for the debug info.
Ludovic Chabant <ludovic@chabant.com>
parents: 219
diff changeset
276 for ng in drdd:
bd56d9acd6ef debug: Add support for more attributes for the debug info.
Ludovic Chabant <ludovic@chabant.com>
parents: 219
diff changeset
277 doc = getattr(data, ng)
556
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
278 self._writeLine('<span class="%s">&ndash; %s</span>' %
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
279 (CSS_DOC, doc()))
407
bd56d9acd6ef debug: Add support for more attributes for the debug info.
Ludovic Chabant <ludovic@chabant.com>
parents: 219
diff changeset
280
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
281 doc = self.external_docs.get(path)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
282 if doc is not None:
556
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
283 self._writeLine('<span class="%s">&ndash; %s</span>' %
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
284 (CSS_DOC, doc))
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
285
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
286 def _renderAttributes(self, data, path):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
287 if not hasattr(data.__class__, 'debug_render'):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
288 return 0
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
289
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
290 attr_names = list(data.__class__.debug_render)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
291 if hasattr(data.__class__, 'debug_render_dynamic'):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
292 drd = data.__class__.debug_render_dynamic
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
293 for ng in drd:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
294 name_gen = getattr(data, ng)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
295 attr_names += name_gen()
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
296
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
297 invoke_attrs = []
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
298 if hasattr(data.__class__, 'debug_render_invoke'):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
299 invoke_attrs = list(data.__class__.debug_render_invoke)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
300 if hasattr(data.__class__, 'debug_render_invoke_dynamic'):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
301 drid = data.__class__.debug_render_invoke_dynamic
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
302 for ng in drid:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
303 name_gen = getattr(data, ng)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
304 invoke_attrs += name_gen()
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
305
14
395eb38f2dfb Properly escape HTML characters in the debug info, add more options.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
306 redirects = {}
395eb38f2dfb Properly escape HTML characters in the debug info, add more options.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
307 if hasattr(data.__class__, 'debug_render_redirect'):
395eb38f2dfb Properly escape HTML characters in the debug info, add more options.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
308 redirects = data.__class__.debug_render_redirect
395eb38f2dfb Properly escape HTML characters in the debug info, add more options.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
309
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
310 rendered_count = 0
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
311 for name in attr_names:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
312 value = None
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
313 render_name = name
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
314 should_call = name in invoke_attrs
591
eedd63b7cf42 debug: Don't show parentheses on redirected properties.
Ludovic Chabant <ludovic@chabant.com>
parents: 556
diff changeset
315 is_redirect = False
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
316
14
395eb38f2dfb Properly escape HTML characters in the debug info, add more options.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
317 if name in redirects:
395eb38f2dfb Properly escape HTML characters in the debug info, add more options.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
318 name = redirects[name]
591
eedd63b7cf42 debug: Don't show parentheses on redirected properties.
Ludovic Chabant <ludovic@chabant.com>
parents: 556
diff changeset
319 is_redirect = True
14
395eb38f2dfb Properly escape HTML characters in the debug info, add more options.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
320
395eb38f2dfb Properly escape HTML characters in the debug info, add more options.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
321 query_instance = False
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
322 try:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
323 attr = getattr(data.__class__, name)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
324 except AttributeError:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
325 # This could be an attribute on the instance itself, or some
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
326 # dynamic attribute.
14
395eb38f2dfb Properly escape HTML characters in the debug info, add more options.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
327 query_instance = True
395eb38f2dfb Properly escape HTML characters in the debug info, add more options.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
328
395eb38f2dfb Properly escape HTML characters in the debug info, add more options.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
329 if query_instance:
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
330 attr = getattr(data, name)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
331
5
474c9882decf Upgrade to Python 3.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
332 if isinstance(attr, collections.Callable):
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
333 attr_func = getattr(data, name)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
334 argcount = attr_func.__code__.co_argcount
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
335 var_names = attr_func.__code__.co_varnames
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
336 if argcount == 1 and should_call:
591
eedd63b7cf42 debug: Don't show parentheses on redirected properties.
Ludovic Chabant <ludovic@chabant.com>
parents: 556
diff changeset
337 if not is_redirect:
eedd63b7cf42 debug: Don't show parentheses on redirected properties.
Ludovic Chabant <ludovic@chabant.com>
parents: 556
diff changeset
338 # Most of the time, redirects are for making a
eedd63b7cf42 debug: Don't show parentheses on redirected properties.
Ludovic Chabant <ludovic@chabant.com>
parents: 556
diff changeset
339 # property render better. So don't add parenthesis.
eedd63b7cf42 debug: Don't show parentheses on redirected properties.
Ludovic Chabant <ludovic@chabant.com>
parents: 556
diff changeset
340 render_name += '()'
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
341 value = attr_func()
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
342 else:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
343 if should_call:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
344 logger.warning("Method '%s' should be invoked for "
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
345 "rendering, but it has %s arguments." %
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
346 (name, argcount))
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
347 should_call = False
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
348 render_name += '(%s)' % ','.join(var_names[1:])
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
349 elif should_call:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
350 value = getattr(data, name)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
351
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
352 self._writeLine('<div>%s' % render_name)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
353 with IndentScope(self):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
354 if should_call:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
355 self._write(' : ')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
356 self._renderValue(value, self._makePath(path, name))
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
357 self._writeLine('</div>')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
358 rendered_count += 1
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
359
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
360 return rendered_count
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
361
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
362 def _renderCollapsableValueStart(self, path):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
363 self._writeLine('<span style="cursor: pointer;" onclick="var l = '
556
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
364 'document.getElementById(\'piecrust-debug-data-%s\'); '
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
365 'if (l.style.display == \'none\') {'
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
366 ' l.style.display = \'block\';'
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
367 ' this.innerHTML = \'[-]\';'
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
368 '} else {'
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
369 ' l.style.display = \'none\';'
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
370 ' this.innerHTML = \'[+]\';'
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
371 '}">'
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
372 '[+]'
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
373 '</span>' %
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
374 path)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
375 self._writeLine('<div style="display: none"'
556
93b656f0af54 serve: Improve debug information in the preview server.
Ludovic Chabant <ludovic@chabant.com>
parents: 440
diff changeset
376 'id="piecrust-debug-data-%s">' % path)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
377
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
378 def _renderCollapsableValueEnd(self):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
379 self._writeLine('</div>')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
380
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
381 def _makePath(self, parent_path, key):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
382 return '%s-%s' % (parent_path, css_id_re.sub('-', str(key)))
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
383
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
384 def _writeLine(self, msg):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
385 self.output.write(self.indent * ' ')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
386 self.output.write(msg)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
387 self.output.write('\n')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
388
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
389 def _writeStart(self, msg=None):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
390 self.output.write(self.indent * ' ')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
391 if msg is not None:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
392 self.output.write(msg)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
393
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
394 def _write(self, msg):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
395 self.output.write(msg)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
396
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
397 def _writeEnd(self, msg=None):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
398 if msg is not None:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
399 self.output.write(msg)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
400 self.output.write('\n')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
401
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
402
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
403 class IndentScope(object):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
404 def __init__(self, target):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
405 self.target = target
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
406
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
407 def __enter__(self):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
408 self.target.indent += 1
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
409 return self
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
410
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
411 def __exit__(self, exc_type, exc_val, exc_tb):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
412 self.target.indent -= 1
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
413