##// END OF EJS Templates
Add support for append/replace mode after discussion with Evan....
Fernando Perez -
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:\n x=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