Show More
@@ -91,16 +91,35 b' class BlockBreaker(object):' | |||
|
91 | 91 | code = None |
|
92 | 92 | # Boolean indicating whether the current block is complete |
|
93 | 93 | is_complete = None |
|
94 | ||
|
94 | # Input mode | |
|
95 | input_mode = 'append' | |
|
96 | ||
|
95 | 97 | # Private attributes |
|
96 | 98 | |
|
97 | 99 | # List |
|
98 | 100 | _buffer = None |
|
99 | 101 | |
|
100 | def __init__(self): | |
|
102 | def __init__(self, input_mode=None): | |
|
103 | """Create a new BlockBreaker instance. | |
|
104 | ||
|
105 | Parameters | |
|
106 | ---------- | |
|
107 | input_mode : str | |
|
108 | ||
|
109 | One of 'append', 'replace', default is 'append'. This controls how | |
|
110 | new inputs are used: in 'append' mode, they are appended to the | |
|
111 | existing buffer and the whole buffer is compiled; in 'replace' mode, | |
|
112 | each new input completely replaces all prior inputs. Replace mode is | |
|
113 | thus equivalent to prepending a full reset() to every push() call. | |
|
114 | ||
|
115 | In practice, line-oriented clients likely want to use 'append' mode | |
|
116 | while block-oriented ones will want to use 'replace'. | |
|
117 | """ | |
|
101 | 118 | self._buffer = [] |
|
102 | 119 | self.compile = codeop.CommandCompiler() |
|
103 | 120 | self.encoding = get_input_encoding() |
|
121 | self.input_mode = BlockBreaker.input_mode if input_mode is None \ | |
|
122 | else input_mode | |
|
104 | 123 | |
|
105 | 124 | def reset(self): |
|
106 | 125 | """Reset the input buffer and associated state.""" |
@@ -143,6 +162,9 b' class BlockBreaker(object):' | |||
|
143 | 162 | this value is also stored as an attribute so it can be queried at any |
|
144 | 163 | time. |
|
145 | 164 | """ |
|
165 | if self.input_mode == 'replace': | |
|
166 | self.reset() | |
|
167 | ||
|
146 | 168 | # If the source code has leading blanks, add 'if 1:\n' to it |
|
147 | 169 | # this allows execution of indented pasted code. It is tempting |
|
148 | 170 | # to add '\n' at the end of source to run commands like ' a=1' |
@@ -137,6 +137,14 b' class BlockBreakerTestCase(unittest.TestCase):' | |||
|
137 | 137 | bb.push(' y=2') |
|
138 | 138 | self.assertEqual(bb.source, 'if 1:\n x=1\n y=2\n') |
|
139 | 139 | |
|
140 | def test_replace_mode(self): | |
|
141 | bb = self.bb | |
|
142 | bb.input_mode = 'replace' | |
|
143 | bb.push('x=1') | |
|
144 | self.assertEqual(bb.source, 'x=1\n') | |
|
145 | bb.push('x=2') | |
|
146 | self.assertEqual(bb.source, 'x=2\n') | |
|
147 | ||
|
140 | 148 | def test_interactive_block_ready(self): |
|
141 | 149 | bb = self.bb |
|
142 | 150 | bb.push('x=1') |
@@ -144,7 +152,9 b' class BlockBreakerTestCase(unittest.TestCase):' | |||
|
144 | 152 | |
|
145 | 153 | def test_interactive_block_ready2(self): |
|
146 | 154 | bb = self.bb |
|
147 |
bb.push('if 1: |
|
|
155 | bb.push('if 1:') | |
|
156 | self.assertFalse(bb.interactive_block_ready()) | |
|
157 | bb.push(' x=1') | |
|
148 | 158 | self.assertFalse(bb.interactive_block_ready()) |
|
149 | 159 | bb.push('') |
|
150 | 160 | self.assertTrue(bb.interactive_block_ready()) |
General Comments 0
You need to be logged in to leave comments.
Login now